Daily Standup

A first-class TUI mode (peer to Analysis and Planning) that runs your team's daily scrum — detecting what everyone did since the last standup, estimating sprint progress, and delivering a summary. It can run on a schedule even when yeaboi is closed, so a 09:50 standup lands before your 10:00 call.

Open it from the mode-selection screen (the magenta Standup card) or run it headlessly with --standup-run.

What it does

  1. Detects recent activity across every configured source — Jira issues, Azure DevOps work items, GitHub commits + PRs, recently-updated Confluence pages, recently-edited Notion pages, and a local git log. Each source is best-effort: an unconfigured or failing source is skipped, never fatal. An authentication failure (401/403) surfaces as a Notice, not silence.
  2. Asks for your own update first, then infers everyone else. Press Generate and it prompts for your update (Enter to skip); people without a self-report get an inferred summary from a single LLM call.
  3. Computes sprint day + confidence deterministically (no LLM): which working day of the sprint you're on (weekends and bank holidays excluded), and how actual "Done" points compare to the ideal linear burn-down → On track / At risk / Behind.
  4. Delivers the summary to any combination of terminal, desktop notification, Slack, and email.
  5. Never shows blank content — if the LLM has no API key or a source returns 401/403, a ⚠ Notices section tells you exactly what to fix.

Scheduling (runs when the app is closed)

Press Configure on the Standup page to set the standup time (e.g. 10:00), how many minutes early to run (default 10), weekdays, and delivery channels. You enter when the meeting happens — the job fires a few minutes before (10:00 → runs 09:50), so the summary lands before you start.

Enabling a schedule installs an OS-native job — a launchd agent on macOS (~/Library/LaunchAgents/) or a crontab entry on Linux. On macOS it opens a Terminal at run time and gives you a short, timed window to type your update and confirm (auto-proceeds if you don't respond); on a headless Linux run it just generates and delivers. Under the hood the job runs:

yeaboi --standup-run --standup-interactive --standup-session <id>

No background daemon is kept alive; the operating system fires the job, so it works even with yeaboi fully quit and survives reboots.

Delivery configuration

Non-secret settings (time, channels) live per-session in SQLite. Secrets/creds go in ~/.yeaboi/.env (see .env.example):

  • SlackSLACK_WEBHOOK_URL (an incoming webhook)
  • EmailSTANDUP_SMTP_HOST/PORT/USER/PASSWORD, STANDUP_SMTP_SENDER, STANDUP_EMAIL_RECIPIENTS
  • GitHub activitySTANDUP_GITHUB_REPO (owner/repo)
  • Desktop / Terminal — no configuration required

Everything uses the Python standard library (Slack via urllib, email via smtplib, desktop via osascript/notify-send) — no new dependencies.

Exports

Every standup — generated in the TUI, run headlessly, or fired on a schedule — is auto-saved as Markdown and self-contained HTML under ~/.yeaboi/exports/standup/<project>/ (dated standup-YYYY-MM-DD.md / .html), so the output is a shareable document rather than something you reconstruct from logs. The Export button on the page re-writes the latest report on demand, just like the Analysis and Planning pages.

Try it

yeaboi                                                        # open the Standup card, press Generate
yeaboi --standup-run --standup-session latest --standup-output terminal

Standup runs are logged to ~/.yeaboi/logs/standup/, exported to ~/.yeaboi/exports/standup/, and persisted to the standup_history table.