← All Projects

Pixelscry

A free, ad-light video game database with live Steam pricing and curated Best-Of rankings.

SvelteKit Prisma SQLite RAWG API Steam API Tailwind CSS
Pixelscry screenshot

A free, ad-light place to find games worth playing. Pixelscry lets you search and browse by genre, platform, rating, tag, and release year, with curated "Best Of" rankings, live Steam pricing and player counts, Wikipedia context, and buy links. The data source was a deliberate choice. RAWG's free tier explicitly allows commercial use, which IGDB's does not, so RAWG became the backbone and everything else is layered on top of it.

Built on SvelteKit and Svelte with full server-side rendering. Every filterable or searchable view is a real URL, such as ?genre=rpg&platform=pc or /search?q=..., rather than client-only state. Styling is Tailwind CSS, and the app runs as a Node server. RAWG is the primary source, but a local SQLite database, accessed through Prisma and the libSQL adapter, is the source of truth for what the site renders. A game page is served straight from that cache when it is fresh. On a miss or a stale entry, RAWG is queried live and the result is cached. Caching a game also enriches it with a matched Steam app (price, DLC count, system requirements, review score) and a Wikipedia summary, and neither is fatal if it fails. Every other page type queries only the local cache, so genre, platform, and tag pages and the ranked lists never call RAWG and are unaffected by it being slow or down. The homepage and search do call RAWG live to cover its full catalog of 900,000+ games, but fall back to the cache on a timeout and show a banner saying so. The fields listings need are denormalized into real columns, including a precomputed and indexed "best of" score, so rankings are sorted and limited in SQL instead of in JavaScript. Search understands a small query syntax such as genre:rpg platform:pc rating>80, and any HTML coming from outside sources is passed through an allowlist sanitizer before it reaches the page.

Most of the work was making a third-party API behave. RAWG sometimes lists the same real-world release under two different IDs, so a runtime de-duplication pass cleans every live result list, backed by a one-off script that cleaned up the local cache. Sorting its catalog by release date surfaced spam entries with fabricated future dates, so the "New Releases" strip uses a recent-date window ranked by popularity instead. eBay's search has no video-game scoping by default, so an ambiguous title like "Replaced" returned unrelated products. Restricting both the live-listings call and the plain search link to eBay's Video Games category fixed it. Resilience was the design goal that shaped the rest. Because the local cache answers almost everything, a RAWG outage degrades the site gracefully instead of breaking it, and the pages get better as the cache grows from real traffic. The same thinking drove the rule that new browse pages belong on the local-cache side of the line, never on a new live query.

Visit Site