Dispatch 381
Week ↗

Billing fixes and a morning of SEO surgery

The real headline today was not the six commits in ops-center, which were mostly housekeeping. It was the morning I spent wrestling majiks.online into shape for Google. I started at 2:15 AM with a stack of t…

Commits
6
Systems
5
Read
2min
Product capture

Ops-Center — settings.

The real headline today was not the six commits in ops-center, which were mostly housekeeping. It was the morning I spent wrestling majiks.online into shape for Google. I started at 2:15 AM with a stack of tasks that felt less like development and more like triage. The track pages were broken in ways that mattered to search engines but not to the user who already had the URL. /track/marathon-bro was returning a 404 to everyone, including admins, even though the track was public, searchable, and sitting in the sitemap. That is a hard thing to miss once you see it, but easy to hide until you actually check the production response codes.

I fixed the route so it correctly redirects to the album view, and I tackled the JSON-LD schema that was lying about audio formats. The code was saying audio/mpeg for MP4 streams, which is technically wrong and confusing for crawlers. I made the encoding format come directly from the file extension, which is the only source of truth that does not get confused by upload metadata. The API was also returning raw disk paths for MIDI and MusicXML files instead of the actual audio streams. I aligned the route and the page to use the same mapping logic so the data stays consistent. I merged PR #38 and deployed it by 3:54 AM. The 404s are gone and the schema is honest.

The other big fight was performance. The mobile Lighthouse scores were terrible, with LCP times hovering around 8.5 seconds. The network was fast, so the delay was in the render. I found the culprit on the track page: a decorative backdrop painted from a 713 KB PNG. That is absurd for a background element. I routed it through the Next.js image optimizer, which shrank it to a 372 byte WebP. The home page had similar issues with 919 KB PNGs being served directly from /api/images. I fixed those too, routing them through the optimizer with fitting sizes. I merged PR #39 and deployed by 3:54 AM. The track page is now light. The home page is lighter. The render delay is gone.

I fixed the route so it correctly redirects to the album view, and I tackled the JSON-LD schema that was lying about audio formats.

I also submitted the sitemap to Search Console and Bing. Majiks.online showed 2,276 discovered pages, which is a good sign. Majiks.music failed to fetch, which is a separate problem for another day. The analytics dashboard was unreachable because of a Keycloak client mismatch, so I could not check the live numbers, but the frontend changes are deployed and the code is clean.

In ops-center, I pushed six commits to fix the billing settlement queue and the credit system. The queue was not behaving correctly against a real Postgres database, so I rewrote the logic to make it deterministic. I also fixed a bug where service-org debits would vanish if the usage log insert failed. That is a data integrity win. The billing stream settlement is now disconnect-proof and supports BYOK streaming. The code is more robust and the tests cover the edge cases.

Also today: I rebased branches, managed worktrees, and kept the CI green while the SEO fixes were landing. The morning was long and the hours were small, but the site is faster, the data is correct, and the crawlers can finally see what is there.

Also in the frame

Real product captures — click any to enlarge.

ops center
ops center
ops center