Deploy Storybook with Bantam CLI
Deploy your component library and design system documentation
Quick start:
# Build your Storybook app
npm run build-storybook
# Deploy it
bantam deploy ./storybook-static
Quick Start
Build Storybook
Creates a static version of your component library
npm run build-storybook
Preview locally (optional)
Test your built Storybook before deploying
npx http-server ./storybook-static
Deploy with Bantam
Your component library is now live!
bantam deploy ./storybook-static
Framework Details
Build Configuration
Customize your Storybook build output:
package.json - Custom build directory:
{
"scripts": {
"build-storybook": "storybook build -o build",
// With additional flags
"build-storybook:ci": "storybook build --quiet --disable-telemetry"
}
}
.storybook/main.js - Build optimization:
module.exports = {
stories: ['../src/**/*.stories.@(js|jsx|ts|tsx|mdx)'],
staticDirs: ['../public'],
framework: {
name: '@storybook/react-vite',
options: {},
},
features: {
storyStoreV7: true, // Faster builds
},
// Optimize production builds
build: {
test: {
disableBlocks: true, // Skip docs blocks in tests
},
},
}
Custom Domain & Branding
Configure Storybook for your brand:
.storybook/manager.js - Custom theme:
import { addons } from '@storybook/addons';
import { create } from '@storybook/theming';
const theme = create({
base: 'light',
brandTitle: 'My Component Library',
brandUrl: 'https://components.mysite.com',
brandImage: '/logo.png',
brandTarget: '_self',
// Colors
colorPrimary: '#1ea7fd',
colorSecondary: '#585c6d',
// UI
appBg: '#f6f9fc',
appContentBg: '#ffffff',
appBorderColor: '#e6e6e6',
appBorderRadius: 4,
});
addons.setConfig({
theme,
});
bantam deploy ./storybook-static -d components.mysite.com
Composition & Monorepos
Deploy multiple Storybooks from a monorepo:
Monorepo structure:
packages/
├── ui-library/
│ ├── .storybook/
│ └── package.json
├── design-tokens/
│ ├── .storybook/
│ └── package.json
└── icons/
├── .storybook/
└── package.json
Deploy each package:
# Build all Storybooks
npm run build-storybook --workspaces
# Deploy each one
bantam deploy packages/ui-library/storybook-static -s ui-components
bantam deploy packages/design-tokens/storybook-static -s design-tokens
bantam deploy packages/icons/storybook-static -s icons
# Or compose into one
# See Storybook composition docs
Static Assets & Fonts
Handle static assets in Storybook:
.storybook/main.js - Static directories:
module.exports = {
staticDirs: [
'../public',
'../src/assets',
{ from: '../fonts', to: '/fonts' }
],
}
.storybook/preview-head.html - Custom fonts:
<!-- Load custom fonts -->
<link rel="preconnect" href="https://fonts.googleapis.com">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap" rel="stylesheet">
<!-- Or local fonts -->
<style>
@font-face {
font-family: 'CustomFont';
src: url('/fonts/custom.woff2') format('woff2');
}
</style>
Advanced Usage
Custom Domain
Deploy directly to your own domain
bantam deploy ./dist --domain myapp.com
Permanent Deployment
Keep your site online forever (requires login)
bantam deploy ./dist --permanent
Custom Expiry
Set how long your deployment stays online
bantam deploy ./dist --expiry-days 7
Custom Subdomain
Choose your own subdomain on bantam.site
bantam deploy ./dist --subdomain my-project
CI/CD Integration
Add Bantam to your continuous deployment pipeline:
# GitHub Actions example
- name: Deploy to Bantam
run: |
npm install -g @bantamhq/cli
bantam login --token ${{ secrets.BANTAM_TOKEN }}
bantam deploy ./dist --domain myapp.com --permanent
Common Issues & Solutions
Quick fixes for deployment challenges
01.Build fails with memory errors
Large component libraries may need more memory:
# Increase Node memory
NODE_OPTIONS="--max-old-space-size=4096" npm run build-storybook
# In package.json
{
"scripts": {
"build-storybook": "NODE_OPTIONS='--max-old-space-size=4096' storybook build"
}
}
02.Assets not loading after deployment
Check your asset paths and static directories:
// .storybook/main.js
module.exports = {
staticDirs: ['../public'],
}
// For subdirectory deployment
// .storybook/manager.js
import { addons } from '@storybook/addons';
addons.setConfig({
// Set if deploying to subdirectory
managerUrl: '/storybook/',
});
03.How to password protect Storybook?
Bantam doesn't provide auth, but you can add basic protection:
// Simple obfuscation (not secure!)
// .storybook/manager-head.html
<script>
const pwd = prompt('Enter password');
if (pwd !== 'mysecret') {
document.body.innerHTML = 'Access Denied';
}
</script>
// Better: Use Bantam Pro features or deploy behind auth proxy
04.Storybook loads slowly
Optimize your Storybook build for performance:
// .storybook/main.js
module.exports = {
features: {
storyStoreV7: true, // Lazy load stories
buildStoriesJson: true, // Generate index
},
// Exclude stories in production
stories: process.env.NODE_ENV === 'production'
? ['../src/**/*.stories.@(js|jsx|ts|tsx)']
: ['../src/**/*.stories.@(js|jsx|ts|tsx|mdx)'],
// Disable addons in production
addons: process.env.NODE_ENV === 'production'
? ['@storybook/addon-essentials']
: [/* all addons */],
}
05.How to deploy Storybook with docs?
Include MDX documentation in your build:
// .storybook/main.js
module.exports = {
stories: [
'../src/**/*.stories.@(js|jsx|ts|tsx|mdx)',
'../docs/**/*.mdx', // Include pure documentation
],
addons: [
'@storybook/addon-essentials',
'@storybook/addon-docs',
],
}
// Create docs-only pages
// docs/Introduction.mdx
import { Meta } from '@storybook/blocks';
<Meta title="Documentation/Introduction" />
# Welcome to Our Component Library