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, this article isn't trying to talk you out of it.
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.
The trade-off is real and worth naming. YAML config is text you can put in git, diff, share as a gist, and generate programmatically. A GUI database can't be version-controlled the same way. If your snippet library lives in a dotfiles repo and you like it there, that's a genuine reason to stay on Espanso. We're not going to pretend a visual editor wins that argument.
Do I have to recreate my snippets by hand?
No. ToolPiper imports snippets from TextExpander (.textexpander files), Raycast (JSON export), and generic CSV, so an existing library transfers over including triggers and expansion text. Espanso's YAML files aren't a direct import format, so Espanso snippets are the one case you'd move over by hand or by converting to CSV first.
If you're coming to ToolPiper from TextExpander or Raycast, the import path is direct. Espanso is the gap. Its match files are YAML, and ToolPiper doesn't read them natively. The practical route is to export or script your Espanso triggers into a CSV (trigger, replacement) and import that. For a few dozen snippets, recreating them in the editor is also faster than it sounds, because you're typing them once and getting the dynamic-value picker for free.
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 is local, the inference is local, and you don't have to take our word for it - you can confirm it by watching network traffic while you fire a ;fix on a paragraph and seeing nothing leave the machine. 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 autofills don't land in history - concealed, one-time-password, and transient pasteboard items are skipped, and 1Password, Keychain, 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 roughly 140 milliseconds end-to-end, 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.
When Espanso is the right call
Be honest about this. There are people who should stay on Espanso, and recommending ToolPiper to them would be wrong.
If you need Windows or Linux, Espanso is cross-platform and ToolPiper is macOS only. That's not a feature gap we're closing - the action snippets and selection capture depend on macOS Accessibility and CGEvent APIs that don't exist elsewhere. If your workflow spans a Mac and a Linux box and you want one expander on both, Espanso is the answer.
If you live in YAML and like it - version-controlled config, scriptable extensions, snippets generated by other tools - that's a real strength and a real reason to stay. ToolPiper's GUI is faster to edit by hand but it isn't a text file you can commit. And if you simply want a free, open-source, single-purpose expander with no AI and no extra surface area, Espanso does exactly that and does it well.
The case for switching is narrower and specific. 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. If that's you, ToolPiper fits. If it isn't, 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.
And ToolPiper isn't cross-platform. Espanso wins that outright. We're a Mac tool by design.
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 TextExpander or Raycast library from Settings, 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.
