[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-6837":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":14,"contributorsCount":15,"subscribersCount":15,"size":15,"stars1d":16,"stars7d":17,"stars30d":18,"stars90d":15,"forks30d":15,"starsTrendScore":19,"compositeScore":20,"rankGlobal":10,"rankLanguage":10,"license":21,"archived":22,"fork":22,"defaultBranch":23,"hasWiki":22,"hasPages":22,"topics":24,"createdAt":10,"pushedAt":10,"updatedAt":38,"readmeContent":39,"aiSummary":40,"trendingCount":15,"starSnapshotCount":15,"syncStatus":41,"lastSyncTime":42,"discoverSource":43},6837,"apfel","Arthur-Ficial\u002Fapfel","Arthur-Ficial","The free AI already on your Mac. CLI tool, OpenAI-compatible server, and interactive chat — all on-device via Apple Intelligence. No API keys, no cloud, no downloads.","https:\u002F\u002Fapfel.franzai.com",null,"Swift",5750,216,11,0,12,212,437,218,38.01,"MIT License",false,"main",[25,26,27,28,29,30,31,32,33,34,35,36,37],"apple-intelligence","apple-silicon","cli","foundationmodels","homebrew","llm","macos","macos-26","on-device","openai-compatible","swift","tool-calling","unix","2026-06-12 02:01:30","# apfel\n\n### The free AI already on your Mac.\n\n[![Version 1.3.3](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fversion-1.3.3-blue)](https:\u002F\u002Fgithub.com\u002FArthur-Ficial\u002Fapfel)\n[![Swift 6.3+](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FSwift-6.3%2B-F05138?logo=swift&logoColor=white)](https:\u002F\u002Fswift.org)\n[![macOS 26 Tahoe+](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FmacOS-26%20Tahoe%2B-000000?logo=apple&logoColor=white)](https:\u002F\u002Fdeveloper.apple.com\u002Fmacos\u002F)\n[![No Xcode Required](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FXcode-not%20required-orange)](https:\u002F\u002Fdeveloper.apple.com\u002Fxcode\u002Fresources\u002F)\n[![License: MIT](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FLicense-MIT-blue.svg)](LICENSE)\n[![100% On-Device](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Finference-100%25%20on--device-green)](https:\u002F\u002Fdeveloper.apple.com\u002Fdocumentation\u002Ffoundationmodels)\n[![Website](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fweb-apfel.franzai.com-16A34A)](https:\u002F\u002Fapfel.franzai.com)\n[![#agentswelcome](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002F%23agentswelcome-PRs%20welcome-0066cc?style=for-the-badge&labelColor=0d1117&logo=probot&logoColor=white)](#contributing)\n\nApple Silicon Macs ship a built-in LLM via [Apple FoundationModels](https:\u002F\u002Fdeveloper.apple.com\u002Fdocumentation\u002Ffoundationmodels). `apfel` exposes it as a UNIX tool and a local OpenAI-compatible server. 100% on-device. No API keys, no cloud.\n\n| Mode | Command | What you get |\n|------|---------|--------------|\n| UNIX tool | `apfel \"prompt\"` \u002F `echo \"text\" \\| apfel` | Pipe-friendly answers, file attachments, JSON output, exit codes |\n| OpenAI-compatible server | `apfel --serve` | Drop-in local `http:\u002F\u002Flocalhost:11434\u002Fv1` backend for OpenAI SDKs |\n\n`apfel --chat` - interactive REPL.\n\nTool calling works in all contexts. 4096-token context.\n\n![apfel CLI](screenshots\u002Fcli.png)\n\n## Requirements & Install\n\nmacOS 26 Tahoe+, Apple Silicon (M1+), [Apple Intelligence enabled](https:\u002F\u002Fsupport.apple.com\u002Fen-us\u002F121115).\n\n```bash\nbrew install apfel\n```\n\nUpdate:\n\n```bash\nbrew upgrade apfel\n```\n\nBuild from source (Command Line Tools with macOS 26.4 SDK \u002F Swift 6.3, no Xcode):\n\n```bash\ngit clone https:\u002F\u002Fgithub.com\u002FArthur-Ficial\u002Fapfel.git && cd apfel && make install\n```\n\nNix, same-day tap, Mint, mise, troubleshooting: [docs\u002Finstall.md](docs\u002Finstall.md).\n\n## Quick Start\n\n### UNIX tool\n\nQuote prompts with `!` in single quotes (zsh\u002Fbash history expansion): `apfel 'Hello, Mac!'`.\n\n```bash\n# Single prompt\napfel \"What is the capital of Austria?\"\n\n# Permissive mode - reduces guardrail false positives for creative\u002Flong prompts\napfel --permissive \"Write a dramatic opening for a thriller novel\"\n\n# Stream output\napfel --stream \"Write a haiku about code\"\n\n# Pipe input\necho \"Summarize: $(cat README.md)\" | apfel\n\n# Attach file content to prompt\napfel -f README.md \"Summarize this project\"\n\n# Attach multiple files\napfel -f old.swift -f new.swift \"What changed between these two files?\"\n\n# Combine files with piped input\ngit diff HEAD~1 | apfel -f CONVENTIONS.md \"Review this diff against our conventions\"\n\n# JSON output for scripting\napfel -o json \"Translate to German: hello\" | jq .content\n\n# System prompt\napfel -s \"You are a pirate\" \"What is recursion?\"\n\n# System prompt from file\napfel --system-file persona.txt \"Explain TCP\u002FIP\"\n\n# Quiet mode for shell scripts\nresult=$(apfel -q \"Capital of France? One word.\")\n```\n\n### OpenAI-compatible server\n\n```bash\napfel --serve                              # foreground\nbrew services start apfel                  # background (like Ollama)\nbrew services stop apfel\nAPFEL_TOKEN=$(uuidgen) APFEL_MCP=\u002Fpath\u002Fto\u002Ftools.py brew services start apfel\n```\n\n```bash\ncurl http:\u002F\u002Flocalhost:11434\u002Fv1\u002Fchat\u002Fcompletions \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"model\":\"apple-foundationmodel\",\"messages\":[{\"role\":\"user\",\"content\":\"Hello\"}]}'\n```\n\n```python\nfrom openai import OpenAI\nclient = OpenAI(base_url=\"http:\u002F\u002Flocalhost:11434\u002Fv1\", api_key=\"unused\")\nresp = client.chat.completions.create(\n    model=\"apple-foundationmodel\",\n    messages=[{\"role\": \"user\", \"content\": \"What is 1+1?\"}],\n)\nprint(resp.choices[0].message.content)\n```\n\nBackground service details: [docs\u002Fbackground-service.md](docs\u002Fbackground-service.md).\n\n### Quick testing chat\n\n`apfel --chat` is a small REPL for testing prompts or MCP servers. For a GUI chat app, see [apfel-chat](https:\u002F\u002Fgithub.com\u002FArthur-Ficial\u002Fapfel-chat).\n\n```bash\napfel --chat\napfel --chat -s \"You are a helpful coding assistant\"\napfel --chat --mcp .\u002Fmcp\u002Fcalculator\u002Fserver.py      # chat with MCP tools\napfel --chat --debug                                # debug output to stderr\n```\n\nCtrl-C exits. Context is trimmed automatically ([docs\u002Fcontext-strategies.md](docs\u002Fcontext-strategies.md)).\n\n## Demos\n\nShell scripts in [`demo\u002F`](.\u002Fdemo\u002F):\n\n**[cmd](.\u002Fdemo\u002Fcmd)** - natural language to shell command:\n\n```bash\ndemo\u002Fcmd \"find all .log files modified today\"\n# $ find . -name \"*.log\" -type f -mtime -1\n\ndemo\u002Fcmd -x \"show disk usage sorted by size\"   # -x = execute after confirm\ndemo\u002Fcmd -c \"list open ports\"                   # -c = copy to clipboard\n```\n\n**Shell function version** - add to your `.zshrc` and use `cmd` from anywhere:\n\n```bash\n# cmd - natural language to shell command (apfel). Add to .zshrc:\ncmd(){ local x c r a; while [[ $1 == -* ]]; do case $1 in -x)x=1;shift;; -c)c=1;shift;; *)break;; esac; done; r=$(apfel -q -s 'Output only a shell command.' \"$*\" | sed '\u002F^```\u002Fd;\u002F^#\u002Fd;s\u002F\\x1b\\[[0-9;]*[a-zA-Z]\u002F\u002Fg;s\u002F^[[:space:]]*\u002F\u002F;\u002F^$\u002Fd' | head -1); [[ $r ]] || { echo \"no command generated\"; return 1; }; printf '\\e[32m$\\e[0m %s\\n' \"$r\"; [[ $c ]] && printf %s \"$r\" | pbcopy && echo \"(copied)\"; [[ $x ]] && { printf 'Run? [y\u002FN] '; read -r a; [[ $a == y ]] && eval \"$r\"; }; return 0; }\n```\n\n```bash\ncmd find all swift files larger than 1MB     # shows: $ find . -name \"*.swift\" -size +1M\ncmd -c show disk usage sorted by size        # shows command + copies to clipboard\ncmd -x what process is using port 3000       # shows command + asks to run it\ncmd list all git branches merged into main\ncmd count lines of code by language\n```\n\n**[oneliner](.\u002Fdemo\u002Foneliner)** - complex pipe chains from plain English:\n\n```bash\ndemo\u002Foneliner \"sum the third column of a CSV\"\n# $ awk -F',' '{sum += $3} END {print sum}' file.csv\n\ndemo\u002Foneliner \"count unique IPs in access.log\"\n# $ awk '{print $1}' access.log | sort | uniq -c | sort -rn\n```\n\n**[mac-narrator](.\u002Fdemo\u002Fmac-narrator)** - your Mac's inner monologue:\n\n```bash\ndemo\u002Fmac-narrator              # one-shot: what's happening right now?\ndemo\u002Fmac-narrator --watch      # continuous narration every 60s\n```\n\nAlso in `demo\u002F`:\n\n- **[wtd](.\u002Fdemo\u002Fwtd)** - \"what's this directory?\" instant project orientation\n- **[explain](.\u002Fdemo\u002Fexplain)** - explain a command, error, or code snippet\n- **[naming](.\u002Fdemo\u002Fnaming)** - naming suggestions for functions, variables, files\n- **[port](.\u002Fdemo\u002Fport)** - what's using this port?\n- **[gitsum](.\u002Fdemo\u002Fgitsum)** - summarize recent git activity\n\nLonger walkthroughs: [docs\u002Fdemos.md](docs\u002Fdemos.md).\n\n## MCP Tool Support\n\nAttach [Model Context Protocol](https:\u002F\u002Fmodelcontextprotocol.io\u002F) servers with `--mcp`. apfel discovers, invokes, and returns.\n\n```bash\napfel --mcp .\u002Fmcp\u002Fcalculator\u002Fserver.py \"What is 15 times 27?\"\n```\n\n```\nmcp: .\u002Fmcp\u002Fcalculator\u002Fserver.py - add, subtract, multiply, divide, sqrt, power    ← stderr\ntool: multiply({\"a\": 15, \"b\": 27}) = 405                                          ← stderr\n15 times 27 is 405.                                                                ← stdout\n```\n\nUse `-q` to suppress tool info.\n\n```bash\napfel --mcp .\u002Fserver_a.py --mcp .\u002Fserver_b.py \"Use both tools\"\napfel --serve --mcp .\u002Fmcp\u002Fcalculator\u002Fserver.py\napfel --chat --mcp .\u002Fmcp\u002Fcalculator\u002Fserver.py\n```\n\nShips with a calculator at [`mcp\u002Fcalculator\u002F`](.\u002Fmcp\u002Fcalculator\u002F) ([docs\u002Fmcp-calculator.md](docs\u002Fmcp-calculator.md)).\n\n**Remote MCP servers** (Streamable HTTP, MCP spec 2025-03-26):\n\n```bash\napfel --mcp https:\u002F\u002Fmcp.example.com\u002Fv1 \"what tools do you have?\"\n\n# bearer token - prefer env var (flag is visible in ps aux)\nAPFEL_MCP_TOKEN=mytoken apfel --mcp https:\u002F\u002Fmcp.example.com\u002Fv1 \"...\"\n\n# mixed local + remote\napfel --mcp \u002Fpath\u002Fto\u002Flocal.py --mcp https:\u002F\u002Fremote.example.com\u002Fv1 \"...\"\n```\n\n> **Security:** prefer `APFEL_MCP_TOKEN` over `--mcp-token` (ps aux). apfel refuses bearer tokens over plaintext `http:\u002F\u002F`.\n\n## apfel-run: optional config layer\n\napfel itself has no config file - flags + env vars, like any UNIX tool. If you want a TOML config (many MCPs, profiles, team configs in git), [**apfel-run**](https:\u002F\u002Fgithub.com\u002FArthur-Ficial\u002Fapfel-run) is an MIT wrapper that adds one via `execve` drop-in.\n\n```bash\nbrew install Arthur-Ficial\u002Ftap\u002Fapfel-run\napfel-run config init                 # starter ~\u002F.config\u002Fapfel\u002Fconfig.toml\nalias apfel=apfel-run                 # optional, every apfel flag still works\n```\n\n## OpenAI API Compatibility\n\n**Base URL:** `http:\u002F\u002Flocalhost:11434\u002Fv1`\n\n| Feature | Status | Notes |\n|---------|--------|-------|\n| `POST \u002Fv1\u002Fchat\u002Fcompletions` | Supported | Streaming + non-streaming |\n| `GET \u002Fv1\u002Fmodels` | Supported | Returns `apple-foundationmodel` |\n| `GET \u002Fhealth` | Supported | Model availability, context window, languages |\n| `GET \u002Fv1\u002Flogs`, `\u002Fv1\u002Flogs\u002Fstats` | Debug only | Requires `--debug` |\n| Tool calling | Supported | Native `ToolDefinition` + JSON detection. See [docs\u002Ftool-calling-guide.md](docs\u002Ftool-calling-guide.md) |\n| `response_format: json_object` | Supported | System-prompt injection; markdown fences stripped from output |\n| `temperature`, `max_tokens`, `seed` | Supported | Mapped to `GenerationOptions`. Omitting `max_tokens` uses the remaining context window (drop-in OpenAI semantics) - see [Default response cap](#default-response-cap-max_tokens) |\n| `stream: true` | Supported | SSE; final usage chunk only when `stream_options: {\"include_usage\": true}` (per OpenAI spec) |\n| `finish_reason` | Supported | `stop`, `tool_calls`, `length` |\n| Context strategies | Supported | `x_context_strategy`, `x_context_max_turns`, `x_context_output_reserve` extension fields |\n| CORS | Supported | Enable with `--cors` |\n| `POST \u002Fv1\u002Fcompletions` | 501 | Legacy text completions not supported |\n| `POST \u002Fv1\u002Fembeddings` | 501 | Embeddings not available on-device |\n| `logprobs=true`, `n>1`, `stop`, `presence_penalty`, `frequency_penalty` | 400 | Rejected explicitly. `n=1` and `logprobs=false` are accepted as no-ops |\n| Multi-modal (images) | 400 | Rejected with clear error |\n| `Authorization` header | Supported | Required when `--token` is set. See [docs\u002Fserver-security.md](docs\u002Fserver-security.md) |\n\nFull API spec: [openai\u002Fopenai-openapi](https:\u002F\u002Fgithub.com\u002Fopenai\u002Fopenai-openapi).\n\n## Default response cap (`max_tokens`)\n\nWhen `max_tokens` is omitted, **CLI and OpenAI-compatible server behave identically**: the value flows through as `nil` and the model uses whatever room is left in the 4096-token context window. This is drop-in OpenAI semantics - no arbitrary fallback constant.\n\nThe on-device model has a **4096-token context window** that holds input *and* output combined. If generation runs into the ceiling, the response ends cleanly with `finish_reason: \"length\"` and the partial content is returned (server: HTTP 200; CLI: exit 0 with a stderr warning). Pass `max_tokens` explicitly when you want a tighter latency budget or a known cap for your client.\n\n### Examples\n\n```bash\n# Omitted: uses remaining window, finish_reason: \"stop\" or \"length\"\ncurl -sS http:\u002F\u002Flocalhost:11434\u002Fv1\u002Fchat\u002Fcompletions \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"model\":\"apple-foundationmodel\",\n       \"messages\":[{\"role\":\"user\",\"content\":\"Reply SKIP, MOVE, or RENAME.\"}]}'\n\n# Explicit cap (recommended for tight latency budgets)\ncurl -sS http:\u002F\u002Flocalhost:11434\u002Fv1\u002Fchat\u002Fcompletions \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"model\":\"apple-foundationmodel\",\"max_tokens\":128,\n       \"messages\":[{\"role\":\"user\",\"content\":\"Summarise: ...\"}]}'\n```\n\n### Picking a value\n\n| Use case                               | `max_tokens`  |\n|----------------------------------------|---------------|\n| Single-word \u002F classification reply     | 16 - 32       |\n| One-line instruction                   | 64 - 128      |\n| Short paragraph                        | 256 - 512     |\n| Long paragraph \u002F structured JSON       | 1024 - 2048   |\n| As long as the context window allows   | omit it       |\n\nKeep `input_tokens + max_tokens` comfortably below 4096. If the prompt itself exceeds the window, generation cannot start and the request fails with `[context overflow]` (HTTP 400 \u002F CLI exit 4). The validator rejects non-positive values (`max_tokens \u003C= 0`).\n\n### CLI parity\n\nCLI and server share one rule: omitted = use remaining window. No constant to drift. Override with `--max-tokens N` or `APFEL_MAX_TOKENS=N`.\n\n```bash\napfel \"Reply SKIP.\"                    # uses remaining window\napfel --max-tokens 64 \"Reply SKIP.\"    # explicit cap\nAPFEL_MAX_TOKENS=2048 apfel \"...\"      # via env var\n```\n\n### Permissive guardrails for the server\n\n`apfel --serve --permissive` makes the server use Apple's `.permissiveContentTransformations` guardrails for **every request** the process handles. Same flag, same semantics as the CLI's `--permissive` ([docs\u002FPERMISSIVE.md](docs\u002FPERMISSIVE.md)). There is no per-request override - the server operator decides for the whole process.\n\n```bash\napfel --serve --permissive             # every request uses permissive guardrails\n```\n\n## Limitations\n\n| Constraint | Detail |\n|------------|--------|\n| Context window | **4096 tokens** (input + output combined) |\n| Platform | macOS 26+, Apple Silicon only |\n| Model | One model (`apple-foundationmodel`), not configurable |\n| Guardrails | Apple's safety system may block benign prompts. `--permissive` reduces false positives ([docs\u002FPERMISSIVE.md](docs\u002FPERMISSIVE.md)) |\n| Speed | On-device, not cloud-scale - a few seconds per response |\n| No embeddings \u002F vision | Not available on-device |\n\n## Reference Docs\n\nGuides to use apfel from [Python](docs\u002Fguides\u002Fpython.md), [Node.js](docs\u002Fguides\u002Fnodejs.md), [Ruby](docs\u002Fguides\u002Fruby.md), [PHP](docs\u002Fguides\u002Fphp.md), [Bash\u002Fcurl](docs\u002Fguides\u002Fbash-curl.md), [Zsh](docs\u002Fguides\u002Fzsh.md), [AppleScript](docs\u002Fguides\u002Fapplescript.md), [Swift](docs\u002Fguides\u002Fswift-scripting.md), [Perl](docs\u002Fguides\u002Fperl.md), [AWK](docs\u002Fguides\u002Fawk.md) - see [docs\u002Fguides\u002Findex.md](docs\u002Fguides\u002Findex.md). Empirically tested; runnable proof at [apfel-guides-lab](https:\u002F\u002Fgithub.com\u002FArthur-Ficial\u002Fapfel-guides-lab).\n\n- [docs\u002Finstall.md](docs\u002Finstall.md) - install, troubleshooting, and Apple Intelligence setup\n- [docs\u002Fcli-reference.md](docs\u002Fcli-reference.md) - every flag, exit code, and environment variable\n- [docs\u002Fbackground-service.md](docs\u002Fbackground-service.md) - `brew services` and launchd usage\n- [docs\u002Fopenai-api-compatibility.md](docs\u002Fopenai-api-compatibility.md) - `\u002Fv1\u002F*` support matrix in depth\n- [docs\u002Fserver-security.md](docs\u002Fserver-security.md) - origin checks, CORS, tokens, and `--footgun`\n- [docs\u002Fcontext-strategies.md](docs\u002Fcontext-strategies.md) - chat trimming strategies\n- [docs\u002Fmcp-calculator.md](docs\u002Fmcp-calculator.md) - local and remote MCP usage\n- [docs\u002Ftool-calling-guide.md](docs\u002Ftool-calling-guide.md) - detailed tool-calling behavior\n- [docs\u002Fintegrations.md](docs\u002Fintegrations.md) - third-party tool integrations (opencode, etc.)\n- [docs\u002Flocal-setup-with-vs-code.md](docs\u002Flocal-setup-with-vs-code.md) - local review with apfel + a second edit\u002Fapply model in VS Code\n- [docs\u002Fdemos.md](docs\u002Fdemos.md) - longer walkthroughs of the shell demos\n- [docs\u002FEXAMPLES.md](docs\u002FEXAMPLES.md) - 50+ real prompts with unedited output\n- [docs\u002Fswift-library.md](docs\u002Fswift-library.md) - `ApfelCore` Swift Package for downstream developers\n\n## Architecture\n\n```text\nCLI (single\u002Fstream\u002Fchat) ──┐\n                           ├─→ FoundationModels.SystemLanguageModel\nHTTP Server (\u002Fv1\u002F*) ───────┘   (100% on-device, zero network)\n                                ContextManager → Transcript API\n                                SchemaConverter → native ToolDefinitions\n                                TokenCounter → real token counts (SDK 26.4)\n```\n\nSwift 6.3 strict concurrency. Three targets: `ApfelCore` (pure logic, unit-testable, also available as a Swift Package product - see [docs\u002Fswift-library.md](docs\u002Fswift-library.md)), `apfel` (CLI + server), and `apfel-tests` (pure Swift runner, no XCTest).\n\n## Build & Test\n\n```bash\nmake test                                # release build + all unit\u002Fintegration tests\nmake preflight                           # full release qualification\nmake install                             # build release + install to \u002Fusr\u002Flocal\u002Fbin\nmake build                               # build release only\nmake version                             # print current version\nmake release                             # patch release\nmake release TYPE=minor                  # minor release\nmake release TYPE=major                  # major release\nswift build                              # quick debug build (no version bump)\nswift run apfel-tests                    # unit tests\npython3 -m pytest Tests\u002Fintegration\u002F -v  # integration tests\napfel --benchmark -o json                # performance report\n```\n\n`.version` is the single source of truth. Only `make release` bumps versions. Local builds do not change the version.\n\n## The apfel tree\n\nProjects built on apfel. Each ships as its own repo + Homebrew formula.\n\n| Project | What it does | Install |\n|---------|--------------|---------|\n| [**apfel**](https:\u002F\u002Fapfel.franzai.com) | The root. On-device FoundationModels CLI + OpenAI-compatible server. | `brew install apfel` |\n| [**apfel-chat**](https:\u002F\u002Fapfel-chat.franzai.com) | macOS chat client: streaming markdown, speech I\u002FO, Apple Vision image analysis. | `brew install Arthur-Ficial\u002Ftap\u002Fapfel-chat` |\n| [**apfel-clip**](https:\u002F\u002Fapfel-clip.franzai.com) | Menu-bar AI actions on the clipboard: summarize, translate, rewrite. | `brew install Arthur-Ficial\u002Ftap\u002Fapfel-clip` |\n| [**apfel-quick**](https:\u002F\u002Fapfel-quick.franzai.com) | Instant AI overlay: press a key, ask, answer, dismiss. | `brew install Arthur-Ficial\u002Ftap\u002Fapfel-quick` |\n| [**apfelpad**](https:\u002F\u002Fapfelpad.franzai.com) | Formula notepad - on-device AI as an inline cell function. | `brew install Arthur-Ficial\u002Ftap\u002Fapfelpad` |\n| [**apfel-mcp**](https:\u002F\u002Fapfel-mcp.franzai.com) | Token-budget-optimized MCPs for the 4096 window: `url-fetch`, `ddg-search`, `search-and-fetch`. | `brew install Arthur-Ficial\u002Ftap\u002Fapfel-mcp` |\n| [**apfel-gui**](https:\u002F\u002Fgithub.com\u002FArthur-Ficial\u002Fapfel-gui) | SwiftUI debug inspector: request timeline, MCP protocol viewer, TTS\u002FSTT. | `brew install Arthur-Ficial\u002Ftap\u002Fapfel-gui` |\n| [**apfel-run**](https:\u002F\u002Fgithub.com\u002FArthur-Ficial\u002Fapfel-run) | UNIX wrapper adding a persistent MCP registry + TOML config on top of `apfel`. | `brew install Arthur-Ficial\u002Ftap\u002Fapfel-run` |\n| [**apfel-server-kit**](https:\u002F\u002Fgithub.com\u002FArthur-Ficial\u002Fapfel-server-kit) | Swift package for ecosystem tools: discover, spawn, and stream from a local `apfel --serve`. | Swift Package |\n\n## Community Projects\n\nBuilt something on top of apfel? Open an issue and it can be added here.\n\n| Project | What it does | Links |\n|---------|-------------|-------|\n| **apfelclaw** by [@julianYaman](https:\u002F\u002Fgithub.com\u002FjulianYaman) | Local AI agent that reads files, calendar, mail, and Mac status via read-only tools | [github](https:\u002F\u002Fgithub.com\u002Fjulianyaman\u002Fapfelclaw) - [site](https:\u002F\u002Fapfelclaw.yamanlabs.com\u002F) |\n| **fruit-chat** by [@bhaskarvilles](https:\u002F\u002Fgithub.com\u002Fbhaskarvilles) | Browser-based chat UI that talks to `apfel --serve` over the OpenAI-compatible API | [github](https:\u002F\u002Fgithub.com\u002Fbhaskarvilles\u002Ffruit-chat) |\n| **local-claude** by [@lucaspwo](https:\u002F\u002Fgithub.com\u002Flucaspwo) | Claude Code wrapper that swaps in apfel as a local backend via a small Anthropic-OpenAI proxy | [github](https:\u002F\u002Fgithub.com\u002Flucaspwo\u002Flocal-claude) |\n| **apfeller** by [@hasit](https:\u002F\u002Fgithub.com\u002Fhasit) | App manager for local shell apps built around apfel | [github](https:\u002F\u002Fgithub.com\u002Fhasit\u002Fapfeller) - [site](https:\u002F\u002Fhasit.github.io\u002Fapfeller\u002F) - [catalog](https:\u002F\u002Fhasit.github.io\u002Fapfeller\u002Fcatalog\u002F) |\n\n## Contributing\n\nIssues and PRs welcome on any `Arthur-Ficial\u002Fapfel*` repo.\n\n**#agentswelcome** - AI agent PRs are fine. Read the repo's `CLAUDE.md`, run the tests, credit the tool in a `Co-Authored-By` trailer. Same bar as humans: clean code, passing tests, honest limits. Most agent-friendly entry point: [apfel-mcp](https:\u002F\u002Fgithub.com\u002FArthur-Ficial\u002Fapfel-mcp) ([contribution rules](https:\u002F\u002Fapfel-mcp.franzai.com\u002F#contribute)).\n\n## License\n\n[MIT](LICENSE)\n","apfel 是一个利用 Mac 内置 AI 功能的免费工具，提供命令行界面、OpenAI 兼容服务器和交互式聊天功能。核心功能包括支持通过命令行或管道输入进行文本处理、文件附件解析及JSON输出，并且可以在本地模拟OpenAI API服务。技术上，apfel完全基于设备运行，无需API密钥或云服务，适用于macOS 26及以上版本的Apple Silicon Macs。它特别适合需要在本地环境中快速调用AI能力而不依赖外部网络资源的开发者或用户使用。",2,"2026-06-11 03:09:07","top_language"]