thePR0M3TH3AN 8927b6fb6e update
2025-05-15 15:51:09 -04:00
2025-05-14 16:32:08 -04:00
2025-05-15 14:00:44 -04:00
2025-05-15 15:42:42 -04:00
2025-05-14 15:10:34 -04:00
2025-05-14 17:51:17 -04:00
2025-05-15 13:47:46 -04:00
2025-05-15 13:47:46 -04:00
2025-05-15 13:47:46 -04:00
2025-05-15 15:51:09 -04:00
2025-05-14 18:20:46 -04:00

Marlin Logo

Marlin

Marlin is a lightweight, metadata-driven file indexer that runs 100 % on your computer. It scans folders, stores paths and file stats in SQLite, lets you attach hierarchical tags and custom attributes, takes automatic snapshots, and offers instant full-text search via FTS5. No cloud, no telemetry your data never leaves the machine.


Feature highlights

Area What you get
Safety Timestamped backups (marlin backup) and one-command restore (marlin restore)
Resilience Versioned, idempotent schema migrations zero-downtime upgrades
Indexing Fast multi-path scanner with SQLite WAL concurrency
Metadata Hierarchical tags (project/alpha) & key-value attributes (reviewed=yes)
Search Prefix-aware FTS5 across paths, tags, and attributes; optional --exec per match
DX / Logs Structured tracing (RUST_LOG=debug) for every operation

How it works

┌──────────────┐  marlin scan          ┌─────────────┐
│  your files  │ ─────────────────────▶│   SQLite    │
│ (any folder) │                      │  files/tags │
└──────────────┘   tag / attr          │ attrs / FTS │
        ▲  search / exec              └──────┬──────┘
        └────────── backup / restore          ▼
                                     timestamped snapshots

Prerequisites

Requirement Why
Rust ≥ 1.77 Build toolchain (rustup.rs)
C build essentials Builds bundled SQLite (Linux)

macOS & Windows users: let the Rust installer pull the matching build tools.


Build & install

git clone https://github.com/yourname/marlin.git
cd marlin
cargo build --release
sudo install -Dm755 target/release/marlin /usr/local/bin/marlin  # optional

Quick start

marlin init                                        # create DB (idempotent)
marlin scan ~/Pictures ~/Documents                 # index files
marlin tag  "~/Pictures/**/*.jpg" photos/trip-2024 # add tag
marlin attr set "~/Documents/**/*.pdf" reviewed yes
marlin search reviewed --exec "xdg-open {}"        # open matches
marlin backup                                      # snapshot DB

Database location

  • Linux ~/.local/share/marlin/index.db
  • macOS ~/Library/Application Support/marlin/index.db
  • Windows %APPDATA%\marlin\index.db

Override with:

export MARLIN_DB_PATH=/path/to/custom.db

CLI reference

marlin <COMMAND> [ARGS]

init                             create / migrate database
scan   <PATHS>...                walk directories & index files
tag    "<glob>" <tag_path>       add hierarchical tag
attr   set|ls …                  manage custom attributes
search <query> [--exec CMD]      FTS query, optionally run CMD on each hit
backup                           create timestamped snapshot in backups/
restore <snapshot.db>            replace DB with snapshot

Attribute subcommands

Command Example
attr set marlin attr set "~/Docs/**/*.pdf" reviewed yes
attr ls marlin attr ls ~/Docs/report.pdf

Backups & restore

Create snapshot

marlin backup
# → ~/.local/share/marlin/backups/backup_2025-05-14_22-15-30.db

Restore snapshot

marlin restore ~/.local/share/marlin/backups/backup_2025-05-14_22-15-30.db

Marlin also takes an automatic safety backup before every schema migration.


Upgrading

cargo install --path . --force    # rebuild & replace installed binary

The versioned migration system preserves your data across upgrades.


Roadmap

See ROADMAP.md for the full development plan.


Five-Minute Quickstart

Paste & run each block in your terminal.


0Prepare & build

# Clone or cd into your Marlin repo
cd ~/Documents/GitHub/Marlin

# Build the release binary
cargo build --release

1Install on your PATH

sudo install -Dm755 target/release/marlin /usr/local/bin/marlin

Now marlin is available everywhere.


2Prepare a clean demo directory

rm -rf ~/marlin_demo
mkdir -p ~/marlin_demo/{Projects/{Alpha,Beta},Media/Photos,Docs}

printf "Alpha draft\n"  > ~/marlin_demo/Projects/Alpha/draft.txt
printf "Beta notes\n"   > ~/marlin_demo/Projects/Beta/notes.md
printf "Receipt PDF\n"  > ~/marlin_demo/Docs/receipt.pdf
printf "fake jpg\n"     > ~/marlin_demo/Media/Photos/vacation.jpg

3Initialize & index files

# Use --verbose if you want full debug traces:
marlin init
marlin scan ~/marlin_demo

# or, to see every path tested:
marlin --verbose init
marlin --verbose scan ~/marlin_demo

Tip: Rerun marlin scan after you add/remove/modify files; only changed files get re-indexed.


4Attach tags & attributes

# Tag everything under “Alpha”
marlin tag "~/marlin_demo/Projects/Alpha/**/*" project/alpha

# Mark all PDFs as reviewed
marlin attr set "~/marlin_demo/**/*.pdf" reviewed yes

# (or with debug)
marlin --verbose tag "~/marlin_demo/Projects/Alpha/**/*" project/alpha
marlin --verbose attr set "~/marlin_demo/**/*.pdf" reviewed yes

5Search your index

# By tag or filename
marlin search alpha

# Combined terms (AND across path+attrs)
marlin search "reviewed AND pdf"

# Run a command on each hit
marlin search reviewed --exec "echo HIT → {}"

# If things arent matching, add --verbose to see the underlying FTS query:
marlin --verbose search "reviewed AND pdf"

{} in --exec is replaced with each files path.


6Backup & restore

# Snapshot and store its name
snap=$(marlin backup | awk '{print $NF}')

# Simulate data loss
rm ~/.local/share/marlin/index.db

# Restore instantly
marlin restore "$snap"

# Verify your files still show up
marlin search reviewed

Backups live under ~/.local/share/marlin/backups by default.

What you just exercised
Command Purpose
marlin init Create / upgrade the SQLite database
marlin scan Walk directories and (re)index files
marlin tag Attach hierarchical tags
marlin attr set Add/overwrite custom key-value attributes
marlin search FTS5 search across path / tags / attrs
--exec Pipe hits into any shell command
marlin backup Timestamped snapshot of the DB
marlin restore Replace live DB with a chosen snapshot

Thats the complete surface area of Marlin today—feel free to play around or point the scanner at real folders.


License

MIT see LICENSE

Description
Your Personal Digital Librarian
Readme MIT 62 MiB
Languages
Rust 89.9%
Shell 10.1%