A meeting poll: propose several times, let people tick which they can make, and see which slot wins — the open-source answer to Doodle.
Build me a meeting poll that replaces Rallly and Doodle: propose some times, let people tick the ones that work, and see the winner without an account or a chain of emails. STACK - Node 20+ with Fastify, server-rendered HTML, a little JavaScript for the grid - SQLite through better-sqlite3, WAL mode - Caddy in front. No accounts, no sessions beyond a signed cookie for the organiser THE DATA MODEL - polls: id, public_id, admin_id, title, description, location, timezone, kind, created_at, closes_at, finalised_option_id, hide_results_until_voted, allow_comments - options: id, poll_id, starts_at, ends_at, position — a date, or a date and a time range - participants: id, poll_id, name, email, created_at, edit_token - responses: participant_id, option_id, answer — yes, no, or if-need-be - comments: id, poll_id, participant_id, body, created_at - Two identifiers per poll: a public one anybody with the link can use, and an admin one only the organiser has. Both are unguessable, and neither is the row id TIME, WHICH IS WHERE THESE THINGS BREAK - Every option is stored as an instant in UTC plus the timezone it was created in - Every participant sees the times in their own timezone, with the poll's original timezone stated beneath, and a control to switch - A poll can be marked 'timezone-free' — for a date without a time, or a meeting where everybody is in one room — and then no conversion happens at all - Daylight saving is handled by storing the zone name, never a fixed offset. Say so in a comment: a meeting in three weeks can cross a clock change VOTING - No account. A name, optionally an email, and a grid of ticks - Three states per option: yes, no, if-need-be — and the third is the one that makes these polls work, because it separates 'I can' from 'I would rather not' - A participant gets an edit link by email, or a token in their browser, so they can change their mind without a second row appearing - Optionally hide results until somebody has voted, so nobody follows the crowd - A poll can be closed, after which it is readable but not votable SEEING THE ANSWER - The grid: options across, people down, with totals per option - The winning option is the one with most yes, ties broken by fewest no, then by earliest — and the rule is printed, not implied - Highlight the option where everybody can make it, if there is one - Finalise: the organiser picks an option, everybody with an email gets the confirmation with a calendar file attached, and the poll page shows the decision at the top CALENDAR FILES, PROPERLY - The .ics carries the event with a correct VTIMEZONE block, a stable UID, and the organiser as ORGANIZER - A change to the finalised time sends an update with the same UID and a higher SEQUENCE, so calendars move the existing entry instead of adding a second one - Google, Apple and Outlook all tested; the README says which quirks were found NOTIFICATIONS - The organiser is told when somebody votes, batched to at most one email an hour - Participants are told when the poll is finalised or the times change - Every email has a link to stop being told, working without a login PRIVACY - Emails are stored only when given, used only for that poll's messages, and deleted with the poll - A poll deletes itself N days after its last option has passed, and the organiser is warned first - No third-party script, no cookie beyond the organiser's signed token THE INTERFACE - The grid works on a phone: it scrolls sideways inside its own box while the page does not, and the names column stays put - One screen to create: title, some options from a calendar picker, done - Dark and light, one accent, and the winning column visible without hunting OPERATIONS - .env: DATABASE_PATH, BASE_URL, SMTP_URL, TOKEN_SECRET - Migrations on boot, each once - Nightly backup and a restore script - Health endpoint WHAT MATTERS MOST Timezone handling and the edit link are the product. Build option storage, per-viewer conversion and the .ics first, and test a poll that straddles a daylight-saving change with participants in three countries. Everything else is a grid. Give me the repository, migrations, .env.example, a seed poll with five options and four participants, and a README with deploy steps behind Caddy.
What you lose
- A hosted instance with a memorable short link you can paste into a chat
- Time zone handling across participants, which is the only fiddly part
- Reminders to people who have not responded
If you would rather not build
- A message asking which day suits, which still works
What it costs
as published on their pricing page
| Plan | Billed monthly | Billed yearly | Last read |
|---|---|---|---|
| — | $5/mo | — | — |
Their pricing page is where these came from. Seeing a different price? Tell us.
The escape hatch
open source · no votes, no paid placement
Why this verdict
our own opinion · changed only by a person
90/100
Verdict yes at 90. The whole product is a table of ticks. Storing instants in UTC and displaying per viewer is the one rule to follow.
History
tracked since 10 Aug 2026 · nothing is ever overwritten
Questions about Rallly
answered from the record above
Is Rallly free?
No — the plan we track is $5 a month. Pro at around $5/month billed monthly; the software is free to self-host and the hosted free tier covers basic polls.
Can you replace Rallly by building your own?
YES. Replaceable in one session with an AI coding agent. Replacement score 90 out of 100, build time one session. Read what you lose before you decide.
How much does Rallly cost?
$5 a month on Pro — $60 a year. Recorded 10 Aug 2026.
What do you lose by replacing Rallly?
A hosted instance with a memorable short link you can paste into a chat; Time zone handling across participants, which is the only fiddly part; Reminders to people who have not responded. If any of those carry weight for you, keep paying.
Is there an open-source alternative to Rallly?
Yes: Rallly, Framadate. The prompt on this page is for when you want it your way instead.
Related entries
same category first, most replaced first
Every week, something stops being worth paying for.
New verdicts, prices that moved, entries added. One email a week. Unsubscribe in one click. Nothing is being sent yet — your address is kept here, and the first issue is the first thing it is used for.
free forever · no tracking pixel · stored here, never passed to anyone

