sh1kaku59/Flow

[Graduation Project] Flow: Enterprise Meeting Content Digitization & Intelligence Platform featuring Modular Monolith, Async AI Worker, Vector Semantic Search (pgvector), and Docker stack.

TypeScript

2

2 commits

updated Aug 29, 2026

See the code

README

Flow: Meeting Content Digitization & Intelligence Platform

Project Scientific Base Frontend Backend AI Core Database Message Queue Containerization


πŸ“Œ 1. Project Overview

Flow 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.


πŸ—οΈ 2. System Architecture

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      β”‚
                      β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

✨ 3. Core Features

  • Voice Profiling & Speaker Enrollment: Enrolls user voice samples to construct reference acoustic embeddings, eliminating manual speaker labeling during meeting post-processing.
  • Automated Neural Processing Pipeline:
    • Speaker Diarization: Pyannote.audio sequence labeling for Voice Activity Detection (VAD) and Speaker Change Detection (SCD).
    • Vietnamese Speech-to-Text (ASR): High-precision transcription powered by fine-tuned PhoWhisper-large.
    • Meeting Intelligence: Automated topic extraction, executive summarization, and speaker participation intensity metrics.
  • Vector Semantic Search: Natural language conceptual queries (e.g., "budget decisions") powered by PostgreSQL pgvector HNSW indexes.
  • Contextual Playback (Click-to-Play): Interactive bidirectional synchronization between transcript segments and audio timestamps.
  • Enterprise Security: "No-Download" view-only streaming, Supabase Row Level Security (RLS), and short-lived Signed URLs.

πŸ—„οΈ 4. Database Schema & Core Entities

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

πŸ“‚ 5. Project Structure

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

πŸš€ 6. Installation & Setup Guide

Step 1: Clone the Repository

git clone [https://github.com/sh1kaku59/Flow.git](https://github.com/sh1kaku59/Flow.git)
cd Flow

Step 2: System Requirements & Prerequisites

Ensure the following base tools are installed:

  • Node.js: 20.x LTS (Docker images use node:20-alpine)
  • npm: 10+
  • Python: 3.11.x (AI Docker image uses python:3.11-slim)
  • Docker Desktop & Docker Compose: v2+
  • Redis: 7.x (if running locally without Docker)
  • FFmpeg: Installed and added to system PATH (required for local audio normalization)

Step 3: Frontend Setup (React + Vite)

cd frontend
npm install
npm run dev
  • Default local URL: http://localhost:5173
  • Note: Vite is configured with envDir: "../backend-node" in frontend/vite.config.js, reading frontend environment variables directly.

Step 4: Backend Setup (Node.js)

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
  • Backend health check: http://localhost:9000/health

Step 5: AI Processing Service Setup (Python)

From 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
  • AI Service health check: http://localhost:8001/health

Step 6: Supabase & Database Configuration

  1. Create a project on Supabase Dashboard.
  2. Apply the database schema via Supabase SQL Editor for the 13 required tables.
  3. Create the following Supabase Storage buckets:
    • voice-samples
    • avatars
    • meeting-audios
  4. Copy the Supabase URL and Service Role Key into backend-node/.env.

βš™οΈ 7. Environment Configuration

Root .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

🐳 8. Running Full Stack with Docker Compose

Launch all containerized services with a single command:

docker compose up -d --build

Service Endpoints:

ServiceContainer NamePortDescription
Frontendfrontend80 (Internal)React UI served via Nginx
Backend APIbackend9000Node.js REST API & Auth orchestration
WorkerworkerBackgroundBullMQ Queue consumer
AI Engineai-service8001FastAPI audio processing & STT
Redisredis6379In-memory message broker
Gatewayreverse-proxy80 / 443Nginx reverse proxy & SSL manager

To stop all services:

docker compose down

πŸ”§ 9. Troubleshooting

  • Redis connection refused: Ensure the Redis container is healthy or local redis-server is running, and verify that REDIS_URL matches the network.
  • Backend startup failure (Supabase error): Verify that SUPABASE_URL and SUPABASE_SERVICE_ROLE_KEY are correct and that the key role is service_role.
  • AI Service HF_TOKEN error: Pyannote diarization requires an accepted Hugging Face model agreement and a valid user access token.
  • Audio decoding errors: Verify that FFmpeg is correctly installed on the operating system and accessible via terminal.

πŸ”’ 10. Security & Data Protection

  • Never commit .env files or secret keys into version control.
  • SUPABASE_SERVICE_ROLE_KEY must never be exposed in client-side code or public repositories.
  • All storage files are accessed via temporary signed URLs with strict expiry policies.

πŸ‘₯ 11. Contributors & Project Information

  • Institution: Faculty of Information Technology, Van Lang University, Ho Chi Minh City, Vietnam
  • Project Mentor & Product Owner: Huu Nghia Huynh (Institute for Experiential Technology)
  • Development Team (Group 22):
    • Ngoc Minh Vu – Core Architecture, Backend & AI Pipeline (GitHub | LinkedIn | Email)
    • Minh Duc Nhan – System Design, Documentation & Frontend Integration
    • Vu Huy Nguyen – Requirements Analysis, Testing & Infrastructure
docker-compose
fastapi
meeting-intelligence
nodejs
pgvector
phowhisper
pyannote-audio
pytorch
reactjs
redis-queue
semantic-search
speaker-diarization
speech-to-text
supabase

sh1kaku59/Flow

[Graduation Project] Flow: Enterprise Meeting Content Digitization & Intelligence Platform featuring Modular Monolith, Async AI Worker, Vector Semantic Search (pgvector), and Docker stack.

TypeScript

2

2 commits

updated Aug 29, 2026

See the code

README

Flow: Meeting Content Digitization & Intelligence Platform

Project Scientific Base Frontend Backend AI Core Database Message Queue Containerization


πŸ“Œ 1. Project Overview

Flow 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.


πŸ—οΈ 2. System Architecture

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      β”‚
                      β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

✨ 3. Core Features

  • Voice Profiling & Speaker Enrollment: Enrolls user voice samples to construct reference acoustic embeddings, eliminating manual speaker labeling during meeting post-processing.
  • Automated Neural Processing Pipeline:
    • Speaker Diarization: Pyannote.audio sequence labeling for Voice Activity Detection (VAD) and Speaker Change Detection (SCD).
    • Vietnamese Speech-to-Text (ASR): High-precision transcription powered by fine-tuned PhoWhisper-large.
    • Meeting Intelligence: Automated topic extraction, executive summarization, and speaker participation intensity metrics.
  • Vector Semantic Search: Natural language conceptual queries (e.g., "budget decisions") powered by PostgreSQL pgvector HNSW indexes.
  • Contextual Playback (Click-to-Play): Interactive bidirectional synchronization between transcript segments and audio timestamps.
  • Enterprise Security: "No-Download" view-only streaming, Supabase Row Level Security (RLS), and short-lived Signed URLs.

πŸ—„οΈ 4. Database Schema & Core Entities

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

πŸ“‚ 5. Project Structure

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

πŸš€ 6. Installation & Setup Guide

Step 1: Clone the Repository

git clone [https://github.com/sh1kaku59/Flow.git](https://github.com/sh1kaku59/Flow.git)
cd Flow

Step 2: System Requirements & Prerequisites

Ensure the following base tools are installed:

  • Node.js: 20.x LTS (Docker images use node:20-alpine)
  • npm: 10+
  • Python: 3.11.x (AI Docker image uses python:3.11-slim)
  • Docker Desktop & Docker Compose: v2+
  • Redis: 7.x (if running locally without Docker)
  • FFmpeg: Installed and added to system PATH (required for local audio normalization)

Step 3: Frontend Setup (React + Vite)

cd frontend
npm install
npm run dev
  • Default local URL: http://localhost:5173
  • Note: Vite is configured with envDir: "../backend-node" in frontend/vite.config.js, reading frontend environment variables directly.

Step 4: Backend Setup (Node.js)

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
  • Backend health check: http://localhost:9000/health

Step 5: AI Processing Service Setup (Python)

From 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
  • AI Service health check: http://localhost:8001/health

Step 6: Supabase & Database Configuration

  1. Create a project on Supabase Dashboard.
  2. Apply the database schema via Supabase SQL Editor for the 13 required tables.
  3. Create the following Supabase Storage buckets:
    • voice-samples
    • avatars
    • meeting-audios
  4. Copy the Supabase URL and Service Role Key into backend-node/.env.

βš™οΈ 7. Environment Configuration

Root .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

🐳 8. Running Full Stack with Docker Compose

Launch all containerized services with a single command:

docker compose up -d --build

Service Endpoints:

ServiceContainer NamePortDescription
Frontendfrontend80 (Internal)React UI served via Nginx
Backend APIbackend9000Node.js REST API & Auth orchestration
WorkerworkerBackgroundBullMQ Queue consumer
AI Engineai-service8001FastAPI audio processing & STT
Redisredis6379In-memory message broker
Gatewayreverse-proxy80 / 443Nginx reverse proxy & SSL manager

To stop all services:

docker compose down

πŸ”§ 9. Troubleshooting

  • Redis connection refused: Ensure the Redis container is healthy or local redis-server is running, and verify that REDIS_URL matches the network.
  • Backend startup failure (Supabase error): Verify that SUPABASE_URL and SUPABASE_SERVICE_ROLE_KEY are correct and that the key role is service_role.
  • AI Service HF_TOKEN error: Pyannote diarization requires an accepted Hugging Face model agreement and a valid user access token.
  • Audio decoding errors: Verify that FFmpeg is correctly installed on the operating system and accessible via terminal.

πŸ”’ 10. Security & Data Protection

  • Never commit .env files or secret keys into version control.
  • SUPABASE_SERVICE_ROLE_KEY must never be exposed in client-side code or public repositories.
  • All storage files are accessed via temporary signed URLs with strict expiry policies.

πŸ‘₯ 11. Contributors & Project Information

  • Institution: Faculty of Information Technology, Van Lang University, Ho Chi Minh City, Vietnam
  • Project Mentor & Product Owner: Huu Nghia Huynh (Institute for Experiential Technology)
  • Development Team (Group 22):
    • Ngoc Minh Vu – Core Architecture, Backend & AI Pipeline (GitHub | LinkedIn | Email)
    • Minh Duc Nhan – System Design, Documentation & Frontend Integration
    • Vu Huy Nguyen – Requirements Analysis, Testing & Infrastructure
docker-compose
fastapi
meeting-intelligence
nodejs
pgvector
phowhisper
pyannote-audio
pytorch
reactjs
redis-queue
semantic-search
speaker-diarization
speech-to-text
supabase