media archive meets automation
Find a file
2026-05-25 11:02:34 +02:00
.gitignore Initial commit: README, MIT license, gitignore 2026-05-25 11:02:34 +02:00
LICENSE Initial commit: README, MIT license, gitignore 2026-05-25 11:02:34 +02:00
README.md Initial commit: README, MIT license, gitignore 2026-05-25 11:02:34 +02:00

mama

Media Archive Meets Automation — a self-hosted system for ingesting, deduplicating, and organizing personal media (photos, videos, music, documents) on top of ZFS.

⚠️ Project Status

Pre-alpha. Not ready for use by anyone but the author.

  • Database schema, CLI surface, on-disk layout, and HTTP API are unstable and will change without migration paths.
  • Most features described below are planned, not implemented.
  • Documentation lags behind code.

Do not point mama at irreplaceable data. Keep independent backups of anything mama touches.

Concept

mama indexes files placed in configured scan folders, stores file contents in a content-addressed blob store, and exposes them through hardlinked filesystem views consumable by specialized viewers (Immich for photos and video, Navidrome for music, Paperless-ngx for documents).

Identical content is stored only once. Per-file context — original path, source device, scan timestamp, embedded metadata (EXIF, ID3, sidecar files) — is preserved as observations linked to the underlying blob, so duplicates contribute information instead of clutter.

Workflow

  1. mama-scan PATH — index files into the database (no copies, no moves)
  2. mama-apply — materialize approved observations into the archive (blob into CAS, hardlink into view)
  3. mama-web — browse, merge duplicates, filter, export, delete

Tech Stack

  • Python 3.13, FastAPI, SQLAlchemy 2.x (async), Alembic
  • PostgreSQL 16 (JSONB for embedded metadata)
  • Vue 3, Vite
  • ZFS (single archive dataset, snapshots, NFS export), Caddy
  • ExifTool, BLAKE3, ffmpeg, Pillow
  • Docker Compose for companion viewers (Immich, Navidrome, Paperless-ngx)

Disclaimer

mama is provided as-is for personal use. The author assumes no responsibility for data loss, corruption, mis-deduplication, accidental deletion, or any other adverse outcome arising from its use. Use at your own risk and only on data you can afford to lose.

License

MIT