From af0a5121873828379593b3ad55c4dae563bbeadb Mon Sep 17 00:00:00 2001 From: Chris Frankland-Wright Date: Tue, 12 Aug 2025 16:00:43 +0100 Subject: [PATCH] docs: Document web interface and clarify API server startup Co-authored-by: aider (gemini/gemini-2.5-pro) --- README.md | 11 +++++++++++ src/main.rs | 15 +++++++++++---- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 8a7b357..40c9127 100644 --- a/README.md +++ b/README.md @@ -26,6 +26,17 @@ Created by Chris Frankland-Wright and John Rogers - Broadcasts time via local NTP server - Supports configurable time offsets (hours, minutes, seconds, frames or milliseconds) - Systemd service support for headless operation +- Web-based UI for monitoring and control when running as a daemon + +--- + +## 🖥️ Web Interface & API + +When running as a background daemon, TimeTurner provides a web interface for monitoring and configuration. + +- **Access**: The web UI is available at `http://:8080`. +- **Functionality**: You can view the real-time sync status, see logs, and change all configuration options directly from your browser. +- **API**: A JSON API is also exposed for programmatic access. See `docs/api.md` for full details. --- diff --git a/src/main.rs b/src/main.rs index ab9fa94..8006681 100644 --- a/src/main.rs +++ b/src/main.rs @@ -193,11 +193,13 @@ async fn main() { }); } - // 5️⃣ Spawn UI or setup daemon logging + // 5️⃣ Spawn UI or setup daemon logging. The web service is only started + // when running as a daemon. The TUI is for interactive foreground use. if args.command.is_none() { + // --- Interactive TUI Mode --- log::info!("🔧 Watching config.yml..."); log::info!("🚀 Serial thread launched"); - log::info!("🖥️ UI thread launched"); + log::info!("🖥️ UI thread launched"); let ui_state = ltc_state.clone(); let config_clone = config.clone(); let port = serial_port_path; @@ -205,8 +207,10 @@ async fn main() { start_ui(ui_state, port, config_clone); }); } else { + // --- Daemon Mode --- // In daemon mode, logging is already set up to go to stderr. - // The systemd service will capture it. + // The systemd service will capture it. The web service (API and static files) + // is launched later in the main async block. log::info!("🚀 Starting TimeTurner daemon..."); } @@ -282,7 +286,10 @@ async fn main() { let local = LocalSet::new(); local .run_until(async move { - // 8️⃣ Spawn the API server thread + // 8️⃣ Spawn the API server task. + // This server provides the JSON API and serves the static web UI files + // from the `static/` directory. It runs in both TUI and daemon modes, + // but is primarily for the web UI used in daemon mode. { let api_state = ltc_state.clone(); let config_clone = config.clone();