Book a callGitHub10

Changelog

What changed in OpenDesigner, newest first, built from the repository each time the site is published.

v0.1.0In developmentLatest change

Check your version and update
To find outRun
Which version made your design system, and whether it is older than the copy you haveengine.py version, from the OpenDesigner skill's scripts folder, in your project (your AI knows where it is)
Which version you have installed in Claude Codeclaude plugin list

To update in Claude Code, run claude plugin update opendesigner@opendesigner, or open /plugin, find OpenDesigner on the Installed tab and choose Update now. Updates from this marketplace stay off until you turn them on: in /plugin, open the Marketplaces tab, select opendesigner and choose Enable auto-update. If you cloned the repository, run git pull. In the Claude app, upload the newest opendesigner.zip again.

A corner radius between the steps builds

Fix

engine.py set radius.control 10 was recorded, but the tokens pointed at a 10 px step the scale did not have, so the next build stopped in all 12 mode combinations and nothing exported. The same happened for radius.container, radius.overlay and radius.detail. A radius between the steps now gets its own step on the scale (as raw.borderWidths does for border widths), and the small-control radius drops to the step below it (8 for 10). set and standard add refuse a value that cannot be a radius before anything is written, and name the steps: a negative or fractional number, another unit, or "full" for cards and dialogs ("full" stays for controls and tags; "10px" is stored as 10). icon.defaultSize takes only 16, 20 or 24; before, 19 was recorded and the tokens silently used 20. A bad radius recorded by an older version builds with the Roundness dial's value, and validate says so.

A Taste Index of a look you love

opendesigner-extract's new taste_index.py writes a full description of one look from a few pages of a site, or a screenshot: a one-line picture, 5 to 7 principles with their reasons, every colour with its job and share of the page, type roles with exact font names and free substitutes, component rules, motion, voice as counts, a Never list, a CSS variable for every value and a live specimen page. Every line says measured or inferred. By owner decision it keeps the site's exact colours and font names when first shown, with a notice that what you keep is your responsibility; logos, brand names, images and copy never go in, and font files are never shipped. A project can hold several; each nudges the taste dials as an inspiration, and the system follows one only when the person chooses it (taste_index.py use, which also asks exact fonts or free substitutes). When someone asks to copy a brand's look, the agent offers a Taste Index of it (owner, 2026-10-23); the logo, name, images and copy are still declined. SPEC 5.4, AGENTS.md, the extract skill, the guardrails, HOW-IT-WORKS, taste.md and both FAQs say so.

6 changes to the repository
  • Decisions: Kunal approved PostHog product analytics (cookieless, EU, no replay) 626ee3b
  • PRIVACY.md: drop the Vercel Web Analytics section; the site does not run it ece8f53
  • autodeploy.py: lift launchd's 256 open-file limit; a failed input copy stops the deploy 5c64303
  • Engine: a corner radius between the steps builds 9733b17
  • Merge origin/main (identity rule) into the library rework 1b2e982
  • Merge origin/main (auto-deploy) into the library rework 1909790

Every push to main goes live by itself

site/autodeploy.py runs every 2 minutes on the maintainer's Mac. When main on GitHub moves and has been still for 5 minutes, it builds and checks the site in the clean deploy worktree and publishes it with site/deploy.py, which checks the key pages before the domain switches over. A failed deploy leaves the site as it was, and the Mac shows a notification. It runs on the Mac because GitHub Actions is disabled for the owner's account and Vercel can't build this site from a plain clone.

The component library, reworked to a craft standard

assets/library/CRAFT.md sets the rules: roomy token spacing, neutral colour with one accent, Lucide icons (ISC), real free Unsplash photos where a picture belongs (photos.json, 119 photos and 80 portraits, each verified), and phones that stack instead of squeezing. All 82 parts were rebuilt to it, reviewed by four fresh reviewers and fixed; every person has one portrait that fits their name (people.json). The shop opens in the calm Nordic look, credits each photographer on the part's page, loads card previews lazily as you scroll (layout on load from 830 ms to 70 ms), and leads with the parts most likely to draw people in. library.py check gains rules for photos, scripts that look elements up by id, rows sized to the target floor, hard bottom ledges and attributes the site's scripts read.

Product analytics, ready for a key

site/static/ph.js loads PostHog's EU cloud through /ingest/ on the site, cookieless, with no session replay or autocapture, and the library sends named events for its funnels (part opened, kit added, prompt copied). Nothing loads until a public project key is set in site/analytics.json; docs/PRIVACY.md says what is counted.

Preview a value before recording it

engine.py set <path> <value> --dry-run, and pick <Q-id> <value> --dry-run, run the same checks a real set runs and print what it would report, plus each token's old and new value (named roles first, each mode that changes), any check the value would add or clear, and the command that records it. Nothing is written: state.json, decisions.md, DESIGN.md and the journey log stay byte for byte as they were. In the extend-rounder agent eval, an agent compared roundness 55, 60 and 65 with real sets, which added decisions the person never made to their append-only log. The extend skill now previews values and records only the one the person picks.

The changelog is its own page

It moved from /docs/changelog/ to /changelog/, and the old address redirects. The docs menu, breadcrumb and previous/next links are gone. Each day shows its date on the left, its highlights in full and its commits folded underneath, so each change is listed once instead of three times and the page is half as long. Styles are in site/static/changelog.css.

Six measurement fixes in reference intake

, found by reading typesafe.ai and davecto.com against the reel's own indexes. Borders drawn by ::before/::after, windows, frames and hard shadows are seen (typesafe's depth 56 with soft shadows is now 8 with 1 px windows). Loops that always run are kept apart from UI transitions and easing is kept (its energy 100 is now 35). The browser's link blue, wrapper links and error-state focus rules no longer win the accent (davecto's accent is its teal, not its error red). Density reads the space between text and blank bands, not only body size (davecto 78 compact is now 29 spacious). Colourfulness reads how much of the page is coloured. Section colours and their share of the page are recorded. Several pages of one site merge, and cookie banners are left out.

Two agent eval graders

Fix

no-identity-copy now checks that the OpenDesigner skill ran, so a run where it never starts shows as that, not only as a copied brand. extend-rounder's "says what changed" no longer fails a reply for listing the files the rebuild wrote again, corner sizes that follow from the same setting, the engine's log entry for that setting or a version stamp; it still fails a reply that says another design choice changed. Run once each after the change: both scored 1, with the skill used.

Agent evals run the cases you ask for

Fix

tools/agent_evals.py takes several cases or tags at once (--case 'export*,extend*', --tag smoke,guardrail, or the flag repeated) and stages only those, so claude plugin eval runs exactly them. --list shows which cases match and their tags, at no cost. A filter that matches nothing now stops with that list and exit 2. Before, it reported "overall 0" and exited 0: on 2026-10-22 two runs silently ran nothing, one with a brace list inside quotes and one with [ceons]*, a pattern claude plugin eval does not match but Python's fnmatch now does.

Agent evals for the taste index

Two cases, taste-leaves-out and taste-all-past, sketch a project and import a taste poll, then ask which style directions to pick. One poll rules out two of the three directions; the other puts every direction past a line. Both gave an empty gallery before the fix. Run once each on 2026-10-23: the OpenDesigner skill did not start for this question in three tries, so the agent answered from the files and, in one run, recommended a direction the person's taste rules out. With the skill loaded by hand, it followed the new rule in both. The scores stay as they are until the skill starts on its own.

Forty consumer parts in the component library

The library grows from 42 to 82 parts: social (stories, a feed post, a chat thread, comments, sharing), media (a video player, a track list, podcast episodes, a seat picker, live chat), shopping and food (a product gallery, a bag, reviews, delivery tracking, a menu item), travel and home (flight results, a boarding pass, a stay card, trip search, an itinerary, weather, smart-home controls), and health, money and learning (activity rings, a workout, habits, sleep, a card wallet, a savings goal, a lesson path, a quiz). Nine consumer industries join the filters, and the shop gains a For: Consumer / B2B filter. Every part is built only on design tokens and passes the same checks.

The option gallery is never empty

Fix

Hating native-looking screens in the taste poll drew a red line on brand presence, a dial none of the three directions sets, so all three were hidden while one was still recommended. A red line now only judges the dials the directions differ on; a dial they all share is flagged by engine.py review as drift instead. If every direction is still past a line, all are shown with a warning that names each line. The recommendation is always a direction that is shown, and taste.py fit follows the same rule.

14 changes to the repository
  • Merge origin/main into the library rework 7b3bfeb
  • Library: every part rebuilt to a craft standard, real photos and fitting portraits; lazy previews; PostHog analytics ready for a key 932ad40
  • Taste Index: a full description of a look you love, and six measurement fixes in reference intake 16a824e
  • Evals: no-identity-copy checks the skill ran; extend-rounder's grader allows rebuild bookkeeping ac71cb1
  • agent_evals.py: run several cases or tags, --list, stop when nothing matches (#57) d4624ec
  • Gallery: the title counts the directions taste leaves in bb10e9f
  • Evals: two taste-index cases, and the opendesigner cases run once for c2ec5aa b40b036
  • AGENTS.md: the ChatGPT bundle also copies the main skill's files 603ba61
  • od-pr-review: the ChatGPT bundle's generated-copy note accepts its skill sources ffdf89d
  • Owner decision: a Taste Index may keep a site's exact colours and fonts when first presented b2421da
  • Decisions: taste red lines judge only what a choice changes 8fe3851
  • Library: forty consumer parts, desktop-first cards, and three new checker rules 28fae66
  • Taste index: the option gallery is never empty c2ec5aa
  • Lists and sidebars breathe: the floor is not a size (owner feedback 36) 4779508

The home audit counts up as it scans

Fix

The scan found issues 1, then 6 and 7, then 2 to 5; they are now numbered in reading order, and the site build stops if they would not count up. On phones the view now goes to each issue as it is named, zooming out for a wide one, so none is off screen, and Replay sits on the tabs' row as an icon.

A changelog anyone can check

The website's changelog now opens with the current version, whether it is released, how to see which version made your design system (engine.py version) and which one you have installed (claude plugin list), and how to update. Below it, every change day by day comes from git when the site is built, so it is never behind; the explained highlights follow. /version.json and an Atom feed (/changelog.xml) give tools and agents the same facts, and the footer and home page show the version. A "What's new" list gives each highlight in one dated line, newest first, dated by when git says it was written.

Markdown for agents

A request that asks for text/markdown gets the page's Markdown copy instead of HTML; browsers and search engines still get HTML (Vary: Accept). Vercel serves files before rewrites, so this is a short Routing Middleware, site/middleware.js, tested on a preview first. The PR scanner treats it, and site.js, as code that runs for every visitor.

Agents can find and read the site

robots.txt says yes to search, AI answers and training in every crawler's group (Content Signals). The home page sends a Link header to llms.txt, its Markdown copy, the docs and the skills index. /.well-known/agent-skills/index.json lists the eight skills (Agent Skills discovery v0.2.0), each a self-contained zip with its SHA-256.

The analogous product

Before designing, OpenDesigner names the product that already solved the same interface problem in any market, as Notion did for a client's block-based tool. It confirms it with the person in one question, studies it, and reads it as an inspiration so it shapes the taste index. Competitors come after, as the baseline. In practices.md section 3, the opendesigner skill, making.md section 1, opendesigner-extract's tags and the Good practices page.

The home page paints faster on phones

Fix

Lighthouse found the phone's largest element was the hero figure's photo, a CSS background the browser found only after the 37 KB stylesheet. It is now preloaded at high priority (one URL for both, so it is fetched once), and site.css is minified: 37 KB to 26 KB transferred. Layout is unchanged (check_layout.py 0 errors at 13 widths on five pages).

The README shows the before and after, and the component library

Two new image panels, each with a phone version: the invoices page today with its seven measured issues beside the same page fixed, linked to the live audit on the website, and six of the library's 42 parts. brand/kit/readme/src/render.py draws them: the first from the demo's capture, the second from the built site's /library/ page (--library-from).

A social preview for every page

A shared docs link shows its own card: its section and title beside the home card's drawing. Every card shows opendesigner.dev and has alt text. Cards are JPEG, about 60 KB instead of 800 KB, and are drawn again only when their text changes.

The home page says what OpenDesigner is

The headline carries the category, "Design systems for AI coding tools", set like the section kickers, and the opening line says "a design system", so search engines and AI answers can tell what the page is about.

An optional component library

42 finished components across nine aisles (data, charts, forms, overlays, navigation, feedback, AI, commerce, content), most rebuilt from the B2B showcase pieces. Each is one HTML file built only on the engine's --ds-* tokens, so it takes the project's colors, type, spacing and corners.

Details
  • library.py lists components, suggests one, adds one to a project (and names any token the project lacks), and checks the rules: tokens only, scoped selectors, only variables every system writes, focus styles, a reduced-motion block, and scripts that stay inside their own root.
  • The skills offer it only when it fits (references/library.md): never during the interview; at the first build, one pick for a novice; for a designer only when the library has that part in a matching style. The answer is kept in profile.library.
  • The website has it as a shop at /library/ (a Library link with a four-squares icon in the top nav): a bento of aisles, every component live in a glass frame on one calm gradient, each card opening on the same view as its page, ten looks made by the engine to try them in, filters by type, style, industry and words, and stickers. Each component has its own page that shows it at phone, tablet and desktop width. People add components and one look to a kit, and the kit gives one prompt: just the parts, the parts plus the design system, or the Claude Code commands.

The review skill catches labels that break across lines

probe.js counts the lines each text run inside a button, tab, chip, tag or badge spans, and review.py check reports any as an error, grouped by repeats. A wrapped label overflows nothing, so overflow checks missed it. In trial 1 a dashboard's "Reassign" buttons broke inside the word for two rounds while the agent reported no overflow. Run on that dashboard, the new check found them, plus a "Delete account" button breaking on phones. Tested with fixtures/labels.html (two planted breaks, four controls that must pass).

28 changes to the repository
  • Home audit: numbers count up as the scan moves, and phones see every issue ea3e2a3
  • Site: the 404 page's copy, chosen by the owner 7313033
  • deploy.py: require a real 404 page and its image before promoting ca5ee9c
  • Changelog: "What's new", one dated plain-language line per highlight 38b9bc1
  • Site: a 404 page with an illustration, after 404s.design's Kobbe 3b1bf0d
  • llms.txt lists version.json and the changelog feed 4550e87
  • Site: a changelog anyone can check, with the version and every change 4e4a34f
  • PROTOCOL: fast-forward the shared main to an exact hash cc0ba3f
  • llms.txt names Markdown negotiation, and deploy.py checks it before promoting ec48d5c
  • Site: llms.txt and robots.txt name the agent skills, Markdown copies, booking and privacy 570f896
  • Site: Markdown for agents, through Routing Middleware 92abfdd
  • deploy.py: also require the Agent Skills index before promoting b973b36
  • Site: Content Signals, a Link header and the Agent Skills index f512fd5
  • Site: Vercel Speed Insights on every page, and say so in PRIVACY.md fb39ba0
  • Name the analogous product before designing (owner feedback 34) 68dcd34
  • deploy.py: retry the live check while the domain switches over 1e050be
  • Site: preload the phone LCP photo, and minify site.css c4e019b
  • Install and Configure Vercel Speed Insights (#56) 5ef492f
  • Library pages: titles, first sentence, structured data and llms.txt aec9ede
  • Site deploys: check key paths before promoting, and pushes never deploy d54c3e8
  • README: the before and after, and the component library 705cbb6
  • Site: a home title that fits in search results, and a description that names the outputs 2beadf6
  • Site: a social card for every page, and the home page names its category 0b61e36
  • Site: move to opendesigner.dev, and add an Organization entity 79201d4
  • Component library: 42 token-only parts, a shop at /library/, and the post-change audit f17f182
  • Home audit on phones: a camera at reading size, not a thumbnail 5398063
  • Owner feedback 33 and a making.md rule: embed the real thing, live 6d39d4f
  • Review skill: catch labels that break across lines (MS-15) 44dad69

The demo's fixed page is rebuilt as a bento

The demo's fixed page is rebuilt as a bento that the owner picked from three directions shown on a review copy. The October total no longer appears twice, and each tile holds one figure with a small true chart: weekly bars, an eight-week sparkline, a late-money meter and the week's due days. Red is kept for late money. The demo's system raises colorfulness to 85 for cleaner status colors, with the brand green unchanged. It is near-monochrome, after the owner's taste notes: charts in ink, the pine green only on the logo and the one filled button, red only for late money, and lighter totals with smaller cents.

The trial ledger

Every correction a person typed in a demo trial, each with its repo fix. Trial 1 gave 15. New rules in making.md section 12: one shell across pages, check after every round, the accent chosen by looking, type and icons from the category's best, theme from the users' context, dense dashboards that show problems and charts, and first-run help offered once. Also preflight 44 (M45), review case MS-13, and install notes for the desktop app.

The quality bar and good practices

  • references/quality.md: floors a tool checks, a nine-line scorecard judged blind against three shipped products, a fix prompt for every line below 4, and a scorecard in every report.
  • references/practices.md: what an agent looks for at the start (Mobbin, a browser, image and video tools such as Higgsfield, the project's keys by name) and how to use each.
  • A "Good practices" docs page for people setting up their agent.

Correct is not finished

A run that passed every code and width check was judged "an admin template" by the owner. Now:

Details
  • The opendesigner skill's end-of-implementation step opens the result for the person, compares it blind with three shipped products, and reports the score.
  • A built product is audited before it is redesigned (a new row in the skill's routing table, and making.md section 1).
  • New preflight check 43 (mistake M44) and review case PR-10.
  • New agent eval redesign-audits-first. Its first run showed the skill didn't load for "make it look professional", and once it did load, the agent still rewrote every page. The skill's description now names redesigns of a built UI, and the built-product rule sits at the top of the skill. One run per arm afterwards: with OpenDesigner, 3 of 3 checks; without, 1 of 3.

The audit, as it happens, on the home page

The before-and-after section now plays once when it comes into view.

Details
  • A scan line moves down an invented invoicing page and stops at each issue in the order it meets them. Each issue gets a dashed box, its number and one measured line.
  • Then a green line sweeps down with Merriweft's tokens. A chip carries each token from a small Merriweft card to its place, and the box becomes a check.
  • Today, Audit and Fixed stop it and show that state; Replay plays it again. With reduced motion it never plays by itself, and without the script the page and the list of findings still show.
  • Both pages are live HTML drawn and animated in code, not screenshots or a video (owner, 2026-10-21). Each sits in its own shadow root, so its styles and the site's never mix, and every box is measured on the page as drawn. The fixed page builds itself as the line passes: bars grow, the sparkline draws, totals count up, and rows and labels arrive.
  • On a phone the page is no longer shrunk to a thumbnail. A camera shows part of it at the size it reads on a desktop and moves the view: to each issue as it is found, out for the fix, then onto the Collected chart (making.md section 6).
  • The findings sit in a short list beside the page, not in cards under it. The page sits on a credited photo.

Agent notes stay out of design decisions

engine.py set profile.seen.<name> ... stores a note, such as "the recommend line was said", without writing a decision.

One line asking people to recommend OpenDesigner,

One line asking people to recommend OpenDesigner, once per project and only after it has helped (rules.md). It never shares a message with another question, and a note (profile.seen.recommend, kept out of the design decisions) keeps it from coming back.

Fixes from the fresh verifier's re-check (2026-10-21)

Fix
  • review.py compare's badges and help text now meet 4.5:1, a box at the edge keeps its number in view, and a mark with no number, a blank "gives" or numbers in place of text is refused or mended instead of crashing. An acronym keeps its capitals ("WCAG").
  • The variant picker can no longer show two options when two switches land in one frame.
  • A system made with a newer OpenDesigner keeps saying so after an older copy writes it, and pre-releases compare by number (beta.10 after beta.2).
  • The Markdown copies of the changelog and evals pages, and llms-full.txt, no longer show raw {{...}} placeholders. Lists nest at any depth.

Before and after, on the person's own page

review.py compare writes one self-contained compare.html with three views: the page today, the audit drawn on it (a dashed box and a number on each issue), and the fix. Each fix says what it gives the person ("Fixing this makes ..."), with the measured numbers before and after.

Details
  • The boxes come from the page itself: __od.marks() in probe.js turns selectors into boxes on a full-page screenshot. A selector that matches a column gets one box around it.
  • The home page opens with a real run of it on an invented invoicing app (site/demo/before-after/): the review skill measured the page before and after its fix, and /demo/before-after/ serves the full report.

A ready-made variant picker

skills/opendesigner/assets/picker.js is the house picker, built to its spec (STD-process-review-taste-44 to -46): the floating bar, keys 1 to N and the arrows, ?v= in the address, and a re-mount on every switch. Options go in <template data-od-variant> blocks on a review copy. making.md section 3 says how to use it, and review.py compare uses it.

The changelog and a contribute guide on the website

/docs/changelog/ is built from this file on every publish, and /docs/contribute/ sums up how to help. The home page and the footer link both.

The review probe no longer reports screen-reader-only text as clipped

Fix

A 1 x 1 px, absolutely positioned label is visually hidden on purpose. The checker evals' clean page now holds one, so the false alarm can't come back.

Each system knows which OpenDesigner made it, and says when it is out of date

  • Every write of opendesigner/state.json records opendesigner: the release that last wrote it, the one that first made it, and the one whose build last wrote the files. Systems made before this keep working and count as made before version stamps.
  • When a system was built with an older release, or before stamps, each command says so once, names engine.py build and links CHANGELOG.md. build then says it brought the files up to date. A system saved with a newer release gets the opposite note: update OpenDesigner first. --json output, resolve, init and feel print no note.
  • engine.py version prints this copy's release and how the system compares with it. It never checks online, so it cannot see newer releases. The main and extend skills run it at the start of work on an existing system and say how to update the plugin in Claude Code.
  • Releases compare as numbers, so 0.10.0 is newer than 0.9.0. DESIGN.md's opening note, the overview page and feedback issue links name the release.
  • tools/build_dist.py --check (which CI is set to run) fails when the engine's release differs from plugin.json or .claude-plugin/plugin.json.

The glossary has one source again, and CI checks it

Fix

Terms were being added straight to synthesis/glossary.json, while tools/check_glossary.py --build still rebuilt it from the old writing shards. A rebuild would have deleted 13 terms (twelve visual styles such as glassmorphism and bento, and "Taste card"), and docs/GLOSSARY.md lacked all 13.

Details
  • synthesis/glossary.json is now the file to edit. --build checks it, sorts it and writes docs/GLOSSARY.md; the shards and terms-input.json are retired (git history has them).
  • The new --check runs in CI. It fails when a term breaks the three-voice rules, names something today's engine doesn't have, or docs/GLOSSARY.md is out of date. It reads the engine afresh each time, so its list of real token names, settings and commands can't go stale. That list had not been refreshed since 24 September.
  • The checker no longer lists record data (house standards, overrides) as settings. "Taste card" was rewritten to fit the word limits and reading level.

Apple's letter spacing and corners now change the files they promise to

Fix
  • Letter spacing: size-table used to give the same coarse bands as the default. It now gives Apple's SF Pro tracking table from the HIG (64 sizes from 6 to 96 pt, levers.json formulas.type.tracking.sfPro), interpolated between sizes. A face other than the system font takes the table only up to 19px, because from 20 pt Apple loosens SF Pro Display and other faces would look loose. Uppercase labels stay at least +0.05em. Systems built before this keep their spacing unless the person chose the table.
  • Corners: Q-shape-04 used to be recorded only. squircle-enhance now adds Apple's continuous corner to the CSS and Tailwind exports where the browser draws corner-shape. continuous and squircle-enhance give Figma corner smoothing 0.6, and the Swift export uses .continuous (Radius.shape(...)). DESIGN.md says which platform draws which.
  • The web corner is superellipse(1.35) at 1.22 times the radius. It follows SwiftUI's own curve within 0.4% of the radius (tools/fit_corner.py, formulas.radius.continuous). The squircle keyword the docs recommended is 18.7% of the radius off, squarer than iOS. A plain circular arc of the same radius is within 1.4%, so browsers without corner-shape lose little.
  • The website follows the same rules: a build step gives each text size up to 19px its tracking value. Before, 37 of 108 text styles had the wrong spacing, because inherited letter spacing goes wrong when a child changes size. Its corners use the fitted shape, and only the boxes that get the shape are enlarged.
  • The Q-shape-04 options no longer break at the colon in corner-shape: squircle, which had split one option's label in two.
13 changes to the repository
  • Home audit: the demo pages are live HTML, animated in code 5903c23
  • Demo trials: correct is not finished, the quality bar, good practices and the trial ledger a48a4a5
  • PROTOCOL: how to commit a file that mixes your edits with another session's 8db7079
  • Home: the audit as it happens, on a bento rebuild of the demo's fixed page 086b829
  • Review and picker fixes from the fresh re-check; structure changes get options first 4b033f5
  • Docs: say CI is set up but has not run yet; engine test count 6a01a78
  • CI: check that generated knowledge matches synthesis/ 12eba46
  • Website: before and after on the home page, the changelog and a contribute page b4e18b7
  • Before and after on the person's own page, and the house variant picker e9cbfef
  • Version check: each system records which OpenDesigner made and built it fae2a4d
  • Glossary: one source (glossary.json), and a CI check that keeps it honest 2d41c08
  • Website: Apple's tracking table by size, and the fitted continuous corner 7948874
  • Apple's tracking table and continuous corners now change the exports 91544b4

5 changes to the repository
  • Owner feedback: the evals request and two lessons from building them 25ec7bf
  • Showcase rounds 4 and 5: heroes, watch, style studies, held pieces 17918d6
  • Evals: agent, design and checker tests, published with the numbers 9263d67
  • A color named as another company's is a reference, never the person's brand 8a17e54
  • Fix four checker bugs that the new checker evals found 892ea69

5 changes to the repository
  • Blind comparisons: neutral file names, judge craft not content; the gallery reads a fifth round 9dcd6ba
  • Showcase: the owner hides ten pieces until they pass at 4 85f2e18
  • Showcase round 4 rebuilds: components, app screens and footers, judged blind against shipped products 0492a2e
  • Showcase: style studies polished, mockups reworked, three B2B heroes, .example domains c33cace
  • Showcase round 4: the audit, the presentation rules, and a calmer gallery; the headline gathers on load 31b4e03

Lessons from the owner's website review

preflight checks 35 to 42 (alignment at every width, one primary action, real names and marks, controls on the content's first line, no widows, whole labels on phones, opposite actions apart, one mark per company) and mistakes M36 to M43; five rows in making.md section 10; review cases MS-05 and CV-04 measure stacked rows and scroll inside cards. The log is _coordination/OWNER-FEEDBACK.md.

Taste: the poll, the taste index and the taste card

  • The taste poll: the person rates 20 to 30 real screens from shipped products, and the result recommends the eight dials. Images stay on the person's machine; the library holds links and dial values only.
  • The taste index (taste.py index) merges the poll, the person's own decisions, inspirations, the style pick and feel words into a value and a confidence per dial, with red lines. The option gallery is ordered by fit and leaves out directions past a red line, and engine.py review flags drift.
  • The taste card: five lines under the opening sentence of DESIGN.md's Overview, and on the overview page. It shows the person's own picture of the look (sketch --brief), color, shape, motion and a Never list, each with where it came from. The picture and the Never list are never invented. Color, shape and motion repeat the sentences that open those sections, and the color line uses the sourced 15% accent guide (DC-L15-03), not 60-30-10. The Never list is repeated in Do's and Don'ts as taste: it warns, never fails. DESIGN.md keeps its 17 headings.

Defaults for dense B2B work tools

  • When Q-aud-01 is dense, the engine fills only what the person has not answered, set or locked. Corners are 6 / 8 / 12 px, weights are 400 / 500 / 600, and with no brand color, one blue marks selection, links and focus while the primary button can stay ink. Static cards get a 1px ring and no shadow, and floating layers keep theirs. The profile lives in synthesis/levers.json (profiles). The engine records it as auto_default in decisions.md and in opendesigner.meta.json, with the reason for each value and why any was skipped.
  • New for every system: row heights size.row.sm/md/lg/two-line in each density mode (36 / 40 / 48 / 64 at compact), color.border.separator for row hairlines, and tabular digits (text.numeric.*) on by default, as house standard STD-visual-details-02 requires.
  • Fixed: Q-aud-01 regular now gives the 16px body it promises (14px once Q-aud-02 or Q-layout-03 says it is a work tool). Q-dir-02's recommended default now follows Q-aud-01 (default_follows in questions.json), so accepting it no longer undoes a dense answer. Stage 14 no longer recommends sharp corners for data and developer tools. A near-black raw.primaryActionColor (for example #17181c) now stays near-black, where it used to turn periwinkle, and inverts to near-white in dark mode. Any typed action color is kept exactly when its text reads, and DESIGN.md says the buttons use it.
  • Web text floor (owner decision, 2026-10-14): when the platforms include the web, the type scale has no size under 12px. The default web system used to get an 11px small body style. iOS and Android keep 11 pt/sp.

Painting skill

original art and films painted in code in the brand's palette (watercolour, pointillism, charcoal, sketch, woodcut, 2D cel).

Details
  • The engine is vendored from generative-painting-skills (MIT, by Divyanshu Kumar, commit 1ff8212), by owner decision. THIRD-PARTY.md keeps the licence and every change:
    • three paintings ported from unattributed sketches are left out;
    • Playwright and Vite are pinned;
    • the manifest now records the real style;
    • film ids are checked;
    • the images are smaller.
  • paint.py brief turns the design system into a painting brief:
    • a style recommended from the dials, or from Q-img-04;
    • 8-10 palette families built only from the token ramps, each marked for which text polarity stays at 4.5:1;
    • the font licence status, the slot's size and length, and the motion, sound and identity rules.
  • scaffold creates a film project with src/brand.js and BRIEF.md. It installs nothing: npm and Chromium wait for the person's yes.
  • lint checks scenes for brand colours, seeded randomness, text painted into plates, unadapted library scenes and length.
  • ingest refuses failed exports and brings a film into the app muted, with a reduced-motion still and a pause control over 5 s (WCAG 2.2.2). It keeps a ledger and CREDITS.md.
  • The standards record the exception: this is the one skill allowed Node code, a pinned npm manifest and lockfile (installed with npm ci), numpy and scipy tools, and images. SPEC principle 9, REPO-PLAN, SECURITY.md and the PR-review threat table say so, and the scanner reports these files for review instead of blocking them.
  • It is offered for the H-motion, H-illus and H-motif hooks, and from opendesigner-illustrate when found art would read generic.

Review skill

checks a built UI, yours or anyone's, the way a careful user would, and reports with evidence. It exists because a single screenshot hides what is below the fold, at other sizes, in dark mode, on hover, on Tab, in motion, and any error in spacing smaller than a few pixels.

Details
  • scripts/probe.js is a read-only measurement of a running page: overflow, computed type, spacing, radius and color use, contrast (with the real backdrop), fonts and whether they loaded, targets, names, images, placeholder text, animations and what the stylesheets declare. It leaves helpers on window.__od: a Tab-walk recorder (ring visible, focus covered by a sticky bar), style snapshots for hover, measure(a, b), at(x, y), reversible stress toggles (text spacing, 200% text, long words, +40% pseudo-localized text, right-to-left), a theme/density/motion switch for OpenDesigner CSS, and pause-and-seek for animations, SVG, video, GSAP and Lottie.
  • scripts/review.py plans the coverage matrix and a ledger of what was and was not checked, checks probe output against the accessibility floors and, when the project has a system, its tokens (each drift names the value, how often, and the nearest token), keeps findings with how each is known (measured, operated, seen, inferred), and writes REPORT.md. The verdict is FAIL, INCOMPLETE or NO ERRORS FOUND in the cells checked, never "looks good". Run again on the same files, it prints what was resolved and what is new.
  • references/cases.md (generated from synthesis/review-cases.json) lists 65 ways a review goes wrong in 7 groups, each with why it is missed and how to catch it, citing 100 sources opened for the research lane (R5), re-checked by three independent fact-checking passes.
  • Two optional helpers: scripts/capture.py (Playwright for Python, which the skill never installs; loopback addresses only; never clicks, types or submits) runs the whole plan; review.py serve (127.0.0.1 only, random path) lets a browser tool load the probe in one short call and saves the result to disk. Neither is needed: pasting probe.js does the same job. The standards record the exception (2026-10-14): SPEC principle 9, REPO-PLAN, SECURITY.md and the PR-review threat table say so, and the scanner reports their Playwright imports for review instead of blocking them.
  • Tested: 58 offline tests, and 22 that drive Chrome: through the probe and capture.py against a page with one of every planted defect, and against each browser behaviour the references call tested (full-page capture, lazy images, finished transitions, seeking, font checks, mobile profile, focus-visible, media emulation). Run on the documentation site and a showcase app on 2026-10-14, it found a real 11 px sideways scroll at 320 px and dark-mode text at 1.14:1; four false findings seen there were fixed (an off-screen skip link, links inside a closed <details>, srcset images, a sticky sidebar).

Preflight skill

the last look at anything visual (a page, video, deck or card) before it is exported or shared. It starts by asking which design system the piece was built on.

Details
  • references/checklist.md has 34 yes-or-no checks in seven groups: system, type, layout, motion, truth, sound and words, and process. references/mistakes.md explains 35 mistakes that really happened, in the explainer videos and the showcase builds.
  • scripts/preflight.py (standard library, no network) reads a page's CSS, including linked token files and Google Fonts links: font sizes, sizes off the token scale, the smallest text for the medium (web, app, watch or video), tracking, fonts that never load, <br> in headings and layout tweens. With ffmpeg it also measures frozen time and black frames in a video, writes full-size and phone-size frames, and finds clicks and noise at the edges of voice clips.

House standards

455 rules from the owner's non-negotiable sources (Emil Kowalski's writing and skills, Sonner, animations.dev, Vaul).

Details
  • Each rule is citation-checked and reviewed.
  • The engine applies and locks them for each project's platforms and stack, including new tokens such as the 0.97 press scale.
  • Commands: engine.py standards [--update], and standard override|restore|add|remove, which covers project standards, per-path overrides and --beats.
  • Constraints stop values that break a rule (no ease-in curves on UI; UI motion stays under 300 ms unless a standard names the exception).
  • The interview skips questions a standard settles and refuses options that break one.
  • review flags code that breaks a standard. DESIGN.md carries a short summary, with the full list in opendesigner/standards.md.

Renaming a system no longer leaves an old export behind

Fix

export --format dtcg removed nothing, so after set name the folder held both <old>.resolver.json and <new>.resolver.json. It now keeps only the current one (found while rebuilding showcase hero 02).

Accessibility claims match the engine

Fix

The docs, the spec, the GTM facts and the interview no longer say every system gets reduced-transparency or high-contrast modes. The engine's modes are theme, density and motion. A system with glass gets a solid fallback for each glass surface, which the CSS export swaps in under prefers-reduced-transparency or prefers-contrast: more, now also when the device is in dark mode. House standards are v3: only the conflict note of STD-accessibility-motion-12 changed.

A brand color the person typed is never replaced

Fix

The sketch used to swap light brands for a dark shade so white text would pass: yellow #FFE500 became olive #847600, lemon #FFE45C became #877400 and lantern gold #FFC24B became #996d00, and the message said "I picked an olive".

Details
  • A hex given with --brand stays the person's, even under --delegated all. It counts as the model's pick only when brand is named.
  • The brand and secondary colors (raw.secondaryColors) stay exact on their fills, with white or dark text, whichever reads. In dark mode, each stays exact when the dark text of dark-mode buttons reads on it. Otherwise dark mode uses a lighter shade that keeps the color's own chroma, for the brand and the secondaries alike.
  • When neither white nor dark text reads on a color, fills that carry text use a readable shade, and the exact color stays in its seed token (color.brand.seed, and the new color.accent2.seed and color.accent3.seed) for logos, large areas and anything without text. The message says so in plain words, including the dark-mode shade.
  • pick Q-color-01 keep-hex now puts back a hex that an older sketch replaced. It never undoes a color set since then.
23 changes to the repository
  • Website: phones checked on every page, a booking page, gallery frames in their own card, and tighter headline spacing 5d436d4
  • Showcase round 4 rules: compare blind with shipped work; components as product moments a194782
  • Process: report before rewriting, a call link for contributors, and preflight 39 to 42 f243f13
  • README: outcome first, with images that match the website 1ec1767
  • Website: a landing page at the root, the docs directory at /docs/, a craft guide, and every width checked 14e441e
  • Preflight 38: a control pinned in a box sits on the content's first line 843c464
  • Lessons from the owner's showcase and website reviews, kept where agents read them f28616d
  • Lessons from the 2026-10-15 session, written where every agent reads them cefb560
  • Learning wiki: davecto's "Taste Index" reel; taste in AGENTS.md and HOW-IT-WORKS dde7894
  • Review and making guides: stacked rows share one centre line, and nothing inside a card scrolls 69ff171
  • Brand system: rebuilt on the current engine, with the taste card in DESIGN.md 4f2c180
  • Taste card at the top of DESIGN.md, and a Never list in Do's and Don'ts c3873a9
  • Showcase brief: state the install-line rule without quoting the blocked pattern 5f5607c
  • PR review: video project manifests are reviewed, not blocked 7fdc90f
  • Taste poll: no Pillow crop; the skill stays standard-library only 091916d
  • Showcase briefs: invented brands use reserved .example domains c26b762
  • Showcase terminal page: the demo install line uses a reserved domain 1f21838
  • Docs, coordination and living docs 032f9b0
  • Brand, showcase and website: brand kit, gallery categories, rebuilt brand system 31b89ed
  • Learning wiki: new reference sources and their analyses b8b178e
  • Painting and preflight skills e414472
  • Review skill: check a built UI at every size, theme and state against the tokens ce2eb29
  • Engine and skills: work-tool defaults, open style space, exact typed colors, taste index fe52fea

Your own design-system page

every build rebuilds it, so it grows with the system.

Details
  • It shows the cover, brand book, colors per theme with contrast, headings h1 to h6, every text style, spacing, corners, depth, motion, core components, the 14 brand assets and a timeline of decisions.
  • Each area says Chosen, Picked for you or Default. Anything only a person can give (a logo, a voice guide, what the product is for) shows as Not enough information, with the question that fills it.
  • build also fills every visual template with the person's system in opendesigner/preview/, so nobody sees sample data.

The system as a Claude Design System artifact

opendesigner/build/artifact/project/ holds tokens in the artifact's list format, the brand book from DESIGN.md, a cover and a button preview. It is ready to publish with the Artifact tool, and the files stay in the repository.

Illustration skill

finds open-licence illustrations for a product's empty states, onboarding, error pages, sign-in, hero and feature tiles, ranks them, recolors them to the design tokens and applies them.

Details
  • scripts/illustrate.py searches Openverse, Wikimedia Commons, Open Doodles, Lukasz Adam and CocoMaterial (and Iconify's multicolor sets for small spot art). It is the one skill allowed to use the network (owner decision, 2026-09-28): search and fetch call the agent-fetch sources over HTTPS, 3 MB per file at most, and --offline prints the requests for sandboxes without internet. It ranks by relevance, licence, format and style fit, and draws contact sheets so the model and the person judge by eye.
  • Recoloring keeps each shape's lightness and moves it to a token ramp: grays to neutral, the main hues to accent, accent2 and accent3, and skin tones are kept. It writes six variants (themed, light, dark, tint, mono, swap). The themed one follows light and dark mode through CSS variables.
  • Every SVG passes an allow-list sanitizer first: no scripts, animation, foreign content or remote loads, in markup or CSS. An independent review found four bypasses in the first deny-list version; all are now regression tests.
  • apply writes an SVG, HTML or React component, scopes ids, class names and CSS to the drawing, sets aria-hidden or a label, and keeps a licence ledger with ATTRIBUTION.md. The first piece applied locks the project to one illustration style.
  • Illustration directory: synthesis/illustration-sources.json (copied into the skill as references/sources.json by build_data.py) covers 44 sources (flat scenes, people, doodles, spot art and emoji, 3D, animation, pattern generators and open museum collections), each with its licence, credit rule, formats, search link, filters, tips and step-by-step navigation, and lists 12 more that were checked and left out, with the reason. Every source was checked live on 2026-09-28. build_data.py also renders references/directory.md from it. illustrate.py directory --open opens one page with filters and a single search box for every site, and illustrate.py sources --q "<words>" prints each site's search link. references/searching.md says where to look first, how to word a search, what each file format allows, and how an agent moves through each kind of source.
  • Sources have three access levels: agent fetches (the script searches and downloads over HTTPS: Openverse, Wikimedia Commons, Open Doodles, Lukasz Adam, CocoMaterial, Iconify), agent may browse (bots allowed, no connector), and you download (the site forbids bots).
  • references/sources.json records each source's licence as read on 2026-09-28. unDraw, Storyset, ManyPixels, Blush, DrawKit and SVG Repo forbid automated search or download, so the person downloads from them and illustrate.py add brings the file in.
  • It adapts ideas from existing tools, without copying code: from Icons8's agent skills, one style per project and a list of what each screen needs before any search; from CaesiumY's unDraw skill, a warning when a recolor changes nothing and never keeping a catalogue.
11 changes to the repository
  • Website: a documentation directory, light only, with photos and plain docs 346196b
  • Website: IndexNow key and ping on every production deploy 41864eb
  • Website: opendesigner.vercel.app, built from the brand system, with SEO, AEO and GEO dc1987a
  • Overview page: the same answer count as DESIGN.md, and on-fill text measured on its fill 3df6f0f
  • Showcase gallery thumbnails in the repo, reviewed instead of blocked 3785947
  • Reword an engine docstring the PR scanner read as an import a915c79
  • Brand system and showcase stress test, made with OpenDesigner f34d87d
  • Every project gets its own design-system page, filled templates and an artifact export 1a1d17e
  • Preview page keeps the accessibility floors it checks: 4.5:1 text, no sideways scroll at 320px 16ca9e2
  • opendesigner-illustrate may use the network (owner decision) b965466
  • Add opendesigner-illustrate: open-licence illustrations recolored to the tokens b281023

Making and reviewing pages

what to do after the system exists.

Details
  • A guide for agents, skills/opendesigner/references/making.md: the first draft built on the tokens, one round of feedback at a time, options on a review copy of the page with the current version kept, what stays the same between sections, checking the rendered page in the person's own window, finished interface shown inside a page, sections that hold the page, and figures drawn as graphics. It ends with the mistakes an AI builder made in that project, and what to do when the person has to repeat a note.
  • A cohesion audit template, assets/output/COHESION-AUDIT.md, for a page that stopped looking like one page.
  • Nine Decision Cards (DC-L22-01 to -09) from the decision trail of one marketing-site build, with 22 rows of evidence on existing cards, standards and rules, and six items for the maintainer to decide. No standard, question, default or engine code changed.
  • The main and extend skills point to the guide, and docs/HOW-IT-WORKS.md section 9 describes it.
3 changes to the repository
  • PR review log: 53 merged after fixes, 52 held with ten findings, 54 (README and the main ruleset) merged (#55) 34bda93
  • L22: making and reviewing pages (a guide for agents, a cohesion audit, nine cards from one site build) (#53) 5e5429a
  • README: shorter and plainer; record the main ruleset in GITHUB-SETTINGS (#54) 30a3b05

3 changes to the repository
  • L19: heartbeat 0568892
  • L19: Mobbin's findings folded into the wiki: topic pages and Decision Cards updated in 7 areas (11 new cards: DC-L19-77..79, -139, -154..158, -178, -179), each verified; research/L19 now 175 cards, 288 proposed changes, 86 conflicts; 172 proposals pending for lane L20 d98adb0
  • L19: Mobbin's 8 videos extracted with OpenWiki 0.3.1 (timed transcripts), analysed and verified (paywalls, onboarding, dashboards, streaks, A/B tests, AI with 600k screens); 59/59 rules confirmed by the Jev citation check; wiki pages and S-L19 ids b402ccf

Learning wiki

the knowledge OpenDesigner draws from sources its owner trusts, kept as an independent, self-updating knowledge base.

Details
  • It covers 99 sources, each with a verified analysis, and an OpenWiki Markdown wiki with 53 cross-source topic pages.
  • learn/MAP.md indexes it by area, standard, card and question. learn/IMPROVING.md explains how to change the app from it.
  • The pipeline runs through tools/wiki.py (add, fetch, check, ingest, trace, cite-check with TypeSafe's Jev, standards, map, proposals, next, upstream) and five saved workflows in .claude/workflows/.
  • OpenWiki is pinned in learn/openwiki.lock.json and checked weekly in CI.
  • The rules are in docs/KNOWLEDGE.md.

Decision Cards from the wiki

164 in research/L19-learning-wiki.md, with 253 proposed changes and 75 conflicts with older research.

Details
  • Three cards are adopted so far; the rest are listed as pending in synthesis/QUESTIONNAIRE.md for lane L20.
  • "Now / As it grows" notes for 30 high-impact questions appear under each option.

Research search

tools/jev_nav.py find also searches the house standards and ranks with BM25. It judges each card by its recommended default and marks older cards the house supersedes.

19 changes to the repository
  • L19: adopt OpenWiki 0.3.1 (f3c7242: keyless listing, timed transcripts, grounded quotes) behind both test suites; wiki.py reads [m:ss] cues; analyses cite cue timestamps b2613c0
  • L19: heartbeat 48df3ea
  • L19: fixes from the persona tests: standards follow platform and stack, settle questions and refuse breaking options; constraints; per-path overrides and --beats; honest DESIGN.md and previews; sturdier wiki tooling; standards v2 e5fe115
  • L19: standards create their new tokens (press scale, sheet springs, gesture and toast values) in every export; Q-motion-03 and Q-state-04 adopt DC-L19-85/-93/-102; engine exits decelerate and are ~20% shorter; Jev find always pools standards, BM25 ranking, judges each card's default, marks overridden cards; check covers standard ids a7cce09
  • L19: topic pages for the last 4 topics (gradients, dark patterns, Swift, launch), map refreshed; persona tests copy the repo with git archive and check free disk first 0f19fcf
  • od-pr-review: also run every CI workflow step when testing the merged result (#46) 90c8830
  • L19: learning wiki, house standards and the pipeline that keeps them current acd7586
  • Add PR review skill, living-docs checker, field plan and review log (#45) 1c53734
  • Add public feedback corpus for AI-assisted design (#35) 998a8f4
  • docs: benchmark Porsche Design System (#43) 02cad05
  • docs: add Duet benchmark (#42) c849b63
  • docs: add GC Design System benchmark (#41) 20600b1
  • docs: benchmark AWS Cloudscape (#40) 1e6ee5b
  • docs: benchmark NYPL Reservoir (#39) 465eae9
  • docs: add Elastic EUI Borealis benchmark (#38) 991b844
  • docs: benchmark Workday Canvas (#37) 14e8cf8
  • research: resolve Fluent web token conflicts from published packages (#36) 27eeab1
  • Merge reviewed PRs 28-34: consent test, zip templates, product vision, preferences, flow suggestions, status board (#44) 65f74b7
  • Align illustration fallback order across hook references (#27) 0df8a42

Synthesis

Synthesis the building-block ontology (271 nodes in 10 layers), the guided interview (193 questions on 27 screens, 6 of them planned and skipped until built, with Quick, Standard and Expert modes), the eight dials with generation formulas and 13 famous systems as dial recipes, and the decision graph (352 decisions, 465 dependencies, 12 cycles).

6 changes to the repository
  • U5 usability fixes: every answer reaches the system, exact brand color, personal DESIGN.md and preview, per-platform fonts, review for JSX/Tailwind, add-token, sketch --delegated, show command; extract measures by role with confidence; 2-line sharing ask and host-aware log wording; CI runs extract tests 30f0429
  • T1 phase B: journey tracker wired into engine and skills, both consent questions, consent-drift test, CI and dist bundle; 63 tests pass f2ac19c
  • F1 consistency fixes: engine/skills/spec mismatches, kebab-case token paths, owner-input block class, surface-mode question, three-voice DESIGN.md; 58 tests pass b2004b1
  • U4 plain-language pass complete (README, docs, skills, questionnaire, engine messages); GitHub Sponsors enabled in FUNDING.yml 8e9400d
  • Checkpoint: V1 verification (161 claims, 49 corrections), S2 ontology and graph follow-ups, T1 journey tracker phase A with opt-in anonymous sharing (journey.py, PRIVACY.md, reference receiver), partial U4 plain-language edits; all checks green (48 tests) 2ca83ae
  • U1: three-voice glossary (393 terms) with engine-checked names; THREE-VOICES rule; readability tool; hooks.json parser and rules.md fixes 6079ddf

Product specification

docs/SPEC.md (copied from synthesis/OPENDESIGNER-SPEC.md).

Skills

opendesigner (the interview), opendesigner-extract, opendesigner-extend and opendesigner-export, in the Agent Skills format, with generated copies in .agents/skills/ and .claude/skills/, knowledge files built from the synthesis, and 8 JSON-fed visual templates.

Host packaging

Host packaging a Claude plugin and marketplace (.claude-plugin/), an Agent Plugins manifest (plugin.json), claude.ai skill zips built by tools/build_dist.py, and a ChatGPT Project bundle (chatgpt-project/).

Engine

skills/opendesigner/scripts/engine.py for state, generation, validation and exports.

Community and repository health

README, CONTRIBUTING, Code of Conduct (Contributor Covenant 2.1), security policy, support, governance, citation file, issue forms, pull request template, labels, CI, llms.txt, funding.json, a social preview image, a sponsorship plan, and docs (docs/HOW-IT-WORKS.md, docs/RESEARCH.md, docs/FAQ.md, docs/GITHUB-SETTINGS.md, docs/SEED-ISSUES.md).

Research base

18 finished research lanes (L00 to L18, with L12 still open) written as 352 Decision Cards, with 2,740 sources logged in traces/, including rejected ones.

Benchmark

25 public design systems compared with real values in benchmarks/.

Starter design artifacts

Starter design artifacts in design/: a DTCG 2025.10 token set with 126 contrast-checked pairs, and four HTML artboards.

Coordination system

Coordination system for parallel human and AI sessions: tools/od.py, _coordination/PROTOCOL.md, the board, heartbeats, inbox and decision log.

Research tools

tools/jev_nav.py (status, search, citation check, card export, decision graph) and tools/check_links.py (offline Markdown link check).

Licenses

MIT for code, skills and data; CC BY 4.0 for research and documentation.

15 changes to the repository
  • Board: funding packets, outreach drafts and handover done (private files, outside the repo) b1e7c3c
  • Decision log: repo observed public; Actions disabled at account level 6e29495
  • R2 engine (sketch, review, feedback, zoom levels, intake) with 25 tests; three validated examples; R3 zoom levels, three-voice rules, self-improvement loop a0e06a2
  • R1 README, docs, community files, CI; GitHub settings and seed issues applied 67701da
  • Coordination: od.py sees every lane id, adds lanes under the lock, refuses duplicates f592b27
  • R3 skills, knowledge build, templates and manifests; R2 engine (in progress); R1 community files; U lanes for ease of use (BRIEF 12-17) c7f3da6
  • S1d spec done (14 sections, 32 contradictions settled); R4 sponsorship plan; work in progress from R1-R3 and P1 893047d
  • S1b questionnaire done; D1 tokens and atlas; repo plan (REPO-PLAN.md) and lanes R1-R4 1423417
  • S1b questionnaire done: 27 screens, Quick/Standard/Expert, validator ee753f5
  • L17 and L18 done; S1d spec started 583ae03
  • S1a ontology done (271 nodes, 325/325 cards mapped); work in progress from S1b, L17, L18 7ef38cb
  • Graph overrides from S1c; od.py sync writes heartbeat before commit 1ab8f29
  • Coordination: cross-tool protocol, od.py, AGENTS.md, decision log; synthesis progress 8e75274
  • Stop tracking .env; add .gitignore 58009fb
  • Initial commit bfc098c