altAI

Capacity, from machines that already exist.

An open-weight model split across several computers, behind one OpenAI-compatible endpoint. A machine that cannot fit a model scores zero, not slow. Several of them together can serve it.

Download · macOS

The engine is inside. No terminal, no Python, no Docker, no address to type — the network's address is already in the app. You will need a join token; the network is invite-only while it is this young.

Apple Silicon

M1 and later · macOS 12+

Download

14.9 MB · sha256 bc7e1e62f2654fca…

Intel

x86-64 · macOS 12+

Download

15.0 MB · sha256 01862dbb67338d3c…

xattr -dr com.apple.quarantine "/Applications/Altai Node.app"

export ALTAI_JOIN_TOKEN=<your token>
open "Altai Node.app"

Unsigned, so macOS asks once — that is the xattr line. Both builds run on macOS 12 and later, measured rather than claimed: every library in each archive is built against that floor. The Intel engine gives up Accelerate’s BLAS to get there, which makes prompt processing slower on an Intel Mac — there is no Metal on those to take over. Windows and Linux are in the pipeline and not posted yet.

What a token gets you

An ordinary token can only ever make your machine a stage: it runs a block of layers and nothing else. It never downloads a model, it is reached only by its own group's head, and nothing on the internet can dial into it. Being trusted to drive a group is a separate privilege the token has to carry, and we do not hand that out.

Architecture

Who does what

The coordinator decides who plays which role. It never holds model weights and never sees a group's internal traffic.

whole

Holds a complete model. Serves a request start to finish.

head

Holds the embedding and output layers plus its own block. Drives its group and emits every token.

stage

Holds a contiguous block of middle layers. Runs them for every token. Never downloads the model file.

How a request is served Your app any OpenAI client /v1 coordinator assigns roles · routes holds no weights ONE GROUP — ONE UNIT OF CAPACITY head embedding + output its own layers emits the tokens stage layers 15–28 no model file nothing dials in stage layers 29–40 …as many as the model needs HIDDEN STATES ROLE ASSIGNMENT whole fits the model alone also one unit of capacity Requests reach a head, or a whole node. A stage is reached only by its own head, through a tunnel it dialled out.
Layer numbers are from a real 40-layer split. A stage holds only its own block, so a laptop can join a group serving a model many times larger than it could hold.

The argument

Why capacity, and not speed

The binding constraint on a frontier-class model is memory, not FLOPs. A fast GPU with 24 GB cannot hold a 600 GB model at any clock speed. Twenty of them can.

And capacity is what is scarce. Datacenter servers are supply-constrained — vendors say so in their own filings and expect it to persist — while the memory in workstations, gaming machines and office hardware is already built, already powered, and mostly idle. It is not waiting on a fab.

So the aim is not to beat a hosted API on price or latency. It is to serve a model that otherwise could not be served at all, for the people who need it, on machines that already exist.

The target

Where this is going

Sparse mixture-of-experts models — DeepSeek-V3, Kimi-K2 — are the problem this exists to solve. They are where the memory wall is worst and where it is most tractable: only a fraction of the experts fire for any token, so the weights that must be resident are far smaller than the weights that must be available.

The route is pipeline stages across a low-latency regional group, each stage running its own block of layers with that block's experts offloaded to ordinary system RAM. Experts never cross the network. Only hidden states do — on the order of 16 KB per token per hop. That is what makes a machine with plenty of RAM and a modest GPU useful, instead of only machines with datacenter cards.

This route does not run yet

In the engine we use, expert offload and pipeline parallelism are currently mutually exclusive — switching on offload disables the pipeline, verified in the engine's own source. The upstream change that would lift it is open and unmerged. Until then the sparse frontier is the design target and not a capability, and nothing here should be read as saying otherwise.

State

What runs today

worksOpenAI-compatible endpoint Tool calls, streaming, usage, error shapes. The compatibility suite is the project's main asset.
worksA model split across two machines A 14B model served by two ordinary Macs, neither of which can hold it alone.
worksJoining over the internet A node registering from another network, with a join token.
worksSleep and rejoin A laptop closes, the group re-forms, the laptop comes back.
not builtSigned receipts Responses carry a receipt id that currently refers to nothing. The next large piece of work.
not yetAnyone joining safely See the notice at the top. This is the gate on opening the network.

Roadmap

What comes next, in order

Intentions, not dates. Each one is listed because something concrete blocks it, and the blocker is named.

The shape we are building toward

Ten machines of 64 GB, in one metro, serving a DeepSeek-V3-class model at roughly 10–20 tok/s. A target, not a result — nothing like it has been run.

Two numbers in that sentence are not taste. Per-token time across N stages is W/(N·B) + N·L: the compute term falls as 1/N, the latency term grows as N. Past N* = √(W/(B·L)) each extra machine makes it slower — about four or five at residential latency. And availability compounds: ten nodes at 99% give 90%, forty at 95% give under 15%.

So it is ten large machines close together, not forty small ones far apart. More-and-smaller is the intuitive answer and the arithmetic says it is wrong.

the gateNo machine needs the whole model file A head loads the complete model from disk today and pushes each stage its tensors. For a 400 GB model that is a floor no number of extra machines lifts, and it also decides whether a failed head can be replaced at all — a stand-in must already hold the file. Needs per-shard fetch, which means patching the serving engine: its RPC server receives tensors and cannot read them. Solved in the open by others; the cost is carrying a fork.
nextMore than one group per model One group serves a model and every machine that joins afterwards is idle, because the scheduler forms a second group for nothing. Until that changes, capacity does not compose past the first group — which is what turns a group into a network.
nextOne machine, several models A machine holds one role and serves one model. An operator with memory to spare should be able to host several and earn from whichever is busy. Serving two whole models already works in the engine; contributing a slice to two split models does not.
designingHeads with something at stake A receipt is an attestation, not a proof: a dishonest machine can sign a false one. Making the machine that signs put up a bond gives the attestation teeth. The honest limit, stated plainly: you can prove a machine was absent, and you cannot yet prove it answered wrongly — so a bond covers availability, not correctness.
designingRecovering from a lost head A group already re-forms around a failure without anyone intervening. What is missing is a term a returning machine can be refused on, and a way to rebuild only the lost part of a conversation instead of starting it again. Requests in flight when a head dies are failed, deliberately: splicing half an answer onto another machine produces text no model generated.
the targetSparse frontier models DeepSeek-V3, Kimi-K2 class. Not blocked where we thought: with enough machines the model fits across their memory and the engine’s offload restriction never applies. The real blocker is the first item on this list.
parkedCPU-only nodes A machine with many cores, a lot of RAM and no GPU is the machine the sparse route wants. Renting that capacity to run other people’s code is not what we will do: the only thing such a machine has that a datacentre does not is a home IP address, and that is worth far more to abuse than to anyone legitimate.

Limits

What it does not claim

It does not serve frontier models today. What has actually run is a 14B open-weight model split across two Macs; the near-term target is 32B–70B dense. The sparse-frontier ambition above is the problem being worked on, not a description of what you would get this morning.

It is not cheaper than a hosted API. At the speeds a pipeline across several machines runs, electricity alone costs more per token than the market price of a hosted model. The argument is capability, not price.

A receipt will be an attestation, not a proof. When they exist, a receipt will say that a node asserted it produced an output. A dishonest node can sign a false claim, and nothing here will imply otherwise.

Operators

Running a node

One file, opened. It profiles the machine, proposes how much to contribute, opens a page in your browser, and joins. No terminal, no Python, no Docker, no address to type. You set the ceilings; the coordinator never asks for more than you allowed.

export ALTAI_JOIN_TOKEN=<the token you were given>
open "Altai Node.app"

A stage downloads nothing — its head sends it the tensors for its own layers. Only a head or a whole node needs the model file on disk.