Install.
Docker, or Node.js on Ubuntu.
Channelsmith is one Node.js server. It renders videos on the same machine with Chrome (the frames) and ffmpeg (encoding, sound and footage), and keeps everything it stores in one folder, DATA_DIR.
01What the server needs
- 2 CPU cores and 4 GB of memory for one render at a time. Each extra parallel render needs about 1 core and 600 MB more.
- Long videos take time to render. Render time grows with the length of the episode and the number of footage clips. The console's System health page shows the speed of the last render: measure on your own server before you promise anyone a turnaround time.
- Disk: 40 GB free to start with. A finished 1080p documentary with film grain is about 8 Mbit/s, so a 10-minute episode is around 600 MB, plus the footage clips it used. The console's Storage page shows who uses what.
- A domain name pointing at the server, and https in front of it (Caddy or nginx). YouTube sign-in and Stripe need https.
Pick Docker if you are not sure: Chrome and ffmpeg come inside the image.
On Windows: the server is meant to run on Linux. On a Windows PC, run the commands on this page inside WSL 2 with Ubuntu (in PowerShell: wsl --install -d Ubuntu), or use Docker Desktop with its WSL 2 backend.
02Option A: Docker
- Install Docker: https://docs.docker.com/engine/install/ubuntu/
Unpack Channelsmith into a folder, for example
/opt/channelsmith, and go there:cd /opt/channelsmith cp .env.example .envEdit
.env:PUBLIC_URL: the https address people will use, e.g.https://studio.your-agency.comADMIN_SECRET_KEY: runopenssl rand -hex 32and paste the result. It encrypts the API keys and the YouTube sign-ins you save. Keep a copy somewhere safe: without it they cannot be read after a restore.TRUST_PROXY_HOPS=1when Caddy or nginx is in front (it almost always is).
Build and start:
docker build -t channelsmith . docker volume create channelsmith-data docker run -d --name channelsmith --restart unless-stopped \ -p 127.0.0.1:8787:8787 --env-file .env \ -v channelsmith-data:/app/data channelsmithEverything the studio stores is in the
channelsmith-datavolume (the image'sDATA_DIRis/app/data).Read the one-time setup code for the console from the log:
docker logs channelsmith- Put https in front (see "https with Caddy" below), then continue with First steps.
Commands inside the container run with docker exec, for example docker exec channelsmith npm run backup.
03Option B: plain Node.js on Ubuntu 22.04 / 24.04
Node.js 22.12 or newer. Tested on Node.js 22 and 26 (LTS); the Docker image uses Node.js 26:
curl -fsSL https://deb.nodesource.com/setup_26.x | sudo -E bash - sudo apt install -y nodejs node --versionffmpeg, the emoji font, and the tools to build the database driver if no prebuilt one fits:
sudo apt install -y ffmpeg fonts-noto-color-emoji python3 make g++Google Chrome (amd64 servers):
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb sudo apt install -y ./google-chrome-stable_current_amd64.debThe server finds Chrome at
/usr/bin/google-chrome-stable,/usr/bin/google-chrome,/usr/bin/chromiumor/usr/bin/chromium-browser. Anywhere else, setCHROME_PATHin.env. ffmpeg and ffprobe are looked up on thePATH; setFFMPEG_PATHandFFPROBE_PATHif they live elsewhere.Install and build Channelsmith:
cd /opt/channelsmith npm ci cp .env.example .env # then edit it as in Option A, step 3 npm run build npm startThe log prints the address and the console's one-time setup code. Stop it with Ctrl+C once it works and run it as a service:
A systemd service,
/etc/systemd/system/channelsmith.service:[Unit] Description=Channelsmith After=network.target [Service] WorkingDirectory=/opt/channelsmith ExecStart=/usr/bin/node dist/src/server/index.js Restart=always User=studio Environment=NODE_ENV=production [Install] WantedBy=multi-user.targetsudo useradd --system --home /opt/channelsmith studio sudo chown -R studio:studio /opt/channelsmith sudo systemctl daemon-reload sudo systemctl enable --now channelsmith journalctl -u channelsmith -f # the log, with the setup codeThe server reads
.envfrom its folder by itself.
04https with Caddy
sudo apt install -y caddy
/etc/caddy/Caddyfile:
studio.your-agency.com {
request_body {
max_size 500MB
}
reverse_proxy 127.0.0.1:8787
}
sudo systemctl reload caddy
Caddy gets the certificate by itself. Keep TRUST_PROXY_HOPS=1 in .env so rate limits see the visitor's address. The body size matters for people who upload their own footage.
05Settings in .env
| Variable | What it does |
|---|---|
PORT | Port the server listens on (default 8787) |
HOST | Address it listens on (default 0.0.0.0) |
PUBLIC_URL | The https address. Pins "Public URL" in the console. The YouTube sign-in returns to PUBLIC_URL/api/youtube/callback |
ADMIN_SECRET_KEY | 64 hex characters. Encrypts saved API keys and YouTube sign-ins. Without it a key is generated into DATA_DIR/.admin-secret-key |
DATA_DIR | Where databases, uploads, footage and renders live (default data in the studio's folder) |
BACKUP_DIR | Where npm run backup writes (default DATA_DIR/backups) |
TRUST_PROXY_HOPS | Number of proxies in front (Caddy or nginx = 1) |
COOKIE_SECURE | 1 forces the Secure flag on cookies (on by itself when PUBLIC_URL starts with https) |
FRAME_ANCESTORS | Optional. Other https sites allowed to show the studio in a frame, space-separated. Leave empty unless you need it |
CHROME_PATH, FFMPEG_PATH, FFPROBE_PATH | Only when they are not found by themselves |
ANTHROPIC_API_KEY, ELEVENLABS_API_KEY, PEXELS_API_KEY, STRIPE_SECRET_KEY, STRIPE_WEBHOOK_SECRET, RESEND_API_KEY | Optional: pin a key here instead of entering it in the console. A key set here is shown locked in the console |
DEMO_MODE, DEMO_PASSWORD, ADMIN_DEMO_PASSWORD | Only for a public read-only demo host. Never on a real install |
Check the result in the console under System health: Chrome, ffmpeg, free disk and the keys are all listed there.