---
title: "Demo Mode"
description: "Explore the Fabro API with realistic static data and no external dependencies"
---

Demo mode lets you explore every Fabro API endpoint without configuring authentication, running real workflows, or connecting external services. Every response returns realistic static data so you can build and test integrations against a predictable dataset.

## How It Works

Demo mode is activated **per-request** by sending a header:

```
X-Fabro-Demo: 1
```

When the server receives this header, it routes the request to a parallel set of demo handlers that return static JSON instead of hitting the real backend. Authentication is bypassed — no JWT or mTLS credentials are needed.

Requests **without** the header are routed to the real API as usual, so demo and production traffic coexist on the same server.

## Using Demo Mode

### With curl

```bash
curl http://localhost:3000/api/v1/runs -H "X-Fabro-Demo: 1"
```

### With the Web UI

Set the `FABRO_DEMO=1` environment variable when starting the web app. This configures the frontend to send the `X-Fabro-Demo: 1` header on every API request and disables authentication in the UI:

```bash
FABRO_DEMO=1 bun run dev
```

## What Demo Mode Covers

Demo mode implements every API endpoint. Read endpoints return static data representing a realistic workspace with completed runs, workflows, sessions, verifications, and more. Write endpoints (creating runs, answering questions, sending messages) accept the request and return a canned response without persisting any state.

| Endpoint group | Behavior |
|----------------|----------|
| Runs | Lists and detail views return static run data across multiple statuses |
| Workflows | Returns sample workflow definitions and associated runs |
| Sessions | Returns sample chat sessions with message history |
| Human-in-the-Loop | Questions return static data; answers are accepted but not stored |
| Run Outputs | Compare, usage, and verifications return realistic static results |
| Run Internals | Stages, turns, checkpoints, context, and configuration all return static data |
| Verifications | Categories and controls with pass/fail examples |
| Insights | Saved queries and history; execute returns a canned result |
| Retros | Retrospective data for completed runs |
| Projects | Sample projects and branches |
| Settings | Platform configuration |

## Limitations

- **No state changes.** Write operations return a success response but nothing is persisted. Creating a run returns a fixed ID; it won't appear in subsequent list calls.
- **No SSE streaming.** Event stream endpoints (`/api/v1/runs/{id}/events`, `/api/v1/sessions/{id}/events`) return immediately rather than streaming.
- **Static data only.** The same data is returned regardless of path parameters — requesting any run ID returns the same run detail.
