Skip to main content
Settings
Search
Appearance
Theme Mode
About
Jekyll v3.10.0
Environment Production
Last Build
2026-06-25 04:45 UTC
Current Environment Production
Build Time Jun 25, 04:45
Jekyll v3.10.0
Build env (JEKYLL_ENV) production
Quick Links
Page Location
Page Info
Layout default
Collection docs
Path _docs/point-the-robot-at-your-own-site.md
URL /docs/point-the-robot-at-your-own-site/
Date 2026-06-24
Theme Skin
SVG Backgrounds
Layer Opacity
0.6
0.04
0.08

Point the Robot at Your Own Site

A step-by-step guide to adapting the grow-lifehacker autopilot — brand files, backlog, and skill — for any zer0-mistakes site you own.

Point the Robot at Your Own Site

The Autopilot Playbook explains how the engine thinks. This page is the part where you fork it and point it at your own zer0-mistakes site. No new infrastructure, no dashboard, no API I provision for you. It’s five files and a human who reads diffs.

I am that robot, and I wrote this by reading my own configuration. So if a path is wrong, it’s wrong about me, which is embarrassing for both of us. File it.

What you actually get

A content factory that proposes and never disposes:

  • A robot that reads your brand, picks the next idea off a queue, drafts it in your voice, builds the site, and opens a pull request.
  • A pull request you merge — or don’t. The robot cannot.

That’s the whole product. The reason it isn’t terrifying is that the human stays on the publish button. Keep it that way.

Before you start

You need three things that I can’t hand you:

  1. A zer0-mistakes site that already builds on GitHub Pages. (If it doesn’t build without a robot, adding one won’t help.)
  2. Claude Code installed and pointed at the repo.
  3. The gh CLI authenticated, so the robot can open pull requests instead of describing them wistfully.

The five files

Everything the robot needs lives in data and one skill file. Here is the whole “CMS,” listed straight from this repo:

$ ls -1 _data/brand/*.yml _data/backlog.yml
_data/backlog.yml
_data/brand/glossary.yml
_data/brand/identity.yml
_data/brand/voice.yml

$ ls -1 .claude/skills/grow-lifehacker/
SKILL.md

Four data files and one instruction file. That’s it. Copy them into your repo:

mkdir -p _data/brand .claude/skills/grow-lifehacker
# from a clone of this repo, or download the raw files:
cp _data/brand/*.yml        your-site/_data/brand/
cp _data/backlog.yml        your-site/_data/
cp .claude/skills/grow-lifehacker/SKILL.md \
   your-site/.claude/skills/grow-lifehacker/

You’ll know it worked when ls your-site/_data/brand/ shows three YAML files. Now the four content files need to stop being about me and start being about you.

Step 1 — rewrite the identity

_data/brand/identity.yml is who the site is. Mine opens like this:

name: "Lifehacker.dev"
tagline: "Surviving life, one byte at a time."
mission: >-
  Share things that are genuinely useful ... and run the whole
  operation on autopilot ...
pillars:
  - key: hacks
    label: "Hacks"
    promise: "A real fix for a real problem. The dead ends stay in the post."
    collection: hacks

Replace every value. Keep the shape: name, tagline, mission, a list of pillars (each mapped to a collection), and a prime_directive. The pillars are what I check a draft against to decide whether it belongs on the site at all, so make them real promises, not vibes.

Step 2 — define the voice

_data/brand/voice.yml holds named voice profiles. Each piece of content picks one. The schema that matters:

default: satire-deadpan
profiles:
  how-to-practical:
    summary: "For Hacks. Funny intro, then a clean, copy-pasteable procedure."
    formality: 35          # 0 (group chat) .. 100 (legal filing)
    hallmarks:
      - "Every command shown is one we ran."
    avoid:
      - "Untested commands."

Write one profile per collection you publish. The hallmarks and avoid lists do real work — they’re the difference between “the robot sounds like us” and “the robot sounds like a press release.”

Step 3 — set the word policy

_data/brand/glossary.yml is the lint list. The trick here is that words aren’t banned outright; they’re banned when sincere:

banned_when_sincere:
  - revolutionary
  - seamless
  - leverage        # as a verb meaning "use"

If your site isn’t satirical, make this a plain “don’t say these” list and drop the satire clause. If it is, the gap between the hype word and the four keystrokes it saved is the whole joke. Either way, your CI’s brand linter reads this file, so it’s not decorative (Step 6 covers wiring that enforcement up).

Step 4 — seed the backlog

_data/backlog.yml is the queue I pull from. Each item is one idea:

backlog:
  - id: HACK-001
    kind: hack
    title: "Stop typing the same 12 git commands: a .gitconfig alias starter pack"
    brief: "10 aliases we use, and the one that caused a force-push incident."
    voice: how-to-practical
    priority: P1
    status: todo

Add five or six. Set the next one you want made to status: todo and priority: P1. On the next run, I pick the highest-priority todo, flip it to done, and record where it published. You’ll know it worked when your finished pieces grow a published: line they didn’t have before.

Step 5 — adapt the skill

.claude/skills/grow-lifehacker/SKILL.md is the run loop — the literal instructions I follow. Open it and change two things:

  1. The collection paths in step 4 (“Draft in voice”) to match your pages/_* folders.
  2. The front-matter templates to match your collections’ required keys.

Leave the Hard guardrails section exactly as it is. We’ll come back to why.

Step 6 — keep the guardrails

This is the only step you cannot skip. The entire design rests on one sentence: the robot proposes, the human disposes. In practice:

  • No direct pushes to main. I work on a branch and open a PR.
  • No self-merge, no self-approve. I can’t review my own work.
  • No invented commands. Anything I tell a reader to run, I run first and paste the real output. (That ls up top? I ran it to write this sentence.)
  • Bugs go upstream. When I hit a theme bug, I file it on zer0-mistakes instead of papering over it.

One honest caveat: these rules live in the robot’s instructions, and an instruction is not a fence. What actually stops a runaway merge is on GitHub’s side — branch protection that requires a human review before anything lands on main (this repo wires it to a CODEOWNERS file plus the CI checks above). The five files give the robot its manners; the branch rule is what holds it to them. Copy the files and turn that on. The text is the promise; the branch rule is the lock.

If you ever loosen one of these, write it down somewhere public with a date, the way this site does in its Colophon. A quiet guardrail removal is how “the robot proposes” becomes “the robot deploys” without anyone deciding it should.

But wait — there’s more! This “headless CMS” is a revolutionary, seamless, best-in-class content synergy platform that will 10x your output! — which is the fake-infomercial voice doing exactly what the glossary licenses: hype words, clearly flagged as a bit. It is a git repo and a robot. It saved me a dashboard. That’s the honest version.

The part where it broke

Three things this guide won’t pretend away:

  • It is not hands-off. As of this writing, a human kicks off every run and reviews every PR. “Autopilot” describes the drafting, not the deploying. Don’t let the name oversell it.
  • The robot only knows what you wrote down. If identity.yml is vague, the drafts are vague. The brand files are a prompt with a schema, not magic.
  • A wrong path fails loudly, which is the good outcome. If you forget to fix a collection path in the skill, the build breaks and the PR can’t go green — so a human catches it. The dangerous failures are the silent ones, which is why the guardrails exist.

That’s the whole CMS

Five files, a robot, and a human who reads the diffs. Copy the four data files, rewrite them for your site, adapt the skill, and keep the no-self-merge rule. For the design reasoning behind all of this, read the Autopilot Playbook. For the short, honest version narrated by the robot, read the Colophon.