A coding agent in a box, one command away.
lux creates or resumes a Luxor sandbox, starts your coding agent in tmux on the inference provider you picked, and puts you straight into it. Name your agents, switch providers without touching a config file, and never hit a paused box.
$curl -fsSL https://luxcode.org/install.sh | sh
Installs lux into ~/.local/bin. Needs the Luxor CLI (the tenki command) and jq. llms.txt for agents.
21 terminal agents and 5 web UIs, each in its own sandbox
Two pillars. One command.
The Luxor CLI has every primitive: create, resume, exec, ssh, snapshots, volumes. luxcode is the glue that turns them into a coding agent you can reach from anywhere.
Create or resume, never an error
Every command routes through one path that creates a missing sandbox, resumes a paused one and waits out a pending one. Boxes pause by themselves two hours after each create or resume and wake on your next command. New boxes start from a golden image with tmux already in it.
Your harness, your provider
Pick a terminal agent or a web UI, then the inference provider: the harness default, or Nebius, Boundless, Baseten, Friendli and OpenRouter, written into the harness's own config inside the box. The agent runs in tmux, so it survives disconnects and pauses; lux <agent> drops you back into the same conversation.
Every coding agent. Each one gets its own box.
lux new asks terminal or web first, then the harness. Boxes are named after the agent and are independent.
Installed on first use
Claude Code, Codex and opencode come with the base image; the rest install into the box the first time, once.
The box is the harness
Luxor's pre-built sandbox images, pinned and ready. The agent's box is created straight from the image, with its key or a sign-in inside.
Served from the box
Reached through an ssh tunnel your browser opens on. Nothing is public until lux <agent> url makes a Luxor preview link.
The harness default, or bring your own models
Every provider below works with every harness that takes a custom endpoint. Keys are asked for once and kept locally with mode 0600.
| Provider | Key | Default model | Note |
|---|---|---|---|
| Harness defaults | sign in or configure inside the box | harness default | Anthropic for Claude Code (the only Remote Control), OpenAI for Codex, GitHub for Copilot, Google for Gemini, xAI for Grok Build, Prime Intellect for Prime Agent, … |
| Nebius Token Factory | NEBIUS_API_KEY | moonshotai/Kimi-K3 | no Anthropic API: Claude Code goes through a translation proxy in the box |
| Boundless | BOUNDLESS_API_KEY | claude-fable-5.1 | Anthropic and OpenAI APIs |
| Baseten | BASETEN_API_KEY | moonshotai/Kimi-K3 | Anthropic API in beta |
| Friendli | FRIENDLI_TOKEN | zai-org/GLM-5.3 | |
| OpenRouter | OPENROUTER_API_KEY | anthropic/claude-fable-5.1 | every model behind one key |
Three commands from zero to a running agent.
lux pick an agent (or create one) and jump into it lux new [cli|web|harness] create: terminal or web → harness → provider → model → size → volume → name lux <harness> [action] a harness: your agent for it, or a new one lux <agent> [action] a specific agent by name up (default) create or resume the box, start the agent, attach ssh same as up (attach to the running agent) shell plain shell in the box run -- <prompt> one-shot headless prompt status agent, provider, box state provider switch inference provider (and model) model [id] switch model size [name] box size; applies when the box is created volume [GiB|none] persistent volume at ~/work: add one, or drop it url [off] web UIs: a public Luxor preview link, or remove it auth sign in / store the provider key down | pause pause the box (auto-resumed next time) rm | stop | kill terminate the box and forget the agent (--purge deletes the volume) lux ls list agents and their boxes lux pause --all pause every agent's box lux rm --all [--purge] terminate every box and forget every agent lux image [build [--full]] the golden image (Luxor base + tmux) new boxes start from
small 2 vCPU / 4 GiB · medium 4 / 8 (default) · large 8 / 16 · xlarge 12 / 32 · xxlarge 16 / 64. A box is not resized in place: size applies on the next create.
A persistent volume at ~/work (10, 25 or 50 GiB) that survives pause, rm and resizing. The agent starts there. A volume keeps its size for life, so pick generously.
lux nebius-codex run -- "fix the failing test" runs one prompt and exits. Toolkits take raw arguments: lux tinyfish run -- fetch content get https://…
Boxes pause by themselves and wake on your next command
Luxor pauses a box two hours after it was created or last resumed, the workspace cap. Every lux command resumes a paused box first, and the timer starts again. tmux and the agent's session survive it; /tmp and open connections do not. For a job that must run unattended for longer, create the agent with LUXCODE_STICKY=1.
LUXCODE_HARNESS | claude | harness used when you omit one |
LUXCODE_SIZE | medium | default box size offered |
LUXCODE_VOLUME_GB | 10 | default volume size offered (0 = none) |
LUXCODE_DISK_GB | 20 | root disk |
LUXCODE_IMAGE | — | force one registry image for every harness without its own |
LUXCODE_MAX_DURATION | 2h | pause this long after each create or resume (Luxor's cap) |
LUXCODE_PAUSE_RETENTION | 720h | how long a paused box is kept |
LUXCODE_STICKY | 0 | 1 creates boxes that never pause by themselves |
Your Luxor account, your keys, your sandbox.
luxcode is free and open source. It is the same tool as colincode, installed as lux.
