Four ways in.
The same engine behind each one. Nothing is ever sent for you: every way in makes films and drafts, and a person decides what goes out.
REST API
Make a film, poll its progress, draft the messages, read who watched. OpenAPI docs are live on the hosted app at /docs.
# make a film for one company
curl -X POST $COLDOPEN/v1/films \
-H "Authorization: Bearer co_…" \
-H "Idempotency-Key: linear-1" \
-d '{"url":"https://linear.app"}'
MCP server
Ten tools for Claude, Cursor or ChatGPT: search jobs and YC startups, make films, draft messages, list follow-ups. Make an access token on your Profile page.
claude mcp add --transport http coldopen \ https://coldopen-nk8o.onrender.com/mcp \ --header "Authorization: Bearer co_…"
CLI
A film from your terminal, with no server and no model: the built-in writer is free, offline and reproducible. Add --model for Ollama or any OpenAI-compatible API.
git clone https://github.com/tiwaker9404/coldopen cd coldopen && pnpm install pnpm film https://linear.app --job <job link>
Your own server
The API, the durable workers and Postgres in one compose file. The hosting guide covers free options with no card.
docker compose up --build
# then open http://localhost:8080
How a URL becomes a film.
Research
Headless Chromium reads the homepage: colors, typefaces, logo, and every quotable fact. The job post’s requirements join the facts, and their RSS feeds add what they published lately.
Script
A writer fills six scenes, built in or any OpenAI-compatible model. Code checks every line: word limits, banned phrases, and every number traced to a source. A model gets its violations back and revises; lines it can’t fix fall back to the built-in writer.
Compose
Each scene is an HTML timeline in the company’s own fonts and colors, with paused animations so any frame can be drawn exactly.
Render
Scenes render in parallel, each in its own Chromium page, seeked frame by frame and encoded with ffmpeg. Every finished scene is its own checkpoint.
Survive
Runs are journaled in Postgres with leases. Kill a worker mid-film and the next one replays research and script from the journal, then renders only what’s left.
Share
A Cloudflare Worker serves the share page and counts real views (opened, played, finished) without storing IP addresses.
Tested like it matters.
Grounded by design
The model points at facts by id instead of quoting them, so code can verify that what’s on screen came from the source.
Observable
OpenTelemetry traces for every step and model call, and Prometheus metrics for queue lag, runs, replayed steps and model calls.
Safe to host
Research only opens public addresses, every redirect included. Rate limits per person, network and app keep the free tiers free.
Starter projects.
Six ways to make a first contribution, each with the files to open. Read CONTRIBUTING, then open an issue with the starter project template to claim one.
- Design
A new scene
Add a seventh scene kind, like a customer quote over their logo.
src/script/storyboard.tssrc/render/composition.ts - Writing
A new writer preset
Beyond job seekers, sellers, recruiters and hiring posts: founders raising, or students asking for a coffee chat.
src/script/types.tssrc/script/writer.tssrc/script/checks.ts - Data
A new job board
Greenhouse, Lever and Ashby are in. Add Workable, SmartRecruiters or Recruitee.
src/jobs/boards.tstest/unit/jobs.test.ts - Render
A 4:5 format
LinkedIn’s feed favors 4:5 video. Add the shape and make every scene fit it.
src/render/composition.tssrc/film.ts - Research
A sharper brand read
Better logo picks and color roles on sites that hide their brand in images or CSS variables.
src/brand/extract.tssrc/brand/color.ts - Research
More homework
Read a company’s YouTube channel feed, or their GitHub organization’s latest releases.
src/brand/homework.tstest/unit/homework.test.ts