Docs
Everything Expando does, in the order you are likely to need it.
Getting started
Expando lives in the menu bar. The first launch asks for Input Monitoring and Accessibility, explains what each is for, and starts working the moment they are granted: no restart.
A sample library is there to type at straight away. Open any app and type ;sig then
Tab.
How a snippet fires
Three things decide it, and each can be set for the whole app, for a group, or for one snippet.
The prefix
A snippet stores sig; you type ;sig. The prefix is one setting rather than a
character repeated on every snippet you own. A snippet can take the global prefix, take none at all
(which is what an import does, so your existing abbreviations keep working unchanged), or bring its own.
The expansion key
Tab out of the box. Nothing else types a Tab in the middle of a sentence, so it cannot fire a snippet by accident, and Expando swallows it so it is never left in the text. Turn on Space, Return, punctuation or any other character in Settings › Expansion. Anything except Tab stays in the text unless the group is set to drop it.
The timing
| Setting | What happens |
|---|---|
| When an expansion key is pressed | The usual one. The key stays in the text. |
| And drop that key | The key goes with the abbreviation. |
| The moment it is typed | No key needed. Good for autocorrect-style snippets, and the reason a short abbreviation can shadow a longer one; Expando flags that in the list. |
Tokens
Anything in braces is a token. A brace with no closing brace on the same line is just a brace.
| Token | What it becomes |
|---|---|
{cursor} | Where the caret ends up |
{clipboard} | Whatever you last copied |
{date}, {time} | Today, and now |
{date yyyy-MM-dd} | Any format you like |
{date +3d}, {date +1w -2d MMM d} | Date arithmetic, chainable.
Units: s m h d w M y |
{snippet:;sig} | Another snippet, by abbreviation or by name, eight deep |
{1}, {name} | Capture groups, when the abbreviation is a regular expression |
{clipboard|trim|uppercase} | Modifiers, chainable: uppercase,
lowercase, capitalize, titlecase, trim,
urlencode, jsonescape, firstline |
Fill-ins and forms
Any token Expando does not recognize is a question. Hi {Name}, asks for a name in a small
form before it expands, with a live preview of the result.
Give a field a type in the editor and the form uses the right control: a single line, several lines, a list to pick from, or a date. An optional section is a block you can leave out:
Thanks.{#Calendar} My calendar is open from {date +1w}.{/} Best,
The section is ticked by default and takes its own fill-ins with it when you untick it.
Pressing keys
{key tab}, {key return}, {key up} and the rest are real key
presses at the caret, not characters. That is what lets a code snippet expand and then walk the caret
back into the block it just wrote.
A snippet that presses keys does not arm the undo window: the caret has moved somewhere only the app knows, so there is nothing safe to reverse.
Scripts
A snippet can be a shell command, an AppleScript or a JavaScript, and what it prints is what expands. Tokens render into the script before it runs, so a script can take a fill-in. Scripts are off until you turn them on in Settings › Scripts & AI, because an imported library can carry one without anyone noticing.
AI snippets
A snippet can be an instruction to Anthropic or OpenAI, expanded into the answer. It uses your own API key, kept in the macOS Keychain, on your own account and your own bill. The call happens only while that snippet is expanding. Expando has no key, no proxy and no server in the path.
Importing
File › Import reads TextExpander (.textexpander, Settings.textexpander,
the CSV from app.textexpander.com), Typinator (.typinatorset), Espanso
(.yml), Alfred (.alfredsnippets), Raycast JSON, macOS Text Replacements, and
any two-column CSV or TSV.
Import only ever adds. A snippet identical to one you have is skipped, one with an abbreviation you
already use is added and tagged duplicate, anything Expando could not translate is tagged
review with a note saying what, and a backup is taken before a single thing is written.
Export writes Expando JSON, a TextExpander group file, CSV, plain text or Markdown, for the whole library or the groups you choose.
Sync and backups
Off by default. Two ways to turn it on, both of them yours rather than ours:
- A sync folder. Point Expando at a folder iCloud Drive, Dropbox, Google Drive or a NAS already keeps in step, and point another Mac's Expando at the same one.
- iCloud. Your own account, a private database, through Apple's frameworks.
If two Macs change the same group before either has seen the other, both versions are kept and Expando asks which one you meant. Nothing is thrown away to resolve a conflict.
Separately, and whatever sync says, the library is snapshotted daily and kept thirty days, plus once before every import.
When it does not fire
Expando keeps a log of every attempt: what fired, in which app, by which mechanic, how long it took, and when it did not fire, why. It records lengths, never text.
| What you see | What it usually means |
|---|---|
| Nothing happens at all | The key you pressed is not one of its expansion keys. The log says so in as many words, and so does Settings › Expansion. |
| The menu bar mark has a lock on it | Another app has Secure Input on. The menu names it and offers to relaunch it. |
| The snippet list never opens | Another app already holds that shortcut. Settings › General says which, and offers a free one. |
| A snippet is flagged in the list | Two snippets answer to the same trigger, or a shorter one set to expand immediately fires first. |
Not on sale yet. The people who ask first pay less.
Expando is finished enough to use and not finished enough to sell. Leave an address and you get the signed beta build before anybody else, and a launch price only this list gets. We'll email you when it opens.