The inference mesh
jat.run
The fabric — many appliances pooled behind one tailnet endpoint.
One endpoint
jat.run/v1/chat/completions OpenAI-compatible. Every appliance on your tailnet answers behind it.
A single appliance is one box. jat.run is the fabric that
turns every appliance on your tailnet into one pool of private compute and
inference — one endpoint, backed by as many machines as you've joined.
Clients hit jat.run; the mesh routes each
job to the node that can serve it fastest.
The box
A jat-appliance is one node — a single machine on your tailnet.
The fabric
jat.run is the mesh — the networked plural of appliances, many boxes pooled behind one endpoint.
Add a box, add capacity
Joining is one command. Find a good deal on a used Mac, or splurge on a big-memory workstation — plug either into the tailnet and the mesh's capacity and redundancy go up. A node that dies just reroutes; nothing to reconfigure. Every node declares one of two roles:
dedicated always-on nodes — models pinned, capacity guaranteed
opportunistic a laptop that joins when on AC + idle, and drains gracefully the moment you pick it up
Routed by measured performance
Every node benchmarks itself, so the router doesn't guess where to send a job — it knows which box does a given model at what throughput and routes accordingly. The same bench data answers the question you actually have when you're shopping: if I add this machine, how much more can the mesh serve?
Run on the mesh
jat-appliance join --role opportunistic curl jat.run/v1/chat/completions -d @job.json routed → appliance-01 (31 tok/s) · private, on your tailnetHow it fits
jat.run is what many jat-appliances become when you pool them: one private endpoint on your tailnet that jat's agents — and any OpenAI-compatible client — hit for inference. One box is capacity; the mesh is capacity that compounds. Add a box, add capacity.
Mesh topology, routing, and the join protocol on GitHub.
View on GitHub