From 30b74cc3132d3913d2024ff690861a8da4f9a557 Mon Sep 17 00:00:00 2001 From: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com> Date: Sat, 26 Sep 2026 15:36:58 -0400 Subject: [PATCH 01/10] catalog: close the format list and check it (V20) site/format-vocabulary.json lists every formats value in use; V20 rejects anything else, so a new synonym cannot slip past V13/V19. Its groups will drive the Format filter. Part of #37. Co-Authored-By: Claude Opus 5.5 --- CONTRIBUTING.md | 2 +- site/checks.mjs | 20 ++++ site/checks.test.mjs | 17 ++- site/format-vocabulary.json | 208 ++++++++++++++++++++++++++++++++++++ site/validate.mjs | 4 + 5 files changed, 249 insertions(+), 2 deletions(-) create mode 100644 site/format-vocabulary.json diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 0cde822..485f611 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -43,7 +43,7 @@ To add a starter stack (one pick per need for a kind of game), follow [`stacks/R - `attribution_string`: the copy-paste credit line. Required when `attribution_required` is `true`; optional otherwise. - `publisher`: optional. Name the **rights-holding publisher**, never the host. Set it whenever that publisher has more than one catalog entry, so the entries group; setting it on a publisher that currently has only one entry is also fine and saves a backfill later. Do not set it to a generic host or distributor (GitHub, Hugging Face, itch.io, OpenGameArt, the Internet Archive, Google Fonts) or to a distributor that does not hold the rights. Distinguish sibling organisations that are genuinely different rights holders: `blender.md` (the application, Blender Foundation) carries no `publisher`, while the asset bundles under `studio.blender.org` carry `Blender Studio`. Kenney, Quaternius, KayKit, LuizMelo, 0x72, Blender Studio, Material Maker, Alif Type, GGBotNet and 3dmodelscc0 are the largest groups in use today; treat that as illustrative, not as the permitted set. - `subcategories`: lower-case kebab-case (`base-meshes`, `field-recordings`). Reuse a value already in the catalog before inventing one, and do not add a variant of an existing value that differs only in plural or spelling. Where both forms were in use, the more common one was kept (`characters`, `environment`, `interior`, `tileset`, `vectors`, `pixel`, `impulse-responses`, `base-meshes`). Retired spellings are listed in [`site/value-aliases.json`](site/value-aliases.json), which the validator enforces (V19); add a line there when you merge two values. -- `formats`: what you actually get, in one of four kinds. **File formats**, as commonly written: usually upper case (`PNG`, `FBX`, `JSON`, `VOX`), tool-specific ones as the tool writes them (`gdshader`, `tmx`, `ktx2`). **Engine or language targets**, as the product writes them (`glTF`, `Godot`, `Unity`, `Python`, `React`). **Delivery types** for software with no file format of its own, lower-case kebab-case (`godot-addon`, `blender-extension`, `npm`, `cli`, `library`, `desktop-app`, `mobile-app`, `middleware`, `model`). And `various` for an aggregator whose files come in too many formats to list. Platforms (`windows`, `macos`, `ios`) and descriptions (`heightfield`, `examples`) are `tags`, not formats. Reuse the spelling already in the catalog. +- `formats`: what you actually get, in one of four kinds. **File formats**, as commonly written: usually upper case (`PNG`, `FBX`, `JSON`, `VOX`), tool-specific ones as the tool writes them (`gdshader`, `tmx`, `ktx2`). **Engine or language targets**, as the product writes them (`glTF`, `Godot`, `Unity`, `Python`, `React`). **Delivery types** for software with no file format of its own, lower-case kebab-case (`godot-addon`, `blender-extension`, `npm`, `cli`, `library`, `desktop-app`, `mobile-app`, `middleware`, `model`). And `various` for an aggregator whose files come in too many formats to list. Platforms (`windows`, `macos`, `ios`) and descriptions (`heightfield`, `examples`) are `tags`, not formats. The allowed values are the closed list in [`site/format-vocabulary.json`](site/format-vocabulary.json), which the validator enforces (V20): reuse a listed spelling, and add a genuinely new format there in the same change that first uses it. Its `groups` drive the site's Format filter, so a new format that belongs to a group (another glTF or font container) goes into that group too. - Frontmatter is one `key: value` per line; lists are `[a, b]` or indented `- item` lines. A key given twice is an error. Entry files may not contain emoji. - `grid_dimensions` / `camera_perspective` / `hardware_tags`: optional metadata for 2D and UI entries. `3d` and `characters` entries leave `camera_perspective` out: it describes a 2D camera, and those entries have none. - `url`: an `https://` address (`http://` only where the source has no https). Other schemes are rejected. diff --git a/site/checks.mjs b/site/checks.mjs index f2a580e..0f36daf 100644 --- a/site/checks.mjs +++ b/site/checks.mjs @@ -345,6 +345,26 @@ export function checkValueAliases(rel, meta, aliases) { return errors; } +/* ----------------------------------------------------------------- V20 */ +/** + * `formats` is a closed list (site/format-vocabulary.json). V13 and V19 only + * catch spellings of a value already in use; a new synonym (`JPEG` beside + * `JPG`, `glTF KHR_draco` beside `glTF`) got in before either could see it, + * and the Format filter matches on exact values. + */ +export function checkFormatVocabulary(rel, meta, formatVocab) { + const errors = []; + const allowed = new Set(formatVocab.formats); + for (const v of Array.isArray(meta.formats) ? meta.formats.map(String) : []) { + if (!allowed.has(v)) { + errors.push( + `${rel} formats "${v}" is not in site/format-vocabulary.json (use a listed spelling, or add the new format there first)` + ); + } + } + return errors; +} + /* ----------------------------------------------------------------- V14 */ /** * `active` tells a reader the licence, the commercial stance and the credit diff --git a/site/checks.test.mjs b/site/checks.test.mjs index a7100e2..a1918e3 100644 --- a/site/checks.test.mjs +++ b/site/checks.test.mjs @@ -18,6 +18,7 @@ import { checkDeprecationReason, checkEntryUrl, checkEvidenceDates, + checkFormatVocabulary, evidenceDates, markdownAnchors, checkLicenseVocabulary, @@ -684,10 +685,24 @@ rejects("V19 rejects a licence as a subcategory", checkValueAliases("bad.md", { rejects("V19 rejects an internal review tag", checkValueAliases("bad.md", { tags: ["r04"] }, aliases), "internal review marker"); accepts("V19 lets a tag use a word retired only as a subcategory", checkValueAliases("ok.md", { tags: ["tiles", "public-domain"] }, aliases)); +/* V20: closed format list ---------------------------------------------- */ +const formatVocab = JSON.parse(fs.readFileSync(path.join(__dirname, "format-vocabulary.json"), "utf8")); +rejects("V20 rejects a format missing from the vocabulary", checkFormatVocabulary("bad.md", { formats: ["glTF KHR_draco"] }, formatVocab), 'formats "glTF KHR_draco" is not in site/format-vocabulary.json'); +rejects("V20 is case-sensitive", checkFormatVocabulary("bad.md", { formats: ["png"] }, formatVocab), 'formats "png"'); +accepts("V20 accepts listed formats", checkFormatVocabulary("ok.md", { formats: ["PNG", "glTF", "GLB"] }, formatVocab)); +accepts( + "V20 vocabulary lists every format a filter group names", + Object.values(formatVocab.groups).flatMap((g) => g.formats).filter((f) => !formatVocab.formats.includes(f)) +); +accepts( + "V20 vocabulary carries no retired spelling", + formatVocab.formats.filter((f) => Object.prototype.hasOwnProperty.call(aliases.formats, f)) +); + /* ----------------------------------------------------------------------- */ if (failures.length) { console.error(`checks.test failed (${failures.length}):`); for (const f of failures) console.error(` - ${f}`); process.exit(1); } -console.log(`checks.test ok: ${passed} assertions across 19 checks`); +console.log(`checks.test ok: ${passed} assertions across 20 checks`); diff --git a/site/format-vocabulary.json b/site/format-vocabulary.json new file mode 100644 index 0000000..7beffef --- /dev/null +++ b/site/format-vocabulary.json @@ -0,0 +1,208 @@ +{ + "_comment": "The closed list of `formats` values (checks.mjs V20). Add a new value here in the same change that first uses it; spell it as the format's own documentation does. `groups` drive the site's Format filter: an entry matches a group when any of its formats is listed there.", + "formats": [ + "3MF", + "AAX", + "ABC", + "AMC", + "ASCII", + "ASE", + "AU", + "AUP3", + "basis", + "BBMODEL", + "BIN", + "BIP", + "Blend", + "blender-extension", + "BVH", + "C++", + "C3D", + "cli", + "COG", + "CSV", + "DAE", + "DEM", + "desktop-app", + "DRC", + "DTED", + "E57", + "efk", + "EPS", + "espeak-ng-data", + "EXR", + "FBX", + "Figma", + "FLA", + "FLAC", + "gdextension", + "gdshader", + "GeoJSON", + "GeoTIFF", + "GIF", + "GLB", + "glTF", + "Godot", + "godot-addon", + "gpl-palette", + "HDR", + "HGT", + "HTML", + "JavaScript", + "JPG", + "JSON", + "KRA", + "ktx", + "ktx2", + "LAS", + "LAZ", + "ldtk", + "library", + "middleware", + "MIDI", + "mm", + "MMP", + "mobile-app", + "model", + "MP3", + "MP4", + "MPEG2", + "netCDF", + "npm", + "OBJ", + "OGG", + "OGV", + "ONNX", + "OSM", + "OTF", + "PAL", + "PBF", + "PDF", + "PLY", + "PNG", + "PSD", + "pxo", + "Python", + "R16", + "React", + "SBSAR", + "SFMdata", + "shapefile", + "Sketch", + "STL", + "SVG", + "TGA", + "TIFF", + "tmx", + "TTF", + "TXT", + "Unity", + "Unreal", + "USD", + "various", + "VDB", + "VOX", + "VRM", + "VST", + "Vue", + "WASM", + "WAV", + "WOFF", + "WOFF2", + "XCF", + "XML", + "YBN", + "YCD", + "YDD", + "YDR", + "YFT", + "YMAP", + "YTYP" + ], + "groups": { + "gltf": { + "label": "glTF / GLB", + "formats": [ + "glTF", + "GLB" + ] + }, + "fbx": { + "label": "FBX", + "formats": [ + "FBX" + ] + }, + "obj": { + "label": "OBJ", + "formats": [ + "OBJ" + ] + }, + "blend": { + "label": "Blend", + "formats": [ + "Blend" + ] + }, + "png": { + "label": "PNG", + "formats": [ + "PNG" + ] + }, + "svg": { + "label": "SVG", + "formats": [ + "SVG" + ] + }, + "hdr": { + "label": "EXR / HDR", + "formats": [ + "EXR", + "HDR" + ] + }, + "wav": { + "label": "WAV / FLAC", + "formats": [ + "WAV", + "FLAC" + ] + }, + "ogg": { + "label": "OGG / MP3", + "formats": [ + "OGG", + "MP3" + ] + }, + "font": { + "label": "TTF / OTF / WOFF", + "formats": [ + "TTF", + "OTF", + "WOFF", + "WOFF2" + ] + }, + "godot": { + "label": "Godot", + "formats": [ + "Godot", + "godot-addon", + "gdshader", + "gdextension" + ] + }, + "video": { + "label": "Video (MP4 / OGV)", + "formats": [ + "MP4", + "OGV", + "MPEG2" + ] + } + } +} diff --git a/site/validate.mjs b/site/validate.mjs index 67f739a..88428d9 100644 --- a/site/validate.mjs +++ b/site/validate.mjs @@ -14,6 +14,7 @@ import { checkDeprecationReason, checkEntryUrl, checkEvidenceDates, + checkFormatVocabulary, checkLicenseVocabulary, checkPublisherConsistency, checkSpdxConsistency, @@ -35,6 +36,7 @@ const CONFIG_PATH = path.join(__dirname, "config.json"); const SPDX_ALLOWED_PATH = path.join(__dirname, "spdx-allowed.json"); const VOCAB_PATH = path.join(__dirname, "license-vocabulary.json"); const ALIASES_PATH = path.join(__dirname, "value-aliases.json"); +const FORMATS_PATH = path.join(__dirname, "format-vocabulary.json"); const STACKS = path.join(ROOT, "stacks"); const REQUIRED = [ "id", @@ -235,6 +237,7 @@ function main() { ); const vocab = JSON.parse(fs.readFileSync(VOCAB_PATH, "utf8")); const aliases = JSON.parse(fs.readFileSync(ALIASES_PATH, "utf8")); + const formatVocab = JSON.parse(fs.readFileSync(FORMATS_PATH, "utf8")); const categories = catalogCategories(); const entryFiles = walkFiles(CATALOG, [], (f) => { const base = path.basename(f); @@ -299,6 +302,7 @@ function main() { errors.push(...checkDeprecationReason(rel, meta, body, vocab)); errors.push(...checkTaxonomyValues(rel, meta)); errors.push(...checkValueAliases(rel, meta, aliases)); + errors.push(...checkFormatVocabulary(rel, meta, formatVocab)); errors.push(...checkActiveIsSettled(rel, meta)); if (meta.id) { const id = String(meta.id); From af4754fd738c136415fd75088a36aca110463c54 Mon Sep 17 00:00:00 2001 From: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com> Date: Sat, 26 Sep 2026 15:57:58 -0400 Subject: [PATCH 02/10] catalog: tags no longer restate licence or publisher (V19, V21) Drops cc0/mit/ofl/open-source/royalty-free/no-attribution and similar licence tags, and tags equal to an entry's own publisher (kenney, quaternius, kaykit, blender-studio...), from 124 entries. value-aliases.json retires the licence tags (V19); new V21 rejects a tag equal to the entry's publisher. Search now weights the publisher like a tag. Closes the policy half of #36. Co-Authored-By: Claude Opus 5.5 --- CONTRIBUTING.md | 1 + catalog/2d/ansimuz-industrial-parallax.md | 2 +- catalog/2d/ansimuz-sunnyland.md | 2 +- catalog/2d/armm1998-zelda-like.md | 2 +- catalog/2d/bit-bonanza.md | 2 +- catalog/2d/bondoki-rotating-gems.md | 2 +- catalog/2d/bootstrap-icons.md | 2 +- catalog/2d/gameart2d-freebies.md | 2 +- catalog/2d/gustavo-saraiva-city-parallax.md | 2 +- catalog/2d/heroicons.md | 2 +- catalog/2d/kenney-1-bit-pack.md | 2 +- catalog/2d/kenney-boardgame-pack.md | 2 +- catalog/2d/kenney-cursor-pack.md | 2 +- catalog/2d/kenney-input-prompts.md | 2 +- catalog/2d/kenney-micro-roguelike.md | 2 +- catalog/2d/kenney-pixel-platformer.md | 2 +- catalog/2d/kenney-pixel-vehicle-pack.md | 2 +- catalog/2d/kenney-playing-cards-pack.md | 2 +- catalog/2d/kenney-puzzle-pack-2.md | 2 +- catalog/2d/kenney-roguelike-characters.md | 2 +- catalog/2d/kenney-roguelike-rpg-pack.md | 2 +- catalog/2d/kenney-tiny-battle.md | 2 +- catalog/2d/kenney-tiny-dungeon.md | 2 +- catalog/2d/kenney-tiny-town.md | 2 +- catalog/2d/kenney-ui-pack.md | 2 +- catalog/2d/lpc-revised-basics.md | 2 +- catalog/2d/luizmelo-evil-wizard.md | 2 +- catalog/2d/luizmelo-martial-hero.md | 2 +- .../2d/luizmelo-monsters-creatures-fantasy.md | 2 +- catalog/2d/material-symbols.md | 2 +- catalog/2d/ninja-adventure.md | 2 +- catalog/2d/openpeeps.md | 2 +- catalog/2d/ox72-dungeon-tileset.md | 2 +- catalog/2d/ox72-dungeontileset-ii.md | 2 +- catalog/2d/paleto-vol01.md | 2 +- catalog/2d/penzilla.md | 2 +- catalog/2d/playpug-simple-vector-ui.md | 2 +- catalog/2d/screaming-brain-studios.md | 2 +- catalog/2d/simple-icons.md | 2 +- catalog/2d/sparklin-superpowers.md | 2 +- catalog/2d/sylly-gem-match-3.md | 2 +- catalog/2d/tabler-icons.md | 2 +- catalog/2d/universal-lpc-generator.md | 2 +- catalog/2d/urizen-onebit.md | 2 +- catalog/3d/3dmodelscc0-city.md | 2 +- catalog/3d/3dmodelscc0-guns.md | 2 +- catalog/3d/3dmodelscc0-melee-weapons.md | 2 +- catalog/3d/blenderkit.md | 2 +- catalog/3d/cgbookcase.md | 2 +- catalog/3d/charge-materials.md | 2 +- catalog/3d/ggbotnet-psx-cars.md | 2 +- catalog/3d/kaykit-block-bits.md | 2 +- catalog/3d/kaykit-dungeon-pack.md | 2 +- catalog/3d/kaykit-furniture-bits.md | 2 +- catalog/3d/kaykit-halloween-bits.md | 2 +- catalog/3d/kaykit-holiday-bits.md | 2 +- catalog/3d/kaykit-platformer.md | 2 +- catalog/3d/kaykit-prototype-bits.md | 2 +- catalog/3d/kaykit-resource-bits.md | 2 +- catalog/3d/kaykit-restaurant-bits.md | 2 +- catalog/3d/kenney-car-kit.md | 2 +- catalog/3d/kenney-castle-kit.md | 2 +- catalog/3d/kenney-city-kit-commercial.md | 2 +- catalog/3d/kenney-city-kit-industrial.md | 2 +- catalog/3d/kenney-city-kit-roads.md | 2 +- catalog/3d/kenney-city-kit-suburban.md | 2 +- catalog/3d/kenney-factory-kit.md | 2 +- catalog/3d/kenney-fantasy-town-kit.md | 2 +- catalog/3d/kenney-food-kit.md | 2 +- catalog/3d/kenney-furniture-kit.md | 2 +- catalog/3d/kenney-graveyard-kit.md | 2 +- catalog/3d/kenney-mini-arena.md | 2 +- catalog/3d/kenney-mini-dungeon.md | 2 +- catalog/3d/kenney-mini-forest.md | 2 +- catalog/3d/kenney-mini-skate.md | 2 +- catalog/3d/kenney-modular-cave-kit.md | 2 +- catalog/3d/kenney-modular-dungeon-kit.md | 2 +- catalog/3d/kenney-modular-space-kit.md | 2 +- catalog/3d/kenney-nature-kit.md | 2 +- catalog/3d/kenney-pirate-kit.md | 2 +- catalog/3d/kenney-platformer-kit.md | 2 +- catalog/3d/kenney-racing-kit.md | 2 +- catalog/3d/kenney-retro-fantasy-kit.md | 2 +- catalog/3d/kenney-retro-urban-kit.md | 2 +- catalog/3d/kenney-tower-defense-kit.md | 2 +- catalog/3d/kenney-train-kit.md | 2 +- catalog/3d/kenney-watercraft-kit.md | 2 +- catalog/3d/magicavoxel.md | 2 +- catalog/3d/quaternius-cyberpunk-game-kit.md | 2 +- .../3d/quaternius-downtown-city-megakit.md | 2 +- .../3d/quaternius-fantasy-props-megakit.md | 2 +- .../3d/quaternius-medieval-village-megakit.md | 2 +- .../3d/quaternius-modular-sci-fi-megakit.md | 2 +- catalog/3d/quaternius-pirate-kit.md | 2 +- .../3d/quaternius-stylized-nature-megakit.md | 2 +- catalog/3d/quaternius-sushi-restaurant-kit.md | 2 +- catalog/3d/quaternius-ultimate-space-kit.md | 2 +- .../3d/quaternius-zombie-apocalypse-kit.md | 2 +- catalog/3d/scan-the-world.md | 2 +- catalog/3d/threedtextures-me.md | 2 +- catalog/animation/blender-ellie-poses.md | 2 +- .../animation/kaykit-character-animations.md | 2 +- catalog/animation/meta-animated-drawings.md | 2 +- catalog/animation/microsoft-movebox.md | 2 +- ...uaternius-universal-animation-library-2.md | 2 +- .../quaternius-universal-animation-library.md | 2 +- catalog/audio/adventure-kid-irs.md | 2 +- catalog/audio/bigsoundbank.md | 2 +- catalog/audio/ccmixter.md | 2 +- .../audio/congusbongus-footsteps-surfaces.md | 2 +- catalog/audio/fesliyan-footsteps.md | 2 +- catalog/audio/filmmusic-ende.md | 2 +- catalog/audio/free-music-archive.md | 2 +- catalog/audio/freepd.md | 2 +- catalog/audio/gboxmikefozzy-footsteps.md | 2 +- catalog/audio/incompetech.md | 2 +- catalog/audio/kenney-impact-sounds.md | 2 +- catalog/audio/kenney-interface-sounds.md | 2 +- catalog/audio/kenney-music-jingles.md | 2 +- catalog/audio/kenney-rpg-audio.md | 2 +- catalog/audio/kenney-sci-fi-sounds.md | 2 +- catalog/audio/kenney-ui-audio.md | 2 +- catalog/audio/mixkit-sfx.md | 2 +- catalog/audio/musopen.md | 2 +- catalog/audio/pixabay-audio.md | 2 +- catalog/audio/sonniss-gdc.md | 2 +- catalog/audio/subspaceaudio-5-chiptunes.md | 2 +- ...tallbeard-abstraction-music-loop-bundle.md | 2 +- catalog/audio/voxengo-impulses.md | 2 +- .../characters/barnabe-wild-lowpoly-rigged.md | 2 +- .../characters/blender-human-base-meshes.md | 2 +- .../blender-studio-critter-evolved.md | 2 +- catalog/characters/blender-studio-critter.md | 2 +- catalog/characters/blender-studio-one.md | 2 +- catalog/characters/blender-studio-rain.md | 2 +- .../blender-studio-space-creatures.md | 2 +- catalog/characters/charmorph.md | 2 +- catalog/characters/gdquest-3d-mannequin.md | 2 +- catalog/characters/kaykit-adventurers.md | 2 +- catalog/characters/kaykit-skeletons.md | 2 +- catalog/characters/oga-fps-arms-rigged.md | 2 +- catalog/characters/osa-100avatars.md | 2 +- .../quaternius-animated-fish-pack.md | 2 +- .../quaternius-animated-mech-pack.md | 2 +- .../characters/quaternius-cube-world-kit.md | 2 +- .../characters/quaternius-farm-animal-pack.md | 2 +- ...rnius-modular-character-outfits-fantasy.md | 2 +- .../quaternius-rpg-character-pack.md | 2 +- .../quaternius-sci-fi-essentials-kit.md | 2 +- .../quaternius-toon-shooter-game-kit.md | 2 +- .../quaternius-ultimate-monsters.md | 2 +- .../quaternius-universal-base-characters.md | 2 +- catalog/environment/copernicus-dem-glo30.md | 2 +- catalog/environment/jaxa-alos-aw3d30.md | 2 +- catalog/environment/open-hdri.md | 2 +- catalog/environment/openstreetmap.md | 2 +- catalog/fonts/amiri.md | 2 +- catalog/fonts/ark-pixel-font.md | 2 +- catalog/fonts/atkinson-hyperlegible.md | 2 +- catalog/fonts/dotgothic16.md | 2 +- catalog/fonts/fontsource.md | 2 +- catalog/fonts/ggbotnet-fonts-cc0.md | 2 +- catalog/fonts/ibm-plex-sans.md | 2 +- catalog/fonts/inter.md | 2 +- catalog/fonts/jetbrains-mono.md | 2 +- catalog/fonts/league-gothic.md | 2 +- catalog/fonts/noto-sans.md | 2 +- catalog/fonts/open-foundry.md | 2 +- catalog/fonts/orbitron.md | 2 +- catalog/fonts/pixelify-sans.md | 2 +- catalog/fonts/press-start-2p.md | 2 +- catalog/fonts/quanpixel.md | 2 +- catalog/fonts/reem-kufi.md | 2 +- catalog/fonts/silkscreen.md | 2 +- catalog/fonts/source-sans-3.md | 2 +- catalog/fonts/velvetyne.md | 2 +- catalog/fonts/vt323.md | 2 +- catalog/shaders-vfx/3dtexel-decals.md | 2 +- catalog/shaders-vfx/effekseer-samples.md | 2 +- catalog/shaders-vfx/gdquest-godot-shaders.md | 2 +- catalog/shaders-vfx/jangafx-free-vdb.md | 2 +- catalog/shaders-vfx/kenney-light-masks.md | 2 +- catalog/shaders-vfx/kenney-particle-pack.md | 2 +- catalog/shaders-vfx/kenney-smoke-particles.md | 2 +- .../shaders-vfx/unity-labs-vfx-flipbooks.md | 2 +- catalog/tools/assimp.md | 2 +- catalog/tools/audacity.md | 2 +- catalog/tools/blender.md | 2 +- catalog/tools/blockbench.md | 2 +- catalog/tools/cloudcompare.md | 2 +- catalog/tools/colmap.md | 2 +- catalog/tools/creature-2d-runtimes.md | 2 +- catalog/tools/daltonlens.md | 2 +- catalog/tools/espeak-ng.md | 2 +- catalog/tools/free-tex-packer.md | 2 +- catalog/tools/gimp.md | 2 +- catalog/tools/google-draco.md | 2 +- catalog/tools/goxel.md | 2 +- catalog/tools/inkscape.md | 2 +- catalog/tools/instant-meshes.md | 2 +- catalog/tools/krita.md | 2 +- catalog/tools/ldtk.md | 2 +- catalog/tools/libresprite.md | 2 +- catalog/tools/lmms.md | 2 +- catalog/tools/material-maker.md | 2 +- catalog/tools/materialize.md | 2 +- catalog/tools/melotts.md | 2 +- catalog/tools/meshlab.md | 2 +- catalog/tools/meshroom.md | 2 +- catalog/tools/pixelorama.md | 2 +- catalog/tools/quadriflow.md | 2 +- catalog/tools/sherpa-onnx.md | 2 +- catalog/tools/sim-daltonism.md | 2 +- catalog/tools/sollumz.md | 2 +- catalog/tools/tenacity.md | 2 +- catalog/tools/xnormal.md | 2 +- catalog/video/coverr.md | 2 +- catalog/video/mixkit-stock-video.md | 2 +- catalog/video/pexels-videos.md | 2 +- catalog/video/pixabay-videos.md | 2 +- site/checks.mjs | 23 +++++++++++++++++++ site/checks.test.mjs | 12 ++++++++-- site/public/app.js | 9 ++++---- site/validate.mjs | 2 ++ site/value-aliases.json | 23 +++++++++++++++++++ 225 files changed, 283 insertions(+), 225 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 485f611..7514df9 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -44,6 +44,7 @@ To add a starter stack (one pick per need for a kind of game), follow [`stacks/R - `publisher`: optional. Name the **rights-holding publisher**, never the host. Set it whenever that publisher has more than one catalog entry, so the entries group; setting it on a publisher that currently has only one entry is also fine and saves a backfill later. Do not set it to a generic host or distributor (GitHub, Hugging Face, itch.io, OpenGameArt, the Internet Archive, Google Fonts) or to a distributor that does not hold the rights. Distinguish sibling organisations that are genuinely different rights holders: `blender.md` (the application, Blender Foundation) carries no `publisher`, while the asset bundles under `studio.blender.org` carry `Blender Studio`. Kenney, Quaternius, KayKit, LuizMelo, 0x72, Blender Studio, Material Maker, Alif Type, GGBotNet and 3dmodelscc0 are the largest groups in use today; treat that as illustrative, not as the permitted set. - `subcategories`: lower-case kebab-case (`base-meshes`, `field-recordings`). Reuse a value already in the catalog before inventing one, and do not add a variant of an existing value that differs only in plural or spelling. Where both forms were in use, the more common one was kept (`characters`, `environment`, `interior`, `tileset`, `vectors`, `pixel`, `impulse-responses`, `base-meshes`). Retired spellings are listed in [`site/value-aliases.json`](site/value-aliases.json), which the validator enforces (V19); add a line there when you merge two values. - `formats`: what you actually get, in one of four kinds. **File formats**, as commonly written: usually upper case (`PNG`, `FBX`, `JSON`, `VOX`), tool-specific ones as the tool writes them (`gdshader`, `tmx`, `ktx2`). **Engine or language targets**, as the product writes them (`glTF`, `Godot`, `Unity`, `Python`, `React`). **Delivery types** for software with no file format of its own, lower-case kebab-case (`godot-addon`, `blender-extension`, `npm`, `cli`, `library`, `desktop-app`, `mobile-app`, `middleware`, `model`). And `various` for an aggregator whose files come in too many formats to list. Platforms (`windows`, `macos`, `ios`) and descriptions (`heightfield`, `examples`) are `tags`, not formats. The allowed values are the closed list in [`site/format-vocabulary.json`](site/format-vocabulary.json), which the validator enforces (V20): reuse a listed spelling, and add a genuinely new format there in the same change that first uses it. Its `groups` drive the site's Format filter, so a new format that belongs to a group (another glTF or font container) goes into that group too. +- `tags`: lower-case kebab-case words describing the content (`low-poly`, `modular`, `platformer`). Do not restate another field: the licence (`cc0`, `mit`, `ofl`, `open-source`, `royalty-free`), the credit requirement (`no-attribution`) or the entry's own `publisher` (`kenney`) are rejected (V19 via `site/value-aliases.json`, V21), because search and the filters read those fields directly and a copied tag drifts. A `varies` entry lists its licence mix in the body, not in tags. - Frontmatter is one `key: value` per line; lists are `[a, b]` or indented `- item` lines. A key given twice is an error. Entry files may not contain emoji. - `grid_dimensions` / `camera_perspective` / `hardware_tags`: optional metadata for 2D and UI entries. `3d` and `characters` entries leave `camera_perspective` out: it describes a 2D camera, and those entries have none. - `url`: an `https://` address (`http://` only where the source has no https). Other schemes are rejected. diff --git a/catalog/2d/ansimuz-industrial-parallax.md b/catalog/2d/ansimuz-industrial-parallax.md index e407e0c..4d868f4 100644 --- a/catalog/2d/ansimuz-industrial-parallax.md +++ b/catalog/2d/ansimuz-industrial-parallax.md @@ -10,7 +10,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [PNG, PSD] -tags: [cc0, parallax, background, layers, pixel, industrial, night, platformer, side-scroller] +tags: [parallax, background, layers, pixel, industrial, night, platformer, side-scroller] camera_perspective: side_scroller verified: 2026-09-23 status: active diff --git a/catalog/2d/ansimuz-sunnyland.md b/catalog/2d/ansimuz-sunnyland.md index bd0486b..7a97205 100644 --- a/catalog/2d/ansimuz-sunnyland.md +++ b/catalog/2d/ansimuz-sunnyland.md @@ -10,7 +10,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [PNG, WAV] -tags: [cc0, pixel, platformer, itch, 16-bit] +tags: [pixel, platformer, itch, 16-bit] camera_perspective: side_scroller verified: 2026-08-24 status: active diff --git a/catalog/2d/armm1998-zelda-like.md b/catalog/2d/armm1998-zelda-like.md index 3597e1d..44a3d7c 100644 --- a/catalog/2d/armm1998-zelda-like.md +++ b/catalog/2d/armm1998-zelda-like.md @@ -9,7 +9,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [PNG] -tags: [cc0, 16x16, overworld, cave, indoors, opengameart, 4-directional] +tags: [16x16, overworld, cave, indoors, opengameart, 4-directional] grid_dimensions: 16x16 camera_perspective: isometric_3_4 verified: 2026-09-22 diff --git a/catalog/2d/bit-bonanza.md b/catalog/2d/bit-bonanza.md index 3b0c3de..db57039 100644 --- a/catalog/2d/bit-bonanza.md +++ b/catalog/2d/bit-bonanza.md @@ -9,7 +9,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [PNG] -tags: [cc0, 1-bit, 10x10, rpg, icons, itch] +tags: [1-bit, 10x10, rpg, icons, itch] grid_dimensions: 10x10 camera_perspective: 2d_flat verified: 2026-08-15 diff --git a/catalog/2d/bondoki-rotating-gems.md b/catalog/2d/bondoki-rotating-gems.md index 257903c..d8e4769 100644 --- a/catalog/2d/bondoki-rotating-gems.md +++ b/catalog/2d/bondoki-rotating-gems.md @@ -9,7 +9,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [GIF, PNG] -tags: [cc0, match-3, gems, jewels, animated, puzzle, casual, mobile] +tags: [match-3, gems, jewels, animated, puzzle, casual, mobile] grid_dimensions: 52x52 verified: 2026-09-23 status: active diff --git a/catalog/2d/bootstrap-icons.md b/catalog/2d/bootstrap-icons.md index 352b77e..dd7d94c 100644 --- a/catalog/2d/bootstrap-icons.md +++ b/catalog/2d/bootstrap-icons.md @@ -9,7 +9,7 @@ license_spdx: MIT commercial: true attribution_required: false formats: [SVG, WOFF, WOFF2] -tags: [icons, mit, svg, ui, bootstrap] +tags: [icons, svg, ui, bootstrap] camera_perspective: 2d_flat verified: 2026-08-24 status: active diff --git a/catalog/2d/gameart2d-freebies.md b/catalog/2d/gameart2d-freebies.md index 1bd5f0c..009f9ce 100644 --- a/catalog/2d/gameart2d-freebies.md +++ b/catalog/2d/gameart2d-freebies.md @@ -9,7 +9,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [PNG] -tags: [cc0, platformer, gui, side-scroller] +tags: [platformer, gui, side-scroller] camera_perspective: side_scroller verified: 2026-08-29 status: active diff --git a/catalog/2d/gustavo-saraiva-city-parallax.md b/catalog/2d/gustavo-saraiva-city-parallax.md index b7bbf16..253a2e3 100644 --- a/catalog/2d/gustavo-saraiva-city-parallax.md +++ b/catalog/2d/gustavo-saraiva-city-parallax.md @@ -9,7 +9,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [PNG] -tags: [cc0, parallax, background, layers, pixel, city, platformer, side-scroller] +tags: [parallax, background, layers, pixel, city, platformer, side-scroller] camera_perspective: side_scroller verified: 2026-09-23 status: active diff --git a/catalog/2d/heroicons.md b/catalog/2d/heroicons.md index cfe4354..b373506 100644 --- a/catalog/2d/heroicons.md +++ b/catalog/2d/heroicons.md @@ -9,7 +9,7 @@ license_spdx: MIT commercial: true attribution_required: false formats: [SVG, React, Vue] -tags: [mit, icons, tailwind, ui] +tags: [icons, tailwind, ui] camera_perspective: 2d_flat verified: 2026-07-19 status: active diff --git a/catalog/2d/kenney-1-bit-pack.md b/catalog/2d/kenney-1-bit-pack.md index 4ae07be..7d014ff 100644 --- a/catalog/2d/kenney-1-bit-pack.md +++ b/catalog/2d/kenney-1-bit-pack.md @@ -10,7 +10,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [PNG] -tags: [cc0, 1-bit, roguelike, rpg, pixel, kenney, multi-perspective] +tags: [1-bit, roguelike, rpg, pixel, multi-perspective] grid_dimensions: 16x16 verified: 2026-07-19 status: active diff --git a/catalog/2d/kenney-boardgame-pack.md b/catalog/2d/kenney-boardgame-pack.md index 456e7ad..7bfe2ed 100644 --- a/catalog/2d/kenney-boardgame-pack.md +++ b/catalog/2d/kenney-boardgame-pack.md @@ -10,7 +10,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [PNG, SVG, XML, OGG] -tags: [cc0, board-game, cards, dice, chips, tokens, mobile] +tags: [board-game, cards, dice, chips, tokens, mobile] verified: 2026-09-23 status: active --- diff --git a/catalog/2d/kenney-cursor-pack.md b/catalog/2d/kenney-cursor-pack.md index 52de8fb..e7bff01 100644 --- a/catalog/2d/kenney-cursor-pack.md +++ b/catalog/2d/kenney-cursor-pack.md @@ -10,7 +10,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [PNG] -tags: [cc0, cursor, pointer, ui, kenney] +tags: [cursor, pointer, ui] camera_perspective: 2d_flat verified: 2026-07-19 status: active diff --git a/catalog/2d/kenney-input-prompts.md b/catalog/2d/kenney-input-prompts.md index fc0ff25..9f86603 100644 --- a/catalog/2d/kenney-input-prompts.md +++ b/catalog/2d/kenney-input-prompts.md @@ -10,7 +10,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [PNG, SVG] -tags: [cc0, gamepad, keyboard, hud, steam-deck, switch-2, quest] +tags: [gamepad, keyboard, hud, steam-deck, switch-2, quest] grid_dimensions: 64x64 camera_perspective: 2d_flat hardware_tags: [steam_deck, steam_controller, steam_frame, valve_index, switch, switch_2, xbox, playstation, meta_quest, playdate, wii, gamecube] diff --git a/catalog/2d/kenney-micro-roguelike.md b/catalog/2d/kenney-micro-roguelike.md index 5bf939b..ce04294 100644 --- a/catalog/2d/kenney-micro-roguelike.md +++ b/catalog/2d/kenney-micro-roguelike.md @@ -10,7 +10,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [PNG] -tags: [cc0, 1-bit, 8x8, roguelike, rpg, top-down] +tags: [1-bit, 8x8, roguelike, rpg, top-down] grid_dimensions: 8x8 camera_perspective: top_down verified: 2026-09-22 diff --git a/catalog/2d/kenney-pixel-platformer.md b/catalog/2d/kenney-pixel-platformer.md index 4118a9e..26c97ec 100644 --- a/catalog/2d/kenney-pixel-platformer.md +++ b/catalog/2d/kenney-pixel-platformer.md @@ -10,7 +10,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [PNG] -tags: [cc0, pixel, platformer, tiles, kenney] +tags: [pixel, platformer, tiles] grid_dimensions: 18x18 camera_perspective: side_scroller verified: 2026-07-19 diff --git a/catalog/2d/kenney-pixel-vehicle-pack.md b/catalog/2d/kenney-pixel-vehicle-pack.md index d64df21..2358ec9 100644 --- a/catalog/2d/kenney-pixel-vehicle-pack.md +++ b/catalog/2d/kenney-pixel-vehicle-pack.md @@ -10,7 +10,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [PNG] -tags: [cc0, vehicles, cars, pixel, kenney] +tags: [vehicles, cars, pixel] verified: 2026-07-19 status: active --- diff --git a/catalog/2d/kenney-playing-cards-pack.md b/catalog/2d/kenney-playing-cards-pack.md index e5fcdf3..d538c13 100644 --- a/catalog/2d/kenney-playing-cards-pack.md +++ b/catalog/2d/kenney-playing-cards-pack.md @@ -10,7 +10,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [PNG, CSV] -tags: [cc0, cards, playing-cards, solitaire, poker, pixel, board-game, mobile] +tags: [cards, playing-cards, solitaire, poker, pixel, board-game, mobile] verified: 2026-09-23 status: active --- diff --git a/catalog/2d/kenney-puzzle-pack-2.md b/catalog/2d/kenney-puzzle-pack-2.md index e1a0991..90b1009 100644 --- a/catalog/2d/kenney-puzzle-pack-2.md +++ b/catalog/2d/kenney-puzzle-pack-2.md @@ -10,7 +10,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [PNG, SVG, XML] -tags: [cc0, puzzle, casual, breakout, brick, pipes, coins, particles, mobile] +tags: [puzzle, casual, breakout, brick, pipes, coins, particles, mobile] verified: 2026-09-23 status: active --- diff --git a/catalog/2d/kenney-roguelike-characters.md b/catalog/2d/kenney-roguelike-characters.md index f5dded0..807dd64 100644 --- a/catalog/2d/kenney-roguelike-characters.md +++ b/catalog/2d/kenney-roguelike-characters.md @@ -10,7 +10,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [PNG] -tags: [cc0, rpg, characters, roguelike, overworld, front-facing] +tags: [rpg, characters, roguelike, overworld, front-facing] camera_perspective: isometric_3_4 verified: 2026-09-22 status: active diff --git a/catalog/2d/kenney-roguelike-rpg-pack.md b/catalog/2d/kenney-roguelike-rpg-pack.md index b1911d9..b2ade3c 100644 --- a/catalog/2d/kenney-roguelike-rpg-pack.md +++ b/catalog/2d/kenney-roguelike-rpg-pack.md @@ -10,7 +10,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [PNG] -tags: [cc0, 16x16, rpg, roguelike, ui, overworld] +tags: [16x16, rpg, roguelike, ui, overworld] grid_dimensions: 16x16 camera_perspective: isometric_3_4 verified: 2026-09-22 diff --git a/catalog/2d/kenney-tiny-battle.md b/catalog/2d/kenney-tiny-battle.md index 3239cf5..08a055c 100644 --- a/catalog/2d/kenney-tiny-battle.md +++ b/catalog/2d/kenney-tiny-battle.md @@ -10,7 +10,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [PNG] -tags: [cc0, 16x16, strategy, wargame, units, top-down] +tags: [16x16, strategy, wargame, units, top-down] grid_dimensions: 16x16 camera_perspective: top_down verified: 2026-09-22 diff --git a/catalog/2d/kenney-tiny-dungeon.md b/catalog/2d/kenney-tiny-dungeon.md index b4dbf37..7036e4b 100644 --- a/catalog/2d/kenney-tiny-dungeon.md +++ b/catalog/2d/kenney-tiny-dungeon.md @@ -10,7 +10,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [PNG] -tags: [cc0, dungeon, sewer, roguelike, pixel, kenney, tiny] +tags: [dungeon, sewer, roguelike, pixel, tiny] grid_dimensions: 16x16 camera_perspective: isometric_3_4 verified: 2026-07-19 diff --git a/catalog/2d/kenney-tiny-town.md b/catalog/2d/kenney-tiny-town.md index e721aa7..f27ec82 100644 --- a/catalog/2d/kenney-tiny-town.md +++ b/catalog/2d/kenney-tiny-town.md @@ -10,7 +10,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [PNG] -tags: [cc0, 16x16, town, overworld, rpg] +tags: [16x16, town, overworld, rpg] grid_dimensions: 16x16 camera_perspective: isometric_3_4 verified: 2026-09-22 diff --git a/catalog/2d/kenney-ui-pack.md b/catalog/2d/kenney-ui-pack.md index a0b6b1d..dd43c96 100644 --- a/catalog/2d/kenney-ui-pack.md +++ b/catalog/2d/kenney-ui-pack.md @@ -10,7 +10,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [PNG] -tags: [cc0, ui, button, panels, kenney] +tags: [ui, button, panels] camera_perspective: 2d_flat verified: 2026-07-19 status: active diff --git a/catalog/2d/lpc-revised-basics.md b/catalog/2d/lpc-revised-basics.md index 712350e..eb697f9 100644 --- a/catalog/2d/lpc-revised-basics.md +++ b/catalog/2d/lpc-revised-basics.md @@ -9,7 +9,7 @@ commercial: true attribution_required: true attribution_string: "LPC Revised Character Basics by Eliza Wyatt, Stephen Challener (Redshrike), Durrani, BenCreating, Johannes Sjölund (Wulax), Thecilekli and BlueCarrot16 (OGA-BY 3.0). See the Credits files for per-item authors." formats: [PNG] -tags: [lpc, opengameart, cc-by-sa, gpl, oga-by, copyleft-assets] +tags: [lpc, opengameart] camera_perspective: isometric_3_4 verified: 2026-09-24 status: active diff --git a/catalog/2d/luizmelo-evil-wizard.md b/catalog/2d/luizmelo-evil-wizard.md index f32da8a..9bbd83c 100644 --- a/catalog/2d/luizmelo-evil-wizard.md +++ b/catalog/2d/luizmelo-evil-wizard.md @@ -10,7 +10,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [PNG] -tags: [pixel, platformer, boss, cc0] +tags: [pixel, platformer, boss] camera_perspective: side_scroller verified: 2026-08-24 status: active diff --git a/catalog/2d/luizmelo-martial-hero.md b/catalog/2d/luizmelo-martial-hero.md index 151835d..3df8765 100644 --- a/catalog/2d/luizmelo-martial-hero.md +++ b/catalog/2d/luizmelo-martial-hero.md @@ -10,7 +10,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [PNG] -tags: [pixel, platformer, player, cc0] +tags: [pixel, platformer, player] camera_perspective: side_scroller verified: 2026-08-24 status: active diff --git a/catalog/2d/luizmelo-monsters-creatures-fantasy.md b/catalog/2d/luizmelo-monsters-creatures-fantasy.md index c261fbd..6a159bd 100644 --- a/catalog/2d/luizmelo-monsters-creatures-fantasy.md +++ b/catalog/2d/luizmelo-monsters-creatures-fantasy.md @@ -10,7 +10,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [PNG] -tags: [pixel, platformer, spritesheet, cc0] +tags: [pixel, platformer, spritesheet] camera_perspective: side_scroller verified: 2026-08-24 status: active diff --git a/catalog/2d/material-symbols.md b/catalog/2d/material-symbols.md index 2f5b524..05609ea 100644 --- a/catalog/2d/material-symbols.md +++ b/catalog/2d/material-symbols.md @@ -10,7 +10,7 @@ license_spdx: Apache-2.0 commercial: true attribution_required: false formats: [SVG, TTF, WOFF2] -tags: [icons, google, variable-font] +tags: [icons, variable-font] camera_perspective: 2d_flat verified: 2026-09-26 status: active diff --git a/catalog/2d/ninja-adventure.md b/catalog/2d/ninja-adventure.md index a1c3a41..7f423f9 100644 --- a/catalog/2d/ninja-adventure.md +++ b/catalog/2d/ninja-adventure.md @@ -9,7 +9,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [PNG, WAV] -tags: [cc0, 16x16, top-down, rpg, itch, godot, 4-directional] +tags: [16x16, top-down, rpg, itch, godot, 4-directional] grid_dimensions: 16x16 camera_perspective: isometric_3_4 verified: 2026-08-15 diff --git a/catalog/2d/openpeeps.md b/catalog/2d/openpeeps.md index c71437c..ff21f66 100644 --- a/catalog/2d/openpeeps.md +++ b/catalog/2d/openpeeps.md @@ -9,7 +9,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [SVG, PNG, Sketch, Figma] -tags: [cc0, illustration, characters, mix-match] +tags: [illustration, characters, mix-match] camera_perspective: 2d_flat verified: 2026-07-19 status: active diff --git a/catalog/2d/ox72-dungeon-tileset.md b/catalog/2d/ox72-dungeon-tileset.md index d88790a..6ca441b 100644 --- a/catalog/2d/ox72-dungeon-tileset.md +++ b/catalog/2d/ox72-dungeon-tileset.md @@ -10,7 +10,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [PNG] -tags: [cc0, dungeon, pixel, tileset, itch] +tags: [dungeon, pixel, tileset, itch] grid_dimensions: 16x16 camera_perspective: isometric_3_4 verified: 2026-07-19 diff --git a/catalog/2d/ox72-dungeontileset-ii.md b/catalog/2d/ox72-dungeontileset-ii.md index f63895c..b39632c 100644 --- a/catalog/2d/ox72-dungeontileset-ii.md +++ b/catalog/2d/ox72-dungeontileset-ii.md @@ -10,7 +10,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [PNG] -tags: [cc0, dungeon, pixel, tileset, itch, 16x16] +tags: [dungeon, pixel, tileset, itch, 16x16] grid_dimensions: 16x16 camera_perspective: isometric_3_4 verified: 2026-08-15 diff --git a/catalog/2d/paleto-vol01.md b/catalog/2d/paleto-vol01.md index bf06a77..010f793 100644 --- a/catalog/2d/paleto-vol01.md +++ b/catalog/2d/paleto-vol01.md @@ -9,7 +9,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [ASE, PNG, PDF, HTML] -tags: [cc0, palettes, pixel-art, fantasy, horror, ocean, retro] +tags: [palettes, pixel-art, fantasy, horror, ocean, retro] verified: 2026-07-20 status: active --- diff --git a/catalog/2d/penzilla.md b/catalog/2d/penzilla.md index c31836c..95aef70 100644 --- a/catalog/2d/penzilla.md +++ b/catalog/2d/penzilla.md @@ -8,7 +8,7 @@ license: custom commercial: true attribution_required: unknown formats: [PNG] -tags: [pixel, gui, itch, royalty-free] +tags: [pixel, gui, itch] verified: 2026-08-24 status: needs-review --- diff --git a/catalog/2d/playpug-simple-vector-ui.md b/catalog/2d/playpug-simple-vector-ui.md index a06dcf7..0dc879a 100644 --- a/catalog/2d/playpug-simple-vector-ui.md +++ b/catalog/2d/playpug-simple-vector-ui.md @@ -9,7 +9,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [PNG] -tags: [cc0, ui, 9-slice, vector] +tags: [ui, 9-slice, vector] camera_perspective: 2d_flat verified: 2026-08-29 status: active diff --git a/catalog/2d/screaming-brain-studios.md b/catalog/2d/screaming-brain-studios.md index e071cc5..ba61799 100644 --- a/catalog/2d/screaming-brain-studios.md +++ b/catalog/2d/screaming-brain-studios.md @@ -10,7 +10,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [PNG] -tags: [cc0, isometric, tiles, itch, 2-to-1] +tags: [isometric, tiles, itch, 2-to-1] camera_perspective: isometric_3_4 verified: 2026-08-29 status: active diff --git a/catalog/2d/simple-icons.md b/catalog/2d/simple-icons.md index 323ecc3..bfef53d 100644 --- a/catalog/2d/simple-icons.md +++ b/catalog/2d/simple-icons.md @@ -9,7 +9,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [SVG] -tags: [icons, brands, logos, cc0, svg] +tags: [icons, brands, logos, svg] camera_perspective: 2d_flat verified: 2026-07-19 status: active diff --git a/catalog/2d/sparklin-superpowers.md b/catalog/2d/sparklin-superpowers.md index 3b09325..b8e6ab2 100644 --- a/catalog/2d/sparklin-superpowers.md +++ b/catalog/2d/sparklin-superpowers.md @@ -10,7 +10,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [PNG] -tags: [cc0, pixel, itch, sparklin] +tags: [pixel, itch] verified: 2026-08-29 status: active --- diff --git a/catalog/2d/sylly-gem-match-3.md b/catalog/2d/sylly-gem-match-3.md index 99ca1d5..aa22687 100644 --- a/catalog/2d/sylly-gem-match-3.md +++ b/catalog/2d/sylly-gem-match-3.md @@ -9,7 +9,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [PNG, SVG] -tags: [cc0, match-3, gems, jewels, vector, puzzle, casual, mobile] +tags: [match-3, gems, jewels, vector, puzzle, casual, mobile] verified: 2026-09-23 status: active --- diff --git a/catalog/2d/tabler-icons.md b/catalog/2d/tabler-icons.md index a39a592..67073e1 100644 --- a/catalog/2d/tabler-icons.md +++ b/catalog/2d/tabler-icons.md @@ -9,7 +9,7 @@ license_spdx: MIT commercial: true attribution_required: false formats: [SVG, React, PNG] -tags: [mit, icons, outline, ui] +tags: [icons, outline, ui] camera_perspective: 2d_flat verified: 2026-07-19 status: active diff --git a/catalog/2d/universal-lpc-generator.md b/catalog/2d/universal-lpc-generator.md index 684f6d4..70101db 100644 --- a/catalog/2d/universal-lpc-generator.md +++ b/catalog/2d/universal-lpc-generator.md @@ -9,7 +9,7 @@ commercial: varies attribution_required: true attribution_string: "Credit all authors listed in the generator export (except CC0 layers)." formats: [PNG] -tags: [lpc, cc-by-sa, cc-by, oga-by, gpl, copyleft-assets] +tags: [lpc] verified: 2026-07-19 status: active --- diff --git a/catalog/2d/urizen-onebit.md b/catalog/2d/urizen-onebit.md index d12bb59..392c3a8 100644 --- a/catalog/2d/urizen-onebit.md +++ b/catalog/2d/urizen-onebit.md @@ -9,7 +9,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [PNG] -tags: [cc0, 1-bit, 12x12, tileset, itch] +tags: [1-bit, 12x12, tileset, itch] grid_dimensions: 12x12 camera_perspective: isometric_3_4 verified: 2026-08-15 diff --git a/catalog/3d/3dmodelscc0-city.md b/catalog/3d/3dmodelscc0-city.md index aa7119d..2c7b084 100644 --- a/catalog/3d/3dmodelscc0-city.md +++ b/catalog/3d/3dmodelscc0-city.md @@ -10,7 +10,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [GLB] -tags: [cc0, city, props] +tags: [city, props] verified: 2026-08-29 status: active --- diff --git a/catalog/3d/3dmodelscc0-guns.md b/catalog/3d/3dmodelscc0-guns.md index 35a7aeb..2873e49 100644 --- a/catalog/3d/3dmodelscc0-guns.md +++ b/catalog/3d/3dmodelscc0-guns.md @@ -10,7 +10,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [GLB] -tags: [cc0, weapons, firearms] +tags: [weapons, firearms] verified: 2026-08-29 status: active --- diff --git a/catalog/3d/3dmodelscc0-melee-weapons.md b/catalog/3d/3dmodelscc0-melee-weapons.md index cdc21c7..d9a26c4 100644 --- a/catalog/3d/3dmodelscc0-melee-weapons.md +++ b/catalog/3d/3dmodelscc0-melee-weapons.md @@ -10,7 +10,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [glTF, GLB] -tags: [cc0, weapons, melee] +tags: [weapons, melee] verified: 2026-08-29 status: active --- diff --git a/catalog/3d/blenderkit.md b/catalog/3d/blenderkit.md index ba0af20..a8a8d12 100644 --- a/catalog/3d/blenderkit.md +++ b/catalog/3d/blenderkit.md @@ -8,7 +8,7 @@ license: varies commercial: varies attribution_required: false formats: [Blend, glTF, HDR] -tags: [blender, marketplace, royalty-free] +tags: [blender, marketplace] verified: 2026-08-24 status: active --- diff --git a/catalog/3d/cgbookcase.md b/catalog/3d/cgbookcase.md index ebc7afa..5cf9e4a 100644 --- a/catalog/3d/cgbookcase.md +++ b/catalog/3d/cgbookcase.md @@ -9,7 +9,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [PNG] -tags: [pbr, seamless, photogrammetry, cc0, concrete, metal, brick] +tags: [pbr, seamless, photogrammetry, concrete, metal, brick] verified: 2026-08-24 status: active --- diff --git a/catalog/3d/charge-materials.md b/catalog/3d/charge-materials.md index a08b411..79eaff8 100644 --- a/catalog/3d/charge-materials.md +++ b/catalog/3d/charge-materials.md @@ -9,7 +9,7 @@ license: CC-BY commercial: unknown attribution_required: unknown formats: [Blend] -tags: [blender-studio, eevee, bake-out, license-unverified] +tags: [eevee, bake-out, license-unverified] verified: 2026-08-25 status: needs-review --- diff --git a/catalog/3d/ggbotnet-psx-cars.md b/catalog/3d/ggbotnet-psx-cars.md index 0343d65..5f91d05 100644 --- a/catalog/3d/ggbotnet-psx-cars.md +++ b/catalog/3d/ggbotnet-psx-cars.md @@ -10,7 +10,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [Blend, OBJ, PNG, OGG] -tags: [cc0, psx, cars, low-poly] +tags: [psx, cars, low-poly] verified: 2026-08-29 status: active --- diff --git a/catalog/3d/kaykit-block-bits.md b/catalog/3d/kaykit-block-bits.md index a137edc..04e3759 100644 --- a/catalog/3d/kaykit-block-bits.md +++ b/catalog/3d/kaykit-block-bits.md @@ -10,7 +10,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [OBJ, FBX, glTF] -tags: [cc0, blocks, prototype, kaykit] +tags: [blocks, prototype] verified: 2026-08-25 status: active --- diff --git a/catalog/3d/kaykit-dungeon-pack.md b/catalog/3d/kaykit-dungeon-pack.md index 6d43a32..dcc719e 100644 --- a/catalog/3d/kaykit-dungeon-pack.md +++ b/catalog/3d/kaykit-dungeon-pack.md @@ -10,7 +10,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [FBX, glTF, OBJ] -tags: [cc0, dungeon, modular, kaykit] +tags: [dungeon, modular] verified: 2026-08-25 status: active --- diff --git a/catalog/3d/kaykit-furniture-bits.md b/catalog/3d/kaykit-furniture-bits.md index a59d6a2..f666bf7 100644 --- a/catalog/3d/kaykit-furniture-bits.md +++ b/catalog/3d/kaykit-furniture-bits.md @@ -10,7 +10,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [OBJ, FBX, glTF] -tags: [cc0, furniture, stylized, kaykit] +tags: [furniture, stylized] verified: 2026-07-19 status: active --- diff --git a/catalog/3d/kaykit-halloween-bits.md b/catalog/3d/kaykit-halloween-bits.md index 968158f..55b5cb6 100644 --- a/catalog/3d/kaykit-halloween-bits.md +++ b/catalog/3d/kaykit-halloween-bits.md @@ -10,7 +10,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [OBJ, FBX, glTF] -tags: [cc0, halloween, cemetery, kaykit] +tags: [halloween, cemetery] verified: 2026-08-25 status: active --- diff --git a/catalog/3d/kaykit-holiday-bits.md b/catalog/3d/kaykit-holiday-bits.md index cc6ed55..b6056e5 100644 --- a/catalog/3d/kaykit-holiday-bits.md +++ b/catalog/3d/kaykit-holiday-bits.md @@ -10,7 +10,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [OBJ, FBX, glTF] -tags: [cc0, holiday, winter, kaykit] +tags: [holiday, winter] verified: 2026-08-25 status: active --- diff --git a/catalog/3d/kaykit-platformer.md b/catalog/3d/kaykit-platformer.md index dc7aed7..aafbfb1 100644 --- a/catalog/3d/kaykit-platformer.md +++ b/catalog/3d/kaykit-platformer.md @@ -10,7 +10,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [FBX, glTF, OBJ] -tags: [cc0, platformer, modular, kaykit] +tags: [platformer, modular] verified: 2026-08-25 status: active --- diff --git a/catalog/3d/kaykit-prototype-bits.md b/catalog/3d/kaykit-prototype-bits.md index f64abf7..23e5f98 100644 --- a/catalog/3d/kaykit-prototype-bits.md +++ b/catalog/3d/kaykit-prototype-bits.md @@ -10,7 +10,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [OBJ, FBX, glTF] -tags: [cc0, low-poly, atlas, prototype, kaykit] +tags: [low-poly, atlas, prototype] verified: 2026-08-15 status: active --- diff --git a/catalog/3d/kaykit-resource-bits.md b/catalog/3d/kaykit-resource-bits.md index cb80ebb..87f0117 100644 --- a/catalog/3d/kaykit-resource-bits.md +++ b/catalog/3d/kaykit-resource-bits.md @@ -10,7 +10,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [OBJ, FBX, glTF] -tags: [cc0, low-poly, atlas, crafting, kaykit] +tags: [low-poly, atlas, crafting] verified: 2026-08-15 status: active --- diff --git a/catalog/3d/kaykit-restaurant-bits.md b/catalog/3d/kaykit-restaurant-bits.md index c121a86..445a2d9 100644 --- a/catalog/3d/kaykit-restaurant-bits.md +++ b/catalog/3d/kaykit-restaurant-bits.md @@ -10,7 +10,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [OBJ, FBX, glTF] -tags: [cc0, restaurant, food, kaykit] +tags: [restaurant, food] verified: 2026-08-25 status: active --- diff --git a/catalog/3d/kenney-car-kit.md b/catalog/3d/kenney-car-kit.md index 6d0140b..91c32d6 100644 --- a/catalog/3d/kenney-car-kit.md +++ b/catalog/3d/kenney-car-kit.md @@ -10,7 +10,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [glTF, FBX, Blend] -tags: [cc0, cars, vehicles, kenney] +tags: [cars, vehicles] verified: 2026-07-19 status: active --- diff --git a/catalog/3d/kenney-castle-kit.md b/catalog/3d/kenney-castle-kit.md index edcdd0b..d073e0c 100644 --- a/catalog/3d/kenney-castle-kit.md +++ b/catalog/3d/kenney-castle-kit.md @@ -10,7 +10,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [glTF, FBX, Blend] -tags: [cc0, castle, medieval, kenney] +tags: [castle, medieval] verified: 2026-08-25 status: active --- diff --git a/catalog/3d/kenney-city-kit-commercial.md b/catalog/3d/kenney-city-kit-commercial.md index 5ff692a..05da7cf 100644 --- a/catalog/3d/kenney-city-kit-commercial.md +++ b/catalog/3d/kenney-city-kit-commercial.md @@ -10,7 +10,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [glTF, FBX, Blend] -tags: [cc0, city, buildings, kenney, modular] +tags: [city, buildings, modular] verified: 2026-08-25 status: active --- diff --git a/catalog/3d/kenney-city-kit-industrial.md b/catalog/3d/kenney-city-kit-industrial.md index 27f3b1d..c63981d 100644 --- a/catalog/3d/kenney-city-kit-industrial.md +++ b/catalog/3d/kenney-city-kit-industrial.md @@ -10,7 +10,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [glTF, FBX, Blend] -tags: [cc0, city, factory, kenney, modular] +tags: [city, factory, modular] verified: 2026-08-25 status: active --- diff --git a/catalog/3d/kenney-city-kit-roads.md b/catalog/3d/kenney-city-kit-roads.md index 9a9767b..c5749cf 100644 --- a/catalog/3d/kenney-city-kit-roads.md +++ b/catalog/3d/kenney-city-kit-roads.md @@ -10,7 +10,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [glTF, FBX, Blend] -tags: [cc0, city, roads, kenney, modular] +tags: [city, roads, modular] verified: 2026-08-25 status: active --- diff --git a/catalog/3d/kenney-city-kit-suburban.md b/catalog/3d/kenney-city-kit-suburban.md index 6d81f11..80e6fd3 100644 --- a/catalog/3d/kenney-city-kit-suburban.md +++ b/catalog/3d/kenney-city-kit-suburban.md @@ -10,7 +10,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [glTF, FBX, Blend] -tags: [cc0, city, suburban, kenney, modular] +tags: [city, suburban, modular] verified: 2026-08-25 status: active --- diff --git a/catalog/3d/kenney-factory-kit.md b/catalog/3d/kenney-factory-kit.md index fb7c3ff..1c480fd 100644 --- a/catalog/3d/kenney-factory-kit.md +++ b/catalog/3d/kenney-factory-kit.md @@ -10,7 +10,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [glTF, FBX, Blend] -tags: [cc0, factory, conveyor, kenney] +tags: [factory, conveyor] verified: 2026-08-25 status: active --- diff --git a/catalog/3d/kenney-fantasy-town-kit.md b/catalog/3d/kenney-fantasy-town-kit.md index e2ba281..34b9b12 100644 --- a/catalog/3d/kenney-fantasy-town-kit.md +++ b/catalog/3d/kenney-fantasy-town-kit.md @@ -10,7 +10,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [glTF, FBX, Blend] -tags: [cc0, medieval, town, kenney, modular] +tags: [medieval, town, modular] verified: 2026-08-25 status: active --- diff --git a/catalog/3d/kenney-food-kit.md b/catalog/3d/kenney-food-kit.md index 3f3fcaa..9139eea 100644 --- a/catalog/3d/kenney-food-kit.md +++ b/catalog/3d/kenney-food-kit.md @@ -10,7 +10,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [glTF, FBX, Blend] -tags: [cc0, food, kitchen, kenney] +tags: [food, kitchen] verified: 2026-08-25 status: active --- diff --git a/catalog/3d/kenney-furniture-kit.md b/catalog/3d/kenney-furniture-kit.md index 67200cb..67c7159 100644 --- a/catalog/3d/kenney-furniture-kit.md +++ b/catalog/3d/kenney-furniture-kit.md @@ -10,7 +10,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [glTF, FBX, Blend] -tags: [cc0, furniture, interior, kenney] +tags: [furniture, interior] verified: 2026-08-25 status: active --- diff --git a/catalog/3d/kenney-graveyard-kit.md b/catalog/3d/kenney-graveyard-kit.md index 15dda5a..c286f3e 100644 --- a/catalog/3d/kenney-graveyard-kit.md +++ b/catalog/3d/kenney-graveyard-kit.md @@ -10,7 +10,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [glTF, FBX, Blend] -tags: [cc0, graveyard, kenney] +tags: [graveyard] verified: 2026-08-25 status: active --- diff --git a/catalog/3d/kenney-mini-arena.md b/catalog/3d/kenney-mini-arena.md index 423a413..8cb3be4 100644 --- a/catalog/3d/kenney-mini-arena.md +++ b/catalog/3d/kenney-mini-arena.md @@ -10,7 +10,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [glTF, FBX, Blend] -tags: [cc0, arena, mini, kenney] +tags: [arena, mini] verified: 2026-08-25 status: active --- diff --git a/catalog/3d/kenney-mini-dungeon.md b/catalog/3d/kenney-mini-dungeon.md index 92af8b4..6d1ecaf 100644 --- a/catalog/3d/kenney-mini-dungeon.md +++ b/catalog/3d/kenney-mini-dungeon.md @@ -10,7 +10,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [glTF, FBX, Blend] -tags: [cc0, dungeon, mini, kenney] +tags: [dungeon, mini] verified: 2026-08-25 status: active --- diff --git a/catalog/3d/kenney-mini-forest.md b/catalog/3d/kenney-mini-forest.md index d5fd3b0..8384df4 100644 --- a/catalog/3d/kenney-mini-forest.md +++ b/catalog/3d/kenney-mini-forest.md @@ -10,7 +10,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [glTF, FBX, Blend] -tags: [cc0, forest, mini, kenney] +tags: [forest, mini] verified: 2026-08-25 status: active --- diff --git a/catalog/3d/kenney-mini-skate.md b/catalog/3d/kenney-mini-skate.md index abf0476..0d407f1 100644 --- a/catalog/3d/kenney-mini-skate.md +++ b/catalog/3d/kenney-mini-skate.md @@ -10,7 +10,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [glTF, FBX, Blend] -tags: [cc0, skate, park, kenney] +tags: [skate, park] verified: 2026-08-25 status: active --- diff --git a/catalog/3d/kenney-modular-cave-kit.md b/catalog/3d/kenney-modular-cave-kit.md index 15fa5d0..5bd1f9e 100644 --- a/catalog/3d/kenney-modular-cave-kit.md +++ b/catalog/3d/kenney-modular-cave-kit.md @@ -10,7 +10,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [glTF, FBX, Blend] -tags: [cc0, cave, modular, kenney] +tags: [cave, modular] verified: 2026-08-25 status: active --- diff --git a/catalog/3d/kenney-modular-dungeon-kit.md b/catalog/3d/kenney-modular-dungeon-kit.md index c5be5ad..ed32c11 100644 --- a/catalog/3d/kenney-modular-dungeon-kit.md +++ b/catalog/3d/kenney-modular-dungeon-kit.md @@ -10,7 +10,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [glTF, FBX, Blend] -tags: [cc0, dungeon, modular, kenney] +tags: [dungeon, modular] verified: 2026-08-25 status: active --- diff --git a/catalog/3d/kenney-modular-space-kit.md b/catalog/3d/kenney-modular-space-kit.md index eca3ec3..07a8589 100644 --- a/catalog/3d/kenney-modular-space-kit.md +++ b/catalog/3d/kenney-modular-space-kit.md @@ -10,7 +10,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [glTF, FBX, Blend] -tags: [cc0, sci-fi, modular, kenney] +tags: [sci-fi, modular] verified: 2026-08-25 status: active --- diff --git a/catalog/3d/kenney-nature-kit.md b/catalog/3d/kenney-nature-kit.md index a9cb024..8891657 100644 --- a/catalog/3d/kenney-nature-kit.md +++ b/catalog/3d/kenney-nature-kit.md @@ -10,7 +10,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [glTF, FBX, Blend] -tags: [cc0, trees, rocks, foliage, kenney] +tags: [trees, rocks, foliage] verified: 2026-07-19 status: active --- diff --git a/catalog/3d/kenney-pirate-kit.md b/catalog/3d/kenney-pirate-kit.md index 10060d5..1b79301 100644 --- a/catalog/3d/kenney-pirate-kit.md +++ b/catalog/3d/kenney-pirate-kit.md @@ -10,7 +10,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [glTF, FBX, Blend] -tags: [cc0, pirate, ships, kenney] +tags: [pirate, ships] verified: 2026-08-25 status: active --- diff --git a/catalog/3d/kenney-platformer-kit.md b/catalog/3d/kenney-platformer-kit.md index cc9ebd5..8c448dd 100644 --- a/catalog/3d/kenney-platformer-kit.md +++ b/catalog/3d/kenney-platformer-kit.md @@ -10,7 +10,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [glTF, FBX, Blend] -tags: [cc0, platformer, modular, kenney] +tags: [platformer, modular] verified: 2026-08-25 status: active --- diff --git a/catalog/3d/kenney-racing-kit.md b/catalog/3d/kenney-racing-kit.md index d3a1d62..b80d5e9 100644 --- a/catalog/3d/kenney-racing-kit.md +++ b/catalog/3d/kenney-racing-kit.md @@ -10,7 +10,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [glTF, FBX, Blend] -tags: [cc0, racing, vehicles, kenney] +tags: [racing, vehicles] verified: 2026-08-25 status: active --- diff --git a/catalog/3d/kenney-retro-fantasy-kit.md b/catalog/3d/kenney-retro-fantasy-kit.md index 8c4103a..18d3358 100644 --- a/catalog/3d/kenney-retro-fantasy-kit.md +++ b/catalog/3d/kenney-retro-fantasy-kit.md @@ -10,7 +10,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [glTF, FBX, Blend] -tags: [cc0, medieval, retro, kenney] +tags: [medieval, retro] verified: 2026-08-25 status: active --- diff --git a/catalog/3d/kenney-retro-urban-kit.md b/catalog/3d/kenney-retro-urban-kit.md index 6cf7011..b5853e6 100644 --- a/catalog/3d/kenney-retro-urban-kit.md +++ b/catalog/3d/kenney-retro-urban-kit.md @@ -10,7 +10,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [glTF, FBX, Blend] -tags: [cc0, urban, retro, kenney] +tags: [urban, retro] verified: 2026-08-25 status: active --- diff --git a/catalog/3d/kenney-tower-defense-kit.md b/catalog/3d/kenney-tower-defense-kit.md index 82d0cc3..1afb1ea 100644 --- a/catalog/3d/kenney-tower-defense-kit.md +++ b/catalog/3d/kenney-tower-defense-kit.md @@ -10,7 +10,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [glTF, FBX, Blend] -tags: [cc0, castle, defense, kenney] +tags: [castle, defense] verified: 2026-08-25 status: active --- diff --git a/catalog/3d/kenney-train-kit.md b/catalog/3d/kenney-train-kit.md index 5e1102a..4e15431 100644 --- a/catalog/3d/kenney-train-kit.md +++ b/catalog/3d/kenney-train-kit.md @@ -10,7 +10,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [glTF, FBX, Blend] -tags: [cc0, train, tram, kenney] +tags: [train, tram] verified: 2026-08-25 status: active --- diff --git a/catalog/3d/kenney-watercraft-kit.md b/catalog/3d/kenney-watercraft-kit.md index 306b471..70b09c9 100644 --- a/catalog/3d/kenney-watercraft-kit.md +++ b/catalog/3d/kenney-watercraft-kit.md @@ -10,7 +10,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [glTF, FBX, Blend] -tags: [cc0, boats, transport, kenney] +tags: [boats, transport] verified: 2026-08-25 status: active --- diff --git a/catalog/3d/magicavoxel.md b/catalog/3d/magicavoxel.md index 9ad652b..0a1eca7 100644 --- a/catalog/3d/magicavoxel.md +++ b/catalog/3d/magicavoxel.md @@ -8,7 +8,7 @@ license: custom commercial: true attribution_required: false formats: [VOX, OBJ] -tags: [voxel, freeware] +tags: [voxel] verified: 2026-08-25 status: active --- diff --git a/catalog/3d/quaternius-cyberpunk-game-kit.md b/catalog/3d/quaternius-cyberpunk-game-kit.md index 4708340..be92266 100644 --- a/catalog/3d/quaternius-cyberpunk-game-kit.md +++ b/catalog/3d/quaternius-cyberpunk-game-kit.md @@ -10,7 +10,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [FBX, OBJ, Blend, glTF] -tags: [cc0, cyberpunk, sci-fi, quaternius] +tags: [cyberpunk, sci-fi] verified: 2026-08-25 status: active --- diff --git a/catalog/3d/quaternius-downtown-city-megakit.md b/catalog/3d/quaternius-downtown-city-megakit.md index da58cdd..46a387e 100644 --- a/catalog/3d/quaternius-downtown-city-megakit.md +++ b/catalog/3d/quaternius-downtown-city-megakit.md @@ -10,7 +10,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [FBX, OBJ, glTF, Blend] -tags: [cc0, city, modular, quaternius] +tags: [city, modular] verified: 2026-08-25 status: active --- diff --git a/catalog/3d/quaternius-fantasy-props-megakit.md b/catalog/3d/quaternius-fantasy-props-megakit.md index 9a8d7cb..b21a25e 100644 --- a/catalog/3d/quaternius-fantasy-props-megakit.md +++ b/catalog/3d/quaternius-fantasy-props-megakit.md @@ -10,7 +10,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [FBX, glTF, Blend, OBJ] -tags: [cc0, medieval, furniture, props, quaternius] +tags: [medieval, furniture, props] verified: 2026-07-19 status: active --- diff --git a/catalog/3d/quaternius-medieval-village-megakit.md b/catalog/3d/quaternius-medieval-village-megakit.md index a99977c..8bf5ff8 100644 --- a/catalog/3d/quaternius-medieval-village-megakit.md +++ b/catalog/3d/quaternius-medieval-village-megakit.md @@ -10,7 +10,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [FBX, OBJ, Blend, glTF] -tags: [cc0, medieval, modular, quaternius] +tags: [medieval, modular] verified: 2026-08-25 status: active --- diff --git a/catalog/3d/quaternius-modular-sci-fi-megakit.md b/catalog/3d/quaternius-modular-sci-fi-megakit.md index b354015..306e151 100644 --- a/catalog/3d/quaternius-modular-sci-fi-megakit.md +++ b/catalog/3d/quaternius-modular-sci-fi-megakit.md @@ -10,7 +10,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [FBX, OBJ, Blend, glTF] -tags: [cc0, sci-fi, modular, quaternius] +tags: [sci-fi, modular] verified: 2026-08-25 status: active --- diff --git a/catalog/3d/quaternius-pirate-kit.md b/catalog/3d/quaternius-pirate-kit.md index fad3e30..971b117 100644 --- a/catalog/3d/quaternius-pirate-kit.md +++ b/catalog/3d/quaternius-pirate-kit.md @@ -10,7 +10,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [FBX, OBJ, Blend, glTF] -tags: [cc0, pirate, characters, quaternius] +tags: [pirate, characters] verified: 2026-08-25 status: active --- diff --git a/catalog/3d/quaternius-stylized-nature-megakit.md b/catalog/3d/quaternius-stylized-nature-megakit.md index b386aab..3fb6015 100644 --- a/catalog/3d/quaternius-stylized-nature-megakit.md +++ b/catalog/3d/quaternius-stylized-nature-megakit.md @@ -10,7 +10,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [FBX, glTF, Blend, OBJ] -tags: [cc0, ghibli-ish, trees, plants, quaternius] +tags: [ghibli-ish, trees, plants] verified: 2026-07-19 status: active --- diff --git a/catalog/3d/quaternius-sushi-restaurant-kit.md b/catalog/3d/quaternius-sushi-restaurant-kit.md index e8b4135..802685c 100644 --- a/catalog/3d/quaternius-sushi-restaurant-kit.md +++ b/catalog/3d/quaternius-sushi-restaurant-kit.md @@ -10,7 +10,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [FBX, OBJ, Blend, glTF] -tags: [cc0, restaurant, food, quaternius] +tags: [restaurant, food] verified: 2026-08-25 status: active --- diff --git a/catalog/3d/quaternius-ultimate-space-kit.md b/catalog/3d/quaternius-ultimate-space-kit.md index b29a4d2..1579780 100644 --- a/catalog/3d/quaternius-ultimate-space-kit.md +++ b/catalog/3d/quaternius-ultimate-space-kit.md @@ -10,7 +10,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [FBX, OBJ, Blend, glTF] -tags: [cc0, sci-fi, space, quaternius] +tags: [sci-fi, space] verified: 2026-08-25 status: active --- diff --git a/catalog/3d/quaternius-zombie-apocalypse-kit.md b/catalog/3d/quaternius-zombie-apocalypse-kit.md index 6db6687..5cfb211 100644 --- a/catalog/3d/quaternius-zombie-apocalypse-kit.md +++ b/catalog/3d/quaternius-zombie-apocalypse-kit.md @@ -10,7 +10,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [FBX, OBJ, Blend, glTF] -tags: [cc0, zombie, vehicles, quaternius] +tags: [zombie, vehicles] verified: 2026-08-25 status: active --- diff --git a/catalog/3d/scan-the-world.md b/catalog/3d/scan-the-world.md index 713a91c..2822238 100644 --- a/catalog/3d/scan-the-world.md +++ b/catalog/3d/scan-the-world.md @@ -8,7 +8,7 @@ license: unknown commercial: false attribution_required: unknown formats: [STL, OBJ] -tags: [photogrammetry, museum, print, aggregator, non-commercial] +tags: [photogrammetry, museum, print, aggregator] verified: 2026-09-23 status: needs-review --- diff --git a/catalog/3d/threedtextures-me.md b/catalog/3d/threedtextures-me.md index e1254ef..7e79533 100644 --- a/catalog/3d/threedtextures-me.md +++ b/catalog/3d/threedtextures-me.md @@ -9,7 +9,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [PNG, SBSAR] -tags: [pbr, seamless, cc0, concrete, metal, brick] +tags: [pbr, seamless, concrete, metal, brick] verified: 2026-08-24 status: active --- diff --git a/catalog/animation/blender-ellie-poses.md b/catalog/animation/blender-ellie-poses.md index b71b312..430da53 100644 --- a/catalog/animation/blender-ellie-poses.md +++ b/catalog/animation/blender-ellie-poses.md @@ -10,7 +10,7 @@ commercial: true attribution_required: true attribution_string: "Ellie Pose Library (c) Blender Studio. CC-BY. Suggested format; card does not specify wording." formats: [Blend] -tags: [blender-studio, poses] +tags: [poses] verified: 2026-08-24 status: active --- diff --git a/catalog/animation/kaykit-character-animations.md b/catalog/animation/kaykit-character-animations.md index c5f7aee..3e077e9 100644 --- a/catalog/animation/kaykit-character-animations.md +++ b/catalog/animation/kaykit-character-animations.md @@ -10,7 +10,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [FBX, glTF] -tags: [low-poly, cc0, characters] +tags: [low-poly, characters] verified: 2026-08-24 status: active --- diff --git a/catalog/animation/meta-animated-drawings.md b/catalog/animation/meta-animated-drawings.md index bd973fa..d625ae5 100644 --- a/catalog/animation/meta-animated-drawings.md +++ b/catalog/animation/meta-animated-drawings.md @@ -9,7 +9,7 @@ license_spdx: MIT commercial: true attribution_required: false formats: [Python] -tags: [mit, 2d, research, archived, fair] +tags: [2d, research, archived, fair] verified: 2026-07-19 status: active --- diff --git a/catalog/animation/microsoft-movebox.md b/catalog/animation/microsoft-movebox.md index bfe6d7d..122357d 100644 --- a/catalog/animation/microsoft-movebox.md +++ b/catalog/animation/microsoft-movebox.md @@ -10,7 +10,7 @@ license_spdx: MIT commercial: true attribution_required: false formats: [Unity] -tags: [mit, kinect, azure-kinect, rocketbox, archived] +tags: [kinect, azure-kinect, rocketbox, archived] verified: 2026-07-19 status: active --- diff --git a/catalog/animation/quaternius-universal-animation-library-2.md b/catalog/animation/quaternius-universal-animation-library-2.md index 002ef7c..f433d76 100644 --- a/catalog/animation/quaternius-universal-animation-library-2.md +++ b/catalog/animation/quaternius-universal-animation-library-2.md @@ -10,7 +10,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [FBX, glTF, GLB, Blend] -tags: [cc0, retarget, combat, parkour, zombie] +tags: [retarget, combat, parkour, zombie] verified: 2026-07-19 status: active --- diff --git a/catalog/animation/quaternius-universal-animation-library.md b/catalog/animation/quaternius-universal-animation-library.md index 057b227..bb3e7d0 100644 --- a/catalog/animation/quaternius-universal-animation-library.md +++ b/catalog/animation/quaternius-universal-animation-library.md @@ -10,7 +10,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [FBX, glTF, GLB, Blend] -tags: [cc0, retarget, godot, unity, unreal, locomotion] +tags: [retarget, godot, unity, unreal, locomotion] verified: 2026-07-19 status: active --- diff --git a/catalog/audio/adventure-kid-irs.md b/catalog/audio/adventure-kid-irs.md index e06bca1..c5f8b4c 100644 --- a/catalog/audio/adventure-kid-irs.md +++ b/catalog/audio/adventure-kid-irs.md @@ -10,7 +10,7 @@ commercial: true attribution_required: true attribution_string: "Reverb IRs (c) Adventure Kid (CC BY 4.0)" formats: [WAV] -tags: [impulse-response, reverb, cc-by, springs] +tags: [impulse-response, reverb, springs] verified: 2026-08-29 status: active --- diff --git a/catalog/audio/bigsoundbank.md b/catalog/audio/bigsoundbank.md index 8cb1369..aff4dea 100644 --- a/catalog/audio/bigsoundbank.md +++ b/catalog/audio/bigsoundbank.md @@ -9,7 +9,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [WAV, MP3] -tags: [cc0, field-recording, royalty-free, footsteps-capable] +tags: [field-recording, footsteps-capable] verified: 2026-08-24 status: active --- diff --git a/catalog/audio/ccmixter.md b/catalog/audio/ccmixter.md index 5e8143d..6f37363 100644 --- a/catalog/audio/ccmixter.md +++ b/catalog/audio/ccmixter.md @@ -9,7 +9,7 @@ commercial: unknown attribution_required: true attribution_string: "Music \"{title}\" by {artist} Available at ccMixter.org {url} Under {CC license} {license-url}" formats: [MP3, WAV] -tags: [aggregator, creative-commons, remix, youtube-first] +tags: [aggregator, remix, youtube-first] verified: 2026-08-24 status: needs-review --- diff --git a/catalog/audio/congusbongus-footsteps-surfaces.md b/catalog/audio/congusbongus-footsteps-surfaces.md index af9b039..03b3134 100644 --- a/catalog/audio/congusbongus-footsteps-surfaces.md +++ b/catalog/audio/congusbongus-footsteps-surfaces.md @@ -10,7 +10,7 @@ commercial: true attribution_required: true attribution_string: "Footsteps by congusbongus (CC BY 3.0), derived from sounds by swuing, EminYILDIRIM, sabotovat, Eelke, ceberation and Lee Barkovich (CC BY 3.0), and Ali_6868 and blukotek (CC0)" formats: [OGG] -tags: [footsteps, multi-surface, foley, cc-by] +tags: [footsteps, multi-surface, foley] verified: 2026-09-24 status: active --- diff --git a/catalog/audio/fesliyan-footsteps.md b/catalog/audio/fesliyan-footsteps.md index a4f977e..ae94049 100644 --- a/catalog/audio/fesliyan-footsteps.md +++ b/catalog/audio/fesliyan-footsteps.md @@ -8,7 +8,7 @@ license: custom commercial: true attribution_required: false formats: [MP3] -tags: [footsteps, royalty-free, freemium] +tags: [footsteps, freemium] verified: 2026-08-24 status: active --- diff --git a/catalog/audio/filmmusic-ende.md b/catalog/audio/filmmusic-ende.md index b8cff5e..cd23bf2 100644 --- a/catalog/audio/filmmusic-ende.md +++ b/catalog/audio/filmmusic-ende.md @@ -9,7 +9,7 @@ license_spdx: CC-BY-4.0 commercial: true attribution_required: false formats: [MP3, WAV] -tags: [music, cc-by, no-nd, games-ok] +tags: [music, no-nd, games-ok] verified: 2026-08-24 status: active --- diff --git a/catalog/audio/free-music-archive.md b/catalog/audio/free-music-archive.md index 9a15b46..c6d5bce 100644 --- a/catalog/audio/free-music-archive.md +++ b/catalog/audio/free-music-archive.md @@ -9,7 +9,7 @@ commercial: unknown attribution_required: true attribution_string: "Credit the track artist and the CC license named on that FMA track page." formats: [MP3] -tags: [aggregator, creative-commons, tribe-of-noise] +tags: [aggregator, tribe-of-noise] verified: 2026-08-24 status: needs-review --- diff --git a/catalog/audio/freepd.md b/catalog/audio/freepd.md index c879ecd..f90c8d3 100644 --- a/catalog/audio/freepd.md +++ b/catalog/audio/freepd.md @@ -8,7 +8,7 @@ license: unknown commercial: unknown attribution_required: false formats: [MP3] -tags: [music, public-domain, offline] +tags: [music, offline] verified: 2026-08-24 status: deprecated --- diff --git a/catalog/audio/gboxmikefozzy-footsteps.md b/catalog/audio/gboxmikefozzy-footsteps.md index 05f206f..b3f507e 100644 --- a/catalog/audio/gboxmikefozzy-footsteps.md +++ b/catalog/audio/gboxmikefozzy-footsteps.md @@ -9,7 +9,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [OGG] -tags: [footsteps, subway, field-recording, cc0] +tags: [footsteps, subway, field-recording] verified: 2026-08-24 status: active --- diff --git a/catalog/audio/incompetech.md b/catalog/audio/incompetech.md index 1623e95..2090ac8 100644 --- a/catalog/audio/incompetech.md +++ b/catalog/audio/incompetech.md @@ -10,7 +10,7 @@ commercial: true attribution_required: true attribution_string: "Title Kevin MacLeod (incompetech.com) Licensed under Creative Commons: By Attribution 4.0 https://creativecommons.org/licenses/by/4.0/" formats: [MP3, WAV] -tags: [music, loops, attribution] +tags: [music, loops] verified: 2026-08-24 status: active --- diff --git a/catalog/audio/kenney-impact-sounds.md b/catalog/audio/kenney-impact-sounds.md index 920f2e3..139b09e 100644 --- a/catalog/audio/kenney-impact-sounds.md +++ b/catalog/audio/kenney-impact-sounds.md @@ -10,7 +10,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [OGG, WAV] -tags: [cc0, impact, foley, kenney] +tags: [impact, foley] verified: 2026-07-19 status: active --- diff --git a/catalog/audio/kenney-interface-sounds.md b/catalog/audio/kenney-interface-sounds.md index ace539d..31e1de8 100644 --- a/catalog/audio/kenney-interface-sounds.md +++ b/catalog/audio/kenney-interface-sounds.md @@ -10,7 +10,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [OGG, WAV] -tags: [ui, interface, click, cc0] +tags: [ui, interface, click] verified: 2026-08-24 status: active --- diff --git a/catalog/audio/kenney-music-jingles.md b/catalog/audio/kenney-music-jingles.md index a489a26..84d4be6 100644 --- a/catalog/audio/kenney-music-jingles.md +++ b/catalog/audio/kenney-music-jingles.md @@ -10,7 +10,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [OGG] -tags: [cc0, music, stinger, jingle, ui] +tags: [music, stinger, jingle, ui] verified: 2026-08-24 status: active --- diff --git a/catalog/audio/kenney-rpg-audio.md b/catalog/audio/kenney-rpg-audio.md index 8222445..56ecc1c 100644 --- a/catalog/audio/kenney-rpg-audio.md +++ b/catalog/audio/kenney-rpg-audio.md @@ -10,7 +10,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [OGG, WAV] -tags: [cc0, footsteps, rpg, weapons, kenney] +tags: [footsteps, rpg, weapons] verified: 2026-07-19 status: active --- diff --git a/catalog/audio/kenney-sci-fi-sounds.md b/catalog/audio/kenney-sci-fi-sounds.md index 21d90c2..6a0284d 100644 --- a/catalog/audio/kenney-sci-fi-sounds.md +++ b/catalog/audio/kenney-sci-fi-sounds.md @@ -10,7 +10,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [OGG, WAV] -tags: [sci-fi, space, engine, cc0] +tags: [sci-fi, space, engine] verified: 2026-08-24 status: active --- diff --git a/catalog/audio/kenney-ui-audio.md b/catalog/audio/kenney-ui-audio.md index 254b642..2309620 100644 --- a/catalog/audio/kenney-ui-audio.md +++ b/catalog/audio/kenney-ui-audio.md @@ -10,7 +10,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [OGG, WAV] -tags: [ui, click, button, cc0] +tags: [ui, click, button] verified: 2026-08-24 status: active --- diff --git a/catalog/audio/mixkit-sfx.md b/catalog/audio/mixkit-sfx.md index 2a62e26..9878249 100644 --- a/catalog/audio/mixkit-sfx.md +++ b/catalog/audio/mixkit-sfx.md @@ -9,7 +9,7 @@ license: custom commercial: true attribution_required: false formats: [WAV, MP3] -tags: [sfx, royalty-free, envato, no-signup] +tags: [sfx, no-signup] verified: 2026-09-23 status: active --- diff --git a/catalog/audio/musopen.md b/catalog/audio/musopen.md index ebf97a2..b706ba5 100644 --- a/catalog/audio/musopen.md +++ b/catalog/audio/musopen.md @@ -8,7 +8,7 @@ license: varies commercial: varies attribution_required: unknown formats: [MP3] -tags: [music, public-domain, recordings, classical, per-file-license] +tags: [music, recordings, classical, per-file-license] verified: 2026-09-23 status: needs-review --- diff --git a/catalog/audio/pixabay-audio.md b/catalog/audio/pixabay-audio.md index b13162b..f03c75a 100644 --- a/catalog/audio/pixabay-audio.md +++ b/catalog/audio/pixabay-audio.md @@ -9,7 +9,7 @@ license: custom commercial: true attribution_required: false formats: [MP3, WAV] -tags: [royalty-free, curated, no-attribution] +tags: [curated] verified: 2026-09-23 status: active --- diff --git a/catalog/audio/sonniss-gdc.md b/catalog/audio/sonniss-gdc.md index f89011d..2bc9489 100644 --- a/catalog/audio/sonniss-gdc.md +++ b/catalog/audio/sonniss-gdc.md @@ -8,7 +8,7 @@ license: custom commercial: true attribution_required: false formats: [WAV] -tags: [professional, large, royalty-free] +tags: [professional, large] verified: 2026-08-24 status: active --- diff --git a/catalog/audio/subspaceaudio-5-chiptunes.md b/catalog/audio/subspaceaudio-5-chiptunes.md index e2531ec..cc83956 100644 --- a/catalog/audio/subspaceaudio-5-chiptunes.md +++ b/catalog/audio/subspaceaudio-5-chiptunes.md @@ -9,7 +9,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [WAV] -tags: [cc0, chiptune, 8-bit, retro, music, looping, platformer] +tags: [chiptune, 8-bit, retro, music, looping, platformer] verified: 2026-09-23 status: active --- diff --git a/catalog/audio/tallbeard-abstraction-music-loop-bundle.md b/catalog/audio/tallbeard-abstraction-music-loop-bundle.md index 29ca7db..4a095c9 100644 --- a/catalog/audio/tallbeard-abstraction-music-loop-bundle.md +++ b/catalog/audio/tallbeard-abstraction-music-loop-bundle.md @@ -9,7 +9,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [MP3, OGG] -tags: [cc0, loops, music, itch, games-ok] +tags: [loops, music, itch, games-ok] verified: 2026-08-29 status: active --- diff --git a/catalog/audio/voxengo-impulses.md b/catalog/audio/voxengo-impulses.md index 944f084..71eba98 100644 --- a/catalog/audio/voxengo-impulses.md +++ b/catalog/audio/voxengo-impulses.md @@ -8,7 +8,7 @@ license: custom commercial: true attribution_required: false formats: [WAV] -tags: [impulse-response, reverb, convolution, free] +tags: [impulse-response, reverb, convolution] verified: 2026-07-19 status: active --- diff --git a/catalog/characters/barnabe-wild-lowpoly-rigged.md b/catalog/characters/barnabe-wild-lowpoly-rigged.md index c551494..f7fabc2 100644 --- a/catalog/characters/barnabe-wild-lowpoly-rigged.md +++ b/catalog/characters/barnabe-wild-lowpoly-rigged.md @@ -9,7 +9,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [Blend, FBX] -tags: [low-poly, psx, cc0, itch] +tags: [low-poly, psx, itch] verified: 2026-08-24 status: active --- diff --git a/catalog/characters/blender-human-base-meshes.md b/catalog/characters/blender-human-base-meshes.md index d895b89..65946e6 100644 --- a/catalog/characters/blender-human-base-meshes.md +++ b/catalog/characters/blender-human-base-meshes.md @@ -10,7 +10,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [Blend, glTF, FBX] -tags: [blender-studio, topology] +tags: [topology] verified: 2026-08-24 status: active --- diff --git a/catalog/characters/blender-studio-critter-evolved.md b/catalog/characters/blender-studio-critter-evolved.md index a8fe378..b234024 100644 --- a/catalog/characters/blender-studio-critter-evolved.md +++ b/catalog/characters/blender-studio-critter-evolved.md @@ -11,7 +11,7 @@ commercial: true attribution_required: true attribution_string: "Critter Evolved (c) Blender Studio (CC BY 4.0)" formats: [Blend] -tags: [blender-studio, creature, rig] +tags: [creature, rig] verified: 2026-08-29 status: active --- diff --git a/catalog/characters/blender-studio-critter.md b/catalog/characters/blender-studio-critter.md index abf56ce..ce1b72a 100644 --- a/catalog/characters/blender-studio-critter.md +++ b/catalog/characters/blender-studio-critter.md @@ -11,7 +11,7 @@ commercial: true attribution_required: true attribution_string: "Critter (c) Blender Studio (CC BY 4.0)" formats: [Blend] -tags: [blender-studio, creature, rig] +tags: [creature, rig] verified: 2026-08-29 status: active --- diff --git a/catalog/characters/blender-studio-one.md b/catalog/characters/blender-studio-one.md index 890820a..3db24c5 100644 --- a/catalog/characters/blender-studio-one.md +++ b/catalog/characters/blender-studio-one.md @@ -11,7 +11,7 @@ commercial: true attribution_required: true attribution_string: "One (c) Blender Studio (CC BY 4.0)" formats: [Blend] -tags: [blender-studio, humanoid, rig] +tags: [humanoid, rig] verified: 2026-08-29 status: active --- diff --git a/catalog/characters/blender-studio-rain.md b/catalog/characters/blender-studio-rain.md index d34703d..0f18d9b 100644 --- a/catalog/characters/blender-studio-rain.md +++ b/catalog/characters/blender-studio-rain.md @@ -11,7 +11,7 @@ commercial: true attribution_required: true attribution_string: "Rain (c) Blender Studio (CC BY 4.0)" formats: [Blend] -tags: [blender-studio, humanoid, rig] +tags: [humanoid, rig] verified: 2026-08-29 status: active --- diff --git a/catalog/characters/blender-studio-space-creatures.md b/catalog/characters/blender-studio-space-creatures.md index 8eec4cd..9a07727 100644 --- a/catalog/characters/blender-studio-space-creatures.md +++ b/catalog/characters/blender-studio-space-creatures.md @@ -11,7 +11,7 @@ commercial: true attribution_required: true attribution_string: "Space Creatures (c) Blender Studio (CC BY 4.0)" formats: [Blend] -tags: [blender-studio, creature, rig] +tags: [creature, rig] verified: 2026-08-29 status: active --- diff --git a/catalog/characters/charmorph.md b/catalog/characters/charmorph.md index eb4ad3e..895debd 100644 --- a/catalog/characters/charmorph.md +++ b/catalog/characters/charmorph.md @@ -8,7 +8,7 @@ license: varies commercial: unknown attribution_required: unknown formats: [Blend, glTF, FBX] -tags: [blender, humanoid, agpl-assets, mb-lab-derived] +tags: [blender, humanoid, mb-lab-derived] verified: 2026-07-19 status: needs-review --- diff --git a/catalog/characters/gdquest-3d-mannequin.md b/catalog/characters/gdquest-3d-mannequin.md index 75432af..041abeb 100644 --- a/catalog/characters/gdquest-3d-mannequin.md +++ b/catalog/characters/gdquest-3d-mannequin.md @@ -11,7 +11,7 @@ commercial: true attribution_required: true attribution_string: "GDQuest and contributors (https://www.gdquest.com/)" formats: [glTF, Godot] -tags: [godot, mannequin, controller, cc-by] +tags: [godot, mannequin, controller] verified: 2026-08-24 status: active --- diff --git a/catalog/characters/kaykit-adventurers.md b/catalog/characters/kaykit-adventurers.md index e353f0d..11a07fd 100644 --- a/catalog/characters/kaykit-adventurers.md +++ b/catalog/characters/kaykit-adventurers.md @@ -10,7 +10,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [FBX, glTF] -tags: [cc0, low-poly, stylized, adventurers, kaykit] +tags: [low-poly, stylized, adventurers] verified: 2026-07-19 status: active --- diff --git a/catalog/characters/kaykit-skeletons.md b/catalog/characters/kaykit-skeletons.md index 081b873..65b6118 100644 --- a/catalog/characters/kaykit-skeletons.md +++ b/catalog/characters/kaykit-skeletons.md @@ -10,7 +10,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [FBX, glTF] -tags: [cc0, low-poly, skeletons, enemies, kaykit] +tags: [low-poly, skeletons, enemies] verified: 2026-08-25 status: active --- diff --git a/catalog/characters/oga-fps-arms-rigged.md b/catalog/characters/oga-fps-arms-rigged.md index 02b4c4a..5b81b06 100644 --- a/catalog/characters/oga-fps-arms-rigged.md +++ b/catalog/characters/oga-fps-arms-rigged.md @@ -9,7 +9,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [FBX, Blend] -tags: [cc0, first-person, fps, arms, ik, fingers, opengameart] +tags: [first-person, fps, arms, ik, fingers, opengameart] verified: 2026-09-23 status: active --- diff --git a/catalog/characters/osa-100avatars.md b/catalog/characters/osa-100avatars.md index 8c496cb..813216a 100644 --- a/catalog/characters/osa-100avatars.md +++ b/catalog/characters/osa-100avatars.md @@ -9,7 +9,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [VRM] -tags: [vrm, cc0, web, metaverse] +tags: [vrm, web, metaverse] verified: 2026-08-25 status: active --- diff --git a/catalog/characters/quaternius-animated-fish-pack.md b/catalog/characters/quaternius-animated-fish-pack.md index 760977d..367b0f8 100644 --- a/catalog/characters/quaternius-animated-fish-pack.md +++ b/catalog/characters/quaternius-animated-fish-pack.md @@ -10,7 +10,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [FBX, OBJ, Blend] -tags: [cc0, fish, aquatic, animated, quaternius] +tags: [fish, aquatic, animated] verified: 2026-08-25 status: active --- diff --git a/catalog/characters/quaternius-animated-mech-pack.md b/catalog/characters/quaternius-animated-mech-pack.md index 6744eb8..8344da9 100644 --- a/catalog/characters/quaternius-animated-mech-pack.md +++ b/catalog/characters/quaternius-animated-mech-pack.md @@ -10,7 +10,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [FBX, OBJ, Blend, glTF] -tags: [cc0, mech, sci-fi, animated, quaternius] +tags: [mech, sci-fi, animated] verified: 2026-08-25 status: active --- diff --git a/catalog/characters/quaternius-cube-world-kit.md b/catalog/characters/quaternius-cube-world-kit.md index 2e65110..91cb44d 100644 --- a/catalog/characters/quaternius-cube-world-kit.md +++ b/catalog/characters/quaternius-cube-world-kit.md @@ -10,7 +10,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [FBX, OBJ, Blend, glTF] -tags: [cc0, voxel, cube, characters, animals, quaternius] +tags: [voxel, cube, characters, animals] verified: 2026-08-25 status: active --- diff --git a/catalog/characters/quaternius-farm-animal-pack.md b/catalog/characters/quaternius-farm-animal-pack.md index 2a16ad5..bcefb6f 100644 --- a/catalog/characters/quaternius-farm-animal-pack.md +++ b/catalog/characters/quaternius-farm-animal-pack.md @@ -10,7 +10,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [FBX, OBJ, Blend] -tags: [cc0, animals, quadruped, animated, quaternius] +tags: [animals, quadruped, animated] verified: 2026-08-25 status: active --- diff --git a/catalog/characters/quaternius-modular-character-outfits-fantasy.md b/catalog/characters/quaternius-modular-character-outfits-fantasy.md index 83b5b05..7cee030 100644 --- a/catalog/characters/quaternius-modular-character-outfits-fantasy.md +++ b/catalog/characters/quaternius-modular-character-outfits-fantasy.md @@ -10,7 +10,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [FBX, glTF, Blend, OBJ] -tags: [cc0, modular, fantasy, outfits, quaternius] +tags: [modular, fantasy, outfits] verified: 2026-07-19 status: active --- diff --git a/catalog/characters/quaternius-rpg-character-pack.md b/catalog/characters/quaternius-rpg-character-pack.md index 6a3a095..1e4deb3 100644 --- a/catalog/characters/quaternius-rpg-character-pack.md +++ b/catalog/characters/quaternius-rpg-character-pack.md @@ -10,7 +10,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [FBX, OBJ, Blend, glTF] -tags: [cc0, fantasy, rpg, animated, quaternius] +tags: [fantasy, rpg, animated] verified: 2026-08-25 status: active --- diff --git a/catalog/characters/quaternius-sci-fi-essentials-kit.md b/catalog/characters/quaternius-sci-fi-essentials-kit.md index 4d5e5f9..8ef5430 100644 --- a/catalog/characters/quaternius-sci-fi-essentials-kit.md +++ b/catalog/characters/quaternius-sci-fi-essentials-kit.md @@ -10,7 +10,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [FBX, OBJ, Blend, glTF] -tags: [cc0, sci-fi, robots, enemies, guns, quaternius] +tags: [sci-fi, robots, enemies, guns] verified: 2026-08-25 status: active --- diff --git a/catalog/characters/quaternius-toon-shooter-game-kit.md b/catalog/characters/quaternius-toon-shooter-game-kit.md index ab63411..4a48a39 100644 --- a/catalog/characters/quaternius-toon-shooter-game-kit.md +++ b/catalog/characters/quaternius-toon-shooter-game-kit.md @@ -10,7 +10,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [FBX, OBJ, Blend, glTF] -tags: [cc0, shooter, toon, characters, enemies, quaternius] +tags: [shooter, toon, characters, enemies] verified: 2026-08-25 status: active --- diff --git a/catalog/characters/quaternius-ultimate-monsters.md b/catalog/characters/quaternius-ultimate-monsters.md index 6a63dae..1911174 100644 --- a/catalog/characters/quaternius-ultimate-monsters.md +++ b/catalog/characters/quaternius-ultimate-monsters.md @@ -10,7 +10,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [FBX, Blend, OBJ, glTF] -tags: [cc0, monsters, animated, enemies, quaternius] +tags: [monsters, animated, enemies] verified: 2026-07-19 status: active --- diff --git a/catalog/characters/quaternius-universal-base-characters.md b/catalog/characters/quaternius-universal-base-characters.md index 5282f68..cb85750 100644 --- a/catalog/characters/quaternius-universal-base-characters.md +++ b/catalog/characters/quaternius-universal-base-characters.md @@ -10,7 +10,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [FBX, glTF, Blend, OBJ] -tags: [cc0, humanoid, retarget, hairstyles, quaternius] +tags: [humanoid, retarget, hairstyles] verified: 2026-07-19 status: active --- diff --git a/catalog/environment/copernicus-dem-glo30.md b/catalog/environment/copernicus-dem-glo30.md index 060fecf..d10d6e9 100644 --- a/catalog/environment/copernicus-dem-glo30.md +++ b/catalog/environment/copernicus-dem-glo30.md @@ -9,7 +9,7 @@ commercial: true attribution_required: true attribution_string: "© DLR e.V. 2010-2014 and © Airbus Defence and Space GmbH 2014-2018 provided under COPERNICUS by the European Union and ESA; all rights reserved." formats: [GeoTIFF, COG, DTED] -tags: [terrain, government, attribution, tandem-x] +tags: [terrain, government, tandem-x] verified: 2026-08-25 status: active --- diff --git a/catalog/environment/jaxa-alos-aw3d30.md b/catalog/environment/jaxa-alos-aw3d30.md index b1f6e60..24e83e7 100644 --- a/catalog/environment/jaxa-alos-aw3d30.md +++ b/catalog/environment/jaxa-alos-aw3d30.md @@ -9,7 +9,7 @@ commercial: true attribution_required: true attribution_string: "Credit: AW3D30 (JAXA)" formats: [GeoTIFF] -tags: [terrain, government, attribution] +tags: [terrain, government] verified: 2026-07-19 status: active --- diff --git a/catalog/environment/open-hdri.md b/catalog/environment/open-hdri.md index 895fae2..be4790a 100644 --- a/catalog/environment/open-hdri.md +++ b/catalog/environment/open-hdri.md @@ -9,7 +9,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [EXR] -tags: [hdri, cc0, unclipped, 32-bit] +tags: [hdri, unclipped, 32-bit] verified: 2026-08-29 status: active --- diff --git a/catalog/environment/openstreetmap.md b/catalog/environment/openstreetmap.md index 3f76f05..768da5c 100644 --- a/catalog/environment/openstreetmap.md +++ b/catalog/environment/openstreetmap.md @@ -10,7 +10,7 @@ commercial: true attribution_required: true attribution_string: "© OpenStreetMap contributors" formats: [OSM, PBF] -tags: [odbl, produced-work, geo] +tags: [produced-work, geo] verified: 2026-07-19 status: active --- diff --git a/catalog/fonts/amiri.md b/catalog/fonts/amiri.md index 2c84229..c3b65e6 100644 --- a/catalog/fonts/amiri.md +++ b/catalog/fonts/amiri.md @@ -10,7 +10,7 @@ license_spdx: OFL-1.1 commercial: true attribution_required: false formats: [TTF, OTF] -tags: [arabic, ofl, naskh] +tags: [arabic, naskh] verified: 2026-08-29 status: active --- diff --git a/catalog/fonts/ark-pixel-font.md b/catalog/fonts/ark-pixel-font.md index d212f5a..3e66d08 100644 --- a/catalog/fonts/ark-pixel-font.md +++ b/catalog/fonts/ark-pixel-font.md @@ -9,7 +9,7 @@ license_spdx: OFL-1.1 commercial: true attribution_required: false formats: [OTF, TTF] -tags: [pixel, cjk, ofl, pan-cjk] +tags: [pixel, cjk, pan-cjk] verified: 2026-08-29 status: active --- diff --git a/catalog/fonts/atkinson-hyperlegible.md b/catalog/fonts/atkinson-hyperlegible.md index 218dd4a..0448ff4 100644 --- a/catalog/fonts/atkinson-hyperlegible.md +++ b/catalog/fonts/atkinson-hyperlegible.md @@ -9,7 +9,7 @@ license_spdx: OFL-1.1 commercial: true attribution_required: false formats: [OTF, TTF] -tags: [a11y, low-vision, ui, ofl] +tags: [a11y, low-vision, ui] verified: 2026-08-24 status: active --- diff --git a/catalog/fonts/dotgothic16.md b/catalog/fonts/dotgothic16.md index 6098550..86a2fa9 100644 --- a/catalog/fonts/dotgothic16.md +++ b/catalog/fonts/dotgothic16.md @@ -9,7 +9,7 @@ license_spdx: OFL-1.1 commercial: true attribution_required: false formats: [TTF] -tags: [pixel, japanese, gothic, ofl] +tags: [pixel, japanese, gothic] verified: 2026-08-15 status: active --- diff --git a/catalog/fonts/fontsource.md b/catalog/fonts/fontsource.md index d8217c1..64c0b5a 100644 --- a/catalog/fonts/fontsource.md +++ b/catalog/fonts/fontsource.md @@ -8,7 +8,7 @@ license: varies commercial: varies attribution_required: true formats: [TTF, WOFF, WOFF2, npm] -tags: [ofl, npm, self-host, aggregator] +tags: [npm, self-host, aggregator] attribution_string: "See the OFL.txt / LICENSE in the @fontsource/ package you installed" verified: 2026-08-24 status: active diff --git a/catalog/fonts/ggbotnet-fonts-cc0.md b/catalog/fonts/ggbotnet-fonts-cc0.md index 7704d5d..bc8ad80 100644 --- a/catalog/fonts/ggbotnet-fonts-cc0.md +++ b/catalog/fonts/ggbotnet-fonts-cc0.md @@ -10,7 +10,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [TTF, OTF, WOFF, WOFF2] -tags: [cc0, pixel, fonts, retro] +tags: [pixel, fonts, retro] verified: 2026-08-29 status: active --- diff --git a/catalog/fonts/ibm-plex-sans.md b/catalog/fonts/ibm-plex-sans.md index b238684..c66b05a 100644 --- a/catalog/fonts/ibm-plex-sans.md +++ b/catalog/fonts/ibm-plex-sans.md @@ -9,7 +9,7 @@ license_spdx: OFL-1.1 commercial: true attribution_required: false formats: [OTF, TTF, WOFF2] -tags: [ui, sans, ofl, plex] +tags: [ui, sans, plex] verified: 2026-08-24 status: active --- diff --git a/catalog/fonts/inter.md b/catalog/fonts/inter.md index 5824369..47b5e46 100644 --- a/catalog/fonts/inter.md +++ b/catalog/fonts/inter.md @@ -9,7 +9,7 @@ license_spdx: OFL-1.1 commercial: true attribution_required: false formats: [OTF, TTF] -tags: [ui, sans, ofl, variable-font] +tags: [ui, sans, variable-font] verified: 2026-07-19 status: active --- diff --git a/catalog/fonts/jetbrains-mono.md b/catalog/fonts/jetbrains-mono.md index ccd0154..cadf7b8 100644 --- a/catalog/fonts/jetbrains-mono.md +++ b/catalog/fonts/jetbrains-mono.md @@ -9,7 +9,7 @@ license_spdx: OFL-1.1 commercial: true attribution_required: false formats: [TTF, WOFF2] -tags: [mono, code, ui, ofl, variable-font] +tags: [mono, code, ui, variable-font] verified: 2026-07-19 status: active --- diff --git a/catalog/fonts/league-gothic.md b/catalog/fonts/league-gothic.md index 676c719..f20beb8 100644 --- a/catalog/fonts/league-gothic.md +++ b/catalog/fonts/league-gothic.md @@ -10,7 +10,7 @@ license_spdx: OFL-1.1 commercial: true attribution_required: false formats: [OTF, TTF] -tags: [display, ofl, condensed, gothic] +tags: [display, condensed, gothic] verified: 2026-08-29 status: active --- diff --git a/catalog/fonts/noto-sans.md b/catalog/fonts/noto-sans.md index 9f1a28e..9673170 100644 --- a/catalog/fonts/noto-sans.md +++ b/catalog/fonts/noto-sans.md @@ -9,7 +9,7 @@ license_spdx: OFL-1.1 commercial: true attribution_required: false formats: [OTF, TTF] -tags: [localization, cjk, ofl, variable-font] +tags: [localization, cjk, variable-font] verified: 2026-07-19 status: active --- diff --git a/catalog/fonts/open-foundry.md b/catalog/fonts/open-foundry.md index d56a2a0..717b514 100644 --- a/catalog/fonts/open-foundry.md +++ b/catalog/fonts/open-foundry.md @@ -8,7 +8,7 @@ license: varies commercial: varies attribution_required: true formats: [OTF, TTF] -tags: [ofl, aggregator, display-only] +tags: [aggregator, display-only] attribution_string: "See the licence on the typeface's own GitHub or foundry page" verified: 2026-08-24 status: active diff --git a/catalog/fonts/orbitron.md b/catalog/fonts/orbitron.md index b17c02b..fc27c17 100644 --- a/catalog/fonts/orbitron.md +++ b/catalog/fonts/orbitron.md @@ -10,7 +10,7 @@ license_spdx: OFL-1.1 commercial: true attribution_required: false formats: [OTF, TTF] -tags: [sci-fi, geometric, display, ofl] +tags: [sci-fi, geometric, display] verified: 2026-08-24 status: active --- diff --git a/catalog/fonts/pixelify-sans.md b/catalog/fonts/pixelify-sans.md index 9b5a9e1..ab1a5bb 100644 --- a/catalog/fonts/pixelify-sans.md +++ b/catalog/fonts/pixelify-sans.md @@ -9,7 +9,7 @@ license_spdx: OFL-1.1 commercial: true attribution_required: false formats: [TTF] -tags: [pixel, modern, ui, ofl] +tags: [pixel, modern, ui] verified: 2026-08-24 status: active --- diff --git a/catalog/fonts/press-start-2p.md b/catalog/fonts/press-start-2p.md index 3fab1af..1ba2101 100644 --- a/catalog/fonts/press-start-2p.md +++ b/catalog/fonts/press-start-2p.md @@ -9,7 +9,7 @@ license_spdx: OFL-1.1 commercial: true attribution_required: false formats: [TTF] -tags: [pixel, retro, arcade, ofl] +tags: [pixel, retro, arcade] verified: 2026-07-19 status: active --- diff --git a/catalog/fonts/quanpixel.md b/catalog/fonts/quanpixel.md index ca00b67..76358c7 100644 --- a/catalog/fonts/quanpixel.md +++ b/catalog/fonts/quanpixel.md @@ -9,7 +9,7 @@ license_spdx: OFL-1.1 commercial: true attribution_required: false formats: [TTF] -tags: [pixel, cjk, ofl, 8x8] +tags: [pixel, cjk, 8x8] verified: 2026-08-29 status: active --- diff --git a/catalog/fonts/reem-kufi.md b/catalog/fonts/reem-kufi.md index 5dc0a5d..1b11c35 100644 --- a/catalog/fonts/reem-kufi.md +++ b/catalog/fonts/reem-kufi.md @@ -10,7 +10,7 @@ license_spdx: OFL-1.1 commercial: true attribution_required: false formats: [TTF, OTF] -tags: [arabic, ofl, kufi, headline] +tags: [arabic, kufi, headline] verified: 2026-08-29 status: active --- diff --git a/catalog/fonts/silkscreen.md b/catalog/fonts/silkscreen.md index 0148744..9bc6d09 100644 --- a/catalog/fonts/silkscreen.md +++ b/catalog/fonts/silkscreen.md @@ -9,7 +9,7 @@ license_spdx: OFL-1.1 commercial: true attribution_required: false formats: [TTF] -tags: [pixel, display, ofl] +tags: [pixel, display] verified: 2026-07-19 status: active --- diff --git a/catalog/fonts/source-sans-3.md b/catalog/fonts/source-sans-3.md index f81db92..c5652a5 100644 --- a/catalog/fonts/source-sans-3.md +++ b/catalog/fonts/source-sans-3.md @@ -9,7 +9,7 @@ license_spdx: OFL-1.1 commercial: true attribution_required: false formats: [OTF, TTF, WOFF] -tags: [ui, sans, ofl, adobe, variable-font] +tags: [ui, sans, adobe, variable-font] verified: 2026-08-24 status: active --- diff --git a/catalog/fonts/velvetyne.md b/catalog/fonts/velvetyne.md index b6006b2..cee6516 100644 --- a/catalog/fonts/velvetyne.md +++ b/catalog/fonts/velvetyne.md @@ -9,7 +9,7 @@ license_spdx: OFL-1.1 commercial: true attribution_required: true formats: [OTF, TTF, WOFF] -tags: [ofl, foundry, libre] +tags: [foundry, libre] attribution_string: "[Font name] by [designer] / Velvetyne Type Foundry" verified: 2026-08-24 status: active diff --git a/catalog/fonts/vt323.md b/catalog/fonts/vt323.md index 1f372c8..25904f5 100644 --- a/catalog/fonts/vt323.md +++ b/catalog/fonts/vt323.md @@ -9,7 +9,7 @@ license_spdx: OFL-1.1 commercial: true attribution_required: false formats: [TTF] -tags: [pixel, terminal, retro, ofl] +tags: [pixel, terminal, retro] verified: 2026-08-24 status: active --- diff --git a/catalog/shaders-vfx/3dtexel-decals.md b/catalog/shaders-vfx/3dtexel-decals.md index 3ec7b3d..fa1cae3 100644 --- a/catalog/shaders-vfx/3dtexel-decals.md +++ b/catalog/shaders-vfx/3dtexel-decals.md @@ -9,7 +9,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [PNG] -tags: [cc0, decals, pbr, handmade] +tags: [decals, pbr, handmade] verified: 2026-08-29 status: active --- diff --git a/catalog/shaders-vfx/effekseer-samples.md b/catalog/shaders-vfx/effekseer-samples.md index 3a87077..c19a799 100644 --- a/catalog/shaders-vfx/effekseer-samples.md +++ b/catalog/shaders-vfx/effekseer-samples.md @@ -9,7 +9,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [efk] -tags: [cc0, particles, vfx, effekseer] +tags: [particles, vfx, effekseer] verified: 2026-08-29 status: active --- diff --git a/catalog/shaders-vfx/gdquest-godot-shaders.md b/catalog/shaders-vfx/gdquest-godot-shaders.md index 7770084..85a4102 100644 --- a/catalog/shaders-vfx/gdquest-godot-shaders.md +++ b/catalog/shaders-vfx/gdquest-godot-shaders.md @@ -10,7 +10,7 @@ license_spdx: MIT commercial: true attribution_required: false formats: [gdshader, Godot] -tags: [godot, 2d, 3d, demos, gdquest] +tags: [godot, 2d, 3d, demos] verified: 2026-07-19 status: active --- diff --git a/catalog/shaders-vfx/jangafx-free-vdb.md b/catalog/shaders-vfx/jangafx-free-vdb.md index 0ceefc9..75fe2bf 100644 --- a/catalog/shaders-vfx/jangafx-free-vdb.md +++ b/catalog/shaders-vfx/jangafx-free-vdb.md @@ -9,7 +9,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [VDB] -tags: [cc0, vdb, volumes, explosion, smoke] +tags: [vdb, volumes, explosion, smoke] verified: 2026-08-29 status: active --- diff --git a/catalog/shaders-vfx/kenney-light-masks.md b/catalog/shaders-vfx/kenney-light-masks.md index 44efa3e..aaf08f6 100644 --- a/catalog/shaders-vfx/kenney-light-masks.md +++ b/catalog/shaders-vfx/kenney-light-masks.md @@ -10,7 +10,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [PNG] -tags: [cc0, light, cookie, shader, vfx, kenney] +tags: [light, cookie, shader, vfx] verified: 2026-07-27 status: active --- diff --git a/catalog/shaders-vfx/kenney-particle-pack.md b/catalog/shaders-vfx/kenney-particle-pack.md index 939ef41..cdbe8c7 100644 --- a/catalog/shaders-vfx/kenney-particle-pack.md +++ b/catalog/shaders-vfx/kenney-particle-pack.md @@ -10,7 +10,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [PNG] -tags: [cc0, particles, shader, vfx, kenney] +tags: [particles, shader, vfx] verified: 2026-07-27 status: active --- diff --git a/catalog/shaders-vfx/kenney-smoke-particles.md b/catalog/shaders-vfx/kenney-smoke-particles.md index ed000b0..aa5719a 100644 --- a/catalog/shaders-vfx/kenney-smoke-particles.md +++ b/catalog/shaders-vfx/kenney-smoke-particles.md @@ -10,7 +10,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [PNG] -tags: [cc0, smoke, explosion, particles, vfx, kenney] +tags: [smoke, explosion, particles, vfx] verified: 2026-07-27 status: active --- diff --git a/catalog/shaders-vfx/unity-labs-vfx-flipbooks.md b/catalog/shaders-vfx/unity-labs-vfx-flipbooks.md index 450659e..c66a499 100644 --- a/catalog/shaders-vfx/unity-labs-vfx-flipbooks.md +++ b/catalog/shaders-vfx/unity-labs-vfx-flipbooks.md @@ -9,7 +9,7 @@ license_spdx: CC0-1.0 commercial: true attribution_required: false formats: [EXR] -tags: [cc0, vfx, flipbook, engine-agnostic] +tags: [vfx, flipbook, engine-agnostic] verified: 2026-08-29 status: active --- diff --git a/catalog/tools/assimp.md b/catalog/tools/assimp.md index 7383ca9..cf60f59 100644 --- a/catalog/tools/assimp.md +++ b/catalog/tools/assimp.md @@ -9,7 +9,7 @@ license_spdx: BSD-3-Clause commercial: true attribution_required: false formats: [FBX, glTF, OBJ, DAE] -tags: [bsd, importer, converter, pipeline] +tags: [importer, converter, pipeline] verified: 2026-08-24 status: active --- diff --git a/catalog/tools/audacity.md b/catalog/tools/audacity.md index 6b2381d..be4fac3 100644 --- a/catalog/tools/audacity.md +++ b/catalog/tools/audacity.md @@ -8,7 +8,7 @@ license: GPL-3.0 commercial: true attribution_required: false formats: [WAV, FLAC, OGG, MP3, AUP3] -tags: [audio, editor, gpl, muse-group] +tags: [audio, editor, muse-group] verified: 2026-08-24 status: active --- diff --git a/catalog/tools/blender.md b/catalog/tools/blender.md index 4534c41..e7feac8 100644 --- a/catalog/tools/blender.md +++ b/catalog/tools/blender.md @@ -9,7 +9,7 @@ license_spdx: GPL-2.0-or-later commercial: true attribution_required: false formats: [Blend, glTF, FBX, OBJ, USD] -tags: [dcc, open-source, modeling] +tags: [dcc, modeling] verified: 2026-08-25 status: active --- diff --git a/catalog/tools/blockbench.md b/catalog/tools/blockbench.md index c80161b..0fc7293 100644 --- a/catalog/tools/blockbench.md +++ b/catalog/tools/blockbench.md @@ -8,7 +8,7 @@ license: GPL-3.0 commercial: true attribution_required: false formats: [glTF, BBMODEL] -tags: [low-poly, editor, open-source] +tags: [low-poly, editor] verified: 2026-08-24 status: active --- diff --git a/catalog/tools/cloudcompare.md b/catalog/tools/cloudcompare.md index 03fbba3..4e9cf8d 100644 --- a/catalog/tools/cloudcompare.md +++ b/catalog/tools/cloudcompare.md @@ -9,7 +9,7 @@ license_spdx: GPL-2.0-or-later commercial: true attribution_required: false formats: [LAS, E57, PLY, OBJ] -tags: [lidar, point-cloud, gpl] +tags: [lidar, point-cloud] verified: 2026-09-22 status: active --- diff --git a/catalog/tools/colmap.md b/catalog/tools/colmap.md index 7c5c0c8..906274c 100644 --- a/catalog/tools/colmap.md +++ b/catalog/tools/colmap.md @@ -9,7 +9,7 @@ license_spdx: BSD-3-Clause commercial: true attribution_required: false formats: [BIN, TXT, PLY, OBJ] -tags: [photogrammetry, sfm, mvs, open-source] +tags: [photogrammetry, sfm, mvs] verified: 2026-08-24 status: active --- diff --git a/catalog/tools/creature-2d-runtimes.md b/catalog/tools/creature-2d-runtimes.md index 472679b..045caea 100644 --- a/catalog/tools/creature-2d-runtimes.md +++ b/catalog/tools/creature-2d-runtimes.md @@ -9,7 +9,7 @@ license_spdx: Apache-2.0 commercial: true attribution_required: false formats: [Godot] -tags: [2d, soft-body, godot, apache] +tags: [2d, soft-body, godot] verified: 2026-07-19 status: active --- diff --git a/catalog/tools/daltonlens.md b/catalog/tools/daltonlens.md index 7a6e5a3..8dbdde4 100644 --- a/catalog/tools/daltonlens.md +++ b/catalog/tools/daltonlens.md @@ -9,7 +9,7 @@ license_spdx: BSD-2-Clause commercial: true attribution_required: false formats: [desktop-app] -tags: [bsd, a11y, colorblind, simulator] +tags: [a11y, colorblind, simulator] verified: 2026-07-19 status: active --- diff --git a/catalog/tools/espeak-ng.md b/catalog/tools/espeak-ng.md index ad8e7fa..2139870 100644 --- a/catalog/tools/espeak-ng.md +++ b/catalog/tools/espeak-ng.md @@ -9,7 +9,7 @@ license_spdx: GPL-3.0-or-later commercial: true attribution_required: false formats: [WAV, espeak-ng-data] -tags: [tts, formant, gpl, offline] +tags: [tts, formant, offline] verified: 2026-09-22 status: active --- diff --git a/catalog/tools/free-tex-packer.md b/catalog/tools/free-tex-packer.md index b5d27ab..48bc0d9 100644 --- a/catalog/tools/free-tex-packer.md +++ b/catalog/tools/free-tex-packer.md @@ -9,7 +9,7 @@ license_spdx: MIT commercial: true attribution_required: false formats: [PNG, JSON] -tags: [spritesheet, atlas, open-source] +tags: [spritesheet, atlas] verified: 2026-08-24 status: active --- diff --git a/catalog/tools/gimp.md b/catalog/tools/gimp.md index b4d2655..3864517 100644 --- a/catalog/tools/gimp.md +++ b/catalog/tools/gimp.md @@ -9,7 +9,7 @@ license_spdx: GPL-3.0-or-later commercial: true attribution_required: false formats: [XCF, PNG, TIFF, PSD, EXR] -tags: [painting, texture-work, open-source, dcc] +tags: [painting, texture-work, dcc] verified: 2026-09-22 status: active --- diff --git a/catalog/tools/google-draco.md b/catalog/tools/google-draco.md index b88fdce..e08fafc 100644 --- a/catalog/tools/google-draco.md +++ b/catalog/tools/google-draco.md @@ -9,7 +9,7 @@ license_spdx: Apache-2.0 commercial: true attribution_required: false formats: [DRC, glTF] -tags: [apache, mesh-compression, gltf] +tags: [mesh-compression, gltf] verified: 2026-07-19 status: active --- diff --git a/catalog/tools/goxel.md b/catalog/tools/goxel.md index 878daf2..6675cc6 100644 --- a/catalog/tools/goxel.md +++ b/catalog/tools/goxel.md @@ -9,7 +9,7 @@ license_spdx: GPL-3.0-or-later commercial: true attribution_required: false formats: [VOX, glTF, OBJ, PLY] -tags: [voxel, open-source, dcc] +tags: [voxel, dcc] verified: 2026-09-22 status: active --- diff --git a/catalog/tools/inkscape.md b/catalog/tools/inkscape.md index a3cc231..8fa106e 100644 --- a/catalog/tools/inkscape.md +++ b/catalog/tools/inkscape.md @@ -9,7 +9,7 @@ license_spdx: GPL-3.0-or-later commercial: true attribution_required: false formats: [SVG, PNG, PDF, EPS] -tags: [vector, svg, ui, icons, open-source, dcc] +tags: [vector, svg, ui, icons, dcc] verified: 2026-09-22 status: active --- diff --git a/catalog/tools/instant-meshes.md b/catalog/tools/instant-meshes.md index ffeb1c0..a4481e3 100644 --- a/catalog/tools/instant-meshes.md +++ b/catalog/tools/instant-meshes.md @@ -9,7 +9,7 @@ license_spdx: BSD-3-Clause commercial: true attribution_required: false formats: [OBJ] -tags: [retopo, remesh, quad, open-source] +tags: [retopo, remesh, quad] verified: 2026-08-24 status: active --- diff --git a/catalog/tools/krita.md b/catalog/tools/krita.md index c9e9b68..3d37eb8 100644 --- a/catalog/tools/krita.md +++ b/catalog/tools/krita.md @@ -8,7 +8,7 @@ license: GPL-3.0 commercial: true attribution_required: false formats: [KRA, PNG, TIFF, PSD, EXR] -tags: [painting, texture-work, open-source, dcc] +tags: [painting, texture-work, dcc] verified: 2026-08-24 status: active --- diff --git a/catalog/tools/ldtk.md b/catalog/tools/ldtk.md index 3763ca1..6ab3dab 100644 --- a/catalog/tools/ldtk.md +++ b/catalog/tools/ldtk.md @@ -9,7 +9,7 @@ license_spdx: MIT commercial: true attribution_required: false formats: [ldtk, JSON] -tags: [2d, levels, open-source] +tags: [2d, levels] verified: 2026-08-24 status: active --- diff --git a/catalog/tools/libresprite.md b/catalog/tools/libresprite.md index 62316e0..516f616 100644 --- a/catalog/tools/libresprite.md +++ b/catalog/tools/libresprite.md @@ -8,7 +8,7 @@ license: GPL-2.0 commercial: true attribution_required: false formats: [ASE, PNG, GIF] -tags: [pixel-art, editor, aseprite-fork, open-source] +tags: [pixel-art, editor, aseprite-fork] verified: 2026-08-24 status: active --- diff --git a/catalog/tools/lmms.md b/catalog/tools/lmms.md index 8763182..c981cfa 100644 --- a/catalog/tools/lmms.md +++ b/catalog/tools/lmms.md @@ -9,7 +9,7 @@ license_spdx: GPL-2.0-or-later commercial: true attribution_required: false formats: [WAV, OGG, MIDI, MMP] -tags: [daw, open-source, gpl] +tags: [daw] verified: 2026-09-22 status: active --- diff --git a/catalog/tools/material-maker.md b/catalog/tools/material-maker.md index 9950829..325d607 100644 --- a/catalog/tools/material-maker.md +++ b/catalog/tools/material-maker.md @@ -10,7 +10,7 @@ license_spdx: MIT commercial: true attribution_required: false formats: [PNG, mm] -tags: [pbr, procedural, open-source] +tags: [pbr, procedural] verified: 2026-08-24 status: active --- diff --git a/catalog/tools/materialize.md b/catalog/tools/materialize.md index 4f2eab7..5174fe7 100644 --- a/catalog/tools/materialize.md +++ b/catalog/tools/materialize.md @@ -8,7 +8,7 @@ license: GPL-3.0 commercial: true attribution_required: false formats: [PNG, TGA] -tags: [pbr, baker, open-source] +tags: [pbr, baker] verified: 2026-08-24 status: active --- diff --git a/catalog/tools/melotts.md b/catalog/tools/melotts.md index 1937808..26607fa 100644 --- a/catalog/tools/melotts.md +++ b/catalog/tools/melotts.md @@ -9,7 +9,7 @@ license_spdx: MIT commercial: true attribution_required: false formats: [Python, WAV] -tags: [mit, local, multilingual, tts] +tags: [local, multilingual, tts] verified: 2026-07-19 status: active --- diff --git a/catalog/tools/meshlab.md b/catalog/tools/meshlab.md index 10343b5..4939706 100644 --- a/catalog/tools/meshlab.md +++ b/catalog/tools/meshlab.md @@ -8,7 +8,7 @@ license: GPL-3.0 commercial: true attribution_required: false formats: [OBJ, PLY, glTF, 3MF] -tags: [mesh, cleanup, scan, gpl] +tags: [mesh, cleanup, scan] verified: 2026-08-24 status: active --- diff --git a/catalog/tools/meshroom.md b/catalog/tools/meshroom.md index 0135bc3..c6c3c32 100644 --- a/catalog/tools/meshroom.md +++ b/catalog/tools/meshroom.md @@ -9,7 +9,7 @@ license_spdx: MPL-2.0 commercial: true attribution_required: false formats: [OBJ, ABC, EXR, SFMdata] -tags: [photogrammetry, alicevision, open-source, gpu] +tags: [photogrammetry, alicevision, gpu] verified: 2026-08-24 status: active --- diff --git a/catalog/tools/pixelorama.md b/catalog/tools/pixelorama.md index b05984f..266efe9 100644 --- a/catalog/tools/pixelorama.md +++ b/catalog/tools/pixelorama.md @@ -9,7 +9,7 @@ license_spdx: MIT commercial: true attribution_required: false formats: [pxo, PNG] -tags: [pixel-art, editor, open-source] +tags: [pixel-art, editor] verified: 2026-08-24 status: active --- diff --git a/catalog/tools/quadriflow.md b/catalog/tools/quadriflow.md index 67f9411..90ccde3 100644 --- a/catalog/tools/quadriflow.md +++ b/catalog/tools/quadriflow.md @@ -9,7 +9,7 @@ license_spdx: BSD-3-Clause commercial: true attribution_required: false formats: [OBJ] -tags: [retopo, remesh, quad, open-source] +tags: [retopo, remesh, quad] verified: 2026-08-24 status: active --- diff --git a/catalog/tools/sherpa-onnx.md b/catalog/tools/sherpa-onnx.md index 9d5c2d0..46f782a 100644 --- a/catalog/tools/sherpa-onnx.md +++ b/catalog/tools/sherpa-onnx.md @@ -9,7 +9,7 @@ license_spdx: Apache-2.0 commercial: true attribution_required: false formats: [ONNX, C++, Python, WASM] -tags: [apache, local, offline, tts, asr] +tags: [local, offline, tts, asr] verified: 2026-07-19 status: active --- diff --git a/catalog/tools/sim-daltonism.md b/catalog/tools/sim-daltonism.md index e2be61f..b8bff1f 100644 --- a/catalog/tools/sim-daltonism.md +++ b/catalog/tools/sim-daltonism.md @@ -9,7 +9,7 @@ license_spdx: Apache-2.0 commercial: true attribution_required: false formats: [desktop-app, mobile-app] -tags: [apache, a11y, colorblind, simulator, macos, ios] +tags: [a11y, colorblind, simulator, macos, ios] verified: 2026-07-19 status: active --- diff --git a/catalog/tools/sollumz.md b/catalog/tools/sollumz.md index c299d7d..dd56bd0 100644 --- a/catalog/tools/sollumz.md +++ b/catalog/tools/sollumz.md @@ -9,7 +9,7 @@ license_spdx: GPL-3.0-or-later commercial: true attribution_required: false formats: [YDR, YDD, YFT, YBN, YTYP, YCD, YMAP, Blend] -tags: [blender-addon, gta-format, fivem, open-source] +tags: [blender-addon, gta-format, fivem] verified: 2026-09-22 status: active --- diff --git a/catalog/tools/tenacity.md b/catalog/tools/tenacity.md index 0a1b9a6..7490070 100644 --- a/catalog/tools/tenacity.md +++ b/catalog/tools/tenacity.md @@ -9,7 +9,7 @@ license_spdx: GPL-2.0-or-later commercial: true attribution_required: false formats: [WAV, FLAC, OGG, MP3, AUP3] -tags: [audio, editor, sfx, open-source, dcc] +tags: [audio, editor, sfx, dcc] verified: 2026-09-23 status: active --- diff --git a/catalog/tools/xnormal.md b/catalog/tools/xnormal.md index 4da951b..43f290d 100644 --- a/catalog/tools/xnormal.md +++ b/catalog/tools/xnormal.md @@ -8,7 +8,7 @@ license: custom commercial: unknown attribution_required: false formats: [PNG, TGA, EXR] -tags: [baker, normals, freeware, windows] +tags: [baker, normals, windows] verified: 2026-08-24 status: needs-review --- diff --git a/catalog/video/coverr.md b/catalog/video/coverr.md index ae0ec5d..4e7cadd 100644 --- a/catalog/video/coverr.md +++ b/catalog/video/coverr.md @@ -8,7 +8,7 @@ license: custom commercial: true attribution_required: false formats: [MP4] -tags: [stock, b-roll, no-attribution, no-ai-training] +tags: [stock, b-roll, no-ai-training] verified: 2026-09-23 status: active --- diff --git a/catalog/video/mixkit-stock-video.md b/catalog/video/mixkit-stock-video.md index 0bed99d..09933fb 100644 --- a/catalog/video/mixkit-stock-video.md +++ b/catalog/video/mixkit-stock-video.md @@ -9,7 +9,7 @@ license: custom commercial: true attribution_required: false formats: [MP4] -tags: [stock, b-roll, no-attribution, envato, games-not-named] +tags: [stock, b-roll, games-not-named] verified: 2026-09-23 status: needs-review --- diff --git a/catalog/video/pexels-videos.md b/catalog/video/pexels-videos.md index e44af44..f6c3af9 100644 --- a/catalog/video/pexels-videos.md +++ b/catalog/video/pexels-videos.md @@ -9,7 +9,7 @@ license: custom commercial: true attribution_required: false formats: [MP4] -tags: [stock, b-roll, no-attribution, canva] +tags: [stock, b-roll, canva] verified: 2026-09-23 status: active --- diff --git a/catalog/video/pixabay-videos.md b/catalog/video/pixabay-videos.md index ad00c6a..647603d 100644 --- a/catalog/video/pixabay-videos.md +++ b/catalog/video/pixabay-videos.md @@ -9,7 +9,7 @@ license: custom commercial: true attribution_required: false formats: [MP4] -tags: [stock, b-roll, no-attribution, standalone-ban] +tags: [stock, b-roll, standalone-ban] verified: 2026-09-23 status: active --- diff --git a/site/checks.mjs b/site/checks.mjs index 0f36daf..8c74b69 100644 --- a/site/checks.mjs +++ b/site/checks.mjs @@ -345,6 +345,29 @@ export function checkValueAliases(rel, meta, aliases) { return errors; } +/* ----------------------------------------------------------------- V21 */ +/** + * A tag that repeats the entry's own `publisher` drifted like the licence + * tags did (`kenney` was missing on 14 Kenney entries), and search already + * matches the publisher field, so the tag adds nothing but a way to be wrong. + * The licence-restating tags are retired in site/value-aliases.json (V19). + */ +export function slugify(text) { + return String(text).toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, ""); +} + +export function checkTagsRestatePublisher(rel, meta) { + const errors = []; + if (empty(meta.publisher)) return errors; + const own = slugify(meta.publisher); + for (const t of Array.isArray(meta.tags) ? meta.tags.map(String) : []) { + if (t === own) { + errors.push(`${rel} tag "${t}" restates publisher "${meta.publisher}"; search and grouping use the publisher field`); + } + } + return errors; +} + /* ----------------------------------------------------------------- V20 */ /** * `formats` is a closed list (site/format-vocabulary.json). V13 and V19 only diff --git a/site/checks.test.mjs b/site/checks.test.mjs index a1918e3..6752dfe 100644 --- a/site/checks.test.mjs +++ b/site/checks.test.mjs @@ -25,6 +25,7 @@ import { checkPublisherConsistency, checkSpdxConsistency, checkStacks, + checkTagsRestatePublisher, checkTaxonomyValues, checkValueAliases, checkValueSpellings, @@ -683,7 +684,14 @@ rejects("V19 rejects a retired subcategory", checkValueAliases("bad.md", { subca rejects("V19 rejects a retired format", checkValueAliases("bad.md", { formats: ["JPEG"] }, aliases), 'use "JPG"'); rejects("V19 rejects a licence as a subcategory", checkValueAliases("bad.md", { subcategories: ["public-domain"] }, aliases), "a licence, not a kind of content"); rejects("V19 rejects an internal review tag", checkValueAliases("bad.md", { tags: ["r04"] }, aliases), "internal review marker"); -accepts("V19 lets a tag use a word retired only as a subcategory", checkValueAliases("ok.md", { tags: ["tiles", "public-domain"] }, aliases)); +accepts("V19 lets a tag use a word retired only as a subcategory", checkValueAliases("ok.md", { tags: ["tiles", "gui"] }, aliases)); +rejects("V19 rejects a tag that restates the licence", checkValueAliases("bad.md", { tags: ["cc0"] }, aliases), 'tags must not carry "cc0"'); +accepts("V19 keeps a tag that only mentions a licence word", checkValueAliases("ok.md", { tags: ["odbl-adjacent", "free-tier"] }, aliases)); + +/* V21: tag restating the publisher ------------------------------------- */ +rejects("V21 rejects the publisher as a tag", checkTagsRestatePublisher("bad.md", { publisher: "Blender Studio", tags: ["blender-studio", "open-movie"] }), 'tag "blender-studio" restates publisher'); +accepts("V21 allows another publisher's name as a tag", checkTagsRestatePublisher("ok.md", { publisher: "Envato", tags: ["kenney-style"] })); +accepts("V21 ignores an entry with no publisher", checkTagsRestatePublisher("ok.md", { tags: ["kenney"] })); /* V20: closed format list ---------------------------------------------- */ const formatVocab = JSON.parse(fs.readFileSync(path.join(__dirname, "format-vocabulary.json"), "utf8")); @@ -705,4 +713,4 @@ if (failures.length) { for (const f of failures) console.error(` - ${f}`); process.exit(1); } -console.log(`checks.test ok: ${passed} assertions across 20 checks`); +console.log(`checks.test ok: ${passed} assertions across 21 checks`); diff --git a/site/public/app.js b/site/public/app.js index 6920a40..581b89b 100644 --- a/site/public/app.js +++ b/site/public/app.js @@ -209,19 +209,20 @@ /* ------------------------------------------------------------- search */ // Each entry's searchable text, normalised once at load, in three fields. - // Name and tags are what a reader means by a word, so a hit there ranks - // above one in the other metadata, which ranks above a summary-only hit. + // Name, publisher and tags are what a reader means by a word, so a hit there + // ranks above one in the other metadata, which ranks above a summary-only + // hit. Tags no longer repeat the publisher or licence (V19, V21), so those + // fields are searched directly. const FIELD_WEIGHTS = [3, 2, 1]; const searchIndex = new Map( data.entries.map((e) => [ e.id, [ - normalize([e.name, ...(e.tags || [])].join(" ")), + normalize([e.name, e.publisher || "", ...(e.tags || [])].join(" ")), normalize( [ e.license, e.category, - e.publisher || "", PERSPECTIVE_SEARCH[e.camera_perspective] || "", ...(e.formats || []), ...(e.subcategories || []), diff --git a/site/validate.mjs b/site/validate.mjs index 88428d9..4b5226e 100644 --- a/site/validate.mjs +++ b/site/validate.mjs @@ -19,6 +19,7 @@ import { checkPublisherConsistency, checkSpdxConsistency, checkStacks, + checkTagsRestatePublisher, checkTaxonomyValues, checkValueAliases, checkValueSpellings, @@ -303,6 +304,7 @@ function main() { errors.push(...checkTaxonomyValues(rel, meta)); errors.push(...checkValueAliases(rel, meta, aliases)); errors.push(...checkFormatVocabulary(rel, meta, formatVocab)); + errors.push(...checkTagsRestatePublisher(rel, meta)); errors.push(...checkActiveIsSettled(rel, meta)); if (meta.id) { const id = String(meta.id); diff --git a/site/value-aliases.json b/site/value-aliases.json index 3e4a2a5..76e5f32 100644 --- a/site/value-aliases.json +++ b/site/value-aliases.json @@ -18,6 +18,29 @@ "retired": { "subcategories": { "public-domain": "a licence, not a kind of content; the license field records it" + }, + "tags": { + "cc0": "restates the licence; the license field records it and the Licence filter uses it", + "cc-by": "restates the licence; the license field records it and the Licence filter uses it", + "cc-by-sa": "restates the licence; the license field records it (the body lists a mix under varies)", + "oga-by": "restates the licence; the license field records it (the body lists a mix under varies)", + "creative-commons": "restates the licence; the license field records it (the body lists a mix under varies)", + "mit": "restates the licence; the license field records it and the Licence filter uses it", + "gpl": "restates the licence; the license field records it and the Licence filter uses it", + "ofl": "restates the licence; the license field records it and the Licence filter uses it", + "apache": "restates the licence; the license field records it and the Licence filter uses it", + "bsd": "restates the licence; the license field records it and the Licence filter uses it", + "odbl": "restates the licence; the license field records it", + "public-domain": "restates the licence; the license field records it and the Licence filter uses it", + "copyleft-assets": "restates the licence; the license field records it (the body lists a mix under varies)", + "agpl-assets": "restates the licence; the license field records it (the body lists a mix under varies)", + "open-source": "restates the licence; the license field records it and the Licence filter uses it", + "attribution": "restates attribution_required, which the No attribution filter uses", + "no-attribution": "restates attribution_required, which the No attribution filter uses", + "royalty-free": "restates the licence terms; license and commercial record them", + "freeware": "restates the licence terms; license and commercial record them", + "free": "every entry is free; the licence fields say on what terms", + "non-commercial": "restates commercial: false, which the Commercial OK filter uses" } } } From d450d753a636b7d70e5568dbf5c8eaf62e201255 Mon Sep 17 00:00:00 2001 From: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com> Date: Sat, 26 Sep 2026 16:05:35 -0400 Subject: [PATCH 03/10] site: filter by licence family and by format (#45) license-vocabulary.json groups every licence into a family and the build emits licenseFamily per entry; format-vocabulary.json groups drive a Format select (an entry matches when any of its formats is in the group). Both round-trip through the URL (?licence=, ?format=) and show as removable chips. Co-Authored-By: Claude Opus 5.5 --- site/build.mjs | 21 +++++++++++++++++++ site/checks.test.mjs | 9 +++++++++ site/license-vocabulary.json | 9 +++++++++ site/public/app.js | 39 ++++++++++++++++++++++++++++++++++++ site/public/index.html | 12 +++++++++++ 5 files changed, 90 insertions(+) diff --git a/site/build.mjs b/site/build.mjs index 716f1aa..ca18c97 100644 --- a/site/build.mjs +++ b/site/build.mjs @@ -26,6 +26,7 @@ const DIST = path.join(__dirname, "dist"); const CONFIG_PATH = path.join(__dirname, "config.json"); const VOCAB_PATH = path.join(__dirname, "license-vocabulary.json"); const SPDX_ALLOWED_PATH = path.join(__dirname, "spdx-allowed.json"); +const FORMATS_PATH = path.join(__dirname, "format-vocabulary.json"); // Social preview image: a first-party screenshot of this site, kept with the // other first-party stills (the validator allows binaries there) and copied // into dist at build time. @@ -51,6 +52,14 @@ function walkMarkdown(dir, out = []) { return out; } +/** The Licence-filter family a license value belongs to (license-vocabulary.json `families`). */ +function licenseFamily(vocab, license) { + for (const [key, fam] of Object.entries(vocab.families || {})) { + if (Array.isArray(fam.licenses) && fam.licenses.includes(license)) return key; + } + return "mixed"; +} + function loadEntries(vocab) { const files = walkMarkdown(CATALOG); const entries = []; @@ -113,6 +122,8 @@ function loadEntries(vocab) { ...(meta.attribution_string ? { attribution_string: String(meta.attribution_string) } : {}), ...(meta.publisher ? { publisher: String(meta.publisher) } : {}), ...(meta.license_spdx ? { license_spdx: String(meta.license_spdx) } : {}), + ...(meta.maintenance ? { maintenance: String(meta.maintenance) } : {}), + licenseFamily: licenseFamily(vocab, String(meta.license)), attributionClass: vocab.licenses[String(meta.license)]?.attribution || "any", licenseRank: ATTRIBUTION_RANK[ @@ -481,6 +492,7 @@ function checkPages(files) { function main() { const config = JSON.parse(fs.readFileSync(CONFIG_PATH, "utf8")); const vocab = JSON.parse(fs.readFileSync(VOCAB_PATH, "utf8")); + const formatVocab = JSON.parse(fs.readFileSync(FORMATS_PATH, "utf8")); const { entries, errors, bodies } = loadEntries(vocab); const spdxAllowed = JSON.parse(fs.readFileSync(SPDX_ALLOWED_PATH, "utf8")); const { stacks, errors: stackErrors } = loadStacks(entries, vocab, spdxAllowed); @@ -531,6 +543,15 @@ function main() { guides: config.guides, featured, stats, + // Choices for the Licence and Format filters (app.js). + filters: { + licenseFamilies: Object.fromEntries( + Object.entries(vocab.families || {}) + .filter(([key]) => !key.startsWith("_")) + .map(([key, fam]) => [key, fam.label]) + ), + formatGroups: formatVocab.groups, + }, entries, }; diff --git a/site/checks.test.mjs b/site/checks.test.mjs index 6752dfe..70bb942 100644 --- a/site/checks.test.mjs +++ b/site/checks.test.mjs @@ -688,6 +688,15 @@ accepts("V19 lets a tag use a word retired only as a subcategory", checkValueAli rejects("V19 rejects a tag that restates the licence", checkValueAliases("bad.md", { tags: ["cc0"] }, aliases), 'tags must not carry "cc0"'); accepts("V19 keeps a tag that only mentions a licence word", checkValueAliases("ok.md", { tags: ["odbl-adjacent", "free-tier"] }, aliases)); +/* Licence families: every licence in exactly one Licence-filter group ---- */ +{ + const fams = Object.entries(vocab.families).filter(([k]) => !k.startsWith("_")); + const homeless = Object.keys(vocab.licenses).filter((l) => fams.filter(([, f]) => f.licenses.includes(l)).length !== 1); + accepts("every licence value sits in exactly one family", homeless); + const unknown = fams.flatMap(([, f]) => f.licenses).filter((l) => !(l in vocab.licenses)); + accepts("families name only licence values the vocabulary has", unknown); +} + /* V21: tag restating the publisher ------------------------------------- */ rejects("V21 rejects the publisher as a tag", checkTagsRestatePublisher("bad.md", { publisher: "Blender Studio", tags: ["blender-studio", "open-movie"] }), 'tag "blender-studio" restates publisher'); accepts("V21 allows another publisher's name as a tag", checkTagsRestatePublisher("ok.md", { publisher: "Envato", tags: ["kenney-style"] })); diff --git a/site/license-vocabulary.json b/site/license-vocabulary.json index 5f61da9..611ba9e 100644 --- a/site/license-vocabulary.json +++ b/site/license-vocabulary.json @@ -60,6 +60,15 @@ "note": "Source does not state it plainly. Pairs with status: needs-review." } }, + "families": { + "_doc": "Groups for the site's Licence filter. Every license value above belongs to exactly one family (lib.test.mjs checks this).", + "public-domain": { "label": "CC0 / public domain", "licenses": ["CC0", "Unlicense", "public-domain"] }, + "cc-by": { "label": "CC-BY (credit)", "licenses": ["CC-BY", "CC-BY-3.0", "CC-BY-4.0"] }, + "permissive": { "label": "Permissive (MIT, Apache, BSD, OFL)", "licenses": ["MIT", "ISC", "Apache-2.0", "BSD-2-Clause", "BSD-3-Clause", "SIL OFL", "CDLA-Permissive-2.0"] }, + "copyleft": { "label": "Copyleft (GPL, MPL, ODbL)", "licenses": ["GPL-2.0", "GPL-2.0-or-later", "GPL-3.0", "GPL-3.0-or-later", "MPL-2.0", "ODbL"] }, + "custom": { "label": "Publisher's own terms", "licenses": ["custom"] }, + "mixed": { "label": "Varies or unknown", "licenses": ["varies", "unknown"] } + }, "attribution_waiver_marker": "- Attribution waived:", "deprecation_reason_marker": "- Deprecated:" } diff --git a/site/public/app.js b/site/public/app.js index 581b89b..bf3145e 100644 --- a/site/public/app.js +++ b/site/public/app.js @@ -23,9 +23,14 @@ commercialOnly: false, noAttr: false, perspective: "any", + license: "any", + format: "any", sort: "name", }; const state = { ...DEFAULTS }; + // Licence families and format groups come from the build (license-vocabulary.json, format-vocabulary.json). + const LICENSE_FAMILIES = data.filters?.licenseFamilies || {}; + const FORMAT_GROUPS = data.filters?.formatGroups || {}; const categoryLabels = data.categories || {}; const repo = data.site?.repo || "https://github.com/TMHSDigital/Free-Game-Dev-Assets"; @@ -116,6 +121,8 @@ pick("cat", "category", ["all", ...Object.keys(categoryLabels)]); pick("sort", "sort", Object.keys(SORTS)); pick("view", "perspective", ["any", ...Object.keys(PERSPECTIVE_LABELS)]); + pick("licence", "license", ["any", ...Object.keys(LICENSE_FAMILIES)]); + pick("format", "format", ["any", ...Object.keys(FORMAT_GROUPS)]); if (p.has("q")) state.q = p.get("q"); const bool = (key, field) => { const v = p.get(key); @@ -136,6 +143,8 @@ if (state.q.trim()) p.set("q", state.q.trim()); if (state.sort !== DEFAULTS.sort) p.set("sort", state.sort); if (state.perspective !== DEFAULTS.perspective) p.set("view", state.perspective); + if (state.license !== DEFAULTS.license) p.set("licence", state.license); + if (state.format !== DEFAULTS.format) p.set("format", state.format); const bool = (key, field) => { if (state[field] !== DEFAULTS[field]) p.set(key, state[field] ? "1" : "0"); }; @@ -168,6 +177,11 @@ if (state.noAttr && entry.attribution_required !== false) return false; if (state.perspective !== "any" && entry.camera_perspective !== state.perspective) return false; + if (state.license !== "any" && entry.licenseFamily !== state.license) return false; + if (state.format !== "any") { + const wanted = FORMAT_GROUPS[state.format]?.formats || []; + if (!(entry.formats || []).some((f) => wanted.includes(f))) return false; + } return true; } @@ -385,6 +399,10 @@ key: "perspective", label: `view: ${PERSPECTIVE_LABELS[state.perspective] || state.perspective}`, }); + if (state.license !== DEFAULTS.license) + chips.push({ key: "license", label: `licence: ${LICENSE_FAMILIES[state.license] || state.license}` }); + if (state.format !== DEFAULTS.format) + chips.push({ key: "format", label: `format: ${FORMAT_GROUPS[state.format]?.label || state.format}` }); if (!state.active) chips.push({ key: "active", label: "hiding active" }); if (!state.review) chips.push({ key: "review", label: "hiding needs-review" }); if (state.deprecated) chips.push({ key: "deprecated", label: "showing deprecated" }); @@ -683,6 +701,25 @@ apply(); }); + const selects = [ + ["#license-family", "license", LICENSE_FAMILIES], + ["#format-group", "format", Object.fromEntries(Object.entries(FORMAT_GROUPS).map(([k, g]) => [k, g.label]))], + ]; + for (const [sel, field, choices] of selects) { + const el = $(sel); + el.insertAdjacentHTML( + "beforeend", + Object.entries(choices) + .map(([value, label]) => ``) + .join("") + ); + el.value = state[field]; + el.addEventListener("change", (e) => { + state[field] = e.target.value; + apply(); + }); + } + const sort = $("#sort"); sort.value = state.sort; sort.addEventListener("change", (e) => { @@ -789,6 +826,8 @@ $("#filter-no-attr").checked = state.noAttr; $("#sort").value = state.sort; $("#perspective").value = state.perspective; + $("#license-family").value = state.license; + $("#format-group").value = state.format; } /* --------------------------------------------------------------- init */ diff --git a/site/public/index.html b/site/public/index.html index 6872ed2..a6a12b8 100644 --- a/site/public/index.html +++ b/site/public/index.html @@ -138,6 +138,18 @@

Catalog

+ +