Glofy: styles for AI photo shootsGlofy: black-and-white AI portraits
App icon: Glofy

Glofy

Paused · 2026

AI photo shoots and photo styling · iOS · 2025–2026

All engineering · from the client to infrastructure

9K+
downloads · 12 App Store versionsApp Store Connect · as of Sep 19, 2026
~6.5K
generations · 54 s median
~114K
lines of code in four parts
  • Built the Flutter app with subscriptions and ads.
  • Designed the server pipeline for photo and video generation.
  • Wrote bull-dozer, an open-source workflow orchestration library.
Stack
FlutterDartTypeScriptNestJSReactRedisPostgreSQLAWSPython
Focus areas
ArchitectureBackendCI/CDMonetizationAI pipeline
Period
November 2025 — release in January 2026 — stopped in May 2026
My scope
Client, server, workers, admin panel, infrastructure
Project team
Design, style prompts, marketing and user acquisition — on the side of the publisher, Evrika Games; another developer finished the payments and subscriptions integration

Challenge

A mobile app for AI photo shoots with its own image-processing system: from uploading photos to a finished series of pictures and videos in the chosen style.

The path of one order

A generation takes one to ten minutes — longer than an HTTP request lives. So an order goes through a queue and its own workflow: a crashed worker or a dropped connection does not lose the result.

  1. APPFlutter client

    Recompresses the photo — usually under 1 MB — and uploads it over tus, resuming after a dropped connection. A photo uploaded before is recognised by its hash and not sent again.

  2. APINestJS API

    Checks the preset and the coin balance, stores the order in PostgreSQL and queues a job keyed by the order id.

  3. QUEUEBullMQ on Redis

    Workers take jobs from the queue; a stalled job is handed to another worker.

  4. WORKFLOWbull-dozer

    The order's steps: generation on Replicate, for video — waiting for the model and ffmpeg processing, then the watermark. Each step has its own retries.

  5. CDNS3 and CloudFront

    The original, a thumbnail and a watermarked copy. Signed cookies open only the files of the user's own profile.

  6. RESULTBack to the app

    The server publishes the status to the user's Redis channel; the client waits for it with a long-polling request of up to 60 seconds.

A worker crash is never paid for twice
bull-dozer stores every step's result in Redis. A restarted workflow replays finished steps from the cache and does not call the paid model again; raw video is saved to S3 before the Replicate link expires.
The result arrives the moment it is ready
Long-polling on top of Redis pub/sub: the client learns about completion at once, without timer polling and without separate push infrastructure.

What I did

Outcome

Links

Need someone to take your product to release?