A group poll is a short table: a title, a few candidate times, and a grid where each invitee marks what works without signing up. One agent session can build that on SQLite with a link per poll, a results grid that highlights the best time, and a confirmation email. Rallly already does the same in the open. What stays behind is Doodle's booking side: calendar connections that block your busy times, Zoom and Teams links, Stripe payments and team administration. A personal poll site on a small server or a tunnel needs none of those.
Before you buildDoodle Free allows one group poll at a time. If you run polls once in a while, you may not need Pro, and Rallly's hosted version is free to try.
Build me a self-hosted group poll site to replace Doodle. Requirements: - Node.js 22 + TypeScript: Fastify with server-rendered pages (Eta) and a little vanilla JS. `npm start` serves http://localhost:4840; polls open at /p/<id> and the organizer's page at /admin/<token>. - Storage: better-sqlite3 in ./data/polls.db: polls (title, description, location, time zone, deadline, status), options (start, optional end), votes (name, optional email, option, answer yes | maybe | no) and comments. Poll ids are 12 random characters from `nanoid`; the admin token is 32 random bytes, shown once. - Create: a form with a date picker, several time slots per date, and switches for allowing "maybe" and for a vote limit per option. `luxon` handles time zones. - Vote: no account. An invitee enters a name, marks every option, and edits the answers later through a cookie or an edit link emailed to them. Times show in the visitor's own time zone. - Results: a grid with counts per option and the best options highlighted. The organizer can close the poll, pick the final option, and email everyone a notice with an .ics attachment (`ics`). - Email: `nodemailer` with SMTP settings from .env for new votes, deadline reminders and the final notice, capped at 20 emails per poll per day. - Abuse limits: rate-limit by IP, 200 participants and 40 options per poll, escape every name and comment, delete a poll 30 days after its last option. - Export: the organizer downloads votes as CSV. - No accounts, no telemetry. Out of scope: booking pages, calendar sync, payments, video-call links. - README: running behind Caddy or a tunnel, the .env keys, and a backup of polls.db.
Opens your agent with the prompt filled in, you press enter. Or copy it and paste it into an empty folder.
The first prompt builds the core. Run these one at a time in the same folder to grow it into your own Doodle.
Extend the poll site in this folder. Requirements: - In .env, accept up to three read-only calendar URLs (iCalendar feeds from Google, iCloud or Fastmail). - On the organizer's create page only, shade time slots that overlap a busy event, using `node-ical` and `luxon`; cache each feed for 5 minutes and never show events to voters. - If a feed fails, show a warning and keep working. - Update the README with how to get each calendar's private feed URL and a warning to keep it secret.
Add sign-up sheets to the poll site in this folder. Requirements: - A second kind of poll where each slot has a capacity; a visitor picks a slot, enters a name, and the slot closes when it is full. Use a transaction so two people cannot take the last place. - Let a visitor cancel through an emailed link, and show the organizer a list per slot. - Reuse the existing email, rate-limit and CSV export code. - Update the README.
Add a Doodle import to the poll site in this folder. Requirements: - A command `npm run import-doodle <file.xlsx>` for an Excel export of one Doodle poll. First print the sheet layout with `exceljs` and confirm the parsing plan before writing anything. - Create a closed poll with its options and each participant's answers; map unknown answers to maybe. - Make the import safe to run twice, and print counts of polls, options and votes. - Update the README with the Doodle export steps.
People who schedule every week get unlimited polls, booking pages, reminders and video links in one tool that invitees already know. The Pro price is small next to a meeting that never gets booked.
Estimate · Runs on a free tunnel or a $5 VPS; SMTP at this volume fits free tiers. The build is token usage on your agent plan.
| Plan | Monthly | Annual, per month | What you get |
|---|---|---|---|
| Free | $0 | $0 | One group poll, one booking page, one 1:1 and 3 basic sign-up sheets. |
| Pro | $15 | $11 | Unlimited group polls, booking pages, 1:1s and sign-up sheets, deadlines, reminders and hidden participants, Zoom, Microsoft Teams and Webex links, no ads, Excel export. |
| Team | $21 | $16 | Everything in Pro plus an admin console, roles and permissions, co-hosting, booking on behalf, activity reports, custom branding, Stripe payments and AI-written meeting descriptions. |
| Enterprise | — | $1,250 | Everything in Team plus SSO (SAML or OIDC), MFA, role-based access, branded booking pages, emails and URLs, a 99.9% SLA and a dedicated success manager. |
Free includes one group poll, one booking page, one 1:1 and three basic sign-up sheets, with no card.
Yes. An AI coding agent such as Claude Code, Codex or Cursor can build a usable personal version in one session with the prompt on this page, running on your own machine.
About $15 a month on the Pro plan per seat, $180 a year (checked 2026-10-19).
Calendar connections that show your busy times while you set up a poll, and sync of the chosen meeting; Booking pages and 1:1 scheduling with Zoom, Teams and Webex links; Stripe payments, custom branding and team features such as an admin console and co-hosting; Sign-up sheets with sessions that fill up; A link invitees already recognise and trust. If any of those matter to you, keep paying.
Yes: Rallly (open source), Cal.diy (open source), Easy!Appointments (open source).