Skip to content

Repository files navigation

Taskbar Weather

Live weather in the Windows 11 taskbar — temperature, real feel, high and low, time to sunset and rain chance, beside an animated sky that tracks the real one.

ci release downloads licence

The panel on the taskbar

No API key. No account. No installer. No telemetry.

Download · Features · Install · Settings · Build


What it does

Windows 11 dropped the weather widget that used to sit on the taskbar. This puts one back — not a tile that opens a browser, but a live panel that reads the sky.

Hover it for the hours and days ahead:

The hover panel: metrics, hourly graph and five-day forecast
On the taskbar Temperature, real feel, today's high and low, time until sunset, chance of rain
On hover Wind, humidity, UV index, air quality, an hourly graph and a five-day forecast
The scene The sun at its true elevation, the moon at its real phase, weather layered on top
Multi-monitor Choose which taskbar, or put one on every screen
Games Hides itself when a fullscreen app covers the screen it is on
Languages English by default; Romanian labels are one tick in settings

The sky

The panel's left-hand two thirds is a live scene rather than an icon, drawn from the actual sky rather than picked from a set of pictures:

  • a gradient backdrop that shifts from night blue through dawn amber to daylight and back, and greys over as the cloud thickens — an overcast sky has no blue left in it;
  • a dotted arc tracing the sun's path, with the travelled part brighter than the part still to come, so the arc reads as how much daylight is left;
  • the sun at its true elevation along that arc — large and deep orange near either horizon, small and white-hot at noon — with a corona that turns rather than a ring of drawn spokes;
  • a low ridge on the horizon, so the sun sets behind something;
  • after dark, the moon at its real lunar phase over a field of stars;
  • weather layered on top, so a rainy sunset reads as both rainy and a sunset;
  • flourishes keyed to the reading: a shimmer and a beach parasol in a heatwave, frost on the frame below freezing, chimney smoke in hard frost, precipitation leaning with the wind, puddles that ripple, snow that settles the longer it falls, a rainbow when rain and low sun coincide, a haze when the air is poor, and a pulsing border for an orange or red national warning;
  • a hint of what is coming: a small dark cloud easing in from the right edge when the forecast turns worse within six hours;
  • and, occasionally, a flock of birds crossing a calm bright sky or a shooting star on a clear night.

Nothing here is random. Everything is derived from the reading, the clock or a fixed schedule, which is what makes it testable and what makes two panels on two monitors show the same sky.

Clouds are Bézier silhouettes shaded from within — light pooling on the towers, shadow in the hollows, a rim of light along the top edge — rather than unions of circles, which read as clip art however carefully they are shaded. The whole scene is vector, so it renders at your monitor's real DPI instead of being an upscaled bitmap.

Install

Download the latest release, extract it anywhere, and run TaskbarWeather.exe.

self-contained ~54 MB, needs nothing installed. Start here.
framework-dependent ~0.4 MB, needs the .NET 10 desktop runtime

Nothing is installed and nothing is written outside %APPDATA%\vreme, so uninstalling is deleting the folder. Tick Start with Windows in the tray menu to have it come back after a reboot; it uses the per-user Run key, so it needs no elevation.

There is no main window. The app lives in the notification area — left-click the tray icon for settings, right-click for the menu.

The builds are unsigned, so SmartScreen warns on first run: More infoRun anyway. Verify the download against SHA256SUMS.txt in the release if you would rather check than trust.

Requirements: Windows 11, a bottom-docked taskbar. Developed and tested on 25H2 (build 26200); a vertical taskbar is not supported and the widget falls back to its tray icon there.

Weather data

Open-Meteo, which needs no API key for non-commercial use. One request returns current conditions plus the hourly and daily series, polled every 5 minutes — about 288 calls a day against a 10,000/day limit. Bright Sky (DWD) is the fallback if Open-Meteo is unreachable.

Polling faster gains nothing: the model behind the forecast for Romania (ICON-EU) publishes a new run every three hours, and Open-Meteo's current block has a 15-minute interval. Open-Meteo sends no ETag or Cache-Control, so conditional requests are impossible and the last good reading is cached to disk instead — that is also what stops the panel showing --° at startup.

Weather codes follow WMO table 4677 (the 28 values Open-Meteo emits). Note for contributors: do not map these with an icon set built for WMO table 4680 — the two tables assign different meanings to the same numbers, and fog would render as snow.

Your location is detected once from your IP on first run, and can be changed or searched from settings. Nothing else leaves the machine: there is no analytics, no account and no telemetry.

Settings

Left-click the tray icon. Everything is exposed there, grouped into location, placement, appearance, units, data and startup, with each control captioned by what the choice actually costs — what a panel width will and will not have room for, what a refresh interval spends against the daily quota.

The window edits a copy, so Cancel really does discard: even Start with Windows, the one setting with an effect outside the app, is only written to the registry on Save. Reset restores the defaults but keeps the location you chose, since that has its own button.

The file remains authoritative and hand-editable: %APPDATA%\vreme\settings.json, created on first save. Values are clamped on load, so a hand-edited file cannot produce an invisible or abusive configuration — and the window's own sliders span exactly the range the clamp will honour, so it can never offer a value that would be silently changed.

Every key in settings.json
Key Default Notes
widthCentimetres 12.5 Panel width, clamped to 6.35–16.4 cm (240–620 px at 96 DPI)
anchor FarLeft FarLeft, LeftOfStart or LeftOfTray
monitorDeviceName null e.g. \\.\DISPLAY2; null means the primary
showOnAllMonitors false A panel on every taskbar
hideOnFullscreen true Per-monitor: a game on one screen does not blank the others
pollIntervalMinutes 5 Clamped to 5–180
latitude / longitude Auto Detected from your IP on first run
useRomanianLabels false English ships by default; Romanian is opt-in
runAtStartup false Also toggleable from the tray menu
useAnmWarnings false Romania-only national warnings feed, so opt-in
showAirQuality true European AQI in the hover panel, and a haze on the scene when poor
popupHours / popupDays 12 / 5

The width's lower bound is not a matter of taste: it is the measured width of the two things the strip never drops — the sky scene and the temperature. Below it the content would be clipped off the right-hand edge with nothing left to drop to make room, so a narrower request is widened instead. Above the minimum, a panel too narrow for everything drops whole groups from the right (rain chance first, temperature last) rather than cutting one in half.

The monitor is stored by device name rather than by handle, because handles are reassigned every session and would not survive a reboot.

Why it works the way it does

Windows 11 has no supported way to put custom content on the taskbar. Deskbands — the old IDeskBand COM extensions — have been unsupported since Windows 7 and have no host at all in the Windows 11 XAML taskbar. Third-party Widgets Board providers only ever render inside the widgets flyout, never on the taskbar strip.

The obvious remaining trick is to reparent a child window into Shell_TrayWnd with SetParent, which is what most surviving taskbar widgets do. That was measured on Windows 11 25H2 (build 26200.8973) and it does not work: SetParent succeeds, the child reaches z-index 0 above the composition bridge, hit-testing routes to it, and it even receives WM_PAINT — but it renders zero pixels, because the XAML taskbar only presents its own composition surface. Both a plain child and a WS_EX_LAYERED child were tested; both painted nothing.

So this is a topmost overlay instead: an ordinary borderless top-level window positioned over the taskbar. Measured on the same build, it paints correctly, stays above the taskbar, and receives hover events. It also has three structural advantages over reparenting:

  • it survives explorer.exe restarts, because it is not a child of anything the shell owns;
  • it keeps its own DPI awareness (a cross-process SetParent silently resets the whole process's awareness mode);
  • it never attaches its input queue to the shell's, so a stall in the widget cannot hang the taskbar.

The reproduction scripts live in tools/spike/. They are kept deliberately: they document the measurement the architecture rests on.

Build

Requires the .NET 10 SDK.

dotnet build
dotnet test
dotnet run --project src/Vreme.App

To produce a redistributable folder:

dotnet publish src/Vreme.App -c Release -r win-x64 --self-contained true -o out
Developer switches: seeing the scene without waiting for the weather

The sky only ever shows today's weather, which makes "what does heavy snow at dusk look like?" hard to answer. Two read-only switches solve that, neither opening a window:

# Contact sheets: every condition against every phase of the sun, every lunar phase, the
# temperature and wind extremes, the strip on a light and a dark taskbar and in Romanian,
# and the behaviour at a range of panel widths.
dotnet run --project src/Vreme.App -- --preview-scenes artifacts/scene.png

# Live taskbar geometry and where the panel would be placed, per monitor.
dotnet run --project src/Vreme.App -- --probe-taskbars

The preview exits non-zero if the panel width would clip the strip's content, or if a Romanian label has lost its diacritics — both otherwise silent, since the strip's content is left-aligned and anything that does not fit is simply absent. CI runs it on every push and publishes the sheets as build artifacts.

A third opens a window, because some things cannot be judged from a still frame:

# The large-format scene, animating, at whatever size the window is dragged to.
dotnet run --project src/Vreme.App -- --stage

A contact sheet proves a scene renders and fits, but a cloud crossing too slowly and a cloud not moving at all produce identical PNGs — and the taskbar gives the scene 34 units of height, which is enough to check that it is correct and nowhere near enough to see whether it is any good. The window carries every condition, every hour, a scrubbable sun, a lunar phase picker and a still-capture button. It runs alongside the widget, so it is safe to open while the tray icon is live.

That scene is a separate composition, not the taskbar's scaled up — see src/Vreme.App/Ui/StageScene.cs. Scaling a 34-unit ribbon magnifies a ribbon: the shapes get bigger and the picture stays a strip with two clouds in it. The large scene is laid out for the room it has, with three depth bands of cloud that differ in size, height, opacity and speed, layered ground that recedes with aerial perspective, and crepuscular rays. Nothing is shared between the two renderers except the geometry in Vreme.Core, which is where the testable arithmetic lives.

The README's own images are rendered by a switch rather than screenshotted, so they can be refreshed whenever the UI changes:

dotnet run --project src/Vreme.App -- --readme-strip docs
Project layout
src/Vreme.Core/       pure logic, no Win32 — this is what the tests cover
  Layout/             taskbar geometry, monitor choice, hover timing
  Weather/            Open-Meteo and Bright Sky clients, parsing, caching, formatting,
                      and the scene's geometry
  Settings/           settings model and atomic persistence
src/Vreme.App/        WPF application
  Interop/            P/Invoke surface and read-only shell probing
  Hosting/            overlay windows, message sink, tray icon, host
  Ui/                 the panel, the forecast flyout, and the review window
tests/Vreme.Tests/    xunit; no network, no clock, no shell
tools/spike/          the diagnostic scripts behind the architecture decision

Vreme.Core contains no Win32 calls at all. That is what makes the geometry and weather logic testable against captured rectangles and saved JSON, with no display attached and nothing that can flake. The namespaces keep the project's original name, vreme — Romanian for weather — which is also why the settings folder is %APPDATA%\vreme.

Status

Early development, but in daily use. Everything is configurable from the settings window, and the JSON file is still there for anything you would rather type.

Contributions and bug reports are welcome — open an issue.

Attribution

Weather data by Open-Meteo.com, licensed CC BY 4.0. Open-Meteo's free tier is non-commercial only: a fork that adds advertising or subscriptions needs a paid plan.

Fallback data by Bright Sky / Deutscher Wetterdienst. Romanian severe-weather warnings, when enabled, by Administrația Națională de Meteorologie (ANM), CC BY 4.0.

Licence

MIT — see LICENSE.

About

Live weather in the Windows 11 taskbar: temperature, real feel, high/low, sunset and rain chance, with an animated sky that tracks the real one. No API key, no installer.

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages