Repository navigation
User Guide
How to use SnipVault day to day. The interface is identical in the web and desktop versions.
- Click New in the header.
- Fill in the form:
Field Required Notes Type ✅ (v2.3.0) Prompt or Code snippet — defaults to Prompt; see Prompt vs. code snippet below Title ✅ Up to 255 characters Description — A short one-line summary Language ✅ Pick from 35 languages; drives syntax highlighting Model / target — (v2.0.0) Which model or tool the prompt is for; see Model metadata below Tags — Up to 20; see Tags below Prompt / Code ✅ The entry body itself; a live character (and, for prompts, token) count is shown above it - Click Save.
(added in v2.3.0)
At the top of the form, choose whether the entry is a Prompt or a Code snippet. New entries default to Prompt, and you can switch an existing entry's type by editing it.
The type is a light-touch distinction that keeps the UI honest:
- Token estimate — shown only for prompts. For a code snippet the "~tokens" figure is meaningless, so it's hidden everywhere (form, card, and detail); the character (and, in detail, word) counts still show. See Token & character count.
- Labelling — the form's heading and buttons read "Prompt" or "Snippet" to match, and code snippets carry a small Code badge on the card and in the detail view. Prompts, the common case, stay unbadged.
The type is stored per entry and travels with import/export and sync. Entries created before v2.3.0 (and any synced from an older app) are treated as prompts.
Hover a snippet card and click the copy icon (to the left of edit/delete) to copy the snippet body to your clipboard. The icon briefly turns into a green checkmark to confirm. There's also a copy button inside the code block itself. Each copy is counted — see Usage tracking. If the prompt contains variables, copying opens a fill-in dialog first.
(added in v2.5.0)
Press Ctrl / ⌘ + K to open a quick launcher that fuzzy-searches your whole library by title, tag, language, or model — then copy an entry without opening the full view. Selecting a prompt that has variables opens the fill-in dialog first, just like copying from a card. Type to filter, ↑ / ↓ to move, Enter to copy, Esc to close.
(added in v3.1.0)
On the desktop, SnipVault lives in the system tray and answers a global hotkey — one that works even when the app isn't focused — so you can save or grab a prompt without switching windows. Press the hotkey (default Ctrl / ⌘ + Shift + V) and a small, always-on-top pop-up appears with two tabs:
- Capture — paste or type a prompt and save it straight into your library. Press ⌘ / Ctrl + Enter to save. If you leave the title blank, the first line becomes the title; a Prompt / Code toggle sets the kind.
- Find & copy — fuzzy-search your library and copy an entry to the clipboard. ↑ / ↓ to move, Enter to copy.
Press the hotkey again — or Esc — to dismiss the pop-up. Closing it just hides it (the app keeps running in the tray); it reopens instantly next time. The tray icon's menu offers Quick capture, Open SnipVault, and Quit, and a left-click brings the main window to the front.
Manage it in Settings → Quick capture: turn the feature off, or set a different hotkey using accelerator syntax (e.g. CmdOrCtrl+Shift+V — CmdOrCtrl, Shift, Alt plus a key). An invalid or already-taken combination is rejected when you save, so the working hotkey is never lost. Leave the field blank to fall back to the default.
Quick capture is desktop-only; the web app and the sync model are unaffected. Captured prompts are ordinary entries — they sync like any other.
(added in v2.15.0)
The detail view has a Run in menu that copies the prompt and opens it in a chat app so you can paste it in. Built-in targets are ChatGPT, Claude, Gemini, and AI Studio, and you can add your own (a name + an http(s) URL, remembered locally) or remove custom ones.
- If the prompt has variables, the fill-in dialog opens first and the site launches once you copy the completed text.
- On the desktop, the link opens in your real browser (never inside the app window); on the web it opens a new tab.
(added in v2.4.0)
Prompts can contain {{placeholders}} — for example Write about {{topic}} in a {{tone}} tone. When you copy a prompt that has them, a small fill-in dialog opens with one field per variable and a live preview; Copy filled puts the completed text on your clipboard.
- Prompts without variables copy in one click, exactly as before.
- Variable names can use letters, numbers, dots, and hyphens (
{{user.name}},{{tone-hint}}); spacing inside the braces is ignored, and a repeated variable is filled everywhere it appears. An empty field just removes its placeholder. -
Code snippets keep their literal braces —
{{ }}is only treated as a variable for entries marked as a prompt. - A small
{{ }}badge (with the count) marks prompts that have variables, and the detail view notes "N variables".
Variables are read from the prompt body at copy time — there's nothing extra to configure or store, and they travel with the prompt through export and sync automatically.
- Remembered values (v2.5.0) — the fill-in dialog pre-fills each field with what you entered last time for that prompt, so re-running it is faster. Values are stored locally per prompt (not synced).
-
Highlighting (v2.15.0) — in the detail view, a prompt's
{{placeholders}}are visually highlighted in the Raw view so it's obvious what still needs filling.
A placeholder can optionally declare a type and a default value, right in the prompt body — the fill-in dialog then shows the matching control. Plain {{name}} still works exactly as before; this is purely opt-in extra syntax.
| Syntax | In the fill dialog |
|---|---|
{{topic}} |
a text box (unchanged) |
{{topic=AI safety}} |
a text box pre-filled with AI safety
|
{{tone:select(formal,playful,concise)}} |
a dropdown of the listed choices |
{{tone:select(formal,playful)=formal}} |
a dropdown with formal pre-selected |
{{notes:multiline}} |
a multi-line text area |
{{count:number}} / {{count:number=3}}
|
a number field (optionally pre-filled) |
{{when:date}} |
a date picker |
{{topic|what to write about}} (v3.5.5)
|
a text box with a hint shown under it |
{{tone=formal|how it should read}} (v3.5.5)
|
a default and a hint together |
Notes:
- The default fills the field when you open the dialog (and is used everywhere the variable appears if you leave it blank), so a prompt can ship sensible starting values.
- A hint (v3.5.5) is any text after a
|, shown as help under the field so whoever fills it in knows what's expected. Because|begins the hint, a default value can't itself contain a|. - An unknown type — or a
selectwith no options — quietly falls back to a plain text box, so a typo never breaks a prompt. - The definition lives in the prompt text, so it exports and syncs with the prompt — there's nothing extra to store. The New/Edit form shows a short reminder of the syntax under the prompt body.
- Edit — click a snippet card's edit action (or Edit in the detail view), change fields, then Update.
- Delete (changed in v2.0.0) — click delete on a card. The prompt is removed immediately and an Undo toast appears at the bottom for a few seconds. Click Undo to restore it exactly as it was — its pin state, model, usage count, and original dates are all preserved. If the toast times out the prompt leaves your library, but it can still be recovered from the Trash.
- Duplicate (v2.9.0) — the Duplicate action (on each card and in the detail view) forks a prompt into a fresh entry titled "… (copy)" with its own identity and history — a starting point for a variant.
(added in v3.5.5)
Give a prompt a color from a small palette to make it easy to spot in a big grid — the card shows a colored left accent. Pick a color while creating or editing (a swatch row in the form), or change it in a click from the color picker in the detail view header (the swatch/🎨 button next to the pin). Choose the ✕ swatch for "no color". The color is a visual tag only — it travels through export/import and sync, and changing it never adds a version to the prompt's history.
(added in v4.0.0)
Give a prompt an emoji icon that shows right before its title in the list and the detail view — a quick visual marker (🚀 a launch prompt, 🐛 a debugging one, 💬 an imported chat…). In the New/Edit form, type any emoji in the Icon box or tap one of the quick-pick emojis; the ✕ clears it. Like the color, it's a visual tag only: it travels through export/import and sync and isn't part of version history.
(added in v4.0.0)
When an entry's type is Code snippet, the body editor in the New/Edit form is a syntax-highlighting code editor (CodeMirror) with line numbers and per-language colors that match the read view. It follows your light/dark theme. Prompts keep the plain text area, which is better for prose and shows the {{variable}} hints beneath it.
(added in v4.0.0; desktop only, bring-your-own-key)
You can connect your own AI provider to get quick authoring help in the prompt editor. It's off by default and only appears once you add a key.
- Set it up — in Settings → AI assistant, enter an OpenAI-compatible API base URL, a model name, and your API key. This works with OpenAI directly, a compatible proxy, or a local server such as Ollama or LM Studio — just point the base URL at it. Your key is stored in your operating system's keyring (Credential Manager / Keychain / Secret Service), never in a plain file.
-
Use it — while editing a prompt, three buttons appear above the body:
-
Improve — rewrites the prompt to be clearer and more effective (preserving your
{{variables}}). - Suggest title — fills in a concise title.
- Suggest tags — adds a few relevant tags.
-
Improve — rewrites the prompt to be clearer and more effective (preserving your
- Privacy — using these buttons sends the prompt text you're acting on to the provider you configured. Nothing is sent unless you click one. Remove your key any time with Remove key in Settings.
(added in v3.5.5)
Turn a prompt you reuse into a template and start new prompts from it:
- Mark one — tick Save as a template in the New/Edit form. Templates carry a Template badge in the list and detail view.
- Use one — when you have templates, a ▾ dropdown appears next to New Prompt/Snippet. Pick a template and the editor opens pre-filled with its content as a brand-new entry (its own fresh identity and history). The new entry isn't itself a template unless you tick the box.
The flag is stored with the prompt, so your templates are the same on every synced device.
(added in v3.6.0)
Group your library into collections — a lightweight folder for each prompt:
-
File a prompt — in the New/Edit form, type a Collection name (e.g.
Work,Marketing,Personal). As you type, it autocompletes from the collections you already use, so names stay consistent. Leave it blank for no collection. - Filter by one — once any prompt has a collection, a collection dropdown appears in the toolbar (next to Views / Sort). Pick one to show only that folder; choose All collections to clear it. The filter combines with search and the other filters, and can be saved as a view.
- See it — a prompt's detail view shows its Collection in the metadata.
A prompt belongs to one collection at a time (unlike tags, which are many and cross-cutting). The collection is stored with the prompt, so it's the same on every synced device and travels through export/import — it's metadata only, so changing it never adds a version to the prompt's history.
(added in v3.3.0)
Reference another prompt by its title with [[Its title]] in the body — handy for linking a system prompt to its variants, or chaining a series of steps. The detail view then shows a Linked prompts section:
-
Links to — each
[[title]]in this prompt, resolved against your library. Click one to open that prompt in place. A title that doesn't match anything is shown as "not found" rather than breaking. - Referenced by — the backlinks: the prompts that link to this one.
Like variables, links are read from the body (nothing to store, and they travel through export and sync), and they apply to prompts only — a code snippet's [[ … ]] (e.g. a bash test) stays literal.
(added in v2.7.0; diff view in v2.8.0)
Every edit records the previous version, so you can look back and roll forward. The detail view has a History section listing past versions with their save time:
-
Expand a version to preview it, or to see a line-by-line diff — removed lines in red, added in green, with a compact
+N −Msummary (v2.8.0). Switch between Diff (inline), Split *(v3.5.5 — the two versions side by side, old on the left and new on the right, edited lines paired on one row), and Full text (the raw version). A "vs" picker (v3.4.0) chooses what to diff against: the current version (default) or any other past version; the diff always reads chronologically (older → newer). - Restore brings a past version back. Restoring is itself an edit, so the current state is captured as a new version first — nothing is lost.
No-op saves don't add history, and the newest ~50 versions per prompt are kept. History is stored locally in each database and is not synced, so the newest-wins sync model is unchanged.
(added in v2.14.0)
Click Select (next to Views / Sort) to turn on selection mode, tick the checkbox on any entries, then act on them all from the bottom bar:
- Pin / Unpin the selection,
- set the kind to Prompt or Code,
- Tag (v3.4.0) — type a tag once and it's added to every selected entry (normalized, and skipped where already present),
- Export the selection to a single JSON file,
- Delete (a two-step confirm; deleted entries move to Trash).
Select all grabs everything currently visible, and Esc leaves selection mode. Bulk kind changes go through the normal edit path, so each still records a version in the entry's history.
(added in v2.15.0)
The Tags button (next to Views / Sort) opens a manager listing every tag with its usage count, where you can rename, merge, or delete a tag across the whole library in one step:
- Rename a tag to give it a new name everywhere it's used.
- Merge two tags by renaming one to a name the other already has — they collapse into a single, deduped tag.
- Delete a tag to remove it from every entry.
Changes bump each affected entry's timestamp, so they sync like any other edit, on both the desktop and web/server backends.
(added in v2.9.0)
The insights panel (chart icon in the header) summarizes your library: total prompts and copies, plus most used, recently used, and never used lists — surfacing the copy counts and last-used times the app already tracks. Click any entry to open it.
Since v3.3.0 the panel also has a Possible duplicates section: it groups entries whose content is effectively identical (whitespace-insensitive, so reformatted copies still match) so you can find and tidy up redundant copies — open the ones you don't need and delete them. When everything's unique, it says so.
(added in v2.4.0)
Deletions are kept as recoverable records, and Settings → Library → Trash (in the header before v2.15.1) lists everything you've deleted, most recent first, with how long ago each one went. Click Restore on any entry to bring it back exactly as it was — pin state, model, usage count, and dates preserved — and it reappears in your library.
Trash complements the few-second Undo toast: Undo is the quick catch right after a delete, while Trash is the safety net for deletions you want back later. Restoring re-syncs as an ordinary update, so bringing an entry back on one machine won't leave a duplicate on another.
Since v2.11.0 the Trash view also has two bulk actions:
- Restore all — brings back every deleted entry at once.
- Empty trash (with a confirm) — permanently clears the deleted content. This is sync-safe: it blanks each entry's content but keeps the deletion tombstone, so an emptied prompt can't be resurrected by another device on the next sync — and the emptied state propagates too.
Auto-purge (v3.5.5, desktop) — rather than emptying Trash by hand, set a retention window in Settings → This device → Trash auto-purge (Off / 7 / 30 / 90 days). On launch, SnipVault clears the content of anything deleted longer ago than that — the same sync-safe blanking as Empty trash, just automatic and age-based. It's Off by default.
(added in v2.0.0)
Each prompt can record which model or tool it's written for — e.g. Claude Opus 4.8, GPT-4o, or Midjourney.
- The Model / target field on the form is free-text with a dropdown of common suggestions; type anything or pick one. It's optional.
- When set, the model appears as a badge on the card and in the detail view. Click the badge to filter to just prompts for that model; a chip near the top shows the active model filter — click it (or the badge again) to clear.
- The model is also matched by All Fields search.
(added in v2.0.0)
To help a prompt fit a model's context window, SnipVault shows its size:
- On the form, a live
N characters · ~N tokensreadout sits above the prompt box as you type. - On each card and in the detail view, a compact
~N tokestimate is shown (the detail view also shows characters and words).
The token figure is a rough estimate (about 4 characters per token), not a model-specific tokenizer, so it's labelled with a ~.
Since v2.3.0, the token estimate is shown only for prompts. Entries marked as a code snippet hide it (the count isn't meaningful for code); character and word counts still appear.
(added in v2.0.0)
Every time you copy a prompt — from a card, the code block, or the detail view — SnipVault increments that prompt's copy count and records when it was last copied. Cards show copied N×, and the detail view shows the full count and the last-copied time. It's a private, local signal to see which prompts you actually reach for.
(added in v2.0.0)
Click the Favorites star toggle in the toolbar (next to the language filter) to show only your pinned prompts. Click it again to show everything. It combines with search and the other filters.
(added in v2.0.0)
- Grid / list toggle — the two buttons at the end of the toolbar switch between the default two-column grid (with code previews) and a compact list of rows. Your choice is remembered.
- Hover preview (v2.12.0) — in list view, hovering an entry's title shows a quick peek at its description and the start of the body without opening it.
- Detail view — click a prompt's title (grid) or row (list) to open a full-screen view showing the entire prompt, all its metadata (created/updated, copy count, last copied, size), and every action (copy, Run in…, duplicate, export, edit, pin, delete, history). Press Esc or click outside to close.
- Raw / Preview toggle (v2.13.0) — for prompts, the detail view can render the body as Markdown (headings, bold/italic, code, links, lists, quotes) or show it Raw (the default, with placeholder highlighting). Code snippets always show highlighted source.
(added in v1.5.0)
Mark the prompts you reach for most so they stay at the top of the list.
- Click the star on a snippet card to pin it. Pinned cards show a filled star at all times (unpinned cards reveal an empty star on hover, alongside the other actions).
- Pinned prompts float to the top of the list; within the pinned and unpinned groups, prompts stay ordered newest first.
- Click the star again to unpin.
Pin state is stored in the database, so it persists across restarts and is shared between the web and desktop apps using the same snippets.db.
(added in v1.5.0; whole-library export and merge-on-import in v2.4.0)
SnipVault reads and writes a simple JSON format, so you can move prompts between databases, back them up, or share individual ones.
-
Export a single prompt — click the download icon on a snippet card. It saves a
.jsonfile containing that prompt's title, description, language, tags, model, type (v2.3.0), and body. -
Export the whole library (v2.4.0) — use Settings → Library → Export JSON to save your entire library as one
snipvault-library-<date>.jsonfile. A clean backup, and it round-trips losslessly. -
Export as Markdown (v3.4.0) — Settings → Library → Export Markdown writes the whole library as one readable
.mddocument: every entry under a heading, with its language and tags, prompts as prose and code snippets as fenced blocks. Great for reading, sharing, or archiving outside the app (it isn't re-importable — that's what the JSON export is for). -
Import — use Settings → Library → Import… and choose a file (these lived in the header before v2.15.1). SnipVault detects what kind of file it is:
- a single prompt or an array of prompts (as produced by single-prompt export) — each valid entry is added as a new prompt; entries missing a title or body are skipped, and an unrecognized
languagefalls back to Plain Text. - a whole-library export (v2.4.0) — entries are merged by identity: re-importing updates existing entries in place (keeping the most recent edit) instead of creating duplicates. That makes import safe to repeat, and ideal for restoring a backup or seeding a new machine.
- a ChatGPT data export (v3.6.0) — the
conversations.jsonfile from ChatGPT's Settings → Data controls → Export data. Each conversation becomes one prompt: its title, and the first message you sent as the body (the assistant's replies aren't imported). Every imported prompt is taggedchatgptand filed into a ChatGPT collection, so you can review the whole batch in one place and keep, edit, or delete as you like. - a Claude data export (v4.0.0) — the
conversations.jsonfrom Claude's data export. Same idea: each conversation → its name plus your first message, taggedclaudeand filed into a Claude collection. - a Gemini export (v4.0.0) — a Google Takeout → "My Activity" export in JSON form. Each "Prompted …" item becomes a prompt, tagged
geminiand filed into a Gemini collection.
- a single prompt or an array of prompts (as produced by single-prompt export) — each valid entry is added as a new prompt; entries missing a title or body are skipped, and an unrecognized
A short notice reports the result. Because export and import share the same shape, a file you export always imports cleanly. Since v3.5.5, that notice also flags likely duplicates — how many imported prompts have the same content as ones already in your library (or as an earlier file in the same batch). Nothing is blocked; it's a nudge to tidy up via Usage insights → Possible duplicates.
More ways to move prompts:
-
Drag-and-drop import (v2.9.0) — drop files anywhere on the window. JSON exports merge as above;
.md/.txtfiles each become a new prompt (the filename is the title). You can also select multiple files at once in the Import picker. - Copy as Markdown (v2.9.0) — in the detail view, copy a prompt as a Markdown heading + body (or a code snippet as a fenced code block), ready to paste into docs, issues, or chat.
- Export as Markdown (.md) (v2.12.0) — the detail view's .md button downloads the entry as a Markdown file, alongside the JSON export.
- Export a selection (v2.14.0) — with multi-select you can export several chosen entries to one JSON file at once.
(added in v1.3.0)
| Shortcut | Action |
|---|---|
| Ctrl / ⌘ + N | New prompt |
| Ctrl / ⌘ + K | Open the command palette (v2.5.0) |
| / | Focus the search box (v2.5.0) |
| j / k or ↓ / ↑ | Move the highlight through the grid/list (v2.12.0) |
| Enter | Open the highlighted entry (v2.12.0) |
| Esc | Close the open dialog (palette, form, settings, or detail view); leave selection mode |
| Ctrl / ⌘ + Shift + V | Open quick capture from anywhere (v3.1.0, desktop; configurable) |
The navigation and / shortcuts are ignored while you're typing in a field, and the creation/search shortcuts are disabled while a dialog is open. The quick-capture hotkey is global — it works even when SnipVault isn't focused — and can be changed or disabled in Settings. (Before v2.5.0, Ctrl/⌘-K focused the search box; it now opens the command palette and / focuses search.)
(added in v1.3.0)
A stats bar under the search area shows your whole library at a glance — the total number of prompts, distinct languages, and tags. These counts reflect the full collection, independent of any active search or filter. When a filter is active, a separate line shows how many prompts matched.
Tags help you group and find related snippets.
- Type a tag and press Enter, Tab, or comma to add it.
-
Tag autocomplete (added in v1.1.0): as you type, a dropdown suggests tags you've used on other snippets.
- ↑ / ↓ to move through suggestions
- Enter or Tab to accept the highlighted one (or your raw text if none is highlighted)
- Click a suggestion to add it
- Esc to dismiss the dropdown
- Backspace on an empty tag box removes the last tag.
- Tags are automatically lowercased and trimmed; duplicates are ignored. Max 20 per snippet.
The search bar supports three search modes (dropdown next to the box):
| Mode | Searches |
|---|---|
| All Fields (default) | Title, description, tags, model, and the prompt body |
| Title / Desc | Title and description only |
| Tags Only | Tags only |
Since v4.0.0 the default All Fields search is powered by a full-text index (FTS5): it stays fast no matter how big your library grows, matches whole words and word-prefixes (so "trans" finds "translate"), and — new — it now searches the prompt body, so you can find a prompt by something written inside it, not just its title/tags. The Title / Desc and Tags Only modes keep exact substring matching.
Additional filters:
- Language filter — narrow to a single language.
- Favorites only (v2.0.0) — the star toggle limits the list to pinned prompts.
- Model filter (v2.0.0) — click a model badge to filter to that model.
- Tag cloud — click any tag chip to filter to snippets with that tag; click again (or Clear) to remove the filter.
- Kind quick-filter (v2.5.0) — an All / Prompts / Code segmented control with live counts narrows the grid to one entry type.
These filters combine, so you can, for example, show only your favorite Python prompts for a given model.
Search is case-insensitive and matches partial text.
The Sort dropdown reorders the library: Newest (default), Most used (by copy count), Recently used (by last-copied time), or A–Z. Pinned prompts always lead every order. The sort is applied by the backend, so it's identical on desktop and web.
The Views dropdown saves your current filter combo — search, search mode, language, tag, model, kind, favorites, and sort — under a name, so you can re-apply a complex filter in one click. Views are stored locally per install.
SnipVault supports light and dark themes and follows your system setting by default. Toggle it from the header. The syntax-highlighting theme adjusts to match.
Accent themes (v2.10.0) — Settings → Appearance switches the app's accent colour (blue, violet, emerald, rose, orange, teal) (a palette button in the header before v2.15.1). Your choice is remembered and applied instantly, in both light and dark mode.
Snippet bodies are highlighted with highlight.js based on the selected language. Choose Plain Text if you don't want highlighting. See API and Commands for the full language list source.
Available in the desktop app.
The first time you launch the desktop app, a welcome dialog asks where to store your data:
- Create a new database — starts fresh in the default app-data folder.
-
Use an existing database — pick a
snippets.dbyou already have (for example, one kept in a Dropbox/OneDrive folder so it syncs across machines). - Connect to a sync server (v2.2.0) — create a local library and pull an existing library from a self-hosted server. Good for setting up a second machine.
Your choice is remembered, so you won't be asked again. (If you already had a database from a previous version, it's adopted automatically and you won't see this dialog.)
Open Settings from the gear icon in the header. Since v2.15.1 Settings also holds a Library section (Import, Export JSON / Markdown, Trash) and an Appearance section (accent colour) — available in the web app too. The desktop-only sections below (database, sync server, backups, updates) appear only in the desktop app:
- See the current database location.
-
Change database… — switch to a different
snippets.db. The app reloads to show its contents. -
Back up database… — save a copy of the current database to a location you choose. The suggested filename is timestamped (e.g.
snippets-backup-20260701-142530.db). Backups use SQLite's online backup, so they're safe to take while the app is running.
Beyond the pick-a-location backup above, Settings has a Backups folder — a stable, documented location holding timestamped snapshots of your entire database, each written with SQLite's online backup API (a consistent copy even while the app is running, never a torn mid-write file). Point an external backup tool (Databasus, restic, Duplicati, Time Machine, a cloud-sync folder, cron…) straight at that folder.
- Back up now — writes a snapshot; the newest are kept and older ones are pruned.
- Open folder — reveals the backups folder in your file manager.
- Restore… — replaces your current library from a chosen backup. The file is validated as a SnipVault database first, so an unrelated or corrupt file can't clobber your data.
- Back up on launch — an opt-in toggle that writes a snapshot automatically on startup (at most once a day).
The self-hosted server can be backed up the same way — see the "Backing up the server" section of docs/self-hosting.md and the commented backup sidecar in docker-compose.yml.
See Data Storage for exact file locations and schema details.
(added in v2.2.0)
If you run SnipVault on more than one computer, you can keep them in sync through a small self-hosted server. Each app still keeps its own local library and works offline; syncing reconciles them so new prompts, edits, and deletions flow between machines.
- Set it up — in Settings → Sync server, enter the server URL and access token and click Test & save. The app verifies the server and runs a first sync. (On a brand-new machine you can instead pick Connect to a sync server on the first-run screen.)
- Sync — it runs automatically on startup, and you can trigger it any time with Sync now in Settings.
- Background auto-sync (v3.4.0) — in Settings → Sync server, pick an Auto-sync interval (off / 5 / 15 / 30 / 60 min) and, while the app is open, it reconciles with the server on that timer too — so your machines stay in sync hands-free. A tick is skipped if a sync is already running, and failures stay quiet (the header indicator reflects them). The interval is remembered per machine.
- See sync status (v2.4.0) — once a server is configured, a small indicator in the header shows when you last synced ("Synced 2m ago"), spins while a sync is running, and shows a "Sync failed" state you can hover for the reason. Click it to sync on demand — no need to open Settings. The last-synced time is remembered across launches.
- Stop — Remove server in Settings returns you to a purely local library, unchanged.
When the same prompt was edited on two machines, the most recently edited version wins. Deleting a prompt removes it everywhere on the next sync. Keep your machines' clocks roughly in sync, and sync often if you edit offline on more than one machine at once.
Per-device names (v3.5.5) — give each install a name in Settings → This device (e.g. "Work laptop"). Prompts that device edits are stamped with the name, and a prompt's detail view then shows Last edited on . The stamp travels through sync, so you can tell which machine last touched a prompt. A device with no name records nothing.
Since v2.6.0, the sync server's access token is stored in your operating system's secure credential store (Windows Credential Manager / macOS Keychain / Linux Secret Service) rather than in plaintext in config.json — an existing plaintext token is migrated automatically on first launch. If no secure store is available (e.g. a headless Linux box), it falls back to the config file so sync keeps working.
Setting up the server itself (Docker or bare Node) is covered in Syncing.
(added in v1.4.0)
The desktop app can update itself — no need to re-download installers from the Releases page.
- Automatic check — on startup the app checks GitHub for a newer version. If one is found, a banner appears at the top with an Update now button. After it downloads and installs, click Restart now to finish.
- Manual check — open Settings and use Check for updates under the Updates section. It shows your current version and, if you're up to date, says so.
- Turn off automatic checks — untick "Check for updates automatically on startup" in Settings. You can still check manually anytime.
Updates replace only the application itself — your snippets database is never touched, so updating can't lose your data.
A few notes:
- Auto-update works only for versions that already include the updater (v1.4.0 and later). If you're on an older build, install v1.4.0 once from the Releases page; after that, updates are automatic.
- On Linux, only the AppImage self-updates;
.deb/.rpminstalls update through your system package manager instead. - The first-launch "unidentified developer / unknown publisher" warnings (see Installation) are unrelated to updates and still apply to fresh installs.
Using SnipVault
Development
Operations