- TypeScript 97%
- Kotlin 1.6%
- JavaScript 1%
- Dockerfile 0.2%
- CSS 0.1%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
|
All checks were successful
ci/woodpecker/push/draft-release Pipeline was successful
ci/woodpecker/push/deploy-access Pipeline was successful
ci/woodpecker/push/deploy-tools Pipeline was successful
ci/woodpecker/push/quality Pipeline was successful
ci/woodpecker/push/docs Pipeline was successful
ci/woodpecker/push/image Pipeline was successful
ci/woodpecker/push/image-smoke Pipeline was successful
ci/woodpecker/tag/image-release Pipeline was successful
ci/woodpecker/tag/image-agent Pipeline was successful
ci/woodpecker/tag/deploy-release Pipeline was successful
ci/woodpecker/tag/release-android Pipeline was successful
The destination guard only allowed global unicast addresses plus a hard-coded exception for llama.olsen.cloud, so any other home gateway (9router.olsen.cloud) failed with "Provider destination is not allowed". HTTPS on 443 with a trusted certificate already rules out the classic SSRF targets, and only people configure providers, so drop the address check along with the DNS pinning that served it. Redirects stay refused and saved keys stay bound to their URL. |
||
| .woodpecker | ||
| apps | ||
| docker | ||
| docs | ||
| packages | ||
| scripts | ||
| skills/mission-control | ||
| .dependency-cruiser.mjs | ||
| .dockerignore | ||
| .gitignore | ||
| .prettierignore | ||
| .prettierrc | ||
| .u8.json | ||
| AGENTS.md | ||
| eslint.config.mjs | ||
| GLOSSARY.md | ||
| mise.toml | ||
| package.json | ||
| pnpm-lock.yaml | ||
| pnpm-workspace.yaml | ||
| README.md | ||
| renovate.json | ||
| Taskfile.yml | ||
| vitest.config.ts | ||
Mission Control
Mission Control is a self-hosted server and app for working with AI agents as a team. Define roles, give them instructions and skills, and hand them tasks or talk to them directly. Agents run on Claude Code or Codex, keep their work in a persistent home for each role, and work with your repositories using git and your forge's CLI. Projects can also hold work without a repository.
The same app runs in the browser and on Android. The server serves the browser app and keeps its data; the app keeps a local replica so tasks and conversations open at once, including offline.
Documentation: mission-control.mortenolsen.pro
How it works
- Give work to a role. A task has a status and at most one assignee: a person or a role. A task
assigned to a role as todo or in progress starts its agent once its blockers are finished and a
runtime configuration is available. The agent gets the task's history, the role's instruction
and skills, and the
mission-controlcommand for commenting, creating subtasks and handing work on. - Keep context between tasks. Every run starts in the role's home, kept for as long as the role. Agents clone projects, make worktrees and branches, and keep notes and tools there. When a task comes back to a role, its run continues with its earlier session.
- Work reaches your forge. Connect Forgejo, Gitea or GitHub to see linked pull requests and their reviews on tasks. Agents push and open pull requests themselves, with access you give their role. Review and approval happen on the forge; approving a task in Mission Control hands it back to the role to continue. Your forge's branch protection controls what can merge.
- Talk to a role. Each person has an ongoing conversation with each role. Its agent can create tasks from what you ask, follow them and report back. Connect a role's Slack app to reach the same conversation through DMs or mentions in channels.
- Plan your own work. Today, Anytime, Upcoming, Someday, Logbook and Triage organize your tasks. Start dates, deadlines, priorities and projects help plan them; the lens lets you see work assigned to other people and roles. Routines create tasks on a schedule.
- See what happened. Tasks keep comments and transitions with reasons and handoffs. Every run has a live transcript of the messages, commands, tool calls and file changes the agent made.
| An agent at work | A task waiting for review |
|---|---|
![]() |
![]() |
| A plan broken into subtasks by an agent | Roles as an org chart |
![]() |
![]() |
Roles have permissions, skills and a place in an org chart. Skills are reusable instructions with supporting files, given to every run or read when needed. Owners can also give roles environment variables, secrets and network MCP servers. See the concepts.
Before you use it
- Agents can act inside their environment. Runs approve permission requests automatically. By default each runs in a Docker container with its role's home and run directory mounted; Kubernetes can run agents as pods instead. Agents have network access and the credentials you give them. Read Security and Kubernetes configuration before deploying.
- People bring runtime configurations. Use a Claude subscription token or Anthropic API key for Claude Code, or a ChatGPT sign-in or OpenAI API key for Codex. Configurations can be shared with selected people and roles; a run uses one that serves its sponsor. See Runtime configurations.
- Protect the data directory. It holds the database, keys, roles' homes and shared files. Back it up as a whole: losing the encryption key makes stored secrets unreadable.
- It is early. Mission Control changes quickly, and some settings are only in the API or CLI.
Quick start
For a local server, you need Git, Docker and credentials for one of the agent runtimes above. Code work also needs a repository on Forgejo, Gitea or GitHub, and a token with access to it.
Releases publish the server image as code.olsen.cloud/ai/mission-control:<version> and an agent
image of the same version. See Run a server
for deployment, including configuring how agents start: the server image does not include Docker.
Releases also attach the signed Android APK; install it and sign in with your server's address.
To install the server and CLI from source, use mise for the pinned tools:
git clone https://code.olsen.cloud/ai/mission-control.git
cd mission-control
mise install
task install
task cli:install # also builds the image agents run in
mission-control-server start
Open http://localhost:7420, set up the first account and start an
organization. In Settings, connect your forge and add a runtime configuration. Create a project
and a role. For code work, give the role its forge token as
an environment variable:
GITEA_INSTANCE_URL and GITEA_TOKEN for Forgejo or Gitea, or GH_TOKEN for GitHub. The token used
by Mission Control to read pull requests is separate from the access agents receive. Then give the
role a task as todo.
Your first task walks through the
app. To work from a shell, sign in with mission-control login http://localhost:7420, then use
mission-control --help (or mc --help). Agents receive the same command, already signed in as
their role for the run.
Development
mise install && task install
task image:agent # the image agents run in; rebuild after changing their bridges or tools
task dev # the API on :7420 and the app in Expo's dev server on http://localhost:8081
task ci:quality # type-check, lint, format check and tests, as CI runs them
task e2e # Playwright against the app's web build and a fresh server
task app:storybook # the app's components and screens on http://localhost:6007
task docs # the documentation site on http://localhost:3100
task dev keeps its data in ~/.local/share/mission-control-dev, separate from an installed server.
| Path | What it is |
|---|---|
packages/server |
The Fastify API, services, run manager and SQLite database through Kysely |
apps/app |
The app for Android and the web: Expo, Expo Router and React Native |
packages/store |
The app's local replica, with SQLite through Drizzle and synchronization with the server |
apps/server-cli |
The mission-control-server command, which also serves the app's web build |
apps/cli |
The mission-control / mc client used by people and agents |
packages/client |
The typed API client generated from the server's OpenAPI document |
docker |
The server and agent images |
apps/docs |
The documentation site (Docusaurus) |
docs/adr |
Architecture decision records |
GLOSSARY.md |
The vocabulary used in code, API and UI |
The screenshots are generated: task docs:screenshots seeds a demo organization and replays recorded
agent runs, without starting a real agent. See
Screenshots and
Contributing.




