A week of work on covers, and the log showed that almost none of them were on YouTube. The publisher set thumbnails for every freshly processed video at once; YouTube answered the burst with a rate limit; the publisher’s one retry fired inside the same burst and failed the same way. Two covers had ever made it through.
The decision
Work on everything else paused. The owner’s rule is fixes before features, and this was a live bug on the thing viewers see first.
The fix has four parts:
- A rate-limit response no longer counts as an attempt, so a cover is not written off because YouTube was busy.
- A two-hour cool-off per channel after a rate limit.
- At most two thumbnail sends per tick, so there is no burst to be limited.
- A one-time backfill that walks every Short already on YouTube without its cover and sends it.
Where the scope came from
The first three were the engineering fix. The backfill, and a command to push covers through on demand, came from the owner reading the log and asking two questions: whether all the videos without covers could be corrected, and whether some covers could be forced to upload right now. Both became part of the same change rather than a follow-up.
Merged
The fix landed on main just after midnight on 2026-10-05, on the owner’s one-word go. The shipped version sends two thumbnails per run twenty seconds apart, cools a channel off after a rate limit, and keeps a backlog of every Short without its cover that drains behind new uploads and retries, never ahead of them. The on-demand command takes a channel and an optional cap on how many covers to push. Its one review round found three things that mattered, all reworked before merge: the backlog could starve new uploads and expire all at once, the command held the publish lock through its own pauses, and a Short could be left without a cover whenever the lock was busy. Covers start backfilling at the next tick after the app is restarted.
Postscript
Two days later the backfill was taken out again for Shorts. The sends it paced so carefully were all accepted and all lost within minutes, because the API cannot set a Short’s thumbnail at all. The entry “Shorts covers, by hand after all” has the rest.