Changelog
Features
- b5a046ddcd171d2609b20d005d2f811de27db381 feat(build): add Windows support and refactor signal handling
Other
- b5bd067acc96accd0a9d807915c2cebaa24e5e2d refactor: rename module and update references to theboringfloor
Ship log
Every release, what changed, and why. See the full history on GitHub Releases.
Agents now get an explicit built-in-browser-first rule on both backends.
open-browser shows a page, browser-screenshot captures it for the member, and browser-snapshot reads text/links for the agent.browser-action remains mutating and permission-gated.Full Changelog: https://github.com/theboringhumane/theboringoffice/compare/v0.3.21...v0.3.22
The office can now give its boss recent chat context when compaction or a long session makes it lose the thread.
⟦recent-messages⟧ (default 20) or ⟦recent-messages: N⟧ (1..50). The marker is hidden, and the office sends a bounded synthetic transcript containing recent user, boss, and tool-output rows. Newest context is preserved; recovery-control noise cannot recursively reappear.send failed: active backend unavailable instead of silently claiming success. OpenCode and real Claude candidate handoff tests both return replies after old-generation cleanup.Full Changelog: https://github.com/theboringhumane/theboringoffice/compare/v0.3.20...v0.3.21
Bypass permissions now works end-to-end on both backends.
/bypass builds and starts the replacement before switching. The current backend remains usable during restart, the indicator reflects the active mode, failures retain the old backend, rapid toggles coalesce, stale results are ignored, and discarded candidates are stopped asynchronously.OPENCODE_CONFIG_CONTENT override on the office-owned child. OFF strips inherited overrides. Project config, parent environment, and brain.json remain untouched. The serve reaper is the sole Wait owner.--dangerously-skip-permissions propagates through initial Start, death respawn, NewOffice, SwapPrimary, and ReconnectMCP. CLI rejection is actionable.EvPermission/can_use_tool; the OFF control prompted and completed after allow-once.Full Changelog: https://github.com/theboringhumane/theboringoffice/compare/v0.3.19...v0.3.20
Pasted images now survive for the assistant to read — the Claude backend wrote [attached file: "path"] text references to temp files that were cleaned up before the assistant could read them. Paste attachments are now persisted to a stable directory so the path reference remains valid after the send pipeline's cleanup pass.
Bypass permission mode no longer gets stuck on "restarting" — when a backend build result arrived with a stale transition ID, the bypass latch (bypassRestarting) was never cleared, permanently wedging future /bypass toggles. Both stale-transition guards now properly release the latch.
Fixes Markdown/code attachments after backend switches and bypass respawns.
/backend and /bypass can no longer leave chat pointing at a stopped backend.Full Changelog: https://github.com/theboringhumane/theboringoffice/compare/v0.3.16...v0.3.17
Three rough edges closed in one release.
Independent review caught and fixed a MIME-spoof bypass and missing-file transcript-count mismatch before release.
Full Changelog: https://github.com/theboringhumane/theboringoffice/compare/v0.3.15...v0.3.16
Every tool row in the transcript now answers the obvious question: what did it return?
Click any tool call (any kind — bash, read, write, grep, everything) and it expands with the tool's captured output: wrapped, capped at 12 rows with a tail note, 8000 bytes tail-kept so the error at the end is never cut. Running tools and output-less calls show an honest no output as such. Done events update an expanded row in place; worker-thread tool calls expand too; both backends feed it (claude tool_result, opencode state.output — schema verified against a live serve).
Also in this window: the sibling wave 95 shipped /btw side-sessions and a claude backend hardening pack (v0.3.10).
Full Changelog: https://github.com/theboringhumane/theboringoffice/compare/v0.3.10...v0.3.11
One-line policy, shipped: on claude-only offices the seeded .opencode/oikonomos.md now refreshes to the embedded charter whenever it drifts (absent, stale after an upgrade, or hand-edited) — the same office-owned discipline the opencode pass has always had. Fresh files cost zero writes and zero boot notes. Members edit CLAUDE.md, never the payload.
Live-verified on the real CLI: the boss recites all five developer return-contract sections (DONE/FILES/VERIFY/PROOF/ISSUES) from the real charter through the office's own spawn path.
Full Changelog: https://github.com/theboringhumane/theboringoffice/compare/v0.3.8...v0.3.9
Fixes the 'claudecode work is mediocre while opencode flies' gap.
Root cause: the office injected its oikonomos manager protocol only into opencode's config file. Claude Code reads project memory (CLAUDE.md) — which the office never wrote, so claude bosses worked unprimed: no decomposition discipline, no permission etiquette, no proof-of-work contract.
Now claudecode boots get the same charter: the office writes CLAUDE.md (created with an import of the bundled oikonomos charter when absent; an idempotent marked block appended below your content when you already keep one — your bytes are never touched). Live-verified against the real CLI: a marker planted in the charter comes back verbatim from the boss through the office's own spawn path.
Full Changelog: https://github.com/theboringhumane/theboringoffice/compare/v0.3.7...v0.3.8
Website-only wave: the light theme trades sterile white for a warm off-white paper tone across the page, hero/CTA bands, and chrome — cards and popovers stay white so the layering still reads. Dark mode untouched. Verified on a real headless-Chrome capture of the built site.
Full Changelog: https://github.com/theboringhumane/theboringoffice/compare/v0.3.6...v0.3.7
Website-only wave: the light theme, finished.
Full Changelog: https://github.com/theboringhumane/theboringoffice/compare/v0.3.5...v0.3.6
No Go changes in this release — website and content only.
Full Changelog: https://github.com/theboringhumane/theboringoffice/compare/v0.3.4...v0.3.5
The deliberate escape hatch, supported by both backends.
/bypass toggles a session-scoped bypass-permissions mode. Enabling asks for an explicit confirm first — agents will run tools and browser actions WITHOUT asking, this office session only — disabling is instant. While on: a loud amber ⚠ BYPASS segment rides every tab's topbar; claude respawns with --dangerously-skip-permissions (your session context resumes); opencode's config merges a permission allow-all (your explicit deny rules still win); any stray ask is auto-approved with a dim log row; and the office's own browser-action prompt is covered too. Nothing is written to disk — every boot starts with bypass OFF.
Live-verified against the real claude CLI: a bypass run completed a Write-tool turn with zero permission asks on the wire.
Full Changelog: https://github.com/theboringhumane/theboringoffice/compare/v0.3.3...v0.3.4
No behavior cliffs here — just everything made legible and consistent.
Full Changelog: https://github.com/theboringhumane/theboringoffice/compare/v0.3.2...v0.3.3
Small-surface quality-of-life, all end-to-end.
e edits the URL inline in the location bar (enter opens, esc cancels); O opens the current page in your OS browser.Full Changelog: https://github.com/theboringhumane/theboringoffice/compare/v0.3.1...v0.3.2
Every open follow-up from the browser pivot, closed end-to-end.
Full Changelog: https://github.com/theboringhumane/theboringoffice/compare/v0.3.0...v0.3.1
The browser tab stops fighting the terminal and starts showing you pages.
browser: shot of <url> → <path> rows) and read pages itself (snapshots come back to it as follow-up messages it can quote from).THEBORINGOFFICE_ZENBU_LANE=1; the installer's terminal-browser stage is now --with-terminal-browser.THEBORINGOFFICE_CHROME); refusal/timeout rows are exact.Full Changelog: https://github.com/theboringhumane/theboringoffice/compare/v0.2.30...v0.3.0
Fixes the base64-text leak members saw when re-opening the browser tab on v0.2.29.
Root cause: the keep-alive freeze SIGSTOPs the child mid-chunk constantly; resetting the splitter dropped the chain's head, so the thawed tail (pure base64, no escape opener) painted as text. Freeze now parks consumption only — the pending chain is preserved and the thawed tail completes it into a valid frame. Proven across 40 forced mid-chain freezes with zero base64 on grid or scrollback, and mutation-tested by restoring the old behavior (which reproduces the exact rows from the member's screenshot).
Also adds cmd/kittyprobe: a tiny diagnostic that asks your terminal which kitty frame shapes it accepts (the terminal answers in its own words) — built for the ongoing empty-pane investigation.
Full Changelog: https://github.com/theboringhumane/theboringoffice/compare/v0.2.29...v0.2.30
The embedded browser now survives tab flips.
Before: leaving the browser tab (ctrl+b / q / esc) killed the embedded terminal-browser session — returning meant an Electron cold boot and a full reload.
Now: leaving the tab FREEZES the child (SIGSTOP, zero CPU) and hides the image; returning thaws the same process and repaints the retained frame in ~10ms. Verified on a live drive: same pid across flips, 4 seconds of frozen silence, instant repaint, and the image still deletes before alt-screen exit at quit. Quit/close/open-new-URL semantics unchanged.
Also in this release: attribution default-on core (config + app layer) from a parallel wave.
Full Changelog: https://github.com/theboringhumane/theboringoffice/compare/v0.2.28...v0.2.29
Fixes the three defects members hit in v0.2.27's premium browser lane, all verified on a live Ghostty drive:
The page now renders, scales, and stays. kitty/ghostty + terminal-browser on PATH.
Full Changelog: https://github.com/theboringhumane/theboringoffice/compare/v0.2.27...v0.2.28
The premium browser lane now actually paints.
What was wrong: terminal-browser streams pages as kitty graphics escapes (chunked RGBA frames). Two bugs compounded: the lane's text grid consumed the stream (base64 garbage / blank body), and even correctly-captured image escapes could not reach your terminal — the office's TUI renderer silently drops zero-width APC sequences inside the view string.
The fix: the lane splits the child's PTY stream — kitty escapes go to a bounded image store, text chrome keeps rendering in the grid — and a frame-output splice (tea.WithOutput wrapper) re-emits the live images at the pane's exact cell origin after every renderer flush, with proper deletes on suspend/close/quit. Format-agnostic, verified against the real terminal-browser v0.6.0 wire on a live PTY capture, and production-verified end-to-end: the office's TTY stream now carries the real page frames (0 ESC_G before, 35 after).
kitty/ghostty + terminal-browser on PATH = the browser tab shows the real rendered page, CSS and images included. Everything else (text lane, fallback, floor flip) unchanged.
Full Changelog: https://github.com/theboringhumane/theboringoffice/compare/v0.2.26...v0.2.27
Small release answering one member question forever: why does the browser look like text?
kitty/ghostty + this release = the browser tab embeds the real browser automatically.
Full Changelog: https://github.com/theboringhumane/theboringoffice/compare/v0.2.25...v0.2.26
Robustness release on top of v0.2.24's browser wave.
Full Changelog: https://github.com/theboringhumane/theboringoffice/compare/v0.2.24...v0.2.25
The terminal office where LLM agents work as coworkers. v0.2.24 grows the browser up and hardens the installer.
floor (the office, default) and browser, flipped with ctrl+b. The right strip is back to seven tabs. /open <url>, the chat o key, history ring, link cursor — all unchanged, now in the left slot.browser: opening <url> (asked by the boss) notice marks who sent you there. Refused opens post the reason.https:// opens any host by default; only plain http:// beyond localhost needs THEBORINGOFFICE_BROWSER_ALLOW_HTTP=1.THEBORINGOFFICE_LIVE_CLAUDE=1) prove against the real claude CLI: one bubble per message (no doubling), permission ask → answer → tool ran, thinking tokens rendered. Plus regression pins for all three.@agentmemory/agentmemory) and can never abort the install again: any npm/init failure degrades to printed manual steps and the installer completes.curl -fsSL https://raw.githubusercontent.com/theboringhumane/theboringoffice/main/install.sh | bash
Full Changelog: https://github.com/theboringhumane/theboringoffice/compare/v0.2.23...v0.2.24
The terminal office where LLM agents work as coworkers. v0.2.22 ships the browser tab end-to-end.
cmd/uishot --browser and --browser --lane kitty render the tab against a fixture for docs/screenshots.~/.claude config default — v0.2.21), gitx/attribution for majdoor-authored child-process env (opt-in), plus everything since v0.2.20: transcript images, open-in-browser hotkey, board sync, wedge-out-of-transcript, gitignore attach picker, plan-editor selection engine, memory wave, docs site.curl -fsSL https://raw.githubusercontent.com/theboringhumane/theboringoffice/main/install.sh | bash
Full Changelog: https://github.com/theboringhumane/theboringoffice/compare/v0.2.21...v0.2.22
The terminal office where LLM agents work as coworkers. v0.2.21 fixes the Claude backend end-to-end and ships the attribution layer the tag kept missing.
nil; system/init becomes async metadata pinned when it lands (the input-gated init bug, proven locally). primaryID becomes empty-tolerant with PrimaryOverride override-wins semantics; CLAUDE_CONFIG_DIR defaults to ~/.claude so existing logins carry over; sandboxing stays available only via explicit THEBORINGOFFICE_CLAUDE_CONFIGgitx/attribution (wave 72) — WithMajdoorAuthorEnv + MajdoorEnvMerge for spawned child processes; opt-in via THEBORINGOFFICE_MajdoorFlag; every spawned backend/terminal child now gets majdoor-authored git identity without touching the harnesscurl -fsSL https://raw.githubusercontent.com/theboringhumane/theboringoffice/main/install.sh | bash
Full Changelog: https://github.com/theboringhumane/theboringoffice/compare/v0.2.20...v0.2.21
The terminal office where LLM agents work as coworkers. v0.2.20 teaches your office to see — boss turns render inline images — and opens the road to the web from inside the transcript.
🖼 <name> · <WxH> · <mime> chip + box-averaged raster preview of the first 64×20 cells with 24-bit 38;2/48;2 ▀ half-blocks (works on every terminal). Payload caps: 8 MiB, decoded dims ≤10k, ≤4 images per turn, pending bubbles never show previews, remote URLs never fetchedui.images = "auto" | "ascii" | "off" + /images cycler: path auto → kitty placeholder lines (ESC_G a=T,t=d,f=100,i=<hash8>,q=2 on kitty && Ghostty) → iTerm2 OSC 1337 (inline=1;width=<cols>:height=<rows>;base64,…) → ASCII half-block fallback; strict kitty→iterm→ascii fallback with native-error recoveryo open-in-browser (wave 65) — press on any bubble carrying verified targets (schemed URLs, on-disk local paths verified by os.Stat, boss media): · o (open) beacon marks it; o floats an OPEN IN BROWSER picker or dismisses one-off direct; exec.LookPath(open|xdg-open) with activity logging → opened: <name>; the claim holds only while transcript is focused and the selection mark is live, and only outside modals — it never steals keystrokes from free typingterminal-browser binary when installed, cascading cleanly to system-open on non-zero exit or host mismatch; THEBORINGOFFICE_TERMINAL_BROWSER_OFF=1 kills the lane without touching anything else (no config changes, no API surface)curl -fsSL https://raw.githubusercontent.com/theboringhumane/theboringoffice/main/install.sh | bash
Full Changelog: https://github.com/theboringhumane/theboringoffice/compare/v0.2.19...v0.2.20
The terminal office where LLM agents work as coworkers. v0.2.19 opens the eyes and the edit hand of your transcript — and ships Claude Code as a first-class brain alongside opencode.
🖼 paste-diagram.png · 8×8 · image/png chip plus half-block truecolor raster rows (▀ glyphs with 24-bit 38;2/48;2 cell pairs — works everywhere). Box-averaged downsample capped at 64×20, payload cap 8 MiB, decoded dims ≤10k, ≤4 images per turn, remote URLs never fetched, pending bubbles never show imagesui.images = "auto" | "ascii" | "off" with a live /images cycler: kitty placeholders (kitty/ghostty), iTerm2 OSC 1337 (iterm2/wezterm/vscode-optin), ASCII raster fallback everywhere else; TMUX, Apple Terminal, and dumb terminals fold to chipsCopied N chars toast, paste-over-selection routed so it can never land in the chat draft, an SGR-7 highlight unfurled per wrapped segment, blur clears the mark, and a live footer while a mark is armedclaude CLI sibling backend behind backend.NewClaude: stream-json framing, system/init/user+assistant/stream_event/result/api_retry/control_response mapping, per-turn usage deltas, interrupt→SIGINT→SIGTERM ladder, resume spawn, byte-deterministic --claudestub and --claude uishot, /backend slash with drain-first switches, install-select --backend opencode|claudecode, per-backend session pins, topbar backend awareness, and CI-proof classes (stopDrainTimeout/stopKillGrace/sendTermMouse)reconcileBoardDone, /memory [filter] slash, project ledger in .opencode/office-ledger.md + agentmemory mirror, boot splash lane status, and the wedge watchdog that one-notices per turn without ever landing in the live chat transcriptctrl+space)@ picker no longer lists .venv, node_modules, .pytest_cache, __pycache__, dist/build/target/, or .git/*docs/shots/*.png frames posed in browser-chrome figurescurl -fsSL https://raw.githubusercontent.com/theboringhumane/theboringoffice/main/install.sh | bash
Full Changelog: https://github.com/theboringhumane/theboringoffice/compare/v0.2.17...v0.2.19
The terminal office where LLM agents work as coworkers. v0.2.16 finishes the board's completion loop: no more DOING rows stranded after the work is done.
reconcileBoardDone — a completion hook fired at both completion sites (maybeChildReturned + queue done): it sweeps office-owned DOING rows and flips them deterministically:
[office] board sync: flipped N rows to done note per flipped batch — the member sees the sync happen.uisot --boardsync deterministic proof: 3 staged doings → return(tekton-1) closes its exact row and the sweep flips skopos-1's oldest → return(tekton-2) flips nothing (worker-collision). Byte-identical across two runs.<dir>/.opencode/office-ledger.md) + charter step 4 indoctrination (the boss consults the ledger before re-dispatching) + /memory [filter] member slash + boot-time memory-lane statuscurl -fsSL https://raw.githubusercontent.com/theboringhumane/theboringoffice/main/install.sh | bash
Full Changelog: https://github.com/theboringhumane/theboringoffice/compare/v0.2.15...v0.2.16
The terminal office where LLM agents work as coworkers. v0.2.15 gives the office project memory so the boss never says "I have no session history" again.
<dir>/.opencode/office-ledger.md: newest-first, capped at 50, deduped by ledger ID, byte-stable, and included in the instructions the serve readsoffice_dispatch_done observation when the lane is up; file-only degrade when it's not, never blocking the officememory: ledger armed (agentmemory OK) or memory: file-only (agentmemory :3111 refused) so silent degrade never happens again/memory [filter] slash — newest-first rows per dispatch: date, title, worker, verdict ✓/✗, files, verify digest; live-only fallback when <dir>/.opencode/office-ledger.md hasn't seeded yet[memory] recorded: <title> → ledger rides every completed dispatch alongside its return: mailcurl -fsSL https://raw.githubusercontent.com/theboringhumane/theboringoffice/main/install.sh | bash
Full Changelog: https://github.com/theboringhumane/theboringoffice/compare/v0.2.14...v0.2.15
The terminal office where LLM agents work as coworkers. v0.2.14 stops the plan pane from swallowing your boss's status chatter.
presentBossPlan now presents left only when the reply looks like a plan: a markdown structural signal (heading, bullets, numbered steps, code fences, or a bold section label) plus ≥3 lines and ≥160 non-whitespace characters. Boss narration stays in chat where it belongssession.jsonuisot --planshot now demonstrates the exact trajectory: boss replies with two chatter lines → pane STAYS hidden, then one # Goal/# Steps plan → pane opens (byte-deterministic twice)curl -fsSL https://raw.githubusercontent.com/theboringhumane/theboringoffice/main/install.sh | bash
Full Changelog: https://github.com/theboringhumane/theboringoffice/compare/v0.2.13...v0.2.14
The terminal office where LLM agents work as coworkers. v0.2.13 opens the door on every thread row.
ThreadRowAt, a new read-only hit-test over the thread hit-map: collapsed threads resolve their header and sneak rows, expanded threads resolve their header and closing rows; internal tool rows never resolve, and floating cards (question, permission, picker) always keep precedenceboot-warn mark, is stripped from session.json, and never accumulates stale copies across boots.opencode/mcp-servers.md, so the boss and her developers see exactly which servers their project has/power saver leg of uisot --power all is driven synchronously through the real slash pick→commit path (no more popover-prefill-residue concatenation); README documents the long-memory narrativecurl -fsSL https://raw.githubusercontent.com/theboringhumane/theboringoffice/main/install.sh | bash
Full Changelog: https://github.com/theboringhumane/theboringoffice/compare/v0.2.12...v0.2.13
The terminal office where LLM agents work as coworkers. v0.2.12 teaches a long memory to the transcript.
curl -fsSL https://raw.githubusercontent.com/theboringhumane/theboringoffice/main/install.sh | bash
Full Changelog: https://github.com/theboringhumane/theboringoffice/compare/v0.2.11...v0.2.12
The terminal office where LLM agents work as coworkers. v0.2.11 makes the office measurably kind to your machine.
git rev-parse probe moved off the Frame path (stale-now, refresh-async)curl -fsSL https://raw.githubusercontent.com/theboringhumane/theboringoffice/main/install.sh | bash
Full Changelog: https://github.com/theboringhumane/theboringoffice/compare/v0.2.10...v0.2.11
The terminal office where LLM agents work as coworkers. v0.2.10 gives your threads a room of their own.
ctrl+f opens the current worker thread fullscreen: its complete transcript (tool calls, per-call diffs, thinking) in a nested panel. esc or ctrl+f bounces back with state byte-identical; boss questions and permission asks still outrank and dismount it immediately[tool] Edit x ✓ · +8 −3 on the row, ↳ diff · path beneath it, click to open the full line-numbered patch (created files render as new-file pseudo-diffs)<dir>/.opencode/mcp-servers.md): every project your backend serves learns which MCP servers the boss and her developers may use — discovered from the very config chain the serve readscurl -fsSL https://raw.githubusercontent.com/theboringhumane/theboringoffice/main/install.sh | bash
Full Changelog: https://github.com/theboringhumane/theboringoffice/compare/v0.2.9...v0.2.10
The terminal office where LLM agents work as coworkers. v0.2.9 fixes a keybinding that physically collided.
ctrl+space — ctrl+i and tab emit the identical byte (0x09) in every terminal, so pressing tab to leave the terminal tab was read as "dive into capture" and jailed you again. ctrl+space (0x00) is one toggle key that flips shell capture both ways: press to dive in, press again to step back out. ctrl+o remains as a release alias.1..7 jump, ctrl+q arms, letters never leak into the PTY or the chat.The deep cut (v0.2.2..v0.2.8): mouse selection with verified copy, transcript breathing room, plan/build modes, notifications, the stuck-busy watchdog, the Git tab — all inside.
curl -fsSL https://raw.githubusercontent.com/theboringhumane/theboringoffice/main/install.sh | bash
Full Changelog: https://github.com/theboringhumane/theboringoffice/compare/v0.2.8...v0.2.9
The terminal office where LLM agents work as coworkers. v0.2.8 fixes two of the most visible UX papercuts.
ctrl+i dives into the shell (full grab semantics), ctrl+o releases, capture auto-drops when you leave the tab, no memory on re-enterarchitecture docs updated · explicit-pin resume notice self-cleans · charter fan-out manual sharpened · the website gained agent-ops posts and AI-crawler SEO from the parallel sessions
curl -fsSL https://raw.githubusercontent.com/theboringhumane/theboringoffice/main/install.sh | bash
Full Changelog: https://github.com/theboringhumane/theboringoffice/compare/v0.2.7...v0.2.8
The terminal office where LLM agents work as coworkers. v0.2.7 puts your repo's state on the floor.
M, A, ??, D, R, * = staged), and enter/mouse to drill into the diff — powered by internal/gitx (read-only, 2s-timeout, no-color)tab completion, shift+tab, numbers included); the only app-kept keys are ctrl+o (release back to chat) and ctrl+q (double-press quit)Conversation-first plan mode · plan-mode hardening (double-press approve, flip-on-acceptance) · stuck-busy watchdog + always-working /stop · OS notifications ("the tap on your shoulder") · atomic installer · darwin pbcopy selection hardening
curl -fsSL https://raw.githubusercontent.com/theboringhumane/theboringoffice/main/install.sh | bash
Full Changelog: https://github.com/theboringhumane/theboringoffice/compare/v0.2.6...v0.2.7
The terminal office where LLM agents work as coworkers. v0.2.6 brings you back when it matters — and never recovers wrongly.
permission needed — tekton-1 needs write); when the boss's turn completes, one the boss is done — <gist> ping. A burst of asks is always ONE ping. Zero deps (osascript / notify-send)/notify on|off (persists), ui.notifications in brain.json, THEBORINGOFFICE_NO_NOTIFY=1/stop always works — even when the serve is dead (unwinds locally, queue intact)--stop uishot proof refreshed to the question-hold roadblock contractinternal/gitx — read-only git status/diff backend for the upcoming Git panelcurl -fsSL https://raw.githubusercontent.com/theboringhumane/theboringoffice/main/install.sh | bash
Full Changelog: https://github.com/theboringhumane/theboringoffice/compare/v0.2.5...v0.2.6
The terminal office where LLM agents work as coworkers. v0.2.5 hardens plan mode against every silent flip found in the field.
ctrl+x arms with a toast, second inside 1.5s fires. Muscle-memory cuts can no longer nuke plan modeapprove failed — still in plan row (previously flipped first, asked later)boss reply landed in chat (plan mode was off when it completed) so a reply never vanishes into the pane's absenceagent field now shows [plan·degraded] in the status bar, a one-time red warning on plan entry, and the rejection itself is a transcript row (was: a single silent statusline flash)curl -fsSL https://raw.githubusercontent.com/theboringhumane/theboringoffice/main/install.sh | bash
Full Changelog: https://github.com/theboringhumane/theboringoffice/compare/v0.2.4...v0.2.5
The terminal office where LLM agents work as coworkers. v0.2.4 makes plan mode conversation-first.
ctrl+p flips mode only (chat keeps focus, floor stays floor); the boss's finished reply opens the markdown plan pane in the floor slot passively — you keep typingboss replied — your edited plan kept note (test-pinned)ctrl+x on the chat input or in the pane sends the plan to the build agent and flips back; untouched/empty plans refused politely"Plan, then build" section copy + README synced to the new behavior.
curl -fsSL https://raw.githubusercontent.com/theboringhumane/theboringoffice/main/install.sh | bash
Full Changelog: https://github.com/theboringhumane/theboringoffice/compare/v0.2.3...v0.2.4
The terminal office where LLM agents work as coworkers. v0.2.3 adds plan/build modes with a real plan editor, plus website polish.
ctrl+p toggles a full-pane markdown plan editor in the floor slot: starter template with a captioned mermaid diagram block, glamour-read-only view when unfocused, memoized renders. Plan-mode boss sends ride opencode's native read-only plan agent (agent:"plan" on prompt_async, degrade-open latch for older serves)ctrl+x sends your edited plan to the boss as agent=build and flips the mode home; an untouched template is refused politely. The plan buffer survives reboots (session.json)[plan] status badge + plan-aware hint barsuisot --planshot scenario; stale --layout proof refreshed to the current geometryVision/homepage in the human voice (living office manifesto) · under-the-hood (Go binary, power governor, battery-kind) + built-in-public sections · SEO pack (OG/Twitter/sitemap/robots via Cloudflare Pages) · Plan-then-build section with a plan-mode screenshot · mobile staircase fix · MIT license
curl -fsSL https://raw.githubusercontent.com/theboringhumane/theboringoffice/main/install.sh | bash
Full Changelog: https://github.com/theboringhumane/theboringoffice/compare/v0.2.2...v0.2.3
The terminal office where LLM agents work as coworkers. v0.2.2 makes the chat transcript interactive, sharpens session lifecycle, and rewrites the website's vision page.
/session accept = clean quit + relaunch as -s <pin>; ctrl+q double-press with armed toast; normal exits print session <id> — resume: theboringoffice -s <id>\x1b[m resets (SGR-empty-param resets previously killed the highlight mid-span)Full Changelog: https://github.com/theboringhumane/theboringoffice/compare/v0.2.1...v0.2.2
Terminal office for opencode — agents as coworkers on an ASCII floor. v0.2.0 ships seven feature waves over v0.1.0.
theboringcto is seated in his exec suite from boot (demo parity), swaps for the real architecture-brief child on dispatch, re-seats after the batch drains-s|--session <id> (env THEBORINGOFFICE_SESSION); beats session.json's restore, skips the freshness gate, degrades open on an unknown id/session picker — live resume with a root-session card: type to narrow, wrapped arrows, enter re-anchors, boss-busy refusal, current no-op, esc cancels; pin persists immediately/model list picker — bare /model opens the server's real models (GET /provider): arrows, enter switches the boss model live (persists to brain.json), esc cancels; /model provider/id free-form unchangedcache NNk once cache reads flow (headline tok and $ untouched)--at, --modelshot) + freeze renders at 5086×2896 under website/public/shots/ListModels rides a file-local ctx-aware GET (no cross-helper collision)curl -fsSL https://raw.githubusercontent.com/theboringhumane/theboringoffice/main/install.sh | bash
Full Changelog: https://github.com/theboringhumane/theboringoffice/compare/v0.1.0...v0.2.0