framesmith 2.2: not everything is a dashboard


framesmith 2.1 and 2.2 are both out. The headline is that the quality gate finally understands screens you buy something on, and around that sit a faster viewer, a real test suite, and a batch of evaluator fixes. Here’s what’s new.

A commerce genre

framesmith judges a design before it reaches you, and part of that is catching fabricated-looking data: the fake “10,000+ happy customers” an agent invents for a landing page. That tell is good, until you point it at a checkout, where the money is the design. Real prices, a real subtotal, a real total that has to read as the most important number on the screen. The old evaluator saw those numbers and flagged them as slop.

2.1 adds a commerce genre. Declare it on a cart, checkout, order confirmation, or billing history, and the honest-content tell stands down, the same way dashboard already relaxes the rules for data-dense product screens:

canvas_set_genre("checkout-main", "commerce")

It’s deliberately not for a pricing page. Those numbers are marketing claims, not a transaction, so they still get challenged.

The built-in checkout pattern was rebuilt to match: one generate_design_system call for the whole language, a two-column scaffold, and real radio, checkbox, and input controls instead of frames pretending to be them. It scores 100/100, passes all five content stress tests, and works in light and dark. The coverage check won’t call it done until you’ve designed the empty-basket and loading states too.

The viewer is 45x faster

If you use the viewer across more than a couple of projects, it had been getting slow. On a real 178-canvas store the worst project page took 4.2 seconds. It now takes 0.09.

The fix keys the page off cached work instead of re-hashing every canvas in the store on every card render. The practical effect: the viewer no longer slows down as you add repositories, which is exactly the direction it used to degrade.

A test suite you can actually run

framesmith had 102 test files and no way to run them as a suite. Every test was run by hand, one at a time. 2.1 ships npm test and a CI pipeline on every pull request.

This is the unglamorous reliability work that a design tool lives or dies on. It immediately caught tests that were silently failing, plus a scaffold layout bug that only showed up on Linux (wider fonts than macOS, so button labels overflowed instead of truncating). If your own CI runs on a single OS, that’s a class of layout bug worth knowing you can’t see.

Evaluator and generator fixes

The rest of 2.1 and 2.2 is sharpening the parts you touch every day:

  • canvas_set_genre now survives pattern stamping. Declaring a screen’s genre and then starting from a vetted pattern used to throw the genre away silently. Now it’s preserved, so “say it’s a checkout, then stamp a layout” works in that order.
  • Form labels are no longer mistaken for decorative eyebrows. The tell that catches template rhythm was firing on any small text with letter-spacing, which caught ordinary field labels. It’s now calibrated to the tracking a designer actually chooses for an eyebrow, so real labels pass and genuine eyebrow-slop still gets caught.
  • export handles designs taller than their artboard, matching what screenshot already did. Both share one render path now, so they can’t drift apart again.
  • The design-system generator stopped dropping fonts. A half-specified inherited token could silently strip the font family the generator had just chosen. Scaffolds now reference type roles instead of hardcoded pixel sizes.
  • Three unsatisfiable advisories retired, including one that moved its complaint to a different node every time you “fixed” it.

Get it

npm i -g framesmith@2.2.0     # or just: npx framesmith

No breaking changes. Existing canvases and tool calls work unchanged. Restart your MCP server so the new genre and fixes load.

framesmith is open source (MIT), renders to plain HTML/CSS, stores designs as open JSON you own in your repo, and works with any MCP-compatible client.