Everyone figured indie iOS apps demand backends – Firebase logins, AWS syncs, the whole nine yards. Cloud vendors push it hard, right? Subscriptions galore.
But here’s this guy. Builds a complete offline-first iOS app for his wife’s UK flea market hustle. Tracks buys, listings, sales, profits – all on-device. No servers. Zero costs. Lands on the App Store in 43 days. Using SwiftUI, GRDB-wrapped SQLite, and Claude Code for the heavy lifting.
Shifts the game. Proves you don’t need venture bucks or dev teams to ship something real. Niche? Sure. But scalable logic for any solo builder tired of API bills.
What Drove This Build – And Why It Actually Works
His wife hauls secondhand gear from car boot sales, flips on eBay and Vinted. Google Sheets? Chaos. Forgot purchase prices. Offers roll in – no clue on margins.
Photo snaps the item. Punch in cost. App crunches the lifecycle: bought, listed, sold. Tallies expenses like entry fees, shipping. Four currencies, auto FX rates cached locally. Offline forever.
Tech stack screams pragmatism. SwiftUI for views (iOS 17+). ViewModels as ObservableObjects. Services for auth, exports, location. DatabaseStore as Swift Actor – isolates all CRUD. Underneath: SQLite via GRDB, WAL mode, foreign keys, composite indexes. Local images. Google Drive? Optional sync only, drive.file scope.
No backend. BGTaskScheduler queues photo uploads in background. CoreLocation pings nearby markets.
Look. This isn’t toy code. Paginated queries on unsold items? SQL LIMIT/OFFSET over indexes. Night-and-day from JSON slop.
The key decision was making it offline-first. Car boot sales happen in fields with no signal. The app can’t depend on network for anything core.
That’s the quote that hits. Fields with no bars – real-world constraint most devs ignore.
Started simple. JSON files, one per entity: items, markets, expenses. Load all into RAM, tweak, dump back.
Fine for 20 items. Crawls at 200. No queries, no pagination.
One-day pivot: GRDB migration. Typed records. Versioned schema (v1 basics, v2 composites, v3 SKUs, v5 fees). WAL for concurrency.
Can Claude Code Really Ship a 43-Day App?
Claude handled boilerplate – GRDB structs, SwiftUI forms, CSV gen, OAuth flows. Big win: JSON-to-SQLite migration. Describe model, boom – code spits out.
But design? Human turf. Offline/sync split. Currency edges (direct/reverse/cross rates via USD pivot). Workflow fits.
My take: Claude accelerates solos 3x. Data backs it – indie App Store hits cluster around niche tools like this. Prediction? 2025 sees 10x more zero-backend apps. Echoes 2008 iPhone era, pre-cloud bloat. Back then, locals ruled; now AI revives it.
Currency smarts shine. Free API caches 365 days in SQLite. Offline? Stale warning, manual refresh. Paths: GBP-USD direct, USD-GBP inverse, EUR-CAD via base.
SKUs? Crockford Base32 – FH-20D6G0NR style. Time + atomic counter. Copy-paste to listings, match sales later. No I/L/O/U confusion.
Sync? Local-first. Queue uploads. BGTasks even suspended. CSV gzip, timestamp delta – only changed data. Drive auto-sheets it. No Sheets API privacy pitfalls.
Why Ditch JSON for SQLite – Hard Numbers
JSON: Every read loads everything. 200 items? Lag spikes.
GRDB: Proper indexes. Paginated lists fly.
Migrations handle evolution – four versions already.
WAL mode? Reads don’t block writes. Solo dev bliss.
And Claude? Didn’t touch product calls. That’s the insight others miss – AI’s your junior dev, not CEO.
Design? Figma system (cut off in original, but implied polish-over-time).
Users nibble it free. Wife’s Sheets? Obsolete.
Is This Model Scalable for Bigger Apps?
Short answer: For niches, yes. Zero costs scale infinitely.
Multi-user? Add optional sync later.
Market dynamics: App Store favors free utilities. 43 days beats agency quotes.
Critique: Claude hype real, but don’t sleep on human grind. 43 days includes weekends, iterations.
Unique angle – parallels SQLite’s rise in web (IndexedDB limits). iOS devs rediscovering local power amid cloud fatigue.
Bold call: Expect clones in Android, web PWA. Offline-first niches explode as API prices climb.
🧬 Related Insights
- Read more: WordPress Backend, SPA Frontend: The Headless CMS Hack That’s Turbocharging Sites
- Read more: Kubernetes 1.35 Finally Tames Wild Kubeconfig Executables with Exec Plugin AllowList
Frequently Asked Questions
What is GRDB and why use it for Swift iOS apps?
GRDB’s a lightweight SQLite wrapper – typed models, migrations, WAL concurrency. Beats raw SQL or JSON for query-heavy offline apps.
How to build an offline-first iOS app with Claude AI?
Start JSON, migrate GRDB. Use Claude for boilerplate. Prioritize local storage, optional sync. Test no-signal.
Does Claude Code replace human devs for app building?
No – accelerates boilerplate 3x, but product decisions stay human.