Inspiration
Qessa (قصة) means "story" in Arabic. Small online sellers — the Instagram, WhatsApp and Etsy shops run by one person — sell through Stories every day, but they have no designer and no time. General AI image tools can give them one nice picture. What they can't do is keep the same product, colors and style across a whole sequence, and most of them mangle Arabic text. I wanted a seller to be able to take one product photo and walk away with a complete, consistent Story, ready to post.
What it does
- One photo → a full Story. Drop in a product photo and get 3–7 consistent, on-brand frames.
- Recipes instead of prompts. Product Drop, Sale, Restock, Customer Review and Lifestyle Set each know the structure of a Story that sells (teaser → reveal → details → price → call to action). There is also a comic-strip mode.
- Brand Kit. Your colors and style are applied automatically to everything you generate.
- Every size in one tap. Bundle mode generates 9:16, 1:1 and 4:5 versions — generated for each ratio, not cropped.
- Animate. Turn any frame into a 5-second video.
- Single mode. Any graphic from a prompt plus up to 5 reference images.
- Six languages: English, Arabic (full right-to-left), Spanish, French, Japanese and Korean.
How we built it
Qessa is a solo project. The app is Kotlin Multiplatform + Compose Multiplatform: one shared codebase for Android and iOS, with its own design-system module. I started from the KAppMaker KMP starter kit and built the product on top of it.
The backend is Firebase Cloud Functions with Supabase (Postgres) for users, credits and generation history. Image generation runs on Nano Banana 2 and video on Seedance 1.5 Pro, both through Replicate, with Cloud Tasks for long-running jobs and FCM for "your Story is ready" pushes. Prompts are built on the server from a structured spec, so I can tune a recipe without shipping an app update.
RevenueCat runs all monetization: the KMP SDK, RevenueCat Paywalls, Premium and Unlimited entitlements, consumable credit packs, and a webhook that credits the user's balance on the server. The Unlimited plan launched with a RevenueCat Experiment testing two price points.
Challenges we ran into
- Consistency across frames. The whole product depends on frame 5 looking like it belongs with frame 1. Every frame is anchored on the first frame's output and on the original product photo.
- Generation that survives real phone use. People start a Story and switch apps. Generation now runs as a durable background job, and the server treats each (Story, frame) pair as idempotent, so a retry returns the finished image and never charges twice.
- Unit economics. Every frame costs real money. Free welcome credits were farmable through anonymous reinstalls, so I removed them and rely on store-enforced free trials instead. The Unlimited plan uses a "relaxed" queue with a cooldown to stay sustainable.
- Arabic text. I tested several image models; one silently translated the requested Arabic into English. Finding models that render Arabic correctly, and keep it intact in video, took real evaluation work.
- Tooling churn. A mid-project migration to Android Gradle Plugin 9 and a major RevenueCat KMP upgrade each broke the iOS build in their own way.
Accomplishments that we're proud of
- Shipping Android and iOS from one codebase as a solo developer.
- Story sets that actually look like one brand, from a single photo.
- Arabic text that renders correctly — something even text-specialist models fail at.
- A complete monetization stack in production: subscriptions, credit packs, an Unlimited tier and a live price experiment.
- Six languages at launch.
What we learned
- Compete on the job, not the price. Qessa began as a generic image generator. Narrowing it to "consistent Stories for sellers" gave it a reason to exist next to ChatGPT and Gemini.
- Anything that costs money belongs on the server. Credits, pricing rules and prompts are all server-side; the app is a thin, honest cache.
- Subscription configuration deserves code review. A stale entitlement with the wrong letter case would have granted Unlimited to every Premium subscriber. I caught it before launch.
- Pricing is a hypothesis. Experiments let me test it instead of guessing.
What's next for Qessa
- More seller recipes and vertical template packs.
- An annual plan and win-back offers.
- A deeper Brand Kit and more localized example content, starting with Arabic.
Log in or sign up for Devpost to join the conversation.