- NTP client syncs from configurable pools and servers - NTP server mode serves time to LAN clients - Web UI dashboard showing sync status, sources, and clients - Supports iburst and maxsources options Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
1.9 KiB
CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
Project Overview
This is a Home Assistant add-on that provides an NTP server and client using Chrony. It includes a Flask-based web UI for monitoring synchronization status.
Development Environment
Use the devcontainer configuration for local development. The devcontainer uses the Home Assistant add-on development image and mounts the workspace at /mnt/supervisor/addons/local/.
To start Home Assistant with the add-on for testing:
supervisor_run
Ports exposed in devcontainer:
- 7123 → 8123 (Home Assistant)
- 7357 → 4357 (debug)
Architecture
Container Runtime: Alpine-based image using s6-overlay for process supervision.
Services (s6-rc.d):
chrony: Main NTP daemon - reads/data/options.json, generates/etc/chrony/chrony.conf, runschronyd -dwebui: Flask app on port 8099 (or INGRESS_PORT env var) - provides status dashboard and API
Configuration Flow: Home Assistant writes add-on config to /data/options.json → chrony/run script parses with jq → generates chrony.conf → starts chronyd
Web UI (rootfs/var/www/):
app.py: Flask app with routes for dashboard and API endpoints (/api/status,/api/options,/api/force-sync,/api/burst)- Uses
chronyc -ccommands to get machine-readable status output - Templates use Jinja2 with Home Assistant-style dark theme
Key Files
config.yaml: Add-on metadata, schema, ports, privileges (SYS_TIME required for time sync)build.yaml: Architecture-specific base imagesDockerfile: Installs chrony, jq, python3, py3-flaskrootfs/etc/s6-overlay/s6-rc.d/*/run: Service startup scripts
Add-on Configuration Schema
Options defined in config.yaml:
ntp_servers: List of{server: str, iburst: bool?}allow_clients: List of CIDR networksenable_ntp_server: boollog_level: debug|info|warning|error