GameWeb

browser gaming portal

GameWeb — Browser Gaming Platform

A browser gaming portal whose ETL merges two game feeds idempotently into one schema.

role
full-stack developer
status
● live demo
scale
3,000+ games ingested
stack
Next.js 15 · Supabase · PostgreSQL · TypeScript
type
personal · open source

FIG.01 // GAMEWEB · INGESTION

Two catalogues, one schema

Two feeds that disagree on shape become one internal record. The write is an upsert and normalisation is enforced by triggers, so the pipeline survives its second and third run.

Two catalogues, one schemaFEED · GAMEPIXcategories: arrayFEED · GAMEMONETIZEcomma string"a, b, c"01 · TRANSLATEone internal shapesplit · trim02 · UPSERTonConflict: play_urlRUN TWICE = SAME ROWS03 · BEFORE TRIGGERlowercase arrayscategories + tags04 · TABLEgames05 · AFTER TRIGGERfan outinsert_categories_and_tags06 · LOOKUPScategories / tagsON CONFLICT DO NOTHINGre-import updatesexisting rowstwo feeds spelling a tag differently collapse at the table, not in whichever code path inserted them

A browser gaming portal on Next.js 15 and Supabase whose ETL pipeline bulk-ingested 3,000+ games from two external feeds, removing roughly ninety per cent of the per-title data entry that adding a game used to require. GamePix returns categories as an array and GameMonetize as a comma-separated string, so a translator emits one internal shape either way. The batch write is an upsert on play_url, so running the same import twice updates the existing rows instead of duplicating the catalogue. A BEFORE trigger lowercases every category and tag on write, and an AFTER trigger fans them out into lookup tables with ON CONFLICT DO NOTHING, so two feeds spelling a tag differently collapse at the table.

screens