Self-hosted · Bring your own AI Accounts

A 3D office where AI Agents work your GitHub issues

Each repository is a Floor with a Manager and a team of Agents. Label an issue, or tell the Manager “complete issues 1 to 5”, and watch them plan, code, review and open the pull request, each in its own sandbox.

git clone https://github.com/adrianeyre/ai-office.git
cd ai-office && pnpm install
cp .env.example .env && pnpm dev
A Floor of the 3D Office: Agents at their desks with the tokens they have used today above their heads, the Manager's office, a meeting room with a whiteboard, a break area with table football and table tennis, and a Chat with the Manager button.
A Floor. The team at their desks, the meeting room and the break area.
  • Self-hosted on your machine or one server
  • Sandboxed Agents in Docker
  • Token Caps office, Floor, Agent and issue
  • AI Gateway built in

Pool your AI Accounts

  • Claude
  • ChatGPT
  • Grok
  • Gemini
  • OpenRouter
  • DeepSeek
  • Z.ai
  • MiniMax
  • Kimi
  • Ollama
  • AWS Bedrock
  • Google Vertex AI

Why AI Office

What AI Office is

Coding agents do real work on well-scoped issues, but running several at once is hard to see and hard to steer: who is doing what, where work is stuck, what it is costing, and which AI Account has hit its rate limit.

AI Office makes all of it visible, bounded and controllable, and fun to watch. It is a web application you run yourself, on your own machine or a single server, with one Owner. Every Agent's live activity, every issue and pull request, and every model call and its tokens are one or two clicks away: click a monitor to see what an Agent is doing, open the whiteboard to read the plan, or read the Notice Board to see what needs you.

  • Visible

    Live activity, plans and every model call, a click away.

  • Bounded

    Token Caps and Round Caps: nothing spends without bound.

  • Controllable

    Steer each Floor by chat; approve what needs you.

  • Fun to watch

    A 3D office, with desks, Handoffs, meetings and breaks.

How an issue gets done

  1. You file it

    Label one of your issues ai-office, or name issues to the Floor's Manager in its chat to make a Batch with a Plan you approve.

  2. The Manager triages it

    It checks the issue is clear enough to work, comments its decision, and asks you on the Notice Board when it is not.

  3. Agents work it in sandboxes

    The issue moves through four Stages, each with its label. Each Agent works in its own Docker sandbox, reaching models only through the AI Gateway and never with your credentials.

  4. AI reviewers review the pull request

    In a Review Loop, capped by a Round Cap, so AIs never argue forever.

  5. The Merge Policy decides

    The Floor merges automatically once CI passes, or sends the pull request to you through a Notice.

The four Stages, by label

  1. needs-work
  2. needs-review
  3. needs-qa
  4. needs-docs

Features

Everything a team of Agents needs

An office to work in, a Manager to steer it, sandboxes to keep it safe and a Gateway to pay for it, all in one app you run yourself.

  • The 3D Office

    A lobby with the office-wide Notice Board and a lift to every Floor. Agents sit at their desks, walk tickets to the next desk on a Handoff, meet in the meeting room for a Kickoff and Wrap-up, and take breaks. It works on phones and tablets, with a 2D view and reduced motion too.

  • A Manager on every Floor

    Chat with the Manager: “complete issues 1 to 5”, “skip 4”, “move 5 up”, “status”. It triages, plans Batches on the whiteboard and escalates to you. Grilling Sessions interview you until a feature is understood, then write the issues.

  • Sandboxed Agents

    Agents run Claude Code, Codex or opencode in Docker sandboxes, with a read-only, short-lived GitHub token for their repository. Commits are authored as you, with an Agent: trailer naming the Agent.

  • A built-in AI Gateway

    Every model call passes through it. Anthropic- and OpenAI-compatible endpoints, load balancing, retries, a circuit breaker, Combos, model mappings and prompt-cache keep-alive. Your own tools can use it too, at AI Office's own address, with a Gateway Key.

  • Your AI Accounts, pooled

    Claude (Pro or Max) and ChatGPT (Plus, Pro or Business) subscriptions, and API keys for Anthropic, xAI, Gemini, OpenRouter, DeepSeek, Z.ai, MiniMax, Kimi, Ollama, AWS Bedrock, Google Vertex AI and compatible endpoints. Mix AI Providers on one Floor: Claude codes, ChatGPT reviews.

  • Hard limits

    Token Caps office-wide, per Floor, per Agent and per issue; Round Caps on Review Loops; usage windows and pause thresholds for subscriptions. An Agent can never loop or spend without bound.

  • Notice Board and Connections

    Everything that needs you, in one place: pull requests to approve, blocked Agents, reached caps. The Communications Agent tells you elsewhere too: Slack, email, webhooks, phone push, and Wrap-up reports to Confluence, Notion or Google Docs.

  • Activity and Analytics

    A complete, read-only Activity Feed of everything that happens, filtered by Floor, Agent, issue and type. Analytics of requests, tokens, estimated cost, latency and errors, and the history of every Gateway request.

  • Floor Templates and Roles

    Start a Floor from Development, Online store, Website & marketing, Content & blog, Documentation, Design system, Data & analytics, Infrastructure, Mobile app or Blank, or your own. Edit Roles and Skills in their libraries.

  • Secure by default

    No default password, optional TOTP, sign-in rate limits, AI Account credentials encrypted at rest and never sent to a sandbox, and every AI Gateway call checked against a Gateway Key. HTTPS with Caddy when you deploy it.

Screenshots

See it at work

Taken from the running app by its own end-to-end tooling. Select a picture to see it full size.

Before you start

Requirements

  • Windows, macOS or Linux, or a single server such as an EC2 instance.

  • Docker: Docker Desktop on Windows and macOS (on Windows it runs on WSL 2), or Docker Engine on Linux. It runs Postgres 18 and the Agents' sandboxes.

  • Node 26 or later and pnpm 12 or later, as the repository's package.json requires (older versions are refused), and Git.

  • A GitHub account, to create the AI Office GitHub App and install it on the repositories that will be Floors.

  • At least one AI Account: a Claude or ChatGPT subscription, or an API key for one of the supported AI Providers.

Five minutes

Quick start

From nothing to AI Office running on http://localhost:3045, in development. Pick your system. For Agents to work issues, carry on with the full setup.

Windows

Install Docker Desktop first. It needs WSL 2: if it asks, run wsl --install in an administrator PowerShell and restart. Then, in PowerShell:

# Git and fnm (a Node version manager); follow fnm's instructions
# to add it to your PowerShell profile, then open a new terminal
winget install Git.Git
winget install Schniz.fnm
fnm install 26
fnm default 26

# pnpm 12 or later
iwr https://get.pnpm.io/install.ps1 -useb | iex

# In a new terminal: get AI Office and run it
git clone https://github.com/adrianeyre/ai-office.git
cd ai-office
pnpm install
Copy-Item .env.example .env
pnpm dev

macOS

Install Docker Desktop and Homebrew first. Then, in Terminal:

# Git and fnm (a Node version manager); follow fnm's instructions
# to add it to your shell profile, then open a new terminal
xcode-select --install
brew install fnm
fnm install 26
fnm default 26

# pnpm 12 or later
curl -fsSL https://get.pnpm.io/install.sh | sh -

# In a new terminal: get AI Office and run it
git clone https://github.com/adrianeyre/ai-office.git
cd ai-office
pnpm install
cp .env.example .env
pnpm dev

Linux

Install Docker Engine and add yourself to the docker group first. Then:

# Git and fnm (a Node version manager); follow fnm's instructions
# to add it to your shell profile, then open a new terminal
sudo apt install git   # or your package manager's equivalent
curl -fsSL https://fnm.vercel.app/install | bash
fnm install 26
fnm default 26

# pnpm 12 or later
curl -fsSL https://get.pnpm.io/install.sh | sh -

# In a new terminal: get AI Office and run it
git clone https://github.com/adrianeyre/ai-office.git
cd ai-office
pnpm install
cp .env.example .env
pnpm dev

Open the app

pnpm dev starts the development Postgres in Docker, applies the database migrations, then runs the server and the web app together. Open http://localhost:3045: on the first run it asks you to create the Owner password.

Use the AI Gateway

That one address is the AI Gateway too, at /v1. Make a Gateway Key under API Key Management and point your own tools at it: Claude Code with ANTHROPIC_BASE_URL=http://localhost:3045, Codex and other OpenAI clients with http://localhost:3045/v1.

Step by step

Full setup guide

Everything from a fresh machine to Agents opening pull requests. Each step links to the detailed guide in the repository.

1 Install the prerequisites

You need Git, Node 26 or later, pnpm 12 or later, and Docker.

How to install each prerequisite on each system
Windows macOS Linux
Git winget install Git.Git xcode-select --install Your package manager, e.g. sudo apt install git
Docker Docker Desktop, on WSL 2 (wsl --install) Docker Desktop Docker Engine, then add yourself to the docker group
Node, via fnm winget install Schniz.fnm brew install fnm curl -fsSL https://fnm.vercel.app/install | bash
pnpm iwr https://get.pnpm.io/install.ps1 -useb | iex curl -fsSL https://get.pnpm.io/install.sh | sh -

Then install Node 26 with fnm, and check both versions:

fnm install 26
fnm default 26
node --version   # v26 or later
pnpm --version   # 12 or later

On Windows, if an older pnpm still shows, run where.exe pnpm: the installer's copy in %LOCALAPPDATA%\pnpm must come first on your PATH. More in Running AI Office.

2 Clone and install

git clone https://github.com/adrianeyre/ai-office.git
cd ai-office
pnpm install

Start Docker (on Windows and macOS, open Docker Desktop and wait until the engine is running). docker info should answer without an error.

3 Create .env

Copy the example file to .env in the repository root:

# Windows (PowerShell)
Copy-Item .env.example .env

# macOS, Linux and Git Bash
cp .env.example .env

That is all development needs: the example already points at the development Postgres and has sample secrets. Those secrets are public, so for anything else generate your own and change POSTGRES_PASSWORD (and the password in DATABASE_URL) too:

# SESSION_SECRET: 32 random bytes as 64 hex characters
node -e "console.log(require('crypto').randomBytes(32).toString('hex'))"

# ENCRYPTION_KEY: exactly 32 random bytes, base64-encoded
node -e "console.log(require('crypto').randomBytes(32).toString('base64'))"

Never commit .env. ENCRYPTION_KEY encrypts your AI Account credentials: change it and saved ones can no longer be read. Every setting is explained in .env.example.

4 Run AI Office

In development

pnpm dev

This starts the development Postgres (pnpm db:up, on port 3048), applies pending migrations, then runs the server (port 3046) and the web app (port 3045, which proxies /api and the AI Gateway's /v1 to the server) together. Open http://localhost:3045. pnpm db:down stops the database; its data stays in a Docker volume.

Or with docker compose

AGENT_UID=1000 AGENT_GID=1000 pnpm sandbox:build   # the sandbox images (step 8)
docker compose up --build --wait
curl localhost:3045/health   # {"status":"ok","database":"up"}

This runs the whole AI Office in Docker: the app and Postgres 18, published on 127.0.0.1:3045, and the sandboxes Agents and the Manager chat work in, which the app starts on your Docker. That one address serves the web app and the AI Gateway's /v1. Data survives docker compose down. On Linux, set DOCKER_GID to the Docker socket's group (stat -c %g /var/run/docker.sock). Sandboxes' clones live in AI_OFFICE_SANDBOX_DIR (~/.ai-office/sandboxes by default), mounted into the app at the same path; never put it under a directory others may write to, such as /tmp. On macOS it must be a path Docker Desktop shares, and on Windows a Linux-style path, never C:\….

Opening AI Office beyond your machine (AI_OFFICE_BIND_ADDRESS) opens the AI Gateway too. Every Gateway call needs a Gateway Key, but use docker compose --profile tls up, which adds Caddy for HTTPS, rather than plain HTTP; see Deploying to EC2 for a whole server deployment.

5 Sign in for the first time

  • Create the Owner password. There is no default: the first visit goes to /setup. It must be at least 12 characters, use at least 6 different characters, and mix three of lower case, upper case, digits and symbols (unless it is 20 characters or more). From then on, sign in at /login. Under docker compose the setup screen also asks for the one-time setup token AI Office wrote as it started: docker compose logs app shows the file it is in, and docker compose exec app cat <file> shows it. Nobody else can become the Owner first.
  • Turn on TOTP (optional, recommended whenever AI Office is not on localhost): in Admin, scan the QR code into an authenticator app, confirm with a code, and save the ten recovery codes.
  • Set your GitHub login on Admin's Intake card: AI Office only takes issues you opened or labelled. The Git identity card sets who commits are authored as.

6 Create the GitHub App

AI Office acts on GitHub as a GitHub App: it pushes branches, opens pull requests, posts reviews and comments, and merges.

  1. Open Settings → Developer settings → GitHub Apps → New GitHub App (for an organisation's repositories, in the organisation's settings).
  2. Give it a unique name, such as AI Office (your-login). Any homepage URL will do. Leave the callback URL empty and OAuth during installation off.
  3. Webhook: untick Active. AI Office checks for issues on a timer; webhooks are optional (below).
  4. Repository permissions: exactly these, and every other permission at No access.
The GitHub App's repository permissions
Permission Access What AI Office does with it
Checks Read-only Reads a pull request's check runs, for the Merge Policy
Contents Read and write Pushes each issue's branch, reads files, merges
Issues Read and write Reads your issues, creates and moves labels, comments
Metadata Read-only Reads the repository and its rulesets (set for every App)
Pull requests Read and write Opens a pull request per issue and posts AI reviews
  1. Where can this GitHub App be installed? Only on this account. Then Create GitHub App.
  2. Copy the App ID, and under Private keys choose Generate a private key.
  3. In AI Office, open Floor Settings, and in the GitHub card give the App ID and paste the whole .pem file under Add a GitHub App. It is kept encrypted, and used at once, with no restart. Add more Apps, or an access token and a read-only one, the same way.

The private key is a credential: delete the downloaded file once the App is added. Administration and Workflows are left out on purpose, so Agents can never change a repository's settings or its CI.

Webhooks (optional)

If GitHub can reach your AI Office over HTTPS, webhooks make it act at once instead of at the next check. Choose a secret of at least 20 characters (openssl rand -hex 32), enter it on Admin's GitHub webhooks card, then on the App tick Active, set the URL to your address followed by /api/github/webhooks with the same secret, and subscribe to Issues, Label, Pull request, Check run and Check suite.

Full details: Setting up the GitHub App and your Floors.

7 Install the App

On the App's page choose Install App, pick the account, then Only select repositories and the repository that will be a Floor. Start with a small test repository with a passing CI check; the guide has one ready to copy, ai-office-sandbox.

8 Build the sandbox images

Agents work in Docker sandboxes running Claude Code, Codex or opencode. Build the images as the user that runs AI Office (pnpm dev builds any that are missing), or, for docker compose, for its node user with AGENT_UID=1000 AGENT_GID=1000 in front:

pnpm sandbox:build          # all three
pnpm sandbox:build claude   # or only those your Agents' AI Providers need

Sandboxes join a Docker network with no route out, where they reach only the sandbox relay: the AI Gateway's own port through it, and over HTTPS the hosts SANDBOX_EGRESS_HOSTS names, and nothing else. AI Office reaches the Gateway from them at the same address everywhere, SANDBOX_GATEWAY_URL=http://sandbox-relay:3047, which .env.example already sets. Then:

What else to set for each way of running AI Office
Where AI Office runs Also
pnpm dev, Windows and macOS (Docker Desktop) Nothing: pnpm dev starts the relay with the development Postgres
pnpm dev, Linux The docker0 bridge's address (ip -4 addr show docker0, usually 172.17.0.1), where the relay reaches the Gateway: GATEWAY_HOST=172.17.0.1
docker compose Nothing to set: compose starts the relay and sets SANDBOX_GATEWAY_URL, SANDBOX_NETWORK and SANDBOX_WORK_DIR itself, whatever .env says. Build the images with AGENT_UID=1000 AGENT_GID=1000 pnpm sandbox:build

Never set SANDBOX_NETWORK to bridge, Docker's default bridge, which has a route out, nor GATEWAY_HOST to 0.0.0.0. Sandboxes never receive an AI Account credential: each gets a Gateway Key of its own. See Sandboxes.

9 Add your AI Accounts

In AI Settings → AI Accounts. None come from the environment, and until one is added every Gateway request fails. Credentials are encrypted with ENCRYPTION_KEY and never shown again.

  • Claude subscription (Pro or Max). Read and accept the terms warning, choose Sign in to Claude, sign in, and paste back the code the page shows. AI Office refreshes the token itself and shows your 5-hour and weekly usage.
  • ChatGPT subscription (Plus, Pro or Business). Accept the terms warning and choose Sign in to OpenAI. The sign-in ends on http://localhost:1455, which AI Office listens on while it waits, so on the same machine it finishes by itself; when AI Office runs elsewhere, paste the page's whole address back.
  • API keys: Anthropic Console, xAI, Gemini, OpenRouter, DeepSeek, Z.ai, MiniMax, Kimi, Ollama Cloud, AWS Bedrock, Google Vertex AI, or any Anthropic- or OpenAI-compatible endpoint.

Each AI Provider has a default Model you choose, and each Agent can override it. See AI Accounts in the AI Gateway guide.

10 Add a Floor

Admin's Floors card lists the repositories the App is installed on. Pick a Floor Template (Development, the default, gives a Manager, a coder, a reviewer and QA), then Add Floor. AI Office creates the pipeline's labels on the repository within a minute.

Choose the Floor's Merge Policy on its admin page, then protect the repository's default branch on GitHub: require CI and forbid direct pushes. AI Office never changes protection itself. See Protect the default branch.

11 Hand over the first issue

Open a small issue with a list of acceptance criteria and label it ai-office. Within a minute the Manager comments its triage and labels it needs-work, and an Agent picks it up: watch it at its desk, or click its monitor for the live view. Or open the Floor's Manager chat and type complete issues 1 to 5 for a Batch with a Plan on the whiteboard.

Licence

AI Office has not chosen its licence yet: one will be picked when it is released, and until then no licence is granted. The third-party assets it includes, such as 3D models and the Inter typeface in its logo, are listed with their own licences (CC0-1.0, OFL-1.1 and Apache-2.0) in THIRD-PARTY-NOTICES.md.

Claude and ChatGPT subscriptions are used under their providers' terms: AI Office shows each one's terms before you sign in.

Get AI Office

The code, the issues and the full guide are on GitHub.

Privacy Policy

Last updated: October 2026

Who looks after your data

This website, https://ai-office.adrianeyre.co.uk, is a single static page about AI Office, published from AI Office's repository and hosted by GitHub Pages. It has no sign-in, no forms and no comments, and asks you for nothing.

What this website collects

Nothing. There is no analytics, no tracking and no advertising. The page sets no cookies and keeps nothing in your browser's storage, and everything it shows (its text, fonts, icons and screenshots) comes from this site itself, so viewing it sends nothing to anyone else.

Who else sees it

  • GitHub hosts this website. Like any web host, it receives each visitor's IP address and the request its browser makes, and may keep them in its server logs for security and to keep the service running, as set out in the GitHub General Privacy Statement.
  • Links to GitHub and to other sites, such as Docker or Homebrew, leave this website: what those sites collect is set out in their own privacy policies.

The AI Office app

The app itself is self-hosted, so whoever runs a copy of it is responsible for what it holds. Its own privacy policy, in its footer, sets out what it keeps and where it sends it.

Your rights

This website holds nothing about you. For what GitHub holds, see its privacy statement; for a question about this page, open an issue on GitHub.

Terms and Conditions

Last updated: October 2026

Using this website

This website gives information about AI Office: what it is, what it needs and how to set it up. By using it, you agree to these terms, and to GitHub's own terms for the GitHub Pages it is hosted on.

The software

AI Office has not chosen its licence yet: one will be picked when it is released, and until then no licence is granted, as the Licence section above says. The third-party assets it includes keep their own licences, listed in THIRD-PARTY-NOTICES.md.

Your accounts and their terms

The setup this page describes connects your own GitHub App and AI Accounts, and their providers' terms still apply. Some subscriptions limit automated use: check yours before AI Office load-balances across it. Any charges from an AI provider are yours.

Names and trademarks

Claude, ChatGPT, GitHub, Docker and the other products named here belong to their owners, and are named only to say what AI Office works with.

No warranty

This website and its instructions are provided as they are, without warranty of any kind. Its authors are not liable for any loss arising from their use, to the extent the law allows.

Changes

These terms may change with the website; the date above says when they last did.

Accessibility

Last reviewed: October 2026

Conformance status: this website is built to meet the Web Content Accessibility Guidelines (WCAG) 2.2 at Level AA.

What we have done

  • Keyboard access — every link, button, tab and dialog works with a keyboard alone, with a clear focus outline that the sticky header never hides. A “Skip to content” link leads the page.
  • Screen readers — one main heading, headings in order and labelled landmarks; every control has a name, every screenshot a description, and copying a command is announced.
  • Colour and contrast — text has at least 4.5:1 contrast with its background, and controls, icons and focus outlines at least 3:1, in both light and dark mode, which follow your device. Windows Contrast Themes are respected.
  • Motion — transitions are short, and smooth scrolling and animation are switched off when your device asks for reduced motion.
  • Zoom and reflow — the page reflows down to 320 pixels wide and when zoomed to 400%, without scrolling sideways.
  • Target sizes — every control is at least 24 by 24 pixels, and the buttons at least 44 pixels tall on touch screens.
  • Dialogs — the screenshot viewer and these policies move focus in, keep it there, close on Escape and hand focus back to whatever opened them.
  • Without JavaScript — every part of the page, these policies included, can still be read and reached.

Known limitations

  • The widest tables, such as the prerequisites by system, scroll sideways inside their own frame on narrow screens; the frame takes focus, so the arrow keys scroll it.

Feedback

If something is hard to use, please open an issue on GitHub saying what you were trying to do, and with which browser and assistive technology.