Channelsmith docs
v1.0.0
Get help
● Start · Install

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.

DockerUbuntu 22.04 / 24.04Node.js 22 or 26 (LTS)Chrome and ffmpegCaddy

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

  1. Install Docker: https://docs.docker.com/engine/install/ubuntu/
  2. Unpack Channelsmith into a folder, for example /opt/channelsmith, and go there:

    cd /opt/channelsmith
    cp .env.example .env
  3. Edit .env:

    • PUBLIC_URL: the https address people will use, e.g. https://studio.your-agency.com
    • ADMIN_SECRET_KEY: run openssl rand -hex 32 and 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=1 when Caddy or nginx is in front (it almost always is).
  4. 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 channelsmith

    Everything the studio stores is in the channelsmith-data volume (the image's DATA_DIR is /app/data).

  5. Read the one-time setup code for the console from the log:

    docker logs channelsmith
  6. 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

  1. 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 --version
  2. ffmpeg, 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++
  3. 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.deb

    The server finds Chrome at /usr/bin/google-chrome-stable, /usr/bin/google-chrome, /usr/bin/chromium or /usr/bin/chromium-browser. Anywhere else, set CHROME_PATH in .env. ffmpeg and ffprobe are looked up on the PATH; set FFMPEG_PATH and FFPROBE_PATH if they live elsewhere.

  4. 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 start

    The 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:

  5. 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.target
    sudo 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 code

    The server reads .env from 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

VariableWhat it does
PORTPort the server listens on (default 8787)
HOSTAddress it listens on (default 0.0.0.0)
PUBLIC_URLThe https address. Pins "Public URL" in the console. The YouTube sign-in returns to PUBLIC_URL/api/youtube/callback
ADMIN_SECRET_KEY64 hex characters. Encrypts saved API keys and YouTube sign-ins. Without it a key is generated into DATA_DIR/.admin-secret-key
DATA_DIRWhere databases, uploads, footage and renders live (default data in the studio's folder)
BACKUP_DIRWhere npm run backup writes (default DATA_DIR/backups)
TRUST_PROXY_HOPSNumber of proxies in front (Caddy or nginx = 1)
COOKIE_SECURE1 forces the Secure flag on cookies (on by itself when PUBLIC_URL starts with https)
FRAME_ANCESTORSOptional. Other https sites allowed to show the studio in a frame, space-separated. Leave empty unless you need it
CHROME_PATH, FFMPEG_PATH, FFPROBE_PATHOnly when they are not found by themselves
ANTHROPIC_API_KEY, ELEVENLABS_API_KEY, PEXELS_API_KEY, STRIPE_SECRET_KEY, STRIPE_WEBHOOK_SECRET, RESEND_API_KEYOptional: 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_PASSWORDOnly 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.