diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md
new file mode 100644
index 0000000..b4c1a8e
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/bug_report.md
@@ -0,0 +1,48 @@
+---
+name: Bug Report
+about: Create a report to help us improve OpenHamClock
+title: '[BUG] '
+labels: bug
+assignees: ''
+---
+
+## Describe the Bug
+A clear and concise description of what the bug is.
+
+## To Reproduce
+Steps to reproduce the behavior:
+1. Go to '...'
+2. Click on '...'
+3. Scroll down to '...'
+4. See error
+
+## Expected Behavior
+A clear and concise description of what you expected to happen.
+
+## Screenshots
+If applicable, add screenshots to help explain your problem.
+
+## Environment
+- **OS**: [e.g., Windows 11, macOS Sonoma, Ubuntu 22.04, Raspberry Pi OS]
+- **Browser**: [e.g., Chrome 120, Firefox 121, Safari 17]
+- **Node.js Version**: [e.g., 20.10.0]
+- **OpenHamClock Version**: [e.g., 3.0.0]
+- **Running As**: [Web browser / Electron app / Docker]
+
+## For Raspberry Pi Users
+- **Pi Model**: [e.g., Pi 4 4GB, Pi 3B+]
+- **Pi OS Version**: [e.g., Bookworm 64-bit]
+- **Display**: [e.g., Official 7" touchscreen, HDMI 1080p monitor]
+- **Running in Kiosk Mode**: [Yes/No]
+
+## Console Errors
+If there are any errors in the browser console (F12), please paste them here:
+```
+Paste console errors here
+```
+
+## Additional Context
+Add any other context about the problem here. Include your callsign if you're comfortable sharing it!
+
+---
+73!
diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md
new file mode 100644
index 0000000..b4bf113
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/feature_request.md
@@ -0,0 +1,41 @@
+---
+name: Feature Request
+about: Suggest an idea for OpenHamClock
+title: '[FEATURE] '
+labels: enhancement
+assignees: ''
+---
+
+## Is your feature request related to a problem?
+A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
+
+## Describe the Solution You'd Like
+A clear and concise description of what you want to happen.
+
+## Describe Alternatives You've Considered
+A clear and concise description of any alternative solutions or features you've considered.
+
+## Use Case
+How would this feature benefit amateur radio operators? Be specific about the use case:
+- [ ] General HF operation
+- [ ] VHF/UHF operation
+- [ ] Satellite operation
+- [ ] Contesting
+- [ ] POTA/SOTA
+- [ ] DXing
+- [ ] Emergency communications
+- [ ] Other: ___________
+
+## Would you be willing to help implement this?
+- [ ] Yes, I can submit a PR
+- [ ] Yes, I can help test
+- [ ] No, but I'd use it!
+
+## Additional Context
+Add any other context, screenshots, or mockups about the feature request here.
+
+## Similar Features in Other Software
+Are there similar features in other amateur radio software? If so, what do you like/dislike about their implementation?
+
+---
+73!
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
new file mode 100644
index 0000000..63165ca
--- /dev/null
+++ b/.github/workflows/ci.yml
@@ -0,0 +1,86 @@
+name: CI
+
+on:
+ push:
+ branches: [ main, develop ]
+ pull_request:
+ branches: [ main ]
+
+jobs:
+ test:
+ runs-on: ubuntu-latest
+
+ strategy:
+ matrix:
+ node-version: [18.x, 20.x]
+
+ steps:
+ - uses: actions/checkout@v4
+
+ - name: Use Node.js ${{ matrix.node-version }}
+ uses: actions/setup-node@v4
+ with:
+ node-version: ${{ matrix.node-version }}
+ cache: 'npm'
+
+ - name: Install dependencies
+ run: npm ci
+
+ - name: Run tests
+ run: npm test
+
+ - name: Start server and test health endpoint
+ run: |
+ npm start &
+ sleep 5
+ curl -f http://localhost:3000/api/health || exit 1
+
+ docker:
+ runs-on: ubuntu-latest
+ needs: test
+
+ steps:
+ - uses: actions/checkout@v4
+
+ - name: Build Docker image
+ run: docker build -t openhamclock:test .
+
+ - name: Test Docker container
+ run: |
+ docker run -d -p 3000:3000 --name ohc-test openhamclock:test
+ sleep 10
+ curl -f http://localhost:3000/api/health || exit 1
+ docker stop ohc-test
+
+ build-electron:
+ runs-on: ${{ matrix.os }}
+ needs: test
+ if: github.event_name == 'push' && github.ref == 'refs/heads/main'
+
+ strategy:
+ matrix:
+ os: [ubuntu-latest, windows-latest, macos-latest]
+
+ steps:
+ - uses: actions/checkout@v4
+
+ - name: Use Node.js
+ uses: actions/setup-node@v4
+ with:
+ node-version: 20.x
+ cache: 'npm'
+
+ - name: Install dependencies
+ run: npm ci
+
+ - name: Build Electron app
+ run: npm run electron:build
+ env:
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+
+ - name: Upload artifacts
+ uses: actions/upload-artifact@v4
+ with:
+ name: electron-${{ matrix.os }}
+ path: dist/
+ retention-days: 7
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..03e2829
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,81 @@
+# Dependencies
+node_modules/
+package-lock.json
+
+# Build outputs
+dist/
+build/
+out/
+
+# Electron
+*.asar
+
+# Logs
+logs/
+*.log
+npm-debug.log*
+
+# Runtime data
+pids/
+*.pid
+*.seed
+*.pid.lock
+
+# Coverage directory
+coverage/
+.nyc_output/
+
+# Environment files
+.env
+.env.local
+.env.*.local
+*.env
+
+# Editor directories and files
+.idea/
+.vscode/
+*.swp
+*.swo
+*~
+.project
+.classpath
+.settings/
+*.sublime-workspace
+*.sublime-project
+
+# OS files
+.DS_Store
+.DS_Store?
+._*
+.Spotlight-V100
+.Trashes
+ehthumbs.db
+Thumbs.db
+Desktop.ini
+
+# Temporary files
+tmp/
+temp/
+*.tmp
+*.temp
+
+# Config files that might contain secrets
+config.local.js
+config.local.json
+
+# Test files
+*.test.js.snap
+
+# Optional npm cache directory
+.npm/
+
+# Optional eslint cache
+.eslintcache
+
+# Yarn
+.yarn/
+.pnp.*
+
+# Raspberry Pi specific
+*.img
+*.iso
diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
index 0000000..95050a7
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,92 @@
+# Changelog
+
+All notable changes to OpenHamClock will be documented in this file.
+
+The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
+and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
+
+## [Unreleased]
+
+### Planned
+- Satellite tracking with pass predictions
+- SOTA API integration
+- Contest calendar
+- WebSocket DX cluster connection
+- Azimuthal equidistant projection option
+
+## [3.0.0] - 2024-01-30
+
+### Added
+- **Real map tiles** via Leaflet.js - no more approximated shapes!
+- **8 map styles**: Dark, Satellite, Terrain, Streets, Topo, Ocean, NatGeo, Gray
+- **Interactive map** - click anywhere to set DX location
+- **Day/night terminator** using Leaflet.Terminator plugin
+- **Great circle path** visualization between DE and DX
+- **POTA activators** displayed on map with callsigns
+- **Express server** with API proxy for CORS-free data fetching
+- **Electron desktop app** support for Windows, macOS, Linux
+- **Docker support** with multi-stage build
+- **Railway deployment** configuration
+- **Raspberry Pi setup script** with kiosk mode option
+- **Cross-platform install scripts** (Linux, macOS, Windows)
+- **GitHub Actions CI/CD** pipeline
+
+### Changed
+- Complete rewrite of map rendering using Leaflet.js
+- Improved responsive layout for different screen sizes
+- Better error handling for API failures
+- Cleaner separation of frontend and backend
+
+### Fixed
+- CORS issues with external APIs now handled by server proxy
+- Map projection accuracy improved
+
+## [2.0.0] - 2024-01-29
+
+### Added
+- Live API integrations for NOAA space weather
+- POTA API integration for activator spots
+- Band conditions from HamQSL (XML parsing)
+- DX cluster spot display
+- Realistic continent shapes (SVG paths)
+- Great circle path calculations
+- Interactive map (click to set DX)
+
+### Changed
+- Improved space weather display with color coding
+- Better visual hierarchy in panels
+
+## [1.0.0] - 2024-01-29
+
+### Added
+- Initial release
+- World map with day/night terminator
+- UTC and local time display
+- DE/DX location panels with grid squares
+- Short path / Long path bearing calculations
+- Distance calculations
+- Sunrise/sunset calculations
+- Space weather panel (mock data)
+- Band conditions panel
+- DX cluster panel (mock data)
+- POTA activity panel (mock data)
+- Responsive grid layout
+- Dark theme with amber/green accents
+
+### Acknowledgments
+- Created in memory of Elwood Downey, WB0OEW
+- Inspired by the original HamClock
+
+---
+
+## Version History Summary
+
+| Version | Date | Highlights |
+|---------|------|------------|
+| 3.0.0 | 2024-01-30 | Real maps, Electron, Docker, Railway |
+| 2.0.0 | 2024-01-29 | Live APIs, improved map |
+| 1.0.0 | 2024-01-29 | Initial release |
+
+---
+
+*73 de OpenHamClock contributors*
diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md
new file mode 100644
index 0000000..525a571
--- /dev/null
+++ b/CODE_OF_CONDUCT.md
@@ -0,0 +1,44 @@
+# Code of Conduct
+
+## Our Pledge
+
+In the spirit of amateur radio's long tradition of courtesy, we as contributors and maintainers pledge to make participation in our project and community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.
+
+## Our Standards
+
+Examples of behavior that contributes to creating a positive environment include:
+
+* Using welcoming and inclusive language
+* Being respectful of differing viewpoints and experiences
+* Gracefully accepting constructive criticism
+* Focusing on what is best for the community
+* Showing empathy towards other community members
+* Following amateur radio's tradition of courtesy and helpfulness
+
+Examples of unacceptable behavior include:
+
+* The use of sexualized language or imagery and unwelcome sexual attention or advances
+* Trolling, insulting/derogatory comments, and personal or political attacks
+* Public or private harassment
+* Publishing others' private information without explicit permission
+* Other conduct which could reasonably be considered inappropriate
+
+## Our Responsibilities
+
+Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.
+
+## Scope
+
+This Code of Conduct applies within all project spaces, and it also applies when an individual is representing the project or its community in public spaces.
+
+## Enforcement
+
+Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team through GitHub issues. All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances.
+
+## Attribution
+
+This Code of Conduct is adapted from the [Contributor Covenant](https://www.contributor-covenant.org), version 1.4.
+
+---
+
+**73 - The amateur radio community is built on mutual respect and helpfulness. Let's keep that tradition alive!**
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
new file mode 100644
index 0000000..c946159
--- /dev/null
+++ b/CONTRIBUTING.md
@@ -0,0 +1,219 @@
+# Contributing to OpenHamClock
+
+First off, thank you for considering contributing to OpenHamClock! It's people like you that make the amateur radio community great. 73!
+
+## Table of Contents
+
+- [Code of Conduct](#code-of-conduct)
+- [Getting Started](#getting-started)
+- [How Can I Contribute?](#how-can-i-contribute)
+- [Development Setup](#development-setup)
+- [Pull Request Process](#pull-request-process)
+- [Style Guidelines](#style-guidelines)
+
+## Code of Conduct
+
+This project and everyone participating in it is governed by our [Code of Conduct](CODE_OF_CONDUCT.md). By participating, you are expected to uphold this code. Please report unacceptable behavior to the project maintainers.
+
+## Getting Started
+
+### Issues
+
+- **Bug Reports**: If you find a bug, please create an issue with a clear title and description. Include as much relevant information as possible, including steps to reproduce.
+- **Feature Requests**: We welcome feature suggestions! Open an issue describing the feature and why it would be useful.
+- **Questions**: Use GitHub Discussions for questions about usage or development.
+
+### Good First Issues
+
+Looking for something to work on? Check out issues labeled [`good first issue`](https://github.com/k0cjh/openhamclock/labels/good%20first%20issue) - these are great for newcomers!
+
+## How Can I Contribute?
+
+### Reporting Bugs
+
+Before creating a bug report, please check existing issues to avoid duplicates. When you create a bug report, include:
+
+- **Clear title** describing the issue
+- **Steps to reproduce** the behavior
+- **Expected behavior** vs **actual behavior**
+- **Screenshots** if applicable
+- **Environment details**: OS, browser, Node.js version, Pi model, etc.
+
+### Suggesting Features
+
+We love hearing ideas from the community! When suggesting a feature:
+
+- **Use a clear title** for the issue
+- **Provide a detailed description** of the proposed feature
+- **Explain the use case** - how would this benefit ham radio operators?
+- **Consider implementation** - any ideas on how to build it?
+
+### Priority Contribution Areas
+
+We especially welcome contributions in these areas:
+
+1. **Satellite Tracking**
+ - TLE parsing and SGP4 propagation
+ - Pass predictions and AOS/LOS times
+ - Satellite footprint visualization
+
+2. **Real-time DX Cluster**
+ - WebSocket connection to Telnet clusters
+ - Spot filtering and alerting
+ - Clickable spots to set DX
+
+3. **Contest Integration**
+ - Contest calendar from WA7BNM or similar
+ - Contest-specific band plans
+ - Rate/multiplier tracking
+
+4. **Hardware Integration**
+ - Hamlib radio control (frequency, mode)
+ - Rotator control
+ - External GPIO for Pi (PTT, etc.)
+
+5. **Accessibility**
+ - Screen reader support
+ - High contrast themes
+ - Keyboard navigation
+
+6. **Internationalization**
+ - Translation framework
+ - Localized date/time formats
+ - Multi-language support
+
+## Development Setup
+
+### Prerequisites
+
+- Node.js 18 or later
+- Git
+- A modern web browser
+
+### Local Development
+
+```bash
+# Clone your fork
+git clone https://github.com/YOUR_USERNAME/openhamclock.git
+cd openhamclock
+
+# Add upstream remote
+git remote add upstream https://github.com/k0cjh/openhamclock.git
+
+# Install dependencies
+npm install
+
+# Start development server
+npm run dev
+
+# In another terminal, run Electron (optional)
+npm run electron
+```
+
+### Project Structure
+
+```
+openhamclock/
+├── public/index.html # Main application (React + Leaflet)
+├── server.js # Express API proxy server
+├── electron/main.js # Desktop app wrapper
+├── scripts/ # Platform setup scripts
+└── package.json # Dependencies and scripts
+```
+
+### Making Changes
+
+1. Create a new branch from `main`:
+ ```bash
+ git checkout -b feature/your-feature-name
+ ```
+
+2. Make your changes
+
+3. Test thoroughly:
+ - Test in multiple browsers (Chrome, Firefox, Safari)
+ - Test on desktop and mobile viewports
+ - Test the Electron app if applicable
+ - Verify API proxy endpoints work
+
+4. Commit with clear messages:
+ ```bash
+ git commit -m "Add satellite tracking panel with TLE parser"
+ ```
+
+## Pull Request Process
+
+1. **Update documentation** if needed (README, inline comments)
+
+2. **Ensure your code follows style guidelines** (see below)
+
+3. **Test your changes** on multiple platforms if possible
+
+4. **Create the Pull Request**:
+ - Use a clear, descriptive title
+ - Reference any related issues (`Fixes #123`)
+ - Describe what changes you made and why
+ - Include screenshots for UI changes
+
+5. **Respond to feedback** - maintainers may request changes
+
+6. **Once approved**, a maintainer will merge your PR
+
+### PR Title Format
+
+Use conventional commit style:
+- `feat: Add satellite tracking panel`
+- `fix: Correct timezone calculation for DST`
+- `docs: Update Pi installation instructions`
+- `style: Improve mobile responsive layout`
+- `refactor: Simplify API proxy endpoints`
+
+## Style Guidelines
+
+### JavaScript
+
+- Use modern ES6+ syntax
+- Prefer `const` over `let`, avoid `var`
+- Use meaningful variable and function names
+- Add comments for complex logic
+- Keep functions focused and small
+
+### CSS
+
+- Use CSS custom properties (variables) for theming
+- Follow the existing naming conventions
+- Prefer flexbox/grid over floats
+- Test responsive breakpoints
+
+### React Components
+
+- Use functional components with hooks
+- Keep components focused on single responsibilities
+- Extract reusable logic into custom hooks
+- Use meaningful prop names
+
+### Git Commits
+
+- Write clear, concise commit messages
+- Use present tense ("Add feature" not "Added feature")
+- Reference issues when applicable
+
+## Recognition
+
+Contributors will be recognized in:
+- The README contributors section
+- Release notes for significant contributions
+- The project's GitHub contributors page
+
+## Questions?
+
+Feel free to:
+- Open a GitHub Discussion
+- Reach out to maintainers
+- Join the amateur radio community discussions
+
+---
+
+**73 and thanks for contributing to OpenHamClock!**
+
+*In memory of Elwood Downey, WB0OEW*
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000..ff2edf5
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,54 @@
+# OpenHamClock Dockerfile
+# Multi-stage build for optimized production image
+
+# ============================================
+# Stage 1: Build
+# ============================================
+FROM node:20-alpine AS builder
+
+WORKDIR /app
+
+# Copy package files
+COPY package*.json ./
+
+# Install dependencies (including dev for build)
+RUN npm ci --only=production
+
+# ============================================
+# Stage 2: Production
+# ============================================
+FROM node:20-alpine AS production
+
+# Set environment
+ENV NODE_ENV=production
+ENV PORT=3000
+
+# Create non-root user for security
+RUN addgroup -g 1001 -S nodejs && \
+ adduser -S openhamclock -u 1001
+
+WORKDIR /app
+
+# Copy node_modules from builder
+COPY --from=builder /app/node_modules ./node_modules
+
+# Copy application files
+COPY package*.json ./
+COPY server.js ./
+COPY public ./public
+
+# Set ownership
+RUN chown -R openhamclock:nodejs /app
+
+# Switch to non-root user
+USER openhamclock
+
+# Expose port
+EXPOSE 3000
+
+# Health check
+HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
+ CMD wget --no-verbose --tries=1 --spider http://localhost:3000/api/health || exit 1
+
+# Start server
+CMD ["node", "server.js"]
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..7830205
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,27 @@
+MIT License
+
+Copyright (c) 2024-2026 OpenHamClock Contributors
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+---
+
+This project is dedicated to the memory of Elwood Downey, WB0OEW, creator of
+the original HamClock. His contributions to the amateur radio community will
+never be forgotten. 73, OM.
diff --git a/README.md b/README.md
index 4d0dba5..8bdb8ed 100644
--- a/README.md
+++ b/README.md
@@ -1,242 +1,289 @@
-# OpenHamClock
+# 🌐 OpenHamClock
-**A modern, open-source amateur radio dashboard - spiritual successor to HamClock**
+
-*In memory of Elwood Downey, WB0OEW, creator of the original HamClock*
+
+[](LICENSE)
+[](https://nodejs.org/)
+[](CONTRIBUTING.md)
----
+**A modern, open-source amateur radio dashboard with real-time space weather, band conditions, DX cluster, and interactive world maps.**
-## Overview
+*In loving memory of Elwood Downey, WB0OEW, creator of the original HamClock*
-OpenHamClock is a web-based kiosk-style application that provides real-time space weather, radio propagation information, and other data useful to amateur radio operators. It's designed to run on any platform with a web browser, with special consideration for Raspberry Pi deployments.
+[**Live Demo**](https://openhamclock.up.railway.app) · [**Download**](#-installation) · [**Documentation**](#-features) · [**Contributing**](#-contributing)
-## Features
+
-### Current Features (v1.0.0)
+
-- **World Map with Day/Night Terminator**
- - Real-time gray line display
- - Sun position tracking
- - DE and DX location markers with path visualization
+---
-- **Time Displays**
- - UTC time (large, prominent display)
- - Local time with date
- - Uptime counter
+## 📡 About
-- **Location Information**
- - DE (your location) with Maidenhead grid square
- - DX (target location) with grid square
- - Short path and long path bearing
- - Distance calculation
- - Sunrise/sunset times for both locations
+OpenHamClock is a spiritual successor to the beloved HamClock application created by Elwood Downey, WB0OEW. After Elwood's passing and the announcement that HamClock will cease functioning in June 2026, the amateur radio community came together to create an open-source alternative that carries forward his vision.
-- **Space Weather Panel**
- - Solar Flux Index (SFI)
- - Sunspot Number
- - K-Index and A-Index
- - X-Ray flux
- - Overall conditions assessment
+### Why OpenHamClock?
-- **Band Conditions**
- - Visual display for all HF bands
- - Color-coded conditions (Good/Fair/Poor)
- - VHF band status
+- **Open Source**: MIT licensed, community-driven development
+- **Cross-Platform**: Runs on Windows, macOS, Linux, and Raspberry Pi
+- **Modern Stack**: Built with web technologies for easy customization
+- **Real Maps**: Actual satellite/terrain imagery, not approximations
+- **Live Data**: Real-time feeds from NOAA, POTA, SOTA, and DX clusters
+- **Self-Hosted**: Run locally or deploy to your own server
-- **DX Cluster Feed**
- - Live spot display (placeholder for API integration)
- - Frequency, callsign, comment, and time
+---
-- **POTA Activity**
- - Parks on the Air activator tracking
- - Reference, frequency, and mode display
+## ✨ Features
+
+### 🗺️ Interactive World Map
+- **8 map styles**: Dark, Satellite, Terrain, Streets, Topo, Ocean, NatGeo, Gray
+- **Real-time day/night terminator** (gray line)
+- **Great circle paths** between DE and DX
+- **Click anywhere** to set DX location
+- **POTA activators** displayed on map
+- **Zoom and pan** with full interactivity
+
+### 📊 Live Data Integration
+
+| Source | Data | Update Rate |
+|--------|------|-------------|
+| NOAA SWPC | Solar Flux, K-Index, Sunspots | 5 min |
+| POTA | Parks on the Air spots | 1 min |
+| SOTA | Summits on the Air spots | 1 min |
+| DX Cluster | Real-time DX spots | 30 sec |
+| HamQSL | Band conditions | 5 min |
+
+### 🕐 Station Information
+- **UTC and Local time** with date
+- **Maidenhead grid square** (6 character)
+- **Sunrise/Sunset times** for DE and DX
+- **Short path/Long path bearings**
+- **Great circle distance** calculation
+- **Space weather conditions** assessment
+
+### 📻 Band Conditions
+- Visual display for 160m through 70cm
+- Color-coded: Good (green), Fair (amber), Poor (red)
+- Based on real propagation data
-### Planned Features (Roadmap)
+---
-- [ ] Live API integration for space weather (NOAA, hamqsl.com)
-- [ ] Real DX cluster connectivity (Telnet/WebSocket)
-- [ ] Live POTA/SOTA API integration
-- [ ] Satellite tracking
-- [ ] VOACAP propagation predictions
-- [ ] Contest calendar integration
-- [ ] Hamlib/flrig radio control
-- [ ] Rotator control
-- [ ] Customizable panel layout
-- [ ] Multiple map projections
-- [ ] ADIF log file integration
-- [ ] RESTful API for external control
-- [ ] Touch screen support
-- [ ] Alarm/alert system
+## 🚀 Installation
-## Installation
+### Quick Start (Any Platform)
-### Option 1: Direct Browser Use
+```bash
+# Clone the repository
+git clone https://github.com/k0cjh/openhamclock.git
+cd openhamclock
-Simply open `index.html` in any modern web browser. No server required!
+# Install dependencies
+npm install
-```bash
-# Clone or download the files
-firefox index.html
-# or
-chromium-browser index.html
+# Start the server
+npm start
+
+# Open http://localhost:3000 in your browser
```
-### Option 2: Raspberry Pi Kiosk Mode
+### One-Line Install
-1. **Install Raspberry Pi OS** (Desktop version recommended)
+**Linux/macOS:**
+```bash
+curl -fsSL https://raw.githubusercontent.com/k0cjh/openhamclock/main/scripts/setup-linux.sh | bash
+```
-2. **Copy OpenHamClock files**
- ```bash
- mkdir ~/openhamclock
- cp index.html ~/openhamclock/
- ```
+**Windows (PowerShell as Admin):**
+```powershell
+Set-ExecutionPolicy Bypass -Scope Process -Force; iex ((New-Object System.Net.WebClient).DownloadString('https://raw.githubusercontent.com/k0cjh/openhamclock/main/scripts/setup-windows.ps1'))
+```
-3. **Run the setup script**
- ```bash
- chmod +x setup-pi.sh
- ./setup-pi.sh
- ```
+### 🍓 Raspberry Pi
-4. **Manual Kiosk Setup** (alternative)
- ```bash
- # Install unclutter to hide mouse cursor
- sudo apt-get install unclutter
+```bash
+# Download and run the Pi setup script
+curl -fsSL https://raw.githubusercontent.com/k0cjh/openhamclock/main/scripts/setup-pi.sh -o setup-pi.sh
+chmod +x setup-pi.sh
+
+# Standard installation
+./setup-pi.sh
- # Create autostart entry
- mkdir -p ~/.config/autostart
- cat > ~/.config/autostart/openhamclock.desktop << EOF
- [Desktop Entry]
- Type=Application
- Name=OpenHamClock
- Exec=chromium-browser --kiosk --noerrdialogs --disable-infobars --incognito file:///home/pi/openhamclock/index.html
- EOF
- ```
+# Or with kiosk mode (fullscreen, auto-start on boot)
+./setup-pi.sh --kiosk
+```
-### Option 3: Local Web Server
+**Supported Pi Models:**
+- Raspberry Pi 3B / 3B+ ✓
+- Raspberry Pi 4 (2GB+) ✓✓ (Recommended)
+- Raspberry Pi 5 ✓✓✓ (Best performance)
-For advanced features (future API integrations), run with a local server:
+### 🖥️ Desktop App (Electron)
```bash
-# Python 3
-cd openhamclock
-python3 -m http.server 8080
+# Development
+npm run electron
+
+# Build for your platform
+npm run electron:build
-# Then open http://localhost:8080
+# Build for specific platform
+npm run electron:build:win # Windows
+npm run electron:build:mac # macOS
+npm run electron:build:linux # Linux
```
-### Option 4: Electron Desktop App (Future)
+### 🐳 Docker
-Coming soon: Packaged desktop applications for Windows, macOS, and Linux.
+```bash
+# Build the image
+docker build -t openhamclock .
-## Configuration
+# Run the container
+docker run -p 3000:3000 openhamclock
-Edit the following values in `index.html` to customize:
+# Or use Docker Compose
+docker compose up -d
+```
-```javascript
-// Your callsign
-const [callsign, setCallsign] = useState('YOUR_CALL');
+### ☁️ Deploy to Railway
-// Your location (lat, lon)
-const [deLocation, setDeLocation] = useState({ lat: 39.7392, lon: -104.9903 });
+[](https://railway.app/template/openhamclock)
-// Default DX location
-const [dxLocation, setDxLocation] = useState({ lat: 35.6762, lon: 139.6503 });
-```
+Or manually:
+1. Fork this repository
+2. Create a new project on [Railway](https://railway.app)
+3. Connect your GitHub repository
+4. Deploy!
-### Future Configuration File
+---
-A separate `config.js` will be provided for easier configuration:
+## ⚙️ Configuration
+
+Edit your callsign and location in `public/index.html`:
```javascript
-// config.js (coming soon)
-export default {
- callsign: 'K0CJH',
- location: {
- lat: 39.7392,
- lon: -104.9903
- },
- theme: 'dark',
- panels: ['clock', 'map', 'weather', 'dx', 'bands'],
- // ... more options
+const CONFIG = {
+ callsign: 'YOUR_CALL',
+ location: { lat: YOUR_LAT, lon: YOUR_LON },
+ defaultDX: { lat: 35.6762, lon: 139.6503 },
+ // ...
};
```
-## Display Resolutions
+### Environment Variables
+
+| Variable | Default | Description |
+|----------|---------|-------------|
+| `PORT` | `3000` | Server port |
+| `NODE_ENV` | `development` | Environment mode |
+
+---
+
+## 🗺️ Map Styles
-OpenHamClock is responsive and works at various resolutions:
+| Style | Provider | Best For |
+|-------|----------|----------|
+| **Dark** | CartoDB | Night use, low-light shacks |
+| **Satellite** | ESRI | Terrain visualization |
+| **Terrain** | OpenTopoMap | SOTA operations |
+| **Streets** | OpenStreetMap | Urban navigation |
+| **Topo** | ESRI | Detailed terrain |
+| **Ocean** | ESRI | Maritime operations |
+| **NatGeo** | ESRI | Classic cartography |
+| **Gray** | ESRI | Minimal, distraction-free |
+
+---
+
+## 🛠️ Development
+
+```bash
+# Clone and setup
+git clone https://github.com/k0cjh/openhamclock.git
+cd openhamclock
+npm install
-| Resolution | Recommended Use |
-|------------|-----------------|
-| 800x480 | Small Pi displays, Inovato Quadra |
-| 1024x600 | 7" Pi touchscreens |
-| 1280x720 | HD ready monitors |
-| 1600x960 | Recommended for full features |
-| 1920x1080 | Full HD monitors |
-| 2560x1440 | Large displays, high detail |
+# Start development server
+npm run dev
-## API Data Sources (Planned)
+# Run Electron in dev mode
+npm run electron
+```
-| Data | Source | Status |
-|------|--------|--------|
-| Space Weather | NOAA SWPC | Planned |
-| Band Conditions | hamqsl.com | Planned |
-| DX Cluster | Various Telnet nodes | Planned |
-| POTA | pota.app API | Planned |
-| SOTA | sotawatch.org | Planned |
-| Satellites | N2YO, CelesTrak | Planned |
+### Project Structure
-## Technical Details
+```
+openhamclock/
+├── public/ # Static web files
+│ ├── index.html # Main application
+│ └── icons/ # App icons
+├── electron/ # Electron main process
+│ └── main.js # Desktop app entry
+├── scripts/ # Setup scripts
+│ ├── setup-pi.sh # Raspberry Pi setup
+│ ├── setup-linux.sh
+│ └── setup-windows.ps1
+├── server.js # Express server & API proxy
+├── Dockerfile # Container build
+├── railway.toml # Railway config
+└── package.json
+```
-### Architecture
+---
-- **Frontend**: React 18 (single-file, no build required)
-- **Styling**: CSS-in-JS with CSS variables for theming
-- **Maps**: SVG-based rendering (no external tiles)
-- **Data**: Currently static, API integration planned
+## 🤝 Contributing
-### Browser Support
+We welcome contributions from the amateur radio community! See [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines.
-- Chrome/Chromium 80+
-- Firefox 75+
-- Safari 13+
-- Edge 80+
+### Priority Areas
-### Dependencies
+1. **Satellite Tracking** - TLE parsing and pass predictions
+2. **Contest Calendar** - Integration with contest databases
+3. **Rotator Control** - Hamlib integration
+4. **Additional APIs** - QRZ, LoTW, ClubLog
+5. **Accessibility** - Screen reader support, high contrast modes
+6. **Translations** - Internationalization
-None! OpenHamClock loads React and Babel from CDN for simplicity.
+### How to Contribute
-For offline/airgapped deployments, download these files:
-- react.production.min.js
-- react-dom.production.min.js
-- babel.min.js
+1. Fork the repository
+2. Create a feature branch (`git checkout -b feature/amazing-feature`)
+3. Commit your changes (`git commit -m 'Add amazing feature'`)
+4. Push to the branch (`git push origin feature/amazing-feature`)
+5. Open a Pull Request
-## Contributing
+---
-Contributions are welcome! Areas where help is needed:
+## 📜 License
-1. **API Integrations** - Connect to live data sources
-2. **Satellite Tracking** - SGP4 propagator implementation
-3. **Map Improvements** - Better landmass rendering, additional projections
-4. **Testing** - Various Pi models and display sizes
-5. **Documentation** - User guides, translations
-6. **Design** - UI/UX improvements, accessibility
+This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
-## License
+---
-MIT License - Free for personal and commercial use.
+## 🙏 Acknowledgments
-## Acknowledgments
+- **Elwood Downey, WB0OEW** - Creator of the original HamClock. Your work inspired thousands of amateur radio operators worldwide. Rest in peace, OM. 🕊️
+- **Leaflet.js** - Outstanding open-source mapping library
+- **OpenStreetMap** - Community-driven map data
+- **ESRI** - Satellite and specialty map tiles
+- **NOAA Space Weather Prediction Center** - Space weather data
+- **Parks on the Air (POTA)** - Activator spot API
+- **Summits on the Air (SOTA)** - Summit spot API
+- **The Amateur Radio Community** - For keeping the spirit of experimentation alive
-- **Elwood Downey, WB0OEW** - Creator of the original HamClock. His work inspired thousands of amateur radio operators worldwide. Rest in peace, OM.
-- **Amateur Radio Community** - For continued innovation and the spirit of experimentation.
+---
-## Contact
+## 📞 Contact
-- **GitHub**: [https://github.com/accius/openhamclock.git](https://github.com/accius/openhamclock.git)
-- **Email**: chris@cjhlighting.com
+- **GitHub Issues**: [Report bugs or request features](https://github.com/k0cjh/openhamclock/issues)
+- **Discussions**: [Join the conversation](https://github.com/k0cjh/openhamclock/discussions)
---
-**73 de K0CJH**
+
+
+**73 de K0CJH and the OpenHamClock contributors!**
+
+*"The original HamClock will cease to function in June 2026. OpenHamClock carries forward Elwood's legacy with modern technology and open-source community development."*
-*"The original HamClock will cease to function in June 2026. OpenHamClock aims to carry on Elwood's legacy with a modern, open-source implementation that the community can maintain and improve together."*
+