ckryptickunal/opendesigner
Open-source, AI-first design-system builder. Interviews you one decision at a time with visual options, recommends sourced defaults, asks for designer-owned assets, and writes DTCG tokens, CSS, Tailwind, DESIGN.md and a decision log.
Changelog
All notable changes to OpenDesigner are recorded here. The format follows Keep a Changelog, and versions follow Semantic Versioning. Detailed reasons for each product decision are in _coordination/DECISIONS.md.
[Unreleased]
Nothing yet.
[0.3.1]: 2026-11-11
A day after 0.3.0, for a design system you have already decided on. Things you removed on purpose stay removed, engine.py review notices tokens edited by hand or a locked decision that a merge undid, and it ends with one line: Review: ok, or what is left to fix. To update in Claude Code, run claude plugin update opendesigner@opendesigner and start a new session; the install page covers the other tools.
Added
- Things removed on purpose stay removed (2026-11-11).
engine.py removed add "<what>" --why "<their words>"records something the owner took out; DESIGN.md lists it andreviewflags code that brings it back. Without their words it is recorded as assumed, still guarded. A pattern that would catch a focus ring, label, alt text, reduced-motion path or target size is refused. - Review guards a decided system (2026-11-11).
engine.py reviewnow notices a token file edited by hand, tokens older thanstate.json, a locked decision that a merge undid, a removal that went missing, and a missingdecisions.mdortokens/. Each says what to do; it never picks a value for you. - od-ignore takes a reason (2026-11-11).
od-ignore: <why>keeps a line on purpose and lists it with its reason; a reason that repeats three times prompts a question to the owner. A bareod-ignoreis a note, and it no longer hides something removed on purpose. A reasoned one on such a line names the removal, as in "matches R-01". - A catalogue of states (2026-11-11). A new template,
assets/output/STATES.md, lists every state of a screen that shows data, with its words, tone and next step, and the rows just under, on and over each limit. The skills offer it before such a screen is built. - The AGENTS.md note fits the system (2026-11-11). A first version, or a system the owner keeps loose, gets a shorter note without the strict rules, unless the owner asked for strict ones. Once the owner zooms in or tightens the rules, the next
setorpickrewrites the note in place, unless someone edited it. No comment meant only for the agent reaches AGENTS.md. - Agent notes that route and forbid (2026-11-11). The AGENTS.md note now says which file decides what, what never to do as part of other work, and how to settle a merge conflict in
opendesigner/. Reports keep written, built and verified apart, and the export skill asks before replying in a Figma or Paper comment thread.
Changed
- Review ends with one verdict (2026-11-11). The last line of
engine.py reviewisReview: okor how many things are left to fix and why, and it counts the errorsengine.py validatefinds.--strictexits with an error exactly when that line is notReview: ok.
[0.3.0]: 2026-11-10
The second release. OpenDesigner now stays in use across long sessions and new ones, its review no longer calls code clean when it uses no tokens, text you protect in DESIGN.md survives every refresh, and people without a terminal get ready downloads. To update in Claude Code, run claude plugin update opendesigner@opendesigner and start a new session; the install page covers the other tools. This release adds a start-of-session hook to the Claude Code plugin: in a project that has opendesigner/state.json it prints the current step, and anywhere else it does nothing.
Added
- Downloads that need no terminal (2026-11-10). The README, the install page and the home page link the ready skill zips for the Claude app, so nobody has to clone and build. A new
opendesigner-chatgpt.zipholds the five ChatGPT files and the text to paste;tools/build_dist.pybuilds it and the site serves it at/downloads/. - How to update it and how to remove it (2026-11-10). The install page and the FAQ now say how to update OpenDesigner in each tool, how to take it out, and which files to delete to undo it in a project. The FAQ also answers what it costs.
- Three style extractors, measured on one site (2026-11-10). OpenDesigner's extractor, Dembrandt and Project Wallace's analyzer were scored against Primer's published tokens on primer.style. The two browser tools reported real values 84-100% of the time but got one or two colour roles wrong; reading the CSS without a browser listed 900 colours, 2% of them on the page. Our accent bug is #110.
- Review runs without a system (2026-11-10). With no
opendesigner/state.json,engine.py reviewstill scans the code and says "No design system is bound here", with the count of hard-coded values. It names any system found in a subfolder and the command that checks the code against it. review --strictfor commits (2026-11-10).engine.py review --strictexits with an error on any finding, tokens not in charge, aDESIGN.mdthat disagrees with the code or validate errors, and its last line names each reason.- An opt-in commit check (2026-11-10).
engine.py guard installadds a git pre-commit hook that runsreview --strict;git commit --no-verifyskips it once andguard removetakes it out. The skill asks once and installs it only on a yes. It never replaces another hook or writes into a sharedcore.hooksPath. - Review reads the page that ships (2026-11-09). When the folder given to
engine.py reviewhas fewer than three style files, it also reads the newestindex.html(inpublic/first) and the files it loads, and lists what it skipped. It takes a single file, counts "behind the code" across the whole repository, lists the newest files first and skipsdocs/. - DESIGN.md checked against the code (2026-11-09). When the code uses no color, font or text tokens,
engine.py reviewsays if the brand color or fonts inDESIGN.mdappear nowhere in it, and names the ones the code uses instead. engine.py contrast(2026-11-09).engine.py contrast "#767676" "#ffffff"prints the contrast ratio, rounded down, and which WCAG minimums it meets.--min 4.5exits with an error under 4.5:1, for scripts.- One version number (2026-11-09). Generated files and the feedback issue text show the OpenDesigner release (0.2.0), not a separate engine number.
- A Now line that survives a context reset (2026-11-09).
opendesigner/PROTOCOL.mdnow opens with one line: the step you're on, what waits for you and the next command. Every engine command that changes the system rewrites it, andengine.py statusprints it, so a new session picks up where the last one stopped. - A start-of-session hook for Claude Code (2026-11-09). In a project with
opendesigner/state.json, the plugin now tells Claude where the design work stands each time a session starts, resumes, clears or gets compacted: the Now line, the owner's rules count and a reminder to review. It only reads files, sends nothing, and stays silent in every other project. - A note later sessions read (2026-11-09). After the first result, the skill asks once whether to write a short note for later AI sessions. On a yes,
engine.py handoff yesadds it to AGENTS.md and writes a CLAUDE.md that imports it, even in a project with neither file. A no is remembered too. - Research on script sizes, corner radius and accessibility law (2026-11-09). Seven new Decision Cards. No official size ratio exists for Devanagari, Arabic or CJK against Latin. Five studies isolate corner radius on interfaces, and none supports "rounded reads trustworthy". EU, US, UK and India law all point to WCAG Level AA, with the 2026 delay to the ADA Title II dates.
- Share cards and llms.txt that keep up with the page (2026-11-09). The review now warns when a page's share title or description says something its headline no longer says, and
engine.py reviewwarns when the share image is older than a change to the headline, hero picture, logo or brand colour. The search check now lists llms.txt lines no page states, new sections it leaves out and links to pages that are gone. - Nothing for reviewers on the live site (2026-11-09).
preflight.py publicchecks a build folder before a deploy for the variant picker, scripts and pictures no page uses, dev pages and local paths in served files, and the review warns about a picker it finds on a public address. The preflight checklist and the website checklist gained the launch items: the share card, llms.txt, robots.txt and an owner decision on AI-training crawlers. - The review notes names that say nothing (2026-11-08). A link, button, field or image named "Read more", "Click here", "Submit", "image" or "Field 1" now gets one note in the review, with where each one is. It is a note, not an error: the text around it may already make it clear.
- The search check finds a hidden noindex (2026-11-08). The search skill now warns when robots.txt blocks a page that also says noindex, because search engines never get to read the noindex. It also stops asking for links to pages marked noindex.
- AI-search advice now cites its study (2026-11-08). The site brief's answer for AI search names the study behind it (GEO, KDD 2024): real quotes, figures and sources helped pages get used, and stuffing keywords hurt. The figures must be your own.
- Guides that answer the question asked (2026-11-07). The Cursor guide opens with the three things Cursor needs, a file tree, a rule file to copy and an audit-first prompt. The vibe-coded guide is now "Make a vibe-coded app look professional", with five steps and a rule list. The other guides drop repeated lines, and say what the contrast check covers.
- Wider, calmer docs pages (2026-11-07). The docs content column is about a third wider and running text keeps a readable line length, with more space between sections. Pages open in plain words, and commands, file paths and flags sit in a folded "For developers" section that AI tools still read in full.
- Shorter craft pages (2026-11-07). The motion, UX patterns, interface details, sources and design styles pages are 15 to 24% shorter, with every rule, number and source kept. They also say what is true today: 32 benchmarked systems, and the two house colour rules (known meanings keep their colours; never pure white with pure black).
- Six new FAQ answers (2026-11-07). The FAQ now answers how to install OpenDesigner, what it asks during setup, which files it creates, how it works with Tailwind CSS, how coding agents use DESIGN.md, and how it differs from UI UX Pro Max.
- Get found in search and AI answers (2026-11-07). A new skill, opendesigner-search, checks a built site for search engines and AI answer engines (SEO, AEO, GEO): which bots may read it, canonicals, titles, headings and structured data. It asks ChatGPT and Perplexity a few questions by hand, and proposes page fixes from what they searched for and cited. Nothing changes without your yes.
- Shorter craft pages (2026-11-07). The motion, UX patterns, interface details, sources and design styles pages are 15 to 28% shorter, with every rule, number and source kept, and tables where text compared values. They also say what is true today: 32 benchmarked systems, and the two house colour rules (known meanings keep their colours; never pure white with pure black).
- A near-black brand builds (2026-11-06). When the accent ramp's text step would be pure black (or pure white in dark mode), links, accent text and accent icons use an off-shade of the same hue, so the engine no longer breaks its own white-and-black rule.
- Adding a platform raises the touch target (2026-11-06). After
pick Q-plat-01adds Android, a standard's 44 px touch target goes back to the engine's own 48 px, as a fresh sketch does. A value the person set is kept, and the conflict is said. - DESIGN.md's dial lines match the tokens (2026-11-06). Each dial line now reports the value the tokens hold, such as 6 px corners rather than the 0 px band when nobody chose the corners, and says why the two differ. The tour shows both worked dials again.
- Chart and table tokens for data-heavy tools (2026-11-05). Chart colors now add a one-series brand color, status colors and a 7-step diverging ramp, each 3:1 against the page, plus axis, gridline and label colors, and every export carries them. A new table question sets striped rows, a header that stays on screen and right-aligned numbers.
- A brand and press page from your system (2026-11-05).
engine.py export --format brand, also written by every build, makesbuild/brand/index.htmlfrom your tokens. It shows your logo with clear space, smallest size and do and don't examples, each colour in hex, RGB and OKLCH, your fonts, and the icon grid with your icons. Your description, facts, leadership, figures and press contact say "Not enough information" until you give them. - Brand colors from your logo (2026-11-05).
engine.py sketch --logo logo.png(or an SVG) shows up to three colors from the logo, how much of it each one covers, and the command that confirms one. White, black and see-through parts are left out, and nothing is recorded until the person picks. - Build writes only the exports your platforms use (2026-11-05).
engine.py buildwrites CSS and Tailwind for the web, Swift for iOS and Compose for Android, and names what it left out. Figma, Paper, DTCG and artifact files are written for every platform, andexport --format allstill writes everything. - More icons drawn like your own (2026-11-05). If you have a few icons and need more,
illustrate.py iconsreads how yours are drawn (badge, glyph box, line weight, colour), ranks 24 open icon sets by how close they are, and redraws the glyphs you pick the same way. They are shown next to yours first, and each licence is recorded. - A site brief for sites that persuade (2026-11-05). A landing page or marketing site now gets five questions at the broad level: the goal and how it is counted, the roles to convince, the proof, how people find it, and its kinds of pages. Each answer is drafted from your words and repo first. PRODUCT.md shows each line, or "Not enough information" with its question, and the proof is never made up.
- Two colour rules for every project (2026-11-05). New house standards: colours with a known meaning keep it (approved green, rejected red, pending amber, info blue, and well-known apps in their own colour), and a product never uses pure white and pure black together.
engine.py validate,reviewandpreflight.py htmlenforce the second; three library parts now draw their codes in near-black. - Kerning and letter spacing, checked in every project (2026-11-05). A new guide,
preflight/references/kerning.md, lists the type-spacing mistakes that keep coming back and how to avoid each.preflight.py htmlnow flags kerning switched off, tracking in px or %, untracked capitals and words split into letters without their kerning (check 57). - Rules for references, samples and content (2026-11-05).
making.mdnow asks for a board of shipped samples to pick from before a new direction, live measurement instead of thumbnails, principles from a reference instead of its page, a content list that "less text" never cuts, and one system for every figure. Moving calls to action are banned.
Changed
- Install and the test numbers come second on the home page (2026-11-10). "Add it to your AI tool" and the four test results now follow the before-and-after demo, about a fifth of the way down the page instead of two thirds. Most visitors left before reaching them. The "Get started free" click at the top is now counted as an install click.
- Fonts, brand color, dials and answers say who chose them (2026-11-10).
engine.py setandpicknow need--set-byfor these values, andchosenneeds the person's words in--quote, so an agent's own pick is no longer recorded as the owner's. Older systems still load. - Binding rules come first in the skill (2026-11-09). After a long chat, Claude keeps only about the first 20,000 characters of a skill, and the main skill was 32,864. It is now 19,296, and its first 2,000 hold seven binding rules, among them tokens only, one question at a time, show every round and review at the end. The detail moved to reference files, unchanged.
- One question per call (2026-11-09). The skill now says it outright: one question per message and one per call of a question tool, the log question alone and first. Ask for "something new" and you get three options to pick from, never one picked for you. A new eval case fails any turn that asks two.
- Skill descriptions name the jobs (2026-11-09). Each skill's one-line description now names what people ask for, such as a taste index, a launch checklist, a share image, "review this" or SEO, so the right skill is picked without being named.
- Four open research questions checked at their sources (2026-11-09). The hover and pressed steps have no published minimum, so they stay an engine estimate. Polaris now publishes keywords, not values, so its old numbers are marked historical. Material 3 tracking for Roboto products, and the Material 3 focus ring (3 px, 2 px outside), now cite Google's own token files.
- Light chart shades are for heatmaps (2026-11-09). The palest
color.chart.sequentialsteps stay under 3:1 against the page, and their descriptions and DESIGN.md now say they're only for cells that touch, with a 1 px gap or the value in each cell.engine.py reviewwarns when a line uses one (#81). - Library page titles fit in search results (2026-11-08). Every component page title is now 60 characters or fewer, such as "Data table: free, uses your tokens | OpenDesigner".
- Plainer library shop (2026-11-08). The shop's headline says the parts match your design, and lines that repeated what the page shows are gone. Tokens and the
--ds-*variables come after the plain words. - Shorter showcase captions (2026-11-07). Each piece on /showcase/ now has a one-sentence caption that says what it shows and who it is for. Captions no longer repeat the brand name from the title or say "fictional", since the page says once that every brand is invented, and none stops mid-sentence.
- "Add to kit" is a secondary button (2026-11-07). On /library/ and the component pages, each card's "Add to kit" no longer has a solid dark fill, so the kit stays the page's main action. A part already in the kit shows an accent outline.
Fixed
- Install steps and counts that disagreed (2026-11-10). The Codex and Cursor steps run inside your project with no folder name to edit. The README opens with the install commands and adds the prompt for an app you already built. The evals tile says 20 briefs after a fresh run, the engine page lists
statusandhandoff, and the styles page says 194 questions, like the tour. - A missing system is caught (2026-11-10). When
AGENTS.md,CLAUDE.mdorDESIGN.mdsay the system lives inopendesigner/and that folder is missing,engine.py reviewfails and says so. - design-md keeps every od:keep block (2026-11-09). A kept block that holds its own heading, or sits in a section the file no longer has, is no longer deleted; the second kind moves to a Notes section. The
.hand-editedbackup is now the whole previous file, not a 201-byte fragment. - Review never calls token-free code clean (2026-11-09). When no token is in use,
engine.py reviewsays "no tokens in use" instead of "the code uses the tokens", and counts radii, not "radiuss". - Concept and reference docs, plain first (2026-11-08). Thirteen docs pages, from accessibility and tokens to the engine and security, now open in plain words. Commands, paths and JSON moved into "For developers" folds, and long passages became tables. Open text is 17% shorter, and every number, limit and privacy fact stays.
- Library parts follow today's tokens (2026-11-08). The ten looks in the component library are rebuilt with today's engine, and five parts now take their corners and spacing from those tokens: the chat quote's corner is the bubble's minus its gap, the date picker clears its corner on phones, and the receipts table fits at tablet width (#82).
- A shorter home page and showcase (2026-11-07). Lines that repeated a heading, a button, a picture or another line on the page are gone. Two claims are corrected: the example system writes 50 files, not 51, and a reference never brings in another brand's logo, name, images or copy.
- Text over photos stays readable in three more library parts (2026-11-07). The live chat's viewer count, the video player's captions and the title detail's play icons now sit on dark chips. On a white frame the text measures 5.89:1, up from 2.25:1, in all ten looks.
- The home page's example buttons stay on one line on phones (2026-11-07). Below 440 px wide, the two buttons on each example card use 13 px labels, so "Skip today" and "Mark today done" keep their words and sit on one row instead of wrapping (#77).
- Saying no to tracking is as easy as saying yes (2026-11-07). On the site's consent card, "No thanks" and "Allow" now look the same. On phones the card is one line and the two buttons, so it covers far less of the first screen (#78).
- Shorter getting-started pages (2026-11-07). Introduction, Install, Quickstart, How it works and FAQ are a fifth to two fifths shorter, and the tour's captions are tighter. Every command, number, limit and privacy fact stays. They also now say that code exports cover only your platforms, and that the engine takes a few seconds.
- Docs type follows the brand scale (2026-11-07). Docs pages, and the header and footer every page shares, now use only the brand's type sizes (13, 16, 20, 25, 39 and 49 px) and two weights, 400 and 500. The docs home went from 14 sizes and four weights to five sizes and two weights (#79).
- The changelog marks what came after the release (2026-11-06). On /changelog/, entries not yet in a release carry a "Since v0.2.0" tag, read from the version and its git tag, so it moves with each release (#70).
- Calmer type on the docs (2026-11-06). Figure captions and the footer's legal line stop at about 65 characters, the docs heading fits on two lines, and acronyms such as MIT and DTCG are no longer tracked tight (#75).
- Tabs no longer move the page (2026-11-06). On the website, switching the install tabs, the example products, the tour's files or a component's device views keeps the same height, so the text below stays put. On phones, the before-and-after's list of findings opens from a button instead of growing under the picture.
- The review raises three fewer false alarms (2026-11-06). Text kept only for screen readers in a tiny clipped box is no longer clipped text. A lone arrow or bullet is held to 3:1 as a graphic.
capture.pyloads a page again when its stylesheet failed, says so, and measures nothing if it fails twice. - The link check skips git-ignored folders (2026-11-06). In a git checkout,
tools/check_links.pynow reads only the Markdown files git would commit, so copied build inputs such assite/.cache/no longer show up as broken links. Outside git it reads every file, as before. - Library text reads on every photo and beside disabled items (2026-11-06). The social post's photo counter and the video player's time now sit on dark chips, and the note beside a disabled menu item and a sold-out size use a readable grey. All pass 4.5:1 in the ten looks.
- "1 place up", not "1 places up" (2026-11-06). The leaderboard's screen-reader text, the video player's spoken time and the daily goals note now use the singular for 1.
- Three checkers at full marks again (2026-11-05). The layout check no longer calls a narrow card under a wide one a half-empty row. Preflight finds sizes off a scale named
--fs-*,--text-*and other common names. The name check catches two-word names one letter apart, like Vosberg Health and Vossberg Health. - The consent card no longer hides the page (2026-11-05). While the website's consent card shows, the page keeps room for it at the bottom. The footer's last line now scrolls clear of it, and a link reached with Tab scrolls above it.
- Header links are easier to tap on phones (2026-11-05). On touch screens the logo, nav, breadcrumb and "more" links have a 44 px hit area, and nothing on the page moves.
- Small labels keep their style (2026-11-05). The booking card's and the tour's small capital labels no longer grow into body text with tight spacing. The width numbers on component pages now pass contrast on the selected tab.
- The review raises fewer false alarms (2026-11-05). A decorative demo built from real buttons, a sticky sidebar near the footer, a focus ring drawn on
::after, and rows that share a selector were all reported as faults. A review of opendesigner.dev found each one, andprobe.jsandreview.pynow read them correctly. - The website and docs say what is true today (2026-11-05). The security page names the 0.2.0 release, the engine page lists
version,detect,researchand owner notes, and counts, the home page's examples and the showcase's tags match the repo again. Release lines on the site now come from the git tag, so they can't fall behind. - The worked examples match the engine again (2026-11-05). The three systems in
examples/were rebuilt from theirstate.json, andpython3 tools/build_examples.py --checknow fails, in CI too, when the engine writes something they do not show. The old replay script, which could wipe them, is gone. - The link check knows the website's pages (2026-11-05). A link like
/tour/in the website's docs is now checked against the pagessite/build.pymakes, so real pages pass and a mistyped one still fails. - The palette page shows its contrast checks (2026-11-05). The table under the shades was always empty because the engine sent no colour pairs (#47). Each option now carries the pairs people read most, in every mode and measured the same way as
engine.py validate, and the page works out each ratio from the colours it shows. - The footer links every docs page again (2026-11-05). The footer had dropped to 20 links. It now links every docs page by section from every page, so search engines and AI crawlers reach them, and each label still fits on one line down to 320 px.
[0.2.0]: 2026-11-05
The first tagged release: the research base, the synthesis that turns it into an interview, eight skills, the engine and host packaging. Copies installed before it report 0.1.0; update to get everything below.
Added
- A shorter README and home page that claim only what ships (2026-11-05). Two ways in (fix what you built, build a system), what happens every round, and the status. Supporting paragraphs under the home page headings are gone, and the library count says 82.
- The research steps in the main flow (2026-11-05).
engine.py research market,positioninganddirectionsrun the competitor table, the positioning and the direction board, and the skill asks for them before any colour. PRODUCT.md gains its own Positioning section.OD:directionrecords a pick. An AI-made photo is named to the person, never captioned on the page. - Landing pages get room and a hero (2026-11-05). A marketing page now gets spacious spacing, 48 to 56px buttons and its own fluid display scale, 96 to 120px for the hero. Capitals never take negative tracking, text keeps three greys, and the system writes one container, columns, gutters and a reading measure.
- A button shape you choose holds (2026-11-05). Feel words no longer make buttons square or pill; those are choices. A chosen shape is stored as the exact radius and locked, and typed values such as "6px", "400/500" or "major third" are stored as values. Each page's caps (8 sizes, 3 weights, 2 families) are written down for the review to check.
- A protocol in every project (2026-11-05).
initwritesopendesigner/PROTOCOL.md: six steps with owner gates, and checks every round, shown as screenshots before and after.engine.py reviewsays when code uses no tokens or the system is behind the code. A note said twice becomes a rule inRULES.md; landing pages get marketing questions. - Research before colour, then three directions (2026-11-05). Research now ends with a table of competitors, linked, with their colours, fonts and button shapes, to show before any colour. Then comes a positioning you confirm, and three directions that each change the ground, fonts, photo style, accent and layout, on one board with licensed stock photos checked for brand logos.
- A stronger audit, every round (2026-11-05). The review now measures what an owner kept catching by eye: tight capitals, lost kerning, art drawn through text, bars covering text, mixed alignment, boxes that jump between tabs, controls that do nothing, and too many sizes, buttons and fonts. audit.md lists the checks to run on every draft.
- How it works is easier to find (2026-11-04). The "How OpenDesigner works" page is now linked from the top of the home page, two home page sections, the footer on every page, the top of the docs sidebar, the docs home and the Introduction.
- How OpenDesigner works, on one page (2026-11-02). A new page at opendesigner.dev/tour/ draws the whole system in live HTML: the two ways in, the engine's dials, the files you keep, what protects you, and how a confirmed mistake becomes a check. Every number on it is read from the repository when the site is built.
- Reads your repo before asking (2026-11-02). A new
engine.py detectreads the product's name, where it runs, a brand colour, the font, dark mode and the project's phase from your files.initandsketchrecord each one as assumed, with its source, never over an answer you gave, and the sketch turns each answered question into one line to confirm. - Purpose, goals and market in PRODUCT.md (2026-11-02). PRODUCT.md gains Purpose and goals, Phase and Market sections, each saying "Not enough information" until your words or the research fill them. The user research gains a market topic: competitors, what they all do, the gap and an analogous product, with sources. Principles are drafted from the goals.
- The project's phase sets what comes first (2026-11-02). A new question, Q-scope-07: an idea, being built, close to launch, or live, read from the repo first. An idea starts with its purpose and an analogous product, close to launch with an audit, copy and preflight, and live with the audit and governance.
- An audit for products that are already built (2026-11-02).
references/audit.mdis the first step for fixing a product someone already built. It goes through every button, font, weight, size, colour, gap, corner and state, and writes each problem as one row: where it is, what is wrong in plain words, the fix, and the rule it breaks with its source. - The review counts what competes on a page (2026-11-02).
review.py checknow counts what any page can be judged on without a design system: filled buttons competing in one view (new review case MS-16), typefaces, weights, colour families, gray text colours and colours typed twice. Each is a warning that names its source. - Every fix says where its rule comes from (2026-11-02).
review.py compareshows the source of each fix, such as "From: preflight 36", and ends with "Keep the fix, keep today's, or try another?".making.mdasks the same of every option shown on a built page. - The evals page compares fairly and shows every run (2026-11-02). The headline compares OpenDesigner with a plain AI only on the 7 tasks a plain AI can attempt (92% with, 66% without). Every saved run is listed, including the two taste tasks that scored 0%, and the limits come first.
- A product direction proposal (2026-11-02). Sixteen notes on direction are in
_coordination/OWNER-FEEDBACK.md, answered by a proposal in_coordination/proposals/. The field plan records 59 stars and 4 forks. - A star chart in the README (2026-10-31). The README shows OpenDesigner's GitHub stars as its own chart, in light and dark.
tools/star_chart.pyredraws it from GitHub every 3 hours, andtools/gh_snapshot.pysaves the repo's GitHub numbers as JSON. - Preflight measures flashing (2026-10-28).
preflight.py videonow checks the final video against the WCAG 2.2 flash limit (SC 2.3.1) with ffmpeg, and--flash-wheresaves the worst moment. 8 of 73 Instagram reels we measured flashed over the limit. Checklist item 49 lists the usual causes. - User research before the defaults (2026-10-26). After the sketch, OpenDesigner offers to research who the users are. After one yes it searches with the tools it has, cites every finding, and turns them into recommended answers to the audience questions. Nothing changes without the person's yes. See
references/research.md. - Library pages with less to read (2026-10-25). Each part's page shows its name, one line, Add to kit and Copy prompt. The full description, install command and credits fold into Details. Agents still get the full text in each page's Markdown copy.
- Product analytics with PostHog (2026-10-24). The site counts visits without cookies and records where each visit came from. Session recording runs only after a visitor says yes, with every input masked.
docs/PRIVACY.mdsays what is counted. - A Taste Index of a look you love (2026-10-24).
taste_index.pydescribes one site's look from a few pages or a screenshot: colours, type, components, motion, voice and a Never list, each marked measured or inferred. It may keep exact colours and font names, never logos, names, images or copy. The system follows it only when the person chooses it. - Forty consumer parts in the component library (2026-10-24). The library grows from 42 to 82 parts, adding social, media, shopping, travel, health, money and learning. The shop gains a Consumer / B2B filter.
- The component library, reworked to a craft standard (2026-10-23). All 82 parts were rebuilt with more room, one accent colour, Lucide icons and real Unsplash photos. Card previews load as you scroll, so the shop lays out in 70 ms instead of 830 ms.
- Every push to main goes live by itself (2026-10-23).
site/autodeploy.pyruns on the maintainer's Mac. When main has been still for 5 minutes, it builds, checks and publishes the site. A failed deploy leaves the live site as it was. - Six measurement fixes in reference intake (2026-10-23). Reading a site now catches borders drawn by pseudo-elements, keeps looping animations apart from UI motion, ignores the browser's default link blue, and reads density from the page's spacing, not only body size.
- Preview a value before recording it (2026-10-23).
engine.py set ... --dry-runandpick ... --dry-runshow each token's old and new value and any check it would change, and write nothing. - The changelog is its own page (2026-10-23). It moved from /docs/changelog/ to /changelog/, and the old address redirects. Each day shows its highlights, with its commits folded underneath.
- Agent evals for the taste index (2026-10-23). Two cases,
taste-leaves-outandtaste-all-past, check that the style gallery respects a person's taste poll. - Lists and sidebars breathe (2026-10-23). The 24 px accessibility floor is a minimum, not a size.
making.mdsection 12 now asks for rows at control height and room between icon and label, and preflight check 48 looks for it. - A changelog anyone can check (2026-10-22). The changelog page opens with the current version, how to check yours and how to update.
/version.jsonand an Atom feed give tools the same facts. - Markdown for agents (2026-10-22). A request for
text/markdowngets the page's Markdown copy. Browsers and search engines still get HTML. - Agents can find and read the site (2026-10-22). robots.txt allows search and AI crawlers, the home page links llms.txt and its Markdown copy, and
/.well-known/agent-skills/lists all eight skills as zips. - The analogous product (2026-10-22). Before designing, OpenDesigner names a product that already solved the same interface problem, confirms it with the person and studies it as an inspiration.
- Before and after in the README (2026-10-22). Two new panels show the invoices page with its seven measured issues beside the fixed page, and six parts from the component library.
- A social preview for every page (2026-10-22). Each shared docs link shows its own card with its section and title. Cards are about 60 KB instead of 800 KB.
- The home page says what OpenDesigner is (2026-10-22). The headline names the category, "Design systems for AI coding tools", so search engines and AI answers can tell what the page is about.
- The review skill catches labels that break across lines (2026-10-22).
review.py checkreports a button, tab or chip label that wraps onto a second line. Overflow checks missed these. - An optional component library (2026-10-22). Finished components built only on the engine's
--ds-*tokens, so each takes the project's colours, type, spacing and corners.library.pylists, suggests, adds and checks them, and the website shows them as a shop at /library/. - The audit, as it happens, on the home page (2026-10-21). The before-and-after section plays once: a scan line finds each issue on an invented invoicing page, then a green line fixes it with the system's tokens. Both pages are live HTML, and reduced motion keeps it still.
- The demo's fixed page is a bento (2026-10-21). Each tile holds one figure with a small chart, and red is kept for late money.
- Agent notes stay out of design decisions (2026-10-21).
engine.py set profile.seen.<name> ...stores a note without writing a decision. - The trial ledger (2026-10-21).
_coordination/TRIAL-LEDGER.mdlists every correction a person typed in a demo trial, each with its fix. Trial 1 gave 15, and they became rules inmaking.mdsection 12. - The quality bar and good practices (2026-10-21).
references/quality.mdsets floors and a nine-line scorecard judged against shipped products.references/practices.mdlists the tools an agent looks for at the start. - Correct is not finished (2026-10-21). After building, the skill opens the result, compares it blind with three shipped products and reports a score. A built product is audited before it is redesigned.
- Before and after, on the person's own page (2026-10-21).
review.py comparewrites onecompare.htmlwith the page today, the audit drawn on it and the fix, with measured numbers before and after. - A ready-made variant picker (2026-10-21).
assets/picker.jsswitches between 2 to 5 options on a review copy of a page, by key or by?v=in the address. - The changelog and a contribute guide on the website (2026-10-21). The changelog page is built from this file on every publish, and
/docs/contribute/sums up how to help. - One line asking people to recommend OpenDesigner (2026-10-21). It appears once per project, only after OpenDesigner has helped, and never next to another question.
- Each system knows which OpenDesigner made it (2026-10-21).
state.jsonrecords the release that made and last built the system. Commands say once when it is out of date, andengine.py versionprints both releases. - Evals, published with the numbers (2026-10-20). Agent evals run eight small tasks with and without OpenDesigner (91% against 58% at the time). Design evals run the engine on 18 fixed briefs (a CI job is set up for them), and checker evals test the review checks on planted pages.
- Showcase round 4 (2026-10-18). Components, app screens and footers were rebuilt and judged blind against shipped products. Pieces that didn't reach 4 of 5 are hidden until they do.
- Taste: the poll, the taste index and the taste card (2026-10-15). The person rates 20 to 30 shipped screens, and the result recommends the eight dials. The taste index merges every taste signal with red lines, and DESIGN.md opens with a five-line taste card.
- Defaults for dense B2B work tools (2026-10-15). When the audience is
dense, the engine fills tighter corners, row heights, one selection blue and tabular digits, only where the person hasn't answered. On the web, no text style is smaller than 12 px. - Painting skill (2026-10-15).
opendesigner-paintpaints original art and films in code in the brand's palette (watercolour, pointillism, charcoal, sketch, woodcut, 2D cel).paint.pyturns the system into a painting brief, sets up a film project and brings the result into the app with a reduced-motion still. - Review skill (2026-10-15).
opendesigner-reviewchecks a built UI at every size, theme and state, and reports with evidence.probe.jsmeasures the running page, andreview.pychecks the results against the floors and the tokens. - Preflight skill (2026-10-15).
opendesigner-preflightis the last look at a page, video, deck or card before it is shared: yes-or-no checks, andpreflight.pyfor type, fonts and video frames. - House standards (2026-10-15). 455 rules from the owner's non-negotiable sources. The engine applies and locks them per project, the interview skips what they settle, and
reviewflags code that breaks one. - Lessons from the owner's website review (2026-10-15). Preflight checks 35 to 42 and review cases MS-05 and CV-04: alignment at every width, one primary action, no widows and whole labels on phones.
- Your own design-system page (2026-10-14). Every
buildrebuildsopendesigner/overview.html: colours, type, spacing, corners, motion and components on one page. Anything only a person can give says "Not enough information". - The system as a Claude Design System artifact (2026-10-14).
engine.py export --format artifactwrites the tokens, brand book and previews ready to publish with the Artifact tool. - Illustration skill (2026-10-14).
opendesigner-illustratefinds open-licence illustrations, ranks them, recolours them to the tokens and applies them, with a licence ledger. Its directory covers 44 sources with their licences. - Making and reviewing pages (2026-10-13).
references/making.mdguides agents after the system exists: the first draft on the tokens, one round of feedback at a time, and options on a review copy. - Learning wiki (2026-09-27).
learn/holds what OpenDesigner learned from 99 trusted sources, with 53 topic pages.tools/wiki.pyadds, checks and maps it. - Decision Cards from the wiki (2026-09-27). 164 cards with 253 proposed changes. Three are adopted so far; the rest wait in
synthesis/QUESTIONNAIRE.md. - Research search (2026-09-27).
tools/jev_nav.py findalso searches the house standards and ranks results with BM25. - Synthesis (2026-09-24). The ontology (271 nodes), the interview (193 questions), the eight dials with their formulas, and the decision graph.
- Research base (2026-09-23). 18 research lanes written as 352 Decision Cards, with 2,740 sources logged in
traces/. - Benchmark (2026-09-23). 25 public design systems compared with real values in
benchmarks/. - Starter design artifacts (2026-09-23). A DTCG token set with 126 contrast-checked pairs, and four HTML artboards in
design/. - Coordination system (2026-09-23).
tools/od.pyand_coordination/let parallel human and AI sessions work on one repo. - Research tools (2026-09-23).
tools/jev_nav.pyfor search, citation checks and the decision graph, andtools/check_links.pyfor Markdown links. - Product specification (2026-09-23).
docs/SPEC.md. - Skills (2026-09-23).
opendesigner,opendesigner-extract,opendesigner-extendandopendesigner-export, in the Agent Skills format. - Host packaging (2026-09-23). A Claude plugin and marketplace, an Agent Plugins manifest, claude.ai skill zips and a ChatGPT Project bundle.
- Engine (2026-09-23).
engine.pyfor state, generation, validation and exports. - Community and repository health (2026-09-23). README, CONTRIBUTING, Code of Conduct, security policy, issue forms, CI and
llms.txt. - Licenses (2026-09-23). MIT for code, skills and data; CC BY 4.0 for research and documentation.
Fixed
- Counts in the docs match the files again (2026-11-02). Review case, export format, skill and library counts in the docs, SPEC, AGENTS.md and llms.txt now match the repo.
- A calmer site footer (2026-11-02). The footer went from 8 columns and 42 links to 4 columns and 20 links. Every link fits on one line down to 320 px.
- Favicon on dark browser tabs (2026-10-28). The favicon switches to the dark mark when the browser tab is dark, so its squares stay visible.
- Five small slips on the home page and in the library (2026-10-26). "1 false alarms" became "1 false alarm", the audit's check marks no longer cover text, library dates use 2026 weekdays, and the header fits at 320 px again.
- Library cards in Safari (2026-10-25). 53 of 82 shop cards drew their part as a thin column in Safari. Cards now scale with a transform, and
site/check_browsers.pychecks every card in WebKit and Chrome. - The library's activity part no longer copies Apple (2026-10-24).
activity-ringsused Apple's rings and words. It is nowdaily-goals: flat bars for steps, active minutes and water in the system's accent. - A corner radius between the steps builds (2026-10-24).
engine.py set radius.control 10used to stop the next build. A radius between the steps now gets its own step, andsetrefuses values that can't be a radius. - Two agent eval graders (2026-10-23).
no-identity-copynow checks that the skill ran, andextend-rounderno longer fails a reply for listing the files a rebuild wrote. - Agent evals run the cases you ask for (2026-10-23).
tools/agent_evals.pytakes several cases or tags,--listshows what matches, and a filter that matches nothing stops with an error instead of running nothing. - The option gallery is never empty (2026-10-23). A taste red line now judges only the dials the style directions differ on. If every direction is past a line, all show with a warning.
- The home audit counts up as it scans (2026-10-22). Issues are numbered in reading order, and on phones the view moves to each issue as it is named.
- The home page paints faster on phones (2026-10-22). The hero photo is preloaded, and site.css shrank from 37 KB to 26 KB.
- Fixes from the fresh verifier's re-check (2026-10-21).
review.py comparemeets 4.5:1 contrast, the variant picker can't show two options at once, and Markdown copies no longer show raw{{...}}placeholders. - Screen-reader-only text is not "clipped" (2026-10-21). The review probe no longer reports visually hidden labels as clipped text.
- The glossary has one source again (2026-10-21).
synthesis/glossary.jsonis the file to edit, andcheck_glossary.py --checkis set up to run in CI. A rebuild would have deleted 13 terms. - Apple's letter spacing and corners change the files they promise to (2026-10-21).
size-tablenow uses Apple's SF Pro tracking table, andsquircle-enhanceadds Apple's continuous corner to the CSS, Tailwind, Figma and Swift exports. - Another company's colour is never your brand (2026-10-20). Asked for "Stripe's exact purple", the skill once saved it as the person's brand. A colour named as another company's is now only a reference.
- Four checker bugs found by the checker evals (2026-10-20). Contrast after a semi-transparent element, a page with nothing to focus reported as a keyboard trap, and screen-reader-only text flagged by the layout check.
- Renaming a system leaves no old export behind (2026-10-15).
export --format dtcgkeeps only the current system's files. - Accessibility claims match the engine (2026-10-15). The docs no longer promise reduced-transparency or high-contrast modes the engine doesn't make. Glass surfaces get a solid fallback.
- A brand colour the person typed is never replaced (2026-10-15). The sketch used to swap light brands like yellow #FFE500 for olive. A typed hex now stays exact, and only fills that carry text use a readable shade.