Introducing Universal Deploy
⚠️Early draft: This blog post is an early draft, and Universal Deploy is going to be officially announced next week. That said, you can already use
+servertoday (starting from0.4.257).
Today, we are thrilled to introduce Universal Deploy — a new infrastructure to deploy Vite apps anywhere with zero configuration.
We're also thrilled to announce a collaboration with Tencent EdgeOne.
Alongside Universal Deploy, we're releasing built-in +server.js support in Vike, powered by Universal Deploy.
This means
vike-photonis now deprecated: everything it did is now part of Vike core or Universal Deploy, with a simpler DX and no extra packages to install.If you use
vike-photon(or stillvike-server), we recommend migrating to+server.js.
Universal Deploy supersedes Photon. It's the next — and we believe final — step in a journey that started with vike-server and continued with Photon. This is a big deal not just for Vike, but for the whole Vite ecosystem.
What changes for users
For Vike users, the story is now refreshingly simple:
-
Define your server with
+server.js. Use any server framework you like — Hono, Express.js, Fastify, Elysia, H3. For example with Hono:// +server.js import { Hono } from 'hono' import vike from '@vikejs/hono' const app = new Hono() vike(app) // Attaches Vike export default { fetch: app.fetch }// +server.ts import { Hono } from 'hono' import vike from '@vikejs/hono' import type { Server } from 'vike/types' const app = new Hono() vike(app) // Attaches Vike export default { fetch: app.fetch } satisfies Server -
Pick a deployment target by installing its official Vite plugin:
@edgeone/vite,@netlify/vite-plugin,@cloudflare/vite-plugin,vite-plugin-vercel, or nothing at all to self-host with Node.js / Bun / Deno.
That's it. No vike-photon, no vike-server, no vike-cloudflare, no glue packages. Vike and your deployment provider talk to each other directly through Universal Deploy.
Manual integration via
renderPage()is still supported and remains unchanged. We care about both zero-config integrations and manual integrations — ensuring both workflows are fully supported and maintained.
What is Universal Deploy?
Universal Deploy is not a user-facing tool. It's a low-level toolkit that frameworks and deployment providers use behind the scenes to talk to each other.
In concrete terms, Universal Deploy provides:
- A shared store (
@universal-deploy/store) where frameworks register their server entries and routing metadata. - A common routing format that every participant understands.
- Minimal Vite plugins that deployment Vite plugins can use to automatically integrate with frameworks.
The idea: instead of every framework writing custom integration code for every deployment provider (and vice versa), everyone agrees on a small, low-level convention. Frameworks register what they want to deploy; providers read it and deploy it. Say goodbye to N×M adapters 👋
For framework authors, registering an entry looks like this:
import { addEntry } from '@universal-deploy/store'
addEntry({
id: './src/server/api.ts',
route: '/api/*',
method: 'GET',
})While deployment providers read from the store.
Why we built it (a short history)
Universal Deploy is the third — and we hope last — iteration of the same idea.
vike-server (March 2025) was a Vike extension that integrated Vite with any JavaScript server (Express.js, Hono, Fastify, …) and any deployment target. While building it, we realized that most of the code wasn't actually Vike-specific.
Photon (October 2025) was our answer to that observation: we extracted everything we learned from vike-server, vike-cloudflare, and vite-plugin-vercel into a fully framework-agnostic project. Photon brought first-class Cloudflare support (with the dev server running inside workerd, the same runtime as production), HMR for server code, and zero-config deployment.
Universal Deploy (April 2026) takes that one step further. Photon was framework-agnostic, but it was still its own opinionated stack. The conversations sparked by Netlify's RFC on Vite — and the related ecosystem RFC about aligning on Vite's intended scope to allow framework-agnostic provider plugins — made it clear that what the ecosystem really needed was something even smaller and even more neutral: a tiny convention layer that everyone — frameworks, deployment providers, and Vite itself — could adopt without buying into a particular implementation.
That's what Universal Deploy is. It's an unopinionated and flexible infrastructure to solve the deployment fragmentation problem.
Aligned with Netlify's RFC
Universal Deploy is a direct response to Netlify's RFC. Specifically, it tackles two of the issues raised in the RFC:
- Server entry point location — how does a deployment provider find the server entries that a framework wants to deploy?
- Routing metadata — how does it know which routes go where, and which methods they handle?
The @universal-deploy/* packages are a concrete answer to those questions, and we're working to bring these conventions to the broader Vite ecosystem (not just to Universal Deploy).
We're also continuing to collaborate with other teams. The more participants converge on the same low-level conventions, the better it gets for everyone.
Collaborating with Tencent EdgeOne 🤝
When we showed Universal Deploy to the team behind Tencent EdgeOne, they liked it right away. We're excited to announce that today @edgeone/vite releases first-class support for Universal Deploy. Any UD-aware Vite framework, including Vike, can now deploy to EdgeOne Pages with zero glue code.
What made this collaboration so easy isn't just the technical fit — it's a shared value. One of Vike's core values is freedom: minimal lock-in, the ability to compose any stack, any server, and any deployment target, while keeping that freedom over time as the ecosystem evolves. Tencent EdgeOne shares that same value. Their team genuinely cares about giving developers an open, portable foundation — not a walled garden.
We're talking with Tencent EdgeOne to further explore how we can collaborate, and we're looking forward to what's next 🚀
Try it out
You can try it today by going to vike.dev/new and selecting a server (e.g. Hono) along with a deployment provider (e.g. EdgeOne, Netlify, Cloudflare, or Vercel).
If you're migrating from vike-photon or vike-server, head over to the migration guide.
If you're a framework or deployment provider author curious about adopting Universal Deploy, reach out.
Huge thanks to everyone who's contributed to vike-server, Photon, the Netlify RFC discussions, the Tencent EdgeOne team, and the broader Vite ecosystem. Universal Deploy wouldn't exist without that collective effort.
Let's deploy Vite apps anywhere 🚀

