8242a466b38b7140dd7e1b6a368b47595778fbbb
VoiceVault
VoiceVault is an archival audio app where users upload recordings, get speech-to-text transcripts, and search their archive with RAG-ready chunks.
What The App Does
- User registration and login
- Upload audio/video recordings (private or public)
- Store original media in Supabase Storage bucket (
archives) - Transcribe media locally with
faster-whisper - Save transcript chunks to
rag_chunks - Save prompt/context metadata to
archive_metadata - View feed/history, open full post detail, play original audio
- Edit and delete your own posts
- Download a post as a ZIP bundle
- Search transcript chunks for RAG use
Tech Stack
- Backend: Flask (
backend/main.py,backend/api_routes.py) - Data + storage: Supabase Postgres + Supabase Storage (
backend/db_queries.py) - Frontend: React + Vite (
frontend/) - Transcription:
faster-whisper(local inference)
Project Structure
schema.sql: DB schemabackend/main.py: Flask app entrypointbackend/api_routes.py: API routes and orchestrationbackend/db_queries.py: Supabase table/storage functionsfrontend/src/App.jsx: main app shell/navigationfrontend/src/pages/: Feed, Create, History, Search, Post detail, Settings
Backend Environment
Create backend/.env:
SUPABASE_URL=your_supabase_url
SUPABASE_SERVICE_ROLE_KEY=your_service_role_key
SUPABASE_BUCKET=archives
# Optional
BACKEND_UPLOAD_DIR=uploads
WHISPER_MODEL=base
WHISPER_DEVICE=cpu
WHISPER_COMPUTE_TYPE=int8
EMBEDDING_PROVIDER=local
OPENAI_EMBEDDING_MODEL=text-embedding-3-small
# OPENAI_API_KEY=... # only needed if EMBEDDING_PROVIDER=openai
Notes:
- Use
SUPABASE_SERVICE_ROLE_KEY, not publishable/anon key. - Ensure bucket name matches exactly (
archives).
How To Start
1. Setup database
- Open Supabase SQL editor.
- Run
schema.sql. - Confirm tables and storage bucket are created.
2. Start backend
cd TitanForge/backend
pip install -r ../requirements.txt
python main.py
Backend runs at http://localhost:5000.
3. Start frontend
cd TitanForge/frontend
npm install
npm run dev
Frontend runs at http://localhost:5173 (default Vite).
How To Use The App
- Register or log in from the landing screen.
- Go to
Make an Archive Post. - Fill title/description, choose visibility, upload an audio/video file.
- Wait for transcription to finish.
- Open
My FeedorHistoryto view the post. - Click
View Postto:
- Play original audio
- Read full transcript
- See timestamped chunks
- Download ZIP archive
- In
History, use edit/delete actions for your own posts. - Use
Search Archivesto query transcript chunks.
Main API Endpoints
Auth:
POST /api/auth/registerPOST /api/auth/login
Upload and processing:
POST /api/posts/upload
Posts and history:
GET /api/postsGET /api/posts/<post_id>PUT /api/posts/<post_id>/editDELETE /api/posts/<post_id>?user_id=<id>GET /api/users/<user_id>/history
Playback and download:
GET /api/posts/<post_id>/audio-url?user_id=<id>&expires_in=3600GET /api/posts/<post_id>/download
RAG:
GET /api/posts/<post_id>/chunksGET /api/rag/search?user_id=<id>&q=<query>
Common Issues
403 / RLSduring upload:- Usually wrong key type. Use service role key in backend
.env.
- Usually wrong key type. Use service role key in backend
- Audio not playing:
- Verify
archive_files.role='original_audio'exists for that post. - Verify bucket is
archives. - Restart backend after
.envchanges.
- Verify
- Whisper slow on CPU:
- Use a smaller model or faster machine/GPU settings.
Languages
JavaScript
61.8%
Python
37.1%
Dockerfile
0.8%
HTML
0.3%