Skip to content

Commit a03b434

Browse files
TMHSDigitalclaude
andcommitted
Make the exports discoverable: docs/data.md, README section, footer links
- docs/data.md: the five files and what each is, pinning by release tag, a field table, jq and pandas examples, and how to cite (CITATION.cff, APA-style line and BibTeX) - README gains a "Use the data" section and contents link; its guides table now lists docs/data.md and docs/unreal.md, matching the homepage - catalog.csv appends subcategories, publisher and attribution_string, so the credit line reaches spreadsheets without moving existing columns - Every page footer links data.json, the CSV, the feed and the guide - site/README documents licenseFamily, stats and filters Closes #142 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
1 parent 107b50c commit a03b434

11 files changed

Lines changed: 127 additions & 7 deletions

File tree

‎README.md‎

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ re-check forty tabs before a release. (Thanks to magictools: many tool entries s
5555
5656
## Contents
5757

58-
[Start here](#start-here) · [Starter stacks](#starter-stacks) · [Browse the catalog](#browse-the-catalog) · [Reading an entry](#reading-an-entry) · [Safe starting points](#safe-starting-points) · [Licences](#licences) · [Godot](#godot) · [Unreal Engine](#unreal-engine) · [How the catalog stays honest](#how-the-catalog-stays-honest) · [Scope](#scope) · [Contributing](#contributing) · [Support](#support)
58+
[Start here](#start-here) · [Starter stacks](#starter-stacks) · [Browse the catalog](#browse-the-catalog) · [Reading an entry](#reading-an-entry) · [Safe starting points](#safe-starting-points) · [Licences](#licences) · [Godot](#godot) · [Unreal Engine](#unreal-engine) · [How the catalog stays honest](#how-the-catalog-stays-honest) · [Use the data](#use-the-data) · [Scope](#scope) · [Contributing](#contributing) · [Support](#support)
5959

6060
## A few of the sources
6161

@@ -250,10 +250,12 @@ Read these before you mix packs into a commercial build.
250250
| [`docs/fonts.md`](docs/fonts.md) | Embedding versus redistribution, and what an OFL font still owes |
251251
| [`docs/geodata.md`](docs/geodata.md) | Attribution across DEM, map and satellite sources, and why ODbL does not reach your game |
252252
| [`docs/game-vs-video-licensing.md`](docs/game-vs-video-licensing.md) | Why "commercial use" on a video licence may not cover a game |
253+
| [`docs/unreal.md`](docs/unreal.md) | Fab and Epic content, UE-only licences, and what the Unreal EULA forbids combining |
253254
| [`docs/provenance.md`](docs/provenance.md) | Judging a supplier, and keeping a paper trail |
254255
| [`docs/high-risk.md`](docs/high-risk.md) | Sources to avoid entirely |
255256
| [`docs/ai-assets.md`](docs/ai-assets.md) | AI-generated assets |
256257
| [`docs/fivem.md`](docs/fivem.md) | GTA-format and FiveM assets |
258+
| [`docs/data.md`](docs/data.md) | The JSON, CSV and feed exports, their fields, and how to cite the catalog |
257259
| [`docs/trust-score.md`](docs/trust-score.md) | Review rubric used when vetting a source (not shown on entries) |
258260

259261
<details>
@@ -311,6 +313,17 @@ The checks themselves are tested against known-bad fixtures in
311313
[`site/checks.test.mjs`](site/checks.test.mjs). Every review pass, and every correction it
312314
made, is recorded in [`docs/review-ledger.md`](docs/review-ledger.md).
313315

316+
## Use the data
317+
318+
The whole catalog is published as open data (CC0) on every deploy:
319+
[`data.json`](https://tmhsdigital.github.io/Free-Game-Dev-Assets/data.json),
320+
[`catalog.csv`](https://tmhsdigital.github.io/Free-Game-Dev-Assets/catalog.csv) with the credit
321+
line for each entry, an Atom [feed of new sources](https://tmhsdigital.github.io/Free-Game-Dev-Assets/feed.xml),
322+
a [feed of re-verified licences](https://tmhsdigital.github.io/Free-Game-Dev-Assets/reverified.xml) and
323+
[`llms.txt`](https://tmhsdigital.github.io/Free-Game-Dev-Assets/llms.txt). Pin a version from
324+
[Releases](https://github.com/TMHSDigital/Free-Game-Dev-Assets/releases). [`docs/data.md`](docs/data.md)
325+
has the field reference, `jq` and pandas examples, and how to cite it (`CITATION.cff`).
326+
314327
## Scope
315328

316329
| In scope | Out of scope |

‎docs/data.md‎

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
# Use the data
2+
3+
The catalog is published as machine-readable files on every deploy. The metadata is CC0: copy it, bundle it or build on it without asking. The assets it links to keep their own licences.
4+
5+
> The licence facts are the catalog's reading of each source on the entry's `verified` date, not legal advice and not a guarantee that the terms are still the same. Re-check the source before you ship on one.
6+
7+
## Files
8+
9+
| File | What it is |
10+
| --- | --- |
11+
| [`data.json`](https://tmhsdigital.github.io/Free-Game-Dev-Assets/data.json) | The whole catalog: every entry with its licence fields, plus categories, guides and counts |
12+
| [`catalog.csv`](https://tmhsdigital.github.io/Free-Game-Dev-Assets/catalog.csv) | One row per entry, for spreadsheets. Lists are joined with `; ` |
13+
| [`feed.xml`](https://tmhsdigital.github.io/Free-Game-Dev-Assets/feed.xml) | Atom feed of newly added sources |
14+
| [`reverified.xml`](https://tmhsdigital.github.io/Free-Game-Dev-Assets/reverified.xml) | Atom feed of entries whose licence was most recently re-read |
15+
| [`llms.txt`](https://tmhsdigital.github.io/Free-Game-Dev-Assets/llms.txt) | A plain-text summary for language-model tools |
16+
17+
These URLs always serve the latest build. To pin a version, download the same files from a tagged [release](https://github.com/TMHSDigital/Free-Game-Dev-Assets/releases). Releases are tagged `vYYYY.MM.DD`, and the attached `data.json` carries the same string as `version`.
18+
19+
## Fields
20+
21+
Each entry in `data.json` has these fields. `catalog.csv` has the ones marked CSV.
22+
23+
| Field | CSV | Meaning |
24+
| --- | --- | --- |
25+
| `id` | yes | Short kebab-case id, unique across the catalog |
26+
| `name` | yes | Display name |
27+
| `url` | yes | The source's own page |
28+
| `category` | yes | One of the ten category folders, such as `3d`, `audio` or `tools` |
29+
| `subcategories` | yes | Finer grouping within the category |
30+
| `license` | yes | The licence as the catalog reads it. A value from [the vocabulary](../site/license-vocabulary.json), explained in [licenses.md](licenses.md) |
31+
| `license_spdx` | yes | SPDX identifier, where one fits |
32+
| `commercial` | yes | `true`, `false`, `varies` (per file) or `unknown` |
33+
| `attribution_required` | yes | `true`, `false` or `unknown` |
34+
| `attribution_string` | yes | The credit line as the source words it, where it gives one |
35+
| `publisher` | yes | Who publishes the source, where recorded |
36+
| `formats`, `tags` | yes | File formats and search tags |
37+
| `added` | yes | Date the entry joined the catalog |
38+
| `verified` | yes | Date the licence was last read at the source. A read date, not a validity date |
39+
| `status` | yes | `active`, `needs-review` (an open question, read the Notes) or `deprecated` |
40+
| `page` | yes | The entry's page on the site |
41+
| `summary` | | The first paragraph of the entry |
42+
| `path` | | The entry's file in this repository |
43+
| `thumb` | | `{ path, width, height, credit? }` of the preview image, or `null` |
44+
| `licenseFamily` | | Coarse grouping used by the site's filter: `public-domain`, `cc-by`, `permissive`, `copyleft`, `custom` and so on. Labels are in `filters.licenseFamilies` |
45+
| `attributionClass`, `licenseRank` | | Derived sort keys used by the site |
46+
| `engine_lock`, `grid_dimensions`, `camera_perspective` and other optional fields | | Present only where they apply; see [the site README](../site/README.md) |
47+
48+
Top-level keys are `generatedAt`, `version`, `site`, `categories`, `guides`, `featured`, `stats` (counts of total, active, needs-review, deprecated and commercial entries), `filters` and `entries`.
49+
50+
Field names are stable. New optional fields may appear, so ignore keys you do not know rather than failing on them.
51+
52+
## Examples
53+
54+
All CC0 audio that needs no credit, with `jq`:
55+
56+
```sh
57+
curl -s https://tmhsdigital.github.io/Free-Game-Dev-Assets/data.json \
58+
| jq -r '.entries[] | select(.category=="audio" and .license=="CC0" and .attribution_required==false and .status=="active") | "\(.name)\t\(.url)"'
59+
```
60+
61+
Everything usable commercially, as a table, with pandas:
62+
63+
```python
64+
import pandas as pd
65+
df = pd.read_csv("https://tmhsdigital.github.io/Free-Game-Dev-Assets/catalog.csv")
66+
ok = df[(df.status == "active") & (df.commercial.astype(str).str.lower() == "true")]
67+
print(ok[["name", "license", "attribution_required", "attribution_string", "url"]])
68+
```
69+
70+
Follow new sources in any feed reader by subscribing to `https://tmhsdigital.github.io/Free-Game-Dev-Assets/feed.xml`.
71+
72+
## How to cite
73+
74+
The repository has a [`CITATION.cff`](../CITATION.cff), and GitHub's "Cite this repository" button renders it. In text:
75+
76+
> TMHSDigital. *Free Game Dev Assets: a dated, sourced catalog of free game assets and tools with licence metadata* (version vYYYY.MM.DD) [Data set]. https://github.com/TMHSDigital/Free-Game-Dev-Assets
77+
78+
```bibtex
79+
@misc{free_game_dev_assets,
80+
author = {TMHSDigital},
81+
title = {Free Game Dev Assets: a dated, sourced catalog of free game assets and tools with licence metadata},
82+
howpublished = {\url{https://github.com/TMHSDigital/Free-Game-Dev-Assets}},
83+
note = {Dataset, version vYYYY.MM.DD},
84+
license = {CC0-1.0}
85+
}
86+
```
87+
88+
Replace `vYYYY.MM.DD` with the release you used.

‎site/README.md‎

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,14 +37,18 @@ and tools that want the metadata without scraping the page. The page itself load
3737
`data.js`, the same payload assigned to `window.__CATALOG__`.
3838

3939
- Top-level keys: `generatedAt`, `version` (the calendar tag of the day, `vYYYY.MM.DD`),
40-
`site`, `categories`, `guides`, `featured`, `stats`, `entries`.
40+
`site`, `categories`, `guides`, `featured`, `stats` (counts: `total`, `active`,
41+
`needsReview`, `deprecated`, `commercialOk`, `commercialVaries`, `categories`), `filters`
42+
(labels for the site's filter values, such as `licenseFamilies`) and `entries`.
43+
The reader-facing guide to the exports is [`docs/data.md`](../docs/data.md).
4144
- Each entry carries its frontmatter fields (`id`, `name`, `url`, `category`,
4245
`subcategories`, `license`, `license_spdx` where set, `commercial`,
4346
`attribution_required`, `attribution_string` where set, `formats`, `tags`, `added`,
4447
`verified`, `status`, `publisher` where set, and the optional 2D fields), plus `path` (the entry's
4548
file in this repo), `page` (the entry's page, relative to the site root), `summary` (the first paragraph of its body), `thumb`
46-
(`{ path, width, height, credit? }` of the entry's preview image relative to the site root, with `credit` on CC-BY images, or `null`), and two derived sort
47-
fields, `attributionClass` and `licenseRank`.
49+
(`{ path, width, height, credit? }` of the entry's preview image relative to the site root, with `credit` on CC-BY images, or `null`), `licenseFamily` (the
50+
coarse licence group the site filters on), and two derived sort fields, `attributionClass`
51+
and `licenseRank`.
4852
- It is regenerated from `catalog/` on every push to `main`. Field names are stable;
4953
new optional fields may appear. The licence facts are only as current as each entry's
5054
`verified` date: re-check the source before you ship on one.

‎site/config.json‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
],
4343
"guides": [
4444
{ "id": "licenses", "title": "Licenses", "path": "docs/licenses.md" },
45+
{ "id": "data", "title": "Use the data (JSON, CSV, feeds)", "path": "docs/data.md" },
4546
{ "id": "provenance", "title": "Provenance", "path": "docs/provenance.md" },
4647
{ "id": "high-risk", "title": "High risk", "path": "docs/high-risk.md" },
4748
{ "id": "ai-assets", "title": "AI assets", "path": "docs/ai-assets.md" },

‎site/lib/category-page.mjs‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ ${grid}
5454
<footer class="footer">
5555
<p>Catalog metadata is CC0. Linked assets keep their own licences. This is the catalog's reading of each licence, not legal advice: re-check the live source before shipping.</p>
5656
<p class="footer-credit">${PREVIEW_CREDIT_LINE}</p>
57-
<p><a href="../../freshness/">Licence freshness</a></p>
57+
<p><a href="../../freshness/">Licence freshness</a> · <a href="../../data.json">data.json</a> · <a href="../../catalog.csv">CSV</a> · <a href="../../feed.xml">feed</a> · <a href="https://github.com/TMHSDigital/Free-Game-Dev-Assets/blob/main/docs/data.md">Use the data</a></p>
5858
<p class="footer-sponsor">${sponsorButtonHtml()}</p>
5959
<p class="footer-stamp">Built ${esc(stamp)} from ${total} catalog entries.</p>
6060
</footer>

‎site/lib/entry-page.mjs‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ export function entryPageHtml({ entry, leadHtml, restHtml, deprecatedReasonHtml,
167167
<footer class="footer">
168168
<p>Catalog metadata is CC0. Linked assets keep their own licences. This is the catalog's reading of each licence, not legal advice: re-check the live source before shipping.</p>
169169
<p class="footer-credit">${PREVIEW_CREDIT_LINE}</p>
170-
<p><a href="../../freshness/">Licence freshness</a></p>
170+
<p><a href="../../freshness/">Licence freshness</a> · <a href="../../data.json">data.json</a> · <a href="../../catalog.csv">CSV</a> · <a href="../../feed.xml">feed</a> · <a href="https://github.com/TMHSDigital/Free-Game-Dev-Assets/blob/main/docs/data.md">Use the data</a></p>
171171
<p class="footer-sponsor">${sponsorButtonHtml()}</p>
172172
<p class="footer-stamp">Built ${esc(stamp)} from ${total} catalog entries.</p>
173173
</footer>

‎site/lib/exports.mjs‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,10 @@ const CSV_COLUMNS = [
4141
"verified",
4242
"status",
4343
"page",
44+
// Appended, not inserted, so a reader that indexes columns keeps working.
45+
"subcategories",
46+
"publisher",
47+
"attribution_string",
4448
];
4549

4650
/**

‎site/lib/freshness.mjs‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,7 @@ export function freshnessPageHtml({ stats, site, stamp, total, hasCard }) {
137137
</main>
138138
<footer class="footer">
139139
<p>Catalog metadata is CC0. Linked assets keep their own licences. This is the catalog's reading of each licence, not legal advice: re-check the live source before shipping.</p>
140+
<p><a href="../data.json">data.json</a> · <a href="../catalog.csv">CSV</a> · <a href="../feed.xml">feed</a> · <a href="https://github.com/TMHSDigital/Free-Game-Dev-Assets/blob/main/docs/data.md">Use the data</a></p>
140141
<p class="footer-sponsor">${sponsorButtonHtml()}</p>
141142
<p class="footer-stamp">Built ${esc(stamp)} from ${total} catalog entries.</p>
142143
</footer>

‎site/lib/lib.test.mjs‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -655,6 +655,7 @@ has("csv header", csv, "id,name,url,category");
655655
has("csv has the added column before verified", csv, "tags,added,verified,status");
656656
has("csv quotes commas and quotes", csv, '"Say ""hi"", ok"');
657657
has("csv joins lists", csv, "PNG; SVG");
658+
has("csv ends with the credit columns", csv, "status,page,subcategories,publisher,attribution_string\r\n");
658659
has("csv absolute page url", csv, "https://s.test/site/entry/a/");
659660
const feed = atomFeed({ entries: sample, site: { title: "T", tagline: "t", siteUrl: "https://s.test/site/" }, generatedAt: "2026-10-01T00:00:00.000Z", kind: "verified" });
660661
has("feed escapes summary", feed, "CC0. A &amp; B");

‎site/lib/stack-page.mjs‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ export function stackPageHtml({ stack, sections, gapsHtml, leadHtml, owed, site,
151151
<footer class="footer">
152152
<p>Catalog metadata is CC0. Linked assets keep their own licences. This is the catalog's reading of each licence, not legal advice: re-check the live source before shipping.</p>
153153
<p class="footer-credit">${PREVIEW_CREDIT_LINE}</p>
154-
<p><a href="../../freshness/">Licence freshness</a></p>
154+
<p><a href="../../freshness/">Licence freshness</a> · <a href="../../data.json">data.json</a> · <a href="../../catalog.csv">CSV</a> · <a href="../../feed.xml">feed</a> · <a href="https://github.com/TMHSDigital/Free-Game-Dev-Assets/blob/main/docs/data.md">Use the data</a></p>
155155
<p class="footer-sponsor">${sponsorButtonHtml()}</p>
156156
<p class="footer-stamp">Built ${esc(stamp)} from ${total} catalog entries.</p>
157157
</footer>

0 commit comments

Comments
 (0)