Skip to content

feat: system status page#1572

Merged
yohamta0 merged 1 commit into
mainfrom
system-ui
Jan 11, 2026
Merged

feat: system status page#1572
yohamta0 merged 1 commit into
mainfrom
system-ui

Conversation

@yohamta0

@yohamta0 yohamta0 commented Jan 11, 2026

Copy link
Copy Markdown
Collaborator

Summary by CodeRabbit

Release Notes

  • New Features

    • Added System Status page for administrators, accessible via /system-status.
    • Added System Status menu item (admin-only).
    • Introduced Workers summary section on System Status page.
    • Redesigned Service Card with simplified per-instance status display.
  • Changes

    • Simplified dashboard by removing system status sections.
    • Streamlined refresh logic on dashboard.

✏️ Tip: You can customize this high-level summary in your review settings.

@coderabbitai

coderabbitai Bot commented Jan 11, 2026

Copy link
Copy Markdown
📝 Walkthrough

Walkthrough

This PR introduces a new admin-only System Status page accessible at /system-status, moves system status monitoring components from the main dashboard to this dedicated page, refactors the ServiceCard component for simplified per-instance status display, and adds a corresponding navigation menu item for administrators.

Changes

Cohort / File(s) Summary
Route & Navigation Configuration
ui/src/App.tsx, ui/src/menu.tsx
Added protected route for /system-status with admin-only access and corresponding navigation menu item "System Status" with Activity icon in the Overview section.
ServiceCard Component Refactor
ui/src/features/system-status/components/ServiceCard.tsx
Simplified component by removing expandable sections, eliminated local expansion state, replaced aggregate status logic with per-instance status color mapping, and reworked layout to display instance status indicators, host:port, and uptime in a unified row-based format.
Dashboard Page Simplification
ui/src/pages/index.tsx
Removed system status data queries (scheduler, coordinator, resources/history, workers), eliminated "Live Workers" and "System Resources" UI sections, and simplified refresh logic.
System Status Page Enhancement
ui/src/pages/system-status/index.tsx
Added WorkersSummary component integration with new /workers data source, implemented auto-refresh at 1000ms interval, extended manual refresh to include workers data, and repositioned Workers section between Services and Resource Usage.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

🚥 Pre-merge checks | ✅ 2 | ❌ 1
❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 50.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title 'feat: system status page' directly and clearly summarizes the main change: adding a new system status page with routing, navigation, and UI components.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings

📜 Recent review details

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 29b1382 and bbb7e32.

📒 Files selected for processing (5)
  • ui/src/App.tsx
  • ui/src/features/system-status/components/ServiceCard.tsx
  • ui/src/menu.tsx
  • ui/src/pages/index.tsx
  • ui/src/pages/system-status/index.tsx
🧰 Additional context used
📓 Path-based instructions (2)
ui/**/*.{ts,tsx,jsx,js}

📄 CodeRabbit inference engine (ui/CLAUDE.md)

ui/**/*.{ts,tsx,jsx,js}: Use developer-centric UI design with high information density, minimal whitespace, compact components, and no unnecessary decorations
Support both light and dark modes for all UI components using Tailwind CSS class pairs like dark:bg-slate-700
NEVER use full-page loading overlays or LoadingIndicator components that hide content - show stale data while fetching updates instead
Use compact modal design with small headers, minimal padding (p-2 or p-3), tight spacing, and support keyboard navigation (arrows, enter, escape)
Use small heights for form elements: select boxes h-7 or smaller, buttons h-7 or h-8, inputs with compact padding (py-0.5 or py-1)
Minimize row heights in tables and lists while maintaining readability, merge related columns, and always handle long text with whitespace-normal break-words
Use consistent metadata styling with bg-slate-200 dark:bg-slate-700 backgrounds and maintain text hierarchy with primary/secondary/muted text colors
Use flexbox-first layouts with min-h-0 and overflow-hidden to prevent layout breaks, account for fixed elements when setting heights
Maintain keyboard navigation support in all interactive components with appropriate focus indicators and ARIA labels

Files:

  • ui/src/App.tsx
  • ui/src/pages/system-status/index.tsx
  • ui/src/features/system-status/components/ServiceCard.tsx
  • ui/src/menu.tsx
  • ui/src/pages/index.tsx
ui/**/*.{ts,tsx}

📄 CodeRabbit inference engine (AGENTS.md)

ui/**/*.{ts,tsx}: The React + TypeScript frontend resides in ui/, with production bundles copied to internal/service/frontend/assets by make ui
UI code follows ESLint + Prettier (2-space indent) and Tailwind utilities; name React components in PascalCase (JobList.tsx) and hooks with use* (useJobs.ts)

Files:

  • ui/src/App.tsx
  • ui/src/pages/system-status/index.tsx
  • ui/src/features/system-status/components/ServiceCard.tsx
  • ui/src/menu.tsx
  • ui/src/pages/index.tsx
🧠 Learnings (2)
📚 Learning: 2025-12-04T10:34:01.045Z
Learnt from: CR
Repo: dagu-org/dagu PR: 0
File: ui/CLAUDE.md:0-0
Timestamp: 2025-12-04T10:34:01.045Z
Learning: Applies to ui/**/*.{ts,tsx,jsx,js} : Minimize row heights in tables and lists while maintaining readability, merge related columns, and always handle long text with `whitespace-normal break-words`

Applied to files:

  • ui/src/pages/index.tsx
📚 Learning: 2025-12-04T10:34:01.045Z
Learnt from: CR
Repo: dagu-org/dagu PR: 0
File: ui/CLAUDE.md:0-0
Timestamp: 2025-12-04T10:34:01.045Z
Learning: Applies to ui/**/*.{ts,tsx,jsx,js} : Use developer-centric UI design with high information density, minimal whitespace, compact components, and no unnecessary decorations

Applied to files:

  • ui/src/pages/index.tsx
🧬 Code graph analysis (3)
ui/src/App.tsx (1)
ui/src/components/ProtectedRoute.tsx (1)
  • ProtectedRoute (19-45)
ui/src/pages/system-status/index.tsx (1)
ui/src/hooks/api.ts (1)
  • useQuery (28-28)
ui/src/features/system-status/components/ServiceCard.tsx (2)
ui/src/lib/utils.ts (1)
  • cn (4-6)
internal/service/scheduler/scheduler.go (1)
  • Clock (37-37)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: Build
🔇 Additional comments (8)
ui/src/pages/index.tsx (2)

184-186: LGTM: Simplified refresh logic.

The simplified handleRefreshAll now correctly delegates to a single mutate call, consistent with the removal of system status data queries from this dashboard page.


343-351: LGTM: Timeline layout adjustment.

The timeline container now uses flex-1 instead of flex-[2], which is appropriate for the simplified dashboard layout after system status sections were moved to the dedicated System Status page.

ui/src/menu.tsx (1)

199-207: LGTM: Admin-only navigation item added correctly.

The new System Status navigation item is properly gated with isAdmin and uses an appropriate Activity icon, following the same pattern as other admin-protected items in the sidebar.

ui/src/App.tsx (1)

131-138: LGTM: Admin-protected route configured correctly.

The new /system-status route is properly protected with requiredRole="admin" and follows the same pattern as other admin-only routes (users, api-keys, webhooks, etc.).

ui/src/pages/system-status/index.tsx (2)

204-212: LGTM: Workers section integrated correctly.

The WorkersSummary component is properly integrated with appropriate data, loading, and error props. The section placement between Services and Resource Usage makes logical sense.


92-108: Workers refresh interval is intentional to support real-time relative timestamp display.

The 1-second refresh for workers (compared to 5 seconds for other data sources) serves a functional purpose: the WorkersSummary component displays relative timestamps for worker heartbeats (e.g., "Now", "30s", "5m") and updates its display every 1 second. Polling workers every 5 seconds would cause these timestamps to appear stale for up to 4.9 seconds. Additionally, with the 10-second worker health window, more frequent polling enables quicker detection of worker disconnections.

If changing the polling interval, ensure the RelativeTime component's update logic is also adjusted to match, and confirm the heartbeat-based health detection still meets operational requirements.

ui/src/features/system-status/components/ServiceCard.tsx (2)

40-43: LGTM: Concise uptime formatting.

The simplified uptime calculation returns clean, readable formats (e.g., "2d 5h", "3h 15m", "25m") that fit well in the compact per-instance layout.


52-102: LGTM: Simplified per-instance display improves clarity.

The refactored ServiceCard removes the collapsible/expandable complexity in favor of a clean per-instance flat list. Each instance row shows:

  • Status indicator with optional ping animation for active instances
  • Host:port display in monospace font
  • Uptime for active instances with Clock icon

The loading, error, and empty states are properly handled (lines 64-74), and the overall design follows the compact, high-density UI guidelines.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
ui/src/pages/system-status/index.tsx (1)

248-255: Footer text misleading about refresh frequency.

Line 252 states "Refreshing every 5 seconds" but the workers data source refreshes every 1 second (line 106). This creates user confusion about the actual refresh behavior.

Consider either:

  1. Updating the text to reflect multiple refresh intervals: "Refreshing every 1-5 seconds"
  2. Aligning all refresh intervals to 5 seconds (see previous comment)
  3. Removing the specific timing from the footer text
📝 Suggested text update
         <div>
           Last updated: {lastUpdateTime.toLocaleTimeString()}
-          {autoRefresh && ' • Refreshing every 5 seconds'}
+          {autoRefresh && ' • Auto-refresh enabled'}
         </div>
📜 Review details

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 29b1382 and bbb7e32.

📒 Files selected for processing (5)
  • ui/src/App.tsx
  • ui/src/features/system-status/components/ServiceCard.tsx
  • ui/src/menu.tsx
  • ui/src/pages/index.tsx
  • ui/src/pages/system-status/index.tsx
🧰 Additional context used
📓 Path-based instructions (2)
ui/**/*.{ts,tsx,jsx,js}

📄 CodeRabbit inference engine (ui/CLAUDE.md)

ui/**/*.{ts,tsx,jsx,js}: Use developer-centric UI design with high information density, minimal whitespace, compact components, and no unnecessary decorations
Support both light and dark modes for all UI components using Tailwind CSS class pairs like dark:bg-slate-700
NEVER use full-page loading overlays or LoadingIndicator components that hide content - show stale data while fetching updates instead
Use compact modal design with small headers, minimal padding (p-2 or p-3), tight spacing, and support keyboard navigation (arrows, enter, escape)
Use small heights for form elements: select boxes h-7 or smaller, buttons h-7 or h-8, inputs with compact padding (py-0.5 or py-1)
Minimize row heights in tables and lists while maintaining readability, merge related columns, and always handle long text with whitespace-normal break-words
Use consistent metadata styling with bg-slate-200 dark:bg-slate-700 backgrounds and maintain text hierarchy with primary/secondary/muted text colors
Use flexbox-first layouts with min-h-0 and overflow-hidden to prevent layout breaks, account for fixed elements when setting heights
Maintain keyboard navigation support in all interactive components with appropriate focus indicators and ARIA labels

Files:

  • ui/src/App.tsx
  • ui/src/pages/system-status/index.tsx
  • ui/src/features/system-status/components/ServiceCard.tsx
  • ui/src/menu.tsx
  • ui/src/pages/index.tsx
ui/**/*.{ts,tsx}

📄 CodeRabbit inference engine (AGENTS.md)

ui/**/*.{ts,tsx}: The React + TypeScript frontend resides in ui/, with production bundles copied to internal/service/frontend/assets by make ui
UI code follows ESLint + Prettier (2-space indent) and Tailwind utilities; name React components in PascalCase (JobList.tsx) and hooks with use* (useJobs.ts)

Files:

  • ui/src/App.tsx
  • ui/src/pages/system-status/index.tsx
  • ui/src/features/system-status/components/ServiceCard.tsx
  • ui/src/menu.tsx
  • ui/src/pages/index.tsx
🧠 Learnings (2)
📚 Learning: 2025-12-04T10:34:01.045Z
Learnt from: CR
Repo: dagu-org/dagu PR: 0
File: ui/CLAUDE.md:0-0
Timestamp: 2025-12-04T10:34:01.045Z
Learning: Applies to ui/**/*.{ts,tsx,jsx,js} : Minimize row heights in tables and lists while maintaining readability, merge related columns, and always handle long text with `whitespace-normal break-words`

Applied to files:

  • ui/src/pages/index.tsx
📚 Learning: 2025-12-04T10:34:01.045Z
Learnt from: CR
Repo: dagu-org/dagu PR: 0
File: ui/CLAUDE.md:0-0
Timestamp: 2025-12-04T10:34:01.045Z
Learning: Applies to ui/**/*.{ts,tsx,jsx,js} : Use developer-centric UI design with high information density, minimal whitespace, compact components, and no unnecessary decorations

Applied to files:

  • ui/src/pages/index.tsx
🧬 Code graph analysis (3)
ui/src/App.tsx (1)
ui/src/components/ProtectedRoute.tsx (1)
  • ProtectedRoute (19-45)
ui/src/pages/system-status/index.tsx (1)
ui/src/hooks/api.ts (1)
  • useQuery (28-28)
ui/src/features/system-status/components/ServiceCard.tsx (2)
ui/src/lib/utils.ts (1)
  • cn (4-6)
internal/service/scheduler/scheduler.go (1)
  • Clock (37-37)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: Build
🔇 Additional comments (8)
ui/src/pages/index.tsx (2)

184-186: LGTM: Simplified refresh logic.

The simplified handleRefreshAll now correctly delegates to a single mutate call, consistent with the removal of system status data queries from this dashboard page.


343-351: LGTM: Timeline layout adjustment.

The timeline container now uses flex-1 instead of flex-[2], which is appropriate for the simplified dashboard layout after system status sections were moved to the dedicated System Status page.

ui/src/menu.tsx (1)

199-207: LGTM: Admin-only navigation item added correctly.

The new System Status navigation item is properly gated with isAdmin and uses an appropriate Activity icon, following the same pattern as other admin-protected items in the sidebar.

ui/src/App.tsx (1)

131-138: LGTM: Admin-protected route configured correctly.

The new /system-status route is properly protected with requiredRole="admin" and follows the same pattern as other admin-only routes (users, api-keys, webhooks, etc.).

ui/src/pages/system-status/index.tsx (2)

204-212: LGTM: Workers section integrated correctly.

The WorkersSummary component is properly integrated with appropriate data, loading, and error props. The section placement between Services and Resource Usage makes logical sense.


92-108: Workers refresh interval is intentional to support real-time relative timestamp display.

The 1-second refresh for workers (compared to 5 seconds for other data sources) serves a functional purpose: the WorkersSummary component displays relative timestamps for worker heartbeats (e.g., "Now", "30s", "5m") and updates its display every 1 second. Polling workers every 5 seconds would cause these timestamps to appear stale for up to 4.9 seconds. Additionally, with the 10-second worker health window, more frequent polling enables quicker detection of worker disconnections.

If changing the polling interval, ensure the RelativeTime component's update logic is also adjusted to match, and confirm the heartbeat-based health detection still meets operational requirements.

ui/src/features/system-status/components/ServiceCard.tsx (2)

40-43: LGTM: Concise uptime formatting.

The simplified uptime calculation returns clean, readable formats (e.g., "2d 5h", "3h 15m", "25m") that fit well in the compact per-instance layout.


52-102: LGTM: Simplified per-instance display improves clarity.

The refactored ServiceCard removes the collapsible/expandable complexity in favor of a clean per-instance flat list. Each instance row shows:

  • Status indicator with optional ping animation for active instances
  • Host:port display in monospace font
  • Uptime for active instances with Clock icon

The loading, error, and empty states are properly handled (lines 64-74), and the overall design follows the compact, high-density UI guidelines.

@yohamta0 yohamta0 merged commit cd2b060 into main Jan 11, 2026
2 checks passed
@yohamta0 yohamta0 deleted the system-ui branch January 11, 2026 15:26
@yohamta0 yohamta0 restored the system-ui branch January 12, 2026 06:05
@yohamta0 yohamta0 deleted the system-ui branch January 12, 2026 06:06
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant