Case Study · No. 01
LottoNatin
Live PCSO lottery results, an AI ticket scanner, and a system that posts results to Facebook the moment they land, on its own.
The situation
PCSO publishes lottery results, but checking them means hunting across scattered official pages, one game at a time. There was no single place to see every draw, no history to check back against, and no easy way to verify a physical ticket beyond reading the numbers off it by hand.
What I built
A site that tracks every PCSO draw across nine game types: EZ2, Swertres, 4D, 6D, Lotto 6/42, Mega Lotto 6/45, Super Lotto 6/49, Grand Lotto 6/55, and Ultra Lotto 6/58, organized into a searchable, filterable archive. There's a number generator with quick pick and hot-and-cold analysis over the last 90 days, and a ticket checker: upload a photo of a real PCSO ticket, and it reads the numbers automatically and checks them instantly.
Beyond the site itself, results post automatically to LottoNatin's own Facebook page the moment they're confirmed, no one manually creating a graphic and typing a caption every time a draw lands. The site also runs as a full installable PWA with real push notifications, both built without leaning on a third-party plugin for either.
Two real decisions
The Facebook images are rendered locally, not AI-generated. The winning numbers are drawn pixel-exact with Imagick, using the site's own brand colors and fonts. An AI image model is fast, but a misdrawn digit on a public lottery result post is not a risk worth taking. Gemini is used only for the caption's greeting text, kept deliberately separate from the numbers themselves, and every post carries a fixed PCSO affiliation disclaimer that's appended after generation, never left to an AI prompt to phrase, so the wording never drifts.
Minor games get pooled, major games don't. The big 6-number jackpot games always get their own post immediately. But EZ2, Swertres, 4D, and 6D share draw times, so posting each one separately would flood the page. Instead they're pooled into one post per draw time, with a short grace window for the rest of that batch to land before posting with whatever's in.
The ticket photo stays private
Building actual ticket-reading meant people would be uploading photos of what is, functionally, a financial document. The ticket photo is processed entirely in memory and permanently deleted right after scanning, never written to a server or a database, and that promise is stated plainly right where someone is about to upload their ticket, not buried in a policy page.
The homepage: today's results across every tracked game, updated as they're posted.
The full archive: 281 draws and counting, filterable by game and timeframe.
Quick pick and hot-and-cold analysis, both drawing from real recorded draw history.
The ticket checker. Upload a photo, get an instant answer, nothing stored afterward.
The outcome
A live site tracking real draws across nine games, a ticket checker that reads a real photo instead of asking for manual entry, and a Facebook page that stays current on its own, every single draw, without anyone sitting at a keyboard waiting for results to post them.
Tech stack
Need something like this built?
Tell me what your operation actually does all day, and I'll tell you honestly what's worth building. No jargon, no "let's circle back."