settag
SetTag is a terminal-first analysis assistant for DJ music libraries. It uses MAEST for genre and optional Discogs-EffNet heads for mood/theme and instrument evidence, then lets you stage and verify metadata changes before writing.
The default experience is a Textual app. The same executable also provides a plain, non-TUI CLI for scripts, redirected output, saved plans, and CI.
Metadata hygiene is a separate, model-free workflow. It finds suspicious comments, web addresses, duplicate or empty text values, and generated encoder markers, then lets you review individual field-level removals before writing.
Supported files:
- MP3, AIFF, and WAV with ID3 metadata
- FLAC with Vorbis comments
- M4A, M4B, and MP4 with MP4 atoms
Install
Install uv first, then run these commands in your terminal. No repository checkout is needed:
uv tool install settag
settag models download
settag "/path/to/music"
Or with pipx: pipx install settag. SetTag needs Python 3.10–3.14.
The app scans your library first. Select tracks to enrich, review the suggestions, then approve any writes. See Run the app for the controls, or Plain CLI mode for scripts.
Upgrade
Use the same installer you used originally:
uv tool upgrade settag
settag --version
For pipx installations, use pipx upgrade settag instead. If analysis reports
missing models after an upgrade, run settag models download again (include
--tasks genre,mood-theme,instrument if you use all three tasks).
Published versions are available on PyPI and GitHub Releases.
Supported platforms and models
Platform support is inherited from essentia-tensorflow, which ships only
prebuilt binary wheels. There is no pure-Python fallback and no source build
worth attempting, so a platform without a wheel cannot install SetTag at all:
| Platform | Requirement |
|---|---|
| macOS, Apple Silicon | macOS 15 (Sequoia) or newer |
| macOS, Intel | macOS 14 (Sonoma) or newer; macOS 15 on Python 3.14 |
| Linux, x86_64 | glibc 2.17 or newer (manylinux2014, so any current distro) |
Windows and Linux on ARM are not supported. Upstream has never published wheels for either, on any release.
The analysis backend is a large download — roughly 100 MB on macOS and 290 MB on Linux — and the models are fetched separately on top of that.
Genre is the default and the only model loaded unless tasks are requested explicitly:
settag models download --tasks genre,mood-theme,instrument
settag analyze "/path/to/music" --tasks genre,mood-theme,instrument
The interactive app reads its default tasks from
~/.config/settag/config.toml:
[analysis]
tasks = ["genre", "mood-theme", "instrument"]
The config file is optional. --tasks overrides it for one TUI run:
settag "/path/to/music" --tasks instrument
settag "/path/to/music" --tasks mood-theme,instrument
settag "/path/to/music" --tasks genre,mood-theme,instrument
Set SETTAG_CONFIG or pass --config /path/to/config.toml to use another
config file. Task precedence is --tasks, then the config file, then the
genre default. The config file is read only for options the flags left
unset.
How much audio the genre model reads
The genre model, MAEST, embeds one 30-second patch at a time and dominates the
run: 15.5s against EffNet's 1.2s on a 482-second track. --genre-sample
chooses how many of those patches it reads. Mood/theme and instrument always read the whole
track, because they are cheap and their taxonomies want whole-track averaging.
--genre-sample |
reads | relative speed |
|---|---|---|
full |
every 30s patch | 1.0x |
middle (default) |
4 patches from the centre | 2.2x |
spaced |
6 patches spread across the track | 1.6x |
Measured against the full-track answer over 14 tracks, middle preserved the
broad genre under the former House-family mapping on 14/14 and spaced on
13/14; these figures do not measure exact subgenre agreement. Both had a rank
correlation above 0.98 across all 519 labels. What moves is the crowded
0.1-0.25 tail, where the model is not confident anyway. Fewer patches also
means less averaging, so scores come out more peaked.
[analysis]
genre_sample = "full"
Changing this changes the evidence configuration digest, so tracks analyzed under a different setting are correctly reported as stale and reanalyzed.
Models are downloaded once into ~/.cache/settag/models; --model-dir on
models, analyze, and the app points at another directory, and
models download --force replaces files that are already present. They are not bundled
with this repository or its Python distributions. Downloads and installed
files must match the SHA-256 digests pinned in SetTag's model catalogue before
inference can start. Review Licensing before using the default
models in a professional, business, or revenue-generating workflow.
Run the app
Give SetTag a track or a directory:
settag "/path/to/track.mp3"
settag "/path/to/music/library"
For metadata cleanup without analysis, open the independent hygiene review:
settag hygiene "/path/to/music/library"
No model files are loaded. In the main app, H switches to the same hygiene
step after any running analysis has stopped. Use --no-tui to print findings
without changing files.
In an interactive terminal this opens the Textual app as a full-width track
list. Press I whenever you want to toggle the details panel. Arrow keys keep
navigating the main list while details follow the selected track. Press Tab to
focus and scroll the details pane; Shift+Tab returns to the list. With details
open, the library looks like this:
✓ Track File genre Enrichment
Brigado Crew - Sunrise.mp3 Melodic House & Techno Ready
Recommendation: Keep Melodic House & Techno
Based on: Beatport verified matches
Current file tag: Melodic House & Techno
Beatport · verified track match
Catalog genre: Melodic House & Techno
Supports keeping your existing genre.
Audio models · predictions
This genre model cannot predict "Melodic House & Techno".
Audio last analyzed: 2026-07-26T17:52:49Z
SetTag first scans existing metadata only. Tracks with no analysis, incomplete
metadata for any configured task, or a changed task model/config are selected
by default, along with tracks missing Beatport evidence. Fully enriched tracks remain visible but unselected. The active task
families are shown in the library context line. Adjust the selection, then
press R to enrich the selected tracks with Beatport metadata and any needed audio analysis
visible in the current filter. Selections in other filtered views are not
included.
The library separates enrichment freshness from genre agreement:
- Enrichment: Current means compatible audio and a fresh catalog check for this track. Ready means a result is awaiting review; Partial means a source is incomplete. Audio-analysis dates are labeled separately in Details.
- File genre is the tag currently stored in the file; staged edits appear in Review.
- Suggested genre shows the mapped file-genre suggestion. A muted
✓marks an existing match; amber highlights a different or missing genre worth reviewing.
For a model result of Progressive House, the file-genre suggestion is
Progressive House. An existing matching genre shows a muted ✓ Progressive House.
An existing House, Techno, or an empty genre shows the suggestion in amber.
Amber means "worth reviewing," not "incorrect." Details explain matches and
staged edits. Stale results show Reanalyze, and results below the review
cutoff show No suggestion.
Press G to cycle the genre filter: All, Needs review, Missing genre,
and Matches. Needs review includes differing or missing genres with a usable
suggestion. Missing genre also includes files that have no suggestion yet.
The F library filter and G genre filter combine; both active choices stay
visible above the table. Filtering preserves selections, and analysis only
uses selected tracks visible through both filters.
Analysis runs serially in a background worker. The selected batch is fixed when
the job starts, but the interface remains available for navigation, filtering,
and inspection. Each completed track is persisted immediately and becomes
available under V while the next track is still running.
The library keys are:
| Key | Action |
|---|---|
↑ / ↓ |
Move through tracks |
Space |
Select or unselect the current track for enrichment |
A |
Toggle all eligible tracks in the current view on or off |
I |
Show or hide details for the highlighted track |
F |
Cycle All, Needs enrichment, Missing genre, and Analysis current views |
G |
Cycle All, Needs review, Missing genre, and Matches genre filters |
V |
Open saved results that are ready to review, when available |
Enter |
Open details for the highlighted track |
R |
Enrich the selected tracks |
Esc |
Stop after the track currently being analyzed |
U |
Undo a previous write |
H |
Switch to the separate metadata-hygiene review |
Q |
Quit |
Cancellation is cooperative because Essentia/TensorFlow inference cannot be safely interrupted halfway through a track. Completed results remain available for review and are saved in the local workbench; unprocessed tracks remain selected for a later run. Cancellation never writes metadata.
Background execution keeps the interface interactive, but inference remains CPU-intensive; a warm laptop and active fans are expected during a large batch. SetTag deliberately analyzes one track at a time rather than multiplying that load with parallel track workers.
Press V as soon as the first track completes to open review. If you stay in
the library, the app switches to review when the full batch finishes:
▼ [x] Brigado Crew - Sunrise (Paride Saraceni Remix).mp3
└── ▶ Details · Evidence update
Review shows only tracks with meaningful pending changes, plus analysis failures. Genre edits show current → after write; unchanged genres are omitted. Expand Details for sources and exact changes, then Audio models for ranked scores. Lookup status and check dates are saved locally without changing audio files or creating review items. The review cutoff and top limit control which candidates are displayed; the complete stored analysis remains one coherent write. Child rows describe the track's changes and evidence; they are not independent write selections. Space on any child includes or excludes its owning track. Collapsing branches, changing selection, and receiving background results preserve review context.
The review keys are:
| Key | Action |
|---|---|
Space |
Include or exclude the current track from writing |
A |
Toggle all changed tracks on or off |
I |
Show or hide review candidates and staged changes |
E |
Set this track's standard genre, clear it, or use the suggestion |
S |
Save the included tracks as a reusable JSONL plan |
Enter |
Expand/collapse a branch, or open details for a change |
← / → |
Collapse/expand branches or move between parent and child |
W |
Preflight, confirm once, write, and verify completed tracks |
B |
Return to the metadata library to choose another enrichment batch |
U |
Undo a previous write |
H |
Switch to the separate metadata-hygiene review |
Q |
Quit |
Newly analyzed tracks with SetTag changes are checked for writing by default.
Press Space to check or uncheck the highlighted track.
While background analysis continues, review, genre editing, plan saving, and
writing operate on the completed snapshot only. The in-flight track cannot
enter a write until its analysis plan is complete.
When a newly analyzed track has no conventional genre, SetTag visibly stages
the standard-genre suggestion there by default. It never replaces
a non-empty genre automatically. Use E to change the staged value or clear it
to preserve the empty genre; the before → after value remains visible in the
list and inspector. If no candidate clears the review cutoff, the genre remains
empty.
The automatic default and the editor's Use suggestion action remove only the
Discogs parent prefix, preserving the model's detailed genre:
Electronic---Progressive House → Progressive House
Electronic---Tropical House → Tropical House
Specificity does not guarantee accuracy: suggestions still use the review cutoff
and should be reviewed. Detailed labels and scores are unchanged in the SetTag
evidence. Use E to open the genre screen, where you can restore the suggestion
after opting out or enter the exact value you want.
W runs a complete preflight and shows one batch confirmation. Write is the
default focused action, so Enter confirms it; Esc returns to review. SetTag
then runs preflight again, writes each file through its format-native adapter,
and reopens it to verify the result. Analysis errors disable writing for the
batch.
After a successful write, the app stays open. Written tracks leave the review
batch and appear as up to date in the library. Any skipped review tracks remain
available, so you can continue reviewing or return to the library for another
analysis batch before pressing Q.
Local workbench and restart recovery
The app saves each completed analysis and staged genre edit to a small local
SQLite workbench. If you quit before writing, opening the same track or
directory opens in the library and shows the saved result as Ready · date.
The model is not rerun. Press V to review saved results, or select a ready
track in the library to reanalyze it deliberately.
The workbench is private application state, not portable music metadata:
- macOS:
~/Library/Application Support/settag/state.sqlite3 - Linux:
${XDG_DATA_HOME:-~/.local/share}/settag/state.sqlite3 - Windows:
%LOCALAPPDATA%\settag\state.sqlite3— the path SetTag would use, though Windows cannot install the analysis backend today (see Install)
Override it for a run with --state-db PATH, or globally with
SETTAG_STATE_DB. For example:
settag "/path/to/music" --state-db "/path/to/settag-state.sqlite3"
The same database keeps durable enrichment history separately from pending
write plans. Matches, misses, failures, and lookup dates survive plan deletion,
file writes, and renames. Matching uses both audio identity and catalog query
identity. Copying a file to a computer without this database may require a new
lookup. Both interactive and plain run/enrich commands use this local history.
A cached result is ready only while the source size and modification time,
analysis model, evidence format, and observed standard genre still match.
Changing --top or --score-cutoff does not require reanalysis; SetTag applies
the new review policy to the stored evidence. Metadata already embedded in the
audio file is authoritative and supersedes an obsolete workbench entry.
Successfully written and verified entries are removed from the workbench.
A track renamed or moved between runs is found again by its audio digest
when exactly one scanned file matches, so its saved result follows it;
an ambiguous match is reported as missing rather than guessed.
Metadata created by the older cutoff-filtered contract needs one reanalysis to
populate the new bounded evidence bundle.
The database is deliberately not an export format. Use S in review or
analyze --plan when you want an explicit, portable JSONL plan that another
command or machine can preview and apply.
Review defaults can be adjusted without changing the evidence written to files:
settag "/path/to/music" --top 5 --score-cutoff 0.10
--threshold remains an alias for --score-cutoff.
Metadata hygiene
Hygiene is intentionally separate from genre analysis:
scan tags → flag suspicious values → choose fields → confirm → clean and verify
The first release recognizes comment-like and generated metadata in each supported container:
| Container | Reviewed fields |
|---|---|
| ID3 | COMM, user URL frames, comment/source/url TXXX fields, TSSE |
| FLAC | comment, description, source, URL, download, and encoder comments |
| M4A/MP4 | ©cmt, ©too, and matching text freeform atoms |
A comment such as electronicfresh.com is suggested for removal because it
contains a web address. An ordinary DJ note remains untouched. Encoder markers
such as Lavf62.12.102, empty values, and exact duplicate values are also
suggested. These rules create review suggestions, never automatic writes.
Opening hygiene presents three tools: Metadata cleanup, Duplicate detection,
and Run both. Press T in a review to choose another tool. Metadata cleanup
only reads tags; duplicate detection only hashes audio.
Use --scan metadata|duplicates|all to start a particular scan directly:
settag hygiene "/path/to/music/library" --scan duplicates
settag hygiene "/path/to/music/library" --scan duplicates --no-tui
Without --scan, noninteractive output defaults to metadata cleanup.
Duplicate detection groups files with identical audio-payload SHA-256 hashes, ignoring
tags and filenames. Duplicate groups show full paths in both the interactive
review and --no-tui output; cleanup never deletes or moves files. Different
encodings of the same recording may not match. Each duplicate scan streams the audio
without decoding or loading models; scan time depends on library size and disk
speed, and hashes are not cached between scans.
Tracks appear as expandable branches with their proposed fixes underneath.
Each track shows its checked/total count; fixes show the field, proposed
operation, and reason. Space includes or excludes a fix, or all fixes under
the focused track. Enter expands or collapses a track and opens details for a
fix; ←/→ navigate branches. Collapsing a track preserves its selections.
A toggles all findings, I shows the exact before and after values, and W
runs preflight and opens one confirmation. Only checked
suggestions are written. Titles, artists, albums, artwork, genres, SetTag
evidence, and unselected comments remain unchanged.
Hygiene writes use the same temporary-copy, reopen-and-verify, and journal path
as analysis writes. settag undo therefore restores cleaned values too.
Plain CLI mode
When stdin or stdout is not a terminal, settag PATH automatically becomes a
plain dry run. It never prompts or writes. Force that mode in a terminal with:
settag "/path/to/music" --no-tui
The named commands are also plain CLI commands:
# Which build stamps SETTAG_VERSION
settag --version
# Human-readable dry-run logs
settag analyze "/path/to/music"
# Complete machine-readable audit records
settag analyze "/path/to/music" --output analysis.jsonl
# Read current tags without loading the model
settag inspect "/path/to/track.mp3"
# Every field, but no ranked score lines: readable across a directory
settag inspect "/path/to/music" --no-scores
# Create, preview, and apply a durable plan
settag analyze "/path/to/music" --plan settag-plan.jsonl
settag preview settag-plan.jsonl
settag apply settag-plan.jsonl
For deliberate automation, apply --yes suppresses only the confirmation.
It does not suppress source, metadata, or plan validation:
settag apply settag-plan.jsonl --yes
analyze never writes. A reviewed plan is the only route to disk, in the app
or through apply, so every write in SetTag passes the same preflight and
verification. Standard genre editing is available in the app or in a saved
plan because it must be staged explicitly per track.
Logging
Normal INFO output is compact:
INFO [1/1] /path/to/track.mp3
INFO file genre tag: House (unchanged)
INFO SetTag genres: none -> Electronic---House score 0.765
INFO dry run: SetTag analysis bundle would change (6 internal fields); nothing written
The complete 519-label record is written with --output or exposed through
debug logging:
LOG_LEVEL=DEBUG settag analyze "/path/to/track.mp3"
LOG_LEVEL accepts DEBUG, INFO, WARNING, ERROR, or CRITICAL.
Essentia's known one-time Abseil/MLIR startup messages are filtered separately
because native TensorFlow code writes them before Python logging starts.
Metadata safety
SetTag-owned model evidence and a conventional file genre are separate:
| Purpose | ID3 | FLAC | MP4 |
|---|---|---|---|
| Ranked SetTag evidence | TXXX:SETTAG_* |
SETTAG_* |
----:com.lsdcapital.settag:* |
| Standard file genre | TCON |
GENRE |
©gen |
Each task's label field holds bounded ranked evidence, and its _SCORES twin
holds the same labels and order with the raw model scores as one compact JSON
value. SetTag stores the top 60 results without a score cutoff so consumers such
as SetPath can apply their own policy. Genre evidence is exclusively
MAEST-derived; EffNet cannot populate SETTAG_GENRE or a conventional genre
field. Task updates are independent, so an instrument-only run replaces
instrument evidence while preserving valid genre and mood/theme evidence.
The full field list, the per-task vocabulary declaration consumers should
key on, and the SETTAG_PROVENANCE record are specified once, in
DESIGN.md.
The standard genre is not part of the SetTag namespace. For newly analyzed tracks where it is empty, the app stages the standard-genre suggestion by default; the user can edit or opt out before confirming the write. Title, artist, album, artwork, duplicate fields, and metadata owned by other software are preserved. Comments and other hygiene fields are preserved unless the user explicitly checks their removal in the separate hygiene review.
Before any batch write, SetTag verifies for every included track:
- the audio has not changed since analysis. The check uses a digest of the audio samples only, so another tool retagging the file in between does not block the write, while a re-encode, edit, or truncation does;
- the observed conventional genre;
- the detected native adapter;
- every reconstructed SetTag change;
- any explicitly staged standard genre change.
The audio digest is checked once more immediately before each file is written. After each write SetTag reopens the file and verifies both the evidence and the expected standard genre. A batch preflight is all-or-nothing, although native file writes cannot form one transaction across multiple files.
Undoing a write
Every verified write is journaled with the tag values it replaced, so a write
can be reverted. Press U in the app, or use the CLI:
# What has SetTag written?
settag undo --list
# Preview reverting the most recent write
settag undo --dry-run
# Revert the most recent write, or a named one
settag undo
settag undo 20260725T110349-8993c143
# Show more history, or revert without the confirmation prompt
settag undo --list --limit 25
settag undo --yes
The journal lives in its own database, separate from the workbench cache, so clearing the cache never destroys undo history:
| Purpose | Location |
|---|---|
| Write journal (durable) | journal.sqlite3, overridable with SETTAG_JOURNAL_DB or --journal-db |
| Workbench cache (disposable) | state.sqlite3, overridable with SETTAG_STATE_DB or --state-db |
Undo restores exactly what a write changed: the SetTag-owned fields listed above, the conventional genre tag when that write explicitly staged an edit, and any fields explicitly removed by a hygiene write. A track that had no SetTag metadata beforehand is returned to having none rather than being left with debris.
Some limits worth knowing:
- It restores tag values, not bytes. mutagen rewrites the tag block on save, so the file will not regain its pre-write SHA-256 even after a perfect undo.
- It is per write, not "restore original". Two writes to one file produce two journal entries; undoing the newest returns the state after the first write.
- It leaves other software alone. Edits made elsewhere between the write and the undo are untouched.
- It refuses changed files. If a file was modified after SetTag wrote it,
that file is skipped and named;
--forceoverrides.
Entries older than 90 days are pruned.
Saved plans
A plan is one JSONL record per track on the settag.plan/v6 schema. It carries
the bounded evidence separately from SetTag's current review selection, the
observed file genre separately from an optional staged target, the audio
digest preflight checks against, and the human-readable change lines preview
prints. The record layout is specified once, in
DESIGN.md.
New plans also carry source.owned_sha256, a digest of the exact observed
SetTag-owned metadata. Preflight rejects changes to those values even when
the display summary is identical. Older plans without this digest require
the whole file to remain unchanged, including unrelated tags.
Plans produced by analyze --plan set target_file_genre to null. Plans
saved from the app retain explicit edits. preview is the built-in
human-readable renderer; users do not need jq.
Every apply performs preflight both before and after confirmation. A source change or an analysis-error record rejects the whole plan before writing.
Existing settag.plan/v5 plans still apply with their original explicit writes.
The separate enrichment snapshot in v6 is local context, outside the file-tag
bundle. Plans on the pre-release settag.plan/v4 schema still apply. They predate the
audio digest, so preflight falls back to comparing the whole file for them: a
tag write by another tool blocks a v4 plan where a newer plan would proceed. Any
other schema is rejected with an explicit error.
Scores and models
The pinned production models are:
- MAEST genre:
discogs-maest-30s-pw-519l-2genre_discogs519-discogs-maest-30s-pw-519l-1
- optional Discogs-EffNet metadata:
discogs-effnet-bs64-1mtg_jamendo_moodtheme-discogs-effnet-1mtg_jamendo_instrument-discogs-effnet-1
When genre and EffNet tasks are requested together, one 16 kHz audio decode feeds both model stacks. Mood/theme and instrument always reuse one EffNet embedding pass.
Each score is the mean class-wise sigmoid activation across analyzed audio
patches. It is useful for ranking and applying a score cutoff, but it is not
demonstrated to be calibrated confidence or probability. Scores do not need to
sum to 1.
The review cutoff controls review markings and suggestions only. It does not remove scores from the bounded evidence bundle:
settag analyze "/path/to/music" --top 5 --score-cutoff 0.10
Licensing
SetTag source is licensed under AGPL-3.0-only. The default inference workflow also uses separately licensed components and model files:
essentia-tensorflowis AGPL-3.0-only; UPF also offers proprietary licensing- TensorFlow runtime is Apache-2.0
- UPF publicly offers the Essentia model weights and metadata for non-commercial use, with proprietary licensing available
UPF's public documentation currently identifies the exact Creative Commons variant inconsistently as CC BY-NC-ND 4.0 and CC BY-NC-SA 4.0. The model repository's licence file is also internally inconsistent, and the pinned model metadata does not specify a licence. Both stated variants restrict the public grant to non-commercial use. Until UPF provides model-specific clarification, SetTag does not assert permission to redistribute or publish adapted model files.
Personal, educational, or research use may fall within the public model terms. Professional, business, or other revenue-generating use is not clearly permitted and may require separate permission from UPF or a different analysis backend. Downloading the models separately does not change their terms.
Metadata produced by SetTag can be exported to and imported by compatible music-library applications. Users remain responsible for ensuring that their selected analysis backend permits their intended use.
Exact attributions and dependency notices are in THIRD_PARTY_NOTICES.md.
See:
- https://essentia.upf.edu/licensing_information.html
- https://essentia.upf.edu/models.html
- https://essentia.upf.edu/models/LICENSE
Development
uv sync --group dev
uv run pytest
uv run ruff check .
uv run ruff format --check .
uv run ty check
uv build
GitHub Actions runs the same lint, format, type, and test checks on every
supported Python version (3.10 through 3.14) for each push to main, pull
request, and release tag.
The default test run uses Textual's headless app runner and synthetic audio; it does not run model inference. A small set of smoke tests against the real genre model is opted into separately and skips itself when the models are not downloaded:
uv run pytest -m models
uv run settag models status --tasks genre,mood-theme,instrument
uv run settag analyze "/path/to/track.flac" --tasks genre,mood-theme,instrument
Architecture and safety contracts are documented in DESIGN.md.
Optional audio evidence for ranking experiments
SetTag can export pooled EffNet embeddings without writing them into your music files. This is optional evidence for consumers such as SetPath, which must remain usable without SetTag or its models. It does not declare energy, vocal prominence, or any other calibrated perceptual axis.
settag models download --tasks mood-theme,instrument
settag analyze "/path/to/music" --tasks mood-theme,instrument --embeddings embeddings.jsonl
The export reuses the same EffNet embedding pass as those tasks. Genre-only runs cannot export it; no extra model is silently enabled. The output must be a new file. Completed tracks are flushed individually, and any track failures produce a nonzero exit status and diagnostics on stderr. The file contains successful records only; an interrupted or partially failed batch is not complete coverage.
Each audio-embedding/v1 record carries source identity, model weights digest,
output tensor, preprocessing, mean pooling, L2 normalization, dimensions, patch
count, and the vector. The current EffNet model produces 1,280 dimensions. These
are whole-track embeddings, not intro/outro or phrase measurements.
A consumer must compare compatible feature spaces and treat missing evidence as unknown. Different producers can implement the same contract; there is no runtime connection between SetTag and SetPath. SetPath currently consumes these exports only through its explicit offline evaluation commands. Export from the final file state: its importer verifies the whole-file SHA-256 and rejects files retagged or replaced since export.
One enrichment workflow
Open SetTag as usual and press R — Enrich on selected tracks. SetTag checks Beatport, reuses current audio evidence and runs audio analysis when needed. Review the combined result and write it through the existing verified, undoable workflow. Fresh, verified Beatport matches take priority over existing genres. The app stages all supplied labels as multiple genre values and keeps each release’s source link. An existing genre stays first when Beatport also supplies it; otherwise stored release order determines the first value, without implying higher confidence. Manual genre choices are preserved. Without a verified catalog match, the audio model can fill a blank genre but does not replace an existing one.
settag enrich /path/to/music is an alias for opening the same app. There is no
separate Beatport workflow or required plan/report/cache argument. For unattended
preview, settag /path/to/music --no-tui runs that same enrichment operation.
The advanced analyze command remains a raw audio-model export/diagnostic tool.
Beatport requests send track identity text, such as artist/title or ISRC, to Beatport;
audio stays local. Successful catalog pages are cached for seven days under
~/.cache/settag/beatport (SETTAG_BEATPORT_CACHE overrides that location). Source
failures are shown in review while useful results from other sources are retained.
SetPath does not yet use the additional catalog evidence in ranking.
The combined freshness contract is settag.enrichment/v2, stored in the local
metadata database. New enrichment runs do not create, update, or remove the
legacy SETTAG_ENRICHMENT file tag. Scans import compatible legacy tags into the
database; subsequent local observations take precedence. Current requires valid audio evidence and a completed catalog
check less than seven days old for the current artist, title, duration, ISRC and
Beatport ID. Editing that identity invalidates both cached matches and cached misses;
older checks without an identity fingerprint are checked again. Partial indicates a source failure; Needs
enrichment includes missing/older contracts and expired checks. Upgrading the
contract reuses compatible audio results.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file settag-0.2.2.tar.gz.
File metadata
- Download URL: settag-0.2.2.tar.gz
- Upload date:
- Size: 278.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
18a4214010abd9bf46abe42e5b70d1c2e0ffb72382aefd8782df037ba6f460a9
|
|
| MD5 |
68fa4a9e24ddacbd6b2aa9f2e30b4016
|
|
| BLAKE2b-256 |
b3570dfb99cb6c1bf488fe7d13417594e6b1c2e39384dcb6a521f6a6141e20fd
|
Provenance
The following attestation bundles were made for settag-0.2.2.tar.gz:
Publisher:
release.yml on lsdcapital/settag
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
settag-0.2.2.tar.gz -
Subject digest:
18a4214010abd9bf46abe42e5b70d1c2e0ffb72382aefd8782df037ba6f460a9 - Sigstore transparency entry: 2739147329
- Sigstore integration time:
-
Permalink:
lsdcapital/settag@dde87534e2bc0a6e076b27c4c7d3195f182761a9 -
Branch / Tag:
refs/tags/v0.2.2 - Owner: https://github.com/lsdcapital
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@dde87534e2bc0a6e076b27c4c7d3195f182761a9 -
Trigger Event:
push
-
Statement type:
File details
Details for the file settag-0.2.2-py3-none-any.whl.
File metadata
- Download URL: settag-0.2.2-py3-none-any.whl
- Upload date:
- Size: 162.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
36911f3c99ff4648de2a16aa287373148371b3a253357a8be5a220d3efe67701
|
|
| MD5 |
c77df5c9d10005dffa3a8ab2b3b7c477
|
|
| BLAKE2b-256 |
17da042465eb6ecd72a66c570056068ab6f8a624cfa637240fe57bab71a77259
|
Provenance
The following attestation bundles were made for settag-0.2.2-py3-none-any.whl:
Publisher:
release.yml on lsdcapital/settag
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
settag-0.2.2-py3-none-any.whl -
Subject digest:
36911f3c99ff4648de2a16aa287373148371b3a253357a8be5a220d3efe67701 - Sigstore transparency entry: 2739147350
- Sigstore integration time:
-
Permalink:
lsdcapital/settag@dde87534e2bc0a6e076b27c4c7d3195f182761a9 -
Branch / Tag:
refs/tags/v0.2.2 - Owner: https://github.com/lsdcapital
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@dde87534e2bc0a6e076b27c4c7d3195f182761a9 -
Trigger Event:
push
-
Statement type: