The left rail and the menu bar are mostly unused; sources have no visual type. Wanted: a real activity bar on the left, menus that expose what already exists, and an icon + colour per source.

Today

  • Left rail: ActivityRail with one dead “Explorer” button (ui/src/shell.rs); the side tile holds Explorer, Search, Links, Git, History as tabs; Agent lives in the right tile, Terminal in the bottom one.
  • Menus: File (Open Folder, New Flow, Settings, Save, Close Editor, Exit) · Edit (Undo, Redo, Find in Workspace) · View (Palette, Go to File, New Window, New Terminal, Reset Layout, Toggle Developer Tools) · Help (About). The palette knows more: view.panel.{explorer,search,graph,terminal,agent}, git.{commit,history,refresh}, history.show, agent.focus.
  • Phone: a bottom bar (Files, Search, Editor, Graph, Terminal, Agent, Settings) that is, in effect, the activity bar already.
  • Explorer: source roots are text only; SourceFamily (Folder, Sql, Graph, KeyValue, Index, Remote, Custom) is not shown.

Activity bar (left rail, desktop ≥ 700 px)

One registry drives the rail and the phone’s bottom bar, so both lists stay in sync; extensions add entries through PanelContribution.activity: Option<Activity { icon, order, badge }> (a small SVG per panel, inline — no icon font).

orderentryopensbadge
1Sources (Explorer)side tilenumber of sources not ok (missing / unreachable — Projects and Sources)
2Searchside tile—
3Links (backlinks)side tileunresolved links in the active document
4Version management (Git: Changes)side tilechanged files
5History (entity log)side tile—
6Agentright tilepending approval prompts
7Terminalbottom tilerunning processes
8Graphmain tile—
—(extensions append here, ordered by order)their hometheir badge
bottomPresence (who is here)popover: members with initials, file:linemember count
bottomExtensions (Settings → Extensions)settings panel, Extensions tabdisabled-because-incompatible count
bottomYou / Settings (gear)settings panel—

Behaviour: click = show that panel in its home tile and focus it (the view.panel.<id> command, generalised to every panel); click the active side entry again = collapse the side tile (view.toggleSide, Ctrl+B); right-click = Move to … (side / right / bottom); drag to reorder, order saved in user settings; keyboard Ctrl+1…9 for the first nine. Tooltips carry the keybinding. Badges are counts (max 99+), never text.

Other candidates worth a rail entry once they exist, documented so the order is decided now: Projects (the selector, above Sources — Projects and Sources), Problems (LSP diagnostics across open files), Outline (symbols of the active document from the index), Tables (open database sources), Flows (open *.flow.json). None of these is a new panel type; each is an existing view given a rail slot.

Mobile (< 700 px)

The bottom bar is the activity bar: the same registry, first six entries as tiles, the rest behind a More… sheet (a grid of the remaining icons with labels); Settings stays last as now. Badges appear on the tile icons. Presence and Extensions live in the More sheet. No rail on the left — the width is not there — and no drag-reorder on the phone (the desktop order is used).

  • File: New File… (file.new, in the active source’s folder — the Explorer has the inline edit already), New Flow…, Open Folder…, Open Recent ▸ (settings.recent_folders), Close Source ▸ (per open source), Save, Save All (file.saveAll), Revert (Reload), Close Editor, Close All Editors, ─, Settings…, ─, Exit.
  • Edit: Undo, Redo, ─, Find (Mod+F, editor search panel), Replace (Mod+H), Find in Workspace…, Replace in Workspace…, ─, Rename Symbol (F2), Code Actions (Mod+.), Go to Definition (F12), Find References (Shift+F12), ─, Insert Symbol… (Unicode Input, when built), Toggle Comment (needs language comment rules — Core Languages).
  • View: Command Palette…, Go to File…, ─, Show ▸ (one entry per panel: Explorer, Search, Links, Git, History, Agent, Terminal, Graph — from the same registry as the rail), Toggle Side Bar (Ctrl+B), Toggle Bottom Panel (Ctrl+J), ─, Graph: 2D / 3D, Fit, Relayout (when a graph is open), ─, Rich / Source (markdown), ─, New Window, New Terminal, Reset Layout, Toggle Developer Tools.
  • Git (new, only when the git extension is enabled): Refresh, Commit…, Show Changes, Show History as Graph, Diff Active File.
  • Agent (new, when enabled): Focus Chat, New Transcript, Approve All Pending / Deny All Pending, Open Policy Settings.
  • Help: About Moonkale, Documentation (the vault site), Keyboard Shortcuts (Settings → Keybindings), Report a Problem (opens markdown/specifications/ with a new numbered file when the vault is the open folder), Toggle Developer Tools (moved here from View).

Everything listed exists as a command or is a one-line wrapper of an existing panel action except Save All, Close All Editors, Toggle Side/Bottom, Open Recent and Close Source — small additions.

Source icons and colours

  • Icon by kind, drawn from SourceFamily plus the descriptor’s detail: folder · remote folder (folder with a link mark; SSH) · git-host repository (branch mark) · database (cylinder: SQL) · graph database (three joined dots) · key-value (key) · data folder (grid: the DuckDB view over CSV/Parquet) · API (plug) · index (hidden, as now). Shown before the root’s name in the Explorer, in the source picker of the Table editor, and in the status bar’s source item. A lock overlay for read-only sources (driver, credentials or user choice — Projects and Sources).
  • Colour: the per-source accent from Projects and Sources — user-chosen or a stable hash of the source id over an eight-colour palette that works on both themes — as a 3 px stripe on the Explorer root row, on every tab of a document from that source, and as a dot next to the file name in the status bar. Colour never encodes state; icons and badges do.
  • SourceDescriptor gains nothing: kind comes from family + Custom("…") names already used ("git", "data"); the accent lives in the project/session, not in the descriptor.

Done when

Rail with the eight entries + bottom three, badges for git/agent/terminal, Ctrl+B/Ctrl+J, phone More… sheet, the menus above, icons on source roots with the read-only lock, stripes on tabs; E2E shell.mjs (rail click opens/collapses, badge count after a git change, menu → command), phone.mjs extended (More… sheet).

Done 2026-09-20 (rail, menus, source icons/colours; the per-project colour choice and the read-only override wait for Projects and Sources).

  • Activity bar: PanelContribution.activity: Option<Activity { icon, order, badge, label, phone_secondary }> — one registry for the desktop rail and the phone bar. Entries: Files 10, Search 20, Links 30, Git 40 (badge = changed files), History 50, Agent 60, Terminal 70 (badge = open sessions), Graph 80, Settings 900 (pinned bottom); plus People (presence count, click shows who is here). Click = show the panel (reopening a closed one); click on the current entry = hide it. Icons are inline SVGs (ui/src/icons.rs); badges are counts.
  • Ctrl+B / Ctrl+J (view.toggleSide, view.toggleBottom): hide every panel of the side / bottom area and remember them; the next press brings them back.
  • Phone: the same registry — Files, Search, Editor, Agent, Terminal, Graph in the bar, a More sheet for Links, Git, History, Settings and anything past five primary entries.
  • Menus (built from the command registry, keybindings shown): File — New File, Open Folder, Close Folder, Open Recent, Settings, Save, Save All, Close All Editors, Close Editor, Exit; Edit — Undo, Redo, Find, Replace, Find in Workspace, Rename Symbol, Code Actions, Go to Definition, Find References, Toggle Comment (Command::Editor(EditorAction) → the active CodeMirror view’s run(action)); View — Palette, Go to File, Show for every static panel, Toggle Side Bar / Bottom Panel / Word Wrap, Fold All / Unfold All, New Window, New Terminal, Reset Layout, DevTools; Git and Agent menus appear from the extensions’ commands (grouped by the “Category: …” title prefix); Help — About, Keyboard Shortcuts, Documentation.
  • Source icons and colours: icons::source_icon(descriptor) (folder, remote folder, repository, database, graph database, key-value, data folder, API, index) and icons::source_color(id) (a stable 8-colour palette by hash) — the Explorer’s source row gets the icon, a 3 px stripe in the colour and a lock when the source cannot write; the status bar’s source item shows a dot in the same colour.
  • Suites: shell.mjs (rail order/active/bottom, badge, source row, hide/show, Ctrl+B, menus incl. Edit → Find opening the search panel), phone.mjs (More sheet). Deferred: drag-to-reorder the rail, Ctrl+1…9, Move-to context menu, Report a Problem, tab stripes per source.