{"id":30874223,"url":"https://github.com/monadical-sas/reflector","last_synced_at":"2026-02-20T20:03:26.693Z","repository":{"id":311238095,"uuid":"650694268","full_name":"Monadical-SAS/reflector","owner":"Monadical-SAS","description":"100% local ML models for meeting transcription and analysis","archived":false,"fork":false,"pushed_at":"2026-02-18T03:34:54.000Z","size":47790,"stargazers_count":15,"open_issues_count":87,"forks_count":2,"subscribers_count":4,"default_branch":"main","last_synced_at":"2026-02-18T04:31:32.206Z","etag":null,"topics":["meeting-notes","summarizer","transcription"],"latest_commit_sha":null,"homepage":"https://reflector.media","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Monadical-SAS.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2023-06-07T15:52:02.000Z","updated_at":"2026-02-13T23:27:26.000Z","dependencies_parsed_at":"2025-12-15T20:06:54.773Z","dependency_job_id":null,"html_url":"https://github.com/Monadical-SAS/reflector","commit_stats":null,"previous_names":["monadical-sas/reflector"],"tags_count":54,"template":false,"template_full_name":null,"purl":"pkg:github/Monadical-SAS/reflector","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Monadical-SAS%2Freflector","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Monadical-SAS%2Freflector/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Monadical-SAS%2Freflector/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Monadical-SAS%2Freflector/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Monadical-SAS","download_url":"https://codeload.github.com/Monadical-SAS/reflector/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Monadical-SAS%2Freflector/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29662591,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-20T19:49:36.704Z","status":"ssl_error","status_checked_at":"2026-02-20T19:44:05.372Z","response_time":59,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["meeting-notes","summarizer","transcription"],"created_at":"2025-09-08T00:45:50.717Z","updated_at":"2026-02-20T20:03:26.677Z","avatar_url":"https://github.com/Monadical-SAS.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\u003cimg width=\"100\" alt=\"image\" src=\"https://github.com/user-attachments/assets/66fb367b-2c89-4516-9912-f47ac59c6a7f\"/\u003e\n\n# Reflector\n\nReflector 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).\n\n[![Tests](https://github.com/monadical-sas/reflector/actions/workflows/test_server.yml/badge.svg?branch=main\u0026event=push)](https://github.com/monadical-sas/reflector/actions/workflows/test_server.yml)\n[![License: MIT](https://img.shields.io/badge/license-MIT-green.svg)](https://opensource.org/licenses/MIT)\n\u003c/div\u003e\n\u003c/div\u003e\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\n      \u003ca href=\"https://github.com/user-attachments/assets/21f5597c-2930-4899-a154-f7bd61a59e97\"\u003e\n        \u003cimg width=\"700\" alt=\"image\" src=\"https://github.com/user-attachments/assets/21f5597c-2930-4899-a154-f7bd61a59e97\" /\u003e\n      \u003c/a\u003e\n    \u003c/td\u003e\n    \u003ctd\u003e\n      \u003ca href=\"https://github.com/user-attachments/assets/f6b9399a-5e51-4bae-b807-59128d0a940c\"\u003e\n        \u003cimg width=\"700\" alt=\"image\" src=\"https://github.com/user-attachments/assets/f6b9399a-5e51-4bae-b807-59128d0a940c\" /\u003e\n      \u003c/a\u003e\n    \u003c/td\u003e\n    \u003ctd\u003e\n      \u003ca href=\"https://github.com/user-attachments/assets/a42ce460-c1fd-4489-a995-270516193897\"\u003e\n        \u003cimg width=\"700\" alt=\"image\" src=\"https://github.com/user-attachments/assets/a42ce460-c1fd-4489-a995-270516193897\" /\u003e\n      \u003c/a\u003e\n    \u003c/td\u003e\n    \u003ctd\u003e\n      \u003ca href=\"https://github.com/user-attachments/assets/21929f6d-c309-42fe-9c11-f1299e50fbd4\"\u003e\n        \u003cimg width=\"700\" alt=\"image\" src=\"https://github.com/user-attachments/assets/21929f6d-c309-42fe-9c11-f1299e50fbd4\" /\u003e\n      \u003c/a\u003e\n    \u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n## What is Reflector?\n\nReflector is a web application that utilizes local models to process audio content, providing:\n\n- **Real-time Transcription**: Convert speech to text using [Whisper](https://github.com/openai/whisper) (multi-language) or [Parakeet](https://huggingface.co/nvidia/parakeet-tdt-0.6b-v2) (English) models\n- **Speaker Diarization**: Identify and label different speakers using [Pyannote](https://github.com/pyannote/pyannote-audio) 3.1\n- **Live Translation**: Translate audio content in real-time to many languages with [Facebook Seamless-M4T](https://github.com/facebookresearch/seamless_communication)\n- **Topic Detection \u0026 Summarization**: Extract key topics and generate concise summaries using LLMs\n- **Meeting Recording**: Create permanent records of meetings with searchable transcripts\n\nCurrently we provide [modal.com](https://modal.com/) gpu template to deploy.\n\n## Background\n\nThe project architecture consists of three primary components:\n\n- **Back-End**: Python server that offers an API and data persistence, found in `server/`.\n- **Front-End**: NextJS React project hosted on Vercel, located in `www/`.\n- **GPU implementation**: Providing services such as speech-to-text transcription, topic generation, automated summaries, and translations.\n\nIt also uses authentik for authentication if activated.\n\n## Contribution Guidelines\n\nAll new contributions should be made in a separate branch, and goes through a Pull Request.\n[Conventional commits](https://www.conventionalcommits.org/en/v1.0.0/) must be used for the PR title and commits.\n\n## Usage\n\nTo record both your voice and the meeting you're taking part in, you need:\n\n- For an in-person meeting, make sure your microphone is in range of all participants.\n- If using several microphones, make sure to merge the audio feeds into one with an external tool.\n- For an online meeting, if you do not use headphones, your microphone should be able to pick up both your voice and the audio feed of the meeting.\n- If you want to use headphones, you need to merge the audio feeds with an external tool.\n\nPermissions:\n\nYou may have to add permission for browser's microphone access to record audio in\n`System Preferences -\u003e Privacy \u0026 Security -\u003e Microphone`\n`System Preferences -\u003e Privacy \u0026 Security -\u003e Accessibility`. You will be prompted to provide these when you try to connect.\n\n### How to Install Blackhole (Mac Only)\n\nThis is an external tool for merging the audio feeds as explained in the previous section of this document.\nNote: We currently do not have instructions for Windows users.\n\n- Install [Blackhole](https://github.com/ExistentialAudio/BlackHole)-2ch (2 ch is enough) by 1 of 2 options listed.\n- Setup [\"Aggregate device\"](https://github.com/ExistentialAudio/BlackHole/wiki/Aggregate-Device) to route web audio and local microphone input.\n- Setup [Multi-Output device](https://github.com/ExistentialAudio/BlackHole/wiki/Multi-Output-Device)\n- Then goto `System Preferences -\u003e Sound` and choose the devices created from the Output and Input tabs.\n- The input from your local microphone, the browser run meeting should be aggregated into one virtual stream to listen to and the output should be fed back to your specified output devices if everything is configured properly.\n\n## Installation\n\n*Note: we're working toward better installation, theses instructions are not accurate for now*\n\n### Frontend\n\nStart with `cd www`.\n\n**Installation**\n\n```bash\npnpm install\ncp .env.example .env\n```\n\nThen, fill in the environment variables in `.env` as needed. If you are unsure on how to proceed, ask in Zulip.\n\n**Run in development mode**\n\n```bash\npnpm dev\n```\n\nThen (after completing server setup and starting it) open [http://localhost:3000](http://localhost:3000) to view it in the browser.\n\n**OpenAPI Code Generation**\n\nTo generate the TypeScript files from the openapi.json file, make sure the python server is running, then run:\n\n```bash\npnpm openapi\n```\n\n### Backend\n\nStart with `cd server`.\n\n**Run in development mode**\n\n```bash\ndocker compose up -d redis\n\n# on the first run, or if the schemas changed\nuv run alembic upgrade head\n\n# start the worker\nuv run celery -A reflector.worker.app worker --loglevel=info\n\n# start the app\nuv run -m reflector.app --reload\n```\n\nThen fill `.env` with the omitted values (ask in Zulip).\n\n**Crontab (optional)**\n\nFor crontab (only healthcheck for now), start the celery beat (you don't need it on your local dev environment):\n\n```bash\nuv run celery -A reflector.worker.app beat\n```\n\n### GPU models\n\nCurrently, reflector heavily use custom local models, deployed on modal. All the micro services are available in server/gpu/\n\nTo deploy llm changes to modal, you need:\n- a modal account\n- set up the required secret in your modal account (REFLECTOR_GPU_APIKEY)\n- install the modal cli\n- connect your modal cli to your account if not done previously\n- `modal run path/to/required/llm`\n\n## Using local files\n\nYou can manually process an audio file by calling the process tool:\n\n```bash\nuv run python -m reflector.tools.process path/to/audio.wav\n```\n\n## Reprocessing any transcription\n\n```bash\nuv run -m reflector.tools.process_transcript 81ec38d1-9dd7-43d2-b3f8-51f4d34a07cd --sync\n```\n\n## Build-time env variables\n\nNext.js projects are more used to NEXT_PUBLIC_ prefixed buildtime vars. We don't have those for the reason we need to serve a ccustomizable prebuild docker container.\n\nInstead, all the variables are runtime. Variables needed to the frontend are served to the frontend app at initial render.\n\nIt also means there's no static prebuild and no static files to serve for js/html.\n\n## Feature Flags\n\nReflector uses environment variable-based feature flags to control application functionality. These flags allow you to enable or disable features without code changes.\n\n### Available Feature Flags\n\n| Feature Flag | Environment Variable |\n|-------------|---------------------|\n| `requireLogin` | `FEATURE_REQUIRE_LOGIN` |\n| `privacy` | `FEATURE_PRIVACY` |\n| `browse` | `FEATURE_BROWSE` |\n| `sendToZulip` | `FEATURE_SEND_TO_ZULIP` |\n| `rooms` | `FEATURE_ROOMS` |\n\n### Setting Feature Flags\n\nFeature 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.\n\n**Examples:**\n```bash\n# Enable user authentication requirement\nFEATURE_REQUIRE_LOGIN=true\n\n# Disable browse functionality\nFEATURE_BROWSE=false\n\n# Enable Zulip integration\nFEATURE_SEND_TO_ZULIP=true\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmonadical-sas%2Freflector","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmonadical-sas%2Freflector","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmonadical-sas%2Freflector/lists"}