A NTP Server with LTC Input and Offsetting Options
Find a file
Chris Frankland-Wright cd9ac5a141 feat: Add system package update to setup script
Co-authored-by: aider (gemini/gemini-2.5-flash) <aider@aider.chat>
2025-08-24 13:07:08 +01:00
.github actually you do effectively build them twice 2025-07-21 21:36:58 +01:00
docs docs: Update API docs with new endpoints and response details 2025-08-07 21:59:32 +01:00
firmware Add files via upload 2025-07-22 13:34:13 +01:00
src docs: Document web interface and clarify API server startup 2025-08-12 16:00:43 +01:00
static updated web ui 2025-08-12 16:28:32 +01:00
.gitattributes Add .gitattributes, .gitignore, and README.md. 2024-07-27 20:16:00 +01:00
.gitignore Merge branch 'master' into withmergeresolve 2025-07-21 14:25:00 +01:00
Cargo.toml build: Add num-traits dependency 2025-08-03 12:26:31 +01:00
config.yml updated config with config bodge in tests. 2025-07-29 14:49:26 +01:00
LICENSE Create LICENSE 2025-07-22 13:40:18 +01:00
README.md Update README.md 2025-08-22 22:36:41 +01:00
SECURITY.MD Create SECURITY.MD 2025-07-29 11:29:46 +01:00
setup.sh feat: Add system package update to setup script 2025-08-24 13:07:08 +01:00
splash.png Rename wallpaper.png to splash.png 2025-06-24 22:29:29 +01:00
test_ltc_serial.py final test_ltc_serial.py 2025-07-07 20:23:28 +01:00
timeturner.py refactor: Use rational numbers for accurate frame rate calculations 2025-08-02 12:26:17 +01:00
timeturner.service fix: Ensure static web assets are installed and clarify service config 2025-08-12 16:02:25 +01:00

🕰️ NTP Timeturner (alpha)

An LTC-driven NTP server for Raspberry Pi, built with broadcast precision and a hint of magic.

Inspired by the TimeTurner in the Harry Potter series, this project synchronises timecode-locked systems by decoding incoming LTC (Linear Time Code) and broadcasting it as NTP — with precision as Hermione would insist upon.

Created by Chris Frankland-Wright and John Rogers


📦 Hardware Requirements


🛠️ Software Features

  • Reads SMPTE LTC from Audio Interface (3.5mm TRS but adaptable to BNC/XLR)
  • Converts LTC into NTP-synced time
  • 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://<raspberry_pi_ip>: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.

🛠️ Known Issues

  • Supported Frame Rates: 24/25fps
  • Non Supported Frame Rates: 23.98/30/59.94/60
  • Fractional framerates have drift or wrong wall clock sync issues

🚀 Installation

The setup.sh script is provided to compile and install the TimeTurner application and its systemd service on a Debian-based system like Raspberry Pi OS.

Prerequisites

  • Rust and Cargo: The script requires the Rust programming language toolchain. If you don't have it, install it from rustup.rs.

Running the Installer

  1. First, clone the repository:
    git clone https://github.com/cjfranko/NTP-Timeturner.git
    cd NTP-Timeturner
    
  2. Make the script executable and run it. The script will use sudo for commands that require root privileges, so it may ask for your password.
    chmod +x setup.sh
    ./setup.sh
    

What the Script Does

The installation script automates the following steps:

  1. Compiles the Binary: Runs cargo build --release to create an optimised executable.
  2. Creates Directories: Creates /opt/timeturner to store the application files.
  3. Installs Files:
    • The compiled binary is copied to /opt/timeturner/timeturner.
    • The web interface assets from the static/ directory are copied to /opt/timeturner/static.
    • A symbolic link is created from /usr/local/bin/timeturner to the binary, allowing it to be run from any location.
  4. Sets up Systemd Service:
    • Copies the timeturner.service file to /etc/systemd/system/.
    • Enables the service to start automatically on system boot.

After installation is complete, the script will provide instructions to start the service manually or to run the application in its interactive terminal mode.


🕰️ Chrony NTP

chronyc sources | Checks Source
chronyc tracking | NTP Tracking
sudo nano /etc/chrony/chrony.conf | Default Chrony Conf File

Add to top:
# Serve the system clock as a reference at stratum10
server 127.127.1.0
allow 127.0.0.0/8
local stratum 1

Add to bottom:
# Allow LAN clients
allow 0.0.0.0/0

# comment out:
pool 2.debian.pool.ntp.org iburst
sourcedir /run/chrony-dhcp