{"id":50885929,"url":"https://github.com/kbennett2000/airfield-wx","last_synced_at":"2026-06-15T17:01:34.734Z","repository":{"id":361863366,"uuid":"1256177753","full_name":"kbennett2000/airfield-wx","owner":"kbennett2000","description":null,"archived":false,"fork":false,"pushed_at":"2026-06-01T16:03:49.000Z","size":620,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-01T16:26:12.901Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/kbennett2000.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-06-01T14:32:26.000Z","updated_at":"2026-06-01T16:18:10.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/kbennett2000/airfield-wx","commit_stats":null,"previous_names":["kbennett2000/airfield-wx"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/kbennett2000/airfield-wx","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kbennett2000%2Fairfield-wx","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kbennett2000%2Fairfield-wx/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kbennett2000%2Fairfield-wx/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kbennett2000%2Fairfield-wx/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/kbennett2000","download_url":"https://codeload.github.com/kbennett2000/airfield-wx/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kbennett2000%2Fairfield-wx/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34372130,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-15T02:00:07.085Z","response_time":63,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-06-15T17:01:33.748Z","updated_at":"2026-06-15T17:01:34.728Z","avatar_url":"https://github.com/kbennett2000.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"![airfield-wx — a self-hosted weather station for your own airstrip](docs/assets/banner.png)\n\n# airfield-wx\n\nA self-hosted weather station for **your own airstrip**: build a small sensor, run a little server on\nyour home network, and get a cockpit-style readout of the conditions at *your* field — density\naltitude, wind and the favored runway, altimeter setting, and (when you have internet) the nearest\nMETAR.\n\n\u003e ## ⚠ UNOFFICIAL — NOT FOR FLIGHT PLANNING\n\u003e airfield-wx is backyard sensor data plus nearby public reports. It is **not** a substitute for an\n\u003e official preflight briefing or current METAR/TAF, and it performs **no go/no-go automation**. You are\n\u003e the pilot in command. Observations only — no forecasting.\n\n## Is this for you?\n\nIf you fly out of — or just love — a strip that has no weather station of its own, this gives you a\nlive picture of the air over your field:\n\n- **Density altitude**, the number that decides how your airplane will actually perform today.\n- **Your own wind**, turned into a **runway solution** — which end is favored, and the headwind and\n  crosswind on it.\n- **Altimeter setting (QNH)** and temperature/dewpoint, measured at your field.\n- The **nearest airport, its runways, and magnetic variation**, found automatically from GPS — no typing\n  in coordinates, and it works with no internet.\n\nYou don't need to be a programmer. There's a **demo you can try in five minutes** (below) before you buy\na single part. New to the terminal or to any of the aviation terms? The\n[install guide](docs/guide/install.md) walks you through it gently, and the\n[glossary](docs/guide/glossary.md) explains every term in plain language.\n\n## What it looks like\n\n### ▶ Try the live demo — **[airfield-wx-demo.vercel.app](https://airfield-wx-demo.vercel.app)**\n\nClick through the dashboard in your browser, no setup required. It's **simulated data for a fictional\nfield** (\"DEMO / Example Field\") — nothing live or measured — with a scenario switcher for a clear (VFR)\nday, a marginal (MVFR) day, and the feed-offline state. Like the product, it's **UNOFFICIAL — not for\nflight planning.**\n\n![The airfield-wx dashboard, online — density altitude, wind and favored runway, altimeter, and a METAR panel](docs/assets/screenshots/dashboard-online.png)\n\n*The dashboard reads like a panel instrument. Cyan numbers are measured at your field; violet is\ninternet-sourced (the METAR). [Full dashboard tour →](docs/guide/dashboard.md)*\n\n**On your phone** — where you'll actually use it, at the hangar or run-up — the panels stack into a\nsingle readable column. The offline behavior is even clearer here: the violet METAR panel dims to\n\"NO FEED\" while every cyan local panel stays bright and live.\n\n\u003cp\u003e\n  \u003cimg src=\"docs/assets/screenshots/mobile-online.png\" alt=\"airfield-wx on a phone, online\" width=\"270\"\u003e\n  \u0026nbsp;\u0026nbsp;\n  \u003cimg src=\"docs/assets/screenshots/mobile-offline.png\" alt=\"airfield-wx on a phone with the feed offline — the METAR panel dims, local panels stay live\" width=\"270\"\u003e\n\u003c/p\u003e\n\n## What you'll need\n\n| | |\n|---|---|\n| **A small sensor** | An **ESP32** board + a **BME280** (temp/humidity/pressure) + a **GPS** module + an **anemometer** (wind). Wires onto a perfboard; no soldering wizardry required. |\n| **A computer to run the server** | A **Raspberry Pi Zero 2 W** is plenty — or any Ubuntu/Debian box, or even your laptop to start. It lives on your home network; no cloud, no accounts. |\n| **Rough cost** | About **$100–250** of parts, mostly depending on the anemometer (a budget SparkFun kit vs. a rugged Davis 6410). |\n| **Rough effort** | An afternoon to wire and flash the sensor; the server is a handful of copy-paste commands. |\n\nFull parts list, wiring, pinout, and the one calibration step are in the\n**[hardware \u0026 build guide](docs/guide/hardware.md)**.\n\n## Try it in 5 minutes (no hardware)\n\n```bash\ngit clone https://github.com/kbennett2000/airfield-wx.git\ncd airfield-wx\nmake install        # creates the server's environment and installs it\nmake dev            # starts the server in demo mode on port 8005\n```\n\nThen open **\u003chttp://localhost:8005/dashboard/\u003e**. It comes up with realistic sample data so you can\nexplore the whole instrument before any sensor exists. When you're ready for real readings, edit\n`server/weather.toml` (comment out the `[development]` block and set your sensor's address) — the\n**[install \u0026 configuration guide](docs/guide/install.md)** walks through every step, terminal and all.\n\n(For a permanent, runs-at-boot install with a systemd service + firewall: `sudo ./install.sh` — see the\ninstall guide.)\n\n## Why it keeps working when the internet doesn't\n\n![The same dashboard offline — the violet METAR panel dims to \"NO FEED\" while the cyan local panels stay bright and live](docs/assets/screenshots/dashboard-offline.png)\n\nYour field's own readings never depend on a network. If the internet feed drops, **only the violet\n(internet-sourced) METAR panel dims** — every **cyan** local panel (density altitude, altimeter, wind,\nthe runway solution) **stays bright and keeps updating**. That asymmetry is deliberate, and it's the\nheart of the design.\n\n## Architecture (in brief)\n\nFor the technically inclined:\n\n- **One source of truth:** a read-only, versioned HTTP API under `/api/v1/`. Every client (dashboard,\n  tray widget) polls the same endpoints — no per-client math.\n- **Everything is a read-time derivation off the current reading;** nothing you fly by needs history.\n  So **history logging is opt-in and off by default** — the station is stateless out of the box (the\n  `/history` and `/summary` endpoints simply 404). Turn on `[logging]` only if you want the dashboard\n  trend chart and the daily summary; raw readings are then stored and every derived value is still\n  computed at **read time** (bug fixes apply retroactively — no backfill).\n- **Offline-first:** the server starts and serves with no internet. The only thing that differs online\n  vs offline is the optional `external` (METAR/model) block.\n- **Provenance is visible:** **cyan** = your LOCAL sensors (always live); **violet** = internet-sourced\n  (may be absent, and *dims* when the feed is gone). See the\n  **[dashboard tour](docs/guide/dashboard.md)**.\n\nThe outdoor suite is **BME280 + GPS + anemometer** (no light sensor — sky/cloud come from METAR). The\nanemometer can mount three ways (all-in-one, a remote anemometer on a cable, or an opt-in separate wind\nstation); a config knob selects the source and a freshness guard nulls stale wind so a dead sensor never\nreads as current. Details and the trade-offs are in the [hardware guide](docs/guide/hardware.md) and\n[ADR-0006](docs/adr/0006-flexible-anemometer-topology.md).\n\n## Documentation\n\n- **[Hardware \u0026 build](docs/guide/hardware.md)** — parts, ESP32 pinout, wiring, flashing, vane\n  calibration, siting, the three mounting topologies.\n- **[Install \u0026 configuration](docs/guide/install.md)** — a gentle terminal on-ramp, the demo path, the\n  systemd service, and every `weather.toml` setting.\n- **[Dashboard tour](docs/guide/dashboard.md)** — how to read the instrument, panel by panel.\n- **[Verification checklist](docs/guide/verification.md)** — how to know it's working, end to end.\n- **[Glossary](docs/guide/glossary.md)** — every aviation and computing term, in plain language.\n- **[Future work](docs/future-work.md)** — what's deliberately deferred, and why.\n- **[Design docs](docs/design/)** and **[architecture decisions](docs/adr/)** — the *why* behind the\n  build (offline-first, local-first wind, the unofficial stance).\n\n## Licensing \u0026 attribution\n\n- **airfield-wx is MIT-licensed.** It is built on a copy of `weather-station-public` (MIT, same\n  author) — an aviation variant, not a fork.\n- **Airport / runway data:** [OurAirports](https://ourairports.com/data/) — public domain.\n- **Magnetic variation:** the WMM2025 model via [`pygeomag`](https://pypi.org/project/pygeomag/) (MIT);\n  the WMM coefficients are public domain (NOAA/NCEI + BGS).\n- **METAR:** [aviationweather.gov](https://aviationweather.gov/) (FAA/NWS), keyless.\n\nSelf-hosted, LAN-only, no accounts, no cloud, no ads.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkbennett2000%2Fairfield-wx","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkbennett2000%2Fairfield-wx","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkbennett2000%2Fairfield-wx/lists"}