Open source · Rust · Metal

Fast local models,
on your Mac.

A from-scratch inference engine for Apple silicon. Chat in the terminal, serve the OpenAI and Anthropic APIs, and put Claude Code or OpenCode on a model that runs on your own machine.

$brew install joydle/tap/arf
Fig. 1 — the trefoilx = sin t + 2 sin 2t,  y = cos t − 2 cos 2t,  z = −sin 3t
its Arf invariant is 1

  

Arf 1.0.0.

How it works

Three crossings, three tricks.

  1. Reuse

    Read a shared prompt once

    Coding agents send the same system prompt and tool definitions with every session. Arf keeps the model's state at the end of that shared part, so the next session starts after it.

  2. Guess

    Propose seven, check them in one pass

    A small draft model guesses the next seven tokens. The big model checks all of them in a single pass and keeps the ones it agrees with, so one pass can produce several tokens.

  3. Share

    Many conversations, one pass over the weights

    Requests that arrive together decode together: each step reads the weights once for every active conversation, and a new request joins without waiting for the others to finish.

Coding agents

One command to a local coding agent.

arf launch claude starts the model in the background and opens Claude Code on it. The agent's instructions are read once and kept — on disk too, so a restarted server picks them up in seconds.

Before
0.0 s
With Arf's prefix cache
0.0 s

First turn of a new Claude Code session, at 10× speed.

Your Mac

Will it run on my Mac?

Same rules as arf pull: it refuses weights over 90% of memory and warns past 75%.

36GB memory
8162436486496128+

arf suggests qwen3.8:27b

Measured

Same Mac, same prompts, side by side.

Qwen3.8-27B at ~4 bits, one M4 Max (36 GB), SPEED-Bench coding prompts. Each engine on its default build, rounds interleaved, 2026-10-05.

ArfSplash 1.1.0MLX 0.31.3
Decode, one stream (tok/s)90.588.218.5
4 requests at once (tok/s)99.399.661.2
Prefill, a 35K-token prompt (tok/s)174182180
The same prompt again, first token0.18 s0.33 s0.68 s

Splash is ~4% ahead on prefill and level at four at once. llama.cpp ran too, but every one of its rounds grew swap, so none is shown. Method: docs/PERFORMANCE.md.

Models

The models it runs.

Text, pictures, video and sound in; text and pictures out — on the Mac's GPU, through the same OpenAI and Anthropic APIs.

Image and video answers decode without the draft. Speech output is not built yet.

Qwen3.8-27BThe main model: reasoning, tools, images and video, with its speculative draft.
Qwen3-Coder-30B-A3BMixture of experts, 128 experts, top-8.
Gemma 3 4BDense. Text; images with its vision projector.
Llama 3.2 1B, 3BSmall and dense — the quickest first try.
Qwen3-Omni-30B-A3BMixture of experts, with audio input.see the README
openjevSystem One decision models on Qwen3.8-27B: typed answers with probabilities. Non-commercial weights./v1/systemone
FLUX schnellText to image, on the GPU./v1/images
Muse Glimmer 30BDense, with sliding-window and global attention layers.your own GGUF
Gemma 4 12B, 31BDense. No public GGUF mirror yet.your own GGUF
The name
In 1959 Cahit Arf gave a public lecture titled “Can a machine think, and how can it think?”

Cahit Arf (1910–1997) was a Turkish mathematician: the Arf invariant, Arf rings, the Hasse–Arf theorem. His lecture came nine years after Turing asked the same question. The mark is a trefoil, the simplest knot whose Arf invariant is 1.

$brew install joydle/tap/arf