Overview
One plugin, one build - a server bundle, and a client only if you have a page to ship.
Use the bundler you already have. oxidejs turns it into a server, and a client if you have a page. Server actions ride on tacho.
Choosing a stack
Choose oxidejs when you want a deployable tree from Vite or Rsbuild. Stay on a full framework if you need routing, server-rendered pages, or a component model. Use tacho alone if you only need RPC.
- Choose
oxidejsif you want one plugin that builds the server and the client. - Choose tacho if you want typed RPC without a bundler plugin.
- Stay on a framework if you need more than a server entry and actions.
What you get
- One output tree - a server bundle, plus a client when you have a page.
- Server actions - write a function on the server and call it from the browser. Types stay in sync. The function never ships to the client. Call
useRequest()for the inboundRequest,useCtx()for tachoctx,useEnv()/useFetchCtx()on celld. - Two presets - fetch serves static files from Node. celld writes a config for celld, a self-hosted alternative to Cloudflare Workers.
- Vite and Rsbuild - same plugin, same output.
You can call actions from the browser, or skip the client and ship a server-only worker.
What it does not do
- No local Worker emulation
- No automatic celld deploy
- No Node-builtin polyfills - a stray Node import fails the build