#
m3 Web Dashboard
A built-in, local web control panel for m3 — browse memory, explore the
interactive knowledge graph, audit conflicts, and watch system health and load.
It is **backend-agnostic** (works on SQLite and PostgreSQL, and any future
storage backend) and runs as a **windowless background service** on
`http://127.0.0.1:8088`.
> **Loopback-only, no authentication.** The dashboard binds to `127.0.0.1` and
> is intended for local, single-user use. It can read *and mutate* memory
> (edit, soft/hard-delete, GDPR export/forget), so **do not expose it to a
> network** without putting your own authentication in front of it.
---
## Install
Nothing to install — the dashboard's dependencies (FastAPI + uvicorn) ship in
the **base install**, so `pip install m3-memory` is enough:
```bash
m3 dashboard
```
The `m3-memory[dashboard]` extra still resolves, for anyone who pinned it before
the dependencies moved into core.
The interactive setup wizard (`m3 setup`) also offers to register the dashboard
to auto-start on boot.
---
## Run
```bash
m3 dashboard # start it (detached, windowless) and print the URL
m3 dashboard --status # is it running? show the URL + pid
m3 dashboard --stop # stop it and free the port
```
`m3 dashboard` launches the server **detached and windowless** — there is no
console window and no flashing, and it **keeps running after you close the
terminal**. The command prints the URL and returns immediately. Open
**** in your browser.
Flags:
| Flag | Meaning |
|------|---------|
| `--host HOST` | Bind address (default `127.0.0.1`; leave it loopback unless you add auth). |
| `--port PORT` | TCP port (default `8088`, or `$M3_DASHBOARD_PORT`). |
| `--foreground` | Run the server in the current process (blocks; for debugging). |
| `--stop` | Stop the running dashboard. |
| `--status` | Report whether it's running and its URL. |
Environment variables `M3_DASHBOARD_HOST` and `M3_DASHBOARD_PORT` override the
defaults.
### Auto-start on boot
When you opt into the dashboard during `m3 setup`, it is registered as a
boot-start service (a scheduled task on Windows via `pythonw.exe`, so there is
no console window or flash; a user service on macOS/Linux). To register it
manually:
```bash
python bin/install_schedules.py --add dashboard
```
The service is single-instance (a re-launch when it's already running is a
no-op) and self-heals if it dies.
---
## Pages
The dashboard has four tabs:
### Graph Explorer
The **interactive knowledge graph** — the extracted *entities* (files,
functions, models, hosts, …) and how they link. Pan, zoom, drag nodes, filter
by type, and open any node's detail. Use **⇱ Open in window** to pop the graph
out into its own resizable browser window (with a node-name filter and a detail
sidebar).
> The graph shows the **knowledge-graph layer — entities and links, not raw
> memory text.** Filtering it for a memory keyword that isn't an entity name
> returns nothing; to search memory text, use the Memory Browser.
### KB Browser
A curated, card-based view of memories and entities for browsing and curation.
### Conflict & Audit Log
The memory history timeline: overrides, resolutions, contradictions, and
soft/hard-delete — plus GDPR export/forget. All actions go through m3's
backend-agnostic core, so they behave identically on any storage backend.
### System Health
A digestible status panel:
- **Overall status** — `HEALTHY`, `THROTTLED (RAM/GPU/…)`, `REDUCED
PERFORMANCE`, or `NEEDS SETUP`, with the specific reasons when it isn't
healthy. (A load-throttle or slower embedder tier is **not** a data-integrity
problem — the wording reflects that.)
- **System load (Governor)** — CPU / RAM / GPU meters, each colored green /
amber / red by its own value against the throttle and halt thresholds, plus
the current pacing mode and thermal state.
- **Database backend** — SQLite / PostgreSQL / … with per-store paths (core,
chat, files), row counts, and last-updated time.
- **Data warehouse (CDW) sync** — per-direction last-sync watermarks (if a
warehouse is configured).
- **Processing pipeline** — enrichment, reflection, and entity-extraction queue
depths and drain status.
All timestamps are shown in local time with the UTC (Zulu) value in parentheses.
The page auto-refreshes every few seconds so live load telemetry stays current.
---
## Search syntax (Memory Browser & graph filter)
Both the Memory Browser search box and the knowledge-graph node filter use the
same query grammar. Words are **filters** (all must match — AND):
| Query | Matches |
|-------|---------|
| `UAC window` | items with **both** `UAC` **and** `window` (same as `+UAC +window`) |
| `-window` | items that do **not** contain `window` |
| `"malformed string"` | the exact **phrase** (not the two words separately) |
| `UAC -"malformed string"` | has `UAC` but **not** that phrase |
Search is **case-insensitive by default**; uncheck **ignore case** for exact
case. An ⓘ info box in the UI documents this inline.
---
## Backends
The dashboard reads and writes through m3's storage-backend seam, so it works
unchanged on **SQLite** (the default) and **PostgreSQL** (`M3_DB_BACKEND=postgres`).
A future SQL backend (e.g. MariaDB) is picked up automatically — the dashboard
never hardcodes an engine.
---
## Troubleshooting
- **`m3 dashboard` says it needs web dependencies** — you are on a release from
before FastAPI/uvicorn moved into the base install. Upgrade with
`pip install -U m3-memory`, or install the extra: `pip install "m3-memory[dashboard]"`.
- **Port already in use** — another instance is running; `m3 dashboard --status`
shows it, `m3 dashboard --stop` clears it (this also cleans up an orphaned
instance the process registry missed).
- **`m3 doctor`** reports the dashboard's health, and `m3 doctor --fix` will
restart a dead/wedged instance on its recorded host/port.