Adds a CLI tool to generate realistic analytics data for local development and testing.
Creates two demo websites with varying traffic patterns and realistic user behavior distributions.
- Change organization from Niteshift to Hulu (hulu.com domain)
- Update pages to streaming service structure (browse, watch, plans, etc.)
- Add realistic Hulu shows: The Bear, Shogun, Abbott Elementary, etc.
- Update custom events for streaming: play_video, complete_episode, etc.
- Add realistic referrers: review sites, entertainment news, deal sites
- Update revenue tiers to Hulu subscription plans ($7.99-$76.99)
- Convert script to TypeScript and use tsx for execution
- Update funnels, segments, and cohorts for streaming analytics
The static class property singleton pattern doesn't survive HMR
when module boundaries get crossed. New dials would register with
a fresh registry instance while DialsOverlay stayed subscribed to
the old one.
Fix: Store the singleton on `window.__NITESHIFT_DIALS_REGISTRY__`
so it persists across module re-evaluations during hot reload.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Introduces a complete design dials system that allows designers and PMs
to adjust UI parameters at runtime without code changes.
**Dials SDK (`packages/dials/`):**
- useDynamicColor: Color values with design system integration
- useDynamicSpacing: Spacing/padding/margin controls
- useDynamicVariant: Discrete choice selections
- useDynamicBoolean: Toggle/feature flag controls
- useDynamicNumber: Numeric values with min/max/step
- DialsOverlay: Compact Leva-inspired UI (Ctrl+D to toggle)
- DialsProvider: React context for dial state management
- Design manifest integration for design system tokens
**App Integration:**
- Added DialsProvider to app Providers
- Example dials on WebsitePage (metrics bar, panels, navigation)
- MetricCard component with adjustable typography dials
- TypeScript manifest at src/config/niteshift-manifest.ts
**Documentation:**
- Comprehensive CLAUDE.md section on dials usage
- Best practices for preserving original appearance
- Examples for all dial types
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
The 60-second polling loop that waits for the dev server to respond
adds unnecessary setup time. The warmup step that follows already has
a timeout, so we can proceed directly to it.