wisp

On-device AI for macOS

A small agent that runs on your Mac, and stays there.

wisp drives Apple's on-device Foundation Model, or a model you run in Ollama, MLX, llama.cpp, or LM Studio, and gives it tools: it runs commands, reads and edits files, and reports on the machine. No prompt, file, or output leaves the Mac. There is no key, account, or bill.

$ brew install pidster/tap/wisp
$ wisp chat

Needs an Apple silicon Mac on macOS 27 or later. Open source, MIT licensed.

The wisp: a small glowing spirit, white and pale blue, floating above an open laptop on a desk at night.

A conversation in wisp-tui

What a conversation looks like in wisp-tui, the terminal front end. A reading command runs at once; a push waits for you, and your answer has a scope you choose.

Two faces, one session

For you at a terminal, and for the agent you already use.

At the terminal

Ask a question, hand over a task, or keep a conversation. Type ! to run a command yourself; the model is told what you ran.

$ wisp "Use run_command to run: uname -m"
$ wisp chat
$ git diff --cached | wisp scan
Install and first run

Under Claude Code or Codex

Register wisp mcp and your agent hands the local chores to something cheaper than itself: run the tests and return the failures, condense a log, summarise a diff.

{ "mcpServers": { "wisp": {
    "command": "/opt/homebrew/bin/wisp",
    "args": ["mcp"] } } }
Delegating from Claude Code and Codex

The gate

Nothing runs that has not passed it.

Every command the model asks for goes through the same steps, in order, and every step is written down.

  1. 1

    Policy

    A deny list refuses what should never run: sudo, rm -rf /, piping into a shell, disk tools, a wisp of its own.

  2. 2

    Classifier

    Each simple command is rated safe, moderate, or dangerous: rules first, a Core ML model beside them, in under a millisecond.

  3. 3

    You

    Asked at moderate and above, for once, the session, the project, or always. Silence is a refusal, and the calling agent can never answer for you.

  4. 4

    Sandbox

    Seatbelt confines writes to the project, the temporary directories, and your build caches. A chore it refuses runs outside only when you approve that one run.

  5. 5

    Audit

    Every prompt, tool call, verdict, approval, and outcome, verbatim, in a log on your Mac. Every reply says what the turn actually ran.

Approvals and the sandbox

Over MCP

Read something large on the Mac, return something small.

Besides respond, which runs a task on the local model on a named thread, the server has ten tools that do one job each, so the large thing never reaches a remote model.

triage
Build or test output to a list of failures
summarise_diff
A diff to one line a file, with review flags
draft_change
A commit message, PR, or changelog line from a diff
scan_secrets
Credentials and personal data, by rule, then the model
redact
The same, replaced with numbered markers
condense_log
A log to its distinct messages, without a model
json_shape
A JSON document to its structure, without its data
dependency_audit
An npm or Cargo audit to what needs action
flaky_tests
Tests that pass in one run and fail in another
hot_paths
A profile to where the time goes
The MCP server

Models

Apple's model by default. Yours when you want more.

The on-device Foundation Model is always there. Add a larger one you run yourself, and pick per conversation, or per thread over MCP.

Local models
  • system Apple, on device
  • ollama: Ollama
  • mlx: MLX, in process
  • llamacpp: llama.cpp
  • lmstudio: LM Studio
  • coreai: Core AI

Start with one command.

$ brew install pidster/tap/wisp