Media / Newsletter Automation · 2026
Game In Five — AI-Drafted Hockey Newsletter Platform
Game In Five is an independent hockey newsletter that gives busy fans their team in five minutes: a Pregame Five before puck drop and a Postgame Five after the final horn. I built the whole system behind it. A scheduled job pulls the NHL schedule, scores, and boxscores, writes a draft for each game with OpenAI from verified game data, and puts it on an editor's desk. The editor reviews, edits, and approves it in a custom admin workspace, then sends it to subscribers through Beehiiv and publishes it to the site's reading room.
Kickoff to first live edition in about four weeks, with a human approving every send

Role
Full-Stack Developer — sole engineer, from architecture and data model to the AI pipeline, admin workspace, and deployment.
Outcomes
~4 weeks
Kickoff to first live edition
2
Editions per game (pregame + postgame)
290+
Automated tests
0
Sends without human approval
Live Product
gameinfive.com ↗“Adil is a pleasure to work with, he does very quick and quality work with pairing APIs and coding together, and seems like he is available all of the time and quick to respond. Very reliable, while giving updates each day for which steps he has completed and what he will do next, very organized. He provides solutions and suggestions while also completing very quality and quick coding and automation work. Will definitely work with him again”
The Problem
The founder wanted a sports newsletter that reads like it was written by a sharp beat writer, delivered on game day, for every game of the season. Doing that by hand means someone researching and writing two editions per game, on a schedule set by the NHL, often late at night. Letting AI write it unsupervised was ruled out from day one: a wrong score or a misnamed player in a fan's inbox costs more credibility than a missed send. So the brief was a pipeline that does the heavy lifting automatically but never publishes on its own: detect when a game is coming up or has ended (including overtime, shootouts and postponements), draft the edition from real data, and hand it to an editor with enough time to review it before the send window closes. The season opened about three weeks after kickoff, so the system also had to be shippable fast and safe to change once real subscribers were on the list.
The Reader Experience
The public site and a published Postgame Five in the Montréal reading room.
What I Built
- Hourly draft cycle: syncs the schedule and game states, then creates any pregame or postgame draft that is due, idempotent per game and edition type so a retry can never double-generate
- AI drafting with OpenAI, fed a structured "game facts" block computed by code from the boxscore and play-by-play, so scores, stats and names come from the data rather than the model
- Schema-validated model output (Zod) mapped onto a fixed five-section format, with source links on every section and a per-section "Ask AI" rewrite for the editor
- Editorial admin workspace: draft queue by status, a full editor for every field, live email preview, approve or skip, and scheduled sends with cancel and reschedule
- Beehiiv publishing through its Send API using a post template, with one newsletter list per team so a send only reaches that team's readers
- Web reading room that republishes every sent edition as a page on the site, with SEO tags and social preview images
- Signup flow that saves to Postgres and pushes to the right Beehiiv list, keeping the visitor's UTM source through to the subscriber record
- Subscribers screen with a signup-source chart, tracked creator short links, and admin / editor roles enforced on every backend route
- Automation screen with a run log, health status per job, and a manual "Run now"; email alerts via Resend when a draft is created or a job fails
Editorial Workspace
Every edition passes through an editor before it reaches an inbox.
Solution
I set the project up as a monorepo with three parts: a Next.js website on Vercel, an Express API on Railway, and a shared Drizzle schema for Supabase Postgres used by both. The website never touches the database or a third-party API directly; everything with a secret goes through the backend, which checks the user's role on every request. That boundary kept the frontend simple and means a future mobile app can use the same API. Reliability shaped most of the backend. Instead of per-game timers, which don't survive restarts, an hourly cron tick asks "what is due right now?", with retries capped per game and failures recorded and emailed. The sports data sits behind an adapter: I started on the NHL's unofficial API and later migrated to MySportsFeeds in phases without touching the drafting or admin code. For accuracy, the code computes every number the model sees (shots, power play, faceoffs, scoring by period) and the prompt only asks it to write. The editor still has the final say on every edition. The admin was built for someone who should never need to open the codebase. Each edition renders exactly as subscribers will see it, every field is editable, and sends can be scheduled, pulled back or rescheduled. Behind it are 290+ automated tests, including integration tests against a disposable Postgres in CI, so changes during the season could go out without guessing.
Automation & Monitoring

Tech Used
Have a similar problem?
I help startups and product teams build fast, scalable web applications and move manual operations into software. Let's talk about what you're working on.