Week 6: Rebuilding the Video Archive
Week 6 of Shipping Every Week — my biggest fear was that Powr's video archive wasn't reliable enough to be the killer feature. So I rebuilt it, finished a Mux migration a month ahead of plan, and ran a 30-issue security sweep.
Week 6 of Shipping Every Week: my biggest fear with Powr right now is that the video archive isn't reliable enough to be the killer feature it's supposed to be. The whole pitch — months of form videos, searchable in seconds — only works if the videos are there. Every week I sold that promise harder in Reels while quietly knowing the plumbing underneath it was held together with patches. This week I stopped patching and rebuilt it.
Video reliability sweep
The failures were the quiet kind — the ones that don't crash loudly, they just lose your video and erode your trust one missing clip at a time:
- Fixed the post-workout crash on the Videos tab that hit anyone who finished a session with clips attached. The most engaged users — the ones actually recording sets — were the ones getting crashed.
- Fixed the clip button on the workout summary. The exact same video that played fine in the Videos tab reported "video failed to sync to this device" when you reached it from the summary card. Same file, two code paths, one of them lying.
- Bounded the post-signin video download. Accounts with a backlog of failed downloads used to freeze the app for about nine minutes on launch while it tried to drain the queue. That's now about fifteen seconds. The fix wasn't making it faster, it was making it bounded — stop trying to do everything at once on a screen the user is staring at.
- Closed a write-path gap that was leaving 18 of 38 production assets with no database mapping. That's a 42% stuck-processing rate: nearly half of uploaded videos existed in the provider but the app had no record connecting them to a set, so to the user they were simply gone.
- Bounded the upload queue so a single hung request can't deadlock the rest of it. One stuck upload used to take the whole queue down with it.
- Cached video thumbnails so the Videos and Workouts tabs stop re-fetching every poster on every cold start.
- Cleaned up provider assets when an account is deleted, so deleting your account actually deletes your videos.
Mux migration: Phase A complete, a month early
Underneath all of that was a bigger move. Powr's videos were hosted on api.video, which is sunsetting on August 31. Everything had to move to a new provider, Mux, before then.
The plan for this week was modest: stand up dual-write — every new upload goes to both providers — and stop there. What actually shipped was the whole of Phase A. Dual-write went in. Then I backfilled all ~50 existing production assets to Mux. Then I flipped the read path behind a feature flag, so the app now serves video from Mux first and falls back to api.video only if it has to. Mux is the primary CDN for video reads in production as of this week.
The feature flag is the part I'm proud of, because it's what made flipping the read path safe to do this early. The provider is a setting, not a deploy. If Mux had misbehaved under real traffic, I'd roll the flag back to api.video without shipping a thing. The August 31 deadline that had been hanging over the whole project got most of its runway bought back in a single week, and at no point was there a moment where a bad cutover could strand someone's videos.
The roadmap features still landed
The migration didn't eat the week's shipping. It ran alongside it:
- The branded workout screenshot share went live (Monday) — the on-brand summary card I built for other people's Reels.
- A plate calculator share with an auto-rendered barbell (Tuesday): tell it the weight, it draws the loaded bar.
- App typography migrated to Montserrat, so the whole product reads as one thing instead of the system default.
- Program import got more honest. Importing a 12–16 week program used to silently drop accessory exercises it couldn't confidently parse. Now it surfaces them and asks you to resolve them, instead of quietly handing you an incomplete program.
A 30-issue security sweep
I also ran a security pass — 30 issues — which feels like a lot for a solo project until you remember the app holds people's accounts and their videos. The notable ones:
- Pulled PII out of debug logs and analytics events, so personal data wasn't leaking into telemetry.
- Encrypted local storage at rest, with the encryption key generated on-device and held in the secure keystore rather than sitting next to the data it protects.
- Enforced the Apple Sign In nonce check, so a stolen identity token can't be replayed.
- Added rate limits on the signup and program-parsing endpoints, an explicit CORS allowlist, and an SSRF guard on the reel-analyzer so it can only fetch from Instagram's own hosts and can't be tricked into hitting internal addresses.
- Pinned
search_pathon the database trigger helpers to close a privilege-escalation path, with a lint test so a future migration can't quietly reintroduce it. - Set baseline security headers, including HSTS, on the web server.
None of this is demoable. But "the video archive is reliable" and "your account is safe" are the same promise wearing two hats, and this week was about making both true before I sell either one harder.
The Friday reel is up: "Powerlifting Propaganda I'm Not Falling For."
What did you ship this week?