Inspiration
I grew up with power cuts, monsoon evenings and the hour before dinner when everyone was in one room — and I realised I could barely picture those evenings any more. I wanted something that could take me back to them, not with my own old photos, but with how those years felt. Yestara is that: a way to go back to the evenings you thought you'd forgotten.
What it does
Yestara writes you a memory of the years you grew up in.
You answer a few questions once — the year you were born, where you grew up, the language you heard at home, the cartoon you rushed back for. After that you pick a kind of afternoon and a year, and Yestara writes that memory for you: a monsoon evening in 2005, the hour before dinner, the evening the power went. Claude writes the story in second person, about three hundred words. Gemini makes the photograph of how that year looked.
These are not your photographs, and the app never asks for them. It is a way of remembering how something felt, not a record of what happened — and it says so on the memory itself, in a line that travels with it wherever it is shared.
Everyone gets one memory a day for free. You can make more, and keep every one of them.
How I built it
Flutter, Riverpod and GoRouter on the front end; a clean-architecture slice per feature so each one could be built and demoed on its own.
The models are called from AWS Lambda over HTTPS — Claude Sonnet 5 for the story, Gemini 3.1 Flash Lite Image for the picture, asked for in parallel. The two share a memory key so one memory counts once. Keys live in SSM; nothing ships in the app.
RevenueCat is the entire billing layer — entitlement echoes_premium, monthly and annual, with a 7-day free trial as a Play offer. The app never names a trial of its own: it reads the free phase off the store, so changing the offer in Play Console needs no release.
Memories follow the account. Every memory is written to a cloud archive as it is made — DynamoDB for the text, S3 for the photograph — so a new phone or a reinstall gets everything back.
OneSignal brings people back to a memory, not just to the app. Permission is asked once, after someone's first memory, and nothing reaches OneSignal before they say yes. Each person is linked by their account ID, the same one RevenueCat uses, and carries five tags: the decade of their latest memory, how many memories they have, when they last made one, their plan, and whether they are new. An hourly job sends through OneSignal's API at 10 in the morning in the person's own timezone, at most one a day and two a week, and drops to one a fortnight after three are ignored. Each notification names a year and a theme, and opens that memory or the studio with the theme already chosen. Deployed: the dashboard campaign "The evening the power went", sent at 5 pm in each person's timezone. In its first hour it reached 6 people and 1 in 6 tapped it.
Challenges I ran into
A memory only survived if somebody pressed Save. Generated memories lived on the phone; only the ones a user explicitly kept reached their account. Nothing in the app said so, so the difference between "mine forever" and "gone on reinstall" rested on whether somebody noticed a button. I found it when memories I had made were not there after a reinstall. Keeping is automatic now, and the shelf limits went with it — they would have started refusing the eleventh memory somebody made.
Three different refusals looked identical. The server can say "your allowance is spent", "the free tier's model budget for today is gone", and "you have already had today's memory". All three arrived as HTTP 429, and the app said "try again in a moment" to every one of them — including the one that could not work until midnight. They travel as separate answers now, and the app only offers a retry when retrying can work.
Cost is a design constraint, not an afterthought. A memory costs about ₹4 in model calls. Home used to make one on every launch, which spent real money on people who had opened the app to re-read what they already had. Home offers it now and makes it only when somebody accepts.
I removed two of the four studios. Video costs roughly 150× what a story costs, and there is no ambient-audio model that does what "the sound of the place" would need. Shipping two rooms that work beat shipping four where two say "coming soon".
Accomplishments that I'm proud of
Every memory is real work by real models, and every number on the paywall is one the server enforces. It launched on Google Play on 16 September and has shipped nine updates since, each tested on a phone before it went out.
What I learned
Device testing is not optional and a widget test is not a device. The status bar turned white on a cream screen because a transparent app bar makes Flutter guess wrong; a share card went out with yellow debug underlines because it is built outside Material; a card test passed while the bug was still on screen, because a text box stretched to fill its page is perfectly centred. Every one of those was invisible until I looked at a phone.
What's next for Yestara
A photo booth: bring your own photograph and have it set in the year you choose. It needs upload, consent and moderation done properly, which is why it is next rather than now.
Log in or sign up for Devpost to join the conversation.