Full-stack web application wrapping document pipelines and prompt-driven visualization jobs.
Stack: FastAPI + PostgreSQL + Celery/Redis + React/Tailwind
flowchart LR
Browser[React SPA<br/>port 5173] <-->|HTTP and SSE| API[FastAPI<br/>port 8000]
API <--> DB[(PostgreSQL<br/>port 5432)]
API -->|dispatch| Worker[Celery worker]
Worker <--> Redis[(Redis<br/>port 6379)]
Worker --> Pipelines[screencastgen pipelines]
Pipelines -->|progress events| Redis
web/backend/
├── main.py FastAPI App
├── config.py Web Config
├── database.py Web Database
├── models.py DB Models
├── schemas.py Schemas
├── logging_config.py Web Logging
├── routers/
│ ├── uploads.py Uploads Router
│ ├── jobs.py Jobs Router
│ ├── events.py Events Router
│ ├── reader.py Reader Router
│ └── voices.py Voices Router
├── services/
│ ├── storage.py Storage Service (delegation + singleton)
│ ├── storage_backend.py Storage Service (ABC + Local/GCS/S3 backends)
│ ├── transcribe_client.py Transcribe Client
│ └── voices.py Voices Service
└── tasks/
├── celery_app.py Celery App
├── pipelines.py Pipeline Tasks
└── progress.py Progress Reporter
See Frontend Overview for details.
web/frontend/src/
├── App.tsx (routing)
├── types/index.ts (TypeScript types)
├── api/ (API client layer)
├── hooks/ (React hooks)
├── components/ (reusable UI)
└── pages/ (route pages)
ProgressEvent via SSE; lip-sync events include structured per-page timing dataPOST /api/jobs/{id}/stop through Jobs RouterFileResponse from outputs/{job_id}/RedirectResponse to a signed URLexport-epub for a text-and-narration accessibility exportcd web && docker compose up --build
# Frontend: http://localhost:5173
# API: http://localhost:8000
cd web && cp .env.example .env
make install && make migrate
# Terminal 1: make backend
# Terminal 2: make worker
# Terminal 3: make frontend