Dashboard
Overview
The dashboard (/) provides a single-screen overview of Melian's world: server health, pending approvals, today's calendar, active jobs, and analytics. Cards are arranged in a CSS grid that reflows at narrower viewports. Each card uses a dedicated hook for its data: useDashboard, useJobs, useWiz, and useGovee.
Routes
| Path | Component | Description |
|---|---|---|
/ |
MirrorView |
Dashboard / status overview |
/glade |
ChatView |
Primary conversation interface |
/knowledge |
Knowledge |
Browse and search archival memory |
/devices |
Devices |
Full device list: lights, sensors, plugs |
/tasks |
JobsView |
Job management and task view |
Card Components
The dashboard (/) renders: StatusBar, PushBanner, CalendarCard, ApprovalsCard, JobsCard, and AnalyticsCard, plus navigation links to /devices and /knowledge. The cards below (GoveeSensorsCard, HomeDevicesCard, WizCard, TasksCard) exist but are used in other views, not on the main dashboard.
StatusBar
Spans the full width at the top of the dashboard. Three indicator segments:
- Server health: green dot if the
/api/healthendpoint returns 200; red if unreachable. Polling interval: 15s. - Uptime: how long the server has been running since last start.
- Model name: the model ID string from the last
/v1/modelsresponse. Shows "-" if the LLM endpoint is unreachable.
ApprovalsCard
Lists pending email and calendar drafts requiring human sign-off before sending. The card reads from the /api/approvals endpoint, which queries email-cache.db for drafts in mode=draft accounts and calendar-cache.db for proposed event invitations.
Each approval item shows:
- Type badge:
emailorevent(colored chip, Cormorant Upright small-caps) - Subject / title: truncated to one line
- Recipient / calendar: secondary label
- Preview snippet: first 120 characters of the draft body
Actions:
- Approve: sends the draft immediately via SMTP (email) or creates the calendar event via Google Calendar API
- Reject: moves the draft to trash; logs the rejection with timestamp in
jobs.db - Edit: opens an inline textarea pre-populated with the draft body; changes are submitted on re-approve
The card badge count shown in the sidebar rail reflects the number of pending items. It updates whenever the ApprovalsCard polling fires (30s interval).
CalendarCard
Shows today's events from the Google Calendar cache (calendar-cache.db). Events are sorted by start time and grouped by calendar if the user has multiple. Each event row shows:
- Start and end time (formatted for the local timezone)
- Title in Sorts Mill Goudy
- Location (if present), with a small map-pin icon
- Attendee count (if more than 1): "You + N others"
- A dot indicator: green (future), yellow (in progress), grey (past)
Clicking an event expands an inline detail view with the full description and a link to open it in Google Calendar. The "Add Event" button is not present on the card. Use Melian's chat interface to schedule events via natural language.
Polling interval: 5 minutes (calendar data changes infrequently; the cache is also invalidated by the daily-briefing job).
JobsCard
Lists all registered jobs with their current state. For each job:
- Name: display name (e.g. "Daily Briefing")
- Schedule: cron expression (e.g.
0 7 * * *) - Last run: relative time (e.g. "3 hours ago") + success/failure icon
- Next run: absolute time
- Enable/disable toggle: writes to
jobs.db; takes effect immediately in the in-process scheduler without restart
Expanding a job row shows the last 5 run logs (truncated to 500 characters each), the job's output type, and a "Run now" button that triggers an immediate execution.
Jobs that failed their last run have a red border on the card row and log the error message in the expanded view.
GoveeSensorsCard
Displays temperature and humidity readings from Govee sensors. The H5179 and compatible sensors report via the Govee Cloud API (LAN is not supported for those devices).
Each sensor shows:
- Display name (from
goveeconfig or device name from cloud) - Temperature: in °F or °C depending on
unitsconfig (default: °F) - Humidity: as a percentage with a colored indicator: blue (<40%), green (40-60%), amber (>60%)
- Battery: percentage with low-battery warning at <20%
- Last updated: time of the most recent cloud poll
Polling interval: 5 minutes (matches Govee Cloud API rate limit recommendations).
HomeDevicesCard
An aggregate summary of all controllable smart home devices: Govee lights (LAN + cloud), Wiz lights (UDP broadcast), and any other registered devices.
Shows:
- On count / total: "3 of 8 lights on"
- Per-device row: name, room, on/off state, brightness percentage
- All off button: sends power-off command to every device that is currently on
The card distinguishes between LAN-controlled devices (low-latency, command round-trip ~50ms) and cloud-controlled devices (higher latency, command queued through Govee Cloud API).
For deeper per-device control (color, color temperature, scenes), navigate to /devices, which provides a full device management view with individual controls and status history.
WizCard
Wiz lights use UDP broadcast for discovery and control. The WizCard shows:
- Discovered Wiz bulbs on the local network (auto-discovered on card mount via broadcast to port 38899)
- Power state and brightness for each bulb
- Color temperature slider (2200K–6500K) for tunable-white bulbs
- RGB color picker for full-color bulbs
Discovery runs once on mount. If a bulb is on a different subnet or broadcast is blocked, it won't appear here. Use the Wiz app for initial pairing, then the bulb should be reachable once on the same LAN segment.
TasksCard
Shows tasks from the Obsidian vault's configured tasks file (tasks.obsidian.tasks_file). The card reads the file via Bun.file on the server and parses Markdown task syntax (- [ ] Task text).
Each task row shows:
- Checkbox: toggling it marks the task done in the file immediately (writes back via
Bun.file) - Task text: truncated at 80 characters
- Due date: if present in the task (parsed from
📅 YYYY-MM-DDnotation) - Priority indicator: derived from
🔺(urgent),⏫(high),🔼(medium),🔽(low)
Tasks are sorted: overdue first, then by due date ascending, then undated. Completed tasks are hidden but the "Show done" toggle appends them at the bottom of the list.
The full task management interface is at /tasks, where you can filter by project, priority, and due date, and add new tasks inline.
PushBanner
Shown once when the user first visits the dashboard if they haven't subscribed to web push notifications. The banner explains that push notifications let Melian surface urgent items (approval required, calendar in 5 minutes, low disk space) even when the tab is in the background.
Clicking "Enable" invokes the Push API registration flow against /api/push/subscribe. The VAPID public key is read from the server config. Once subscribed, the banner dismisses and a small bell icon appears in the StatusBar.
Push payloads are plain JSON: { title, body, tag, url }. The service worker routes the url to open the relevant dashboard card when the notification is clicked.