Files
Marlin/README.md
thePR0M3TH3AN e82c5cb53e update
2025-05-15 23:15:30 -04:00

6.7 KiB
Raw Blame History

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

# (Optional) Install the binary into your PATH:
sudo install -Dm755 target/release/marlin /usr/local/bin/marlin

Quick start

For a concise walkthrough, see Quick start & Demo.

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 <pattern> <key> <value>  manage custom attributes
attr   ls <path>
search <query> [--exec CMD]      FTS5 query, optionally run CMD on each hit
backup                           create timestamped snapshot in backups/
restore <snapshot.db>            replace DB with snapshot
completions <shell>              generate shell completions

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 non-init command.


Upgrading

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

The versioned migration system preserves your data across upgrades.


Five-Minute Quickstart

Just paste & run each block in your terminal.

0Prepare, build & install

cd ~/Documents/GitHub/Marlin
cargo build --release
sudo install -Dm755 target/release/marlin /usr/local/bin/marlin

Now marlin is available everywhere.

1Enable shell completion

mkdir -p ~/.config/bash_completion.d
marlin completions bash > ~/.config/bash_completion.d/marlin

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

marlin init
marlin scan ~/marlin_demo

# show every path tested:
marlin --verbose scan ~/marlin_demo

Only changed files get re-indexed on subsequent runs.

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

# Output as JSON instead:
marlin --format=json attr set ~/marlin_demo/**/*.pdf reviewed yes

5Search your index

# By tag or filename
marlin search alpha

# Combined terms:
marlin search "reviewed AND pdf"

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

6Backup & restore

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

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

# Restore
marlin restore "$snap"

# Verify
marlin search reviewed

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