Below is the complete, unedited transcript of the Claude Code session that produced this site — from reading the repository to shipping the docs/ folder, in one sitting.
It is published here in the spirit of the manifesto. The AI was a tool in the toolchain, shown in the open. It is not a co-author. The author is, as ever, the contributing person.
↔ the terminal lines are wide — scroll sideways to read them in full.
Added `claude mcp login <name>` and `claude mcp logout <name>` to authenticate MCP servers from the CLI without opening the interactive `/mcp` menu, with `--no-browser` stdin redirect support for completing over SSH
│
│ ▘▘ ▝▝
│
Added status filtering (press `f`) to the `/workflows` agent detail view
│
│
Opus 4.8 (1M context) with xh… · Claude Max ·
│
Added a "Skills" section to the `/plugin` Installed tab
I now understand the project completely. Let me share an insight before I design, then pull in the frontend-design guidance since a manifesto site lives or dies on its visual conviction.
★ Insight ─────────────────────────────────────
-
The product is an argument, not just a script.
The entire 18-line manifesto already lives inside a
> [!IMPORTANT]
callout in the README. The marketing site's job is to take prose that's currently buried in a code repo and give it the typographic weight of a thesis nailed to a door.
-
The core mechanic is a
rejection
. The hook's whole behavior is: scan a commit message, find an AI
Co-authored-by:
/
Claude-Session:
trailer, and refuse the commit. That gives me a perfect central visual metaphor — a commit message with the AI line being struck out / redacted.
-
Brand signals are already set.
action.yml
declares
color: red
and
icon: git-commit
. I'll honor that: a black/off-white/red palette with a monospace-meets-editorial voice, so the site feels continuous with the tool itself.
─────────────────────────────────────────────────
Let me pull the frontend-design guidance before committing to an aesthetic.
⏺
Skill
(frontend-design:frontend-design)
⎿
Successfully loaded skill
⏺
This is a great brief for a strong, opinionated design. Let me lock my design plan before writing a line of code.
★ Insight ─────────────────────────────────────
-
The typographic concept encodes the thesis.
I'm pairing exactly two voices:
Fraunces
(a characterful optical serif = the accountable
human
) and
IBM Plex Mono
(= the
machine
/ the tooling). Authorship is precisely the boundary between those two — so the type system itself argues the manifesto.
-
One spot color, used literally.
Red isn't decoration here;
action.yml
ships
color: red
and the tool's entire job is the red
-
deletion line of a rejected commit. So red appears
only
where something is being struck out — the same place git itself uses it.
-
Avoiding the AI-design defaults deliberately.
The generic "manifesto" answer is cream + serif + terracotta on a broadsheet. I keep the paper + serif gravitas a manifesto needs, but swap terracotta→git-red and carry all structure on a real
diff/patch
scaffold (line gutters,
-
/
+
marks, hunk headers) — numbering that's true to the content, not decorative.
─────────────────────────────────────────────────
My signature element: a live commit-message card where the AI
Co-Authored-By:
/
Claude-Session:
trailers are struck out as red
-
diff deletions while the human author survives — animating from "✗ rejected" to "✓ accepted." A nice real detail I'll surface: the test suite deliberately
passes
a human named
Claude Shannon
— "blocks the bot named Claude, keeps the human named Claude Shannon."
Let me build it as a single dependency-free
FOUND: /Applications/Google Chrome.app/Contents/MacOS/Google Chrome
exit: 0
total 456
… +3 lines (ctrl+o to expand)
Read
1
file (ctrl+o to expand)
⏺
Strong start — hero, manifesto, and ledger are reading well. Let me capture the lower sections (install, mechanism, closer) to critique those too. I'll render the full page tall and an anchored view of the install section.
done
total 1824
drwx------ 6 adamz wheel 192 Jun 23 20:24 .
… +5 lines (ctrl+o to expand)
Read
1
file (ctrl+o to expand)
⏺
Excellent — the full page flows beautifully end to end. Now let me verify the mobile layout holds up.
Read
1
file (ctrl+o to expand)
⏺
Mobile holds up well — the hero stacks cleanly, the commit card and manifesto reflow correctly. The full design is cohesive across breakpoints. Let me confirm I haven't disturbed the project's own test suite (I only added a file, but worth verifying).
⏺
Bash
(sh tests/run.sh && echo "---git status---" && git status --short)
The "no-toolchain" ethos is honored in the deliverable itself.
This project's whole selling point is "POSIX
sh
+
awk
, no Node/Python/Ruby runtime." So I built the site the same way: one hand-written
index.html
, zero build step, zero dependencies (fonts are the only network call, with full system-font fallbacks). The medium matches the message.
-
Every example on the page is verified against the actual
awk
matcher
, not invented.
Claude Opus 4.8 <noreply@anthropic.com>
normalizes to
claude opus 4 8
and matches the real regex;
Claude Shannon <claude.shannon@example.com>
deliberately does
not
— which is exactly why the test suite uses it as the "human passes" fixture. The site teaches the tool's real behavior.
-
Accessibility was built into the floor, not bolted on:
the animated commit card carries a descriptive
role="img"
+
aria-label
so screen readers get the whole story prose; all motion sits behind
prefers-reduced-motion
; tabs are real
role="tab"
with arrow-key navigation; focus rings are visible in the spot red.
─────────────────────────────────────────────────
What I built
A single-file manifesto marketing site at
site/index.html
(no build, open it directly in a browser).
The design concept
— the type system
is
the argument. Two voices only:
-
Fraunces
(an optical serif) = the accountable
human
-
IBM Plex Mono
= the
machine
/ the tooling
Authorship is precisely the boundary between those two — so the page literally argues the manifesto through its typography. The one spot color,
git-red
, appears
only
where something is struck out (deletion lines, the rejection stamp) — the same place git itself uses red. The structural scaffolding (
@@ why @@
hunk markers,
-
/
+
gutters, line numbers) is a real diff/patch motif, not decoration — numbering that's true to the content.
The sections:
1.
Hero
— headline "No AI co-authors" with a live commit card that animates from
✗ rejected
to
✓ accepted
, striking the
Co-Authored-By: Claude…
and
Claude-Session:
lines as red deletions while the human author survives.
2.
Manifesto
— your full README manifesto, set as a dark proclamation with the pull quote
"The 'author' is, as ever, the contributing person."
3.
What it catches
— a two-column ledger:
Rejected
(real blocked trailers + a chip cloud of ~18 more tools) vs
Kept
, ending on the line
"It blocks the bot named Claude. It welcomes the human named Claude Shannon."
4.
The mechanism
—
sh
+
awk
, caught at commit time, re-enforced in CI.
5.
Install
— tabbed, copy-to-clipboard install paths (pre-commit, prek, Lefthook, GitHub Actions, plain Git, Husky) using the real
1.0.0
-pinned commands from your README.
6.
Closer
—
"Your name is on the commit. Mean it."
I verified it renders correctly at desktop (1440px) and mobile (390px).
To publish it
GitHub Pages can only serve from the repo root or a
/docs
folder on a branch. Two easy options:
-
Zero-config:
rename
site/
→
docs/
, then set Pages → "Deploy from branch →
/docs
".
-
Keep
site/
:
I can add a tiny Pages Actions workflow that uploads
site/
— fits the repo, which already uses Actions.
Want me to rename it to
docs/
, or wire up the Pages workflow?
✻ Worked for 7m 57s
❯
rename it to docs
⏺
I'll rename
site/
to
docs/
so GitHub Pages can serve it with zero config.
⏺
Bash
(git mv site docs 2>/dev/null || mv site docs; ls -la docs && echo "---status---" && git status --short)
⎿
total 40
drwxr-xr-x 3 adamz staff 96 Jun 23 20:23 .
drwxr-xr-x 15 adamz staff 480 Jun 23 20:26 ..
… +3 lines (ctrl+o to expand)
Searched for
1
pattern (ctrl+o to expand)
⏺
Done. The site now lives at
docs/index.html
.
★ Insight ─────────────────────────────────────
-
The rename was free because the site has no internal path coupling.
Every asset is either inlined (CSS, JS, the SVG grain/logo as data URIs) or absolute (Google Fonts CDN). A self-contained single file is portable by construction — moving the folder can't break it.
-
git mv
correctly fell back to plain
mv
here:
git mv
only works on tracked files, and
site/
was never committed. The end state is identical —
docs/
is staged as a new untracked directory, ready to commit.
─────────────────────────────────────────────────
To publish: in the repo's
Settings → Pages
, set
Source: Deploy from a branch
,
Branch:
main
/
/docs
. GitHub will serve the manifesto at
https://goodhatsllc.github.io/no-ai-coauthors/
with no workflow or build step needed.
One small note: your
package.json files
array lists what ships to npm —
docs/
isn't in it, so the marketing site won't bloat the published package. That's the right default; no change needed unless you want it included.
The site is committed-ready whenever you are — I haven't run
git add
/
commit
since you didn't ask. Want me to commit it?
✻ Brewed for 23s
❯
please
⏺
Before I commit — there's a delicious irony to handle correctly here.
★ Insight ─────────────────────────────────────
- This repo is
no-ai-coauthors
— a tool whose entire job is to
reject
Co-Authored-By: Claude…
and
Claude-Session:
trailers. Adding those trailers to a commit here would be self-refuting, and the repo even ships its own
commit-msg
hook that could block it. So this commit will carry
no AI attribution
— which is also consistent with your global "attribution disabled" setting. The project should practice what it preaches.
- Per the safe-git default, I'll branch off
main
rather than commit straight to the default branch, so you keep a review point before it lands.
─────────────────────────────────────────────────
Let me check whether the repo's own hook is active, then branch and commit.
with a verified-clean message. As a final flourish, let me run the project's
own
hook against this very commit message — the tool should approve its own commit.
⏺
Bash
(git log -1 --format='%B' > /tmp/this-commit-msg.txt
if ./hooks/no-ai-coauthors /tmp/this-commit-msg.txt; then…)
⎿
✓ no-ai-coauthors approves its own commit
⏺
The tool approves its own commit — the project eats its own dog food.
Done
The manifesto site is committed on branch
marketing-site
(commit
41a5253
,
docs/index.html
, +796 lines), with a deliberately clean message — no
Co-Authored-By: Claude…
, no
Claude-Session:
, consistent with both your global "attribution disabled" setting and the project's entire reason for existing.
State:
- Branch:
marketing-site
(one commit ahead of
main
)
-
main
is untouched — your review point is preserved
- Tests pass; the hook approves its own commit
The one remaining step is yours to choose.
GitHub Pages serves from
main /docs
, so the site won't go live until this lands on
main
. To merge it locally:
git switch main && git merge --ff-only marketing-site
Then push, and set
Settings → Pages → Deploy from a branch →
main
/
/docs
.
Want me to merge it into
main
for you, or leave the branch as-is for you to review and merge?
✻ Worked for 1m 8s
❯
please merge to main
⏺
I'll merge
marketing-site
into
main
with a fast-forward.
⏺
Bash
(git switch main && git merge --ff-only marketing-site
echo "--- result ---"…)
⎿
Switched to branch 'main'
Your branch is up to date with 'origin/main'.
Updating b70396b..41a5253
… +11 lines (ctrl+o to expand)
⏺
Merged cleanly into
main
via fast-forward —
main
is now at
41a5253
and includes
docs/index.html
.
Current state:
- ✅ On
main
, history is linear (no merge commit)
- 📤
main
is
ahead of
origin/main
by 1
— not yet pushed
- 🌿 The
marketing-site
branch still exists locally (now redundant, fully merged)
To go live, two things remain — both yours to authorize:
1.
Push
so the commit reaches the remote (Pages serves from the remote
main
):
git push origin main
2.
Enable Pages:
Settings → Pages → Deploy from a branch →
main
/
/docs
→ the site appears at
https://goodhatsllc.github.io/no-ai-coauthors/
.
Want me to
push to
origin/main
now, and
delete the leftover
marketing-site
branch
? I'll hold on both until you say so, since pushing is outward-facing.
✻
Sautéed for 18s
❯
yes
⏺
I'll push to
origin/main
and delete the merged
marketing-site
branch.
⏺
Bash
(git push origin main
echo "--- delete merged branch ---"…)
⎿
To github.com:GoodHatsLLC/no-ai-coauthors.git
b70396b..41a5253 main -> main
--- delete merged branch ---
… +5 lines (ctrl+o to expand)
⏺
Done — pushed and cleaned up.
- 📤
Pushed:
b70396b..41a5253 main -> main
—
docs/index.html
is now on
origin/main
- 🌿
Deleted
the merged
marketing-site
branch
- ✅ Working tree clean;
main
is in sync with
origin/main
One step left, and it's in the GitHub UI (I can't do it for you):
Settings → Pages →
Source: Deploy from a branch
→
Branch:
main
/
/docs
→ Save.
The manifesto will publish at
https://goodhatsllc.github.io/no-ai-coauthors/
(first build takes a minute or two). If you'd rather serve it from a custom domain or via a Pages Actions workflow instead of the branch source, I can wire that up.
Fitting close: the commit that ships a site arguing
against
AI co-author bylines carries none itself — and the project's own hook signed off on it.