Live satellite tracking over Earth with a 3D globe, place lookup, above-horizon filtering, orbital perspective, and lightweight satellite enrichment.
- tracks live satellites from TLE feeds on an interactive globe
- lets you search for a place or jump directly to a NORAD CAT ID
- shows satellites above the horizon for a selected place
- provides a focused orbital perspective panel
- enriches satellites with catalog, SatNOGS, and optional Space-Track metadata
- caches satellite and intel payloads client-side for faster reloads
- CelesTrak TLE and SATCAT
- SatNOGS TLE and satellite metadata
- optional Space-Track SATCAT fallback
- Nominatim (OpenStreetMap) reverse geocoding and search
- Open-Meteo geocoding
- BigDataCloud reverse geocoding
- World Bank population data
- Wikidata and Wikipedia-derived reference content
Build and run the Go server:
go run .The app listens on http://localhost:8000 by default (PORT to override).
Useful environment variables:
PORTSATELLITECHUM_MAX_SATELLITESSATELLITECHUM_TLE_TIMEOUTSATELLITECHUM_SATCAT_TIMEOUT
Optional Space-Track credentials:
SPACE_TRACK_IDENTITYorSPACE_TRACK_USERNAMESPACE_TRACK_PASSWORD
The app also supports existing .env keys st-user and st-pass.
Set these before exposing the app publicly:
SATELLITECHUM_ENV=productionSECRET_KEY=<strong random value>SESSION_COOKIE_SECURE=trueTRUSTED_HOSTS=<comma-separated hostnames>
Production hardening already included:
- secure session cookie defaults
ProxyFixsupport for reverse-proxy deployments- strict same-origin CSP for scripts, styles, fonts, and browser fetches
- app-side rate limiting on public API routes
- static Go binary in a distroless/static nonroot container
- read-only container filesystem and dropped Linux capabilities in Compose
Build and run locally with Compose:
cp .env.example .env
docker compose up --buildThe Compose stack includes:
redis: ephemeral Redis instance for shared rate-limit stateapp: static Go binary serving the app on the internal networktunnel:cloudflaredsidecar for internet exposure without binding a public host port
Fill in TUNNEL_TOKEN in .env before using the tunnel.
This repo includes a deploy job shaped after the uavchum project:
- playbook:
deploy/deploy.yml - server bootstrap:
deploy/setup.sh - systemd unit:
deploy/satellite-chum.service
Typical flow:
ansible-playbook -i deploy/inventory.ini deploy/deploy.ymlThe playbook archives the repo, uploads it to the target host, extracts it into the app directory, and rebuilds the Podman Compose stack.
*.go: Go server, API routes, TLE pipeline, rate limiting, Turnstiletemplates/index.html: main UI shellstatic/app.js: globe UI, polling, caching, controlsstatic/style.css: app styling and theme variantscompose.yml: production-style local stackDockerfile: app container image
Basic checks used during development:
go build ./...
go test ./...
node --check static/app.jsApp can be seen live at satchum.hehaw.net