Description
n8n + Qdrant + AI Automation Stack π


> Production-ready AI automation stack β n8n workflows, Qdrant vector search,
> self-hosted file upload, programmatic video rendering with Remotion, and
> text-to-speech. All services in one docker compose up.
π Overview
A lightweight, self-hosted stack combining:
- n8n β workflow automation engine (400+ integrations)
- Qdrant β vector database for semantic search, RAG, and AI memory
- File Upload API β self-hosted file storage for images, audio, video, documents
- Remotion Video Render β React-powered programmatic video engine with Ken Burns effects, text overlays, TikTok-style captions, crossfade transitions, multi-track audio, and an n8n community node with 3 input modes (Manual / Input JSON / Auto Collect)
- Kokoro TTS β text-to-speech with 35+ voices (OpenAI-compatible API)
ποΈ Architecture
ββββββββββββββββ ββββββββββββββββ βββββββββββββββ
β PostgreSQL βββββββ n8n ββββββΊβ Qdrant β
β (metadata) β β (automation) β β (vectors) β
ββββββββββββββββ ββββββββ¬ββββββββ βββββββββββββββ
:5432 β :6333
β
βββββββββββββββΌββββββββββββββββββββββββ
β β β
βββββββββββ΄βββββ ββββββ΄βββββββββββ ββββββββββ΄ββββββββ
β File Upload β β Remotion β β Kokoro TTS β
β (REST, 8010) β β (REST, 3000) β β (REST, 8880) β
β file store β β React/SSR β β TTS / Speech β
ββββββββββββββββ β Video Gen β β 35+ voices β
βββββββββββββββββ ββββββββββββββββββ
π Quick Start
1. Clone
git clone https://github.com/mimnets/n8n-qdrant-starter.git
cd n8n-qdrant-starter2. Create .env from the example
cp .env.example .env3. Edit .env β add your API keys
nano .env4. Start everything (builds Remotion + file-upload from local source)
docker compose up -d5. Check all services are healthy
docker compose ps
| Access | URL |
|——–|—–|
| n8n | http://localhost:5678 |
| Qdrant Dashboard | http://localhost:6333/dashboard |
| File Upload API | http://localhost:8010 |
| File Upload Admin | http://localhost:8010/admin |
| Remotion API | http://localhost:3000 |
| Remotion API Builder | http://localhost:3000/tools/api-builder |
| Remotion Health | http://localhost:3000/health |
| Kokoro TTS | http://localhost:8880 |
| Kokoro TTS Swagger | http://localhost:8880/docs |
| Kokoro TTS Web UI | http://localhost:8880/web |
ποΈ Services
| Service | Image | Port (host) | Health |
|———|——-|————-|——–|
| postgres | postgres:16-alpine | 5432 (internal) | β
healthcheck |
| n8n | n8nio/n8n:latest | 5678 | β
healthcheck |
| qdrant | qdrant/qdrant:latest | 6333 | β
|
| file-upload | local build β file-upload-server/Dockerfile | 8010 | β
healthcheck |
| remotion | local build β remotion/Dockerfile | 3000 | β
healthcheck |
| kokoro-tts | ghcr.io/remsky/kokoro-fastapi-cpu:latest | 8880 | β
healthcheck |
Note: Remotion and file-upload are built from source locally. The first docker compose up -d will build these automatically.
—
π₯ Remotion β Programmatic Video Rendering

Remotion is a React-powered programmatic video engine. You describe your video as React components β Remotion renders each frame to a real MP4 video.
What You Can Do
| Feature | Description |
|———|————-|
| πΌοΈ Multiple images with Ken Burns effects | zoomIn (default), zoomOut, slideLeft, slideRight, slideUp, slideDown |
| π Text overlays | Position at bottom (captions), center, or top. Custom font, color, weight |
| β¨ Animated text entrances | Fade In, Slide Up, Scale In, Typewriter β per text clip |
| π‘ TikTok-style captions (default) | Word-by-word gold highlighting with configurable word timing (400ms classic / 1200ms sentence) |
| π΅ Multi-track audio | Scene-specific audio clips + background soundtrack β full-length playback (no truncation) |
| πΌοΈ Image fit modes | cover (crop to fill), contain (fit inside), fill (stretch) β per scene |
| π Crossfade transitions | Automatic dissolve between overlapping image clips |
| π¬ Resolutions | preview, mobile, SD, HD, 1080p, Vertical/Reels, 4K |
| π Aspect ratios | 16:9 (horizontal), 9:16 (vertical/reels) |
| ποΈ HTML scenes | Rich HTML with full CSS for text-heavy layouts |
API Endpoints
| Method | Path | Description |
|——–|——|————-|
| GET | /health | Health check |
| POST | /edit/v1/render | Submit a render job (returns render ID) |
| GET | /edit/v1/render/{id} | Get render status β "done" when video ready |
| GET | /serve/v1/assets/{id}/output.mp4 | Download rendered MP4 |
| GET | /tools/api-builder | Visual JSON builder UI |
—
π n8n Community Node β n8n-nodes-remotion-render


This project includes a custom n8n community node that wraps the entire Remotion API into a single drag-and-drop node. No need to manually construct JSON payloads or poll for completion. Five input modes: Manual (drag-and-drop), From Input JSON (structured data), β Sequence Combiner (each upstream item = one scene, ideal for loops), β‘ Batch Render (render each scene independently, concat with ffmpeg), and Auto Collect (auto-detect images/audios/texts from any upstream node).
Install
In n8n: Settings β Community Nodes β Install β enter n8n-nodes-remotion-render
Or if running n8n in Docker with this stack, the custom n8n Dockerfile at n8n/Dockerfile extends the official image with ffmpeg pre-installed (required for Batch Render mode). The n8n node is mounted automatically:
n8n:
build: ./n8n # Dockerfile with ffmpeg
environment:
- N8NCUSTOMEXTENSIONS=/home/node/custom-nodes
volumes:
- ./n8n-nodes-remotion-render:/home/node/custom-nodes/n8n-nodes-remotion-render
Rebuild n8n to pick up ffmpeg:
docker compose up -d --build n8n
Setup Credential
1. n8n β Credentials β Add New β Remotion Render API – mimnets
2. Server URL: http://remotion:3000
3. Leave API Key blank
4. Save
Usage β Manual Mode
After adding the node to your workflow:
1. Add Images β set URL, start time, length, Ken Burns effect, fade in/out
2. Add Text Overlays β enter text, set Vertical Position β Bottom for captions
3. Choose Animation β Fade In / Slide Up / Scale / Typewriter for text entrance
4. Set Caption Style β TikTok Style for word-by-word highlighting
5. Add Audio Clips or fill in Soundtrack for background music
6. Set Resolution β 1080 or Vertical for TikTok/Reels
Usage β Input JSON Mode (Dynamic Data)
Connect any upstream node that outputs this structure:
{
"images": [
{ "src": "https://...", "start": 0, "length": 8, "effect": "zoomIn" }
],
"texts": [
{ "text": "Hello!", "start": 0, "length": 8, "vertical": "bottom", "captionStyle": "tiktok" }
],
"soundtrack": { "src": "https://...", "volume": 0.15 },
"resolution": "1080",
"fps": 25
}
Usage β Auto Collect Mode (β NEW β Zero Config)
The node now has an Auto Collect mode that detects images, audios, and text overlays automatically from any upstream node. No Code node or manual mapping needed.
How it works:
1. Select Input Method β Auto Collect
2. Connect any node that outputs files (image generator, file uploader, AI node, etc.)
3. The node scans every item and auto-detects:
– File extensions β .png/.jpg/.webp β image, .mp3/.wav β audio
– Key names β url, src, image, photo, caption, text, soundtrack
– Explicit type field β set type: "image", type: "audio", type: "text"
– content_type/mime β image/png, audio/mpeg
4. Auto-timelines everything: images get sequential duration, audio aligns by index
Example β 5 images β reel (no Code node):
[Image Generator / Upload API] β outputs { url: "img.png" } Γ 5
β
[Remotion Render - Auto Collect]
β Detects 5 images
β Auto-timelines: each 4s = 20s video
β Renders MP4
Adjust defaults under Auto Collect Defaults: image duration, effect, text position, audio alignment, resolution, FPS.
Output
{
"renderId": "abc123",
"status": "done",
"videoUrl": "http://remotion:3000/serve/v1/assets/abc123/output.mp4"
}
—
π¬ n8n Workflow Examples
Example 1: Simple Image + Caption Video
[Manual Trigger] β [Remotion Render Node] β [HTTP Request to download video]
Configure node:
Example 2: Multi-image TikTok-style Video
[Code Node] β [Remotion Render Node] β [HTTP Request Download]
Code node outputs:
const images = [
{ src: "https://...img1.jpg", start: 0, length: 5, effect: "zoomIn" },
{ src: "https://...img2.jpg", start: 4, length: 5, effect: "slideLeft" },
{ src: "https://...img3.jpg", start: 8, length: 5, effect: "zoomOut" },
];
const texts = [{
text: "Amazing nature moments",
start: 0, length: 13,
vertical: "bottom", captionStyle: "tiktok", combineMs: 400
}];
return { images, texts, resolution: "vertical", fps: 25 };
Example 3: Zero-Config Auto Collect (β New)
[Image Generator / Unsplash / File Upload]
β 5-10 images, each { url: "img.png" }
β
[Remotion Render - Auto Collect]
β Detects images automatically
β Auto-timelines: each image 4s
β Renders video
β Returns download URL
No Code node. No manual config. Works whether upstream sends 3 or 20 images.
Example 4: AI Pipeline β Script β TTS β Video
[Code Node with script] β [Kokoro TTS] β [Upload Audio]
β [Generate Image via AI] β [Upload Image]
β [Remotion Render] β [Download Video] β [Publish]
—
π£οΈ Kokoro TTS β Text-to-Speech

Dockerized FastAPI wrapper for Kokoro-82M. OpenAI-compatible API with 35+ voices.
From n8n
POST http://kokoro-tts:8880/v1/audio/speech
{
"model": "kokoro",
"input": "Your text to speak",
"voice": "af_bella",
"response_format": "mp3"
}
Voices: afbella, afsky, afalloy, afjessica, amadam, ammichael, amecho, bfemma, bm_george + Japanese, Chinese, Korean, French, Spanish, Italian, Portuguese, Hindi + voice blends.
Voice blending: "voice": "afbella(2)+afsky(1)" β 67% Bella, 33% Sky
—
π§ Troubleshooting
| Issue | Solution |
|——-|———-|
| Remotion build fails | First build takes 2-5 min (npm install + Chromium). Check logs: docker compose logs remotion |
| n8n can’t reach services | Use Docker service names: http://remotion:3000, http://kokoro-tts:8880 |
| Node shows “no credentials” | Create credential: Server URL = http://remotion:3000 |
| Text stays in center | Set Vertical Position β Bottom + rebuild remotion: docker compose up -d --build remotion |
| Broken icon in n8n | Update node to v0.3.0+: npm i n8n-nodes-remotion-render@latest |
| Auto Collect detects nothing | Check file extensions (.png, .jpg, .mp3), or add "type": "image" to upstream items |
| TikTok captions not highlighting | Set Caption Style β TikTok Style + Word Timing β 400ms |
| Port already in use | Change host ports in docker-compose.yml |
π Security Notes
.env before production useN8NENCRYPTIONKEY and N8NUSERMANAGEMENTJWTSECRET.env (it’s gitignored)UPLOADAPIKEY if file-upload port is exposed publiclyπΎ Backups
Docker volumes backed up daily at 2:00 AM UTC:
0 2 * /home/ubuntu/backup-volumes.sh >> logs/backup.log 2>&1
Backed up: n8nstorage, postgresstorage, qdrantstorage, fileuploads, remotion_output
Restore
ls /home/ubuntu/backups/*.tar.gz
/home/ubuntu/restore-volume.sh volume-name backup.tar.gz
βοΈ Deployment
git clone https://github.com/mimnets/n8n-qdrant-starter.git
cd n8n-qdrant-starter
cp .env.example .env
nano .env
docker compose up -d
Update
git pull
docker compose pull
docker compose up -d --build
Firewall (OCI / AWS / GCP)
| Port | Service |
|——|———|
| 5678 | n8n web UI |
| 8010 | File Upload API + admin |
| 6333 | Qdrant (internal only recommended) |
| 3000 | Remotion video rendering API + builder UI |
| 8880 | Kokoro TTS API |
π Project Structure
n8n-qdrant-starter/
βββ .env.example # Environment template
βββ docker-compose.yml # All services in one stack
βββ README.md
βββ LICENSE
βββ scripts/
β βββ n8n-entrypoint.sh
βββ n8n/ # Custom n8n Dockerfile (adds ffmpeg)
β βββ Dockerfile
βββ remotion/ # Remotion video render engine
β βββ Dockerfile
β βββ src/
β β βββ server.ts # Express API + render route
β β βββ Root.tsx # Remotion entry point
β β βββ compositions/
β β βββ VideoComposition.tsx # All rendering logic
β βββ package.json
βββ n8n-nodes-remotion-render/ # n8n community node
β βββ nodes/RemotionRender/ # Node source + UI fields
β βββ credentials/ # Credential type
βββ file-upload-server/ # File Upload API
βββ tools/
β βββ remotion-render-workflow.json # Sample n8n workflow
β βββ REMOTION-ROADMAP.md # Feature roadmap
βββ ...