◐ Shell
clean mode source ↗

Fresh - The simple, approachable, productive web framework.

Introducing Fresh:

No config files, no build step, no node_modules. Just one file and you have a server with routing, JSX, and islands.

Server-rendered by default

Every route renders on the server as a Preact component. Zero JavaScript hits the browser unless you opt in with an island. Pages are fast because they start as plain HTML.

Freshly server-rendered 6/16/2026, 1:55:33 PM

Interactive where it matters

Most of your page is static HTML. Islands are the small, interactive parts that get hydrated with JavaScript. You choose exactly what runs on the client.

Built on Preact and Signals, so islands are tiny and reactive out of the box.

Learn more about islands

Interactive island

The server supplied the initial value of 3.

Forms that just work

Handle submissions server-side with standard Request and FormData. No client-side state management, no serialization headaches. Progressive enhancement comes free.

Forms in Fresh

Stream HTML straight from the server

Swap chunks of HTML from the server straight into the page. No full reload, no client-side routing library. Click a link or submit a form and Fresh streams just the part that changed. Perfect for interactive elements and dynamic apps.

Learn more about Partials

Click a recipe to stream HTML into this spot

And so much more

View Transitions

Native-feeling page transitions with a single config flag. Customize per-element with plain CSS.

const app = new App({
  viewTransition: true,
});

Route Handlers

Define GET, POST, DELETE, or any HTTP method as a named handler on your route, with full type safety.

export const handlers = define.handlers({
  GET(ctx) { /* ... */ },
  POST(ctx) { /* ... */ },
  DELETE(ctx) { /* ... */ },
});

WebSockets

Add real-time endpoints with app.ws(). Define open, message, and close handlers in a single object.

app.ws("/chat", {
  open(socket) { /* ... */ },
  message(socket, event) {
    socket.send(event.data);
  },
});

<Head> Component

Set titles, meta tags, stylesheets, and scripts from any page or island. No hoisting hacks needed.

<Head>
  <title>My Page</title>
  <meta name="description"
    content="..." />
</Head>

OpenTelemetry

Auto-injects a traceparent meta tag into every page, connecting browser traces to server spans.

const app = new App({
  otel: true,
});

Content Security Policy

Automatic nonce injection for inline scripts and styles. Strong security defaults with zero boilerplate.

app.use(csp({
  directives: {
    scriptSrc: ["'nonce'"],
  },
}));

(…and even more)

Fresh is the secret sauce behind production-grade, enterprise-ready software like Deco.cx, Brazil's top eCommerce platform

Deco.cx screenshot
The team also used Fresh, a next-gen Deno-native full stack web framework that sends zero JavaScript to the client, for its modern developer experience and snappy performance…

This stack unlocked 5x faster page load speeds and a 30% jump in conversion rates for their clients.

Read the case study

Deno is drinking Fresh lemon squash

Built on Deno

Deno is the next evolution of server-side JavaScript, with stronger security, a robust built-in toolchain, and zero-config TypeScript support. (It's faster than Node, too.)

Learn more about Deno

Illustration of a lemon sliced cleanly in half, suspended in midair as though frozen in time the instant after the cut, the juice flung from the edges

Jump right in and build your website with Fresh. Learn everything you need to know in seconds.

Get started