Context
WhatToDo is our own product. We're 3VStyle, a Laravel studio, and alongside client work we build an app that answers one question: what to do tonight.
The idea is simple — help people decide without endless texting and arguments. Below is the full path: hypothesis, MVP, closed testing and the public release on 1 August 2026 on Google Play, RuStore and the web.
The hypothesis
We got the core insight on ourselves. "What should we watch?" on a Friday night can take 40 minutes of back-and-forth. The interesting part — both lose: you end up watching something neither of you actually wanted.
Hypothesis: if two people choose with swipes instead of words, the conflict disappears. Once you match, there is nothing left to argue about.
The mechanic isn't new — Tinder and its clones did it for other problems. The original part is applying it to a shared choice and carrying that match through to an actual plan.
MVP in 6 weeks
We deliberately capped the MVP:
- one room (a couple = 2 devices);
- a single deck of 30+ ideas;
- the "open — swipe — see a match" flow;
- no profiles, no stats, no push at launch.
We deliberately did not build:
- an idea library with filters;
- user analytics dashboards;
- premium features.
The point of an MVP is to validate the mechanic itself. Everything else comes after.
Stack
| Layer | Choice | Why |
|---|---|---|
| Frontend | Vue 3 + Vite | Fast start, great dev tools, familiar to us |
| State | Pinia | Minimal boilerplate, nice TypeScript |
| Realtime + auth + DB | Supabase | Postgres + realtime + auth out of the box |
| Push, analytics, crash | Firebase (FCM + Analytics + Crashlytics) | Android standard, native SDKs |
| Places and routes | Google Places | An existing venue database instead of ours |
| Android packaging | Capacitor | Web bundle to native APK/AAB |
| CI/CD | GitHub Actions + Capacitor build | One pipeline from Vite build to .aab |
More on architecture and realtime — in the deep dive.
What saved us time
- Supabase instead of our own backend. One engineer instead of three: managed Postgres, managed auth, managed realtime, and we keep full schema control.
- Capacitor instead of Flutter/React Native. We have a strong web team. No point learning a new language and toolchain for an app whose core is a swipe screen. The bonus we underestimated: the same codebase gave us the web version almost for free.
- Google Places instead of our own venue database. Collecting and maintaining a venue directory is a product in itself. We did not build it.
- Firebase for base telemetry. Crashlytics is non-negotiable for a closed test — Play Console crash rate is far too coarse.
What we revisited
- PWA vs Capacitor. We started as a PWA. It didn't fly: PWA installs scare Android users, the icon gets lost, and Play Store wants Play Store. We migrated to Capacitor.
- Couples only vs solo and groups. We built a product "for two". Closed testing showed people also open it alone, just to pick something for themselves, and pull in a group of friends. By release there were three modes: solo, couple, group (up to 4 people free, up to 10 on Premium).
- Invite links instead of room codes. The first join flow used a room code. Every step of manual typing cost us a share of pairs. We replaced it with a link backed by Android App Links: your partner taps it and lands straight in the session.
- Session TTL. Rooms lived forever in the first version. UX suffered: coming back a week later, you saw your own stale swipes instead of a clean start. We gave sessions a limited lifetime.
- What happens when nothing matches. "No match" originally ended the session — the worst possible ending, since people spent time and got nowhere. We added a negotiation mode that surfaces whatever came closest to shared interest.
What was hard
- Two-device sync via Supabase realtime. The "one offline, one online" scenario was solved with a local cache and replay on reconnect.
- Store paperwork. The privacy policy and account deletion instructions must live on dedicated public URLs, content rating has to be confirmed, screenshots have strict formats. RuStore adds its own review cycle, and budgeting "a couple of days" for it is optimistic.
- Payments across three surfaces. Google Play gives you its billing, but it does not cover RuStore or the web. We ended up with three channels: Google Play, Telegram Stars for RuStore and web, and promo codes. That is noticeably more code than "just add a subscription".
- "Less is harder". An MVP with 5 screens needs the same discipline as one with 50. To every "let's add…" we answered "not in the MVP".
What closed testing taught us
Closed testing was never about finding bugs — QA finds bugs. It was about what we could not see from the inside.
- The first session matters more than all the rest. If a couple does not reach their first match within a couple of minutes, there is no second launch. Everything sitting between install and first match got cut or sped up.
- A match is not yet a result. "You both want to eat out" sounds great right up until "where?". That is where nearby places via Google Places and routing came from.
- Retention rests on meaning, not mechanics. People come back when they can see something accumulating. Hence shared stats and streaks, 13 achievements and Weekly Wrapped.
- One deck gets boring by the third evening. We had to split content by situation: evening, weekend, extreme, vacation, food and drinks, night set. Plus deck customisation and a dedicated movie mode.
- People want to play, not only to plan. Hence shake, and surprise mode where one partner assembles the plan and the other only learns it on the way out.
What shipped in the public release
By 1 August 2026 the app is no longer an MVP:
- three modes: solo, couple, group;
- themed decks and deck customisation;
- realtime matches and a negotiation mode;
- nearby places and routing;
- invite links, shake, movie mode, surprise mode;
- couple stats, streaks, 13 achievements, Weekly Wrapped, wishlist;
- push and in-app notifications, English and Russian, Google Sign-In;
- Premium: extended filters, larger decks, unlimited contacts and re-swipes, premium palettes and animations.
What that means for users and where to get it — in the launch post.
What's next
Public launch— done on 1 August 2026: Google Play, RuStore and the web version.- iOS version — same codebase via Capacitor.
- More themed decks. "Rainy night", "no energy", "haven't been out for ages".
- Deeper group scenarios. A group does not behave like a couple; consensus works differently.
- Further into the plan. A match should carry through to the end — booking, time, reminder.
If you're shipping your own MVP
- Closed testing is the best product school. Twenty real couples teach more than two hundred internal runs.
- There is more work between MVP and release than between idea and MVP. An MVP answers "does the mechanic work". A release answers "will people come back tomorrow", and that is a different job entirely.
- Distribution is part of the product. Google Play, RuStore and web are three different sets of requirements, billing systems and review timelines. Plan for them early, not a week before launch.
- "All in one" kills the launch. Better one mechanic done properly than four half-done.
If you need something similar — we build projects like this for clients. If you want to follow along — join the WhatToDo Telegram channel.