Espanso is a good piece of software. It's free, it's open source, it runs on macOS, Windows, and Linux, and its scripting and extension model goes deeper than most paid expanders. If you've already got a match/base.yml open in your editor and you're happy there, stay there.
But there's a specific moment that sends people looking for an Espanso alternative on Mac. You want to add a snippet, and the workflow is open a YAML file, get the indentation right, save, and trust that the daemon reloaded. For a quick ;addr snippet that's fine. For a library you tweak weekly, hand-editing config files is friction you feel every time.
ToolPiper is a free, local Espanso alternative that keeps the parts you like - delimiter-and-abbreviation expansion, dynamic values, local-first, no subscription - and swaps the YAML for a visual editor. On top of that it adds something Espanso doesn't ship. AI transforms rewrite selected text with a model running on your own Mac. It also folds in clipboard history and push-to-talk dictation, so the three menu bar apps you'd otherwise run become one.
How does text expansion work without config files?
Text expansion watches what you type, and when a trigger like ;addr appears with whitespace or punctuation on both sides, it deletes the trigger and types the expansion in its place. ToolPiper does this through a visual editor instead of a config file - you add a snippet in a form, set its trigger and expansion, and it works immediately.
The mechanism is the same one Espanso uses. A background process monitors keystrokes, matches the longest defined trigger first, and replaces it. Espanso stores those triggers as YAML entries in match files. ToolPiper stores them in a local database you edit through a GUI. The expansion engine is identical in spirit. The editing surface is the difference.
Triggers match on whitespace and punctuation boundaries, so ;fix never fires inside the word ;fixed. That's the same flanking rule a careful Espanso config relies on, except you don't configure it - it's how the matcher works.
What can ToolPiper do that Espanso can't?
ToolPiper adds AI text transforms with no Espanso equivalent: select text, tap the right Command key, and a local language model rewrites it in place. It also bundles clipboard history and push-to-talk dictation, and it gives you a visual editor for snippets and dynamic values that Espanso configures through YAML.
The headline difference is the AI transform. Select a paragraph, tap right Command (a press-and-release under 250 milliseconds), and the selected region gets replaced by a rewrite. Twelve transforms ship built in:
;fix- grammar and spelling;formal/;casual- tone;concise/;expand/;simplify- length and clarity;bullets/;summary/;tldr- structure;active- passive to active voice;email/;rewrite- general reshaping
You can chain them. Type ;fix ;formal and ToolPiper runs the fix first, then the formal rewrite, in document order, up to four stages. If any stage produces empty output the chain aborts and your original selection is preserved. There's no clipboard read anywhere in this path - the selection is the only input, which keeps the behavior predictable.
Where does the rewrite happen? It tries Apple's on-device model first (Foundation Models), and falls back to ToolPiper's local language model over loopback for longer or rejected inputs. Either way the text never leaves your Mac. Espanso can run shell scripts and call external commands, so a determined user could wire up a script that pipes text to a local model. ToolPiper ships that as a first-class feature with a muscle-memory trigger, not a scripting exercise.
The visual editor vs YAML
Here's the part that actually changes the day-to-day. In Espanso, a snippet with a dynamic date looks like a YAML block with a matches key, a trigger, a replace string, and a vars section pointing at the date extension with a params format string. Get the indentation wrong and the daemon won't load it. It's powerful and it's also a config language.
In ToolPiper you open the snippet editor, type the trigger, type the expansion, and drop in a dynamic value from a list. Eleven dynamic utilities resolve at expand time:
;today- long date,;date- short date;time,;now,;iso,;timestamp(ISO 8601);name- your full name,;login- short user name;myemail- your license email;host- computer name,;app- the frontmost app
Cursor placement uses a %| marker dropped right in the expansion text - type it where you want the cursor to land after expansion. Case behavior is a setting, not a script. Choose sensitive, ignore, or adapt (so ;sig typed as ;SIG can come back uppercased). Expand-when context rules live in the same form. None of it is hand-edited config.
Espanso's config-as-files model is a real strength. YAML config is text you can put in git, diff, share as a gist, and generate programmatically, which is why power users keep their Espanso library under version control in a dotfiles repo.
Do I have to recreate my snippets by hand?
No. Point ToolPiper's importer at your Espanso match directory and it reads the YAML match files directly, triggers and expansion text included. It also imports TextExpander, Raycast, Alfred, Apple Text Replacements, CSV and TSV.
The importer maps each match's triggers, word-boundary and case settings onto ToolPiper's snippet model, resolves variables where the value is fixed, and finishes with a counted report of anything it skipped or transformed. Script, form and regex matches have no one-to-one equivalent, so they show up in that report by name rather than arriving as broken text. Importing the same directory twice changes nothing.
Why local matters for text you type all day
Snippets and transforms touch the most sensitive text you produce. Client emails, contract language, code, internal notes. An AI rewrite that ships that text to a cloud endpoint is making a choice on your behalf about where your words go.
ToolPiper's transforms run on your Mac. The model and the inference are local, and you can confirm it by watching network traffic while you fire a ;fix on a paragraph: no request carries your text. That's the same posture Espanso users already value, because a local-first tool doesn't have a server to leak to. The difference is that ToolPiper extends that property to the AI rewrite, which is exactly the operation a cloud expander would phone home for.
Espanso shares this value, and that's the point. Both tools keep your text on your machine. We respect that overlap rather than claiming it as a wedge - the wedge is the editor and the AI, not privacy.
One app instead of three
Run Espanso for expansion and you'll still reach for a clipboard manager and probably a dictation tool. ToolPiper carries all three.
The clipboard history keeps 200 items by default (configurable from 50 to 2000), with fuzzy search across the text, any OCR'd text, the source URL, and the source app. Copy a screenshot and Apple Vision OCRs it so the text inside becomes searchable. It tracks which app you copied from, including the browser tab URL for Safari, Chrome, Firefox, Arc, Brave, Edge, and Vivaldi. Password-manager copies don't land in history - items flagged concealed, transient, or auto-generated are skipped, and 1Password, Keychain Access, LastPass, and Dashlane are on the capture-ignore list by default.
Push-to-talk dictation is the other piece. Hold a key, speak, release, and the transcribed text appears in the focused field. The speech-to-text runs on Apple's Neural Engine at 127 to 173 ms end-to-end in our testing, with the Parakeet engine processing around 210x realtime. It works offline and the audio stays on your Mac. We cover the engine in detail in push-to-talk on Mac and local voice transcription.
What does Espanso do well?
Espanso has real strengths, and they're worth naming plainly.
It runs on every desktop platform. Espanso supports macOS 10.13 or later on Intel and Apple Silicon, Windows, and Linux on X11 and Wayland. If your workflow spans a Mac and a Linux box and you want one expander on both, Espanso covers it.
Its config is code. YAML match files can live in git, sync with any tool, and be generated by other programs, and the scripting goes deep: shell and script output, forms, regex triggers, and per-app rules. It's free and open source under GPL-3.0, with source anyone can audit, packages on Espanso Hub, and releases continuing in 2026 under new maintainers. If you want a free, single-purpose expander with no AI and no extra surface area, Espanso does exactly that and does it well.
ToolPiper fits a different shape of work. You're on a Mac, you'd rather click than hand-edit YAML, and you want AI rewrites and clipboard and dictation in one local app. Espanso is a tool we respect.
What ToolPiper doesn't do
Snippet expansion works in most standard text fields, but apps with non-standard text input - some terminal emulators, certain Electron apps, custom text engines - may not accept injected text. The clipboard and AI snippets still work there, you just paste manually.
App-aware suppression of snippet triggers isn't built yet. The clipboard capture skips password managers, and the action-snippet selection capture refuses secure and password text fields (it probes the focused element's accessibility role and fails closed if Accessibility is denied or times out at 250 milliseconds). But ordinary typed-trigger expansion doesn't yet suppress itself by app, so that's a real limitation today, not a settled capability.
Get ToolPiper
ToolPiper is a free download from modelpiper.com (DMG). It requires macOS 26 or later and Apple Silicon (M1+). It's not on the Mac App Store because Accessibility and CGEvent APIs are incompatible with the App Store sandbox - the same reason TextExpander, Raycast, and Alfred ship outside it. Import your Espanso, TextExpander or Raycast library from the Snippets pane, or start fresh in the snippet editor.
This is part of a series on text expansion and clipboard tools for Mac and the broader pillar on local-first AI on macOS. If you're weighing the whole category rather than Espanso specifically, the local TextExpander alternative walkthrough covers the same engine from the subscription-tool angle.
