Building a blog syndication backfill
72 Medium posts my database knew nothing about: the RSS cap, an undocumented GraphQL workaround, Unicode apostrophes, and the kamal stdin trap.
72 Medium posts my database knew nothing about: the RSS cap, an undocumented GraphQL workaround, Unicode apostrophes, and the kamal stdin trap.
My Mac's Docker daemon was a load-bearing part of production deploys. Build-once-deploy-many with Kamal 2, and the three research assumptions that were wrong.
Detecting Medium publishes by polling the RSS feed, LinkedIn's four mandatory headers, and the Zeitwerk acronym rule that broke migration rollback in CI.
Making dashboard titles link to the live posts: a configurable path prefix, a pub_date gate against broken links, and a spec column I scrapped.
In-page Pexels search with Turbo Frames, the auth header quirk that 401s Bearer tokens, and a singleton settings model for the API key.
A push-to-Medium button on a deprecated-but-working API: injectable Net::HTTP, on-demand markdown rendering, and a state machine split between job and service.
Wiring Turbo Streams so scan jobs update the page as they run, and the cable.yml async adapter gotcha that swallowed every broadcast from the worker.
Moving the GitHub scan to a background job after it outgrew the proxy timeout, and the rescue_from LIFO ordering gotcha that broke my discard path.
Making every merge deploy staging automatically: a self-hosted runner, four walls in a row, and the Kamal secrets gotcha that took the longest to crack.
Writing down the rules for what to do when CI goes red on a solo Rails project, and the GitHub limitation that turned the merge gate into a load-bearing comment.
Page 4 of 5