System-wide AI autocomplete for macOS.
Copilot-style suggestions in every text field — offline, private, and on-device.
Features · Quick Start · Models · Privacy · FAQ
Type anywhere → the local model answers → Tab takes a word, ⇧Tab takes the rest.
Important
What it needs, and what leaves your Mac. Pretype needs the Accessibility permission — the same grant a keylogger would ask for — to read the focused text field, catch the accept key, and type suggestions back. Nothing you type is ever uploaded: completions run on a local model, and the app makes only two kinds of network request — model weights from Hugging Face, and a once-a-day version check against the GitHub Releases API that sends nothing about you (off in Settings → General).
Don't take that on faith. The entire input path is three files worth reading: AXText.swift reads the field, KeyTap.swift watches for the accept key, TextInjector.swift types back. Everything the app stores, and how to remove all of it, is in Privacy & permissions.
Most autocomplete lives inside a single editor and ships your text to a server. Pretype works in every macOS text field — Mail, Slack, Notes, Safari, VS Code — and never leaves your machine. No account, no subscription, no API key.
It's a free, MIT-licensed alternative to Cotypist — a from-scratch reimplementation of the same idea, not affiliated with it.
- Any text field — native AppKit/SwiftUI apps, Electron apps (VS Code, Slack, Claude Desktop), and web views.
- Ghost text at the caret — baseline-matched and sized to the field's own font, or a floating panel if you prefer that.
- Tab to accept — one word at a time, ⇧Tab for the rest, or just keep typing to reject. The part one Tab will take renders a step brighter. Switchable to ⌘Space, ⌥Space or ⌃Space in Settings.
- Inline typo fixes — a correction pill above the misspelled word, Tab to apply. Uses the macOS spell-checker in whichever language it detects from the surrounding text.
- Emoji shortcodes — type
:shrug:and 🤷 is offered in the same pill, Tab to take it. A handful of Gemoji nicknames plus every Unicode character name macOS already knows, so:rocket:and:thinking_face:work without shipping a table. - Rewrites (⌥Tab) and reply drafts (⌥⇧Tab) — select clumsy text and the local model fixes grammar, typos and phrasing in place, keeping your tone; with nothing selected it fixes the word you just typed. Add ⇧ (or double-tap a modifier) and it drafts your next message from the conversation on screen instead. Both are measured per model — the strongest sibling restores 65% of noisy lines byte-exactly — and both tasks have opposite winners, so Choosing a model has the table. On some models this needs a separate instruct sibling, downloaded once on first use (≈2.2 GB on MiniCPM5, up to ≈5 GB on a base-style Gemma; the menu bar shows preparing…).
- Hold a key and talk (macOS 26+, off by default) — hold ⌥, say the sentence, let go: it is typed into the field you're already in. Transcribed by the system's own on-device speech models, so nothing is downloaded from us and no audio is written to disk or sent anywhere. Apple's newer speech model covers 30 locales (English, German, Spanish, French, Italian, Japanese, Korean, Portuguese, Cantonese, Chinese); everything else — Russian included — uses the model behind macOS's own dictation key, which is rougher and writes no punctuation. That's what the tidy-up pass is for: the transcript goes through the same minimal-edit fix ⌥Tab uses, restoring the punctuation and capitalization speech doesn't carry — which on the models that need a separate instruct sibling means the same one-time download ⌥Tab would trigger (dictations don't wait for it — they land as heard while the fetch runs in the background, and the tidy-up starts once it's done). Language follows your keyboard layout, so switching layout switches dictation language.
- Fast — 49–145 ms warm completions across the local models, by prefilling only the newly typed tokens and reusing the KV cache.
- Knows where it is — adapts per app, stays out of terminals and password managers, and stops reading entirely while macOS reports secure input. Where you almost never take its suggestions it goes quiet by itself, and says so in the menu with the numbers and a one-click Resume. Optional on-screen OCR pulls in surrounding context.
- Sounds like you — one persona plus per-app style instructions, learned from a local journal you can clear or switch off at any time.
brew install --no-quarantine nikiomori/tap/pretypeApple Silicon only (M1 or newer) — MLX does not run on Intel Macs. --no-quarantine skips the Gatekeeper "Open Anyway" dance (releases are ad-hoc signed, not notarized — see step 2 below); to keep skipping it on every brew upgrade, put export HOMEBREW_CASK_OPTS="--no-quarantine" in your shell profile. Then continue from step 3.
- Apple Silicon only (M1 or newer). Grab
Pretype.app.zipfrom Releases, unzip, and movePretype.appto/Applications. - Clear the quarantine flag. Releases are ad-hoc signed and not notarized, so Gatekeeper blocks the first launch — expected, not a warning sign:
(Or open it via System Settings → Privacy & Security → Open Anyway.) Developer ID signing is planned; until then an in-place updater would change the code signature and make macOS revoke the Accessibility grant the app runs on, so updates stay manual.
xattr -dr com.apple.quarantine /Applications/Pretype.app
- Launch it and grant Accessibility when prompted. If you grant it after launching, restart the app.
- On first launch Pretype downloads one model from Hugging Face (≈1.6–6.8 GB, sized to your Mac's memory — the strongest tier that stays within about a quarter of it; the menu-bar icon shows progress). Any other model is one click in Settings → Model; Choosing a model has the eval numbers behind the default.
- Pretype lives in the menu bar — no Dock icon, no main window. Click the icon for status, Diagnostics, and Settings… (⌘,).
Note
Requires full Xcode 26 or newer — the Apple Intelligence engine imports the FoundationModels framework, which is absent from Xcode 16.x, and the MLX engine needs the Metal compiler. Command Line Tools alone are not enough. The prebuilt app above needs none of this.
xcodebuild -downloadComponent MetalToolchain # once
git clone https://github.com/nikiomori/Pretype.git && cd Pretype
./Scripts/make-app.sh # builds build/Pretype.app
open build/Pretype.appDev loop, headless harnesses and the SwiftPM/Metal caveat live in the Contributing Guide.
Inline typo fix. Tab applies it, Esc dismisses.
Rewrite (⌥Tab). ⏎ takes the rewrite, Esc keeps your original.
Two presentation modes. Inline ghost text stays pixel-accurate even in Electron apps.
Settings show their cost. Hover any option and the accuracy / speed / memory / compute meters preview the change before you commit it.
Your voice, per app. Formal prose in Mail, short replies in Messages.
flowchart LR
App["Focused App<br/>Any text field"] -->|AX API Text| FocusTracker
FocusTracker -->|Prompt| MLX["MLX Engine<br/>Local LLM"]
MLX -->|Suggestion| Window[Suggestion Overlay]
Window -->|Ghost Text| App
App -->|Keystrokes| EventTap
EventTap -->|Tab Caught| Injector[Text Injector]
Injector -->|Simulated Keys| App
- FocusTracker follows the focused text element via
AXObserverand reads the text around the caret on each keystroke. - The CompletionEngine — a local MLX model, debounced and cancellable — returns a short continuation, or stays silent.
- SuggestionWindow draws the ghost text, size- and baseline-matched to the caret.
- A CGEventTap catches the accept key. If you take the suggestion, TextInjector types it into the active app as synthetic key events.
Rendered at pretype.app/docs, written in docs/.
| Architecture | Engines, the model catalog, quantization tiers, the KV cache, and how the app decides to stay quiet |
| Choosing a model | The eval behind the defaults, what each tier costs in RAM and latency, and how to pick for your languages |
| Privacy & permissions | Every permission and why it's needed, what's stored on disk, and how to uninstall completely |
| Troubleshooting & FAQ | Reading Diagnostics, the common failure modes, and the questions that keep coming up |
| Fine-tuning | Training a small base model on your own writing, end to end on your Mac |
- OS — macOS 14+ (macOS 26+ for the Apple Intelligence engine)
- Hardware — Apple Silicon (M1 or newer). Intel Macs can't run MLX at all.
- Memory — 8 GB is enough; the default is sized to about a quarter of your Mac's memory (≈1.6 GB resident on 8 GB Macs up to ≈6.8 GB from 32 GB), and the catalog goes down to ≈1 GB. Big-RAM Macs can pick Gemma 4 E4B 8-bit at ≈8.6 GB.
- Storage — ≈1.6–6.8 GB for the default model (sized to your Mac); 1–8.6 GB depending on what you pick. Using ⌥Tab can add a one-time instruct sibling (≈2.2 GB on MiniCPM5, up to ≈5 GB on a base-style Gemma; none on Qwen3.5 or Bonsai, which correct with themselves, or on a Gemma in its recommended Instruct style)
- To build — full Xcode 26+ (macOS 26 SDK + Metal toolchain). Not needed for the prebuilt app.
Pretype is young and moving fast — bug reports, ideas and pull requests are all welcome.
- Open an issue for bugs and feature requests
- Read the Contributing Guide and Code of Conduct
- Report security issues privately per SECURITY.md
If Pretype is useful to you, a ⭐ helps others find it.
MLX and mlx-swift-lm — Apple's on-device ML stack · MiniCPM and Qwen — the default models · Gemma — the heavy-duty option · swift-transformers — tokenizers and hub client · Cotypist — the original inspiration.
MIT — free for personal and commercial use. Bundled libraries and downloadable model weights carry their own licenses; see THIRD_PARTY_NOTICES.md.