Predict on Linux — Complete Satellite Tracking Setup and Operating Guide
Predict is the most widely used open-source satellite tracking program for Linux. This complete guide covers installation on Ubuntu, Debian, and Raspberry Pi, loading and updating TLE data, tracking the ISS, amateur satellites, and weather satellites, using the live web interface, Doppler correction for radio operation, rotor control, headless server mode, and interpreting pass predictions.
- What is Predict and what can it do
- Installation on Ubuntu, Debian and Raspberry Pi
- Initial setup and ground station location
- TLE data — loading and updating satellite orbital elements
- Understanding the Predict interface
- Tracking satellites — ISS, OSCAR, weather sats
- Understanding pass predictions
- Operating guide — planning satellite contacts
- Doppler correction for radio operation
- Antenna rotor control
- Running Predict as a headless server
- Web interface setup
- Integration with GQRX and Gpredict
- Troubleshooting common problems
- Frequently asked questions
Live satellite tracker
Predict is running on this server with a live web interface showing real-time satellite positions, upcoming passes over our ground station, and current tracking data for the ISS and major amateur satellites.
Predict — Live Satellite Tracker
Real-time satellite tracking and pass predictions from the HamRadioBase server
What is Predict and what can it do
Predict is an open-source satellite tracking and orbital prediction program for Linux written by John Magliacane KD2BD. It uses the SGP4/SDP4 orbital models and Two-Line Element (TLE) data to calculate the current and future positions of satellites in real time, providing the information needed to point an antenna and tune a radio for satellite operation.
Despite its age — Predict has been available since the 1990s — it remains widely used because it is lightweight, reliable, works excellently in headless server mode, and provides a simple network socket API that other applications (GQRX, Hamlib-based rotators, custom scripts) can query for real-time tracking data.
What Predict can do
- Real-time satellite tracking — shows current azimuth, elevation, range, and Doppler for any satellite
- Pass predictions — calculates upcoming visible passes from your ground station with start/end times and maximum elevation
- Multi-satellite display — track multiple satellites simultaneously in a live overview
- Doppler shift calculation — provides real-time uplink and downlink Doppler correction values
- Antenna rotor control — sends azimuth and elevation data to antenna rotors via serial port
- Network server mode — runs headlessly providing tracking data to other applications via UDP
- Web interface — browser-based tracking display accessible from any device on the network
- Grayline map — visual display showing satellite ground tracks and the day/night terminator
Installation on Ubuntu, Debian and Raspberry Pi
Ubuntu 22.04, 24.04 and Debian 11, 12
sudo apt update
sudo apt install predict
Build from source (latest version)
sudo apt install git build-essential libncurses5-dev
git clone https://github.com/kd2bd/predict.git
cd predict
make
sudo make install
Raspberry Pi OS
sudo apt update
sudo apt install predict
Predict runs excellently on all Raspberry Pi models including the Zero W. It is extremely lightweight — the entire application uses under 5 MB of RAM. A Pi Zero running Predict as a headless server alongside Direwolf gives you a complete satellite monitoring station for under $20 in hardware.
Verify installation
predict -v
Initial setup and ground station location
Predict needs your ground station location to calculate accurate pass times and satellite positions. Enter it on first launch or by editing the configuration file directly.
First launch setup
- Launch Predict:
predict - On first run Predict prompts for your ground station details
- Enter your callsign, latitude (positive = North), longitude (positive = East), and altitude in metres
- Predict saves these to
~/.predict/predict.qth
Manual configuration
# Ground station configuration
# Line 1: Callsign
N0CALL
# Line 2: Latitude in decimal degrees (positive = North)
51.5074
# Line 3: Longitude in decimal degrees (negative = West)
-0.1278
# Line 4: Altitude in metres
15
Finding your coordinates
Your latitude and longitude can be found from:
- Google Maps — right-click any location and select the coordinates shown
- Your GPS receiver or phone GPS
- Maidenhead grid square converters — useful if you know your grid square
- USGS topographic maps for precise altitude
TLE data — loading and updating satellite orbital elements
Two-Line Element sets (TLEs) are the data that describe a satellite's orbit — position, velocity, inclination, and other parameters. Predict uses TLE data to calculate where each satellite is and will be. TLEs become less accurate over time as satellites experience atmospheric drag and orbital adjustments — update them at least weekly for accurate predictions.
TLE data sources
| Source | URL | Contents |
|---|---|---|
| CelesTrak | celestrak.org/SOCRATES/ | All categories including amateur sats |
| CelesTrak amateur | celestrak.org/NORAD/elements/amateur.txt | Amateur radio satellites only |
| CelesTrak stations | celestrak.org/NORAD/elements/stations.txt | ISS and crewed spacecraft |
| CelesTrak weather | celestrak.org/NORAD/elements/weather.txt | NOAA and weather satellites |
| AMSAT | amsat.org/tle/ | Amateur satellites — often more current |
| Space-Track | space-track.org | Complete catalog — requires free registration |
Downloading TLE data
# Create TLE directory
mkdir -p ~/.predict
# Download ISS TLE
wget -O ~/.predict/stations.txt \
https://celestrak.org/NORAD/elements/stations.txt
# Download amateur satellite TLEs
wget -O ~/.predict/amateur.txt \
https://celestrak.org/NORAD/elements/amateur.txt
# Download weather satellite TLEs
wget -O ~/.predict/weather.txt \
https://celestrak.org/NORAD/elements/weather.txt
Automated TLE updates with cron
# Run "crontab -e" and add these lines:
# Update TLEs daily at 6am
0 6 * * * wget -q -O ~/.predict/amateur.txt https://celestrak.org/NORAD/elements/amateur.txt
0 6 * * * wget -q -O ~/.predict/stations.txt https://celestrak.org/NORAD/elements/stations.txt
0 6 * * * wget -q -O ~/.predict/weather.txt https://celestrak.org/NORAD/elements/weather.txt
Loading TLEs into Predict
Launch Predict with the TLE file as an argument, or use the database editor within the application:
# Launch with specific TLE file
predict -t ~/.predict/amateur.txt
# Or within Predict press 'E' to open the satellite database editor
# and import a TLE file from there
How many satellites can Predict track
Predict supports up to 24 satellites in its database simultaneously. This is enough for the key amateur satellites, the ISS, and a few weather satellites. Create multiple TLE files for different use cases — one for amateur operation, one for weather satellite reception — and launch Predict with the appropriate file for each session.
Understanding the Predict interface
Predict runs in a terminal using ncurses. The interface is text-based but clearly organised once you know what each element means.
Main menu options
| Key | Function |
|---|---|
| T | Track a single satellite in real time |
| M | Multi-satellite tracking display — all loaded satellites at once |
| P | Predict upcoming passes for a satellite |
| V | Show visible passes only (elevation above horizon) |
| E | Edit the satellite database — add, remove, update TLEs |
| G | Edit ground station location |
| S | Solar and lunar tracking |
| Q | Quit |
Real-time satellite tracking display
When tracking a satellite (T menu) Predict shows:
- Azimuth — compass bearing to the satellite in degrees (0=North, 90=East, 180=South, 270=West)
- Elevation — angle above the horizon in degrees (0=horizon, 90=directly overhead)
- Range — distance to the satellite in kilometres
- Range rate — rate of change of range in km/s — positive = moving away, negative = approaching
- Doppler shift — frequency shift at 100 MHz reference — scale for your actual frequency
- Orbital phase — position within the current orbit (0–360 degrees)
- Footprint — diameter of the satellite's coverage circle on Earth's surface
- Sunlit/eclipse — whether the satellite is in sunlight or Earth's shadow
Tracking satellites — ISS, OSCAR, weather sats
Tracking the ISS
The International Space Station (ISS, NORAD ID 25544) is the most tracked object in low Earth orbit. It completes an orbit every 92 minutes and is visible to the naked eye from most locations. For amateur radio the ISS carries a VHF FM transponder on 145.800 MHz downlink and an APRS digipeater on 145.825 MHz.
- Load the stations.txt TLE file which includes the ISS
- Press T to select tracking, choose ISS from the list
- Predict shows the current ISS position and counts down to the next pass
- When elevation goes above 0 degrees the ISS has risen above your horizon
Amateur OSCAR satellites
Amateur OSCAR satellites are the workhorses of satellite operating. Key satellites to add to your Predict database:
| Satellite | NORAD ID | Mode | Downlink |
|---|---|---|---|
| AO-91 (RadFxSat) | 43017 | FM | 145.960 MHz |
| AO-92 (Fox-1D) | 43137 | FM | 145.880 MHz |
| SO-50 (SaudiSat-1C) | 27607 | FM | 436.795 MHz |
| IO-117 (IARU 1) | — | FM | 145.900 MHz |
| AO-7 (Phase 2) | 7530 | Linear (SSB/CW) | 29.500 MHz / 145.975 MHz |
| FO-29 (Fuji-OSCAR 29) | 24278 | Linear (SSB/CW) | 435.800 MHz |
| XW-2A through XW-2F | Various | Linear (SSB/CW) | 435 MHz range |
| ISS | 25544 | FM voice + APRS | 145.800 / 145.825 MHz |
Weather satellite passes
NOAA weather satellites transmit APT (Automatic Picture Transmission) image data on 137 MHz. Three satellites are active at any time — NOAA-15, NOAA-18, and NOAA-19. Each passes several times daily and Predict calculates all passes allowing you to schedule reception sessions. High elevation passes give better image quality and longer receive windows.
# APT downlink frequencies
NOAA-15: 137.620 MHz
NOAA-18: 137.912 MHz
NOAA-19: 137.100 MHz
Understanding pass predictions
The pass prediction display (P key) shows a table of upcoming passes. Understanding each column helps you select the best passes for your operating goals.
Pass prediction columns
| Column | Description | What to look for |
|---|---|---|
| AOS time | Acquisition of Signal — when satellite rises above horizon | Plan to be ready 2 min early |
| Max El | Maximum elevation in degrees during the pass | Higher is better — 40°+ gives strong signals |
| AOS Az | Azimuth at AOS — compass direction of rise | Know which direction to point antenna initially |
| Max El Az | Azimuth at maximum elevation | Point antenna here for strongest signal |
| LOS Az | Azimuth at Loss of Signal — compass direction of set | Know which way satellite is moving |
| LOS time | Loss of Signal — when satellite drops below horizon | Pass duration = LOS - AOS |
| Duration | Total pass length in minutes:seconds | Longer = more operating time |
| Orbit | Orbit number at AOS | Reference for logs |
Selecting good passes for operating
- Maximum elevation above 20° — minimum for usable FM satellite contacts with a handheld yagi
- Maximum elevation above 40° — good pass, suitable for omnidirectional antennas
- Maximum elevation above 70° — excellent pass, overhead trajectory, long duration
- Pass duration — a 10-minute overhead pass gives much more operating time than a 3-minute low horizon pass
- Time of day — for ISS voice contacts consider when operators are likely active on the other end
Printing a pass schedule
# Generate 24 hours of passes for AO-91 (NORAD 43017)
predict -p 43017 > ao91_passes.txt
# View the output
cat ao91_passes.txt
Operating guide — planning satellite contacts
FM satellite operating — AO-91 and SO-50
FM amateur satellites are the easiest to work. The procedure is straightforward:
- Use Predict to find a pass with maximum elevation above 20 degrees
- Note the AOS time, maximum elevation, and AOS/LOS azimuths
- Set your radio to the satellite's uplink frequency before the pass begins
- As elevation increases listen on the downlink for activity
- Call CQ on the uplink when the satellite is above 10 degrees elevation
- Track the satellite's azimuth manually or with a rotor throughout the pass
- Pass ends when signal fades as elevation drops toward the horizon
FM satellite frequencies quick reference
| Satellite | Uplink | Downlink | Tone |
|---|---|---|---|
| AO-91 | 435.250 MHz FM | 145.960 MHz FM | 67.0 Hz CTCSS |
| AO-92 | 435.350 MHz FM | 145.880 MHz FM | 67.0 Hz CTCSS |
| SO-50 | 145.850 MHz FM | 436.795 MHz FM | 67.0 Hz CTCSS (arming: 74.4 Hz) |
Preparing for a pass
Good preparation makes satellite contacts much more successful:
- Print or screenshot the pass prediction with AOS time and azimuth positions
- Program uplink and downlink frequencies into your radio ahead of time
- Know which direction the satellite rises (AOS azimuth) and sets (LOS azimuth)
- For FM satellites activate the transponder with the arming tone a minute before AOS
- Be on frequency and listening 2 minutes before AOS — signals appear earlier than predicted on high passes
Linear transponder operating — SSB/CW
Linear transponder satellites like AO-7 and FO-29 are more challenging but allow SSB and CW contacts with distant stations — the satellite's transponder relays a range of frequencies, enabling multiple simultaneous QSOs. You need a full-duplex capability (hearing your own downlink while transmitting the uplink) and must apply manual Doppler correction as the satellite moves.
- Use Predict to identify the pass and note the Doppler shift values at AOS, max elevation, and LOS
- Set uplink frequency accounting for Doppler — at AOS you transmit higher than the center frequency
- Listen on the downlink and find your own signal
- Adjust uplink frequency to keep your downlink signal at the correct position in the passband
- The Doppler correction required changes continuously throughout the pass
Doppler correction for radio operation
Satellites in low Earth orbit move at about 7.5 km/s relative to the ground. This velocity causes the received frequency to shift due to the Doppler effect — higher when the satellite is approaching, lower when receding. For a 145 MHz downlink the total Doppler shift across a pass is about ±3.4 kHz.
Doppler shift values at key pass points
| Pass point | Satellite motion | Doppler effect | Correction needed |
|---|---|---|---|
| AOS (rising) | Approaching | Freq higher than nominal | Tune radio lower than nominal |
| Maximum elevation | Crossing overhead | Near zero Doppler | Use nominal frequency |
| LOS (setting) | Receding | Freq lower than nominal | Tune radio higher than nominal |
Reading Doppler data from Predict
Predict's real-time tracking display shows the range rate (km/s) which you can use to calculate Doppler shift:
# Doppler shift formula:
# Shift (Hz) = -range_rate_km_s * frequency_Hz / speed_of_light_km_s
# Speed of light = 299792 km/s
# Example: ISS approaching at -7.0 km/s, 145.800 MHz downlink
# Shift = -(-7.0) * 145800000 / 299792
# Shift = +3414 Hz ≈ +3.4 kHz
# So at AOS the received signal is about 3.4 kHz ABOVE nominal
# Tune your receiver to 145.803 MHz to receive 145.800 MHz
Automatic Doppler correction
Manual Doppler correction is manageable for FM satellites where the deviation is within the FM bandwidth. For SSB and CW linear transponders the correction is essential and must be continuous. Automate it using:
- Gpredict + GQRX — Gpredict reads Predict data and automatically adjusts GQRX's receive frequency every second
- Gpredict + Hamlib radio control — Gpredict directly tunes your transceiver via Hamlib for both uplink and downlink correction
- Custom Python script — query Predict's UDP socket for range rate and calculate/apply correction programmatically
Antenna rotor control
Predict can send azimuth and elevation data to an antenna rotor controller, automatically pointing your antenna at the satellite throughout a pass.
Enabling rotor control
Configure rotor control in ~/.predict/predict.qth or via the application settings. Predict supports several rotor control protocols:
# Predict sends AZ/EL data to rotctld (Hamlib rotor daemon)
# Start rotctld for your rotor controller first:
rotctld -m [model] -r /dev/ttyUSB0 -s 9600
# Then start Predict with rotor control enabled
predict -a localhost:4533
Hamlib rotor models for common controllers
| Controller | Hamlib model | Notes |
|---|---|---|
| Yaesu GS-232A/B | 601 | Most common commercial AZ/EL controller |
| Easycomm II | 202 | Popular open-source rotor protocol |
| SARos | 204 | SARos satellite antenna rotor system |
| SPID RAS | 901 | SPID azimuth/elevation rotor |
| DIY Arduino rotor | 202 (Easycomm) | Most DIY rotors implement Easycomm |
Running Predict as a headless server
Predict's most powerful feature for server deployments is its network socket API. Running in server mode, Predict listens on UDP port 1210 and responds to queries for real-time satellite tracking data. Any application can request current azimuth, elevation, Doppler shift, and pass predictions by sending simple text commands to this port.
Starting Predict in server mode
# Start Predict server on default port 1210
predict -s
# Start on a specific port
predict -s -p 1210
# Start with specific TLE file
predict -s -t ~/.predict/amateur.txt
Systemd service for automatic startup
[Unit]
Description=Predict Satellite Tracking Server
After=network.target
[Service]
User=hamradiobase
ExecStart=/usr/bin/predict -s -t /home/hamradiobase/.predict/amateur.txt
Restart=on-failure
RestartSec=10
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable predict
sudo systemctl start predict
sudo systemctl status predict
Querying the Predict server from scripts
import socket
def get_satellite_data(sat_name, host='localhost', port=1210):
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.settimeout(5)
# Request current data for satellite by name
request = f'GET_SAT {sat_name}
'.encode()
sock.sendto(request, (host, port))
response, _ = sock.recvfrom(1024)
sock.close()
return response.decode().strip()
# Get current ISS data
data = get_satellite_data('ISS')
print(data)
# Returns: name, lat, lon, az, el, range, range_rate, footprint, altitude...
# Get next pass for AO-91
pass_data = get_satellite_data('AO-91')
print(pass_data)
Web interface setup
Predict includes a web interface that displays live tracking data and pass predictions in a browser. Set it up alongside the server mode for browser-based satellite tracking accessible from any device on the network.
Installing the web interface
# The web interface files are included with Predict
# Copy them to your web server document root
cp -r /usr/share/predict/web/* /home/hamradiobase/htdocs/www.hamradiobase.com/ham-tools/predict/
# Or install a lightweight web server specifically for Predict
sudo apt install lighttpd
nginx configuration for the Predict web interface
# Serve Predict web interface at /ham-tools/predict/
location /ham-tools/predict/ {
alias /home/hamradiobase/htdocs/www.hamradiobase.com/ham-tools/predict/;
index index.html;
}
Integration with GQRX and Gpredict
Gpredict — graphical satellite tracker with Doppler correction
Gpredict is a modern graphical satellite tracking application that can read TLE data and provide automatic Doppler correction to GQRX and Hamlib-controlled radios. It serves a similar purpose to Predict but with a graphical interface and tighter integration with radio control software.
sudo apt install gpredict
Gpredict connects to GQRX's remote control port (7356) and automatically adjusts the receive frequency for Doppler shift as a satellite moves. This makes SSB and CW satellite operating much easier — you focus on operating while Gpredict handles the frequency tracking.
Choosing between Predict and Gpredict
| Feature | Predict | Gpredict |
|---|---|---|
| Interface | Terminal (ncurses) | Graphical (GTK) |
| Server mode | Yes — UDP socket API | No |
| Headless operation | Excellent | Not supported |
| GQRX Doppler correction | Via Gpredict bridge | Native direct connection |
| Radio control (Hamlib) | Via rotctld | Direct Hamlib integration |
| Resource usage | Minimal | Moderate |
| Raspberry Pi | Excellent — Pi Zero capable | Good — Pi 4 recommended |
| Web interface | Basic built-in | No |
For a permanent server deployment use Predict — it is lightweight and its UDP API makes it easy to integrate with other services. For desktop use with GQRX and automatic Doppler correction use Gpredict. Many stations run Predict as a background service and Gpredict as the desktop interface — Gpredict can use Predict's data through its network connection.
Troubleshooting common problems
Pass predictions seem wrong — satellite not where expected
- Update your TLE data — outdated TLEs give increasingly inaccurate predictions. Download fresh TLEs and reload them
- Verify your ground station coordinates are correct — even a few kilometres error affects pass times
- Check your system clock is accurate — Predict uses the system clock for all calculations. Install chrony:
sudo apt install chrony - Verify you are tracking the correct satellite — many have similar names. Use the NORAD ID to confirm
Predict won't start — configuration error
- Check the
~/.predict/predict.qthfile exists and has the correct format - Verify latitude and longitude values are in decimal degrees, not degrees/minutes/seconds
- Check altitude is in metres, not feet
- Run
predictfrom a terminal to see any error messages
Server mode not responding to queries
- Verify Predict is running in server mode:
ps aux | grep predict - Check the port is open:
netstat -lnu | grep 1210 - Check firewall rules:
sudo ufw allow 1210/udp - Test with netcat:
echo "GET_SAT ISS" | nc -u localhost 1210
No signal from satellite at predicted pass time
- Outdated TLEs are the most common cause — update and recalculate
- Check the satellite is actually active — some amateur satellites have failed or have limited operational schedules
- Low elevation passes give very weak signals near the horizon — aim for passes above 20 degrees
- Check antenna orientation — verify you are pointing in the correct azimuth direction
- For FM satellites check that the access tone (CTCSS) is set correctly on your uplink
Frequently asked questions
How often should I update TLE data?
For accurate pass predictions update TLEs at least weekly — daily is better for active satellite operating. TLEs become less accurate as time passes because atmospheric drag gradually changes satellite orbits. A week-old TLE may show pass times that are off by a minute or more, and after a month the error can be significant enough to miss a pass entirely. Set up a daily cron job to download fresh TLEs automatically.
What equipment do I need to work amateur satellites?
For FM satellites like AO-91 the minimum is a dual-band handheld radio (VHF/UHF) and a handheld yagi antenna. A 2-element yagi on each band is adequate for passes above 20 degrees. For linear transponder satellites like AO-7 you need a full-duplex radio capable of simultaneous VHF receive and UHF transmit (or vice versa), plus the ability to apply continuous Doppler correction. Serious satellite operators use computer-controlled azimuth/elevation antenna rotors, but many operators successfully work FM satellites with a handheld yagi tracked manually.
What is a TLE and where does the data come from?
A Two-Line Element set (TLE) is a standardized format for describing a satellite's orbit using two lines of 69 characters each. The data comes from radar and optical tracking observations — primarily from the US Space Surveillance Network operated by the US Space Force. CelesTrak and Space-Track distribute this data publicly. For amateur satellites AMSAT also maintains TLE data that may be more current than the general Space-Track catalog for newly launched amateur payloads.
Can I see the ISS with the naked eye?
Yes — the ISS is one of the brightest objects in the night sky, reaching magnitude -4 on good passes. It looks like a fast-moving, steady white light (not blinking like an aircraft). It is visible for 2–10 minutes depending on the pass elevation. Use Predict to find when the ISS passes over your location — look for the time, direction of appearance (AOS azimuth), and maximum elevation. High passes directly overhead give the longest and most dramatic views.
What is the difference between Predict and Gpredict?
Predict is a lightweight terminal application that excels in server mode — it runs headlessly on a Raspberry Pi or server and provides tracking data to other applications via a UDP socket API. Gpredict is a modern graphical application with built-in radio control and automatic Doppler correction for GQRX. Both use the same SGP4/SDP4 orbital models and TLE data. Use Predict for server deployments and headless operation; use Gpredict for desktop satellite operating with automatic frequency tracking.
How do I know if an amateur satellite is currently active?
Check the AMSAT website (amsat.org) for the latest status of amateur satellites. AMSAT maintains an active list of operational satellites, their frequencies, and any operational notes. Some satellites like AO-7 have been in orbit for decades but have limited operational windows. Others have failed or been decommissioned. The AMSAT-NA Satellite Status page is the most reliable source for current operational status before attempting to work a specific satellite.
Can Predict track the ISS SSTV transmissions?
Predict tracks the ISS as a satellite and tells you when it is above your horizon — which is exactly what you need to receive ISS SSTV transmissions. Load the ISS TLE from the stations.txt file, run the pass prediction, and use the AOS time to know when to start listening on 145.800 MHz FM with QSSTV. ISS SSTV transmissions happen during specific events announced by ARISS — use Predict to find passes during those event windows for the best reception opportunities.