Enterprise Open-Source AI Video, Movie & Direct-Response Ad Engine. Turn any story concept, viral premise, or product URL into finished multi-scene video productions.
Darc Studio is a local-first alternative to Runway, Sora, Arcads, Creatify, and Higgsfield. It generates cinematic quick movies, viral social scenes & micro-dramas, POV suspense shorts, and high-converting direct-response video ads powered by the full roster of state-of-the-art video models including ByteDance Seedance 2.5/2.0, Kling 2.0 Pro, Wan 2.2 Turbo, Minimax Hailuo-02, Luma Ray 2, and Runway Gen-3 Alpha.
Zero monthly subscriptions. Zero per-video credits. 100% local-first and privacy-preserving.
# 1. Generate a cinematic micro-drama with ByteDance Seedance 2.5
python3 main.py --mode movie --premise "A lone astronaut discovers an ancient glowing doorway on Europa" --video-model seedance-2.5 --style cyberpunk
# 2. Or generate high-converting e-commerce video ads from any product URL
python3 main.py --url https://your-store.com/products/your-product --variants 3
# 3. Launch the visual Web Studio & Interactive Portal
python3 app.py- Why this exists
- Creation Modes & Capabilities
- Supported Video Models (Seedance, Kling, Wan, Minimax, Luma)
- Install
- Quick start
- Zero-key offline mode
- The Unified Web Studio & Portal
- CLI reference
- REST API Reference
- Security & Safe Usage Guide
- Storytelling & Ad Frameworks
- UGC avatars
- Brand kit
- Configuration
- Testing
- Licence
Commercial AI video & ad platforms charge $40–500/month and cap resolution, generation time, camera control, and script lengths. Darc Studio gives you direct access to the world's best models (Seedance 2.5, Kling 2.0, Wan 2.2, ElevenLabs, Whisper, FFmpeg) with unified prompt engineering, professional camera rig motion, and word-level karaoke subtitles.
Everything runs on your machine. Your data and renders stay 100% private.
| Creation Mode | Description |
|---|---|
| 🎬 Quick Movies & Cinema | Multi-scene cinematic storytelling with plot escalation, character dialogue, Hollywood camera physics (Dolly, Drone Orbit, FPV Flythrough, Whip Pan), and film-grade visual grading. |
| 📱 Viral POV & Social Shorts | High-retention social scenes, Reddit confessions, suspense thrillers, and comedy skits with word-level glowing karaoke subtitles. |
| 🛍️ Direct-Response Video Ads | Automated storefront scraping, 7 conversion frameworks (PAS, UGC Testimonial, 3 Reasons, Unboxing), UGC avatar presenters, and branded end cards. |
| 🎨 Multi-Model Canvas | Side-by-side model comparison across ByteDance Seedance 2.5, Kling 2.0, Wan 2.2, Minimax Hailuo-02, Luma Ray 2, and Runway Gen-3. |
| Real product photography | Scrapes and normalizes the actual images from your store, so the product on screen is the product you sell |
| Direct-response scripts | Seven proven hook frameworks (PAS, UGC testimonial, listicle, before/after, us-vs-them, myth-bust, unboxing) |
| A/B variants in one run | --variants 3 writes three genuinely different angles, not three rewordings |
| Word-level captions | TikTok-style karaoke captions with the spoken word highlighted, aligned to the real audio |
| Ken Burns motion | Every still gets a camera move, varied per scene, so nothing sits static |
| Crossfade transitions | Frame-accurate: the finished runtime always equals the narration length |
| Music that behaves | Loops to length, side-chain ducks under the voiceover, normalized to −14 LUFS |
| UGC presenters | Lip-synced talking-head actors delivering your script |
| Brand kit | Logo watermark, accent colour, caption styling, CTA end card |
| Multi-platform | 9:16 vertical, 1:1 square, 16:9 landscape |
| Script auditing | Warns when a hook runs long, a CTA is missing, or copy drifts into ad-speak |
DarcAds needs Python 3.9+ and ffmpeg.
# macOS
brew install ffmpeg
# Debian / Ubuntu
sudo apt update && sudo apt install ffmpeg
# Fedora
sudo dnf install ffmpeg
# Windows
winget install Gyan.FFmpegDarcAds does not require ffmpeg to be built with libass or libfreetype — all text is rendered with Pillow, so a stock build is fine.
git clone https://github.com/luispdoesai/DarcAds.git
cd DarcAds
python3 -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
pip install -r requirements.txtpython3 main.py --doctorDarcAds environment check
ok ffmpeg + ffprobe
- Anthropic (script engine)
- OpenAI (script engine + TTS)
...
DarcAds runs fully offline with no keys - quality simply improves as you add them.
A row of - is fine. Only the ffmpeg line has to say ok.
# The simplest possible ad run
python3 main.py --url https://your-store.com/products/your-product
# A cinematic movie scene
python3 main.py --mode movie --premise "A lone wanderer in a neon rainstorm" --style cyberpunk --video-model seedance-2.5
# A 30-second ad with three A/B variants, music and a brand kit
python3 main.py \
--url https://your-store.com/products/your-product \
--variants 3 \
--seconds 30 \
--music assets/music/upbeat.mp3 \
--brand-name "Acme" \
--accent "#FF4D6D" \
--cta "Get 20% off"
# Unified Browser Studio & Interactive Sandbox
python3 app.py # opens http://localhost:8000Output lands in output/, alongside a *_run.json manifest recording exactly
what was scraped, written, generated and rendered.
With nothing configured, DarcAds still:
- scrapes your real product images, price, features and reviews
- writes a complete 5-scene script using a built-in framework director
- generates a voiceover with free TTS
- composes each product photo into the frame without cropping the product away
- animates every scene with a Ken Burns move
- burns in word-level captions, hook text and a progress bar
- crossfades, ducks music, normalizes loudness and renders a branded end card
Here is a real frame from a keyless run — no LLM, no video model, no paid voice:
┌────────────────────┐
│ 3 REASONS │ ← hook text, brand accent colour
│ │
│ [product] │ ← your real photo, whole product visible
│ │
│ replaced │ ← karaoke captions, spoken word highlighted
│ everything else. │
│ ▰▰▰▰▰▱▱▱▱▱▱▱▱▱▱▱▱ │ ← progress bar
└────────────────────┘
Adding keys improves individual stages. It is never required to get a video.
DarcAds detects what is installed and configured, and upgrades that stage
automatically. Copy .env.example to .env and fill in only what you want.
cp .env.example .env
pip install -r requirements-optional.txt # or install individual packages| Stage | Free default | Upgrade | How |
|---|---|---|---|
| Script | Built-in framework director | Claude / GPT / local Llama | ANTHROPIC_API_KEY, OPENAI_API_KEY, or run Ollama |
| Voice | gTTS | edge-tts (free, much better) | pip install edge-tts |
| Kokoro-82M (free, local) | pip install kokoro |
||
| ElevenLabs (best) | ELEVENLABS_API_KEY |
||
| Video | Product photos + Ken Burns | Seedance 2.5 / Kling 2.0 / Wan 2.2 / Luma / MiniMax | FAL_KEY |
| Your own GPU | run ComfyUI, set COMFYUI_WORKFLOW |
||
| Captions | Estimated timings | True word alignment | pip install faster-whisper |
| Avatars | — | Lip-synced UGC presenters | FAL_KEY + an actor asset |
Best value for one command:
pip install edge-tts. It replaces the robotic default voice with Microsoft neural voices, costs nothing, and needs no API key.
Local LLMs are auto-detected — if Ollama is running on its default port, DarcAds will use it with no configuration:
ollama serve
ollama pull llama3.1
python3 main.py --url <product-url> # picks up Ollama automaticallypython3 app.pyLaunches a high-performance, single-command server at http://localhost:8000:
- Interactive Sandbox & Portal (
/): Live camera kinematics, framework selector, real-time aspect ratio simulator, model specs, and architecture walkthrough. - Generation Studio (
/studio/): Full visual studio with multi-tab generation (Quick Movie, E-Com Ads, Viral Shorts), preview players, telemetry, actor pickers, and download managers.
python3 main.py [options]
Core
| Flag | Default | Description |
|---|---|---|
--mode |
ad |
Creation mode: ad, movie, viral_scene |
--url |
None |
Product page URL to advertise (ad mode) |
--premise |
None |
Story premise or concept (movie mode) |
--style |
hyper_realistic |
Cinematic visual style (cyberpunk, dark_fantasy, anime_cinematic, etc.) |
--output |
output/final_video.mp4 |
Output MP4 path |
--variants |
1 |
Number of creative variants to produce |
--seconds |
20 |
Target runtime in seconds |
--framework |
pas |
Narrative or hook framework (pas, testimonial, viral_plot_twist, pov_suspense, etc.) |
--doctor |
Report configured engines and exit |
Script engine
| Flag | Default | Description |
|---|---|---|
--provider |
auto |
auto, anthropic, openai, openai_compatible, offline |
--model |
provider default | Model name override |
--base-url |
Custom LLM endpoint (Ollama, LM Studio, vLLM) |
Audio
| Flag | Default | Description |
|---|---|---|
--voice |
female_energetic |
female_energetic, female_calm, male_confident, male_casual, neutral |
--tts |
auto |
Force an engine: elevenlabs, openai, kokoro, edge, gtts |
--music |
Background track | |
--music-volume |
0.18 |
Music level, 0–1 |
--no-duck |
Disable side-chain ducking |
Visuals
| Flag | Default | Description |
|---|---|---|
--platform |
tiktok |
tiktok, reels, shorts, vertical, square, landscape |
--quality |
standard |
draft (fast), standard, high |
--captions |
karaoke |
karaoke, word_pop, block, none |
--transition |
fade |
none, fade, dissolve, slideleft, slideright, wipeleft, circleopen, smoothleft |
--video-model |
wan-2.1 |
seedance-2.5, seedance-2.0, kling-2.0, wan-2.2, wan-2.1, minimax-hailuo, luma-ray-2, runway-gen3 |
--no-generation |
Never call a paid video model — stay free | |
--no-whisper |
Skip Whisper alignment, estimate caption timings |
UGC avatar
| Flag | Description |
|---|---|
--avatar |
Use a lip-synced presenter for every scene |
--actor |
Actor name, file path or URL |
--avatar-model |
auto, hedra, sync-lipsync, latentsync, veed |
--list-actors |
List available actors and exit |
Brand kit
| Flag | Default | Description |
|---|---|---|
--brand-name |
scraped vendor | Name on the end card |
--logo |
Transparent PNG watermark | |
--accent |
#00E5A0 |
Highlight colour for captions and CTA |
--text-color |
#FFFFFF |
Base caption colour |
--cta |
Shop now |
End card call to action |
--cta-seconds |
1.6 |
End card length (0 disables) |
Run the standalone REST server:
uvicorn src.server:app --host 127.0.0.1 --port 8000GET /api/health— System status, ffmpeg detection, provider availability.POST /api/storyboard— Generates storyboard timeline JSON from product URL or story premise.POST /api/scene/regenerate— Regenerates individual audio or visual assets for a single scene with caching.POST /api/compile— Compiles edited timeline scenes into a final broadcast MP4.GET /api/actors— Returns available UGC actors and portrait paths.GET /files/{file_path:path}— Sandboxed static media delivery for generated assets.
Darc Studio is designed from the ground up for safe, private, and responsible open-source deployment. Follow these best practices to ensure security:
- Never commit
.envfiles: All secret keys (OPENAI_API_KEY,ANTHROPIC_API_KEY,FAL_KEY, etc.) must remain in your local.envor system environment. The.gitignoreis pre-configured to exclude all.envand*.keyfiles. - Session-only UI Keys: Keys entered in the Web Studio are held in memory for that process session only and are never saved to disk.
- SSRF Attack Protection: Storefront URL ingestion automatically validates and filters targets through
is_safe_url(), rejecting private subnets (10.0.0.0/8,172.16.0.0/12,192.168.0.0/16), loopbacks (127.0.0.1,localhost), and cloud metadata IP addresses (169.254.169.254). - Path Traversal Sandboxing: The file serving endpoint strictly confines filesystem access to authorized directories (
output/,assets/,web/assets/) using canonical common path resolution. Arbitrary file reads outside the sandbox are rejected. - Subprocess Security: All video processing commands passed to FFmpeg and FFprobe use sanitized argument vectors (
shell=False) rather than interpolated shell strings, eliminating command injection risks.
- Local / Desktop Use: Bind to
127.0.0.1(localhost) so only your local machine can access the service. - Remote / Cloud Deployment: If running on a remote server, place DarcAds behind a reverse proxy (such as Nginx or Caddy) configured with SSL/TLS and HTTP Basic Authentication or OAuth to prevent unauthorized access.
- Truth in Advertising: Do not generate misleading, unsubstantiated, or fabricated claims.
- Likeness Rights: Only use avatar portraits and voice clones for which you have explicit rights and consent.
- Synthetic Media Disclosure: Comply with regional synthetic media disclosure regulations (e.g., EU AI Act, FTC guidelines, TikTok/Meta AI content labeling policies).
The Arcads-style feature: a person on camera delivering your script.
- Put a portrait photo or a short clip of a presenter in
assets/actors/ - Add a
FAL_KEYto.env - Run with
--avatar
python3 main.py --url <product-url> --avatar --actor mayaA still portrait is animated to speak the narration (Hedra Character-2). A video clip is re-synced to it (sync-lipsync). DarcAds picks the right mode from the file type.
python3 main.py --url <product-url> \
--brand-name "Acme" \
--logo assets/brand/logo.png \
--accent "#FF4D6D" \
--text-color "#FFFFFF" \
--cta "Get 20% off" \
--cta-seconds 2.0The accent colour drives the highlighted caption word, the hook text, the progress bar and the CTA button, so one value re-skins the whole ad.
python3 -m unittest discover -s tests # full suite (161 tests)
python3 -m unittest tests.test_llm_director # one moduleThe test suite covers scraping and its fallbacks, SSRF protection, script generation and repair, caption timing, image framing, ffmpeg filter graphs, and end-to-end multi-variant video compilation.
Contributions are welcome — see CONTRIBUTING.md. Useful places to start: additional storefront parsers, more hook frameworks, extra video providers, and caption styles.
MIT — see LICENSE. Do what you like with it, including commercially.
Third-party models and APIs you connect carry their own licences and terms.