Skip to content

Console: three-pane layout (app rail, app sidebar, view), Noite patterns - #37

Merged
ryuzdev merged 3 commits into
mainfrom
console-shell
Oct 24, 2026
Merged

ryuzdev merged 3 commits into
mainfrom
console-shell

Conversation

@ryuzdev

@ryuzdev ryuzdev commented Oct 24, 2026 •

Copy link
Copy Markdown
Member

Owner: the console follows a three-pane aesthetic (reference image: soft gray canvas, white rounded panels, thin outline icons, monochrome charts) and reuses Noite's console UX patterns.

Layout

  • Rail: Outer mark; one rounded-square tile per app (first letter, subtle tint, status dot, title = slug · status); a + tile explaining that apps are created by your agent (with the MCP URL); Docs and the account menu at the bottom.
  • App sidebar (full height, collapsible): app name, URL and status; App — Overview, Metrics, Agent actions, Deploys, Logs, Errors (open-issue count badge), Secrets (names only), Settings; Data — D1, R2, Durable Objects marked "Soon"; footer with the full URL, copy button and "Open app".
  • Main panel: the view. Overview: stat cards (requests with a half-over-half change pill, daily unique visitors, error rate, p95 with p50), the requests line chart, latest deploy, latest agent actions, open errors. Metrics: thin bars with dashed gridlines and y ticks (30 d rolls up to daily bars), top paths.

From Noite (apps/[id].tsx, lib/app-detail/{shell,panel,metrics,deploys,errors,events}.tsx): URL state ?app=&t=&r=, client-side navigation with pushState/popstate (no reloads), keyed remount per app, expandable deploy rows with log, grouped errors with counts and first/last seen, an actions feed with Load more, copy buttons, skeletons and empty states, relative times with absolute on hover. SSE is not ported: the visible view polls every 10 s.

Backend: GET /api/console/apps/:slug/secrets → names + updated_at, same guards as every console endpoint (session only, same-origin, owner-scoped 404); tests for 401/403/404 and names-only.

daisyUI is dropped for a small console stylesheet of CSS variables (light, with a prefers-color-scheme dark variant); inline SVG icons; no style= attributes, so the hashed CSP is unchanged. Mobile: the rail stays, the app sidebar becomes a drawer.

Live (outer:1ae21db, Chromium, incognito, a 1-hour test session removed afterwards): /console/app?app=pwa-check renders with real data (79 requests, 3 visitors, 11.4 % error rate from the earlier malformed-POST test, p95 2.5 s); switching Metrics → Agent actions → Deploys → Secrets → Overview changes the URL without a reload; zero CSP violations. 438 tests pass; Blume build and validate pass.

Not done: a previous-period comparison line (needs metrics to accept a wider window).

Summary by CodeRabbit

  • New Features
    • Redesigned the console with app selection and dedicated views for overview, metrics, agent actions, deploys, logs, errors, secrets, and settings.
    • Explore request, visitor, error-rate, and latency metrics with selectable time ranges. Action history supports pagination, and logs can be refreshed.
    • View secret names and update times without exposing secret values.
    • The console adapts to smaller screens and supports light and dark themes.

 rail (app picker w/ monogram tiles, status dots, + popover),
 app sidebar (App views + Soon data items, collapsible, mobile
 drawer), main panel (overview/metrics/actions/deploys/logs/
 errors/secrets/settings) on ?app=&t=&r= with pushState nav and
 10s polling of the visible view. Monochrome SVG charts, inline
 SVG icon set, no style attributes, strict CSP preserved.

 Backend: GET /api/console/apps/:slug/secrets (names +
 updated_at only; 401/403/404 guards, owner-scoped). Tests:
 session + same-origin required, foreign==missing 404, names
 only ordered by name.

 Verified: bun build + validate clean; cargo fmt/clippy/test
 green; Playwright vs real router + seeded DB: 8 desktop +
 mobile shots in /tmp/outer-console-v2-*.png, zero CSP/
 console/request failures, SPA nav without reload.
@coderabbitai

coderabbitai Bot commented Oct 24, 2026 •

Copy link
Copy Markdown

Review in Change Stack →

Caution

Review failed

The pull request is closed.

Walkthrough

The console pages now render a shared dashboard for app selection, navigation, and app-specific views. The dashboard adds metrics, activity, logs, errors, secrets, and settings views. A new authenticated API endpoint returns secret names and update timestamps without returning secret values.

Changes: Console dashboard

Layer / File(s) Summary
Shared routes and UI utilities
web/pages/console/_islands/common.tsx
Defines view and time-range routes, panel state types, relative-time formatting, and a copy button.
Secret listing API
crates/outer/src/http/console.rs, web/pages/console/_islands/api.ts
Adds an owner-scoped secrets endpoint that enforces session and same-origin checks. Successful responses list secret names and update timestamps; tests cover access checks, ordering, and names-only output.
Console navigation and data loading
web/pages/console/_islands/console.tsx, web/pages/console/_islands/app.tsx, web/pages/console/_islands/apps.tsx, web/pages/console/app.astro, web/pages/console/index.astro
Replaces the prior app and app-list islands with the shared console. The console loads app and account data, navigates between views, handles history and pagination, and polls the visible view.
Dashboard views and presentation
web/pages/console/_islands/views.tsx, web/pages/console/_islands/icons.tsx, web/pages/console/console.css
Adds the dashboard’s app views, shared SVG icons, and standalone responsive styling.

Priority: Not assessed

Estimated code review effort: 4 (Complex) | ~60 minutes

Change: Feature

Sequence Diagram(s)

sequenceDiagram
  participant Console
  participant api_secrets
  participant Database
  Console->>api_secrets: GET /api/console/apps/:slug/secrets
  api_secrets->>Database: List secrets for the owned app
  Database-->>api_secrets: Secret names and updated_at values
  api_secrets-->>Console: No-store JSON response
Loading

Possibly related PRs

  • ryuzcorp/outer#24: Defines the cursor-paginated agent-action feed consumed by the new console’s Agent actions view.
Merge Risk: Moderate · up to 1ae21

The range selector does nothing, the Overview "View all" buttons fail, and rows loaded with "Load more" vanish about every 10 seconds. The pages also contain nested main landmarks. Fix these before merge. The backend secrets endpoint was not found to have problems.

Finishing Touches
📝 Generate docstrings
  • Commit to this branch
  • Create a new PR
🧪 Generate unit tests (beta)
  • Commit to this branch
  • Create a new PR
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

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.

@ryuzdev

ryuzdev commented Oct 24, 2026

Copy link
Copy Markdown
Member Author

CodeRabbit is out of free reviews (pending). Merging on green CI plus own checks: no auth changes beyond one read-only endpoint with the existing guards and 401/403/404 tests; live on outer:1ae21db with real data, client-side navigation without reloads and zero CSP violations.

@ryuzdev
ryuzdev merged commit 453c18e into main Oct 24, 2026
3 of 4 checks passed
@ryuzdev
ryuzdev deleted the console-shell branch October 24, 2026 14:33
ryuzdev added a commit that referenced this pull request Oct 24, 2026
* Re-adopt daisyUI 5 (Tailwind v4 plugin, console-only scope, @source '.'):
  custom 'outer' (default) + 'outer-dark' (prefersdark) themes matching the
  reference (soft gray canvas, white panels, near-black primary/neutral,
  radius-box 1.25rem, muted status colors). Components used: menu (sidebar,
  dropdown popovers), card, stats/stat, badge (badge-soft pills), table +
  table-fixed w/ colgroup, join (range picker), tabs-box (mobile view tabs),
  btn, drawer + drawer-toggle/content/side/overlay (mobile sidebar,
  md:drawer-open on desktop), dropdown, tooltip, skeleton, alert, collapse
  (deploy rows), kbd (Esc hints), loading, divider, indicator (rail status
  dots, error count), avatar (rail tiles, account). Deleted the custom CSS
  daisyUI replaces; kept layout glue, charts, log list, app-tile tints.
* Lucide via the 'lucide' package's IconNode exports ([tag, attrs][] nodes
  rendered through a tiny Ilha component using ilha's h(); pinned 1.61.0):
  no CDN, no createIcons DOM scanning, CSP-safe. OuterMark stays custom.
* Overflow impossible: truncate + min-w-0 on every flex/grid text child,
  table-fixed with column widths, break-words only for logs/deploy message
  (break-all for unbroken error runs), title on everything truncated.
  Main panel and grids fill available width (drawer-content min-w-0,
  stats stack below xl).
* CSP unchanged, zero style= attributes.

Verified: bun build + validate clean; Playwright Chromium vs real router
with seeded absurd data (500-char summaries, 300-char paths, 63-char
slugs, long errors/secrets): Overview/Actions/Errors/Deploys (expanded)/
Secrets at 1440 and 1024, mobile 390 drawer open in /tmp/outer-console-v3-*;
no horizontal document scroll, no element box outside its panel, zero CSP
violations and console errors. cargo fmt/clippy -D warnings/test green
(438 passed). Harness test deleted after verification.
ryuzdev added a commit that referenced this pull request Oct 24, 2026
…41)

* Console: daisyUI 5 components, Lucide icons, overflow armor (#37)

* Re-adopt daisyUI 5 (Tailwind v4 plugin, console-only scope, @source '.'):
  custom 'outer' (default) + 'outer-dark' (prefersdark) themes matching the
  reference (soft gray canvas, white panels, near-black primary/neutral,
  radius-box 1.25rem, muted status colors). Components used: menu (sidebar,
  dropdown popovers), card, stats/stat, badge (badge-soft pills), table +
  table-fixed w/ colgroup, join (range picker), tabs-box (mobile view tabs),
  btn, drawer + drawer-toggle/content/side/overlay (mobile sidebar,
  md:drawer-open on desktop), dropdown, tooltip, skeleton, alert, collapse
  (deploy rows), kbd (Esc hints), loading, divider, indicator (rail status
  dots, error count), avatar (rail tiles, account). Deleted the custom CSS
  daisyUI replaces; kept layout glue, charts, log list, app-tile tints.
* Lucide via the 'lucide' package's IconNode exports ([tag, attrs][] nodes
  rendered through a tiny Ilha component using ilha's h(); pinned 1.61.0):
  no CDN, no createIcons DOM scanning, CSP-safe. OuterMark stays custom.
* Overflow impossible: truncate + min-w-0 on every flex/grid text child,
  table-fixed with column widths, break-words only for logs/deploy message
  (break-all for unbroken error runs), title on everything truncated.
  Main panel and grids fill available width (drawer-content min-w-0,
  stats stack below xl).
* CSP unchanged, zero style= attributes.

Verified: bun build + validate clean; Playwright Chromium vs real router
with seeded absurd data (500-char summaries, 300-char paths, 63-char
slugs, long errors/secrets): Overview/Actions/Errors/Deploys (expanded)/
Secrets at 1440 and 1024, mobile 390 drawer open in /tmp/outer-console-v3-*;
no horizontal document scroll, no element box outside its panel, zero CSP
violations and console errors. cargo fmt/clippy -D warnings/test green
(438 passed). Harness test deleted after verification.

* Console: dark brand tile and soft-gray selected row, as in the reference
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