SkyStats
The app I learned everything on
The three year app
I built SkyStats when I was fifteen. By the time I retired it into SkyHub it had fifteen thousand people checking it every month. I did not plan for that. One Discord post carried it.
Everything I know about running a service for real users I learned from being woken up by this app.
Six weeks to ship the core
Inventory, ender chest, personal vault, collections, minions, and skills all landed in one week in late November 2022. Each view was a controller, a view model, and a SwiftUI detail screen. The commit history reads like a checklist.
December was sub-controllers: item drill-down, pet detail, equipment detail. Each list cell owned its own fetching, its own state, its own refresh, so the parent view did not have to know. That pattern is the reason the codebase could add features faster than it should have.
The bazaar cost me a month
Bazaar shipped Christmas week of 2022 and then became the entire next month of work. Buy-and-sell charts landed January 17. The portfolio tab where users tracked their own holdings landed January 27.
The charts were written from scratch over CoreGraphics instead of a charting library. That was wrong. I should have pulled in a dependency. I lost a week writing a horizontally zoomable candlestick view that does exactly what five libraries already do, badly.
The auction house, and the one feature that mattered
Three weeks in February for the auction module. Auction home screen, individual auction, auction item search, bid tracking, auction notifications.
The February 21 commit called auction notify is the feature that pushed me past three thousand daily actives, because no other Hypixel app was doing it. Notifications needed a local cache of watched items, a server-side fan-out that compared prices against the user watchlist on a schedule, and background fetches on iOS to wake the app up and deliver a local notification when a threshold hit.
The rewrite nobody saw
Midway through I rewrote the iOS client from UIKit into SwiftUI. Same day I moved the backend off a Flask monolith onto a MongoDB-backed service. Visible change: cleaner UI. Invisible change: request latency dropped twenty percent because the new backend cached profile blobs and only recomputed networth when the cache was stale.
I shipped both the rewrite and a cosmetic redesign in the same update so users attributed the speed to the new look. This is a dirty trick and I would do it again.
Why I retired it
The MongoDB document store could not evolve into something relational without a full migration. I did the migration. It is called SkyHub now. Same idea, different foundation.