Runs asynchronous standups in chat: it asks each person the same questions on a schedule and posts the answers to a channel.
Build me an asynchronous standup bot that replaces Geekbot: the same questions on a schedule, in everyone's own time zone, posted where the team reads. STACK - Node 20+ with Fastify - SQLite through better-sqlite3, WAL mode - A worker for the schedule, separate from the web process - One chat platform adapter to begin with - Caddy in front THE DATA MODEL - standups: id, name, questions_json, schedule_json, channel, timezone_mode, reminder_minutes, is_active, anonymous_summary - participants: id, standup_id, user_external_id, timezone, weekdays_json, local_time, is_paused, paused_until - runs: id, standup_id, participant_id, due_at_utc, asked_at, completed_at, skipped_at, reminded_at, status - answers: id, run_id, question_index, body, answered_at - posts: id, run_id, channel, external_message_id, posted_at - moods: id, run_id, value, at — one optional number, if the standup asks for it - Every run recorded, including the skipped ones. Participation over time is a real signal and it cannot be reconstructed later SCHEDULING IN EVERYONE'S OWN TIME - Each participant has their own zone and their own local time, so 09:30 means 09:30 where they are - The worker computes the next due instant per participant from their schedule and stores it; it wakes every minute and asks whoever is due - Weekdays per participant, so a four-day week is respected - Holidays and pauses, with an end date rather than indefinitely - Daylight saving handled by storing instants and recomputing from the rule, with tests for both transitions. A standup bot that asks at the wrong hour twice a year is a bot people mute ASKING - A direct message with the first question; the next comes after the answer, one at a time. A wall of five questions gets one-line replies - Answers accepted in any order if somebody wants to reply in one message — parse it, and confirm what was recorded - Skip, snooze for an hour, or answer later from a link - One reminder, at a configurable offset, and never a second. The bot that nags is the bot that gets removed - Editing an answer before the post goes out, and after it with the post updated in place POSTING - One message to the channel per participant, or one combined summary — chosen per standup - Formatted so it is readable at a glance: name, then each question with its answer, with blockers made visually distinct - Threaded, so discussion of an answer does not fill the channel - If nobody has answered, post nothing rather than a message saying nobody answered THE PLATFORM ADAPTER - One interface: send a direct message, receive a reply, post to a channel, update a message, list members - Each platform needs its own application, its own permission scopes and, on some, a review before it can message people. Say this at the top of the README — it is the wall this project hits, and it is administrative rather than technical - Events received by webhook with signature verification and idempotency by delivery id - Rate limits respected with backoff; every platform has them and they are stricter for direct messages - Keep the adapter thin so the rest of the code never knows which platform it is talking to REPORTS - Participation rate per person and per standup over time, computed at query time - Answer length and response delay, which together say whether the standup is still useful or has become a chore - Mood over time if it is being collected, aggregated and never shown per person unless the standup says it is not anonymous — a mood question that identifies the answerer collects politeness rather than mood - A weekly digest to the channel BEYOND STANDUPS - The same machinery runs retrospectives, polls, and a one-off question to a group - A survey mode where answers are collected and only the aggregate is posted OPERATIONS - .env: DATABASE_PATH, BASE_URL, PLATFORM_TOKEN, SIGNING_SECRET, SESSION_SECRET - Migrations on boot, each once - The worker is idempotent: asking twice for the same run is impossible because the run row records that it was asked - Nightly backup off the machine, restore script - Health endpoint reporting the worker's last tick and the oldest overdue run WHAT MATTERS MOST Per-participant time zones and the single reminder. Build the schedule computation with its daylight-saving tests first, and be disciplined about the nagging — the whole value of an asynchronous standup is that it costs less attention than a meeting, and a bot that pings four times has spent the saving. Give me the repository, one platform adapter, migrations, .env.example, a seed standup, and a README with deploy steps behind Caddy and the application setup for the platform.
What you lose
- Integrations with each chat platform, maintained as their APIs change
- Reports on participation and mood over time
- Timezone-aware scheduling per participant
If you would rather not build
- A scheduled message and a thread, which is free
- Any chat platform's workflow builder
- A shared document updated daily
What it costs
read from their page 15 Aug 2026
| Plan | Billed monthly | Billed yearly | Last read |
|---|---|---|---|
| — | $2.50/mo | — | 15 Aug 2026 |
Their pricing page is where these came from. Seeing a different price? Tell us.
The escape hatch
open source · no votes, no paid placement
Mattermost
$0Self-hosted chat with a plugin system for building the bot into it.
mattermost/mattermostfree · open source
Why this verdict
our own opinion · changed only by a person
89/100
Verdict yes at 89. A cron job and a chat API. Asking at the participant's local time and only reminding once are the two decisions that matter.
History
tracked since 10 Aug 2026 · nothing is ever overwritten
Questions about Geekbot
answered from the record above
Is Geekbot free?
No — the plan we track is $2.50 a month. Around $2.50 per participant per month billed monthly, cheaper annually.
Can you replace Geekbot by building your own?
YES. Replaceable in one session with an AI coding agent. Replacement score 89 out of 100, build time one session. Read what you lose before you decide.
How much does Geekbot cost?
$2.50 a month on Standard — $30 a year. Recorded 10 Aug 2026.
What do you lose by replacing Geekbot?
Integrations with each chat platform, maintained as their APIs change; Reports on participation and mood over time; Timezone-aware scheduling per participant. If any of those carry weight for you, keep paying.
Is there an open-source alternative to Geekbot?
Yes: Mattermost, n8n. 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

