# Monitor WebUI - Real-time Issue Tracking Dashboard A standalone web-based monitoring interface for beads that provides real-time issue tracking through a clean, responsive web UI. ## Overview The Monitor WebUI is a separate runtime that connects to the beads daemon via RPC to provide: - **Real-time updates** via WebSocket connections - **Responsive design** with desktop table view and mobile card view - **Issue filtering** by status and priority - **Statistics dashboard** showing issue counts by status - **Detailed issue views** with full metadata - **Clean, modern UI** styled with Milligram CSS ## Architecture The Monitor WebUI demonstrates how to build custom interfaces on top of beads using: - **RPC Protocol**: Connects to the daemon's Unix socket for database operations - **WebSocket Broadcasting**: Polls mutation events and broadcasts to connected clients - **Embedded Web Assets**: HTML, CSS, and JavaScript served from the binary - **Standalone Binary**: Runs independently from the `bd` CLI ## Prerequisites Before running the monitor, you must have: 1. A beads database initialized (run `bd init` in your project) 2. The beads daemon running (run `bd daemon`) ## Building From this directory: ```bash go build ``` Or using bun (if available): ```bash bun run go build ``` This creates a `monitor-webui` binary in the current directory. ## Usage ### Basic Usage Start the monitor on default port 8080: ```bash ./monitor-webui ``` Then open your browser to http://localhost:8080 ### Custom Port Start on a different port: ```bash ./monitor-webui -port 3000 ``` ### Bind to All Interfaces To access from other machines on your network: ```bash ./monitor-webui -host 0.0.0.0 -port 8080 ``` ### Custom Database Path If your database is not in the current directory: ```bash ./monitor-webui -db /path/to/your/beads.db ``` ### Custom Socket Path If you need to specify a custom daemon socket: ```bash ./monitor-webui -socket /path/to/beads.db.sock ``` ## Command-Line Flags - `-port` - Port for web server (default: 8080) - `-host` - Host to bind to (default: "localhost") - `-db` - Path to beads database (optional, will auto-detect) - `-socket` - Path to daemon socket (optional, will auto-detect) ## API Endpoints The monitor exposes several HTTP endpoints: ### Web UI - `GET /` - Main HTML interface - `GET /static/*` - Static assets (CSS, JavaScript) ### REST API - `GET /api/issues` - List all issues as JSON - `GET /api/issues/:id` - Get specific issue details - `GET /api/ready` - Get ready work (no blockers) - `GET /api/stats` - Get issue statistics ### WebSocket - `WS /ws` - WebSocket endpoint for real-time updates ## Features ### Real-time Updates The monitor polls the daemon every 2 seconds for mutation events and broadcasts them to all connected WebSocket clients. This provides instant updates when issues are created, modified, or closed. ### Responsive Design - **Desktop**: Full table view with sortable columns - **Mobile**: Card-based view optimized for small screens - **Tablet**: Adapts to medium screen sizes ### Filtering - **Status Filter**: Multi-select for Open, In Progress, and Closed - **Priority Filter**: Single-select for P1, P2, P3, or All ### Statistics Real-time statistics showing: - Total issues - In-progress issues - Open issues - Closed issues ## Development ### Project Structure ``` monitor-webui/ ├── main.go # Main application with HTTP server and RPC client ├── go.mod # Go module dependencies ├── go.sum # (generated) Dependency checksums ├── README.md # This file └── web/ # Web assets (embedded in binary) ├── index.html # Main HTML page └── static/ ├── css/ │ └── styles.css # Custom styles └── js/ └── app.js # JavaScript application logic ``` ### Modifying the Web Assets The HTML, CSS, and JavaScript files are embedded into the binary using Go's `embed` package. After making changes to files in the `web/` directory, rebuild the binary to see your changes. ### Extending the API To add new API endpoints: 1. Define a new handler function in `main.go` 2. Register it with `http.HandleFunc()` in the `main()` function 3. Use `daemonClient` to make RPC calls to the daemon 4. Return JSON responses using `json.NewEncoder(w).Encode()` ## Deployment ### As a Standalone Service You can run the monitor as a systemd service. Example service file: ```ini [Unit] Description=Beads Monitor WebUI After=network.target [Service] Type=simple User=youruser WorkingDirectory=/path/to/your/project ExecStart=/path/to/monitor-webui -host 0.0.0.0 -port 8080 Restart=always RestartSec=10 [Install] WantedBy=multi-user.target ``` Save as `/etc/systemd/system/beads-monitor.service` and enable: ```bash sudo systemctl enable beads-monitor sudo systemctl start beads-monitor ``` ### Behind a Reverse Proxy Example nginx configuration: ```nginx server { listen 80; server_name monitor.example.com; location / { proxy_pass http://localhost:8080; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } } ``` ## Troubleshooting ### "No beads database found" Make sure you've initialized a beads database with `bd init` or specify the database path with `-db`. ### "Daemon is not running" The monitor requires the daemon to avoid SQLite locking conflicts. Start the daemon first: ```bash bd daemon ``` ### WebSocket disconnects frequently Check if there's a reverse proxy or firewall between the client and server that might be closing idle connections. Consider adjusting timeout settings. ### Port already in use If port 8080 is already in use, specify a different port: ```bash ./monitor-webui -port 3001 ``` ## Security Considerations ### Production Deployment When deploying to production: 1. **Restrict Origins**: Update the `CheckOrigin` function in `main.go` to validate WebSocket origins 2. **Use HTTPS**: Deploy behind a reverse proxy with TLS (nginx, Caddy, etc.) 3. **Authentication**: Add authentication middleware if exposing publicly 4. **Firewall**: Use firewall rules to restrict access to trusted networks ### Current Security Model The current implementation: - Allows WebSocket connections from any origin - Provides read-only access to issue data - Does not include authentication - Connects to local daemon socket only This is appropriate for local development but requires additional security measures for production use. ## License Same as the main beads project.