← Tools

Compute offload

jat-appliance

The box — one machine turned into a private compute + inference node.

Install jat install appliance
Source →

Agents are cheap to run in parallel until the work itself is heavy — a full build, a video render, a typecheck across a large repo. Run that on the same box that's editing and orchestrating, and you fight your own agents for memory. jat-appliance turns a spare machine into a dedicated compute node on your Tailscale network: a place to send builds, renders, and private LLM inference so the editing box stays responsive.

The box

jat-appliance is one node — a single machine turned into a private compute + inference box on your tailnet.

The fabric

jat.run is the networked plural — many appliances pooled behind one endpoint. Add a box, add capacity.

Stateless by design

The appliance runs a ROM-model: it holds no project state of its own. Every job rsyncs a workdir up, runs niced and at background QoS so a live inference request always wins contention, and rsyncs results back down. If the appliance is unreachable or a remote job fails, the caller falls back to running locally rather than hard-failing — the appliance is an accelerator, never a dependency.

01

rsync up

workdir syncs to the appliance

02

run niced

background QoS — live inference always wins

03

rsync back

results land in place, no state left behind

Setup

Point it at any always-on machine on your tailnet — a Mac, a Framework, a mini-PC, any capable box you dedicate. It joins the mesh, exposes an inference relay, and becomes a valid offload target for every project on the tailnet. Check it's live:

jat-appliance status
appliance online — tailnet reachable, relay healthy

Offload usage

Once it's up, any tool that knows how to offload will use it automatically. A few of the built-ins:

jat-offload ./project -- npm run build

run an arbitrary heavy command in a workdir on the appliance

jat-typecheck --timing

offload a svelte-check / tsc pass, machine output on stdout

jat-render ./episode

offload a HyperFrames render — mp4 lands back in ./renders/

Local node_modules and build artifacts are excluded from the sync — the appliance installs its own dependencies and caches them for fast repeat runs.

Which tool sends what

The model is simple. The appliance runs your heavy work off your main box, and there are two ways in. When a purpose-built tool exists for the job, reach for it: speak, jat-image-edit, jat-render, jat-video, and jat-typecheck each know how to hand their work to the appliance and bring the result home. For anything else, jat-offload runs an arbitrary command there the same way. Several of the purpose-built tools call jat-offload under the hood, so it is the floor the whole model rests on.

How it fits

One appliance is one box. Pool many of them across your tailnet and the individual nodes disappear into jat.run's mesh — any agent, anywhere, offloads to whichever node has capacity. It's where jat's heavy work — builds, renders, private inference — goes, so the box you edit and orchestrate on never has to slow down for it.

See how the stack fits together

Full setup, model config, and offload API on GitHub.

View on GitHub