Skip to content

chore(deps): take Charcuterie's 1.x line — tokens 0.2→1.5, logic 0.1→1.2, server 0.1→0.2 - #11

Merged
Sawtaytoes merged 2 commits into
masterfrom
chore/charcuterie-latest
Aug 11, 2026
Merged

chore(deps): take Charcuterie's 1.x line — tokens 0.2→1.5, logic 0.1→1.2, server 0.1→0.2#11
Sawtaytoes merged 2 commits into
masterfrom
chore/charcuterie-latest

Conversation

@Sawtaytoes

@Sawtaytoes Sawtaytoes commented Aug 11, 2026

Copy link
Copy Markdown
Owner

What

castkit was the furthest behind in the fleet on Charcuterie, and pinned on the range where that is invisible. ^0.2.0 resolves to >=0.2.0 <0.3.0, so pre-1.0 the minor is the breaking channel — every tokens release since (the widened 19-colour ePaper flat-fill palette, the first-paint snippet, the 17px type ramp, the AA fixes to hovered fills and content.muted) was unreachable here, and unreachable silently: the range resolved happily to the old version instead of failing the install.

Package Where Before After
@charcuterie/tokens views, slatecast ^0.2.0 ^1.5.0
@charcuterie/logic slatecast ^0.1.0 ^1.2.0
@charcuterie/server server, slatecast ^0.1.0 ^0.2.0

The five shared build-tooling packages (biome-config 1.0.0, eslint-config 1.1.0, tsconfig 1.0.0, vitest-config 1.0.1, playwright-config 1.0.1) were already at their latest published versions — no change. @charcuterie/ui is deliberately still absent: slatecast is Preact under a 60 KB gz budget and the component layer does not reach it (M5b). Adding it would be an adoption decision, not an upgrade.

No source change was needed, and no token had to be re-mapped. That is a finding, not a shortcut — see below.

Why nothing moved

Crossing 0.2 → 1.5 on tokens should be where a consumer bleeds. It did not, and the reason is specific to what castkit actually reads:

  • Every token castkit reads still exists, under the same name. The whole surface is three TS imports (IntentName, EpaperPalette, epaperColours) and exactly five CSS custom properties — --color-surface-base, --color-surface-raised, --color-content-primary, --color-content-secondary, --color-intent-accent-solid. All five still emit, eight times each, in variables.css. Nothing was renamed or removed out from under this repo.
  • The 17px type ramp (1.3.0) cannot reach either client. Slatecast lays out in vmin/vw/vh — it never reads a --font-size-* and has no rem in its stylesheet — and the ePaper views compute their own sizes in px through fitText. The ramp rebuild is a no-op here by construction.
  • The strengthened content.muted (1.5.0) cannot reach it either. Slatecast's --fg-dim aliases content.**secondary**, which did not move. content.muted is not read anywhere in the repo.
  • The six Spectra 6 inks are byte-identical to 0.2.0. 1.0.0 re-derived them from Pimoroni's driver at saturation = 0.5 rather than retyping them, so epaperColours dumps the same values it did before. Confirmed by dumping the object and by the ePaper screenshots below being byte-identical PNGs.
  • createStaticHandler's 0.2.0 is purely additive (a new optional rewriteRequestPath).

Gates

All run on this branch, all green:

Gate Result
yarn typecheck pass
yarn lint (Biome + ESLint) pass — same 9 pre-existing Biome warnings as master, no new ones
yarn vitest run 221 passed / 31 files
yarn e2e 5 passed
yarn build pass
yarn build:storybook + :slatecast both build

Bundle: slatecast ships 6.51 kB gz CSS + 12.98 kB gz JS. The tokens stylesheet grew 0.11 kB uncompressed and got 0.07 kB smaller gzipped — 19.5 kB against the 60 kB budget.

Visual verification

Every Slatecast kiosk view, in both schemes, driven to a populated state (real track, real queue, real agenda, real photo) at the Media Controls 720×720 panel, plus the round 480×480 Porthole. Left half is built at tokens@0.2.0/logic@0.1.0, right half at 1.5.0/1.2.0.

Verdict: nothing reflowed. Of the 25 captured pairs, the ones that differ at all differ only in the live clock digit or the ticking elapsed-time counter (0:320:31); nine slatecast pairs and all seven ePaper pairs are byte-identical PNGs. No clipped text, no wrapped buttons, no broken grid, no overlapping chrome, no blown-out fixed-width container.

Now Playing

now playing — dark
now playing — light

Queue

queue — dark
queue — light

Calendar

calendar — dark
calendar — light

Weather

weather — dark
weather — light

Ambient and Clock

ambient — dark
ambient — light
clock — dark
clock — light

Porthole — the round 480×480 panel

The circle-safe 9% inset is where a taller type ramp would have shown up first. It did not.

porthole now playing — dark
porthole now playing — light
porthole calendar — dark
porthole calendar — light

ePaper (Inkcast) views — byte-identical

Live in-browser dithering, so this is the real quantizer output, not a mock.

epaper now playing dashboard — Impression E6
epaper — every text view on every panel

Notes for the reviewer

  • GitHub has no issue-attachment endpoint a CLI can post to, so the comparison images are committed into this PR branch under docs/images/ and referenced by SHA-pinned raw URL. They merge into master with the change, so they still resolve for whoever reopens this PR in a month. That is the deliberate trade for ~1.2 MB of PNGs in the diff and in history.
  • Not done here, deliberately, because each is an adoption decision rather than an upgrade: taking @charcuterie/ui, adopting buildFirstPaintRule/buildFirstPaintCss (castkit hand-stamps data-scheme in the page shell today), and taking the new 19-colour ePaper flat-fill palette / epaperPanels registry, which is now reachable but which @castkit/core has its own equivalent of.

🤖 Generated with Claude Code

Sawtaytoes and others added 2 commits August 11, 2026 00:15
…1.2, server 0.1→0.2

castkit was the furthest behind in the fleet, and pinned on the pre-1.0 caret
where the MINOR is the breaking channel: `^0.2.0` resolves to `>=0.2.0 <0.3.0`,
so every tokens release since — the widened 19-colour ePaper flat-fill palette,
the first-paint snippet, the 17px type ramp, the AA fixes — was unreachable
here. Silently: the range resolves happily to the old version rather than
failing.

- `@charcuterie/tokens` `^0.2.0` → `^1.5.0` (`views`, `slatecast`)
- `@charcuterie/logic`  `^0.1.0` → `^1.2.0` (`slatecast`)
- `@charcuterie/server` `^0.1.0` → `^0.2.0` (`server`, `slatecast`)

The five shared build-tooling packages (biome-config, eslint-config, tsconfig,
vitest-config, playwright-config) were already at their latest published
versions. `@charcuterie/ui` stays out: slatecast is Preact under a 60 KB gz
budget and the component layer does not reach it (M5b). Adopting it would be an
adoption decision, not an upgrade.

No source change was needed. Nothing castkit reads was renamed or removed: the
six Spectra 6 inks are byte-identical from 0.2.0 (1.0.0 re-derived them from
Pimoroni's driver rather than retyping them), and all five custom properties
slatecast aliases still emit. `createStaticHandler`'s 0.2.0 is purely additive
(`rewriteRequestPath`).

Gates: typecheck, biome, eslint, 221 vitest tests, 5 playwright e2e, and
`yarn build` all pass. Slatecast ships 6.51 kB gz CSS + 12.98 kB gz JS — the
tokens stylesheet got 0.11 kB bigger uncompressed and 0.07 kB SMALLER gzipped.
Committed into the PR branch rather than the orphan branch the PR body invited
deleting — a raw.githubusercontent URL only resolves while a ref reaches the
blob, so deleting that branch would 404 every image on the PR (agentic decision
2026-08-11).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@Sawtaytoes
Sawtaytoes merged commit 2c009af into master Aug 11, 2026
5 checks passed
@Sawtaytoes
Sawtaytoes deleted the chore/charcuterie-latest branch August 11, 2026 09:27
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant