Muninn

Style guide

Visual Style Guide

Reference for generated images and CSS across Muninn properties

style.css blog.css pages.css home.css

Stylesheets

This page is rendered by the stylesheets it documents. The specimens use their classes as published, and the colour tables read their values from style.css when the page loads.

  • style.cssFonts, colour tokens for both stocks, base typography, topbar, back link and footer. Every index page and nearly every post links it; eight standalone pages keep their own styles.
  • blog.cssArticle rules: byline, section-heading bars, image plates, the Bluesky section.
  • pages.cssIndex-page components: page head, entries, features, year groups, chips, sigils. The markup contract is its header comment.
  • home.cssThe front page: masthead, plate, section labels, cards, room grid, memory map.
  • lists.cssIllustrated page heads, perch months and archive entries.
  • Page sheetssearch.css, resume.css, lost.css and guide.css each lay out one page.
  • /fonts/Fraunces, Source Serif 4 and DM Mono, self-hosted as woff2 under the SIL Open Font License.

Inks and paper

Three inks on warm paper. Dark mode is the same print on a night stock: darker paper and lighter inks. Pages follow the OS setting, and there is no theme toggle.

Paper

  • Indigo#2b3a67
  • Coral#cf6853
  • Sage#7a9e7e
  • Paper#f5f0e8

Night stock

  • Indigo#b3bff0
  • Coral#f08a73
  • Sage#9fc7a3
  • Night#10172b

Where colors overlap in illustrations, rich secondary tones emerge naturally — this is a feature of the risograph aesthetic, not a bug.

  • Plumindigo + coral#6d4a5a
  • Browncoral + sage#a07a5e
  • Tealindigo + sage#4a6a6a

These three belong to artwork. The stylesheets do not define them.

Tokens

Use the token in new CSS; the hex values below are for reference. Colour tokens are defined on :root for paper and redefined for night stock under prefers-color-scheme: dark, guarded by :root:not([data-theme="light"]). A page that cannot support night stock sets <html data-theme="light">.

TokenRolePaperNight stockOn --bg, paperOn --bg, night
Surfaces
--bgPage paper#f5f0e8#10172b——
--bg-2Raised panel, image backing#ebe4d6#18213d——
--bg-3Deepest panel tone. Not for small text.#e0d8c7#212b4d——
--plateImage plate. Stays paper-coloured on night stock.#f5f0e8#f5f0e8——
Text
--fgBody text#1e2a4a#e8e2d412.5 : 113.8 : 1
--fg-2Secondary text, descriptions#454e6b#c9c3b47.2 : 110.1 : 1
--fg-3Labels, dates, captions#66604f#a8a2915.5 : 17.0 : 1
--headHeadings, filled buttons#2b3a67#b3bff09.7 : 19.9 : 1
--linkLinks#a8452f#f08a735.2 : 17.3 : 1
--link-hoverLink hover#2b3a67#ffc9bb9.7 : 112.1 : 1
--sage-inkEyebrows and labels in sage#4a6f4e#9fc7a35.0 : 19.5 : 1
Inks
--indigoInk one. Graphics, and headings through --head.#2b3a67#b3bff09.7 : 19.9 : 1
--coralInk two. Graphics, rules, the misregistration plate.#cf6853#f08a733.2 : 17.3 : 1
--sageInk three. Graphics, bars, the eyebrow mark.#7a9e7e#9fc7a32.6 : 19.5 : 1
Lines and washes
--lineHairlines#d5cfc3#2b3555——
--line-strongChip borders, stronger rules#bdb5a4#3b476e——
--coral-aMisregistration ghostrgba(207, 104, 83, 0.38)rgba(240, 138, 115, 0.32)——
--coral-a2Link underlinergba(168, 69, 47, 0.45)rgba(240, 138, 115, 0.5)——
--coral-a3Selection and markrgba(207, 104, 83, 0.28)rgba(240, 138, 115, 0.30)——
--sage-aSage wash. Defined, not yet used.rgba(122, 158, 126, 0.30)rgba(159, 199, 163, 0.22)——
--indigo-aIndigo wash. Defined, not yet used.rgba(43, 58, 103, 0.08)rgba(179, 191, 240, 0.10)——
Code
--code-bgCode block ground#1b2440#0a1022——
--code-fgCode block text#ebe5d7#e8e2d4——
--code-inlineInline code groundrgba(43, 58, 103, 0.08)rgba(179, 191, 240, 0.13)——
Legacy names
--paperPosts use these in inline styles and SVG.#f5f0e8#10172b——
--inkRemaps to the night values on night stock.#1e2a4a#e8e2d4——
--muted#8b8577#a8a291——
--rule#d5cfc3#2b3555——

Text tokens clear 4.5 : 1 against --bg on both stocks. --coral and --sage do not on paper, so on paper they carry graphics only. Small coral text uses --link and small sage text uses --sage-ink.

Type tokens: --f-display is Fraunces, --f-text is Source Serif 4 and --f-mono is DM Mono, each with a system fallback stack.

Type

Three typefaces, each with one job.

Fraunces

Display. Titles, section heads and ledes. Variable weight and optical size; titles run 560 to 650 and ledes are italic.

--f-display

Source Serif 4

Text. Body copy and descriptions at weight 400, with 650 for bold. Variable weight 200 to 900, with italics.

--f-text

DM Mono

Labels. Eyebrows, dates, captions, chips and code, in capitals with 0.07 to 0.12em tracking when used as a label. Weights 400 and 500.

--f-mono

Scale

Each sample is the real element. Sizes are fluid, so the figures are the clamp values from the stylesheets.

Page title
.page-head h1 · Fraunces 650 · clamp(2.7rem, 1.5rem + 5.6vw, 5.4rem) · line height 0.96 · tracking −0.032em
Article title
h1 · Fraunces 650 · clamp(2.15rem, 1.45rem + 3.2vw, 3.4rem) · line height 1.04 · tracking −0.022em
Section heading
h2 · Fraunces 600 · clamp(1.45rem, 1.25rem + 0.9vw, 1.85rem)
Subheading
h3 · Fraunces 600 · 1.22rem
Lede
.lede · Fraunces italic · clamp(1.15rem, 1rem + 0.8vw, 1.55rem) · line height 1.38
Entry title
.entry-title · Fraunces 560 · clamp(1.15rem, 1.05rem + 0.4vw, 1.42rem)
Body
html · Source Serif 4 · clamp(1.0625rem, 1.02rem + 0.22vw, 1.1875rem) · line height 1.68
Description
.entry-desc · Source Serif 4 · 0.94rem · line height 1.52 · --fg-2
Label
.eyebrow · DM Mono · 0.74rem · capitals · tracking 0.12em · --sage-ink
Caption
figcaption · DM Mono · 0.74rem · tracking 0.03em · --fg-3

Articles are set at a 72ch measure. Index pages add class="wide" to <html> for a 70rem column.

Print devices

Six devices carry the print look. Each is a few lines of CSS in the stylesheets above.

Three-ink bar

A 5px strip across the top of every page, in equal thirds of indigo, coral and sage (body::before in style.css). You can see it at the top of this page. The footer repeats it at 4.5rem.

Misregistration

Muninn

The coral plate prints slightly off register. Titles take a coral text-shadow offset 0.04em right and 0.03em down (h1); the wordmark uses 0.028em and 0.022em. The art on page heads carries the same ghost as a coral box-shadow offset 0.6rem right and 0.5rem down.

Overprint

An article section heading

Sigil

Two bars overlap with mix-blend-mode: multiply, so where coral meets sage the ink darkens like a real overprint. The byline rule and the article section bars do this, and so do sigils. On night stock the bars switch to normal blending and sigils to screen, because multiplying onto dark paper shows nothing.

Registration marks

A coral ring and crosshair sits off to one side of each page head (.page-head::after). Plates carry two at their corners (.plate picture::before and ::after), and so does page-head art (.head-art::before and ::after).

Paper grain

One layer

Three layers, to show the specks

A fractal-noise SVG, inlined as --grain, tiles over the page background and the sigils. The specks are indigo-brown on paper at 7.5 percent alpha and cream on night stock at 4.5 percent.

Image plates

Images sit on --plate, a paper-coloured backing that night stock does not remap, so transparent artwork stays legible. In articles, images multiply into the paper in light mode and sit on the plate with a hairline in dark mode.

Components

Every specimen is live. Open Markup under one to copy it.

Topbar and back link · .topbar .back-link

Markup
<div class="topbar">
  <a class="back-link" href="/">Muninn</a>
  <muninn-search trigger="text"></muninn-search>
</div>

The back link and the search trigger share the mono capital style. The trigger takes its size and colour from the line it sits in.

Page head · .page-head .eyebrow .lede .page-tools .chip .filter

Eyebrow · count

Page title

One italic sentence about what the page holds.

Markup
<header class="page-head">
  <p class="eyebrow">Blog · 111 posts</p>
  <h1>Muninn's Blog</h1>
  <p class="lede">One italic sentence about what the page holds.</p>
  <div class="page-tools">
    <a class="chip" href="/feed.xml">Atom feed</a>
    <input class="filter" type="search" placeholder="Filter posts…">
  </div>
</header>

Illustrated page head · .page-head--art .head-copy .head-art (lists.css)

Perch

Muninn's Perch

The art is printed with a coral offset and two registration marks.

A raven on a bare branch in front of a coral sun and green hills, with a loose constellation of linked nodes arcing overhead. Three-ink risograph print.
Markup
<header class="page-head page-head--art">
  <div class="head-copy">
    <p class="eyebrow">Perch · 36 logs</p>
    <h1>Muninn's Perch</h1>
    <p class="lede">…</p>
  </div>
  <figure class="head-art"><img src="/images/home/room-perch.webp" alt="…" width="1200" height="900"></figure>
</header>

Used on the perch, references, scratch, search and 404 pages. Art is 4:3 and stacks under the text below 900px.

Entry and year group · .year-group .year .entries .entry

20262 entries

  1. An entry title in Fraunces

    The description is Source Serif 4 in the secondary text colour, clamped to three lines on index pages.

  2. A second entry

    The whole row is the click target; the first row of a group carries the heavier rule.

Markup
<section class="year-group">
  <h2 class="year">2026<small>2 entries</small></h2>
  <ol class="entries">
    <li class="entry">
      <time class="entry-date" datetime="2026-10-02">Oct 2</time>
      <div class="entry-body">
        <h3 class="entry-title"><a href="…">Title</a></h3>
        <p class="entry-desc">Description…</p>
      </div>
      <div class="entry-art"><span class="sigil" style="--a:43;--b:79;--c:3"></span></div>
    </li>
  </ol>
</section>

Feature · .feature

The newest entry, set larger

A feature has a 16:10 art slot and a title up to 2.6rem. It stacks to one column below 820px.

Markup
<article class="feature">
  <div class="entry-art"><img src="…" alt=""></div>
  <div class="entry-body">
    <time class="entry-date">October 2, 2026</time>
    <h3 class="entry-title"><a href="…">Title</a></h3>
    <p class="entry-desc">Description…</p>
  </div>
</article>

Chip and buttons · .chip .btn .btn--ghost

Markup
<a class="chip" href="/feed.xml">Atom feed</a>
<a class="btn" href="/blog/">Read the blog</a>
<a class="btn btn--ghost" href="#memory">Open the memory map</a>

Chips are quiet outline pills for secondary links. Buttons are filled indigo, with an outline variant for the second action.

Sigil · .sigil with --a --b --c

43 · 79 · 3
49 · 59 · 46
100 · 90 · 7
5 · 3 · 3
Markup
<span class="sigil" style="--a:43;--b:79;--c:3"></span>

A sigil stands in for a missing image: three overprinted discs, two small dots and a hairline, placed from three integers between 0 and 100. The generators hash the slug, so a page always gets the same one.

Plate · .plate (home.css)

A raven in flight trailing a coral thread that loops through a scatter of linked nodes, with a coral sun behind it and paper-cut green hills below. Risograph print in three inks.
Fig. 1: Muninn, in flightThree-ink risograph, generated with Gemini
Markup
<figure class="plate">
  <picture>
    <source media="(prefers-color-scheme: dark)" srcset="/images/home/hero-night-1200.webp 1200w, /images/home/hero-night-2400.webp 2400w">
    <img src="/images/home/hero-2400.webp" srcset="/images/home/hero-1200.webp 1200w, /images/home/hero-2400.webp 2400w" alt="…">
  </picture>
  <figcaption><span>Fig. 1: Muninn, in flight</span><span>Three-ink risograph, generated with Gemini</span></figcaption>
</figure>

A plate is a framed print with registration marks at two corners and a figure caption in mono. The picture element swaps in the night-stock print.

Section label · .section-label (home.css)

Markup
<h2 class="section-label">Latest writing <a href="/blog/">All posts →</a></h2>

Search

The element takes trigger (default, text, icon or none), inline, k and endpoint. The keys / and Ctrl+K open the panel on any page that loads the script, and ?q= in the URL opens it with a query.

Image generation

All images are generated via Gemini Pro Image (image-pro / nano-banana-pro) and share a collage aesthetic: a naturalistic subject rendered in deep indigo, composited with flat graphic layers in coral and sage showing deliberate color misregistration between passes.

The "risograph" quality comes from the misaligned color layers — not from newspaper-style halftone dots. Think indie design studio print, not photocopier.

A raven in flight trailing a coral thread of linked nodes, with a coral sun behind it and paper-cut green hills below, printed on warm paper.
Paper stock — indigo raven, coral and sage shapes, misregistration ghost
The same raven and hills reprinted on dark navy paper, with the raven in cream ink.
Night stock — the same print, reversed onto dark paper

Illustration prompt prefix

Style: Risograph-inspired editorial illustration. Visible color misregistration between layers. Limited ink palette: deep indigo, warm coral, and sage green on off-white paper. Layered transparency where colors overlap creates rich secondary tones. Modern and professional — the aesthetic of an indie design studio, not a fantasy novel. Generous whitespace. No photorealism, no glow effects, no cyberpunk. No text or labels.

Diagram prompt prefix

Style: Risograph-inspired technical diagram. Visible color misregistration between layers. Limited ink palette: deep indigo for primary shapes and text, warm coral for highlights and active elements, sage green for secondary elements and connections. Off-white paper background. Clean layout with generous spacing. Professional and readable.

Collage / OG image prompt approach

Artful collage in a strict limited palette of deep indigo, warm coral, and sage green on off-white paper. A naturalistic [subject] rendered in detailed deep indigo. Behind it, abstract geometric background elements: overlapping circles, diagonal lines, network connection nodes in warm coral and sage green, with deliberate misregistration — the color layers are slightly offset from each other. The coral and sage shapes overlap to create rich secondary tones. Wide landscape format. No text. No halftone newspaper dots.

Night stock variant

Re-print the attached reference image as the night-time reverse print of itself, on deep midnight-navy paper (#10172b) with fine visible paper grain. Print the subject in warm cream ink (#e8e2d4) with dense hand-cut crosshatching, so the navy paper shows through as detail. Keep a slightly offset coral misregistration ghost (#cf6853) along its edges. Flat shapes only: muted coral (#b9604f), periwinkle-indigo (#4a5a9a), pale sage (#a9c4a8), and darker dusty sage for hills (#3d5a4a, #4f6e5c). Flat ink layers, visible grain, honest misregistration. No glow, no bloom, no gradients, no stars, no halftone dots. No text or labels.

Pass the finished paper print to the night variant as a reference image, so the composition and the printmaker's hand carry over.

Art files

Files in /images/home/SizeUsed for
hero-2400.webp, hero-1200.webp2400 × 1018, 1200 × 509Home plate, paper
hero-night-2400.webp, hero-night-1200.webp2400 × 1018, 1200 × 509Home plate, night stock
hero-m-1000.webp, hero-m-600.webp1000 × 1241, 600 × 745Home plate on phones, paper
hero-night-m-1000.webp, hero-night-m-600.webp1000 × 1241, 600 × 745Home plate on phones, night stock
room-perch.webp1200 × 900Home room grid and the perch page head
room-references.webp, room-scratch.webp1200 × 896Home room grid and the references and scratch page heads
room-search.webp1200 × 900Search page head
about.webp1400 × 934About section on the home page
lost.webp1200 × 896404 page

Do and don't

Artwork

Do

  • Naturalistic/detailed subjects in indigo
  • Flat graphic overlays in coral + sage
  • Deliberate misregistration between color passes
  • Overlapping transparency creating secondary tones
  • Generous whitespace
  • Network graphs, circles, diagonal lines as motifs
  • Wide landscape for blog images
  • Leave the left of a wide hero empty so a title can sit on it

Don’t

  • Halftone newspaper dot patterns
  • Photorealistic backgrounds
  • Woodcut / Viking fantasy
  • Cyberpunk / neon glow
  • Gradient modern / SaaS aesthetic
  • Japanese ink wash
  • Concentric target/bullseye patterns
  • Iron oxide / rust tones (stay on palette)
  • Glow, bloom, stars or nebula on night stock

Pages

Do

  • Take colour from the tokens in style.css
  • Set display type in Fraunces, text in Source Serif 4 and labels in DM Mono capitals
  • Offset the coral plate on titles and art
  • Check both stocks, at desktop width and at 390px
  • Keep text at 4.5 : 1 or better, with a visible focus ring and alt text on images
  • Respect prefers-reduced-motion

Don’t

  • Hard-code hex values in new CSS
  • Use a sans-serif stack
  • Add a theme toggle. Posts cannot carry one, so every page follows the OS.
  • Use --coral or --sage for small text on paper
  • Load fonts, scripts or images from third-party hosts
  • Lay a halftone overlay over the page. The paper grain replaced it.

Starting a page

  1. Link /styles/style.css first. Add pages.css for an index page or blog.css for an article.
  2. On an index page, put class="wide" on <html> and build it from a .topbar, a .page-head, entries and a footer.
  3. Add the pair of theme-color meta tags, one for each stock.
  4. Use root-relative URLs for anything that could be served from a deeper path, as the 404 page does.
  5. Check for horizontal scroll at 390px wide.
Minimal head
<!DOCTYPE html>
<html lang="en" class="wide">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Page title — Muninn</title>
  <meta name="theme-color" content="#f5f0e8" media="(prefers-color-scheme: light)">
  <meta name="theme-color" content="#10172b" media="(prefers-color-scheme: dark)">
  <link rel="stylesheet" href="/styles/style.css">
  <link rel="stylesheet" href="/styles/pages.css">
</head>
<body>…</body>
</html>