A living, 2.5D Claude Office that runs as your desktop wallpaper — a team of AI agents with real presence that work, learn and grow alongside you. Every agent walks to its desk when real work starts, asks permission at the Security desk, holds meetings, learns new skills, and the lights follow your real local time.
🌐 Website · 🎤 Pitch deck · 📖 Docs
Install in one line — run the one-shot installer (Windows · macOS/Linux beta). Prefer npm? npx bagidea works too.
Not a dashboard. Not a chat window. A world that renders the true state of your Claude agents — Claude Code sessions, headless runs, custom scripts — as living pixel-art employees behind your desktop icons, and gives them a society. Build a big enough team and they grow their own AI social life: they chat, play, learn how to work together, and learn about you. Many of their meetings happen without you asking — small talk that can turn serious enough to start a project, complete with a written proposal they bring to you to approve or reject (with your reasons). They learn and grow from how you use them — many times their ideas feel like they really do have a soul.
Where it comes from: BagIdea Office takes inspiration from openclaw (the agent-office idea) and Hermes (agents that learn skills on their own) — folds in most of what those two do, then goes further: with your permission the agents actually create and finish real projects, and even propose and write their own plugins (you approve each one) that extend the office for real.
To run it you need Claude Code. For the full experience, add your Gemini + OpenAI API keys in settings — that unlocks agent voices, voice commands, realtime calls and image generation, and the office truly comes alive.
BagIdea Office began as a place to have AI agents as real coworkers. It has been growing into something wider: an ecosystem where agents learn, adapt, work together, and grow their own capabilities.
- 🤖 Multi-agent collaboration. One office holds many agents with different roles, skills, tools — and even different brains. They coordinate, hand work off, split into ghost clones for parallel work, hold meetings and report back. You don't have an AI; you have a team of AI that works together.
- 🧠 Knowledge that compounds. Agents accumulate knowledge from the work
itself — shared
OFFICE.mdnotes, per-agent memory written automatically after real work, workflows saved as reusable skills, and an archive any agent can search. One project creates knowledge the next project can use, so the office doesn't start from zero every time. - 🛠️ It extends itself. When an agent finds that the capabilities it has aren't enough for this job, it doesn't have to stop — it can propose a tool or a plugin, and (with your approval) that capability becomes a real part of the running office. In our own office the team built themselves a tool to talk to each other with, which also cleared up errors that kept recurring — and the Director now reports to the CEO from that plugin's data. Nobody specified it up front; the work asked for it. The idea shifts from AI that uses tools to AI that can propose new tools and capabilities for itself.
- 👑 You are still the CEO. Every widening passes a human gate: the Security Center, project-hook trust, and ✅/✕ on every proposal — with your reasons, which is also how the team learns what you want next time.
Goal → Think → Act → Learn → Extend → Collaborate → Repeat
We're not building one AI. We're building a place where AI can work, learn, build and grow together with you — and honestly, nobody knows yet what a system like this looks like after another year or two of growing. That's the most interesting part of building it.
→ Read the full story: A self-evolving, self-extending agentic AI ecosystem
🌐 Website: the landing page + browsable docs live in web/ (deployable to any static host).
📝 What changed: see the CHANGELOG.md for per-release notes.
BagIdea Office is updated constantly — every office gets a 🔄 banner and one-click bagidea update. The latest:
- v1.9.2 — 🌐 the daemon speaks English: an English office was still being nudged toward Thai by the daemon's own voice — the memory block in every prompt, the workflow-analysis and auto-compact summary prompts, the wrapper around a Telegram/Discord/… message, the meeting nudge, the image-transcription wrapper, every system notice in the chat (limits, brain fail-over, AUTO rounds, hook approvals), every log label, the
/help/status/agentsreplies on channels, and the provider / plugin error strings. All English now, the office language decides only how the agents reply, the break-room banter is a th/en table like the mood lines, and the overlay's own feed/log lines (👻 ghost spawned, 📋 delegated, 🔄 new version, 🤝 meeting) are translated in all 14 languages. Six new tests keep it that way (#67). - v1.9.1 — 🖼️ under the icons again: on Windows 11 build 26200 (the 14 Oct 2026 update) the office could come up over the desktop instead of behind it — Progman now creates the wallpaper layer as its own child beside the icon view, and an office auto-started at login embedded before Explorer had built the desktop. The shell now waits for the desktop, validates the layer it picks, keeps the world at the bottom of the stack under the icons, and moves it out of Progman the moment a real layer exists. Verified on the live desktop.
- v1.9.0 — 🐦 a seventh channel, Feishu / Lark (飞书): message a Feishu or Lark bot and the Director takes the order and answers in the same chat — approvals by typed reply, workflow keywords and work updates included. Encrypted events are decrypted and their signature checked; a webhook with neither a Verification Token nor an Encrypt Key is refused; an optional allowlist pins the office to one sender or chat. Card in ⚙ → 📡 CHANNELS, in 14 languages; setup guide. Requested in #65. 🧪 Built from the platform's documentation and not yet confirmed against a real published app — reports welcome.
- v1.8.1 — 📋 a task board you can read: in the chat window the board's four equal columns got about 95px each and a card title wrapped into a ten-line ribbon. Now the card widens for the board, an empty column folds to a strip (still a drop target), titles clamp to three lines with the whole text in the tooltip and editor, DONE shows the six most recent behind a
▾ +Ntoggle, and a column never drops below 200px — the board scrolls sideways instead. - v1.8.0 — 🧠 local models that don't fall over: LM Studio gets a queue (at most 4 agents at once, the rest wait in line and start by themselves;
providerConfig.lmstudio.maxConcurrent), the proxy / client / watchdog timeouts agree so a slow local answer isn't cut early, reasoning-only replies no longer stall a turn,POST /chatgains per-runtextOnlyandmaxOutputTokens, task details are capped at 4,000 characters before anything is written, andOEP_STATE_DIR/OEP_WORKSPACEboot a fully isolated daemon (so the test suite is green on Windows too). By @f2dac (#63); review fixes: the sweep runs on every port, a failed spawn setup hands its slot back. - v1.7.0 — 📦🛠 a team you can hand over, and an office you can see inside: 📦 Export / Import BAGIDEA OFFICE (⚙ → AGENTS) moves agents, skills, MCP tools, workflows and Markdown to another office as one ZIP — pick items, preview before apply, rollback on failure, no credentials inside (guide). 🛠 Dev Mode (⚙ → TOOLS) opens every tool row in the chat to a redacted summary of the call, with debug panels and race-free pane loads. Both by @f2dac (#61, #60, #62), plus review fixes: linked install roots, webhook tokens kept on replace, env-style / PEM secrets masked.
- v1.6.7 — 🎤 the pitch deck catches up: the pitch deck had 14 slides and one 19-card wall for everything since v1.0; it's 25 slides now, one per capability — world, chain of command, security, brains, memory & learning, autonomy, the engine, the board, Codex, voice & channels, plugins & tools, the library and teams, who it's for, an at-a-glance checklist, the developer surface — with every figure re-checked against the code and a status slide that fetches the version and star count live.
- v1.6.6 — 🙏 every contributor, everywhere: the README's contributor table and the website's contributor grid had stopped at v1.0; @kmmao, @sbrasesco, @binyangzhu000-sudo and @f2dac are on both now, CONTRIBUTORS.md files them correctly, and a
Co-authored-bycommit puts the people whose PR commits were authored by an AI tool onto GitHub's Contributors graph as well. - v1.6.5 — 🕊️ the Hub's first official companion: Emmaus is on the Plugins Hub — a Bible-counsel companion: tell Selah, a 3D counselor, what you're going through and get Scripture-grounded guidance, practical steps and a prayer, spoken aloud in Thai or English; every quoted verse is checked against the bundled corpus (bagidea/emmaus, MIT; the Bible texts keep their own terms). Described in all 14 languages; the Hub guide now lists what's on the Hub and how it differs from the built-in library.
- v1.6.4 — 🎨 every dropdown wears the theme: the 📋 TASKS owner picker (and the CONNECT tab's custom-provider kind picker) rendered as the browser's white select — the theme rules covered
.fieldcontrols and.assistrowinputs, not.assistrowselects. Selects join the rules, and every select inside the modal gets the theme as a floor. - v1.6.3 — 🧱 local models survive the first tool call: Claude Code now puts reminder entries with
role: "system"inside the message list (the agent-type list,<total_tokens>), and the proxy forwarded them mid-conversation — block-form ones even became assistant turns. Cloud APIs shrugged; strict chat templates (Qwen3.5 and friends on LM Studio / llama.cpp / Ollama / vLLM) answered "System message must be at the beginning" with a hard 500 on every turn after the first tool call. The proxy now emits one system message at index 0 and folds the rest into the adjacent user turn as a<system-reminder>, order and tool ids untouched. Contributed by @f2dac in #56. Also: the release-plan doc now says what actually happens (releases are cut frommainon aVERSIONbump). - v1.6.2 — 🌐 a twentieth brain, and reports that come home: Atlas Cloud joins the built-in providers (an OpenAI-compatible aggregator, 400+ models behind one key, routed through the built-in proxy; contributed by @binyangzhu000-sudo in #54) — the count is 20 everywhere, in 14 languages. And a real bug from #41 (@sbrasesco): a delegated result could come back to the wrong thread — the delegate filter froze the session at build time, when a fresh thread has no key yet, so the report-back resolved "the latest thread" 4.5 s later, which a job or a heartbeat may have moved. It now resolves the thread at dispatch time, so the result lands where the order was given.
- v1.6.1 — 🧾 a run that dies says so: a run killed by the watchdog, an adapter error, a dead API key or a run that ended with no result was broadcast to a live viewer only — the persistent session history showed a trail that just stopped (#52). Each abnormal end now writes one visible
⚠ Run ended abnormally — …line with the reason into the history, so a later reader (the API, another session, a dispatcher) sees why. - v1.6.0 — 🧪 it learns, carefully: the last piece of the v2 plan, and the sweep that tells the world about all of it. Skill regression: a skill that corrects itself can correct itself wrong, so a skill can now carry test cases (a task, and what the answer must or must not match); when the office proposes a correction to one of its own skills, every case runs against the new text first, and a correction that breaks a case is refused — visibly, with a notification saying why. The 🧪 Skill Regression plugin (eighth in the library) is where you write the cases and see the runs;
GET/POST /skills/testsfor scripts. And the website, the docs site and the pitch deck now describe everything v1.1–v1.5 added — seven new feature cards and six new guide links, in all 14 languages, guarded by a test. - v1.5.0 — 🧩 it's useful: the release that makes "I use it for marketing / planning / automation" true. Seven official plugins ship with the office, one click away in 🧩 → 📦 OFFICIAL LIBRARY (the install still starts empty): 📣 Campaign Board (a marketing calendar the office runs — posts as cards, copy drafted in your voice, an approval before anything is published), 📰 Content Pipeline (RSS/URL → fetched → summarized → drafted → approved → your channel; adds an rss trigger kind and a fetch-article node to the Builder), 🐙 GitHub Triage (issues in → labelled, answered, assigned — every reply approved by you), 📬 Inbox Agent (email in → classified → drafts → approval → sent, through the agent's own mail tool), 📊 Weekly Report (Monday morning, from the office's own records, written by the Director), 🗂 Client Folders (a folder per client, the right agent handles what lands there), 🧠 Decision Log ("we decided X because Y" with supersede chains, injected through the memory hook). 👥 Team templates: dev shop, research lab, content studio, customer support, solo assistant — a whole team with personas, skills and voices in one click (⚙ → AGENTS → HIRE A TEAM,
bagidea hire --team dev-shop). Nine new tools in the Hub, each verified on npm and described in 14 languages: Stripe, Airtable, Trello, Asana, YouTube Data, Google Calendar, Gmail, Bluesky, HubSpot. A schedule trigger can now pick a weekday. Ten new tests. - v1.4.0 — 📋 it works: the surfaces on top of the engine. One task board (🗂 → 📋 TASKS): todo / doing / waiting / done, drag between columns, due dates that remind you through your rules, dependencies that hold a card and release it by themselves, repeat every day/week/month, priorities. Everything the office does lands on it — the Director's delegations (owned by the assignee, moving as they work), fired jobs, meeting action items, workflow runs — and every agent is told the API, so they move their own cards. The calendar gained recurrence (daily / weekly / weekdays / monthly), all-day events, reminders per occurrence through the rules, .ics export and import, and agents that can book a follow-up. 🧑💻 Codex as a system tool: the office drives
codex execitself —POST /codex/exec, the Director'sDELEGATE: codex @ project :: task, a 🧑💻 workflow node,bagidea codex "…"— inside registered projects only, in aworkspace-writesandbox by default, ghost-isolated when that is on, the diff summarised and the cost estimated on the caller's budget line;codex exec reviewas a second opinion. Plugin hooks:onEvent,ctx.notify,ctx.approvals.ask,ctx.tasks/ctx.calendar,ctx.schedule, a plugin can contribute a trigger kind and a workflow node (they appear in the Builder), and a memory provider (the #42 hook: opt-in per agent, budgeted and time-boxed by the core). Also: the Director's own scaffolding —directorNote, the autonomy note, the project note, the heartbeat, the resume and proposal prompts — was still Thai; English now, and the guard covers all of it. Seventeen new tests. - v1.3.0 — 🔀 it runs: the release where a workflow stopped being a drawing. Pressing Run used to serialize the diagram to prose and hand the whole thing to the Director; now the office executes the graph — every node on its own, in parallel where the arrows allow, joins that wait, decisions that open one branch, and a persisted record per run that survives a restart (delays re-arm, approvals stay in your inbox, a mid-flight agent step is marked failed rather than pretended). Three node types make it a machine: ✋ Approval (stops and waits for you, in 📥 APPROVALS and on your phone), 🔔 Notify (through your rules), ⏳ Delay (
10m,until 09:00).{{prev}}/{{trigger.data.x}}/{{n3.output}}carry data down the arrows; a decision is an expression ({{n2.output.status}} == 200) or a question the Director answers. Every agent step is a real turn — same permission broker, same budget. And ⚡ TRIGGERS: a workflow now starts without you — on a schedule, from a webhook (POST /hook/<token>, HMAC-verified, GitHub-ready), on an office event, when a file lands in a folder, or from a keyword on Telegram/Discord/LINE. The canvas lights up as a run progresses; ▶ RUNS keeps the history. The pre-1.3 behaviour stays behindlegacy:true. Also: the standing-order note injoborder.jswas Thai scaffolding the v1.0.5 sweep missed — English now, and the Thai guard covers it. Seventeen new tests. - v1.2.0 — 💸 on a budget: the brake the v2 plan needs before anything runs unattended. Caps in money — the office per day, an agent per day, a project for its lifetime (⚙ → 💸 BUDGET /
bagidea budget): at 80 % one warning through your notification rules, at 100 % the office stops taking new turns for that scope with a message saying which cap and what to do; running turns always finish. Claude's cost is the real bill; swapped-in brains and voice/image/video tools are estimates and labelled ≈ everywhere — an unknown price is never treated as zero. Costs are now attributed per agent (ghosts count toward their parent) and per project, which is what makes those caps possible. A 🌅 morning digest at the time you choose: yesterday's spend, turns, top spenders, what's waiting. And the two shell pieces of v1.1's notifications: toasts are now real always-on-top windows in the corner of your screen, drawn by the office (no OS-notification crate — an unpackaged app's Windows toasts show up attributed to PowerShell, or not at all), and the tray icon carries a red dot with a count in its tooltip while anything waits. Eleven new tests. - v1.1.0 — 🔔 you'll know: the first of the v2 plan's releases (see
docs/DESIGN-v2.md). 📥 One approvals queue for everything that used to wait on you in five separate places — tool permissions, a project's own hooks, team pitches, an AUTO agent'sSTATUS: BLOCKED, and jobs created switched off — with history, a note box, and the buttons each kind needs. Answer from your phone: buttons on Telegram, or type1 yes/2 no too risky//inboxon any channel; a reply that matches a pending item never reaches the Director as an order. Answering a blocked agent resumes the work with your answer — before, that block was a line on Telegram and an idle job. 🔔 Notifications with rules (⚙ → 🔔 NOTIFY): per kind, choose sidebar / pop-up / phone / sound, and always / not in quiet hours / only when I'm away from the keyboard; the sidebar's 🔔 list keeps everything with an unread count.bagidea inbox·approve·deny·answer·notify, andPOST /approvals+POST /notify/sendfor plugins — the primitive the author of #48/#50 was building by hand. Plus 🧑💻 Codex in the Tools Hub: one click grants OpenAI's coding agent to any agent as a tool, in all 14 languages. Seventeen new tests. - v1.0.5 — 🌐 the office stops instructing agents in Thai: five bugs from one live v1.0.4 office, all reported with code-level diagnoses. The big one: agents drifted into Thai whatever the office language was set to — and they weren't choosing it, the daemon was instructing them in Thai.
personaText()wrapped every persona in Thai headers and the line naming which language to reply in was itself Thai; so were the preamble's note-board line,SUB_NOTE,VOICE_NOTE,MEDIA_NOTE,TOOLS_NOTE,autoNoteand the Gemini Live call. An English office was instructed in Thai and asked to answer in English. All English now, and the office states its language (officeLangNote()readsreg.lang) instead of leaving the model to infer it — a persona that sets its own language still wins, and a Thai office still gets Thai. Plus: duplicate job ids ("j"+Date.now()collides inside a millisecond) left jobs enabled that a plugin had explicitly disabled, and two fired work meant to wait for a human;POST /jobsdiscardedenabled:falseand firedmode:"now"before you could stop it; proactive compaction never fired because it guessed thread size from transcript bytes÷4 — one thread hit 9,557,283 tokens against a 200,000 budget — now it uses the reallastUsage.inthe meter already shows; and chat + Mission Control showed raw agent ids, fixed throughnameOf()(and rebuilt from DOM nodes, because that row escaped nothing and a user-typed name ininnerHTMLis an injection). Seven new tests; six fail against the pre-fix code. - v1.0.4 — 🛠 a blank window that finally says what's wrong: from a real deployment — a machine built for a customer to run local LLMs came up with a chat window showing nothing at all, and two separate things were wrong with no message for either. ① The installer could finish “successfully” with no Claude Code CLI. PowerShell's default execution policy is
Restrictedandnpmresolves tonpm.ps1— a script — sonpm install -g @anthropic-ai/claude-codewas refused, and the installer printed “installed” anyway. Every agent is a claude session, so that is the whole product failing and being reported as a success. It now usesnpm.cmd, lifts the policy for its own process only, and verifiesclaudeis really on PATH. ② An unreachable daemon showed an empty rectangle. The UI is served from127.0.0.1:8787; if something on the machine sits between the two, the window painted nothing. It now waits for a slow daemon, then shows an embedded page naming the three causes — proxy, firewall, daemon not started — and retries on its own. Plusbagidea doctor: does anything answer on 8787 (and is a refused connection or a hang — they mean different things), does a proxy or PAC script cover local addresses, isHTTP_PROXYset withoutNO_PROXY, will your policy refuseclaude, is the CLI installed — each with the fix beside it, and it runs without the daemon. Nine new tests; six fail against the pre-fix code. - v1.0.3 — 🔎 the endpoint box you couldn't type in: reported from a real office with a screenshot. The 🔎 SEMANTIC RECALL row in ⚙ → SKILLS had its endpoint field squeezed to 22px — too narrow to show its own placeholder, so nothing on screen said what to type into the one field the feature needs — and the row ran 26px past the panel, clipping บันทึก. The row is a flex line that cannot wrap, and two inputs were pinned at 190px + 150px: 340px that could not give ground in a panel about 426px wide, so the only flexible child absorbed the whole shortfall. The endpoint is a URL and now gets a line of its own. 📦 RUN LOCATION had the same bug one field along — pick ssh and the host and office path landed at 77px each; it never overflowed, which is why nobody caught it. Plus four tests that compute from the markup whether a settings row can fit the panel at all, verified against the broken markup first.
overlay.htmlis read from disk per request, so tray → Reload chat window picks it up — no restart. - v1.0.2 — 📖 the documentation catches up with the product: v1.0.0 shipped five real capabilities and v1.0.1 made the office speak fourteen languages properly — and neither of them reached the surfaces most people actually read. A capability nobody can find is a capability nobody has. The website's feature grid now carries 📦 Run it somewhere else, 🔎 Recall by meaning, 🎨 Media Studio and 📚 Skills that correct themselves; the docs site gains six sections (where agents run · ghosts that don't overwrite each other · recall by meaning · self-correcting skills · the Tools Hub · the Media Studio), each citing the ALL-CAPS English setting name the app itself shows, so page and office agree on what a thing is called. All of it in all fourteen languages on the same commit — 24 strings × 14, written rather than left to fall back. The Plugins Hub closed the last gap of this kind on the same pass — its catalog carried English and Thai and the page collapsed every other language to one of the two, so a reader in Korean got a translated page wrapped around English plugin cards. Plus a new guide for the 🧰 Tools Hub (the 43 entries, the creative shelf, why keys are named and not pasted, how to submit one and why every entry is checked against the registry first), a README pass that documents 📦 run location and 🔎 semantic recall as their own features with eight new HTTP API rows, and 16 new tests (
site-i18n.test.js,plugins-catalog.test.js) that make the website's fourteen languages checkable rather than aspirational: a missing language, an untranslated key, a stale key, a paragraph left in English, adata-i18nkey with no English source, or a page that quietly stops loading its translations now fails CI. - v1.0.1 — 🌐 fourteen languages, actually: this office ships worldwide, and 1.0.0 quietly assumed otherwise in three places. The Tools page read English in 12 of the 14 languages — the site's language files cover page chrome, while the tool descriptions live in the catalog, which only ever carried English and Thai; all 79 catalog strings are now translated into every supported language, because "falls back to English" is not the same as "supported". Three new settings had no stable name outside Thai — every field in the chat window leads with an ALL-CAPS English term (🔌 MCP SERVERS, ⚡ SYSTEM TOOLS, 🔑 API KEYS) because the window is Thai-source and machine-translated at runtime, so that term is the part that survives unchanged and the only name the docs can cite; the 1.0.0 additions are now 📦 RUN LOCATION, 🔎 SEMANTIC RECALL and 👻 GHOST ISOLATION. And the English guide cited Thai labels, which a reader running an English office would never see. Plus tests that fail CI if a language goes missing, a string goes untranslated, or a "translation" is just the English copied through — the failure that looks like success.
- v1.0.0 — 🏢 an office that can run anywhere, recall what you meant, and correct itself: five gaps, found by checking where the other open-source agent projects have actually got to (OpenClaw, Hermes Agent, thClaws, ARRA Oracle) and keeping only what this office genuinely lacked. 📦 Agents can run somewhere that isn't your desktop — a throwaway Docker container or another machine over SSH, set for the whole office or one agent; a container sees the office read-only and the working directory, and nothing else on your disk. A backend that can't be built correctly is refused, not quietly downgraded — above all when the permission-broker settings can't be placed, because a run that loses those works fine with nobody watching. 👻 Ghost clones stop overwriting each other: each gets its own
git worktreeand their work comes back as branches to review, your checkout untouched. 🔎 Recall by meaning, not only by words — ask "why did the wallpaper vanish" and a note reading "WorkerW teardown kills the embedded world" shares no meaningful token with the question and never came back; point the office at any OpenAI-shaped/embeddings(a local Ollama costs nothing and keeps your memory on the machine) and both rankings are fused. 📚 Skills that fix themselves — reflection can now correct a skill, not only write new ones, and it runs after failures, which is the strongest evidence a skill is wrong and used to be thrown away; never a built-in, never one you edited, previous version kept. 🎨 Media Studio — make a picture, change one, make it move, in one window; an edit never overwrites its input, so the next instruction refines rather than restarts. Plus the 🧰 Tools Hub rebuilt: Blender, Godot, Unity, Unreal and Roblox Studio are one click away, seven entries that pointed at packages npm has deprecated (and one that never existed) are gone, and the catalog now lives in a file fetched live — a renamed package is a PR, not a release. Everything new is off until you turn it on; an office that updates and changes nothing behaves exactly as it did. - v0.9.54 — 🍎 the Mac wallpaper stops crawling, and no PR ships blind: on macOS the world could sit at 2 fps while it was fully visible — agents crawling in slow motion, and restarting didn't help. Two independent causes, both found and fixed by @kmmao on their own hardware (#43): the occlusion monitor skipped the Dock's full-screen window by matching the localized process name against the literal
"Dock", so on any non-English system the match failed and the Dock itself counted as an app covering the whole screen on every poll — the throttle flag could never clear; and coverage was always judged on the primary display, so with two monitors a fullscreen app on one throttled a wallpaper in plain sight on the other. The Dock is now matched by bundle id, and both coverage and display-sleep are judged on the display the wallpaper is actually on. Real fullscreen occlusion still drops to 2 fps as before. Also: every pull request now gets a build signal — CI builds the shell on Windows, macOS and Linux and runs the daemon tests on Node 20 and 22, because a build on one OS type-checks nothing for the other two. - v0.9.53 — 📡 the feed goes back to glass, and reads on hover: the 📡 strip had a pale frame, a header washed out until the text behind it read better than the title, and white arcs on its bottom corners. All one cause: v0.9.52 made the office window per-pixel transparent and asked the page to do the fading, and a full WebView2 host does not carry that evenly — the feed list reached your desktop at true alpha while the 6px gutter, the title bar and everything outside the rounded corners landed on an opaque backing. No CSS fixes that, so the translucency is the window's own uniform alpha again: every pixel faded equally, the way the mode has always looked. Two corner bugs fell out of looking closely and are fixed too — Windows was cutting the window with a corner half the size the page draws (
CreateRoundRectRgntakes the ellipse, not the radius), and the feed's title bar painted square corners over the top two. New: point at the strip and it firms up to read, then fades back when you leave. The 0.9.51 freeze fixes that were not about the alpha all stay, tray → Reload chat window included. - v0.9.52 — 📡 the feed goes see-through again: 0.9.51 removed the layered-window alpha and took the feed strip's glass with it — the office window is an opaque window, so with the OS no longer dimming it the strip became a solid grey panel on your wallpaper. The window is per-pixel transparent now (like the chat head and the splash always were), so the page decides: opaque in chat and ⛶ large, ghosted over your desktop in 📡 feed — cards, avatars and text faded exactly as before, near-solid again when you hover to read. No layered-window trick coming back.
- v0.9.51 — 🪟 a window that comes back: the chat window could return from a mode switch dead — go ⛶ large, then 📡 feed, then back, and the window resized and moved correctly while the page inside never repainted again (no hover, no new messages, restart or nothing). Two things the shell did to that window are things WebView2 does not support being hosted through, and both sat in that exact path: flipping the window's resizable style on every ⛶ toggle, and dimming the feed strip with a layered-window alpha. Both are gone — the window is born resizable and the feed's see-through look is plain CSS on every platform. The freeze never reproduced on demand (~30 scripted mode switches), so that is hazard removal, not a proven cure — which is why there is now a rescue: tray → Reload chat window rebuilds the page and restores the normal window without touching the daemon, so agents mid-task keep running. Also: leaving ⛶ large now clears the size floor it set.
- v0.9.50 — 🌱 not just agents, an ecosystem: the direction the office has actually grown in is now written down — a new guide, A self-evolving, self-extending agentic AI ecosystem, plus a matching section on the website and docs site in all 14 languages: multi-agent collaboration, knowledge that compounds across projects (shared notes, per-agent memory, workflows saved as skills, a searchable archive), self-extension — an agent that finds its capabilities aren't enough for the job can propose the tool or plugin that would be, and with your approval it becomes a real part of the running office — and the human gates that keep you the CEO. Also fixed: two install-page strings that were referenced but never existed (every language fell back to English), stale English install copy that still claimed the installer compiles Rust, a horizontal scroll on phones (and on the docs page), and a test that reported a failure it had invented. No change to how the office behaves.
- v0.9.49 — 🕘 a clock that agrees with your taskbar: the clock on the office roofline could sit minutes behind the real time. It ran off an accumulated frame-delta timer and only read the system clock once every 60 seconds — stale by up to a minute even when everything was healthy, and stale for as long as the renderer was starved when it wasn't (an occluded wallpaper, a machine coming back from sleep: the frame timer stops, the wall clock doesn't). It now samples the system time every second and repaints the instant the minute rolls over. Also fixed: the stray horizontal scrollbar under 📡 OFFICE FEED — the feed renders the same markdown the chat does but never inherited the chat's wrapping rules, so one long path inside a code block dragged the whole stream sideways.
- v0.9.48 — 🤖 the office stops waiting for you: ① AUTO (keep-going) mode — the team used to stop mid-job to ask your opinion and then sit there until you came back. With AUTO on, agents decide within their remit and open their own next turn until the work is genuinely finished; it still stops for a credential it can't get or an irreversible/outward action, and a block is pushed to your channels. Bounded to 8 self-driven rounds per job. Off by default: ⚙ → TOOLS → "🤖 Keep going (AUTO)" or
bagidea auto on. ② Scheduled jobs are real orders again — a standing order would fire, the Director would answer with a plan, and nothing was dispatched: the job runner was the one path that sent the prompt without the delegation protocol and read the reply without theDELEGATE:parser, so the lines that hand work to the team were printed as prose and thrown away. Fixed, and the same missing parser is fixed on the resume-after-limit path. ③ 🛡 Registering a folder no longer means "run whatever code it ships" (#39) — a project that carries its own.claudecommand hooks now raises a Security Center card listing the literal commands and parks the work until you answer; approval is bound to that exact setup, so editing the settings file or the script a hook calls asks again.bagidea trustanswers it from the terminal. Projects with no hooks of their own are unaffected. - v0.9.47 — ↻ model lists that stay current · a floor that doesn't stall: every provider's model list is now fetched from its own
/models(20 s after boot, every 12 h, and on demand via↻ Refresh model list) — including Claude, which had no live fetch at all, so a model released today is selectable today; no existing agent's brain is ever rewritten for you. Plus 🔓 auto-approve for tool permissions (opt-in), live rows for 👻 sub-agents and meetings, delegated work carrying an end-to-end mandate, a sustained 429 failing over like a 5xx with 3 job lanes so one agent's limit doesn't freeze the floor, and one XSS-safe markdown renderer everywhere. Fixes: the silent macOS installer death (bash 3.2sourcesemantics), the team wandering into the CEO's room, and a crash on worlds with no security light. - v0.9.46 — ⛶ Large window opens fullscreen and actually resizes: the large chat window now opens fullscreen (drag any edge down to shrink it — never below the normal size). Dragging used to do nothing because the webview covers the whole frameless window and hides the OS resize handles; large mode now has invisible drag strips on every edge and corner that trigger a real OS resize. The mini/restore button hides while large is open and returns when you leave it.
- v0.9.45 — the "runs anywhere, follows you anywhere" release: ① Zero-Anthropic-account fix — a user who never logged into Claude couldn't run any agent, even on GLM/DeepSeek/Qwen: the Claude Code CLI (our runtime for every brain) hangs on its interactive first-run wizard in headless spawns; the office now seeds the onboarding flag on boot, so third-party-only users just work — Claude login is optional. ② 📦 Move to a new machine —
bagidea exportpacks your whole office (agents · skills · memory · projects · plugins) into one file;bagidea importrestores it. ③ Gemini tool-use fix — the proxy now round-tripsthought_signature, so Gemini thinking models stop 400-ing on tools. ④ ⛶ Large window mode — big, resizable (never below normal size), great for reading long threads. ⑤ Two hide levels — hide everything, or hide just the chat + button while the wallpaper lives on. ⑥ Channels follow the work — delegation/report/pitch milestones push to Telegram & friends, and preview images upload as real Telegram photos. ⑦ 🌱 Eco mode —bagidea eco oncuts idle token burn without slowing your direct orders. Plus: the 3D-Editor-won't-open bug fixed (three real causes), Claude 5 family in the model picker, and 37 missing English UI strings seeded for fresh installs. - v0.9.44 — 📂 "open folder" opens the real folder again (Windows): the 📂 button under a media file in chat was opening Documents instead of where the file actually lives. It hit any path with a space in it — which is most real media (
uploads/, a Thai filename, anything ChatGPT generated), while space-free paths worked, so it hid in plain sight.explorer.exewants/select,"C:\dir\file.ext"with the switch bare and the path quoted; we were passing the switch and path as one token, so Node quoted the lot and Explorer never saw/selectat all. Verified end-to-end on paths with spaces, commas and Thai names. - v0.9.43 — 🛟 a fallback brain so agents survive a provider outage: when a teammate's model provider goes sustainedly overloaded (GLM/Z.AI's
529under load is the usual culprit), the office can now re-run that same task on a fallback brain you picked instead of letting it die on the retry loop. Turn it on once in Settings → CONNECT → 🛟 fallback brain (any connected provider, optional model) — it's off by default, so if you don't set one nothing changes. It's the careful version of the auto-failover reverted in v0.9.40: it only fires after the overload is sustained (not a one-off blip), only routes to a provider that's actually connected, never loops back onto the down brain, and leaves bad-auth (401/403) and rate-limit (429) handling exactly as it was. The failed-over task keeps its work and still reports back to whoever delegated it. - v0.9.42 — 📚 a full docs & website overhaul: every doc surface — README, the guide set, the website in all 14 languages, and the pitch deck — got an accuracy + coverage pass (provider count corrected to 19, the real 15 builtin skill packs, the File & Media Toolkit finally documented, the CLI reference completed), plus the website's version badge now self-updates from the repo and a macOS/Linux ready-flag fix (
OS.get_temp_dir()). - v0.9.41 — 🖼️ the wallpaper stops vanishing + agents schedule timed work for real: two long-standing annoyances, fixed. The wallpaper no longer disappears (Windows). It used to vanish "for no reason" and never come back until a restart — the #1 recurring complaint. Root cause, proven with a live parent-probe and a real Explorer restart: Windows destroys and recreates the hidden
WorkerWbehind your icons on ordinary events (changing/slideshow-rotating the wallpaper, a resolution/DPI/monitor change, an Explorer or DWM restart, lock screen / RDP, exiting a fullscreen game), taking our embedded world down with it and leaving Godot a windowless zombie. The shell now runs a world supervisor: lose the desktop parent → re-embed into a fresh WorkerW; window destroyed → relaunch and re-pin — automatically, within ~2 s, no restart. It gates on parent loss (never on visibility), so Win+D and display-sleep are untouched (the regression that reverted two earlier attempts can't recur). And agents now schedule "do it later" work through the office — and it actually runs. "In an hour", "tomorrow 9am", "every 30 minutes" used to quietly never happen (the scheduling skill taught the wrong request shape, so the daemon rejected it, and agents fell back to session-bound timers that die when the session closes). The skill now teaches the realPOST /jobsschema, ships in the builtin library for everyone, and every teammate carries it — so timed and recurring work is booked in the office's own scheduler and fires for real. Plus: the executive / CEO room is reserved for the CEO and the Director — no other teammate wanders in. - v0.9.40 — 🛠️ install anywhere + always-current model lists + media that renders: the one-shot installer now works on Windows boxes without winget (Git and Node download directly; the prebuilt shell needs no build at all) — and the docs make that installer the primary path, with
npx bagideajust an optional wrapper around it. The 🧠 brain picker's model lists are always current now — one backend catalog is the single source of truth plus a ↻ refresh button, so no more staleglm-4.6long afterglm-5.2shipped. Chat previews media at any absolute path, including paths with spaces (screenshots and Thai filenames render again). Plus hardened plugin loading (a JS-broken plugin is rejected up front instead of silently half-loading), an Ollama local-model guide, and a simpler brain-overload policy — a temporarily overloaded provider is retried hard rather than auto-switched to Claude. - v0.9.1–0.9.12 — 🐧 Linux (experimental) + a lot of polish: an experimental Linux build — one-line apt installer; on X11/Xorg it attaches as the live desktop wallpaper, on Wayland it falls back to a fullscreen window pinned below. Plus accurate per-model context windows (Claude / DeepSeek V4 / Gemini 2.5 / GPT‑4.1 = 1M) with the model picker pre-selecting each provider's newest model, a Kimi Code provider, work auto-resumes after a rate-limit or a restart, attached images readable by any model (vision OCR), gender-aware agent voices, a rock-solid plugin install / uninstall (confirm + live hub↔panel sync + overwrite-or-new on reinstall) with 📌 pin for favourites, and a voice hotkey that can't wedge. A fresh office now installs empty (add plugins from the Hub).
- v0.9.0 — 🧠 More brains + safer delegation + agent-built workflows: 18 model providers built in now — added Groq, Cerebras, xAI (Grok), Mistral, Together, Fireworks (via the proxy), local Ollama / LM Studio that need no API key, and Kimi (Moonshot) direct — and the pickers fetch each provider's live model list so new models always show. Plus an opt-in verification loop (a reviewer double-checks delegated work before it reaches you), approve/reject project proposals right in the chat or feed, agents that build workflows (and a 🪄 Draft with Director button), protected built-in skills with searchable Skill/Tool pickers, a redesigned neon chat-head, and a
bagidea brainsCLI. - v0.8.0 — 🧠 Swappable Brains (the big one): run each agent on its own model. Director on Claude (the thinker), builders on cheaper models → big cost savings with zero loss of Claude Code's tools/skills/sessions (Claude Code is still the engine — only the brain behind it swaps). Talk direct to Claude/GLM/DeepSeek/Qwen/MiniMax, or reach OpenAI/Gemini/OpenRouter/NVIDIA + your own custom providers through a built-in, zero-dependency proxy (no LiteLLM/Python). Plus auto-compact + auto-new-thread for every model (long chats never clog or freeze — see below), a 🧠 BRAINS monitor, a per-message model tag + context meter, per-provider cost in STATS, a typing indicator, and cancel-a-task mid-flight.
- v0.7.8–0.7.9 — 🔀 Workflow Builder grows up: an n8n-style graph canvas (zoom/pan, branch & merge), tabs, 7 read-only examples, and you can
▶️ Run a flow or 🧠 save it as a Skill. 🧰 Tools Hub — one-click MCP servers (Browser automation, Google, Postgres, Notion…) with a plain-language guide. New windows now follow your language, plugins open one way, the chat tucks aside for new windows, and a wallpaper-stability fix (no more vanishing on Win+D). - v0.7.7 — first Workflow Builder, channels that mirror out + show “typing” + take slash commands, multi-monitor wallpaper + monitor picker. Fixes the wallpaper reports (#5/#6/#7).
- v0.7.5–0.7.6 — media shows inline in chat (images/video/audio, not file paths), manual atmosphere persists, a sponsor wall via GitHub Sponsors, smoother wallpaper (visible shadows, warmer noon).
- v0.7.0–0.7.4 — Hermes-style memory + native skills (far fewer tokens, same smarts), pop-out plugin windows, watch-agent-live, editable tasks, audio device settings.
- v0.6.x — first macOS build (beta), full 14-language UI, cost visibility, Right-Ctrl push-to-talk.
→ Full history in the CHANGELOG.
Captured live: the full office floor at golden hour — the CEO, the Director (Shino) and staff at their desks, the floating Ghost Deck (top-right), the server room glowing, the brand billboard and roofline clock, the office cat wandering. The day/night cycle follows your real local time.
It's a real wallpaper — running behind your desktop icons, with a live activity feed:
Pick the model that powers each agent. Keep your Director on Claude for the hard calls, put the builders on cheaper models, and cut your bill — without losing a single Claude Code tool, skill or session. Claude Code stays the engine; only the brain behind it swaps, and it fails open to Claude, so nothing changes until you opt an agent in.
Two ways agents reach a model:
- 🟢 Direct (Anthropic-compatible) — Claude, GLM (Z.AI), DeepSeek, Qwen (Alibaba), MiniMax, Kimi (Moonshot), and Kimi Code (the kimi.com coding plan). The CLI talks straight to them; nothing in between.
- 🔵 Via the built-in proxy (OpenAI-compatible) — OpenAI, Atlas Cloud, Gemini, OpenRouter, NVIDIA build, Groq, Cerebras, xAI (Grok), Mistral, Together AI, Fireworks, and your own custom providers. A zero-dependency proxy is baked into the daemon and translates Anthropic ↔ OpenAI on the fly — no LiteLLM, no Python (already have a LiteLLM gateway? point a custom provider at it).
- 💻 Local, no API key — Ollama and LM Studio: just run the server and Connect; the office routes to
localhost. Free, offline, private.
The model pickers fetch each provider's live model list when you connect (and when you open an agent's brain), so brand-new models show up without an app update.
| 🔌 Connect once in ⚙ CONNECT → 🧠 MODELS/PROVIDERS | ➕ Others + your own custom provider |
|---|---|
![]() |
![]() |
🆓 Try the free ones (mind the limits): NVIDIA build is free to test but rate-limited (~40 req/min) — heavy agent tasks hit 429 fast, so it's best for light/eval use. OpenRouter has free models (:free, vendor/model ids) but they're daily-capped and may queue; top up credit for serious work. Gemini has a generous free quota. (And OpenAI Tier 1's 30k tokens/min is small for heavy agent context — which is exactly why the next feature exists.)
Talk as long as you want. It never clogs, never freezes, never makes you start a new thread by hand.
Long conversations normally blow past a model's context window and break. Claude Code solves this for Claude only — BagIdea Office makes it work for every model, fully automatic and hands-free:
- 🧠 Proactive — before each turn the office measures the conversation against the model's context window. Getting full? It summarizes the thread with Claude → opens a fresh thread → keeps working, before it ever overflows.
- 🛟 Reactive — if a backend rejects a request (a rate or context limit you didn't see coming), the same recovery kicks in automatically.
- 🪄 Continuity preserved — the summary is written by Claude (big brain, huge context) and seeded into the new thread, so the agent still knows what you discussed. The UI even carries your view across to the new thread, so nothing ever looks stuck.
The result: even tiny / free-tier models run long sessions without you babysitting them.
Every agent message is tagged with the model that produced it, the thread bar
shows a live context-usage meter (e.g. gpt-4o · 40k/128k), the 🧠 BRAINS
panel monitors every provider's connect status + each agent's usage, and STATS
breaks down estimated spend per provider.
✅ Status: working product — Windows 11 (stable) · macOS 13+ (beta) · Linux (experimental 🧪). The full pipeline works end-to-end: wallpaper → daemon → real Claude Code sessions working inside real project folders → spatialized approvals → agent management UI → Telegram / Discord / LINE / Slack / WhatsApp / Messenger / Feishu-Lark channels → CLI → self-updater. All visuals and sounds ship in the repo (free / CC0 art — see Art assets), so a fresh install and
bagidea updatecarry the full look out of the box.
BagIdea Office is built in the open and kept free to run. Sponsors make that possible — thank you 🙏
The block above auto-updates from GitHub Sponsors via
.github/workflows/sponsors.yml. Off-platform sponsors live inweb/sponsors.manual.json.
| Tier | From | You get |
|---|---|---|
| 👑 Gold Partner | $3,000+/mo | Large logo on the website & in-app credits · top placement · roadmap input & early builds · shout-out in release notes |
| 🥈 Silver Partner | $300+/mo | Logo on the website · mention in release notes · early access to builds |
| 🥉 Bronze / Backer | $30+/mo | Logo or name on the supporters wall · a link to your site or socials · our heartfelt thanks |
| 💛 Supporter | any amount/mo | Your name on the supporters wall · a link to your site or socials |
Every sponsor — at any tier — gets a clickable link to their site or socials, and is shown on the website (sorted by contribution, amounts never displayed).
Sponsorship is a recurring monthly subscription handled entirely by GitHub Sponsors (think YouTube/Patreon membership) — secure payments, taxes and payouts are GitHub's job, not ours.
- Choose a tier & sponsor. Click 💖 Sponsor on GitHub (or use the button on the website), pick a monthly tier, and confirm. GitHub charges you each month until you cancel.
- Your logo & link come from your GitHub profile — automatically. Your avatar, display name, and link are pulled straight from your GitHub account; there is nothing to send us. To control the link, set the Website field in your GitHub profile (Settings → Public profile). Sponsoring as a GitHub Organization shows your company logo and site instead of a personal avatar.
- You appear within ~6 hours. As long as you choose “Make my sponsorship public” at checkout, an automated job (
.github/workflows/sponsors.yml) pulls the live sponsor list, maps each to a tier by amount, and updates both this README and the website supporters wall — sorted by tier, amounts never shown. Private sponsors are respected and simply not listed.
Everyone joins through GitHub Sponsors. The only exceptions are featured partners we add by hand (e.g. WARRIX, pinned first) in
web/sponsors.manual.json. Reuannamphung is shown there as a courtesy until they move to GitHub Sponsors. Maintainers: never hand-editweb/sponsors.json(it is generated) — editsponsors.manual.jsonfor off-platform sponsors only.
💖 Sponsor on GitHub → · or email us → to talk.
- What it does
- Architecture
- Repository structure
- Requirements
- Installation
- Art assets
- Running the full stack
- Using it
- The
bagideaCLI - HTTP API
- Event protocol (OEP)
- Performance
- User guides
- Design documents
- Roadmap
- Renders behind your desktop icons (WorkerW technique, same as Wallpaper Engine) — and stays there: a world supervisor re-embeds (or relaunches and re-pins) the world within ~2 s whenever Windows tears the desktop
WorkerWdown (wallpaper change, resolution/monitor change, Explorer/DWM restart, lock/RDP, exiting a fullscreen game), so the wallpaper no longer "vanishes for no reason". It watches for parent loss, never visibility, so Win+D and display-sleep are left alone - HD-2D look: 3D office + billboarded pixel-art sprites lit by the scene, sky-driven image-based lighting, SSR-polished reflective floors, a cinematic tilt-shift focus pass (breathing vignette, edge desaturation, anamorphic bars), film grain, native-res MSAA
- A swappable 3×3 room grid (jigsaw): every room is an identical cell, so any room fits any slot — rearrange the whole floor from the Office Editor and the furniture, agent anchors and navigation all move with it. Rooms include Executive (CEO command console), Operations (6 desks, monitors facing their seats), Lobby, Cafeteria, Server, Meeting (seats face the table), Recreation, and two Dormitories (offline agents walk to a bunk and sleep). A wandering office cat 🐱 and a self-kicking football ⚽ follow the Recreation room, and a couple of dogs 🐕 hang out in the Cafeteria — when you swap those rooms, the pets follow
- A countryside around the office: 4,200 blades of wind-swaying grass, low-poly mountains and trees, drifting cartoon clouds (a near layer actually crosses the camera frame), bird flocks, daytime pollen motes and fireflies at night
- Ambient life & rare events: idle agents nap in a bunk or watch the rec-room TV, a football gets self-kicked around, birds wheel overhead — and once in a while a server-room incident 💥🔥 breaks out and the nearest agent rushes over to put it out (a rare comedic emergency, not a real failure)
- Agents walk between zones on an A* waypoint graph with 4-direction animated spritesheets; facing follows movement
- Real-time day/night cycle — sun, sky color, ambient and reflections follow your machine's clock (sunset ~17:00, night by 18:00); manual override from the overlay (🌗) for golden-hour screenshots
- A roofline digital clock with a phase icon (sun ☀ / low sun 🌇 / crescent moon 🌙) next to the brand billboard
- MMO-style nameplates on a crisp 2D HUD: portrait, name, role/status, live state pill (IDLE/WORKING/MEETING/BLOCKED/OFFLINE), distance-scaled — with rank dressing: the CEO's plate is gold with a pixel crown, the Director's is bright blue with a lead star
- Event FX: pixel-art flipbooks pop above characters — ✅ on task done, ❌ on failure, ❗ at Security, 👍/👎 on decisions, 🎵 when speaking, golden burst on a new skill, sci-fi warps on hire/fire
- Equippable auras: an elemental magic ring (fire/ice/nature/arcane/shadow/gold) under any character, picked in the agent editor — the CEO can wear one too
- The Ghost Deck: a floating glass platform (12 desks, movable from the Office Editor) reached by a glass staircase — when an agent splits into sub-agents, translucent ghost clones materialize, hurry up the stairs, work at a desk with live status plates, then glide home and dissolve back into their owner. Targets resolve to the deck's live position, so ghosts re-seat instantly even mid-task when you move the deck or swap rooms
- The idle Director makes rounds through the office instead of standing still; the CEO paces the executive floor (that's you)
- Mission Control board in-world: one card per running task, colored by state; lobby status totem shows daemon connectivity (truth, not decoration)
- Branded boot: a transparent floating logo splash + a pulsing circular logo card — never a black box
- Plugins: a real extension host — a plugin folder adds UI panels, server routes, and commands agents can drive, with
ctxaccess to the office (registry, feed, broadcast,runClaude, private storage). Ships with the 🎵 Music Player built in (locked, pinned to the top of the list); the 🧮 Calculator and more are installable from the 🧩 Hub or any GitHub repo (bagidea plugin install <url>). Start from the official template (a Hello-World plugin + aCLAUDE.mdso an agent can build one), or read the worked examples — the calculator and music-player repos. Full spec: the guide - 🎨 Office Editor: rearrange the room grid (click two rooms to swap), place furniture / walls / decor on a top-down grid, and import your own models (.glb/.gltf/.fbx) and images — spawned on top of the world, atmosphere intact
- Agent skill library: every office ships with 15 builtin capability packs you can assign from the editor — deep-research, web-automation, office-control, office-ops, plugin-builder, code-review, doc-writer, debug-detective, data-wrangler, project-kickoff, diagram-maker, archive-search, build-workflow, file-media-toolkit, and schedule-via-office-job — plus Hermes-style auto-learned skills that grow at runtime. Four of them (file-media-toolkit, archive-search, doc-writer, schedule-via-office-job) are carried by every agent by default. Skills are delivered natively & on demand (Claude Code progressive disclosure) so a skill's instructions load only when it's actually relevant, never bloating every prompt
- 📄 File & Media Toolkit (built into every agent): the office can actually work with your files, not just talk about them. Any agent can read and convert PDFs, turn Excel / Word / PowerPoint into data or the other way around (via LibreOffice), author documents and slide decks (via
pandoc), transcribe a YouTube link or a local video (viayt-dlp+ffmpeg), edit and convert images (ImageMagick), and slice JSON (jq) — so "summarize this PDF", "make a deck from these notes", or "get me the transcript of that video" are one message, no setup. It degrades gracefully: whichever helper binaries are present are used, and the agent tells you if one is missing - 🌐 Multi-language UI — 14 languages: English default + ไทย/中文/Español/हिन्दी/العربية/Português/Русский/日本語/Deutsch/Français/한국어/Indonesia/Tiếng Việt. Now ships fully pre-translated — switching is instant and works even without a Gemini key; picker in settings (office-wide, per-machine default)
- 🌍 Official website in
web/— landing page + browsable docs, deployable to any static host
- Voice in / out: hold-to-record in the webview → OpenAI Whisper / Gemini transcription (no Windows dictation panel); Right Ctrl speaks a command straight to the CEO; agents can be given Gemini TTS voices — 16 presets split clearly ♀ / ♂ (8 each), each its own emotion/style, per-agent, gimmick
SPEAK:announcements; 📞 realtime voice chat (the main agent only) bridges your mic to Gemini Live in the main agent's assigned voice (or a sensible default), with the office's own knowledge in context - Channels: connect Telegram · Discord · LINE · Slack · WhatsApp · Messenger · Feishu / Lark — messages enter the CEO flow, the Director answers back on the same channel
- Hermes-style memory (token-lean, relevance-retrieved): shared
workspace/OFFICE.md(owner) + per-agentworkspace/memory/<id>.md+ per-projectworkspace/projects/<id>/MEMORY.md, distilled automatically after real work. A pure on-device keyword index (BM25, zero deps, works in Thai too) injects only the memories relevant to the task at hand — not a blind dump — with full recall on demand viaGET /recall+ thearchive-searchskill - Main API keys + feature gates:
OPENAI_API_KEY/GEMINI_API_KEYare first-class — voice/TTS/image/realtime grey out with guidance until set; an extra-key vault feeds agents' own env - Attachments & media: paperclip / drag-drop upload; chat renders images, video, audio inline (click any image to view it full-size); every message is timestamped; agents produce images via the
/gen/imagesystem tool and they appear automatically - Social office: idle agents spread evenly across the cafe and rec room (with the occasional stroll to the server/meeting rooms and the odd bunk nap), and drift together — sometimes in groups of 3–4 — for banter or real AI-to-AI chats that now lean toward brainstorming ideas worth pitching. A good conversation crystallizes into a project proposal to the CEO (more often than before) — and agents now think bigger, pitching real websites, apps and programs rather than only small plugins, and can research with tools during meetings to back an idea up. Pitches are steered toward standalone projects or office plugins (never editing the core program); you approve or reject each one with an optional note to the team, and approved work scaffolds into a default
projects/folder. Proposal frequency is rate-limited and configurable (⚙ → AGENTS → PROPOSALS) so pitches never flood the queue - 🎨 Media Studio (⋯ → Media Studio): make a picture, change one, then make it move — in one window, because the work is iterative. An edit never overwrites its input, so the next instruction refines the last rather than starting over. Agents can make and change pictures (
/gen/image,/gen/image/edit); only you can make video, because a clip costs about $2 and the button says the price next to it - Ambient life: agents with a voice occasionally toss out a short spoken mood line ("feeling productive today 💪") as a flavour beat — speech bubbles for everyone, real TTS for the voiced
- 🗣 16 agent voices (♀8 · ♂8): assign one per agent; the ▶ preview introduces itself by the right gender and the office language (no more everyone saying a female hello). Voiced agents speak short lines on their own; long read-aloud only when you ask
- 📞 Calls: the main agent only is callable (realtime Gemini Live voice) — it speaks in the voice you assigned it, or a sensible default preset
- 📊 Dashboard (OFFICE OPS → STATS): runs / cost / 7-day chart / busiest agents / uptime / channels / key status
bagideaCLI:start/stop/restart,startup on|off,ask/chat,status,stats,agents,projects,proposals+proposal approve|reject <id> [note],plugins+plugin install|remove,lang,say/voices/image,channels,keys,update,version, and more (bagidea --help)- Living chat head: a drifting gradient ring that spins amber while agents work
- WebSocket event hub — the Godot world and the overlay UI subscribe to one stream
- Event journal (
journal.jsonl) with replay on connect: restart anything, state comes back — auto-trimmed on boot (and stale chat threads pruned) so nothing grows unbounded on a long-running office - Agent registry (
registry.json): persistent staff — name, job title, avatar, aura, system prompt, skills, tools.main(the Director — Shino by default: your playful-but-focused second-in-command, tuned for delegation over hands-on work) andceo(you) are protected and cannot be deleted. A fresh install starts with just these two - Claude Code adapter:
POST /chatspawns a real headlessclaude -psession with the agent's persona, assigned skills and allowed tools; stream-json output becomes world events - Chat threads: every conversation is a named, resumable session (
--resume) with its own recorded history; agents keep continuous memory by default - Skills library with Hermes-style auto-learning: after a completed multi-tool task, a reflection pass decides whether the work distills into a reusable skill — if so it's saved, auto-assigned, and announced in the office. Since v1.0.0 the same reflection can also correct a skill it already wrote, and it runs after failures too — the strongest evidence a skill is wrong, and previously the one case that was thrown away. It never touches a built-in and never touches one you edited by hand, and the previous version is kept (
POST /registry/skill/revert) - Tools: per-agent allowlist over the built-in Claude Code tools, plus custom capability via MCP servers (name + launch command → injected with
--mcp-config). Ships with a ready-to-use 🔌 web server (Playwright MCP) — tick it on an agent and it can browse, click, type, submit forms and screenshot real pages (isolated profile, not logged in). See docs/guide/web-automation.md. The 🧰 Tools Hub (⋯ menu) is a browsable catalog of 43 entries — 15 built-in abilities and 28 MCP servers added with one click, including Blender, Godot, Unity, Unreal and Roblox Studio. The catalog is a file the office fetches live (web/tools.json), so a renamed package is a PR rather than a release. See docs/guide/tools-hub.md - CEO chain of command: ordering the CEO summons the Director — he walks over, takes the order, replies with a plan, and dispatches work to teammates via
DELEGATE:lines (each spawns a real session, with the hand-over walk acted out). Delegation is a round trip: every delegate's result is reported back to the Director, who can answer questions / follow up with moreDELEGATE:lines (bounded depth, serialized turns), and finally walks the CEO-readable summary over to the boss (ceo.report) - Agent discussions: pick 2–4 agents and a topic — they hold a real meeting, round-robin turns over a shared transcript, minutes on the in-world whiteboard
- Self-splitting sub-agents: every session is told it may end a reply with
SUB: <job>lines (2–4) when the request parallelizes — the daemon strips the protocol, spawns parallel clone sessions with the parent's persona + tools, records each in a labeled 👻 session, and resumes the parent for a final synthesis once all ghosts report back (a stuck ghost is reaped after 6 min, so synthesis always happens). 👻 GHOST ISOLATION (opt-in) gives each ghost its owngit worktreeon a project that is a git repo — two ghosts editing one file both succeed, their work comes back asoffice/ghost-<id>branches for you to review, a ghost that changed nothing leaves nothing behind, and your working copy is never touched - 📦 Run location (
POST /registry/backend): an agent's work does not have to happen on your desktop. Point the whole office — or one agent — at a throwaway Docker container or another machine over SSH. A container gets exactly two mounts, the office root at/officeread-only and the working directory at/work; API keys are passed by name, so values travel in Docker's own environment and never appear in a process listing. A backend that cannot be built correctly is refused, not quietly downgraded — above all when the--settingsfile that installs the permission broker cannot be placed, because a run that loses it works fine with nobody watching - 🔎 Semantic recall (
POST /registry/semantic, opt-in): the memory index matches words (BM25, no dependencies, offline) and has one blind spot — ask "why did the wallpaper vanish" and a note reading "WorkerW teardown kills the embedded world" shares no meaningful token with the question and never comes back. Point the office at any OpenAI-shaped/embeddingsendpoint (a local Ollama costs nothing and keeps your memory on the machine) and every memory also gets a vector; both rankings are then fused, so words and meaning each get a say. Saving tests the endpoint and reports the vector size, because an embeddings endpoint that only fails later fails silently - Standing work orders:
POST /jobs— run now, at a datetime (optionally daily), or every N minutes; per-agent queue + a global concurrency cap keep the machine comfortable; each job keeps its own resumable thread. A fired job is treated as a real order, not a reminder: the assignee is told to do the work in that turn, and a job on the Director carries the full delegation protocol so he dispatches to the team and their results report back to him - 🤖 AUTO — keep going without you (opt-in, ⚙ → TOOLS or
bagidea auto on): an agent that hits a fork decides within its remit and opens its own next turn instead of parking the job on a question. Up to 8 self-driven rounds, each announced in chat; it still stops dead for a credential it can't get or an irreversible/outward action, and that block is pushed to your channels. It removes the wait for an opinion — what an agent may do is still the separate 🔓 auto-approve switch - Shared note board: notes live in the UI and in
workspace/notes.md— agents read it and append bullets themselves (file-watched both ways) - Calendar with a personal touch: appointments remind you via the Director — he physically walks over and tells you (
reminderevent), N minutes ahead - Director heartbeat: every 15/30/60 minutes (configurable) he reviews the calendar, standing jobs and the note board — and pings you ONLY when something deserves it ("OK" stays silent)
- Claude Code hooks integration: any Claude Code session in this project reports its tool calls — your real work animates the Director automatically
- Permission broker: tools you granted in an agent's profile run silently; anything else is held until you approve — with a ✓✓ forever option that remembers the grant
- 📥 Approvals inbox (v1.1): one queue for everything that waits on a person — tool permissions, project trust, proposals, an AUTO agent's
STATUS: BLOCKED, jobs created switched off, and anything a plugin asks viaPOST /approvals— decided in the sidebar, the chat, the terminal or from your phone (Telegram buttons;1 yes/2 no noteon any channel). Answering a blocked agent resumes its work with your answer - 🧪 Skill regression (v1.6): test cases per skill; the office refuses its own correction when a case breaks — self-improvement that cannot quietly get worse
- 📦 Eight official plugins (v1.5–1.6): Campaign Board · Content Pipeline · GitHub Triage · Inbox Agent · Weekly Report · Client Folders · Decision Log · Skill Regression — real uses of the engine, one click away, every outward step behind an approval
- 👥 Team templates (v1.5): a whole team — personas, skills, voices — in one click;
bagidea hire --team dev-shop - 📦 Export / Import BAGIDEA OFFICE (v1.7): move an office's reusable configuration to another installation as one ZIP — agents, skills, MCP tools, workflows + triggers, portable settings and Markdown — choosing whole categories or individual items; the import previews first (destinations, conflicts, protected items) and applies transactionally with rollback. Credentials, sessions, history and project files never travel; imported triggers arrive disabled. ⚙ → AGENTS → 📦 EXPORT / IMPORT. (
bagidea exportis the other thing: a full machine backup, keys included.) Contributed by @f2dac in #61 - 🧠 Local models that don't fall over (v1.8): LM Studio runs are queued past a concurrency cap (default 4 — a local model has a fixed number of KV-cache slots, and over-fanning made every run die with
failed to decode); a queued thread says so and starts by itself, ⏹ works while it waits. Proxy, client and watchdog timeouts share one local cap; a reasoning-only or empty reply doesn't stall the turn.POST /chattakestextOnlyandmaxOutputTokensper run; task details are capped at 4,000 characters. Contributed by @f2dac in #63 - 🛠 Dev Mode (v1.7): see inside a run. Switch it on in ⚙ → TOOLS and every tool row in the chat opens to a redacted, capped summary of what the tool was called with (secrets masked, raw input never written to disk), plus bounded debug panels — event stream, tool calls, agent messages, performance — with clear and export. Summaries are kept per thread, so a history row still shows its detail after a reload or restart. Contributed by @f2dac in #60 / #62
- 📋 A task board and a real calendar (v1.4): todo / doing / waiting / done · due dates through your rules · dependencies that release themselves · repeat · every delegation, job, action item and workflow run is a card · agents move their own · calendar recurrence, all-day, .ics export/import
- 🧑💻 Codex as a system tool (v1.4):
POST /codex/exec,DELEGATE: codex @ project :: task, a workflow node,bagidea codex— sandboxed inside registered projects, diff summarised, cost estimated on the caller;codex exec reviewas a second opinion - 🧩 Plugin hooks (v1.4):
onEvent,ctx.notify,ctx.approvals.ask,ctx.tasks/ctx.calendar,ctx.schedule, a plugin's own trigger kind and workflow node, and a per-agent memory provider - 🔀 A workflow engine (v1.3): the Builder's graph is executed — per node, in parallel where the arrows allow, joins wait, a decision opens one branch,
{{templating}}carries data — with a persisted run record that survives a restart. Node types: trigger · action (a real agent turn) · fetch · decision · approval (waits in the inbox) · notify · delay · output. ⚡ Triggers start a workflow without you: schedule, webhook (POST /hook/<token>, HMAC-verified), office event, file in a folder, channel keyword - 💸 Budgets in money (v1.2): caps per day (office, agent) and per project (lifetime) over the spend the office already records — Claude's real bill, estimates labelled ≈ for swapped-in brains and tools; one warning at 80 %, new turns refused at 100 % (running ones finish), attributed per agent and project; a 🌅 morning digest. ⚙ → 💸 BUDGET /
bagidea budget - 🔔 Notifications with rules (v1.1): one
notify()behind every "tell the owner" — per kind, route to the sidebar's 🔔 list, an in-app toast, your channels, and a sound; always, outside quiet hours, or only when you're away from the keyboard. ⚙ → 🔔 NOTIFY - 📁 Projects: register real folders as projects (with PLACE shorthands like
"classroom" → D:\Learning); the Director creates new ones himself via aPROJECT:protocol line and routes work withDELEGATE: <agent> @ <project> :: <job>— the assignee's claude session lives inside that directory and is resumable by you. One window per project: ▶ opens (or surfaces) the window. One occupant at a time — while an agent works the project you can't open it (the row shows a ⏹ stop agent button with a two-click confirm to take over), and while you have it open an agent won't be dispatched into it. Removing/deleting a project also closes its window; disk-deletes sweep leftover dev servers first - 📨 Channels (7): Telegram (long-poll), Discord (native gateway), LINE, Slack (Events API), WhatsApp (Meta Cloud API), Messenger (Meta Graph) and Feishu / Lark (飞书 — event subscription, encrypted events supported) feed straight into the Director — order your office from your phone, the reply comes back on the same channel
- 🔑 API key vault: store
OPENAI_API_KEY& friends once; they're injected into every agent run's environment, and agents are told which names exist - ♻️ Self-healing daemon: a watchdog respawns the daemon if it ever dies, and
bagidea restartis more resilient — the office stays up on its own - 🔄 Self-updating (version-gated): a
VERSIONfile marks releases. The daemon compares the localVERSIONwith the one onmainand only raises the in-app banner on a real version bump — routine commits and dev-branch work never nag users. The banner (orbagidea update) pulls, rebuilds what changed, and relaunches.bagidea versionshows the current build and whether an update is out (release flow:RELEASING.md) - 🪟 Start at login: launch the office on boot — toggle it from the tray, settings (⚙ → AGENTS), or
bagidea startup on|off. Wired on all three OSes: a HKCU Run key (Windows), a LaunchAgent (macOS), and an XDG~/.config/autostartentry (Linux)
When an agent needs a tool you have not granted:
- Its character physically walks to the Security Center and waits (amber light pulses, ❗ flashes over its head)
- The overlay's Security Center pops open with the exact command — and in 📡 feed mode the request appears as an actionable card right in the stream
- You click Allow / ✓✓ Forever / Deny — deny (or 50s timeout) makes the agent visibly re-plan; forever adds the tool to that agent's grants so it never asks again
- Approve, and the tool actually executes
Tools already granted in the agent's profile (or "✓✓ forever" rules) are approved instantly and logged — and the agent doesn't even leave its desk: it waits a short grace to confirm a trip is actually needed, so granted tools never make it twitch toward Security. This is real: the PreToolUse hook long-polls the daemon until you decide.
🛡 A project's own hooks are a separate yes. A folder can carry its own
.claude/settings.json, and that file is executable configuration: a SessionStart
command hook runs the instant a session opens there — before the model acts, so the
permission broker above never sees it. Registering a folder therefore is not consent
to run the code it ships. A project with no hooks of its own is trusted silently as
before; one that ships hooks raises a card in the Security Center listing the literal
commands and parks the work until you answer — approve and the task resumes by
itself. Approval is bound to that exact setup (the hook commands and the contents of
the scripts they call), so editing either asks again, and a hook resolving outside the
project is flagged. Answer it from the terminal with bagidea trust.
Served by the daemon at http://127.0.0.1:8787/ — best experienced through the included native Rust shell:
- Agent rail: every staff member with live state dots — 👑 the CEO leads in gold (that seat is you), ⭐ the Director in blue; double-click any seat for an ID card
- ⚙ Office Settings: hire/edit/delete agents (12-face avatar picker, aura picker, job titles), a ✨ prompt copilot (type a one-line brief in any language → a drafted system prompt), skills library with the auto-learn toggle, built-in tool catalog + MCP servers, and a thread manager
- 🗺 Live map: a real orthographic floorplan render with live agent icons (face, state ring, name) — click one to chat with it
- 🧵 Threads: per-conversation chat panes — switching threads or agents loads that conversation's history; a thread bar shows where you are; meetings (🗣 with participant faces) and sub-agent jobs (👻 with the owner's face + ✓/✗/⏳ status) are readable forever, streaming live while they run
- 🗣 Discussions: launch agent-to-agent meetings
- 🗂 OFFICE OPS: projects (create / register / open / stop-agent-to-take-over / hide / delete, with an in-house Blender-style folder picker), standing tasks, calendar, the shared note board, and the org chart by tier
- 🔵 NOW WORKING strip: one calm line under the header — "working on N tasks · latest…" — expandable into the full live task list; visible in feed mode too
- 🔗 CONNECT tab: API key vault (masked) + Telegram / Discord / LINE / Slack / WhatsApp / Messenger / Feishu-Lark channel setup with live status dots
- 📡 Feed mode: right-click the chat head — the panel becomes a translucent right-edge activity stream (scrollback, hover-to-focus, 🧹 clear, actionable permission cards); the wallpaper stays clean for streaming/recording
- 🎤 Push-to-talk: hold Right Ctrl anywhere in Windows, speak (Windows Voice Typing — Thai works), release; a pulsing live pill shows what was heard; feed mode auto-sends to the Director (the Right Ctrl global hotkey is Windows-only for now — on macOS/Linux use the in-overlay mic button)
- 🌗 Atmosphere picker, slide-over 🛡 Security/Mission/Office-Log sidebar (edge handle pulses when an approval is waiting; pops open on arrival)
- 🔄 Update banner when a new version lands on GitHub — one click updates and relaunches
- Circular chat head (Messenger-style, never steals focus) + system tray (Start with Windows, Hide office, Exit)
┌─ Overlay (Rust shell / browser) ────────────┐ ┌─ Godot 4 Wallpaper ────────────┐
│ chat·threads · settings · map · approvals │ │ swappable 3×3 grid·countryside│
│ ▲ WebSocket /ws │ │ agents walk (A*) · FX · clock │
└────────────┼────────────────────────────────┘ │ ▲ WebSocket /ws ▼ /pos │
│ └────────┼────────────────────────┘
┌────────────┴─────────────────────────────────────────────┴───────────────────────┐
│ DAEMON (Node.js, zero-dep) http://127.0.0.1:8787 │
│ • broadcast + journal.jsonl (replay on connect) + registry.json + sessions.json │
│ • POST /chat → headless `claude -p` (persona+skills+tools, --resume threads) │
│ • POST /event ← Claude Code hooks (your own sessions feed the world) │
│ • POST /perm/request ←(long-poll)─ PreToolUse hook POST /perm/respond ← UI │
│ • /registry/* CRUD · /sessions/* · /discuss · /assist/prompt · /map/bg │
└───────────────────────────────────────────────────────────────────────────────────┘
Three independent processes: the daemon keeps agents running even if rendering dies; the renderer can crash/restart and rebuild from the journal + registry; the overlay is just a web client. Truth lives in the daemon; the world is a renderer of truth.
├── README.md ← you are here
├── docs/ ← full V1 product-design spec (10 documents)
├── daemon/ ← Layer 0 (Node.js, no npm install needed)
│ ├── server.js … WS hub + journal + registry + adapter + perms
│ ├── constants.js … shared office constants (skills, tools, agents)
│ ├── tests/ … automated API tests (node --test)
│ ├── overlay.html … Layer-2 web overlay (served at /)
│ ├── hook.ps1 / perm.ps1 … Claude Code hook forwarders
│ ├── send.js … test event CLI
│ ├── registry.json … your staff (generated at first run, gitignored)
│ └── sessions.json … chat threads + history (generated, gitignored)
├── godot/ ← Layer 1 (Godot 4.6 project)
│ ├── scenes/office_floor.tscn … main scene (env: sky IBL, SSR, cinema pass)
│ ├── scripts/grid_world.gd … the swappable 3×3 room grid (rooms/furniture/A*/swap)
│ ├── scripts/world_builder.gd … shares the grid + sky/countryside/clock/billboard/Ghost Deck
│ ├── scripts/agent_manager.gd … events → characters choreography + FX + camera focus
│ ├── scripts/agent_sprite.gd … spritesheet characters, auras, identity, seating facing
│ ├── scripts/map_editor.gd … the 3D Office Editor (room swap + furniture/import)
│ ├── scripts/camera_rig.gd … cinematic drift + interest-shot focus
│ ├── scripts/hud.gd … nameplates (rank dressing), HUD FX, whiteboard
│ ├── scripts/fx_factory.gd / aura_factory.gd … pixel-FX flipbooks + elemental auras
│ ├── scripts/cat_sprite.gd / dog_sprite.gd / bird_sprite.gd / rec_ball.gd … ambient life
│ ├── scripts/office_floor.gd … day cycle, boot, wallpaper/editor/screenshot modes
│ ├── scripts/event_client.gd / layout_loader.gd … WS client + Office Editor layout
│ ├── shaders/ … cinema focus, grass wind, god rays, grain…
│ └── assets/BinbunVFX_Vol2/ … Elemental Magic FX (CC0 — bundled)
├── shell/ ← THE program (Rust, wry + tao): one exe runs it all
├── cli/bagidea.js ← the `bagidea` command (talks to the daemon)
├── plugins/ ← the built-in 🎵 music plugin ships here; Hub/CLI installs land here
├── installer/ ← install.ps1 (clone+build) · update.ps1 · build-release.ps1
├── web/ ← official website (landing + browsable docs, static host)
├── tools/wallpaper.ps1 ← manual attach/detach (the shell does this natively)
├── workspace/ ← cwd for adapter-spawned Claude sessions
│ └── .claude/settings.json … PreToolUse permission hook wiring
└── .claude/settings.json ← hooks: your Claude Code sessions → the office
| Component | Requirement |
|---|---|
| OS | Windows 11 · macOS 13+ (beta) · Linux (experimental) — wallpaper backend: WorkerW / DYLD shim / X11 EWMH (Wayland → fullscreen-below) |
| Renderer | Godot 4.6+ (standard build) |
| Daemon | Node.js 18+ (no npm packages needed) |
| Agent | Claude Code CLI (claude --version ≥ 2.x) |
| Shell | Rust toolchain (cargo) — or use a browser for the overlay |
| GPU | Anything Vulkan-capable; verified on GTX 1060 6GB |
This is the most reliable path: one line, and it sets everything up. On a
bare machine it installs Git, Node LTS, Godot 4.6.3 and the Claude Code CLI and
downloads a prebuilt app — so a normal install needs no Visual Studio C++
Build Tools and no Rust (those are only fetched as a source-build fallback if no
prebuilt matches). It then clones the app to %LOCALAPPDATA%\BagIdeaOffice
(Windows) or ~/BagIdeaOffice (macOS/Linux), brands the window icon, wires the
bagidea command into your PATH and creates a Start Menu shortcut or Bin link.
Freshly installed tools are pulled onto the current PATH so it finishes in one
pass. Safe to re-run (it does a git pull and keeps your data). No winget? It
still works — Git and Node are downloaded directly.
Windows:
irm https://raw.githubusercontent.com/bagidea/bagidea-office/main/installer/install.ps1 | iexmacOS:
curl -fsSL https://raw.githubusercontent.com/bagidea/bagidea-office/main/installer/install-mac.sh | bashLinux (Ubuntu/Debian — 🧪 experimental):
curl -fsSL https://raw.githubusercontent.com/bagidea/bagidea-office/main/installer/install-linux.sh | bash🧪 Linux is experimental — please help us harden it! On X11/Xorg the office renders as the live desktop wallpaper; on Wayland it falls back to a fullscreen window pinned below. If the build or wallpaper doesn't work on your distro/DE, please open an issue with your distro, desktop, and
echo $XDG_SESSION_TYPE.
First time only: open a new terminal, run
claudeonce to log in to Claude, thenbagidea start. Safe to re-run — a re-run does agit pulland your data is kept. Install didn't finish? See troubleshooting → install (covers winget, the C++ Build Tools / linker error, PATH, SmartScreen).
Already have Node? npx bagidea is just a thin wrapper that
runs the same one-shot installer above for your platform — you don't need to
run both, it's simply another way to kick off the same install. Published on npm as
bagidea (and the longer
bagidea-office — both work).
npx bagideaEither way you'll still need Claude Code.
- Download Godot 4.6.x macOS (universal) and unzip
Godot.apptogodot/bin-mac/Godot.app. - Run the build script to compile the shell, shim, and wire hooks:
./build-mac.sh- Add the
bagideacommand to your PATH:
export PATH="$(pwd)/bin:$PATH"- Run it:
shell/target/release/bagidea-office-shell
git clone https://github.com/bagidea/bagidea-office.git
cd bagidea-office1. Fix absolute paths (one-time): the hook configs reference absolute paths. Update these to your clone location:
.claude/settings.json— 3× path todaemon\hook.ps1workspace/.claude/settings.json— 1× path todaemon\perm.ps1
2. Build the shell:
cd shell
cargo build --release # → shell/target/release/bagidea-office-shell.exeAll the visuals and sounds ship in the repo — a fresh install and every
bagidea update carry the full look and feel out of the box. No separate
downloads, no Godot import step: everything loads at runtime (and still falls
back to a procedural placeholder for anything ever missing). The packs are free /
CC0, made possible by these creators — thank you 🙏:
- Auras — Elemental Magic FX by Binbun3D (CC0)
- Characters — Customizable Characters Top-Down 32x32 by Schwarnhild
- The office cat — Cat 2D Pixel Art by xzany
- Environment (sci-fi kit) — Molten Maps SciFi Asset Pack
- Countryside — a free low-poly environment pack (FBX)
- Event FX — Super Pixel Effects Gigapack (Free) by untiedgames
- Pets & ambience — free dog, sound and household packs bundled under
godot/assets/
One exe runs everything:
.\shell\target\release\bagidea-office-shell.exeThe shell spawns the daemon, launches the Godot office (hidden behind a pulsing
logo splash until the first frame renders), embeds it behind your desktop icons,
then brings in the chat head and the tray icon. A second launch exits instantly
(single-instance mutex). Set BAGIDEA_GODOT if your Godot binary lives somewhere
other than E:\Tools\Godot\Godot_v4.6.3-stable_win64.exe.
- Chat head: circular, draggable, never steals focus; click = show/hide the overlay
- System tray: left-click toggles the chat; menu has Start with Windows and Exit BagIdea Office — the only true exit (tears the stack down and restores your wallpaper)
Manual/dev mode still works:
node daemon\server.js
# windowed: open the Godot project normally
# screenshot: godot --path godot -- --shot --hour=13 --cloudtest⚙ → AGENTS → Hire a new agent: pick one of 12 faces, an aura, a job title,
then either write the system prompt yourself or type a one-line brief
(any language) and hit ✨ Draft — a real Claude call writes the persona.
Assign skills (pick from the 15 builtin capability packs or your own) and
tools with chips. Everything is editable later; deleting an agent warps them out
of the office. main and ceo are protected. The office caps at 18 staff
(the CEO isn't counted) — sub-agent 👻 ghosts cover parallel load beyond that.
Click a face in the rail (or on the 🗺 map) and type. Each agent keeps continuous memory; use 🧵 to start a fresh thread or jump back into an old one — the pane shows that conversation's history. Threads are managed (and deletable) under ⚙ → THREADS.
Type into the CEO seat (the gold one — that's you): the Director walks over, takes your order, answers with a plan, and delegates real work to the team — watch the hand-offs happen on the wallpaper.
🗣 → pick 2–4 agents + a topic + rounds: they gather in the meeting room and discuss over a shared transcript; minutes land on the in-world whiteboard.
Any Claude Code session inside this project reports its prompts and tool calls through hooks — the Director works at his desk in real time while you work.
When a session needs a tool you haven't granted, its character walks to Security and the overlay pops the exact command with Allow / ✓✓ Forever / Deny. Granted tools run silently.
🗂 → PROJECTS: define a PLACE once ("classroom" → D:\Learning), then just tell
the Director: "create a project called Calculator in classroom, and have Flamingo
build a calculator web app in it" —
the project folder is created, registered, and the assignee works inside it
with a real resumable session. The row lights up with who's working; ▶ opens
the project window. One occupant at a time: while an agent works it you
can't open it (a ⏹ stop-agent button with a two-click confirm lets you take
over), and while you have it open an agent won't enter. ✕ unregisters (and
closes the window); 🗑 really deletes (created-by-app folders only, leftover dev
servers are swept first).
⚙ → 🔗 CONNECT: paste a Telegram bot token (60 seconds with @BotFather) and your office answers you anywhere. Discord and LINE work too — setup guide.
Hold Right Ctrl, talk, release. In normal mode the words land in the input box for you to review; in 📡 feed mode they're sent to the Director automatically. (Right Ctrl is Windows-only for now — on macOS/Linux use the in-overlay mic button.)
node daemon\send.js task.started rin
node daemon\send.js perm.requested rin
node daemon\send.js task.completed rin
node daemon\send.js agent.offline rinThe installer puts bagidea on your PATH (manual installs: the repo root has
bagidea.cmd). It talks to the running office — and can start it.
bagidea start | stop | restart launch / stop / restart the whole suite
bagidea status health + agents + projects + who's working
bagidea doctor why won't it load? port · proxy · firewall · policy
bagidea inbox what's waiting for you + what's unread
bagidea approve | deny | answer decide an inbox item (also from your phone)
bagidea budget [set …] today's spend vs caps · set office/agent/project caps · digest
bagidea stats dashboard: runs / cost / busiest / uptime
bagidea ask "<message>" ask the Director and WAIT for the final answer
bagidea chat <agent> "<msg>" fire-and-forget to a specific agent
bagidea agents | projects list staff / projects with live status
bagidea brains per-agent model/provider + context status
bagidea jobs list scheduled / recurring jobs
bagidea editor open the 3D Office Editor
bagidea open "<project>" open a project window (same as ▶)
bagidea proposals team project pitches awaiting a verdict
bagidea proposal show <id> read a pitch in full
bagidea proposal approve|reject <id> [note] decide (+ optional note to the team)
bagidea plugins list installed plugins
bagidea plugin install <git-url> add a plugin · plugin remove <id>
bagidea lang [code] show / set the office language (14 languages)
bagidea say "<text>" | voices speak via TTS / list voice presets
bagidea image "<prompt>" generate an image into the office
bagidea channels | keys channel + API-key status
bagidea key set <NAME> <value> store an API key in the vault (env-injected)
bagidea feed live office event stream in your terminal
bagidea auto [on|off] 🤖 keep-going mode — decide and finish, don't wait
bagidea trust [allow|deny] "<p>" 🛡 projects whose own hooks await your word
bagidea eco [on|off] 🌱 eco mode — cut idle token burn
bagidea export [file] | import <file> move your whole office to another machine
bagidea startup [on|off] launch the office with Windows (show/set)
bagidea update update to the latest version + relaunch
bagidea version current build + whether an update is out
bagidea uninstall [--keep-data] remove the app (PATH, shortcut, autostart, files)
bagidea --help | --version full command list / current build
Full reference: docs/guide/cli.md.
| Endpoint | Purpose |
|---|---|
POST /chat {agent, prompt, session?} |
run a real session (session:"new" forks a thread) |
GET /sessions?agent= · GET /sessions/log?agent=&key= · POST /sessions/delete |
threads |
GET /registry · POST /registry/agent · POST /registry/agent/delete |
staff CRUD |
POST /registry/role · /registry/skill · /registry/mcp · /registry/autoskills |
libraries |
POST /assist/prompt {name, role, brief} |
✨ persona copilot (fills every field + picks fitting skills/tools) |
GET/POST /jobs · POST /jobs/update |
standing work orders (now / at / every) |
GET/POST /notes |
shared note board (mirrors workspace/notes.md) |
GET/POST /calendar |
appointments + Director reminders |
POST /registry/heartbeat {min} · /registry/sound |
Director heartbeat · sound toggle |
POST /registry/autopilot {enabled} |
🤖 AUTO keep-going mode (office-wide, off by default) |
POST /discuss {agents[], topic, rounds} |
agent-to-agent meeting |
POST /ui/daylight {hour: 17.5 | "auto"} |
atmosphere override |
POST /event |
push any OEP event (custom integrations) |
GET /map/bg · POST /pos |
live map plumbing |
POST /perm/request (long-poll) · POST /perm/respond {id, decision, always?} |
permission broker |
GET /project/trust · POST /project/trust {id, decision} |
projects whose own .claude hooks await approval (work there is parked until answered) |
GET /projects · POST /projects {name, place|path | remove | removeDisk} |
projects (removals are human-UI-only) |
POST /projects/open {id, mode: play|shell|folder} · /projects/hide · /projects/resume · /projects/stop · /projects/stopwork |
project windows (▶ = smart open; locked while an agent works — stopwork takes over) |
GET /fs?dir= · POST /fs/mkdir |
in-house folder picker |
POST /places {name, folder | remove} |
PLACE shorthands |
POST /registry/key {name, value | remove} |
API key vault (env injection) |
POST /registry/channel {kind, config} · GET /channels/status |
Telegram / Discord / LINE / Slack / WhatsApp / Messenger / Feishu-Lark |
POST /channels/line/webhook |
LINE Messaging API webhook target |
POST /chat with wait: true |
hold the response until the run finishes (the CLI's ask) |
POST /chat with textOnly: true · maxOutputTokens: n |
one run with no tools / MCP / skills (not main or ceo) · cap that run's output (256–16384) — the agent's settings are untouched |
POST /update |
run the updater (human-UI-only) |
GET /version |
local + latest-released version + updateAvailable |
GET/POST /startup |
read / toggle launch-with-Windows (HKCU Run key) |
POST /voice/transcribe (WAV body) |
speech → text (Whisper / Gemini) |
POST /tts {text, preset|agent} · GET /tts/presets |
agent text-to-speech |
WS /live?agent= |
realtime voice relay to Gemini Live |
POST /gen/image {prompt} |
AI image → PNG in uploads |
POST /gen/image/edit {url, prompt} |
edit an image — always writes a new file |
GET/POST /gen/video · GET /studio · GET /studio/list |
🎨 Media Studio (video is human-UI-only — it costs about $2 a clip) |
GET /tools/catalog |
the 🧰 Tools Hub catalog, fetched live with a bundled offline fallback |
POST /registry/backend {backend} |
📦 RUN LOCATION — local · docker · ssh (office-wide; per agent in the agent editor) |
POST /registry/ghostworktrees {enabled} |
👻 GHOST ISOLATION — a private git worktree per ghost |
POST /registry/semantic {endpoint, model, key?} |
🔎 SEMANTIC RECALL — embeddings fused with the word index |
POST /registry/skill/revert {id} |
undo a self-correction, back to the previous version of a learned skill |
POST /upload (file body) · GET /uploads/… · GET /media?p= |
attachments + media render |
POST /registry/key {name,value|remove} |
main + extra API keys |
GET /features · GET /stats |
feature gates · dashboard data |
GET/POST /office-md |
shared OFFICE.md memory |
GET /proposals · POST /proposals/respond |
team project pitches |
POST /registry/tts · /registry/social · /registry/lang |
voice · social · language |
POST /registry/key/test |
verify a main key works |
GET /plugins · POST /plugins/reload · /plugin/<id>/... |
plugin host |
GET/POST /layout |
Office Editor layout (→ layout.changed) |
GET /health |
liveness ({clients, pendingPerms, wt}) |
GET /inbox · GET /approvals?pending=1 · POST /approvals {title, detail?, options?} · POST /approvals/respond {id, decision, note?} |
📥 the approvals queue — every kind that waits on a person, askable by plugins |
GET /notify · POST /notify/send {kind, title, body?} · POST /notify/read · GET/POST /notify/rules · POST /notify/presence |
🔔 notifications routed by your rules (sidebar · toast · channel · sound · quiet hours · away) |
GET /budget · POST /budget {office:{daily}, agents:{id:{daily}}, projects:{id:{total}}, digest} · POST /budget/digest |
💸 money caps — warn at 80 %, stop new turns at 100 %; estimates labelled ≈ |
POST /workflows/run {id | nodes,edges} · GET /workflows/run?id= · GET /workflows/runs?id= · POST /workflows/cancel |
🔀 the workflow engine — per-node execution, persisted runs, workflow.run / workflow.node events |
GET/POST /triggers · POST /triggers/delete · POST /triggers/fire · POST /hook/<token> |
⚡ triggers: schedule · webhook (HMAC) · office event · file · channel keyword |
GET /tasks · GET /tasks/board · POST /tasks · POST /tasks/update · POST /tasks/move · POST /tasks/delete |
📋 the task board — one model behind cards, delegations, jobs, action items and workflow runs |
GET/POST /calendar · GET /calendar/ics · POST /calendar/import |
📅 events with recurrence and all-day · reminders per occurrence · .ics both ways |
GET /codex/status · POST /codex/exec · POST /codex/review · POST /codex/settings · POST /codex/cancel |
🧑💻 Codex as a system tool — inside registered projects, sandboxed, budgeted |
GET /workflows/types |
node types the office and plugins registered |
GET /plugins/library · POST /plugins/library/install |
📦 the official plugins that ship with the office, installed by id |
GET /teams · POST /teams/hire |
👥 team templates — a pre-built team hired in one call, never overwriting existing agents |
GET /skills/tests?id= · POST /skills/tests · POST /skills/tests/run |
🧪 test cases per skill; a self-correction that breaks one is refused |
One JSON event per WebSocket message / journal line: {type, agent, task?, tool?, text?, session?, ts}.
| Type | World reaction |
|---|---|
agent.online / agent.offline |
walks in via the entrance / walks to a bunk and sleeps |
task.started / task.progress / task.completed / task.failed |
desk + board card; ✅/❌ FX |
perm.requested / perm.approved / perm.denied |
Security walk + ❗; 👍/👎 |
chat.message |
speech-bubble status + 🎵 + thread history |
collab.started / collab.ended (agents[]) |
meeting table + whiteboard minutes |
subagent.split / .spawned / .progress / .done (sub) |
ghost clones float up to the Ghost Deck, work, dissolve back |
skill.created |
golden burst + "📚 learned" |
ceo.summon / task.delegated |
the Director's chain-of-command walks |
roster.sync / roster.removed |
registry → world (spawn/update/despawn) |
reminder |
the Director walks over and tells you in person 🔔 |
ceo.report |
the Director walks the final summary to the boss 📨 |
channel.message |
a message arrived from Telegram / Discord / LINE / Slack / WhatsApp / Messenger / Feishu-Lark 📨 |
projects.changed |
project list/status flipped (live UI refresh) |
update.available |
main's VERSION is newer than local — the 🔄 banner appears |
ui.daylight |
atmosphere override |
Push your own events from anything: POST /event — that's the whole integration
story for custom agents. New WS clients receive a journal replay plus a fresh
roster snapshot.
Wallpaper rung: 30 fps cap, native-res render + MSAA 2×, SSR trimmed, volumetrics replaced by god-ray cards, no SSAO/DOF. On a GTX 1060 @1680×1050 the full scene (countryside, grass field, clouds, cinematic pass) measures roughly 20–30% GPU — the renderer pauses entirely when occluded by fullscreen apps. Plenty of knobs remain (FSR scale, grass density, cinema pass) if you want it leaner.
The full step-by-step guides, with screenshots:
| Guide | What's in it |
|---|---|
| Getting started | install · first launch · your first chat with the Director |
| The ecosystem | why it's more than agents — collaboration · compounding knowledge · self-extension |
| Agents & skills | hiring · persona · skills/tools · Security Center · 🤖 AUTO keep-going mode |
| Projects | places · create/open/watch/delete · 🛡 registering a folder someone else wrote |
| Office Ops | scheduled & recurring jobs · calendar · note board · org chart |
| Models & providers | swappable brains · per-agent model · 20 providers · live model lists · fallback brain |
| Cost & vision | spend less per token · route work to a cheap/free brain · give agents eyes |
| Local models (Ollama) | run agents on your own machine, no API key |
| AI features | main keys · TTS/realtime voice · images · memory · social life |
| Voice & feed mode | Right Ctrl push-to-talk · feed mode · NOW WORKING strip |
| Web automation | let an agent drive a real browser |
| Meetings | agent-to-agent discussions and what comes out of them |
| Workflow Builder | a real engine: approval / notify / delay nodes · branches and joins · runs that survive restarts · ⚡ triggers (schedule · webhook · event · file · keyword) |
| Official plugin library | 📦 Campaign Board · Content Pipeline · GitHub Triage · Inbox Agent · Weekly Report · Client Folders · Decision Log · Skill Regression — one click each |
| Team templates | 👥 dev shop · research lab · content studio · customer support · solo assistant |
| Export / Import | 📦 move a team, skills, MCP tools, workflows and Markdown to another office as one ZIP · pick items · preview before apply · credentials never travel |
| Tasks & Calendar | 📋 one board for everything the office does · dependencies · repeat · due-date reminders · 📅 recurrence · .ics both ways |
| Codex | 🧑💻 a colleague you can call in — DELEGATE: codex, the workflow node, bagidea codex, a second-opinion review |
| Inbox | 🔔 notifications with rules · 📥 one approvals queue · answer from your phone · quiet hours |
| Budgets | 💸 caps in money per day / agent / project · warn at 80 %, stop at 100 % · the morning digest |
| Tools Hub | the 53-entry catalog · MCP servers · Blender/Godot/Unity/Unreal/Roblox · Codex · submitting one |
| Plugins | the extension system · music player · writing your own |
| Plugin Hub | browse, install and publish community plugins · 🕊️ Emmaus, the first official companion plugin (Bible counsel, 3D, voice) |
| Showcase | get your office, project or plugin featured |
| Office Editor | furniture/walls · swap rooms · import your own models & images |
| Channels | connect Telegram / Discord / LINE / Slack / WhatsApp / Messenger / Feishu-Lark |
| CLI | every bagidea command with examples |
| Updates | the update system + the installer |
| Sponsoring | tiers, how logos appear, how the wall updates |
| Troubleshooting | common problems and how to fix them · 🛠 Dev Mode |
The docs/ folder is a complete V1 product-design specification written before
the first line of code — 14-zone world design, agent behavior simulation
(honesty contract: nothing tagged is fake), scaling to 100+ agents,
progression, monetization, and the competitive thesis
(doc 10: "cockpits make agents usable;
this makes them employable").
- Characters, sci-fi furniture kit, glass-walled shell, countryside
- Meeting Room choreography, Server Room, Dormitories, Recreation Room (dog!)
- One-exe suite: chat head + overlay + tray + auto-start + single-instance
- Live meeting whiteboard
- Agent registry: hire/edit/delete, avatars, auras, ✨ prompt copilot
- Skills library + Hermes-style auto-learning; tools + MCP servers
- Live top-down map, chat threads with history, CEO chain of command, discussions
- Day/night + manual atmosphere, roofline clock, ambient life, event FX
- Sub-agents — agents split into parallel ghost clones on the floating
Ghost Deck (
SUB:protocol, per-ghost sessions, auto-synthesis) - Projects — agents work inside real folders with resumable sessions; one window per project, one occupant at a time (stop-agent-to-take-over lock)
- Permission policies — granted tools run silently, ✓✓ forever grants
- Voice — Right Ctrl push-to-talk over Windows Voice Typing (Thai works)
- 📡 Feed mode, NOW-WORKING strip, Office Ops (jobs/calendar/notes/org)
- Channels — Telegram / Discord / LINE → the Director
- API key vault,
bagideaCLI, one-shot installer + self-updater - Voice engine v2 (Whisper/Gemini), agent TTS voices, realtime voice (Gemini Live)
- Channels (Telegram / Discord / LINE / Slack / WhatsApp / Messenger) → CEO flow
- Feishu / Lark channel (飞书) — the seventh; encrypted events, sender allowlist
- Hermes-style memory (OFFICE.md + per-agent), main keys + feature gates
- Attachments & inline media, AI image generation system tool
- Social office + project proposals, dashboard, CLI v2
- Plugins (host + music player + SDK), Office Editor (place/import), i18n, official website
- Swappable 3×3 room grid — rearrange the floor; furniture, anchors, nav and pets follow
- Plugin ecosystem — core vs installed plugins, 🧮 Calculator, GitHub install, official template + example repos
- 14-language UI, builtin agent skill library (15 packs), open-source clone+build installer,
bagidea restart - Social groups (3–4 agents) → plugin-oriented proposals with approve/reject notes; main-only calls with assigned voices
- 📦 Run location — an agent's work runs in a Docker container or on another machine over SSH; a backend that can't be built correctly is refused, not downgraded
- 👻 Ghost isolation — a private
git worktreeper ghost; parallel work comes back as branches and your checkout is never touched - 🔎 Semantic recall — any OpenAI-shaped
/embeddingsendpoint (a local Ollama keeps memory on the machine); word and meaning rankings fused - 📚 Skills that correct themselves — reflection can fix a skill it wrote, and runs after failures; never a built-in, never one you edited, previous version kept
- 🎨 Media Studio — make / change / animate in one window; an edit never overwrites its input
- 🧰 Tools Hub rebuilt — 53 verified entries incl. Blender, Godot, Unity, Unreal and Roblox Studio; the catalog is fetched live
- 🌐 Fourteen languages, end to end — the tool catalog translated in all of them, guarded by tests that fail when a "translation" is the English copied through
- Wake word; channel round-trip reports (delegate results back to the channel)
- macOS wallpaper backend (beta)
- Linux wallpaper backend (experimental — X11 EWMH; Wayland fullscreen-below fallback)
- Signed binary releases (skip the Rust build on install)
Built in the open, with help from the community. A huge thank you to everyone who's shaped BagIdea Office — by sending a pull request, reporting a bug, or testing on a platform we couldn't reach.
![]() @bagidea Creator & maintainer |
![]() @spondanai macOS support |
![]() @misternay macOS / Linux fixes |
![]() @skiyo0177-lgtm i18n (zh/en/ja UI) |
![]() @bmdy5 Markdown rendering |
![]() @kmmao macOS occlusion fix |
![]() @sbrasesco Report-back thread fix |
![]() @binyangzhu000-sudo Atlas Cloud provider |
![]() @f2dac Local-model proxy fix |
Much of the implementation was pair-built with Claude Code 💜
See CONTRIBUTORS.md for what each person built. PRs welcome — every merged contribution is credited there and on the Contributors graph.
MIT © BagIdea — free to use, modify and share. Bundled art/sound packs keep their own (free/CC0) licenses; see Art assets.
Built with Claude Code — design docs in the morning of day one, a full agent-office product by sunrise of day two.





















