What's New
Unified API
One entry point for everything:
use PhoenixVapor # sigil (~VUE)
use PhoenixVapor, file: "Contacts.vue" # auto-detects mode
use PhoenixVapor, file: "Counter.vue", runtime: :reactive # server-side QuickBEAM
use PhoenixVapor, file: "Dialog.vue", runtime: :full, bundle: "..." # full Vue runtimeThe compiler reads the .vue file and decides: no ref() → zero client JS, has ref() → hybrid with Vue 3 on the client.
Hybrid Mode
Split reactivity — server owns data, client owns UI state. Search, sort, filter are instant (zero server round-trip). Delete goes through the server.
- Auto-classification:
defineProps→ server,ref()→ client,"use server"→ server action - Server renders full HTML for SEO/first paint
- Client hydrates with standard Vue 3 (
createApp) - Props sync via LiveView diffs through a bridge hook
- Reka UI headless components work in hybrid mode (Dialog, Tooltip verified)
<script lang="elixir">
Embed Elixir code directly in .vue files for single-file convenience:
<script lang="elixir">
def mount(_params, _session, socket) do
{:ok, assign(socket, contacts: Repo.all(Contact))}
end
</script>
<script setup>
const props = defineProps(["contacts"])
const search = ref("")
</script>
<template>
<input v-model="search" />
</template>Updated Deps
- OXC 0.11.0 (AST types now snake_case atoms)
- Vize 0.10.0 (Vue Vapor compilation,
strip_types,custom_renderer) - QuickBEAM 0.10.8 (JS line coverage, 8MB default stack)
- Volt 0.10.1 (dev server, HMR, Tailwind v4, code splitting)
- Phoenix LiveView 1.1.28
Zero Regex
All JS/HTML manipulation uses OXC AST operations (OXC.parse, OXC.collect, OXC.patch_string) or simple string ops. Zero regex in lib/.
257 Tests
Comprehensive coverage: classifier (31), server codegen (11), client codegen (10), hybrid integration (57), single-file (11), unified API (17), plus all existing tests.