unpack · execute · debug
Any git ref, running locally in one command
uxd turns a PR number, a branch, a commit, a URL, or a path into an isolated git worktree — dependencies installed, ports allocated, dev server up.
Terminal
uxd my-project 42 code
uxd my-project 42 run dev
uxd my-project clean --merged
Every command is the same three steps
One pipeline behind every verb. Learn it once and the whole CLI is predictable.
- resolve the refA PR number, a branch, a 40-char SHA, a URL, or a local path becomes one concrete git target. First match wins.
- materialize the workspaceA worktree exists, with dependencies installed, seed files copied, and ports allocated. Idempotent — and cheap when it already exists.
- act on itOpen an editor, run a configured command, exec, drop into a shell, diff, or sync.
checkoutis this pipeline with a no-op act step.
Any ref you can name
If you can point at it, uxd can run it. No cloning, no stashing, no "let me finish what I'm doing first".
- Six kinds of refPR numbers, branches, SHAs, GitHub URLs, local paths, and
-for the last ref you used. - Paste the URLA GitHub PR or tree URL carries the project and the ref, so one argument is the whole command.
Six ways to name the same thing
uxd my-project 42 # pull request
uxd my-project feat/login # branch
uxd my-project 1a2b3c… # 40-char SHA
uxd my-project - shell # last used ref
uxd …/pull/42 code # straight from a URL
Isolated by construction
Three branches can run at once without fighting over a port or a node_modules.
- A port of its ownuxd allocates free ports, exported as
$UXD_PORTand templated into your commands. - Setup that remembers
cache_keyglobs mean installs rerun only when the lockfile actually moves.
~/.config/uxd/projects/acme-web.toml
[ports]
count = 1
[env]
PORT = "{port}"
From open to disposed
A workspace has a lifespan. uxd covers all of it, then cleans up after itself.
- One verb per intent
code,run,shell,exec,diff,sync— each materializes first, so there is no wrong order. - See the whole board
listshows every workspace with its branch, port, age, PR state and CI mark. - Reclaim the disk
clean --merged,--closed,--older-than 7d. Prints a plan, asks first, skips dirty trees.
Runs on the stack you already have
No new runtime, no daemon, no account.
- Stock Node, plain gitNode ≥ 18 and git ≥ 2.38. Install it with npm, pnpm, or yarn — no Bun or Deno required.
ghoptionalWith it you get PR state, CI marks, and true PR diffs. Without it, every feature degrades gracefully.- One TOML per projectCommands, env, hooks, editor, ports — versioned as text, validated in aggregate by
config validate.
Materialize your first workspace
uxd setup creates the config dir, scaffolds your first project file, and prints the next command to run.