Tagging files

Basic tagging

tessera tag FILE... -t TAG[,TAG,...]

Tags are case-sensitive strings. A tag can be:

  • A plain word: lossless, favourite
  • A hierarchical path using / as separator: genre/rock, status/todo
  • A key=value pair: year=2024, rating=5, artist=Kraftwerk

Multiple tags can be given as a comma-separated list or by repeating -t:

tessera tag song.flac -t lossless,year=2024
tessera tag song.flac -t lossless -t year=2024

Recursive tagging

Tag all files in a directory (and its subdirectories):

tessera tag -r Albums/Kraftwerk -t genre/electronic

Tagging from stdin

tessera accepts file paths from standard input, one per line. This lets you combine it with find, fd, fzf, and similar tools:

fd -e flac | tessera tag -t lossless
find . -name "*.jpg" -newer reference.jpg | tessera tag -t new

Use -0 to read NUL-delimited paths (safer for filenames containing newlines or spaces):

fd -0 -e mp4 | tessera tag -0 -t video

Listing tags

# Tags on specific files
tessera tags FILE...

# All tags in the database
tessera tags

# JSON output
tessera tags --json FILE

The tags command is also available as tessera ls.

Removing tags

tessera untag FILE... -t TAG[,TAG,...]

Viewing full file info

tessera show FILE

Shows all tags, the file's database record, size, modification time, and file identity.

Renaming a tag

Renames the tag everywhere in the database:

tessera mv OLD_TAG NEW_TAG

Merging tags

Merge all occurrences of SOURCE into TARGET (destructive — prompts for confirmation):

tessera merge SOURCE TARGET
tessera merge SOURCE TARGET --force   # skip confirmation

Global options

OptionDescription
--jsonJSON Lines output
--color auto|always|neverColour mode
-q, --quietSuppress informational messages, and log only errors
-v, --verboseExtra detail, including debug-level log records
--log-level SPECLog verbosity, optionally per target; beats TESSERA_LOG, -v and -q
--db PATHOverride the database location
--no-parentsDo not include ancestor databases in queries

Log records go to stderr, never to stdout, so --json output stays pipeable. The command writes no log file: it has no lifetime worth a forensic trail, and tessera-web is the process that keeps one. The default level is warn, so an ordinary invocation says nothing beyond its own output; --log-level accepts the same per-target specs as the server, such as info,tessera::embedding=error.