jerichosiahaya/snip

Lightweight Rust terminal note-taking app with SQLite full-text search

Rust

0

14 commits

updated Oct 2, 2026

See the code

See what people are saying

README

snip

Lightweight terminal note-taking app. Rust + SQLite (FTS5 full-text search), with an MCP server so Claude can read and write your notes.

  • crates.io: snip-notes
  • mcp-name: io.github.jerichosiahaya/snip
  • License: MIT

Install from the AUR (Arch Linux)

yay -S snip-notes-bin   # prebuilt binary from the GitHub release
yay -S snip-notes       # or build from source

Either installs the snip command (use paru or makepkg if you prefer). The PKGBUILDs live in packaging/aur/. Each release updates them and pushes them to the AUR automatically (see .github/workflows/aur-publish.yml; it needs the AUR_SSH_PRIVATE_KEY repository secret).

Install with Cargo (any platform)

Requires Rust/Cargo and a C compiler for the bundled SQLite:

cargo install snip-notes   # installs the `snip` command into ~/.cargo/bin

Install on Arch Linux (x86-64)

Download the prebuilt executable—no Rust or Cargo required:

curl -fLO https://github.com/jerichosiahaya/snip/releases/latest/download/snip-arch-linux-x86_64.tar.gz
curl -fLO https://github.com/jerichosiahaya/snip/releases/latest/download/SHA256SUMS
sha256sum -c SHA256SUMS && \
  tar -xzf snip-arch-linux-x86_64.tar.gz && \
  install -Dm755 snip "$HOME/.local/bin/snip"

Run ~/.local/bin/snip, or snip if ~/.local/bin is on your PATH. Requires an up-to-date Arch Linux x86-64 system (glibc, gcc-libs) and $EDITOR or nano for editing. SQLite is bundled. This build is not for ARM or guaranteed compatible with older Linux distributions.

Build from source

Requires Rust/Cargo and a C compiler for bundled SQLite:

cargo build --release --locked
install -Dm755 target/release/snip "$HOME/.local/bin/snip"

Release executable: ~1.6 MB, below the 5 MB budget (excluding system libraries and notes).

Early release: trash/restore is not implemented; deletion is permanent after confirmation. Keep backups of important notes.

Usage

snip                     # open the interactive TUI
snip add "note text" --tag work    # quick capture, first line = title
snip search "meeting"    # print matching notes
snip search "" --tag work
snip export ~/notes      # every note as a Markdown file (see below)

Notes are stored in $XDG_DATA_HOME/snip.db (normally ~/.local/share/snip.db) by default. Override with snip --db /path/to.db ....

Interactive screen

 snip  / to search                                                 17 notes
──────────────────────────────┬────────────────────────────────────────────
 Meeting notes             2h │ Meeting notes
 Groceries                 3d │ #work · edited 2h ago
 Book list                 1w │
                              │ Discuss the new feature with the team…
──────────────────────────────┴────────────────────────────────────────────
 ↑↓ move  ⏎ edit  ^N new  / search  ^Q quit  ^T tag  Del delete

The list shows the most recently edited notes first. Terminals 72 columns or wider also show a preview of the selected note; narrower ones show its tags in the list instead.

↑↓ PgUp PgDn Home End   move through notes
Enter      edit selected note (opens $EDITOR, falls back to nano)
Ctrl-N     new note
/          search as you type (title + body; every word must match,
           prefixes ok: "meet" finds "meeting"); Enter keeps it, Esc clears it
Ctrl-T     cycle tag filter (all → each tag → all)
Esc        clear search and tag filter
Delete     delete selected note (asks y/N in the footer)
Ctrl-Q     quit

Note format: first line = title, the rest = body. Works in your normal editor; $EDITOR may include arguments, e.g. EDITOR="code -w".

Use snip from Claude (MCP)

snip mcp runs a Model Context Protocol server on stdin/stdout, so Claude can save, find and update your notes. It uses the same database as the interactive app, and both can be open at once.

Claude Code:

claude mcp add --scope user snip -- "$(command -v snip)" mcp

Claude Desktop: add this to claude_desktop_config.json (Settings → Developer → Edit Config), using the absolute path to snip (command -v snip prints it: ~/.cargo/bin/snip after cargo install, ~/.local/bin/snip for the prebuilt download), then restart Claude Desktop:

{
  "mcpServers": {
    "snip": { "command": "/home/YOU/.local/bin/snip", "args": ["mcp"] }
  }
}

To use a different database, put --db /path/to.db before mcp in either command.

Claude gets these tools:

ToolDoes
search_notesfind notes by words (prefixes ok) and/or tag; no query lists recent notes
get_noteread one note in full
list_tagsall tags in use
create_notesave a new note (title, body, tags)
append_to_noteadd text to the end of a note
update_notechange a note's title, body or tags

There is deliberately no delete tool: deleting notes stays something you do in the app. update_note can still replace a note's body, so keep backups (below) if Claude edits important notes.

Data & backups

  • Source of truth: the SQLite DB (WAL mode). Use SQLite's .backup command for a consistent backup, including while the app is open:
    sqlite3 "${XDG_DATA_HOME:-$HOME/.local/share}/snip.db" ".backup 'snip-backup.db'"
    
  • Markdown export: snip export [DIR] [--tag NAME] writes one .md file per note (DIR defaults to ./snip-export). Each file has YAML front matter that Obsidian and other Markdown tools read, then the title as a heading and the body:
    ---
    title: "Meeting notes"
    tags: ["work", "q4"]
    created: 2026-10-02T16:49:00Z
    updated: 2026-10-02T17:12:00Z
    snip_id: 12
    ---
    
    # Meeting notes
    
    - ship the redesign
    
    Files are named after the title (meeting-notes.md; the note id is added if two titles clash) and their modification time is the note's last edit. Exporting again overwrites those files and leaves anything else in DIR alone, so a note that was renamed or deleted keeps its old file until you remove it.

Tests

cargo test   # regression: FTS stays consistent across create/update/delete

jerichosiahaya/snip

Lightweight Rust terminal note-taking app with SQLite full-text search

Rust

0

14 commits

updated Oct 2, 2026

See the code

See what people are saying

README

snip

Lightweight terminal note-taking app. Rust + SQLite (FTS5 full-text search), with an MCP server so Claude can read and write your notes.

  • crates.io: snip-notes
  • mcp-name: io.github.jerichosiahaya/snip
  • License: MIT

Install from the AUR (Arch Linux)

yay -S snip-notes-bin   # prebuilt binary from the GitHub release
yay -S snip-notes       # or build from source

Either installs the snip command (use paru or makepkg if you prefer). The PKGBUILDs live in packaging/aur/. Each release updates them and pushes them to the AUR automatically (see .github/workflows/aur-publish.yml; it needs the AUR_SSH_PRIVATE_KEY repository secret).

Install with Cargo (any platform)

Requires Rust/Cargo and a C compiler for the bundled SQLite:

cargo install snip-notes   # installs the `snip` command into ~/.cargo/bin

Install on Arch Linux (x86-64)

Download the prebuilt executable—no Rust or Cargo required:

curl -fLO https://github.com/jerichosiahaya/snip/releases/latest/download/snip-arch-linux-x86_64.tar.gz
curl -fLO https://github.com/jerichosiahaya/snip/releases/latest/download/SHA256SUMS
sha256sum -c SHA256SUMS && \
  tar -xzf snip-arch-linux-x86_64.tar.gz && \
  install -Dm755 snip "$HOME/.local/bin/snip"

Run ~/.local/bin/snip, or snip if ~/.local/bin is on your PATH. Requires an up-to-date Arch Linux x86-64 system (glibc, gcc-libs) and $EDITOR or nano for editing. SQLite is bundled. This build is not for ARM or guaranteed compatible with older Linux distributions.

Build from source

Requires Rust/Cargo and a C compiler for bundled SQLite:

cargo build --release --locked
install -Dm755 target/release/snip "$HOME/.local/bin/snip"

Release executable: ~1.6 MB, below the 5 MB budget (excluding system libraries and notes).

Early release: trash/restore is not implemented; deletion is permanent after confirmation. Keep backups of important notes.

Usage

snip                     # open the interactive TUI
snip add "note text" --tag work    # quick capture, first line = title
snip search "meeting"    # print matching notes
snip search "" --tag work
snip export ~/notes      # every note as a Markdown file (see below)

Notes are stored in $XDG_DATA_HOME/snip.db (normally ~/.local/share/snip.db) by default. Override with snip --db /path/to.db ....

Interactive screen

 snip  / to search                                                 17 notes
──────────────────────────────┬────────────────────────────────────────────
 Meeting notes             2h │ Meeting notes
 Groceries                 3d │ #work · edited 2h ago
 Book list                 1w │
                              │ Discuss the new feature with the team…
──────────────────────────────┴────────────────────────────────────────────
 ↑↓ move  ⏎ edit  ^N new  / search  ^Q quit  ^T tag  Del delete

The list shows the most recently edited notes first. Terminals 72 columns or wider also show a preview of the selected note; narrower ones show its tags in the list instead.

↑↓ PgUp PgDn Home End   move through notes
Enter      edit selected note (opens $EDITOR, falls back to nano)
Ctrl-N     new note
/          search as you type (title + body; every word must match,
           prefixes ok: "meet" finds "meeting"); Enter keeps it, Esc clears it
Ctrl-T     cycle tag filter (all → each tag → all)
Esc        clear search and tag filter
Delete     delete selected note (asks y/N in the footer)
Ctrl-Q     quit

Note format: first line = title, the rest = body. Works in your normal editor; $EDITOR may include arguments, e.g. EDITOR="code -w".

Use snip from Claude (MCP)

snip mcp runs a Model Context Protocol server on stdin/stdout, so Claude can save, find and update your notes. It uses the same database as the interactive app, and both can be open at once.

Claude Code:

claude mcp add --scope user snip -- "$(command -v snip)" mcp

Claude Desktop: add this to claude_desktop_config.json (Settings → Developer → Edit Config), using the absolute path to snip (command -v snip prints it: ~/.cargo/bin/snip after cargo install, ~/.local/bin/snip for the prebuilt download), then restart Claude Desktop:

{
  "mcpServers": {
    "snip": { "command": "/home/YOU/.local/bin/snip", "args": ["mcp"] }
  }
}

To use a different database, put --db /path/to.db before mcp in either command.

Claude gets these tools:

ToolDoes
search_notesfind notes by words (prefixes ok) and/or tag; no query lists recent notes
get_noteread one note in full
list_tagsall tags in use
create_notesave a new note (title, body, tags)
append_to_noteadd text to the end of a note
update_notechange a note's title, body or tags

There is deliberately no delete tool: deleting notes stays something you do in the app. update_note can still replace a note's body, so keep backups (below) if Claude edits important notes.

Data & backups

  • Source of truth: the SQLite DB (WAL mode). Use SQLite's .backup command for a consistent backup, including while the app is open:
    sqlite3 "${XDG_DATA_HOME:-$HOME/.local/share}/snip.db" ".backup 'snip-backup.db'"
    
  • Markdown export: snip export [DIR] [--tag NAME] writes one .md file per note (DIR defaults to ./snip-export). Each file has YAML front matter that Obsidian and other Markdown tools read, then the title as a heading and the body:
    ---
    title: "Meeting notes"
    tags: ["work", "q4"]
    created: 2026-10-02T16:49:00Z
    updated: 2026-10-02T17:12:00Z
    snip_id: 12
    ---
    
    # Meeting notes
    
    - ship the redesign
    
    Files are named after the title (meeting-notes.md; the note id is added if two titles clash) and their modification time is the note's last edit. Exporting again overwrites those files and leaves anything else in DIR alone, so a note that was renamed or deleted keeps its old file until you remove it.

Tests

cargo test   # regression: FTS stays consistent across create/update/delete

Languages

Rust

97.5%

Shell

2.5%