100% local ML models for meeting transcription and analysis
38
stars
1,525
commits
Python
primary language
Aug 24, 2026
updated
Reflector is an AI-powered audio transcription and meeting analysis platform that provides real-time transcription, speaker diarization, translation and summarization for audio content and live meetings. It works 100% with local models (whisper/parakeet, pyannote, seamless-m4t, and your local llm like phi-4).
By Greyhaven
Reflector is a web application that utilizes local models to process audio content, providing:
The project consists of three primary components:
server/.www/.Currently, Reflector supports two input methods:
For full deployment instructions, see the Self-Hosted Production Guide and the Architecture Reference.
The self-hosted setup script configures and launches everything on a single server:
# GPU with local Ollama LLM, local S3 storage, and Caddy reverse proxy
./scripts/setup-selfhosted.sh --gpu --ollama-gpu --garage --caddy
# With a custom domain (enables Let's Encrypt auto-HTTPS)
./scripts/setup-selfhosted.sh --gpu --ollama-gpu --garage --caddy --domain reflector.example.com
# CPU-only mode (slower, no NVIDIA GPU required)
./scripts/setup-selfhosted.sh --cpu --ollama-cpu --garage --caddy
# With password authentication
./scripts/setup-selfhosted.sh --gpu --ollama-gpu --garage --caddy --password mysecretpass
The script is idempotent and safe to re-run. See ./scripts/setup-selfhosted.sh --help for all options.
Reflector supports three authentication modes:
Password authentication (recommended for self-hosted / single-user): Use the --password flag in the setup script. This creates an admin@localhost user with the provided password. Users must log in to create, edit, or delete transcripts.
./scripts/setup-selfhosted.sh --gpu --ollama-gpu --garage --caddy --password mysecretpass
Authentik OIDC: For multi-user or enterprise deployments, Reflector supports Authentik as an OAuth/OIDC provider. This enables SSO, LDAP/AD integration, and centralized user management. Requires configuring AUTH_BACKEND=jwt on the backend and AUTH_PROVIDER=authentik on the frontend. See the Self-Hosted Production Guide for details.
Public mode (default when no auth is configured): If neither password nor Authentik is set up, Reflector runs in public mode. In this mode, no login is required — anyone with access to the URL can use the application. Transcripts are created anonymously (not tied to any user account), which means they cannot be edited or deleted through the UI or API. Anonymous transcripts are automatically cleaned up after 7 days. This mode is suitable for demos or testing but not recommended for production use.
# Backend
cd server
uv sync
docker compose up -d redis
uv run alembic upgrade head
uv run -m reflector.app --reload
# In a separate terminal — start the worker
cd server
uv run celery -A reflector.worker.app worker --loglevel=info
# Frontend
cd www
pnpm install
cp .env_template .env
pnpm dev
Reflector also supports deploying specialized models (transcription, diarization) to Modal.com for serverless GPU processing. This is not integrated into the self-hosted setup script and must be configured manually.
See Modal.com Setup Guide for deployment instructions.
cd server
uv run python -m reflector.tools.process path/to/audio.wav
Re-run the processing pipeline on a previously uploaded transcription by its UUID:
cd server
uv run -m reflector.tools.process_transcript <transcript-uuid> --sync
To record both your voice and the meeting you're taking part in, you need:
Permissions:
You may have to add permission for browser's microphone access to record audio in
System Preferences -> Privacy & Security -> Microphone
System Preferences -> Privacy & Security -> Accessibility. You will be prompted to provide these when you try to connect.
This is an external tool for merging the audio feeds as explained in the previous section of this document. Note: We currently do not have instructions for Windows users.
System Preferences -> Sound and choose the devices created from the Output and Input tabs.Next.js projects are more used to NEXT_PUBLIC_ prefixed buildtime vars. We don't have those for the reason we need to serve a customizable prebuilt docker container.
Instead, all the variables are runtime. Variables needed to the frontend are served to the frontend app at initial render.
It also means there's no static prebuild and no static files to serve for js/html.
Reflector uses environment variable-based feature flags to control application functionality. These flags allow you to enable or disable features without code changes.
| Feature Flag | Environment Variable |
|---|---|
requireLogin | FEATURE_REQUIRE_LOGIN |
privacy | FEATURE_PRIVACY |
browse | FEATURE_BROWSE |
sendToZulip | FEATURE_SEND_TO_ZULIP |
rooms | FEATURE_ROOMS |
Feature flags are controlled via environment variables using the pattern FEATURE_{FEATURE_NAME} where {FEATURE_NAME} is the SCREAMING_SNAKE_CASE version of the feature name.
Examples:
# Enable user authentication requirement
FEATURE_REQUIRE_LOGIN=true
# Disable browse functionality
FEATURE_BROWSE=false
# Enable Zulip integration
FEATURE_SEND_TO_ZULIP=true
All new contributions should be made in a separate branch, and goes through a Pull Request. Conventional commits must be used for the PR title and commits.
The docs/ folder contains an older Docusaurus-based documentation site. These docs are no longer actively maintained and may be outdated. For current installation and deployment instructions, refer to the docsv2/ folder instead.
Python
73.1%
TypeScript
20.7%
Shell
5.7%
100% local ML models for meeting transcription and analysis
38
stars
1,525
commits
Python
primary language
Aug 24, 2026
updated
Reflector is an AI-powered audio transcription and meeting analysis platform that provides real-time transcription, speaker diarization, translation and summarization for audio content and live meetings. It works 100% with local models (whisper/parakeet, pyannote, seamless-m4t, and your local llm like phi-4).
By Greyhaven
Reflector is a web application that utilizes local models to process audio content, providing:
The project consists of three primary components:
server/.www/.Currently, Reflector supports two input methods:
For full deployment instructions, see the Self-Hosted Production Guide and the Architecture Reference.
The self-hosted setup script configures and launches everything on a single server:
# GPU with local Ollama LLM, local S3 storage, and Caddy reverse proxy
./scripts/setup-selfhosted.sh --gpu --ollama-gpu --garage --caddy
# With a custom domain (enables Let's Encrypt auto-HTTPS)
./scripts/setup-selfhosted.sh --gpu --ollama-gpu --garage --caddy --domain reflector.example.com
# CPU-only mode (slower, no NVIDIA GPU required)
./scripts/setup-selfhosted.sh --cpu --ollama-cpu --garage --caddy
# With password authentication
./scripts/setup-selfhosted.sh --gpu --ollama-gpu --garage --caddy --password mysecretpass
The script is idempotent and safe to re-run. See ./scripts/setup-selfhosted.sh --help for all options.
Reflector supports three authentication modes:
Password authentication (recommended for self-hosted / single-user): Use the --password flag in the setup script. This creates an admin@localhost user with the provided password. Users must log in to create, edit, or delete transcripts.
./scripts/setup-selfhosted.sh --gpu --ollama-gpu --garage --caddy --password mysecretpass
Authentik OIDC: For multi-user or enterprise deployments, Reflector supports Authentik as an OAuth/OIDC provider. This enables SSO, LDAP/AD integration, and centralized user management. Requires configuring AUTH_BACKEND=jwt on the backend and AUTH_PROVIDER=authentik on the frontend. See the Self-Hosted Production Guide for details.
Public mode (default when no auth is configured): If neither password nor Authentik is set up, Reflector runs in public mode. In this mode, no login is required — anyone with access to the URL can use the application. Transcripts are created anonymously (not tied to any user account), which means they cannot be edited or deleted through the UI or API. Anonymous transcripts are automatically cleaned up after 7 days. This mode is suitable for demos or testing but not recommended for production use.
# Backend
cd server
uv sync
docker compose up -d redis
uv run alembic upgrade head
uv run -m reflector.app --reload
# In a separate terminal — start the worker
cd server
uv run celery -A reflector.worker.app worker --loglevel=info
# Frontend
cd www
pnpm install
cp .env_template .env
pnpm dev
Reflector also supports deploying specialized models (transcription, diarization) to Modal.com for serverless GPU processing. This is not integrated into the self-hosted setup script and must be configured manually.
See Modal.com Setup Guide for deployment instructions.
cd server
uv run python -m reflector.tools.process path/to/audio.wav
Re-run the processing pipeline on a previously uploaded transcription by its UUID:
cd server
uv run -m reflector.tools.process_transcript <transcript-uuid> --sync
To record both your voice and the meeting you're taking part in, you need:
Permissions:
You may have to add permission for browser's microphone access to record audio in
System Preferences -> Privacy & Security -> Microphone
System Preferences -> Privacy & Security -> Accessibility. You will be prompted to provide these when you try to connect.
This is an external tool for merging the audio feeds as explained in the previous section of this document. Note: We currently do not have instructions for Windows users.
System Preferences -> Sound and choose the devices created from the Output and Input tabs.Next.js projects are more used to NEXT_PUBLIC_ prefixed buildtime vars. We don't have those for the reason we need to serve a customizable prebuilt docker container.
Instead, all the variables are runtime. Variables needed to the frontend are served to the frontend app at initial render.
It also means there's no static prebuild and no static files to serve for js/html.
Reflector uses environment variable-based feature flags to control application functionality. These flags allow you to enable or disable features without code changes.
| Feature Flag | Environment Variable |
|---|---|
requireLogin | FEATURE_REQUIRE_LOGIN |
privacy | FEATURE_PRIVACY |
browse | FEATURE_BROWSE |
sendToZulip | FEATURE_SEND_TO_ZULIP |
rooms | FEATURE_ROOMS |
Feature flags are controlled via environment variables using the pattern FEATURE_{FEATURE_NAME} where {FEATURE_NAME} is the SCREAMING_SNAKE_CASE version of the feature name.
Examples:
# Enable user authentication requirement
FEATURE_REQUIRE_LOGIN=true
# Disable browse functionality
FEATURE_BROWSE=false
# Enable Zulip integration
FEATURE_SEND_TO_ZULIP=true
All new contributions should be made in a separate branch, and goes through a Pull Request. Conventional commits must be used for the PR title and commits.
The docs/ folder contains an older Docusaurus-based documentation site. These docs are no longer actively maintained and may be outdated. For current installation and deployment instructions, refer to the docsv2/ folder instead.
Python
73.1%
TypeScript
20.7%
Shell
5.7%