<!doctype html><html><head><meta charset="utf-8">
<meta name="readme-max-height" content="32000">
<meta name="viewport" content="width=device-width, initial-scale=1">
<style>
  /* No @font-face here: the wiki renders README.html in a null-origin iframe,
     so adom.inc's font files fail CORS on every load and only add console
     noise. Fall back to the system stack, which the wiki chrome matches. */
  :root { --bg:#0d1117; --surface:#161b22; --elev:#1c2128; --border:#30363d;
           --text:#e6edf3; --body:#c9d1d9; --muted:#8b949e; --accent:#00b8b1; --purple:#8C6BF7; }
  * { box-sizing:border-box; margin:0; padding:0; }
  html,body { background:var(--bg); color:var(--body);
    font:15px/1.65 system-ui,-apple-system,"Segoe UI",Roboto,sans-serif;
    scrollbar-width:none; }
  html::-webkit-scrollbar, body::-webkit-scrollbar { width:0; height:0; display:none; }
  #wrap { max-width:900px; margin:0 auto; padding:24px 20px 48px; }
  h1 { font-weight:700; color:var(--text);
        font-size:40px; letter-spacing:-.02em; margin:6px 0 4px; }
  h2 { font-weight:700; color:var(--text);
        font-size:24px; margin:36px 0 10px; letter-spacing:-.01em; }
  p { margin:10px 0; }
  .lede { color:var(--muted); font-size:17px; margin-bottom:20px; }
  .viewer { border:1px solid var(--border); border-radius:12px; overflow:hidden;
             background:var(--surface); margin:22px 0 8px;
             box-shadow:0 12px 40px rgba(0,0,0,.45); }
  .viewer iframe { display:block; width:100%; height:620px; border:0; }
  /* Click to load. The viewer bundle is ~13 MB of Babylon plus a 2.5 MB model;
     loading it eagerly on a page most people are just reading makes the whole
     tab crawl, and four of these tabs will peg a browser. */
  .poster { display:block; width:100%; padding:0; border:0; background:none;
             cursor:pointer; position:relative; font:inherit; color:inherit; }
  .poster img { display:block; width:100%; height:auto; opacity:.55; transition:opacity .18s; }
  .poster:hover img { opacity:.75; }
  .play { position:absolute; inset:0; display:flex; flex-direction:column;
           align-items:center; justify-content:center; gap:6px; text-align:center; }
  .play b { background:var(--accent); color:#04120f; padding:10px 20px;
             border-radius:999px; font-size:15px; font-weight:700; }
  .play i { color:var(--text); font-style:normal; font-size:12.5px; opacity:.85; }
  .cap { color:var(--muted); font-size:13px; margin:0 0 26px; }
  .cap a { color:var(--accent); text-decoration:none; }
  table { border-collapse:collapse; width:100%; margin:12px 0 4px; font-size:14px; }
  th,td { text-align:left; padding:7px 10px; border-bottom:1px solid var(--border); }
  th { color:var(--muted); font-weight:600; }
  code { font-family:"JetBrains Mono",ui-monospace,monospace; font-size:13px;
          background:var(--elev); padding:1px 5px; border-radius:4px; color:var(--text); }
  .call { background:var(--elev); border:1px solid rgba(0,184,177,.25);
           border-left:3px solid var(--accent); border-radius:8px; padding:14px 16px; margin:18px 0; }
  .call b { color:var(--text); }
  ul { margin:10px 0 10px 20px; } li { margin:5px 0; }
  .grid { display:flex; gap:14px; flex-wrap:wrap; margin:14px 0; }
  .grid img { flex:1 1 380px; max-width:100%; border:1px solid var(--border); border-radius:10px; }
</style></head><body><div id="wrap">

<h1>Jon Chung</h1>
<p class="lede">An Adom molecule LED nameplate. The name is etched out of the soldermask
over the ground plane, lit by 15 side-view LEDs firing inward across the board.</p>

<div class="viewer" id="viewer">
  <button class="poster" id="viewer-load" type="button">
    <img src="https://wiki.adom.inc/adom/jon-chung-nameplate/render/docs/hero.png" alt="Jon Chung nameplate">
    <span class="play"><b>Load interactive 3D viewer</b><i>Orbit, inspect, measure, x-ray the copper. About 15 MB.</i></span>
  </button>
</div>
<p class="cap">The guided walkthrough starts on its own once loaded.
<a href="https://wiki.adom.inc/adom/jon-chung-nameplate/render/viewer/index.html" target="_blank">Open full screen instead</a>.</p>

<div class="call"><b>The one idea: the name is the ground plane.</b>
A rectangular GND copper pour covers the top layer and the soldermask is opened in the
shape of the letters, so bare plated copper shows through. There is deliberately no second
ground path, no bottom ground pour, so every milliamp those 15 LEDs draw physically
crosses the letters on its way back to the connector. The line you get to say to Jon Chung,
<i>"your name is part of the electrical path that lights up the LEDs"</i>, is a statement
about the netlist rather than a slogan.</div>

<h2>The board</h2>
<table>
<tr><th>Board</th><td>268 x 76 mm, 2 layer, 4 mm corner radius</td></tr>
<tr><th>Pin box</th><td><b>256 x 64 mm</b> = 8 x 2 on the 32 mm scaffold grid</td></tr>
<tr><th>Name</th><td>209.2 x 40 mm, Familjen Grotesk Bold</td></tr>
<tr><th>Mask openings</th><td>478 letter polygons</td></tr>
<tr><th>GND plate</th><td>261.6 x 69.6 mm, top layer</td></tr>
<tr><th>LEDs</th><td>15 x Wurth WL-SMSW <code>155060GS75300</code>, 515 nm side-view</td></tr>
<tr><th>Current</th><td>180 mA at 5 V (15 x 12 mA)</td></tr>
<tr><th>Parts / traces / vias</th><td>40 / 63 / 35</td></tr>
</table>

<div class="grid">
  <img src="https://wiki.adom.inc/adom/jon-chung-nameplate/render/docs/hero.png" alt="Jon Chung board, 3D render">
  <img src="https://wiki.adom.inc/adom/jon-chung-nameplate/render/docs/pcb.png" alt="Jon Chung board, PCB view">
</div>

<h2>Molecule compliance</h2>
<ul>
<li>A large machine pin at every corner: a 3.6 mm body press-fit into a 3.45 mm plated hole,
0.15 mm of interference, solderless.</li>
<li>The pin box is <b>256 x 64 mm</b>, both exact multiples of 32 mm, the base
scaffold's large-contact pitch, so it drops straight onto 9 x 3 contact positions of
the 18 x 18 field across the 576 x 576 mm workspace.</li>
<li>Minimal wings: the board stops 6 mm outside each corner pin. That is as tight as the pin
allows, since a 5.2 mm annular ring eats 2.6 mm of it and a press-fit needs roughly 2x board
thickness of laminate outboard of the ring.</li>
<li>MP1 and MP4 are GND, MP2 and MP3 are +5 V, so the plate can run off a workcell control
panel instead of USB-C. The ground pins land inside the plate, so the scaffold's ground
return also passes through the name.</li>
</ul>

<h2>Why side-view LEDs</h2>
<p>A normal chip LED is a top-view emitter: it fires straight up, away from the board, and the
copper you are trying to light sees nothing. This board uses a true side-view part. The die sits
on its side behind a window in the long face of the package, so the beam leaves parallel to the
board about 0.5 mm above the soldermask. Ringed around the edge facing inward, the light rakes
across the plate at a grazing angle and washes the exposed-copper letters instead of escaping
to the sky.</p>
<p>Worth knowing if you go sourcing: Kingbright's <code>APTR3216</code> family is reverse-mount,
firing down through a hole in the PCB, and Broadcom's <code>HSMx-C265</code> is bottom-entry.
Both come back in a "right angle SMD LED" search and neither does this job.</p>

<h2>Power</h2>
<p>USB-C VBUS at 5 V through 150 R into a 3.2 V LED gives 12 mA each, <b>180 mA</b> for the
board, well inside the 500 mA a charger gives an unnegotiated sink, so any phone brick works.
<code>R_CC1</code> and <code>R_CC2</code> are the mandatory Rd pulldowns: without them on both
CC lines a USB-C source never enables VBUS and the board stays dark.</p>
<p>The layer plan is inverted from the usual convention on purpose. Top is GND, one rectangular
pour, with the name cut out of it; bottom is the +5 V plane. Everything is placed top side only,
because the line does single-sided pick and place, so each LED string runs LED, then 150 R,
then a via down to the +5 V plane, while the cathode bonds straight into the plate.</p>

<h2>Fab notes</h2>
<ul>
<li><b>Specify ENIG, not HASL.</b> The letters are 209 x 40 mm of deliberately bare
copper and are the entire point of the board. HASL leaves them lumpy; ENIG leaves them mirror flat.</li>
<li>Dark soldermask maximises contrast against the exposed letters.</li>
<li>The four 3.45 mm machine-pin holes are an interference fit and are meant to be undersized.
Do not let a fab house "correct" them to a clearance fit.</li>
<li>Tented or plugged vias: there are vias whose rings lap onto LED resistor pads.</li>
</ul>

<h2>Verifying the mask opens</h2>
<p>Do not trust the render. Read the gerber. <code>F_Mask.gbr</code> is negative polarity
(<code>%TF.FilePolarity,Negative*%</code>), so what is drawn is where mask is removed:</p>
<ul>
<li><b>478 region polygons</b>, bounding box <b>209.18 x 40.00 mm</b>, the letters</li>
<li>the plate rectangle <b>absent</b> from F_Mask; present would mean inverted</li>
<li><b>zero</b> letter regions in <code>F_Paste.gbr</code>. The letters are decoration, not solder
joints, and must never be stencilled</li>
</ul>

<h2>Reproducing it</h2>
<p>Built with <a href="https://wiki.adom.inc/adom/adom-tsci" style="color:var(--accent)">adom-tsci</a>
from parametric tscircuit source. Board size, pin box, LED count and silkscreen are all derived
from the name's ink box, so a new name is one command:</p>
<p><code>scripts/make-nameplate.sh "Jon Chung"</code></p>

<script>
(function () {
  // The wiki renders README.html inside an iframe that does not know our
  // height, so it has to be told. Without this the page is clipped to the
  // default frame height and everything below the 3D viewer is unreachable.
  var wrap = document.getElementById('wrap');
  var last = 0;
  var btn = document.getElementById('viewer-load');
  if (btn) btn.addEventListener('click', function () {
    var f = document.createElement('iframe');
    f.src = 'https://wiki.adom.inc/adom/jon-chung-nameplate/render/viewer/index.html';
    f.title = 'Jon Chung nameplate, interactive 3D';
    f.setAttribute('allow', 'fullscreen');
    f.addEventListener('load', post);
    var host = document.getElementById('viewer');
    host.innerHTML = '';
    host.appendChild(f);
    post();
  });
  function post() {
    var h = wrap.offsetHeight + 24;
    if (h !== last) { last = h; parent.postMessage({ type: 'readme-height', height: h }, '*'); }
  }
  post();
  addEventListener('load', post);
  addEventListener('resize', post);
  // Images and the lazily-loaded viewer iframe land after first paint and each
  // one changes our height, so re-post as they arrive.
  document.querySelectorAll('img, iframe').forEach(function (el) {
    el.addEventListener('load', post);
  });
  if (window.ResizeObserver) new ResizeObserver(post).observe(wrap);
  // Belt and braces for late web-font swaps.
  [100, 400, 1200, 3000].forEach(function (t) { setTimeout(post, t); });
})();
</script>
</div></body></html>