The to-do app that wants you gone.
CIPHER is a constraint engine for people who keep drowning in productivity software. No folders. No backlog theater. No comfort UI. Just execution pressure.
Most productivity tools optimize for managing work, not finishing work. CIPHER flips the axis:
- Hard-cap active tasks to 5.
- Expire stale tasks after 7 days.
- Self-destruct once all active work is done.
The best outcome is that you stop needing the app.
- Single authoritative host by default: secondary devices auto-join host instead of spawning isolated daemons.
- mDNS is best-effort:
cipher.localis attempted first, but direct host-IP fallback is always supported. - Authority-first sync: clients trust daemon
sync_state; disconnected clients cannot silently mutate task state. - ASCII banner parity: banner is shown during install and during CLI launch (
cipher,cipher up).
- Auto-Clean Bootstrap Runtime:
cipher upruns localstop -> clean -> probe -> join/start -> open. - Host/Join Runtime Modes: CLI reports
HOST|JOINand active target URL. - Runtime State Journal: PID/state artifacts under a dedicated runtime directory.
- mDNS Discovery + IP Fallback: resilient LAN join model.
- MCP Server + Tool Surface: task/state/discovery control + Ollama bridge.
- Host Termination Broadcast:
host_terminatingsocket event for synchronized shutdown UX. - Mission Debrief Export: session summary auto-downloaded when terminal burns.
- Browser State Wipe Protocol: local identity/session/task keys purged on destruct path.
- Procedural Audio Engine: WebAudio-generated keystrokes, alarms, pings, purge noise, ringtone.
- Local LLM Handler: Ollama detection + hostile sitrep generation without cloud dependency.
Detailed architecture: System Architecture
flowchart LR
CLI["CLI (cipher)"] -->|"up/stop/status/open"| MODE["HOST or JOIN resolver"]
MODE -->|"HOST"| DAEMON["Node Daemon (Express + Socket.io)"]
MODE -->|"JOIN"| REMOTE["Authoritative LAN Host"]
CLI -->|"mcp start"| MCP["MCP Server"]
DAEMON -->|"/healthz /api/*"| WEB["React Terminal UI"]
WEB -->|"authoritative sync"| DAEMON
DAEMON -->|"mDNS + IP"| PEERS["Peer Devices"]
DAEMON -->|"/api/tags /api/generate"| OLLAMA["Local Ollama (11434)"]
MCP -->|"tool calls"| DAEMON
MCP -->|"ollama.tools"| OLLAMA
# one-shot
npx @cipher.sys/terminal@latest
# global install
npm install -g @cipher.sys/terminalGlobal install runs postinstall bootstrap automatically.
cipher up # stop-clean, then auto-join LAN host or start local host
cipher up --host # force local host mode
cipher up --join 192.168.1.5 # force join explicit host
cipher stop # stop daemon + cleanup runtime artifacts
cipher status # host/join + mcp status
cipher open # open active target (host or join)
cipher mcp start # start MCP in background
cipher mcp start --foreground
cipher --quiet up # suppress launch bannercipher upcipher up --hostcipher up --join <ip-or-url>cipher stopcipher statuscipher opencipher mcp start
GET /healthz(X-Cipher: 1)GET /api/discovery(includesjoin.*+mdns.*health)GET /api/stateGET /api/tasksPOST /api/tasksPOST /api/tasks/:id/completePOST /api/tasks/:id/deletePOST /api/shutdown
host_terminating
cipher.healthcipher.discoverycipher.statecipher.list_taskscipher.add_taskcipher.complete_taskcipher.delete_taskollama.tagsollama.generate
cipher.localfails: usehttp://<host-ip>:4040and UI IP OVERRIDE.- Tasks not syncing: ensure all devices join one authoritative host (
cipher status). - Suspected duplicate daemon: run
cipher stopthencipher up.
GitHub and npm releases are intentionally separate workflows.
- GitHub track: branch + PR + merge.
- npm track: publish later from an intended commit SHA.
Built for people who ship, not people who color-code backlogs.
