Snipsy

by dimagious
5
4
3
2
1
Score: 54/100

Description

Hotstring expansion for Obsidian - auto-expand triggers like :todo into - [ ], with a community package catalog

Reviews

No reviews yet.

Stats

8
stars
5,077
downloads
0
forks
140
days
4
days
4
days
70
total PRs
0
open PRs
1
closed PRs
69
merged PRs
4
total issues
0
open issues
4
closed issues
238
commits

Latest Version

5 days ago

Changelog

What's Changed

Full Changelog: https://github.com/Dimagious/snipsidian/compare/1.4.0...1.5.0

README file from

Github

Snipsy

Downloads Latest release Stars

Install · Defaults · Packages · Questions · Website

Type todo and a space, get - [ ]. Snipsy turns short triggers into text as you write in Obsidian. No scripting, and no templates to learn. It knows where markdown is code, so it stays quiet in code blocks and frontmatter.

Take the tour on the website: every feature, a live expansion demo, and screenshots in light and dark.

A snippet is two strings, a trigger and what it becomes:

note  →  > [!note]
         > |          ← the cursor lands here

What it is used for

What ships with it

Sixteen triggers, in one group called Defaults. Type the trigger, then a space.

Trigger Becomes
todo · done - [ ] · - [x]
h1 · h2 · h3 # · ## · ###
bold · italic · code **|** · _|_ · `|`, cursor inside
note a > [!note] callout, cursor on the body line
table a 3×3 table, cursor in the first cell
today · now 2026-09-28 · 14:05
brb · omw · ty · imo be right back · on my way · thank you · in my opinion

Delete the group and it stays deleted. Settings → Snipsy → Restore default snippets brings back the missing ones and leaves everything you added alone.

How it differs from a template plugin

Templater and friends run code to build text. Snipsy swaps a word for a string. Four consequences of that, worth knowing before you install anything:

  • Nothing to learn. A snippet is a trigger and a replacement. The one bit of syntax is $|, the spot where the cursor lands.
  • It reads markdown. A trigger inside a fenced code block, inline code or YAML frontmatter stays as you typed it. So does a trigger in the middle of a word.
  • Only your typing fires it. Pasting text that ends in todo , undo, redo, drag and drop, another plugin's edit, IME composition for Chinese, Japanese or Korean: none of these expand anything.
  • It works on your phone. Same snippets, same picker.

What it does not do: JavaScript or dynamic templates (that is Templater), expansion outside Obsidian (Espanso), Tab-stops that jump between fields.

Install

Settings → Community plugins → Browse → search for Snipsy → Install → Enable.

Then open a note, type todo and a space.

For the snippets you do not remember by name, run Snipsy: Insert snippet… from the command palette. It searches triggers and replacements, previews the result, and inserts at the cursor. Select some text first and $1 in the snippet receives it. Settings → Snipsy → Set hotkey for Insert snippet opens the Hotkeys tab already filtered to that command.

On Obsidian 1.13 and later, Snipsy's settings are native: Snippets and Packages open as pages, everything else sits right on the Snipsy settings screen, and Obsidian's settings search finds them ("prefix", "hotstring", "export"). On older Obsidian the same settings are grouped into Snippets, Packages, General and About tabs.

How expansion works

A trigger expands when a separator lands after it: a space, Tab, Enter, or one of . , ! ? ; : ( ) [ ] { } " '. The separator stays where you typed it.

You type:   todo·
You get:    - [ ] ·

· is the space you typed. Undo right after an expansion takes back the trigger and the expansion together, in one step.

Prefix mode

If now or today keeps turning into a time in the middle of your sentences, you have three answers. Delete that one snippet. Switch off the whole Defaults group with the toggle on its header. Or turn on Require a prefix before triggers under Settings → Snipsy → Expansion: from then on todo stays a word, and only :todo (or ;todo, your pick) expands. The prefix is eaten by the expansion. It is one switch for every snippet, off by default.

Your own snippets

Settings → Snipsy → Snippets → Add snippet. Trigger sig, replacement:

Best,
Dmitriy

Save, and sig followed by a space is your signature in every note.

Placeholders

Placeholder Becomes
$| where the cursor lands after expanding
$date today, YYYY-MM-DD
$time now, HH:MM
$filename the current note's name
$clipboard what is on your clipboard at that moment
$1 the selected text, when you insert the snippet from the picker over a selection

Groups

Every snippet lives in a group. Packs and imports each get their own, so a whole pack comes out the way it went in: delete its group. The toggle on a group's header mutes it without deleting anything: its snippets stop expanding and leave the picker, and stay in the list, dimmed, for when you want them back. Selection mode moves or deletes many at once; a delete names the first five triggers before it asks.

Packages

Community catalog

Settings → Snipsy → Packages. Twelve packs, one click each:

Markdown Essentials Obsidian Power-User
Daily Journal GTD & Productivity
Meetings Developer Boilerplate
Code Review Research & Academic
Symbols & Math Date & Time
Obsidian Callouts Basic Emojis

Reinstalling a pack whose snippets you have edited opens a preview before anything is written: keep your version or take the pack's, snippet by snippet. A pack that wants a trigger already used by a different snippet in another group is not installed, and the notice names the trigger. The catalog lives in Dimagious/snipsidian-community. Made a pack worth sharing? The Packages page opens a GitHub issue with it already filled in.

Espanso import

Paste the YAML of any package from hub.espanso.org, name a group, press Import snippets. Espanso's cursor marker, clipboard variable and plain date variable become $|, $clipboard and $date. Forms, scripts, shell commands, regex triggers and images have no equivalent here. Those are skipped and named, "12 imported, 3 skipped: …", instead of landing in your notes as broken {{text}}.

Backup

Settings → Snipsy → Export snippets saves every snippet to a JSON file, Import snippets brings them back. On a phone, where browsers cannot download, the export lands in the vault root as snipsidian-snippets.json.

Privacy

Snipsy reads and writes one file: .obsidian/plugins/snipsidian/data.json. It goes online only when you open the Packages page, to api.github.com for the list and raw.githubusercontent.com for the pack you install. No analytics, no telemetry, no account.

$clipboard reads your clipboard when a snippet with it expands. None of the defaults use it; the install preview shows it when a third-party pack does.

Questions

No. Fenced code, inline code and YAML frontmatter are left alone, and so is a trigger that is part of a longer word.

Delete that snippet, switch off the Defaults group, or turn on prefix mode so only :now expands. See Prefix mode.

Yes. The plugin is not desktop-only, and the picker fits a phone screen.

No. $1 takes the selected text when you insert from the picker. There is no jumping between fields with Tab, by design.

No. See Privacy.

If something is wrong, or missing

Open an issue with what you typed and what you got. Snipsy's settings have Report a bug and Suggest a feature rows that open a prefilled issue.

The feature list is short on purpose. No scripting, no Tab-stops, one prefix switch for everything. Those are decisions, and the fastest way to change one is to say what you tried to do and could not.

Also by the author

Dashy: a dashboard inside an Obsidian note, built from six markdown blocks (tiles, number cards, progress bars, countdowns, a year heatmap). A few lines of YAML each, no JavaScript, no Dataview. Plugin listing · GitHub

If Snipsy saves you keystrokes, a star on GitHub helps other people find it, and a coffee says thanks.

Development

npm install
npm test           # vitest, with coverage gates
npm run lint       # eslint + eslint-plugin-obsidianmd
npx tsc --noEmit
npm run build      # main.js + styles.css
npm run e2e the suite against a real Obsidian
npm run scorecard:check mirrors the community-plugin review scanner
npm run release:check versions in sync, tests, build

VAULT_PLUGIN="/path/to/vault/.obsidian/plugins/snipsidian" npm run dev:vault builds straight into a test vault and watches for changes.

The matching engine lives in src/engine/, which imports neither Obsidian nor the DOM and is tested without mocks.

License

MIT © Dmitriy Yurkin