A category catalog is the smallest useful product on top of PWARegistry.
Flow:
- Fetch games that are ACTIVE.
- For each listing, render name, icon, description.
- On mobile, show narrow screenshots. On desktop, show wide screenshots.
Fetch
const listing = await fetch(
"https://pwaregistry.org/api/v1/apps?category=games&status=active",
).then((r) => r.json());
Static equivalent: GET /registry/v1/categories/games.json.
Both return lightweight rows (id, name, domain, …). Load the full record when you render a detail page or a rich card:
async function loadGame(id) {
return fetch(
`https://pwaregistry.org/registry/v1/apps/${id}.json`,
).then((r) => r.json());
}
const game = await loadGame("example.com");
const name = game.application.name;
const icon = game.application.icons.primary?.src;
const description = game.application.description;
const shots = isMobile
? game.application.screenshots.narrow
: game.application.screenshots.wide;
Replace games with any category from /registry/v1/categories.json: photo, productivity, utilities, and the rest of the W3C / MDN list.
If you later outgrow one-shot API calls, switch the same UI to the sync pattern. The card component does not change — only where the JSON comes from.