← Back

Painted In

Visit project ↗

I built Painted In to turn photos of the people and pets you love into personalized paintings. Choose a work from a curated catalog of public-domain art or import your own source artwork, select who belongs in the scene, and create an adaptation you can keep, share, or display at home.

I built the native iPhone app, image-generation backend, and Samsung Frame TV integration. The project brings together SwiftUI, AI image editing, in-app purchases, and local device communication in a single product.

Creating a painting

People and pets have reusable profiles with reference photos, so users can create new paintings without selecting the same photos each time. Each subject can have a subtle or prominent place in the composition. Users can follow a painting's progress, compare the result with its source, and request an included redo with the same artwork and subjects.

The collection stays on the iPhone, with optional private iCloud sync. Saved paintings can be exported to Photos, shared, or selected for a Home Screen widget.

Generation and purchases

The Node.js backend coordinates OpenAI image editing through a durable SQLite job queue. Users can submit multiple paintings and leave the app while they run. A bounded worker pool distributes available capacity across accounts, and the app recovers pending work when it reconnects.

Credit accounting is part of the job lifecycle: submission reserves an allowance, successful generation consumes it, and technical failures release it. Idempotent requests prevent retries from creating duplicate work. StoreKit purchases are verified on the server, and Sign in with Apple connects purchased balances across installations.

Art beyond the phone

An optional Samsung Frame TV integration handles discovery, pairing, upload, and display over the local network. The app confirms which painting reached the TV before recording it as displayed.

I also built an Apple Shortcuts action that rotates through saved paintings. Users choose when to run it or add their own automations, and new paintings join the rotation automatically.

Stack

Swift, SwiftUI, WidgetKit, App Intents, StoreKit, CloudKit, Node.js, SQLite, OpenAI image generation, and Fly.io.