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.
No API key. No account. No installer. No telemetry.
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:
| 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 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.
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 info → Run 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.
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.
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.
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.exerestarts, because it is not a child of anything the shell owns; - it keeps its own DPI awareness (a cross-process
SetParentsilently 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.
Requires the .NET 10 SDK.
dotnet build
dotnet test
dotnet run --project src/Vreme.AppTo produce a redistributable folder:
dotnet publish src/Vreme.App -c Release -r win-x64 --self-contained true -o outDeveloper 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-taskbarsThe 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 -- --stageA 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 docsProject 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.
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.
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.
MIT — see LICENSE.

