CARTOGRAPH
Cartograph — iOS MVP Scope
Company: Cartograph (company id retro-games) · Date: 2026-10-01
Stage: concept-stage company — this document is a scope, not a shipped app. Nothing below is built unless tagged [existing].
Status legend: [existing] = demonstrated on the landing-page demo today · [planned] = MVP build target · [later] = explicitly out of MVP scope.
1. Product & audience
Cartograph is a scan-and-collect app for physical retro video games. A photo of a cartridge, disc or case becomes a verified catalog entry — console, region, edition, condition — plus a dated, sourced value estimate, shelved in a collection that feels physical.
Primary audience / job to be done
| Audience | Job |
|---|---|
| Collector with 50–2,000 items | "Tell me what I have, what it's worth, and what I'm missing — without a spreadsheet." |
| Flea-market / yard-sale buyer | "In 10 seconds in the aisle, is this a $5 cart or a $500 one? Am I about to buy a duplicate?" |
| Retro game store | "Batch-intake inventory and price checks at the counter." |
| Haul/shelf content creator | "Show my collection beautifully; make shelf content people can browse." |
The v1 promise: photo → verified edition → graded condition → dated estimate → shelf. Deliberately not a marketplace, not a price-guide website, not an emulator front-end. No game downloads of any kind.
2. Screens & golden path
| # | Screen | Purpose |
|---|---|---|
| 1 | Onboarding (2 panels + sign-in) | Pick collected consoles; choose anonymous-identifier sign-in (Sign in with Apple) |
| 2 | Shelf (home) | Tactile shelf/grid of owned items; totals; wanted-list tab |
| 3 | Scan camera | Live camera w/ viewfinder; single-shot capture; bulk "desk-scan" mode [later] |
| 4 | Confirm match | Identified title + confidence; user picks region & edition chips [existing: demo] |
| 5 | Condition | Loose / CIB / Sealed + grade chips with guided checklist [existing: demo] |
| 6 | Estimate card | Dated, sourced value estimate + 12-mo trend [existing: demo] |
| 7 | Item detail | Full record: photos, edition, condition notes, estimate history, duplicate flag |
| 8 | Wanted list | Items marked wanted; estimate drift alerts [planned] |
| 9 | Settings / export | CSV export, grading defaults, data controls |
Golden path (MVP acceptance flow): Open app → tap Scan → photograph a cartridge → confirm edition (≤2 taps) → grade condition → see dated estimate → item lands on shelf → rescanning the same item surfaces duplicate detection.
3. MVP feature set & acceptance criteria
| Feature | Acceptance criteria |
|---|---|
| Photo capture | [planned] AVCaptureSession single-shot; works under typical desk lighting; saves HEIC + downscaled copy for upload |
| Identification | [planned] On-device candidate proposal → catalog match with confidence; user must confirm console/region/edition before save. [existing: demoed] |
| Edition confirmation | [planned] Region (NTSC-U/PAL/JPN…) + edition tree per title (e.g. PS1 Black Label vs Greatest Hits). Ambiguous matches always ask rather than assume. |
| Condition grading | [planned] Loose/CIB/Sealed + 4-step grade with per-completeness checklists. [existing: demoed] |
| Value estimate | [planned] Per edition × completeness × grade; always dated, always shows source label ("sold-listing aggregate"), never a bare number. Sample data labels where applicable. |
| Collection shelf | [planned] Persistent local collection; tactile shelf UI; sort/filter by console, value, recently added. [existing: demoed] |
| Wanted list | [planned] Mark items wanted; visible in shelf + item detail. [existing: demoed] |
| Duplicate detection | [planned] Scan of an already-owned edition flags it and opens the existing record instead of adding. [existing: demoed] |
| Purchase price field | [planned] Optional "paid" amount per item; collection totals show paid vs. estimated. |
| CSV export | [planned] Full collection export from Settings. |
| Offline | [planned] Shelf and records readable offline; scans queue until connectivity returns. |
Out of scope for MVP [later]: buying/selling/trading lanes, physical mystery drops (scoped separately — inventory, fulfillment, returns, margins), barcode scanning for newer games, Android, social profiles, grading-service integrations.
4. Architecture & Apple frameworks
- App: SwiftUI, iOS 17+ deployment target, SwiftData (or Core Data) for the local collection store.
- Camera: AVFoundation (
AVCapturePhotoOutput); Vision framework for on-device rectangle/text detection to crop the cartridge before upload. - Identification pipeline (planned, dependency-flagged):
- Auth & sync: Sign in with Apple; collection sync via CloudKit private database (no custom auth server needed for MVP; keeps costs near zero and data private-by-default).
- Processing split (local vs hosted): camera capture, cropping, shelf UI, collection store, duplicate detection → on-device. Image embedding match and pricing aggregates → hosted. Offline scans queue locally (
BackgroundTasksfor retry). - Settings: StoreKit 2 later for subscription;
Photosadd-only permission for saving scan photos to library (optional).
1. On-device pre-processing: object bounding box + label crop via VNDetectRectanglesRequest / VisionKit.
2. Hosted match service: image embedding similarity against our edition catalog (self-hosted model or a vendor API — a dependency decision, see §6). Deterministic edition is only finalized with user confirmation.
3. Pricing: dated estimate pulled from a pricing-data source (sold-listing aggregates) — external dependency, never invented numbers.
5. Permission UX
| Permission | When asked | Fallback |
|---|---|---|
| Camera | First tap on Scan, with a one-line explainer ("to identify your games") | In-app photo-picker via PhotosPicker (PHPicker requires no permission) |
| Photo library (add-only) | Only if user enables "Save scan photos" | Feature off by default |
| Notifications | After first wanted-list mark, contextual | Silent wanted list, no alerts |
| Sign in with Apple | First sync/save | Local-only mode — collection persists on device |
Every permission is asked in context, never on first launch.
6. Data & API dependencies (open, not invented)
| Dependency | Need | Status |
|---|---|---|
| Edition catalog | Title/console/region/edition tree + label imagery for matching | Dependency — options: licensed catalog DB, community-sourced dataset, or own catalog build for the pilot console set |
| Sold-listing pricing | Dated, sourced value estimates | Dependency — partner feed or licensed data; MVP shows date+source with every number |
| Match service | Image→edition embedding match | Dependency — build small (pilot consoles only) or vendor |
| Backend | Thin hosted API: match endpoint, estimate endpoint, edition tree | Cloudflare Workers + D1/R2 pattern (matches studio infra) or similar low-cost edge stack |
7. Monetization (hypotheses, to be validated)
- Pilot: free.
- Post-pilot hypothesis: free tier (≤100 items, 20 scans/mo) + Cartograph Pro ~$4.99/mo or ~$39.99/yr (unlimited scans, full history, wanted alerts, bulk mode). Numbers are hypotheses pending pilot willingness-to-pay data.
- Store tier (batch intake, multi-user) explored only after collector PMF signals.
- Later lanes (marketplace take-rate, mystery drops) scoped and modeled separately — inventory, fulfillment, returns, margins.
8. Build sequence
- Sprint 0 — catalog data model (title/console/region/edition/condition), seed pilot console set; shelf UI skeleton.
- Sprint 1 — camera capture + on-device crop; confirm-edition flow against stubbed catalog; condition grading; local SwiftData collection.
- Sprint 2 — hosted match service for pilot console set; estimate endpoint (sourced, dated); duplicate detection; wanted list.
- Sprint 3 — Sign in with Apple + CloudKit sync; CSV export; offline queue; TestFlight pilot build → accuracy-validation pilot (see GTM).
- Hardening — accessibility audit (VoiceOver, Dynamic Type, Reduce Motion), App Review privacy manifest + nutrition labels, then store submission.
9. Key unresolved decisions
- Catalog source: license vs. community vs. build-in-house (cost vs. coverage trade-off).
- Match model: self-hosted embeddings vs. vendor vision API — depends on catalog licensing terms.
- Pricing feed: which sold-listing source allows app redistribution, at what cost.
- Whether condition grading guides toward hobbyist grades (Good/VG/NM) or aligns to WATA-style tiers later.
- Store/batch-scan persona timing vs. collector-first focus.