Bring your library.
Leave the lock-in.
One-click import from ten text expanders, including TextExpander, Text Blaze, Magical, and Espanso. Hotwords, snippet bodies, and the supported subset of dynamic placeholders carry over. Folder/group/collection structure flattens to a single category at the preview step - re-categorise once after import and you are set.
parsed
migration
carry over
free
Which one are you moving from?
Jump to the exact export + import steps for your tool. The top four cover most migrations; the rest are parsed too.
{{label}} placeholders import cleanly. Collections are flattened - re-categorise after import.Three steps. Under two minutes.
Same process no matter which tool you are coming from. Export from the old tool, drop the file into Makro, start typing. Your existing hotwords work as they did.
.ahk script directly. Save the file locally.library.csv.sig still expands to your signature, /refund to your refund template. Now also encrypted end-to-end..sigExact instructions for every supported tool.
Click any tool to expand the step-by-step export guide and see what Makro preserves during import. No hidden gotchas.
.csv file anywhere on your computer.[$PROMPT] placeholders
.json file.text field.
{formtext}, {formparagraph}, {formmenu} with name/default/values convert to [$PROMPT:Label:text] / :textarea / :select. {formdate} and {formtoggle} are not parsed and remain as literal braces in the macro body.
{date}, {time}, {datetime}, {date:fmt}, {time:fmt}, {clipboard}, {cursor}, {key:tab}, {key:enter} convert to native equivalents.
{repeat: N}...{endrepeat} converts to [$REPEAT:N:...]; N is clamped to 1000 and nesting beyond 20 levels is left literal with a warning.
{if}/{else}/{endif} keywords convert to [$IF]/[$ELSE]/[$ENDIF], but the conditions only evaluate against Makro's seven built-in context variables (site, url, time, day, field, lang, os) using =, !=, or ~. Form-variable conditions, {elif} chains, and complex expressions evaluate as false at runtime - imported snippets that branch on user-entered values will need to be rewritten.
{=expression} equation blocks have no Makro equivalent and are left as literal text.
{trim}, {set}, {get}, {urlEncode}, {include}, {import}, {note}, {site:...} are not converted - they stay as literal braces in the macro body and surface in the importer's "unconverted" report.
~/.config/espanso/match/ (Linux/macOS) or %APPDATA%\\espanso\\match\\ (Windows)..yml file you want to migrate. To move several files, concatenate their matches: arrays into one file first - the importer accepts one file per run.matches: entries and creates a macro for each trigger/replace pair.magical.json, and import into Makro.plainTextBody first, then falls back to body)
{{label}} placeholdersConvert to [$PROMPT]
.csv file..ahk script file (usually in Documents)..ahk directly into Makro.::trigger::replacement patterns and creates a macro for each.::abc::expansion lines
.alfredsnippets file, which is a zip archive..zip and extract it. Inside you will find one .json file per snippet and an info.plist.{date}, {clipboard} map to Makro equivalents
.tsv).Two things you will lose.
Every switch involves tradeoffs, and we would rather name ours than bury them. Makro is a browser extension. Two things that desktop text expanders can do, Makro cannot.