A free, open-source Android weather app with a premium dark UI, 25 customizable cards, animated Lottie icons, Gemini Nano AI summaries, multi-source forecasts, and smart alerts. No API keys required. Powered by Open-Meteo, RainViewer, Blitzortung, NWS, MeteoAlarm, JMA, and Environment Canada.
git clone https://github.com/SysAdminDoc/zeuswatch.git
cd zeuswatch
./gradlew assembleStandardDebugInstall the APK from app/build/outputs/apk/standard/debug/ or open in Android Studio and run directly.
Requirements: Android Studio Hedgehog+, JDK 17, Android SDK 35
| Feature | Description |
|---|---|
| Current Conditions | Large temp display, feels-like with wind chill/heat index explanation, condition, high/low, sky gradients |
| Yesterday Comparison | "5° warmer than yesterday" label in hero header with color-coded warm/cool indicator |
| Weather Summary | Time-aware natural language forecast ("Clear skies this morning") via Gemini Nano AI (default) or template engine, with UV/humidity warnings |
| Hourly Forecast | 72h scrollable strip with temp, animated Lottie icons, wind direction arrows, precip probability, smart rain timeline ("Rain likely within 3h"), feels-like when significantly different |
| 16-Day Forecast | Expandable daily rows with temperature range bars, rain hours, sunshine, snowfall, wind gusts, UV max. "Warmest" day highlighted |
| Temperature Graph | Interactive Canvas graph with drag-to-inspect, precipitation bars, forecast average normals band, and feels-like overlay |
| Rain Next Hour | 60-minute precipitation nowcasting bar chart from Open-Meteo minutely_15 data |
| Temperature Normals | Shaded band on temperature graph showing forecast average range with dashed boundary lines |
| Feature | Description |
|---|---|
| Today's Details | 10+ cell grid: humidity, wind (with gusts), UV, pressure (with trend indicator), visibility, dew point (with comfort descriptor), sunrise/sunset, cloud cover, snowfall/snow depth |
| Wind Compass | Animated Canvas compass with direction needle, Beaufort scale coloring, gust display |
| UV Index Bar | Color gradient bar with level markers, descriptions, "UV peaks at 2 PM" annotation, and safe sun exposure time |
| Air Quality | PM2.5, PM10, O3, NO2, SO2, CO with EPA/European AQI scales, circular gauge, dominant pollutant highlighting, and 5-day daily AQI forecast bars |
| Pollen Data | Per-species animated bars: alder, birch, grass, mugwort, olive, ragweed (hourly fallback) |
| Moon Phase | Canvas moon illumination with Conway's algorithm, moonrise/moonset, day length, sunrise/sunset countdown |
| Sun Arc | Semicircular sun position visualization with "Sunset in 2h 15m" countdown |
| Snowfall Card | Current snowfall rate + snow depth + daily total, auto-hidden when no snow |
| Sunshine Duration | Today's sunshine hours with circular progress ring |
| Severe Weather Potential | CAPE-based thunderstorm indicator with instability levels |
| Outdoor Activity Score | Weighted 0-100 composite score from temp, wind, UV, humidity, precipitation, AQI with factor breakdown bars |
| Golden Hour | Morning and evening golden hour times for photographers |
| Humidity & Comfort | Humidity gauge with comfort level indicator, dew point, and zone markers |
| Precipitation Forecast | 24-hour precipitation probability bars with peak callout and accumulation total |
| Pressure Trend | 24-hour barometric pressure line graph with trend direction and delta |
| Wind Forecast | 24-hour wind speed line graph with gust overlay bars and peak callout |
| Clothing Suggestions | Rule-based outfit recommendations from feels-like temp, rain, snow, UV, wind |
| Pet Safety | Pavement temperature estimates, heat stress, cold exposure, storm anxiety alerts |
| Feature | Description |
|---|---|
| Severe Weather Alerts | Multi-source: NWS (US), MeteoAlarm (31 EU countries), JMA (Japan), Environment Canada — auto-detected by country |
| Alert Source Preference | Configurable: Auto-detect, NWS only, MeteoAlarm, JMA, Environment Canada, All sources |
| 4 Notification Channels | Extreme (alarm sound, bypass DND), Severe (high), Moderate (default), Minor (low) |
| Alert Deduplication | Tracks seen alert IDs so the same warning is never re-notified |
| Multi-Location Alerts | Monitors all saved locations by default, not just current GPS |
| Driving Condition Alerts | Black ice, fog, low visibility, hydroplaning, high wind, snow/ice — derived from forecast data |
| Health Alerts | Migraine triggers (pressure/temp swings, configurable threshold), respiratory (humidity extremes), arthritis (temp swing) |
| Haptic Feedback | Severity-appropriate vibration patterns when alerts display |
| Expired Alert Filtering | Skips alerts past their expiration timestamp |
| Pressure Trend | Rising/Falling/Steady indicator computed from hourly surface pressure data |
| Feature | Description |
|---|---|
| Dual Radar Provider | User-selectable: native MapLibre with RainViewer tiles, or Windy.com WebView embed |
| Animated Radar Playback | Play/pause, frame slider, past/forecast labels, timestamp overlay (native mode) |
| Radar Preview Card | Live RainViewer tile + CartoDB dark basemap on the Today tab |
| Radar Tab | Full-screen radar in the bottom nav with provider-aware rendering |
| Map Layer Selector | Overlay layers: Radar, Lightning, Satellite, Clouds |
| Lightning Strike Overlay | Real-time global lightning data via Blitzortung WebSocket with GeoJSON rendering |
| Community Weather Reports | Firebase Firestore-backed crowd-sourced condition reporting with rate limiting |
| Source | Data Types | Region |
|---|---|---|
| Open-Meteo | Forecast, AQI, Pollen, Minutely, Historical | Global |
| NWS | Alerts | United States |
| MeteoAlarm | Alerts | 31 EU countries |
| JMA | Alerts | Japan |
| Environment Canada | Alerts | Canada |
| OpenWeatherMap | Forecast (fallback) | Global (API key) |
| Pirate Weather | Forecast (fallback) | Global (API key) |
| Bright Sky | Forecast (fallback) | Germany |
The WeatherSourceManager supports primary + fallback source per data type with automatic failover. Sources are configurable in Settings with optional API key fields.
| Widget | Size | Content |
|---|---|---|
| Current | 3x1 | Icon + temp + location + high/low |
| 3-Day | 3x2 | Current conditions + 3-day forecast columns + staleness indicator |
| Forecast | 4x3 | Current + 6hr hourly strip + 5-day rows + staleness indicator |
| Hourly Strip | 4x1 | Current temp + next 5 hourly temps with icons and precip% |
- Per-widget location configuration via config activity
- Tap-to-refresh (when data is null) and tap-to-open (when loaded)
- Proactive background caching for all saved locations
- Material You theming with
GlanceTheme
| Setting | Options |
|---|---|
| Radar Provider | Windy WebView / Native MapLibre |
| Icon Style | Meteocons Animated (Lottie, default) / Material Icons / Custom Icon Packs |
| Theme Mode | Static Dark / Weather Adaptive (accent colors shift: amber for sun, blue for rain, purple for storms) |
| Weather Summary | AI-Generated (Gemini Nano, default) / Standard template |
| Card Visibility | Toggle each of the 25 card types on/off |
| Card Ordering | Reorderable card list in Settings with move up/down arrows |
| Temperature | Fahrenheit / Celsius |
| Wind Speed | mph / km/h / m/s / knots |
| Pressure | inHg / hPa / mbar |
| Precipitation | inches / mm |
| Visibility | miles / km |
| Time Format | 12-hour / 24-hour |
| Hourly Range | 72 hours (default) / 48 hours |
| Notifications | Alert notifications, persistent weather notification (default on), nowcasting alerts (default on), driving alerts, health alerts |
| Alert Severity | Extreme only / Severe+ / Moderate+ / All |
| Alert Source | Auto-detect / NWS / MeteoAlarm / JMA / Environment Canada / All |
| Data Toggles | Snowfall, CAPE, sunshine duration, golden hour, Beaufort colors, outdoor score, yesterday comparison |
| Health | Migraine alerts with configurable pressure threshold (3.0/5.0/7.0/10.0 hPa/3h) |
| Haptics | Vibration feedback for weather alerts |
| Weather Particles | Rain, snow, and sun ray animations on/off |
| Cache TTL | Configurable: 15 / 30 / 60 / 120 minutes |
| Feature | Description |
|---|---|
| Compare Weather | Side-by-side comparison with weather icons, visibility, cloud cover, and value highlighting |
| Location Search | Open-Meteo geocoding with debounced search and error feedback |
| Multi-Location | Room database with add/remove/auto-GPS saved locations |
| Drag-to-Reorder Locations | Long-press drag handles to reorder saved locations with batch persistence |
| Location Temperature Preview | Saved location list shows cached temperatures with weather condition icons |
| Share as Text | Formatted weather summary via system share sheet |
| Share as Image | Rendered dark-themed weather card as PNG |
| Persistent Notification | Always-on notification showing current conditions (toggleable) |
| Proactive Caching | Background worker pre-fetches weather for all saved locations |
| Offline Mode | Room-cached weather data survives network failures with "Cached" indicator |
| Adaptive Layout | Phone and tablet layouts via LazyColumn. Tablets get two-pane weather + radar (840dp+) |
| Live Weather Wallpaper | Rain, snow, thunderstorm, sun rays, cloud wisps, fog particle effects over existing wallpaper |
| Accessibility | TalkBack descriptions on all Canvas components, alert icons, and merged card semantics with liveRegion alerts |
| App Shortcuts | Long-press launcher: Search, Radar, Settings, Compare |
| Deep Links | zeuswatch:// URI scheme for locations, radar, settings, compare |
| F-Droid Ready | freenet build flavor with no proprietary dependencies |
| Custom Icon Packs | Discover bundled + external APK icon packs via intent |
| Alert Expiry Countdown | Alert banners show "3h 15m left" / "Expired" |
| Sunrise/Sunset Countdown | Astronomy card shows "Sunset in 2h 15m" with auto-switch |
| Smart Rain Timeline | Hourly strip shows "Rain likely within 3h" or "Rain ending soon" |
| Data Staleness Indicator | "Updated" text turns amber when data is 1+ hours old |
| Wind Direction Arrows | Hourly forecast items show wind direction when > 10 km/h |
| Dew Point Comfort Colors | Color-coded comfort level (blue=dry, green=comfortable, orange=muggy, red=oppressive) |
| Time-Aware Summary | "Clear skies this morning" / "Overcast this afternoon" / "tonight" |
| Collapsible Settings | All sections collapsible with tap-to-toggle, Data Sources + Advanced start collapsed |
┌──────────────────────────────────────────────────────────────────────────┐
│ UI Layer (Jetpack Compose) │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────────┐ │
│ │MainScreen│ │RadarScreen│ │ Settings │ │Locations │ │CompareScreen │ │
│ │+ViewModel│ │+ViewModel │ │ + VM │ │+ VM │ │+ ViewModel │ │
│ └────┬─────┘ └────┬─────┘ └────┬─────┘ └────┬─────┘ └──────┬───────┘ │
│ │ │ │ │ │ │
│ 25 Card Types via LazyColumn items() │
│ WeatherSummary | NowcastCard | RadarPreview | HourlyStrip | TempGraph │
│ DailyForecast | UvIndexBar | WindCompass | AqiCard | PollenCard | ... │
│ ClothingSuggestion | PetSafety | DrivingAlert | HealthAlert | ... │
│ │
├──────────────────────────────────────────────────────────────────────────┤
│ Domain Layer (Repositories + Evaluators + Source Manager) │
│ ┌────────────────┐ ┌──────────────────┐ ┌───────────────────────────┐ │
│ │WeatherRepo │ │WeatherSource │ │AlertRepo + AlertSource │ │
│ │(fetch+cache+ │ │Manager (primary/ │ │Adapters (NWS, MeteoAlarm,│ │
│ │ direct+history)│ │fallback adapters)│ │JMA, ECCC) │ │
│ └────────────────┘ └──────────────────┘ └───────────────────────────┘ │
│ ┌────────────┐ ┌───────────┐ ┌────────────┐ ┌────────────────┐ │
│ │AirQuality │ │LocationRepo│ │RadarRepo │ │Community │ │
│ │Repo(AQ+ │ │(geocode+ │ │(RainViewer)│ │ReportRepo │ │
│ │pollen) │ │Room+sort) │ │ │ │(Firestore) │ │
│ └───────────┘ └────────────┘ └────────────┘ └────────────────┘ │
│ ┌──────────────────┐ ┌──────────────────┐ ┌──────────────────────┐ │
│ │WeatherSummary │ │ClothingSuggestion│ │DrivingCondition │ │
│ │Engine (NLG/AI) │ │Evaluator │ │Evaluator + HealthEval│ │
│ └──────────────────┘ └──────────────────┘ │+ PetSafetyEvaluator │ │
│ └──────────────────────┘ │
│ │
├──────────────────────────────────────────────────────────────────────────┤
│ Data Layer │
│ ┌───────────────────────────────┐ ┌───────────────────────────────┐ │
│ │ Retrofit APIs │ │ Room Database (v2) │ │
│ │ Open-Meteo Forecast │ │ weather_cache │ │
│ │ Open-Meteo Geocoding │ │ saved_locations (sortOrder) │ │
│ │ Open-Meteo Air Quality │ │ │ │
│ │ Open-Meteo minutely_15 │ │ DataStore Preferences │ │
│ │ Open-Meteo Historical │ │ Units, display, cards, │ │
│ │ RainViewer Radar Tiles │ │ notifications, health, │ │
│ │ NWS / MeteoAlarm / JMA / ECCC │ │ haptics, seen alert IDs, │ │
│ │ Blitzortung WebSocket │ │ widget location prefs │ │
│ │ Firebase Firestore │ │ │ │
│ └───────────────────────────────┘ └───────────────────────────────┘ │
│ │
│ DI: Hilt (NetworkModule + DatabaseModule) │
│ Background: AlertCheckWorker + WidgetRefreshWorker (WorkManager) │
│ Notifications: 4 alert channels + 1 persistent weather channel │
└──────────────────────────────────────────────────────────────────────────┘
Stack: Kotlin 2.1.0, Jetpack Compose (BOM 2024.12.01), Hilt 2.53.1, Retrofit 2.11.0, Room 2.6.1, DataStore 1.1.1, MapLibre 11.5.2, Glance 1.1.1, WorkManager 2.10.0, Lottie 6.6.2, Coil 3.0.4, Firebase Firestore
All core APIs are free with no keys required:
| API | Purpose | Rate Limit |
|---|---|---|
| Open-Meteo Forecast | Current, hourly (48-72h), daily (16d), minutely_15 nowcasting | 10,000/day |
| Open-Meteo Historical | Yesterday's weather for comparison | 10,000/day |
| Open-Meteo Geocoding | Location search + reverse geocode | 10,000/day |
| Open-Meteo Air Quality | AQI, pollutants, pollen (6 species), 5-day daily forecast | 10,000/day |
| RainViewer | Radar tile images (past 2h + 30min forecast) | Fair use |
| Windy.com | Embedded interactive radar (WebView option) | Fair use |
| NWS Alerts | US severe weather alerts | Fair use |
| MeteoAlarm | EU severe weather alerts (31 countries) | Fair use |
| JMA | Japan severe weather alerts | Fair use |
| Environment Canada | Canadian severe weather alerts | Fair use |
| Blitzortung | Real-time lightning strike data (WebSocket) | Fair use |
| Firebase Firestore | Community weather reports | Free tier |
Optional fallback sources (require API keys configured in Settings):
| API | Purpose |
|---|---|
| OpenWeatherMap | Forecast fallback |
| Pirate Weather | Forecast fallback |
| Bright Sky | Germany forecast fallback |
Current: temperature, humidity, feels-like, weather code, wind (speed/direction/gusts), pressure, UV, visibility, dew point, cloud cover, precipitation, snowfall, snow depth, CAPE
Hourly: All current params + precipitation probability, sunshine duration, surface pressure (48-72h configurable)
Daily: Weather code, temp high/low, sunrise/sunset, UV max, wind speed max/gusts max/direction dominant, precipitation sum/probability/hours, snowfall sum, sunshine duration (16d)
Minutely_15: Precipitation (24 intervals = 6 hours of 15-min resolution)
| Flavor | Description |
|---|---|
standard |
Includes Google Play Services for FusedLocationProvider + Gemini Nano AI |
freenet |
F-Droid compatible — no proprietary dependencies (uses Android LocationManager) |
# Standard (Google Play)
./gradlew assembleStandardRelease
# F-Droid
./gradlew assembleFreenetReleaseapp/src/main/java/com/sysadmindoc/nimbus/
├── MainActivity.kt # Deep links, WindowSizeClass, theme wiring
├── NimbusApplication.kt # Hilt, WorkManager, notification channels
├── data/
│ ├── api/ # Retrofit services (8), Room DAOs, database
│ ├── model/ # Domain models, Room entities, API DTOs
│ ├── repository/ # Repositories (7), UserPreferences, CardConfig
│ │ ├── WeatherRepository # Direct fetch + cache + history + minutely
│ │ ├── WeatherSourceManager # Multi-source primary/fallback adapter system
│ │ ├── AlertRepository # Country-auto-detecting multi-source alerts
│ │ ├── AirQualityRepository # AQI + pollen + 5-day daily forecast
│ │ ├── LocationRepository # Geocoding + Room + reordering
│ │ ├── RadarRepository # RainViewer tile URLs + frame list
│ │ └── CommunityReportRepo # Firestore crowd-sourced reports
│ └── location/ # GPS location provider, reverse geocoder
├── di/ # Hilt modules (Network, Database)
├── ui/
│ ├── component/ # 30+ reusable Compose components
│ │ ├── WeatherSummaryCard # NLG / AI-generated summary
│ │ ├── NowcastCard # 60-min precipitation chart
│ │ ├── RadarPreviewCard # Live radar tile
│ │ ├── TemperatureGraph # Interactive drag-to-inspect graph + normals band
│ │ ├── OutdoorScoreCard # Activity score gauge
│ │ ├── DrivingAlertCard # Driving hazard alerts
│ │ ├── HealthAlertCard # Health trigger alerts
│ │ ├── ClothingSuggestionCard # Outfit recommendations
│ │ ├── PetSafetyCard # Pet weather safety alerts
│ │ ├── GoldenHourCard # Photography times
│ │ ├── SunMoonArc # Sun position visualization
│ │ ├── AqiGauge # Circular AQI gauge + daily forecast
│ │ ├── AnimatedWeatherIcon # Material/Lottie/Custom switcher
│ │ ├── HumidityCard # Humidity gauge with comfort
│ │ ├── RadarLayerSelector # Map overlay layer chips
│ │ ├── AlertBanner # Pulsing severity-colored alert bar
│ │ └── ... # 14 more components
│ ├── screen/
│ │ ├── main/ # Today/Hourly/Daily tabs + tablet two-pane
│ │ ├── radar/ # Dual-provider radar + playback + layers
│ │ ├── settings/ # 11 collapsible sections (40+ preferences)
│ │ ├── locations/ # Search + drag-to-reorder saved locations
│ │ └── compare/ # Side-by-side weather comparison
│ ├── navigation/ # NavHost with typed routes
│ └── theme/ # Colors, typography, weather-adaptive themes
├── util/ # 12 utility classes
│ ├── WeatherSummaryEngine # Template-based NLG
│ ├── GeminiNanoSummaryEngine # On-device AI summaries (standard flavor)
│ ├── WeatherFormatter # 30+ unit-aware format methods
│ ├── DrivingConditionEvaluator# Ice, fog, hydroplaning, wind detection
│ ├── HealthAlertEvaluator # Migraine, respiratory, arthritis triggers
│ ├── ClothingSuggestionEvaluator # Outfit recommendation engine
│ ├── PetSafetyEvaluator # Pet weather hazard detection
│ ├── MeteoconMapper # WMO code to Lottie filename mapping
│ ├── HapticHelper # Severity-based vibration patterns
│ ├── AlertNotificationHelper # 4-channel alert notifications
│ ├── WeatherNotificationHelper# Persistent current-weather notification
│ ├── AlertCheckWorker # Background alert monitoring
│ ├── AccessibilityHelper # TalkBack descriptions
│ ├── ShareWeatherHelper # Text + image sharing
│ ├── IconPackManager # Bundled + external icon pack discovery
│ └── BlitzortungService # Real-time lightning WebSocket
├── wallpaper/
│ └── WeatherWallpaperService # Live weather wallpaper with particle effects
└── widget/ # 4 Glance home screen widgets
├── NimbusSmallWidget # 3x1: temp + icon
├── NimbusMediumWidget # 3x2: current + 3-day
├── NimbusLargeWidget # 4x3: hourly + 5-day
├── NimbusForecastStripWidget# 4x1: hourly temp strip
├── WidgetRefreshWorker # Periodic refresh + proactive caching
├── WidgetRefreshAction # Tap-to-refresh Glance callback
├── WidgetConfigActivity # Per-widget location picker
└── WidgetLocationPrefs # Widget-to-location DataStore mapping
| Section | Options |
|---|---|
| Display | Radar provider, icon style (Meteocons/Material/Custom), theme mode, summary style (AI/template) |
| Cards | Toggle + reorder each of 25 card types with move up/down arrows |
| Units | Temperature, wind, pressure, precipitation, visibility, time format |
| Notifications | Alert notifications (severity threshold, multi-location, source preference), persistent weather, nowcasting, driving, health |
| Data Display | Hourly range (48/72h), snowfall, CAPE, sunshine, golden hour, Beaufort colors, outdoor score, yesterday comparison |
| Health | Migraine alerts with pressure threshold (3.0/5.0/7.0/10.0 hPa/3h) |
| Accessibility | Haptic feedback for alerts |
| Visual Effects | Weather particle animations |
| Data Sources | Primary + fallback per data type, API keys (collapsed by default) |
| Advanced | Cache TTL (15/30/60/120 min) (collapsed by default) |
| About | Version, data source, license |
All cards can be independently shown/hidden and reordered:
Weather Summary, Radar Preview, Rain Next Hour, Hourly Forecast, Temperature Graph, Daily Forecast, UV Index, Wind Compass, Air Quality, Pollen, Outdoor Activity Score, Snowfall, Severe Weather Potential, Golden Hour, Sunshine Duration, Driving Conditions, Health Alerts, Moon Phase, Humidity & Comfort, Precipitation Forecast, Pressure Trend, Wind Forecast, Today's Details, Clothing Suggestions, Pet Safety
ZeusWatch uses Meteocons animated Lottie weather icons by default (MIT license).
- Download the "fill" style Lottie JSON files from the Meteocons repository
- Place them in
app/src/main/assets/meteocons/
See app/src/main/assets/meteocons/README.md for the full file list. The app gracefully falls back to Material Icons when Lottie files are missing. You can switch to static Material Icons in Settings > Display > Icon Style.
Third-party icon packs are discoverable via:
- Bundled packs in
app/src/main/assets/iconpacks/withmanifest.json - External APKs exposing the
com.sysadmindoc.nimbus.ICON_PACKintent
# Unit tests — formatters, models, repositories, ViewModels
./gradlew testStandardDebugUnitTest
# Instrumented Compose UI tests — screen rendering, interactions
./gradlew connectedStandardDebugAndroidTest| Suite | Framework | Coverage |
|---|---|---|
| Unit | JUnit 4 + MockK + Turbine + coroutines-test | WeatherFormatter (20), WeatherCode (12), Accessibility (12), AirQuality (14), Alerts (9), MainViewModel (10), LocationsViewModel (7) |
| UI | Compose UI Test + JUnit4 + Hilt Testing | MainScreen (6), SettingsScreen (10), LocationsScreen (8) |
180+ tests across 14 test suites.
Issues and PRs welcome. Please:
- Fork the repository
- Create a feature branch (
git checkout -b feature/my-feature) - Commit changes (
git commit -m 'Add my feature') - Push to the branch (
git push origin feature/my-feature) - Open a Pull Request
- All raw API values are metric (Celsius, km/h, mm, hPa, meters). Unit conversion happens in
WeatherFormatter. - Unit settings flow via
CompositionLocalProvider(LocalUnitSettings provides ...). Standalone screens (Radar, Compare) read from their ViewModel'sprefs.settingsflow. - Card rendering is driven by
CardTypeenum +LazyColumn items()in MainScreen. Add new cards by extendingCardTypeand adding awhenbranch inRenderCard. - Weather-adaptive theming reads from
LocalWeatherThemeStateCompositionLocal. - Multi-source forecasts use
WeatherSourceManagerwith adapter pattern — add new sources by implementingWeatherSourceAdapter. - Alert sources use
AlertSourceAdapterinterface — auto-detected by country via Geocoder. - See
CLAUDE.mdfor detailed architecture notes andRESEARCH.mdfor the feature roadmap.
See RESEARCH.md for the full feature research and phased implementation roadmap.
Implemented through v1.5.0:
- 25 dynamic card types with user-configurable order and visibility
- Gemini Nano AI weather summaries enabled by default (with template fallback)
- Animated Meteocons Lottie icons enabled by default
- Sequential permission flow: Location -> Notifications -> Background Location
- 72h hourly forecast, persistent notifications, nowcasting alerts on by default
- 4 new data cards: Humidity, Precipitation Chart, Pressure Trend, Wind Forecast
- Smart context: rain timeline, sunrise/sunset countdown, time-aware greetings
- Feels-like overlay on temperature graph
- Temperature range bars in daily forecast with color-coded gradients
- Alert expiry countdown on banners
- Card reorder in Settings with move up/down arrows
- Collapsible settings sections
- Pull-to-refresh on all tabs
- Compare screen with weather icons and value highlighting
- Outdoor score with factor breakdown bars
- Wind direction arrows and dew point comfort colors
- Data staleness indicator (amber when stale)
- Native MapLibre animated radar with layer selector
- Real-time lightning strike overlay (Blitzortung WebSocket)
- Live weather wallpaper with particle effects
- Multi-source forecast fallback (6 providers)
- International alert sources (NWS, MeteoAlarm, JMA, Environment Canada)
- Community weather reports (Firebase Firestore)
- Tablet two-pane layout
- 22 crash/bug fixes, Crashlytics removed
This project is licensed under the GNU Lesser General Public License v3.0.
Weather data provided by Open-Meteo.com under CC BY 4.0. Radar tiles by RainViewer. Interactive radar by Windy.com. Lightning data by Blitzortung.org. Alert data by National Weather Service, MeteoAlarm, JMA, Environment Canada. Animated icons by Meteocons (MIT).