Open-source, self-hosted async daily standups for Google Chat. No meetings, no SaaS, no telemetry — one small container you run yourself, forever free.
Every workday AsyncUp DMs each participant a card; one tap opens a form with three questions plus a mood dropdown (on by default):
- What did you do yesterday?
- What will you do today?
- Any blockers?
- How is your mood today? (😄 🙂 😐 😕 😫)
Each answer is posted as one card per person under a per-date thread in your team space. At the deadline AsyncUp posts a wrap-up: how many mandatory participants submitted, and who didn't.
📅 Daily Standup — Wed, 10 Jun 2026 (thread parent)
├─ 😄 Alice Yesterday: … Today: … Blockers: ✅ None
├─ 🙂 Bob Yesterday: … Today: … Blockers: ⚠️ Waiting on API keys
└─ 📊 wrap-up: ✅ 7/9 mandatory submitted · ❌ Missing: Asha, Rohit
Docs: Getting started · Host · Google Cloud and the Chat app · First test · Operations · Commands · Configuration · Handbook — or the site at asyncup-dev.github.io/docs
- Dialog form, not a chat interrogation — all questions in one modal, one submit. Edit until the deadline; the posted card updates in place.
- Custom questions per standup (
questions set …), with the mood dropdown toggleable. - Mandatory vs optional participants — the report counts only who you choose.
- Vacation & skip — DM
vacation/backfor yourself; a 🏖️ Skip today button on every prompt asks for a one-line reason, posts it in the day's thread, and can be undone. Away people aren't nagged or counted as missing. Optional Google Calendar OOO sync marks people away automatically. - Prompt cards that keep up — the DM card turns into Submitted (with Edit answers) or Skipped (with Undo skip), and every question plus the mood is required.
- People grid and group rosters — per person: on the standup, required, and which days they work. Or let a standup follow a Google Group: joiners and leavers sync hourly, no domain-wide delegation needed.
- Personal schedules — personal weeks, days off and extra working days, with an optional manager-approval policy per standup.
- Pre-fill — "yesterday" starts as your previous "today".
- Per-participant timezones — anyone can DM
timezone <IANA>and prompts go out at 09:30 their time; reminder nudge before the deadline, late submissions flagged. - Blocker tracking, collaboration & escalation — blockers open automatically from answers and the reporter gets a card to 👥 Tag people from the Workspace. Tagged people get an interactive DM card (Acknowledge / Tag / Update / Resolve), updates broadcast to everyone involved + a per-blocker thread, daily nudges until acknowledged, and escalation DMs when they go stale. Untagged blockers auto-resolve on the next clean submission; tagged ones need an explicit resolve.
- Anonymous mood (
mood anon) — cards hide who felt what; the wrap-up shows the team average. - Web app with Google sign-in — guided setup with live verification, then the console: standups, blockers, reports, team and settings. Workspace admins get the console automatically; everyone else gets a personal page (their standups, answers, timezone, vacation). The operator token (
OPERATOR_TOKEN) stays as break-glass. - MCP server for Claude Code — your own assistants read standups, answer or skip, work blockers and nudge the team through scoped personal tokens. No model runs inside AsyncUp.
- Enterprise SSO without the SSO tax — SAML 2.0 sign-in (Google Workspace, Okta, Entra, OneLogin) and a SCIM 2.0 provisioning endpoint (deactivate in the IdP → removed from every roster), all in the MIT core.
- Insights —
trendsin chat, 8-week charts in the web app (participation, mood, blockers), weekly digest (digest on), CSV export. - See it work immediately —
run nowopens today's run and prompts everyone on the spot (refused once the deadline has passed);archiveretires a standup with history intact, and admins can then delete it for good. Names are unique across the workspace. - Outbound webhooks — per-standup JSON POSTs on every submission and wrap-up; pipe standups into Sheets, Zapier/n8n, or your own service.
- Polls —
poll Ship Friday? | Yes | Noposts a live-updating card in the space; one tap to vote, change your vote anytime, close for final results. - Team admins & multiple standups per space — config restricted to admins; address standups by
#id. - Lightweight forever — one container, SQLite inside (auto-migrating schema), scale-to-zero friendly (
/tick+ free-tier cron ≈ $0/month). Runs happily on 1 vCPU / 512 MB. - Bring your own database — set
DATABASE_URLand AsyncUp uses your PostgreSQL (managed ordocker compose --profile postgres) instead of embedded SQLite; both engines tested in CI. - Restart-safe — all scheduling state lives in SQLite; ticks are idempotent.
- Platform-agnostic core — Google Chat is an adapter; Slack and Teams are planned.
Follow Getting started: it walks the whole path, from an empty server to a test standup in a private space, in about an hour and a half. The short version:
- Host — Docker Compose with Caddy for HTTPS, an
.envwithOPERATOR_TOKENandSECRET_KEY,docker compose up -d. - Google Cloud and the Chat app — a project with the Chat API, a service-account key, and a Chat app pointing at
https://HOST/chat/events. - Guided setup and first test — open
https://HOST/app, finish the guided setup, run a standup in a private space.
Then roll out to your team, and optionally add group rosters and Google or SAML sign-in.
Requires Bun 1.3+.
bun install
bun test # unit suite (<1s)
ADAPTER=fake bun run dev # run without Google credentials
bun run docs:dev # docs site locallyArchitecture: src/core (domain, scheduler, commands — no platform code),
src/adapters/gchat (cards, event routing, API calls), src/db (repo over
SQLite/PostgreSQL), web/ (the React app served under /app), src/api (the JSON API it uses), src/auth
(sessions, Google OIDC, SAML), src/scim (provisioning), src/integrations
(Calendar, Directory, Google Groups), src/mcp (the MCP server).
Adding a platform means implementing the ChatAdapter interface in
src/core/adapter.ts — see CONTRIBUTING.md.
- Slack adapter, then Microsoft Teams
PRs welcome! Read CONTRIBUTING.md to get going. Please also see the Code of Conduct and Security policy.