# dark2c/viral-faceless-shorts-generator architecture

> Architecture diagram of the GitHub repository dark2c/viral-faceless-shorts-generator, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-11-09). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/dark2c/viral-faceless-shorts-generator
- Repository: https://github.com/dark2c/viral-faceless-shorts-generator

## Overview

Viral Faceless Shorts Generator is a web app for creating faceless YouTube Shorts from trending or custom topics. Users choose a topic or prompt, review and approve the generated script, then render a video with synthesized speech, aligned subtitles, and a background clip. Its runtime also supports settings, video management, and YouTube imports. The README documents the end-to-end media pipeline; source excerpts show API wiring and several route-to-service calls, but not the frontend or all service internals.

Main entry points: [`trendscraper/src/index.js`](https://github.com/dark2c/viral-faceless-shorts-generator/blob/main/trendscraper/src/index.js) (Express API), [`trendscraper/src/modules/video_render_module.js`](https://github.com/dark2c/viral-faceless-shorts-generator/blob/main/trendscraper/src/modules/video_render_module.js) (Video composition), [`trendscraper/src/modules/youtube_import_module.js`](https://github.com/dark2c/viral-faceless-shorts-generator/blob/main/trendscraper/src/modules/youtube_import_module.js) (YouTube importer), [`nginx/html`](https://github.com/dark2c/viral-faceless-shorts-generator/tree/main/nginx/html) (Shorts interface)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_web["Web interface"]
  node_frontend["Shorts interface"]
end

subgraph group_api["API and orchestration"]
  node_api_server["Express API<br/>[index.js]"]
  node_generate_routes["Script routes"]
  node_trends_routes["Trends routes"]
  node_render_routes["Render routes"]
  node_tts_routes["Speech routes"]
  node_settings_routes["Settings routes"]
  node_video_routes["Video routes"]
  node_jobs_routes["Job routes"]
  node_youtube_routes["YouTube routes"]
end

subgraph group_content["Content generation"]
  node_llm["Script generation<br/>[LLM_module.js]"]
  node_trends_scraper["Trend detection"]
end

subgraph group_media["Media production"]
  node_tts_service["Speech synthesis client<br/>[TTS_module.js]"]
  node_video_render["Video composition"]
  node_process_utils["Process utilities"]
end

subgraph group_management["Media and settings management"]
  node_settings_service[("Settings persistence<br/>[settings_module.js]")]
  node_video_files["Video file service"]
  node_youtube_import["YouTube importer"]
end

node_user(("Creator"))
node_gemini{{"Gemini model"}}
node_openrouter{{"OpenRouter model"}}
node_piper["Piper TTS<br/>[app.py]"]
node_speechalign["Subtitle alignment<br/>[app.py]"]
node_ffmpeg{{"FFmpeg"}}
node_google_trends{{"Google Trends"}}
node_youtube{{"YouTube"}}
node_background_clips[("Background clips")]
node_generated_videos[("Generated videos")]

node_user -->|"chooses topic"| node_frontend
node_frontend -.->|"requests API"| node_api_server
node_api_server -->|"registers routes"| node_generate_routes
node_api_server -->|"registers routes"| node_trends_routes
node_api_server -->|"registers routes"| node_render_routes
node_api_server -->|"registers routes"| node_tts_routes
node_api_server -->|"registers routes"| node_settings_routes
node_api_server -->|"registers routes"| node_video_routes
node_api_server -->|"registers routes"| node_jobs_routes
node_api_server -->|"registers routes"| node_youtube_routes
node_generate_routes -->|"generates script"| node_llm
node_llm -->|"requests generation"| node_gemini
node_llm -.->|"fallback generation"| node_openrouter
node_trends_routes -->|"scrapes trends"| node_trends_scraper
node_trends_scraper -->|"fetches trends"| node_google_trends
node_user -->|"approves script"| node_frontend
node_user -->|"starts rendering"| node_frontend
node_render_routes -->|"renders request"| node_video_render
node_video_render -->|"requests speech"| node_piper
node_video_render -->|"aligns subtitles"| node_speechalign
node_video_render -->|"composes video"| node_ffmpeg
node_video_render -->|"reads clip"| node_background_clips
node_video_render -->|"writes result"| node_generated_videos
node_tts_routes -->|"delegates speech"| node_tts_service
node_tts_service -->|"proxies requests"| node_piper
node_settings_routes -->|"saves settings"| node_settings_service
node_video_routes -->|"resolves file paths"| node_video_files
node_youtube_routes -->|"starts import"| node_youtube_import
node_youtube_import -->|"downloads source"| node_youtube
node_youtube_import -->|"saves clips"| node_background_clips
node_youtube_import -->|"uses cleanup"| node_process_utils
node_video_render -->|"uses process helpers"| node_process_utils

click node_frontend "https://github.com/dark2c/viral-faceless-shorts-generator/tree/main/nginx/html"
click node_api_server "https://github.com/dark2c/viral-faceless-shorts-generator/blob/main/trendscraper/src/index.js"
click node_generate_routes "https://github.com/dark2c/viral-faceless-shorts-generator/blob/main/trendscraper/src/modules/generate_routes_module.js"
click node_trends_routes "https://github.com/dark2c/viral-faceless-shorts-generator/blob/main/trendscraper/src/modules/google_trends_routes_module.js"
click node_render_routes "https://github.com/dark2c/viral-faceless-shorts-generator/blob/main/trendscraper/src/modules/render_routes_module.js"
click node_tts_routes "https://github.com/dark2c/viral-faceless-shorts-generator/blob/main/trendscraper/src/modules/tts_routes_module.js"
click node_settings_routes "https://github.com/dark2c/viral-faceless-shorts-generator/blob/main/trendscraper/src/modules/settings_routes_module.js"
click node_video_routes "https://github.com/dark2c/viral-faceless-shorts-generator/blob/main/trendscraper/src/modules/video_routes_module.js"
click node_jobs_routes "https://github.com/dark2c/viral-faceless-shorts-generator/blob/main/trendscraper/src/modules/jobs_routes_module.js"
click node_youtube_routes "https://github.com/dark2c/viral-faceless-shorts-generator/blob/main/trendscraper/src/modules/youtube_routes_module.js"
click node_llm "https://github.com/dark2c/viral-faceless-shorts-generator/blob/main/trendscraper/src/modules/LLM_module.js"
click node_trends_scraper "https://github.com/dark2c/viral-faceless-shorts-generator/blob/main/trendscraper/src/modules/google_trends_scraper_module.js"
click node_tts_service "https://github.com/dark2c/viral-faceless-shorts-generator/blob/main/trendscraper/src/modules/TTS_module.js"
click node_piper "https://github.com/dark2c/viral-faceless-shorts-generator/blob/main/piper/app.py"
click node_speechalign "https://github.com/dark2c/viral-faceless-shorts-generator/blob/main/speechalign/app.py"
click node_video_render "https://github.com/dark2c/viral-faceless-shorts-generator/blob/main/trendscraper/src/modules/video_render_module.js"
click node_settings_service "https://github.com/dark2c/viral-faceless-shorts-generator/blob/main/trendscraper/src/modules/settings_module.js"
click node_video_files "https://github.com/dark2c/viral-faceless-shorts-generator/blob/main/trendscraper/src/modules/video_files_module.js"
click node_youtube_import "https://github.com/dark2c/viral-faceless-shorts-generator/blob/main/trendscraper/src/modules/youtube_import_module.js"
click node_process_utils "https://github.com/dark2c/viral-faceless-shorts-generator/blob/main/trendscraper/src/modules/process_utils_module.js"
click node_background_clips "https://github.com/dark2c/viral-faceless-shorts-generator/tree/main/videos"
click node_generated_videos "https://github.com/dark2c/viral-faceless-shorts-generator/tree/main/videos"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_frontend toneBlue
class node_api_server,node_generate_routes,node_trends_routes,node_render_routes,node_tts_routes,node_settings_routes,node_video_routes,node_jobs_routes,node_youtube_routes,node_background_clips,node_generated_videos toneAmber
class node_llm,node_trends_scraper,node_openrouter toneMint
class node_tts_service,node_video_render,node_process_utils toneRose
class node_settings_service,node_video_files,node_youtube_import,node_user,node_gemini,node_ffmpeg,node_google_trends,node_youtube toneIndigo
class node_piper,node_speechalign toneTeal
```

## Components

### Web interface

- [Shorts interface](https://github.com/dark2c/viral-faceless-shorts-generator/tree/main/nginx/html): `nginx/html`

### API and orchestration

- [Express API](https://github.com/dark2c/viral-faceless-shorts-generator/blob/main/trendscraper/src/index.js): `trendscraper/src/index.js`
- [Script routes](https://github.com/dark2c/viral-faceless-shorts-generator/blob/main/trendscraper/src/modules/generate_routes_module.js): `trendscraper/src/modules/generate_routes_module.js`
- [Trends routes](https://github.com/dark2c/viral-faceless-shorts-generator/blob/main/trendscraper/src/modules/google_trends_routes_module.js): `trendscraper/src/modules/google_trends_routes_module.js`
- [Render routes](https://github.com/dark2c/viral-faceless-shorts-generator/blob/main/trendscraper/src/modules/render_routes_module.js): `trendscraper/src/modules/render_routes_module.js`
- [Speech routes](https://github.com/dark2c/viral-faceless-shorts-generator/blob/main/trendscraper/src/modules/tts_routes_module.js): `trendscraper/src/modules/tts_routes_module.js`
- [Settings routes](https://github.com/dark2c/viral-faceless-shorts-generator/blob/main/trendscraper/src/modules/settings_routes_module.js): `trendscraper/src/modules/settings_routes_module.js`
- [Video routes](https://github.com/dark2c/viral-faceless-shorts-generator/blob/main/trendscraper/src/modules/video_routes_module.js): `trendscraper/src/modules/video_routes_module.js`
- [Job routes](https://github.com/dark2c/viral-faceless-shorts-generator/blob/main/trendscraper/src/modules/jobs_routes_module.js): `trendscraper/src/modules/jobs_routes_module.js`
- [YouTube routes](https://github.com/dark2c/viral-faceless-shorts-generator/blob/main/trendscraper/src/modules/youtube_routes_module.js): `trendscraper/src/modules/youtube_routes_module.js`

### Content generation

- [Script generation](https://github.com/dark2c/viral-faceless-shorts-generator/blob/main/trendscraper/src/modules/LLM_module.js): `trendscraper/src/modules/LLM_module.js`
- [Trend detection](https://github.com/dark2c/viral-faceless-shorts-generator/blob/main/trendscraper/src/modules/google_trends_scraper_module.js): `trendscraper/src/modules/google_trends_scraper_module.js`

### Media production

- [Speech synthesis client](https://github.com/dark2c/viral-faceless-shorts-generator/blob/main/trendscraper/src/modules/TTS_module.js): `trendscraper/src/modules/TTS_module.js`
- [Video composition](https://github.com/dark2c/viral-faceless-shorts-generator/blob/main/trendscraper/src/modules/video_render_module.js): `trendscraper/src/modules/video_render_module.js`
- [Process utilities](https://github.com/dark2c/viral-faceless-shorts-generator/blob/main/trendscraper/src/modules/process_utils_module.js): `trendscraper/src/modules/process_utils_module.js`

### Media and settings management

- [Settings persistence](https://github.com/dark2c/viral-faceless-shorts-generator/blob/main/trendscraper/src/modules/settings_module.js): `trendscraper/src/modules/settings_module.js`
- [Video file service](https://github.com/dark2c/viral-faceless-shorts-generator/blob/main/trendscraper/src/modules/video_files_module.js): `trendscraper/src/modules/video_files_module.js`
- [YouTube importer](https://github.com/dark2c/viral-faceless-shorts-generator/blob/main/trendscraper/src/modules/youtube_import_module.js): `trendscraper/src/modules/youtube_import_module.js`

### Other components

- **Creator**
- **Gemini model**
- **OpenRouter model**
- [Piper TTS](https://github.com/dark2c/viral-faceless-shorts-generator/blob/main/piper/app.py): `piper/app.py`
- [Subtitle alignment](https://github.com/dark2c/viral-faceless-shorts-generator/blob/main/speechalign/app.py): `speechalign/app.py`
- **FFmpeg**
- **Google Trends**
- **YouTube**
- [Background clips](https://github.com/dark2c/viral-faceless-shorts-generator/tree/main/videos): `videos`
- [Generated videos](https://github.com/dark2c/viral-faceless-shorts-generator/tree/main/videos): `videos`

## Connections

- Creator → Shorts interface: chooses topic (evidence: `README.MD`)
- Shorts interface → Express API: requests API
- Express API → Script routes: registers routes (evidence: `trendscraper/src/index.js`)
- Express API → Trends routes: registers routes (evidence: `trendscraper/src/index.js`)
- Express API → Render routes: registers routes (evidence: `trendscraper/src/index.js`)
- Express API → Speech routes: registers routes (evidence: `trendscraper/src/index.js`)
- Express API → Settings routes: registers routes (evidence: `trendscraper/src/index.js`)
- Express API → Video routes: registers routes (evidence: `trendscraper/src/index.js`)
- Express API → Job routes: registers routes (evidence: `trendscraper/src/index.js`)
- Express API → YouTube routes: registers routes (evidence: `trendscraper/src/index.js`)
- Script routes → Script generation: generates script (evidence: `trendscraper/src/index.js`)
- Script generation → Gemini model: requests generation (evidence: `trendscraper/src/modules/LLM_module.js`)
- Script generation → OpenRouter model: fallback generation (evidence: `trendscraper/src/modules/LLM_module.js`)
- Trends routes → Trend detection: scrapes trends (evidence: `trendscraper/src/index.js`)
- Trend detection → Google Trends: fetches trends (evidence: `README.MD`)
- Creator → Shorts interface: approves script (evidence: `README.MD`)
- Creator → Shorts interface: starts rendering (evidence: `README.MD`)
- Render routes → Video composition: renders request (evidence: `trendscraper/src/index.js`)
- Video composition → Piper TTS: requests speech (evidence: `README.MD`)
- Video composition → Subtitle alignment: aligns subtitles (evidence: `README.MD`)
- Video composition → FFmpeg: composes video (evidence: `README.MD`)
- Video composition → Background clips: reads clip (evidence: `README.MD`)
- Video composition → Generated videos: writes result (evidence: `README.MD`)
- Speech routes → Speech synthesis client: delegates speech (evidence: `trendscraper/src/modules/tts_routes_module.js`)
- Speech synthesis client → Piper TTS: proxies requests (evidence: `README.MD`)
- Settings routes → Settings persistence: saves settings (evidence: `trendscraper/src/modules/settings_routes_module.js`)
- Video routes → Video file service: resolves file paths (evidence: `trendscraper/src/modules/video_routes_module.js`)
- YouTube routes → YouTube importer: starts import (evidence: `trendscraper/src/modules/youtube_routes_module.js`)
- YouTube importer → YouTube: downloads source (evidence: `trendscraper/src/modules/youtube_import_module.js`)
- YouTube importer → Background clips: saves clips (evidence: `trendscraper/src/modules/youtube_import_module.js`)
- YouTube importer → Process utilities: uses cleanup (evidence: `trendscraper/src/modules/youtube_import_module.js`)
- Video composition → Process utilities: uses process helpers (evidence: `trendscraper/src/index.js`)
