A skill your agent uses when the words span a marketing surface — value proposition, section copy, microcopy, launch and email sequences, channel adaptation, SEO-aware structure — grounded in the…
Install the "marketing" agent skill from https://github.com/ericrisco/rsc-harness/tree/main/skills/marketing into .claude/skills/marketing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "marketing", then confirm the skill loads.
Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
Type this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
skills CLI
$ npx skills add ericrisco/rsc-harness --skill marketing -a codex
Project install goes to .agents/skills/; add -g for ~/.codex/skills/.
Install the "marketing" agent skill from https://github.com/ericrisco/rsc-harness/tree/main/skills/marketing into .agents/skills/marketing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "marketing", then confirm the skill loads.
Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
skills CLI
$ npx skills add ericrisco/rsc-harness --skill marketing -a cursor
Project install goes to .agents/skills/; add -g for ~/.cursor/skills/.
Install the "marketing" agent skill from https://github.com/ericrisco/rsc-harness/tree/main/skills/marketing into .cursor/skills/marketing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "marketing", then confirm the skill loads.
Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
skills CLI
$ npx skills add ericrisco/rsc-harness --skill marketing -a gemini-cli
Project install goes to .agents/skills/; add -g for ~/.gemini/skills/.
Install the "marketing" agent skill from https://github.com/ericrisco/rsc-harness/tree/main/skills/marketing into .gemini/skills/marketing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "marketing", then confirm the skill loads.
Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
Installs for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
skills CLI
$ npx skills add ericrisco/rsc-harness --skill marketing -a github-copilot
Project install goes to .agents/skills/; add -g for ~/.copilot/skills/.
Install the "marketing" agent skill from https://github.com/ericrisco/rsc-harness/tree/main/skills/marketing into .github/skills/marketing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "marketing", then confirm the skill loads.
GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
skills CLI
$ npx skills add ericrisco/rsc-harness --skill marketing -a opencode
OpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
Install the "marketing" agent skill from https://github.com/ericrisco/rsc-harness/tree/main/skills/marketing into .opencode/skills/marketing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "marketing", then confirm the skill loads.
OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
Facts
Skill name
marketing
GitHub stars
167
Token cost
~3.7k tokens
SKILL.md length
1,855 words
Files
10 (incl. scripts, references)
Skills in repo
227
Repo updated
First seen
Licence
MIT
At a glance
A skill your agent uses when the words span a marketing surface — value proposition, section copy, microcopy, launch and email sequences, channel adaptation, SEO-aware structure — grounded in the…
Works in 4 steps: Locate the brand study. Read the… → Check completeness against the checklist… → If ABSENT or INCOMPLETE, STOP and… → …
The words span a marketing surface — value proposition
SKILL.md covers Brand grounding (read this…, Copy workflow (the one pass), Headlines & value proposition… and Landing copy by section, plus 5 more sections
Runs Python and Shell scripts from its folder; calls python3
What it does
Marketing is an agent skill from ericrisco/rsc-harness. Use when the words span a marketing surface — value proposition, section copy, microcopy, launch and email sequences, channel adaptation, SEO-aware structure — grounded in the brand study, which it stops and builds if missing. NOT one conversion page (that is landing-copy), NOT tone rules (that is brand-voice), NOT pixels (that is design).
Its SKILL.md is about 3.7k tokens, which your agent loads only when the skill is triggered. The skill folder holds 12 other files, including scripts and reference files (for example `evals/README.md`, `evals/cases.yaml` and `references/brand-grounding.md`).
It sits in Writing & Content, covering Positioning and messaging, Brand voice and tone and Email marketing. The repository describes itself as: Your agent invents things because it has no memory, and can't touch your database because it has no arms. rsc is the meta-harness that gives it both, plus the trade to know the… The licence is MIT.
When your agent uses it
The words span a marketing surface — value proposition
Launch and email sequences
Channel adaptation
SEO-aware structure — grounded in the brand study
Example prompts
“/marketing”
Requirements
Python 3
A Bash shell
Workflow steps
4 steps, taken from the first numbered list in SKILL.md.
1Locate the brand study. Read the project's root CLAUDE.md and look for a ## Brand & voice section linking into 02-DOCS/wiki/brand/ (the…
2Check completeness against the checklist in references/brand-grounding.md. The study is complete only when every dimension is filled…
3If ABSENT or INCOMPLETE, STOP and interview the user. Ask the targeted questions from references/brand-grounding.md, one focused batch at…
4Only once the study exists and is complete, proceed. Cite which brand articles you used (e.g. "grounded in…
What it can do on your machine
Read from SKILL.md and the folder at commit e3d5b33. It shows what the files ask for, not the result of running them.
Tool permissions
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Runs code
Ships 2 files in scripts/ (Python and Shell), which the agent can run.
Shell commands in SKILL.md call:
python3
From the folder's file list and the shell code blocks in SKILL.md.
Network
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Credentials
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Context cost
Marketing loads about 3.7k tokens when it runs, and up to ~17k if it reads all its reference files. Until then it costs about 89 tokens; SKILL.md has 1,855 words of instructions outside code blocks.
Always· name and description, kept in context so the agent knows when to use it
~89
When it runs· the whole SKILL.md, loaded when a task matches
~3.7k
With references· SKILL.md plus every file in references/, read only if the agent opens them
~17k
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
Safety
Auto-check passed
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); the scripts in this folder are not scanned.
Download SKILL.mdSave it as .claude/skills/marketing/SKILL.md (or your agent's skills folder). This skill also uses 9 other files; get the full folder from GitHub.
name
marketing
description
Use when the words span a marketing surface — value proposition, section copy, microcopy, launch and email sequences, channel adaptation, SEO-aware structure — grounded in the brand study, which it stops and builds if missing. NOT one conversion page (that is `landing-copy`), NOT tone rules (that is `brand-voice`), NOT pixels (that is `design`).
tags
marketing, copywriting, landing, content
recommends
presentations, design
origin
risco
Marketing — Conversion Copy for Landings & Web Pages
The words, not the pixels. Ground in the brand study first, then write copy that is specific, benefit-led, and unmistakably this brand.
This skill owns conversion copywriting: value proposition, headlines, section-by-section landing copy, microcopy, CTAs, email/launch sequences, channel adaptation, and SEO-aware copy structure. The sibling design skill owns the visual/UX (type, color, layout, motion); nextjs owns the build — including rendering in React the Metadata and JSON-LD this skill specifies. Long-form articles, blog posts, or social content systems with no landing/web surface are a content job, not landing copy. When asked for "a landing page", you write the copy.
Brand grounding (read this first)
Hard rule: never produce landing, web-page, or marketing copy without a complete brand study. Generic copy is the failure mode this skill exists to prevent, and the cure is grounding every word in a real, persisted brand profile. An incomplete brand study is a hard STOP, not a warning.
Run this gate before writing a single line of copy:
Locate the brand study. Read the project's root CLAUDE.md and look for a ## Brand & voice section linking into 02-DOCS/wiki/brand/ (the harness Karpathy-wiki convention: compiled brand articles live under 02-DOCS/wiki/brand/, raw inputs the user pastes live under 02-DOCS/raw/brand/). If CLAUDE.md is absent, the link is missing, or it points nowhere, treat the study as ABSENT.
Check completeness against the checklist in references/brand-grounding.md. The study is complete only when every dimension is filled: brand name & one-line positioning; ICP / audience & their pains & desires; value proposition & differentiation; tone & voice WITH do/don't word lists and 3–5 voice samples pasted from the user's real writing; proof/credibility; offers & primary CTA; channels; SEO keywords. Any empty dimension = INCOMPLETE.
If ABSENT or INCOMPLETE, STOP and interview the user. Ask the targeted questions from references/brand-grounding.md, one focused batch at a time (do not dump all questions at once; ask, wait, then continue). Voice samples are mandatory — request 3–5 pieces of the user's real writing; never fabricate a voice. Then:
a. Write/update the brand study into 02-DOCS/wiki/brand/ as wiki articles (one article per dimension or a single index.md plus per-dimension articles), following the wiki article format in references/brand-grounding.md, and index it in 02-DOCS/wiki/index.md (the Knowledge map). Save any raw text the user pastes verbatim into 02-DOCS/raw/brand/ and link to it from the article's > Raw: line. Create the directories if they do not exist.
b. Add or update a ## Brand & voice section in the root CLAUDE.md linking to the brand study — a short pointer only. Create CLAUDE.md if absent (additive only — never delete existing sections). The exact snippet to insert is in references/brand-grounding.md.
Only once the study exists and is complete, proceed. Cite which brand articles you used (e.g. "grounded in 02-DOCS/wiki/brand/value-proposition.md and voice.md") so the user can trace every claim back to the study. Every line you then write must plausibly come from the brand's own writing; if it reads like a different author, rewrite.
If the user explicitly says "skip the brand study, just draft something rough", you may produce a clearly-labelled DRAFT (ungrounded — not brand-checked) and still recommend running the gate before anything ships. That is the only exception, and it must be labelled.
Full completeness checklist, the exact question script (batched), and the persistence format → references/brand-grounding.md.
Copy workflow (the one pass)
Run in order. Each step feeds the next; skipping one shows up as vague copy downstream.
Ground. Pass the brand-grounding gate. Load value prop, ICP, voice, proof, offer, channels, keywords from 02-DOCS/wiki/brand/.
Lock the value proposition. Fill the value-proposition canvas (jobs / pains / gains → pain-relievers / gain-creators → headline). → references/copy-frameworks.md.
Pick the framework by traffic temperature and funnel position: PAS for pain-aware cold traffic; AIDA for broad top-of-funnel; FAB/JTBD for feature → benefit; BAB for transformation/case-study. → references/copy-frameworks.md.
Write section by section. Each landing section has one job and one framework. Map your copy to the design skill's section anatomy. → references/landing-copy.md.
Write the microcopy and CTAs. One primary CTA per viewport — choice kills conversion — with a value verb on the button ("Start free", not "Submit"), reassurance under it ("No credit card required"), and human empty/loading/error states. → references/copy-frameworks.md.
Adapt for channels if the task spans more than the page (email sequence, launch, X/LinkedIn/newsletter). → references/campaigns-and-channels.md.
Run the QA gate (below) and scripts/verify.sh. Fix every flag or justify it.
Headlines & value proposition in 60 seconds
The headline is the highest-leverage copy on the page. Build it from the canvas, not from a thesaurus. It has one test: a stranger reads the hero and can say what it is, who it's for, why it's better — within 5 seconds. If it fails, rewrite it before anything else on the page.
text
VALUE-PROP CANVAS (fill before writing the headline)
Customer job ....... the outcome they're hired to achieve
Top pain ........... the friction that blocks the job today
Top gain ........... what "great" looks like to them
Pain reliever ...... how the product removes that friction
Gain creator ....... the upside the product unlocks
Headline ........... compress the strongest reliever+gain into one line
Subhead ............ who it's for + how it works in one clause + proof if you have it
Headline formula slots (pick one, fill with brand specifics):
Outcome + timeframe — "Preview every branch in 30 seconds".
X without Y — "Live previews without a staging queue".
JTBD — "When you open a PR, get a live URL automatically".
Specificity — replace an adjective with a number. "Fast" is a claim; "30 seconds" is evidence: "Cut review setup from 20 min to 30 sec".
text
Bad — "Revolutionize your workflow with our seamless, cutting-edge platform"
Good — "Ship a fix in 4 minutes — no YAML, no on-call page"
Full canvas walk-through, PAS/AIDA/FAB/BAB/JTBD with Bad→Good rewrites, headline formulas, microcopy & CTA tables → references/copy-frameworks.md.
Landing copy by section
Each section earns its place by doing one job. Cut any section with no job. This maps 1:1 to the design skill's section anatomy — design owns the visual treatment, this skill owns the words inside it. Within every section, climb feature → benefit → proof, stop at the rung the reader cares about (the benefit), and back it with proof.
Section
Copy job
Framework
Hero
State the value prop; pass the 5s test
Outcome + timeframe headline
Social-proof strip
Borrow credibility instantly
Quantified, attributed
Problem / agitation
Name the pain in the reader's words
PAS
Solution
Show the product doing the job
FAB
Features → benefits
Translate each capability into an outcome
FAB / JTBD per item
Objection handling
Preempt the top reason not to buy
"X without Y"
Pricing
Make the choice easy; frame value
Value framing, anchored
FAQ
Answer the real blockers
Question → direct answer
Final CTA
One action, value on the button
CTA verb + reassurance
text
Bad (features list) — "Includes automated teardown, RBAC, and audit logs."
Good (benefit-led) — "Environments tear down on merge, so you never pay for idle infra
or clean up by hand."
When the task is bigger than the page — a launch, an email sequence, cross-channel messaging. One claim per asset: a post, an email, a section each carry one real claim, not five hedged ones.
Email sequences: welcome email inside 5 minutes of opt-in (highest open rate of the whole flow); 4-touch starter cadence Day 1 welcome → Day 4 educational → Day 8 case study → Day 12 soft pitch; nurture runs 7–10 emails every 1–2 weeks. One purpose per email. Hold promo language ("free", "limited time") out of early emails to protect deliverability and trust.
Launch: sequence the beats (tease → reveal → proof → urgency → recap), one claim per beat, every claim traceable to the brand study's proof.
Channel adaptation: adapt the format to the platform, never resize the same copy. X opens with the sharpest claim; LinkedIn expands just enough for outsiders; newsletter does real work in the first screen.
Keep copy SEO-aware by default: one <h1>, scannable subheads that answer queries, benefit in the
first 160 chars. Keyword stuffing lowers AI citation. When the task is the visibility layer itself
— ranking on Google/Bing and getting cited by AI engines — go to references/seo-geo.md. It owns
technical + on-page SEO, JSON-LD schema, per-engine GEO, and keyword/SERP research.
SEO = rank in traditional results (Google, Bing). GEO (Generative Engine
Optimization) = get cited inside an AI answer (ChatGPT, Perplexity, Gemini/AI Overviews,
Claude, Copilot). GEO sits on top of SEO; do both.
The insight that reframes it: AI engines don't rank pages, they cite sources. Being one of
the few sources an answer is built from is the new "ranking #1" — you optimize to be quoted and
attributed, not clicked.
GEO and this skill agree. The top GEO moves (Princeton, KDD 2024) are cite sources, add
statistics, add quotations, authoritative tone — the same "specificity beats adjectives, no
invented proof, one claim per asset" discipline this skill enforces everywhere else. Keyword
stuffing lowers AI citation (~−10%). The proof rule is absolute: never fabricate the stat or
quote that earns the lift — mark [[NEEDS PROOF]] and source it.
Audit first, free, no API:python3 scripts/seo_audit.py "https://yoursite.com" reports
title/description lengths, single-<h1>, JSON-LD count, load time, robots/AI-bot access, sitemap.
Crawler reality (2026):OAI-SearchBot/Claude-SearchBot/PerplexityBot (+ the *-User
fetchers) earn citations; GPTBot/ClaudeBot are training crawlers — independently
controllable. INP replaced FID in Core Web Vitals (Mar 2024; ≤ 200 ms good).
Full GEO method table, robots.txt template, schema library, per-engine factors, keyword workflow,
and SEO/GEO QA gate → references/seo-geo.md. Implementing schema/Metadata in code → nextjs.
The ban-list
State once, enforce everywhere. These are defects, not style: they signal AI-template copy and erode trust. scripts/verify.sh greps for them.
revolutionary · game-changer · cutting-edge · world-class · unlock · seamless · elevate · supercharge · next-level · "In today's landscape" · "In today's fast-paced world" · bait questions ("Tired of slow deploys?") · "not X, just Y" / "not just X" · forced lowercase as a style · "Excited to share" · hollow proof ("thousands trust us") · generic CTAs ("Learn more", "Click here", "Submit") · fake urgency with no real deadline.
text
Bad — "Excited to share our game-changing, world-class platform!"
Good — "We rebuilt deploys around one CLI step. Here's what changed: 22 min → 90 sec."
The brand study's do/don't word lists EXTEND this list per project — always apply both.
Anti-patterns
Anti-pattern
Why it fails / the fix
Skipping the brand study because "I know the brand"
Your default voice is AI-median. Run the gate; cite the articles.
Leaning on the image and letting the copy stay vague
Copy carries the value prop. Pass the 5s test in words.
Reaching for adjectives to sound premium
They make it sound generic. Replace with a number or mechanism.
Listing every feature "so they see the value"
Feature dumps bury the benefit. Climb to benefit, back with proof.
Dropping in any testimonial to fill the proof slot
A vague rave < one hard number. Quantify and attribute.
Five CTAs "to give them options"
Choice kills conversion. One primary action per viewport.
Hype words because "they test well"
They erode trust and trip the ban-list. Specificity converts.
Inventing a plausible metric to fill a gap
Never. Mark [[NEEDS PROOF]] and ask the user.
Reusing the same copy on X and LinkedIn
Resize ≠ adapt. Different format per platform, same claim.
Copy QA gate
Run before claiming done. scripts/verify.sh automates the greppable subset.
Brand study located, complete, and cited (which articles grounded this copy).
Hero passes the 5-second test (what / who / why-better legible fast).
Exactly one <h1>; subheads scannable and query-answering.
Every claim is specific (number / mechanism / receipt), not an adjective.
Copy climbs feature → benefit → proof; lands on the benefit.
One primary CTA per viewport; value on the button; reassurance microcopy present.
One claim per asset — no post, email, or section carrying five hedged ones.
No invented proof; every gap marked [[NEEDS PROOF]].
Voice matches the brand study's samples and do/don't lists.
Ban-list words absent (global list + brand don't-words).
No passive-voice hedging or weasel words where a direct claim belongs.
Email subjects match the body (no bait-and-switch); promo language held out of early emails.
Channel copy adapted per platform, not resized.
Title 50–60 chars, meta description 120–160, benefit in the first 160 chars.
Automate → scripts/verify.sh (read-only grep gate; warns by default, --strict to gate CI).
Marketing next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
Draft marketing content in brand voice — blog posts, ad copy, email sequences, social posts, landing pages, and brand-voice guides — through a gated pipeline (research, outline, draft, fact-check…
Given a product description, category keywords, or competitor names (any combination), searches Reddit, Hacker News, GitHub Issues, G2, and Google Trends for the real pains your market experiences…
Apply David Ogilvy's advertising principles when writing or reviewing copy, headlines, product descriptions, landing pages, ads, emails, or any persuasive text.
A skill your agent uses when designing or analyzing a controlled experiment — falsifiable hypothesis, sample size from an MDE, reading significance/CI/power, CUPED, or rescuing tests that won't go…
A skill your agent uses when making a web UI conform to WCAG 2.2 Level AA — axe-core or Lighthouse a11y violations, keyboard operability, focus management, ARIA roles/names/live regions, contrast…
A skill your agent uses when running or fixing paid acquisition on Google or Meta — campaign structure (Performance Max, Demand Gen, Search, Advantage+), platform-fit creative, budget/scaling rules…
A skill your agent uses when measuring whether an LLM or agent system actually got better and gating merges on it: golden sets, fixing an inflated LLM-as-judge, scoring RAG (faithfulness, contextual…
A skill your agent uses when a creative goal must become a finished media file: pick and order generative-media models per modality — AI voiceover, image-to-video clips, score — then glue them with…
A skill your agent uses when instrumenting product or web analytics — GA4/PostHog SDK wiring, event taxonomy, funnels, double-counted events, consent gating, PII scrubbing.
A skill your agent uses when the words span a marketing surface — value proposition, section copy, microcopy, launch and email sequences, channel adaptation, SEO-aware structure — grounded in the…. Marketing is an agent skill from ericrisco/rsc-harness. Use when the words span a marketing surface — value proposition, section copy, microcopy, launch and email sequences, channel adaptation, SEO-aware structure — grounded in the brand study, which it stops and builds if missing.
When should I use Marketing?
Marketing fits situations like: the words span a marketing surface — value proposition; launch and email sequences; channel adaptation; SEO-aware structure — grounded in the brand study.
How do I install Marketing in Claude Code?
Run `npx skills add ericrisco/rsc-harness --skill marketing -a claude-code`. Or copy the skill folder (skills/marketing in ericrisco/rsc-harness) into .claude/skills/marketing in your project. Claude Code loads it when a task matches its description.
How do I install Marketing in Codex?
Run `npx skills add ericrisco/rsc-harness --skill marketing -a codex`. Or copy the skill folder (skills/marketing in ericrisco/rsc-harness) into .agents/skills/marketing in your project. Codex loads it when a task matches its description.
Can I use Marketing in Cursor, Gemini CLI or GitHub Copilot?
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add ericrisco/rsc-harness --skill marketing -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/marketing, .gemini/skills/marketing, .github/skills/marketing and .opencode/skills/marketing in your project.
What does Marketing need to run?
Going by SKILL.md and its folder, Marketing needs Python and a shell for the scripts in its folder and the command-line tools its instructions call (python3). Our summary lists: Python 3; A Bash shell.
Does Marketing access the network?
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Is Marketing safe to install?
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.
What licence does Marketing use?
Marketing is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
How many tokens does Marketing use?
About 3.7k tokens (SKILL.md is roughly 15k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 14k tokens, read only when the agent opens those files.
What are the alternatives to Marketing?
Skills that share tags, products or a category with Marketing: Content Engine (indranilbanerjee/digital-marketing-pro, 855 stars), Marketing Campaign (affaan-m/ECC, 275k stars), Marketing Os (Yuzzyuk/marketing-os, 536 stars) and Hormozi Ad Factory (pedronauck/skills, 634 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
Who maintains Marketing?
ericrisco (a GitHub user) maintains it in ericrisco/rsc-harness, which has 167 GitHub stars. The repository holds 227 skills in this directory. The repository was last updated on October 7, 2026.
Source: ericrisco/rsc-harness on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.