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 four questions:
- 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 · Google Chat setup · Commands · Configuration · AI summaries · Deployment
- 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; away people aren't nagged or counted as missing. Optional Google Calendar OOO sync marks people away automatically. - Pre-fill — "yesterday" starts as your previous "today".
- Per-participant timezones — 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 can be worked as items: tag teammates (interactive DM card with Acknowledge / 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 dashboard — token-gated, server-rendered config + history UI baked into the same container (
DASHBOARD_TOKEN). - Insights —
trends(participation + mood over 4 weeks), weekly digest (digest on), CSV export endpoint. - AI summaries, bring your own key — opt-in daily TL;DR and week-in-review via your Anthropic/OpenAI key; nothing leaves your infra otherwise.
- 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.
Prereq: a one-time Google Chat app configuration (~15 min) — see docs/guide/google-chat-setup.md.
cp .env.example .env # set DASHBOARD_TOKEN + SECRET_KEY (openssl rand -hex 32)
docker compose up -d # pulls ghcr.io/asyncup-dev/asyncup (amd64 + arm64)Expose POST /chat/events via HTTPS, point the Chat app at it, then in your team space:
@AsyncUp setup Engineering
@AsyncUp add @Alice @Bob @Carol
@AsyncUp optional @Carol
@AsyncUp deadline 11:30
@AsyncUp status
Full command and configuration reference in the docs.
npm install
npm test # vitest unit suite (<1s)
ADAPTER=fake npm run dev # run without Google credentials
npm run docs:dev # docs site locallyArchitecture: src/core (domain, scheduler, commands — no platform code),
src/adapters/gchat (cards, event routing, API calls), src/db (SQLite repo).
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.