Monitors for containers stuck in restart loops or unhealthy states:
- Critical: restart loop (≥3 restarts)
- Warning: restarting, exited abnormally, or unhealthy
Disabled by default in config.json.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Tap the screen to see a surprised face and version number.
Returns to normal after 1.5 seconds.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Warning: soft double-beep
- Critical: urgent descending tone
- Notify: gentle ping
- Recovery: happy ascending chirp
Enable with ?sound=on or tap screen to activate.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Replace dreamy emote with content face ( ˙▿˙)
- Make blinks brief (1-2 seconds) instead of lasting full rotation
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- install.sh now clones from git instead of copying files
- Service runs git pull on restart for automatic updates
- Support config.local.json for production settings (gitignored)
- kao.py prefers config.local.json when present
To update production: push changes, then 'sudo systemctl restart kao'
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Use SCRIPT_DIR to find source files from any directory
- Create venv as target user (sudo -u) for correct ownership
- Add python3 existence check
- Add source file existence check
- Add group to systemd service
- Fix uninstall.sh root check
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Port now set via config.json "port" field
- Aggregator reads PORT from environment variable
- Updated all docs and scripts to use port 5100
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- install.sh: Sets up /opt/kao with systemd service
- uninstall.sh: Clean removal
- Hide message when optimal (only show when something to report)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Renamed sentry.py to kao.py
- Updated all references from Sentry-Emote to Kao
- Kao (顔) means "face" in Japanese
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Sleep/wake endpoints for Home Assistant webhooks
- Sleep state: dim ( -_-)zzZ with slow breathing animation
- Updated CLAUDE.md with full technical reference
- Added README.md with user guide and HA integration examples
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Rotating optimal faces with paired animations (breathing, floating, bouncing, swaying)
- Occasional idle expressions (winks/blinks) with 15% chance
- Recovery celebration emote with bounce animation
- Connection lost state with searching animation
- Face rotation every 5 minutes
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Aggregator: Flask-based event broker with priority queue
- Frontend: OLED-optimized UI with animations
- Detectors: disk, cpu, memory, service, network
- Unified entry point (sentry.py) with process management
- Heartbeat TTL system for auto-clearing stale events
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>