create-helix
v0.9.5
Published
Scaffold a new project with HELiX web components — TUI-powered CLI
Downloads
1,194
Maintainers
Readme
create-helix
Scaffold a HELiX design system project in seconds. TUI-powered CLI with a two-step starter-kit picker — first you tell it what the project builds (wc-storybook design system, react-next app, react-vite app, or drupal-theme), then it offers to bundle a shared design-system package alongside. 11 additional experimental frameworks are available behind --show-experimental.
New in v0.9.0 — SvelteKit joins the production-tier starter kits. The Q1 picker now offers five production-tier targets: wc-storybook, react-next, react-vite, astro, and svelte-kit. The SvelteKit starter ships a real SvelteKit 2 + Svelte 5 landing page on adapter-static (hero, features, showcase, browser-native View Transitions via onNavigate, theme toggle, two routed pages) and consumes the design system as <hx-*> web components natively — Svelte 5's compiler treats unknown lowercase-with-dash tags as DOM elements first-class, no isCustomElement config needed. Visual baselines ship under tests/e2e/screenshots/sveltekit/.
v0.8.0 — Astro joined the production tier with a real Astro 5 landing page (hero, features, view transitions, theme toggle, two routed pages) consuming the design system as <hx-*> web components natively. Baselines under tests/e2e/screenshots/astro/.
v0.7.0 introduced monorepo by default for app frameworks. When you pick react-next, react-vite, astro, or svelte-kit and keep the design system (the default Y at Q2), create-helix emits a turbo + pnpm-workspaces monorepo with apps/web/ + packages/{design-system,types,utils}/ — modeled on the shadcn apps/web + packages/ui precedent. Pass --no-design-system (or answer "n" at Q2) to keep the v0.6.x flat single-app shape. See Monorepo by default and MIGRATING.md.
The flagship wc-storybook template remains the default interactive selection and ships a brand-storytelling Storybook experience out of the box — Cover narrative, foundations IA (including a v0.6.0 Iconography page wired to @helixui/icons), per-component AAA conformance pages with auto-injected accessibility status cards, and a token-driven manager chrome that follows your brand. See WC-Storybook brand-storytelling experience below.
Quick Start
npx create-helix
# or
npm create helixFollow the interactive prompts to choose your framework, component bundles, and features.
Drupal Theme Scaffolding
npx create-helix --drupalOr pass a preset directly:
npx create-helix --drupal --preset healthcareSupported Frameworks
The interactive prompt shows a curated slim list by default — the flagship wc-storybook factory plus the four production-tier app starters that have shipped beyond stub quality. The remaining 11 framework templates exist but are gated behind --show-experimental until they reach the same bar.
| Framework | Command Hint | Features |
| ------------------------------ | ----------------------------------- | ----------------------------------------------------------------------------------------------------------------- |
| WC Storybook (factory) | default — design system factory | Lit 3, Storybook 10, brand-storytelling docs, AAA cards, Iconography page, auto-catalog ~99 hx-* entries |
| React + Next.js 16 | recommended for new app projects | SSR, App Router, React wrappers |
| React + Vite | best DX for SPAs | Hot reload, React wrappers, production landing page |
| Astro 5 | islands + native web components | Landing page, view transitions, theme toggle, native <hx-*> consumption, Playwright visual baseline |
| SvelteKit 2 (new v0.9.0) | static-site + native web components | Landing page, browser-native View Transitions API, theme toggle, native <hx-*> consumption, Playwright baseline |
Experimental templates
Run npx create-helix --show-experimental (or set HELIX_SHOW_EXPERIMENTAL=1) to surface these in the prompt, the list subcommand, and as valid --template <name> values:
remix, vue-nuxt, vue-vite, angular, lit-vite, solid-vite, qwik-vite, preact-vite, stencil, ember, vanilla
These templates compile and emit a project skeleton, but their docs / examples / DX polish lag behind the curated five. They'll graduate out of --show-experimental as they reach the same bar.
Monorepo by default (v0.7.0+)
When you pick an app framework (react-next, react-vite, astro, or svelte-kit as of v0.9.0) and keep the design system at the second prompt — the default Y — create-helix emits a turbo + pnpm-workspaces monorepo:
my-project/
├── apps/
│ └── web/ # Next.js, Vite, Astro, or SvelteKit app
├── packages/
│ ├── design-system/ # Lit web components + Storybook
│ ├── types/ # Shared TS types + brand utilities
│ └── utils/ # Shared helpers (cn, isPresent, …)
├── pnpm-workspace.yaml
├── turbo.json
├── tsconfig.base.json
└── package.jsonapps/web declares the workspace packages via workspace:* deps. The framework-specific wiring per starter kit:
- Next.js carries
transpilePackages+experimental.externalDir; the design system is consumed via generated React wrappers frompackages/design-system/src/react.ts. - Vite carries
optimizeDeps.exclude+server.fs.allow: ['..', '../..']; React wrappers as with Next. - Astro (v0.8.0) consumes the design system as
<hx-*>web components natively — no React wrappers, nocreateComponentindirection — because Astro's island architecture is web-component-first. - SvelteKit (v0.9.0) also consumes the design system as
<hx-*>web components natively — Svelte 5's compiler treats unknown lowercase-with-dash tags as DOM elements first-class (noisCustomElementconfig required).adapter-staticoutput; browser-native View Transitions wired viaonNavigate;apps/web/vite.config.tscarries the sameoptimizeDeps.exclude+server.fs.allowwiring.
Running pnpm dev at the root runs turbo run dev, which boots both apps/web and packages/design-system Storybook (port 6006) concurrently. Default app ports: Next.js 3000, Vite 5173, Astro 4321, SvelteKit 5173.
The shape mirrors the shadcn apps/web + packages/ui monorepo precedent — proven at scale, familiar to consumers.
Available starter-kit combinations
After Q1 (what does this project build?) and Q2 (include design system?), the supported combinations are:
- Design system (
wc-storybook, flat — always flat, it is the design system) - Next.js + design system (monorepo, default for Next pick)
- Vite + design system (monorepo, default for Vite pick)
- Astro + design system (v0.8.0) — monorepo, default for Astro pick
- SvelteKit + design system (new v0.9.0) — monorepo, default for SvelteKit pick
Opting out
Three escape valves keep the v0.6.x flat single-app shape available:
- Interactive — answer "n" at the "Include design-system package?" prompt.
- CLI flag — pass
--no-design-system(or--monorepo=false). - API —
scaffold({ framework: 'react-next' | 'react-vite' | 'astro', monorepoMode: false }).
wc-storybook always scaffolds flat — it is itself the design system, so wrapping it in a monorepo would duplicate the layer.
The flat Astro path is deprecated as of v0.8.0 — still reachable via the API + --no-design-system for back-compat, but the monorepo is now the supported shipping target. New Astro investment lands in the monorepo emit. See MIGRATING.md v0.7 → v0.8 section.
Existing v0.5.x / v0.6.x / v0.7.x scaffolds are not broken. Their shape on disk is unchanged. A create-helix migrate-to-monorepo subcommand is deferred; see MIGRATING.md for the manual recipe (which covers Next/Vite/Astro alike — they share the same workspace shape).
Cross-kit feature parity (v0.9.1+)
The 4 production kits (react-next, react-vite, astro, svelte-kit) share a deliberately consistent consumer surface so a developer moving between them recognizes the shape:
| Feature | react-next | react-vite | astro | svelte-kit |
| --------------------------------------------- | ------------------------------------ | ----------------------- | --------------------------- | ------------------- |
| <h1> | "Build interfaces on web standards." | same | same | same |
| <title> | {name} — built with create-helix | same | same | same |
| Theme toggle | native <button> w/ aria-label | same | same | same |
| localStorage key | helix-theme | same | same | same |
| Pre-hydration boot script | inline <script> | /public/theme-boot.js | inline <script is:inline> | inline <script> |
| Pre-hydration prefers-color-scheme fallback | yes | yes | yes | yes |
| <main> landmark | per-page (exactly 1) | in App.tsx | in Layout | in +layout.svelte |
| Hero CTAs | styled <a class="button"> | same | same | same |
| <hx-*> consumption | @lit/react wrappers | @lit/react wrappers | native | native |
What's intentionally platform-specific:
- App structure — App Router multi-route (Next), SPA (Vite), static + ClientRouter (Astro), file-based routing (SvelteKit).
- View transitions — Astro's
<ClientRouter />and SvelteKit'sonNavigate+ browser-native View Transitions API. React kits don't get these for free. - Build artifacts —
.next/,dist/,dist/(astro),build/+.svelte-kit/.
What's deferred to upstream:
<hx-select>placeholder color contrast (#94a3b8on white = 2.56:1) — single remaining axe-core violation across all 8 default page-visits. Tracked in the BSTHelix Bug Reports.mdvault doc.
WC-Storybook brand-storytelling experience
npx create-helix → choose WC Storybook (factory) to scaffold a Lit 3 design system with a fully-staged Storybook out of the box. Three brand prompts shape the experience:
- Design system codename (
--ds-name) — drives element prefix ({ds}-button) and CSS token namespace ({prefix}-*). - Brand tagline (
--brand-tagline) — surfaces inCover.mdxandBrand.mdx. Falls back to a neutral default. - Brand verticals (
--brand-verticals "fintech,wellness") — populates the brand toolbar dropdown. Empty = single-brand mode.
The scaffolded Storybook ships:
- Cover.mdx with brand tagline + vertical chips + quick-start commands.
- Overview.mdx explaining the three-tier token cascade (primitive → semantic → component).
- Foundations — 8 MDX pages: Tokens, Color, Typography, Spacing, Layout, Brand, Accessibility, Iconography (new in v0.6.0 — renders the full
@helixui/iconscatalog plus a curated showcase, wired tosetBasePath('/icons')and the@helixui/icons/diststatic dir). All live-bound to the consumer'svar({prefix}-*)tokens. - Token deep-dives — dedicated
Foundations/Tokens/BordersandFoundations/Tokens/Shadowspages with live swatches, plus aFoundations/Tokens/Playgroundstory for interactive token inspection. - Per-component AAA conformance pages — 8 hand-authored MDXes (button, card, checkbox, dialog, form, select, tabs, text-input) parameterized by
{dsName}so<aurora-card>,<aurora-form>etc. render the consumer's tags. Each ships hero scenarios + auto-injectedA11yStatusCardreading from CEMhelixMeta.aaa.*+ APG pattern card + consumer obligations. - Accessibility narrative — top-level
Accessibility/*namespace with 8 pages: Dashboard, AAA Story Template, Keyboard Contracts, Success Criteria, Consumer Obligations, Focus Management, Contrast Deep-Dive, Forced Colors. Editorial content modeled on HELiX's own Storybook depth. - Scene stories — 3 cross-domain-neutral pattern playgrounds (
Account Setup,Team Dashboard,Settings) demonstrating composition of multiple components in real flows. - React helper components —
TokenSwatchGrid,ContrastMatrix,RatioCard,CodeBlock,CodeTabs, plususeResolvedTokenhook and APCAcontrastutil. Available undersrc/stories/_components/for consumers to compose their own MDXes. InlineAuditPanelopt-in pattern — ships as a no-op stub by default. Consumers wire their ownmarkdownprop to surface per-component AAA-AUDIT content (the audit source lives inside the HELiX monorepo and isn't published; seedocs/FOLLOW-UP-shared-storybook-kit.mdfor the trigger conditions that would make this live).- Token-driven manager chrome — light / dark / high-contrast modes via
@helixui/tokens. FOUC-prevention sync scripts so dark/HC pages don't flash white on reload. - Brand toolbar + persistence via
localStorage["helix:storybook:globals"]. - 8 Storybook addons — a11y, docs, themes, vitest, designs, links, pseudo-states, chromatic-com.
helix.storybook.config.tsat the consumer root — opt out of components / docs pages / brand verticals / AAA / narrative pages without diving into.storybook/.- Auto-catalog on install (v0.6.0) — when scaffolding with
--install-deps(default),pnpm cem:catalogruns immediately afterpnpm installso the ~99-entry hx-* catalog sidebar (atoms / molecules / organisms) is populated on firstpnpm storybookboot. If you used--no-install, the Next-steps banner explicitly listspnpm install && pnpm cem:catalogso the catalog populates before first boot.
Drupal Presets
| Preset | Description | SDC Count |
| ------------ | --------------------------------------------------- | --------- |
| standard | Core Drupal SDCs for general-purpose themes | 7 |
| blog | Standard + blog-specific content components | 12 |
| healthcare | Blog + healthcare-specific components (HIPAA-aware) | 16 |
| intranet | Standard + employee portal components | 11 |
Each preset generates a complete Drupal theme directory with:
- Theme info and libraries YAML files
- Single Directory Components (SDCs) with Twig templates
- HELiX component CDN integration via
helixui.libraries.yml - Drupal behaviors using the
once()pattern composer.jsonandpackage.json
See docs/drupal-presets.md for full details.
Component Bundles
When scaffolding a framework project, you can select which component bundles to include:
| Bundle | Components | Description | | ----------------------- | ---------- | ------------------------------------------------------------ | | All Components | 98 | The full HELiX library | | Core UI | 14 | button, card, badge, text, icon, avatar, divider, chip | | Form Components | 16 | text-input, select, checkbox, radio, switch, textarea, field | | Navigation | 12 | nav, sidebar, tabs, breadcrumb, pagination, menu | | Data Display | 10 | data-table, stat, progress, meter, counter, structured-list | | Feedback & Overlays | 8 | alert, toast, dialog, drawer, banner, skeleton | | Layout | 11 | grid, stack, split-panel, accordion, carousel |
Additional Features
- TypeScript -- strict mode configuration
- ESLint + Prettier -- code quality and formatting
- HELiX Design Tokens -- CSS custom properties for theming
- Dark Mode Support -- automatic dark mode via
prefers-color-scheme - Example Pages -- forms, dashboard, and settings page examples
Roadmap & Migration
- Migrating from v0.6.x → v0.7.0 — see MIGRATING.md. Existing flat scaffolds keep working; the new monorepo shape is opt-in via the second prompt (or
--monorepo). A manual flat → monorepo recipe is included for early adopters who want to convert. create-helix migrate-to-monoreposubcommand — deferred to v0.7.1. Will automate the manual recipe in MIGRATING.md.- Publishable design-system package — deferred. v0.7.0 emits
packages/design-systemas a workspace-internal package only; publishing it standalone to npm needs additional wiring (build pipeline, narrowed peer deps). - npm / yarn workspace support — not on the v0.7.x roadmap. v0.7.0 is pnpm-only (
pnpm-workspace.yaml+workspace:*). @helixui/storybook-kitshared package extraction — deferred. See docs/FOLLOW-UP-shared-storybook-kit.md for trigger conditions and scope sketch. Today's wc-storybook factory ports helix's Storybook depth at scaffold time; a future iteration may consume a shared kit instead.
Requirements
- Node.js >= 22.0.0
Development
git clone https://github.com/bookedsolidtech/create-helix-app.git
cd create-helix-app
npm install
npm run buildScripts
| Script | Description |
| ---------------------- | -------------------------------- |
| npm run build | Compile TypeScript |
| npm run dev | Watch mode |
| npm start | Run the CLI |
| npm run type-check | TypeScript strict check |
| npm run lint | ESLint |
| npm run format | Prettier auto-fix |
| npm run format:check | Prettier check |
| npm test | Run tests |
| npm run verify | lint + format:check + type-check |
| npm run preflight | verify + test |
Contributing
- Fork the repo and create a feature branch
- Make your changes
- Run
npm run verifybefore pushing (enforced by pre-push hook) - Run
npm testto ensure all tests pass - Open a pull request against
dev
Secret Scanning
This repo uses gitleaks to prevent secrets from being committed. Install it locally to enable pre-commit scanning:
# macOS
brew install gitleaks
# Linux
GITLEAKS_VERSION="8.21.2"
curl -sSfL \
"https://github.com/gitleaks/gitleaks/releases/download/v${GITLEAKS_VERSION}/gitleaks_${GITLEAKS_VERSION}_linux_x64.tar.gz" \
| tar -xz -C ~/.local/bin gitleaks
# Windows (via scoop)
scoop install gitleaksIf gitleaks is not installed, the pre-commit hook will warn but will not block your commit. CI always runs the full scan. Configuration is in .gitleaks.toml.
License
MIT -- Copyright 2026 BookedSolid Tech
