For most of the project, the web UI was functional but ugly. Default styles, minimal layout, built to work rather than to look at. Once the core pipeline was stable, I redesigned it properly.

Sentinel chat interface

Sentinel dashboard

The palette is deliberate — off-white background, teal accents, Plus Jakarta Sans font. Light and friendly, not the terminal-green hacker aesthetic you’d expect from a security project. The GSP mascot sits in the chat welcome screen, rendered as inline SVG because browsers were inconsistent with image tags.

Chat — the main interface. GSP mascot, task input, clean and minimal.

The dashboard shows everything at a glance. Health cards for every component — system, policy engine, Prompt Guard, Semgrep, Claude planner, conversation analyser, WASM sidecar, Signal, Telegram, email, calendar, sandbox. Each one shows its current status. Below that, session info (risk score, violations, turn count) and metrics with an approval funnel.

Dashboard — component health cards, session state, and metrics.

The routines view manages scheduled tasks — stress tests, heartbeats, memory cleanup. Each routine shows its cron schedule, last execution, and execution history.

Routines — scheduled tasks with cron expressions and execution history.

The memory view surfaces what the system remembers — heartbeat records, episodic memories from completed tasks, strategy patterns. Searchable, browseable, with a manual store button for adding entries directly.

Memory — episodic records, heartbeat entries, and searchable memory store.

Logs — real-time log streaming with level filtering and task ID search.

Dark mode toggle in the sidebar, WebSocket connection status at the bottom. The whole thing is self-hosted with no external dependencies — fonts included.