The command palette is a keyboard-driven panel for running Ceum from a command line without leaving the app. It runs exactly the same commands as the standalone terminal client (@ceum/cli, installable with npm), over the same tool surface the MCP integration exposes to outside tools — one grammar, three ways in.
The difference is what it needs from you. An external tool authenticates with an MCP token you create and scope. The palette does not: it runs as you, with your own access, so there is no token to create and none to rotate. Its changes are recorded in Tool activity alongside everything else that touches your workspace.
Opening the panel
Press backquote (`) anywhere outside a text field. The panel slides up from the bottom over the navigation bar. Press Escape to close it.
Inside the panel you'll find:
- A command input with tab completion.
- A transcript of your recent commands and their output (the last 100 entries).
- A handle for resizing the panel's height.
The commands
Commands read <resource> <action>, with options as long flags:
tasks list --status doing
tasks create --title "Ship v1"
clients get C-7
invoices list --columns id,client,amount,status
The full set is generated from the server, so it always matches what actually exists — see the grammar below, or type help. Everything the API can do, the palette can do: creating and updating as well as listing, bulk operations, time entries, kanban boards, relationships.
A few options work on any command:
--columns— choose which columns a table shows.-o json(orcsv,ndjson) — raw output instead of a table.--all— walk past the first page of a long list.--dry-run— show the call a command would make, without making it.--yes— skip the confirmation a deleting command asks for.
Rows in a table are clickable: each links to the matching item, so the palette doubles as a fast way to jump deep into your workspace. Following a link navigates and closes the panel.
Deleting something
A command that deletes asks first. It prints what it is about to do and waits — type y to go ahead, anything else to cancel. Add --yes to skip the question when you are sure.
What the palette cannot do
Two things the terminal client can, deliberately:
- No files.
--file,--input-fileand--stdindo not exist here — a browser panel has no filesystem. Use--input '<json>'for anything that needs a nested value, or the terminal client for a bulk import from a spreadsheet. - No credentials to configure.
--token,--urland--profiledo not exist either, because your sign-in is the credential.
Type one of them and the palette says so by name, rather than treating it as a typo.
Getting help
help adapts to how specific you are:
help— every resource, plus the panel's own builtins.help <resource>— that resource's actions, each with a one-line description (e.g.help invoices).help <resource> <action>— full detail for one command: every option, its datatype, and whether it is required (e.g.help tasks create).
Help text comes from the server's own tool descriptions, so it is in English even when the rest of the app is not — and it is the same text ceum --help prints in a terminal.
Command grammar
Generated from the live command set, so it always matches what the palette and the terminal client actually accept. One line per resource, listing its actions; run help <resource> <action> for the options.
assistant-config get
calendar-items list
client-statuses create, delete, list, update
clients bulk-create, bulk-delete, bulk-update, create, delete, get, list, update
combined-views create, delete, get, list, resolve, update
document-versions delete, get, list, restore
documents bulk-create, bulk-delete, bulk-update, create, delete, get, list, update
events create, delete, get, list, update
invoice-statuses create, delete, list, update
invoices bulk-create, bulk-delete, bulk-update, create, delete, flag, get, list, update
kanban-boards create, delete, get, list, update
profile get
project-relationship-types create, list
project-relationships create, list
project-statuses create, delete, list, update
projects bulk-create, bulk-delete, bulk-update, create, delete, get, link-clients, list, unlink-clients, update
relationship-types delete, get, update
relationships delete, update
settings get
subscriptions bulk-create, bulk-delete, bulk-update, create, delete, get, list, list-due, pause, unpause, update
tags bulk-delete, bulk-update, create, delete, list, update
task-comments create, delete, list, update
task-relationship-types create, list
task-relationships create, list
task-statuses create, delete, list, update
task-types create, delete, get, list, update
tasks bulk-delete, bulk-update, create, delete, duplicate, flag, get, link-projects, list, unlink-projects, update
time-entries aggregate, bulk-delete, bulk-update, create, delete, get, link-tasks, list, unlink-tasks, update
time-goals create, delete, get, list, pause, unpause, update
time-sessions resume, start
transactions bulk-create, bulk-delete, bulk-update, create, delete, get, list, update
workspace search
While a command runs
Commands that hit the server show a live indicator — a small spinner and the elapsed time in seconds — until they finish, so you can tell a slow request from a stuck one.
Tab completion
Completion works the way it does in a shell:
- One Tab — fills in the longest shared prefix.
- Two Tabs — shows all the candidates.
- It completes resources, actions, flag names, and a flag's choices where the option has a fixed set — so
tasks list --status <Tab>offers the statuses.
Tips and edge cases
- Click to focus. Clicking anywhere in the empty space of the panel focuses the command input, so you can start typing without aiming for the input line.
- Backquote feels awkward? If your keyboard layout makes backquote hard to reach, you can still toggle the palette through the chord chain in Keyboard shortcuts.
- Quick list lives nearby. The palette comes up from the bottom while the Quick list panel slides in from the side — they don't overlap.
- Piping. A table's rows can be filtered in place with
|:tasks list | grep -E urgent, plushead,tail,sortanduniq. These run on what came back and never make a second request. - The transcript is temporary. Closing the panel keeps the transcript; reloading the page clears it.
On mobile
Not available on the mobile app — manage from the web app.