> ## Documentation Index
> Fetch the complete documentation index at: https://docs.pult.sh/llms.txt
> Use this file to discover all available pages before exploring further.

# Pages

> Dashboards, tools and the home page, made of blocks and placed in the sidebar.

A page is a list of [blocks](/build/blocks). It can show your app's numbers next to Pult's live counts, put buttons and forms for any action in one place, and carry the flags your team flips most. A growth dashboard, an operations panel with a "broadcast message" form, a page for the person on call: what a page is for is up to you. Pages show up in the sidebar and in ⌘K.

```ts theme={null}
import { b, page } from "pult"
import { z } from "zod"

export const growth = page("growth", {
  icon: "chart",
  params: z.object({ days: z.enum(["7", "30", "90"]).default("30") }),
  render: async ({ params }) => {
    const span = Number(params.days)
    return [
      b.stats({
        Signups: await stats.signups(span),
        MRR: { value: await stats.mrr(), note: "before refunds" },
      }),
      b.chart(await stats.signupsByDay(span), { title: "Signups" }),
      b.columns([b.flag(signupLimit)], [b.actions(purgeCache)]),
    ]
  },
})
```

## Fixed or rendered

`render` is either a list of blocks or a function that returns one.

A list is fixed in code. It ships with your definitions, opens instantly and works while your app is offline, which suits pages made of Pult's own blocks: counts, item lists, inbox charts, flags and buttons.

A function runs in your app each time someone opens the page, so it can show anything your app knows. It receives `params` and the `actor` looking at it. Like every request from Pult, it's signed and goes over your app's connection.

## Parameters

`params` turns the top of the page into a row of filters: a choice for each enum or boolean, a text box for strings and numbers. The values live in the address, so a filtered page can be shared as a link, and arrive in `render` validated and typed. Fields with a default start on it.

## Home

`home` is the page everyone lands on:

```ts theme={null}
import { b, home } from "pult"

export default home([
  b.columns(
    [b.count(reports, { filter: { state: "open" }, label: "Open" })],
    [b.count(regressions, { label: "Regressions" })],
  ),
  b.chart(crashes, { range: "24h", title: "Crashes, last 24h" }),
  b.items(regressions, { limit: 5 }),
])
```

It takes the same blocks or function as any page. There's one per project. Without one, home shows how many items are open in each inbox.

## Who sees a page

Everyone sees home. Other pages are granted in [roles](/build/roles) with `pages`, and admins see all of them. Blocks on a page still follow the viewer's role: counts and lists for inboxes they can't see, and buttons for actions they can't run, are left out.

## Staying current

Pages fixed in code update as items change. Rendered pages render again after an action runs, so a button that changes your numbers shows its effect.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.