Rebuild Apple Photos as a self-hosted iOS app for an Immich server

A non-iOS developer had Claude Code map 226 Photos app actions, implement 147 of them in a native client for Immich, and test 140 in the simulator, to drop iCloud for 85,000 photos.

Done withClaude CodeinGitHub· Nov 10, 2026

What they did

The poster, u/SilentMode46 on r/ClaudeAI, moved about 85,000 photos and videos off iCloud onto a self-hosted Immich server and wanted a phone app that behaved like Apple Photos. They are not an iOS developer, so Claude Code wrote nearly all of the SwiftUI and UIKit code while they chose features, tried builds on their iPhone and said what felt off. Claude first used a reverse-engineering MCP server on the iOS 26.3 Photos frameworks to list every action the app supports, 226 in total. To keep it clean-room, one agent only wrote plain descriptions of each behaviour and the app was written from those notes. Claude then wrote UI tests, ran them in the iOS Simulator and compared screenshots with the real Photos app. It now also reads GitHub issues, reproduces bugs in the simulator, proposes fixes and drafts replies.

How it went

147 of the 226 actions work; the rest are iCloud or Apple-only services, Apple-internal, or one not possible on iOS. 140 of the 147 are covered by automated tests. The app, HomeRoll, is released free under MIT, with a Mac version built the same way. The hard part was performance: early builds crashed or stuttered at 85,000 items and it took many rounds of measuring on a real device to fix.

Worth knowing

The poster credits the fixed checklist of 226 actions, rather than asking to make it like Photos, and letting Claude check its own work in the simulator. Bug fixes and replies are drafted by Claude but nothing ships until the poster approves. The app needs your own Immich server and sideloading through AltStore, SideStore or your own signing.

Try it

With Claude Code· 6 parts to fill in

I want a native [platform] app that behaves like [reference app] but stores everything on my own [self-hosted backend]. First, list every user-facing action the reference app supports as a numbered checklist with a one-line plain description of what happens, written from observed behaviour, not copied code. Mark which ones depend on services I cannot use. Then implement the checklist in order, writing a UI test for each action and running it in [simulator or test runner], comparing screenshots against the reference app. Test performance with a library of [number] items. Stop after each batch of [number] actions and show me what passes and fails before continuing.

Square brackets are the parts to fill in. The prompt is ours; the story is theirs.

Where they said it

Related