a reactive (signals based) hypermedia web framework (wip) stormlightlabs.github.io/volt/
hypermedia frontend signals

Roadmap#

Version State Milestone
Foundations
Reactivity & Bindings
Actions & Effects
Plugins Framework
Backend Integration & HTTP Actions
Proxy-Based Reactivity Enhancements
v0.1.0 Markup Based Reactivity
v0.2.0 Reactive Attributes & Event Modifiers
v0.3.0 Global State
v0.4.0 Animation & Transitions
v0.5.0 Navigation & History API Routing
Refactor
v0.5.1 Error Handling & Diagnostics (partial)
v0.6.0 Error Handling & Diagnostics
v0.6.0 Bundle Size Optimization
v0.6.0 IIFE Build Support
v0.7.0 Testing & Benchmarking
v0.7.0 CSP Compatibility
v0.8.0 DOM Morphing & Streaming
v0.9.0 Scope Inheritance & State Management
v0.10.0 Background Requests & Reactive Polling
v0.11.0 Attribute Prefix Support
v0.12.0 Persistence & Offline (advanced features)
v0.13.0 Inspector & Developer Tools
v1.0.0 Stable Release

Completed#

NOTE: data-x-* is now data-volt-*

Foundations#

Goal: Establish project structure, tooling, and base reactivity primitives. Outcome: A bootable TypeScript project with working reactivity primitives and test coverage. Summary: A TypeScript project scaffold with implemented signal() (subscribe/set/get) and foundational reactivity tests establishes the base system.

Reactivity & Bindings#

Goal: Connect signals to DOM via declarative data-x-* bindings. Outcome: Reactive text/attribute binding with signals → DOM synchronization. Summary: Reactive DOM bindings (data-x-text, data-x-html, data-x-class) with a safe expression evaluator, mutation batching, and DOM testing ensure synchronized updates between signals and UI.

Actions & Effects#

Goal: Add event-driven behavior and derived reactivity. Outcome: Fully functional reactive UI layer with event bindings and computed updates. Summary: An event binding system with $el, $event, and derived signals (computed, effect, async effects) delivers a complete reactive event-driven UI layer.

Plugins Framework#

Goal: Build a modular plugin architecture with dynamic registration. Outcome: Stable plugin API enabling community-driven extensions. Summary: A modular plugin API with lifecycle hooks and built-in extensions (persist, scroll, url) enables dynamic feature registration and community contributions.

Backend Integration & HTTP Actions#

Goal: Provide backend integration with declarative HTTP requests and responses. Outcome: VoltX.js can make backend requests and update the DOM Summary: Declarative HTTP directives (data-volt-get|post|put|patch|delete) with swap strategies, loading indicators, error handling, and form serialization integrate VoltX.js seamlessly with backend APIs.

Markup Based Reactivity#

Goal: Allow Volt apps to declare state, bindings, and behavior entirely in HTML markup Outcome: Authors can ship examples without companion JavaScript bundles Summary: Declarative HTML state, binding, control-flow, and event directives with SSR support and a sandboxed evaluator enable Volt apps to run without separate JavaScript bundles.

Proxy-Based Reactivity Enhancements#

Goal: Use JavaScript Proxies to improve reactivity ergonomics and automatic dependency tracking. Outcome: More intuitive API with automatic dependency tracking and optional deep reactivity for objects/arrays. Summary: Proxy-driven automatic dependency tracking, deep reactive() objects, reactive arrays, lazy signal creation, and debugging utilities improve reactivity ergonomics and performance.

Reactive Attributes & Event Modifiers#

Goal: Extend VoltX.js with expressive attribute patterns and event options for fine-grained control. Outcome: VoltX.js supports rich declarative behaviors and event semantics built entirely on standard DOM APIs. Summary: Introduced expressive attribute patterns and event modifiers for precise DOM and input control, for fine-grained declarative behavior entirely through standard DOM APIs.

Global State#

Goal: Implement store/context pattern Outcome: VoltX.js provides intuitive global state management Summary: The scope injects helpers like $origin, $scope, $pulse, $store, $uid, $probe, $pins, and $arc, giving templates access to global state, microtask scheduling, deterministic IDs, element refs, and custom event dispatch without leaving declarative markup.

Animation & Transitions#

Goal: Add animation primitives for smooth UI transitions with Alpine/Datastar parity. Outcome: VoltX.js enables declarative animations and view transitions alongside reactivity. Summary: The surge directive ships fade/slide/scale/blur presets with duration and delay overrides, per-phase enter/leave control, and easing helpers, while the shift plugin applies reusable keyframe animations—both composable with data-volt-if/data-volt-show as showcased in the animations demo.

Goal: Provide seamless client-side navigation with a first-class History API router. Outcome: VoltX.js delivers accessible, stateful navigation with clean URLs and signal-driven routing. Summary: Added seamless client-side navigation through a History API–powered router, enabling declarative routing with data-volt-navigate and data-volt-url, reactive URL synchronization, smooth transitions, scroll and focus restoration, dynamic route parsing, and full integration with signals and the View Transition API for accessible, stateful navigation and clean URLs.

To-Do#

Focus: Versions v0.5.5 through v0.9.x prioritize core framework capabilities and performance:

  • Bundle size reduction to <15KB gzipped (currently 19KB)
  • CSP compatibility (removing Function constructor dependency)
  • DOM morphing and SSE streaming support
  • Optional scope inheritance for improved ergonomics

These milestones strengthen VoltX.js as a signals-based reactive framework with declarative-first design.

Error Handling & Diagnostics#

Goal: Provide clear, actionable feedback when runtime or directive errors occur. Outcome: VoltX.js surfaces developer-friendly diagnostics for expression evaluation, directive parsing, and network operations, making it easier to debug apps without opaque stack traces. Deliverables: - ✓ v0.5.1: Centralized error boundary system for directives and effects - ✓ v0.5.1: Sandbox error wrapping with contextual hints (directive name, expression, element) - ✓ v0.5.1: $volt.report(error, context) API for plugin and app-level reporting - ✓ v0.6.0: Enhanced console error messages with directive context - ✓ v0.6.0: Differentiated error levels: warn, error, fatal - ✓ v0.6.0: Documentation: "Understanding VoltX Errors" guide - v0.6.0: Add error handling examples to demo - v0.13.0: Visual in-DOM error overlays for development mode - v0.13.0: Runtime health monitor tracking failures - v0.13.0: Configurable global error policy

Persistence & Offline#

Goal: Introduce persistent storage and offline-first behaviors. Outcome: Resilient state persistence and offline replay built into VoltX.js. Deliverables: - ✓ Persistent signals (localStorage, sessionStorage, indexedDb) - ✓ Storage plugin (data-volt-persist) - v0.12.0: Storage modifiers on signals (.local, .session, .ifmissing) - v0.12.0: Sync strategy API (merge, overwrite, patch) for conflict resolution - v0.12.0: Cache invalidation strategies - v0.12.0: Offline queue for deferred stream events and HTTP requests - v0.12.0: Service Worker integration for offline-first apps - v0.12.0: Background sync for deferred requests - v0.12.0: Cross-tab synchronization via BroadcastChannel

Bundle Size Optimization#

Goal: Reduce bundle size to <15KB gzipped while maintaining full feature set. Outcome: Lightweight runtime footprint with comprehensive declarative capabilities. Deliverables: - v0.6.0: Audit and tree-shake unused code paths - v0.6.0: Optimize evaluator and binder implementations - v0.6.0: Minimize plugin footprint, ensure lazy loading - v0.6.0: Refactor expression compiler for smaller output - v0.6.0: Compress constant strings and reduce runtime helpers - v0.6.0: Optimize signal subscription management - v0.6.0: Production mode stripping (remove dev-only error messages) - v0.6.0: Aggressive minification pipeline tuning - v0.6.0: Target: <15KB gzipped sustained

IIFE Build Support#

Goal: Provide an IIFE build target for VoltX.js to support direct <script> tag usage without module systems. Outcome: VoltX.js can be used via CDN without build tools or module bundlers. Deliverables: - v0.6.0: IIFE build output (voltx.iife.js) alongside ESM build - v0.6.0: Global Volt namespace for browser environments - v0.6.0: CDN-friendly distribution (unpkg, jsdelivr) - v0.6.0: Update build pipeline to generate IIFE bundle - v0.6.0: Document usage: <script src="voltx.iife.min.js"></script> - v0.6.0: Ensure plugins work with IIFE build - v0.6.0: Add IIFE examples to documentation

Testing & Benchmarking#

Goal: Establish comprehensive testing infrastructure and performance benchmarking. Outcome: VoltX.js has rigorous end-to-end testing and quantifiable performance metrics against competing frameworks. Deliverables: - v0.7.0: Playwright-based integration test suite for real browser testing - v0.7.0: End-to-end tests for all core directives and plugins - v0.7.0: Cross-browser compatibility tests (Chrome, Firefox, Safari) - v0.7.0: Memory usage and leak detection benchmarks - v0.7.0: Bundle size tracking and regression detection - v0.7.0: Reactivity performance benchmarks (signal updates, computed chains, effect execution) - v0.7.0: DOM update performance benchmarks - v0.7.0: CI integration for automated benchmark runs and regression alerts

CSP Compatibility#

Goal: Make VoltX.js Content Security Policy compliant without 'unsafe-eval'. Outcome: VoltX.js can run in strict CSP environments (no Function constructor). Deliverables: - v0.7.0: Research and design CSP-safe evaluator architecture - v0.7.0: Evaluate trade-offs: AST interpreter vs limited expression subset - v0.7.0: Implement CSP-safe expression evaluator (AST-based or restricted syntax) - v0.7.0: Maintain expression feature parity where possible - v0.7.0: Fallback mode detection for environments requiring CSP - v0.7.0: Full test coverage for CSP mode - v0.7.0: Documentation on CSP limitations and alternatives - v0.7.0: Bundle split: standard build vs CSP build

DOM Morphing & Streaming#

Goal: Add intelligent DOM morphing and Server-Sent Events for real-time updates. Outcome: Built-in morphing and SSE streaming for seamless server-driven UI updates. Deliverables: - v0.8.0: Integrate Idiomorph or implement lightweight morphing algorithm - v0.8.0: data-volt-morph attribute for morphing-based swaps - v0.8.0: Preserve focus, scroll, and input state during morphs - v0.8.0: Server-Sent Events (SSE) integration - v0.8.0: data-volt-stream attribute for SSE endpoints - v0.8.0: Automatic reconnection with exponential backoff - v0.8.0: Signal patching from backend SSE events - v0.8.0: JSON Patch support for partial updates - v0.8.0: data-volt-ignore-morph for selective exclusion - v0.8.0: WebSocket as alternative to SSE - v0.8.0: Unified streaming API across SSE/WebSocket

Scope Inheritance & State Management#

Goal: Improve data scoping with optional inheritance for ergonomic nested components. Outcome: Flexible scoping patterns for complex component hierarchies. Deliverables: - v0.9.0: Optional scope inheritance via data-volt-scope="inherit" - v0.9.0: Child scopes inherit parent signals with override capability - v0.9.0: $parent accessor for explicit parent scope access - v0.9.0: Scoped context providers for dependency injection - v0.9.0: Enhanced $store with namespacing and modules - v0.9.0: Cross-scope signal sharing patterns

Background Requests & Reactive Polling#

Goal: Enable declarative background data fetching and periodic updates. Outcome: VoltX.js elements can fetch or refresh data automatically based on time, visibility, or reactive conditions. Deliverables: - v0.10.0: data-volt-visible for fetching when element enters viewport (IntersectionObserver) - v0.10.0: data-volt-poll attribute for periodic background requests - v0.10.0: Configurable intervals, delays, and signal-based triggers - v0.10.0: Automatic cancellation when elements unmount - v0.10.0: Conditional polling tied to reactive signals - v0.10.0: Background task scheduler with priority management

Attribute Prefix Support#

Goal: Support multiple attribute prefix options for developer preference. Outcome: VoltX.js supports voltx-, vx-, and data-volt- prefixes. Deliverables: - v0.11.0: Add support for voltx-* and vx-* attribute prefixes - v0.11.0: Recommend vx-* as primary in documentation - v0.11.0: Maintain backward compatibility with data-volt-* - v0.11.0: Update demo to use recommended prefix

Inspector & Developer Tools#

Goal: Improve developer experience and runtime introspection. Outcome: First-class developer ergonomics; VoltX.js is enjoyable to debug and extend. Deliverables: - v0.13.0: Visual in-DOM error overlays for development mode - v0.13.0: Runtime health monitor tracking failures - v0.13.0: Configurable global error policy (silent, overlay, throw) - v0.13.0: Developer overlay for inspecting signals, subscriptions, and effects - v0.13.0: Time-travel debugging for signal history - v0.13.0: Signal dependency graph visualization - v0.13.0: Performance profiling tools - v0.13.0: Browser console integration (window.$volt.inspect()) - v0.13.0: Dev logging toggle (Volt.debug = true) - v0.13.0: Request/response debugging (HTTP actions, SSE streams) - v0.13.0: Browser DevTools extension with full integration

Stable Release#

Goal: Prepare & ship the stable release Outcome: VoltX.js 1.0 is stable, documented, performant, and ready for production. Deliverables: - ✓ Documentation site (VitePress) - Full API reference with examples - Create generator in @voltx/cli package - Finalized plugin registry and CLI (volt plugins list/init) - Versioned documentation (https://stormlightlabs.github.io/volt) - Announcement post and release notes - Community contribution guide & governance doc

Parking Lot#

Evaluator & Binder Hardening#

All expression evaluation now flows through a cached new Function compiler guarded by a hardened scope proxy, with the binder slimmed into a directive registry so plugins self-register while tests verify the sandboxed error surfaces.