

A003_C014_0812G7.mov, and where is it?”
For production and post teams, your team should create the catalog as part of the write. If the catalog depends on somebody remembering to scan a tape after the rush, it will drift. Your team should use boring automation: write, verify, export index, ingest index, search.
The basic architecture
A practical open-source LTO catalog workflow has four layers:- LTFS formatting and mounting for the tape filesystem
- A write tool or script that copies media and verifies it
- An exported tape index, usually XML, JSON, CSV, MHL, or a filesystem scan
- A searchable database that stores tape IDs, paths, sizes, hashes, dates, and project metadata
Pick the right tool level
There are several open-source or open-ish approaches, and they fit different teams.| Tool level | Good fit | Catalog behavior to rely on | Caveats |
|---|---|---|---|
| Standard LTFS tools | Teams that want a transparent, scriptable base for formatting, mounting, copying, and ejecting tapes | LTFS exposes the tape as a filesystem, then your scripts export or scan the index for ingest | LTFS alone is not a searchable offline catalog, so you must build verification, index export, and database ingest |
| LTOpers | Post teams that want LTFS-specific helpers without buying a full archive platform | Can export an XML schema on eject and update the schema when a tape is amended | Put the index directory somewhere backed up and shared, not in one user profile |
| ltfs-tools | Python-friendly archive stations that want hashing, MHL output, index backup, and offline catalog experiments | Can combine transfer verification, manifests, LTFS index backup, and catalog functions | Test carefully before production use, especially with camera originals |
| TapeHoard | Mixed offline archives with LTO, shuttle drives, USB disks, and S3-compatible storage | Index-first search across multiple offline storage types | Useful as a broad catalog, but not a replacement for a controlled LTFS write and verify workflow |
| Bareos, Bacula, or Proxmox Backup Server | Tape libraries, autochangers, and backup-style restore operations | Tracks volumes, slots, inventories, and restore catalogs | Strong for backup operations, but not designed around post-production asset metadata |
mkltfs and ltfs commands. This is the right base when you want scripts you can understand and rebuild.
For media-archive-specific helpers, look at LTOpers. It includes commands for formatting, mounting, writing, schema ingestion, and searching LTO metadata. One useful behavior is that when a tape is ejected, it can export the tape’s LTFS index as an XML .schema file to a configured index directory. If a schema file already exists for that tape, it updates it with new data. That's exactly the behavior you want for amended tapes.
For a newer Python toolkit, ltfs-tools is interesting because it targets cross-platform LTFS archive workflows with source hashing, transfer verification, MHL output, automatic LTFS index backup, and an offline catalog system. It also describes a CatalogFS style approach, where catalogs can be mounted as a virtual filesystem. Treat this kind of project carefully in production, because some open-source LTO tools are experimental and say so plainly. Test them on non-critical tapes before trusting them with camera originals.
For a broader offline-media index, TapeHoard takes an index-first approach across offline HDDs, USB drives, S3-compatible storage, and LTO. That can be useful if your archive is mixed, which is common in real post houses. Not everything old is on LTO, and some shows are on shuttle drives, some on nearline NAS, some on cloud cold storage, and the catalog still needs to find the shot.
For an actual tape library and backup-suite behavior, Bareos, Bacula, or Proxmox Backup Server may make sense. They aren't post-production archive tools in the Canister or YoYotta sense, but they're backup systems, and they understand tape inventories, tape catalogs, slots, volumes, and restores. Bareos, for example, needs volumes in its catalog and slot information for autochangers. Proxmox separates known tapes from media catalog content and uses the catalog to locate restore data. That model is useful even if you build something smaller.
What to capture at write time
At minimum, capture enough data to find and trust the file later. A catalog that only stores filenames will fail the first time two cameras use the same clip name. For each file your team writes to tape, store these fields:- Tape ID or barcode
- LTFS volume UUID, if available
- Project or production code
- Archive job ID
- Full path on tape
- Original source path
- Filename
- File size
- Modified time from source
- Write date
- Checksum, ideally from the verified source copy
- Checksum algorithm
- Archivist or workstation
- Tape generation, such as LTO-7, LTO-8, or LTO-9
- Notes for spanning, excludes, or partial writes
A_CAM or B_CAM, roll IDs, and codec markers make both the filesystem and the catalog more searchable.
Don't rename camera originals to make the catalog nicer. Preserve the original folder structure and names, then add metadata beside them in the database.
A simple open-source implementation
Your team can build a small but reliable setup with LTFS, Python, SQLite or PostgreSQL, and a scheduled or event-driven ingest script. The write station needs a predictable directory layout:/archive_station/
incoming/
manifests/
tape_indexes/
logs/
mhl/
catalog.db
The tape write script should do the work in a repeatable order:
mount LTFS tape
read tape identity
copy selected source folders
generate or import checksums
verify written files
export LTFS index
write MHL or manifest
ingest index into database
unmount or eject tape
Index export and database ingest belong inside the same workflow as the write.

/tape_catalog/indexes/LTO123.schema
/tape_catalog/indexes/LTO124.schema
/tape_catalog/manifests/LTO123_2026-08-01.mhl
/tape_catalog/logs/LTO123_2026-08-01_write.log
After every write, ingest the latest index into the database. The ingest script should upsert records, not blindly append duplicates. Your ingest script can uniquely identify a file record by a combination of tape ID, full path, size, and checksum. If you allow amended tapes, you also need to track index generation or ingest time.
A minimal database can look like this:
CREATE TABLE tapes (
id INTEGER PRIMARY KEY,
tape_label TEXT UNIQUE NOT NULL,
barcode TEXT,
volume_uuid TEXT,
generation TEXT,
status TEXT,
first_seen_at TEXT,
last_indexed_at TEXT,
location TEXT
);
CREATE TABLE files (
id INTEGER PRIMARY KEY,
tape_label TEXT NOT NULL,
path TEXT NOT NULL,
filename TEXT NOT NULL,
size_bytes INTEGER,
modified_at TEXT,
checksum TEXT,
checksum_algorithm TEXT,
project_code TEXT,
archive_job_id TEXT,
indexed_at TEXT,
deleted_from_latest_index INTEGER DEFAULT 0
);
CREATE INDEX idx_files_filename ON files(filename);
CREATE INDEX idx_files_path ON files(path);
CREATE INDEX idx_files_checksum ON files(checksum);
CREATE INDEX idx_files_project ON files(project_code);
CREATE INDEX idx_files_tape ON files(tape_label);
SQLite full-text search can work for filenames and paths. PostgreSQL gives you better multi-user access and stronger search options. Either is fine as long as the schema is boring and exportable.
Handling amended tapes
LTFS makes it possible to add files to a tape later, but your catalog logic has to understand that a tape index changes over time.
- New files added to the tape
- Files still present and unchanged
- Paths that no longer appear in the latest index
- Files with the same path but different size or checksum
- Metadata changes, such as modified time or LTFS generation
Searching across tapes
Search should match how people ask for media. Editors rarely know the full archive path. They ask for a camera roll, a scene, a date, a filename fragment, an audio day, or “the VFX plates from episode 104.” At minimum, support these search patterns:- Exact filename
- Partial filename
- Folder path contains
- Project or show code
- Shoot date or archive date
- Camera, card, or roll ID
- Checksum
- Tape label or barcode
lto-search --filename A003_C014
lto-search --project SHOW104 --camera A_CAM --date 2026-07-18
lto-search --checksum 9f2c...
The output should be retrieval-oriented, not database-oriented:
Found 2 matches
Tape: LTO123
Location: Vault Shelf B4
Path: /SHOW104/OCF/2026-07-18/A_CAM/A003/A003_C014_0812G7.mov
Size: 87.4 GB
Checksum: xxh64:9f2c...
Indexed: 2026-08-01 19:42
Tape: LTO128
Location: Offsite Box 12
Path: /SHOW104/CONFORM_PULLS/A003_C014_0812G7.mov
Size: 87.4 GB
Checksum: xxh64:9f2c...
Indexed: 2026-08-04 10:15
That tells a coordinator or assistant editor what to pull, where it's, and whether there are multiple copies. If you've both camera originals and later pulls on LTO, search results should make the asset type clear so nobody restores a transcode when they need OCF.

Verification belongs in the same workflow
Cataloging isn't verification, because a catalog can prove that your workflow indexed a path, but it doesn't prove your workflow wrote the file correctly unless you store and validate fixity. The practical approach is to generate checksums before or during transfer, verify after write, and store the result with the catalog record. MD5 is still common in media workflows because many MHL and camera offload tools support it, while xxHash64 is much faster and useful for large volumes. Some teams use both: MD5 for interchange compatibility, xxHash64 for speed. MHL output is especially useful in post because it's a familiar sidecar format for media integrity. When your archive tool can emit MHL, keep it beside the tape index and ingest the checksum values into the catalog database. Store failed verification attempts too. If a write job fails halfway through, the catalog shouldn't pretend nothing happened. It should record an archive job with failed status, log path, tape label, and the point of failure. That prevents someone from reusing a questionable tape without context.Common LTFS failure modes that affect catalogs
Tape catalog automation depends on successful mounts, writes, reads, and ejects, and LTFS problems can create stale catalogs. A few failure modes deserve special handling in scripts and logs:- LTFS changes the tape to read-only because the drive reports too many write errors
- The tape formats successfully but fails to mount
- A tape library slot inventory doesn't match the expected barcode
- The tape was ejected before the index export completed
- The catalog database ingested an older index after a newer one
Library and barcode handling
If you use a single desktop drive, you can type or scan the tape label. If you use an autoloader or tape library, you need to separate physical slot inventory from content catalog. The system should track:- Barcode label on the cartridge
- LTFS volume name or serial
- Library slot
- Drive serial or device path
- Tape status, such as blank, active, full, suspect, retired, or vaulted
- Physical location when outside the library
SHOW_ARCHIVE_01. Use barcode-style labels with unique IDs, and store friendly project names as metadata. Productions wrap, drives get replaced, and shelves get reorganized, but unique tape IDs survive all of that.
Make the catalog rebuildable
Your team should back up the catalog database, but you should also keep it rebuildable from files stored outside the database. Keep these artifacts for each tape:- The exported LTFS index
- The write manifest or MHL
- The archive job log
- The tape barcode and location record
- A copy of the ingest script version or tool version used
tape_indexes folder, ingest every index, and recreate the searchable catalog. Test that process before you need it, because discovering during a restore that the only searchable catalog was a laptop database that left with a freelancer is too late.
A practical recommendation for small post teams
For a small production company, dailies lab, or editorial department, start with this stack:- LTFS or OpenLTFS for formatting and mounting
- LTOpers or a Python LTFS workflow for writing and index export
- MHL or checksum manifests for fixity
- SQLite for a single archive station, PostgreSQL for shared search
- A simple CLI or internal web page for search
- A backed-up folder of exported tape indexes as the durable record
FAQ
LTFS contains an index on the tape, but it isn't enough by itself for offline search. Once the cartridge is on a shelf or in a vault, you need an off-tape catalog that stores the tape ID, paths, file sizes, checksums, dates, and project metadata so you can find media before loading a cartridge.
SQLite is usually enough for one archive workstation or a small single-operator setup. PostgreSQL is a better choice when multiple users need network access, when you want a web search interface, or when the catalog will grow across many productions and years.
The catalog should ingest a new tape index after every amendment and compare it with the previous known index. A simple setup can replace the current file list for that tape, but a safer setup keeps each index generation, marks which files are present in the latest version, and flags files that disappeared or changed.
At minimum, capture the tape label or barcode, LTFS volume UUID if available, full tape path, source path, filename, file size, modified time, write date, checksum, checksum algorithm, project code, archive job ID, operator, workstation, tape generation, and any notes about partial writes or spanning. For media workflows, show, episode, shoot date, camera, roll, card, scene, vendor, and asset type are also useful.
The automation shouldn't update the tape’s current catalog as if the job succeeded. It should keep the last known good index, record the failed job with logs and status, and mark the tape as suspect if the drive reports serious errors such as read-only fallback, label read failures, or repeated write errors.
Keep the LTFS index files and MHLs in your rebuildable archive records, but mirror the human-facing restore context somewhere the team already searches. Aspect can help by attaching tape label, project, episode, roll, restore status, and other fields as custom metadata.





