Skip to content

Documentation

Command reference

Everything you do with Heddle by hand is one command, heddle followed by its name, run from your site's repository. Run heddle on its own to list them. The 32 commands below are grouped by when you need them, from setting up and research to building and checking the site, running agents, publishing and operations. Each has its flags, an example and the accounts it needs.

Set up

heddle init

Starts a new install. It copies the company template into the site's heddle/ folder and installs Heddle's skill for coding agents, and it refuses to overwrite a heddle/ folder that already exists. Then replace every value marked REPLACE and run heddle validate.

heddle init <site-repo>
Argument or flag What it does
<site-repo> The site's repository: the folder that holds heddle/. Use . when you are in it.

Examples:

# Create my-site/heddle/ from the template.
heddle init ../my-site

heddle install

Puts Heddle into a site in one command. It writes heddle/ from the company template, with the basics you pass as flags, the managed Worker, workflow and script templates for the features you choose, package.json scripts and packages, the IndexNow key, the skill for coding agents, and heddle/install.json, the record update and doctor read.

Then it runs the launch checklist. Nothing is prompted for; a value you leave out stays REPLACE and heddle validate names it.

heddle install <site-repo> [--name n --url u --contact e | --config dir] [--with f,..] [--without f,..] [--app next] [--dry-run] [--no-launch] [--apply]
Argument or flag What it does
<site-repo> The site's repository: the folder that holds heddle/. Use . when you are in it.
--name n The company's name.
--url u The live site's address.
--contact e The public contact address.
--one-line text The one-sentence description.
--short text The short description.
--config dir A prepared heddle/ folder, copied over the template instead of the basics.
--with f,.. Features to add: worker, next, agents, deploy, config-check, ideas, approvals, smoke.
--without f,.. Features to leave out.
--app next Also write a starter Next.js site that reads every fact from heddle/.
--worker name The Worker's name.
--account id The Cloudflare account id (CLOUDFLARE_ACCOUNT_ID otherwise).
--contact-to e Where the contact form's mail goes.
--mail-from e The address the site sends from.
--preview url Passed to the launch checklist: check the preview host too.
--force Replace managed files even where they were edited in the site.
--dry-run Print the plan and write nothing.
--no-launch Skip the launch checklist at the end.
--apply Let the launch checklist do the Cloudflare and GitHub steps it can.

Examples:

# See the plan first.
heddle install ../my-site --name "Acme" --url https://www.acme.test --contact hello@acme.test --dry-run
# A new site with the starter app.
heddle install ../my-site --name "Acme" --url https://www.acme.test --contact hello@acme.test --app next

Needs: git, GitHub CLI (gh), Cloudflare's cf CLI (npm package cf, pinned at 1.0.0-beta.14), CLOUDFLARE_ACCOUNT_ID.

heddle validate

Checks a site's heddle/ folder. It reads every file against its schema and looks for placeholders left in, agents above report with no approver, shared kill switches, the budget, the ledger and the family datasets, and exits 1 on any error. Run it after every edit to heddle/.

heddle validate <site-repo>
Argument or flag What it does
<site-repo> The site's repository: the folder that holds heddle/. Use . when you are in it.

Examples:

# Is the install's configuration complete and consistent?
heddle validate .

heddle skill

Heddle's method as an Agent Skill for coding agents. install copies it into a site's .claude/skills/heddle/ and points the site's AGENTS.md and CLAUDE.md at it; public writes the publishable variant with public lessons only. With no argument it regenerates the skill inside the Heddle repository.

heddle skill
heddle skill check
heddle skill install <site-repo> [--check]
heddle skill public <dir> [--zip file]
Argument or flag What it does
check|install|public What to do; nothing regenerates skills/heddle/ in Heddle itself.
<site-repo> The site's repository: the folder that holds heddle/. Use . when you are in it.
--check install: exit 1 when the site's copy or pointer is stale.
--zip file public: also write the skill as a zip.

Examples:

# Give the site's coding agents the current skill.
heddle skill install .
# In CI: fail on a stale copy.
heddle skill install . --check

heddle launch

The go-live checklist for a site, covering the Cloudflare zone, Worker, domain and KV, email in and out, DMARC, Turnstile, Search Console, GitHub secrets and workflows, and the live site. Prints PASS, TODO with the exact next step, FAIL or SKIP for each.

Read-only, unless --apply, which does only the safe Cloudflare steps it found missing.

heddle launch <site-repo> [--apply] [--preview url] [--json]
Argument or flag What it does
<site-repo> The site's repository: the folder that holds heddle/. Use . when you are in it.
--apply Create what is missing on Cloudflare (KV, Email Routing, the DMARC record, Turnstile hostnames). Needs the launch token; never edits or deletes.
--preview url Also check the preview host before the domain is attached.
--json The checklist as JSON.

Examples:

# Where the launch stands.
heddle launch .
# Do the safe Cloudflare steps, then rerun without --apply.
heddle launch . --apply

Needs: GitHub CLI (gh), CLOUDFLARE_LAUNCH_TOKEN, CLOUDFLARE_API_TOKEN, GSC_KEY_FILE, PLUNK_API_KEY.

heddle update

Brings an install's managed files, package.json scripts and record up to the Heddle you have checked out. A managed file that was edited in the site is refused, because the change belongs in Heddle's template, unless you pass --force.

It never touches the facts in heddle/ or the site's own files, and it does not run the launch checklist.

heddle update <site-repo> [--with f,..] [--without f,..] [--force] [--dry-run]
Argument or flag What it does
<site-repo> The site's repository: the folder that holds heddle/. Use . when you are in it.
--with f,.. Add these features.
--without f,.. Remove these features.
--force Replace managed files even where they were edited in the site.
--dry-run Print the plan and write nothing.

Examples:

# What a pull of Heddle would change in this site.
heddle update . --dry-run

Research

heddle research

Demand, results pages, positions and Search Console for your site. check says which credentials are set. keywords reads volume and cost per click, serp reads a live results page, track reads positions for heddle/targets.json, and gsc reads Search Console (low click-through, striking distance, compare, inspect, prune, weekly). hn and reddit find buyers' own words.

heddle research <site-repo> check
heddle research <site-repo> balance
heddle research <site-repo> keywords "<term>" ["<term>" ...]
heddle research <site-repo> serp "<query>" [depth] [--location "City,State,Country"]
heddle research <site-repo> track [--save] [--force] [--slice]
heddle research <site-repo> gsc check|low-ctr [days] [min]|query "<term>" [days]|striking [days] [min]
heddle research <site-repo> gsc compare "<path regex>" <YYYY-MM-DD> [days]|page "<path>" <YYYY-MM-DD> [days]
heddle research <site-repo> gsc inspect <path> [...] | --sitemap "<path regex>"
heddle research <site-repo> gsc weekly
heddle research <site-repo> gsc prune <path> [...] [--days 90]
heddle research <site-repo> hn|reddit "<query>" [limit]
Argument or flag What it does
<site-repo> The site's repository: the folder that holds heddle/. Use . when you are in it.
check|balance|keywords|serp|track|gsc|hn|reddit What to read.
--json Raw rows as JSON.
--location "City,State,Country" serp: read the page as seen from this place. City searches must be read from the city.
--save track: record this reading as the new baseline (refused within 21 days of the last).
--force track: read every target even if read recently.
--slice track: only the targets due today, each once every 21 days.
--sitemap "<path regex>" gsc inspect: inspect the sitemap URLs matching this.
--days n gsc prune: the window (default 90).
--all-countries gsc: read beyond the market country in company.json.

Examples:

# Which data sources are configured.
heddle research . check
# DataForSEO's prepaid balance, before blaming the key.
heddle research . balance
# Volume and cost per click.
heddle research . keywords "ai seo agent" "seo automation"
# A local results page, read from the city.
heddle research . serp "plumber phoenix" --location "Phoenix,Arizona,United States"
# Searches at positions 4 to 20 worth a push.
heddle research . gsc striking 90 20

Needs: DATAFORSEO_LOGIN, DATAFORSEO_PASSWORD, GSC_KEY_FILE, GSC_SERVICE_ACCOUNT_JSON, REDDIT_CLIENT_ID.

heddle propose

Measured candidate searches for one page pattern. It crosses the pattern with your values (cities, roles, products), reads search volume for each, and prints a shortlist with three judgement columns left blank for a person. With --competitors it lists what your competitors rank on page one for that you do not track.

heddle propose <site-repo> --family <id> [--values file] [--places file] [--limit n] [--serp n] [--json]
heddle propose <site-repo> --competitors [--limit n] [--json]
Argument or flag What it does
<site-repo> The site's repository: the folder that holds heddle/. Use . when you are in it.
--family id The page pattern (heddle families lists them).
--values file The changing part of the pattern, one per line.
--places file The same, for a place pattern.
--limit n How many to list (default 30; 40 for --competitors).
--serp n Also read the live results page for the top n.
--competitors What company.json's competitors rank for instead.
--json Results as JSON.

Examples:

# City pages, with three results pages read.
heddle propose . --family locations --places metros.txt --serp 3
# Demand your competitors have proved.
heddle propose . --competitors

Needs: DATAFORSEO_LOGIN, DATAFORSEO_PASSWORD.

heddle families

Lists Heddle's catalog of page patterns (families), with the search each one answers, its doorway risk, and where it has been proven. Read it before choosing what kind of pages to build.

heddle families [--kind service|product]
Argument or flag What it does
--kind service|product Only the patterns that suit a service company or a product.

Examples:

# The patterns that suit a product.
heddle families --kind product

heddle audit

Crawls the live site, up to a page limit, four pages at a time, and writes a technical audit as Markdown and JSON, covering status codes, titles, canonicals, noindex, sitemap coverage and the problems found. Works on any URL, so you can audit a site before it has a heddle/ folder.

heddle audit <site-repo|url> [--max 500] [--out dir] [--quiet]
Argument or flag What it does
<site-repo|url> A site repository (the URL comes from company.json) or any https:// address.
--max n The most pages to fetch (default 500).
--out dir Where to write audit-<date>.md and .json (default heddle/, or the current folder for a URL).
--quiet No progress lines.

Examples:

# Audit a site you have not set up yet.
heddle audit https://example.com --max 200
# Audit your own live site into heddle/.
heddle audit .

heddle legacy

Run it before an overhaul. It writes heddle/legacy-urls.txt from the live sitemap and, with Search Console credentials, every page that has had impressions. The URL check then makes sure each old address still resolves on the new site. Run it before building the new site and again before cutover.

heddle legacy <site-repo> [--from url] [--dry-run]
Argument or flag What it does
<site-repo> The site's repository: the folder that holds heddle/. Use . when you are in it.
--from url The live site to read, when it is not company.json url.
--dry-run Print what it found and write nothing.

Examples:

# Inventory the old site before replacing it.
heddle legacy . --from https://www.example.com

Needs: GSC_KEY_FILE.

heddle data

The search data providers a site declares in site.json and what each answers. status shows which provider answers each capability and which credential is missing, get reads one capability by hand, and tools and mcp offer the same data to a model or a coding agent.

Paid capabilities are refused there unless --paid, and every paid call is held to the provider's per-run cap.

heddle data <site-repo> status
heddle data <site-repo> get <capability> [json]
heddle data <site-repo> tools [--paid]
heddle data <site-repo> mcp [--paid]
Argument or flag What it does
<site-repo> The site's repository: the folder that holds heddle/. Use . when you are in it.
status|get|tools|mcp What to do.
<capability> get: a capability status lists, such as keywordVolume.
--paid tools and mcp: offer the capabilities that spend credit.

Examples:

# Which provider answers what, and what is missing.
heddle data . status
# One reading by hand.
heddle data . get keywordVolume '{"terms":["seo agent"]}'

Needs: DATAFORSEO_LOGIN, DATAFORSEO_PASSWORD, GSC_KEY_FILE, PAGESPEED_API_KEY.

Build and check

heddle generate

Writes heddle/generated/ from the family datasets, one JSON file per family with every publishable row and the sibling links each page must carry. It also writes the public playbook and the documentation when site.json asks for them. The site's build runs it first.

heddle generate <site-repo> [--dry-run]
Argument or flag What it does
<site-repo> The site's repository: the folder that holds heddle/. Use . when you are in it.
--dry-run List what would change.

Examples:

# Regenerate after editing a dataset.
heddle generate .

heddle check

Runs the quality gates on the built site, from titles, structured data and links to uniqueness, prose, claims and the model-judged gates. Run it after every build and before every pull request; the deploy script runs it and stops on a failure.

Without the model token the model gates report SKIPPED, which is not a pass, and in CI they fail.

heddle check <site-repo> [--only a,b] [--out dir] [--content dir] [--offline] [--require-model] [--update] [--json]
heddle check platform <site-repo> [--base origin/main] [--only a,b] [--json]
heddle check
Argument or flag What it does
<site-repo> The site's repository: the folder that holds heddle/. Use . when you are in it.
platform Lint the Worker config, workflows and tests against the platform constraints instead.
--only a,b Run only these checks (heddle check with no site lists them).
--out dir The build folder, when it is not site.json outDir.
--content dir The Markdown content folder, when it is not site.json contentDirs.
--offline Skip the checks that need the model or the network, on purpose. They show as SKIPPED.
--require-model Fail when a model check could not run, as CI does.
--update Let a check that keeps a record rewrite it (the search surface, the helpful baseline, which only tightens).
--json Results as JSON.
--base ref check platform: compare against this git ref.

Examples:

# Every gate, with the model.
heddle check .
# The code gates only, with no token and no network.
heddle check . --offline
# Two gates while you edit copy.
heddle check . --only humanizer,claims
# The platform lint on what changed.
heddle check platform . --base origin/main

Needs: Chromium or Google Chrome, CLOUDFLARE_ACCOUNT_ID, CLOUDFLARE_API_TOKEN.

heddle aeo

Writes the answer-engine files into the built site after the export and before the deploy. Those are a Markdown twin of every page, llms.txt, llms-full.txt and, when site.json asks, _headers. It writes nothing if any twin would come out thin or disagree with its page.

heddle aeo <site-repo> [--out dir] [--dry-run]
Argument or flag What it does
<site-repo> The site's repository: the folder that holds heddle/. Use . when you are in it.
--out dir The build folder, when it is not site.json outDir.
--dry-run Print llms.txt and write nothing.

Examples:

# Run after next build; the site's build script does it for you.
heddle aeo .

heddle diagrams

Renders every mermaid block in the site's posts and datasets to an SVG in the brand's colours and font, so the page inlines a captioned figure instead of running a script. Commit what it writes; the build fails on a diagram with no render.

heddle diagrams <site-repo> [--check] [--force] [--prune]
Argument or flag What it does
<site-repo> The site's repository: the folder that holds heddle/. Use . when you are in it.
--check Render nothing. Exit 1 if a diagram is uncaptioned, unrendered or rendered in an older theme.
--force Render everything again, after a brand colour or font changes.
--prune Delete rendered SVGs no diagram uses any more.

Examples:

# Render what is new.
heddle diagrams .
# In CI: fail on a stale or missing render.
heddle diagrams . --check

Needs: Chromium or Google Chrome.

heddle images

Measures every image the site's content references into heddle/image-dimensions.json, so each image on a page gets its width and height and the page does not jump while it loads. Only new images are read. Commit what it writes.

heddle images <site-repo> [--remote]
Argument or flag What it does
<site-repo> The site's repository: the folder that holds heddle/. Use . when you are in it.
--remote Fetch an image from the live site when there is no local copy (media kept in object storage).

Examples:

# Measure images that live only in R2.
heddle images . --remote

heddle brand

Checks heddle/brand.json against its schema and against company.json, then builds the downloadable brand kit the /brand page links to, with logos in each format, the colours and type, and one zip. Commit what it writes.

heddle brand <site-repo> [--out dir] [--dry-run]
Argument or flag What it does
<site-repo> The site's repository: the folder that holds heddle/. Use . when you are in it.
--out dir Write the kit somewhere other than site.json brand.kitDir (default public/brand/kit).
--dry-run List the files it would write.
--date YYYY-MM-DD The date stamped in the kit's manifest, for a reproducible build.

Examples:

# Rebuild the kit after a logo or colour change.
heddle brand .

Needs: ImageMagick, librsvg and zip.

heddle covers

Draws a cover for every published post that has none, checks it against the cover rules and the judging model, and writes the SVG and a 1200x630 share image into the site's covers folder. With --fallback it writes the plain, model-free cover instead. Commit what it writes.

heddle covers <site-repo> [--only a,b] [--max n] [--dry-run] [--fallback]
Argument or flag What it does
<site-repo> The site's repository: the folder that holds heddle/. Use . when you are in it.
--only slug,slug Only these posts.
--max n At most this many covers (default 20).
--dry-run List the posts it would draw.
--fallback Write the deterministic fallback cover for every post without a drawn one. No model.

Examples:

# Draw three covers.
heddle covers . --max 3
# Make sure no listing shows a hole.
heddle covers . --fallback

Needs: CF_AIG_TOKEN, CF_AIG_GATEWAY, CLOUDFLARE_ACCOUNT_ID, CLOUDFLARE_API_TOKEN.

heddle playbook

Writes the public playbook for a site whose site.json has a playbook block. The pages' data goes to heddle/generated/playbook.json, and the public Agent Skill and its zip go under the route. heddle generate does the same; this runs it alone.

heddle playbook <site-repo> [--dry-run]
Argument or flag What it does
<site-repo> The site's repository: the folder that holds heddle/. Use . when you are in it.
--dry-run List what would change.

Examples:

# Refresh the playbook pages' data.
heddle playbook .

heddle docs

Writes the documentation pages' data for a site whose site.json has a docs block, covering getting started, installing, this command reference, agents and autonomy, configuration and troubleshooting, all generated from Heddle itself. heddle generate does the same at every build. With --check it reports any command, credential or setting the documentation cannot describe.

heddle docs <site-repo> [--dry-run]
heddle docs --check
Argument or flag What it does
<site-repo> The site's repository: the folder that holds heddle/. Use . when you are in it.
--dry-run Say whether the data would change, and write nothing.
--check No site: exit 1 when a command has no reference entry or its flags drift, a credential the code reads is undescribed, or a configuration field has no description.

Examples:

# Refresh heddle/generated/docs.json.
heddle docs .
# In Heddle: is every command, credential and setting documented?
heddle docs --check

Agents

heddle agent

One run of one agent against a site. The level comes from autonomy.json and can only be lowered here. A run that already succeeded inside the agent's schedule does nothing unless forced. The scheduled workflow calls this; you run it by hand to try an agent or to see what it would do.

heddle agent <id> <site-repo> [--dry-run] [--level l] [--force]
Argument or flag What it does
<id> The agent: memory, research, strategy, content, families, writer, seo, refresh, authority, site, followup, paid, covers, video, watchdog or canary.
<site-repo> The site's repository: the folder that holds heddle/. Use . when you are in it.
--dry-run Read, decide and print the report and the pull requests it would open. Writes nothing.
--level off|report|propose|merge Run below the configured level. A higher value is ignored.
--force Run even though a clean run already happened inside the schedule.

Examples:

# What the SEO agent would do today, without doing it.
heddle agent seo . --dry-run
# Run the watchdog, reporting only.
heddle agent watchdog . --level report

Needs: git, GitHub CLI (gh), CF_AIG_TOKEN, CF_AIG_GATEWAY, CLOUDFLARE_ACCOUNT_ID, CLOUDFLARE_API_TOKEN, DATAFORSEO_LOGIN, GSC_KEY_FILE, PLUNK_API_KEY.

heddle recommendations

Prints the recommendations ledger, with every recommendation an agent made, what is still open, oldest first, and who it waits on. Anything open past the limit is marked overdue. Close an entry by editing heddle/recommendations.json and running heddle validate.

heddle recommendations <site-repo> [--all] [--json]
Argument or flag What it does
<site-repo> The site's repository: the folder that holds heddle/. Use . when you are in it.
--all Every entry, closed ones included.
--json The counts and open entries as JSON.

Examples:

# What is waiting, and on whom.
heddle recommendations .

heddle ideas

One pass of blog ideas by email. It reads the ideas the site's Worker holds, then drafts, asks the author, publishes on the author's signed approval, or withdraws each one. The heddle-ideas workflow runs it when mail arrives and every hour.

heddle ideas <site-repo> [--dry-run]
Argument or flag What it does
<site-repo> The site's repository: the folder that holds heddle/. Use . when you are in it.
--dry-run Decide and print. No state, no branch, no email.

Examples:

# What the next pass would do.
heddle ideas . --dry-run

Needs: git, GitHub CLI (gh), CF_AIG_TOKEN, CF_AIG_GATEWAY, HEDDLE_IDEAS_TOKEN, PLUNK_API_KEY.

heddle advise

Prints the parts of Heddle's playbook, lessons, tactics, checks, page patterns and agents that bear on a topic, as Markdown. A coding agent runs it before changing anything search-relevant. It searches local files by keyword, so it needs no model or network and spends nothing.

heddle advise <topic> [--limit n] [--kind lesson,check,...] [--json] [--full]
Argument or flag What it does
<topic> A few plain words or a question.
--limit n How many results (default 8).
--kind lesson,check,... Only these kinds: playbook, lesson, tactic, check, family, agent.
--json Results as JSON.
--full Each result in full rather than its first lines.
--public Only what the public playbook publishes (public lessons).

Examples:

# What Heddle says about sitemap dates.
heddle advise "sitemap lastmod"
# The lessons and checks about canonicals, as JSON for a script.
heddle advise canonical --kind lesson,check --json

heddle mcp

A read-only MCP server, over stdio, that lets a coding agent search Heddle's playbook, lessons and checks while it works. With --site it also serves that site's search data tools, the free ones only unless --paid. Register it once with your agent.

heddle mcp [--site <site-repo> [--paid]]
Argument or flag What it does
--site <site-repo> Also mount the site's search data tools (heddle data).
--paid With --site, allow the tools that spend data credit.

Examples:

# Started by the agent: claude mcp add heddle -- node <heddle>/bin/heddle.mjs mcp
heddle mcp
# The same, with this site's free search data tools.
heddle mcp --site .

Publish

heddle indexing

Getting new and changed pages crawled. key creates the IndexNow key and its file. submit sends the sitemap URLs that are new or changed since the last accepted submission to IndexNow (Bing and others) after every deploy; where the site deploys from GitHub Actions, CI does this and owns heddle/indexing.json.

list prints today's Search Console list for the indexing bot and, with --send, emails it. record is the deploy workflow's step that merges what a submit accepted.

heddle indexing key <site-repo>
heddle indexing submit <site-repo> [--all] [--dry-run] [paths...]
heddle indexing list <site-repo> [--send] [--dry-run]
heddle indexing record <dir> <delta.json> [--push branch]
Argument or flag What it does
key|submit|list|record What to do.
<site-repo> The site's repository: the folder that holds heddle/. Use . when you are in it.
paths... submit: only these paths or URLs.
--all submit: every sitemap URL, not only the changed ones.
--send list: email the list to the indexing bot.
--dry-run Print what would be submitted or sent.
--local submit: submit from your machine even though the site deploys from CI (CI will not see the state until it is committed).
--delta file submit, in CI: write what IndexNow accepted to this file for record.
--push branch record: commit and push the merged state, retried from a fresh branch.

Examples:

# Once: commit site.json and the key file, then deploy.
heddle indexing key .
# After every deploy.
heddle indexing submit .
# Today's indexing list, without sending it.
heddle indexing list . --dry-run

Needs: GSC_KEY_FILE, PLUNK_API_KEY.

heddle media

Keeps the site's images and video in an R2 bucket instead of the repository, with a committed content-hash manifest, so only what changed is uploaded. Also verifies the bucket against the manifest, lists files no page uses and reads the live headers.

heddle media <site-repo> [--dry-run] [--force] [--verify] [--orphans] [--headers]
Argument or flag What it does
<site-repo> The site's repository: the folder that holds heddle/. Use . when you are in it.
--dry-run List what would be uploaded.
--force Upload everything again.
--verify Fetch every object and compare it with the manifest.
--orphans List files no built page references. Never deletes.
--headers Check each live URL answers 200, immutable, from the bucket.

Examples:

# What a sync would upload.
heddle media . --dry-run
# Upload, then commit the manifest.
heddle media .

Needs: wrangler (Cloudflare's Workers CLI).

heddle video

One step of an explainer video by hand. check runs the word checks on the script (free). render makes the film. watch has the model watch it. publish uploads a merged, rendered film to the YouTube channel, private unless --public; only a person runs it. The video agent does check, render and watch itself.

heddle video check <site-repo> <slug>
heddle video render <site-repo> <slug> [--out dir] [--stills t,t] [--voice deepgram]
heddle video watch <site-repo> <slug> [--out dir]
heddle video publish <site-repo> <slug> [--out dir] [--public]
Argument or flag What it does
check|render|watch|publish The step.
<site-repo> The site's repository: the folder that holds heddle/. Use . when you are in it.
<slug> The film's spec, video/specs/<slug>.json.
--out dir Where the film is written or read (default $VIDEO_OUT or the temp folder).
--stills 3,12.5 render: only frames at these seconds.
--voice deepgram render: a free draft voice instead of the configured one.
--public publish: upload as public (YouTube keeps it private until the API project is audited).

Examples:

# The free checks on a script.
heddle video check . what-is-aeo
# A draft render.
heddle video render . what-is-aeo --voice deepgram

Needs: ffmpeg, ELEVENLABS_API_KEY, YOUTUBE_CLIENT_ID, YOUTUBE_CLIENT_SECRET, YOUTUBE_REFRESH_TOKEN.

heddle deploy

Deploys the site and proves it is live. run builds, validates, runs the code checks, copies the build into the Worker's assets, stamps it and runs wrangler deploy. verify waits until the live site serves that build's stamp, then runs the canary's probe of it, and exits 1 on any problem.

The deploy workflow runs both on every merge; from a laptop, run --local deploys the working tree.

heddle deploy run <site-repo> [--local] [--sha s]
heddle deploy verify <site-repo> [--sha s] [--origin url] [--sample n]
Argument or flag What it does
run|verify Deploy, or prove the deploy is live.
<site-repo> The site's repository: the folder that holds heddle/. Use . when you are in it.
--local run: deploy from your machine. CI still owns IndexNow and heddle/indexing.json.
--sha s The commit being deployed, for the stamp.
--origin url verify: the live address, when it is not site.json baseUrl or company.json url.
--sample n verify: how many sitemap pages to probe (default 20).

Examples:

# Deploy the working tree from your machine.
heddle deploy run . --local
# Is the new build what the live site serves?
heddle deploy verify .

Needs: wrangler (Cloudflare's Workers CLI), CLOUDFLARE_API_TOKEN, CLOUDFLARE_ACCOUNT_ID.

Operate

heddle smoke

The post-deploy smoke test the deploy workflow runs. It finds the preview URL, checks the Worker's bindings and the pages a deploy must serve, records the result in heddle/deploys.json, and starts the canary. A deploy that did not pass it is not to be trusted.

heddle smoke <site-repo> [--upload-log file] [--preview-url url] [--dispatch-canary | --canary-after-record] [--canary-dry-run] [--record-into dir --sha s --ref r] [--print-config]
Argument or flag What it does
<site-repo> The site's repository: the folder that holds heddle/. Use . when you are in it.
--upload-log file The wrangler upload log, to read the preview URL from.
--preview-url url The preview URL, when it is known.
--dispatch-canary Start the canary workflow afterwards.
--canary-after-record Leave the canary to the workflow, once the record is pushed.
--canary-dry-run Say what would start the canary, without starting it.
--record-into dir A checkout of the default branch to write the deploy record into.
--sha sha The deployed commit, for the record.
--ref ref The deployed branch, for the record.
--prep step=outcome;... The outcomes of the steps before it; anything but success fails the smoke.
--print-config Print the Worker config the smoke reads, and stop.

Examples:

# Smoke a preview by hand.
heddle smoke . --preview-url https://my-site.example.workers.dev

Needs: GitHub CLI (gh).

heddle doctor

Fails when an installed template differs from Heddle's, when Heddle's machinery exists a second time in the site, or when config an installed feature needs is missing. Local and read-only; the config-check workflow runs it on every pull request.

heddle doctor <site-repo> [--json]
Argument or flag What it does
<site-repo> The site's repository: the folder that holds heddle/. Use . when you are in it.
--json The findings as JSON.

Examples:

# Has the site drifted from Heddle?
heddle doctor .

Generated from the Heddle repository at ddb1b16.

Questions

What do the exit codes mean?

0 is success, 1 is a failure the command explains, and 2 means the arguments were wrong: heddle prints every command's usage line and exits with 2.

Do commands change my site?

Commands that write say so and take --dry-run, which prints what would change and writes nothing. heddle check, validate, launch without --apply, recommendations and research only read.