- Add single /api/events SSE endpoint replacing 5 separate polling intervals
- Query Prometheus directly for system stats (replaces Python API on port 9876)
- Query Coolify PostgreSQL directly for deployments (replaces SSH/tinker approach)
- Add EventManager singleton for server-side polling + client broadcast
- Add useEventStream hook with exponential backoff reconnection
- Add live deployment log streaming via SSE for in-progress builds
- Add redeploy button and live duration counter in deployments table
- Add SSE connection indicator in header (green=live, red=offline)
- Externalize all hardcoded 192.168.1.3 references to env vars via config.ts
- Reduce API route code by ~400 lines through shared library modules
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Replace anonymous green dots with named green chips, each with
restart and stop icon buttons. Now all services have visible
controls on the Overview regardless of state.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Color-coded left border: green=running, red=stopped, grey=unknown
- Status pill with icon: "Running" (green), "Stopped" (red), etc.
- Stopped cards appear muted (75% opacity), recover on hover
- Running: restart (↻) + stop (⏻) icon buttons, stop needs confirm
- Stopped: prominent green play (▶) button
- Loading state: spinner replaces controls with "Processing..."
- Added coolify.ts lib and config.ts for shared Coolify API access
- No pause support (Coolify API doesn't expose docker pause)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Running services show Restart and Stop buttons. Stopped/unknown show
Start button. Stop requires double-click confirmation (3s timeout).
Card restructured from <a> wrapper to <div> with nested <a> for the
link area, so buttons can coexist without nesting issues.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
New /api/control route proxies start/stop/restart actions to Coolify.
Stopped and unknown service chips now show a play button to start them.
After toggling, auto-refreshes service discovery after 3s.
Added play, power, stop-circle icons.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Services card: running services shown as green dots, stopped/unknown
services promoted to named chips with colored borders for visibility.
Section headers (Services, Deployments) get "View all >" links that
navigate to the corresponding tab.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Queries max core temperature from Prometheus (platform_coretemp_0)
and displays it as a fourth sparkline in red. Grid now 4-column.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Extract ProjectCard component with status dots per app
- Projects row uses responsive grid (2/3/4 cols) for side-by-side cards
- Added Knosia project alongside WhyRating
- Quick Links moved to full-width row with 6-col grid on desktop
- Switched outer layout from CSS Grid to space-y for cleaner stacking
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- System Trends promoted to full-width hero row (most important info first)
- Uptime and load average moved into Trends card header
- Removed separate System Health card (redundant with VitalsBar + Trends)
- Services + Deployments in row 2, Quick Links + WhyRating in row 3
- Taller charts (h-20), tighter gaps, cleaner visual hierarchy
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add recharts dependency for area chart visualizations
- Add /api/metrics route querying Prometheus query_range (CPU, RAM, Network)
- Add SystemTrends component with 3 sparkline area charts (6h window, 2min steps)
- CPU (emerald), RAM (amber), Network I/O (indigo) with gradient fills
- Tooltips show exact values on hover, time axis with formatted labels
- Link to Grafana for deep-dive analysis
- Fetches every 60s, shimmer loading state
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add /stats Python API endpoint on NUC (CPU, RAM, Swap, Disk, uptime, load avg)
- Add VitalsBar component in header showing CPU/RAM/Disk mini bars
- Add Overview as new default landing tab with system health, service summary,
recent deployments, quick links, and WhyRating project status
- Poll system stats every 30s, deployments every 30s on overview tab
- Remove standalone WhyRating tab (content moved to Overview)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Replace static services list with dynamic discovery from Coolify's
server resources API. Services are auto-categorized using a registry
of known service names mapped to icons and categories. Falls back to
static list with health checks when Coolify is unreachable.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Added min-w-0 to deployments div and overflow-hidden to main
- Fixed application_fqdn not being passed through API transformation
- Globe icon now shows for all deployments with fqdn
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add light/dark theme support to DeploymentsTable and DeploymentLogs
- Add stopPropagation to logs container and buttons to prevent accidental collapse
- Fix absolute positioning by adding relative parent
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Production fetches from local coolify-api.py at port 9876
- Development continues using SSH to query Coolify database
- Avoids need for docker socket access in nuc-portal container
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- New Deployments tab showing all Coolify deployments
- TanStack Table with sorting, filtering, pagination
- Status badges (Ready/Building/Error/Queued/Cancelled)
- Application and status filter dropdowns
- Expandable rows showing build logs in real-time
- Auto-refresh every 10 seconds when tab is active
- Log polling every 2 seconds for in-progress deployments
- API routes that query Coolify database directly via docker exec
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add WhyRating logo icon to Icons component
- Replace 'star' icon with 'whyrating' logo for tab and hub link
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Claude, ChatGPT, Perplexity, Phind, Cursor
- v0, Replicate, Hugging Face, Together AI
- Grid layout for easy browsing
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Brand Site (brand.nuc.lan)
- Templates Site (templates.nuc.lan)
- Outline Docs for documentation
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add shadow-sm to ServiceCard, BookmarkCard, and Settings card
- Reduce border opacity: slate-100 (light) / stone-700/50 (dark)
- Lighter hover states for a softer look
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Change from underline-style tabs to rounded-top pill tabs:
- Use bg-slate-100/dark:bg-stone-800 for active state
- Remove border-b-2 underline in favor of rounded-t-lg
- Match px-5 py-3 padding from brand site
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Services tab: shows all internal services with health status
- Bookmarks tab: shows all external bookmarks by category
- Settings tab: dark mode toggle and portal info
- Running services counter in header
- Consistent tab styling with underline indicator
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 17 internal services with live health status
- 28 external bookmarks organized by category
- Dark/light mode toggle with persistence
- Cmd+K search filtering
- Health API polling every 30 seconds
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>