---
title: Overview
sidebar:
  icon: layout-dashboard
description: 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](/tacho/overview).

## Choosing a stack

Choose `oxidejs` when you want a deployable tree from [Vite](https://vite.dev/) or [Rsbuild](https://rsbuild.rs/). Stay on a full framework if you need routing, server-rendered pages, or a component model. Use [tacho](/tacho/overview) alone if you only need RPC.

- Choose `oxidejs` if 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()`](/oxide/server-actions#userequest) for the inbound `Request`, [`useCtx()`](/oxide/server-actions#usectx) for tacho `ctx`, [`useEnv()` / `useFetchCtx()`](/oxide/server-actions#useenv-and-usefetchctx) on celld.
- **Two [presets](/oxide/configuration#preset)** - fetch serves static files from Node. celld writes a config for celld, a self-hosted alternative to Cloudflare Workers.
- **[Vite](https://vite.dev/) and [Rsbuild](https://rsbuild.rs/)** - 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

## Next steps

- [Quickstart](/oxide/quickstart)
- [Server entry](/oxide/server-entry)
- [Server actions](/oxide/server-actions)
- [Configuration](/oxide/configuration)
