▌ THE BUILD LOG
DEVLOG // WHAT SHIPPED
Build notes for the whole site — every meaningful shipment across every channel, plus when it landed and why it matters. Tap a category below to filter the list to one area.
- #202026-06-06SITEART
Channel banners across the four main channels
Food, Music, Games, and Anime each got a Kid Ghost-themed horizontal banner sitting under the global nav. Generated via ChatGPT/DALL-E with locked character spec so the mascot is consistent across the set. Anime banner gets the cel-shaded shonen-OP treatment.
All four are served through next/image so the ~3MB source PNGs get auto-resized + WebP-converted per viewport. Mobile visitors download ~30-60KB instead of the full 3MB.
- #192026-06-06MUSICPERF
Music page: 15-20s cold render → sub-second
Three compounding causes traced and fixed. Page was force-dynamic with no ISR, the per-band OG-image scrapes were happening in a serial for-loop across 21 bands/festivals (each 1-3s of external HTML scraping), and the whole panel was inside a single Suspense boundary so the page shell waited for everything to resolve.
Now: ISR with hourly background revalidation, OG fetches dropped from tile cards (only the hero strip does them), Spotify lookups batched into one Promise.all, and PopPunkPanel has its own Suspense skeleton so the page shell appears instantly on cold renders.
- #182026-06-05GAMESFEATURE
Games hub: News / Hot Now / Now Playing tabs
Three tabbed sections on /games defaulting to News. Video game news from IGN / Polygon / Push Square / Eurogamer, tabletop news from Dicebreaker + BoardGameGeek. Card Games gets its own section with per-TCG news for Magic, Pokémon, Lorcana, One Piece, DBS, Yu-Gi-Oh.
Hot Now surfaces curated video games (Helldivers 2, Elden Ring, etc.) with Steam Cloudflare CDN thumbnails and the latest news per title, card games with per-TCG brand-colored gradient covers (Magic = burnt red + swamp black, Pokémon = pokeball red + pikachu yellow, etc.), and tabletop from BoardGameGeek's hot list with a curated fallback when BGG's server hiccups.
Now Playing pulls Creativity Corner posts tagged with anything in the games tag set (games, gaming, videogame, boardgame, cardgame, tabletop, tcg) — no new DB, just a filtered view of the existing forum.
- #172026-06-05SITEDESIGN
MiniAppNav rebuilt: square, channel-numbered, neon glow
Pill-style tabs on /games, /music, /food, /orlando were too small and the active state too subtle to read at a glance. Rebuilt as squared-off rounded-md buttons with channel-numbered prefixes (01 / 02 / 03), 2x bigger padding on desktop, heavy neon glow + blinking dot on the active tab, color-themed hover.
The strip itself gained scanline overlay + bottom-edge gradient so the row reads as part of the brand. One component change, every mini-app page upgrades.
- #162026-06-04ANIMEFEATURE
Anime page goes truly dynamic via AniList GraphQL
Replaced the hardcoded Top 5 + Characters sections with live AniList data. Trending Now (currently-airing top by AniList's real-time activity signal), Coming Soon (anticipated upcoming season), and Most-Favorited Characters all pull from AniList — free, no API key, hourly revalidation.
Each fetch wraps in try/catch so a single failed query can't blank the page; a friendly 'couldn't reach AniList for this section' card appears instead.
- #152026-06-04FOODFEATURE
Recipe parser gains AI cleanup via Gemini Flash
The paste-mode heuristic was failing on any recipe with a title line, section headers, or footer metadata — it gave up on the first non-ingredient-shaped line and fell back to splitting everything in half.
Replaced with a Gemini Flash call using forced function calling (tool_choice: ANY) for reliable structured output. Auto-fallback to the heuristic when AI fails so the button is never a dead-end. Strips titles, ignores 'Ingredients:'/'Directions:' headers, parses cooking time + calories from the footer.
- #142026-06-03FOODFEATURE
Shopping list: 1× / 2× / 3× / 4× batch picker for saved recipes
Adding ingredients from a saved recipe used to land at 1× only. Now each recipe row shows four buttons — pick a batch and the route scales every numeric quantity via the existing transformIngredient helper. '1¾ cups heavy cream' at 3× becomes '5¼ cups heavy cream', fractions and Unicode glyphs handled correctly.
- #132026-06-03CRAMRENAME
/math → /cram
Renamed the math channel to Cram to support a broader future as an educational mini-app hub — vocab, chords, capitals, whatever lands next. /math still works as a redirect.
Carries the late-night-pop-punk all-nighter energy without being subject-specific. Channel number, color, glow class all preserved.
- #122026-06-02SITEFEATURE
Kid Ghost dad joke skull + sponsor easter egg
Punk skull mascot peeks in from the side of every page every 5-12 minutes, types out a dad joke (70 jokes in the pool, all clean bad puns), switches to a laughing face on the punchline with a body-shake animation.
Hidden 'word from our sponsor' easter egg lives below the joke dismiss line — opens a glitch-themed 'MESSAGE FROM / OUR SPONSOR' modal with confetti particles and pop sounds. Discoverable but not noisy.
- #112026-06-01QUESTSINFRA
QuestList syncs across devices
The /quest-list iframe was using its own isolated localStorage — tasks didn't follow users between devices even though every other store on the site already did via the user_data sync table.
Wired the iframe to /api/sync/questlist directly. Same-origin fetch means the Auth.js session cookie rides along without postMessage plumbing. Server-wins-on-newer-timestamp conflict resolution, never auto-overwrites local data on first sync, snapshot of pre-sync state saved to localStorage as belt-and-suspenders insurance.
- #102026-05-30BUDDIESFEATURE
AIM-style buddy chat (channel 09)
Full chat system in the AIM tradition. Search for users by screenname, send mutual buddy requests, see who's online via 3-tier presence (available / away / invisible), DM via popup chat windows that stack alongside a floating buddy list.
Polling-based realtime (3s for open conversations, 15s for buddy list), debounced typing indicator, away messages + profile text, synthesized door-open chime via Web Audio when a buddy signs on. /buddies page for the full-size view.
- #092026-05-28CREATEFEATURE
Creativity Corner forum (channel 08)
Reddit-style threaded forum at /creativity. Transmissions (posts) with markdown body + tags, AMPLIFY (one-tap upvote), threaded replies via comments table with self-referential parent_id, FRESH / LIVE / SIGNAL sort tabs.
Live mode uses a Reddit-style hot score formula (log of score with time decay) computed directly in SQL. Admin moderation gated on ADMIN_EMAILS env var so deletes are declarative.
- #082026-05-25SITEFEATURE
Username system + /account settings page
Magic-link auth needed actual usernames to power the forum + chat. Added the username column with case-insensitive uniqueness, reserved-word validation, and a fallback display chain (username → name → email split → 'anonymous').
Username also mirrors to users.name so every Auth.js consumer (UserMenu chip, profile dropdowns) shows the chosen handle.
- #072026-05-20ORLANDOFEATURE
Disney resort deal alerts
Daily cron checks Disney's resort availability API for the user's configured trip windows, detects price drops vs the last observed price, emails the subscriber if anything dropped. Includes the actual offer ID + savings amount.
Healthcheck row written on every run so silent API failures are visible. Resort deal RSS scraped from MouseSavers + DisneyTouristBlog as a secondary signal.
- #062026-05-10INFRAINFRA
Auth.js v5 + magic-link sign-in via Resend
No passwords. Email-only sign-in via Resend. Pg adapter for the verification_tokens / users / sessions tables, JWT session tokens (no DB hit per page load), trustHost for Vercel preview deploys.
All the user-data sync (recipes, restaurants, quests, music artists/cities, questlist state, chat) hangs off this. No sign-in, no sync — the localStorage stays.
- #012026-05-06GAMESMILESTONE
RC: Respawn Creatures goes live at /game
First playable version. Hatch, feed, train, fight. Three species (dino / water / lion) with six evolution stages each. World map has grass, forest, and a red zone with 75% encounter rate plus boss fights.
Built in Phaser 4 with all art drawn programmatically — no sprite files. Means the look can shift fast as the design changes.
Devlog updates land here. Want them in your inbox? Join the riot.
