User Stories β Web Interface¶
Service: Web-Interface Β· Tier: 1 (Infrastructure) Β· Status: Planned (since v0.9.0)
Prototype: The web-mock service (since v0.2.0) implements the complete UI shell with mock data and serves as a living UX specification. All page layouts, navigation patterns, and interaction flows are prototypically implemented there β they are more illustrative than prose descriptions.
UX Concept: docs/services/web_interface.md β Layout, Routing Rulebook, Action Risk Classification, Page Blueprints, Migration Path.
[!NOTE] Intentionally few stories: Page-specific UX requirements (dashboard widgets, recorder cards, species lists, etc.) are specified by the Web-Mock prototype and the Page Blueprints. Functional requirements for data display are in the respective service user stories (e.g., US-C05, US-P04, US-U05, US-B02). This document describes only cross-cutting UI behavior that is not apparent from the prototype or the service stories.
US-WI01: Login & Access Control π¶
As a user I want to be required to log in to the web interface with a username and password, so that unauthorized persons on the same network have no access to my recordings and settings.
Acceptance Criteria¶
Login Flow¶
- [ ] All pages require an active session β without login, users are redirected to the login page.
- [ ] Login form: username + password, validation against
userstable (bcrypt hash, US-C08). - [ ] After successful login: redirection to the last visited page (or Dashboard by default).
- [ ] Logout button in the sidebar (below Settings/About).
Session Management¶
- [ ] Sessions are managed server-side (no JWT β Silvasonic is single-node, not a distributed system).
- [ ] Session timeout after configurable inactivity time (default: 24 hours).
- [ ] On session expiration: automatic redirect to the login page with a notice.
Security¶
- [ ] Brute-force protection: max 5 failed attempts, then 30 seconds lockout.
- [ ] Password change via Settings β User (Page Blueprint Β§4.7).
- [ ] The default password from the initial setup (US-C08) is marked as requiring a change.
Non-Functional Requirements¶
- Logging in must have no impact on running recordings β the web interface is purely an observation and control tool.
- Exception: Health endpoint (
/healthy) remains accessible without authentication.
Milestone¶
- Milestone: v0.9.0
References¶
- Web-Interface Service Docs Β§Settings β User
- Controller User Stories β US-C08: Works immediately after installation
- Gateway User Stories β US-GW03: Station protected against unauthorized access
- ADR-0023: Configuration Management
US-WI02: Real-time status without reloading π¶
As a user I want the system status (recorder states, metrics, alerts) to update live without having to reload the page, so that I can assess the current state of my station at a glance at any time.
Acceptance Criteria¶
Live Updates¶
- [ ] All status widgets (Dashboard cards, Sidebar badges, Recorder status, Alerts) update in real-time via Server-Sent Events (SSE).
- [ ] The SSE endpoint initially delivers the complete state (
silvasonic:status:*keys from Redis) and thereafter only deltas (SUBSCRIBE silvasonic:status). - [ ] HTMX-based DOM swaps ensure fluid updates without full-page reloads.
Resilience¶
- [ ] On connection loss (e.g., Wi-Fi change), the client automatically tries to restore the SSE connection.
- [ ] During reconnection, a visual indicator is shown (e.g., "Connection lostβ¦").
- [ ] If Redis temporarily fails, the UI shows the last known state β no blank screen.
Footer Console (Live Logs)¶
- [ ] The Web-Mock prototype (SSE Console) is replaced by real Redis
SUBSCRIBE silvasonic:logs(ADR-0022). - [ ] Log messages are filterable by service, with auto-scroll and pause functionality.
Milestone¶
- Milestone: v0.9.0
References¶
- Web-Interface Service Docs Β§1.4: State Management & Data Flow
- Web-Mock SSE Console β Prototype implementation
- ADR-0019: Unified Service Infrastructure Β§Heartbeat
- ADR-0022: Live Log Streaming
- Controller User Stories β US-C09: Live service logs in browser
- Controller User Stories β US-C05: System status in dashboard
US-WI03: Show only enabled modules π¦¶
As a user I want only the modules I have actually enabled (e.g., Birds, Bats, Weather) to be visible in the navigation, so that the interface remains clean and doesn't distract me with features I don't use.
Acceptance Criteria¶
- [ ] Module entries in the sidebar (Birds, Bats, Weather, Livesound) are only displayed if the corresponding module is activated in Settings β Modules.
- [ ] Activation status is read from the database (
system_servicestable,enabledflag). - [ ] If a module is enabled/disabled, the sidebar updates without a page reload (HTMX swap or SSE push).
- [ ] Accessing the URL of a disabled module (e.g.,
/birdswhen BirdNET is disabled) shows a friendly notice page β no 404. - [ ] On first boot, all optional modules are disabled β only system pages (Dashboard, Recorders, Processor, Uploaders) are visible.
Milestone¶
- Milestone: v0.9.0
References¶
- Web-Interface Service Docs Β§3.1: Layout & Navigation
- Web-Mock Templates β Sidebar prototype (currently shows all modules)
- Controller User Stories β US-C03: Control services via web interface
- ADR-0017: Service State Management
[!NOTE] UX Specification lives in code: For all page-specific details (layouts, colors, components, interactions), the web-mock is the normative reference. User Stories here solely describe behavior that is not apparent from the prototype.