When Medium doesn't have an API: RSS polling and LinkedIn cross-posting
Detecting Medium publishes by polling the RSS feed, LinkedIn's four mandatory headers, and the Zeitwerk acronym rule that broke migration rollback in CI.
Notes on the software, games, and music coming out of Imperfect Systems.
RSS feedDetecting 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, including the GitHub limit that turned the merge gate into a comment.
The GraphQL request I planned to intercept never fires: Medium server-renders its Apollo state. Three wrong turns and the wrappedJSObject fix that shipped.
Medium's API has no concept of a scheduled post. Phase 1: model the state manually with an append-only enum, and see if the friction justifies automation.
Page 15 of 16