Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/PULL_REQUEST_TEMPLATE.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,4 @@
- [ ] Row added to the category `README.md`, with the same licence as the frontmatter
- [ ] Ran `node site/sync-counts.mjs` after adding or removing entries
- [ ] Stacks: followed `stacks/README.md`; no licence named in a stack's own words
- [ ] `npm run check` passes (tests, `node site/validate.mjs`, `node site/build.mjs`)
- [ ] `npm test && npm run validate` passes locally (CI runs the full `npm run check`, including the build)
14 changes: 10 additions & 4 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,18 @@ Please follow the [Code of Conduct](CODE_OF_CONDUCT.md).
- Free engine add-ons / plugins that materially help asset or production pipelines (e.g. Godot Asset Library tools)
- Engines only when they ship substantial free asset libraries

## Accepted with caveats

- A source whose licence is unclear: add it as `status: needs-review` with the open question in
Notes, or open an issue instead.
- A source that is free only for non-commercial or personal use: only if it is clearly marked
`commercial: false`.

## What does not

- Paid-only marketplaces with no free content worth listing
- Broken, abandoned, or license-unclear sources (use `status: needs-review` or open an issue)
- Broken or abandoned sources
- Redistributed ZIP/GLB/WAV files of third-party work
- Assets that are free only for non-commercial / personal use (unless clearly tagged `commercial: false`)
- GTA V / RDR2 extracts, FiveM MLO leaks, Tebex reuploads, and anonymous `fivem-props` dumps (see [`docs/fivem.md`](docs/fivem.md) and [`docs/high-risk.md`](docs/high-risk.md))

## Adding an entry
Expand All @@ -26,10 +32,10 @@ are no dependencies to install.

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.
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.
3. Write the body: a one-paragraph summary, `## Notes`, and `## Evidence` with a dated line quoting the source, such as `- Live page (2026-09-25): "Free for commercial use"`. Every Evidence section needs at least one date, and `verified` may not be newer than the newest one. The scaffold starts at `status: needs-review`; set `active` once the licence, the commercial stance and the credit requirement are all settled.
3. Write the body: a one-paragraph summary, `## Notes`, `## Evidence` with a dated line quoting the source, such as `- Live page (2026-09-25): "Free for commercial use"`, and optionally `## Related` linking sibling entries. Every Evidence section needs at least one date, and `verified` may not be newer than the newest one. The template (and so the scaffold) starts at `status: needs-review`; set `active` once the licence, the commercial stance and the credit requirement are all settled.
4. Add a row to the matching category `README.md`. This is required: the validator fails an entry that is not listed there, and the row's licence cell must match your frontmatter.
5. Run `node site/sync-counts.mjs` (`npm run counts`). It updates every place the repo restates the entry count: both category count tables, the README badge and "Browse N sources" line, and `expectedEntryCount` in [`site/config.json`](site/config.json).
6. Run `npm run check`: the check tests, `node site/validate.mjs` and `node site/build.mjs`, all of which must pass. The build renders your entry's page and fails if the body uses markdown the site does not support (tables, code fences, blockquotes, images, raw HTML, `###` headings, numbered lists) or links to a file that does not exist.
6. Run `npm test && npm run validate` before you push; that is quick. CI then runs `npm run check` (the tests, `node site/validate.mjs` and `node site/build.mjs`), and all of it must pass. Run `npm run check` yourself if you changed the site or want to preview your entry's page. The build renders your entry's page and fails if the body uses markdown the site does not support (tables, code fences, blockquotes, images, raw HTML, `###` headings, numbered lists) or links to a file that does not exist.
7. Optional: add the `id` to `site/config.json` → `featured` to pin it under Safe starting points.

To add a starter stack (one pick per need for a kind of game), follow [`stacks/README.md`](stacks/README.md).
Expand Down
24 changes: 19 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,15 @@ Each entry records the licence as its source states it and the date someone read
active entries quote the source's own words. The catalog indexes sources and never rehosts
them: check the source before you ship.

Big lists such as [magictools](https://github.com/ellisonleao/magictools) and
[awesome-gamedev](https://github.com/Calinou/awesome-gamedev) tell you something is free. This one
tells you what the licence says, where it says it, and when it was last read, so you don't have to
re-check forty tabs before a release. (Thanks to magictools: many tool entries started from its list.)

> [!NOTE]
> This is the catalog's reading of each licence, not legal advice. Licences change: read the
> source's own terms before you ship.

<table>
<tr>
<td width="33%" valign="top">
Expand All @@ -40,7 +49,8 @@ them: check the source before you ship.
</tr>
</table>

> **Recent:** 2026-09-30, 42 more sources, mostly pipeline, pixel-art and chiptune tools.
> **Recent:** 2026-10-04, 15 more video, animation and environment sources.
> 2026-09-30, 42 more sources, mostly pipeline, pixel-art and chiptune tools.
> 2026-09-25, starter stacks and a licence freshness page.

## Contents
Expand Down Expand Up @@ -243,7 +253,7 @@ Read these before you mix packs into a commercial build.
| [`docs/high-risk.md`](docs/high-risk.md) | Sources to avoid entirely |
| [`docs/ai-assets.md`](docs/ai-assets.md) | AI-generated assets |
| [`docs/fivem.md`](docs/fivem.md) | GTA-format and FiveM assets |
| [`docs/trust-score.md`](docs/trust-score.md) | How sources are rated |
| [`docs/trust-score.md`](docs/trust-score.md) | Review rubric used when vetting a source (not shown on entries) |

<details>
<summary>The short version</summary>
Expand Down Expand Up @@ -304,9 +314,11 @@ When a source does not say plainly, the entry says `unknown` and `needs-review`

New sources, licence corrections, dead links and clearer notes are all welcome.

1. Start an entry with `npm run new-entry -- <category> <id>`, or copy [`catalog/TEMPLATE.md`](catalog/TEMPLATE.md).
1. Start an entry with `npm run new-entry -- <category> <id>`. It copies the template, sets the
id and date, and starts the entry as `needs-review`.
2. Read the licence at the source and quote it, with the date, in the entry's Evidence section.
3. Run `npm run check`, then open a pull request.
3. Add a row for it to the category's `README.md`, then run `npm run counts` to update every count.
4. Run `npm test && npm run validate` (quick), then open a pull request. CI also runs the full build.

[`CONTRIBUTING.md`](CONTRIBUTING.md) has the full checklist and how to verify a licence.
Please follow the [Code of Conduct](CODE_OF_CONDUCT.md).
Expand Down Expand Up @@ -343,7 +355,9 @@ npm run serve # preview at http://localhost:3000
├── docs/
│ ├── licenses.md fonts.md geodata.md game-vs-video-licensing.md
│ ├── provenance.md high-risk.md ai-assets.md fivem.md trust-score.md
│ ├── godot-budget-stack.md research-index.md
│ ├── godot-budget-stack.md
│ ├── research-index.md maintainer notes on local research drafts
│ ├── design/ design specs behind the entry pages, stacks and freshness page
│ ├── review-ledger.md every review pass and what it changed
│ └── images/readme/ publisher stills used in this README
├── stacks/ starter stacks: one pick per need for a kind of game
Expand Down
13 changes: 9 additions & 4 deletions ROADMAP.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,9 @@ missing entry, so freshness and accuracy come before volume.

## Open to contributors

- **Thin categories:** video (8 entries), animation (12) and environment (13). See
[CONTRIBUTING.md](CONTRIBUTING.md) and the "new source" issue form.
- **Thin categories:** video, animation and environment are still the smallest (counts in the
[category table](catalog/README.md)). See [CONTRIBUTING.md](CONTRIBUTING.md) and the "new
source" issue form.
- **Optional fields:** `camera_perspective` and `grid_dimensions` on 2D entries
([#41](https://github.com/TMHSDigital/Free-Game-Dev-Assets/issues/41)). Small, well-scoped, a
good first PR.
Expand All @@ -20,10 +21,14 @@ missing entry, so freshness and accuracy come before volume.
- Re-verification in smaller, regular batches, so the July 2026 verifications do not all expire
together in mid-2027.
- A changelog page generated from [docs/review-ledger.md](docs/review-ledger.md).
- Client-side search over the catalog, not only filters.
- An accessibility pass over the site.
- Full-text search over entry bodies (Notes and Evidence), not only names, tags and summaries.

## Done

- Site search across names, tags and summaries, with licence, format and category filters.
- Accessibility fixes: focus handling, contrast, heading outline and tap targets (Lighthouse
accessibility 100).
- Thin categories topped up: 15 video, animation and environment sources (2026-10-04).

- Machine-readable exports: `data.json`, `catalog.csv` and an Atom feed (`feed.xml`) of recently
verified entries.
2 changes: 1 addition & 1 deletion catalog/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ One markdown file per source under a category folder. Copy [`TEMPLATE.md`](TEMPL
| Animation | 17 | [`animation/`](animation/) | MoCap, character clips |
| Video | 13 | [`video/`](video/) | Stock footage, archival clips |

Guides: [`docs/licenses.md`](../docs/licenses.md) · [`docs/provenance.md`](../docs/provenance.md) · [`docs/high-risk.md`](../docs/high-risk.md) · [`docs/fivem.md`](../docs/fivem.md) · [`docs/ai-assets.md`](../docs/ai-assets.md) · [`docs/trust-score.md`](../docs/trust-score.md) · [`docs/fonts.md`](../docs/fonts.md) · [`docs/geodata.md`](../docs/geodata.md) · [`docs/game-vs-video-licensing.md`](../docs/game-vs-video-licensing.md) · [`docs/godot-budget-stack.md`](../docs/godot-budget-stack.md) · [`docs/research-index.md`](../docs/research-index.md)
Guides: [`docs/licenses.md`](../docs/licenses.md) · [`docs/provenance.md`](../docs/provenance.md) · [`docs/high-risk.md`](../docs/high-risk.md) · [`docs/fivem.md`](../docs/fivem.md) · [`docs/ai-assets.md`](../docs/ai-assets.md) · [`docs/trust-score.md`](../docs/trust-score.md) · [`docs/fonts.md`](../docs/fonts.md) · [`docs/geodata.md`](../docs/geodata.md) · [`docs/game-vs-video-licensing.md`](../docs/game-vs-video-licensing.md) · [`docs/godot-budget-stack.md`](../docs/godot-budget-stack.md)

**Which category.** File a source under the kind of content it mainly gives you.
Software that exists to make one kind of content lives with that content, next to the
Expand Down
4 changes: 2 additions & 2 deletions catalog/TEMPLATE.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@ attribution_required: false
formats: [glTF, FBX, PNG]
# subcategories and formats spelling: see CONTRIBUTING.md (formats must be in site/format-vocabulary.json)
tags: [low-poly, modular] # describe the content; never the licence or the publisher (V19, V21)
verified: 2026-07-19
status: active
verified: 2026-07-19 # the day you read the licence at the source
status: needs-review # set active once the licence is read and quoted in ## Evidence
# Optional (omit if N/A):
# publisher: Kenney # rights holder when that publisher has more than one entry; not a generic host
# attribution_string: "Credit line" # required when attribution_required is true
Expand Down
2 changes: 1 addition & 1 deletion catalog/tools/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -223,4 +223,4 @@ Software only. Not a GTA V asset grant. See [`docs/fivem.md`](../../docs/fivem.m
| --- | --- | --- | --- |
| [sollumz](sollumz.md) | Sollumz | GPL-3.0-or-later | active |

See: [`docs/godot-budget-stack.md`](../../docs/godot-budget-stack.md) · [`docs/ai-assets.md`](../../docs/ai-assets.md) · [`docs/fivem.md`](../../docs/fivem.md) · [`docs/research-index.md`](../../docs/research-index.md).
See: [`docs/godot-budget-stack.md`](../../docs/godot-budget-stack.md) · [`docs/ai-assets.md`](../../docs/ai-assets.md) · [`docs/fivem.md`](../../docs/fivem.md).
2 changes: 2 additions & 0 deletions docs/licenses.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
# License cheat sheet

> This is the catalog's reading of each licence, not legal advice. Licences change: read the source's own terms before you ship.

Quick reference for assets you might list or use. **Always re-check the source page** — licenses change, packs can be dual-licensed, and marketplace “free” tiers often have extra terms.

## Creative Commons & public domain
Expand Down
19 changes: 16 additions & 3 deletions docs/review-ledger.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,19 @@ Newest section at the top. One section per review run. This is the record of wha
run measured, what it changed, what it deliberately did not change, and what the next
run should not spend time re-deciding.

## 2026-10-04 (repo review, #59-#75)

A whole-repo review (code, docs, live site) filed #59-#75. This run fixed the code and doc items. No entry's licence data changed.

- **Exports:** feed.xml gets a feed-level `<author>` (#59). catalog.csv puts an apostrophe before cells starting `= + - @`, tab or CR (#62).
- **Build robustness:** `LINK_RE` is now shared by markdown.mjs and llms.mjs, so balanced-paren hrefs read the same in both (#60). renderInline strips NUL before using it as the slot marker. The validator rejects C0 control characters (#61).
- **One entry walker:** `site/lib/entry-files.mjs` is used by build, validate, sync-counts and check-links; hidden and `_scratch` folders are skipped everywhere. The validator enforces kebab-case ids (#64).
- **Link check:** the pure parts moved to `site/lib/link-check.mjs`, with tests. Multi-part suffixes (`co.uk`, `github.io`, ...) are handled, and report URLs are inert code spans. V16 rejects localhost, `.local` and IP-literal URLs (#65).
- **Client:** lookup maps have no prototype. The shortlist export normalises the trailing slash (#66). The shortlist button's accessible name starts with its visible text (#63).
- **Docs:** "not legal advice" in the README, licences guide, every page footer and the CREDITS export (#68). README positioning against magictools and awesome-gamedev, with credit (#71). ROADMAP made count-free (#69). Contributor steps aligned; TEMPLATE starts `needs-review` (#70). Specs moved to `docs/design/`. research-index taken out of the user guides, and trust-score relabelled as a rubric (#73).
- **SEO:** homepage WebSite + Dataset JSON-LD (#74).
- **Not changed, deliberately:** homepage weight (#75) needs a decision about pre-rendering every row versus slimming data.js. The Code of Conduct contact (#72) needs a private address from the maintainer. Client-side JS still has no tests (#67, partly done).

## 2026-09-30 (magictools import)

Candidates were taken from the awesome list ellisonleao/magictools: every non-paid item in every section. Its emoji licence legend was not trusted. Each source was re-read at its own licence page, repo or bundled licence file on 2026-09-30. The catalog went from 334 to 376 entries.
Expand Down Expand Up @@ -195,7 +208,7 @@ in conversation (no spec).
## 2026-09-25 (licence freshness)

Sub-project C from the site brainstorm, built from
`docs/superpowers/specs/2026-09-25-licence-freshness-design.md` in five commits
`docs/design/2026-09-25-licence-freshness-design.md` in five commits
(`241af04`..`749860a`). No catalog entry changed and no `verified` moved.

- **What shipped.** A line under the homepage hero, "Checked within 180 days: 317 of
Expand Down Expand Up @@ -253,7 +266,7 @@ from the entry pages and starter stacks reviews, each fix with a test that faile
## 2026-09-25 (starter stacks)

Sub-project A from the site brainstorm, built from
`docs/superpowers/specs/2026-09-24-starter-stacks-design.md` in seven commits
`docs/design/2026-09-24-starter-stacks-design.md` in seven commits
(`10151a9`..`3724fbb`). No catalog entry changed and no `verified` moved.

- **What shipped.** Five stacks in `stacks/`, one per task test: 2D pixel platformer,
Expand Down Expand Up @@ -292,7 +305,7 @@ Sub-project A from the site brainstorm, built from
## 2026-09-24 (entry pages)

Sub-project B from the site brainstorm, built from
`docs/superpowers/specs/2026-09-24-entry-pages-design.md` in eleven commits
`docs/design/2026-09-24-entry-pages-design.md` in eleven commits
(`fee59c1`..`a5403a4`). No catalog entry changed and no `verified` moved.

- **What shipped.** Every entry has a page at `/entry/<id>/` with its full body, a facts
Expand Down
Loading
Loading