specimens · sampled from the binder, not invented

Widget
zoo

Every component in the tinymachines system, rendered on the real page ground with the exact markup that produced it: the markup blocks are read out of the live DOM at load, so a specimen and its listing cannot drift apart. Specimens are marked shipped, draft or idea so it is always clear what you can use today.

Palette sampled from IMG_5318 · white-balanced Aug 22
Start at foundations Jump to the panel

Foundations

The pieces every page uses. Nothing here knows anything about the 6502: if a specimen only makes sense next to live engine state, it belongs in The panel.

The grid unit

shipped

One number, --u: 4px, and every spacing value in the system is a multiple of it. The binder calls this the primary grid unit and it is the reason a memory monitor lines up with the table beside it. This page is sitting on the grid: the faint rule behind everything is 8×--u.

1u  4px  hairline gaps, tag padding
2u  8px  inside a control
4u  16px  module padding
8u  32px  between modules
16u  64px  between sections
Markup

Type scale

shipped

Four voices. Display for section headers only, in caps and tight. Sans for interface. Mono for anything the machine produced: an address, a count, a node id. Serif for documentation prose, and only there, because a serif paragraph next to a hex dump is what makes the hex dump look like data rather than text.

Half-wave
Switch-level, verified at every half-cycle
0x3F40   NODE_657   h=255   φ2

The simulator resolves every one of the 1,725 nodes twice per cycle, and a datasheet oracle checks the result, which is what catches the readings of the die that everybody shares and nobody questions.

Markup

Palette, both grounds

shipped

Every Earth Conductor hue ships twice: a base that reads on the panel and an -ink form that reads on paper. Using the wrong one is the fastest way to make this palette illegible, so the pairs are named rather than derived at the call site. Ratios below are computed, not eyeballed.

On paper

#8E3D1C Burnt Silicon ink 6.6:1
#7A6220 Mustard ink 5.2:1
#2D583A Forest Logic ink 7.3:1
#1A5A61 Ocean Data ink 7.0:1

On panel

#D06B40 Burnt Silicon 5.2:1
#D2B771 Mustard Conductor 9.5:1
#5FA772 Forest Logic 6.4:1
#5FB8C0 Ocean Data 8.1:1
Markup

Buttons

shipped

Two variants, no third. Primary carries a 3px hard shadow and translates the full 3px on :active, so the press is a detent with a hard stop rather than a fade. Press one: the travel is the whole point, and it is 90ms.

Markup

Eyebrow

shipped

Mono, uppercase, burnt ink, with a rule that fills the rest of the line. Marks a section without spending a heading level, which matters on docs pages where the heading levels are the table of contents.

Verification · datasheet oracle

Markup

Status tags

shipped

Read-only status. Not interactive: if it can be clicked it is a chip, not a tag. .fail is red and red means one thing in this system: an invariant that is asserted somewhere in the test suite did not hold. Not "bad", not "important". Broken.

1725 nodes Oracle clean Settle rounds 41/100 contested_groups = 3
Markup

Measured chip

shipped

The repo's own rule made visible: every number on the site says which run produced it. The glyph lives in ::before so it never lands in a copy-paste. A figure without one of these is a figure somebody typed, and the reader is entitled to know which they are looking at.

halfphi ff3c81a · run Aug 21 visual6502 netlist · read Aug 09
Markup

Notice

shipped

One per page at most: a second one means neither gets read. Orange edge for something a human needs to know; red edge only when an assertion fired.

Die data is not ours. The node numbering and die photography follow visual6502. See NOTICE.md before redistributing anything under /atlas.
Rail violation. Node 657 is declared VCC and toggled at h=118. The trace below is served as-is; it has not been clamped, because clamping it at export would hide where the solver went wrong.
Markup

The frame

Page identity and navigation. The docs nav is the one with a rule attached to it: it is derived from the directory tree and never from a list, because a nav missing one link still looks exactly like a nav.

The hero

shipped

The binder's H1 layout: display caps, heavy and tight, over a serif lede and a CTA row. This page's own header is the same grammar; the kit class is what the front page wears. --text-hero existed unused from the day the tokens landed, and this is the component it was cut for. The CTAs are .btn, never .push: chrome stays at the paper/panel boundary.

There are 1725 wires and 3510 switches on a die photographed out of a physical chip, and the behaviour falls out of simulating them.

Markup

Masthead

shipped

The page identity block. The tile is a die pad (ink ground, mustard legend) and it carries the card shadow so it reads as a component sitting on the paper rather than a shape printed on it.

6502

Switch-level engine

halfphi

1,725 nodes 3,510 transistors Verified Aug 21
Markup

Breadcrumb

shipped

Mono uppercase. The current level is a <b>, not a link: a link to the page you are on is a dead control.

Markup

Docs tree nav

draft

Rendered from the directory under docs/, never from a nav.ts. Two levels of visual treatment because the tree has two kinds of node, directory and page; if a third appears, the answer is to flatten the tree rather than invent a third style. A page with no frontmatter title fails the build instead of appearing here as "Untitled".

Markup

Filter chips

shipped

Real <button>s with aria-pressed, because colour is never the only status signal: the pressed state inverts the fill and the text colour. Try them.

Markup

The panel

The panel is the machine talking. A dark box on a tinymachines page means the values inside it came out of the engine on a run that happened: it is a semantic, not a dark theme. Never put marketing copy on a panel; never render live node state on paper.

Panel and bezel

shipped

Chrome is an edge, never a fill. The bezel is a 3px brushed gradient ring with an inner dark lip, and its whole job is to mark where the documentation stops and the instrument starts. If chrome shows up anywhere that is not that boundary, it has become decoration and should be deleted.

Memory explorer v1.0

The face. Everything else in this section goes inside one of these.

Markup

Phase rail

shipped

The signature of the whole system, and the one component that exists because of what this simulator is. Two cells, φ1 and φ2, and they are never both lit: the non-overlap guarantee is an axiom of the engine, so the component makes the illegal state unrenderable: lit-ness comes from one data-phase attribute on the parent, not from a class on each cell. Every live panel wears one.

φ1φ2 h=118
Markup

Half-cycle scrubber

draft

Ticks are half-cycles, not cycles. h is the unit the engine counts in and an axis that quietly converts to cycles will disagree with every log line the reader is holding. Alternating fills carry the phase so a glance tells you whether you are parked on a precharge or an evaluate.

h=0  φ1h=118  φ2  HEREh=255  φ2
Markup

Register file

shipped

Left rule is forest when the value held across the half-cycle and blue when it changed, so a scan down the column reads as "what moved". The settle flash is 150ms and does not repeat: a register that changes every half-cycle would otherwise strobe the page.

PC0x0605
A0x43
X0x00
Y0x00
S0xFD
Markup

Status flags

shipped

Eight cells, always eight, always in NV‑BDIZC order. Bit 5 does not exist as a flag but still occupies its position at reduced opacity, because renumbering the bits to close the gap is how a reader ends up counting wrong against the datasheet.

NVBDIZC
Markup

Memory monitor

shipped

Address is ocean, data is glass, and they are different hues on purpose: an address is an index and a byte is a value, and reading one as the other is the classic error a hex dump invites. Bytes touched this cycle are marked (burnt fill for a write, mustard text for a read) so the dummy write on a read-modify-write instruction is visible rather than inferred.

0600A9428D00026901EA·B····↑·
06084C00060000000000L·······
02004200000000000000B·······
Markup

Signal trace

draft

Rows are grids of half-cycle cells: a high cell draws a top border, a low cell draws a bottom border, and the vertical edge falls out of adjacency. That is why transitions land exactly on the grid and never a pixel off: the geometry is doing the alignment rather than a hand-placed line. Bus rows carry values, not levels, and hatched means high-Z.

φ1
φ2
SYNC
R/W̅
ADDR
06000601060206030604z02000605
DATA
A9428D0002z4269
Markup

Readout table

shipped

The tabular component for values that came off the engine. .ledger is the paper table and stays paper: ink hairlines and a paper ground are right for documentation and wrong for measurements. This is scoped inside .panel-face so it cannot be dropped onto paper by accident, which is section 1's rule made structural rather than remembered. The changed value is mustard, because mustard is the value colour and a byte that just moved is a value being emphasised, not a new meaning.

$2E + $14 measured
afterhalf-cycleAPC
LDA #$2E4$2E$0202
ADC #$1412$2E$0205
+1 half-cycle14$42$0206
Markup

Die & engine

Specimens that only make sense for this project. Everything here is coloured by the solver's own vocabulary, so a screenshot and a stack trace use the same words.

Node inspector

draft

Colour follows the Drive enum, and the legend is printed in ordinal order (Floating, ChargedHigh, PullDown, PullUp, Vcc, Vss), because that order is the resolution rule. Do not sort it alphabetically. ChargedHigh is deliberately the dimmest lit state: it ranks below the real pulls, and that ranking is what makes dynamic retention work across a phase, so the colour should say "held, not driven".

Floating ChargedHigh PullDown PullUp Vcc Vss
Markup

Contested strobe

idea

A node in two groups pulling against each other. contested_groups is asserted zero in the test suite, so this cell should be unreachable in a healthy run, which is exactly why it gets the only red in the system and the only strobe. Four hard steps in 160ms and then it holds red; it does not blink forever, because a permanent blink becomes wallpaper within a minute.

node 657 · contested · h=118 φ2
Markup

State grid

shipped

Binary status at a glance for a set of like things: one cell per opcode, per test, per cartridge. Each cell carries its label as text so the grid is readable with colour removed entirely.

LDALDXLDYSTASTXSTY ADCSBCANDORAEORBIT JMPJMP()JSRRTSARRXAA
Markup

Settle histogram

draft

Rounds to convergence against the MAX_SETTLE_ROUNDS = 100 ceiling: X is rounds taken, Y is how many half-cycles took that many. The number that matters is the rightmost bar, not the tallest: the mode tells you what is typical, the tail tells you what the ceiling has to survive. So the tail gets the red and the mode gets nothing, because colouring the mode would answer the wrong question.

rounds to converge →worst observed 41 · ceiling 100
Markup

Tactile controls

All five share one rule: the moving part travels a real distance in 150ms and stops hard, and the lit state is a glow on the part that moved, never a colour change on the housing. Simulate mechanical resistance, not nostalgia. No slow fades, no zooms.

Precision toggle

shipped

The lever throws the full height of its slot on the detent curve: fast out, hard stop. On is signalled three ways at once: position, glow, and the label's colour, so it survives both greyscale and reduced motion. Click it.

Markup

Rotary encoder

draft

Knurled ring, polished cap, and a value that steps rather than slides: the knob rotates to the next detent in 150ms and never lands between them. The readout carries both the decimal and the hex because the person turning it is picking an address. Drag it or use the arrow keys.

75 VALUE: 8bit (0x4B)
Markup

Push-button

shipped

Linear travel, 3px down and no bounce. The armed variant is backlit in Signal Orange and is reserved for an action that changes machine state you cannot get back: a reset, a flash. If nothing is destroyed, it is not armed.

Markup

Logic slider

draft

The track is ticked at the grid so drag feels granular rather than continuous, and the ends print their values because a fader with no scale is a guess. Handle is brushed, not polished: it is the part that gets touched, and polish on a touched surface reads wrong.

0x0000ADDRESS0xFFFF
Markup

DIP bank

idea

Eight switches on a burnt-silicon carrier, for the places where the setting genuinely is a bit field: trace channel enables, a mask. Do not reach for this when a checkbox would do; it earns its keep only when the reader is thinking in bits and the on-screen arrangement should match the one in the register.

MASK = 0b10110010 · 0xB2
Markup

Data & rails

Dense display on paper. Everything here is tabular-nums mono so columns line up, and every table scrolls inside its own container rather than widening the page.

Ledger

shipped

The dense table. Numeric columns are right-aligned and tabular so digits stack; the name column is sans, because it is the only column that is prose. Status carries a word, never a bare dot.

OpcodeModeCyclesHalf-cyclesOracle
LDAimmediate24Match
LDAabsolute48Match
INCabsolute612Match
JMPindirect510Page bug
ARRimmediate24Diverges
5 of 256 shownFull matrix →
Markup

Rail panel · key/value

shipped

Sticky at ≥64rem. Keys are mono uppercase muted, values are bold and right-aligned. Values stack under their keys on narrow screens rather than squeezing to three characters.

Markup

Coverage bar

shipped

The hatched fill means partial or provisional. A placeholder must stay visually distinguishable from verified data at a glance and in greyscale, which is why the difference is a texture and not a lighter shade of the same green.

Opcodes matching oracle243 / 256
Undocumented coveragePartial
Markup

Coin meter

draft

Coins are given away, never sold: decided, and closed. So the meter shows a budget remaining and there is deliberately no "buy more" affordance to design around; when it empties, the copy points at a way to earn rather than a checkout. Designing a price into this reopens a question that is currently shut.

6 of 8 runs left today Earn more
Markup

Code block with run marker

shipped

Code is panel, because a code block is the machine talking. Any block that states an output carries a RAN stamp with the date, which is the docs rule with a place to live: if it says the answer is $42, somebody ran it, and the page says when.

halfphi · shellbash
# step one instruction and dump the accumulator
halfphi run "LDA #\$42" --halt-on sync --dump a
A = 0x42   h=4   φ2   settled in 7 rounds
Markup

API endpoint card

draft

One card per route, generated from the Pydantic model that validates the request, so the field list here and the validation cannot drift. Every parameter carries a description because a parameter with no description is the thing the reference is for.

GET/api/v1/node/{id}/trace
Drive state for one node across a half-cycle window. Returns the resolved Drive per h, plus the group it resolved in.
idvisual6502 node number, 0–1724.
from_hFirst half-cycle, inclusive. Defaults to 0.
to_hLast half-cycle, inclusive. Defaults to from_h + 32.
groupsInclude the resolution group membership. Costs a coin.
Markup

Forms

The kit had no way to take anything in until the admin screen needed one. A control here is a well: paper-sunk inside an ink hairline, the same figure the panel uses for a readout. On this ground the hairline alone says nothing, because it is already the border of every static box above, so "you may type here" is carried by depth.

Field

draft

Label in the mono uppercase voice the rail's keys already use, so a form and a readout describe their contents the same way. The hint sits under the control rather than beside it: beside it, it is the first thing lost when the column narrows.

Becomes a path segment, so it is folded to lowercase.
Markup

Field, refused

draft

The invalid state is a border and a message, never colour alone: red means ASSERTION FAILED in this palette, and it is also invisible to a reader who cannot see it. The message says what is wrong, so the control is not merely marked bad.

Reserved: it is a path this site serves.
Markup

Select and toolbar

draft

Two button variants and no third, so a toolbar is one primary action and the rest ghost. The select keeps its native control: replacing the disclosure arrow means drawing one, and a drawn arrow is a mark rather than structure.

Shown once.
Markup

Monogram

draft

Not decoration standing in for a missing avatar: img-src here is 'self' data:, so a picture on another host is blocked by the browser and renders as a broken image with no error on the page. A letter is a true thing to draw when the picture cannot be fetched, and the URL goes beside it as a link rather than being pretended into an image.

A G Second is a disabled account.
Markup