- index.html: fix playWarningSound (440→550 Hz, louder), fix playBubbleSound
(audible volumes/durations), add looping klaxon sound (sawtooth wah-wah),
stopKlaxon() on tap and state clear, bump VERSION to v2.2.0
- kao_tui.py: add klaxon to SOUNDS list, drop notify duration 5→2s for
faster iteration; also include improved post() error reporting
- CLAUDE.md: add kao_tui.py to file structure, fix personality table
(remove ˙▿˙ row not in aggregator), add klaxon to sound list
- README.md: add klaxon to sound list, update counts
- openapi.yaml: bump version to 2.2.0, add klaxon to sound enum
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Emote face is now stable all day; /wake picks a fresh random face each
morning instead of rotating every 5 minutes. Removes EMOTE_ROTATION_INTERVAL
and last_emote_change entirely.
- Added 10 new synthesized sounds for /notify: doorbell, knock, ding, blip,
siren, tada, ping, bubble, fanfare, and alarm (loops until tapped or TTL
expires). stopAlarm() wired into tap handler and handleStateChange().
- openapi.yaml: new sound names added to enum.
- CLAUDE.md / README.md updated to reflect both changes.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Extract shared send_event/clear_event into detectors/base.py, removing
~150 lines of duplication across all 6 detectors
- Fix default aggregator URL from port 5000 to 5100 in all detectors
- Standardize cpu.py and memory.py to use active_alerts set pattern
- Fix immediate emote rotation on startup (last_emote_change = time.time())
- Extract magic numbers to named constants in aggregator
- Protect write_status() with try/except OSError
- Fix notify event ID collision with monotonic counter
- Replace blocking stream_output() with background daemon threads in kao.py
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add /clear-all endpoint and wire it to the tap handler so tapping the
display dismisses active warnings/critical alerts. Fix docker detector
to track restart count deltas instead of relying on the transient
"restarting" state. Wrap cleanup thread in try/except so it can't die
silently and leave events stuck forever.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- /notify now accepts optional: emote, color, animation, sound
- Backend passes custom properties to status response
- Frontend handles custom sounds (chime, alert, success, etc.)
- Added new sound effects: chime, alert, success
- Updated documentation with full notify options
- Added HA automation examples for doorbell and timer
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- New /notify endpoint: simple {"message": "", "duration": 5} API
- Uses Priority 3 (Notify) with auto-expiring TTL
- Updated CLAUDE.md with HA integration examples
- Updated README.md with new features and endpoints
- Added Docker detector to documentation
- Removed completed TODO items
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Version bump reflecting new features (sounds, tap reaction, docker detector)
- Rename title to Kao
- Enable network and docker detectors by default
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
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>