Skip to content

korekore Phase 2a: window, sidebar with the mini box, menu bar - #175

Merged
longzhi merged 4 commits into
mainfrom
korekore/phase-2a-shell
Oct 26, 2026
Merged

longzhi merged 4 commits into
mainfrom
korekore/phase-2a-shell

Conversation

@longzhi

@longzhi longzhi commented Oct 23, 2026

Copy link
Copy Markdown
Collaborator

Phase 2a of the korekore UI (ADR-0021): the settings window, the sidebar with the mini box, and the menu bar, on the Mac and on Linux. Everything is behind VIBEBUDDY_UI=korekore; without it both apps behave exactly as before. The six pages are placeholders until 2b; onboarding and every other state come in 2c.

Stacked on #173 (Phase 1): review that first. This PR's own changes are the last two commits.

What it does

  • Window (canvas "Mac · Character (sidebar)"): cream, 3 px ink outline, radius 20, the 8 px solid shadow; 960 × 772, down to 900 × 760. On the Mac the window has no system frame and the real window buttons move into the sidebar's top row (17 pt in from the outline, as the design's dots). On Linux, Omarchy draws the frame, so the view is the window's inside.
  • Sidebar (canvas "App sidebar component"): "korekore" 26/800 with the bitmap tag, the mini box, the status lines in DotGothic16 ("BOX ONLINE · USB", "7 done · 3 asks today"), six nav rows with their 24 px tiles (the current one ink with cream text; Conversation only while the resident session is on), the versions at the foot.
  • Mini box: the box's screen laid out at 320 × 240 and shown at 0.65 (208 × 156 inside a 3 px outline), as the canvas does. Kore and the word follow the state (WORKING sky, ASK sun, READY lavender, POMODORO kore-pink), up to three cards with their agent tile and title, ALL QUIET with today's numbers when there are none, and the README's no-link screen (gray ground, Kore asleep and gray at scale 6, NO LINK, "waiting for the Mac").
  • Mac menu bar: Kore at 1× in colour, with a sun dot when an agent needs you, gray and asleep without a link. A click opens the 360 px panel: lockup, the Ink strip ("WORKING · 3 AGENTS", "box online · USB · fw 0.5.0"; without the daemon it offers the restart, as today's menu does), the mode chips (they only show the mode: the box changes it), three stat chips, then Settings…, Check for updates…, Report a problem…, Quit korekore.
  • Linux tray: the icon is the same Kore. The menu stays the StatusNotifierItem menu: the tray host draws it and has no place for a custom panel.
  • The data: /v1/status now carries the live Activities (activities, the same summary the resident session's list_activities gives), and every event sent to the box pushes a new status. No screenshots are taken from the box.

Screenshots

Mac, the real KorekoreSettingsWindow drawn off screen with sample data (swift run --package-path app KorekorePreview <dir>; off screen the window isn't key, so its buttons are gray):

Mac window

Mac mini box: working, asking, quiet, no link:

Mac mini box

Mac menu bar panel, linked and without a link, and the three icons:

Mac panel Mac panel, no link

Mac menu icons

Linux, drawn headless by iced_test (cargo test -p vibebuddy-desktop korekore::snapshots -- --ignored):

Linux window

Linux mini box

Against the canvas

The canvas page needs a claude.ai sign-in, so the boards aren't pictured here; the views were built from the boards' HTML and checked against it:

Board Measure Built
Mac · Character (sidebar) window 3 px ink, radius 20, 0 8px 0 ink shadow, cream same
App sidebar component 240 wide incl. 3 px ink right edge, paper, padding 14/14/16, gap 14 same
App sidebar component wordmark 26/800, tag 2 px dots #C2335B same
App sidebar component mini box 208 × 156, 3 px ink, radius 16, 0 4px 0; 320 × 240 at 0.65; side 96 wide box-card, Kore px 4, word 16 px; cards radius 8, padding 7, 24 px tile, title 13 px same
App sidebar component status dot 8 px with 1.5 px ink (#2FBF8A on the canvas, not a token: mint used) mint
App sidebar component nav rows padding 6/8, radius 12, 15/800, gap 10, current ink/cream same
Mac · Menu bar panel 360, cream, 3 px ink, radius 18, 0 6px 0, padding 14, gap 12; strip radius 12, Kore px 3, 16/12 px; chips 12/800, 2 px, pill; stats 13 px, radius 10; items 14/700, keys 12 px muted-2 same

Known differences: "…" in M PLUS Rounded 1c is the font's own centred ellipsis (the canvas uses the same font); on the Mac, text can't take a letter spacing token through Font.custom sizes alone, so the wordmark's -0.02em is applied with tracking, and on Linux iced has no letter spacing.

Changes to existing files

File Lines What
daemon/src/status.rs +2 activities in Status
daemon/src/main.rs +9 −1 fill it in the snapshot; push the status on every event to the box; a test line
docs/app.md ±1 document the field
app/Package.swift +6 −1 the KorekoreUI library and the KorekorePreview tool
app/Sources/VibeBuddyCore/Status.swift +22 −1 optional activities and ActivitySummary
app/Sources/VibeBuddy/AppDelegate.swift +22 −5 with the switch: the korekore status item instead of the menu, the korekore window instead of Settings
desktop/src/status.rs +15 activities and Activity
desktop/src/main.rs +35 −4 with the switch: the section state and message, view() hands over, the window's size, the tray's Kore
desktop/src/tray.rs +11 draw Kore when the switch is on
desktop/Cargo.toml, Cargo.lock +4, +27 iced_test as a dev-dependency (headless snapshots)
tools/check-localization.py ±2 also read KorekoreUI and desktop/src's subfolders (it missed korekore/)
app/Localization/zh-Hans.lproj/Localizable.strings +27 the new strings
app/Sources/SelfTest/main.swift +24 section 8, BoxPicture

Phase 1 files that moved: KorekoreTheme.swift and KorekoreAssets.swift go from VibeBuddy/Korekore to KorekoreUI (now public), and tools/korekore-codegen.py writes the theme there.

Tests

  • just test (cargo test --workspace, SelfTest): pass. New: BoxPicture in SelfTest section 8; korekore::picture and the tray icon in the desktop tests; the daemon test asserts the status carries the Activities.
  • cargo check -p vibebuddy-desktop --target x86_64-unknown-linux-gnu: pass (the tray code only builds for Linux).
  • python3 tools/check-localization.py: ok, 335 keys. Tool tests: pass.
  • cargo clippy: no warnings in changed code.
  • Not run here: the Mac app itself with the switch on (a second copy beside the installed one would stop at "a daemon is already running on port 7331"), and the Linux app on a real Omarchy desktop. Both were exercised through their preview tools above.

🤖 Generated with Claude Code

longzhi and others added 2 commits October 23, 2026 23:55
GET /v1/status and its stream now include `activities`: each live Activity
as the resident session's list_activities gives it (agent, task-card title,
project, working or needs_input, newest first). The korekore sidebar draws
the box from them instead of asking it for a screenshot, which would tie up
the UART bridge. Every event sent to the box now also pushes a new status,
so the stream follows the cards. Older apps ignore the field.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Phase 2a of docs/design/korekore, behind VIBEBUDDY_UI=korekore on both
apps; without it nothing changes.

- Mac: a new KorekoreUI library holds the views, fed plain values: the
  settings window (cream, 3 px ink outline, radius 20, solid shadow, the
  real window buttons moved into the sidebar), the sidebar with the mini
  box redrawn from the status, and the 360 px menu bar panel opened from a
  Kore status item (NSStatusItem + NSPanel, which can switch with the app's
  UI, unlike MenuBarExtra). KorekorePreview draws them with sample data.
- Linux: the same window inside, sidebar and mini box in iced, and Kore in
  the tray; the tray keeps its native menu. iced_test draws them headless.
- BoxPicture (Swift and Rust) turns the status into what the box shows:
  mood, link, the newest three cards without their prefix, today's stats.
- Pages are placeholders until 2b. New strings have zh-Hans entries, and
  check-localization now reads desktop/src's subfolders too.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Copilot AI balanced review requested due to automatic review settings October 23, 2026 15:55

Copilot AI 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.

Copilot was unable to review this pull request because the user who requested the review has insufficient remaining quota.

An organization owner can choose the repository organization as the billing source for reviews requested by members with a paid Copilot license. Learn about Copilot code review billing.

macos-15's compiler gave up on the luminance expression in
PixelSprite.grayed ("unable to type-check this expression in reasonable
time"); the same steps, each typed, build there and here.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
# Conflicts:
#	app/Localization/zh-Hans.lproj/Localizable.strings
#	app/Sources/VibeBuddyCore/Status.swift
#	desktop/src/status.rs
@longzhi
longzhi merged commit e3d2dc7 into main Oct 26, 2026
2 checks passed
@longzhi
longzhi deleted the korekore/phase-2a-shell branch October 26, 2026 06:14
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.

2 participants