Four things the last pass left open. Reflex findings no longer masquerade as Floor failures. They report at a new REFLEX grade which still blocks, so nothing drifts silently, but "0 FAIL" is now a true statement about the floor even while a build owes an argument above it. Across every committed page that distinction turns 230 reported failures into 56 real Floor findings and 174 arguable ones, which is the number that was hiding. The waiver cap is gone. Three-per-artifact was the restraint the tier existed to remove: a colour-field poster that wants a black stage, achromatic neutrals, a long measure and one face doing everything is right, and it was being blocked for being expressive. Guards, reason quality and the log are what keep waivers honest. Past three the build gets a NOTE saying what it now is, a house style rather than a set of exceptions, and pointing at design.md. The Floor has two admission criteria instead of one embarrassed exception. Door 1 is "no admired page breaks this on purpose". Door 2 is a named house rule where admired pages do break it but a language model reaches for it unprompted on every section. Gate 54 is the only member, listed in a table that any future addition has to join explicitly. The apology is gone; the reasoning is in the file. Finish findings gained a record form. `answered <check> · <reason>` parses, so a build that reasons its way past gate 38 leaves something the next run can read instead of prose in a comment. Also: the skill stops mandating em and en dashes in page copy, which had it arguing with its own house rule. The Picks block and the Step 5 preview merge into one recital, since the same decisions were being serialised four times. The font catalog and the per-tone voice samples become skip-unless-needed, roughly 200 lines a build. Two waiver bugs found by a cold build are fixed: "intentional design choice" was passing the boilerplate test, and a malformed two-field waiver was being ignored in silence. The 18 hero captures and 14 gallery thumbnails are regenerated against the live pages, so the README and the homepage stop advertising eyebrows the skill bans.
Hallmark
A design skill for Claude Code, Cursor, and Codex that refuses to look AI-generated.
Live demo → · twenty-four themes · five verbs · press T to cycle.
Made by Together AI.
Hallmark holds a hard floor and then gets out of the way. It dresses the brief in one of twenty-four themes, runs a fifty-eight-gate slop test plus a pre-emit self-critique, and refuses the on-distribution defaults every LLM was trained into.
Thirty-four of those gates are a floor: contrast, focus order, reduced motion, invented metrics, layout that breaks on a phone, and the eyebrow above the heading. Nothing ships through them. Eighteen are reflex gates, the defaults a language model falls into rather than laws, and a build with an argument can overrule one on the record, with the reason named in the CSS stamp and the guard re-derived by the checker. There is no cap on how many: a colour-field poster that wants a black stage, achromatic neutrals and one face doing everything is allowed to say so and ship. The last six are polish and bookkeeping and never block a ship.
Two pages by Hallmark for two different briefs feel like different sites, not colour-swaps of the same template. The skill is built to stop a model looking generic, not to stop it being good.
Five verbs
| Verb | What it does |
|---|---|
| (default) | Build new UI. Picks a macrostructure, applies the rule-set, runs the slop test before handing back. |
hallmark audit <target> |
Score existing code against the anti-patterns. Punch list, no edits. |
hallmark redesign <target> |
Throw out the structure, keep copy + IA + brand, rebuild with a different fingerprint. |
hallmark study <screenshot | URL> |
Extract the DNA from a design you admire: macrostructure, type-pairing, colour anchor. Refuses pixel-clones and paid templates. Optionally emits a portable design.md for handoff to other AI tools. |
hallmark variants <brief> |
Three structurally distinct directions for one brief, rendered live. Flip through them in a picker over your own localhost, pick one, keep building. |
Different briefs, different shapes
Each generated from a different brief. The skill picks the theme, structure, and craft to fit each one, not from a template.
Each page is self-contained HTML + CSS, stamped with its macrostructure in the CSS comment. Browse the full set at usehallmark.com or under site/_tests/.
Custom
When a brief carries creative intent that no catalog theme fits, Hallmark switches to Custom and designs the page from scratch: a made-to-measure palette, type, and layout. Same fifty-eight gates at the same tiers, no template underneath.
In v1.2 the custom route runs a full art-direction ritual: it names and rejects the category's reflex aesthetics, writes a slate of seven grounded directions, and a deterministic draw (scripts/seed.mjs) picks which one gets built, sometimes dealing wildcards from a design-history atlas. A scene sentence sets the light, a colour posture (Restrained · Committed · Full palette · Drenched) sets how far the palette commits, and a five-block direction contract written into the artifact gets audited promise by promise before shipping.
![]() |
![]() |
| The Cascadia Nightjar Sleeper-train ticket · Custom |
The Mend Assembly Repair-café broadsheet · Custom |
It stays a quiet branch; vanilla briefs never see it. The protocol lives in custom-theme.md.
Variants NEW
hallmark variants <brief> runs the ceremony once, then builds three structurally distinct directions (different macrostructure, theme, nav, footer) and serves a local picker to flip between them and choose. v2 makes it fast and smooth: the picker opens immediately and fills progressively (you evaluate direction 1 while 2 and 3 finish), directions generate in parallel at sketch depth by default (only the winner completes to full), the grid shows screenshot thumbnails (so it survives dev servers that block iframes), and the verdict can be compositional ("direction 2, but the pricing from 3" grafts that section in). After the pick you can zoom to riff a single section, every round is logged to .hallmark/variants/<run>/decisions.md, and in a Vite/Astro/SvelteKit app a dev-only overlay previews each direction in place. No Node? A static compare page and a chat reply ("pick 2") always work.
One skill, three harnesses NEW
Hallmark is tuned for the three terminals where design work actually happens: Claude Code, Codex CLI, and OpenCode. One shared core (the same SKILL.md, references, gates, and scripts everywhere), plus a per-harness adapter each harness loads on its own: Claude Code runs the skill natively (hooks, subagents, preview pane); Codex reads harnesses/codex.md (sandbox and approval behaviour, sequential variants, $hallmark invocation); OpenCode reads harnesses/opencode.md (permission model, parallel variants via its subagents). The mechanically checkable gates live in a zero-dependency checker every harness can run:
node skills/hallmark/scripts/sloplint.mjs <file-or-dir> --genre <genre>
One command installs a lean copy (skill + references + scripts, ~1.5 MB, never the marketing site) everywhere it belongs:
node skills/hallmark/scripts/install.mjs
| Harness | Install location | Invoke |
|---|---|---|
| Claude Code | ~/.claude/skills/hallmark |
/hallmark <brief> or just describe the build |
| Codex CLI | ~/.agents/skills/hallmark (legacy ~/.codex/skills refreshed too) |
$hallmark <brief> or implicit |
| OpenCode | auto-discovers the copies above via its compatibility paths | /hallmark <brief> or implicit |
The installer detects which harnesses exist, replaces stale copies atomically, and --remove undoes everything.
Edit-time linting NEW
By default the slop test runs once, at the end. On Claude Code you can move it to the keystroke: a PostToolUse hook lints every .html/.css Hallmark artifact the moment it is written and feeds any failures back to the model advisorily, so slop gets fixed while the context is small instead of in a big end-of-run pass.
node skills/hallmark/scripts/install-hook.mjs
--global targets ~/.claude/settings.json (all projects); --print shows the settings block without writing; --remove undoes it. The hook is advisory only: it never blocks or reverts a write, no-ops silently on non-artifacts, and the Step 7 sweep still runs regardless. It is Claude-Code-only (Cursor/Codex have no hook surface and rely on Step 7).
Install
npx skills add nutlope/hallmark
Re-run any time to update. Or copy SKILL.md + references/ into:
- Claude Code:
~/.claude/skills/hallmark/ - Cursor:
.cursor/rules/hallmark.mdc(body ofSKILL.md, no frontmatter; this channel ships no scripts, sovariantspicks by chat reply and the slop test runs fully model-judged) - Codex:
~/.codex/skills/hallmark/(personal) or.codex/skills/hallmark/(project-scoped)
The rule-set lives in SKILL.md and references/. Worked examples in docs/recipes.md and docs/study-examples.md.
Licence
MIT. Use it, fork it, ship it.














