Skip to main content

A friendly CLI for Apple's on-device Foundation Model — fm chat/respond/schema on macOS 26, today.

Project description

fmx

A friendly CLI for Apple's on-device Foundation Modelchat, respond, and schema from your terminal, on macOS 26 today.

macOS 27 will ship a native fm command. fmx brings that same workflow to macOS 26 right now, built on Apple's apple-fm-sdk. It uses a distinct name (fmx) so it never collides with the future system fm.

$ fmx chat
fmx chat — Apple on-device Foundation Model
Type a message, or /help for commands. /exit to quit.

you ❯ explain async/await in one sentence
fmx ❯ async/await lets you write non-blocking code that reads top-to-bottom, pausing at
       await points so other work can run while you wait on I/O.

you ❯ /save mychat.json
Saved 4 entries to mychat.json.

Requirements

Everything runs on-device through Apple Intelligence — there's no cloud, no API key, and it only works on a compatible Mac:

  • macOS 26 or later
  • Apple silicon, M1 or later, with Apple Intelligence turned on (compatible devices)
  • Python 3.10+

If the model isn't available, fmx tells you exactly why (Apple Intelligence off, device ineligible, or model still downloading).

Install

uv tool install fmx
# or
pipx install fmx

Both install the fmx command into your user bin directory (~/.local/bin). If your shell then reports zsh: command not found: fmx, that directory isn't on your PATH yet — fix it once and open a new terminal:

uv tool update-shell     # if you installed with uv
# or
pipx ensurepath          # if you installed with pipx

Verify with fmx --version.

Usage

fmx chat — interactive

fmx chat
fmx chat -i "You are a terse shell expert."   # set system instructions

Slash commands inside a chat:

Command Description
/help List commands
/save <path> Save the conversation to JSON
/load <path> Resume a saved conversation
/clear Start fresh (keeps your instructions)
/system <text> Replace instructions and start fresh
/model Show model info
/exit Quit (or Ctrl-D)

fmx respond — one-shot, scriptable

fmx respond "Summarize this in 5 words: <text>"
echo "say hi" | fmx respond -                       # prompt from stdin
fmx respond "Write a haiku about Swift" --stream     # stream tokens
fmx respond "Describe this" --image photo.jpg        # multimodal (repeatable)
fmx respond "Be terse." -t 0.2 --max-tokens 100      # temperature / token cap

fmx schema — structured output

Build a JSON Schema, then constrain a response to it. Output is parseable JSON:

fmx schema object name:str age:int "bio:str:a short biography" tags:str[]

# pipe a schema straight into respond:
fmx schema object name:str age:int | fmx respond "Invent a person" --schema -

Field spec is name:type[:description]. Types: str, int, float, bool (append [] for an array, e.g. tags:str[]).

What about Private Cloud Compute / /model?

Not yet. apple-fm-sdk currently exposes only the on-device model — there's no Python API for Private Cloud Compute. When Apple ships PCC access (via the SDK, or the native fm in macOS 27), model switching will land behind /model; the code already isolates session creation in fmx/core.py for exactly this.

Roadmap

  • /model → Private Cloud Compute, once the SDK exposes it
  • Auto-defer to the native fm binary when running on macOS 27
  • Homebrew formula
  • Tool/function calling in chat

Development

git clone https://github.com/manjunathshiva/fmx
cd fmx
uv sync
uv run fmx chat
uv run pytest          # model tests auto-skip if Apple Intelligence is unavailable
uv run ruff check .

Contributing

Contributions are welcome! See CONTRIBUTING.md for the dev setup, the SDK-free-vs-on-device test split, and the review rules — every PR needs passing lint-and-test + CodeQL checks and one approving review. A pull-request template is filled in for you.

Found a security issue? Please don't open a public issue — follow the security policy instead.

License

MIT. Built on Apple's apple-fm-sdk (Apache-2.0). Not affiliated with Apple.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

fmx-0.1.1.tar.gz (27.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

fmx-0.1.1-py3-none-any.whl (12.3 kB view details)

Uploaded Python 3

File details

Details for the file fmx-0.1.1.tar.gz.

File metadata

  • Download URL: fmx-0.1.1.tar.gz
  • Upload date:
  • Size: 27.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for fmx-0.1.1.tar.gz
Algorithm Hash digest
SHA256 c29422bad7295c5fc542a859c594f8fc9c293a00aae0e905d37e1ae98cba5cfe
MD5 3e239bf5870e0996c86dabab3f210343
BLAKE2b-256 04c0584da6338b769b02b8c29f06942491850f608a7747a591fda09fc124969b

See more details on using hashes here.

Provenance

The following attestation bundles were made for fmx-0.1.1.tar.gz:

Publisher: publish.yml on manjunathshiva/fmx

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file fmx-0.1.1-py3-none-any.whl.

File metadata

  • Download URL: fmx-0.1.1-py3-none-any.whl
  • Upload date:
  • Size: 12.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for fmx-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 41865aa216320df9c6f3230570081a71b18f8b71378e3cd3361081502ec9e8a3
MD5 36f7be62623e2568e997e953e0bee09b
BLAKE2b-256 bc85f3bcd21057b07a356e18955220fe8fe50272d212ab8def2b8edf2428bfd0

See more details on using hashes here.

Provenance

The following attestation bundles were made for fmx-0.1.1-py3-none-any.whl:

Publisher: publish.yml on manjunathshiva/fmx

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page