A full-stack web application for uploading audio/video, transcribing with Whisper, summarizing via an LLM, and managing markdown-based linked notes.
- User-Centric UX: Provide an intuitive dashboard for managing transcripts and notes.
- Scalable Architecture: Use Celery and Redis for background tasks to support concurrent uploads.
- Modular Codebase: Organize into
transcriber,summarizer,notes, andusersapps. - Secure by Default: Implement JWT-based authentication, HTTPS support, and environment-driven secrets.
- Features
- Tech Stack
- Project Structure
- System Design
- Authentication
- API Endpoints
- Getting Started
- Docker Setup
- Frontend Setup
- Contributing
- License
- File Upload: Upload video/audio files with a progress display.
- Transcription: High-quality speech-to-text using OpenAI Whisper.
- Summarization: LLM-powered extraction of questions, key points, and highlights.
- Raw Transcript Viewer: Scrollable text output for transcripts.
- Notes:
- Markdown editor with live preview.
- Full CRUD operations (Create, Read, Update, Delete).
- Bi-directional linked notes.
- Support for external link attachments.
- Backend: Python, Django 4.x, Django REST Framework, Celery
- Transcription: Whisper (OpenAI) + FFmpeg
- LLM: OpenAI API (GPT-4 / GPT-3.5) or local model
- Database: PostgreSQL
- Async Broker: Redis
- Frontend: React 18.x, Vite, Tailwind CSS, React Router
- Markdown: react-markdown, remark-gfm or @uiw/react-md-editor
- Containerization: Docker & Docker Compose
scrybesync/
│
├── backend/
│ ├── manage.py
│ ├── requirements.txt
│ ├── Dockerfile
│ ├── docker-compose.yml
│ ├── config/
│ │ ├── settings.py
│ │ ├── urls.py
│ │ └── wsgi.py
│ ├── apps/
│ │ ├── users/ # User registration, JWT auth
│ │ ├── transcriber/ # Upload, Whisper integration
│ │ ├── summarizer/ # LLM calls & parsing
│ │ └── notes/ # Note model, linking logic
│ ├── media/ # Uploaded files
│ └── logs/
│
└── frontend/
├── public/
│ └── favicon.ico
├── src/
│ ├── components/
│ │ ├── Auth/ # Login, Register forms
│ │ ├── Transcription/
│ │ ├── Notes/
│ │ └── Layout/
│ ├── pages/
│ │ ├── Dashboard.jsx
│ │ ├── Transcribe.jsx
│ │ ├── NotesList.jsx
│ │ └── NoteDetail.jsx
│ ├── hooks/
│ ├── services/ # Axios API clients
│ ├── App.jsx
│ └── main.jsx
├── tailwind.config.js
└── package.json
-
Client → API Gateway
- React frontend uses Axios to call DRF endpoints (with JWT in
Authorizationheader).
- React frontend uses Axios to call DRF endpoints (with JWT in
-
API Server (Django + DRF)
- Upload Endpoint: Accepts audio/video, saves to
media/, enqueues Celery task. - Transcription Worker (Celery):
- Downloads file.
- Runs Whisper (
whisper.transcribe()). - Saves raw text to DB.
- Notifies user via polling or WebSocket.
- Summarization Worker (Celery):
- Takes transcript.
- Calls OpenAI API with prompts.
- Stores highlights, questions, summary JSON.
- Upload Endpoint: Accepts audio/video, saves to
-
Database (PostgreSQL)
- User:
username,email,password_hash - Transcript:
user,file_path,raw_text,status,created_at - Summary:
transcript,highlights,questions,notes,created_at - Note:
user,title,content (md),linked_notes (M2M),external_links (JSON)
- User:
-
Cache & Broker (Redis)
- Celery broker & result backend.
- Optional caching of API responses.
-
Register:
POST /api/auth/register/- Request:
{ "username", "email", "password" } - Response:
{ "access", "refresh" }
- Request:
-
Login:
POST /api/auth/login/- Request:
{ "username", "password" } - Response:
{ "access", "refresh" }
- Request:
-
Refresh Token:
POST /api/auth/token/refresh/- Request:
{ "refresh" } - Response:
{ "access" }
- Request:
-
Protected Endpoints require
Authorization: Bearer <access_token>
| Path | Method | Description |
|---|---|---|
/api/auth/register/ |
POST | Create user & return JWT tokens |
/api/auth/login/ |
POST | Authenticate & return JWT tokens |
/api/transcripts/ |
POST | Upload file → enqueue Whisper task |
/api/transcripts/ |
GET | List user’s transcripts & statuses |
/api/transcripts/{id}/ |
GET | Retrieve raw transcript & summary JSON |
/api/summaries/ |
POST | Trigger LLM summarization on a transcript |
/api/notes/ |
GET | List all notes |
/api/notes/ |
POST | Create a new markdown note |
/api/notes/{id}/ |
GET | Retrieve note details |
/api/notes/{id}/ |
PUT | Update note content/links |
/api/notes/{id}/ |
DELETE | Delete a note |
- Python 3.11+
- Node.js 18.x & npm
- PostgreSQL 14+
- Redis
- FFmpeg
git clone https://github.com/lucifron28/scrybesync.git
cd scrybesync/backend
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
python manage.py migrateIn backend/.env:
DJANGO_SECRET_KEY=your_secret_key
DEBUG=True
DATABASE_URL=postgres://user:pass@db:5432/scrybesync
REDIS_URL=redis://redis:6379/0
OPENAI_API_KEY=your_openai_key
redis-server
celery -A config worker -l info
python manage.py runserverdocker-compose up --buildcd ../frontend
npm install
npm run devAccess at http://localhost:3000
- Fork the repo
- Create a feature branch (
git checkout -b feature/foo) - Commit your changes (
git commit -am "Add foo") - Push to the branch (
git push origin feature/foo) - Open a Pull Request
MIT © Ron Vincent Cada