Latest 0.2.0-rc.30 · Updated
Changelog
Every release of Beamline and what changed in it, newest first. The same file ships in the kit; agents get it through the MCP server.
0.2.0-rc.30 — 8 October 2026
- Loading keeps the page still. Metric card, bar list, tracker, category bar and timeline take
loading: each draws placeholders in its own loaded shape, at its real height, so nothing below moves when the data lands. The analytics dashboard uses them (its loading view was 12–174 px shorter per panel). New in the skeleton family:SkeletonLine, one line of text that has not arrived, andSkeletonGroupnow holds shapes at any depth. Placeholders stop for reduced motion in CSS, so a part that only shows them stays small (about 3.5 KB less per part than reading the look's motion). - Streamed answers stop hopping. A word no longer drops to the next line and back as the next word arrives (paragraphs that stream wrap greedily; the even rag stays for answers that load finished), a table lands whole instead of re-sizing its columns row by row, and cited text no longer jumps a line as each word lands.
- Small moves now glide. Reasoning steps grow into place instead of pushing the content below by a row, and its chevron glides as "Searching… 3s" becomes "Searched the web". The price chart's "Loading… 2s" pill eases to its new width; the ticker holds its arrow's place before the first move, so the change badge stays put.
- Text keeps its size while the font loads. Until Geist and Inter arrive, text is set in a stand-in matched to
their width at each weight (regular, medium, semibold) and to their height, so lines keep their breaks and controls
their width when the real face lands. The gallery and beamline.io also ask for Geist with the page itself, so on a
slow first visit it is there before the charts draw (no control moved in Bench's slow-4G pass). In your own app,
preload the look's Latin font file (
next/fontdoes this for you). - Import mapping keeps its status line after the check ("45 of 48 rows will be imported"), so the columns below stay put; the market heatmap's hover card opens under a tile at the top of the screen instead of above it.
- Light bands answer the scroll. Each band moves at its own depth as its section passes (
risesinks and turns as the hero leaves,arcswings in behind the plan,horizongrows up from its edge), and a pulse of light runs along it while the page moves. The compositor runs it; nothing runs at rest or under reduced motion.scroll={false}keeps the slow turn alone. - Sign-in holds an auth service's bot check.
SignIntakeschallenge: the check (Clerk's Turnstile box, for one) renders in the card under Continue, stays across steps and takes no room until it asks; a box wider than a phone's card stays centred. - Agents: the MCP server's instructions, the AGENTS.md/CLAUDE.md block and the skill that
beamline-connectwrites now say the same five steps, in order, and how to sign in. - The kit's finder takes the names you see in code.
find.mjs --id FormField(and the local MCP server'sbeamline_component) resolveFormField → form,ColorPicker → color-picker,@beamline/data-grid → data-grid; the hosted MCP has done this since rc.29.
0.2.0-rc.29 — 8 October 2026
- List highlights are back from the first moment. Since rc.25 the command menu opened with no row lit until you typed; the plate that marks the active row now places itself as the list appears. Select and Time picker's hover plate, which never followed the pointer in a production build, now does.
- A wide data grid fills its width. When the columns are narrower than the grid, the widest text column (a name, a
client) takes the room instead of an empty band at the end;
columns[].growpicks another column or keeps one fixed. - FormField outside a Form says so. Instead of react-hook-form's "cannot destructure control of null", it tells
you it must sit inside
<Form form={useForm(…)}>, and what to use for a single field. - The audit no longer calls a needed part unused. A part another part depends on (the sidebar inside
app-shell) is not flagged for removal. - Guide: keep Prism unless you ask for another look or your app must match an identity it has. The Next.js notes add
the two rules a new app's Cache Components enforce on your own code (read today's date after mount;
usePathnameinside<Suspense>) and howAppShellandPageHeaderitems navigate client-side.
0.2.0-rc.28 — 8 October 2026
- Fewer renders where a part's element arrives late. A part whose measured element appears a moment after it (the treemap's plot, inside its frame) keeps its scope's timing and colours until then instead of dropping them and rendering twice; chips in a tag input animate with timing read at their own row. Treemap mounts with 21–74 % fewer renders, tag input with one commit fewer.
0.2.0-rc.27 — 8 October 2026
- One licence for your whole team. The licence has no seats: everyone who works on your apps, employees and
contractors alike, uses Beamline under the one licence you bought (
LICENSE.md, draft 0.2). Nothing else changes: any number of your own and your clients' apps, commercial ones included; the parts may not be resold as a kit.
0.2.0-rc.26 — 8 October 2026
- Chart axes fit their labels on a slow connection. Value labels measured before the look's font arrived kept the fallback font's width, so the axis came out a few pixels narrow and its widest label ran past the edge. Labels are measured again when a font finishes loading.
0.2.0-rc.25 — 8 October 2026
Faster everywhere, measured with our speed engine. Apart from the heatmap and category-bar fixes below, nothing changes how a part looks or moves.
- Parts render once when they appear. Buttons, selects, charts, grids and every other part that reads the look's timing or colours used to render two or three times on arrival while they measured the page. They now start from the values already read in their scope and check them together with every other part in one pass: a screen of buttons renders 58 % less on mount, a data grid 20 % less, charts and selects one or two commits fewer.
- Switching theme no longer re-renders the page. Parts that only read their defaults, the motion choice or the row density stay still; parts that draw with the theme's colours (charts, canvases) read again and only those whose values changed render. A data-grid page went from about 2,900 renders per switch to about 300.
- Charts animate with half the updates. The axis-label measure no longer forces style work on every frame of a change.
- A loading activity heatmap is one part, not 2,700. Its placeholder cells share one visibility and motion check
(new
SkeletonGroupinskeleton); mounting costs 60 % less, and the cells now have the plot's own square shape. - Category bar labels never overlap. A boundary too close to its neighbour (99 next to 100 over a 1 % segment) hides; the two ends always show and the legend still names every share.
- File diffs are 2.7× faster on a 400-line file, with exactly the same result.
- For your own components:
useScopeMotion(),useScopeDensity()anduseScopeChanges()read one part of the scope without rendering for the rest;useResolvedAppearance(ref, { …, typography: false })skips the host's type when you only need timing or colours.
0.2.0-rc.24 — 7 October 2026
- Settings inside your page end at their last field. With
navigation="none"the block no longer keeps empty room for its save bar; the bar takes its place when there is something to save. - Guide: an app already on an older Beamline release adds
--upgradeto the install line to move to the new one.
0.2.0-rc.23 — 7 October 2026
- A loading data grid holds its height. Since rc.21 a grid with a few rows fits them; while loading it showed its
skeleton rows at their own height and grew when the data landed. Loading or empty now keep the full
height. - Settings inside your page flow with it. With
navigation="none"the block is as tall as its form and the page scrolls, so the save bar floats at the bottom of the window while you edit.
0.2.0-rc.22 — 7 October 2026
- Settings inside your own page. With
navigation="none"the settings block sits flush in the page that hosts it: your background, your left edge, your heading. The profile section speaks plainly ("Your name and how to reach you") instead of a team product's words, andtimeZones={[]}leaves the time zone out. - The audit no longer miscounts option lists built at runtime. A Select fed
[...new Set(currencies)], or a list named like one in another file, is no longer reported as "Select with 1 options"; a list spread from a named one ([ALL, ...options(GOALS)]) is counted in full. - Guide: the
analytics-dashboardblock is for a SaaS's own metrics, other homes compose metric cards, a chart and a bar list; filters you show outside a data grid share its state instead of adding a second set.
0.2.0-rc.21 — 7 October 2026
- Fields line up in a row. A field next to a taller one (its neighbour has help text or an error) keeps its box at the control's height instead of stretching with the row.
- A data grid's
heightis a ceiling. A few rows take only their own height; the grid scrolls once its rows pass the height. An empty grid keeps the full height for its message. - A required field's name is its label's words. Inputs, text areas, number, phone, password, select, combobox,
segmented control and radio cards announce "required" once, from the control, so
getByLabel("Email", { exact: true })finds the field. Pickers that open from a button still say it in the label. - The phone field shows the country's code, not a flag. "GB +44" in the look's label type: flags are emoji, and Windows does not draw them.
- Step form on a phone: the answers stay under the card, the step list no longer repeats the card's own progress.
- Guide: a form of several screens is the
step-formblock, which is the form element itself (answers inuseState, each step'svalidate);formis for one screen. Its example shows each answer as the person saw it.
0.2.0-rc.20 — 7 October 2026
- Prism has its own material: cut crystal in a dark room. Parts are drawn by their edges, which catch light from the top left and fade along them; fields are channels cut in, their lower lip lit; cards are slabs lit at the top-left edge over a deep shadow. Corners are crisper, motion rigid and quick, icons finer (1.5), type is Geist throughout with Geist Mono labels and the highlighted word in an Instrument Serif italic. Colour appears only where attention is: one line of split light under the main action while it is pointed at, along the bottom of the field being written in, under the chosen tab, and along a card's edge near the pointer (with edge light on).
- Prism's split light depends on the angle, like a real prism. It lives inside the glass: along the main action's bottom edge (with a faint wash rising into its face), along the bottom of the field being written in, under the chosen tab. It comes in long runs of colour with gaps, never one even gradient. Each button has its own angle, the pointer turns it across the face, each press lands on a new part of the spectrum, and a change of word or colour (Save → Saved) sweeps a soft band of split light across once. A field's line lights from the centre out and drifts while focus stays; the tab's line sweeps as it travels; a card's edge flares only as the pointer arrives, each flare its own shape. Still at rest; never under reduced motion.
- No emoji in the interface. The audit (and the Claude Code Stop hook with it) makes an emoji in a button, heading, tab or empty state a FIX and names the lucide-react icon to use; a chat's reactions are content and pass.
- A look brings its own typefaces. Installing a look installs its fonts (Prism: Geist, Geist Mono, Instrument Serif), so an app shows the look's type without asking; a face loads only where text uses it.
0.2.0-rc.19 — 7 October 2026
The complete system contains 190 catalog entries and nine looks. This candidate gives Beamline a default look of its own.
- Prism, the new default look. A black page, neutral glass whose facing edges catch white light, and a white main
action with near-black words (ink-black on white in light). Colour appears only as light: two faint, far-off
corners of the page, amber and blue, and the charts, which keep a natural spectrum whatever the brand. Set
brandand the main action, focus ring, the agent's orb and the working glow take your colour instead. Installs, new styles and aUIRootwith no preset now start from Prism; your app keeps the look it installed. - A look's own colour now reaches your app.
UIRootused to apply the blue accent whenever none was asked for, so a look's own default brand never showed under it (Pop's tomato included). Leaveaccentunset to get the look's own; set it, orbrand, to choose. - Light band (
light-band): a slow band of split light behind a section, for a hero (rise), the plan you sell (arc) or a closing call to action (horizon). Painted once, it barely moves and only while on screen, and stays still under reduced motion. - The free sample's two looks are Prism and Metal.
- Agents: the Claude Code Stop hook also sends back a screen the session rebuilt only from another component kit.
0.2.0-rc.8 – rc.18 — 6 and 7 October 2026
Candidates made while coding agents built real apps with Beamline; each change answers something an agent got wrong. The complete system grew to 189 entries (190 with rc.19's Light band).
- Choice controls show their label like every field (rc.15). Segmented control, chip group and radio cards show
their label unless
hideLabel; a view switch or a quick filter passeshideLabel. Upgrading changes screens that relied on the hidden label (see UPGRADE.md). - Dates. The calendar's month title opens the years, then the months, so a date of birth is three picks; date
pickers take
openTo="years", andminDate/maxDatetake"today", read in the browser (rc.10, rc.18). Date and time fields also takeonValueChange. - Next.js. Beamline builds and prerenders in a stock
create-next-appproject: parts that read the clock read it in the browser only, and the installer namesapp/layout.tsx, the stylesheet import and theUIRootline, withclassName="look-page"so the page itself is painted (rc.11, rc.16). - The audit (
audit.mjs, and the Claude Code Stop hook) also catches an unlayered CSS reset that strips every part's padding, inline option lists, Tailwind classes with no Tailwind, another kit's parts beside Beamline's, a dark root with nothing painting the page, a look installed but not shown, Checkbox and Switch givenonChange, and packages installed but unused; the Stop hook sends an agent back when it changed the UI without installing Beamline (rc.12–rc.17). - For agents. The skill reaches every agent that opens the app; MCP answers come in parts small enough to read; the notes say the tools are tool calls, not shell commands; Step form carries a complete typed example (rc.10–18).
- Install. When nothing was installed the installer says so plainly and how to fix it; an upgrade removes the earlier release's archives (rc.18).
0.2.0-rc.7 — local pre-release candidate, 6 October 2026
The complete system still contains 188 catalog entries, eight looks and eight reference screens. This candidate is about agents: an agent pointed at Beamline now uses the whole system instead of text fields and dropdowns.
- Agents read the whole menu first.
CAPABILITIES.md(in the kit, and fromfind.mjs --capabilities) shows how to choose an element for each kind of data and screen, how to set looks, motion and density, and every element in one line with what to use instead. It ends with the steps to follow. - Agents map every field before coding and keep the table in your app's
BEAMLINE.md; Input, Select and Card are fallbacks that need a reason. - Real API at hand.
find.mjs --idprints the import line, required props, every typed prop, the shapes props take, the parts you can style and working examples. - A check after building.
audit.mjsnames native controls, Inputs typed as numbers or dates, Selects with two to five options, hand-made steppers, hand-repainted colours and packages installed but unused. - Connect an app once.
connect.mjs --app <app>gives every agent that later opens the app the skill, thebeamlineMCP server (Claude Code, Cursor and any MCP client), a Cursor rule and a short block inAGENTS.mdandCLAUDE.md. - Choice controls work as form fields. Segmented control, radio group, radio cards and chip group show their label, help and error like every field, and Slider takes help and an error.
- In the gallery, "Use with my agent" is one button per page with two steps: connect once, copy a short prompt.
0.2.0-rc.6 — local pre-release candidate, 6 October 2026
The complete system still contains 188 catalog entries, eight looks and eight reference screens. This candidate changes chart colours only.
- Every chart colour is readable on its card. With each look's default brand, chart series 1–7 now keep at least 3:1 contrast against the card in light and dark, in every look (the WCAG level for graphics). In light, the shared palette's amber and green are a step deeper, Pop's lemon prints as gold, and Ink alternates its tints (64 % ink or more) with deep ink so neighbouring series stay apart. Ink's seventh series is now a tone of the ink instead of the shared palette's green; its dark series 3 is a little lighter. Dark colours in the other looks are unchanged. A custom brand's own colour stays exactly as you set it.
0.2.0-rc.5 — local pre-release candidate, 5 October 2026
The complete system still contains 188 catalog entries, eight looks and eight reference screens. This candidate carries the owner's decisions on the outside-agent trial (D1–D7 in the spec).
- Charts draw their own SVG. Area, line, bar and composed charts no longer use recharts: one shared cartesian layer draws them, with the same geometry (axes, ticks, paths, bars and labels match the earlier drawing on every chart page) and d3-shape's curves as the only chart dependency. Changing stacking, hiding a series or new data now morphs the marks to their new shape; a settled chart does no work, and reduced motion shows every end state at once. The chart engine's 146 KB (gzip) that followed a chart onto the page is gone.
- Chart colours follow the brand. Series 2–7 keep their distance in hue from series 1, so a warm brand no longer lands on the amber series. With each look's default brand the colours are unchanged; Pop keeps its named sticker colours and Ink its spot-derived ones whatever the brand.
- Install state at the app root. A compiled install keeps its records and archives in the app's
.beamline/instead ofsrc/ui/beamline/.beamline/; an rc.4 app moves on its nextinstall(see UPGRADE). Commit the root.beamline/with the app. Editable-source state keeps only what recovery and merges need (6.2 MB → 1.7 MB after an upgrade in the trial). - Size guards. The outside-agent trial now fails when its app's first-load JavaScript, CSS or dependency count grows more than 10 % over the figures recorded for this release.
- Unchanged by decision: Button keeps Motion behind its deferred features (D2); internal units stay separate packages (D6); foundation stays one stylesheet — a Badge-only app reaches 67 % of it, under the 40 % split rule (D7).
0.2.0-rc.4 — local pre-release candidate, 5 October 2026
The complete system still contains 188 catalog entries, eight looks and eight reference screens. This candidate fixes what an outside agent hit building a screen from rc.3, and carries the morph grammar.
- Installing touches less of the app.
package.jsonlists only what you chose (components, looks, fonts, effects, runtime, foundation); the units they use resolve throughoverrides(npm) or pnpm overrides, registry packages come with the units, and React keeps your range (an rc.3-style install of 16 entries went from 76 entries to 23). An existing rc.3 app is rewritten the same way on its next install. In an npm workspace member the Beamline units are listed directly, because npm applies overrides only at the workspace root. - One stylesheet. Compiled installs write
src/styles/beamline/beamline.css(fonts, foundation, looks, your custom style, components); import it once. Separate per-component imports brought foundation in again for each: the trial screen's CSS went from 329 KB to 205 KB. - Looks add up.
--preset glassadds Glass to the recorded looks instead of replacing them, works without entry ids once something is installed, andremove --preset glasstakes one away (refused while the app still imports it). style addleaves an app that builds. It replaces the root'spreset,brandand other props the appearance sets (and reports them) instead of adding a duplicate spread, and drops a look import that becomes unused.style setrefuses a token the base look does not declare and names the closest ones.- The finder answers every entry, briefly. Charts, video and the rich-text editor no longer crash
find.mjs --id; an installed lookup prints three lines before the answer instead of ~21 KB of hashes (--verbosekeeps them), and--helpworks. Installed packages carry only their own catalog entries and no build-input hashes. - Readable CLI output. Commands print a short summary;
--jsonprints JSON only. - Landmarks and headings. App shell's page area is a
mainlandmark (adivwhencontained, ormainAs); Page header tabs that switch pages render anavwitharia-currentinstead of tabs pointing at missing panels (tabsMode); Card and MetricCard takeheadingLevel. - Reduced motion keeps restrained fades (
--pui-fade-in/--pui-fade-out): dialogs, popovers, menus, Button's label and loader and Skeleton fade; movement stays off;noneremoves the fades too. - Lighter first load. Button and Skeleton load Motion's animation features after the first paint with the same motion; the area, bar, line and composed charts load their chart engine on mount, sharing one chunk.
- DataGrid columns take
aggregateFormatfor the footer figure. INSTALL shows a full-page root (look-page). - Morph grammar. A selection travels instead of switching off and on: tab, segmented, sidebar, tree, pagination,
radio and calendar indicators move as one solid shaped by the look; overlays, dialogs and the command menu open
out of what was pressed and close back into it; task and plan status is one ring that closes into its mark; bars
keep their last change in view; a trade fill and a CRM stage move trace to the figures they changed. Each look
states how its surfaces move (
--m-morph-*). The voice orb is an aperture.
0.2.0-rc.3 — local pre-release candidate, 4 October 2026
The complete system still contains 188 catalog entries, eight looks and eight reference screens.
- Combobox groups and a phone sheet. Options can carry a
group: the unsearched list shows a heading where the group changes (arrow keys skip it); searching ranks flat and names each row's group. A several-word search matches across label, keywords and description ("billing city"). Below 640 px the list opens as a bottom sheet with its search inside, clear of the on-screen keyboard, and focus returns to the field;sheetTitlenames the sheet. MultiSelect and other searchable lists get the headings too. - ImportMapping groups nested destination fields under their path, opens choosers as sheets on phones, keeps keyboard focus when a bulk action or Retry finishes its work, and adds one status follow-up once a new choice's checks answer. Its large-schema demo now suggests 47 fields with 2 genuine conflicts.
- DataGrid takes caller-owned filters and search:
filters/defaultFilters/onFiltersChangeandquery/defaultQuery/onQueryChange. Uncontrolled use is unchanged. - Renewals filters owners with the grid's own chip, so "Show it" clears only that filter and keeps a search; a labelled static scene compares the screen's plan pane with the conventional filtered list on the same four accounts.
- AllocationEditor type, radii and limit glow read foundation tokens; the radial chart's unfilled track is visible on dark cards.
0.2.0-rc.2 — local pre-release candidate, 3 October 2026
The complete system contains 188 catalog entries, eight looks and eight reference screens.
- Packaged layouts now match the gallery. Each compiled unit carries its own utilities, so a later unit's plain rule
(
.hidden) used to override an earlier unit's breakpoint (@3xl:flex). Breakpoint and container utilities now outrank plain ones regardless of import order, without outranking state variants or host styles. The agent workspace no longer collapses into one narrow column in a browser beside an editor. - Right-to-left layouts survive production builds. Minifiers rewrite
:dir(rtl)into language lists that missdir="rtl"pages; shipped CSS now selects on thedirattribute, so mirrored strips, sliders and panels follow the reading direction aftervite buildas they do in development. - Agent workspace keeps a readable conversation at every width: artifacts sit beside it from 1152 px of container and open from the header below that; threads open from the header on phones; artifacts open on the first tab with content.
- New: AllocationEditor (forms) — parts of a fixed whole edited as named zero-sum transfers, with locks, limits, caller rules, named unallocated/over amounts and a save that waits for your handler.
- New: ImportMapping (data) — map file columns to one record type, accept suggestions explicitly, resolve ambiguous dates, preview with lineage, import with per-row outcomes and retry only failed rows.
- New reference screen: Renewals (F01) — an exact plan snapshot, acknowledged tasks only, owner conflicts that keep successful peers, and a retry of unresolved items only, on a labelled in-memory demo service.
- DataGrid: per-column
currency,selectionLabel,locatedrow andonViewChange; footer sums of 10,000 or more read compact so they fit. Button keeps a caller'saria-disabledfocusable and inert. NumberField no longer reads digit-less text as 0. Controls resolve their motion and colour values without a forced style recalculation each.
0.2.0-rc.1 — local pre-release candidate, 3 October 2026
The complete system contains 186 catalog entries, eight looks and seven reference screens. Individual selections come from the same source graph; the release manifest gives the exact delivered contents.
- Compiled components, runtime, foundation, selected looks, fonts and helpers are separate canonical packages. Compiled consumers need no host Tailwind. Editable source shares the same runtime and supports selective retrieval, recorded baselines, conflicts and recoverable upgrades.
- Managed appearance scopes share their settings with stable portals and actual DOM/canvas hosts. Typed public parts, native root styles/refs and data-only design defaults cover the catalog. Drafts, selections and existing editor/feed/voice resources retain their ownership through appearance changes.
- Foundation parameters and custom styles can be edited, validated, exported and applied through the matching CLI and optional local studio. Saved preview choices include the exact example, release, appearance, viewport and scenario.
- The free profile sample saves in browser storage, rejects an empty required name, retains a rejected save and supports an optional empty job title. The two richer examples export actual local PNGs with partial-failure retry, and save a scoped evidence investigation with explicit version comparison.
- Asynchronous controls preserve failed drafts and caller-owned state. CRM keeps hidden selections in bulk operations and restores deleted rows without replacing intervening edits. Unpriced and absent observations remain explicit rather than becoming invented zero values.
- The installer supports npm and pnpm, including a workspace app with a separate UI package. The exercised Next App Router subset uses Button, Dialog, Table, pure helpers and explicit CSS. See
LIMITATIONS.mdfor exact versions and boundaries.
Migration details are in UPGRADE.md. In particular, field style targets its visual wrapper while native-input styling uses the documented part; components preserve their native ref targets. The removed legacy MetalFx is not restored. Metal remains a token-based look.
Liquid Gooey's plain mirrored Items honor managed speed/reduction and settle offscreen. Its optional advanced upstream physics modes retain the documented policy/visibility limitation. Browser/provider integrations, external customer outcomes and public sales are not implied by these local checks.
This is an evaluation candidate under the existing draft licence. No price, support promise or public redistribution right is activated by this changelog.