Groundcheck

Self-host Groundcheck for almost nothing

Groundcheck's server is one small Python program. No database, no Docker, no extra packages. It runs on nearly anything, so the real question is only: what is the cheapest machine you can leave switched on?

You probably shouldn't need this

Most people don't have to run anything. The hosted Groundcheck is free, and it already has the full history:

Self-hosting makes sense only if you want your own copy of the data, want it to keep working when someone else's server is down, want to build something on top of the data, or simply like running your own things. If none of that is you, close this page. You'll have lost nothing.

Why it must stay on. The weather-balloon source only hands out the latest reading of each balloon. Groundcheck builds its history by asking every minute, and it catches balloons just after launch or landing that way. A computer that sleeps or is switched off misses them. So "cheapest" really means "cheapest thing that is on all day".

The options

MachineCost (roughly)Always on?Good for
A computer you already own€0, plus a few € a month of power if it runs all dayOnly while it is onTrying it out
An old Android phone with Termux, kept plugged in€0Yes, if it never sleepsTinkering
A Raspberry Pi (any Pi from the 3 up; a Zero 2 W is enough)One-time €20–60, then about €2–5 a year of electricityYes, 24/7best long-term quiet, tiny, yours
A free cloud tier (for example Oracle Cloud "Always Free" or Google's e2-micro)€0, but they ask for a card and free capacity is sometimes fullYes, 24/7Free and public
A cheap VPS (rented small server)About €3–5 a monthYes, 24/7The easiest public setup

Prices are rough and change often. Check the current price before you buy. Any of these is already more than Groundcheck needs.

What it needs

Storage

Good news: the data takes little room. These are the real sizes from the running Groundcheck server. What you collect depends on which feeds you switch on.

The self-host package: the live feed, every minute

FileWhat it isSize
station_store.jsonthe raw store the updater merges new readings into (about 16,300 readings after 3.5 years)2.8 MB
data.jsonthe ground-level readings the app shows, rebuilt from the storeabout 4 MB
Growthabout 3 MB a year

In ten years that is about 30 MB. The package itself is tiny: the whole repository is a 1.7 MB download, the backend folder is 156 KB, and the installer script install.py is 2.8 KB.

The hosted Groundcheck: three feeds

The hosted app also collects SondeHub (worldwide balloons, every few hours) and NOAA's radiosonde archive (about 650 official stations in more than 100 countries, every night). That gives readings from every continent, and it is much more data:

FileWhat it isSize
station_store.jsonthe raw store: about 167,500 readings (16,300 live feed, 800 SondeHub, 150,400 NOAA)35 MB
data.jsonthe ground-level readings the app shows (about 158,000 of them)about 40 MB
Growthabout 60 MB a year

In ten years that is about 0.6 GB, still small for any SD card or disk. These two extra feeds are not part of the self-host package yet. They live in the main server's folder as update_sondehub.py and update_igra.py, and they are the reason the data files are so much bigger. The files compress very well: the 35 MB store packs into a 2.8 MB archive.

Logs are the real storage risk. On the live server the whole folder is 5.9 GB, and nearly all of it is log files: serve.log is 3.1 GB and ws_proxy.log 0.9 GB, because every single request gets a line. That would fill a small SD card within months. So answer n to "Enable logs?" in start.sh. If you want logs while testing, rotate them so they stay small. Put this in /etc/logrotate.d/groundcheck (change the folder):
/home/pi/groundcheck-main/backend/*.log {
    weekly
    rotate 4
    compress
    missingok
    notifempty
    copytruncate
}

Which storage to buy

StorageCost (roughly)Notes
SD card (8–32 GB) for a Raspberry Pi€5–10Enough for decades of data. SD cards wear out from constant writing, so keep logs off, and a "high endurance" card is the safer pick.
USB stick or small SSD on a Pi€5–25Longer-lived than an SD card, if you want something sturdier.
Disk included with a VPS or free cloud tier€0 extraUsually 10–40 GB, which is far more than needed.
An old computer's own disk€0Already there.

Back it up (one file)

All the history is in station_store.json. data.json is rebuilt from it, so you only need the store. Copy it somewhere safe now and then:

scp pi@your-machine:groundcheck-main/backend/station_store.json ~/groundcheck-backup/

To restore after a failure, put the file back in the backend folder before you start the server. With the live feed only it is about 3 MB; with all three feeds it is about 35 MB (2.8 MB if you compress it). Any free cloud drive, USB stick or spare computer can hold the backups.

Set it up (about five minutes)

On the machine you picked, in a terminal:

curl -L -o groundcheck.zip https://github.com/Luishae07/groundcheck/archive/refs/heads/main.zip
python3 -m zipfile -e groundcheck.zip .
cd groundcheck-main/backend
bash start.sh

The download is small (the whole repository is 1.7 MB). The second line unpacks it with Python itself, so you don't need unzip, tar or git. start.sh then asks a few questions. These answers give the cheapest, always-up-to-date setup:

QuestionAnswer
HTTP data API portPress Enter (8765)
WebSocket live-feed portPress Enter (8766)
Max ground-level altitude filterPress Enter (980)
Create data.json now?y, then choose how many days of history to fetch, for example 10
Set up automatic checks with cron?y
Check every minute?y
Also check once daily?y
Run in the background with nohup?y
Enable logs?n (see Storage: logs are what fill the disk)

Then open http://localhost:8765/ (or the machine's address from another device on your network). The cron job keeps adding new readings; the more days it runs, the fuller the history.

Keep it running after a restart

The cron job restarts the updates by itself. The web server also needs to start when the machine boots. Run crontab -e and add two lines (change the folder to where you unpacked it):

@reboot cd /home/pi/groundcheck-main/backend && nohup python3 serve.py >/dev/null 2>&1 &
@reboot cd /home/pi/groundcheck-main/backend && nohup python3 ws_proxy.py >/dev/null 2>&1 &

Reaching it from outside the house

WayCostNotes
Home network only€0Open http://<machine-ip>:8765/ from any device on your Wi-Fi.
Cloudflare quick tunnel€0cloudflared tunnel --url http://localhost:8765 gives a public https address. It changes every time the tunnel restarts.
Permanent tunnel with your own domainabout €10 a year for the domainA fixed address that never changes. The tunnel itself is free.
A VPS with a public addressincluded in the VPS priceOpen the port in its firewall and use the machine's address.

The cheapest sensible plan

  1. Use a Raspberry Pi you already have, or an old laptop, as the always-on machine. About €20–60 if you have to buy one.
  2. Run the four commands above and answer y to cron every minute.
  3. Add the two @reboot lines.
  4. Leave it on your home network, or add a free Cloudflare quick tunnel when you want to show it to someone.
Running cost afterwards: a few euros of electricity a year. If you don't want any hardware, a free cloud tier or a €3–5 a month VPS does the same job.

Questions

Does it cost anything per visit? No. It only serves one small data file, and there are no accounts or databases to pay for.

Can I run it on a phone? Yes, on Android with Termux. An iPhone app can run it only while the app is open on screen, so it's no good for a server.

I only want to see the data, not host it. You don't need any of this. The hosted Groundcheck app and the apps for iPhone, Android and desktop are free to use.

Is it safe to put on the internet? It only serves public weather-balloon readings and has no login. Keep Python and the machine updated, and prefer a tunnel over opening your router.