|
|
Iris is a pro camera app for iOS. It features:
- 📱 Multi-lens switching (
0.5×/1×/ tele) and smooth zoom - 📸 Photo & video capture → dedicated Iris album in Photos
- 🎛️ Manual Pro controls (ISO, shutter, WB, focus, EV)
- 🎨 Look presets with native bake into captures (
iris-look-bake), including on-device Anime ML (AnimeGANv3 Shinkai / Hayao) for photos - 🧭 Assist overlays: grid, level, histogram, zebra, peaking, aspect crop
- ⚡ Capture presets, scene chips, countdown, volume shutter
- 🖼️ Gallery + last-shot review
Iris is a pro camera app for iOS and Android built with Expo Dev Client, Vision Camera, and a custom native look-bake module.
Primary day-to-day target is still iOS on a physical device; Android production builds (APK / AAB) are ready via EAS — see Play Store docs below.
nvm use && npm install
npm run prebuild:ios && cd ios && pod install && cd ..
npm run iosA physical iPhone is required for camera preview and capture (Simulator has no camera hardware).
Day to day after the first native build:
npm start # expo start --dev-client
# open the Iris Dev Client on device- Website: dmitryshelomanov.github.io/iris
- Repository
- Issues
- Expo SDK 57 docs
- Vision Camera · docs
- Expo Router
- Native look bake:
modules/iris-look-bake/— Anime ML uses on-device AnimeGANv3 Shinkai / Hayao ONNX weights - Privacy policy:
docs/privacy.md· live page - Store assets map — what to upload where, regenerate commands
- Play Console setup — AAB upload, keystore backup,
eas submit - Store listing copy — name, short/full description, asset paths
- Data safety answers — Play Console forms & permissions
- Listing assets:
docs/play-store/· phone screenshots:docs/store-screenshots/android/framed-*.png - iPhone App Store screenshots (ready):
docs/store-screenshots/*.png
npm run build:android:preview:local # local APK for sideload (preferred)
npm run release:android:github # upload newest preview APK to GitHub Releases
npm run build:android:local # local AAB for Play Store
npm run screenshots:store # iPhone marketing set (1290×2796)
npm run screenshots:play # Play graphic + Android framed screenshotsGitHub Releases (sideload APK): https://github.com/dmitryshelomanov/iris/releases
| Item | Android / Play | iOS / App Store |
|---|---|---|
| App id / package in config | Done (com.iris.camera) |
Done (com.iris.camera) |
| Icon + splash in binary | Done | Done |
| Privacy policy URL | Done (live) | Done (same URL; paste in ASC) |
| Phone listing screenshots | Done (framed-*.png) |
Done (01–06.png) |
| Feature graphic / listing icon | Done (play-store/) |
n/a (uses app icon) |
| Listing copy + compliance docs | Done (LISTING, DATA-SAFETY) |
Todo (docs/app-store/ not started) |
| EAS production profile / scripts | Done (build:android, upload keystore on EAS) |
Todo (no build:ios / submit yet) |
| Store-signed production binary | Done (AAB via EAS) | Todo (.ipa via EAS) |
| Developer account + store console app | Todo (Play Console create + first AAB upload) | Todo (Apple Developer + App Store Connect) |
| Automated submit credentials | Todo (Google service account for eas submit) |
Todo (App Store Connect API key) |
| Internal test track | Todo (Play Internal testing) | Todo (TestFlight) |
| Tablet screenshots | Optional | Todo if supportsTablet stays true |
| Public production release | Todo | Todo |
Full asset map: docs/STORE-ASSETS.md. Android upload steps: docs/play-store/PLAY-CONSOLE.md.
- Node 22.13+ (see
.nvmrc) - Xcode + CocoaPods (
podonPATH) - Physical iPhone for camera preview and capture
| Script | Purpose |
|---|---|
npm start |
Metro + Dev Client |
npm run ios |
Native Debug build and launch |
npm run ios:prod |
Release build on a physical device (no Metro) |
npm run build:android:preview:local |
Local EAS Android APK (sideload) |
npm run release:android:github |
Upload preview APK to GitHub Releases |
npm run build:android:local |
Local EAS Android AAB (Play Store) |
npm run submit:android |
EAS submit to Play (internal track) |
npm run screenshots:store |
iPhone App Store marketing screenshots |
npm run screenshots:play |
Play feature graphic + Android screenshots |
npm run lint |
Prettier check + typecheck |
npm run lint:types |
Typecheck (tsc --noEmit) |
npm run format |
Prettier write |
npm run format:check |
Prettier check (CI) |
| Layer | Choice |
|---|---|
| App | Expo SDK 57 + Dev Client (not Expo Go) |
| Routing | Expo Router (app/) |
| UI | NativeWind + Reusables in src/shared/ui/ |
| Camera | react-native-vision-camera + Nitro modules |
| Looks | Local Expo module modules/iris-look-bake |
| Icons | lucide-react-native |
Feature-Sliced Design under src/, with thin Expo Router screens in app/:
app/ Expo Router entry points
(tabs)/index.tsx Camera
gallery.tsx Gallery
settings.tsx Capture defaults
permissions.tsx Permission help
src/
pages/ Screen compositions
widgets/camera-screen/ Main camera widget
features/camera/ Lenses, manual, looks, overlays
features/media/ Recents, review UI
features/onboarding/ Permission / onboarding gate
entities/capture/ Library save + recents model
shared/ Theme, utils, UI primitives
modules/iris-look-bake/ Native look bake (photo / video)
assets/images/ App icon, splash, Android adaptive icons
docs/STORE-ASSETS.md Store listing asset map
docs/store-screenshots/ App Store + Play marketing screenshots
docs/play-store/ Play listing copy, graphic, runbook
docs/images/ README screenshots
| Simulator | Physical iPhone | |
|---|---|---|
| UI / navigation | Yes | Yes |
| Camera preview | No | Yes |
| Lens switching | N/A | Yes (device-dependent) |
| Capture / bake | No | Yes |
Source assets live in assets/images/ and are wired in app.json. Native iOS copies live under ios/Iris/Images.xcassets/.
After changing icons or splash, rebuild the native app (npm run ios). If the home-screen icon does not update, delete the app from the device and reinstall.
Built by Dmitry Shelomanov — Senior Frontend / React Native developer.
- 🌐 Personal site
- 💬 Telegram
- 🐙 GitHub
MIT © Dmitry Shelomanov

