The Weekly Peel: 2026-03-15
RetroFantasy goes live with Docker and Caddy, Color Lock's web app gains PWA support and a developer experience overhaul, and the socials tool gets rebuilt from the ground up.
This was a deployment-heavy week. RetroFantasy shipped its first production infrastructure with Docker Compose and Caddy, Color Lock’s web app picked up offline support and a major developer experience cleanup, and the social media tooling was gutted and rebuilt around a draft-first workflow.
RetroFantasy Ships Production Infrastructure
RetroFantasy went from “runs locally” to “runs on a server” this week, and the commit history tells the story of a team working through the full deployment gauntlet in real time.
The work started with migrating the deploy workflow from Docker Compose v1 to v2, then adding a Caddy reverse proxy to handle HTTPS termination. A health check retry loop replaced a fixed sleep in the deploy script — the kind of change that sounds minor until your deploy hangs for 30 seconds waiting on a container that booted in five. The backend migrated to its own subdomain at api.retrofantasy.games, and the frontend WebSocket URL resolution was hardened to match.
There were the usual deployment adventures along the way: killing stale processes on port 80, pruning Docker networks, stopping a host-installed Caddy that was fighting the containerized one. A rollback workflow was added so future deploys have an escape hatch. A .dockerignore file trimmed the build context down to what actually matters.
On the application side, the team cached the player pool parsing at server startup — a performance win that removes repeated JSON parsing on every request. Load tests now persist results to JSONL for tracking over time. Usernames gained support for special characters with a blocklist for abuse prevention. A bug that showed stale scores when switching between matchup pill views was fixed. The homepage picked up a How To Play link, and OG meta tags with helmet branding assets landed for better social sharing.
Color Lock Web App Gets PWA Support and a DX Overhaul
The Color Lock web app had two distinct threads of work this week: a user-facing PWA upgrade and a sweeping developer experience cleanup.
PWA support shipped with a service worker, offline play capability, and puzzle prefetch — meaning players can load tomorrow’s puzzle on WiFi and solve it on the subway. This is the kind of feature that doesn’t show up in screenshots but changes how the game fits into people’s routines.
The developer experience work was more extensive. The Firebase emulator moved to port 8083 with hardened startup scripts that check dependencies, verify ports, and run health checks before declaring ready. A unified npm run emulators command now launches Vite automatically, collapsing a two-terminal workflow into one. Nine dead npm scripts and stale VS Code launch entries were cleaned out. The seed script gained determinism, proper error handling, and emulator validation. Firebase was mocked in the test suite’s smoke test, console noise from Firebase init files was silenced, and the emulator host was unified to localhost across all services.
A few targeted fixes rounded things out: the win modal now correctly reads stats from the nested difficulty sub-object, the Play Again button is properly centered, and the TutorialContext got a useMemo to prevent unnecessary re-renders.
Color Lock iOS Cleans Up Test Infrastructure
On the iOS side, the Color Lock team refactored the WinModalStatsCacheManager from a static singleton to an instance-based design with dependency injection — a change that makes the cache testable in isolation. A dead test that had been asserting against the old static interface was removed. Separately, flaky DI injection tests were stabilized by replacing polling loops with XCTNSPredicateExpectation, which lets XCTest handle the timing instead of hand-rolled retry logic.
The Banana Standard Website Polishes Its Blog Experience
The website’s blog reading experience got a quiet but meaningful upgrade. A persistent bug where the scroll-linked gradient would get stuck on mobile was fixed by replacing the JavaScript scroll listener with a pure CSS animation-timeline approach. This also simplified the codebase — several files of gradient management logic collapsed into CSS declarations. The mobile article layout was tightened: the banana tree widget was isolated to prevent layout interference, article width was constrained, and native overscroll behavior was restored.
Nav and logo sizing on endpoint pages (blog, projects) was aligned with the carousel’s responsive behavior, fixing a visual inconsistency that had been lingering since the Astro migration.
Social Media Tooling Gets a Ground-Up Rebuild
The banana-standard-socials CLI tool underwent its biggest change yet. All API publishing and engagement automation code was stripped out — a deliberate move away from automated posting toward a draft-and-review workflow where Claude Code serves as the conversation layer.
In its place, four new commands were added. generate creates draft posts for Threads and Reddit from article content. discover finds Reddit engagement opportunities by scanning relevant subreddits. draft-comment produces reply drafts for discovered posts. And a new ui command launches a local web interface for reviewing and managing the draft queue. A comment playbook and project changelog were added to guide tone and content decisions.
The result is a tool that helps produce social content rather than one that publishes it autonomously — a distinction that matters when you care about what goes out under your name.
What’s Next
With RetroFantasy’s infrastructure in place and Color Lock’s web app running offline, both projects are positioned for feature work rather than plumbing. The socials tool rebuild opens up a more deliberate content workflow that should start producing results in the coming weeks.