Inspiration

Appstead began with a simple frustration. Apple removed the portfolio overview from App Store Connect, and getting a clear picture across several apps became an exercise in switching accounts, opening reports, and piecing the story together by hand.

I wanted a private, native command center that could answer the questions an indie developer asks every day: What is earning? What is growing? What changed? Where are downloads coming from? What do users think?

What Appstead does

Appstead brings proceeds, downloads, subscriptions, trends, and reviews for every app you ship to iPhone and iPad.

  • See portfolio performance and recent changes at a glance.
  • Explore trends by metric, period, app, territory, and contribution.
  • Open detailed views for each app, including sales and download history.
  • Read and manage App Store reviews across the portfolio.
  • See where downloads and purchases happen on interactive maps.
  • Turn meaningful milestones into polished share cards, from unlocking proceeds in a country for the first time to download maps, review rating cards, and other moments worth celebrating.
  • Keep multiple App Store Connect workspaces separate, with isolated credentials and data.
  • Put useful business signals on the Home Screen with widgets and intentional notifications.
  • Export data when a deeper analysis is needed.

A built-in Demo Workspace lets anyone explore the complete product without connecting an App Store Connect account.

Privacy by design

Appstead is local-first. It connects directly to Apple's official App Store Connect APIs and report systems. App Store Connect credentials are secured in Keychain, and no Appstead server stores a developer's credentials or private business data.

Each workspace has its own credentials, persisted data, refresh state, notifications, exports, and widget snapshots. That isolation was a product requirement from the beginning, not something added at the end.

Appstead is written in Swift 6 with SwiftUI, Observation, and strict concurrency. Views render state; services do the work. The UI depends on app-owned provider boundaries rather than remote response types, so Demo Workspace, previews, tests, and live App Store Connect data all exercise the same domain models and product paths.

Fetched data is not a temporary cache. Appstead validates and normalizes Apple's APIs and reports, then imports them into a workspace-scoped SQLite store. SQLiteData handles the main persistence and observation layer. GRDB covers Trends queries, complex joins, window functions, and precise migrations. The local database is the source of truth for the UI, historical analysis, widgets, and exports.

The concurrency boundaries are intentional. Token state, per-workspace refresh coordination, database writes, imports, and widget snapshots stay isolated. Parsing and mapping remain immutable where possible. Duplicate refreshes are coalesced, imports are staged, and a partial Apple-side failure does not destroy the last known-good data. Every persisted business object belongs to a workspace, which prevents accidental cross-account mixing by construction.

Credentials live per workspace in Keychain. Appstead creates short-lived App Store Connect JWTs on demand and keeps them in memory only for their validity window. Raw keys, tokens, and private business data never pass through an Appstead server.

The visual system is just as deliberate. Appstead is a calm monochrome command center, not a web analytics product squeezed onto a phone. Dark mode uses near-black canvases, charcoal surfaces, off-white type, and subtle borders. Light mode uses soft gray canvases, white surfaces, and high-contrast black type. App icons provide natural color, with restrained moss and rust accents reserved for data that actually needs them.

I tried to go with minimalism while keeping it functional. Strong hierarchy, rounded typography, clean chart grids, sparse controls, and careful spacing make dense business information easier to scan. iPhone is built for quick checks. iPad is the power surface, with sidebars, multi-column layouts, and detail panes instead of stretched phone cards. Liquid Glass is used selectively for actions and transitions, not as decoration.

RevenueCat and monetization

RevenueCat powers Appstead Pro across monthly, annual, and lifetime products. The RevenueCat entitlement is the source of truth behind an app-owned purchase service, which keeps monetization logic separate from feature code.

The free Demo Workspace shows the full experience without using private data. Appstead Pro unlocks live App Store Connect workspaces. The annual plan includes a one-week free trial, and RevenueCat Customer Center gives customers a clear place to manage their purchase.

This structure keeps the free experience genuinely useful while making the value of upgrading concrete: connect real apps, keep multiple live workspaces, and follow an App Store business from one private native product.

Challenges

The hard part was not drawing charts. It was getting several Apple data systems to produce answers I could trust and explain.

App Store data can arrive late. Reports use different units and currencies. Permissions change with account role. Parts of the API are unclear or under-documented, so a lot of the work was edge cases: weird shapes, responses that could mean two things at once, and product combinations I did not expect. Some of those only showed up once real TestFlight data hit the app, because testers’ accounts behaved differently than mine.

Appstead has to surface those quirks without making the app feel broken. It also has to keep useful history on device, keep workspaces isolated, and fail cleanly when a source is temporarily down.

The other big challenge was dense business data on small screens. I was not trying to shrink a desktop portal onto a phone. Every surface had to justify itself, stay readable and interactive, and feel native from iPhone to iPad.

What I am proud of

Appstead shipped during the Shipaton window as a real App Store product, not a prototype. It combines a substantial data and privacy architecture with an interface that still feels clean and approachable.

I am also proud that Appstead did not arrive cold. I built awareness around it well before release, mostly through Threads and, to a smaller degree, the iOS indie developer community on X. I shared the work as it evolved: design decisions, working builds, screenshots, problems, fixes, and the occasional wrong turn.

TestFlight turned that audience into a direct product loop. Testers reported issues, challenged assumptions, shared how their own App Store businesses behaved, and pointed out the parts that felt genuinely useful or delightful. Their accounts also exposed data combinations and edge cases that my own portfolio never could.

The important part was listening without outsourcing the product direction. Community feedback shaped details, priorities, and polish, while the core vision stayed intact: private, local-first, workspace-native, distinctly Apple-platform, and visually restrained. The result is a better version of the product I set out to build, not a product designed by committee.

Having that audience in place made launch week especially rewarding. It felt like the continuation of a conversation rather than a cold announcement. People who had followed the work showed up, installed the finished app, shared what they were seeing, and celebrated the release with me. That mattered beyond the launch numbers.

I am especially proud that Appstead does not treat data as the end of the story. It helps developers recognize and share the moments behind it, like unlocking proceeds in a country for the first time, seeing an app's reach on a download map, or celebrating a review rating with a polished card. Those shareable milestones have become one of the product's unexpected delights.

The same system supports a first-run demo, multiple private live workspaces, detailed analysis, widgets, notifications, and exports without requiring an Appstead backend to hold customer data.

What I learned

The biggest lesson was not technical. Building in public is both rewarding and uncomfortable. Sharing unfinished work invites opinions, some useful, some contradictory, and some capable of pulling a product off course. I learned to listen closely, implement the ideas that made Appstead better, and still protect the product I wanted to make.

That meant operating far outside my usual comfort zone. Instead of disappearing into the code until launch, I talked openly about Appstead while it was still taking shape. I created a waitlist. The landing page evolved alongside the product as it moved from an early idea to TestFlight, pre-order, and release. Each TestFlight cohort had a reason behind it. I tried App Store pre-order for the first time and treated communication and marketing as continuing product work rather than something to add at the end.

It also meant sitting with a persistent doubt: would anyone really want this, let alone pay for it, when App Store Connect is free? Building awareness early, seeing testers use the product, and hearing which details mattered gave me evidence to keep going. The audience did not remove the uncertainty, but it made launch less of a blind bet.

I did as much as I could to make this launch even marginally better than those of my previous apps. That may sound modest, but it changed how I think about shipping. The work is not finished when the code is ready. Positioning, communication, trust, and giving people a reason to care are part of the product too.

The technical lessons still matter. Local-first is more than a storage choice because it shapes almost every boundary in the app, and a native adaptive foundation pays for itself when a product reaches new devices and layouts. They just were not the biggest lessons this time.

What's next

The App Store release is the starting line. There is a large roadmap ahead for deeper portfolio comparisons, richer reporting, more useful notifications and widgets, and better ways to understand what changed across an app business.

The goal stays the same: give indie developers a clean, private, no-nonsense way to understand the business behind every app they ship.

Built With

  • app-intents
  • app-store-connect-api
  • claude
  • codex
  • flowdeck
  • grdb
  • ios
  • ipados
  • keychain
  • revenuecat
  • sqlite
  • sqlitedata
  • storekit
  • swift
  • swift-charts
  • swiftui
  • widgetkit
  • xcode
Share this project:

Updates

Submission history