Skip to content

Run Aider on a remote server

AI pair programming in a terminal that stays put, with git keeping score.

Deploy on exe.dev

Shelley handles the setup. About 5 minutes.

Prefer a terminal?
curl -fsSL https://exe-staging.dev/deploy/aider/prompt.txt | ssh exe.dev new --prompt=/dev/stdin

Aider is an open-source AI pair programmer for the terminal. You add files to the chat and describe a change; aider edits them and commits the result to git with a descriptive message, so every step is easy to review or undo.

On an exe.dev VM it reaches Claude and GPT through exe.dev's LLM integration: no API keys to paste, and model usage billed to your exe.dev account. The session lives in tmux on the VM, so you can close your laptop and pick up where you left off from any computer.

What you get#

  • Aider connected to Claude and GPT models, with no API key to paste
  • A Git repository at ~/project on persistent disk, where aider commits its changes
  • An aider tmux session that survives disconnects
What's running, and where
Private ssh my-aider.exe.xyz your terminal
my-aider.exe.xyz exe.dev VM
Aider installed with uv; connected to exe.dev's LLM integration ~/.aider.conf.yml
Your project a Git repository; aider commits each change ~/project
tmux keeps your terminal session running when you disconnect

Deploy with Shelley#

Click Deploy and Shelley will set up Aider on a new VM, then check that it works. No config-file wrangling required.

Prefer a terminal?
curl -fsSL \
  https://exe-staging.dev/deploy/aider/prompt.txt \
  | ssh exe.dev new --prompt=/dev/stdin
What Shelley is told
Set up Aider on this VM by following the exe.dev recipe at https://exe-staging.dev/deploy/aider.md from top to bottom.

The recipe's example VM name is my-aider. This VM's name is the output of `hostname`: use it wherever the recipe writes my-aider. Skip the step that creates the VM; you are on it.

You are done when all of these are true. Check each one yourself:
- Aider connected to Claude and GPT models, with no API key to paste
- A Git repository at `~/project` on persistent disk, where aider commits its changes
- An `aider` tmux session that survives disconnects

Run the VM-side setup in "Start coding". If `~/.aider.conf.yml` or
`~/.aider.model.settings.yml` already exists and differs from the
recipe's, show the owner the difference and ask before replacing it. If
`git config --global user.email` already prints an address, skip the
git identity step. If `~/project` already exists, reuse it and only make
the first commit when it has no commits. Create tmux detached
(`tmux new -d -s aider -c ~/project`) rather than attaching. Reuse the
session if it already exists. Do not launch interactive aider. Verify in
a scratch repository, not ~/project, so the owner's history stays clean:
`git init /tmp/aider-check && cd /tmp/aider-check && aider --yes-always
--message "Reply with exactly: OK"` must print OK and no error; then
`rm -rf /tmp/aider-check`. Check `tmux has-session -t aider`. Skip the
later optional sections and FAQ. Finish with the SSH command from "Take
a break", using this VM's name, and tell the owner to run `aider` inside
it.

Finish with the URLs I should open.

Also at /deploy/aider/prompt.txt. The recipe it follows is /deploy/aider.md.

Start coding#

On your computer, create a VM and connect. Pick any free name; if you've already clicked Deploy or have a VM, skip the first command and use its name:

ssh exe.dev new --name=my-aider
ssh my-aider.exe.xyz

On the VM, install aider with uv, as aider's install guide suggests. The browser extra adds the optional browser version:

uv tool install --force --python python3.12 --with pip "aider-chat[browser]~=0.86"
aider --version

It prints aider 0.86.2 or later. Now point aider at exe.dev's LLM gateway. The keys are placeholders: the gateway adds the real credentials on the way out. The second file describes models newer than aider itself; without it, aider sends them settings they reject:

cat > ~/.aider.conf.yml <<'EOF'
# Models come from exe.dev's LLM integration; the keys are placeholders.
model: sonnet
alias:
  - sonnet:anthropic/claude-sonnet-5-5
  - opus:anthropic/claude-opus-5-5
  - haiku:anthropic/claude-haiku-5-5
  - gpt:openai/gpt-6.1-sol
  - luna:openai/gpt-6-luna
api-key:
  - anthropic=exe-gateway
  - openai=exe-gateway
set-env:
  - ANTHROPIC_API_BASE=https://llm.int.exe.xyz
openai-api-base: https://llm.int.exe.xyz/v1
EOF
cat > ~/.aider.model.settings.yml <<'EOF'
# How to talk to models newer than aider.
- name: anthropic/claude-sonnet-5-5
  edit_format: diff
  weak_model_name: anthropic/claude-haiku-5-5
  use_repo_map: true
  use_temperature: false
  cache_control: true
  extra_params:
    max_tokens: 64000
- name: anthropic/claude-opus-5-5
  edit_format: diff
  weak_model_name: anthropic/claude-haiku-5-5
  use_repo_map: true
  use_temperature: false
  cache_control: true
  extra_params:
    max_tokens: 64000
- name: anthropic/claude-haiku-5-5
  edit_format: diff
  weak_model_name: anthropic/claude-haiku-5-5
  use_repo_map: true
  use_temperature: false
  cache_control: true
  extra_params:
    max_tokens: 64000
- name: openai/gpt-6.1-sol
  edit_format: diff
  weak_model_name: openai/gpt-6-luna
  use_repo_map: true
  use_temperature: false
  accepts_settings: [reasoning_effort]
- name: openai/gpt-6-luna
  edit_format: diff
  weak_model_name: openai/gpt-6-luna
  use_repo_map: true
  use_temperature: false
  accepts_settings: [reasoning_effort]
EOF

Aider commits every change it makes, so tell git who you are. This uses the email address of your exe.dev account, from the VM's reflection integration; run the same git config commands with other values if your GitHub account uses a different one:

email=$(curl -s https://reflection.int.exe.xyz/email | jq -r .email)
git config --global user.email "$email"
git config --global user.name "${email%@*}"
git config --global user.email

It prints your address. Make a project, give it a first commit (aider compares each change with the commit before it), and open a tmux session:

git init ~/project
git -C ~/project commit --allow-empty -m "Start project"
tmux new -A -s aider -c ~/project

Inside that session, start aider:

aider

The first time, it offers to add .aider* to .gitignore, which keeps its chat history out of your commits: answer Yes. The header shows Main model: anthropic/claude-sonnet-5-5. Give it a small task. For example:

Build a tiny website for a bakery that only sells one kind of bread.

Aider writes the files and commits them. Type /diff to see what changed, /undo to throw the last change away, and /help for the rest of its commands. Your files live in ~/project.

Take a break#

Press Ctrl-b, then d to detach. Aider stays running on the VM when you disconnect, with the chat as you left it. On your computer, use this command to hop back in:

ssh -t my-aider.exe.xyz 'tmux new -A -s aider -c ~/project'

A VM restart ends the running session, but not your files, commits, or chat log. Reconnect and run aider --restore-chat-history from your project's folder on the VM to pick up the conversation.

Work on a GitHub repo#

The GitHub integration lets the VM clone and push a repository with no GitHub token on the VM. Link your GitHub account on the Integrations page, then give this VM one repository. On your computer, with your repository in place of you/myapp:

ssh exe.dev integrations add github --name myapp --repository you/myapp --attach vm:my-aider

On the VM, clone it through the integration and work on a branch:

git clone https://github.int.exe.xyz/you/myapp.git ~/myapp
cd ~/myapp
git switch -c aider-changes
tmux new -A -s myapp -c ~/myapp

Run aider in that session and ask for a change. Name the files it should edit, or let it find them with its repository map. When you're happy, push the branch and open a pull request with gh, which goes through the same integration:

git push -u origin aider-changes
GH_HOST=github.int.exe.xyz gh pr create --fill --repo you/myapp

Commits carry your git identity, with (aider) added to the author name of the ones aider wrote. Pushes and the pull request show up as exe-dev-github-integration[bot] unless you add --act-as-user to the integration.

Let it make VMs#

Aider doesn't use MCP, so it can't connect to exe.dev's MCP server the way Codex or Claude Code can. But aider can suggest shell commands and run them when you say yes, and ssh exe.dev is a shell command. Give the VM an SSH key of its own for exe.dev. On the VM:

ssh-keygen -q -t ed25519 -N "" -C "aider-$(hostname)" -f ~/.ssh/exe_aider
grep -qs '^Host exe.dev' ~/.ssh/config || cat >> ~/.ssh/config <<'EOF'
Host exe.dev *.exe.xyz
  IdentityFile ~/.ssh/exe_aider
  StrictHostKeyChecking accept-new
EOF

On your computer, add that key to your exe.dev account, limited to VMs tagged aider and to a few commands, for 30 days:

ssh my-aider.exe.xyz cat .ssh/exe_aider.pub |
  ssh exe.dev ssh-key add --tag=aider --exp=30d '--cmds="help,whoami,ls,new,rm,ssh,stat,share show"'

VMs the key creates get the tag aider; your other VMs are "not found" to it, and it can't make anything public. Back on the VM, ssh exe.dev whoami shows the key as current. Now ask aider for something that needs a machine of its own:

Make a new exe.dev VM with ssh exe.dev new, install PostgreSQL on it, and check that it's running.

Aider lists the commands it wants to run and asks before it runs them, even with --yes-always, so nothing runs without you. Answer Yes to run them, and yes again to show aider the output. To revoke the key, run ssh exe.dev ssh-key remove aider-my-aider on your computer.

Open it in your browser#

Aider also has an experimental browser version: a chat page for one project. To run it for ~/project all the time, on the VM:

sudo tee /etc/systemd/system/aider-browser.service >/dev/null <<'EOF'
[Unit]
Description=Aider in the browser, for ~/project
After=network-online.target
Wants=network-online.target

[Service]
User=exedev
WorkingDirectory=/home/exedev/project
ExecStart=/home/exedev/.local/bin/aider --browser
Restart=on-failure

[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable --now aider-browser

Then open https://my-aider.exe.xyz:8501/. exe.dev asks you to log in, because port 8501 is private to people with access to the VM. Ask for a change as in the terminal; aider edits and commits the same way.

The browser version and a terminal aider each keep their own chat, so give one project to one of them at a time. To use it for another project, change WorkingDirectory and run sudo systemctl restart aider-browser.

Warning

Anyone who can open port 8501 can change your code. Leave it private.

Make yourself at home#

  • Pick a model: type /model opus, /model gpt or /model luna in aider, or start it with aider --model haiku for quick, cheap work. Change model in ~/.aider.conf.yml to set the default. exe.dev keeps a list of available models and prices; aider's own cost figures are estimates.
  • Plan with one model, edit with another: aider --architect --model opus --editor-model sonnet has the first model work out a change and the second apply it. See aider's chat modes.
  • Edit in your own editor: open the VM in VS Code or code-server, start aider --watch-files, and write a comment ending in AI! in any file. Aider makes the change it describes. See IDE integration.
  • Let it run your tests: aider --test-cmd "npm test" --auto-test runs your tests after each change and asks the model to fix what fails.
  • Peek at your app: ask aider to make it listen on 0.0.0.0:8000, start it in a second tmux window (Ctrl-b, then c), and open https://my-aider.exe.xyz/. It's private by default. More about previews.
  • Script it: aider --yes-always --message "Add type hints to utils.py" utils.py makes one change, commits it, and exits. See scripting aider.

For everything else, head to aider's docs.

Frequently asked questions#

Can I use my own Anthropic or OpenAI API key?

Yes, without putting it on the VM: store it in an LLM integration as API Key and keep the same base URLs; usage is then billed by the provider. To call a provider directly instead, delete its api-key line (and the ANTHROPIC_API_BASE or openai-api-base line) from ~/.aider.conf.yml and follow aider's API key docs.

Why does aider need a model settings file?

Aider ships with settings for the models it knew when it was released. For newer models it falls back to defaults that some of them reject, such as temperature is deprecated for this model. ~/.aider.model.settings.yml tells aider how to talk to each one. To add a model from exe.dev's model list, copy an entry, change name, and start aider with --model and the new name.

Can aider work on its own while I'm away?

Not really. Aider is a pair programmer: it edits the files you add to the chat, suggests shell commands, and asks before it runs them. It finishes the reply it's working on after you detach, then waits for you. For longer unattended work, try Codex, Claude Code or OpenCode on the same VM; they're preinstalled or one command away.

How do I update aider?

On the VM, run uv tool upgrade aider-chat. It stays within 0.x releases; for a later major version, run the install command from "Start coding" with the new version. Your settings and chat history stay put.

Something's not working. Where do I look?

Run aider --verbose from your project to see which settings files and models it loaded. An error naming a model usually means it's missing from ~/.aider.model.settings.yml, or isn't in exe.dev's model list. curl https://llm.int.exe.xyz/v1/models on the VM shows whether the LLM integration is attached. For the browser version, journalctl -u aider-browser has its log.

How do I back up my work?

Aider commits every change, so push your repository somewhere, such as GitHub. For a copy of the whole VM, run ssh exe.dev cp my-aider my-aider-backup on your computer (choose a free backup name). To use that copy, connect with ssh my-aider-backup.exe.xyz; your files, settings and chat history are there. Reattach any VM-specific integrations.

Updated Oct 30, 2026 · tested end to end Oct 30, 2026 · Markdown · manifest.json · Something wrong? Tell us