Rainshine
A small Python desktop app for the weather as recorded. Choose a date and one of the 238 documented locations to see NOAA station records, a temperature plot, and the actual observations behind the display.
Install and run
Python 3.11 or newer is required. Tkinter normally ships with the Windows
and macOS installers from python.org. On Debian/Ubuntu, install python3-tk.
From a checkout of this repository, on Windows with Python 3.14:
py -3.14 -m pip install -e .
py -3.14 -m rainshine
On macOS or Linux:
python3 -m venv .venv
.venv/bin/python -m pip install -e .
.venv/bin/python -m rainshine
After installation, rainshine also opens the GUI. rainshine-gui is available
as a Windows GUI entry point. No API key or account is required.
Use
- Choose a month, day, and year. The selectable range is January 1, 1989 through December 31, 2032. The day list adjusts for each month and leap year.
- Choose a site. Type part of a city or venue name to narrow the dropdown.
- Select Show weather. Rainshine keeps the window responsive while it downloads the required records. The first lookup can take longer because NOAA distributes subdaily data as station-year files.
- Switch between Fahrenheit/inches and Celsius/millimeters. Recorded readings shows actual report times; Sources & notes includes station identifiers, distances, download times, flags, gaps, and source URLs.
- Use Copy summary or Save JSON to keep a result and its provenance.
The version is visible in the title bar. Downloads are cached in the user's local cache directory, outside the installed package. Cancellation stops the active lookup without freezing the window. Previously downloaded observations can be displayed offline; an expired saved copy is labelled if NOAA cannot be refreshed.
What the display means
- Daily cards use a GHCN-daily station record. The closest documented candidate with high, low, and precipitation is preferred; when no candidate has all three, the most complete available record is shown. Station identity and distance remain visible. Missing values stay empty; trace precipitation remains a trace. NOAA's presumed-zero precipitation and failed-quality values are excluded.
- Through the day uses GHCN-hourly observations from the nearest documented candidate with records on the requested local calendar day. Reported UTC timestamps are converted using the location's historical timezone rules. A local day can therefore contain 23 or 25 hours. Points are recorded temperatures; gaps longer than three hours remain disconnected.
- Daily station reporting periods can end at an observation time instead of midnight. A daily record and a local calendar-day plot can cover different periods and may come from different nearby stations. Both sources are shown.
- Numeric source-specific quality codes are decoded separately. For example,
GHCN-hourly quality code
5is acceptable for some sources and means removed for others. Explicit estimated subdaily values are excluded. - Sky descriptions appear only when an explicit recognized ICAO cloud label is present. Rainshine does not infer clear skies from missing cloud data.
- Future dates stay selectable and return No recorded weather yet. Other unavailable dates return an honest missing-record message. Rainshine does not substitute forecasts, climate normals, or reanalysis estimates.
Locations and source data
The packaged catalog is derived from the previously researched Telegraphy location/station lookup. It includes all 238 settings, candidate NOAA stations, coordinates, timezones, and inventory intervals. Venue coordinates and distances are approximate. This is a documented candidate set, rather than an exhaustive search of every sensor. Sites remain selectable for every supported date, regardless of the venue's opening year.
NOAA data are retrieved when requested, not bundled with the application. Inventories are hints; the actual day must contain usable observations. Dataset availability and station histories vary. For details and attribution, see DATA_SOURCES.md.
Headless access
rainshine --list-sites
rainshine --date 2010-02-06 --site "Dayton, OH, USA"
rainshine --version
The date/site command prints JSON in native metric units with source URLs and flags. It uses the same service as the GUI. A Python caller can use it directly:
from datetime import date
from rainshine.service import WeatherService
report = WeatherService().fetch("Dayton, OH, USA", date(2010, 2, 6))
data = report.to_dict()
Development
The application uses the Python standard library. Windows installs the pinned
tzdata dependency for IANA timezones. Build requirements are also pinned.
python -m pip install -e .
python -m unittest discover -s tests -v
GUI tests automatically skip without a display. Under a Linux virtual display,
run the same command with DISPLAY set. The test suite does not require a NOAA
connection; parsers, date boundaries, quality codes, fallback selection, future
dates, cache recovery, exports, and GUI interactions use controlled fixtures.
To measure coverage from the checkout, install the hash-verified tooling and use an editable installation so reports reference the source files:
python -m pip install --require-hashes --only-binary :all: -r requirements-coverage.lock
python -m pip install --no-index --no-deps --no-build-isolation --only-binary :all: -e .
python -m coverage run -m unittest discover -s tests -v
python -m coverage report
python -m coverage xml
On headless Linux, prefix the coverage test command with xvfb-run -a to include
GUI tests. The SonarQube workflow does this before importing coverage.xml.
Generated coverage files are ignored by Git.
Licensed under the existing MIT license.
Metadata
Release files for rainshine 0.1.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| rainshine-0.1.2.tar.gz | 369.5 kB | With provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| rainshine-0.1.2-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 655.5 kB
Release files / rainshine-0.1.2.tar.gz
| Download URL | rainshine-0.1.2.tar.gz |
|---|---|
| Size | 369.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
876b1e11c4bfc432cc2b86af9c70cc3ca386a27c8008a4f8679e0afab1048dda
|
|
BLAKE2b-256 checksum How to use checksums |
6029a28f15add0277070a70708b53919a0a99ee41566d0d822e7a2031ef61178
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 23, 2026.
Transparency logRelease files / rainshine-0.1.2-py3-none-any.whl
| Download URL | rainshine-0.1.2-py3-none-any.whl |
|---|---|
| Size | 286.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
d82fcc88be949802a21d773f83edf88b98bf47dd1805f1bd9e74254880f27736
|
|
BLAKE2b-256 checksum How to use checksums |
5b61320df3e3b5663fcb8d76a24744bdaf72e4e8a9e9eb76c092eba94a6ba9a0
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 23, 2026.
Transparency logSecurity for rainshine 0.1.2
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for rainshine-0.1.2.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 23, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.