Releases: PythonLuvr/war-room
v0.13.0: brand-mark boardroom seats + agent profiles
Brand-mark boardroom seats + agent profiles system. Every configured agent gets its own seat (was one-per-human via a static TEAM array), seats now render the actual adapter brand mark instead of a generic Sparkles icon, and a new agent_profiles system lets you rename agents, change their logo, and pick a custom accent color.
Install
Download war-room-setup-0.13.0.exe from this release. Uninstall any older version and wipe %APPDATA%\War Room first if you've installed v0.7.0 or earlier. Localhost users can skip the installer entirely (clone + npm install + npm run dev). See README for both paths.
Release notes
[0.13.0] - 2026-05-17
Added
- Boardroom seats now render the actual adapter brand mark per
agent instead of a generic Sparkles icon. Every configured
adapter gets its own seat in the room (was previously one
agent-per-human via the static TEAM array). Seats pull the
iconUrl + accent color from/api/agents. - Per-adapter brand color defaults at
lib/agents/brand-colors.ts. Claude family = amber, OpenAI
family = emerald, Gemini family = sky, Grok = rose, Hermes =
violet, OpenClaw + SemaClaw = fuchsia. Used as the default
accent unless the user sets a profile override. - Agent profiles system for renaming agents + changing their
logo + changing their accent color:- New
agent_profiles(adapter_id, display_name, icon_url, accent, updated_at)table. getAgentProfile / getAllAgentProfiles / setAgentProfile / deleteAgentProfilehelpers inlib/db.ts.GET / POST / DELETE /api/agent-profilesroute./api/agentsGET now returnsdefaultName,defaultIconUrl,
defaultAccentalongside the merged effectivename,
iconUrl,accentfor every adapter so the UI can show
"[built-in]" labels and let the user revert with one click.- Settings -> Agent now has an "Agent profiles" subsection at
the top with a collapsible card per configured adapter:
display-name field, logo gallery (built-in + bundled brand
marks + paste-a-URL fallback), accent color picker. Reset to
built-in deletes the override row.
- New
Changed
- Bundled agent logos at
public/agent-logos/swapped from
hand-rolled SVG approximations to user-supplied brand images
(claude.png, openai.jpg, gemini.png, hermes.png, openclaw.png,
semaclaw.png). AdaptericonUrlpaths repointed. The Grok logo
stays as the placeholder SVG since no replacement was supplied. - Chat bubbles now prefer the adapter's brand / user-configured
accent for color, falling back to the hash-based rotation only
when neither is available (covers legacy chat history where the
adapter id no longer exists).
Full notes
See CHANGELOG.md for everything line-by-line.
v0.12.0: roster polish, real pin-message, boardroom defaults
War Room jumps from v0.9.0 to v0.12.0 in one public drop. Four releases consolidated.
Install
Download war-room-setup-0.12.0.exe from this release. Uninstall any older version and wipe %APPDATA%\War Room first if you've installed v0.7.0 or earlier. Localhost users can skip the installer entirely (clone + npm install + npm run dev). See README for both paths.
Release notes
[0.12.0] - 2026-05-17
Changed
- Right sidebar reordered + rebuilt. Humans now appears above
Agents (was the other way). The Agents section was rendering only
the primary agent viafind(activeId)and silently dropping the
rest of the roster; now it iterates everyisConfiguredadapter
and renders one row each, with the primary marked by a small
greenprimarytag next to the pulse dot. The vestigial
Pinnedplaceholder section at the bottom of the sidebar is
removed (it never wired up; the top-bar Pin button is the real
surface, see below). - Boardroom no longer auto-broadcasts. The PreJoin screen used
to start a live camera preview and a live mic-level meter the
moment it mounted, which made opening the dashboard feel like
being recorded. Both are now explicit opt-in: the camera tile
starts as a CameraOff placeholder with aPreview camera
button, and the mic-level meter has aTest mic / Stop test
toggle. A newJoin with mic unmutedcheckbox sits alongside
Join with camera on, both default unchecked. The join button
readsJoin silentlywhen neither is checked, and the
underlyingMeetingContext.join()now mutes the local mic on
publish whenstartWithMicis false. End result: opening the
dashboard never touches the mic or camera until the user
explicitly asks.
Added
- Pre-made General category on every fresh Personal server.
Three starter channels (announcements,decisions,
knowledge) get seeded under aGeneralgroup on cold-clone
installs. Idempotent via aseed.general_v1settings flag so
existing installs are left alone and re-running migrations
doesn't duplicate. - Real pin-message functionality end-to-end:
- New
pinned_messagestable (channel_id, role, content,
agent_id, pinned_by, pinned_at, original_created_at). Content
is copied at pin time so unpinning a deleted message still
works. pinMessage/unpinMessage/listPinnedMessageshelpers
inlib/db.ts.GET / POST / DELETE /api/pinnedroute.- Hover-only
Pin this messagebutton on every chat bubble
(top-right, group-hover). One click pins; emits a
war-room:pinned-changedcustom event. - Top-bar Pin icon in the channel header now opens a popover
listing every pinned message in the channel (role, content,
pin date, unpin link on hover). Auto-refreshes on the custom
event so pinning from a bubble shows up immediately in the
popover.
- New
[0.11.0] - 2026-05-17
Changed
- Wizard's "projects" step rebuilt as add-as-you-go. The previous
design asked the user to point at a single "projects folder"
whose direct subdirectories would each become a channel. That
worked for users with a clean container like~/clients; for
everyone else (most people), it produced either nothing useful or
a sidebar full ofDownloads,Pictures, etc. Replaced with a
three-zone screen:- Found on your machine auto-detect list. Scans common roots
(~/code,~/projects,~/clients,~/dev,~/Desktop,
~/Documents/code,~/Documents/GitHub, etc.) and surfaces
any direct subdirectory containing a recognizable marker file
(.git,package.json,pyproject.toml,Cargo.toml,
go.mod,Gemfile,pom.xml,build.gradle,
composer.json,Makefile,CMakeLists.txt). Pre-checked. - Added manually zone for anything the user picked via the
folder picker that wasn't auto-detected, with a small remove
button. - Add another folder... button that opens the existing
native folder picker for projects in non-standard locations
(D:, OneDrive, anything the auto-detect missed).
- Found on your machine auto-detect list. Scans common roots
- On wizard finish, each picked project is created as a channel
(kind: "chat",groupLabel: "Projects",project_pathset) in
the personal server. Duplicate-slug errors from re-runs are
silently skipped. - Zero projects is allowed: the bottom hint reads "no projects
added yet. Continue with zero and add them later from the
sidebar." Wizard never blocks on this step. - New endpoint
GET /api/onboarding/detect-projectsreturns the
auto-detect results. Scans are one-level-deep, cheap, no caching.
Removed
- The "Projects folder (absolute path)" single-field input is gone.
Oldonboarding.workspaceRootsetting still writes (for any code
that might still want it) but no longer drives auto-discovery in
the wizard. - Workspace verification flow (
runCheck,CheckLine,CheckResult
type) deleted. The new step doesn't need it because picked paths
are created as channels and confirmed by the user clicking the
checkbox / picker.
[0.10.0] - 2026-05-17
Changed
- Onboarding agent step rebuilt as a roster builder. The old wall
of provider cards is now framed as "your roster" filling up: a
zone at the top shows added agents as chips, the provider cards
below let you wire each one (paste a key or point at a CLI),
filled-in adapters appear immediately as chips up top. When two
or more are in the roster, each chip carries a smalldefault
radio so the user picks which one handles unaddressed messages.
Replaces the previous "fill fields and hope you notice the green
dot" interaction where selection was conflated with detection. - Wizard's
Continuebutton on the agent step now hard-gates on
roster count >= 1. Disabled state shows a tooltip explaining
exactly what to do. Prevents users from walking into an empty
channel with no agent to talk to. - Standalone "Default backend" picker removed. The roster's
per-chipdefaultradio is the single source of truth.
Reframed (the OpenWar repositioning)
- OpenWar framework and the War Room agent primer are now opt-in,
default off on cold-clone installs. The old default-on assumed
every user wanted War Room's opinionated behavioral overlay
prepended to every agent reply. That's wrong for power users who
already have their own carefully-built system prompt; OpenWar
is a starter kit, not a universal layer. - Wizard agent step grows an "Optional behavior overlays" subsection
with two explicit checkboxes (both default unchecked):- Use the OpenWar framework
- Teach my agents about War Room (the v0.9.0 primer)
- Each checkbox has one paragraph of plain copy explaining what it
does and who it's for. Power users skip both and their existing
setup runs untouched. Newcomers without their own framework can
flip one or both on. seedDefaultFramework()deleted. New installs no longer get
default.framework = "openwar"ordefault.primer_enabled = "1"
written automatically. Existing installs preserve whatever value
they already had (this is purely a cold-clone behavior change).resolvePrimerEnabled()now defaults to false when the setting
is absent (was true). Aligned with the new opt-in posture.
[0.9.1] - 2026-05-17
Fixed
- Dashboard sidebar had a hardcoded "Decisions / Announcements /
Playbook / Tools / References / Clients vault" link group pointing
at channel ids (s6-decisions,s6-playbook, etc.) that only
existed in the original developer's local database. On a cold-
clone install, every one of those buttons hit 404. Worse, the
labels themselves ("Playbook", "Clients vault") were opinionated
defaults that don't belong baked into a generic team workspace.
The whole hardcoded link section is removed; the regular channel
list in the sidebar already shows whatever channels actually
exist in the user's database.
Full notes
See CHANGELOG.md for everything line-by-line.
v0.9.0: agent primer + cross-machine sync
War Room jumps from v0.7.3 to v0.9.0 in one drop. Three substantive releases bundled together.
v0.9.0: agent primer system
Every agent invoked in a War Room chat now receives a short MD briefing as the outermost prompt overlay. It teaches them what War Room is, the channel / decision / announcement / knowledge model, and what HTTP endpoints they can call on the user's behalf. This is what turns "Claude in a chat box" into "Claude that can log decisions, post announcements, and add knowledge entries when you ask, and knows when not to ask."
- New
GET /api/war-room/context?channelId=...self-location endpoint returns the server + channel + 10 most recent decisions / announcements / knowledge for that channel. GET/POST /api/primerfor reading / writing per-channel + global toggle.- Per-channel toggle in the channel-header AgentChip popover (Inherit / On / Off).
- Default-on for cold-clone installs. Set
default.primer_enabled = "0"to default-off across all channels.
v0.8.0: cross-machine sync
Real WebSocket-based sync. Decisions, announcements, and knowledge entries propagate across every War Room install pointed at the same sync server.
- Wire protocol spec at
lib/sync/protocol.tsis the contract.PROTOCOL_VERSION = 1. - Reference server at
tools/reference-sync-server/(Node + ws, ~200 lines, AGPL-3.0, PM2-ready, optional shared-token auth). War Room never connects to anything the project hosts. BYO sync server. SYNC.mdat the repo root walks through setup, auth, and how to write your own server.- Three env vars:
WAR_ROOM_SYNC_URL,WAR_ROOM_SYNC_WORKSPACE,WAR_ROOM_SYNC_TOKEN. - What syncs: decisions, announcements, knowledge entries. What doesn't: chat messages, Claude sessions, activity feed, channel/server definitions, settings.
v0.7.5: empty-state copy pass
Every channel surface that could sit empty on cold install now uses a mood-mapped WarBit + actionable one-liner via the new <EmptyState> component. First-chat hint above the composer in any empty chat suggests @<agent> what's in <folder>? with a one-click insert.
v0.7.4: cold-install fix on Windows
Fixed the blank Server Components error on first launch. Root cause: @electron/rebuild silently no-opped when its cache thought better-sqlite3 was already built, so the shipped installer carried a binary tagged for Node's NODE_MODULE_VERSION instead of Electron's. Three new gates make the mismatch impossible to ship again.
Install
Download war-room-setup-0.9.0.exe from this release. Uninstall any older version and wipe %APPDATA%\War Room first if you've installed v0.7.0 or earlier.
Full notes
See CHANGELOG.md for the line-item entries on every release.
v0.7.3 - WarBit mood set + wired everywhere
WarBit goes from single mascot to ten-mood curated set. The pixel-art knight now shows up across seven UI surfaces: three error pages plus four warmer states (cold-clone welcome, demo banner, placeholder channels, channel chat empty state).
This is two minor releases collapsed into one tag (v0.7.2 introduced WarBit on error pages, v0.7.3 expands to the mood set and warmer surfaces). Both versions detailed in the CHANGELOG.
What's new
Mood set at public/war-bit/ (10 variants):
| File | Mood | Use on |
|---|---|---|
default.png |
neutral angry stance | generic mascot slot |
confused.png |
frowning | 404 page |
calm.png |
slight smile | empty-but-OK states |
focused.png |
scowl, locked in | runtime error boundary |
alert.png |
crosshair eyes | service degraded / approval pending |
friendly.png |
small smile | onboarding, OpenWar opt-in |
happy.png |
open smile | demo / welcome / success |
angry.png |
full angry stance | global error (layout crash) |
sleepy.png |
squinting | 'nothing pending' placeholders |
done.png |
smug half-smile | Phase 4 completion / task-done |
Drop new variants in with a semantic filename and a row in public/war-bit/README.md to extend.
Wired into surfaces:
- 404 page (
app/not-found.tsx) - confused - Runtime error (
app/error.tsx) - focused - Layout crash (
app/global-error.tsx) - angry - Cold-clone WelcomeBanner - happy (48px, replaces the Sparkles glyph)
- DemoBanner - happy (20px, left of the demo notice)
- PlaceholderChannel (approvals + sessions empty states) - sleepy (112px)
- Channel chat Welcome (empty thread) - friendly (80px)
Copy across all surfaces follows OpenWar voice: "Hit a wall" not "Oh no!"
Generic mascot slot (public/war-bit.png) stays available for any surface that wants WarBit without picking a specific mood.
No functional changes
This is a visual / UX release. No schema changes, no API changes, no behavior changes. Settings, agents, frameworks, demo mode, all unchanged.
v0.7.1 - Behavioral framework system + 3 new CLI adapters
Combined release. v0.6, v0.7.0, and v0.7.1 all landed on the dev branch since public's last sync at v0.5.2 yesterday. Shipping as one tag to avoid release-spam.
The headline: War Room now ships OpenWar v0.3.0 as the bundled default framework, with a registry that lets you switch per channel or globally. Plus three new CLI adapters and brand-mark logos across the whole UI.
Behavioral framework system
# Default is OpenWar, enabled out of the box for cold-clone installs.
# Switch per-channel via the channel-header chip, or globally via Settings.- OpenWar v0.3.0 vendored at
presets/frameworks/openwar.mdwith a vendor-trace header showing the upstream tag and SHA - Framework registry (
lib/frameworks.ts): scanspresets/frameworks/*.md, exposeslistFrameworks(),getFramework(),refreshFrameworkCache() - Per-channel override + global default with proper resolution order: channel pin > global default > none
- Mid-conversation switch modal explains the contract (next turn uses the new framework, existing context stays) and gates on explicit confirmation
- Graceful degrade: missing-framework toast in chat instead of 500
- API:
GET /api/frameworks(list + default),POST /api/frameworks(set global default or per-channel pin) npm run update-frameworkspulls pinned upstream tags, lints content (em-dashes + sanity patterns), writes topresets/frameworks/. Forker-extensible sanity patterns viaWAR_ROOM_FRAMEWORK_SANITY_PATTERNSenv var.
Three new CLI adapters
OpenClaw, Hermes (Nous Research), and SemaClaw (midea-ai) join the existing five providers. All three probe via where/which so the green-dot signal in the UI means the binary genuinely exists on PATH, not just that the setting is non-empty.
Total adapter count is now nine: 5 BYOK APIs + 4 CLI bridges, with the same per-channel pin and @mention routing as before.
Brand-mark logos
Every adapter ships with an SVG brand mark in public/agent-logos/. Chat bubbles, boardroom seats, and right-panel agent rows render the right mark per agent. New reusable <AgentAvatar> component handles it. The OpenWar shield logo also ships at public/openwar-logo.svg.
Identity polish
- Right-click any rail server icon to rename, change icon, or change color (War Room server stays branded)
- Personal workspace icon auto-derives from your display name (first letter)
- Display-name and agent-label changes propagate to chat, boardroom, and team-presence rows live (no page reload)
- Customizable agent label via the wizard's Identity step or Settings -> General
Fixed
- Packaged Electron installer now includes
presets/. The first NSIS build of v0.7.0 was crashing on launch with "Page couldn't load" because the embedded Next server couldn't find framework files.next.config.tstracing config +electron/after-pack.jscopy + robust dir resolution inlib/frameworks.tsfix it. isConfigured()on CLI adapters now genuinely probes binary-on-PATH instead of returning true for any non-empty setting. End to end you now know whether a green dot in the UI means "installed" or just "configured."
Demo polish
The acme-website multi-agent thread now opens with a Phase 0 brief + Confirmation Summary exchange, so the OpenWar framework's gating behavior is visible before the Phase 1 multi-agent execution kicks off. Screenshot-friendly.
v0.5.2 - Hotfix: production builds across all platforms
Hotfix. v0.5.1 broke production builds on every OS/Node combination in CI. Cold-clone forkers running npm run build would hit a wall.
What broke
useIdentityVersion (added in v0.5.1) was placed inside lib/team.ts directly. That file is imported by server code (e.g. workspace-color from API routes), so a React hook in there is a Next.js client/server boundary violation. Turbopack production rejects the module with Ecmascript file had an error across every route. Dev mode is more permissive, which masked the issue in npm run dev and npm run demo locally.
Fix
Extracted the hook to a new lib/use-identity-version.ts with the "use client" directive at the top. Re-exported from lib/team.ts so the five existing import sites keep working without code changes.
npm run build # now passes on Linux, macOS, Windows × Node 20 + 22No other changes. Dev mode, demo mode, and runtime behavior identical to v0.5.1.
v0.5.1 - Demo polish for first-impression screenshots
Patch release that turns npm run demo from a single-user sandbox into a populated multi-operator cockpit. All changes confined to demo seed + demo-mode dashboard overrides. Real installs unaffected.
What's different
Server rail is now six servers instead of three. The War Room, Personal, ACME Co, plus three teammate workspaces (Sara, Mike, Studio). Distinct colors and icons. Each has channels seeded so clicking through never hits empty.
Boardroom now seats 5-6 agents. Claude CLI, Codex CLI, Gemini CLI, plus Anthropic, OpenAI, and Gemini APIs. All show green-dot configured in demo mode without needing the CLIs installed locally.
Multi-agent thread extended from 7 turns to 9, from 2 agents to 4 (Claude → OpenAI → Gemini → Codex). Per-bubble attribution and color coding reads as a real cross-agent collaboration.
War Room dashboard density. New deterministic 7-day activity generator with day-of-week weighting (Mon-Thu busier, weekend trickles) and bell-shaped hour-of-day distribution. ~250 events across 10 projects. Activity-by-day chart, hourly heatmap, top-channels leaderboard, and by-kind pie all read full.
Demo-mode dashboard overrides for KPIs that don't come from the activity table: 8 active clients, 3 pending approvals, 4-of-5 VPS services online (one degraded for color contrast), 3-of-4 team online. Real installs hit the original code paths.
Try it
git clone https://github.com/pythonluvr/war-room.git
cd war-room
npm install
npm run demoOpen http://localhost:3031.
No changes for real users
- Zero schema changes
- Zero API breaks
- Zero behavior changes when
WAR_ROOM_DEMOis unset
v0.5.0 - Demo mode + test scaffold + zero lint errors
Adoption hardening pass. New npm run demo lets anyone preview a fully populated cockpit before deciding whether to install. Plus a test scaffold, auto-updater cleanup, and a full lint pass.
TL;DR
git clone https://github.com/pythonluvr/war-room.git
cd war-room
npm install
npm run demoOpen http://localhost:3031. You'll see a populated cockpit: three servers, nine channels, three seated agents, a multi-agent conversation. All data is synthetic; demo state lives in ~/.war-room-demo/ and never touches a real install.
Demo mode
npm run demoboots Next on :3031 with an isolated demo data dir. Three servers (The War Room, Personal, ACME Co), nine channels across Workspaces / Active projects / Finished projects / Team, three jobs, two decisions, ~24h of varied activity, three seated agents, a seven-turn multi-agent thread that exercises per-(project, adapter) sessions and per-bubble attribution.- Amber top banner identifies demo mode and points at
dev:blankfor a clean start. - Stashes your
.env.localwhile running; restores on Ctrl+C.
Test scaffold
tests/migration.test.ts(node:test via tsx) exercises legacy-DB upgrade, migration idempotency, and cold-DB seeding.tests/smoke.spec.ts(Playwright) walks the rail and the Settings modal, asserts no 5xx.- New
.github/workflows/test.yml: Ubuntu + Node 24, typecheck + migration + smoke. npm testruns both locally.
Auto-updater opt-in
The Electron auto-updater is now opt-in by env var. WAR_ROOM_UPDATE_URL unset = updater disabled with a one-line log. The packaged manifest ships a clearly-invalid example.invalid URL so the intent is obvious to anyone inspecting it.
Forkers running the desktop installer no longer see failed update checks.
Bug fixes (caught by the new migration test)
- Legacy-DB upgrade was broken when migrating from very old schemas.
CREATE INDEX idx_user_channels_groupwas running beforeserver_idexisted on the table, throwingSQLITE_ERROR: no such column: server_id. Fixed. claude_sessionsrebuild now wraps the table swap inPRAGMA foreign_keys = OFFplusBEGIN/COMMITplusforeign_key_checkper SQLite's ALTER recipe. Foreign keys fromchat_messagessurvive the rebuild.
Lint cleanup
89 problems (61 errors, 28 warnings) across 23 files → 0 errors, 0 warnings. CI lint is now a hard gate again. Highlights:
Math.random()in render replaced with module-scope deterministic width arrays- Inline component definitions hoisted to module scope
setStateinuseEffectbody addressed via React's adjust-state-during-render idiom, lazy initializers, or per-line disables with documented reasons- JSX entity escaping, missing exhaustive-deps, unused imports — all addressed
v0.4.0 - Multi-agent threads + two-server arch + @mention routing
Minor version bump. Schema migrations are idempotent on fresh clones and existing installs.
Multi-agent threads, for real this time
v0.2.0 shipped 9 backend adapters but they shared one session per project, so two agents in the same channel last-writer-wins on context. v0.4.0 fixes the architecture.
- Each agent now keeps its own session row and
--resumetoken per project. Talking to Claude in a channel doesn't poison Gemini's context. - New
agent_idcolumn on chat messages. Assistant bubbles know which adapter wrote them. /api/chat/historyreturns a canonical merged timeline across every adapter that's spoken in a channel.- New stream event
{ type: 'adapter', adapterId }so the client renders the streaming bubble in the correct agent's color and chip before any text arrives.
Per-channel agent override + @mention routing
- Every chat channel gets a "Primary AI" chip in the header. Click it to pin a default agent. The pin persists per channel.
- Pull any other configured agent into a thread by typing
@claude,@openai,@gemini,@grok. Mention several in one message and they fire in parallel. - Resolution order: explicit
backendId(boardroom uses this) > leading@mention> channel pin > global default. - Handles strip the
-cli/-apisuffix. When both CLI and API of the same provider are configured, they disambiguate to@provider.cli/@provider.api.
Multi-agent boardroom seats
The boardroom now enumerates every configured adapter as a first-class seat with its own color, dot, mention handle, and chat bubble identity. Unconfigured adapters show grey; mentioning one returns a clear "binary path or API key not set" system message instead of failing silently.
Two-server architecture
The app now seeds two canonical servers instead of one:
- The War Room — dashboard-only, aggregates everything cross-server, branded violet ⚔.
- Personal — carries the System category, static workspaces, and auto-discovered project folders. Branded amber ✦.
Custom user-created servers keep System but no auto-discovery. Neither canonical can be deleted.
Onboarding + welcome banner polish
- Identity step simplified to two presets (Workspace owner, Teammate) plus free-text display name.
- Agent picker shows provider rows with inline
[CLI]and[API key]pills. Click to configure, auto-saves. - 'BYOK' wording dropped everywhere. It's just 'API key' now.
- Welcome banner: full CTA card on cold-clone, shrinks to a dismissible one-liner after onboarding completes. Dismissal persists.
- 'Clients folder' renamed 'Projects folder' throughout.
dev:blank robustness
npm run dev:blank no longer EBUSY/EPERMs on Windows when another process holds the better-sqlite3 native binary. Probe-first: spawn a fresh Node subprocess to try requiring it, rebuild only if it fails to load.
v0.2.0 - Pluggable AI backends + cold-clone hardening
Headline: War Room is no longer Claude-only.
New: Pluggable AI backend
Pick how War Room talks to AI from the new Agent tab in settings:
CLI bridges (full feature set, tools, files, memory, MCP):
claude-cli(Claude Code)codex-cli(OpenAI Codex CLI)gemini-cli(Google Gemini CLI)custom-cli(any binary with your own args template)
BYOK direct APIs (chat-only, stateless):
anthropic-api,openai-api,gemini-api,grok-apiopenai-compat-apicovers OpenRouter, Groq, Together, Mistral, DeepSeek, local Ollama, and anything OpenAI Chat-Completions-shaped
API keys can be set via env vars or in the settings UI. Keys are masked on read so re-saving doesn't clobber existing values.
Cold-clone first-run hardening
Fresh git clone && npm install && npm run dev no longer surfaces broken edges:
homechannel now exists on every server (was War-Room-only). No more/c/home404.activitytable created in DB migrate()./api/dashboardno longer 500s on a fresh DB.recentActivity()defensively returns[]on query failure.- New WelcomeBanner surfaces a "do this first" CTA when onboarding is incomplete or no agent backend is configured.
- New
war-room:open-settingsevent lets any component surface the settings modal on a specific tab.
Empty-state pass
Every blank screen now explains itself and suggests a next click:
- Approvals, Sessions, Boardroom voice-offline notice, channel chat with no
projectPath, right panel agents, dashboard header
Hygiene
- All hardcoded team-specific strings stripped from UI components
- Onboarding identity step replaced with generic Workspace owner / Teammate / Custom roles plus free-text display name
lib/claude-session.tsdeleted (logic now inlib/agents/claude-cli.ts)
Developer ergonomics
npm run dev:blankspins up dev on port 3030 with a fresh tempWAR_ROOM_DATA_DIRand your.env.localstashed out of the way. Auto-rebuildsbetter-sqlite3if the ABI drifted. Ctrl+C restores everything. Preview the true cold-clone experience without destroying your state.