Skip to main content

Storybook 8 vs Ladle vs Histoire: Component Workshop Tools 2026

·PkgPulse Team

Storybook 8 cold starts in 8 seconds. Ladle cold starts in 1.2 seconds — 6.7x faster. Histoire lands in the middle at about 2 seconds. But Storybook has an ecosystem that Ladle and Histoire can't match: accessibility testing, visual regression, Chromatic, Figma integration, and 200+ addons. The right choice depends on whether you need a full design system platform or just a fast component preview tool.

TL;DR

Storybook 8 for design systems, large teams, and projects that need accessibility testing, visual regression, and documentation — the undisputed ecosystem leader with 2.5M weekly downloads. Ladle for React-only projects that want a fast, Vite-native Storybook alternative with minimal overhead. Histoire for Vue/Svelte projects that want better performance than Storybook with more features than Ladle. For most teams building in 2026, Storybook's ecosystem advantage wins unless startup speed is a critical pain point.

Key Takeaways

  • Storybook 8: 2.5M weekly downloads, 84K GitHub stars, Vite builder, 200+ addons, Vitest integration
  • Ladle: 100K weekly downloads, 2.5K GitHub stars, React-only, Vite-native, 6.7x faster cold start
  • Histoire: 30K weekly downloads, 3.5K GitHub stars, Vue/Svelte focus, ~2x faster than Storybook
  • Storybook 8 Vitest: Stories become Vitest test cases automatically
  • Storybook 8: Play functions, a11y addon, Chromatic visual testing, Figma design tokens
  • Ladle: Story format compatible with Storybook (same CSF), but no addon ecosystem
  • Histoire: Built for Vue 3 first, Svelte support, Nuxt/SvelteKit integration

Cold Start Comparison

Component workshop startup time (medium project, 50 stories):

Storybook 8 (Webpack): ~15-20s
Storybook 8 (Vite):    ~8s
Histoire:              ~2s
Ladle:                 ~1.2s

Hot reload (single story change):
Storybook 8 (Vite):   ~2s
Histoire:              ~500ms
Ladle:                 <500ms

For a developer who opens the workshop dozens of times per day, this difference compounds. Ladle's sub-second hot reload is genuinely better for rapid iteration.

Storybook 8

Package: storybook Weekly downloads: 2.5M GitHub stars: 84K Creator: Storybook team (Chromatic-backed) Frameworks: React, Vue, Angular, Svelte, Ember, Web Components, HTML

Storybook 8 is the latest major version with significant performance improvements (Vite builder by default), a new Vitest integration, and improved testing primitives.

Installation

npx storybook@latest init
# Detects your framework automatically

Story Format (CSF3)

// Button.stories.tsx
import type { Meta, StoryObj } from '@storybook/react';
import { Button } from './Button';

const meta: Meta<typeof Button> = {
  component: Button,
  title: 'UI/Button',
  parameters: {
    layout: 'centered',
  },
  argTypes: {
    variant: {
      control: 'select',
      options: ['primary', 'secondary', 'destructive'],
      description: 'Visual style of the button',
    },
    disabled: { control: 'boolean' },
  },
};

export default meta;
type Story = StoryObj<typeof Button>;

export const Primary: Story = {
  args: {
    variant: 'primary',
    children: 'Click me',
  },
};

export const Disabled: Story = {
  args: {
    variant: 'primary',
    disabled: true,
    children: 'Disabled',
  },
};

Play Functions (Interaction Tests)

import { userEvent, within, expect } from '@storybook/test';

export const FormSubmit: Story = {
  args: { /* ... */ },
  play: async ({ canvasElement }) => {
    const canvas = within(canvasElement);

    // Fill in the form
    await userEvent.type(
      canvas.getByLabelText('Email'),
      'alice@example.com'
    );

    // Submit
    await userEvent.click(
      canvas.getByRole('button', { name: 'Submit' })
    );

    // Assert on result
    await expect(
      canvas.getByText('Thank you!')
    ).toBeInTheDocument();
  },
};

Play functions run in the Storybook UI (you see the interaction animate) AND in the automated test runner.

Storybook 8 Vitest Integration

npx storybook@latest add @storybook/experimental-addon-test
// vitest.config.ts
import { storybookTest } from '@storybook/experimental-addon-test/vitest-plugin';

export default defineConfig({
  plugins: [
    storybookTest({ configDir: '.storybook' }),
  ],
  test: {
    browser: {
      enabled: true,
      provider: 'playwright',
      name: 'chromium',
    },
  },
});
# Now Vitest runs all stories with play functions as tests:
vitest
# All stories → component tests
# Stories with play() → interaction tests
# Stories with a11y addon → accessibility tests

Accessibility Testing

npx storybook@latest add @storybook/addon-a11y

Every story automatically gets accessibility checking — WCAG violations show up in the Accessibility tab in the Storybook UI:

export const LowContrastButton: Story = {
  args: {
    style: { color: '#777', backgroundColor: '#888' }, // Low contrast
  },
  parameters: {
    a11y: {
      // Temporarily disable specific rules for known issues:
      config: {
        rules: [{ id: 'color-contrast', enabled: false }],
      },
    },
  },
};

Visual Regression with Chromatic

npm install -D chromatic
# Run visual regression tests against all stories
npx chromatic --project-token=<token>
# Compares to last accepted build — catches visual regressions

Storybook Strengths

  • Largest ecosystem: 200+ addons for accessibility, documentation, design, data
  • Multi-framework: React, Vue, Angular, Svelte — one tool for the whole team
  • Chromatic integration for automated visual regression
  • Figma and design token integrations
  • Play functions for interaction tests in stories
  • Vitest integration for automated testing of all stories

Storybook Limitations

  • Slow cold start (8s with Vite, more with Webpack)
  • Heavy initial configuration for non-React frameworks
  • Large dependency tree
  • Complex addon API can be difficult to extend

Ladle

Package: @ladle/react Weekly downloads: 100K GitHub stars: 2.5K Creator: Vojta Jína Frameworks: React only

Ladle is a minimal, Vite-native Storybook alternative for React. It uses the same CSF story format as Storybook, so migration is straightforward.

Installation

npm install -D @ladle/react
// package.json
{
  "scripts": {
    "ladle": "ladle serve",
    "ladle:build": "ladle build"
  }
}

Story Format (Compatible with Storybook CSF)

// Button.stories.tsx — same format as Storybook
import type { Story } from '@ladle/react';
import { Button } from './Button';

export const Primary: Story = () => (
  <Button variant="primary">Click me</Button>
);

export const Secondary: Story = () => (
  <Button variant="secondary">Secondary</Button>
);

// With args:
export const WithArgs: Story<{ label: string }> = ({ label }) => (
  <Button>{label}</Button>
);
WithArgs.args = { label: 'Custom Label' };

Performance

# First startup:
ladle serve  # ~1.2s

# Hot reload after file change:
# <500ms — Vite HMR

Ladle uses Vite directly — no Storybook abstraction layer. This means it benefits from Vite's full HMR speed.

Ladle Limitations

  • React only — no Vue, Angular, Svelte
  • No addon ecosystem (no a11y checker, no Chromatic, no documentation addons)
  • No play functions for interaction testing
  • Less documentation and fewer community resources
  • Not suitable for large design systems that need documentation

When Ladle Wins

  • Small React projects where fast iteration matters more than documentation
  • Individual developers who find Storybook's startup too slow
  • Projects that just need component preview, not a full documentation platform

Histoire

Package: histoire Weekly downloads: 30K GitHub stars: 3.5K Creator: Akryum (Guillaume Chau, Vue core team) Frameworks: Vue 3, Svelte (React experimental)

Histoire is the best Storybook alternative for Vue 3 and Svelte. It's built by a Vue core team member and uses a Vue-native API.

Installation

npm install -D histoire @histoire/plugin-vue
// histoire.config.ts
import { defineConfig } from 'histoire';
import { HstVue } from '@histoire/plugin-vue';

export default defineConfig({
  plugins: [HstVue()],
});

Story Format (Histoire-specific)

<!-- Button.story.vue -->
<script setup lang="ts">
import { reactive } from 'vue';
import Button from './Button.vue';

const state = reactive({
  variant: 'primary',
  label: 'Click me',
  disabled: false,
});
</script>

<template>
  <Story title="Button">
    <Variant title="Default">
      <Button :variant="state.variant" :disabled="state.disabled">
        {{ state.label }}
      </Button>

      <template #controls>
        <HstSelect v-model="state.variant" :options="['primary', 'secondary', 'destructive']" title="Variant" />
        <HstText v-model="state.label" title="Label" />
        <HstCheckbox v-model="state.disabled" title="Disabled" />
      </template>
    </Variant>
  </Story>
</template>

The HstSelect, HstText, HstCheckbox controls are histoire's equivalent of Storybook's argTypes.

Histoire Strengths

  • Vue-native API — feels natural for Vue developers
  • Better performance than Storybook (2x faster startup)
  • SvelteKit integration for Svelte projects
  • Vite-based: fast HMR
  • Better for Vue design systems than Storybook

Histoire Limitations

  • React support is experimental (Vue/Svelte are primary)
  • Much smaller ecosystem than Storybook
  • Less community resources and examples
  • No visual regression or accessibility integrations out of the box

Feature Comparison

FeatureStorybook 8LadleHistoire
Cold start~8s~1.2s~2s
Hot reload~2s<500ms~500ms
React supportYesYes (only)Experimental
Vue supportYesNoYes (primary)
Svelte supportYesNoYes
Accessibility addonYesNoNo
Visual regressionChromaticNoVia plugins
Play functionsYesNoNo
Vitest integrationYesNoNo
Addon ecosystem200+NoneLimited
Weekly downloads2.5M100K30K

Decision Guide

Choose Storybook 8 if:

  • You're building a design system that needs documentation, visual regression, and accessibility testing
  • Your team spans React, Vue, and Angular (multi-framework)
  • Chromatic integration for visual regression is required
  • Play functions for testing within stories are valuable
  • You want Vitest integration for automated story testing

Choose Ladle if:

  • Your project is React-only
  • Startup speed is a major pain point with Storybook
  • You only need component preview (no documentation, no a11y, no visual regression)
  • Prototyping or personal projects where Storybook's overhead isn't justified

Choose Histoire if:

  • Your project is Vue 3 or Svelte
  • You want better performance than Storybook with a Vue-native API
  • You don't need Storybook's extensive addon ecosystem

In 2026, for most teams, Storybook 8's ecosystem advantage is decisive — especially with the Vitest integration making stories automatically testable. Ladle and Histoire serve specific niches where Storybook's overhead outweighs its benefits.

Compare component workshop downloads on PkgPulse.

Comments

Stay Updated

Get the latest package insights, npm trends, and tooling tips delivered to your inbox.