Skip to content

moghalsaif/standup_line

Repository files navigation

StandupLine

StandupLine is a voice-first async standup system for teams.

Team members submit standups through an ElevenLabs conversational agent or the built-in web widget. The app stores the transcript, extracts yesterday / today / blockers with Workers AI, and gives the manager a clean dashboard plus a daily Telegram brief. It also includes a Cloudflare Agent so the team coordination state lives inside the app, while ElevenLabs handles the voice runtime.

What It Does

  • Creates and manages teams, members, call logs, standups, and task assignments
  • Receives post-call webhooks from ElevenLabs conversational agents
  • Extracts structured standup data with Cloudflare Workers AI
  • Generates audio briefs with ElevenLabs Text to Speech
  • Stores audio files in Cloudflare R2
  • Sends the final brief and reminders through Telegram
  • Lets you provision or link an ElevenLabs agent from the app UI
  • Uses a Cloudflare Agent to track per-team coordination state

Architecture

Employee / Manager
        |
        v
ElevenLabs Conversational Agent
        |
        v
Cloudflare Worker (Hono)
        |
        +--> Durable Object SQLite per team
        +--> Cloudflare Agent state sync
        +--> Workers AI extraction
        +--> R2 audio storage
        +--> Telegram delivery

Tech Stack

  • Cloudflare Workers
  • Cloudflare Durable Objects with SQLite
  • Cloudflare Agents SDK
  • Cloudflare Workers AI
  • Cloudflare R2
  • ElevenLabs Conversational AI
  • ElevenLabs Text to Speech
  • Telegram Bot API
  • Hono
  • Tailwind CDN + static dashboard pages

Prerequisites

Before running the app, you need:

  • A Cloudflare account with Workers initialized
  • A Cloudflare API token or wrangler login
  • An ElevenLabs API key
  • A Telegram bot token
  • An R2 bucket named standupline-audio

Recommended Cloudflare token permissions:

  • Workers Scripts: Edit
  • Workers R2 Storage: Edit
  • Workers AI: Edit

Recommended ElevenLabs key permissions:

  • Text to Speech: Access
  • ElevenAgents: Write
  • User: Read
  • Voices: Read optional

Quick Start

1. Install dependencies

npm install

2. Authenticate Cloudflare

Either log in interactively:

npx wrangler login

Or export your Cloudflare API token:

export CLOUDFLARE_API_TOKEN='your_token_here'

3. Create the R2 bucket

npx wrangler r2 bucket create standupline-audio

4. Configure local secrets

Create a .dev.vars file locally:

ELEVENLABS_API_KEY=your_elevenlabs_key
TELEGRAM_BOT_TOKEN=your_telegram_bot_token
DEFAULT_TEAM_ID=default

This file is ignored by git.

5. Run locally

npm run dev

When Wrangler starts, open:

  • http://localhost:8788/
  • http://localhost:8788/setup

Local Setup Flow

1. Save your team

Open /setup and create a team with:

  • team name
  • timezone
  • brief time
  • manager Telegram chat ID

2. Add members

Add the employees and manager with:

  • name
  • phone number
  • role
  • optional Telegram chat ID

3. Link or provision the ElevenLabs agent

In the ElevenLabs Voice Agent section of /setup, you can:

  • create an ElevenLabs agent from the app
  • or link an existing agent_id

You will also see the webhook URL the ElevenLabs side should call.

4. Configure the ElevenLabs side

For MVP, use ElevenLabs Conversational AI runtime.

Inside ElevenLabs:

  1. Create an agent
  2. Use a standup prompt
  3. Enable post-call webhooks
  4. Point the webhook to:
https://YOUR-WORKER.workers.dev/webhook/elevenlabs/YOUR_TEAM_ID

If you already imported a phone number into ElevenLabs, assign it from the app UI.

5. Configure Telegram

Create a bot with BotFather and get the bot token.

To find your manager chat ID:

  1. Message your bot once
  2. Open:
https://api.telegram.org/bot<YOUR_BOT_TOKEN>/getUpdates
  1. Copy message.chat.id

That numeric chat_id is what the app needs, not the Telegram username.

Deploy

Set Worker secrets in Cloudflare:

npx wrangler secret put ELEVENLABS_API_KEY
npx wrangler secret put TELEGRAM_BOT_TOKEN

Then deploy:

npm run deploy

Important Routes

App pages

  • GET /
  • GET /setup
  • GET /call-log
  • GET /standups
  • GET /widget/:teamId

Team APIs

  • POST /api/:teamId/init
  • GET /api/:teamId/team
  • POST /api/:teamId/members
  • GET /api/:teamId/members
  • DELETE /api/:teamId/members/:id
  • GET /api/:teamId/call-logs
  • GET /api/:teamId/standups/:date
  • GET /api/:teamId/tasks
  • GET /api/:teamId/stats

ElevenLabs APIs

  • POST /api/:teamId/elevenlabs/setup
  • POST /api/:teamId/elevenlabs/provision
  • GET /api/:teamId/elevenlabs/config
  • GET /api/:teamId/elevenlabs/agents
  • GET /api/:teamId/elevenlabs/phone-numbers
  • POST /api/:teamId/elevenlabs/phone-number/assign
  • POST /api/:teamId/elevenlabs/speak

Webhooks

  • POST /webhook/elevenlabs/:teamId

Telegram

  • POST /api/:teamId/telegram/brief

Development Commands

npm run dev
npm run typecheck
npm test
npm run deploy

Project Notes

  • .dev.vars is local-only and should never be committed
  • .wrangler/ is local-only and ignored
  • node_modules/ is ignored
  • Exposed keys or tokens should be rotated if they were ever shared publicly

Open Source Usage

If you want to build your own version:

  1. fork this repo
  2. plug in your Cloudflare, ElevenLabs, and Telegram credentials
  3. update the team and delivery logic to match your workflow
  4. deploy your Worker and point ElevenLabs webhooks at it

That is enough to get a working async voice standup system running quickly.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors