macOS 27 ships an on-device language model and a command-line tool for it,
/usr/bin/fm. fm serve starts a local OpenAI-compatible server, so VibeCody
talks to it like any other local provider — no API key, no network, no separate
inference stack. Nothing leaves the Mac.
On a Mac that can run it, and where you have already accepted Apple’s terms, it is the provider VibeCody starts with when you have not chosen one.
Requirements
- macOS 27 or later, Apple silicon (Intel Macs are not supported)
- Apple Intelligence enabled, in a supported language and region
- Apple’s terms accepted — see below
fm available reports whether the model can run:
fm available # System model available
Accept Apple’s terms
fm is covered by a legal notice. VibeCody never accepts it for you. fm
itself records agreement as a side effect of use — piping a prompt into
fm respond marked the terms agreed without asking — so the daemon does not run
fm respond, fm serve or fm chat until fm license --status already reports
agreement, and choosing this provider as a default never accepts anything.
Accept in Settings → Providers → Apple Foundation Models. The panel shows
the notice verbatim (from fm license --show) and accepts only when you click
I’ve read the terms — accept. It then re-reads the status, and shows fm’s
own words if agreement was not recorded.
You can also do it in Terminal:
fm license --show # read the terms
fm license # agree
fm license --status # confirm
The notice also says you agree not to programmatically access Apple models
through Apple software or services “except as expressly permitted”. fm serve
is Apple’s own server mode; whether your particular use is permitted is between
you and Apple’s licence, so read it.
Configure VibeCody
Nothing is required. VibeCody starts fm serve on 127.0.0.1:1976 (loopback
only) the first time the provider is used, and reuses it afterwards.
vibecli --provider apple-foundation "Summarise this repo's README"
Config file (~/.vibecli/config.toml) — only needed to point at a server
you run yourself; setting api_url stops VibeCody managing one:
[apple_foundation]
api_url = "http://127.0.0.1:1976/v1" # default
model = "system"
Models
fm serve exposes exactly one model:
| Model | Notes |
|---|---|
system |
Default. Apple’s on-device model |
Limits worth knowing
- Small context. Third-party write-ups put it at roughly 4K–8K tokens depending on OS version and device; these figures are unverified here, and Apple advises reading the value at runtime rather than hard-coding one.
- No native tool calling.
fm serveignores atoolsarray — tested: the model answered in prose and invented the tool’s result. VibeCody therefore describes tools in the prompt instead of sending schemas (the prose path). - It is a small model. Good for chat, summarising and light edits; use a larger provider for serious coding-agent work.
Verify
fm license --status
vibecli --provider apple-foundation "Say hello in three words"
Troubleshooting
| Symptom | Cause |
|---|---|
| Panel says “needs macOS 27” | No /usr/bin/fm — older macOS, or not a Mac |
| “The model isn’t available” | Apple Intelligence is off, or unsupported region/language; the panel shows fm’s own message |
| “terms have not been accepted” | Accept them in Settings (above) |
did not answer on 127.0.0.1:1976 |
Another program holds port 1976 |