Skip to content
Site volume
Colourway

Changelog

Changelog

Overprint 0.9.0 is the current release. Five packages move together on one version number, so a version always means the same set of parts.

On this page

Each entry says what changed in plain words and links the components it touches. A component page shows only its own entries under Changelog. Install a version with the install guide; the packages live on GitHub Packages.

Next release

4 changes waiting for the next version

  • Minorgeneratorsgenerators: the brand kit's entries (70 contract item 1): ./brand-core (logoSvg, markMisuseSvg, the outlines, LOGO_PACK, DOWNLOADS), ./brand (buildLogoPack, buildColours, buildDownloads, checkDownloads), ./press (renderPressPdf, PRESS_FORMATS, PRESS_ARTWORK), ./documents (the quote, proposal, invoice, letter and spec-sheet components, computeTotals, formatMoney, formatDate), ./signature (emailSignature) and ./deck (the ten slide components, PRESENTER_SCRIPT); ./pdf gains renderDocumentPdf and renderDeckPdf; ./og gains the announce, quote and stat templates and renderCarousel; the input schemas ship as JSON Schema in generated/schemas/; overprint-gen gains brand, press, doc, signature, carousel, deck and check --brand. The renderers are typed stubs until their Phase 6 packages land.
  • Minorreactbrand: the mark in use is option c, Key block (D-P20), so Mark, Logo, the favicon and the press run print it; the brand data BRAND, BRAND_NAMES, MARK_SPECS (clear space, minimum sizes, the lockup choice) and CHANNEL_VOLUMES (70 BK-1); Logo layout="auto" picks the lockup for its box; "Paid" joins STAMP_WORDS.Touches Logo, Mark
  • Minortokenstokens: the print and slide type roles (70 BB-4): DTCG groups type.print and type.slide, emitted as --mk-type-print-* (pt) and --mk-type-slide-* (px on the 1920 × 1080 canvas) with the classes .mk-type-print-* and .mk-type-slide-*; the spot-ink and stock source src/source/print/spot.json; a provisional json/print.json (CMYK builds through the macOS Generic CMYK Profile, flagged provisional) and its types (PrintFile, SpotFile).
  • Patchfontsfonts: the Mk Label static instance is cut at weight 600, the label role's weight (D-P24), so cards and covers print labels as the site does; fonts:build packs layout tables with fontTools' own serializer, so its outputs never depend on uharfbuzz being installed.

0.9.0

24 October 2026 · commit 4fa1561 · 11 changes

  • Minorfonts, reactP1 kits (P4-T4 to P4-T6). Print: EditionNumber, ProofSheet, DieLine, InkDrawdown and SwatchChip (with inkPairs, the ink's sanctioned pairs in a look), and the Halftone photo plate case. Covers: the stack and releases layouts (coverStack, coverReleases, RELEASE_MARK, RELEASE_WORDS), their alt text and legends, and six fixtures of each (projectStack, projectReleases). Comic: KirbyKrackle, Newsprint, OffsetPlates and SplashTitle. Motion: PageWipe (link activation at Press and Rave, the flip voice) and FlexWord (the width axis on a view timeline), and the SFX width flex at Press and Rave. Sound: the pow, boom, flip and print voices with noise layers, the knock's synthesised fallback and the riffle (playKnocks). Ink field: the SVG still (fieldStillNode in ./art, passed to InkField as still) from a TS port of mk_flow, and the poster on the print kit's shared tiles. Type: the server advance table (anybodyWidthEm, fitEm, estimateFit, FIT_CUTS in ./art), which sizes SFX bursts within 1.5 % of the browser and gives FittedLine an estimate for its first paint. The motion pre-paint script writes data-mk-inview only after hydration (__mkReveal.hydrated(), called by MotionRuntime), so next dev logs no hydration mismatch. Fonts: letterPreloaded, the letterer's opt-in preloading twin for pages that print balloons in the first view.Touches DieLine, EditionNumber, FittedLine, FlexWord, Halftone, InkDrawdown, InkField, KirbyKrackle, Newsprint, OffsetPlates, PageWipe, ProofSheet, SFX, SplashTitle, SwatchChip
  • Minorgenerators, three3D P1 and the GPU stills (P4-T7 to P4-T9). Three: the alphabet twins at every fidelity (model, SVG, CSS 3D, GL geometry, physics shapes; Rave's MORE BLOCKS rains them), the row, topple, twins, stack-1/2/3, line-k/r/a/m and wood arrangements with their text alternatives, the page objects Crate, PlanPlate, Slot, SampleCase and Baseplate, BlockLoader, Topple404, BuildOnScroll, the house camera and an id-colour parity mode in poster frames, the wood grain in GL, specks and Shake, the phone's tap-to-play light rung with "Done", and InkFieldMaterial (the field backdrop in the stage's own canvas). Generators: overprint-gen stills and ./stills (stillFor, the manifest), 72 committed GPU stills, and the cards and block covers printing them.Touches Baseplate, BlockLoader, BuildOnScroll, Crate, PlanPlate, SampleCase, Slot, Topple404
  • Minorgeneratorsgenerators: photos and print (P4-T10, P4-T11). ./photo-core turns luma into halftone plate masks with the ink field's dot maths (lumaToPlate with a polarity and a levels curve, dotRadius, cellCentre) and carries the pure photoConfigSchema. ./photo treats photos with sharp into light and night plates (key at 45°, colour at 75°), writes plates.manifest.json and a typed plates.generated.ts, checks them (checkPlates), flattens them for raster targets (flattenPlates), refuses proof screenshots with no override (D-I1) and makes synthetic test photos (syntheticPhoto). <PrintedPhoto> prints the plates as two ink layers that re-ink with the colourway, swap to the night plates on Night stock and drop plate 2 under high contrast. ./pdf prints through one Chromium core (printPage): renderPdf for a site's print route, htmlToPdf and printHtml for a self-contained document (Phase 6's documents and decks), with the sheet helpers (SHEETS, sheetMm, pageMm, sheetPageCss, PRINT_READY_SCRIPT). <PosterSheet> (A3, Tabloid, 3 mm bleed with crop marks) and <OnePager> (A4, Letter, onePagerInputSchema) lay out in mm. The CLI runs photos (with --check and --base) and pdf. Fonts resolve inside a bundler that lacks import.meta.resolve, so opengraph-image.tsx and static card routes build under Next.js Turbopack.
  • MinorreactP1 components and desktop toys (P4-T1 to P4-T3). Base UI wrappers: Combobox and ComboboxItem (a case- and accent-insensitive filter by default, groups, chips for multiple, "Searching…", an empty message, a live result count, and inline for a list printed in place), Popover with PopoverTrigger, PopoverContent and PopoverClose, Menu with its eleven parts (shortcuts as Kbd caps, checkbox and radio items, group labels, separators, submenus), and ToastProvider with useToast (a slab pill, one at a time with three waiting, 5.2 s with a drain bar that holds while the region is hovered, focused or the window is away). Server components: Breadcrumbs, Pagination (with paginationRange), Count, ProgressBar (bar, segments, indeterminate), Avatar and AvatarGroup, Tick, EmptyState, Kbd, Skeleton and Loader. Client leaves: CharacterCount, TableSortButton (in ./table) and BeforeAfter. Motion: the additive Cursor and the first-visit PressRun (in ./motion). IconButton's count now prints a Count at its corner. LineBadge letters follow APCA (DF-39): the 16 px badge prints its shape glyph alone, the 24 px badge an 18 px letter, 32 and 48 both (LINE_BADGE_TYPE). VisitorControls takes sound={false} and extra dials as children (DF-40). Section's development check accepts an Art from any copy of the module through a Symbol.for brand (ART_BRAND, isArtElement; DF-48).Touches Avatar, BeforeAfter, Breadcrumbs, CharacterCount, Combobox, Count, Cursor, EmptyState, IconButton, Kbd, LineBadge, Loader, Menu, Pagination, Popover, PressRun, ProgressBar, Section, Skeleton, TableSortButton, Tick, ToastProvider, VisitorControls
  • Minortokens./derive exports stockRoles (with its StockOverlayLadder type): the accent stock laid over a look's roles, as pairsForLook and the client report read a pair row with a stock, so a caller can resolve a client look's stock pairs too (the press check's rule 4 on the client looks).
  • Patchgeneratorsstills: the last fallback path of the stills folder carries Turbopack's ignore comment too, so a Next.js app that imports ./og or ./stills no longer traces the whole project into its server output ("Dynamic filesystem access causes tracing of the whole project").
  • Patchreact, threeThe P1 press repair (I4-G). React: Combobox gives its inline list an id and the input's name in the server markup and marks its box as the input's focus-ring host, and a highlighted row's second line prints in --mk-text; the EmptyState and Popover descriptions print in the meta role (16 px, 500, so --mk-text-2 clears the APCA floor); SplashTitle's Quiet heading prints on its own paper plate and wraps inside its cell; the Toast viewport and specimen keep one column no wider than their box; ProofSheet's frame links draw the focus ring. Three: a still's letter path carries data-mk-glyph, and a letter block marks its line only while its letter faces the view.Touches Combobox, EmptyState, Popover, ProofSheet, SplashTitle
  • Patchreactmisregistration: display type (mk-type-display, mk-type-head-section, mk-type-head-card and the second ink's .mk-ov) breaks a word that is wider than its column inside the box instead of overflowing it, so a long word at the display floor no longer pushes a 320 px page sideways (DF-52, WCAG 1.4.10). Lines whose words fit are unchanged.Touches Misregistration
  • Patchreactphone-frame: video in a PhoneFrame starts paused with a play and pause key at the frame's bottom end (the client leaf PhoneVideo, on IconButton's markup, named "Play {label}" and "Pause {label}"), instead of the platform's controls (DF-33, supersedes D-N78). The video stays muted and inline and never autoplays (D-E3).Touches IconButton, PhoneFrame
  • Patchreactvisitor-controls: the inline volume dial takes a line of its own width in VisitorControls, so its four stops sit in a row on a desktop footer instead of shrinking into one narrow column beside the theme key (DF-51). In a narrow sheet it still wraps to its own line.Touches VisitorControls
  • Patchreactmotion: PageWipe sweeps again at Press and Rave, across and off the page. The tokens print --mk-dur-wipe as a weighted calc() of the volume weights, which a custom property read returns unresolved, so the leaf read a duration of 0 and never ran; it now resolves the duration through a transition duration (a literal time on the property still reads directly). And the bands keep no resting translate beside their skew: the CSS build folded the two into one transform, which the sweep's keyframes added to, so the bands started and ended 150 % too far left (parked in view at the end) and the docs' mid-sweep preview sat off to the left. Found by the release's flash review.Touches PageWipe

0.1.0

24 October 2026 · commit 2a06492 · 14 changes

  • MinorAll five packagesFreeze the public contracts: exports maps, attribute, token and class names, file shapes, and typed stubs for every export another package imports (P0-T2).
  • Minorfonts, reactFonts: Latin woff2 subsets of Anybody (upright and italic, full width and weight axes), Schibsted Grotesk (upright and italic), Shantell Sans (INFM 30, BNCE 0, SPAC 10 built in) and Geist Mono (code only), the nine static instances for Satori and resvg with their role families, ./css with @font-face and the --mk-font-* variables, the licences, a hash manifest and the ./next module of six next/font/local fonts (display and text upright preloaded). React: the shape alphabet on the 18 and 16 grids as GLYPH_PATHS, one server-safe icon component per glyph under ./icons/* and raw SVG under ./icons/svg/*.
  • Minorgeneratorsgenerators: the core (P3-T10 to P3-T13). ./measure reads the static instances' advances (a small TrueType reader and a generated table, so measuring works on the server, in the browser and on the edge) and fits text without ever truncating (fitText, fitBox, FitError). ./raster rasterises with resvg-js 2.6.2 and the static fonts (fontFiles; the native build has no fontBuffers). ./og renders the 8 card templates at 4 sizes: Satori 0.63.2 sets the text plate's lines as paths beside vector art (30's block stills cropped to their bounds, halftone fades in the template's ink, the cover module's plates, the ink field poster), Press on Bone by default, Studio for article, page and docs, Rave on Night for the edition card. ./cover builds case-study covers from project data as one pure SVG tree: the poster and comic layouts, projectPlate and articlePlate on 21's GridPlate with role inks (D-N14), posterBandsSvg printing the live field's own flow, grainTile paper flecks, resolveSvgInks, and <CaseCover> in ./react. ./icons writes the favicon and app icons from faviconSvg. The overprint-gen CLI runs cards, icons and check.
  • MinorreactThe reading layer's controls, overlays, forms and visitor prefs (P2-T1 to P2-T5): every Button is the comic hit key, with IconButton, Link and Tooltip; Input, Textarea, Select, Checkbox and CheckboxGroup, Radio and RadioGroup, Switch, Slider with the ruler, RulerReadout and SegmentedControl; Dialog, Drawer, NavSheet, Tabs, Disclosure, Faq and faqJsonLd on Base UI 1.9 where the platform falls short; Field, Fieldset, Form with the site's inline validation, ErrorSummary, Callout, Honeypot, FormTimestamp and QuoteForm; PrefsScript under 1 KB, usePref and setPref with cross-tab sync, ThemeToggle and the visitor VolumeDial; VisuallyHidden.Touches Button, Callout, Checkbox, Dialog, Disclosure, Drawer, Field, Form, Honeypot, IconButton, Input, Link, NavSheet, QuoteForm, Radio, RulerReadout, SegmentedControl, Select, Slider, Switch, Tabs, Textarea, ThemeToggle, Tooltip, VisuallyHidden, VolumeDial
  • MinorreactThe reading layer's layout, navigation, data, content and brand components (P2-T6 to P2-T10): Section with its plate and Art slot, Plate, VolumeScope, PageHero, SectionHead, Eyebrow, Card, LineCard, InfoPanel, Stack, Cluster, Grid, Container, Main, Rule and the FittedLine client fitter; Navbar with the NavDisclosure mega panels, Footer, FooterMap, BuildStamp, SkipLink, ActionDock and VisitorControls; the Table parts, ComparisonTable with the one-tier switcher, SpecStrip, Numeral, Stat, StatGroup, StatusChip, Badge and ScoreDial; Prose with mdxComponents, Quote, CodeBlock with CopyButton, Figure, ScreenshotFrame and PhoneFrame; and the brand: the three evolved 2 × 2 options in markGeometry (a Overprint by default, b Paper seam, c Key block) with the pixel-snapped px mode and the one-ink seam variant, logoGeometry with the 1x clear-space frame, Mark, Wordmark, Logo, MaxosMark and LineBadge.Touches ActionDock, Badge, Card, Cluster, CodeBlock, ComparisonTable, Container, Eyebrow, Figure, FittedLine, Footer, Grid, InfoPanel, LineBadge, LineCard, Logo, Main, Mark, MaxosMark, Navbar, Overprint, PageHero, PhoneFrame, Plate, Prose, Quote, Rule, ScoreDial, ScreenshotFrame, Section, SectionHead, SkipLink, SpecStrip, Stack, Stat, StatusChip, Table, VisitorControls, Wordmark
  • MinorreactThe print and comic kits, P0 (21 P2-T11 to P2-T15): the art core (seeded halftone, bursts, balloons, lines, krackle, printer's marks, SFX layers, the texture tiles and gen-print-tiles), the print kit (Halftone, Overprint, PrinterMarks, Sticker, Stamp, Seal, useStampLand, Tape, Grain, Misregistration and the .mk-ov second ink, GiantGlyph, ShapeGlyph), the data Cover (grid and score, coverAlt, CoverLegend), the comic registers and kit (Panel, PanelGrid, Balloon, Caption, CornerBox, EditorsNote, ContinuedIn, SFX, SfxBurst, SpeedLines, FocusLines, ImpactStar, KeyPop).Touches Balloon, Caption, ContinuedIn, CornerBox, Cover, EditorsNote, FocusLines, GiantGlyph, Grain, Halftone, ImpactStar, KeyPop, Misregistration, Overprint, Panel, PrinterMarks, SFX, ShapeGlyph, SpeedLines, Stamp, Sticker, Tape
  • MinorreactThe ink field, motion and sound (P2-T16 to P2-T20). ./ink-field/chunks: the shared GLSL chunk library (mk_hash, mk_snoise, mk_flow, mk_pal4, OKLab, the round-dot, AM and FM screens, mk_paper, mk_fade) and fieldFragment for the four modes on a canvas or a three material. ./ink-field: the WebGL 2 engine with bursts that settle within 5 s, loops only with a mounted motion toggle, pulses, crossfades, the degradation ladder and renderAt; the gate; the looks; readInks; and InkField, at most two live contexts per page, with its CSS poster and the flat fill. ./motion: the generated panel and title keyframes, the reveal contract and the reduced-motion block, motionPrepaintScript, MotionRuntime (readiness flags, soft navigations, the keydown finisher), the width axis, and MotionToggle. ./sound: the engine (knocks, stamp, pop), the mk:sfx bus, SoundToggle and the four CC0 wood knock clips.Touches InkField, MotionToggle, SoundToggle
  • MinorthreeThe GL stage and the pile (P3-T1 to P3-T4): PrintMaterial and its key hull, letter decal and halftone contact shadow (./materials); the live pile with rain, grab, single-click hop, nudge, TIDY, MORE BLOCKS, Reset, the 5 s settle cap, lean, dip, memory and comic hits, the governor, demand frames, visibility, the context-loss policy, the release, the poster render and the keyboard proxies (./stage); BlocksStage, GlGate with the gate ladder and the hand-over, and the real glPrepaintScript (./gate); the stage plate's CSS with --mk-stage-ratio (./css).Touches BlocksStage
  • MinorthreeThe block model, physics and the SVG and CSS fidelities (P1-T9 to P1-T12): the cast, the logo, mark and pile-a arrangements, the rain and tidy kit constants, the cannon-es PhysicsWorld with the hard settle cap and keep-out columns, letters baked from Anybody, BlockCss, BlockScene with its drop, the card hop, BlockSvg, BlockStill, blockSvgString with resolved hex, BlockMark and faviconSvg.Touches BlockCss, BlockMark, BlockScene, BlockStill, BlockSvg
  • MinortokensTokens P1 (P3-T14 to P3-T16): the client-colourway helper in ./derive (deriveColourway with support and spot, colourwayCss, toDtcg, and hexLook for built-in and client looks; a client's own colour never moves past ΔL 0.25 for a reading role, the role prints a safe fallback and goes to displayOnly); MakrTokens.swift (./swift, every look's colours, Display P3 fills and bands, space, radii, borders, type roles, eases, durations; SwiftUI behind canImport) with swift:check and the root Package.swift; the consumer lint overprint-lint (./lint and the bin: consumer/mk-selector, raw-colour, token-exists, mono, uppercase, glow, loop); --mk-on-control-2 (placeholder ink on the control face); the label role at 14 px / 600 (floor Lc 90, printed in --mk-text); pair rows for display text, the control's second ink and the accent stocks (White, Newsprint, Pulp, Kraft, read on the stock's own ladder via a row's stock); generated/ts/pairs.ts (PAIRS, STOCK_LADDERS, re-exported by ./hex).Touches Newsprint
  • MinortokensReal tokens (P1-T1 to P1-T5): the DTCG 2025.10 source for the core scales, six stocks (Pulp in P0) and the four colourways; the solver and the recipes of 10 §2.3 with the CVD matrix; the index cascade in tokens.css (blocks 0 to 7: variants, the selection rule, keyword switches, Display P3, accent stocks, plates and lines), colourways/{acid,cool,jewel}.css, type.css and tailwind.css; hex.ts, gl.ts, volumes.ts and motion.ts generated with their contract names; pairs.json, report.json (64 looks, CVD, dead zone, caps), looks/*.json, volumes.json, manifest.json, and the DTCG files with resolver.json. gen, gen --check and validate (Terrazzo) run from the package.
  • PatchreactTabs draw their 2 px baseline with plain fills (each tab under itself and the gap after it, and a filler to the list's end) instead of a background image on the list, so the list paints nothing behind its labels; it still sits at the tabs' foot and the focus ring still prints whole outside the tab. CornerBox never runs past its column: in a narrow one under wide text spacing its small line wraps instead of spilling.Touches CornerBox, Tabs
  • Patchreact, threeThe Phase 3 merge's seams. React: the label role (14 px, now 600) prints in --mk-text in Eyebrow, the Card and PageHero eyebrows, SpecStrip labels, the stacked table's cell headers, the Navbar panel's meta and the NavSheet group titles, because no secondary ink reaches the label's floor; placeholders, input start and end text and the select's empty choice print in the new --mk-on-control-2; Art interactive marks no layer, so the 3D stage's own art and plate layers decide (its caption and keys never sit inside an art layer). Three: @react-three/fiber is an optional peer like @react-three/drei, because the stage is imperative three.Touches Card, Eyebrow, NavSheet, Navbar, PageHero, SpecStrip
  • PatchreactFocus rings and reflow in the reading layer (R-47): SegmentedControl, Tabs and CodeBlock draw LC-05's ring outside the focused key (2 px at 2 px) instead of inset; RadioGroup and CheckboxGroup keys and cards, VolumeDial stops and link Cards mark the element that draws the ring (data-mk-focus-ring); a focusable VisuallyHidden draws the ring. StatGroup lays out by its own width (a size container), SpecStrip keeps 2 × 2 inside a narrow container and the Navbar's desktop bar also needs a 60rem header, so phone-width specimens on wide screens no longer squeeze; the Navbar bar wraps rather than spills under wide text spacing. FittedLine refits when its words' box changes (a reader's text spacing), goes below its role's floor before it wraps, and never spills. A ruler range keeps its two values apart, a slider's end figures stay inside it, ComparisonTable and the segmented ThemeToggle name their radios per instance (two on a page no longer uncheck each other), and a Stamp's second line wraps, with the big stamp at 0.6× below 30rem.Touches CodeBlock, ComparisonTable, FittedLine, Navbar, SegmentedControl, SpecStrip, Stamp, Tabs, ThemeToggle, VisuallyHidden, VolumeDial