- Add detached mode for long-running processes via detached=true config
- Fix process termination on timeout using process groups and kill -TERM/-KILL
- Remove double shell wrapping that was breaking command execution
- Track PIDs via wrapper script to enable proper process cleanup
- Flush port messages after timeout to prevent Tortoise MQTT errors
- Update example config to demonstrate detached command usage
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Add wait_for_connection() to test actual MQTT connectivity after start_link
- Use publish_sync with timeout to verify broker is reachable
- Properly fail startup if MQTT broker is unavailable
- Add clear timeout and connection error messages
This fixes the issue where systant reported 'connected successfully'
even when the MQTT broker was unreachable.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
Config file loading fixes:
- Fix tilde expansion in config paths (~/.config/systant/systant.toml)
- Add detailed debug logging for config file search paths
- Properly expand home directory paths with System.user_home()
MQTT connection improvements:
- Add clearer connection status logging with broker host:port
- Improve error handling in connection callback
- Better error messages when connection fails or is lost
- More detailed initial connection logging
These fixes address production deployment issues where config files
aren't found and MQTT connection errors aren't properly reported.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
Update documentation to reflect network throughput implementation:
- Network sensors now show real-time RX/TX throughput in MB/s
- Changed from cumulative byte counters to bandwidth monitoring
- Updated sensor descriptions and features list
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
Both RX and TX sensors were using 'network' as value_template_path,
causing identical unique_ids and only one sensor to be created in HA.
Now using distinct paths: network.rx_throughput and network.tx_throughput.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
Display network throughput in more readable MB/s units instead of B/s.
1,101,646.76 B/s becomes 1.05 MB/s for better readability in Home Assistant.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
The network throughput implementation uses /proc/net/dev parsing
instead of iftop, so the iftop dependency is not needed.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Add iftop as runtime dependency in package.nix and flake.nix
- Modify SystemMetrics to calculate network throughput (bytes/second)
- Track previous network stats in MQTT client state for throughput calculation
- Update Home Assistant discovery to show RX/TX throughput sensors
- Replace cumulative byte counters with real-time throughput metrics
- Add proper throughput calculation with time-based differentials
This provides much more useful real-time network monitoring compared
to ever-increasing cumulative byte counts.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Implement `Systant.HaDiscovery` module for automatic device registration
- Add comprehensive sensor discovery: CPU, memory, GPU, disk, network, temperature
- Update MQTT client to publish discovery messages on startup
- Add HomeAssistant configuration section to systant.toml
- Create example configuration file with localhost MQTT broker
- Update CLAUDE.md with complete HA integration documentation
- Add mosquitto to development dependencies for testing
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Remove null error field from successful command responses for cleaner JSON
- Fix client_id consistency between MqttClient and MqttHandler for reliable publishing
- Add comprehensive command system documentation to CLAUDE.md:
* User-configurable commands via systant.toml
* Enterprise security features (whitelist-only, parameter validation, timeouts)
* Simple command interface: {"command":"trigger","params":[...]}
* Built-in commands and response format examples
* Complete MQTT topic structure documentation
Command system now production-ready with:
✅ Secure execution (no arbitrary shell commands)
✅ Clean JSON responses (no null fields)
✅ Comprehensive logging and audit trail
✅ User-customizable command definitions
✅ Request/response correlation with auto-generated IDs
Ready for Home Assistant integration.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Add comprehensive command configuration to systant.toml with user-defined commands
- Create Systant.CommandExecutor module with strict security validation:
* Whitelist-only command execution (no arbitrary shell commands)
* Parameter validation against allowed lists
* Command timeouts and confirmation requirements
* Full audit logging and response tracking
- Implement Systant.MqttHandler for processing command messages:
* JSON command parsing and validation
* Response publishing to systant/{hostname}/responses topic
* Built-in "list" command to show available commands
* Error handling with detailed response messages
- Update MqttClient to use custom handler instead of Logger
- Security features:
* Only predefined commands from TOML config
* Parameter substitution with validation ($SERVICE, $PATH, etc.)
* Execution timeouts and comprehensive logging
* Structured response format with request tracking
Example commands configured: restart services, system info, disk usage, process status, network tests.
Users can customize commands in their systant.toml file.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Add GPU metrics display for NVIDIA and AMD cards with utilization, temperature, and memory
- Add Network interfaces display with RX/TX bytes and error tracking
- Add Temperature monitoring with CPU and sensor data
- Add Top processes display with CPU/memory usage
- Implement color-coded temperature indicators
- Add data formatting helpers for bytes, MB/GB, and percentages
- Conditional rendering for available metric modules
- Enhanced grid layout for optimal metrics viewing
Dashboard now displays all metric modules from the configuration system:
CPU load, memory usage, disk usage, GPU status, network I/O, temperatures, and top processes.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Add Systant.Config module for TOML configuration with environment overrides
- Create systant.toml template with all metric module controls
- Update SystemMetrics to use configuration-driven collection
- Add filtering for disks, network interfaces, and processes
- Implement per-module enable/disable controls
- Update MqttClient to use new configuration system
- Add Hivemind/Just development workflow integration
- Update dashboard with graphical metrics display and raw data toggle
- Comprehensive documentation updates in CLAUDE.md
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
## System Metrics Collection
- Add SystemMetrics module with CPU, memory, disk, and system info collection
- Integrate Erlang :os_mon application (cpu_sup, memsup, disksup)
- Collect and format active system alarms with structured JSON output
- Replace simple "Hello" messages with rich system data in MQTT payloads
## MQTT Integration
- Update MqttClient to publish comprehensive metrics every 30 seconds
- Add :os_mon to application dependencies for system monitoring
- Maintain backward compatibility with existing dashboard consumption
## Documentation Updates
- Update CLAUDE.md with Phase 1 completion status and implementation details
- Completely rewrite README.md to reflect current project capabilities
- Document alarm format, architecture, and development workflow
## Technical Improvements
- Graceful error handling for metrics collection failures
- Clean alarm formatting: {severity, path/details, id}
- Dashboard automatically receives and displays real-time system data and alerts
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Replace SimpleMqtt simulation with real MqttSubscriber
- Fix String.split bug when handling MQTT topic parsing
- Use hostname-based client ID to avoid MQTT client conflicts
- Add process management tools (hivemind, just) to development environment
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
Features:
- MQTT subscriber GenServer connects to mqtt.home
- Real-time host discovery via systant/+/stats topic
- LiveView with Phoenix PubSub for instant updates
- Host cards showing live data and last seen timestamps
- Clean UI with Tailwind styling
- Proper OTP supervision tree
Dashboard ready to receive live data from systant hosts!
Visit /hosts to see real-time monitoring.
- Remove home-assistant-integration/ and dev-config/
- Remove Python/HA dependencies from flake.nix
- Add Phoenix LiveView dashboard with clean Elixir-only stack
- Add Node.js and PostgreSQL for Phoenix development
- Much cleaner monorepo architecture focusing on Elixir ecosystem
Next: Connect dashboard to MQTT for real-time host monitoring
- Remove frontend dependencies that aren't in Nix package
- Use minimal config with just HTTP, API, and MQTT
- Prepare for either Docker alternative or core-only testing
- Remove mosquitto from flake (use existing broker)
- Point dev config to mqtt.home instead of localhost
- Cleaner setup using your existing MQTT infrastructure
- Add home-assistant and mosquitto to dev shell
- Create minimal dev-config/ for HA development instance
- Symlink custom integration for easy testing
- Add HA dev files to .gitignore
- No HA codebase committed, just references via Nix
Usage:
nix develop
hass --config ./dev-config
Features:
- Isolated from production HA instance
- MQTT broker for testing
- Debug logging enabled
- In-memory database for fast iteration
- Create basic integration structure with manifest.json
- Add config flow for easy setup via UI
- Implement MQTT-based host discovery and sensor creation
- Auto-discover Systant hosts via systant/+/stats topic
- Create device entities with last_seen sensor for each host
- Add Python tooling to flake.nix for HA development
Integration features:
- Automatic host discovery via MQTT
- Device representation for each monitored host
- Extensible sensor architecture
- Proper Home Assistant integration patterns
- Remove dummy COOKIE file creation (doesn't work in Nix store)
- Set RELEASE_COOKIE env var in wrapper script instead
- This follows NixOS best practices for Elixir releases
- Remove server/_build/ and server/deps/ from git tracking
- Update .gitignore to properly ignore server build directories
- These directories caused symlink conflicts in Nix build
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Move Elixir code to server/ subdirectory for monorepo structure
- Update flake.nix to provide packages and apps outputs for nix run support
- Update nix/package.nix to accept src parameter instead of fetchgit
- Add NixOS module export for easy consumption
Now supports: nix run, nix build, and nix develop from git repo
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Move Nix package and module to nix/ directory for better organization
- Remove old Nix files (systant.nix, systant-old.nix, etc.)
- Remove debug script and systemd service file
- Update config files for new Nix structure
- Add CLAUDE.md with project documentation
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Topics now default to systant/{hostname}/stats and systant/{hostname}/commands
- Runtime config automatically includes system hostname in topics
- NixOS module defaults use config.networking.hostName
- Supports multiple hosts without topic conflicts
- Environment variables can still override if needed
Example: systant/orion/stats, systant/server2/stats, etc.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
Set RELEASE_COOKIE environment variable directly in systemd service
to prevent startup script from trying to read non-existent COOKIE file.
The environment variable takes precedence over file reading.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>