Installation
Install with one command. macOS requires no external dependencies (uses NFS). Linux needs FUSE3.
Go install
Alternatively, build from source with Go:
Platform notes
| Platform | Details |
|---|---|
| macOS | NFS backend. No external dependencies needed. |
| Linux | FUSE backend. Requires fuse3 — install via apt install fuse3 or yum install fuse3. |
| Docker | Requires FUSE device access: --device /dev/fuse --cap-add SYS_ADMIN |
Quick start
Mount a local database, explore it, write a file, then unmount.
Mounting
TigerFS works with any PostgreSQL database. Pass a connection string, or use a cloud backend prefix for credential-free mounting.
Connection formats
| Format | Example |
|---|---|
| postgres:// | tigerfs mount postgres://user:pass@host/mydb /mnt/db |
| tiger: | tigerfs mount tiger:e6ue9697jf /mnt/db |
| ghost: | tigerfs mount ghost:a2x6xoj0oz /mnt/db |
Cloud backends call the respective CLI (tiger auth login or ghost login) to retrieve credentials, so no passwords are stored in your config.
Key flags
| Flag | Description |
|---|---|
| --read-only | Mount in read-only mode. All write operations are rejected. |
| --max-ls-rows | Maximum number of rows returned by ls. Default: 1000. |
| --allow-other | Allow other system users to access the mount (requires FUSE configuration). |
| --foreground | Run in the foreground instead of daemonizing. Useful for debugging. |
Environment variables
Standard PostgreSQL environment variables are supported as an alternative to connection strings:
File-first mode
Start with files, get a database for free. Write markdown with frontmatter, organize into directories, build lightweight apps on top of the filesystem. Writes are atomic and everything is auto-versioned.
Creating apps with .build/
Apps tell TigerFS how to present a table as a native file format. Write the app type to .build/ and the table becomes a directory of files:
Markdown and YAML frontmatter
YAML frontmatter becomes database columns. The body becomes the text column.
Column mapping
| Source | Column | Type |
|---|---|---|
| filename | _path | text (primary key) |
| frontmatter keys | key name | auto-detected (text, integer, boolean, jsonb) |
| body (below frontmatter) | _body | text |
Subdirectories
Use mkdir to create folders, mv to move files between them. Directory structure is encoded in the _path column:
Backing table
Each app creates a PostgreSQL table. The schema is managed automatically — new frontmatter keys add columns. You can query the backing table directly with SQL when needed.
Data-first mode
Mount any existing Postgres database and navigate it with ls, cat, grep. Every path resolves to optimized SQL pushed down to the database.
Row formats
Read rows in multiple formats by varying the file extension:
| Extension | Example |
|---|---|
| .json | cat /mnt/db/users/123.json |
| .csv | cat /mnt/db/users/123.csv |
| .tsv | cat /mnt/db/users/123.tsv |
| .yaml | cat /mnt/db/users/123.yaml |
Row as directory
Navigate into a row to access individual columns as files:
Pipeline queries
Chain filters, ordering, and pagination into a single path. The database executes it as one optimized query:
| Segment | Description |
|---|---|
| .by/ | Index lookup. .by/column/value |
| .filter/ | Filter on any column. .filter/column/value |
| .order/ | Sort by column. .order/column |
| .columns/ | Select specific columns. .columns/col1,col2 |
| .first/N/ | First N rows. |
| .last/N/ | Last N rows. |
| .sample/N/ | Random sample of N rows. |
| .export/ | Output format. .export/csv, .export/json, .export/tsv |
Segments can be chained in any order.
Write semantics (PATCH)
Write to rows using JSON or individual column files. JSON writes use PATCH semantics — only the specified keys are updated:
Ingestion with .import/
Bulk-load data from CSV, JSON, or YAML. The write mode is part of the path:
Version history
Any app can opt into automatic versioning. Every edit and delete is captured as a timestamped snapshot under a read-only .history/ directory.
Enabling history
Add history when creating the app:
.history/ paths
| Path | Description |
|---|---|
| .history/ | Lists all files that have history |
| .history/file.md/ | Lists all versions of a file (timestamped) |
| .history/file.md/.id | Stable row UUID (tracks across renames) |
| .history/file.md/2026-02-24T150000Z | A specific past version |
Reading past versions
Recovery workflow
To restore a previous version, read it from history and write it back:
History tracks files across renames via stable row UUIDs and uses TimescaleDB hypertables for compressed storage. TimescaleDB is required for the history feature.
CLI reference
| Command | Description |
|---|---|
| tigerfs mount | Mount a database to a local directory. |
| tigerfs unmount | Unmount a mounted database. |
| tigerfs status | Show status of all active mounts. |
| tigerfs list | List all available databases (cloud backends). |
| tigerfs create | Create a new cloud database. tigerfs create tiger:my-db |
| tigerfs fork | Fork (clone) a database. tigerfs fork /mnt/db my-experiment |
| tigerfs info | Inspect a mount. tigerfs info /mnt/db or --json for scripting. |
| tigerfs config | Show or modify configuration. tigerfs config show |
| tigerfs test-connection | Test connectivity to a database without mounting. |
| tigerfs version | Print the TigerFS version. |
Configuration
Config file
TigerFS reads configuration from:
Run tigerfs config show to see all options and their current values.
YAML structure
Environment variables
All configuration options can be set via environment variables with the TIGERFS_ prefix:
Precedence order
- Command-line flags (highest priority)
- Environment variables (
TIGERFS_*) - Config file (
~/.config/tigerfs/config.yaml) - Built-in defaults (lowest priority)
Password resolution
For postgres:// connections, passwords are resolved in order: connection string, PGPASSWORD environment variable, ~/.pgpass file. Cloud backends (tiger:, ghost:) retrieve credentials automatically via their respective CLIs.