Discord meetings, recorded & written up.

Scriber joins your voice channel, records per-speaker audio, transcribes it locally with Whisper (or the cloud engine you pick), and writes structured Markdown minutes.

Self-hostable in a single container. By default audio never leaves your machine — only the finished transcript is sent to the AI provider you choose (or to nothing at all, with a local model).

Local transcription by default One Docker/Podman container Anthropic · OpenAI · self-hosted Built-in admin dashboard MIT licensed
What you get

A complete meeting pipeline, self-hosted

From a slash command in Discord to polished minutes and a searchable dashboard — nothing leaves your infrastructure that you don't allow.

🔴

One-command recording

/scriber start, /scriber stop, /scriber cancel. Scriber joins your voice channel and records per-speaker audio with timestamps.

🗣️

Transcription, your way

Speech is transcribed on your own server with faster-whisper by default — or by Mistral Voxtral, ElevenLabs Scribe, or Google Chirp, with automatic fallback to local Whisper.

🎧

Meeting audio & re-transcription

Keep each meeting's audio (with automatic expiration you control), replay or download it, regenerate the transcript with another engine, and compare versions side by side.

🤖

AI minutes, your provider

Structured Markdown minutes via Anthropic, OpenAI, or any OpenAI-compatible endpoint (Ollama, vLLM, LM Studio, LocalAI).

🛟

Provider failover

Configure an ordered list of providers. If the first fails, Scriber automatically falls over to the next — and never loses the transcript.

📢

Consent-first recording notice

When recording starts, Scriber posts a notice naming the model and the exact AI target, so everyone can leave before being recorded.

🖥️

Admin dashboard

Vue 3 dashboard: stats, meeting history, transcript/summary editor, participants with avatars & memory, and live settings.

🧠

Per-participant memory

A per-user Markdown memory keeps names of people and projects spelled correctly across meetings, injected into the summary prompt.

🔌

REST API

Create scoped API tokens and read (or write) meetings, participants and memories over HTTP with a Bearer token. API docs →

📦

Single container

Bot and dashboard run in one process; all state lives under data/. A Discord hiccup never takes the dashboard down.

🔒

Private by design

By default audio is transcribed locally and kept only on your server, with automatic expiration. With a self-hosted summary model, no meeting data leaves your machine at all.

How it works

Three commands, zero fuss

Everything happens from Discord. Scriber also stops on its own when it's left alone or hears nothing for two minutes.

1

/scriber start

Join your voice channel and run it. Scriber joins, posts the recording notice, and transcribes per-speaker audio while you talk — locally by default.

2

/scriber stop

Scriber leaves, finishes transcribing, sends the transcript to your summary provider, and posts the Markdown minutes in the channel.

3

/scriber cancel

Leaves the channel and discards everything recorded so far. No transcript kept, nothing sent anywhere.

⏹

Auto-stop

If everyone leaves the channel, or nothing is said for 2 minutes, Scriber finishes on its own — exactly like stop.

The data path

🎙️

Discord voice

Per-speaker Opus audio

→
💻

Whisper (local)

Transcribed on your server (default)

→
📝

Transcript

Text saved to data/

→
✨

AI summary

Your provider → minutes

By default, audio never leaves your machine. Only the finished transcript is sent once to the summary provider you configure — and with a self-hosted model, not even that.

The dashboard

Browse, edit and configure — all in one place

A built-in admin dashboard served from the same container. (Faithful UI previews below.)

localhost:8080 — Dashboard
Scriber DashboardParticipants ⚙
128
Meetings
119
Completed
42h
Duration
311k
Words

Meetings per day

Mon2
Tue5
Wed3
Thu6
Fri3
StartedChannelStatus
Jul 6, 14:02Standupcompleted
Jul 6, 11:30Design syncsummarizing
Jul 5, 16:45Roadmapcompleted
Dashboard — stats, a meetings-per-day chart, and the full meeting history.
localhost:8080 — Participants
Scriber DashboardParticipants ⚙
Participants
NameSessionsLast session
ALAlex Lindgren24Jul 6, 2026
PRPriya Raman18Jul 6, 2026
JKJonas Krause15Jul 5, 2026
?newcomer_421Jul 5, 2026
Participants — now with a compact 30×30 avatar column (initials when no image).
localhost:8080 — Settings
Settings
Provider 1tried first
anthropic kind
•••••••••••• sk-ant 🔒 secret
claude-opus-5 model
Provider 2failover
openai kind
gpt-4o model
base editable
en editable
Save changes
Settings — the provider failover list, Whisper & admin. Secrets masked, saved to .env.
localhost:8080 — Meeting
Design sync completed
Started
Jul 6, 11:30
Duration
38 min
Speakers
4
Meeting minutes

The team agreed to ship the avatar column and finalize the docs site.

Decisions

  • Adopt MIT license for the public release.
  • Publish the docs site from /docs.

Action items

  • Priya: capture real screenshots.
Meeting detail — editable transcript & summary, metadata, and the processing log.

These are recreated UI previews. To show your own instance, drop PNGs into docs/screenshots/ — see the screenshots readme.

Quick start

Running in a few minutes

You need a Discord bot token and at least one AI provider key. The full walkthrough is in the setup guide.

# 1. Get the code
git clone https://github.com/lp177/Scriber.git
cd Scriber

# 2. Configure — set DISCORD_TOKEN and one SUMMARY_PROVIDER block
cp .env.example .env
$EDITOR .env

# 3. Build & run (Docker or Podman)
docker compose up -d

# 4. Open the dashboard
#    http://localhost:8080  (login with ADMIN_USERNAME / ADMIN_PASSWORD)
Next: create the Discord bot, find your IDs, invite it, and give it access to a private voice channel — all covered step by step in the setup guide.
Open the full setup guide →
Data & privacy

Local-first, consent-first

🎧

Audio stays put

Voice is transcribed locally by default, and kept meeting audio stays on your server with an expiration you control (or disable keeping entirely for text-only).

📤

One outbound payload

Only the finished transcript is sent, once, to your chosen summary provider. Use a local model and nothing leaves at all.

🗑️

Cancel means gone

/scriber cancel discards everything recorded so far. Delete a meeting from the dashboard to remove its files and row.