No description
  • TypeScript 97%
  • Kotlin 1.6%
  • JavaScript 1%
  • Dockerfile 0.2%
  • CSS 0.1%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Morten Olsen 2a7887880e
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
fix(runtimes): let providers live behind private addresses
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.
2026-11-05 11:00:16 +01:00
.woodpecker ci(push): avoid duplicate cold Android checks 2026-10-21 23:41:19 +00:00
apps fix(runtimes): let providers live behind private addresses 2026-11-05 11:00:16 +01:00
docker feat(runtimes): add named OpenAI-compatible providers with Pi 2026-10-28 21:12:21 +00:00
docs refactor(runs): give the launcher's decisions one home each 2026-10-29 19:24:03 +01:00
packages fix(runtimes): let providers live behind private addresses 2026-11-05 11:00:16 +01:00
scripts feat(push): connect native delivery and encrypted acknowledgment 2026-10-21 22:23:31 +00:00
skills/mission-control feat(cli): agents share and fetch files 2026-10-18 00:15:32 +02:00
.dependency-cruiser.mjs feat: the app is the only interface, served from the root; the web app and its design system are gone (ADR 0032) 2026-10-19 11:03:28 +02:00
.dockerignore feat: the app is the only interface, served from the root; the web app and its design system are gone (ADR 0032) 2026-10-19 11:03:28 +02:00
.gitignore feat(push): exercise native synthetic notification lifecycle 2026-10-21 14:11:42 +02:00
.prettierignore feat(push): exercise native synthetic notification lifecycle 2026-10-21 14:11:42 +02:00
.prettierrc init 2026-10-05 18:39:43 +02:00
.u8.json init 2026-10-05 18:39:43 +02:00
AGENTS.md feat: add readable task references while keeping GUID identity 2026-10-21 14:02:15 +02:00
eslint.config.mjs feat: the app is the only interface, served from the root; the web app and its design system are gone (ADR 0032) 2026-10-19 11:03:28 +02:00
GLOSSARY.md feat: make the inbox say what needs you 2026-10-29 13:20:26 +01:00
mise.toml ci: releases no longer carry the executables 2026-10-19 00:14:36 +02:00
package.json feat: the app is the only interface, served from the root; the web app and its design system are gone (ADR 0032) 2026-10-19 11:03:28 +02:00
pnpm-lock.yaml chore: integrate current main before virtualization rollout 2026-10-28 22:31:35 +00:00
pnpm-workspace.yaml feat(runtimes): add named OpenAI-compatible providers with Pi 2026-10-28 21:12:21 +00:00
README.md build: cli:install also builds the agent image 2026-10-21 07:17:14 +02:00
renovate.json feat: a release tag also builds the agent image; both images scanned, base pinned, Renovate added (#10) 2026-10-07 15:32:40 +02:00
Taskfile.yml refactor(push): separate protocol setup from notification ownership 2026-10-21 15:03:46 +00:00
vitest.config.ts feat: the app is the only interface, served from the root; the web app and its design system are gone (ADR 0032) 2026-10-19 11:03:28 +02:00

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

A project's tasks, with one opened beside them while an agent works on it

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-control command 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 run's live transcript, with its tool calls A task in review: approve or request changes
A plan broken into subtasks by an agent Roles as an org chart
Subtasks created by an Engineering Lead agent The roles of an organization, 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.