Apple Intelligence for your terminal. (Finnish: omppu = apple)
Ask questions in plain English. omppu answers from general knowledge, your project's README and git history, or by running shell commands — whichever is appropriate. Everything runs on-device via Apple Intelligence; no API keys, no cloud, no billing.
$ omppu "what does exit code 137 mean?"
Exit code 137 means the process was killed by SIGKILL (signal 9),
typically by the OOM killer or a manual kill -9.
$ omppu "what tools does this project install?"
The project installs: direnv, pyenv, rbenv, mise, starship,
postgresql@17, openssl@3, make, fzf (via Homebrew), and Oh My Zsh.
$ omppu "how much disk space is this directory using?"
740K
$ omppu "what's my machine's uptime?"
$ uptime
Run this? [y/N] y
Your machine has been up for 3 days, 14 hours.
$ git diff -- src/deploy.rb | omppu "summarise these changes"
Adds a retry loop to the deploy task and bumps the timeout to 60s.
- Apple Silicon Mac running macOS 26 Tahoe or newer
- Apple Intelligence enabled — how to enable it
- apfel — the CLI that exposes Apple's on-device model
brew tap Arthur-Ficial/tap
brew install Arthur-Ficial/tap/apfelVerify it works:
apfel "hello"If that returns a response, you're good. If not, check that Apple Intelligence is enabled in System Settings → Apple Intelligence & Siri.
See apfel's install docs for troubleshooting.
Option A — download directly:
curl -fsSL https://raw.githubusercontent.com/randomm/omppu/main/omppu -o ~/bin/omppu
chmod +x ~/bin/omppuMake sure ~/bin is in your PATH. If it isn't, add this to ~/.zshrc:
export PATH="$HOME/bin:$PATH"Then reload: source ~/.zshrc
Option B — clone and symlink:
git clone https://github.com/randomm/omppu.git ~/.omppu
mkdir -p ~/bin
ln -s ~/.omppu/omppu ~/bin/omppuomppu "what does exit code 1 mean?"omppu [OPTIONS] "your question"
command | omppu "interpret this"
Options:
-r, --run Force command mode — skip direct-answer attempt, run a command first
-c, --copy Copy the answer to clipboard (uses pbcopy)
-h, --help Show help
# General knowledge — answered directly, no commands run
omppu "what does SIGTERM do?"
omppu "what's the difference between 2>&1 and 2>/dev/null?"
# Project context — reads README and git log automatically
omppu "describe this project"
omppu "what shell framework does this project use?"
omppu "summarize the recent git history"
# Live system data — generates and runs the right command
omppu "how much memory is available?"
omppu "what's using the most disk space here?"
omppu "which processes are listening on port 5432?"
# Force command mode (useful when auto-detection gets it wrong)
omppu -r "why is my machine running slow?"
# Pipe any text through — input must fit in ~4096 tokens (~3000 words)
cat error.log | omppu "what's going wrong?"
git diff -- path/to/file.rb | omppu "summarise these changes" # scope to one file for large repos
curl -s api.example.com/status | omppu "is anything degraded?"
# Copy answer to clipboard
omppu -c "write a one-line description of this project"When omppu needs to run a shell command, it checks whether that command is whitelisted:
- Whitelisted → runs automatically, no prompt.
- Not whitelisted → prints the command in yellow and asks
Run this? [y/N].
The built-in defaults cover common read-only commands:
git, ls, du, df, ps, pwd, cat, find, grep, wc, head, tail, echo, date, uname, sw_vers, system_profiler
Create ~/.config/apfel/whitelist and add one Extended Regular Expression per line:
mkdir -p ~/.config/apfel
cat > ~/.config/apfel/whitelist << 'EOF'
# Lines starting with # are comments and are ignored.
# Blank lines are also ignored.
# Match any brew command
^brew
# Match docker ps (but not docker run, docker exec, etc.)
^docker ps
# Match any npm or npx command
^np[mx]
EOFWhat gets matched: Only the first command in a pipeline is checked. For du -sh . | sort -rh | head, only du -sh . is matched against the whitelist. This means whitelisting ^du allows du … | anything to run automatically.
Pattern tips:
^brewmatchesbrew install,brew update,brew list, etc. (anything starting withbrew)^brew list$matches onlybrew listwith no arguments- Patterns are ERE, so
.,*,+,[],(),|have special meaning — escape with\if you want them literal
- Answers general programming questions from its built-in knowledge
- Reads the project README and recent git log to answer project-specific questions
- Generates and runs shell commands for questions that need live data, up to 5 rounds per question
- Pipes any stdin through to Apple Intelligence for interpretation
- Not a coding assistant — for writing or editing code, use Claude Code or similar.
- Not always accurate — Apple Intelligence is a small on-device model. It can hallucinate. Treat answers as a helpful starting point, not ground truth.
- Not great with large inputs — Apple Intelligence has a 4096-token context window (~3000 words). Piping a full
git diffacross many files will hit this limit and fail with a context overflow error. Scope your input:git diff -- path/to/fileorhead -100 big.log. - Not streaming — you wait for the full answer.
- macOS only — depends on Apple Intelligence, which is Apple Silicon + macOS 26 Tahoe+.
For each question, omppu makes at most a handful of calls to Apple Intelligence:
- Answer or signal — sends your question with local context (current directory, README if present, git log if the question is about history). The model either answers directly or signals
NEED_CMDto indicate it needs live data. - Generate command — if live data is needed, asks the model for the right shell command to run.
- Interpret — runs the command (with whitelist check / approval prompt) and sends the output back for interpretation. Repeats up to 5 times if multiple commands are needed.
Piped input (cat file | omppu "...") skips steps 1–2 and goes straight to interpretation.
omppu is powered by apfel by Arthur-Ficial, which wraps Apple's on-device FoundationModels framework. Without apfel, omppu is just a shell script with nowhere to send its questions.
MIT