Real-time system/robot monitoring and tracing with Progressive Web App dashboard
Pulson is a comprehensive monitoring solution for IoT devices, robots, and distributed systems. It provides real-time data collection, visualization, and alerting through both a CLI interface and a modern web dashboard with Progressive Web App (PWA) capabilities.
- π Multi-Type Data Support: Handle 6 different data types (pulse, GPS, sensor, trigger, event, image)
- π Real-Time Dashboard: Modern web interface with live updates every 5 seconds
- π± Progressive Web App: Install as a mobile app with offline support
- π User Authentication: JWT-based authentication with role-based access control
- βοΈ Flexible Configuration: CLI args, environment variables, and config files
- ποΈ SQLite Database: Lightweight, embedded database with user isolation
- π WASM Performance: Rust + WebAssembly for optimal performance
- Pulse: Simple heartbeat/ping monitoring with timeline visualization
- GPS: Location tracking with interactive maps using OpenStreetMap
- Sensor: Numeric data with real-time charts and threshold monitoring
- Trigger: Boolean state changes with state timeline visualization
- Event: Text messages and system events with filterable logs
- Image: Visual data with gallery view and metadata support
- π± Mobile Installation: Install directly to device home screen
- π Offline Support: Basic functionality when disconnected
- β‘ Service Worker: Fast loading with intelligent caching
- π¨ Native Experience: App-like interface with proper theming
Real-time monitoring dashboard with responsive design for desktop, mobile, and powerful CLI tools
# Install Rust and dependencies
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
rustup default stable
# Install WASM tools
curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh
rustup target add wasm32-unknown-unknown
# Build Pulson
cargo build --release
# Start the server
pulson --host 127.0.0.1:3030 serve --db-path ~/.local/share/pulson
# Register a user
pulson --host 127.0.0.1:3030 account register --username myuser --password mypass
# Send data
pulson --host 127.0.0.1:3030 pulse --device-id robot1 --topic sensors --data-type sensor --value 23.5
# View dashboard at http://127.0.0.1:3030
pulson --help
realtime system/robot monitoring and tracing
Usage: pulson [OPTIONS] <COMMAND>
Commands:
serve Run the HTTP server
device Device management (list, delete)
pulse Send a pulse with specific data type
account User account management (register, login, logout, delete, list)
config Configuration management (show, set thresholds)
help Print this message or the help of the given subcommand(s)
Options:
-H, --host <HOST> Bind address: e.g., 127.0.0.1:3030, 0.0.0.0:8080, https://sub.domain.com, http://localhost:3030
Can also be set via PULSON_HOST environment variable [default: 127.0.0.1:3030]
-h, --help Print help
# Basic server startup
pulson --host 127.0.0.1:3030 serve --db-path ~/.local/share/pulson
# With root user capability
pulson --host 127.0.0.1:3030 serve --db-path ~/.local/share/pulson --root-pass SECRET
# With custom thresholds
pulson serve --online-threshold 60 --warning-threshold 600 --stale-threshold 7200
# Enable image storage (disabled by default to save space)
pulson serve --save-images
# Using environment variables
PULSON_HOST=127.0.0.1:3030 pulson serve --db-path ~/.local/share/pulson
Once the server is running, access the dashboard at your configured host address:
- Local: http://127.0.0.1:3030
- Tunnel: https://your-domain.com
The dashboard provides:
- Real-time device status monitoring
- Interactive data visualizations for all data types
- User authentication and settings management
- Progressive Web App installation options
# List all devices
pulson --host 127.0.0.1:3030 device list
# List topics for specific device
pulson --host 127.0.0.1:3030 device list DEVICE_ID
# Watch mode with real-time updates
pulson --host 127.0.0.1:3030 device list --watch --interval 5
# Filter by status
pulson --host 127.0.0.1:3030 device list --status online
# Different output formats
pulson --host 127.0.0.1:3030 device list --format json
pulson --host 127.0.0.1:3030 device list --format compact
pulson --host 127.0.0.1:3030 device delete DEVICE_ID
# Regular user
pulson --host 127.0.0.1:3030 account register --username myuser --password mypass
# Root user (requires server root-pass)
pulson --host 127.0.0.1:3030 account register --username admin --password admin123 --root-pass SECRET
# Login
pulson --host 127.0.0.1:3030 account login --username myuser --password mypass
# Logout
pulson --host 127.0.0.1:3030 account logout
# List all users
pulson --host 127.0.0.1:3030 account list
# Delete user
pulson --host 127.0.0.1:3030 account delete username
Simple connectivity monitoring:
# Simple ping
pulson pulse --device-id robot1 --topic heartbeat --data-type pulse
# Automatic ping (no data specified)
pulson pulse --device-id robot1 --topic heartbeat
Visualization: Timeline showing device connectivity status
Location tracking with latitude, longitude, and optional altitude:
# GPS coordinates
pulson pulse --device-id vehicle1 --topic location --data-type gps \
--latitude 40.7128 --longitude -74.0060 --altitude 10
# With custom JSON
pulson pulse --device-id vehicle1 --topic location --data-type gps \
'{"latitude": 40.7128, "longitude": -74.0060, "altitude": 10, "accuracy": 5}'
Visualization: Interactive map with location points and tracking paths
Numeric measurements with optional min/max ranges:
# Temperature sensor
pulson pulse --device-id sensor1 --topic temperature --data-type sensor \
--value 23.5 --min 0 --max 50
# With custom JSON
pulson pulse --device-id sensor1 --topic temperature --data-type sensor \
'{"value": 23.5, "unit": "Β°C", "sensor_id": "temp_01"}'
Visualization: Real-time charts with threshold monitoring and alerts
Boolean state changes and digital signals:
# Door state
pulson pulse --device-id door1 --topic status --data-type trigger --state true
# With custom JSON
pulson pulse --device-id door1 --topic status --data-type trigger \
'{"state": true, "trigger_type": "motion_detected"}'
Visualization: State timeline showing true/false transitions
Text-based events and system messages:
# System event
pulson pulse --device-id system1 --topic events --data-type event \
--message "System startup completed"
# With custom JSON
pulson pulse --device-id system1 --topic events --data-type event \
'{"message": "Error detected", "severity": "high", "code": "E001"}'
Visualization: Filterable event log with timestamps and severity levels
Visual data with metadata support:
# From image file
pulson pulse --device-id camera1 --topic photos --data-type image \
--image-file /path/to/image.jpg --width 640 --height 480
# Raw image data
pulson pulse --device-id camera1 --topic photos --data-type image \
--image-data "255,128,64,..." --width 320 --height 240 --channels 3
# With custom JSON
pulson pulse --device-id camera1 --topic photos --data-type image \
'{"image_data": "base64encoded...", "width": 640, "height": 480, "format": "jpeg"}'
Visualization: Image gallery with metadata display and thumbnails
The unified --host
parameter supports multiple deployment scenarios:
# Local development
export PULSON_HOST=127.0.0.1:3030
pulson device list
# LAN deployment
export PULSON_HOST=192.168.1.100:3030
pulson device list
# Internet via Cloudflare Tunnel
export PULSON_HOST=https://pulson.your-domain.com
pulson device list
# HTTPS with custom port
export PULSON_HOST=https://monitoring.company.com:8443
pulson device list
Pulson uses configurable thresholds to determine device and topic status:
- π’ Online/Active: Within online threshold (default: 30s)
- π‘ Warning/Recent: Within warning threshold (default: 300s)
- π΄ Stale: Within stale threshold (default: 3600s, topics only)
- β« Offline: Beyond warning/stale threshold
pulson config show
# Individual thresholds
pulson config set --online-threshold 60
pulson config set --warning-threshold 600
pulson config set --stale-threshold 7200
# Multiple at once
pulson config set --online-threshold 45 --warning-threshold 300 --stale-threshold 3600
Located at ~/.config/pulson/config.toml
:
online_threshold_seconds = 30
warning_threshold_seconds = 300
stale_threshold_seconds = 3600
export PULSON_ONLINE_THRESHOLD=60
export PULSON_WARNING_THRESHOLD=600
export PULSON_STALE_THRESHOLD=7200
Priority: CLI args > Environment variables > Config file > Defaults
Configuration changes take effect immediately without server restart!
- π± Mobile Installation: Add to home screen like a native app
- π Offline Support: Cached resources for offline access
- β‘ Fast Loading: Service worker optimization
- π¨ Native Experience: Full-screen app interface
- Open dashboard in mobile browser (Chrome/Safari)
- Look for install prompt or "Add to Home Screen"
- Install - appears on home screen like native app
Visit /pwa-test.html
to test PWA features:
# Local: http://127.0.0.1:3030/pwa-test.html
# Remote: https://your-domain.com/pwa-test.html
# Server
pulson --host 127.0.0.1:3030 serve --db-path ~/.local/share/pulson
# Client
export PULSON_HOST=127.0.0.1:3030
pulson device list
# Server (accessible to LAN devices)
pulson --host 0.0.0.0:3030 serve --db-path ~/.local/share/pulson
# Clients
export PULSON_HOST=192.168.1.100:3030
pulson device list
- Set up Cloudflare Tunnel pointing to
127.0.0.1:3030
- Start server locally:
pulson --host 127.0.0.1:3030 serve --db-path ~/.local/share/pulson
- Configure clients:
export PULSON_HOST=https://pulson.your-domain.com pulson device list
# Build container
docker build -t pulson .
# Run server
docker run -d -p 3030:3030 -v pulson-data:/data pulson \
serve --db-path /data --host 0.0.0.0:3030
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
rustup default stable
curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh
rustup target add wasm32-unknown-unknown
cargo build --release
cargo build
cd pulson-ui
wasm-pack build --target web --out-dir ui
pulson/
βββ pulson/ # Main server binary
β βββ src/
β β βββ main.rs # CLI entry point
β β βββ cli.rs # Command definitions
β β βββ logic/ # Core server logic
βββ pulson-ui/ # WebAssembly UI
β βββ src/ # Rust UI components
β βββ static/ # Static web assets
β βββ ui/ # Generated WASM files
βββ book/ # Documentation
POST /api/register
- Register new userPOST /api/login
- User loginPOST /api/logout
- User logout
GET /api/devices
- List all devicesGET /api/devices/:id
- Get device detailsDELETE /api/devices/:id
- Delete devicePOST /api/pulse
- Send pulse data
GET /api/config
- Get current configurationPUT /api/config
- Update configuration
Real-time updates via WebSocket at /ws
:
device_update
- Device status changesdata_received
- New data pointsconfig_update
- Configuration changes
- Fork the repository
- Create a feature branch
- Make your changes
- Add tests if applicable
- Submit a pull request
See CONTRIBUTING.md for detailed guidelines.
This project is licensed under the MIT License - see the LICENSE.md file for details.
- Documentation: See the book/ directory
- Issues: GitHub Issues for bug reports and feature requests
- Discussions: GitHub Discussions for questions and ideas
See CHANGELOG.md for version history and release notes.
Pulson v0.3.3 - Real-time monitoring made simple, powerful, and mobile-ready.