Skip to main content
Using Deno in production at your company? Earn free Deno merch.
Give us feedback


The next-gen web framework.
Extremely Popular
interface Plugin
import { type Plugin } from "";

Type Parameters

State = Record<string, unknown>


name: string

The name of the plugin. Must be snake-case.

entrypoints: Record<string, string>

A map of a snake-case names to a import specifiers. The entrypoints declared here can later be used in the "scripts" option of PluginRenderResult to load the entrypoint's code on the client.

routes: PluginRoute[]
middlewares: PluginMiddleware<State>[]
islands: PluginIslands


The render hook is called on the server every time some JSX needs to be turned into HTML. The render hook needs to call the ctx.render function exactly once.

The hook can return a PluginRenderResult object that can do things like inject CSS into the page, or load additional JS files on the client.

renderAsync(ctx: PluginAsyncRenderContext): Promise<PluginRenderResult>

The asynchronous render hook is called on the server every time some JSX needs to be turned into HTML, wrapped around all synchronous render hooks. The render hook needs to call the ctx.renderAsync function exactly once, and await the result.

This is useful for when plugins are generating styles and scripts with asynchronous dependencies. Unlike the synchronous render hook, async render hooks for multiple pages can be running at the same time. This means that unlike the synchronous render hook, you can not use global variables to propagate state between the render hook and the renderer.

buildStart(config: ResolvedFreshConfig): Promise<void> | void

Called before running the Fresh build task

buildEnd(): Promise<void> | void

Called after completing the Fresh build task

configResolved(config: ResolvedFreshConfig): Promise<void> | void

Called after configuration has been loaded