← All projects

Case study

Click

Click is a self-hosted alternative to per-seat meeting recorders, combining bot capture, speaker-attributed transcription, and multi-meeting chat into a single private deployment. It features a complete Postgres schema with row-level security, asynchronous job processing via BullMQ, and decoupled transcription and language model providers.

TypeScriptNext.jsPostgreSQLDrizzle ORMBullMQWhisperSelf-HostedPLpgSQL

What it is

Click is an open-source tool designed to replace SaaS-only, per-seat meeting recorders and summaries. It runs entirely on your own infrastructure via Docker Compose, letting you bring your own API keys or operate fully locally with faster-whisper. Designed as a clean-room specification of three popular proprietary services, it combines call recording, transcription, notes with citation-backed highlights, and cross-meeting semantic query capabilities into a unified self-hosted application.

How it is built

The system uses a modern TypeScript stack featuring Next.js 16, PostgreSQL 16 with pgvector, Drizzle ORM, and BullMQ running on Redis for handling background jobs like transcription, summary generation, and embedding. Storage is routed through S3 or MinIO, and custom session authentication runs securely on top of scrypt passwords and httpOnly cookies. Deep custom configuration is available through environment variables, supporting deterministic mock models out of the box so the stack runs locally without third-party API keys.

The multi-service architecture

The codebase is arranged as a monorepo consisting of a Next.js web application (`apps/web`), a BullMQ-backed worker (`apps/worker`), and a self-contained local Faster-Whisper automated speech recognition service (`apps/asr`). These services share decoupled libraries for database access, configuration, cryptography, and communication. High-latency processes like transcribing audio, indexing text for embeddings, and sending digest emails are isolated to the background workers, preserving fast response times for web-based actions.

What I learned

  • Using deterministic mock providers for both speech-to-text and LLM processing dramatically speeds up development by eliminating API roundtrips and key management.
  • Designing a complex 64-table database schema with Row-Level Security from day one prevents difficult-to-patch multi-tenant leakage down the road.

What it doesn't do yet

Listed deliberately — a project's limits are as useful to a reviewer as its features.

  • The meeting bot capture system for Zoom, Google Meet, and Teams has not yet been built and is slated for the next development milestone.
  • The application has not yet undergone full integration testing or diff auditing.
  • The desktop app and browser extension audio captures are currently out of scope or marked for future development milestones.