Migration - under two minutes

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.

10Tools
parsed
<2 minTypical
migration
HotwordsAll triggers
carry over
$0Import is
free
Pick your current tool

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.

The flow

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.

1
Export from your current tool.
Use the built-in export. Most support CSV or JSON. For AutoHotkey, use your .ahk script directly. Save the file locally.
Open source tool
File → Export
+Save library.csv
~60s estimated
2
Drop into Makro's importer.
Install Makro, open Settings → Import, pick your source format. Drop the file in. Makro auto-detects the layout, converts placeholders, and flattens folder/group structure to a single category at preview - re-organise once after import. All encrypted on-device.
Makro → Settings
Import → Choose file
+Macros imported
~30s estimated
3
Start typing. Same hotwords, same result.
Your existing hotwords fire as before. .sig still expands to your signature, /refund to your refund template. Now also encrypted end-to-end.
Type .sig
Press space
+Expansion fires
~0s instant
The full playbook

Exact 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.

How to export
01
Open TextExpander and select the snippet group you want to export.
02
Go to File → Export → CSV, or right-click the group and choose Export.
03
Save the .csv file anywhere on your computer.
04
In Makro: Settings → Import, select TextExpander (.csv), choose your file.
05
Done. Your macros appear organised, encrypted, and ready to use.
What carries over
+
Hotwords (abbreviations)All trigger strings preserved exactly
+
Snippet titlesBecome macro names
~
Snippet bodiesCSV body cell is preserved as plain text. TextExpander rich-text formatting (bold, italic, fonts, inline images) is not parsed - export to plain text in TextExpander first if formatting matters.
x
Group structureTextExpander groups are flattened on import. The CSV importer reads abbreviation/snippet/label columns only; group metadata is not consumed and the import flow drops every macro into the single Makro category you pick at the preview step. Re-categorise by hand after import.
~
Fill-ins (macros with blanks)Convert to [$PROMPT] placeholders
x
Team/shared snippetsExport per-person; merge manually
How to export
01
Open the Text Blaze dashboard in your browser.
02
Go to Settings → Export. Select JSON format.
03
Download the .json file.
04
In Makro: Settings → Import, select Text Blaze (.json), choose your file.
05
Makro converts the supported subset of Text Blaze's dynamic placeholders to native Makro syntax. Unsupported tokens stay literal so nothing is silently dropped.
What carries over
+
Shortcut triggersPreserved exactly as hotwords
~
Snippet bodiesPlain-text bodies preserved verbatim. Text Blaze rich-text formatting (bold, italic, lists, colors, fonts) is not parsed - bodies land as the raw text content of the export's text field.
x
Folder structureText Blaze folders are flattened on import. Every snippet lands in the single Makro category you pick at the import-preview step - folder names are discarded and not reused as subcategories. If you organise heavily by folder in Text Blaze, plan to re-categorise after import.
~
Form fields → prompts{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 + simple tokens{date}, {time}, {datetime}, {date:fmt}, {time:fmt}, {clipboard}, {cursor}, {key:tab}, {key:enter} convert to native equivalents.
~
{repeat} blocks{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 block structure{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.
x
Equation / math blocksText Blaze's {=expression} equation blocks have no Makro equivalent and are left as literal text.
x
Command tokens{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.
x
Real-time team syncExport team folders individually; recombine on import
How to export
01
Your Espanso matches live in ~/.config/espanso/match/ (Linux/macOS) or %APPDATA%\\espanso\\match\\ (Windows).
02
Pick the .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.
03
In Makro: Settings → Import, select Espanso (.yml), choose your file.
04
Makro parses matches: entries and creates a macro for each trigger/replace pair.
What carries over
+
Triggers → hotwordsAll triggers preserved as-is
+
Replace → bodiesMulti-line bodies supported
+
Variables (date, clipboard, random)Map directly to Makro placeholders
~
Regex triggersSupported in the parser; tuned on a per-case basis
x
Shell command outputsBrowser-based, no shell access - use local AI for equivalents
x
App-specific scopingBrowser-only, no cross-app context
How to export
01
Open Magical in your browser and navigate to your shortcuts page.
02
Open DevTools → Console (F12 or Cmd+Option+I).
03
Run the extraction snippet (Makro's importer UI links the exact one-liner).
04
Copy the resulting JSON, save as magical.json, and import into Makro.
What carries over
+
Shortcuts → hotwordsAll triggers preserved
+
Templates → bodiesPlain text bodies preserved (the parser reads plainTextBody first, then falls back to body)
x
Collection structureMagical collections are flattened on import. The parser reads a per-snippet collection hint, but the import flow drops every macro into the single target category you pick at the preview step - the collection name is not used to create matching subcategories on the Makro side. Re-categorise after import.
+
{{label}} placeholdersConvert to [$PROMPT]
x
Magical "automations"Cross-app workflows - not applicable to a browser extension
How to export
01
Open PhraseExpress settings.
02
Go to File → Export → CSV.
03
Save the .csv file.
04
In Makro: Settings → Import, select PhraseExpress (.csv), choose your file.
What carries over
+
Auto-text triggers → hotwordsAll trigger strings preserved
+
Phrases → bodiesPlain CSV body text preserved
x
Folder structurePhraseExpress folders are flattened on import. The CSV importer reads only the abbreviation/snippet columns; folder metadata is dropped and every macro lands in the single Makro category you pick at the preview step.
x
Form inputs and database queriesEnterprise-only features - no equivalent
How to export
01
Find your .ahk script file (usually in Documents).
02
No export needed - drop the .ahk directly into Makro.
03
Makro parses ::trigger::replacement patterns and creates a macro for each.
What carries over
+
Hotstring pairs → macrosAll ::abc::expansion lines
+
Multi-line replacements
x
Arbitrary script logicAutoHotkey's Turing-complete scripting has no browser equivalent
x
GUI commands, window controlsDesktop-only features
How to export
01
Open Alfred Preferences → Features → Snippets, right-click a collection → Export... The result is a .alfredsnippets file, which is a zip archive.
02
Rename the file extension to .zip and extract it. Inside you will find one .json file per snippet and an info.plist.
03
In Makro: Settings → Import, select Alfred (.json). The importer takes one file at a time - to bring over the whole collection in one pass, concatenate the extracted JSON objects into a single array first.
What carries over
+
Snippet names, keywords, and bodiesAll preserved
x
Collection structureAlfred collections are flattened on import. The Alfred parser reads keyword/text/name from each snippet object but does not consume any collection or folder metadata, and the import flow lands every macro in the single Makro category you pick at the preview step. Re-categorise after import.
~
Dynamic placeholdersAlfred's {date}, {clipboard} map to Makro equivalents
x
.alfredsnippets archives directThe importer takes JSON text, not zipped archives - extract first
How to export
01
Open Typinator → select your set → Export as Text.
02
Save as tab-separated (.tsv).
03
Import into Makro.
What carries over
+
Abbreviations → hotwordsAll preserved
+
Expansions → bodiesPlain TSV body text preserved
x
Set structureTypinator sets are flattened on import. The TSV importer is line-oriented (abbreviation tab body) with no set metadata - all macros land in the single Makro category you pick at the preview step. Plan to re-categorise per-set after import.
How to export
01
Open Beeftext → Combos → Export as CSV.
02
Save the file.
03
In Makro: Settings → Import, select Beeftext (.csv), choose your file.
What carries over
+
Keywords → hotwordsAll preserved
+
Snippets → bodiesPlain CSV body text preserved
x
Group structureBeeftext groups are flattened on import. The generic-CSV path reads only abbreviation/body columns; group metadata is dropped and the import flow lands every macro in the single Makro category you pick at the preview step.
How to export
01
Open aText preferences.
02
Select your group → Export as CSV.
03
In Makro: Settings → Import, select aText (.csv), choose your file.
What carries over
+
Abbreviations → hotwordsAll preserved
+
Expanded text → bodiesPlain CSV body text preserved
x
Group structureaText groups are flattened on import. The generic-CSV path reads only abbreviation/body columns; group metadata is dropped and the import flow lands every macro in the single Makro category you pick at the preview step.
What we will not pretend

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.

What Makro does not have yet
01
A native desktop app.
Makro works in Chrome, Edge, Firefox, and Brave, which covers most typing for most people. If you need expansion in native macOS apps like Mail or Microsoft Word, a desktop tool complements Makro. Many people run both.
02
Real-time team collaboration.
Live multi-user editing of the same snippet library is not shipped. Team Packs - exportable, shareable macro collections - are on the Phase 1 roadmap. If you need live team sync today, TextExpander Teams is better for that workflow.
Side-by-sideUsThem
Browser expansion
+
Them: varies
E2E encryptionProvider-can't-read
+
Them: rare
Unlimited free macros
+
Them: capped
Local AI rewrite
+
Them: none
Native desktop appmacOS, Windows
-
Them: most
Live team sync
Roadmap
Them: yes
System-wide (all apps)
-
Them: yes

Your library, your hotwords,
on better terms.

Free forever - imports from ten tools - no account required