Install & set up
Everything runs on your own machine — no hosted service, no client secret. This takes about five minutes.
Requirements
| Node.js 18+ | No npm dependencies to install — the tool runs directly with node. |
|---|---|
| ffmpeg + ffprobe | Only needed for the optional rendered MP4 path. A normal distro build works (apt install ffmpeg). Ideally built with drawtext (libfreetype) so clip titles can be burned in — without it, rendering still works, just without titles. |
| A free Twitch account | To register a Public application (below) and to log in as the channel whose clips you want to reel. |
-
Get the code
git clone https://github.com/daydream-software/project-elm.git cd project-elm -
Register a Twitch application (Public)
Project Elm needs its own Twitch Client ID to talk to the Helix API on your behalf.
- Go to dev.twitch.tv/console/apps and sign in.
- Click Register Your Application.
- Fill in:
- Name — anything unique, e.g.
yourname-project-elm. - OAuth Redirect URLs —
http://localhost:3000. The form requires one, but this tool never uses it — the Device Code Flow it uses has no redirect step. - Category — Application Integration (or Other).
- Client Type — Public. This is the important one: a Public app has no client secret, which is exactly what a local tool needs.
- Name — anything unique, e.g.
- Click Create, open the app, and copy its Client ID.
ℹ️The Client ID is public by design — on its own it can't access anyone's account. Every real action still requires you to log in and explicitly consent (step 4). That's why it lives in a local, gitignored
.envrather than being hardcoded: each user brings their own. -
Configure
cp .env.example .env # edit .env and set: # TWITCH_CLIENT_ID=<your Client ID> -
Run it
node render/server.mjsOpen http://localhost:8080/. On first run you'll see the login screen:
Click Log in with Twitch — a device code and URL appear on the page. Open the URL, enter the code, sign in with your channel account, and approve the manage clips permission (scope
channel:manage:clips— required to download your own clips). The token is cached locally inrender/.token.json(gitignored) and refreshes itself; you won't need to log in again.
Downloaded clips, your Twitch token, and saved reel configurations are all stored locally and gitignored — nothing here is uploaded anywhere except the download itself, which comes straight from Twitch's official endpoint.