Hallmark Catalog Themes vs. Custom Theme Branch: What's the Difference?
Hallmark catalog themes are 20 pre-defined visual systems that rotate automatically, while the custom-theme branch generates made-to-measure palettes and font pairings when a brief signals creative intent.
The Nutlope/hallmark design engine routes every brief through one of two distinct theme pathways. Understanding this architecture helps you predict when Hallmark will apply a ready-made theme versus building a bespoke visual system from scratch.
What Are Hallmark Catalog Themes?
Catalog themes are a fixed collection of 20 named presets (including Specimen, Atelier, Hum, and Carnival). Each bundles three locked attributes: a paper-band, a display-style, and an accent-hue. These values are hard-coded in [site/css/tokens.css](https://github.com/Nutlope/hallmark/blob/main/site/css/tokens.css) and never improvised during generation.
When Catalog Themes Run
According to [skills/hallmark/SKILL.md](https://github.com/Nutlope/hallmark/blob/main/skills/hallmark/SKILL.md), the catalog is the silent default. Hallmark stays in this route unless the brief carries explicit creative-intent signals.
The catalog decision flow works as follows:
- Detect signals — none found → remain in catalog
- Pick a theme from the 20-item list, respecting the diversification rule (must differ from the previous run in at least one axis: paper-band, display-style, or accent-hue)
- Proceed with macrostructure, nav/footer, and enrichment steps
Catalog Theme Limitations
- Never invents new palettes or fonts
- Every color and typeface must reference tokens defined in the catalog
- Slop-test gate 48 rejects any mid-render improvisation
- Theme choice is recorded in
.hallmark/log.jsonastheme: "<name>"
What Is the Hallmark Custom Theme Branch?
The custom-theme branch is a one-off, made-to-measure system that constructs fresh OKLCH palettes and free font pairings per brief. It can operate in two modes:
| Mode | Scope |
|---|---|
| Tuned | Custom palette + fonts applied to Hallmark's existing macrostructures |
| Bespoke | Custom palette + fonts + entirely new page structure |
As documented in [skills/hallmark/references/custom-theme.md](https://github.com/Nutlope/hallmark/blob/main/skills/hallmark/references/custom-theme.md), this route triggers only when the brief meets at least one of five conditions:
- Explicitly asks for a custom look
- Names a brand color
- Supplies a multi-attribute aesthetic unmapped to any catalog theme
- Attaches a moodboard or color swatch
- Requests a completely new structure
Custom Theme Workflow
Hallmark follows a strict six-step protocol:
- Signal detection (conditions above)
- Ask the one-line vibe (4–8 words) plus optional anchor color
- Palette construction: anchor → OKLCH, paper-L band, ink, greys
- Font pairing: any tone-pair, not limited to catalog's fixed sets
- Axis computation: paper band, display style, accent hue recorded for diversification
- Optional bespoke step: design new page layout if structure itself is the ask
Custom Theme Persistence
Unlike catalog themes, custom outputs log their full axis data:
{
"theme": "custom",
"theme_axes": { "paper": "light", "display": "italic-serif", "accent": "chromatic-terracotta" },
"vibe": "archival warmth, hand-set, no varnish"
}
This lets the diversification rule remain theme-route-blind — custom vs. custom must also differ on at least one axis.
Code Comparison: Theme Stamps in Generated CSS
Hallmark writes a diagnostic stamp to the top of every stylesheet. These stamps reveal which route was taken and enable diversification tracking.
Catalog Theme Stamp
/* Hallmark · macrostructure: Marquee Hero · theme: hum
* paper: oklch(96% 0.012 95) · accent: oklch(58% 0.16 95)
* display: Inter Tight · body: Inter · axes: light / geometric-sans / cool
*/
Custom Theme (Tuned) Stamp
/* Hallmark · macrostructure: Long Document
* theme: custom · vibe: "archival warmth, hand-set, no varnish"
* paper: oklch(94% 0.020 65) · accent: oklch(58% 0.16 35)
* display: Fraunces italic · body: Source Serif 4
* axes: light / italic-serif / chromatic‑terracotta
*/
Custom Theme (Bespoke) Stamp
/* Hallmark · macrostructure: Catalogue · route: custom (bespoke)
* theme: custom · vibe: "moss, lichen, soft pink, herbal"
* paper: oklch(96% 0.018 145) · accent: oklch(72% 0.13 350)
* display: Cormorant Garamond · body: EB Garamond
* axes: light / roman-serif / chromatic‑other (dusty‑pink)
*/
These stamps are generated in Step 6 of SKILL.md and later parsed by Hallmark to enforce the diversification rule.
Key Architectural Files
| File | Purpose |
|---|---|
skills/hallmark/SKILL.md |
Central dispatcher — defines when catalog is default and how custom branch invokes |
skills/hallmark/references/custom-theme.md |
Full protocol for custom route (signals, palette construction, axis computation) |
site/css/tokens.css |
Token definitions for all 20 catalog themes |
skills/hallmark/references/themes/<theme>.md |
Individual catalog theme specifications |
.hallmark/log.json |
Rotation log storing theme choices and axes for diversification |
skills/hallmark/references/macrostructures.md |
Index of 21 named macrostructures |
skills/hallmark/references/component-cookbook.md |
Nav/footer archetypes applied after macrostructure selection |
The catalog lives in static token files; the custom logic lives in custom-theme.md and executes dynamically per brief.
Summary
- Catalog themes are 20 pre-defined, hard-coded visual systems that rotate automatically when no creative signals are detected
- Custom-theme branch generates ephemeral, made-to-measure palettes and font pairings only when briefs explicitly signal creative intent
- Both routes enforce universal design disciplines: contrast requirements, banned font restrictions, and no pure
#000/#fffcolors - Diversification rules apply equally: consecutive outputs must differ in at least one axis regardless of route
- Custom themes do not extend the permanent catalog — they are per-output, disposable designs
Frequently Asked Questions
How does Hallmark decide between catalog and custom theme?
Hallmark checks for five signals in every brief: explicit custom requests, brand color names, unmapped multi-attribute aesthetics, attached moodboards, or structural redesign asks. If none appear, it defaults to the catalog rotation. If any appear, it asks a brief follow-up to confirm the custom route before proceeding with palette construction.
Can a custom theme become part of the permanent catalog?
No. Custom themes are ephemeral by design. Each is built per-output from the protocol in custom-theme.md, logged with full axis data for diversification, then discarded. The 20 catalog themes remain the only persistent, named options unless the repository maintainer manually adds new entries to site/css/tokens.css.
What happens if a custom theme fails slop-test gates?
The custom theme branch is still subject to all slop-test gates including contrast validation, banned font detection, and pure black/white prohibition. A generation that violates these rules is rejected and regenerated, just like catalog themes. The "freedom" in custom mode refers only to palette/structure invention, not relaxed quality standards.
How does diversification work across theme routes?
The diversification rule is theme-route-blind. Whether the previous output used catalog theme Hum or a custom "archival warmth" build, the next output must differ in at least one of three axes: paper-band lightness, display style, or accent hue chromaticity. The .hallmark/log.json stores theme_axes for custom entries to enable this comparison.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →