Fresh logo

Server configuration

In this page we discuss how the server can be configured during startup.

The signature of the primary method looks like this:

export async function start(routes: Manifest, opts: StartOptions = {});


Manifest comes from fresh.gen.ts, so nothing to do there. opts is where things get interesting. StartOptions looks like this:

export type StartOptions = ServeInit & FreshOptions;

The good stuff is really in…

export interface FreshOptions {
  render?: RenderFunction;
  plugins?: Plugin[];
  staticDir?: string;
  router?: RouterOptions;

And for brevity here are the remaining two types:

export type RenderFunction = (
  ctx: RenderContext,
  render: InnerRenderFunction,
) => void | Promise<void>;

export interface RouterOptions {
   *  @default {false}
  trailingSlash?: boolean;


See the docs on this topic for more detail. But for completion, you can do something like this to load plugins:

await start(manifest, { plugins: [twindPlugin(twindConfig)] });


This allows you to specify the location where your site’s static assets are stored. Here’s an example:

await start(manifest, { staticDir: "./custom_static" });


This is by far the most complicated option currently available. It allows you to configure how your components get rendered.

A detailed, concrete example of this is changing the language of the <html> tag. See the documentation here.



By default Fresh uses URLs like If you’d like, you can configure this to by using the trailingSlash setting.

await start(manifest, { router: { trailingSlash: true } });