2025年12月6日December 6, 2025SaaS開発SaaS Development10分で読める10 min read
現役iOSエンジニアが、 スクショ地獄から解放されたくて AIと3日でSaaSを作った話 【ScreenNative】A Working iOS Engineer Who Wanted Out of Screenshot Hell Built a SaaS with AI in 3 Days [ScreenNative]
Hi, I'm tsuzuki817 (@tsuzuki817), an iOS engineer at ZOZOTOWN.
My day job is working on a large-scale app, but when I tried to take my indie apps global, one particular task was so hopelessly tedious that it nearly broke me.
Yes: "making localized screenshots".
"If you're an engineer, you should automate this kind of grunt work."
With that one thought in mind, I built ScreenNative, a localization SaaS powered by AI (Gemini 3 Pro), pair programming with AI (Claude Code).
In this post I'll share what went on behind the scenes: how I built it, and the "robust architecture" I was particular about on the technical side.
ScreenNative - App Store screenshot localization with AI
Why I built it: a pain only iOS engineers understand
To take an app global, you have to upload screenshots for every language to App Store Connect. But if you try to do this properly, you're in for hell.
The screenshot workflow from hell
Switch the simulator's language to German with xcrun simctl
Build and launch the app
Navigate to the screen you need and take a screenshot
"The text is too long and it's spilling out of the button!" → readjust the Auto Layout constraints
Repeat this for 10 languages: English, French, Chinese...
Then repeat it again for every device size (6.9-inch, 6.5-inch...)
I thought, "This isn't a job for a human."
What ScreenNative solves
Upload just one existing screenshot, and the AI understands the UI context (buttons and spacing), then translates and replaces only the text at native quality without breaking the layout.
The team: me (CTO) × AI (lead engineer)
For this project, I decided the spec as CTO and PM, and the AI (Claude Code) implemented it as lead engineer.
I didn't just have it write code. I bounced ideas off the AI starting from the architecture design.
An actual exchange
Me: "I want Stripe payments and credit consumption to be atomic. How should I design Firestore?"
AI: "Keep an audit log in creditTransactions, separate from the users collection, and maintain consistency with runTransaction."
By speeding up the spec → implementation cycle as far as it would go, I was able to take a SaaS with payments all the way to deployment in effectively three days.
Tech stack and architecture
I didn't cut corners just because it was an indie project. I aimed for security and scalability at a level a company could adopt.
I stuck rigorously to "never trust the client (the browser)".
Firestore Security Rules
Users can't write to the users collection at all (allow write: if false). Credit consumption and plan changes always go through server-side API Routes, using the Admin SDK.
Magic byte verification
When an image is uploaded, I check not just the file extension but the start of the binary (the magic number), so disguised files get rejected.
2. A payment system with guaranteed idempotency
Webhooks from Stripe can arrive more than once because of things like network errors.
So I track event IDs in a stripeWebhooks collection and implemented logic that never processes a payment event twice once it's been handled (idempotency).
Credit consumption also uses a Firestore Transaction, so "generation succeeded" and "credits deducted" stay perfectly in sync.
Quick explainer: what is idempotency?
It means that running the same operation any number of times gives the same result. For example, even if "subtract ¥100" runs twice, only one deduction actually happens.
3. Type safety and DX (Developer Experience)
To keep development efficient, I was strict about having a "Single Source of Truth".
Deriving types from constants
The "supported languages list" and "plan definitions" are defined as constants, and the TypeScript types (LanguageCode, PlanId) are generated from them automatically (typeof ...). That way, when I add a plan, every place that needs fixing shows up immediately as a type error.
Double validation with Zod
I use Zod to validate API request bodies, keeping the TypeScript type definitions and runtime validation in sync.
Wrapping up
ScreenNative is a product where an iOS engineer seriously built the thing he wanted for himself.
Support for RTL (right-to-left) layouts such as Arabic
Recommended status bar cleanup (9:41 / 100%)
Automatic device frame compositing
I packed it with the kind of attention to detail only an app developer would care about.
Total Source Files
83 files
(about 8,000 lines)
ScreenNative - App Store Screenshot Localization AI
You can try your first 2 screenshots free (5 during the Product Hunt campaign!).
If you're a developer who wants out of tedious screenshot work, please give it a try!