Skip to main content
Version: Stable

Tags

Tags are metadata labels that Zaparoo Core reads from media filenames and from metadata scrapers. They help Core choose between multiple matches for the same title, especially when your library has several regions, languages, revisions, demos, or bad dumps.

You will usually see tags when using title IDs. For example, this launches the US version of Super Mario World when more than one version is available:

@SNES/Super Mario World (region:us)

Tag format​

Tags use type:value format. The type is the category, and the value is the specific label.

PartExample
Tag typeregion
Tag valueus
Full tagregion:us

When a tag is part of a title ID, wrap it in parentheses:

@SNES/Game Title (region:eu) (lang:de)

Filename tags​

During media database updates, Core can parse known filename markers from ROM sets such as No-Intro and TOSEC. This behavior is controlled by filename_tags, which is enabled by default.

This filename:

Sonic the Hedgehog (USA, Europe) (En,Fr,De) (Rev A).md

can produce tags like:

  • region:us
  • region:eu
  • lang:en
  • lang:fr
  • lang:de
  • rev:a

Core also extracts tags from other recognized markers, including years, disc numbers, versions, dumps, prototypes, demos, translations, unofficial hacks, set numbers, and re-releases.

MiSTer Arcade filenames can include a region and build date in one parenthetical group. For example, (World 931005) becomes region:world and builddate:1993-10-05. Core also accepts YYYYMMDD, YYYY-MM-DD, and comma-separated forms such as (EU, 961004).

Using tags in title IDs​

Use tags when a title ID needs to be more specific than the game name alone.

@SNES/Super Mario World
@SNES/Super Mario World (region:us)
@SNES/Super Mario World (region:eu) (lang:de)
@Arcade/X-Men Vs. Street Fighter (region:eu) (builddate:1996-10-04)
@Genesis/Sonic (+unfinished:demo)
@SNES/Game Title (~lang:en) (~lang:fr)

The first example lets Core choose the best match. The others require or exclude specific tagged matches.

Operators​

Tags support three operators in title IDs and launch.title tag arguments.

SyntaxMeaning
(tag:value) or (+tag:value)Match must have this tag.
(-tag:value)Match must not have this tag.
(~tag:value)At least one ~ tag must match.

Examples:

@Genesis/Sonic (region:us)
@Genesis/Sonic (-unfinished:demo)
@SNES/Game Title (lang:en) (-unfinished:beta)
@SNES/Game Title (~lang:en) (~lang:fr)

Multiple tags can share one parenthetical group when separated by commas:

@SNES/Game Title (region:us, lang:en)

The tags argument uses the same operators without parentheses:

**launch.title:Genesis/Sonic?tags=region:us,lang:en
**launch.title:Genesis/Sonic?tags=region:us,-unfinished:demo

Matching behavior​

When you launch by title ID, Core matches the title first, then uses tags to narrow or rank the results.

Core also filters out some variants by default, including demos, betas, prototypes, hacks, translations, bootlegs, re-releases, and bad dumps. If you want one of those variants, request it with a positive tag:

@Genesis/Sonic (+unfinished:demo)
@SNES/Game Title (+unfinished:beta)
@SNES/Game Title (+unlicensed:translation)

If several good matches remain, Core applies your configured region and language preferences, then other scoring rules such as launcher file type priority and filename quality.

For same-named variants, browse, search, and lookup responses include disambiguatingTags: the tags that distinguish one variant from another. Clients can show those labels to help you pick the right entry, and the generated ZapScript includes the same tags so the token resolves back to that specific variant.

Default regions and languages​

Set default preferences in the media config section when you want Core to prefer certain regions or languages without writing tags into every title ID.

[media]
default_regions = ["us", "eu", "world"]
default_langs = ["en", "de"]

With those preferences, @SNES/Super Mario World will prefer matching US, European, or World releases, and English or German language tags, when those tags are present.

Useful tag types​

These are the tag types most likely to matter when writing title IDs by hand.

Tag typeUsed forExamples
regionRelease regionregion:us, region:eu, region:jp, region:world
langLanguagelang:en, lang:fr, lang:de, lang:ja
revRevision or versionrev:a, rev:b, rev:1, rev:prg0
yearRelease yearyear:1991, year:1996, year:19xx
builddateROM set build date, often from arcade filenamesbuilddate:1996-10-04
unfinishedPre-release or incomplete buildsunfinished:alpha, unfinished:beta, unfinished:demo, unfinished:proto
dumpDump quality or dump statusdump:verified, dump:bad, dump:overdump, dump:underdump
unlicensedUnofficial releases and modificationsunlicensed:bootleg, unlicensed:hack, unlicensed:translation
patchROM hacks and patchespatch:fastrom:1-1, patch:uncensored, patch:font:us
rereleaseDigital re-releases and collectionsrerelease:virtualconsole:wii, rerelease:mdmini:1
reboxedRe-releases and packaging variantsreboxed:playerschoice, reboxed:satakore
disc and disctotalMulti-disc setsdisc:1, disc:2, disctotal:3
mediaMedia type or sidemedia:disc, media:tape, media:side-a
setROM set number or variant groupset:1, set:2
videoVideo standardvideo:ntsc, video:pal, video:pal-60

Core defines many more tag types than this, including hardware add-ons, embedded cartridge chips, compatibility tags, publishers, developers, genres, and player counts. Most users do not need to write those by hand.

patch tags come from bracketed patch notes in filenames, such as [FastROM hack by Author v1.1], and let a title ID pick that patched variant of a game.

User tags​

A few tags are set by you rather than read from a filename. Favorites, likes, dislikes, and play later come from the Zaparoo App, or from your Zaparoo Online account through Library sync. Frontend sets favorites. They filter like any other tag:

**launch.random:SNES?tags=user:favorite
TagMeaning
user:favoriteMarked as a favorite
user:liked, user:dislikedLiked or disliked. Disliking clears favorite and liked
user:playlaterSaved to play later
user:hiddenHidden from browsing, search, and random picks. A card or script still launches it
user:deck:<id>In the deck with that ID. Set by the deck, not by hand

Tags are stable​

A tag you write in a title ID or a filter should mean the same thing on every device, whichever source the metadata came from, and keep meaning it after an update. So Core controls which tag values exist:

  • Most tag types are a fixed list. genre, region, lang, arcadeboard, players, input, the search franchises and features, and most of the filename types in the table above only accept values Core defines. Genres follow GameDataBase, for example genre:shmup:v or genre:action:platformer.
  • A few follow a strict format instead of a list: year (1950 to 2099), builddate (a real date), rating (0 to 100), the numbers in disc, disctotal, set, track and episode tags, and the versions in rev and patch.
  • Only developer, publisher and credit accept any name, because company names cannot be listed. Core stores them as normalized slugs, so T&E Soft becomes t-and-e-soft, and keeps the original spelling as a label.

Scraped tags​

Metadata scrapers cannot add tag types or tag values. A scraper translates what its source says into an existing value: a Shoot'em Up / Vertical genre becomes genre:shmup:v, a game series becomes search:franchise:castlevania, a CPS2 board becomes arcadeboard:capcom:cps2. A value the scraper cannot translate is left out rather than stored as it was written. That keeps filters working across sources, at the cost of dropping the occasional unusual source value until Core learns to map it.

Use the type:value form when writing title IDs or tag filters by hand.

Credit​

Zaparoo's tag taxonomy is inspired by GameDataBase, a game metadata project by PigSaint. GameDataBase uses a deeper hierarchical tag system; Zaparoo uses simpler type:value tags for filename parsing and title matching.