Changelog
Every release, in order.
What shipped, version by version. Generated from the release notes.
- #56
42e1f2fThanks @ukanwat! - Unify MCP server management on a single JSON editor across the per-agent tab, global Settings, and the new-agent wizard — matching the raw-config UX of Claude Desktop / Cursor / Cline, replacing the bespoke form. Per-agent MCP status now aggregates stdio servers (previously invisible), per-server connect/disconnect/reconnect are transport-aware (no more 404 on stdio), and a new batchPUT /api/agents/:id/mcpsaves validated config. Also fixes home-page agent-filter persistence.
- #56
- #53
ef9ec2bThanks @ukanwat! - Agent-readable data-file attachments. Users can now attach zip, csv, tsv, json, txt, md, xlsx, docx, parquet, svg, xml, and yaml files. These are committed to disk and read by the agent via its tools rather than sent to the model, so even text-only models accept them. Attachments render rich in-chat previews — a file tree for archives, real spreadsheet tables (via SheetJS), csv/json previews — using the Pierre file-tree icon set for consistency with the resource browser.
- #53
- Ambient Acme, per-agent email, /skill mentions, and live config reload.
- Ambient Acme panel — summon the platform helper from anywhere in the web UI; it floats instead of shifting layout, resumes the last session, and shows an active state in the sidebar. Chat engine extracted into a shared
useChatSessionso the panel reuses attachments + streaming.CurrentViewContextlets routes publish the focused entity, surfaced to Acme as adata-ui-contextpart (latest-only materialization) with a UI-context chip. - Per-agent email — each agent gets its own identity and isolated mailbox, with global IMAP/SMTP connection defaults, a Settings → Email tab, live config, and an editable OAuth redirect-URI override.
- /skill mentions — reference skills inline in the composer via a
data-skill-refpart with per-message materialization. - Live config reload — on-disk edits to
config.yaml/AGENTS.md/ skills apply live by evicting cached agents; global settings (model/email) reload without a restart. Replaces the config watcher with an explicit Acme-onlyreload_configtool; effective rw-path grants let Acme edit platform surfaces. Onlyserver.host/server.portstill need a restart. - Fixes —
web_searchno longer shows "0 results" for content-blob providers; no redirect to/loginon a 401 while already on an auth page. - Refreshed the shipped Acme platform agent; added blog + changelog to the docs site, community health files, and color brand logos.
- Ambient Acme panel — summon the platform helper from anywhere in the web UI; it floats instead of shifting layout, resumes the last session, and shows an active state in the sidebar. Chat engine extracted into a shared
- Ambient Acme, per-agent email, /skill mentions, and live config reload.
- #39
aea29bcThanks @ukanwat! -openacme startnow detects missing sandbox dependencies (bubblewrap, socat, ripgrep) and offers to install them with your package manager (apt/dnf/pacman/zypper/apk, or brew on macOS) — so a fresh Linux box runs agent tools sandboxed instead of unconfined, without hunting for the right command. Non-interactive shells just print the exact command. Self-hosting + troubleshooting docs document the prerequisites.
- #39
- #37
d2d2df7Thanks @ukanwat! - Local-trusted auth: zero-credential local installs, full admin for shared ones.- Local installs are frictionless again. On a loopback bind (the default) the daemon auto-establishes a real session for loopback requests, so opening
http://127.0.0.1:3456lands straight in the app — no claim page, no login form. Auth stays on under the hood (a reallocal@localhostoperator + session). The per-requestHostheader is the gate: a non-loopbackHost(DNS-rebind, or a tunnel/proxy) is never auto-trusted. - Sharing requires a login.
openacme exposerewrites config to bind the network + require an account, then restarts — one command covers tunnels, reverse proxies, and direct IP.openacme expose --offreverses it. Exposing rotates the local operator out so its loopback cookie can't be replayed remotely. (server.requireAuthforces a login on a loopback bind for the rare tunnel-without-an-open-port case.) - Web member admin (Settings → Members). For shared installs: signed-in-as + sign out, the member roster + revoke, and one-click invite-link generation — previously CLI-only. Deployment-mode aware: local installs see an "invite your team" explainer with a docs link instead.
- Reachable claim/invite links.
openacme claim/inviteand the boot log no longer printlocalhostwhen shared — they use a detected address (or a clear placeholder) and hint to substitute your domain/public IP. - A branded 404 page, and a docs link in the sidebar.
- Local installs are frictionless again. On a loopback bind (the default) the daemon auto-establishes a real session for loopback requests, so opening
- #37
-
#35
1582351Thanks @ukanwat! - Fix a crash when upgrading from 0.8.x: the WASM SQLite engine can't open a database left in WAL mode by the previous (better-sqlite3) engine, so the daemon failed on first query withunable to open database file.createDatabasenow detects a WAL-mode file on open and converts it in pure JS — it checkpoints the committed WAL frames into the main database, switches the header to rollback journal mode, and removes the-wal/-shmsidecars. No native code and no data loss; verified byte-for-byte against better-sqlite3's own checkpoint. The conversion is a one-time no-op for databases the WASM engine already owns.
-
- #33
b0d78aeThanks @ukanwat! - Eliminate native dependencies sonpm i -g @openacme/cliworks on any machine without a compiler.- SQLite: replace
better-sqlite3(native) withnode-sqlite3-wasm(pure WASM). The stores keep driving the DB through a better-sqlite3-shaped adapter + a vendored drizzle session overdrizzle-orm/sqlite-core, so query logic is unchanged. Migrations reuse drizzle's ownreadMigrationFiles+dialect.migrate, so existing databases are recognised and only pending migrations apply. WAL is unavailable on the WASM VFS; the connection usesbusy_timeoutinstead (immaterial for a single local daemon). - Image processing: replace
sharp(native) withjimp(pure JS) for screenshot downscaling. - Browser: move
camoufox-js(pulls nativebetter-sqlite3/impit) tooptionalDependencies; it is already lazy-loaded with a graceful fallback, so a failed install no longer breaks the CLI. - CLI:
openacme startno longer crashes on headless boxes when no browser opener (xdg-open) is present — browser auto-open is now best-effort.
- SQLite: replace
- #33
-
#29
f30a4c0Thanks @ukanwat! - Release 0.8.0 — a large batch of work since 0.7.0 across the whole workforce platform. All@openacme/*packages move together (fixed group).Highlights:
- Per-member authentication. Replaces the single shared access-secret with
email/password accounts (flat-role admins), stateful sessions, first-run
claim via a one-time setup link, and out-of-band invite links. No loopback
bypass;
/api/healthstays unauthenticated. CLI:claim,invite,members list|revoke. Breaking: existing installs re-onboard once (the oldsecretfile is ignored; first boot prints a claim link). - Usage ledger — per-call token/cost metering,
/api/usage, and a/usagepage (overview, breakdown, activity, forecast). - Teams org chart and a tasks-board UX overhaul (searchable filters, smoother kanban drag, humanized times, board-mode detail sheet).
- Inline markdown editing (TipTap) across web panes.
- Landing page + docs site (Fumadocs static export), including the remote-access and self-hosting guides.
- Latest model presets refresh.
- Real end-to-end test suite (HTTP + browser) behind a no-mock model seam.
- Default server port changed
3210→3456. - Tool-host scaling fixes: lazy worker spawn, cached stdio MCP discovery, bounded per-session shells.
- Per-member authentication. Replaces the single shared access-secret with
email/password accounts (flat-role admins), stateful sessions, first-run
claim via a one-time setup link, and out-of-band invite links. No loopback
bypass;
-
-
Mobile-ready PWA with web push notifications, and editorial workflow refinements.
This release wires
ping_useragent events through to native mobile notifications and lands a full mobile-responsive UI pass so the operator can run the workforce from their phone.Push pipeline (
@openacme/db,@openacme/server)- New
push_subscriptionstable +PushStorefor per-device endpoints (single-operator deployment, unique endpoint upsert). PushDispatcherfan-outs everyping_userevent to subscribed devices via web-push, with 404/410 endpoint cleanup. VAPID keys auto-generate to<dataDir>/push-vapid.json(mode 0600) on first boot.- New routes:
GET /api/push/vapid-public-key,POST|DELETE /api/push/subscribe,GET|DELETE /api/push/subscriptions,POST /api/push/test. - Auth middleware whitelists
/sw.js,/manifest.webmanifest, and PWA icons pre-login so iOS can fetch the manifest before a session cookie exists. - VAPID subject defaults to a valid mailto URI (Apple's push service rejects
.localdomains with 403). - Service worker uses
renotify: trueso same-tag pushes still alert; test pings use a unique tag per fire.
Web app: mobile responsive + PWA shell
- Bottom tab bar replaces the hamburger drawer on mobile; sidebar is desktop-only.
- Manifest, hand-rolled service worker (push event + notificationclick with
includeUncontrolled: true), generated icons, apple-touch-icon. - Master/detail layouts on
/agents,/tasks,/skills,/settingscolumn-stack on mobile with a back-to-list pill. - Task dialog goes full-takeover above the tab bar on mobile.
- iOS standalone-PWA auth fallback: secret is also stored in
localStorageand injected asAuthorization: Beareron every API call, so cookie eviction between PWA launches doesn't force re-login. Login page silently re-authenticates from the stored token. - Service worker auto re-subscribes to push on every launch when permission is already granted (handles iOS subscription eviction).
- One-tap "Enable notifications" prompt on first PWA launch.
Memory (
@openacme/memory)DEFAULT_MEMORY_CHAR_LIMITraised from 2200 to 4000 — accommodates ~60-80 tight one-liner index entries before consolidation pressure kicks in. Per-agent override viamemoryCharLimitfrontmatter unchanged.
Tools (
@openacme/tools)- Removed
web_uploadbuilt-in. It only served one workflow (catbox → URL for Buffer's createPost). Agents that need catbox upload should configure a small stdio MCP server via per-agentmcpServers— keeps the third-party host boundary visible in the agent's frontmatter rather than bundled platform-wide.
- New
-
-
@openacme/* → 0.6.0
Highlights since 0.5.3:
- Multimodal
read_file— images render inline in chat; screenshots frombrowser_take_screenshotflow through the same path. - Browser overhaul — pluggable providers (local Chrome, Browserbase, Browser-Use, Firecrawl), per-agent sessions, auto-provisioned Browserbase contexts, tool-result spill to attachments.
- Agent-scoped
session_search— full-text search now scoped to the caller's agent; no cross-agent leakage. - Rename-swap compaction — preflight + UX fixes; dead fork bookkeeping removed.
- Web design pass — Cmd-K palette, workforce status, signal-blue meta, bounded search + FTS5 endpoint, agent filter polish.
- Auth picker with provider-availability gating; upstream provider errors surfaced in chat UI.
- Software Engineer agent template rebuilt with a real SWE persona.
- Fixes: ChatGPT OAuth (two fixes), Browser-Use
/api/v2profile auto-create,context-1mbeta dropped on OAuth path, web behind reverse proxy.
- Multimodal
-
- Ship the web UI's static export in the published
@openacme/servertarball. The package'sprepackscript already copiedapps/web/out→packages/server/web, but thefilesallowlist excludedweb/, so the static files were silently dropped from the publish. Result: everynpm install -g @openacme/cliinstall loaded the API on :3210 but returned 404 on/. Adding"web"tofilesmakes the published Hono daemon serve the bundled UI as documented.
- Ship the web UI's static export in the published
- Pin
camoufox-jsto 0.9.3 (regular dep, no longer optional). camoufox-js@0.10.x bumped itsimpitdep to ^0.13.0, and impit@0.13.1+ ships apreinstall: npx only-allow pnpmhook that blocks every npm-based install. 0.9.3 → impit@^0.11.0 (no preinstall) and exposes the samelaunchOptions/CamoufoxFetcher/installedVerStrAPI ourbinaries.tsconsumes.npm install -g @openacme/clinow produces a daemon with the Camoufox provider working out of the box.
- Pin
-
Make
camoufox-jsan optional dependency and whitelist native builds for pnpm 10+.Two install-blocking bugs in 0.5.0:
camoufox-js → impit@0.13.1carries"preinstall": "npx only-allow pnpm", which breaks every npm-based global install of@openacme/cli. Camoufox is one of several browser providers (chromium / browserbase / browser-use / firecrawl all work without it) and the browser code already lazy-importscamoufox-jswith a try/catch (packages/browser/src/binaries.ts). Moved tooptionalDependenciesso failed installs don't fail the whole tree.- pnpm 10's strict build-script policy silently skips native module builds, so
better-sqlite3never compiles →@openacme/dbcrashes on import. Addedpnpm.onlyBuiltDependencies: ["better-sqlite3", "impit", "protobufjs"]to@openacme/cli's manifest so pnpm honors the build at install time withoutpnpm approve-builds -g.
After this release, both
npm install -g @openacme/cliandpnpm add -g @openacme/cliproduce a working daemon.
-
- Add
cacheTtl: "5m" | "1h"to model config so callers can opt into Anthropic's 1-hour prompt-cache tier. Threaded into both Anthropic-cache code paths (native Anthropic viaapplyAnthropicCacheControl(messages, ttl)and OpenRouter+Claude viainjectAnthropicCacheControl(body, ttl)). Per-agent UI in the agents page; workforce-wide default in Settings → Providers backed by newGET /api/config(extended) +PUT /api/config/model.
- Add
-
Release 0.4.0.
Highlights since 0.3.0:
- Browser tool: managed Chrome via CDP with shared user-data-dir and per-agent tab ownership; ten
browser_*tools. - Tasks v2: comments + events split out of the task body into SQLite; pure event-driven scheduler with debounced wakes, echo suppression, lazy session allocation, recurring self-reset, and mid-turn event injection.
- Agent catalog: bespoke in-tree templates importable into the workforce (CLI
agents catalog/agents import, web modal). Ships the Coder and Acme platform templates. - Skills Hub: install + track skills from GitHub, marketplaces, URLs,
.well-known, LobeHub, Skills.sh, ClawHub, local dirs, and a newbuiltinsource. - AGENTS.md: shared workforce context injected into every agent's prompt; restart-free updates via cache eviction.
- Per-agent workspace + resources:
<agentDir>/workspace/as default cwd with a session-persistent shell, and<agentDir>/resources/listed in the prompt. - First-run setup wizard: provider credentials, model seed, agent creation — web + CLI.
- SSE-only streaming for interactive turns: agent runs are server-owned, the originating tab is just another subscriber.
- Pino-backed structured logger with OTel log export.
- LLM-generated session titles via a structured subagent.
- Operator home page with live SSE, plus
ping_user/sleepprimitives. - Workforce framing:
role+agent_listtool + peer-notes memory; silent OAuth recovery via Claude Code re-import. - Design refresh: four-color signal system, unified task activity timeline, polished OAuth callback, CLI per-tool rendering with green/red diff backgrounds.
- Browser tool: managed Chrome via CDP with shared user-data-dir and per-agent tab ownership; ten
-
Release 0.4.0. First publish — synchronized with the rest of the workforce.
-
- Per-agent state (memory + tasks), AI SDK v6 migration, MCP HTTP + OAuth, prompt caching, attachments, and a paper-aesthetic web UI.
- Per-agent persistent memory (
@openacme/memory) and per-agent task store + scheduler (@openacme/tasks) — both filesystem-backed, scoped by agent id. Newtask_*andmemorybuilt-in tools. - AI SDK v4 → v6 migration end-to-end.
UIMessageis now the canonical shape across DB rows, persistence, agent input, server response, and web render. Web uses@ai-sdk/react'suseChat+DefaultChatTransport; server usescreateUIMessageStreamoverAgent.runStream. Zod 3 → 4. - Anthropic prompt caching for native and OpenRouter Claude paths; cache markers preserve string content as string when marking cacheable.
- MCP: first-class Streamable HTTP transport with OAuth 2.1 client, plus
cwdfor stdio servers. Web + CLI editors for per-agent MCP server config. - Web UI: paper-aesthetic redesign, theme toggle (system/light/dark) with light-mode contrast pass, single-URL dev (Hono fronts UI on
:3210via proxy to Next; published serves the bundled static export from the same port), proper date-time picker and searchable assignee in the task modal, inline custom views and git-style diffs in tool rendering, attachments via picker / drag-drop /@-fuzzy file picker. - CLI: cancellable turns, credential-aware model pickers, windowed session picker that surfaces agent name, background daemon mode with secret-auth for non-loopback access, consolidated
pnpm agent <subcommand>aliases. - Server: RFC 5987 Content-Disposition for non-ASCII attachment filenames;
/api/healthnow reports the actual server package version instead of a hardcoded string. Always-on system tools (agent introspection / self-management) merged into every agent's effective tool set and hidden from the user-facing tool picker.
- Per-agent persistent memory (
- Per-agent state (memory + tasks), AI SDK v6 migration, MCP HTTP + OAuth, prompt caching, attachments, and a paper-aesthetic web UI.
-
Anthropic Agent Skills standard + agent-loadable skill bodies.
@openacme/skillsparses canonical top-level frontmatter (tags,related-skills) while still reading legacymetadata.hermes.*. Skill folders are walked at load time so companion files (scripts/*,references/*, …) are recorded as resources without being read until requested. NewparseSkillDirectory+Skill.resources/Skill.dirPath.@openacme/toolsships a newskill_viewbuilt-in (Level 1 progressive disclosure) bound from the server. Returns the SKILL.md body, the on-disk dir path, and the resource list — agents read companion files via the existingread_file/shelltools.@openacme/serverexposesPOST /api/skills/importfor multipart folder uploads (path-traversal guards, 200-entry / 10 MB cap, top-prefix stripping) and binds the skill registry intoskill_view.@openacme/cliaddsopenacme skills list|view|add|removeand a/skillsslash command + read-only overlay in the TUI.@openacme/agent-coresystem prompt now points the model atskill_view.@openacme/configaddsskill_viewto the default agent tools array.
All
@openacme/*packages bump together (changesetfixedgroup) so users always get a uniform version across the workspace.
-
- Read the CLI version from
package.jsonat runtime instead of hardcoding it.openacme --versionnow reflects the actual installed version.
- Read the CLI version from