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:
ActivityRailwith 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).
| order | entry | opens | badge |
|---|---|---|---|
| 1 | Sources (Explorer) | side tile | number of sources not ok (missing / unreachable — Projects and Sources) |
| 2 | Search | side tile | — |
| 3 | Links (backlinks) | side tile | unresolved links in the active document |
| 4 | Version management (Git: Changes) | side tile | changed files |
| 5 | History (entity log) | side tile | — |
| 6 | Agent | right tile | pending approval prompts |
| 7 | Terminal | bottom tile | running processes |
| 8 | Graph | main tile | — |
| — | (extensions append here, ordered by order) | their home | their badge |
| bottom | Presence (who is here) | popover: members with initials, file:line | member count |
| bottom | Extensions (Settings → Extensions) | settings panel, Extensions tab | disabled-because-incompatible count |
| bottom | You / 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).
Menus (desktop title bar), built from the command registry so keybindings show
- 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
SourceFamilyplus 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.
SourceDescriptorgains nothing: kind comes fromfamily+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’srun(action)); View — Palette, Go to File, Showfor 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) andicons::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.