-
Notifications
You must be signed in to change notification settings - Fork 108
Installation
Getting Codeman onto a machine, verifying it works, updating it, and removing it.
| Requirement | Notes |
|---|---|
| macOS or Linux | Windows works through WSL2. See Windows below. |
| Node.js 22+ | The installer offers to install it if missing. |
| tmux | Not optional. Sessions live inside tmux, which is what makes them survive a server restart, a dropped connection, or a closed laptop. |
| An agent CLI | At least one of Claude Code, OpenCode, Codex, Antigravity, Gemini CLI, Pi, Grok Build, DeepSeek Harness, OMP. Plain shell sessions need none. See Agent CLIs. |
Codeman itself sends no telemetry and phones no home. The only network traffic is your browser to your server, and whatever the agent CLI you chose does on its own.
curl -fsSL https://getcodeman.com/install | bashThis installs Node.js, tmux and a build toolchain if they are missing (node-pty ships no
Linux prebuild, so it compiles from source), clones Codeman into ~/.codeman/app, and
builds it.
It starts by printing what it found (git, Node, tmux, build tools, agent CLIs, Tailscale, an existing install), then asks everything it needs up front, then does the work unattended. You can leave while it builds. What it asks you:
-
One consent for the missing packages. Git, Node.js, tmux and (on Linux) the build toolchain are installed after a single yes, and sudo asks for your password once for the whole run. Nothing is installed silently. If no agent CLI is found, a menu offers to install any of them (DeepSeek excepted: its npm package installs only a launcher with no runnable profile), or you skip and install one yourself later.
-
How the dashboard should be reachable. Three choices:
-
Tailscale (recommended for phone access): keeps the loopback bind, installs
Tailscale if needed, logs in, enables the tailnet HTTPS toggle (it opens the admin
page for you and waits; Ctrl+C there skips Tailscale for this run), then configures
tailscale serveafter the build and verifies the result end to end. If another app already owns:443on your node, you choose between a sub-path (https://<machine>.<tailnet>.ts.net/codeman, the default), a second port, replacing the other mapping, or skipping. -
Your local network (
0.0.0.0): prompts for a password. Skipping the password takes an explicit confirmation and ends on a loud warning. -
This machine only (
127.0.0.1): the safest option, and the default for a barecodeman webregardless of what you pick here.
Which one is preselected depends on what the installer finds. A fresh install defaults to the local network, unless Tailscale is already connected, in which case it defaults to Tailscale. An existing loopback install defaults to keeping loopback, or to Tailscale when a serve mapping for Codeman is already there. A bare Enter never pulls in new software, and a non-interactive run always keeps the safe loopback default.
-
Tailscale (recommended for phone access): keeps the loopback bind, installs
Tailscale if needed, logs in, enables the tailnet HTTPS toggle (it opens the admin
page for you and waits; Ctrl+C there skips Tailscale for this run), then configures
-
What to call this machine on your tailnet (Tailscale route only). By default the URL uses the machine's existing name. Answer yes to rename it
codeman-<hostname>; the default is no, because the tailnet name is also what SSH and everything else on that machine are reached by. -
Whether to run Codeman in the background. Enter installs a systemd user service or a macOS LaunchAgent that starts on boot; answering no offers to start it in this terminal instead, or not at all.
It ends on a screen with the URL (your tailnet, your network, or this machine), a QR code to scan with your phone, and the two commands you need to manage the service.
Re-running the same one-liner updates an existing install in place. Local changes in
~/.codeman/app are stashed rather than discarded, a running service is restarted and
verified, and your existing network binding is preserved. An interrupted first install
resumes instead of restarting.
Other entry points:
install.sh status # print the URLs, the QR code and the manage commands again
install.sh update # update only
install.sh uninstall # remove (offers to undo a rename it performed)
install.sh tailscale # retrofit Tailscale access onto an existing install
install.sh name [<n>] # rename this machine on your tailnet (default codeman-<hostname>)
install.sh cloudflared # install cloudflared for the in-app Cloudflare tunnelFlags answer the questions from the command line and pipe through bash -s --:
curl -fsSL https://getcodeman.com/install | bash -s -- --tailscale --service
curl -fsSL https://getcodeman.com/install | bash -s -- --lan --password 'x' --service
curl -fsSL https://getcodeman.com/install | bash -s -- --local --run--tailscale / --lan / --local answer the access question, --name <n> / --no-rename
the name, --service / --run / --no-start the last one. --yes takes every default
(it still waits on a Tailscale login URL, and a network bind still asks for a password).
--port <n> moves Codeman off 3000; the service file and the serve mapping follow it. On an
existing install, --port and --password re-run the setup so the service file picks them up,
and a re-run with --lan or --tailscale keeps the password the service already has.
Automation and CI: with no terminal attached, any step that would change the system
aborts with instructions instead of running silently. Set CODEMAN_NONINTERACTIVE=1 to
approve those steps. CODEMAN_TAILSCALE=1 preselects the Tailscale answer, and never
installs Tailscale itself non-interactively; a non-interactive run never renames the
machine and never starts a service. Everything the unattended steps print goes to
~/.codeman/install.log, and the last lines of it are shown when a step fails.
npm install -g aicodeman
codeman webThe npm package is named aicodeman; the product is Codeman. Both codeman and
aicodeman are installed as commands.
The trade-off against Route A: no guided network setup, and the in-app self-updater does
not apply. npm installs report as non-updatable in App Settings → System → Updates, and
you update with npm update -g aicodeman.
For contributing, or for running unreleased code.
git clone https://github.com/Ark0N/Codeman.git
cd Codeman
npm install # postinstall builds the vendored xterm addon bundles
npm run dev # dev server on http://localhost:3000For a production run from a clone:
npm run build
npm run startnpm run dev runs TypeScript directly through tsx with no build step. The frontend is
plain JavaScript served from src/web/public/ with no bundler, so editing a .js or .css
file and reloading the page is enough. The one exception is index.html, which is read once
at server start, so markup changes need a restart.
See Contributing for the rest of the development loop.
Codeman itself can run in a container and spawn Docker cases as sibling containers through
the host's Docker socket. Copy docker/.env.example to docker/.env, set
CODEMAN_PASSWORD, then:
bash docker/Start-Codeman.shRun the script again after updating rather than a plain docker compose up, so the rebuilt
image, the refreshed volumes and the entrypoint arrive together. The full guide, including
storage and networking options, is
docker/README.md.
Codeman drives CLIs, it does not bundle them. Install at least one:
| CLI | Install | Notes |
|---|---|---|
| Claude Code | npm i -g @anthropic-ai/claude-code |
The primary target. Some Codeman features are Claude-only: see Agent CLIs. |
| OpenCode | See opencode.ai | |
| Codex | See developers.openai.com/codex/cli | |
| Antigravity | See antigravity.google | Google's successor to the consumer Gemini CLI. |
| Gemini CLI | See github.com/google-gemini/gemini-cli | Enterprise only since Google's June 2026 consumer cutover. |
| Pi | See pi.dev | No permission prompts and no sandbox by design. Read Agent CLIs before using it on a repo you care about. |
| Grok Build | curl -fsSL https://x.ai/cli/install.sh | bash |
xAI. Lands in ~/.grok/bin; grok login --device-auth for headless hosts. |
| DeepSeek Harness |
npm i -g @deepseek-ai/dsh pnpm, then a terminal profile |
The npm package is only a launcher. Codeman's Run menu installs the community terminal profile for you. See Agent CLIs. |
| OMP | curl -fsSL https://omp.sh/install | sh |
Oh My Pi. Run it once by hand to finish its own onboarding. |
Log each CLI in once, by hand, before pointing Codeman at it. Codeman never collects or stores your CLI credentials.
codeman doctor # checks Node, tmux, the agent CLIs, document converters
codeman --version
codeman web # then open http://localhost:3000codeman doctor --json gives machine-readable output, and --category core narrows it to
the things a session cannot start without.
If the dashboard loads and + New Session opens, you are done. Continue to Quick Start.
| Path | What |
|---|---|
~/.codeman/app |
The installed code (installer route only). |
~/.codeman/ |
All state: state.json, settings, session history, push keys, TLS certs. See Core Concepts. |
~/codeman-cases/ |
Cases created from scratch. Linked cases stay wherever they already are. |
~/.codeman/web.log |
Log for a detached (-d) server. |
Everything is under your home directory, and nothing needs root.
A bare codeman web dies with the shell that started it. Two ways to outlive that:
codeman web -d # detached; --status and --stop manage it
codeman service install # systemd user unit or macOS LaunchAgent; survives rebootsFull detail, including logs and the self-updater, is in Running As A Service.
| Install route | How to update |
|---|---|
| Installer | Re-run the one-liner, or App Settings → System → Updates in the UI. |
| npm | npm update -g aicodeman |
| git clone |
git pull && npm install && npm run build, then restart. |
| Docker Compose | Re-run Start-Codeman.sh. The in-app updater works too, and refuses a release that changes the container definition until you re-run the script. |
The in-app updater covers git-clone installs supervised by systemd or launchd. It restarts the process that is running it, so the actual work happens in a detached script and the browser polls across the restart. Progress appears in the UI.
install.sh uninstall # installer route
npm uninstall -g aicodeman # npm routeNeither removes ~/.codeman/ or ~/codeman-cases/. Delete those by hand if you want the
state and your case folders gone as well, and check ~/codeman-cases/ first: linked cases
point at directories you already had, but cases created from scratch have their only copy
there.
Running tmux sessions are not killed by an uninstall. tmux -L codeman kill-server ends
them.
wsl bash -c "curl -fsSL https://getcodeman.com/install | bash"Codeman requires tmux, so Windows runs it inside
WSL2. If you do not have WSL yet:
run wsl --install in an admin PowerShell, reboot, open Ubuntu, and install your agent CLI
inside WSL. http://localhost:3000 then works from your Windows browser.
Work inside the Linux filesystem (~/project), not /mnt/c/.... Filesystem watching and
git are both dramatically slower across the Windows mount, and agents notice.
Error: posix_spawnp failed. on every session start. node-pty publishes its macOS
spawn-helper without the executable bit, and macOS launches every PTY through it. Codeman
detects this and repairs it automatically on the first failure. If you hit it on a clone
install and want to fix it by hand:
npm run fix:node-ptyThis is a chmod, not a rebuild. Look in prebuilds/darwin-<arch>/, not
build/Release/, which does not exist on macOS. Linux cannot reproduce this.
launchd and PATH. A LaunchAgent gets /usr/bin:/bin:/usr/sbin:/sbin, which finds
neither a Homebrew or nvm node nor tmux or claude. codeman service install bakes
your current PATH into the unit for exactly this reason, so prefer it over a hand-written
plist.
-
tmux: command not foundafter a successful install. The installer asks before installing packages, and a declined prompt is a valid answer it remembers. Install tmux and re-run. -
Port 3000 in use.
codeman web --port 8080, or setCODEMAN_PORT. -
Two Codemans on one machine. The data directory and the tmux socket are both process
wide, so a second instance discovers and attaches the first one's live sessions. Give each
a distinct
CODEMAN_INSTANCEbefore starting a second. See Core Concepts. -
The dashboard is not reachable from your phone. That is the default, not a fault. The
server binds
127.0.0.1. See Remote Access.
- Quick Start - your first working session.
- Agent CLIs - picking and setting up a run mode.
- Remote Access - reaching it from another device.
- Troubleshooting - when the above did not go as written.
Documents Codeman 1.31.x. Something wrong or missing on this page? These pages are
generated from docs/wiki/ in
the main repository, so browser edits here are overwritten on the next sync. Send a pull
request against that directory instead, or open a
Discussion.
Getting started
Using it
- The Dashboard
- Agent CLIs
- Custom Model Endpoints
- Working With Files
- Input And Voice
- Mobile Guide
- Keyboard Shortcuts
- Settings Reference
Keeping agents running
Where it runs
Access & security
Automation
Operating it