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
- 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.
- 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.
- 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.
- Delivers the summary to any combination of terminal, desktop notification, Slack, and email.
- 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):
- Slack —
SLACK_WEBHOOK_URL(an incoming webhook) - Email —
STANDUP_SMTP_HOST/PORT/USER/PASSWORD,STANDUP_SMTP_SENDER,STANDUP_EMAIL_RECIPIENTS - GitHub activity —
STANDUP_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.