# Photo2Post

> Photo retouching by professional artists, ordered from the phone: pick a service, send your photos, get them back retouched.

Case study by Paolo Gianfelici (Full-stack developer & UI/UX designer). https://paologianfelici.com/work/photo2post

- **Role:** Flutter developer: the 4.0 redesign, the move to credits and payments, orders, the archive and folders, and every release since June 2025
- **Client:** Image Retouch srl
- **Period:** 2025 – today
- **Platforms:** iOS and Android from one Flutter codebase
- **Stack:** Flutter, Dart, GetX, Firebase Auth, Cloud Firestore, Cloud Functions, Cloud Storage, Cloud Messaging, Stripe, PayPal
- **Google Play:** https://play.google.com/store/apps/details?id=com.photo2post.app

Photo2Post is retouching done by people, not filters. A host who needs the flat to look its best on a listing, a shop owner with products to put online, someone with a portrait to fix: they choose a service in the app, send the photos with a note, and a few hours later the photos come back from the studio's artists, each in two retouched versions, to compare with the original and rate.

The app is how customers order and pay. Retouching is paid in credits, bought in packages by card, Apple Pay or Google Pay through Stripe, or with PayPal; every finished photo stays in an archive, to download, share or sort into folders. I joined in June 2025, redesigned the app as version 4 and have been its developer since.

*Photo2Post is on the stores. The recordings on this page do not touch the service: they run the released code as a self-contained build, with Firebase, Stripe and the studio answered inside the page. The photos are drawn for this portfolio, the customers and orders are invented, payments use a test card that is never charged, and nothing was sent anywhere.*

- 77: of the 80 commits since June 2025 are mine
- 49%: of today's lines of Dart were last written in my commits
- 31k: lines of Dart in the app, excluding generated code
- 2: retouched versions of every photo, from the studio's artists

## From a photo on the phone to a retouched one

### Choosing what to retouch

The home page is the catalogue: each service with a before-and-after example that slides by itself, the delivery time and the price in credits per photo. The customer picks one and adds photos from the camera or the library.

### The cart and the order

One line per photo, each with a note for the artist ("straighten the walls", "take the boxes out"), checked for links, e-mail addresses and bad words before it is sent. Confirming uploads the photos, takes the credits from the account and hands the order to the studio.

### Signing up when it matters

The catalogue and the cart work without an account; it is asked for at the first order, as a private customer or a business. Apple, Google, Facebook or e-mail, with the consents, and two free credits to start. A customer who has not bought yet is offered a welcome package with a fifteen-minute countdown.

### Back from the studio

A notification says the photos are ready and opens the order. Each photo can be seen as sent and in its two retouched versions, rated with stars, downloaded or shared.

### An archive, and folders

Orders by month, in progress or completed; an archive of every retouched photo with a download button on each; and folders the customer makes on the phone (for a listing, for a shop), shared or downloaded all at once.

### Credits

Packages priced per credit, a discount code checked on the server, the VAT shown, then the saved card, Stripe's payment sheet, Apple Pay, Google Pay or PayPal. The credits are in the account as soon as the payment goes through.

## How it was built

### A redesign, then a new way to pay

Version 4 rebuilt the screens the customer goes through: sign-in and sign-up, the services page with its before-and-after examples, the cart, orders, privacy and terms. Then the app moved from paying for each order to credits: packages, the checkout with discount codes, the welcome offer, the rules for free credits and when to suggest buying more.

### Firebase and the order pipeline

GetX for state, routing and dependencies; Firebase Auth with custom claims for the customer role; Firestore for services, users, orders and their details; Cloud Storage for the photos and their thumbnails; Cloud Functions to confirm an order, check a discount code and record a rating. The app writes a pending order with its details and uploads, and a function turns it into an order for the studio.

### Keeping it on the stores

Every release since June 2025, from build 70 to build 106, with the fixes that come with a live app: photo permissions on iOS, the keyboard over the cart's notes and the checkout, sign-in retries on slow networks, a notification that opens the right order.

## Recording a live app: The app is real. The photos are drawn.

Photo2Post has real customers, their photos and their payments. None of that belongs in a portfolio, so the recordings use a copy of the released code that runs on its own, with a stand-in for everything behind it.

- **The released code, built for the browser.** A Flutter web build at phone size, told it runs on an iPhone. The app keeps photos, the cart and thumbnails in files, which a browser does not have, so the demo gives it a file system in memory; push notifications, analytics and crash reporting are switched off.
- **Firebase, Stripe and a studio, inside the page.** Sign-in and Firestore run on the in-memory fakes Firebase projects use in their tests, seeded with a catalogue and a returning customer; Storage and the Cloud Functions are answered by small stand-ins. Stripe's API is answered with a test card, and its payment sheet is drawn by the demo. A virtual studio sends orders back and raises the notification.
- **Drawn photos.** The company's example photos and stock pictures stay out. A script draws ten scenes (rooms, products, dishes, a beach, a portrait, a city), each as the customer's crooked, dim, cluttered "before" and as two retouched versions, and the phone's photo library is a picker of those.
- **Recorded offline.** The recorder refuses any request that leaves the machine, so a take cannot reach the real service.

The logo, the interface, its icons and illustrations and the credit packages are the app's own. The photos, the catalogue of services, the customers, orders, folders and the payment card are sample content made for this portfolio.

## Recordings

- **A first order, from the photo library to the studio and back** (106 s): A host shoots her flat for a listing. She picks the real-estate service, chooses two photos from the phone, writes what she wants changed, signs up (two credits are free) and sends the order. When the artists are done the app notifies her, and she compares the retouched versions with her original. https://paologianfelici.com/media/photo2post/clips/first-order.mp4?v=5af4834d91
- **A returning customer: portraits, the archive and folders** (65 s): Elena runs a guest house and a small shop and sends photos every week. A portrait comes back from the studio; she compares the two versions and rates them, then goes through her archive of retouched photos and the folders she keeps for her listing and her shop. https://paologianfelici.com/media/photo2post/clips/delivery.mp4?v=85cba8fcaa
- **Buying credits** (44 s): Credits pay for the retouching. Elena buys a package with a discount code and a card, in Stripe's payment sheet (a test card in the demo: nothing is charged), and the credits are in her account at once. https://paologianfelici.com/media/photo2post/clips/credits.mp4?v=119c1f132d
