Skip to content

Commit 1e1cfb8

Browse files
TMHSDigitalclaude
andauthored
Open issues sweep: validation types, incremental build, added dates, feeds, monthly re-verify, SEO and a11y fixes (#124)
* Type-check list and boolean fields, strip trailing frontmatter comments, one link-scheme rule, build-time duplicate id check - frontmatter: a trailing ' # comment' is dropped outside quotes (#79); a comment or blank line between a key and its block list no longer breaks the list (#84); TEMPLATE.md moves its inline guidance to comment lines - validate: new V24 checkFieldTypes rejects tags/subcategories/formats that parsed as text and quoted booleans, with the fix in the message (#79) - shared: EXTERNAL_SCHEME_RE and ANY_SCHEME_RE used by validate, the link resolver and the page checks; an ftp:/data:/javascript: link is rejected everywhere with the scheme named; a line-start autolink is not raw HTML (#83) - build: a duplicate id fails the build instead of overwriting a page (#81) Closes #79, #81, #83, #84 Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> * Sponsor link instead of iframes, shared head baseline, sitemap lastmod from git, check-links robustness, chip radiogroup, small UX fixes - shared: sponsorButtonHtml is a static link with an inline heart, so no page loads github.com before first paint (#101) - shared: baseHeadHtml gives entry, stack, freshness and home pages the same canonical/sitemap/feed/theme-color/og:image set, with a test (#104) - exports: sitemapXml is pure and every URL has a lastmod: the build date for home and freshness, the later of verified/walked and the file's last commit date for entries and stacks (one git log per build, falls back without git) (#108) - check-links: --stale-days is validated before any fetch; GitHub API failures go to a 'Could not check (N skipped)' section that is not a problem, and a rate limit lists every repository left unchecked (#82) - app: category chips are a radiogroup with aria-checked and arrow keys; the scroll position shows as a 'You are in' line instead of a second chip state; form-control borders use --control-line at 3:1+ in both themes (#107) - app: category and sort changes push history (Back works), keystrokes replace, both in try/catch; '/' ignores Ctrl/Cmd/Alt; one spelling (Licence) in the UI; the perspective select is 'Camera view' with a visible note (#106) Closes #82, #101, #104, #106, #107, #108 Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> * Catalog data fixes from the #95 audit and the 2026-10-19 link check - 24 entries: the body heading now equals `name`, and new check V25 (checkTitleMatchesName) keeps them equal - sonniss-gdc: the name is quoted so its hashtag is not read as a comment; the parser now reports an unquoted ` #word` instead of truncating silently - godotsteam: https body link; cmu-mocap and makehuman note that their hosts serve http only (re-checked 2026-10-22), so the url stays http - fab-free-content, megascans-starter-content, paragon-characters: a Notes line on the search-page url and where to go if Fab changes its parameters - maintenance from the 2026-10-19 link check (#77): microsoft-rocketbox inactive -> archived, octave-ui-sounds inactive, ue5coro archived (final push 2026-10-16; the README states the archival), each with a dated note Closes #77 Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> * Incremental build, SEO titles and descriptions, print stylesheet, "Did you mean", pinned actions, CITATION.cff, dx items - build: no dist wipe; one writer creates each directory once, writes a file only when its bytes changed, and prunes what an earlier build left, so the output equals a clean build's. --clean wipes first. Entry errors stop the build before stacks load. Measured on this drive: clean 25.0 s, no-change rebuild 1.6 s, 432-page rebuild 8.3 s (#80) - entry pages: <title> is "name · licence" (name alone when over 60), the description leads with licence, commercial stance and credit and clips at a sentence under 155; og:title/og:description keep the full text; stack pages clip too; the page check fails a title over 60 or a description over 160 (#103) - styles: @media print block for a clean licence record, light tokens, source URLs spelled out, chrome hidden (#105) - app: an empty search shows "Did you mean" buttons from closestEntries, which now also matches a one-word query against each word of a name (#109) - ci: actions pinned to commit SHAs with the version as a comment (#88) - CITATION.cff so GitHub offers "Cite this repository" (#114) - check-links: no retry after a full timeout; one Node statement (22+, CI and .nvmrc use 24); CONTRIBUTING says ungrouped formats are not filterable; new-entry's last step names the file (#86) Closes #80, #86, #88, #103, #105, #109, #114 Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> * Monthly re-verify batch workflow - site/lib/reverify.mjs: pickBatch selects live entries last checked more than 150 days ago (or never), oldest first, a tenth of the catalog per month so it cycles in about ten; batchIssueMarkdown writes the checklist in the shape of #54-#57 (file, source URL, recorded licence, age) - site/reverify-batch.mjs: the CLI, with --report and --size, count= to GITHUB_OUTPUT - .github/workflows/reverify.yml: first of the month and on demand, opens or updates one issue labelled help wanted / good first issue; skipped while nothing is due (the July 2026 checks fall due in December) - documented in site/README.md, CONTRIBUTING.md and ROADMAP.md; tests cover the selection rule and the issue text Closes #93 Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> * Add an `added` date to every entry; new-sources feed, reverified feed, "New in the last 30 days", sort by added - catalog: `added: YYYY-MM-DD` on all 415 entries, backfilled once from each file's first commit (git log, oldest touch per path); TEMPLATE.md carries it and new-entry fills in today's date; it never changes afterwards - validate: `added` is required; V26 checkAddedDate wants a real date not in the future (added <= verified is not enforced: six entries were researched before they were committed) - exports: feed.xml is now the new-sources feed keyed on `added`, and reverified.xml the recently-verified feed keyed on `verified`; both are announced in every page head; catalog.csv and data.json carry `added` - home: "New in the last 30 days: N" line under the freshness line, the newest named and the rest linked to the new "Recently added" sort - docs: site/README.md and CONTRIBUTING.md describe the field and the feeds Closes #90 Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> * Dataset release workflow, version in data.json, ledger section for this sweep - .github/workflows/release.yml: monthly and on demand, builds, tags vYYYY.MM.DD and creates a release with data.json, catalog.csv, feed.xml, reverified.xml and llms.txt attached; notes from the newest ledger section; an existing tag is left alone - data.json carries `version` (the same calendar tag; CATALOG_VERSION overrides) - pages.yml checks out full history so the sitemap's lastmod dates are real - docs/review-ledger.md: the 2026-10-22 section Closes #113 Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> * Review fixes: page check uses this build's output, list-item comment guard, absolute issue link, filtered suggestions - build: checkPages resolves link targets against the set of files this build produced, so an incremental build fails on a link to a removed entry instead of passing against last time's page and then pruning it - frontmatter: a block-list item cut at " #word", or reduced to nothing by a leading #, is reported like a key: value line is - reverify: the CONTRIBUTING link is absolute (a relative link in an issue body resolves under /issues/ and 404s) - app: "Did you mean" draws only from entries the category and other filters would show, so a suggestion never leads back to the empty state Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> --------- Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
1 parent 5e064fc commit 1e1cfb8

451 files changed

Lines changed: 14352 additions & 12825 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎.github/workflows/ci.yml‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,10 @@ jobs:
1616
runs-on: ubuntu-latest
1717
steps:
1818
- name: Checkout
19-
uses: actions/checkout@v7
19+
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
2020

2121
- name: Setup Node
22-
uses: actions/setup-node@v7
22+
uses: actions/setup-node@949feb2413d6458794dcd2491c4babbbce0c15c1 # v7.1.0
2323
with:
2424
node-version-file: .nvmrc
2525

‎.github/workflows/links.yml‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,10 @@ jobs:
1717
runs-on: ubuntu-latest
1818
steps:
1919
- name: Checkout
20-
uses: actions/checkout@v7
20+
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
2121

2222
- name: Setup Node
23-
uses: actions/setup-node@v7
23+
uses: actions/setup-node@949feb2413d6458794dcd2491c4babbbce0c15c1 # v7.1.0
2424
with:
2525
node-version-file: .nvmrc
2626

‎.github/workflows/pages.yml‎

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,18 +28,21 @@ jobs:
2828
runs-on: ubuntu-latest
2929
steps:
3030
- name: Checkout
31-
uses: actions/checkout@v7
31+
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
32+
with:
33+
# The sitemap's lastmod dates come from git history.
34+
fetch-depth: 0
3235

3336
- name: Setup Node
34-
uses: actions/setup-node@v7
37+
uses: actions/setup-node@949feb2413d6458794dcd2491c4babbbce0c15c1 # v7.1.0
3538
with:
3639
node-version-file: .nvmrc
3740

3841
- name: Build site
3942
run: node site/build.mjs
4043

4144
- name: Upload Pages artifact
42-
uses: actions/upload-pages-artifact@v5
45+
uses: actions/upload-pages-artifact@fc324d3547104276b827a68afc52ff2a11cc49c9 # v5.0.0
4346
with:
4447
path: site/dist
4548

@@ -52,4 +55,4 @@ jobs:
5255
steps:
5356
- name: Deploy to GitHub Pages
5457
id: deployment
55-
uses: actions/deploy-pages@v5
58+
uses: actions/deploy-pages@368f82528645a54fb793d4d04e342629a3f51346 # v5.0.1

‎.github/workflows/release.yml‎

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
name: Dataset release
2+
3+
# A versioned snapshot of the catalog a tool can pin: tag vYYYY.MM.DD and
4+
# attach data.json, catalog.csv, the two feeds and llms.txt. Monthly, and on
5+
# demand from the Actions tab. The release notes are the newest section of
6+
# docs/review-ledger.md. A tag that already exists is left alone.
7+
on:
8+
schedule:
9+
- cron: "0 9 1 * *"
10+
workflow_dispatch:
11+
12+
permissions:
13+
contents: write
14+
15+
jobs:
16+
release:
17+
runs-on: ubuntu-latest
18+
steps:
19+
- name: Checkout
20+
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
21+
with:
22+
# The sitemap's lastmod dates come from git history.
23+
fetch-depth: 0
24+
25+
- name: Setup Node
26+
uses: actions/setup-node@949feb2413d6458794dcd2491c4babbbce0c15c1 # v7.1.0
27+
with:
28+
node-version-file: .nvmrc
29+
30+
- name: Check and build
31+
run: npm test && node site/validate.mjs && node site/build.mjs
32+
33+
- name: Create the release
34+
env:
35+
GH_TOKEN: ${{ github.token }}
36+
run: |
37+
tag="v$(date -u +%Y.%m.%d)"
38+
if gh release view "$tag" >/dev/null 2>&1; then
39+
echo "release $tag already exists; nothing to do"
40+
exit 0
41+
fi
42+
# Newest ledger section: from the first "## " heading to the next.
43+
awk '/^## /{n++} n==1' docs/review-ledger.md > release-notes.md
44+
{
45+
echo
46+
echo "Attached: \`data.json\` (full catalog), \`catalog.csv\`, \`feed.xml\` (new sources), \`reverified.xml\` (recent licence re-reads), \`llms.txt\`."
47+
echo "Field reference: https://github.com/${GITHUB_REPOSITORY}/blob/main/site/README.md"
48+
} >> release-notes.md
49+
gh release create "$tag" \
50+
--title "Catalog $tag" \
51+
--notes-file release-notes.md \
52+
site/dist/data.json site/dist/catalog.csv site/dist/feed.xml site/dist/reverified.xml site/dist/llms.txt

‎.github/workflows/reverify.yml‎

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
name: Monthly re-verify batch
2+
3+
# On the first of each month: pick the live entries whose licence was read
4+
# longest ago (more than 150 days), about a tenth of the catalog, and open or
5+
# update one checklist issue asking for them to be re-read at the source.
6+
# It never edits an entry.
7+
on:
8+
schedule:
9+
- cron: "0 8 1 * *"
10+
workflow_dispatch:
11+
12+
permissions:
13+
contents: read
14+
issues: write
15+
16+
jobs:
17+
reverify:
18+
runs-on: ubuntu-latest
19+
steps:
20+
- name: Checkout
21+
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
22+
23+
- name: Setup Node
24+
uses: actions/setup-node@949feb2413d6458794dcd2491c4babbbce0c15c1 # v7.1.0
25+
with:
26+
node-version-file: .nvmrc
27+
28+
- name: Pick the batch
29+
id: pick
30+
run: node site/reverify-batch.mjs --report reverify-batch.md
31+
32+
- name: Open or update the batch issue
33+
if: steps.pick.outputs.count != '0'
34+
env:
35+
GH_TOKEN: ${{ github.token }}
36+
COUNT: ${{ steps.pick.outputs.count }}
37+
run: |
38+
month=$(date -u +%Y-%m)
39+
title="Re-verify batch ${month}: ${COUNT} entries due a licence re-read"
40+
existing=$(gh issue list --state open --label "help wanted" --json number,title \
41+
--jq '[.[] | select(.title | startswith("Re-verify batch "))][0].number // empty')
42+
if [ -n "$existing" ]; then
43+
gh issue edit "$existing" --title "$title" --body-file reverify-batch.md
44+
else
45+
gh issue create --title "$title" --label "help wanted" --label "good first issue" --body-file reverify-batch.md
46+
fi

‎CITATION.cff‎

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
cff-version: 1.2.0
2+
message: "If you use this catalog in research or teaching, please cite it as a dataset."
3+
type: dataset
4+
title: "Free Game Dev Assets: a dated, sourced catalog of free game assets and tools with licence metadata"
5+
authors:
6+
- name: "TMHSDigital"
7+
website: "https://github.com/TMHSDigital"
8+
repository-code: "https://github.com/TMHSDigital/Free-Game-Dev-Assets"
9+
url: "https://tmhsdigital.github.io/Free-Game-Dev-Assets/"
10+
license: CC0-1.0
11+
date-released: "2026-10-22"
12+
keywords:
13+
- game-development
14+
- game-assets
15+
- licensing
16+
- open-data
17+
- catalog
18+
abstract: >-
19+
A curated catalog of free, commercially usable game assets and tools. Every
20+
entry records the licence as read at the source on a stated date, the
21+
commercial stance, the credit requirement and dated evidence quotes. The
22+
catalog metadata is CC0; the linked assets keep their own licences.

‎CONTRIBUTING.md‎

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@ Please follow the [Code of Conduct](CODE_OF_CONDUCT.md).
2727

2828
## Adding an entry
2929

30-
The website rebuilds from frontmatter on deploy. Node 22 or newer is all you need; there
31-
are no dependencies to install.
30+
The website rebuilds from frontmatter on deploy. Node 22 or newer is all you need (CI and
31+
`.nvmrc` use 24); there are no dependencies to install.
3232

3333
1. Run `node site/new-entry.mjs <category> <id>` (or `npm run new-entry -- <category> <id>`). It copies [`catalog/TEMPLATE.md`](catalog/TEMPLATE.md) to `catalog/<category>/<id>.md` with the id, category and today's date filled in, and refuses an id already used anywhere in the catalog. Use a short kebab-case `id`; a mixed kit already listed in another category is a duplicate, not a second entry.
3434
2. Verify the license on the live source page the day you submit, and fill every frontmatter field from it (rules below). Prefer primary URLs over mirror/aggregator pages.
@@ -49,7 +49,7 @@ To add a starter stack (one pick per need for a kind of game), follow [`stacks/R
4949
- `attribution_string`: the copy-paste credit line. Required when `attribution_required` is `true`; optional otherwise.
5050
- `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.
5151
- `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.
52-
- `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.
52+
- `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. A format outside every group is still searchable and shown on the card, but the Format filter cannot select it.
5353
- `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.
5454
- 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.
5555
- `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.
@@ -58,6 +58,7 @@ To add a starter stack (one pick per need for a kind of game), follow [`stacks/R
5858
- `ue_versions`: optional, the Unreal Engine versions the source itself states, as `5.4`, `5.4-5.8` or `5.4+` (V23). Say in Notes where the range came from (README, `.uplugin`, release names, listing). Never infer it.
5959
- Unreal plugins use `subcategories: [unreal, ...]` and `formats: [unreal-plugin]`; Unreal projects and content packs use `formats: [Unreal]`. The validator rejects a GPL or LGPL licence on either, because the Unreal Engine EULA forbids combining the engine with that code (see [`docs/unreal.md`](docs/unreal.md)).
6060
- `url`: an `https://` address (`http://` only where the source has no https). Other schemes are rejected.
61+
- `added`: ISO date (`YYYY-MM-DD`) the entry joined the catalog. `npm run new-entry` fills it in; it never changes afterwards (V26: a real date, not in the future). The "new sources" feed and the home page's "New in the last 30 days" line key on it, so a re-verification sweep does not look like a wave of new entries.
6162
- `verified`: ISO date (`YYYY-MM-DD`) of your last license check. It must be a real date, no later than tomorrow in UTC, and no newer than the newest date in `## Evidence` (V8): a new `verified` date needs a new dated Evidence line from the same check. Dates inside URLs do not count as Evidence dates.
6263
- `status`: `active` | `needs-review` | `deprecated`. A `deprecated` entry needs a `- Deprecated:` line in its body giving the reason (V9). `active` means the licence, the commercial stance and the credit requirement are all settled: an `unknown` in `license`, `commercial` or `attribution_required` keeps an entry at `needs-review`. The validator enforces this (V14), and rejects `formats`, `subcategories` or `tags` values that differ only by case, punctuation or a trailing "s" from one already in use (V13).
6364

@@ -73,6 +74,13 @@ To add a starter stack (one pick per need for a kind of game), follow [`stacks/R
7374
- [ ] Entry does not claim rights we don’t have
7475
- [ ] Tool entries distinguish **software license** from **exported asset** ownership
7576

77+
Verification ages. On the first of each month a workflow opens a "Re-verify batch" issue
78+
listing the live entries whose licence was read longest ago (over 150 days, about a tenth
79+
of the catalog). Each item is a self-contained re-read: open the source, confirm the
80+
terms, bump `verified` and add a dated Evidence quote, or set `needs-review` and say what
81+
changed. Those issues carry `good first issue`; pick one if you want a first contribution
82+
with no code.
83+
7684
## Submitting your own source
7785

7886
Publishers are welcome to list their own work. Say so in the pull request, write the entry as a third party would (facts the source states, no comparisons with other entries, no ranking language), and start it at `needs-review` so a maintainer re-reads the licence before it goes `active`. A free tier of a paid product is listed as the free tier only, with the paid tier named in Notes and not linked as the entry's `url`. A one-time notice or upsell inside a tool is recorded in Notes as a fact.

‎README.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -337,7 +337,7 @@ Please follow the [Code of Conduct](CODE_OF_CONDUCT.md).
337337
<details>
338338
<summary>Run the checks and preview the site locally</summary>
339339

340-
Node 22 or newer; there is nothing to install.
340+
Node 22 or newer (CI and `.nvmrc` use 24); there is nothing to install.
341341

342342
```bash
343343
npm run check # all of the below, in the order CI runs them

‎ROADMAP.md‎

Lines changed: 34 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,34 @@
1-
# Roadmap
2-
3-
Where help is most useful. The rule behind all of it: a wrong licence claim is worse than a
4-
missing entry, so freshness and accuracy come before volume.
5-
6-
## Open to contributors
7-
8-
- **Thin categories:** video, animation and environment are still the smallest (counts in the
9-
[category table](catalog/README.md)). See [CONTRIBUTING.md](CONTRIBUTING.md) and the "new
10-
source" issue form.
11-
- **Optional fields:** `camera_perspective` and `grid_dimensions` on 2D entries
12-
([#41](https://github.com/TMHSDigital/Free-Game-Dev-Assets/issues/41)). Small, well-scoped, a
13-
good first PR.
14-
- **Starter stacks:** audio, a game-jam kit, Unity, Unreal and VR are not covered yet. Use the
15-
"request an asset" form to add to a stack's Gaps list.
16-
- **Corrections:** a licence that changed or a link that moved. The weekly link check opens an
17-
issue listing them.
18-
19-
## Planned
20-
21-
- Re-verification in smaller, regular batches, so the July 2026 verifications do not all expire
22-
together in mid-2027.
23-
- A changelog page generated from [docs/review-ledger.md](docs/review-ledger.md).
24-
- Full-text search over entry bodies (Notes and Evidence), not only names, tags and summaries.
25-
26-
## Done
27-
28-
- Site search across names, tags and summaries, with licence, format and category filters.
29-
- Accessibility fixes: focus handling, contrast, heading outline and tap targets (Lighthouse
30-
accessibility 100).
31-
- Thin categories topped up: 15 video, animation and environment sources (2026-10-04).
32-
33-
- Machine-readable exports: `data.json`, `catalog.csv` and an Atom feed (`feed.xml`) of recently
34-
verified entries.
1+
# Roadmap
2+
3+
Where help is most useful. The rule behind all of it: a wrong licence claim is worse than a
4+
missing entry, so freshness and accuracy come before volume.
5+
6+
## Open to contributors
7+
8+
- **Thin categories:** video, animation and environment are still the smallest (counts in the
9+
[category table](catalog/README.md)). See [CONTRIBUTING.md](CONTRIBUTING.md) and the "new
10+
source" issue form.
11+
- **Optional fields:** `camera_perspective` and `grid_dimensions` on 2D entries
12+
([#41](https://github.com/TMHSDigital/Free-Game-Dev-Assets/issues/41)). Small, well-scoped, a
13+
good first PR.
14+
- **Starter stacks:** audio, a game-jam kit, Unity, Unreal and VR are not covered yet. Use the
15+
"request an asset" form to add to a stack's Gaps list.
16+
- **Corrections:** a licence that changed or a link that moved. The weekly link check opens an
17+
issue listing them.
18+
19+
## Planned
20+
21+
- Re-verification in smaller, regular batches, so the July 2026 verifications do not all expire. Since 2026-10 the `reverify.yml` workflow opens a monthly checklist issue of the entries checked longest ago (over 150 days, about a tenth of the catalog each month)
22+
together in mid-2027.
23+
- A changelog page generated from [docs/review-ledger.md](docs/review-ledger.md).
24+
- Full-text search over entry bodies (Notes and Evidence), not only names, tags and summaries.
25+
26+
## Done
27+
28+
- Site search across names, tags and summaries, with licence, format and category filters.
29+
- Accessibility fixes: focus handling, contrast, heading outline and tap targets (Lighthouse
30+
accessibility 100).
31+
- Thin categories topped up: 15 video, animation and environment sources (2026-10-04).
32+
33+
- Machine-readable exports: `data.json`, `catalog.csv` and an Atom feed (`feed.xml`) of recently
34+
verified entries.

0 commit comments

Comments
 (0)