All Startup Ideas

Async Standup Bot

Slack bot that collects async standups, summarizes with AI, surfaces blockers. Flat team pricing under Geekbot. Weekend MVP guide + prompts.

The daily standup meeting is the most universally hated 15 minutes in software. Time-zone-spread teams schedule it at 9am somewhere, which means 2am for someone. Every engineer answers the same three questions out loud that could have been written in 60 seconds. The manager takes notes nobody reads. Blockers get buried behind "mostly fine, working on the thing." The meeting ends with everyone nodding and then Slacking each other privately to ask "wait, what did X actually say?"

Built for Developers, Solo Founders, Designers.

Remote/hybrid work remains dominant post-2022. 58% of US workers are remote-eligible (McKinsey 2023), and async-first teams are the fastest-growing organizational model (Gitlab, Automattic, Basecamp playbooks).

Daily standup meetings cost an estimated $15K–$40K/year per 10-person team in salary-hours (15 min × 10 people × 250 days × avg $80/hr). Async alternatives save 60%+ of that, a clear ROI for any tool under $500/yr.

Suggested stack: Slack Bolt SDK (Node.js), Next.js 14 admin (minimal), Supabase, Claude Haiku 4.5 for digest + blocker extraction, Vercel Cron + Upstash QStash, Stripe Billing + Slack Directory. Weekend scope: about 8 hours.

The Problem

The daily standup meeting is the most universally hated 15 minutes in software. Time-zone-spread teams schedule it at 9am somewhere, which means 2am for someone. Every engineer…

The Solution

A Slack bot that installs in one click. Each user configures their personal standup time (defaults to 10am user-local). Bot DMs three questions: "What did you ship yesterday?…

Market Research

Remote/hybrid work remains dominant post-2022. 58% of US workers are remote-eligible (McKinsey 2023), and async-first teams are the fastest-growing organizational model (Gitlab…

Competitive Landscape

Geekbot — Category leader for async Slack standups. 20K+ teams, acquired by Spectrum Labs 2023. Raw response dumps to channel (no AI summary). Per-user pricing bites at team size…

Business Model

Free ($0) — 1 standup, up to 5 users, 7-day history, basic digest (no AI)

Recommended Tech Stack

Slack Bolt SDK (Node.js) — OAuth install flow with `chat:write`, `im:write`, `users:read` scopes. Event subscriptions for `message.im`. Modals for settings.

AI Prompts to Build This

Copy these build prompts into Claude, Cursor, or your AI coding tool. Create a free account to unlock the full research behind them.

  1. 1. Slack App Scaffold

    Create a Slack bot using @slack/bolt on Node.js hosted on Vercel. OAuth install flow, Supabase backend.
    
    Schema:
    - workspaces(id, slack_team_id, team_name, bot_token_encrypted, installer_user_id, plan, stripe_customer_id, digest_channel_id, digest_time, timezone, created_at)
    - standups(id, workspace_id, name, questions JSONB, schedule_cron, active)
    - participants(id, standup_id, slack_user_id, user_timezone, personal_dm_time, active)
    - responses(id, standup_id, participant_id, date, answers JSONB, submitted_at, latency_seconds)
    - digests(id, standup_id, date, themes JSONB, individual_summaries JSONB, posted_at, slack_message_ts)
    - blockers(id, digest_id, owner_slack_id, summary, suggested_helpers JSONB, resolved_at)
    
    OAuth flow: /api/slack/install redirects to Slack's OAuth URL with scopes chat:write,im:write,im:history,users:read,channels:read. /api/slack/callback exchanges code, encrypts bot_token via Supabase Vault, creates workspace row.
    
    Slash commands:
    - /standup setup → opens modal to configure questions, times, channel
    - /standup skip today → participant opts out of today's standup
    - /standup status → shows today's response state for the team
    
    Event handlers:
    - message.im: if user is in a participant row and responses table has no entry for today, parse their DM reply into the questions JSONB structure. If ambiguous, bot asks a clarifying question.
  2. 2. Scheduled DM Flow

    Build the scheduled DM collection flow via Vercel Cron.
    
    Cron job (every 5 min):
    1. Query SELECT p.*, s.questions, w.bot_token_encrypted FROM participants p JOIN standups s ON p.standup_id=s.id JOIN workspaces w ON s.workspace_id=w.id WHERE p.active AND s.active AND p.personal_dm_time BETWEEN NOW()-INTERVAL '5 min' AND NOW() AND NOT EXISTS (SELECT 1 FROM responses r WHERE r.participant_id=p.id AND r.date=CURRENT_DATE);
    2. For each participant, decrypt bot token, send DM via Slack Web API chat.postMessage:
     - Opens thread with "Morning! Ready for today's standup?" + 3 questions in a numbered list
     - Uses Slack Block Kit for a friendly, scannable layout
    3. Enqueue Upstash QStash follow-up: if no response row created in 1 hour, send a gentle nudge.
    
    Response parsing:
    - User replies in DM thread with either numbered answers or free-form text.
    - Try structured parse first (if lines start with "1.", "2.", "3."): map to question indices.
    - Fallback to Claude Haiku: "Parse this standup response into JSON matching schema {q1, q2, q3}:..."
    - Save to responses table. Bot reacts with 👍 emoji on the user's message as ack.
    
    Edge cases:
    - User skips: "/standup skip today" command or replies with "skip" or "off today" — log a response row with answers={skipped: true}.
    - User responds to yesterday's thread: bot politely ignores (thread timestamp check).
    - Timezone changes: participant row has user_timezone synced from Slack user profile on DM send.
  3. 3. AI Digest with Blocker Detection

    Generate the AI team digest and post to Slack channel at configured digest_time.
    
    Digest cron (fires at workspace.digest_time in workspace.timezone):
    1. Collect all today's responses for this standup.
    2. Build the prompt:
    "You are summarizing a team's async standup. Below are responses from N team members. Extract:
    - themes: 1-3 shared things people are working on (e.g. 'Q2 planning', 'migration sprint')
    - blockers: any item where someone is explicitly blocked or waiting. For each, identify owner_slack_id and suggest who else on the team might help based on their responses.
    - individual_summaries: 1-line summary per person, {slack_user_id, one_liner}
    - skipped: array of slack_user_ids who didn't respond
    
    Return strict JSON. Be terse. Use active voice.
    
    Responses:
    {responses_json}"
    
    3. Call Claude Haiku 4.5 with response_format json_schema.
    4. Render to Slack Block Kit:
     - Header: 'Team Standup — {today}'
     - Themes section: bulleted
     - Blockers section: each with :warning: emoji, owner @mention, suggested helpers @mention
     - Individuals section: compact list
     - Footer: '{N} of {M} responded' + skip list
    5. Post to workspace.digest_channel_id, save message_ts to digests table.
    6. Email-only option: also send via Resend to a configured CC address for managers who don't live in Slack.
    
    Blocker threading: if a digest has blockers, reply in thread 4 hours later asking owner "Still blocked?" and offer to @ help again. Track resolution rate per-user; surface as an analytics metric for Growth tier.