I’m not a developer. A few months ago I couldn’t have told you the difference between a commit and a merge. What I did have was an idea I couldn’t shake: traditional to-do lists have never worked for me. A flat list of text gives you no sense of momentum — everything looks the same whether it’s been ignored for three weeks or added three minutes ago. The image that stuck was plate spinning, like the saying 'I've got too many plates spinning' I took that metaphor and started to build on it! . Each plate is weighted with points and colour-coded by urgency (9 -red for highest priority down to 1-green), so at a glance you know what actually matters. Miss the deadline and the plate smashes. That became the core of the Task Manager: a live, visual reflection of how on top of your priorities you really are. I also built it with busy people in mind and so for ease of use I added voice commands so plates can be launched on the move. The push notifications will bring you back to the app and help you prevent dropping plates.

Deadlines only get you so far, though. They’re great for the week, useless for the big stuff — the career change, the business you want to sell, the book you keep saying you’ll write “one day.” Those ambitions fail because they’re too big and vague to start. So Life Goals was built on one simple idea: any enormous ambition is just a nine plate stack. Name it, break it into nine concrete tasks, watch the stack build and turn golden once the 9 plates are in place. Before it can enter the trophy room you will need to carry out the reward that you set yourself at the goal setting stage, meaning that you have to reward yourself for the goals that you achieve.

I couldn’t build any of it in the traditional sense. So I directed an AI coding assistant through every step — architecture, debugging, App Store submission — while I focused on the part I could do well: knowing exactly what the product needed to feel like and deciding what was worth the risk.

9 Plates is built around two connected systems: Task Manager (free forever) Up to 9 spinning plates at a time, one per deadline and a level system that measures how consistently you’re getting things done. No ads, no limits, no credit card required.

Life Goals (subscription) Gives you the visual framework to set up to 9 long-term ambitions, each broken into 9 concrete tasks. You define your own reward for each goal; claim it and unlock a permanent Trophy Room trophy. Also includes Projects (up to 9 tabbed workspaces with 18 plates per screen on the task manager side). Life Goals & Projects unlock for £4.99/month via RevenueCat.

How did I build it? React + TypeScript on Vite, Capacitor for native iOS, Node/Express with Drizzle ORM on Render, Neon Postgres, Firebase auth, and RevenueCat for subscriptions. Every decision was directed by me and implemented with an AI assistant. I learned as I went — what git pull actually does, the difference between .xcodeproj and .xcworkspace, what an entitlements file is, and how to read a live console log well enough to find the one line that mattered.

Challenges I ran into. Getting the iOS version onto the App Store took four rounds of rejections: a blank-screen bug from declaring iPad support without an iPad UI, a stale demo account password, a tricky Sign in with Apple issue, and a subscription error that turned out to be temporary problems on Apple’s side. The app went live on 1 August. That felt like the finish line — until real testing began. I don’t own an iPhone, so every test meant borrowing one from my wife or my 17-year-old son. Try taking a phone that’s stuck to the side of a woman’s head half the day, or from a teenager mid-Snapchat. Not easy. Once I had consistent device access, a bigger bug appeared: the upgrade button failed for everyone with a generic “Billing failed” message. A full day of investigation (ruling out payment methods, App Store Connect, RevenueCat config, and user identity) finally traced it to something unexpected — the RevenueCat plugin had never been compiled into the native iOS app because the installed version didn’t support the project’s dependency system. Updating the plugin fixed it, confirmed with a real successful purchase. While I was in the console I also caught a silent push-notification failure on iOS caused by a missing entitlement. Somewhere in the middle I also ran the wrong git command on the wrong laptop and learned what a merge conflict looks like in real time. That one was more stressful than the actual bugs.

Accomplishments I’m proud of. Shipped the iOS version to the App Store with no formal development background — real users, real reviews, real subscriptions
Debugged a subscription flow all the way down to a missing native dependency instead of settling for a workaround
Got push notifications working end-to-end against the real backend
Survived four App Review rejections without giving up
Learned enough, fast enough, to understand what was going wrong and make good calls on the trade-offs

What I learned. You don’t have to write the code yourself to build something real — but you do have to understand it well enough to make good decisions and you have to have the will power to keep going and not give up - like a dog with a juicy bone. The same generic iOS error can come from a payment method, a dashboard setting, or a completely missing native plugin. The only way through is methodically ruling each one out. Small things (an entitlements file, a package-manager mismatch) can break an entire feature with zero warning. Directing an AI well means staying curious enough to ask “wait, why did that work?” instead of just accepting that it did.

What’s next for 9 Plates (iOS) Yearly subscription option on the paywall
Proper responsive iPad layout Marketing!

Built With

Share this project:

Updates

Submission history