Next Session: scheduling that runs itself.
Our own product, designed and built end to end. A cross-platform app, a serverless backend, and an automatic scheduler that proposes the next game night the moment the last one wraps. Shipped and live on Google Play and the web.
The problem
Everyone wants to play. Nobody can pick a date.
Recurring tabletop groups lose more evenings to scheduling than to anything else. The date lives in a group chat, the poll goes stale, one person ends up chasing five others, and the campaign quietly stops.
What we did about it
We made the app do the chasing.
A session is proposed, everyone votes their availability, and it locks itself in the moment enough players are in. Then the scheduler proposes the next one on its own. The organizer stops being the bottleneck, and the group keeps its slot.
What we built
Three systems doing the work.
The product is small on the surface and event-driven underneath. Every screen below is the shipped app.
Propose, vote, confirm.
A member proposes a session with candidate dates. Everyone votes accept or decline. When accepts hit the group's threshold, the session auto-confirms on the winning date. When the threshold becomes mathematically unreachable, it auto-denies instead of sitting stuck, which is the same signal that kicks off the next proposal.
Eight session states, each with its own colour and label, keep the whole table clear on what needs their attention.
An auto-scheduler that never sweeps.
Turn it on, pick a time of day, and the next session proposes itself the instant the current one resolves. No cron sweep and no queue of future sessions: exactly one session is ever in flight, and the resolution of that session is the event that generates the next.
If proposals keep getting turned down, it pauses itself and tells an admin rather than spamming the group. Paid recurring rules sit on the same engine with frequency, end conditions, and a conflict policy.
Availability the scheduler can read.
Each player keeps a personal calendar: recurring weekly patterns plus one-off overrides. The app aggregates the table into a per-day group status, so a proposer picks a date that already works instead of guessing.
That same data is what the auto-scheduler searches forward through to find the next workable night.
Push and in-app notifications
Seven notification types with independent push and in-app toggles, RSVP action buttons on the push itself, and a per-user lead time before a session starts.
Groups, roles, invite links
Admin, organizer, and member permissions, plus rotating invite tokens so a shared link can be invalidated without touching the group.
Subscriptions and ads
A free ad-supported tier and a Next Session+ premium entitlement, gated at the tap rather than hidden.
In-person and online sessions
Address autocomplete for tables that meet in person, platform and join link for tables that meet online, both tappable from the session.
Eight languages, three themes
English, Dutch, German, French, Spanish, Italian, Polish, and Portuguese throughout, including server-sent notifications, with light, dark, and system appearance.
Motion as product polish
A custom launch animation, circular reveal transitions, skeleton loading, and confetti on confirmation, all respecting reduced-motion settings.
How we work
How this project went.
Scope and plan
We wrote the product down before we wrote code: roles, session lifecycle, notification matrix, and the rule that only one session is ever in flight. That decision removed a whole category of edge cases later.
Build and iterate
One Flutter codebase for Android and web, real-time data from day one, and cloud functions written alongside the screens that trigger them. Localization and dark mode went in early rather than as a retrofit.
Launch and support
Store listing, privacy and terms, consent, analytics, and a marketing site on the same hosting. The app is live and the infrastructure is ours to keep healthy.
Under the hood
The stack we ran it on.
Chosen so one team could own the app, the backend, and the deployment without handing anything off.
- Flutter, Material 3
- Riverpod state
- go_router navigation
- Android, web, iOS-ready
- Firebase Auth
- Cloud Firestore
- Cloud Functions
- Cloud Storage, App Check
- Cloud Messaging push
- RevenueCat subscriptions
- Google AdMob
- Google Places autocomplete
- Astro static site
- Firebase Hosting
- Google Play release
- Service worker push
Have a software project in mind?
Tell us what you're building and we'll tell you honestly how we can help.