What we're working on
The phased improvement plan, rendered from the repository's canonical plan.md at build time. Its checklist lives in tasks.md; completed work is folded into the changelog. Like any roadmap, it can change.
Plan for major improvements across capabilities, functionality, release engineering, accessibility assurance, documentation, and examples. Companion checklist: tasks.md.
Relationship to
spec/: the living specification remains spec/index.md; this file is a bounded improvement initiative to be executed by an AI coding agent in phased work sessions. As work lands, fold outcomes back intospec/index.md§11–§14 andCHANGELOG.md. This revision (2026-08-26) supersedes the 2026-07-11 plan: completed work is recorded below, still-open items are carried forward, and new phases are grounded in fresh research of the monorepo and of the GOV.UK, NHS, USWDS, and design-tokens ecosystems.
How to execute this plan
- Work phase by phase; phases are ordered by dependency and value.
- Each task in tasks.md has an ID (
P1-T1), touched paths, acceptance criteria, and a verify command. Do not mark a task done until its verify command passes. - Always run
bin/testbefore finishing a session; it must exit 0. Runbin/sync-special-filesafter editing any root special file. - Respect the binding rules in
AGENTS/*.md(headless, accessibility, internationalization, theme, helpers, examples). Svelte is the canonical reference implementation; port outward from it. - The helpers are the seven
*-pickerpackages (theme, locale, text-size, motion, share, search, date-time) pluspicker-bar— the July plan's*-selectnames are obsolete and must not reappear. - Keep commits small and per-task; note completed task IDs in commit messages.
Completed since the 2026-07-11 plan
Recorded so the delta is auditable; details in CHANGELOG.md and NEWS.md.
- Helpers: renamed to
*-pickerat full depth;share-pickeranddate-time-pickeradded (five helpers × seven catalogs = 35 packages); two accessibility-hardening sweeps; pointer-close made part of the contract; idempotent apply; 1,847 tests across the seven catalogs. All 30 JS helper packages published to npm at 0.1.0. - Headless publishing (was Phase 3): svelte, react, and vue
headless published at 0.3.0 with real
dist/, barrel exports, types, andsideEffects: false— after discovering 0.2.0 was unusable (declared amainthat was never built). Verified by installing packed tarballs into scratch consumers. - Special files (new work): the repo root and all 22 published
subtree repositories now carry the 16-file public-repo set (LICENSE,
CITATION.cff, NEWS, COMPARISONS, BENCHMARKS, INSTALL, CONTRIBUTING,
CODEOWNERS, MAINTAINERS, CHANGELOG, AI_STATEMENT, GOVERNANCE,
SECURITY, CODE_OF_CONDUCT, RFC, README), propagated by
bin/sync-special-fileswith link rewriting and per-repo generated CITATION/INSTALL, gated bybin/test. Spec topic: spec/special-files-for-public-repos/. - Licensing: the
CC BY-NC-SA/ MIT / ISC contradiction resolved to one SPDX menu (MIT OR Apache-2.0 OR GPL-2.0-only OR GPL-3.0-only OR BSD-3-Clause) acrossLICENSE.md, spec §14, all 50 JS manifests and 5.csprojfiles. "WCAG 2.2 AAA compliant" corrected to "Targets WCAG 2.2 AAA" in package descriptions. Wrong npm repository URLs (react/vue pointed atgithub.com/lily, an unrelated account) fixed in-tree; the live registry copies stay wrong until a patch release (P1). CONTRIBUTING.mdexists (time / code / money), plusGOVERNANCE.md,SECURITY.md,AI_STATEMENT.md,RFC.md(twelve open questions),.github/FUNDING.yml.- Promotion plan: help/outreach/index.md — audiences, channels, readiness gates. Its Gate 1 (license) is closed; Gate 2 (publish all frameworks) is this plan's P2.
- Site:
lilydesignsystem.github.iogained per-framework tutorials, theming and helpers tutorials, help, why, about, comparisons — and a placeholderlily-figmaroute (P5 decides its fate).
Current state (verified 2026-10-06)
The 2026-08-26 snapshot that stood here (491 rows, 22 repos, "themes inert", "no
tags", "nothing published but three libraries") described a project that no longer
exists; it is kept in CHANGELOG.md and spec/history/. As of 2026-10-06:
- Catalog: 571 rows in
components.tsv— 491 plus the 48 national-identifier components (2026-09-22) and 32 components added 2026-10-05/06 from a Baby UI survey and maintainer requests. All 8 headless libraries implement every row except Web Components, which implements 536 (the 35 table sub-elements and interactive*ListItemfamilies are permanently excluded).bin/check-coveragereports 0 drift. - Repositories: 51 published subtree repos — 23 implementation subprojects (8 headless,
7 example apps, 8 helper catalogs), 26 Claude Skills,
lily-design-system-themesand the docs site.bin/testandbin/check-links(12,425 markdown files) are clean. - Published (2026-10-06): headless npm
svelte/react/vue0.4.0,angular/web-components0.5.0,html0.6.0,nunjucks0.4.0; NuGetLilyDesignSystem.Blazor.Headless0.4.0;@lilydesignsystem/themes0.3.0; every helper package (npm and NuGet), including the seven pickers andpicker-bar. NuGet publishes through OIDC trusted publishing frompublish.yml(NUGET_USERmust be the policy creator's username). - Releases: monorepo tags
v0.2.0–v0.8.0exist (v0.7.0andv0.8.0both cut 2026-10-06, each with a GitHub Release); all 50 subtrees were pushed at 0.8.0. - Themes live: 45 themes ship, the docs site mounts
picker-bar, and every picker has a tooltip.bin/syncnow keeps the site's copy of the themes in step (it had drifted). - Demonstration pages: every example app and the docs site render the live demo, rendered
variants and a real usage example (
bin/generate-examples,bin/generate-site-pages). - CI:
.github/workflows/ci.ymldefines jobsverify,helpers,headless,html-headless,dotnet-tests,example-smoke,consumer-smokeandspell-check(job list read from the file 2026-10-06; run history not re-checked). - Open backlog: only the deferred Baby UI ideas (
attachment,tool-chips, the remaining agent, advanced and primitive components — tasks P9-T12, each needing a design pass first). Closed 2026-10-06: theDateRange/ReviewDatecontracts, error-text contrast in all 45 themes,bin/check-class-names, the monorepo tags. Security-posture settings, GitHub topics and README screenshots were not re-verified on 2026-10-06.
Research findings (2026-08)
What the systems Lily learns from are doing, and what it implies here.
- GOV.UK Frontend is at v6 (v6.0.0 breaking: new Sass architecture, updated type scale, updated colours; v6.1.0 2026-03). NHS.UK frontend is at a v10.0.0 pre-release (v9.x added task-list and panel components). Lily's GDS and NHS reference themes were authored against the earlier visual languages, and nothing records which upstream version each theme tracks. → Theme provenance pinning and a refresh pass (P3).
- GOV.UK's professional apparatus — a public roadmap, a "what's new" page, a published accessibility strategy, disciplined versioned releases with migration notes, and explicit contribution criteria — is the visible difference between a maintained system and a repository. Lily now has the repo-side files; the site lacks the roadmap/news surfaces and the release discipline lacks tags. → P2 (release engineering) and P5 (site surfaces).
- Component maturity labels. GOV.UK/USWDS mark components as experimental/stable and say what evidence backs them. Lily's 491 components are uniformly presented, but their depth varies — honest labelling is the cheap, high-trust move that matches this project's stated ethos. → P4.
- Design tokens standardised. The DTCG Design Tokens spec
reached its first stable version (2025.10); Style Dictionary
v4, Figma Variables, Tokens Studio, Penpot and Sketch support it;
adoption hit ~84% of surveyed teams in 2026. Lily's
--theme-*flat-token convention predates this. A DTCG-format token source that generates the custom properties would cost little, make the 45 themes machine-consumable, and give the placeholderlily-figmapage something real to say. → P3/P5, and RFC.md §RFC 6. - Patterns, not just components. NHS and GOV.UK ship task-oriented patterns ("ask users for…", multi-page flows) above the component layer. Lily has composition patterns in AGENTS but no pattern-level guidance; the flagship scenario route (P6) is the first step and should be written up as a pattern doc, not only code.
Phase 1 — Truth, hygiene, and registry cleanup
Goal: every live claim is true — in the spec and on npm.
- Reconcile catalog counts (carried): identify the 491st component, verify full propagation, fix spec §11.4/§14 and any other stale 490s that state present-tense facts (point-in-time snapshot labels may stand with their dates).
- npm registry hygiene:
npm deprecatethe three broken 0.2.0 headless packages with an upgrade message; publish patch releases of svelte/react/vue headless so the corrected metadata (SPDX license menu, right repository URLs, "targets" wording) is what the registry serves. - Angular examples Playwright e2e (carried).
- Analog SSG: file the drafted upstream issue; prototype the
@angular/build:applicationprerender fallback (carried). - Svelte dual-mirror specs for the 80 national identifiers (carried).
- Fresh verification sweep: re-run every suite in spec §11.4–§11.7; restamp tables (carried).
- Repo presentation: GitHub topics + descriptions on all 23 repos; two screenshots in the root README (styled example app vs the same markup unstyled); confirm/enable the SECURITY.md posture table (secret scanning, push protection, private vulnerability reporting) and record what is actually on.
Phase 2 — Release engineering
Goal: every advertised artifact is installable, and releases are real events with tags, notes, and provenance.
- Publish the remaining headless libraries: html, angular,
nunjucks to npm; blazor headless to NuGet — same verified-tarball
discipline as 0.3.0. Push the five built blazor helper
.nupkgfiles to NuGet. bin/publish-headless(or extendbin/publish-helpers), dry-run by default (carried).- Tags and GitHub Releases: annotated tag per release, release notes generated from CHANGELOG sections, applied retroactively to 0.2.0–0.6.0 where commits are identifiable.
- Supply-chain posture: npm 2FA confirmed,
--provenanceon publishes from CI, tag-gated dry-run-default publish workflow (carried, extended). Optional: Zenodo DOI wired to CITATION.cff. - Consumer smoke tests in CI: install each published tarball into a scratch project and import/render 3 components — the check that would have caught the 0.2.0 breakage (carried).
- Versioning & release policy doc
docs/releasing.md(carried).
Phase 3 — Themes live + tokens
Goal: the 45 themes become a user-visible capability with a standards-based token layer underneath.
- Wire
theme-pickerinto all 7 example app shells (SvelteKit canonical first), curated list, localStorage persistence, e2e coverage (carried; renamed). - Mount
locale-pickerandtext-size-pickerin the shells too; considershare-pickeron component-detail pages (carried, extended to the five-helper reality). prefers-color-schemefirst-visit default for theme-picker (opt-in prop; canonical then 6 ports) (carried).bin/check-themeconformance script (carried).- DTCG token source (new):
themes/tokens/*.jsonin Design Tokens 2025.10 format for the core--theme-*set; a generator emits the custom-property blocks the themes consume; drift between generated and committed CSS failsbin/test. Update RFC.md §RFC 6 with the outcome. - Theme provenance + refresh (new): record the upstream version each reference theme tracks (GOV.UK Frontend v6.x, NHS.UK frontend v9/v10, USWDS, Spectrum, Protocol); refresh the GDS theme against v6's updated type scale and colours; document the deltas.
- Dark/high-contrast coverage audit (carried).
Phase 4 — Accessibility assurance
Goal: move from "targets WCAG 2.2 AAA" toward demonstrated claims, per-component and per-app.
- Full-catalog axe sweep: all 491
/components/{slug}routes in the SvelteKit app; fix findings; record the baseline (carried). - Accessibility statement + WCAG mapping (new): a published doc in the GOV.UK accessibility-strategy mould — what is tested by what (axe AA rule sets, unit ARIA assertions, keyboard contracts), what is not, known gaps, and the audit intention already named in CONTRIBUTING.
- Component maturity labels (new):
statuscolumn (experimental/beta/stable) in the catalog metadata, surfaced in per-component docs and on the site; initial assignment rubric documented (test depth, screen-reader evidence, production use). - Screen-reader testing matrix (new): VoiceOver/NVDA/JAWS × representative components; results recorded per component; the scarce-input ask in CONTRIBUTING becomes a structured intake.
- External audit readiness pack (new): scope, environments, and the component list an auditor would need — so funding, if it arrives, converts to an audit without delay.
Phase 5 — Documentation and site surfaces
Goal: the site carries the living surfaces a maintained system shows.
- News/what's-new route on the site fed from NEWS.md; roadmap route fed from this plan (GOV.UK pattern; also closes the outreach plan's blog-route gate).
- Developer on-ramp in CONTRIBUTING: dev setup, the copy-pattern,
add-a-component walkthrough across all 14 subprojects + registries
- CSS hook (the July P4-T1 content the current file lacks).
bin/generate-api-docs: per-component reference pages generated fromcomponents/{slug}/AGENTS.mdinto the site; idempotent; drift failsbin/test(carried).- Migration guides: NHS UK frontend → Lily and GOV.UK Frontend v6 → Lily slug-mapping tables with gaps noted (carried, version -pinned).
lily-figmadecision (new): either a community Figma library seeded from the P3 DTCG tokens, or replace the placeholder with an honest "not planned, here's why + RFC link". No "coming soon" left standing.- Tutorials gain runnable end states: each site tutorial's finished code exists in-repo (fixture or example-app route) and is verified (carried, reshaped — the tutorials now exist; the runnable artifacts do not).
- Doc quality gates in CI: link check already runs; add spell check over docs and the site content (carried).
Phase 6 — Examples deepening
Goal: examples demonstrate the system, not just the components.
- Composed-page parity matrix + backfill, including first composed pages for nunjucks-eleventy (carried).
- Flagship "book an appointment" scenario — SvelteKit first, then ports; ~30 components; Playwright + axe; written up as Lily's first pattern doc (carried, extended per research finding 5).
- RTL demo route per app (carried).
/componentssearch upgrade: category + suffix filters (carried).
Phase 7 — Tooling, CI, and stretch
- CI completeness (new): headless unit suites (7), blazor helpers
(
dotnet test), one example-app Playwright smoke, and the P2 consumer smoke — matrixed, cached, and green. bin/testprofiling (new): ~63 s today; find the hot loop (per-component file checks are the likely cost), target < 20 s without weakening any check.bin/new-componentend-to-end generator (carried).bin/check-coveragedrift matrix (carried).- Visual regression baseline (stretch, carried).
- Web Components headless library (stretch, carried; also RFC-relevant — it would make Lily usable with zero framework).
motion-pickerhelper (stretch, carried; renamed frommotion-select; follows the five-helper contract).
Sequencing and dependencies
- Phase 1 first — registry hygiene and true claims before anything is amplified; it also closes outreach Gates 2–4 prerequisites.
- Phase 2 before any promotion push (help/outreach Gate 2).
- Phase 3 before Phases 5–6 (site and examples reference the live switcher and tokens).
- Phase 4 can interleave with 3; its maturity labels feed Phase 5's generated reference pages.
- Phase 7 items 1–2 can land any time and are cheap wins.
Definition of done (whole plan)
bin/testandbin/check-linkspass; spec §11 tables restamped.- All 7 headless libraries + all 35 helpers installable from a registry; broken versions deprecated; tags and GitHub Releases exist; consumer smoke tests run in CI.
- Theme switching live in all 7 example apps; DTCG token source
generating the
--theme-*layer; theme provenance recorded. - Accessibility statement published; maturity labels on all 491 components; full-catalog axe baseline recorded.
- Site has news + roadmap routes; api-docs generated from canonical metadata; migration guides published; no placeholder pages.
- Flagship scenario live in all 7 apps with its pattern doc.
- Outcomes folded back into
spec/index.md,CHANGELOG.md, NEWS.md, and RFC.md where a question is answered.
Lily™ and Lily Design System™ are trademarks.