Configuration
the .env file and the console, section by section.
Vodmill has two places for settings. The .env file holds the few values the server needs before the console can open. Everything else is a setting in the console at /admin, changed without a restart.
01The .env file
From .env.example and src/server/config.ts. Restart the server after a change.
| Variable | Purpose | Where the value comes from |
|---|---|---|
PORT | Port the server listens on. Default 8787. | Your choice |
PUBLIC_URL Set it | The https address people use. Invite and reset links, Stripe return addresses, signed file links and the YouTube connection are built from it. When set, the console shows the field locked. | Your domain, for example https://clips.your-agency.com |
ADMIN_SECRET_KEY Set it | 64 hex characters that seal saved keys and secrets. Not set: the server writes a generated key to DATA_DIR/.admin-secret-key. | openssl rand -hex 32 |
DATA_DIR | Folder of the databases and files. Default data in the product folder. | A path on a disk with room |
TRUST_PROXY_HOPS | Number of reverse proxies in front, so rate limits see the visitor's address. Default 0. | 1 behind Caddy or nginx |
FFMPEG_PATH, FFPROBE_PATH Optional | Full paths when the two programs are not on the PATH. | which ffmpeg, which ffprobe |
BACKUP_DIR Optional | Where npm run backup writes. Default DATA_DIR/backups. | A folder, ideally on another disk |
HOST Optional | Listen address. Default 0.0.0.0. | 127.0.0.1 to accept only the local proxy |
COOKIE_SECURE Optional | 1 forces the Secure flag on cookies. It is on by itself when PUBLIC_URL starts with https://. | — |
ANTHROPIC_API_KEY, STRIPE_SECRET_KEY, STRIPE_WEBHOOK_SECRET, RESEND_API_KEY Optional | Pin a key here instead of entering it in the console. A set variable locks the console field (ENV_LOCKS). | The provider's dashboard |
VODMILL_YUNET_MODEL Optional | Full path of the face detection model when it is not in the models folder (packages/reframe/src/detect.ts). Commented out in .env.example. | The .onnx file in models/ |
DEMO_MODE, DEMO_PASSWORD, ADMIN_DEMO_PASSWORD, FRAME_ANCESTORS | For a public read-only demo host only. Never set these on a real install. | — |
02The console, section by section
The console has no single settings menu: every section below is its own entry in the sidebar, under one of the headings Setup, Money, Product and System (Setup: Brand, Legal, AI, Transcription, Server; Money: Campaigns, Credits, Customer billing; Product: Access, Imports, Clipping defaults, Publishing; System: Rendering, Public API, E-mail, Integrations, Notifications). The search field at the top finds any setting by name. The sections are declared in src/server/admin/manifest.ts. Changes apply at once and are written to the audit log.
| Section | What you set | Explained in |
|---|---|---|
| Brand, Legal | Name, tagline, accent colour, logo, support e-mail, browser tab title; terms and privacy links, disclaimer | White label |
| Access | Sign-up open or closed, welcome credits, announcement, maintenance mode, blocked countries and the country header of your proxy | First steps |
| AI | The Claude model for each step, fallbacks, workspaces' own keys | AI and transcription |
| Transcription | Provider and its options | AI and transcription |
| Imports | Import from a link: off by default | Imports |
| Clipping defaults | What a new source starts with | below |
| Rendering | Parallel work, queue, 60 fps, watermark, clean-up, largest upload | below |
| Campaigns | The campaigns switch, commission, hold, tracking, fraud threshold | Campaigns |
| Publishing | The publishing switch and its three channel kinds | Publishing |
| Credits, Customer billing | Credit price per action; the selling switch | Plans and credits |
| Public API | The API switch and the rate limit per key | API v1 |
| Server | The public URL | below |
| The sender address | below | |
| Integrations | Every API key and secret | below |
| Notifications | Where the console's own alerts go | Operator console |
03Clipping defaults
What a new source starts with. A workspace can change these for itself on its Clip settings page.
| Field | Default | Range or meaning |
|---|---|---|
| Clips suggested per source | 10 | 1 to 40 |
| Shortest clip (seconds) | 20 | 5 to 120 |
| Longest clip (seconds) | 55 | 10 to 180 |
| Genre | Detect from the video | Podcast, Stream, Gaming, Vlog, Talk, Education, Business |
| Aspect ratio | 9:16 vertical | Also 1:1, 4:5, 16:9 |
| Cut silences and filler words | On | Never applied to streams |
| Punch-in zooms | On | Never applied to streams |
| Check every suggested clip for a complete thought | On | One extra AI call per clip while a source is analysed |
| Caption preset (id) | Empty | Empty uses the first preset. Ids are on the console's Caption presets page (list). |
04Rendering
| Field | Default | Range or meaning |
|---|---|---|
| Renders at the same time | 1 | 1 to 4. One render already uses every CPU core. |
| Sources analysed at the same time | 1 | 1 to 4 |
| Renders a workspace may have waiting | 30 | 1 to 500 |
| Allow 60 fps renders (plans with 60 fps) | Off | A 60 fps render needs this switch and the plan's "60 fps renders" limit |
| Watermark text on plans without "No watermark" | Empty | Empty: no watermark on any plan |
| Delete render files after (days, 0 keeps them) | 0 | 0 to 3650. Expired renders can be rendered again; their share links stop working. |
| Largest upload (GB) | 8 | 1 to 200 |
Renders and analyses wait in queues. One render runs per workspace at a time; plans with a higher queue priority go first. Uploads nobody finished within two days are removed (src/server/jobs.ts).
05Server
One field: Public URL of this server. It must be the https address of the app. It is locked when PUBLIC_URL is set in .env. Until it starts with https:// the console shows a blocker.
06E-mail
One field: Sender, a sender on a domain you verified in Resend, for example Team <hello@your-agency.com>. With the Resend key under Integrations the server e-mails workspace invites, staff invites and password reset links. Without e-mail, invite links are shown on the page for you to send yourself, and password resets are made by the operator from the console's Users page.
07Integrations: every key
Only console owners can change keys. Each key is sealed with ADMIN_SECRET_KEY and never shown again after saving.
| Key | Used for | Where to get it |
|---|---|---|
| Anthropic API key | AI moment picking, complete-thought check, titles, post texts | console.anthropic.com, API keys |
| ElevenLabs API key | Transcription with ElevenLabs Scribe | elevenlabs.io, API keys |
| Whisper API key (Groq, OpenAI or compatible) | Transcription with Whisper over HTTP | Your provider's dashboard |
| Stripe secret key | Checkout for plans and credit packs | Stripe, Developers, API keys |
| Stripe webhook signing secret | Verifying Stripe's calls | Stripe webhook |
| Resend API key | resend.com, API Keys | |
| Twitch app client secret | Twitch view counts and top clips. The client ID is under Imports. | dev.twitch.tv, Applications |
| YouTube Data API key | Counting views on submitted YouTube clips; checking channel descriptions | Campaigns |
| Google OAuth client ID and secret | Customers connecting their YouTube channel | Publishing |