Installation
Platform-by-platform guides: Raspberry Pi kiosk, Docker, Windows, macOS/Linux, and Railway cloud. Pick your target and follow the steps.
Hardware Requirements
| Platform | Minimum | Recommended | Notes |
|---|---|---|---|
| Raspberry Pi | Pi 3B+ ยท 1 GB RAM ยท 8 GB SD | Pi 4/5 ยท 4 GB RAM ยท 32 GB SD | Pi 3B+ is usable but will feel slow with many panels open |
| Desktop / laptop | Any dual-core ยท 2 GB RAM | Any modern CPU ยท 4 GB RAM | Windows, macOS, Linux all supported |
| Docker host | Docker 24+ ยท 512 MB free RAM | Docker 25+ ยท 1 GB free RAM | Works on NAS boxes (Synology, QNAP) too |
| Cloud (Railway) | Free tier (512 MB) | Starter plan (1 GB) | Free tier usually sufficient for one user |
Raspberry Pi
The Raspberry Pi is the most popular way to run OpenHamClock as a dedicated shack display. The setup script handles everything: Node.js, the app itself, a systemd service for auto-start, and optionally a full kiosk mode that launches Chromium fullscreen on boot.
Pi with kiosk display (recommended)
Use this if you have a monitor connected directly to the Pi and want a standalone clock/dashboard that powers up automatically with the shack.
-
Flash your SD card with Raspberry Pi OS Bookworm
Use Raspberry Pi Imager. Choose Raspberry Pi OS (64-bit) with desktop. Enable SSH in the Advanced Options if you want remote access. A 32 GB card is plenty.
-
Boot the Pi and open a terminal
Either connect a keyboard/monitor directly, or SSH in:
ssh pi@raspberrypi.local -
Run the setup script with kiosk modebash
$ curl -fsSL https://raw.githubusercontent.com/accius/openhamclock/main/scripts/setup-pi.sh | bash -s -- --kioskThe script will install Node.js, clone the repository, install dependencies, create a systemd service, and configure Chromium to launch fullscreen on boot. It takes about 5โ10 minutes on a Pi 4.
-
Edit your
.envfilebash$ nano ~/openhamclock/.envSet at minimum:
CALLSIGNandLOCATOR. Save with Ctrl+O, exit with Ctrl+X. -
Rebootbash
$ sudo rebootThe Pi will boot directly into the OpenHamClock dashboard fullscreen. No login screen, no desktop โ just the clock.
Pi as a headless server
Use this if you want to run OpenHamClock on a Pi tucked away in the shack and access it from other devices (a laptop, tablet, or second monitor) over your LAN.
$ curl -fsSL https://raw.githubusercontent.com/accius/openhamclock/main/scripts/setup-pi.sh | bash -s -- --server
Then add HOST=0.0.0.0 to .env so the server listens on all interfaces.
Access it from any device on your network at http://<pi-ip>:3000.
Run hostname -I on the Pi, or check your router's DHCP table.
For a permanent address, set a static IP in your router's DHCP reservation list using the Pi's MAC address.
Managing the systemd service
# Check status $ sudo systemctl status openhamclock # View live logs $ sudo journalctl -u openhamclock -f # Restart after editing .env $ sudo systemctl restart openhamclock # Stop $ sudo systemctl stop openhamclock
Docker / Docker Compose
The Docker image is the cleanest way to run a permanent local install on any machine. Everything is bundled โ no Node.js, no npm, no system-level dependencies.
Quick start with Docker Compose
-
Create a project folder and download the Compose filebash
$ mkdir openhamclock && cd openhamclock $ curl -fsSL https://raw.githubusercontent.com/accius/openhamclock/main/docker-compose.yml -o docker-compose.yml
-
Create your
.envfile.envCALLSIGN=K0CJH LOCATOR=DM79 # HOST=0.0.0.0 โ uncomment for LAN access
-
Start in detached modebash
$ docker compose up -d
Ports exposed by the container
| Port | Protocol | Purpose |
|---|---|---|
3000 | TCP | Web interface โ open this in your browser |
2237 | UDP | WSJT-X / JTDX decoder input |
12060 | UDP | N1MM+ logger integration |
WSJT-X sends UDP packets to the local machine. If OpenHamClock runs in Docker, you
need to ensure port 2237/udp is forwarded correctly in docker-compose.yml
(it is by default). If WSJT-X runs on a different machine than the Docker host,
use the WSJT-X relay agent instead.
Updating Docker
$ docker compose pull $ docker compose up -d
Windows
The recommended Windows path is Docker Desktop โ follow the Docker section above. Docker Desktop gives you a native GUI for managing the container and handles WSL2 automatically.
Native Windows install (no Docker)
If you prefer not to use Docker, OpenHamClock runs natively on Windows via Node.js.
-
Install Node.js v22 LTS
Download the Windows installer from nodejs.org. Accept all defaults. Restart your terminal after installation.
-
Install Git for Windows
Download from git-scm.com if not already installed.
-
Clone and startPowerShell
PS> git clone https://github.com/accius/openhamclock.git PS> cd openhamclock PS> npm ci PS> npm start
Windows COM ports appear as COM3, COM4, etc. In your .env,
set the rig serial port as RIG_SERIAL_PORT=COM3 (replace with your actual port number,
visible in Device Manager under "Ports").
Electron desktop app
OpenHamClock can also run as a native desktop window (no browser needed) using Electron:
$ npm run electron
macOS & Linux
Same steps as Option C in the Quick Start. For a permanent background service on Linux:
$ curl -fsSL https://raw.githubusercontent.com/accius/openhamclock/main/scripts/setup-linux.sh | bash -s -- --service
This installs OpenHamClock and registers a systemd service that starts automatically on boot. Manage it the same way as the Pi service (see above).
Cloud Deployment โ Railway
Railway is the easiest way to run OpenHamClock in the cloud โ accessible from anywhere, no home server required. The free tier is usually sufficient for a single-user personal instance.
-
Fork the repository on GitHub
Visit github.com/accius/openhamclock and click Fork. You need your own copy so Railway can deploy it.
-
Create a Railway project from your fork
Log in at railway.app, click New Project โ Deploy from GitHub repo, and select your fork. Railway detects the
Dockerfileautomatically. -
Set environment variables in Railway dashboard
In the Railway service settings, go to Variables and add at minimum:
Railway VariablesCALLSIGN=K0CJH LOCATOR=DM79 HOST=0.0.0.0 TRUST_PROXY=true
-
Deploy and open the public URL
Railway provides a public
*.railway.appURL. Open it in your browser โ your dashboard is live.
A cloud deployment cannot receive UDP packets from your local WSJT-X. Use the WSJT-X relay agent โ a small program that runs on your shack PC, captures WSJT-X UDP decodes, and forwards them securely to your cloud instance over HTTPS. See WSJT-X / FT8 โ Relay Agent for setup.
Updating & Upgrading
OpenHamClock follows a weekly release cycle. Updates are always backwards-compatible โ
your .env is never overwritten.
Git clone install (Pi / Linux / macOS)
$ cd ~/openhamclock $ bash scripts/update.sh
The update script: backs up your .env, pulls the latest code, rebuilds the frontend,
restores your settings, and restarts the service.
Docker
$ docker compose pull && docker compose up -d
Auto-update (optional)
Add these to your .env to have OpenHamClock check for updates automatically:
AUTO_UPDATE_ENABLED=true AUTO_UPDATE_INTERVAL_MINUTES=60 AUTO_UPDATE_EXIT_AFTER=true # systemd/pm2 will restart after update