{"id":46379924,"url":"https://github.com/luongndcoder/scribble","last_synced_at":"2026-05-28T05:01:21.371Z","repository":{"id":342176598,"uuid":"1173132027","full_name":"luongndcoder/Scribble","owner":"luongndcoder","description":"Ứng dụng ghi chú cuộc họp thông minh — ghi âm, phiên dịch realtime, realtime dịch đa ngôn ngữ và tạo biên bản tự động bằng AI.  Smart meeting notes app — record, real-time transcription, multi-language cabin translation, and AI-powered meeting minutes generation.","archived":false,"fork":false,"pushed_at":"2026-05-15T08:44:29.000Z","size":67869,"stargazers_count":6,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-15T09:43:55.586Z","etag":null,"topics":["ai-meeting-assistant","ai-summarization","cabin-translation","cross-platform","desktop-app","fastapi","llm","meeting-minutes","meeting-notes","meeting-transcription","nvidia-riva","python","react","realtime-transcription","speaker-diarization","speech-to-text","tauri","tauri-app","transcription","typescript"],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/luongndcoder.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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":"2026-03-05T03:22:33.000Z","updated_at":"2026-05-15T08:44:21.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/luongndcoder/Scribble","commit_stats":null,"previous_names":["luongndcoder/scribble"],"tags_count":14,"template":false,"template_full_name":null,"purl":"pkg:github/luongndcoder/Scribble","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/luongndcoder%2FScribble","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/luongndcoder%2FScribble/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/luongndcoder%2FScribble/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/luongndcoder%2FScribble/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/luongndcoder","download_url":"https://codeload.github.com/luongndcoder/Scribble/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/luongndcoder%2FScribble/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33594851,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-05-28T02:00:06.440Z","response_time":99,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["ai-meeting-assistant","ai-summarization","cabin-translation","cross-platform","desktop-app","fastapi","llm","meeting-minutes","meeting-notes","meeting-transcription","nvidia-riva","python","react","realtime-transcription","speaker-diarization","speech-to-text","tauri","tauri-app","transcription","typescript"],"created_at":"2026-03-05T06:00:40.016Z","updated_at":"2026-05-28T05:01:21.340Z","avatar_url":"https://github.com/luongndcoder.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 🎤 Scribble — AI Meeting Minutes\n\n\u003e Ứng dụng ghi chú cuộc họp thông minh — ghi âm, phiên dịch realtime, dịch cabin đa ngôn ngữ và tạo biên bản tự động bằng AI.\n\u003e\n\u003e Smart meeting notes app — record, real-time transcription, multi-language cabin translation, and AI-powered meeting minutes generation.\n\n![Tauri](https://img.shields.io/badge/Tauri-2.0-FFC131?logo=tauri\u0026logoColor=white)\n![React](https://img.shields.io/badge/React-19-61DAFB?logo=react\u0026logoColor=white)\n![Python](https://img.shields.io/badge/Python-3.10+-3776AB?logo=python\u0026logoColor=white)\n![License](https://img.shields.io/badge/License-MIT-blue)\n\n**🇻🇳 [Tiếng Việt](#-tiếng-việt)** · **🇬🇧 [English](#-english)**\n\n### 🎬 Demo\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"public/demo.gif\" alt=\"Scribble Demo\" width=\"800\"\u003e\n\u003c/p\u003e\n\n---\n\n# 🇻🇳 Tiếng Việt\n\n## 📥 Tải ứng dụng\n\n| Hệ điều hành | Chip / Kiến trúc | File cài đặt | Link |\n|---------------|-------------------|---------------|------|\n| 🍎 **macOS** | Apple Silicon (M1/M2/M3/M4) | `Scribble_1.2.0_aarch64.dmg` | [⬇ Download](https://github.com/luongndcoder/Scribble/releases/latest/download/Scribble_1.2.0_aarch64.dmg) |\n| 🪟 **Windows** | 64-bit | `Scribble_1.2.0_x64-setup.exe` | [⬇ Download](https://github.com/luongndcoder/Scribble/releases/latest/download/Scribble_1.2.0_x64-setup.exe) |\n| 🐧 **Linux** | 64-bit (AppImage) | `Scribble_1.2.0_amd64.AppImage` | [⬇ Download](https://github.com/luongndcoder/Scribble/releases/latest/download/Scribble_1.2.0_amd64.AppImage) |\n| 🐧 **Linux** | 64-bit (deb) | `scribble_1.2.0_amd64.deb` | [⬇ Download](https://github.com/luongndcoder/Scribble/releases/latest/download/scribble_1.2.0_amd64.deb) |\n\n\u003e **⚠️ Lưu ý macOS:** Lần đầu mở app nếu gặp cảnh báo **\"Scribble Not Opened\"**, mở Terminal và chạy:\n\u003e ```bash\n\u003e xattr -cr /Applications/Scribble.app\n\u003e ```\n\u003e Hoặc vào **System Settings → Privacy \u0026 Security → scroll xuống → Allow Anyway**.\n\n## ✨ Tính năng chính\n\n| Tính năng | Mô tả |\n|-----------|-------|\n| 🎙️ **Ghi âm realtime** | Voice Activity Detection — tự cắt chunk theo silence |\n| 📤 **Upload file ghi âm** | Tải lên m4a/mp3/wav/mp4 có sẵn → phiên âm + biên bản tự động. Resume khi pipeline bị gián đoạn, lưu transcript theo từng chunk (timestamps mỗi 22s) |\n| 📝 **Phiên dịch tự động** | Nvidia Riva STT (streaming gRPC, 13+ ngôn ngữ) hoặc Soniox (chất lượng cao, ~$0.12/giờ) |\n| 👥 **Nhận diện người nói** | Speaker diarization realtime (ONNX Runtime + CAM++) — tự phân biệt giọng nói |\n| 🌐 **Dịch cabin realtime** | Nvidia NMT — dịch 10+ ngôn ngữ, realtime |\n| 📋 **Biên bản AI** | Tóm tắt: tiêu đề, key points, action items, decisions, risks, next steps. Hỗ trợ template MoM / Deep / Summary / Bullets / Custom |\n| 📎 **Tài liệu tham khảo** | Attach file .md / .txt vào meeting làm context cho AI — agenda, brief, glossary, prior decisions. Tối đa 1MB/file, 2MB tổng |\n| 📦 **Export đa định dạng** | Markdown (.md) và Word (.docx) |\n| 💾 **Lưu nháp tự động** | Auto-save transcript vào DB, khôi phục khi crash |\n| ✏️ **Sửa/Xóa transcript** | Inline edit từng dòng, auto-sync |\n| 🔊 **Lưu file ghi âm** | Download audio từ meeting history |\n| 🛡️ **Lọc hallucination** | Loại bỏ hallucination tự động |\n| ⚡ **Zero manual setup** | Cài là chạy ngay — chỉ cần nhập API key + tên model trong Settings, không có script SQL/flag ẩn |\n\n## 🚀 Khởi chạy (Development)\n\n### Yêu cầu\n\n- **Node.js** 20+ \u0026 **pnpm**\n- **Python** 3.10+\n- **Rust** (cài từ [rustup.rs](https://rustup.rs))\n\n### Cài đặt \u0026 Chạy\n\n```bash\ngit clone https://github.com/luongndcoder/Scribble.git\ncd Scribble\npnpm install\n\n# Chạy Python sidecar\ncd src-python\npython -m venv .venv \u0026\u0026 source .venv/bin/activate\npip install -r requirements.txt\npython main.py  # → http://127.0.0.1:8765\n\n# Chạy Tauri dev (tab khác)\ncd ..\npnpm tauri dev\n```\n\n### 🐳 Docker Compose (Web)\n\n```bash\ngit clone https://github.com/luongndcoder/Scribble.git\ncd Scribble\ndocker-compose up --build\n# → http://localhost:3000\n```\n\n\u003e Dữ liệu SQLite lưu trong `./data/`. API key nhập từ giao diện Settings.\n\n\n### 🔨 Build từ source\n\n#### macOS (Apple Silicon)\n\n```bash\n# 1. Build sidecar\ncd src-python\npython -m venv .venv \u0026\u0026 source .venv/bin/activate\npip install -r requirements.txt\npython -m PyInstaller scribble-sidecar.spec --noconfirm --clean\n\n# 2. Copy sidecar vào Tauri\ncp dist/scribble-sidecar ../src-tauri/binaries/scribble-sidecar-aarch64-apple-darwin\n\n# 3. Build DMG\ncd ..\npnpm install\nnpx tauri build -b dmg\n# → src-tauri/target/release/bundle/dmg/Scribble_*.dmg\n```\n\n#### Windows (64-bit)\n\n```bash\n# 1. Build sidecar\ncd src-python\npython -m venv .venv \u0026\u0026 .venv\\Scripts\\activate\npip install -r requirements.txt\npython -m PyInstaller scribble-sidecar.spec --noconfirm --clean\n\n# 2. Copy sidecar vào Tauri\ncopy dist\\scribble-sidecar.exe ..\\src-tauri\\binaries\\scribble-sidecar-x86_64-pc-windows-msvc.exe\n\n# 3. Build NSIS installer\ncd ..\npnpm install\nnpx tauri build -b nsis --target x86_64-pc-windows-msvc\n# → src-tauri/target/x86_64-pc-windows-msvc/release/bundle/nsis/*.exe\n```\n\n#### Linux (Ubuntu/Debian)\n\n```bash\n# 1. Build sidecar\ncd src-python\npython -m venv .venv \u0026\u0026 source .venv/bin/activate\npip install -r requirements.txt\npython -m PyInstaller scribble-sidecar.spec --noconfirm --clean\n\n# 2. Copy sidecar vào Tauri\ncp dist/scribble-sidecar ../src-tauri/binaries/scribble-sidecar-x86_64-unknown-linux-gnu\n\n# 3. Build AppImage + deb\ncd ..\npnpm install\nnpx tauri build\n# → src-tauri/target/release/bundle/appimage/*.AppImage\n# → src-tauri/target/release/bundle/deb/*.deb\n```\n\n\u003e **💡 CI/CD:** Windows và Linux build tự động qua GitHub Actions, trigger bằng `workflow_dispatch`.\n\n## 🔧 STT Backends\n\n| Backend | Đặc điểm | Yêu cầu | Chi phí |\n|---------|----------|---------|---------|\n| ☁️ **Nvidia Riva** | Streaming gRPC, 13+ ngôn ngữ, speaker diarization, Parakeet CTC 0.6B cho tiếng Việt | API key từ [build.nvidia.com](https://build.nvidia.com) | Free tier hào phóng |\n| 🎯 **Soniox** | Chất lượng tốt nhất, đa ngôn ngữ trong cùng 1 audio, diarization tích hợp | API key từ [soniox.com](https://soniox.com) | ~$0.12/giờ |\n\n\u003e 🔒 **Bảo mật:** API key của bạn được lưu trữ **hoàn toàn trên máy tính của bạn**. Chúng tôi không thu thập, gửi đi hay sử dụng API key của bạn cho bất kỳ mục đích nào.\n\n## 🤖 LLM Configuration\n\nCấu hình qua Settings — UI 2 cột (STT bên trái, AI bên phải) — không phải scroll:\n\n| Field | Ví dụ | Mô tả |\n|-------|-------|-------|\n| Provider | OpenAI / DeepSeek / Mistral / Groq / Gemini / OpenRouter / Compatible | Chọn nhà cung cấp |\n| API Key | `sk-xxx` | API key LLM |\n| Base URL | `https://api.openai.com/v1` | Chỉ cần cho \"Tương thích OpenAI\" |\n| Model | `gpt-4o-mini` / `deepseek-chat` / ... | Tên model — click dropdown để tải danh sách model khả dụng |\n\nHỗ trợ mọi provider OpenAI-compatible: OpenAI, DeepSeek, Mistral, Groq, Gemini, OpenRouter, Together, Ollama local, ...\n\n## 🌐 Dịch Cabin\n\n1. Tab **Recording** → bật **\"Dịch cabin\"** → chọn ngôn ngữ\n2. Ghi âm → bản dịch stream realtime dưới mỗi dòng transcript\n\n**Ngôn ngữ:** 🇬🇧 English · 🇯🇵 Nhật · 🇰🇷 Hàn · 🇨🇳 Trung · 🇫🇷 Pháp · 🇩🇪 Đức · 🇪🇸 TBN · 🇹🇭 Thái · 🇮🇩 Indo · 🇷🇺 Nga · 🇸🇦 Ả Rập · 🇮🇳 Hindi\n\n## 📤 Upload file ghi âm\n\nCó sẵn file audio/video → không cần ghi âm lại. Pipeline tự xử lý:\n\n1. Trang **Cuộc họp** → bấm **\"Upload file\"** (góc phải)\n2. Chọn file (m4a / mp3 / wav / mp4 / mkv / webm — tối đa 2GB), tiêu đề, ngôn ngữ\n3. Pipeline chạy tự động:\n   - **Normalize** → 16kHz mono WAV\n   - **Split** → cắt chunk theo silence (ffmpeg silencedetect, target 22s)\n   - **Transcribe** → STT song song 3 chunks/lần (Nvidia Riva streaming)\n   - **Diarize** → CAM++ ONNX + clustering toàn cuộc họp\n   - **Summarize** → LLM tự sinh biên bản\n4. Tiến độ stream qua SSE — đóng app vẫn tiếp tục, mở lại meeting để **Resume** từ chunk dở dang\n\n**Đặc điểm**:\n- Mỗi chunk lưu transcript + embedding ngay khi xong → crash recovery hoàn hảo\n- Timestamps mỗi 22s trong transcript (vd `1:24 – 1:46`)\n- Idempotent: upload file trùng (cùng SHA-256) → tự redirect về meeting cũ\n- Cross-platform: m4a/mp4 đều OK trên Windows / Linux / macOS\n\n## 📎 Tài liệu tham khảo (Reference Materials)\n\nCho AI thêm context khi tạo biên bản — agenda, project brief, glossary, prior decisions:\n\n1. Mở meeting → tab **Biên bản** → mục **\"Tài liệu tham khảo\"**\n2. Bấm **\"+ Thêm tài liệu\"** → chọn file `.md` / `.txt` (tối đa **1 MB/file**, **2 MB tổng/meeting**, 10 file)\n3. Bấm **\"Tạo biên bản\"** (regenerate) — AI dùng tài liệu này làm context\n\n**AI sẽ**:\n- Dùng tên/thuật ngữ trong tài liệu làm source of truth (sửa lỗi STT mistranscribe tên riêng)\n- Cross-reference cuộc họp với agenda — mục nào đã thảo luận, mục nào skip\n- Call out khi decision khác với đề xuất trong brief\n- Liệt kê tài liệu đã dùng ở cuối biên bản\n\n\u003e ⚠️ **Cảnh báo token**: khi total \u003e 400KB, UI hiện warning vì model 128k context (vd gpt-4o-mini) có thể bị cắt — cân nhắc dùng Claude/Gemini context lớn hơn.\n\n---\n\n# 🇬🇧 English\n\n## 📥 Download\n\n| OS | Architecture | Installer | Link |\n|----|-------------|-----------|------|\n| 🍎 **macOS** | Apple Silicon (M1/M2/M3/M4) | `Scribble_1.2.0_aarch64.dmg` | [⬇ Download](https://github.com/luongndcoder/Scribble/releases/latest/download/Scribble_1.2.0_aarch64.dmg) |\n| 🪟 **Windows** | 64-bit | `Scribble_1.2.0_x64-setup.exe` | [⬇ Download](https://github.com/luongndcoder/Scribble/releases/latest/download/Scribble_1.2.0_x64-setup.exe) |\n| 🐧 **Linux** | 64-bit (AppImage) | `Scribble_1.2.0_amd64.AppImage` | [⬇ Download](https://github.com/luongndcoder/Scribble/releases/latest/download/Scribble_1.2.0_amd64.AppImage) |\n| 🐧 **Linux** | 64-bit (deb) | `scribble_1.2.0_amd64.deb` | [⬇ Download](https://github.com/luongndcoder/Scribble/releases/latest/download/scribble_1.2.0_amd64.deb) |\n\n\u003e **⚠️ macOS note:** If you see **\"Scribble Not Opened\"** on first launch, open Terminal and run:\n\u003e ```bash\n\u003e xattr -cr /Applications/Scribble.app\n\u003e ```\n\u003e Or go to **System Settings → Privacy \u0026 Security → scroll down → Allow Anyway**.\n\n## ✨ Key Features\n\n| Feature | Description |\n|---------|-------------|\n| 🎙️ **Real-time Recording** | Voice Activity Detection — auto-splits chunks on silence |\n| 📤 **Upload Audio Files** | Upload existing m4a/mp3/wav/mp4 → automatic transcription + minutes. Resumable pipeline (survives app restart), per-chunk timestamps (every ~22s) |\n| 📝 **Auto Transcription** | Nvidia Riva STT (streaming gRPC, 13+ languages) or Soniox (premium quality, ~$0.12/hr) |\n| 👥 **Speaker Diarization** | Real-time speaker identification (ONNX Runtime + CAM++) — auto-detects voice changes |\n| 🌐 **Cabin Translation** | Nvidia NMT — 10+ languages, real-time streaming |\n| 📋 **AI Minutes** | Auto-summarize: title, key points, action items, decisions, risks, next steps. Templates: MoM / Deep / Summary / Bullets / Custom |\n| 📎 **Reference Materials** | Attach .md / .txt docs to a meeting as AI context — agendas, briefs, glossaries, prior decisions. Max 1MB/file, 2MB/meeting total |\n| 📦 **Multi-format Export** | Markdown (.md) and Word (.docx) |\n| 💾 **Auto-save Drafts** | Transcript saved to DB incrementally, resilient to crashes |\n| ✏️ **Edit/Delete Transcript** | Inline edit per line, auto-sync |\n| 🔊 **Audio Recording** | Download audio from meeting history |\n| 🛡️ **Hallucination Filter** | Auto-removes STT hallucinations |\n| ⚡ **Zero Manual Setup** | Install and go — only API keys + model names in Settings. No SQL scripts, no hidden flags |\n\n## 🚀 Quick Start (Development)\n\n### Prerequisites\n\n- **Node.js** 20+ \u0026 **pnpm**\n- **Python** 3.10+\n- **Rust** (install from [rustup.rs](https://rustup.rs))\n\n### Install \u0026 Run\n\n```bash\ngit clone https://github.com/luongndcoder/Scribble.git\ncd Scribble\npnpm install\n\n# Run Python sidecar\ncd src-python\npython -m venv .venv \u0026\u0026 source .venv/bin/activate\npip install -r requirements.txt\npython main.py  # → http://127.0.0.1:8765\n\n# Run Tauri dev (another tab)\ncd ..\npnpm tauri dev\n```\n\n### 🐳 Docker Compose (Web)\n\n```bash\ngit clone https://github.com/luongndcoder/Scribble.git\ncd Scribble\ndocker-compose up --build\n# → http://localhost:3000\n```\n\n\u003e SQLite data stored in `./data/`. API keys configured via Settings UI.\n\n\n### 🔨 Build from Source\n\n#### macOS (Apple Silicon)\n\n```bash\n# 1. Build sidecar\ncd src-python\npython -m venv .venv \u0026\u0026 source .venv/bin/activate\npip install -r requirements.txt\npython -m PyInstaller scribble-sidecar.spec --noconfirm --clean\n\n# 2. Copy sidecar to Tauri\ncp dist/scribble-sidecar ../src-tauri/binaries/scribble-sidecar-aarch64-apple-darwin\n\n# 3. Build DMG\ncd ..\npnpm install\nnpx tauri build -b dmg\n# → src-tauri/target/release/bundle/dmg/Scribble_*.dmg\n```\n\n#### Windows (64-bit)\n\n```bash\n# 1. Build sidecar\ncd src-python\npython -m venv .venv \u0026\u0026 .venv\\Scripts\\activate\npip install -r requirements.txt\npython -m PyInstaller scribble-sidecar.spec --noconfirm --clean\n\n# 2. Copy sidecar to Tauri\ncopy dist\\scribble-sidecar.exe ..\\src-tauri\\binaries\\scribble-sidecar-x86_64-pc-windows-msvc.exe\n\n# 3. Build NSIS installer\ncd ..\npnpm install\nnpx tauri build -b nsis --target x86_64-pc-windows-msvc\n# → src-tauri/target/x86_64-pc-windows-msvc/release/bundle/nsis/*.exe\n```\n\n#### Linux (Ubuntu/Debian)\n\n```bash\n# 1. Build sidecar\ncd src-python\npython -m venv .venv \u0026\u0026 source .venv/bin/activate\npip install -r requirements.txt\npython -m PyInstaller scribble-sidecar.spec --noconfirm --clean\n\n# 2. Copy sidecar to Tauri\ncp dist/scribble-sidecar ../src-tauri/binaries/scribble-sidecar-x86_64-unknown-linux-gnu\n\n# 3. Build AppImage + deb\ncd ..\npnpm install\nnpx tauri build\n# → src-tauri/target/release/bundle/appimage/*.AppImage\n# → src-tauri/target/release/bundle/deb/*.deb\n```\n\n\u003e **💡 CI/CD:** Windows and Linux builds run automatically via GitHub Actions, triggered by `workflow_dispatch`.\n\n## 🔧 STT Backends\n\n| Backend | Highlights | Requirements | Cost |\n|---------|------------|--------------|------|\n| ☁️ **Nvidia Riva** | Streaming gRPC, 13+ languages, speaker diarization, Parakeet CTC 0.6B for Vietnamese | API key from [build.nvidia.com](https://build.nvidia.com) | Generous free tier |\n| 🎯 **Soniox** | Best-in-class accuracy, multi-lang mixed audio, built-in diarization | API key from [soniox.com](https://soniox.com) | ~$0.12/hr |\n\n\u003e 🔒 **Privacy:** Your API keys are stored **entirely on your local machine**. We never collect, transmit, or use your API keys for any purpose.\n\n## 🤖 LLM Configuration\n\nConfigure via Settings — 2-column layout (STT left, AI right) — no scrolling:\n\n| Field | Example | Description |\n|-------|---------|-------------|\n| Provider | OpenAI / DeepSeek / Mistral / Groq / Gemini / OpenRouter / Compatible | Pick a provider |\n| API Key | `sk-xxx` | LLM provider API key |\n| Base URL | `https://api.openai.com/v1` | Only for \"OpenAI Compatible\" |\n| Model | `gpt-4o-mini` / `deepseek-chat` / ... | Click the dropdown to fetch available models |\n\nSupports any OpenAI-compatible provider: OpenAI, DeepSeek, Mistral, Groq, Gemini, OpenRouter, Together, local Ollama, etc.\n\n## 🌐 Cabin Translation\n\n1. Go to **Recording** tab → enable **\"Cabin Translation\"** toggle → select target language\n2. Start recording → translations stream in real-time below each transcript line\n\n**Languages:** 🇬🇧 English · 🇯🇵 Japanese · 🇰🇷 Korean · 🇨🇳 Chinese · 🇫🇷 French · 🇩🇪 German · 🇪🇸 Spanish · 🇹🇭 Thai · 🇮🇩 Indonesian · 🇷🇺 Russian · 🇸🇦 Arabic · 🇮🇳 Hindi\n\n## 📤 Upload Audio File\n\nHave an existing audio/video file? Skip live recording — the pipeline handles it:\n\n1. **Meetings** page → click **\"Upload file\"** (top right)\n2. Pick file (m4a / mp3 / wav / mp4 / mkv / webm — up to 2GB), title, language\n3. Pipeline runs automatically:\n   - **Normalize** → 16kHz mono WAV\n   - **Split** → silence-aligned chunks (ffmpeg silencedetect, ~22s target)\n   - **Transcribe** → 3 concurrent STT calls (Nvidia Riva streaming)\n   - **Diarize** → CAM++ ONNX + global clustering\n   - **Summarize** → LLM auto-generates minutes\n4. Progress streams via SSE — closing the app is fine, reopen the meeting and **Resume** picks up where it left off\n\n**Highlights**:\n- Per-chunk save (transcript + embedding) → perfect crash recovery\n- Per-chunk timestamps in transcript (e.g. `1:24 – 1:46`)\n- Idempotent: re-uploading the same file (matching SHA-256) redirects to the existing meeting\n- Cross-platform: m4a/mp4 work on Windows / Linux / macOS\n\n## 📎 Reference Materials\n\nGive the AI extra context when generating minutes — agendas, project briefs, glossaries, prior decisions:\n\n1. Open a meeting → **Minutes** tab → **\"Reference materials\"** section\n2. Click **\"+ Add file\"** → pick a `.md` / `.txt` (max **1 MB/file**, **2 MB total/meeting**, 10 files)\n3. Click **\"Create Minutes\"** (regenerate) — AI now uses these as context\n\n**The AI will**:\n- Treat names/terminology from your docs as source of truth (correcting STT mistranscriptions of proper nouns)\n- Cross-reference the meeting against the agenda — note what was covered vs. skipped\n- Call out when a decision diverges from what the brief proposed\n- List which reference files it used at the bottom of the minutes\n\n\u003e ⚠️ **Token warning**: past 400KB total, the UI surfaces a warning — 128k-context models (e.g. gpt-4o-mini) may truncate. Consider larger-context models (Claude, Gemini).\n\n---\n\n## 📁 Project Structure\n\n```\nScribble/\n├── src/                       # React + TypeScript frontend\n│   ├── components/\n│   │   ├── MeetingList.tsx        # Meeting history + Upload button\n│   │   ├── MeetingDetail.tsx      # Compact toolbar (back + tabs + actions)\n│   │   ├── MeetingAttachments.tsx # Reference materials (collapsible)\n│   │   ├── UploadAudioModal.tsx   # File picker + pipeline progress SSE\n│   │   ├── RecordingBar.tsx       # Slim merged rec + translation bar\n│   │   ├── StartupStatusBar.tsx   # Bottom-dock startup status strip\n│   │   ├── SettingsPanel.tsx      # 2-column STT | AI settings\n│   │   └── TranscriptView.tsx     # Per-chunk transcript w/ timestamps\n│   ├── stores/appStore.ts         # Zustand state (incl. backendOnline)\n│   └── lib/\n│       ├── attachments.ts         # Reference materials client\n│       ├── upload-audio.ts        # Audio upload + SSE bridge\n│       └── sidecar.ts             # Sidecar HTTP/WS helpers\n├── src-python/                # Python FastAPI sidecar\n│   ├── main.py                # FastAPI server, lifecycle, WS handlers\n│   ├── db.py                  # SQLite singleton + migrations\n│   ├── stt.py                 # STT (Nvidia Riva streaming, Soniox)\n│   ├── diarize.py             # Realtime speaker ID (CAM++ ONNX)\n│   ├── translate.py           # Nvidia NMT\n│   ├── summarize.py           # LLM minutes (MoM/Deep/Summary, MapReduce)\n│   ├── api/\n│   │   ├── upload.py          # /meetings/upload-audio, SSE job events\n│   │   ├── attachments.py     # /meetings/{id}/attachments CRUD\n│   │   ├── transcription.py   # /summarize, /translate\n│   │   ├── settings.py        # Settings CRUD + provider URLs\n│   │   ├── meetings.py        # Meetings CRUD + audio download\n│   │   └── diagnose.py        # /test-stt, /test-llm\n│   ├── services/\n│   │   ├── upload_pipeline.py # Normalize → split → STT → diarize → summarize\n│   │   ├── vad_splitter.py    # ffmpeg silencedetect chunker (22s target)\n│   │   ├── batch_diarizer.py  # scipy clustering on CAM++ embeddings\n│   │   ├── job_registry.py    # In-memory job state + SSE queue\n│   │   ├── upload_storage.py  # Streaming write + sha256 + sanitize\n│   │   └── audio.py           # find_ffmpeg helper (cross-platform)\n│   ├── models/                # ONNX model files (voxceleb_CAM++)\n│   └── scribble-sidecar.spec  # PyInstaller build spec (onedir)\n├── src-tauri/                 # Tauri Rust shell\n│   ├── src/\n│   │   ├── lib.rs             # App entrypoint, sidecar extraction\n│   │   └── upload.rs          # Streaming multipart upload to sidecar\n│   ├── tauri.conf.json        # App config, icons, bundle settings\n│   └── binaries/              # Platform sidecar binaries (tar.gz onedir)\n├── .github/workflows/         # CI/CD (Windows + Linux builds)\n└── package.json\n```\n\n---\n\n## 🙏 Acknowledgments\n\nThis project was inspired by and incorporates ideas from:\n\n- **[Meetily](https://github.com/Zackriya-Solutions/meetily)** by [Zackriya Solutions](https://github.com/Zackriya-Solutions) — UI/UX design patterns, summarization prompt engineering techniques, and chunking strategies for long transcripts.\n\n## 📄 License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fluongndcoder%2Fscribble","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fluongndcoder%2Fscribble","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fluongndcoder%2Fscribble/lists"}