Compute offload
jat-appliance
The box — one machine turned into a private compute + inference node.
jat install applianceAgents 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.
rsync up
workdir syncs to the appliance
run niced
background QoS — live inference always wins
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 healthyOffload 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 togetherFull setup, model config, and offload API on GitHub.
View on GitHub