DDaz Williams

Work  /  Beaver AI

Case study 01 · Meeting intelligence

Beaver AI

Live in production · Founder & full-stack AI engineer · beaverai.app ↗

A production AI meeting platform that records, transcribes, summarises, and reasons across meetings - combining live-join bots, an ephemeral browser-based meeting room, custom RAG over personal meeting history, and an integration layer that pushes action items into eight project-management tools.

7

app modules

82

tests

9

background tasks

8

integrations

4

subscription tiers

Overview

Beaver addresses a simple idea: meetings generate enormous knowledge that almost nobody captures. It does this with two complementary products in one platform - an AI Notetaker that auto-joins your calendar meetings, and a Magic Whiteboard, a real-time browser-based meeting room with ephemeral audio. Both feed a shared intelligence layer powered by a custom RAG implementation over a per-user vector index.

What makes it interesting as engineering work isn't any single feature - it's the breadth of integration. A single user journey touches payment webhooks with idempotency, OAuth flows for a calendar provider plus eight task-tool integrations, multiple scheduled background jobs, Redis caching with a sentinel pattern for subscription checks, a custom RAG pipeline, PII redaction with audit trails, and a four-tier subscription model with feature gating across the entire app - all wrapped in a Dockerised production deploy fronted by a tunnel-based ingress.

Why this matters

Production AI is mostly the boring stuff. Beaver demonstrates competence across all of it.

AI integration depth

Custom RAG with per-user vector indices. LLM-driven summaries with template-based prompting. Semantic search. AI meeting scores. AI pre-meeting briefings.

Production engineering

Webhook idempotency, rate limiting, health-checked DB + Redis, cache sentinel patterns, query optimisation, separate dev/prod environments.

Product breadth

Two distinct products (Notetaker + Whiteboard) sharing one intelligence backend. Four subscription tiers. Eight third-party integrations.

Privacy-first design

Ephemeral audio mode. PII redaction with consent audit trail. On-prem deployment option. No public IP - tunnel-based ingress only.

Engineering highlights

The specific decisions worth defending in an interview.

  1. Payment webhook idempotency via Redis

    Every inbound event ID cached for 24h before processing. Replays return early without side effects. The kind of thing you only learn to do after a duplicate charge.

  2. Subscription cache sentinel pattern

    Store sub or False, return cached or None. Distinguishes "we've checked and there's no subscription" from "we've never checked" without an extra DB hit on every authenticated request.

  3. Custom RAG with per-user vector indices

    client_document_id = meeting_{pk}_user_{user_pk} ensures clean per-user semantic search with deterministic dedup keyed on the meeting PK. No cross-user bleed; safe re-ingest.

  4. Cascade-protect on the user FK from meetings

    Explicit choice - prevents a cascade from accidentally wiping a user's entire meeting history. Forces explicit handling of user deletion, which is the right scaffolding for a GDPR-aware product.

  5. Compound indexes matched to actual query patterns

    (user, -started_at) on Meeting and (meeting, start) on TranscriptSegment. Replaced three Python-side filtering patterns with three indexed queries when the data outgrew memory.

  6. Drip email idempotency

    A drip-log table with a (user, day_number) unique constraint stops the hourly task from sending duplicates if it overlaps itself.

  7. Two distinct OAuth flows, one app

    The signup OAuth library handles auth identity. The calendar integration is separate - different scopes (calendar.readonly), separate refresh-token storage on its own integration record. Conflating them is a footgun; separating them is correct.

  8. Multiple auth backends, explicit

    When both a password backend and a third-party OAuth library are active, every login call has to name the backend explicitly. Easy omission, baffling failures.

Feature surface

A glimpse - not exhaustive.

Core capture

AI Notetaker (auto-joins calendar meetings via recording bot) · Magic Whiteboard (ephemeral browser meeting room) · pre-recorded audio upload · in-person laptop recording.

Intelligence layer

Template-driven summaries (5 built-ins: Sprint Planning, Sales Call, 1:1, Incident Postmortem, General) · action-item extraction with priority and status · separate commitment ledger with target dates · Ask Beaver chat over your entire history · semantic vector search · 0–100 meeting scorecard across 5 dimensions · live meeting coach · auto-discovered knowledge graph · accountability network · watchlist for competitor/risk keywords.

Workflow automation

Pre-meeting AI briefings 25–35 min before each meeting · Smart Meeting Prep with relationship history · daily standup digest emails replacing recurring standups · AI-drafted follow-up emails · auto-promotion of summaries to a searchable wiki ("The Lodge") · three-mode calendar auto-join.

Integrations (eight providers)

Linear, GitHub, Notion, Trello (OAuth) · Jira, Asana (API token) · Slack, Discord (webhook). All sit behind a common BaseProvider interface.

Privacy & billing

PII redaction with original-text rollback (Business tier) · consent audit export · ephemeral audio (Whiteboard) · on-prem deployment option · four-tier subscriptions with 7-day trial · idempotent webhook handling.

Stack

Web frameworkPython
DatabasePostgreSQL 17
Cache / sessionsRedis 7
Background workAsync task queue + scheduler
AuthOAuth (multi-provider)
PaymentsSubscription payments provider
App serverProduction WSGI (4 workers)
Reverse proxynginx
IngressTunnel-based, no public IP
ErrorsError tracking + alerting
FrontendUtility-first CSS, vanilla JS
AIInternal LLM platform (chat + RAG)

Background tasks

Five scheduled, four on-demand.

TaskCadencePurpose
auto_join_calendar_meetings60sBot joins scheduled meetings
send_pre_meeting_briefings60sAI context email 25–35 min before
cleanup_stale_meetings3600sMark stuck recordings errored after 3h
purge_stale_audio_files3600sSafety-net audio deletion
expire_trials3600sConvert expired trials
send_drip_emails3600s7-day onboarding sequence
generate_meeting_summaryon-demandTranscript → summary → action items → commitments
update_wiki_from_meetingon-demandPromote summary to wiki