A wallpaper provider plugin that turns your Projectivy Launcher home screen into a weather display. Current conditions, optional forecast panels, and backgrounds that react to the weather.
Weather data from Open-Meteo. No API key, no account, no tracking.
Easiest — no computer needed. Install Downloader by AFTVnews on the TV, then enter code 6704396. That pulls the latest release directly and will keep pointing at future versions too.
Or side-load the APK from the latest release by USB or adb.
Or build it yourself — recommended, and it takes about two minutes with no local toolchain. Fork the repo, go to Actions → Build APK → Run workflow, and download the artifact. The released APK is debug-signed, so building it yourself means not having to trust a stranger's binary.
Then in Projectivy: Settings → Appearance → Wallpaper → Launcher wallpaper → Plugins → Weather Wallpaper.
On first run the plugin estimates your location from your IP, so it works immediately. Correct it in settings via the gear icon beside the plugin name — locations are added by name, not coordinates.
Always: temperature, conditions, feels-like, today's high and low, and wind with direction.
Each of these can be toggled independently:
| Panel | What it adds |
|---|---|
| Rain and snow timing | "Rain starting in about 25 min", from 15-minute data. On by default. |
| Helpful advice | "Frost likely tonight", "dry until 4 PM", "good drying day". On by default. |
| Hourly | Next 6 hours with temperature, icon and rain chance |
| Daily | Next 5 days with highs and lows |
| Extra stats | Humidity, UV index, dew point, visibility, pressure |
| Sun times | Sunrise, sunset, daylight remaining |
| Air quality | AQI in the stats line, a warning line when it's poor. Pollen where available. |
| Aurora watch | A line when the K-index makes aurora plausible at your latitude |
| Compare to yesterday | "4° cooler than yesterday" |
| Severe weather alerts | Active US National Weather Service warnings, as a banner |
| Clock | Optional, with position, size, style and format options |
Readout size is adjustable from 80% to 120% if the default is too small or too large for your room.
| Source | Needs | Notes |
|---|---|---|
| Illustrated scenes | nothing | Drawn in code, matched to conditions. Default. |
| Live radar | nothing | RainViewer over a built-in vector map |
| Your photos or videos | files on the TV | Drop them in the plugin's folder, named by condition |
| Community packs | nothing | Contributed images and videos, downloaded on demand |
| Plain gradient | nothing | If you want it quiet |
Everything follows sunrise and sunset automatically, with a twilight window either side — four phases rather than a day/night flip. Optional holiday themes colour-grade the whole scene around eight occasions a year.
World weather watch will periodically show a notable weather event elsewhere in the world instead of your local conditions, sourced from GDACS. Off by default, and laid out so it can't be mistaken for local weather.
Radar draws precipitation over a map of coastlines, borders, state lines, lakes and about 31,000 place names, all drawn from vector data bundled in the APK. No tile server, no API key, works offline. The data is Natural Earth 1:50m and GeoNames, both freely licensed.
This replaces an earlier version that pulled tiles from OpenStreetMap, which their tile usage policy does not permit for a distributed app.
There's a colour-blind friendly option that recolours radar onto a blue-to-yellow ramp. Standard radar palettes run green to red, where heavy rain becomes indistinguishable from drizzle for the roughly eight percent of men with deuteranopia.
If you'd rather have a full raster basemap, supply your own tile URL under
Custom basemap tile URL, using {z}, {x} and {y} placeholders:
https://tiles.example.com/dark/{z}/{x}/{y}.png?key=YOUR_KEY
Put the provider's required credit in Basemap credit line. Leave the URL blank to use the built-in map.
The plugin can't see where Projectivy draws its app row — the plugin API exposes no layout information at all. So Where your app row starts is a setting, from 70% to 88% of screen height, and the forecast strips respect it.
When the launcher reports itself idle nothing is covering the wallpaper, so the forecast can use the whole frame. That's on by default.
No code required. A pack is images or a video plus one entry in
packs/index.json. Open a pull request, CI validates the format and licensing,
and it goes live without an app release.
There's a layered PSD template in templates/ with every safe zone marked,
plus PNG guide overlays for other editors.
See CONTRIBUTING.md for the format, safe zones, size limits, video encoding, and licensing rules.
The two animation options sit behind an Experimental features toggle, off by default: Animate radar and Animate rain and snow.
They were originally built with Lottie, which turned out not to work here. Testing on an Nvidia Shield showed the launcher renders Lottie shape layers correctly but never displays embedded image assets — and radar is raster by nature, so the animation was simply blank. Both now encode a short H.264 video on the device instead, which the launcher plays through a media player. That keeps the radar, the vector map, the panel and the alert banner all intact, and it's confirmed working end to end.
Encoding happens in the background rather than blocking the wallpaper request, so turning this on may show a still frame for the first refresh while the initial video builds. After that it updates on its own. Everything still falls back to a still wallpaper if anything goes wrong.
They stay behind the toggle because on-device video encoding is meaningfully heavier than drawing a still image, and I'd rather that stay something you opt into than the default.
Animated wallpaper packs are no longer gated — they work, but like video packs they can't show the weather readout, since the launcher renders them itself.
Hides your location for screenshots: replaces the location name and removes the radar marker. The forecast still uses your real coordinates; only what's drawn changes.
Radar can't be fully anonymised this way — the map still shows your area. For anything you post publicly, the illustrated scenes or a pack are safest, and consider turning off sun times, which narrow down your coordinates.
| Layer | Value | Controls |
|---|---|---|
itemsCacheDurationMillis |
15 min | How long the launcher reuses the last response |
MIN_FETCH_INTERVAL_MS |
10 min | Floor on actual Open-Meteo calls |
| Background cache | 9 min | Reuses the composed background between renders |
| Pack index cache | 24 hours | How often the pack list is re-checked |
Expect the reading to update roughly every 15 minutes. Projectivy's own wallpaper rotation interval doesn't apply, since the plugin returns a single wallpaper with nothing to cycle through. There's a Refresh now action in settings.
A failed fetch reuses the last good reading rather than blanking the screen.
With the clock enabled the plugin asks for a re-render every minute, since a clock that's fifteen minutes stale is worse than no clock. The background is cached so this doesn't refetch radar tiles, but it is more work — and it may interfere with your screensaver starting.
Check for updates in settings looks at this repo's GitHub releases directly — no store, no companion app. It only ever tells you what it finds; nothing downloads or installs without you choosing to.
It also checks on its own schedule: weekly by default, or fortnightly, monthly, or never — your choice, in settings. A small notice appears next to the on-screen credits when something newer is available, and clears itself once you've updated.
The one-time catch: Android treats "let this app install other apps" as a special permission granted in system settings, not a popup you can accept from inside the app. If Check for updates finds something newer but nothing happens when you try to install it, the plugin needs that permission first. On a Shield that's Settings → Device Preferences → Security & restrictions → Unknown sources, then enable it for Weather Wallpaper. Grant it once and updates install normally after that.
There's a Create debug report action in settings. It writes a redacted diagnostic file — coordinates rounded, location name and API keys stripped — which makes bug reports far easier to act on.
Plugin isn't in the wallpaper list. Force-stop Projectivy and reopen; it caches the plugin list at startup.
Background is black or won't change.
adb logcat | grep -iE "projengmenu|SecurityException|OpenMeteoClient|PackManager"Panel is cut off at the screen edges. TV overscan. Raise MARGIN in
WeatherRenderer.kt.
Forecast strips don't appear. They're dropped rather than overlapped when there's no room. Try a smaller readout size, fewer optional panels, or adjust where your app row starts.
Pack list is empty. Hit Refresh pack list. If it still fails, check that
INDEX_URL in PackManager.kt points at this repo.
Radar shows tiles reading "not supported". You've set a custom basemap URL
and that provider is rejecting the requests. If it points at
tile.openstreetmap.org, that's expected and not fixable — their policy doesn't
permit app use. Clear the field to fall back to the built-in map.
Found an update but it won't install. See Keeping it updated above — the plugin needs permission to install apps, granted once in system settings.
Most of the Kotlin in this repo was written by Claude, with me directing, testing and debugging on real hardware. I'm not an Android developer.
Practical implications: I can read and explain the code, but I'd be slow on a deep bug. It's tested on a projector and an Nvidia Shield — no idea how it behaves on a Fire Stick, a Chromecast, or anything else. Build from source if you'd rather not trust a debug-signed APK from a stranger. Issues are welcome and I'll do what I can, no promises on turnaround.
Built on spocky's wallpaper provider template (Apache 2.0), for Projectivy Launcher.
Weather and geocoding by Open-Meteo, radar by RainViewer, map geometry from Natural Earth (public domain), place names from GeoNames (CC BY), severe weather alerts and the K-index from NOAA, world events from GDACS, optional stock photos via Unsplash. All credited on screen when in use. Any custom basemap you configure is yours to source and credit.
Licensed under Apache 2.0. See LICENSE.
0 comments
log in to comment.