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:
- the web app, which works on any phone or computer,
- the apps for iPhone, iPad, Android and Mac on the download page,
- and the forecast scoreboard, which needs nothing from you.
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.
The options
| Machine | Cost (roughly) | Always on? | Good for |
|---|---|---|---|
| A computer you already own | €0, plus a few € a month of power if it runs all day | Only while it is on | Trying it out |
| An old Android phone with Termux, kept plugged in | €0 | Yes, if it never sleeps | Tinkering |
| 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 electricity | Yes, 24/7 | best 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 full | Yes, 24/7 | Free and public |
| A cheap VPS (rented small server) | About €3–5 a month | Yes, 24/7 | The 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
- Python 3 (nothing else to install).
- 512 MB of memory and 1 GB of disk are plenty for the self-host package. If you also collect the SondeHub and NOAA feeds (what the hosted app does), plan for about 1 GB of memory (see Storage).
- A normal internet connection. It makes one small request a minute.
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
| File | What it is | Size |
|---|---|---|
station_store.json | the raw store the updater merges new readings into (about 16,300 readings after 3.5 years) | 2.8 MB |
data.json | the ground-level readings the app shows, rebuilt from the store | about 4 MB |
| Growth | about 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:
| File | What it is | Size |
|---|---|---|
station_store.json | the raw store: about 167,500 readings (16,300 live feed, 800 SondeHub, 150,400 NOAA) | 35 MB |
data.json | the ground-level readings the app shows (about 158,000 of them) | about 40 MB |
| Growth | about 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.
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
| Storage | Cost (roughly) | Notes |
|---|---|---|
| SD card (8–32 GB) for a Raspberry Pi | €5–10 | Enough 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–25 | Longer-lived than an SD card, if you want something sturdier. |
| Disk included with a VPS or free cloud tier | €0 extra | Usually 10–40 GB, which is far more than needed. |
| An old computer's own disk | €0 | Already 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:
| Question | Answer |
|---|---|
| HTTP data API port | Press Enter (8765) |
| WebSocket live-feed port | Press Enter (8766) |
| Max ground-level altitude filter | Press 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
| Way | Cost | Notes |
|---|---|---|
| Home network only | €0 | Open http://<machine-ip>:8765/ from any device on your Wi-Fi. |
| Cloudflare quick tunnel | €0 | cloudflared tunnel --url http://localhost:8765 gives a public https address. It changes every time the tunnel restarts. |
| Permanent tunnel with your own domain | about €10 a year for the domain | A fixed address that never changes. The tunnel itself is free. |
| A VPS with a public address | included in the VPS price | Open the port in its firewall and use the machine's address. |
The cheapest sensible plan
- 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.
- Run the four commands above and answer y to cron every minute.
- Add the two
@rebootlines. - Leave it on your home network, or add a free Cloudflare quick tunnel when you want to show it to someone.
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.