[Graduation Project] Flow: Enterprise Meeting Content Digitization & Intelligence Platform featuring Modular Monolith, Async AI Worker, Vector Semantic Search (pgvector), and Docker stack.
See the codeFlow is an enterprise-grade digital knowledge management and meeting intelligence platform designed to transform unstructured conversational audio into structured, searchable, and actionable digital assets.
Inheriting the speech processing and diarization pipeline from the FDSE 2025 research publication ("V-Scribe: Structured Transcription of Vietnamese Speech for Digital Knowledge Management", Springer CCIS Vol 2708)[cite: 6], Flow introduces an asynchronous multi-container architecture that automates meeting transcription, speaker identification, conversational segmentation, and semantic retrieval.
The system implements a Modular Monolithic Backend combined with an Isolated Asynchronous AI Worker Container orchestrated via Redis / BullMQ queues. The entire environment is containerized via Docker Compose behind an Nginx Reverse Proxy:
[ Client Browser (React SPA) ]
β
βΌ HTTPS (Port 443 / 80)
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Virtual Machine (Host Environment) β
β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Nginx Reverse Proxy Container (TLS Termination & Rate Limiting)β β
β βββββββββ¬βββββββββββββββββββββββββ¬ββββββββββββββββββββββββ¬ββββββββ β
β β / β /api/ β /ai/ β
β βΌ βΌ βΌ β
β βββββββββββββββββ βββββββββββββββββ βββββββββββββββββ β
β β Frontend UI β β Backend API β β AI Service β β
β β (React + Vite)β β (Node.js REST)β β (FastAPI App) β β
β βββββββββββββββββ βββββββββ¬ββββββββ βββββββββ²ββββββββ β
β β β β
β Dispatch Job βΌ β HTTP Task β
β βββββββββββββββββββββ β Invocationβ
β β Redis Message β β β
β β Broker (BullMQ) β β β
β βββββββββββ¬ββββββββββ β β
β β β β
β Consume Task βΌ β β
β βββββββββββββββββββββββββββββββββββββ΄ββββ β
β β Node.js Background Worker Container β β
β βββββββββββββββββββββ¬ββββββββββββββββββββ β
ββββββββββββββββββββββββββββββββββββββββββββββΌββββββββββββββββββββββββββββ
β Outbound TLS / HTTPS
βΌ
βββββββββββββββββββββββββββββββββββββββββββ
β External Managed BaaS (Supabase Cloud) β
β β’ PostgreSQL: Structured Relational DB β
β β’ pgvector: 512-dim Semantic Embeddings β
β β’ Object Storage: Audios & Avatars β
βββββββββββββββββββββββββββββββββββββββββββ
PhoWhisper-large.pgvector HNSW indexes.The system uses Supabase (PostgreSQL with pgvector extension) to enforce referential integrity across 13 domain tables:
account # User identity, authentication credentials, and profiles
setting # User preferences (theme, language, notifications)
voice_sample # Reference audio samples and voiceprint embedding vectors
meeting # Meeting metadata, processing status, and ownership
audio_file # Raw audio file references, duration, and formats
processing_job # Job-level lifecycle and progress tracking
processing_step # Step-level execution tracking (STT, diarization, analysis)
speaker # Meeting participants identified by acoustic matching
transcript_segment # Timestamped transcript segments mapped to speakers
semantic_segment # Topic-based semantic timeline segments
speaker_statistic # Speaking frequency and interaction intensity metrics
search_index # 512-dimension vector embeddings for semantic search
meeting_summary # AI-generated meeting summaries
Flow/
βββ ai_service/ # Python FastAPI AI processing engine
β βββ analysis/ # NLP summaries, topics, and behavioral analytics
β βββ asr/ # PhoWhisper Speech-to-Text pipeline
β βββ audio/ # Chunking, noise reduction, and preprocessing
β βββ speaker/ # Pyannote diarization & ECAPA-TDNN embeddings
β βββ Dockerfile # AI container specification
β βββ main.py # FastAPI service entry point
β βββ requirements.txt # PyTorch, Transformers, Pyannote dependencies
β
βββ backend-node/ # Node.js Modular Monolith & Async Worker
β βββ src/
β β βββ config/ # AppConfig & environment management
β β βββ queues/ # RedisQueueManager (BullMQ orchestrator)
β β βββ services/ # Domain services (Auth, Meeting, User, Voice)
β β βββ utils/ # Crypto, Storage, DateTime, Validation helpers
β βββ server.js # REST API entry point (Port 9000)
β βββ worker.js # Background job queue consumer
β βββ Dockerfile # Backend container specification
β βββ package.json # Node.js dependencies
β
βββ frontend/ # React.js Single Page Application (SPA)
β βββ src/
β β βββ assets/ # Icons, illustrations, and static assets
β β βββ components/ # Reusable UI component library (Design System)
β β βββ pages/ # Auth, Landing, Dashboard, DiaryDetail, Profile
β β βββ services/ # REST API client & Supabase auth service
β β βββ App.tsx # SPA routing & application layout
β βββ nginx.conf # Internal Nginx web server config (Port 80)
β βββ Dockerfile # Multi-stage production build container
β βββ package.json # React, Vite, Tailwind CSS dependencies
β
βββ reverse-proxy/ # Nginx gateway reverse proxy configuration
βββ docker-compose.yml # Multi-service container orchestration
βββ .gitignore # Version control exclusion rules
βββ README.md # Project documentation
git clone [https://github.com/sh1kaku59/Flow.git](https://github.com/sh1kaku59/Flow.git)
cd Flow
Ensure the following base tools are installed:
20.x LTS (Docker images use node:20-alpine)10+3.11.x (AI Docker image uses python:3.11-slim)v2+7.x (if running locally without Docker)PATH (required for local audio normalization)cd frontend
npm install
npm run dev
http://localhost:5173envDir: "../backend-node" in frontend/vite.config.js, reading frontend environment variables directly.In a new terminal window:
cd backend-node
npm install
npm run dev
Run the background worker in a separate terminal:
cd backend-node
npm run dev:worker
http://localhost:9000/healthFrom the repository root:
# Create virtual environment
python -m venv .venv
# Activate environment
# On Windows:
.venv\Scripts\activate
# On macOS/Linux:
source .venv/bin/activate
# Install dependencies
pip install -r ai_service/requirements.txt
# Run AI service
python -m uvicorn ai_service.main:app --host 0.0.0.0 --port 8001
http://localhost:8001/healthvoice-samplesavatarsmeeting-audiosbackend-node/.env..env (Docker Compose build arguments for Frontend)VITE_API_BASE_URL=http://localhost:9000
VITE_SUPABASE_URL=[https://your-project.supabase.co](https://your-project.supabase.co)
backend-node/.env (Runtime environment for Backend, Worker, and AI)PORT=9000
SUPABASE_URL=[https://your-project.supabase.co](https://your-project.supabase.co)
SUPABASE_SERVICE_ROLE_KEY=your_supabase_service_role_key
HF_TOKEN=your_huggingface_access_token
FRONTEND_ORIGIN=http://localhost:5173,[http://127.0.0.1:5173](http://127.0.0.1:5173)
AI_SERVICE_URL=[http://127.0.0.1:8001](http://127.0.0.1:8001)
BACKEND_CALLBACK_URL=[http://127.0.0.1:9000/ai/progress](http://127.0.0.1:9000/ai/progress)
REDIS_URL=redis://127.0.0.1:6379
VOICE_BUCKET=voice-samples
AVATAR_BUCKET=avatars
MEETING_AUDIO_BUCKET=meeting-audios
SESSION_COOKIE_NAME=sid
SESSION_COOKIE_SECURE=false
SESSION_COOKIE_SAMESITE=lax
QUEUE_WORKER_CONCURRENCY=1
RATE_LIMIT_DISABLED=false
EMBEDDING_DIM=512
Launch all containerized services with a single command:
docker compose up -d --build
Service Endpoints:
| Service | Container Name | Port | Description |
|---|---|---|---|
| Frontend | frontend | 80 (Internal) | React UI served via Nginx |
| Backend API | backend | 9000 | Node.js REST API & Auth orchestration |
| Worker | worker | Background | BullMQ Queue consumer |
| AI Engine | ai-service | 8001 | FastAPI audio processing & STT |
| Redis | redis | 6379 | In-memory message broker |
| Gateway | reverse-proxy | 80 / 443 | Nginx reverse proxy & SSL manager |
To stop all services:
docker compose down
redis-server is running, and verify that REDIS_URL matches the network.SUPABASE_URL and SUPABASE_SERVICE_ROLE_KEY are correct and that the key role is service_role.HF_TOKEN error: Pyannote diarization requires an accepted Hugging Face model agreement and a valid user access token.FFmpeg is correctly installed on the operating system and accessible via terminal..env files or secret keys into version control.SUPABASE_SERVICE_ROLE_KEY must never be exposed in client-side code or public repositories.[Graduation Project] Flow: Enterprise Meeting Content Digitization & Intelligence Platform featuring Modular Monolith, Async AI Worker, Vector Semantic Search (pgvector), and Docker stack.
See the codeFlow is an enterprise-grade digital knowledge management and meeting intelligence platform designed to transform unstructured conversational audio into structured, searchable, and actionable digital assets.
Inheriting the speech processing and diarization pipeline from the FDSE 2025 research publication ("V-Scribe: Structured Transcription of Vietnamese Speech for Digital Knowledge Management", Springer CCIS Vol 2708)[cite: 6], Flow introduces an asynchronous multi-container architecture that automates meeting transcription, speaker identification, conversational segmentation, and semantic retrieval.
The system implements a Modular Monolithic Backend combined with an Isolated Asynchronous AI Worker Container orchestrated via Redis / BullMQ queues. The entire environment is containerized via Docker Compose behind an Nginx Reverse Proxy:
[ Client Browser (React SPA) ]
β
βΌ HTTPS (Port 443 / 80)
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Virtual Machine (Host Environment) β
β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Nginx Reverse Proxy Container (TLS Termination & Rate Limiting)β β
β βββββββββ¬βββββββββββββββββββββββββ¬ββββββββββββββββββββββββ¬ββββββββ β
β β / β /api/ β /ai/ β
β βΌ βΌ βΌ β
β βββββββββββββββββ βββββββββββββββββ βββββββββββββββββ β
β β Frontend UI β β Backend API β β AI Service β β
β β (React + Vite)β β (Node.js REST)β β (FastAPI App) β β
β βββββββββββββββββ βββββββββ¬ββββββββ βββββββββ²ββββββββ β
β β β β
β Dispatch Job βΌ β HTTP Task β
β βββββββββββββββββββββ β Invocationβ
β β Redis Message β β β
β β Broker (BullMQ) β β β
β βββββββββββ¬ββββββββββ β β
β β β β
β Consume Task βΌ β β
β βββββββββββββββββββββββββββββββββββββ΄ββββ β
β β Node.js Background Worker Container β β
β βββββββββββββββββββββ¬ββββββββββββββββββββ β
ββββββββββββββββββββββββββββββββββββββββββββββΌββββββββββββββββββββββββββββ
β Outbound TLS / HTTPS
βΌ
βββββββββββββββββββββββββββββββββββββββββββ
β External Managed BaaS (Supabase Cloud) β
β β’ PostgreSQL: Structured Relational DB β
β β’ pgvector: 512-dim Semantic Embeddings β
β β’ Object Storage: Audios & Avatars β
βββββββββββββββββββββββββββββββββββββββββββ
PhoWhisper-large.pgvector HNSW indexes.The system uses Supabase (PostgreSQL with pgvector extension) to enforce referential integrity across 13 domain tables:
account # User identity, authentication credentials, and profiles
setting # User preferences (theme, language, notifications)
voice_sample # Reference audio samples and voiceprint embedding vectors
meeting # Meeting metadata, processing status, and ownership
audio_file # Raw audio file references, duration, and formats
processing_job # Job-level lifecycle and progress tracking
processing_step # Step-level execution tracking (STT, diarization, analysis)
speaker # Meeting participants identified by acoustic matching
transcript_segment # Timestamped transcript segments mapped to speakers
semantic_segment # Topic-based semantic timeline segments
speaker_statistic # Speaking frequency and interaction intensity metrics
search_index # 512-dimension vector embeddings for semantic search
meeting_summary # AI-generated meeting summaries
Flow/
βββ ai_service/ # Python FastAPI AI processing engine
β βββ analysis/ # NLP summaries, topics, and behavioral analytics
β βββ asr/ # PhoWhisper Speech-to-Text pipeline
β βββ audio/ # Chunking, noise reduction, and preprocessing
β βββ speaker/ # Pyannote diarization & ECAPA-TDNN embeddings
β βββ Dockerfile # AI container specification
β βββ main.py # FastAPI service entry point
β βββ requirements.txt # PyTorch, Transformers, Pyannote dependencies
β
βββ backend-node/ # Node.js Modular Monolith & Async Worker
β βββ src/
β β βββ config/ # AppConfig & environment management
β β βββ queues/ # RedisQueueManager (BullMQ orchestrator)
β β βββ services/ # Domain services (Auth, Meeting, User, Voice)
β β βββ utils/ # Crypto, Storage, DateTime, Validation helpers
β βββ server.js # REST API entry point (Port 9000)
β βββ worker.js # Background job queue consumer
β βββ Dockerfile # Backend container specification
β βββ package.json # Node.js dependencies
β
βββ frontend/ # React.js Single Page Application (SPA)
β βββ src/
β β βββ assets/ # Icons, illustrations, and static assets
β β βββ components/ # Reusable UI component library (Design System)
β β βββ pages/ # Auth, Landing, Dashboard, DiaryDetail, Profile
β β βββ services/ # REST API client & Supabase auth service
β β βββ App.tsx # SPA routing & application layout
β βββ nginx.conf # Internal Nginx web server config (Port 80)
β βββ Dockerfile # Multi-stage production build container
β βββ package.json # React, Vite, Tailwind CSS dependencies
β
βββ reverse-proxy/ # Nginx gateway reverse proxy configuration
βββ docker-compose.yml # Multi-service container orchestration
βββ .gitignore # Version control exclusion rules
βββ README.md # Project documentation
git clone [https://github.com/sh1kaku59/Flow.git](https://github.com/sh1kaku59/Flow.git)
cd Flow
Ensure the following base tools are installed:
20.x LTS (Docker images use node:20-alpine)10+3.11.x (AI Docker image uses python:3.11-slim)v2+7.x (if running locally without Docker)PATH (required for local audio normalization)cd frontend
npm install
npm run dev
http://localhost:5173envDir: "../backend-node" in frontend/vite.config.js, reading frontend environment variables directly.In a new terminal window:
cd backend-node
npm install
npm run dev
Run the background worker in a separate terminal:
cd backend-node
npm run dev:worker
http://localhost:9000/healthFrom the repository root:
# Create virtual environment
python -m venv .venv
# Activate environment
# On Windows:
.venv\Scripts\activate
# On macOS/Linux:
source .venv/bin/activate
# Install dependencies
pip install -r ai_service/requirements.txt
# Run AI service
python -m uvicorn ai_service.main:app --host 0.0.0.0 --port 8001
http://localhost:8001/healthvoice-samplesavatarsmeeting-audiosbackend-node/.env..env (Docker Compose build arguments for Frontend)VITE_API_BASE_URL=http://localhost:9000
VITE_SUPABASE_URL=[https://your-project.supabase.co](https://your-project.supabase.co)
backend-node/.env (Runtime environment for Backend, Worker, and AI)PORT=9000
SUPABASE_URL=[https://your-project.supabase.co](https://your-project.supabase.co)
SUPABASE_SERVICE_ROLE_KEY=your_supabase_service_role_key
HF_TOKEN=your_huggingface_access_token
FRONTEND_ORIGIN=http://localhost:5173,[http://127.0.0.1:5173](http://127.0.0.1:5173)
AI_SERVICE_URL=[http://127.0.0.1:8001](http://127.0.0.1:8001)
BACKEND_CALLBACK_URL=[http://127.0.0.1:9000/ai/progress](http://127.0.0.1:9000/ai/progress)
REDIS_URL=redis://127.0.0.1:6379
VOICE_BUCKET=voice-samples
AVATAR_BUCKET=avatars
MEETING_AUDIO_BUCKET=meeting-audios
SESSION_COOKIE_NAME=sid
SESSION_COOKIE_SECURE=false
SESSION_COOKIE_SAMESITE=lax
QUEUE_WORKER_CONCURRENCY=1
RATE_LIMIT_DISABLED=false
EMBEDDING_DIM=512
Launch all containerized services with a single command:
docker compose up -d --build
Service Endpoints:
| Service | Container Name | Port | Description |
|---|---|---|---|
| Frontend | frontend | 80 (Internal) | React UI served via Nginx |
| Backend API | backend | 9000 | Node.js REST API & Auth orchestration |
| Worker | worker | Background | BullMQ Queue consumer |
| AI Engine | ai-service | 8001 | FastAPI audio processing & STT |
| Redis | redis | 6379 | In-memory message broker |
| Gateway | reverse-proxy | 80 / 443 | Nginx reverse proxy & SSL manager |
To stop all services:
docker compose down
redis-server is running, and verify that REDIS_URL matches the network.SUPABASE_URL and SUPABASE_SERVICE_ROLE_KEY are correct and that the key role is service_role.HF_TOKEN error: Pyannote diarization requires an accepted Hugging Face model agreement and a valid user access token.FFmpeg is correctly installed on the operating system and accessible via terminal..env files or secret keys into version control.SUPABASE_SERVICE_ROLE_KEY must never be exposed in client-side code or public repositories.