THE GUIDE•HOW THIS PAGE WAS SET•THREE PASSES, LOGGED HONESTLY•NO FRAMEWORK, NO BUILD STEP•EVERY ENGRAVING IS SVG•EST. 2026•
THE GUIDE•HOW THIS PAGE WAS SET•THREE PASSES, LOGGED HONESTLY•NO FRAMEWORK, NO BUILD STEP•EVERY ENGRAVING IS SVG•EST. 2026•
Vol. I · No. 47The SupplementFree with every edition
TheGuide
Set by handHow this page was made, and by whom.Printed without a framework
A newspaper is a design system that survived 300 years without a component library. This is what it took to run one as a SaaS front page.
1
The concept
Broadsheet is fiction. It's a newsletter platform for writers who want a publication, not a profile: an editor that respects the sentence, delivery you can set a watch by, and a subscriber list you own outright. The product had to stay legible as software while the page pretended to be Tuesday's paper.
That tension set the art direction. A newspaper front page is already a masterclass in hierarchy: a masthead you read once, a dateline that tells you where you are, department rules that split the page into places, and columns that make dense text easy. Every one of those maps onto something a landing page needs. The masthead became the logo. Departments became sections. The rate card became pricing. The ledger became the feature demo.
Colors are printing constraints, not decoration. Newsprint (#F6F1E7) is the field, and it covers roughly 90% of the page. Iron gall ink (#1A1611) does the type and every rule. Oxblood (#7A1F1F) is the second ink a small press could afford, so it's rationed: drop caps, section kickers, the ledger's last reading, one pricing tier. A faded rule (#C9BFA8) handles the hairlines that would print light. Four colors, and each one has a job.
Type follows the same logic. Playfair Display carries the masthead and headlines because its high contrast reads like Didone display cuts. Spectral sets the body because it holds up justified at small sizes, which is the whole point of a column. IBM Plex Mono handles bylines, captions, folios, and the ticker, standing in for the utilitarian type a paper uses for its furniture.
Motion is deliberately restrained. Paper doesn't bounce. Rules draw themselves left to right the way a press lays ink, illustrations develop from halftone dots into sharp line work, and the ledger's line inks in over 1.3 seconds. The only continuous motion is the edition ticker, and it pauses when you hover. Everything folds flat under prefers-reduced-motion.
2
Technique breakdown
Real newspaper columns
CSS multi-column · hyphens · drawn rules
The lead story is one element in CSS columns with justified text and browser hyphenation on, which is what stops justification from tearing rivers through the copy. The column rules aren't borders: they're absolutely positioned spans placed with the same math the column algorithm uses, so they scale into 2 columns and then 1 without ever landing in the wrong place. Each one draws itself downward on reveal.
/* column count lives in a custom property so the rules can do the math */
.story-cols { --n: 3; --cgap: 2.6rem;
columns: var(--n); column-gap: var(--cgap);
text-align: justify; hyphens: auto; -webkit-hyphens: auto; }
.story .vr-1 { left: calc((100% - (var(--n) - 1) * var(--cgap)) / var(--n) + var(--cgap) / 2); }
.story .vr-2 { left: calc(2 * (100% - (var(--n) - 1) * var(--cgap)) / var(--n) + 1.5 * var(--cgap)); }/* rules draw top-to-bottom when the story scrolls in */
.js .story .vr { transform: scaleY(0); transform-origin: top;
transition: transform 1.15s var(--ease-draw) .2s; }
.js .story.in .vr { transform: scaleY(1); }/* drop cap + wire-copy first line, no extra markup */
.story-cols .dropcap::first-line { text-transform: uppercase; letter-spacing: .07em; }
.dropcap::first-letter { font: 9004.05em/.76 var(--disp); float: left;
padding: .08em.14em00; color: var(--ox); }
Halftone illustrations that sharpen
SVG pattern fills · two-layer crossfade
Every illustration is two stacked groups in one SVG: a tone layer filled with a rotated dot pattern, and a line layer of hand-plotted paths. On reveal the tone comes up and the lines fade in behind it. On hover the tone drops back and the lines go fully black, so the drawing appears to resolve from newsprint dots into engraved line work. It costs two opacity transitions and no JavaScript.
The subscriber chart is drawn from data at runtime with createElementNS, not hand-authored markup, so all three series share one renderer. The line inks in by animating stroke-dashoffset from its own measured length, the hatched area fades in behind it, and the dots pop in on a 45ms stagger. It reads with a pointer or with arrow keys, because a chart that only works on hover is a chart half the audience can't use.
// the path is built from the data, then measured and inked invar dLine = s.data.map(function (v, i) {return (i ? 'L' : 'M') + px(i).toFixed(1) + ',' + py(v, s).toFixed(1);
}).join(' ');
var line = mk('path', { d: dLine, 'class': 'ch-line'});
if (animate && !RM) {var len = line.getTotalLength();
line.style.strokeDasharray = len;
line.style.strokeDashoffset = len;
line.getBoundingClientRect(); // force layout so the transition takes
line.style.transition = 'stroke-dashoffset 1.3s cubic-bezier(.66,0,.22,1)';
line.style.strokeDashoffset = 0;
}// same readout for pointer and keyboard
svg.onkeydown = function (e) {if (e.key === 'ArrowRight' || e.key === 'ArrowLeft') {
e.preventDefault();
var i = flagIdx < 0 ? (e.key === 'ArrowRight' ? 0 : 17)
: flagIdx + (e.key === 'ArrowRight' ? 1 : -1);
showFlag(Math.max(0, Math.min(17, i)));
}else if (e.key === 'Escape') hideFlag();
};
Printed rules and letterpress buttons
Layered gradients · hard offset shadows
The Oxford rule under the masthead (one thick line, a gap, one hairline) is a single element: a linear-gradient with hard color stops, not three divs. Buttons use a hard offset shadow instead of a blur, because letterpress leaves an impression, not a glow. They move into the shadow on press. The paper grain over the whole page is one inline feTurbulence data-URI on body::after, set to multiply and locked to pointer-events: none.
IntersectionObserver · reveal once · CSS-var stagger
One observer runs the whole page. Elements opt in with a data-rv attribute, stagger themselves with an inline --d custom property, and unobserve on first reveal so nothing re-hides on scroll-back. The attribute value picks the animation: rules draw from the left, centered rules draw from the middle, everything else lifts and fades. The ledger hooks the same callback to start its draw-in at the moment it's actually visible.
var io = new IntersectionObserver(function (entries) {
entries.forEach(function (e) {if (!e.isIntersecting) return;
e.target.classList.add('in');
if (e.target.id === 'ledgerFig') drawChart(active, true);
io.unobserve(e.target); // reveal once, never re-hide});
}, { threshold: 0.16, rootMargin: '0px 0px -5% 0px'});
document.querySelectorAll('[data-rv]').forEach(function (el) { io.observe(el); });
/* the stagger is just a variable on the element */
.js [data-rv] { opacity: 0; transform: translateY(16px);
transition: opacity .75s var(--ease-out), transform .75s var(--ease-out);
transition-delay: var(--d, 0s); }
.js [data-rv="rule"] { transform: scaleX(0); transform-origin: left center; }
3
Asset pipeline
There is no pipeline. Nothing was generated, and nothing was downloaded. Every mark on this site is either type, a CSS rule, or hand-plotted SVG written directly into the HTML. No image files ship at all: the whole site is two files plus a stylesheet, and the only network requests are to Google Fonts.
The rotary press engraving in the hero is about 40 hand-written path commands, built the way you'd draw it on paper: ground line first, then the paper roll, the web of paper arcing over the rollers, the press body, the flywheel, and the printed sheets flying off the exit chute. The flywheel spokes are computed on a circle rather than eyeballed, because Pass 1 caught that the eyeballed ones didn't converge on the hub. The six feature icons are the same technique at 120x120.
Three SVG patterns do all the shading, defined once in a hidden defs block and referenced by every figure: dots rotated 15 degrees for halftone, diagonal lines rotated -24 degrees for hatching, and horizontal lines for flat tone. The paper grain is an feTurbulence filter inlined as a data-URI, and the EST. MMXXVI stamp is a circle plus two textPath arcs. That's the entire art department.
Specimen · hover to sharpen
Two groups, one file. The tone group is a single circle filled with the shared dot pattern. The line group is four paths. Hover swaps their opacities and the drawing resolves. Scaled to any size it stays crisp, it costs about 400 bytes, and it never hits the network.
4
Recreate it
Hand this to Claude as-is. It's structured Role, Task, Context, Format, Constraints, Examples. Swap the product and the period and the same skeleton will hold.
Copy-paste prompt
ROLE
You're an art director and front-end developer who sets type for a living. You
care more about a correct hairline rule than about a hero animation.
TASK
Build a single-page marketing site plus a /guide route for a fictional SaaS
product, where the entire page is a working 1900s newspaper broadsheet. Hand
written HTML/CSS/JS only. No framework, no build step, no images.
CONTEXT
The product is [PRODUCT], [ONE SENTENCE ON WHAT IT DOES]. The reader is a
first-time visitor who must still understand the product, see the features and
pricing, and find the CTA. The newspaper conceit can never cost them that.
A newspaper front page is already a hierarchy system: masthead, dateline,
department rules, columns, folios. Map the SaaS beats onto that furniture
instead of inventing new furniture.
FORMAT
- index.html: ticker, masthead with Oxford rules, department nav, hero front
page (headline + deck + press engraving + "In this issue" index), a justified
multi-column lead story with a drop cap, a logo wall styled as newspaper
nameplates, a features "desk", one live interactive demo, a product showcase,
a three-tier rate card, a full-bleed final CTA, a real multi-column footer.
- guide/index.html: same art direction. Concept, technique breakdown with real
code excerpts, asset pipeline, this prompt, and an honest iteration log.
CONSTRAINTS
- Palette, exactly four: newsprint #F6F1E7 (about 90% of the page), ink #1A1611,
oxblood #7A1F1F (ration it: drop caps, kickers, one accent per section),
faded rule #C9BFA8. Every color needs a job.
- Type: Playfair Display (masthead/display), Spectral (body), IBM Plex Mono
(captions/bylines/folios). Google Fonts, font-display: swap.
- Real justified columns with hyphens: auto. Column rules positioned with the
same math as the column algorithm so they survive the responsive collapse.
- Illustrations: hand-plotted inline SVG in two layers, a dot-pattern tone group
and a line group. Hover drops the tone and sharpens the lines.
- Motion is restrained. Paper doesn't bounce. Rules draw themselves, the chart
inks in via stroke-dashoffset, one ticker marquee that pauses on hover.
Named cubic-beziers in :root, no default ease. All of it folds flat under
prefers-reduced-motion.
- Buttons get hard offset shadows, never blurs. Letterpress leaves an
impression, not a glow.
- Copy: contractions, no em-dashes, no buzzwords, no testimonials. Write like a
peer, be specific, no lorem ipsum.
- 1440px and 390px both flawless. No horizontal scroll. Tap targets 44px+.
Console clean. Must work from file:// and https://.
EXAMPLES
- Voice: "The feed is dead. Long live the letter." Not "Revolutionize your
newsletter workflow."
- Sections read as departments: "The Features Desk", "The Composing Room",
"Subscription Rates", each with a Section B / Page B1 folio line.
- Pricing tiers get period names: "The Pamphlet", "The Daily", "The Syndicate".
- The interactive demo is a chart engraved like an 1890s ledger plate: hatched
fill, hairline grid, a ringed last reading, arrow-key readout.
Build it, then run three screenshot passes: structure, depth, final QA. Look at
every screenshot. Fix what's weak. Log what you changed, honestly.
5
Iteration log
Three passes, screenshotted at 1440px and 390px and actually looked at. Two different models did the work, so each entry says which. Nothing here is tidied up after the fact.
Pass 1 · Structure
Claude Fable 5
The masthead broke. At 1440px "The Broadsheet" at 9vw overran its own container and collided with both ears and the EST. stamp, and the stamp sat on top of the final "t". Dropped the display clamp from 9vw/8.4rem to 7.4vw/6.6rem, tightened tracking to -.02em, narrowed the ears, and repositioned the stamp inward.
15px of horizontal overflow at 390px. Traced it with a scripted probe rather than guessing: the culprit was the proof stamp, which is scaled up and rotated before it settles, blowing past the viewport during its transition. Clipped the proof wrapper and reduced the entry scale from 1.7 to 1.35.
The flywheel spokes in the hero engraving were eyeballed and didn't converge on the hub. Recomputed all six as proper radial pairs on the circle.
The sticky bar was driven by a scroll handler against a measured threshold, which meant it could show up in a screenshot taken mid-scroll at the wrong moment. Replaced it with an IntersectionObserver on the masthead so its state is exactly right at any scroll position.
Fig. 2's caption ran long enough to wrap awkwardly under the chart. Cut it from two clauses to one.
Mobile section padding was inherited from desktop and left huge dead gaps between departments. Added a 720px block that tightens section, article, and dispatch padding.
Pass 2 · Depth
Claude Fable 5Claude Opus 4.8
Small caps on the first line of the lead story, via ::first-line with no extra markup, so the copy opens the way wire copy actually did.
Printer's slugs set vertically in the page margins ("Forme A · Locked up", "Front page · Run 47,213"), appearing only above 1370px where there's real margin to hold them.
A press-run progress rule under the sticky bar, in oxblood, scaled on rAF.
Minor dashed rules between the ledger's major gridlines, the way an engraved plate was ruled, plus a ringed and labelled marker resting on the last reading that hides itself when you interrogate that same point.
An end-of-issue sigil closing the rate card ("End of the rate card · Continued on E1") with the ornament on both sides.
"In this issue" rows now shift 4px right with their folio pulling 3px back on hover, so the leader dots stretch like a real index.
Smooth scrolling moved off the html element and onto per-click handlers, so anchor clicks glide but programmatic jumps (and the screenshot harness) stay instant.
Pass 3 · Final QA
Claude Opus 4.8
Wrote this guide route from scratch: it didn't exist when Fable's credits ran out. Same masthead, ticker, palette, and rules as the front page.
Verified 390px end to end: no horizontal overflow, columns collapse 3 to 2 to 1 with their rules dropping out in step, justification turns off at single-column where it would tear, and every tap target clears 44px.
Confirmed the reduced-motion path: ticker stops, reveals resolve to their final state, figures stay developed, the chart draws instantly with no dash animation, and anchor scrolling drops to auto.
Checked meta, title, description, og tags, and the inline SVG favicon on both routes; confirmed the console is clean at both viewports.
Deployed to Netlify and re-shot the live URL to confirm production matches local, including that /guide/ resolves.
6
Attribution
Two models worked on this site, so here's exactly who did what.
Claude Fable 5 did the design. The art direction, the palette and type decisions, the entire front page (index.html), the stylesheet, every SVG engraving, the ledger chart, and iteration passes 1 and 2 are all Fable's work. That's the part of this project that's actually design.
Fable ran out of usage credits mid-project, after pass 2 and before the guide route was written.
Claude Opus 4.8 picked it up from there: finished the last few pass 2 additions, wrote this guide route, ran pass 3 QA, deployed the site, and verified it live.
The credit line in the footer says both, which is the honest version.
Fable 5
Art direction, index.html, styles.css, all SVG illustrations, ledger chart, passes 1–2