FIELD NOTES · WRITE-UPS AND WORKING NOTES

Field notes

LOG 066 · 2025-12-01TechnicalShipped a paid AI product in under two weeks, then rebuilt it when the requirements grewBuilt the backend for Magic Marketing, a paid AI marketing tool for podcasters, as a fast MVP, then rewrote it as v2 when the client's feature requests outgrew the prototype architecture.LOG 058 · 2025-08-18TechnicalDesigning Data-Intensive Applications - dry, despite the reputationDry, despite the reputation.LOG 056 · 2025-05-18TechnicalTest-Driven Development: By Example - one great tip, not much elseOne great tip, not much else.LOG 054 · 2025-04-10TechnicalBuilt a global IP rate limiter in a day to stop bot scrapingShipped a from-scratch IP rate limiter for the Goodpods API in one day to shut down aggressive bot scraping, catching a load balancer IP bug in development before it could throttle every real user.LOG 053 · 2025-02-01TechnicalCloud Run was exhausting our database connections, so I did the maths and fixed the root causeA production connection-exhaustion incident on Cloud Run: pool tuning bought time, then the worker-times-instances arithmetic pointed to the real fix with a read replica.LOG 046 · 2024-07-27TechnicalIntroduction to System Design - copy pasted in places, skippable overallCopy pasted in places, skippable overall.LOG 045 · 2024-07-01TechnicalRewrote the hot-path feed query, twiceReplaced the exact-ranking feed query behind Goodpods' For You screen with a cheap sampled version, taking p50 latency from 1900ms to 110ms.LOG 044 · 2024-04-01TechnicalBuilt a native audio engine from scratch in Swift and Android Media3As a web engineer I wrote a native podcast player for iOS and Android with queues, background playback and lock screen controls, and bridged it to our TypeScript app.LOG 042 · 2024-02-01TechnicalBuilt offline listening: downloads plus an offline-first data layerBuilt episode downloads and a persistent React Query cache so the Goodpods app worked with no connection.LOG 041 · 2024-01-01TechnicalPer-request monitoring at over 1M requests a day, without buying a monitoring productWith no observability budget, I built request monitoring into Redis for an API doing over 1M requests a day, then used it to find and fix the ten slowest endpoints.LOG 040 · 2024-01-01TechnicalReplaced our React Native app by shipping the web app through CapacitorHow I turned one Next.js codebase into the iOS and Android apps for Goodpods and retired an entire React Native codebase.LOG 039 · 2023-12-01TechnicalInstrumented listening in detail, then stopped the player losing your placeBuilt fragment-level listen analytics across the Goodpods app, then fixed the resume bugs that made the player jump back to the start, cutting support complaints to zero.LOG 038 · 2023-11-01TechnicalShipped prefetching, pulled it from prod the same day, then re-shipped it surgicallyMy first prefetch deploy maxed out the Goodpods backend's autoscaling, so I reverted it from production the same day and re-shipped a more surgical version.LOG 037 · 2023-10-01TechnicalRebuilt listen tracking around fragments without breaking old clientsMigrated Goodpods' core listen data to a fragment model that captured partial and resumed listens, kept old clients working via daily aggregation, and unlocked podcaster analytics and listen-time leaderboards.LOG 028 · 2023-09-01TechnicalMaking Next.js caching behave at a million requests a dayA multi-month fight to get stale-while-revalidate working on the Goodpods webapp without pages caching forever or deploys serving a stale app.LOG 027 · 2023-08-25TechnicalHow to use alembic in productionA practical guide to running Alembic database migrations from your first revision through to CI/CD and production.LOG 021 · 2023-07-29TechnicalKill It with Fire - the best software book I'd read in a long timeThe best software book I'd read in a long time.LOG 020 · 2023-07-01TechnicalPut the content in the first-load HTMLServer-rendering structured data and real page content took Goodpods from a few dozen organic clicks a week to over 1000.LOG 019 · 2023-07-01TechnicalShipped curated lists in ten days and users made 1,000 of themBuilt the curated lists feature across the Goodpods native app in about ten days; users created 1,000 lists within the first ten days after release.LOG 018 · 2023-06-27TechnicalRefactoring UI - two hours to noticeably better web designTwo hours to noticeably better web design.LOG 016 · 2023-03-01TechnicalTook the webapp's Lighthouse score from the 20s to 95 for an SEO pushA five-month Core Web Vitals campaign on the Goodpods Next.js webapp that lifted Lighthouse from 20-30 to 95 and improved search rankings.LOG 015 · 2023-03-01TechnicalA stale-while-revalidate cache took SSR pages from 2-5 seconds to 100msI designed a Redis stale-while-revalidate cache for Goodpods' SSR pages, gated to crawlers only, that cut response times from 2-5 seconds to around 100ms.LOG 013 · 2023-01-27TechnicalIntroducing Go - just watch YouTube insteadJust watch YouTube instead.LOG 011 · 2022-12-06TechnicalRobust Python - the book that sold me on type hintsThe book that sold me on type hints.LOG 010 · 2022-08-29TechnicalUsing Asyncio in Python - the book that finally made the event loop clickThe book that finally made the event loop click.LOG 009 · 2022-08-19TechnicalThe Mythical Man-Month - software is grown, not constructedSoftware is grown, not constructed.LOG 007 · 2021-12-26TechnicalClean Code - worth doing your job properlyWorth doing your job properly.LOG 005 · 2021-02-01TechnicalBuilt Detox E2E tests on CI, then removed them when they stopped paying offAfter a team reduction left us without full-time QA, I set up Detox end-to-end tests on CI, ran them for eighteen months, then removed them when the evidence showed they were not worth their maintenance cost.LOG 004 · 2020-08-10TechnicalRebuilt the Goodpods API from Django to FastAPI, endpoint by endpointProposed and led a parallel rewrite of a failing Django backend to FastAPI, taking the platform from 50 to 1500 concurrent users.LOG 003 · 2020-08-01TechnicalMoved all the slow, flaky work onto a background worker fleetReplaced a high-maintenance Celery setup with an RQ worker fleet on Redis, with priority queues and per-podcast fault tolerance, cutting notification-triggering actions from 5 seconds to 80ms.LOG 002 · 2020-07-20TechnicalReplaced FileZilla-to-prod with tests, pipelines and near-daily deploysHow I took the Goodpods API from live-editing production over FileZilla and weekly outages to a tested, three-environment pipeline with near-daily deploys.LOG 001 · 2019-05-27TechnicalA Realistic Speed Reading TechniqueA three-pass method for speed reading non-fiction without losing what matters.