RetroPocket — a hand holding an iPhone wearing the lime-green console skin, playing a pixel-art adventure, with the RetroPocket wordmark below

Industry
iOS, Retro Gaming
Role
Designer & Developer
Year
2026

RetroPocket is my own product: an iOS app that turns your iPhone into a classic handheld console and plays the cartridge games you legally own, 100% offline. I built it on an open-source emulation core that I never edited, wrapped in Swift and prompted into shape with Claude Code. Apple rejected the first identity under Guideline 4.1(a), so I rebranded it from scratch and shipped it. It has been live since April 2026, free to start, with a one-time Pro unlock.

  1. Before writing a single prompt, I framed the product like any other brief: who it's for, what hurts, and where the opportunity was.

    The research

    I studied how people play the classics they own and what existing tools get wrong: on a phone, emulation feels like a file manager, and nothing treats save files as untouchable. That insight became the product's north star — a console you hold, not an app you browse.

    The strategy

    I chose an open-source emulation core instead of writing one — a build-versus-buy decision that let me spend my time on the experience, not the engine — and set the business model early: free to play, with a one-time Pro unlock that sells convenience, never capability.

  2. Interaction design came before any code: a pixel-perfect handheld with flows measured in taps.

    A console, not an app

    I designed the interface as hardware: a fixed 393×852 stage with absolute positioning so the console never reflows on any device, seven shells as skins over the same geometry — D-pad, A/B, Start and Select never move — and every action one tap away.

    Flows and edge cases

    I mapped the free and the Pro journey side by side — same game, different ritual — down to the edge cases: imported games keep their original filename, so existing saves are found automatically and nobody loses a game, not even on update.

  3. I briefed Claude Code the way I would brief a development team: design system, constraints and acceptance criteria — and kept every decision mine.

    The brief is the craft

    Each prompt carried the design and the rules of the build: use only my specs, never touch the open-source core, stop and ask before changing anything unclear. The whole app came out at 1,483 lines of Swift I could read, question and review.

    The honest split

    AI wrote the C-to-Swift bridge, the audio engine's thread safety and much of the code. I defined the product, designed every screen, decided every interaction and flow, and reviewed everything that shipped. The decisions were never delegated.

  4. App Review rejected the first identity. I treated the rejection as a design brief and came back with a cleaner product.

    Rejection as feedback

    Guideline 4.1(a) stopped the first, nostalgia-heavy identity: too close to the original trademarks. I rebranded end to end — name, assets, metadata, a legal open-source boot ROM — keeping the handheld feel and dropping every mark. Approved.

    Validated by numbers

    Live since April 2026, free with a one-time Pro unlock. Downloads grow about 14% month over month, store impressions more than doubled, roughly one product-page visit in twelve becomes an install, and 2.2% of downloads unlock Pro within their first week.

Case study contents — the seven chapters of the RetroPocket story: product, architecture, UX, App review, MVP, metrics, and how do I really workChapter 01, Product — pain, idea, direction: a hand holding the lime-green console on iPhone, framing the problem before writing a single promptWhat RetroPocket is and the problem it solves — a classic handheld console on iPhone, 100% offline, free to start with a one-time Pro unlockThe path to RetroPocket in six steps — spot the itch, choose the open-source core, bridge C to Swift, design the console, rejected: rebrand it, ship then scale to v1.1Chapter 02, Architecture — core, bridge, console: an unmodified open-source engine, a Swift wrapper that keeps it safe, and SwiftUI on topThe C to Swift bridge — SameBoyCore never edited, the bridging header, EmulatorManager as the only file that speaks C, and pure SwiftUI views on topRules of the bridge — callbacks that can't crash, audio under lock at 44.1 kHz, one loading order, and file paths that survive the crossing into Cv1.1: scaling without breaking — a manager for files only, zero data loss on update, authentic color correction and a cheat engine of its ownChapter 03, UX — shell, screen, one tap: the interface is the hardware, a pixel-perfect handheld you hold, not a menu you browseUser flow — free and Pro load the same game: the file picker ritual for free users, silent copy into the Personal Library for Pro, both ending in playOne canvas, seven shells — grape, berry, kiwi, dandelion, teal, mystic and atomic skins over the same fixed 393×852 geometryRetroPocket Pro — what the lifetime unlock adds and why the app is freemium: Pro sells convenience, never capabilityFinal screens — the console in hand, load and play on the green and grey shells, and the cheat codes engine with its togglesChapter 04, App review — rejection, rebrand, approval: the first nostalgia-heavy identity stamped rejected under Guideline 4.1(a)Shipping past Guideline 4.1(a) in four steps — submitted with the old identity, rejected for intellectual property, rebranded with a legal boot ROM, approvedChapter 05, MVP — design, code, App Store: turning the design into a working emulator, prompted, built in SwiftUI, shippedA real prompt next to what it produced — the RomLibraryManager brief and the resulting Swift files, 1,483 lines of SwiftUI for iPhone and iPadKey metrics from App Store Connect — downloads growing 14% month over month, 52.7K impressions, about one page visit in twelve becoming an install, 2.2% unlocking Pro in a weekThe honest split — what I did myself, from defining the product to carrying it through App Review twice, and what AI helped with, from the C bridge to the cheat engineClosing — the lime-green console slipped into a back pocket on a neon-lit street, with the RetroPocket wordmark and the App Store badge
All projects