CCETAK & SONS
The making-of · Concept study № 17

How we set № 17.

One operator wrote the brief. AI agents set the type. Then three critique passes pressed it into shape — each one reading the real page like a hostile proofreader, fixing what it found, then adding one more layer of craft. Here is exactly what the brief asked for, how the signature works, and what each pass changed.

№ 01

The brief we received

Every site in this collection starts from a place, not a wireframe. Ours was a working letterpress on Lebuh Chulia, Penang — a shop that has stood at one address since 1938. The whole page had to prove one thing: that a website can set your words in lead and pull you a proof while you watch.

NameCETAK & SONS · letterpress, Lebuh Chulia, Penang · est. 1938 · light theme
ConceptA working letterpress — type a line and watch the shop set it in lead, ink the rollers and pull you a proof.
SignatureMovable-type kinetic assembly — the visitor's typed line becomes animated sorts pulled from a visible type case, set, inked and pressed to paper.
Palette paper #f2ede3 ink #1b1815 Prussian press blue #245b78 worn brass #ad8a4d
TypeBitter (display) · Rubik (text) · DM Mono (type-case labels)
InteractionsType your line (keyboard + on-screen keys for touch) · set printable ornaments 🖨️ ✦ ♥ ★ ☕ · pull the press lever · download your proof as PNG · flip a sort to find the maker's mark.
VoiceThird-generation printer, ink under the nails. Inked, tactile, proud.
Tagline"Type a line and the press sets it in lead before your eyes."
№ 02

The signature technique

Movable-type kinetic assembly. Not a typing animation on top of a picture — a real type case that composes what you write.

The upper case holds every capital, figure and point in its historical order — that's where the name comes from. As you type, the page diffs your line against the sorts already set in the stick. A new letter flies out of its own box in the case and lands in the composing stick; a deletion settles back. Every sort is cast mirror-reversedscaleX(-1) — exactly as metal type sits before it prints, so the stick reads backwards and the proof reads right. Pull the press and an ink-roller sheen sweeps the set line, the platen kisses, and the proof drops with a real letterpress bite — ink pressed into the sheet, not laid on top.

The clever part is the diff. Rather than rebuild the whole line on every keystroke, the engine finds the common prefix and only adds or removes the sorts that actually changed — so an append flies one new letter, a grapheme-safe backspace settles one complete character, and only a mid-line edit rebuilds. Letters and ornaments share one 22-character measure without splitting joined emoji. That is the true heart of the assembly, pulled straight from the shop's own source:

index.htmlfunction sync() — the compositor
/* sync engine — single source of truth is the input value */
function sync(){
  var want = normalize(inp.value);
  var canonical = want.join("");
  if(inp.value!==canonical) inp.value=canonical;
  var cur  = chars.map(function(o){ return o.ch; });
  // how much of the line is unchanged?
  var common=0;
  while(common<cur.length && common<want.length && cur[common]===want[common]) common++;

  if(common===cur.length && want.length>cur.length){
    // pure append — fly the new sorts in from the case
    for(var i=cur.length; i<want.length; i++) addChar(want[i]);
  } else if(common===want.length && cur.length>want.length){
    // pure delete — settle the last sorts back
    for(var j=cur.length; j>want.length; j--) removeLast();
  } else {
    // a mid-line edit — reset the stick and re-compose
    slots.innerHTML=""; chars=[];
    want.forEach(function(c){ /* place each sort */ });
  }
  updateMeta();
}

Excerpt from the shop's own index.html. The comments are the printer's: a compositor only touches the sorts that changed.

№ 03

What each pass found

The first draft is never the reason these pages look the way they do. The loop is. Each pass shoots the real page on desktop and mobile, reads it like a hostile art director, fixes everything, then adds one deliberate upgrade.

Pass 1

The first galley

FoundThe "type below…" hint bled through the metal sorts once a line was set. The ambient lamp beam ran too hot and washed out the paper. The pulled proof read flat — like printed text, not pressed metal.
ChangedHint fades the instant a sort lands (.stick.has .hintline). Beam opacity pulled back so the paper stays the brightest thing. Proof given its first deboss shadow. Upgrade: per-letter wear counts in every case box, and a note that the E box wears out first.
Pass 2

The letterpress bite

FoundThe proof still looked printed, not pressed — and a first attempt at an impression over-shot into a metallic pewter sheen, reading as blind-embossed rather than inked.
ChangedRebuilt the proof face as dark ink with an ink-squash gradient (darker toward the feet) and a two-edge deboss — a dark valley above each letter, a paper-toned rim below — so the line reads as ink pushed into the sheet. Matched the downloadable PNG to the same bite. Upgrade: the impression itself.
Pass 3

Inking the form

FoundThe rollers only swept the empty tray; they never touched the type. And the first sheen used the site's fast expo easing, so it whipped across too quickly to read.
ChangedTied the pull to the composed sorts — a steady, linear ink-roller sheen now passes across the set line before the platen kisses, so you watch the type get inked. Verified at 375 / 768 / 1440, reduced-motion leaves the whole page readable, zero console errors, page weight held under 50 KB against a 90 KB budget.