// Own Product
StoreRank
Know the day your ranking moves.
// Overview
StoreRank is an ASO (App Store Optimization) tool that measures App Store keyword search rankings every day. Type in a keyword and it retrieves where each app ranks in the store for that term. Add your own apps to a watchlist and you get notified when a ranking moves significantly, when an app enters or leaves the results, or when a price changes.
Existing ASO tools are mostly web services at around $100 a month — far too heavy for indie developers and small teams. StoreRank is designed as a native iOS app built around a single idea: you don't open it, it tells you when your ranking moves. Search terms and watchlist stay on the device, and no account is required.
The concept itself was validated before any code for the product was written. “Notify me when the rank moves by three” only works if intraday fluctuation is small enough. So before building any UI we wrote a measurement CLI, sampled the same keywords three times a day for a week, measured the intraday standard deviation, and only moved on to implementation once the signal-to-noise ratio held up.
// Features
- ▸Keyword rank measurement — type a search term and get each app's in-store ranking for it
- ▸Pick any country/region to check rankings on App Store storefronts worldwide
- ▸A watchlist for your own and competitor apps, with change-vs-previous at a glance (▲ up / ▼ down / NEW)
- ▸A rank history chart plotting day-by-day positions over the last seven days
- ▸Notifications for significant rank moves, entering or leaving the results, and price changes
- ▸Background refresh — recently searched keywords are re-measured automatically, even with the app closed
- ▸Re-run any past keyword in one tap, still measured against the storefront you searched
- ▸No account, no ads, no tracking — data is stored only on your device
// Engineering highlights
Feasibility validation is built into the process. A UI-independent core (a Swift package) and a measurement CLI came first, scheduled with launchd to accumulate real data. Only after the intraday standard deviation confirmed the notification threshold would hold did we start building the app itself — killing the project's biggest risk in its cheapest phase.
The codebase is split into three layers — core, CLI, and app — with neither SwiftData nor SwiftUI reaching the core. Persistence is abstracted behind a SnapshotStoring protocol in the core: the CLI and tests use a JSON implementation, the app swaps in a SwiftData one built on @Model and @ModelActor. Fetching, diffing, and analysis are literally the same code in both, so a fix can never land on only one side.
Periodic collection uses SwiftUI's .backgroundTask(.appRefresh:), covering the five most recent search-history entries, each measured against the storefront it was searched on. Every Apple public API in the data path was measured first — result caps, paging, rate limits (a token bucket tuned to Apple's ~20 calls/minute guidance), even a 301 from a legacy host — and the design followed from those measurements. Endpoints found to be broken were identified the same way and designed out entirely.
Swift 6 with strict concurrency, SwiftUI, SwiftData, and Swift Charts, targeting iOS 26 and later. Zero third-party dependencies — clone the repository and it builds as is. Concept, validation, design, and implementation were all done in-house.
// Screenshots
Screenshots coming soon.
// Legal
// Disclaimer
* Rankings shown in the app are reference values based on Apple's public search results, and may vary by time of day and personalization.
