Templates / Blog Article

Blog Article beta Pro

A long-form article page: standfirst, prose rhythm, a contents rail, and the author card that earns the follow.

Preview
acme.studio/blog/the-mold
Process

One mold, every casting: how we stopped redesigning the button

For a year, every page we shipped redesigned the same twelve parts. The fix was not a bigger design system — it was a smaller one, with a checklist and the nerve to say no.

MS
Mara SatoNov 2, 2026 · 6 min read
FIGURE — THE MOLD, PHOTOGRAPHED FROM ABOVE

The master mold for the current catalog. Every part on the site began as a casting from it.

Every team has the drawer: forty-one buttons, each built for one page, each slightly proud of its radius. Ours lived in production. Auditing it took a week and produced the least surprising finding in software — the differences were not decisions. They were weather.

The audit nobody wanted

We listed every part on every page and marked the differences worth keeping. Of 214 variations, 11 were deliberate. The rest were the same idea re-typed by different people on different Tuesdays, and each one cost maintenance forever.

A design system is not a library of answers. It is a short list of questions you have agreed to stop re-asking.

The mold came out of that list: one token file, a page template, and an automated check that fails a part the way a foreman rejects a bad casting — specifically, and before it ships.

What the check actually checks

Files first, then tokens, then class coverage: every class used in a preview must be defined by the part itself or a declared dependency. The rule sounds clerical until the first time it catches a part quietly depending on another part’s stylesheet — which was week one.

python3 check.py
136/136 components pass the mold

Three rules did most of the work:

  • Colors come from tokens, never from hex — themes stay possible.
  • Every class a part shows is a class the part defines.
  • A release needs three clean passes in a row, not one lucky one.

What we would not do again

We would not start with the logo, the marketing page, or 2,000 icons. We would start with the button, the input, and the argument about tokens — in that order, because the argument is the system and the rest is inventory.

MS
Written by Mara Sato

Design lead at Acme Studio. Owns the tokens, the mold, and strong opinions about border radii. Previously: three design systems that did not survive contact with a roadmap.

Built from: Parts: Avatar, Badge, Button — include their CSS alongside this template.

<div class="k-tpl-bl">
  <div class="k-tpl-bl-grid">
    <article>
      <span class="badge teal">Process</span>
      <h1>One mold, every casting: how we stopped redesigning the button</h1>
      <p class="stand">For a year, every page we shipped redesigned the same twelve parts. The fix was not a bigger design system — it was a smaller one, with a checklist and the nerve to say no.</p>
      <div class="k-tpl-bl-by">
        <span class="k-avatar">MS</span>
        <div><b>Mara Sato</b><span>Nov 2, 2026 · 6 min read</span></div>
        <button class="btn btn-sm" type="button">Follow</button>
      </div>
      <div class="k-tpl-bl-hero">FIGURE — THE MOLD, PHOTOGRAPHED FROM ABOVE</div>
      <p class="k-tpl-bl-cap">The master mold for the current catalog. Every part on the site began as a casting from it.</p>
      <div class="k-tpl-bl-prose">
        <p>Every team has the drawer: forty-one buttons, each built for one page, each slightly proud of its radius. Ours lived in production. Auditing it took a week and produced the least surprising finding in software — the differences were not decisions. They were weather.</p>
        <h2 id="bl-s1">The audit nobody wanted</h2>
        <p>We listed every part on every page and marked the differences worth keeping. Of 214 variations, 11 were deliberate. The rest were the same idea re-typed by different people on different Tuesdays, and each one cost maintenance forever.</p>
        <blockquote>A design system is not a library of answers. It is a short list of questions you have agreed to stop re-asking.</blockquote>
        <p>The mold came out of that list: one token file, a page template, and an automated check that fails a part the way a foreman rejects a bad casting — specifically, and before it ships.</p>
        <h2 id="bl-s2">What the check actually checks</h2>
        <p>Files first, then tokens, then class coverage: every class used in a preview must be defined by the part itself or a declared dependency. The rule sounds clerical until the first time it catches a part quietly depending on another part’s stylesheet — which was week one.</p>
        <pre><code>python3 check.py
136/136 components pass the mold</code></pre>
        <p>Three rules did most of the work:</p>
        <ul>
          <li>Colors come from tokens, never from hex — themes stay possible.</li>
          <li>Every class a part shows is a class the part defines.</li>
          <li>A release needs three clean passes in a row, not one lucky one.</li>
        </ul>
        <h2 id="bl-s3">What we would not do again</h2>
        <p>We would not start with the logo, the marketing page, or 2,000 icons. We would start with the button, the input, and the argument about tokens — in that order, because the argument is the system and the rest is inventory.</p>
      </div>
      <div class="k-tpl-bl-author">
        <span class="k-avatar">MS</span>
        <div><b>Written by Mara Sato</b><p>Design lead at Acme Studio. Owns the tokens, the mold, and strong opinions about border radii. Previously: three design systems that did not survive contact with a roadmap.</p></div>
      </div>
      <div class="k-tpl-bl-nav">
        <a href="/templates/blog-article/"><span>Newer</span><b>RTL is a direction, not a stylesheet</b></a>
        <a href="/templates/blog-article/"><span>Older</span><b>The QR encoder we wrote from the spec, and the two bugs it caught</b></a>
      </div>
    </article>
    <aside>
      <nav class="k-tpl-bl-toc" aria-label="Contents">
        <h4>Contents</h4>
        <a href="#bl-s1" class="on">The audit nobody wanted</a>
        <a href="#bl-s2">What the check actually checks</a>
        <a href="#bl-s3">What we would not do again</a>
      </nav>
    </aside>
  </div>
</div>
/* KATA Template: Blog Article */
.k-tpl-bl{background:var(--k-bg);border:1px solid var(--k-line);border-radius:16px;padding:30px 26px;font-family:var(--k-font);color:var(--k-ink)}
.k-tpl-bl-grid{display:grid;grid-template-columns:minmax(0,1fr) 190px;gap:34px;max-width:920px;margin:0 auto}
.k-tpl-bl h1{font-size:29px;font-weight:700;letter-spacing:-.026em;line-height:1.25;margin:12px 0 10px}
.k-tpl-bl .stand{font-size:16.5px;line-height:1.75;color:var(--k-ink-2)}
.k-tpl-bl-by{display:flex;align-items:center;gap:11px;margin:18px 0 20px;padding:13px 0;border-top:1px solid var(--k-line);border-bottom:1px solid var(--k-line)}
.k-tpl-bl-by b{font-size:13.5px;display:block}
.k-tpl-bl-by span{font-size:12px;color:var(--k-ink-3)}
.k-tpl-bl-by .btn{margin-inline-start:auto}
.k-tpl-bl-hero{border-radius:13px;background:linear-gradient(150deg, var(--k-zinc-700), var(--k-zinc-950));min-height:190px;display:flex;align-items:center;justify-content:center;color:var(--k-zinc-400);font-size:12.5px;letter-spacing:.14em;margin-bottom:8px}
.k-tpl-bl-cap{font-size:12px;color:var(--k-ink-3);margin-bottom:22px;text-align:center}
.k-tpl-bl-prose{font-size:15.5px;line-height:1.85;color:var(--k-ink)}
.k-tpl-bl-prose p{margin-bottom:15px}
.k-tpl-bl-prose h2{font-size:19.5px;font-weight:650;letter-spacing:-.018em;margin:26px 0 10px}
.k-tpl-bl-prose blockquote{border-inline-start:3px solid var(--k-accent);padding:2px 0 2px 16px;margin:20px 0;font-size:16.5px;line-height:1.75;color:var(--k-ink)}
.k-tpl-bl-prose code{font-family:var(--k-mono,monospace);font-size:.86em;background:var(--k-bg-soft);border:1px solid var(--k-line);border-radius:5px;padding:1px 5px}
.k-tpl-bl-prose pre{background:var(--k-zinc-950);color:var(--k-zinc-100);border-radius:11px;padding:15px 17px;overflow-x:auto;margin:18px 0}
.k-tpl-bl-prose pre code{background:none;border:0;padding:0;color:inherit}
.k-tpl-bl-prose ul{margin:0 0 15px;padding-inline-start:20px}
.k-tpl-bl-prose li{margin-bottom:6px}
.k-tpl-bl-toc{position:sticky;top:14px;font-size:12.5px}
.k-tpl-bl-toc h4{font-size:11px;font-weight:650;letter-spacing:.09em;text-transform:uppercase;color:var(--k-ink-3);margin-bottom:9px}
.k-tpl-bl-toc a{display:block;padding:5px 0 5px 11px;color:var(--k-ink-2);text-decoration:none;border-inline-start:2px solid var(--k-line)}
.k-tpl-bl-toc a.on{color:var(--k-ink);font-weight:600;border-inline-start-color:var(--k-accent)}
.k-tpl-bl-author{display:flex;gap:13px;border:1px solid var(--k-line);border-radius:13px;padding:17px;margin-top:26px;align-items:flex-start}
.k-tpl-bl-author b{font-size:14px}
.k-tpl-bl-author p{font-size:12.5px;line-height:1.7;color:var(--k-ink-2);margin-top:4px}
.k-tpl-bl-nav{display:grid;grid-template-columns:1fr 1fr;gap:12px;margin-top:16px}
.k-tpl-bl-nav a{border:1px solid var(--k-line);border-radius:12px;padding:14px;text-decoration:none;color:var(--k-ink)}
.k-tpl-bl-nav span{font-size:11px;letter-spacing:.08em;text-transform:uppercase;color:var(--k-ink-3);display:block;margin-bottom:5px}
.k-tpl-bl-nav b{font-size:13.5px;font-weight:600;line-height:1.5;display:block}
@media (max-width:820px){.k-tpl-bl-grid{grid-template-columns:1fr}.k-tpl-bl-toc{display:none}.k-tpl-bl-nav{grid-template-columns:1fr}}

Installation

CLI

node kata-ui.mjs add blog-article

Writes the template’s CSS into your project. Everything it is built from comes with it. New to the CLI? See the CLI doc.

Manual

  1. Load tokens.css once, before any part.
  2. Copy the CSS tab into your stylesheet, with the CSS of everything listed under “Built from” above.
  3. Copy the HTML where it belongs.

Usage

The prose column is set for reading: a 17px body on a 1.85 line height inside a measure near 65 characters, headings that arrive like chapter breaks, and a contents rail that sticks on wide screens. Swap the article, keep the rhythm — the typography is the template. Figures are gradient stand-ins for your images, captions included because images without captions are decorations.