---
title: Dashboard
icon: home
description: Set up and run the Reloop dashboard app locally.
---
> For the complete documentation index, see [llms-docs.txt](/llms-docs.txt) or the site index [llms.txt](/llms.txt). Full docs corpus: [llms-full-docs.txt](/llms-full-docs.txt). Prefer markdown URLs (append `.md`) for agent consumption. Product skill: [skill.md](/skill.md).


Main workspace app — campaigns, contacts, templates, analytics, and settings.

<Tip>
Run [`bun setup`](/docs/setup) once from the monorepo root before starting individual apps. The dashboard needs [auth](/docs/setup/backend/auth) (and usually the rest of `bun backend:dev` or `bun dev`).
</Tip>


## Overview

| Property | Value |
| :--- | :--- |
| **Directory** | `apps/frontend/dashboard` |
| **Port** | `3001` |
| **Local URL** | [https://local.reloop.sh/dashboard](https://local.reloop.sh/dashboard) |
| **Direct URL** | [http://localhost:3001/dashboard](http://localhost:3001/dashboard) |
| **Stack** | TanStack Start · Vite · React 19 · Tailwind CSS |


## Quick start

From the monorepo root (after [`bun setup`](/docs/setup)):

```bash
bun fe:dashboard:dev
```

Or start every frontend together:

```bash
bun frontend:dev
```

Vite HMR serves the app on port `3001` with base path `/dashboard`.

<Warning>
Open [https://local.reloop.sh/dashboard](https://local.reloop.sh/dashboard), not `localhost:3001`, so session cookies work with [auth](/docs/setup/backend/auth). Local OTP is `888888`.
</Warning>


## Environment

No committed `.env` is required for local same-origin use via Caddy. The auth client falls back to the browser origin when public URL vars are unset.

Optional overrides:

```bash
# Optional locally — browser origin is used when unset (via Caddy at local.reloop.sh).
# Required at Docker/image *build* time for production if you cannot rely on same-origin.
# NEXT_PUBLIC_URL=https://local.reloop.sh
# VITE_PUBLIC_URL=https://local.reloop.sh

NEXT_PUBLIC_WS_URL="wss://local.reloop.sh"
```

API calls use relative paths (`/api/*`) through Caddy, so no public API URL is required.

Auth (`@reloop/auth/client`) resolves the public origin as: `NEXT_PUBLIC_URL` / `VITE_PUBLIC_URL` → `window.location.origin`. For production Docker images you can pass `--build-arg NEXT_PUBLIC_URL=https://your-domain.com`; if omitted, the browser origin is used so same-host reverse-proxy deploys work without a rebuild.

| Variable | Required | Default |
| :--- | :--- | :--- |
| `NEXT_PUBLIC_URL` / `VITE_PUBLIC_URL` | No | Browser origin (`window.location.origin`) |
| `NEXT_PUBLIC_WS_URL` | No | Current host (template collaboration WebSocket) |


## Commands

| Command | Description |
| :--- | :--- |
| `bun fe:dashboard:dev` | Start Vite + TanStack Start dev server |
| `bun run --filter=fe-dashboard build` | Compile production bundle (Nitro) |
| `bun run --filter=fe-dashboard preview` | Preview production build |
| `bun run --filter=fe-dashboard typecheck` | Run TypeScript checks |
| `bun run --filter=fe-dashboard test` | Run Vitest |


## Next

<CardGroup cols={2}>
  <Card icon="rocket" title="Setup" href="/setup">
    One-command local bootstrap
  </Card>
  <Card icon="globe" title="Port reference" href="/setup/port">
    Gateway routes and ports
  </Card>
  <Card icon="lock" title="Auth" href="/setup/backend/auth">
    Sessions and local OTP
  </Card>
  <Card icon="browser" title="Web" href="/setup/frontend/web">
    Marketing site setup
  </Card>
</CardGroup>
