The tuimote CLI talks to the running server. It follows a
tuimote <subject> <verb> shape; every command and flag
below is also available as --help on the command itself. This page
is generated from the CLI's own command tree, so it always matches the binary
it shipped with.
Accepted by every command:
--pretty--human--language <CODE>de. Outranks $TUIMOTE_LANG, the cliLanguage record and the locale environmenttuimote sessionTalk to other agent sessions, and drive individual ones
Send messages, read screens, start/stop, attach, and ask questions.
tuimote session lsList sessions
The bare command prints a sectioned dashboard: running sessions federation-wide, this repo's inactive ones, archive counters, and machine/federation summaries — each collapsed section carrying the exact command that expands it. Filters (--agent, --cwd, --running, --origin, --local, --inactive, --this-repo, --all) print the compact flat table instead; --json dumps the raw array.
--agent <AGENT>--cwd <CWD>--running--json--pretty emits the same array pretty-printed--all--this-repo--local@machine: rows)--inactive--origin <ORIGIN>--origin macbook)--archivedtuimote session infoShow everything tuimote recorded about one session
Pass a shorthand, or pair a session id with --agent. The default output is pipeable JSON; --human renders named sections.
[SESSION]--agent <AGENT>--cwd <CWD>--sections <SECTIONS>tuimote session startStart a new session, or resume one with --session
tuimote session start --cwd DIR --agent claude [-m "first message"] [--pin]
--cwd <CWD>--agent <AGENT>--session <SESSION>-m, --message <MESSAGE>--pin--model <MODEL>tuimote session models. Leaving it off is the safe answer: agents should prefer the default and ask the human when a task seems to want another model. The operator may allow only some models here; the dashboard picker is never restrictedtuimote session modelsList the models each harness can start a session on, with the operator's notes on when to use them and which the CLI may ask for
The bare command prints a per-harness summary (model count + what the CLI may ask for); --all prints the full annotated catalog; --json dumps the raw catalog.
--agent <AGENT>--all--jsontuimote session stopKill a session's tmux pane
<SESSION>tuimote session archiveArchive a session (soft delete — recover it from `stash`)
Pass a <slug> shorthand, or the explicit --agent/--session[/--cwd].
[SLUG]--agent <AGENT>--session <SESSION>--cwd <CWD>tuimote session deleteDelete a session permanently
Pass a <slug> shorthand, or the explicit --agent/--session[/--cwd].
[SLUG]--agent <AGENT>--session <SESSION>--cwd <CWD>tuimote session copyConvert a session to a different harness. [experimental]
tuimote session copy <slug> --to codex
[SLUG]--cwd <CWD>--session <SESSION>--from <FROM>--to <TO>tuimote session sendSend a message to a session's composer
tuimote session send <target> your message here
With no target it goes to this repo's pinned session (resuming it if dead). Waits until the keys actually land at a ready agent.
Sends queue by default: the message waits for the composer instead of seizing it, so a busy agent is never interrupted. --interrupt opts into the immediate behaviour. --gently is kept as a deprecated no-op alias for the queued default.
[SESSION]@peer:shorthand; a peer's @ or label may be omitted when the session is unambiguous). A first word naming no session is message text (repo's pinned session is used)[TEXT]…--from <FROM>--raw--interrupt--gently--interrupt for the immediate behaviour.tuimote session viewRead what's on a session's screen (read-only)
--lines N, --full, --ansi. No target = this repo's pinned session.
[SESSION]--lines <LINES>--full--ansituimote session attachAttach to a session's tmux
No target = this repo's pinned session (resuming it if dead).
[SESSION]tuimote session unpinClear a repo's entrance pin (inverse of `repo pin`)
With a <target> clears that session's repo; else --cwd, else this session's own repo.
[TARGET]--cwd <CWD>tuimote session keysSend raw control keys to a session (C-c, Escape, Enter, arrows…)
tuimote session keys <target> C-c
Keys land verbatim — no text, no trailing Enter. Use send to type a message. Accepts tmux names (C-c, Escape, Tab), C-<letter>, or escapes (\x03, \e, \r). Multiple keys are sent in order.
[SESSION]chat). A first word that doesn't resolve is treated as the first key (pinned session used)[KEYS]…tuimote session imageAttach an image to a session
tuimote session image <target> path/to.png [--caption "…"]
PNG/JPEG/GIF/WebP only. Uploads the file and types its path in the harness's own vision syntax.
<SESSION>chat)<PATH>--caption <CAPTION>--no-submittuimote session transcriptPrint a session's transcript
Pass a <slug> shorthand. --mode picks the format (default no-tools).
[SLUG]--agent <AGENT>--session <SESSION>--cwd <CWD>--mode <MODE>tuimote session stubGenerate or refresh a session's one-line summary stub
Pass a <slug> shorthand, or the explicit --agent/--session pair.
[SLUG][TEXT]…--agent <AGENT>--session <SESSION>--file <FILE>tuimote session requestAsk a session a question and wait for its reply
tuimote session request <target> your question here
Blocks until it answers. --keep leaves the session running; --stop kills it after; without either it may auto-compact.
[TARGET][TEXT]…--agent <AGENT>--compact-at <COMPACT_AT>--tokenlimit <TOKENLIMIT>--no-compact--keep--stop--from <FROM>--raw--clear-pending--detachtuimote session receipt <receipt>. The target is never auto-stopped (there is no poll loop to stop it after an answer), so --stop is rejected with this.tuimote session replyReply to the request waiting on this pane. (Agent side)
Pass a file path (preferred), inline text, or pipe the reply on stdin.
[PATH]…--file <FILE>tuimote session receiptRead a detached request's verdict by the receipt `session request --detach` returned. (Worker side)
tuimote session receipt <receipt> [--wait SECS]
Reads the mailbox record the receipt names and reports its exact state: replied (with the reply), still pending, terminal, or that the request was replaced/missing/expired. Read-only — it never clears or replaces the record, so a stale receipt cannot consume a later request. --wait N polls up to N seconds for a terminal state instead of reading once. A peer-owned request whose owner is offline reports owner-unreachable with no local fallback.
<RECEIPT>--detach submission--wait <WAIT>tuimote session self-compactCompact your own context, then resume where you left off
Run from inside a session pane, or pass --session.
[TEXT]…--session <SESSION>tuimote session summaryWrite or deliver a single-session summary. [experimental]
tuimote session summary requestGenerate a session's summary headlessly from its transcript
Runs the summary headless runner server-side — the session is never resumed and no pane is tasked, so a dormant session works the same as a live one. --archive stops and archives it once the summary lands.
[SLUG]--agent <AGENT>--session <SESSION>--cwd <CWD>--archivetuimote session summary getPrint a session's stored summary
[SLUG]--agent <AGENT>--session <SESSION>tuimote session summary deliverRecord a summary you generated. (Agent side)
--session <shorthand> alone is enough; the other flags cover dead-session delivery.
[TEXT]…--session <SESSION>--agent <AGENT>--cwd <CWD>--tmux <TMUX>--archive--file <FILE>tuimote session commit-hookRecord commit → session attribution. (Called by the post-commit hook.)
Reads the current session identity and the just-committed SHA, then writes a .tuimote/commits/<prefix>/<sha>.json record. Silent on failure (a hook must never block a commit).
tuimote session issue-hookRecord issue → session attribution. (Called by the forge shim.)
Reads the issue out of the forge's argv — or, for a freshly created one, out of the bytes it printed — and appends an event to .tuimote/issues/<host>__<owner>__<repo>.jsonl. Silent on failure: it runs after the forge write already landed.
[ARGV]…--cwd <CWD>--stdout <STDOUT>tuimote session issue-ledgerRead a repo's issue attribution record, as JSON
One object per issue the record knows about, keyed by the forge host it was filed on: who opened it, the last state flip, the last edit, and one entry per attributed comment. Local disk only — the Issues panel reads it through the owning peer, since the record lives where the agent ran.
--cwd <CWD>tuimote session unlockClear a blocked commit with the password the pre-commit gate printed
The unlock applies to the NEXT commit in this repo and only that one, and expires shortly. Chain your commit onto it:
tuimote session unlock "<password>" && git commit -m "…"
<PASSWORD>--cwd <CWD>tuimote session blameShow session attribution for a commit or file
tuimote session blame <sha> — attribution for one commit tuimote session blame <file>[:<L>-<L>] — per-line session map
Maps commits (or file lines via git blame) to the tuimote sessions that produced them: shorthand, harness, task, and timestamp.
<TARGET>:L-L line range)--jsontuimote session attributeManually set, correct, or clear a commit's session attribution
tuimote session attribute <sha> --shorthand <sh> — a running session tuimote session attribute <sha> --session <id> — by session id tuimote session attribute <sha> --agent <name> — harness only tuimote session attribute <sha> --clear — remove the record
Fills gaps the hook and backfill can't cover (hook not installed, attribution off at commit time, external commit). Writes a source: "manual" record — visibly distinct in blame, never clobbered by a later hook or backfill. The SHA (full or prefix) is resolved against the repo first; a named session's fields are pulled from live state.
<TARGET>--shorthand <SHORTHAND>--session <SESSION>--agent <AGENT>--task <TASK>--clear--jsontuimote session dirtyCheck whether a running session plausibly owns uncommitted files
<SESSION>tuimote repoPer-repo settings: entrance pin, memory, dashboard card, wiring
tuimote repo initWire tuimote into a repo and/or install the /tuimote skill
Defaults to --repo on the current directory.
--repo--global--cwd <CWD>--backfill-attribution--no-issues.tuimote/ issue store (tuimote issue …, the Issues panel's forge-less row) for this repotuimote repo backfill-attributionReconstruct commit attribution from live and archived transcripts
--cwd <CWD>--dry-runtuimote repo customizeRestyle this repo's dashboard card (emoji, icon, name, color)
Only the flags you pass change. --icon-svg takes a file path (read inline; must be <20 KB and script-free).
--emoji <EMOJI>--icon-svg <ICON_SVG>--alt-name <ALT_NAME>--subtitle <SUBTITLE>--color <COLOR>--clear--cwd <CWD>tuimote repo pinPin a session as this repo's entrance point (one per repo)
tuimote repo pin <target>
Pinned sessions skip idle auto-stop and are the default target for send/view/attach/request. No target prints the pin; --clear removes it.
[TARGET]--clear--cwd <CWD>tuimote repo migrateHand this repo's pinned session over to a fresh one (any harness)
tuimote repo migrate --agent codex
The old session writes a handoff, a new one boots reading it and inherits the pin, and the old one is archived.
--agent <AGENT>--cwd <CWD>tuimote repo historyAdd a dated entry to this repo's HISTORY.md
Reads from stdin, --file, or positional text.
[TEXT]…--cwd <CWD>--file <FILE>tuimote repo stubsGenerate one-line stubs for all of this repo's sessions
--cwd <CWD>--agent <AGENT>--session <SESSION>--force--missing-only--limit <LIMIT>--concurrency <CONCURRENCY>--model <MODEL>stub runner. The operator may allow only some models here--timeout <TIMEOUT>tuimote repo supercompactFold session summaries into repo memory. [experimental]
tuimote repo supercompact startRun a supercompaction for a repo, in the background
Curates, summarizes the keepers, archives every idle (non-running, non-pinned) session, then folds the summaries into .tuimote/. Both reasoning steps run headlessly — no agent is spawned. Returns at once.
--cwd <CWD>tuimote repo supercompact deliverDeliver a hand-written supercompaction report. (Agent side)
Pipe it, or use --file / positional text. --archive also stops and archives every other session in the directory.
[TEXT]…--cwd <CWD>--archive--session <SESSION>--dry-run--file <FILE>tuimote repo tasksEvent-driven document tasks declared in `.tuimote/tasks.toml`
A task maintains one repo document (SECURITY.md, CODE.md, WORKFLOW.md…) off an event that already happens — a commit landing, a session being summarized or archived.
tuimote repo tasks lsList the tasks that apply to a repo, and when each last ran
--cwd <CWD>--jsontuimote repo tasks runRun one task now, ignoring its cooldown. Returns at once
<ID>tuimote repo tasks ls--cwd <CWD>--sha <SHA>diff-input task should review. Defaults to HEAD--session <SESSION>send-mode task goes totuimote repo tasks initWrite a starter `.tuimote/tasks.toml` with three commented examples
Refuses to overwrite an existing file unless --force.
--cwd <CWD>--forcetuimote repo tasks fireFire an event, running every task subscribed to it
This is the programmatic trigger: point a harness hook at tuimote repo tasks fire custom:<name> and any task declaring on = ["custom:<name>"] runs. Cooldowns still apply, so a hook that fires on every file write does not become a model call on every file write.
tuimote repo tasks fire custom:schema-touched --file db/schema.sql
<EVENT>custom:<name>, or post-commit--cwd <CWD>--file <FILES>paths are matched against these, and stay quiet when none is given--payload <PAYLOAD>payload inputtuimote repo passesNamed refinement passes the Issues panel can run over one issue
A pass is a prompt plus the repo context it wants gathered — code reuse, security risk, simplification, dependency research. Built-ins ship with tuimote; ~/.tuimote/passes.toml overrides them for this machine and .tuimote/passes.toml for this repo.
tuimote repo passes lsList the passes a repo offers, resolved through all three layers
--cwd <CWD>--jsontuimote repo passes showPrint one pass in full, prompt included
<ID>tuimote repo passes ls--cwd <CWD>tuimote repo passes initWrite the built-in passes out as an editable `passes.toml`
Refuses to overwrite an existing file unless --force.
--cwd <CWD>--global~/.tuimote/passes.toml (this machine) instead of the repo's--forcetuimote repo passes setAdd or replace one pass in a `passes.toml`
The whole pass is replaced, never merged field by field — that is what the layering does too, so set on an existing id needs every flag the pass should keep. Start from show if you are editing rather than writing one.
<ID>--prompt <PROMPT>--title <TITLE>--context <CONTEXT>--context "" asks for the prompt and nothing else--dispatch <DISPATCH>--model <MODEL>passes runner--tools <TOOLS>--disabled--cwd <CWD>--global~/.tuimote/passes.toml instead of the repo'stuimote repo passes reportHand a pass's findings back to the Issues panel. (Agent side)
Run this at the end of a refinement pass that was dispatched to your session: a session has no return value, so this is how the report reaches the operator. It lands on the issue's card in the panel, where they post it as a comment or discard it — this command writes nothing to the tracker.
Pass a file path with --file (preferred), inline text, or pipe it on stdin.
<N>[TEXT]…--file <FILE>--forge <FORGE>--cwd <CWD>tuimote repo passes rmRemove a pass from a `passes.toml`
A pass this file owns is deleted. A built-in, or one from a layer below, cannot be subtracted — it is written here as enabled = false instead, so it stays visible and can be switched back on.
<ID>--cwd <CWD>--global~/.tuimote/passes.toml instead of the repo'stuimote repo gateThe pre-commit gate. With no subcommand, runs it — this is what `.git/hooks/pre-commit` calls
Exits non-zero only when a block = true task actually decided to stop the commit. Everything else — no tasks, a clean review, an unreachable server, a timeout — exits zero.
tuimote repo gate installInstall the `pre-commit` hook, chaining any hook already there
--cwd <CWD>--uninstalltuimote repo wiringWhat each configured harness actually sees in this repo
Rows are resources (context files, skills, slash commands, memory injection), columns are harnesses. With no subcommand, prints the rows that need attention. Reports for peer-owned repos too, read-only.
tuimote repo wiring statusPrint the matrix. Only rows needing attention, unless --all
--all--kind <KIND>--cwd <CWD>tuimote repo wiring fixRun one of the safe fixes, or print what it would change
With no id, lists the fixes and why each is safe to run unattended. Refused for peer-owned repos: the resolver runs there, the disk is there.
[ID]--dry-run--cwd <CWD>tuimote repo wiring ackMark a divergence intentional so it stops asking
Takes a row key (ctx:AGENTS.md) or one column of it (skill:review@pi). The acknowledgement is recorded against the row's current shape and lapses the moment that shape changes.
<KEY>--clear--cwd <CWD>tuimote repo wiring setPer-repo overrides: context-file strategy and hidden harness columns
--strategy <STRATEGY>--hide <HIDE>--show <SHOW>--cwd <CWD>tuimote repo panelsDock panel order and visibility for this repo's switcher
The order is a list of panel ids, so a panel that is removed or re-scoped leaves a dead id behind in every repo that ever ordered it. prune is the non-GUI way to clear those out.
tuimote repo panels lsShow the switcher order, marking hidden entries and dead ids
A "dead" id is one the repo orders but cannot discover — a panel that was deleted, renamed, or moved to another repo. It never renders.
--cwd <CWD>tuimote repo panels orderSet the order outright, or drop one id from it
tuimote repo panels order --set "artifacts,git,code,shell" tuimote repo panels order --remove bub
An empty --set clears the explicit order (back to natural order).
--set <SET>--remove <REMOVE>--cwd <CWD>tuimote repo panels hideHide a panel from this repo's switcher (it stays in the order)
<ID>--cwd <CWD>tuimote repo panels showUnhide a panel
<ID>--cwd <CWD>tuimote repo panels pruneDrop every ordered/hidden id the repo can no longer discover
This is the cleanup for a panel that was removed or re-scoped: its id lingers in each repo that ordered it. --all-repos sweeps every repo the server knows about, which is usually what you want after moving one.
--cwd <CWD>--all-repos--dry-runtuimote repo templatesComposer templates — the buttons on this repo's template bar
Templates are keyed by repo path, so moving a repo leaves them behind; copy is how they follow it.
tuimote repo templates lsList a repo's templates (add --global for the cross-repo bar)
--cwd <CWD>--globaltuimote repo templates addCreate or update one template, by name
--name <NAME>--text <TEXT>--group <GROUP>--alias <ALIAS>// dropdown--cmd--cwd <CWD>--globaltuimote repo templates rmDelete one template by name
--name <NAME>--cwd <CWD>--globaltuimote repo templates copyCopy templates between repos, leaving the source untouched
tuimote repo templates copy --from /old/repo --to /new/repo
Copies every template unless --name is given (repeatable). Existing templates of the same name at the destination are kept unless --overwrite. --dry-run prints the plan.
--from <FROM>--to <TO>--name <NAME>--overwrite--dry-runtuimote repo shell-commandsShell commands offered in this repo's shell panel
Stored per repo path in the server-owned settings file, so a hand edit to that JSON loses to the next save; copy moves the list to a repo that moved.
tuimote repo shell-commands lsList this repo's shell commands, in panel order
--cwd <CWD>tuimote repo shell-commands addAppend one command (re-adding an existing one just moves it)
tuimote repo shell-commands add "tuidev lint"
<COMMAND>--first--cwd <CWD>tuimote repo shell-commands rmRemove one command, by exact text or by its `ls` position
tuimote repo shell-commands rm "tuidev lint" tuimote repo shell-commands rm --index 2
[COMMAND]--index <INDEX>ls instead of the text--cwd <CWD>tuimote repo shell-commands setReplace the whole list (repeat --command, in panel order)
--command <COMMANDS>--cwd <CWD>tuimote repo shell-commands clearDrop every command for this repo
--cwd <CWD>tuimote repo shell-commands copyCopy commands from another repo, leaving the source untouched
tuimote repo shell-commands copy --from /old/repo --to /new/repo
Appends the ones the destination does not have; --overwrite replaces the destination list outright. --dry-run prints the plan.
--from <FROM>--to <TO>--overwrite--dry-runtuimote repo contextPrint this repo's memory playbooks (HISTORY, STATE, NEXT)
state or next prints just that one file (raw, pipeable). To append to HISTORY use repo history instead.
[WHAT]--cwd <CWD>tuimote configGlobal server and request-runner settings
tuimote config profileClaude account profiles. With no verb, lists them
tuimote config profile lsList the available profiles and the active one
tuimote config profile switchSwitch the active Claude account profile
<ID>tuimote config profile addAdd a Claude account profile
--label and --bin are required. --id is derived from the label when omitted; --credentials-command sets an optional refresh command; --home names a private home (see profile home).
--label <LABEL>--bin <BIN>--id <ID>--credentials-command <CREDENTIALS_COMMAND>--home <HOME>tuimote config profile homePoint a profile at the private `$HOME` its sessions run under
Only needed when bin is a wrapper that changes $HOME — claude2 gives its account a home of its own so two subscriptions never share a keychain. Transcripts land there, and without this tuimote never reads them: the dashboard shows a stale same-named copy under our home, and commit attribution can neither be recorded nor backfilled.
tuimote config profile home claude-pro /home/claude-pro tuimote config profile home claude-pro --clear
<ID>[PATH]--cleartuimote config profile removeRemove a Claude account profile by its id
<ID>tuimote config passwordSet the web-UI password (how you secure a networked server)
Pass it as an argument, or omit it to be prompted / read it from stdin.
[PASSWORD]tuimote config lsList every setting and its current value
--json emits a {key: value} object.
--jsontuimote config getPrint one setting's value (bare; `--pretty`/`--human` emit JSON)
<KEY>tuimote config setChange one setting
tuimote config set fontFamily custom
The value is coerced to the key's type (bool, int, or comma-separated list). Only that one field changes.
<KEY><VALUE>tuimote config unsetClear an optional request default and restore its built-in value
tuimote config unset requestDefaults.warningMessage
<KEY>tuimote serverControl this tuimote server: usage, logs, restart
tuimote server usageShow server usage statistics
tuimote server logsShow the most recent server log lines
--follow--errtuimote server restartRestart the server in place (same binary, no rebuild)
--scope uses the network-scope-staleness recovery path.
--scopetuimote serviceInstall tuimote as a background OS service
Generates and manages a launchd agent (macOS) or systemd --user unit (Linux). Runs as your user, in $HOME. Use setup for a guided install.
tuimote service installWrite the OS service file (doesn't start it)
Run service load afterwards to start it. Idempotent overwrite.
--bin <BIN>tuimote-server binary the service should run. Defaults to the sibling of this CLI binarytuimote service uninstallStop (if running) then remove the OS service file
tuimote service loadStart the service and enable start-at-boot
tuimote service unloadStop the service (leaves the file in place)
tuimote service statusReport whether the service is installed and running
--jsontuimote authSign-in security: which devices are signed in, and signing them out
tuimote auth sessionsThe browsers holding a live sign-in, and how to end one
tuimote auth sessions lsList signed-in devices: label, last seen, sign-in, expiry, session id
JSON by default; --human prints the table. The device you are reading from is marked only when the caller *is* a browser session — the CLI's own loopback token is not one, so nothing is ever "this device" over the CLI.
tuimote auth sessions revokeSign one device out, by session id (the `id` column of `ls`)
Takes effect on that device's next request; nothing else is touched.
<ID>tuimote auth sessions revoke-allSign every device out — the "I lost a device" button
The CLI's own credential is not a browser session, so this always ends all of them; --except-current has a device to spare only in the dashboard, where the request carries a session cookie.
--except-currenttuimote auth totpThe authenticator app second factor: what is in force, enrolling one, and the way back in when the phone holding it is gone
tuimote auth totp statusWhat the second factor is doing: on or off, whether an enrollment is half-finished, and the parameters an authenticator app is held to
Answers from the running server; falls back to ~/.tuimote/config.json when nothing is listening, and says which it read.
tuimote auth totp disableTurn the second factor off — the recovery path for a lost authenticator
Asks for no password and no code: this command is reached from a shell on the machine running tuimote, which already reads the file the secret is stored in. The secret is erased rather than parked, so turning the factor back on always means a fresh QR and the old one stops working.
Browsers that are already signed in stay signed in — end those with tuimote auth sessions revoke-all.
--yestuimote auth totp enrollEnroll an authenticator app from the terminal, for a host with no browser on it
Prints the otpauth:// URI and the base32 key, then asks for the six digits your app shows. As in the dashboard, enforcement turns on only once a code confirms the enrollment: abandoning this leaves /login exactly as it was.
--confirm <CODE>tuimote trustGet this host's certificate authority onto a phone, tablet or laptop
Prints a QR code for the plain-HTTP download address, the literal URL under it, and the install steps per platform — including the second, separate trust toggle iOS requires and does not mention. Re-runnable; tuimote setup prints the same block when it turns HTTPS on.
Reads the config file, so it answers with the server stopped. The CA private key is not printed, served or transmitted by anything.
--jsontuimote peersFederation: manage the other tuimote servers on your network
Add/remove peers, toggle them, wake a sleeping one (Wake-on-LAN), flip mDNS discovery, and set the shared pairing secret.
tuimote peers lsList peers and the current discovery config
The bare command prints the human table; --json dumps the raw config.
--jsontuimote peers addAdd or update a peer
tuimote peers add host[:port] --cert-fingerprint SHA256 [--label NAME]
<PEER>host or host:port--label <LABEL>--mac <MAC>aa:bb:cc:dd:ee:ff, any separator)--cert-fingerprint <CERT_FINGERPRINT>tuimote peers ls on the peer--transport <TRANSPORT>direct or ssh) --ssh-target <SSH_TARGET>tuimote peers removeRemove a static peer
mDNS-discovered peers reappear on the next browse.
<PEER>host or host:porttuimote peers toggleEnable or disable a peer (flips its state)
<PEER>host or host:porttuimote peers wakeSend a Wake-on-LAN packet to a peer's configured MAC
<PEER>host or host:porttuimote peers discoveryTurn mDNS discovery on or off
tuimote peers discovery on
<STATE>on or offtuimote peers secretSet the shared pairing secret (never echoed back)
[VALUE]"" to clear). Omit to only end a grace window--grace <GRACE>24h, 7d; capped at 30 days). Omit for an INSTANTANEOUS rotation with no grace window--end-gracetuimote artifactRegister files to show in this repo's terminal document reader
Handles markdown, HTML, LaTeX, LilyPond, Mermaid, and images. Run from inside a session pane; the repo defaults to the one you're in.
tuimote artifact addRegister a file to show in the reader
tuimote artifact add PATH [--folder GROUP]
PATH is relative to the repo root. A malformed file is rejected with the linter's error.
<PATH>--folder <FOLDER>tuimote artifact removeUnregister an artifact
<PATH>tuimote artifact lsList the registered artifacts
tuimote artifact infoShow one file's metadata — what the reader's info modal reads
Size, kind and the host binary that kind needs, the filesystem's created/modified/changed stamps, the frozen-version span, and the session that registered it. Works on any in-repo file; an unregistered one just reports registered: false.
tuimote artifact info plan.md
<PATH>tuimote artifact rateRate a registered artifact from 1 to 5 stars
The reader's file-info modal shows the same stars, and the Docs list can sort by them or filter to a minimum. STARS of 0 clears the rating back to unrated, which is a different state from one star.
tuimote artifact rate plan.md 4 tuimote artifact rate plan.md 0
<PATH><STARS>tuimote artifact annotationsShow a user's staged notes on an artifact as a rewrite prompt
No path lists every file with staged notes. --clear discards them.
[PATH]--cleartuimote artifact updateRoll the live file's current content as the next version snapshot
Freezes the current content as the next version — what the reader's annotate-then-diverge flow does implicitly — and drops any staged notes that targeted the previous version. Reports unchanged when the live content already matches the latest snapshot, and errors when the path is not a registered artifact.
tuimote artifact update plan.md
<PATH>tuimote artifact showOpen a registered artifact in the attached PWA
Pushes the doc to every device that has this session's terminal open — their Docs reader flips to it with no tap. Run it from inside the session pane; the session it ran in is the one addressed.
Delivery is best effort: a phone that just backgrounded the page has no socket to push into. The command reports how many devices took it and exits 0 either way. An unregistered path is an error — artifact add it first.
tuimote artifact show plan.md
<PATH>tuimote artifact tabsManage reader groups (the reader's tabs)
tuimote artifact tabs lsList the configured tabs
tuimote artifact tabs addCreate a tab (or add cwds to an existing one of the same name)
<NAME>--cwd <CWD>tuimote artifact tabs removeRemove a tab by name
<NAME>tuimote panelAuthor and check dock panels (the right-edge plugin pages)
verify lints a panel .js file against the rules discovery enforces before a panel is allowed to load.
tuimote panel verifyLint a panel .js file against the registration rules
tuimote panel verify path/to/panel.js
Exits non-zero if any error-severity rule fails and prints the rule, line, and fix. Warnings and info never block.
<FILE>.js file--kind <KIND>repo enforces the sidecar allowlist rules--jsontuimote panel lsList the dock panels available in this repo
Built-in + user-global + repo-local, with their trust/valid state.
tuimote panel trustAllow this repo's local panels to load
Pass a repo path, or omit it for this session's repo. --revoke withdraws the grant.
[CWD]--revoketuimote shortcutDashboard shortcuts: named tiles in the left drawer
A shortcut is a saved deep link — a repo, a running session, a Session Info page, or a repo's dock panel — with a name and an icon. The --session/--sinfo/--panel/--repo flags are the same query params a copied shortcut link carries.
tuimote shortcut lsList the shortcuts, in the order the drawer shows them
tuimote shortcut addCreate a shortcut
tuimote shortcut add "Tuimote git" --repo tuimote --panel git --emoji 🌿
<NAME>--session <SESSION>dev-tuimote-1)--sinfo <SINFO><agent>:<id>--panel <PANEL>git, issues, …). Needs --repo--repo <REPO>--emoji <EMOJI>--icon-svg <PATH>--clear-icon-svg--color <COLOR>tuimote shortcut editChange a shortcut's name, target, or look. Address it by id or name
<SHORTCUT>--name <NAME>--session <SESSION>dev-tuimote-1)--sinfo <SINFO><agent>:<id>--panel <PANEL>git, issues, …). Needs --repo--repo <REPO>--emoji <EMOJI>--icon-svg <PATH>--clear-icon-svg--color <COLOR>tuimote shortcut rmDelete a shortcut, by id or name
<SHORTCUT>tuimote shortcut moveMove a shortcut to a new 1-based position in the drawer
<SHORTCUT><POSITION>tuimote shortcut linkPrint the URL a shortcut opens — the same link "Copy shortcut link" yields
<SHORTCUT>tuimote issueTrack issues in this repo's local `.tuimote/` store — no forge needed
The store the Issues panel uses in repos with no forge CLI or remote. Verbs follow gh issue; writes are attributed to the calling session.
tuimote issue listList issues in this repo's local store
-s, --state <STATE>-l, --label <LABEL>-S, --search <SEARCH>--sort <SORT>--order <ORDER>-L, --limit <LIMIT>--json--cwd <CWD>tuimote issue viewShow one issue, comments included
<NUMBER>--json--cwd <CWD>tuimote issue createFile a new issue. Unknown labels are registered with a stable color
-t, --title <TITLE>-b, --body <BODY>-l, --label <LABEL>--json--cwd <CWD>tuimote issue commentComment on an issue
<NUMBER>-b, --body <BODY>--cwd <CWD>tuimote issue editEdit title, body, or labels
<NUMBER>-t, --title <TITLE>-b, --body <BODY>--add-label <ADD_LABEL>--remove-label <REMOVE_LABEL>--cwd <CWD>tuimote issue closeClose an issue, optionally with a closing comment
<NUMBER>-c, --comment <COMMENT>--cwd <CWD>tuimote issue reopenReopen a closed issue
<NUMBER>-c, --comment <COMMENT>--cwd <CWD>tuimote issue labelsThe label registry (seeded with gh's defaults; grows on use)
--json--cwd <CWD>tuimote issue countOpen/closed/all totals — the panel's cheap list header count
--json--cwd <CWD>tuimote stashRestore or purge archived and trashed sessions
archive and delete move sessions here. List them, then restore, re-trash, or purge one by its key — or empty the trash.
tuimote stash lsList archived + trashed sessions
The bare command prints counts and the per-repo breakdown; --all dumps every item, --repo one repo's items, --trash the trash. --json/--pretty emit the raw {archive, trash} object.
--json--all--repo <REPO>dev/tuimote)--trashtuimote stash restoreRestore a stashed session back to live (archive→live or trash→live), by its key (the `<kind>/<agent>/<rel>` path from `stash ls`)
<ID>tuimote stash retrashMove an archived session to trash, by its key
<ID>tuimote stash purgePermanently delete one trashed session, by its key
<ID>tuimote stash emptyEmpty the trash (permanently delete every trashed session)
tuimote fontSet a custom terminal/composer font
Upload a woff2/woff/otf/ttf/ttc file, then switch to it with tuimote config set fontFamily custom.
tuimote font uploadUpload a font file (woff2/woff/otf/ttf/ttc) as the custom font
<FILE>tuimote font deleteRemove the custom font (revert to the system stack)
tuimote font statusShow whether a custom font is set (mime + size)
tuimote skillsList the slash commands an agent offers in a repo
The same set the web composer completes, plus any cross-agent divergence warnings. Defaults the agent and repo to the session you're in.
--agent <AGENT>--cwd <CWD>--json{commands, warnings} JSONtuimote statusPrint a health report for the server, harnesses, and peers
Covers reachability, version, security posture, each harness's availability, and peer/usage status. Read-only. --json for the machine form. Use doctor to also fix what's wrong.
--jsontuimote doctorDiagnose problems and offer a fix for each
Runs the status checks, then prompts to apply a fix per problem (install hints, config repair, securing a networked host, the OS service, Linux linger). --yes runs unattended; --json just reports.
--yes--jsontuimote updateCheck for a newer release; self-update where safe
Behavior follows the install method: install.sh installs download the signed release, verify it (minisign + SHA-256), swap atomically, and restart the service; Homebrew installs print brew upgrade tuimote && tuimote setup; source builds defer to the dev loop (self-rebuild.sh / tuidev restart).
--check--yestuimote setupOne-shot install: set up the service and print your dashboard URL
Runs doctor, installs and starts the OS service, prompts for a password if the host is exposed, then prints the LAN URL. Safe to re-run.
--yes--verbosetuimote secureChoose how browsers reach this host: HTTPS, or plain HTTP knowingly
Prints what this host does now (bind, recorded choice, listener), then puts the same three-way choice tuimote setup asks at first run — provisioning the certificate, restarting the service and printing the dashboard URL with the scheme that now serves it. Safe to re-run; a choice already on file is reported and only changed if you say so.
--yestuimote uninstallRemove tuimote's service and installer-managed files
Keeps global config and state by default. --purge removes ~/.tuimote, but always leaves per-repo .tuimote directories alone.
--purge~/.tuimotetuimote changelogShow what changed between releases
Prints the release notes shipped with this build, newest release first. Handy around an update:
tuimote changelog --since 1.0.0
--since <VERSION>tuimote completionsPrint a shell completion script (zsh, bash, fish, …)
Write it where your shell picks it up, e.g. for zsh:
tuimote completions zsh > ~/.local/share/zsh/site-functions/_tuimote
(and make sure that dir is in $fpath before compinit runs).
<SHELL>tuimote manPrint the man page (roff) to stdout
Write it somewhere man looks, e.g.:
tuimote man > ~/.local/share/man/man1/tuimote.1
tuimote whoamiShow this pane's own session identity (shorthand, cwd, agent)
tuimote chatOpen the global chat session (not tied to any repo)
Spawns or resumes the persistent entrance session from settings, then attaches its tmux. Reach it elsewhere with the target chat.
tuimote dashboardServe the browser dashboard from this host, or stop serving it
off makes this host a session backend: the app, /login and the PWA files stop being served, while the API, the terminal sockets and the event stream stay up for federation peers and this CLI — a peer reached through another host's dashboard never needs its own. Applies to the next request, no restart, and survives one.
It shrinks the *unauthenticated* surface; it revokes nothing. A browser already signed in keeps its API access until its session ends (tuimote config password ends them all).
tuimote dashboard off
A bare tuimote dashboard prints the current state.
[STATE]on or off. Omit to print the current state tuimote searchSearch session stubs, summaries, commits, and attributed issues
The bare command prints a summary line and the matching sessions; --json dumps the raw result with evidence blocks.
<QUERY>--all-repos--cwd <CWD>--limit <LIMIT>--json