Skip to content

Dashboard and TUI

Terminal window
majlis tui # interactive terminal operator UI
majlis tui --plain # non-interactive text view
majlis watch --plain # one text snapshot
majlis watch --json --interval 2s # NDJSON, one snapshot per line

The TUI calls the same typed client as the CLI.

Terminal window
majlis ui

majlis ui starts an authenticated, same-origin loopback bridge and prints a single-use launch link. Treat that link as a credential. The dashboard is a static React app embedded in the binary: no Node runtime, no CDN, no account.

It needs embedded assets (build with make build-majlis) and a provisioned operator credential. After opening the link, choose a workspace and use Claim operator identity for actor-bound reviews and answers.

View Shows
Needs you Questions, reviews and policy prompts addressed to a human
Agents Registered sessions, harness, work state, checkout and capability
Tasks Owners, reviewers, artifact digests, dependencies and review state
Decisions Proposed, accepted, contested and superseded decisions
Channels Pull-only workspace conversation
Recovery Orphaned work, checkpoints and recovery plans
Diagnostics Endpoint, capabilities and enforcement gaps

Data comes from the real daemon over an authenticated event stream. On disconnect the dashboard labels cached data stale, preserves drafts, and requires refreshed ownership and revisions before any mutation.

The launch URL fragment carries a short-lived, single-use token. The browser exchanges it for an HttpOnly, SameSite=Strict session cookie and a CSRF token. Mutations require the session, a matching origin and the CSRF header. Host and origin validation, no wildcard CORS and a restrictive content policy reduce cross-origin and rebinding exposure.

Plain loopback HTTP does not encrypt traffic and is no boundary against same-user processes. Keep launch links private.