You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit 1e1cfb8
Browse filesBrowse the repository at this point in the historyBrowse files
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>
Copy file name to clipboardExpand all lines: CONTRIBUTING.md
+11-3Lines changed: 11 additions & 3 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -27,8 +27,8 @@ Please follow the [Code of Conduct](CODE_OF_CONDUCT.md).
27
27
28
28
## Adding an entry
29
29
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.
32
32
33
33
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.
34
34
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
49
49
-`attribution_string`: the copy-paste credit line. Required when `attribution_required` is `true`; optional otherwise.
50
50
-`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.
51
51
-`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.
53
53
-`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.
54
54
- 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.
55
55
-`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
58
58
-`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.
59
59
- 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)).
60
60
-`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.
61
62
-`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.
62
63
-`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).
63
64
@@ -73,6 +74,13 @@ To add a starter stack (one pick per need for a kind of game), follow [`stacks/R
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
+
76
84
## Submitting your own source
77
85
78
86
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.
- 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
0 commit comments