Nobody Plans:為羣組聚會安排計劃,毋須一人包辦
Every group chat has one person who plans everything. I built an app so nobody has to be that person.
作者製作羣組規劃應用程式 Nobody Plans,讓成員透過連結提交時間、預算和活動選擇,由應用程式安排計劃及公平分派任務。Gemma 4 (31B) 負責提出計劃,程式碼檢查器則核對空閒時間、預算、地點和無障礙需要。測試20個棘手羣組時,75%的 Gemma 原始選項違反至少一項規則;檢查器攔截了100%的違規選項,亦沒有錯誤拒絕合規選項。
This is a submission for the Hacktoberfest Open-Source AI Challenge Week 3: Slow and Steady
The Problem
We all have that group chat. The one where we make plans.
"We should go here." "We should go there." "We should really get together soon!"
Hundreds of plans. And somehow, none of them ever happen.
Why? Because planning is tedious. And if a plan does happen, the whole job falls on one person. They have to collect everyone's free times, find a place, book the tickets, and plan every detail by themselves. How exhausting.
So I thought: what if we made that job simple, so everyone could just be happy about going out, instead of stressed about planning something that's supposed to be fun?
The Solution
Nobody Plans. One person sends a link. Everyone answers a few taps. The app does the planning.
And it doesn't have to be in person. It works online too, for all your long-distance friends.
It's very simple, and it works just like a paper planner:
| Tab | You | The app |
|---|---|---|
| What | Pick in person or online | Asks if you have an idea, or builds one for you |
| Who | Add names | Gives you a share link + a short group key |
| When | Connect Google Calendar. That's it. | Reads only busy or free, and finds when the whole group is free |
| Budget | Set your own, or one limit for everyone | Uses the lowest budget, so nobody is priced out |
| Activity | Pick any, or add your own | Shows what the group picked, with a Majority tag |
| Where | Location is detected for you; pick how far and car or no car | Finds real places that work for everyone |
| Plans | Pick up to 2 favourites | Majority wins: "Yay, plan fixed" |
| Tasks | Tap Done, or Swap | Splits the jobs fairly |
You don't even have to type your free times. Connect Google Calendar, and the app reads only when you're busy or free (never what your events are), and matches it with everyone else.
Designed so you don't have to think
If an app takes longer to figure out than the group chat, nobody will use it. So every design choice is about saving you time:
- It looks exactly like a planner: ruled paper on a bold magenta desk, pastel tabs down the side, and pages that actually turn (and curl away on your phone)
- One question per page, with the most common answer already picked
- You never answer the same thing twice. Everyone fills in only their own dates and budget, once
- Place options show up as sticker cards you can tap
- Everyone gets their own colour + initials (24 colour-blind-friendly choices), so you see who picked what at a glance
See it on a map

Every place card has a small map, and so does the final plan:
A pin for the meeting place
A coloured initials dot for each friend, placed at their rough area (about 10 km), never their exact address
You can see at a glance if a place is fair for everyone, or if one friend would have to travel much further than the rest
It's built with Leaflet + OpenStreetMap: open-source maps, no API key, no tracking. Online plans skip the map.
Planning for every friend
When one friend uses a wheelchair, someone usually ends up calling every cafe to ask. I wanted the app to care about that from the start:
- Anyone can privately add access needs: step-free entrance, accessible restroom, seating, quiet, close parking
- The planner only sees that someone has a need, never who
- Places that can't meet the need are dropped
- Places with no info say "Access not confirmed, call ahead" instead of guessing
Demo
Try it: https://nobody-plans.onrender.com
Code
Nobody Plans
Every group chat has one person who does all the planning.
This app does it so nobody has to be that person.
Built for the DEV Hacktoberfest Open-Source AI Challenge, Week 3: "Slow and Steady".
Live: https://nobody-plans.onrender.com
Screenshots
All taken on the live site with real places from Google Maps (via SerpApi), ranked by Gemma 4 and checked by code.
| Real places to pick from | The map: meeting pin, everyone's rough area | When are you free? |
|---|---|---|
![]() |
![]() |
![]() |
| Home | What are we planning? | Jobs split fairly |
|---|---|---|
![]() |
![]() |
![]() |
Every screen, on phone and laptop, is in docs/screenshots.
The problem
Planning one dinner takes dozens of messages over days. Someone asks when everyone is free, chases replies, finds a place, checks it fits everyone's budget, splits the jobs and sends reminders. If that person stops, nothing happens.
When2meet does times. Splitwise does money. Google Maps does places. Nobody takes over the whole…
How I Built It
| Part | What I used | Why |
|---|---|---|
| The brain | Gemma 4 (31B) | Open-weight model: suggests plans, explains why each place fits |
| Where Gemma runs | DigitalOcean serverless inference | Hosted open model; switches to Ollama on a laptop with one setting |
| Real places | SerpApi (Google Maps) | Real names, opening hours, accessibility info, so nothing is made up |
| Calendar | Auth0 for AI Agents (Token Vault) + Google Calendar | Never stores your Google login; only sees busy or free |
| Data | MongoDB Atlas | Groups, answers, votes, task history |
| Hosting | Render | The whole app is one Docker service |
| Errors | Sentry | Traces every Gemma call and every rejected plan |
| App | React + Vite + TypeScript + Tailwind, FastAPI | Works on phone and laptop |
Gemma suggests. Code checks.
AI is great at ideas and bad at rules. So Gemma suggests the plans, but before anyone sees one, a plan checker (plain code, no AI) checks it:
| Rule | What it checks |
|---|---|
| Free time | Is everyone actually free then? |
| Sane hour | Is it a normal hour in every time zone? (no 3 AM calls) |
| Budget | Is it under the lowest budget in the group? |
| Distance | Can everyone get there, with or without a car? |
| Real place | Did it come from real Google Maps results, and is it open then? |
| Access needs | Does it meet everyone's needs? |
Break a rule and Gemma gets one retry with the problem named. Break it again and the plan is dropped.
What I tested
Test 1: 20 tricky groups. A friend with a $0 budget. A friend 30 km away. Friends in different time zones. All with real Gemma calls.
| Result | |
|---|---|
| Raw Gemma options that broke at least one rule | 75% |
| Broken options the checker caught | 100% |
| Good options wrongly rejected | 0 |
Where Gemma went wrong most:
- Money: it suggested paid places to a group with a $0-budget friend 10 times.
- Distance: 23 of 28 distance breaks came from groups with one friend 30 km away, where no meetup spot could work. Gemma suggested one anyway. (Next: suggest an online plan instead.)
Test 2: a live plan in Bengaluru. $20 limit, a cafe and a park, one step-free need. It found 6 real places in 14 seconds. The 2 with a confirmed wheelchair-accessible entrance came first, and the rest were honestly labelled.
Test 3: the whole flow, start to finish, on the live site. An automated run with 3 test people: everyone answered, Gemma and SerpApi found places, everyone voted, the plan locked at a real cafe, and the jobs were split. The "Effort saved" page showed 3 people answered 22 questions, and the app checked 24 places for them.
Test 4: a real plan with my boyfriend.
My boyfriend was away for college work, and I was missing him. Normally, planning a call means one of us has to sort out a time while he’s buried in assignments. This time, I sent him the link, he tapped through it, and the app suggested an online watch party. We picked the latest Telugu movie, Rana Bali, and watched it together. We didn’t finish it, but that’s not the point. He had two jobs this week, his assignments and keeping me happy, and now at least one of them is easier.
Bugs I hit:
- Gemma wrote "the majority voted for this" before anyone voted. I changed the prompt so it describes the place itself.
- The page flip didn't show at first, because every section built a brand-new book. Now one book stays open and its pages turn.
- Google keeps new apps in testing mode, so for now only approved test users can connect their calendar. Everyone else can tap their free days instead.
Why Does Open Innovation Matter?
This app holds the data you'd least want to hand over: when your friends are free, where they live, what they can spend, and their accessibility needs.
- I choose where that data goes. Gemma is open-weight, so I decide where it runs. Today it's DigitalOcean. With one setting it runs on a laptop through Ollama, and nobody's plans leave the device. With a closed API, every friend's budget and access needs would go to a company I don't control.
- It stays free. A planner for friend groups shouldn't need ads or a subscription. An open model is cheap enough to keep it free.
- The rules are mine, not the model's. Budget, distance and access checks live in my code, and I can swap the model without rewriting the app.
- Honest limit: a bigger closed model might write livelier descriptions. It would still break rules sometimes and need the same checker.
The Lazy Payoff
| You used to... | Now you just... |
|---|---|
| Ask everyone "when are you free?" | Connect Google Calendar |
| Think of what to do | Tap "Build it for me" |
| Google places and check every budget | Get real places that already fit everyone |
| Argue over where to go | Majority wins automatically |
| Chase people who haven't answered | Tap Nudge: your email opens with the message already written |
| Do every task yourself | Tasks are split fairly, with Swap |
The planner's whole job shrinks to sending one link. At the end, the confirmed page shows "Effort saved": how many questions each person answered, how many places the app checked, and how many tasks it split for you.
What it does, and what it doesn't
It does the boring parts: finding a time, finding places, checking every budget and access need, running the vote, and splitting the tasks.
It doesn't:
- book or pay for anything. Booking stays a task with a link, so you're always in control of your money.
- send messages as you. Nudges open in your own email, and you choose to hit Send.
- read your calendar events. It only sees when you're busy or free.
- show anyone's access needs by name. The planner only knows someone has one.
Next, I'm testing it with my friends across India and the US. Slowly, but steadily.
Prize Categories
- Best Use of Gemma: Gemma 4 suggests and explains every plan, checked by code
- Best Use of DigitalOcean: Gemma runs on DigitalOcean serverless inference
- Best Use of SerpApi: real places, opening hours and accessibility info
- Best Use of Auth0 for AI Agents: Google Calendar busy/free through Token Vault
- Best Use of MongoDB Atlas: groups, answers, votes and task history
- Best Use of Render: the whole app runs on Render
- Best Use of Sentry: every Gemma call and rejected plan is traced
來源:DEV Community · dev.to














