vApps
A portal, not a project
A grid of components wired only by keys, opened in its own window over rows it keeps. An agent writes one in a turn; you throw it away when the week is over, or publish it to the fleet when it was not.
vApps in the docspersonal ware factory · fleet · bicycle
Remember the rental bike boom, when the bikes came off the line faster than anyone could ride them and ended up stacked six high in fields? Code went the same way. An agent writes the tool before you finish describing it. I am the factory floor for that: seven coding harnesses on one wire, your own machines as one fleet, and an index that still knows which of the ten thousand bikes is yours.
# Apple silicon, from the downloads below
open Mechabedo-aarch64-apple-darwin.dmg
chmod +x Mechabedo-x86_64-unknown-linux-gnu.AppImage
./Mechabedo-x86_64-unknown-linux-gnu.AppImage
msiexec /i Mechabedo-x86_64-pc-windows-msvc.msi
mise run prep
mise run dev
# http://localhost:4776
cp docker/mechabedo.config.example.jsonc ./config/
docker compose up -d
the lot
Most software you need this week is a bike for one trip: a board for one incident, a script for one migration, a deck for one meeting. I build those on the spot and keep them in a lot instead of a repository. The difference from the bike fields is that this lot is indexed, so the one you rode in June is still a search away.
vApps
A grid of components wired only by keys, opened in its own window over rows it keeps. An agent writes one in a turn; you throw it away when the week is over, or publish it to the fleet when it was not.
vApps in the docstools
Small programs kept outside any repository, scaffolded in Python, TypeScript, Go, Rust or C#. Each carries a spec the next session is handed, so nobody writes the same throwaway script twice.
Enhance in the docsdecks
A slidev deck scaffolded in the house palette with icons and a network graph built in, served on a port of its own. Somebody has to stand up and present the thing you built; it should not take an evening.
Decks on a vApp gridskills
A procedure you kept becomes a skill every harness is offered. Fork one, change it, publish it, and the other machines install it from a market your own host brokers.
The marketplaceworkspaces
A jj working copy of your repository per agent, for the rewrite you should not watch half-finished. Nothing reaches your tree until it lands, and every landing leaves a record a later session reads.
Workspacesgraphs
Hand over a list of jobs and what each waits on. A session opens per node as its dependencies finish, a few at a time, and you watch the line move on the conversation that started it.
Graph runsthe fleet
A laptop, a tower with a real GPU, a container on the NAS in the cupboard. Each runs the same artifact in a slot of its own, and each dials out to one host you run, so nothing gets a port forwarded. The host relays, stores and brokers; it runs no agent and holds no model. This is the shape of it, deliberately with no real names on it.
Agents the installation keeps, messaged in direct, group and desk threads on the host. A Chief on every machine recruits the rest and hands a job to whichever floor has the right one. Your phone is a seat at the table, never the driver's seat.
One host per team or per purpose is a normal shape. Each machine holds a token for its own slot and nothing more, members sign in through the identity provider you already run, and the operator token stays with the operator.
the floor
Chat is a conversation. Tabs are how many of those run at once. Enhance is what makes both reach tools worth having. None of them is a mode you switch into and lose the other two in; they are flags, and the window adapts.
chat
Standalone chat and agent sessions share a renderer, a prompt box, tool blocks and history, because writing that twice would have been a decision and not a requirement. Aim a prompt at a session and it goes there. Aim it at nothing and it streams from your gateway. Either way it ends up archived.
tabs
Every open tab stays mounted. Switching is a display change, so nothing gets torn down: not a stream, not a scroll position, not an xterm buffer, not a Monaco model. Each tab carries its own route, so deep links and history keep working and a background tab renders its own page instead of the foreground one's.
enhance
Skills, tools and subagents get written out once and pushed into every session I start, through whatever mechanism that harness actually has. That is seven different mechanisms, one of which is a symlink, and none of it is yours to think about. A kit decides what a run gets; a session keeps what it launched with.
one wire
A harness is a backend, not a lifestyle. Every one of them speaks the Agent Client Protocol, so there is one renderer, one permission prompt, one queue and nothing to keep in step. Anything that cannot speak it does not get driven, and I am not writing an adapter to be polite.
| harness | how it is driven | enhanced through |
|---|---|---|
| Claude Code | the official ACP adapter | a linked plugin |
| Codex | codex-acp over stdio | additional directories |
| Qwen Code | qwen --acp, its own agent | a system-defaults scope |
| OpenCode | a proxied server process | its own config |
| maki | maki acp, its own agent | skills over MCP |
| Hermes | hermes acp, its own agent | a fixed profile |
| mechabedo | mechabedo acp, which is me | nothing, it is in-process |
Close me and come back: the session is still there with its history, and the process gets restarted underneath it when you send the next prompt. A busy session takes a queue rather than a refusal, and a turn you stopped on purpose wakes nothing afterwards, because a supervisor that argues with you is worse than no supervisor.
mechabedo acp is a runtime mode of the same binary that serves this
window: read, write, edit, glob, grep and bash, preferring ripgrep, fd, hashline and
rtk where they are installed and falling back to a real answer where they are not.
It refuses to overwrite a file it has not read, and refuses a patch whose anchors
moved. Anything that speaks ACP can open a session on it, not only me.
logbook
Every session on this machine, imported out of each harness's own history instead of transcribed off whatever happened to be on screen. Sessions you drove by hand in a terminal are in there too, and you did not have to tell me. None of it is recall. It is rows, and there is a search box.
One tiling surface: search across messages, sessions and prompts, read a transcript a page at a time, or replay one the way it streamed. A standalone CLI and a full terminal UI read the same rows, for the days you would rather not have a window.
The archive is a tool surface. A running session can look up the decision an earlier one already made instead of confidently making it again, differently. That is the entire reason I keep any of this.
Tokens, turns and cost across everything, priced per model, with a subscription projection attributed against what actually ran here. Usage a harness declined to report gets estimated, and says so rather than pretending.
It is a Postgres database on your disk. Snapshot it, export it as JSONL, or sync it between two machines as encrypted blobs through a host you run. Nothing here phones anywhere you did not point it at.
scope
Not a roadmap and not a wishlist. Every line below is a decision already made, already shipped, and written down in a record naming the alternatives it beat. Read it as a warning about how much surface area sits between "run a coding agent" and "run seven of them without losing your mind".
Every one of these is a file you can open, with a heading, a decision and the options it lost to. That is not thoroughness for its own sake: it is the only reason an agent working in here tomorrow does not undo it.
rest of the window
These sit beside the conversation, on the same server and the same database, because a second one of either is how two halves of a product start disagreeing about what is true.
deno lsp for TypeScript, whichever the
directory actually is. Project rail, search and replace across the tree, a diff,
and a changes list.
runtime modes
Same entrypoint every time. Which job it does is decided at startup from how you invoked it and whether the build carries a webview. None of the five is a separate download, and none of them is a build flag you had to pick a year ago.
One PGlite instance per installation, on disk, reached from the browser over the PostgreSQL wire protocol through a WebSocket. Two databases mean two tables that drift apart and one bug report nobody can reproduce. The browser's own copy survives as an opt-in escape hatch and nothing more.
A table in that database, not a pile of files and not localStorage. Theme, prompts, fonts, kits and loadouts are rows, which is why changing a palette is an edit and not a build, and why exporting your setup is a query.
the manual
The guide is written for whoever runs this next, person or agent. Start where your question is; every page links to the next one you will need.
Behind the guide sits the paper trail: a knowledge chapter per capability area and a record for every load-bearing decision, naming the alternatives it beat. That is the only reason an agent working here tomorrow does not undo it.
downloads
Windows, macOS, Linux and the container image, packaged the way each expects. All four are always listed, so one that has not been published yet says so rather than going missing. Whoever pointed you here sent the passphrase along with it. It gets hashed in this tab and never sent anywhere, so a wrong one finds a 404 and I never learn what you typed.
| build | platform | size |
|---|
I send one anonymous ping when my server starts: version, channel, os, arch, a random
install id, and whether this is a first run. That is the entire message, and
MECHABEDO_ANALYTICS=off or a switch in Settings stops it. The umami on the
other end is self-hosted and keeps no raw address.