Rainflow
Rainflow — delivered to Prayoga Wiradisuria
Cross-platform app for building and sharing multi-step routines — with the publishing, subscription and notification layer behind it.

Rainflow lets people build a “flow” — an ordered, repeatable routine such as a five-day workout programme, a weekend itinerary or a study plan — and then publish it for other people to subscribe to. We built it end to end: the Flutter client, the NestJS API underneath it, and the messaging layer that turns a private checklist into something shareable.
The challenge
A personal routine app is a straightforward data model. The moment a routine can be published and followed, it stops being one. Now the same flow is authored by one person and consumed by many; it has a private draft state and a public one; the people subscribed to it need to hear about it when it changes; and every read has to be answered against who is asking. All of that had to stay invisible from the app — someone working through a five-day programme on their phone should never meet the machinery underneath it.
The approach
The flow is the unit everything else hangs off. Authoring and publishing are kept as separate concerns, so editing a draft is never the same act as changing what subscribers see. Subscription is modelled as a relationship rather than a copy, which is what lets an update reach the people who took the flow. Following sits alongside it as a second, looser relationship — you can follow an author without subscribing to everything they publish — and notifications are driven off both. In the app, that model surfaces as something plainer: a flow is a list of steps you move through, filed in a folder you chose.
The build
The app is a single Flutter codebase covering iPhone and iPad. Behind it, a NestJS service carries the REST API, with authentication handled by JWT so the client holds a token rather than a session and every request arrives with its own identity. Notification fan-out runs through RabbitMQ rather than inline in the request: publishing a change to a flow with a hundred subscribers should return as fast as one with none, and the queue is what keeps that promise.
Built with
NestJS
REST API and application server
Flutter
Cross-platform app client
RabbitMQ
Message queue behind publish, subscribe and notify
What the build covers
- Flows as ordered, multi-step routines, with per-step timing and day-by-day tabs
- Step detail carrying its own photos and notes
- Folders for filing flows by purpose — social, personal, travel, study
- Account creation and JWT-based login
- Full CRUD for flows and their ordered steps
- Publishing, which separates an authored draft from what subscribers see
- Sharing and subscription, so a published flow can be taken up by other users
- Queue-backed notifications to subscribers when a flow they follow changes
- Follow and unfollow, forming the network between authors and readers
- Profile management
- One Flutter codebase covering iPhone and iPad
Got an Idea?
Let's shape it into something people love to use.