Run Meta's Muse Code on a remote server
Meta's coding agent, on a computer that stays up all night.
Shelley handles the setup. About 5 minutes.
Prefer a terminal?
curl -fsSL https://exe-staging.dev/deploy/muse-code/prompt.txt | ssh exe.dev new --prompt=/dev/stdinMuse Code is Meta's terminal coding
agent, in the same family as Claude Code and Codex. Meta
released it
on August 5, 2026 alongside Muse Spark 1.2; it now also runs Muse Spark 1.3
and Muse Wonder. It's built for long jobs: /goal keeps the agent working
until a goal is met, /loop reruns a prompt on a schedule, subagents work
in parallel (each in its own git worktree when they write), and every
session is an append-only event log, so a crashed run resumes where it
stopped.
All of that works best on a computer that stays on. On an exe.dev VM, Muse
runs in tmux on a persistent disk: close your laptop, and the goal, the
loops, and the subagents keep going. SSH back in and reattach. If the VM
ever restarts, the event log is still on disk and muse resume --last
carries on.
What you get#
- Muse Code installed with Meta's official installer, answering a test prompt with no account
- A project folder at
~/projecton persistent disk - A
musetmux session that survives disconnects, ready for you to sign in to Meta
What's running, and where
ssh my-muse-code.exe.xyz
your terminal, with Muse in a tmux session
muse 1.4, Meta's official installer; updates itself
Deploy with Shelley#
Click Deploy and Shelley will set up Muse Code on a new VM, then check that it works. No config-file wrangling required.
Prefer a terminal?
curl -fsSL \
https://exe-staging.dev/deploy/muse-code/prompt.txt \
| ssh exe.dev new --prompt=/dev/stdinWhat Shelley is told
Set up Muse Code on this VM by following the exe.dev recipe at https://exe-staging.dev/deploy/muse-code.md from top to bottom.
The recipe's example VM name is my-muse-code. This VM's name is the output of `hostname`: use it wherever the recipe writes my-muse-code. Skip the step that creates the VM; you are on it.
You are done when all of these are true. Check each one yourself:
- Muse Code installed with Meta's official installer, answering a test prompt with no account
- A project folder at `~/project` on persistent disk
- A `muse` tmux session that survives disconnects, ready for you to sign in to Meta
Run only the VM-side commands in "Install Muse Code" (skip VM creation
and SSH). If ~/project already exists, use it as it is. Create tmux
detached (`tmux new -d -s muse -c ~/project`) rather than attaching,
and reuse the session if it exists. Do not start interactive `muse`,
run `muse login`, or ask for a Meta API key: signing in is the owner's
step. Don't change an existing ~/.config/muse.
Verify `~/.local/bin/muse --version` prints a version and, from
~/project, `~/.local/bin/muse exec --provider echo --trust-workspace
'ready'` prints `echo: ready` (no account needed). Check
`tmux has-session -t muse`. Skip the later optional sections and FAQ.
Finish with the SSH command from "Leave it running", using this VM's
name, and tell the owner to run `muse` inside it and sign in.
Finish with the URLs I should open.
Also at /deploy/muse-code/prompt.txt. The recipe it follows is /deploy/muse-code.md.
Install Muse Code#
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-muse-code
ssh my-muse-code.exe.xyz
On the VM, install Muse Code with Meta's installer, make a project folder, and open a tmux session:
curl -fsSL https://dev.meta.ai/install.sh | bash
source ~/.bashrc
muse --version
mkdir -p ~/project && git -C ~/project init -q
tmux new -A -s muse -c ~/project
muse --version should print Muse Code 1.4.18 or newer. The installer
puts a launcher at ~/.local/bin/muse and adds that folder to your PATH.
Sign in and start coding#
Inside the tmux session, start Muse:
muse
It asks whether to trust the folder (choose Trust and continue), then
how to sign in. Sign in with your browser works over SSH: Muse prints a
https://auth.meta.com/oauth/device/... link and a code. Open the link on
your computer, check the code matches, and approve. You can also run
muse login for the same flow. Muse keeps the sign-in in
~/.config/muse on the VM. A Muse Code subscription works only through
this sign-in.
Then give it a task. For example:
Build a small command-line tool that prints the weather for a city, with tests.
For longer work, set a goal and let it run:
/goal Add a JSON output flag and make every test pass
Commands run in Muse's OS sandbox, which works on exe.dev VMs as it is: the agent can write in the project folder and its temp directory, and the rest of the disk is read-only to it. Risky commands and new network destinations need approval, and its automated reviewer clears the safe ones. See Permissions and safety for the other profiles.
Muse reads AGENTS.md or CLAUDE.md for project instructions (muse init
writes a starter AGENTS.md). It also reads your personal Claude Code
rules; on exe.dev those include notes on how the VM's HTTPS proxy works.
Leave it running#
Press Ctrl-b, then d to detach. Muse keeps working on the VM while you're gone. On your computer, use this command to hop back in:
ssh -t my-muse-code.exe.xyz 'tmux new -A -s muse -c ~/project'
When you come back after a couple of minutes away, Muse shows a recap of
what happened. /tasks and /subagents show background work, and /stop
stops background commands (Esc only interrupts the current turn).
A VM restart ends the tmux session but not your work. Reconnect and, from the project folder, run:
muse resume --last
Muse rebuilds the conversation from its log, notes that the last run ended abnormally, and continues. Meta's docs warn that an interrupted step with side effects is marked as unknown for the agent to check, not repeated blindly.
For a second, independent task, open another tmux window (Ctrl-b, then
c) and start muse in another folder or git worktree. Named sessions
can send each other handoffs with
session messaging.
Make yourself at home#
- Bring your code: connect a GitHub repo
and clone it with
git clone https://github.int.exe.xyz/you/repo.git. No GitHub token goes on the VM. Muse won't commit or push unless you ask, andGH_HOST=github.int.exe.xyzlets it useghfor pull requests. - Peek at your app: the sandbox's default network mode keeps ports the
agent opens inside the sandbox, so a dev server it starts isn't reachable
from your browser. Either start the server yourself in another tmux
window, or start Muse with
muse --sandbox-network enabled, which lets sandboxed commands use the network freely. Then serve on0.0.0.0:8000and openhttps://my-muse-code.exe.xyz/, which only you can reach. More about previews. - Run it headless:
muse exec "Run the tests and fix what fails"runs one prompt to the end, for scripts and cron. Add--max-model-stepsto cap a run, andmuse exec --session-id <uuid> "Continue."resumes one. See headless and CI. - One VM per task:
ssh exe.dev cp my-muse-code my-muse-code-2copies the VM, with Muse, its sign-in, and your code, so a risky job can't touch the original. Or give an agent exe.dev's MCP server with a token limited to one tag, and it can make VMs of its own. - Shelley is here too: exe.dev's own agent runs on the same VM at
https://my-muse-code.shelley.exe.xyz/, and Claude Code and Codex are preinstalled, all on exe.dev's LLM integration with no key. Use one for a second opinion on what Muse built.
Other agents with pages here: Claude Code, Codex, Gemini CLI, Kimi Code, and the rest of the AI agents category.
Keep a Meta API key off the VM#
Pay-as-you-go accounts can use a Meta API key instead of signing in, and
Meta Managed Account (Business & Enterprise) users must. muse auth set --api-key-stdin would store the key on the VM. To keep it at exe.dev's
edge instead, put it in an HTTP proxy integration
and point Muse at the integration.
On your computer, create the integration; paste the key at the prompt:
printf 'Meta API key: '; read -rs K; echo
printf %s "$K" | ssh exe.dev integrations add http-proxy --name meta-api \
--target https://api.meta.ai --bearer=- --attach vm:my-muse-code
unset K
On the VM, point Muse's Meta provider at it and give Muse a placeholder
key; the integration sends the real one to Meta. This adds one setting to
~/.config/muse/settings.json, which Muse creates on its first run:
f=~/.config/muse/settings.json
mkdir -p ~/.config/muse
[ -f $f ] || echo '{"schema_version": 1}' > $f
jq '.endpoint_transport.base_url = "https://meta-api.int.exe.xyz/v1"' $f > $f.new && mv $f.new $f
echo 'export META_API_KEY=kept-by-exe-dev' >> ~/.bashrc
source ~/.bashrc
cd ~/project && muse exec "Reply with exactly: OK"
An environment key takes priority over a browser sign-in, so use one or
the other. muse exec asks you to trust the folder the first time; run
muse once there, or add --trust-workspace.
Note
We checked that Muse sends its requests to the integration's address with this setting, but haven't run it with a real Meta API key.
Troubleshooting#
Read-only file system: the sandbox at work. Startmusefrom the folder it should write to; the rest of the disk, and.gitinside the project, are read-only to sandboxed commands.failed to fetch model catalog: authentication failed: the key inMETA_API_KEYwas rejected. It takes priority over a sign-in, so unset it to use your browser sign-in, or fix it.workspace trust ... is undecidedfrommuse exec: runmuseonce in that folder and trust it, or pass--trust-workspace.- A preview doesn't load: see "Peek at your app" above.
invalid value 'unrestricted' for '--sandbox-network': Meta's docs use the new name; version 1.4.18 still wantsenabled.- Anything else:
MUSE_TRANSPORT_TRACE=1 muse ...prints the requests to Meta's API, with credentials scrubbed, and Muse keeps its own logs in~/.local/share/muse/local-tracing./feedbackreports a bug to Meta.
Frequently asked questions#
Can I use exe.dev's LLM integration instead of a Meta account?
No. Muse Code only talks to Meta's Model API (its --provider choices are meta, a test echo provider, and a local option that is disabled behind an experiment), and the LLM integration serves OpenAI, Anthropic and Fireworks models. Sign in with your Meta account, or keep a Meta API key in an HTTP proxy integration as shown above. Claude Code and Codex, preinstalled on the VM, do use the LLM integration with no key.
What does it cost?
Your VM plan plus Meta's charges. Muse Code has monthly subscriptions (Everyday, High, Power and Maximum Usage) or pay-as-you-go billing: Muse Spark is $1.25 per million input tokens and $4.25 per million output in Standard mode, and its -contributor models are $0.10 and $0.20. Its background observer agents make model calls of their own.
What is Contributor mode?
Meta's cheaper tier: you get more usage, or lower token prices, and Meta may use your prompts, code, files and the responses to train future models. In Standard mode it doesn't. Subscriptions default to Contributor mode, and Meta's docs say the first interactive session on a new computer turns it on, so a new VM counts. Switch it in /settings under Model, or per run with --contributor-mode off. On pay-as-you-go, you choose by model ID (muse-spark-1.3 or muse-spark-1.3-contributor).
Does it keep working when I close my laptop?
Yes, while the VM is up: Muse runs in tmux on the VM, not on your laptop, so turns, subagents, /goal and /loop carry on. A VM restart stops the process; muse resume --last from the project folder picks the session up again from its event log.
How do I update Muse Code?
The muse launcher checks for a new release at most once an hour when you start it and updates in the background. To update right away, rerun the installer. Set MUSE_NO_AUTO_UPDATE=1 to stop automatic updates. See Meta's changelog.
How do I back up my work?
Commit and push your code. For a copy of the whole VM, including Muse's sessions and sign-in, run ssh exe.dev cp my-muse-code my-muse-code-backup on your computer. Reattach any VM-specific integrations to the copy.
Updated Nov 13, 2026 · tested end to end Nov 13, 2026 · Markdown · manifest.json · Something wrong? Tell us