Mausam (मौसम) is a next-generation, persona-driven, offline-first mobile application built for the India Meteorological Department (IMD) under Smart India Hackathon (SIH 2026, Problem ID: SIH26076). Developed entirely in Rust using Dioxus 0.7, Mausam transforms raw, multi-parameter scientific weather data into personalized, actionable intelligence for 1.4 billion Indian citizens.
Traditional weather portals present dense, uniform grids of meteorological numbers (barometric pressure, dew point, relative humidity) that create cognitive load for non-technical users.
Mausam solves this by introducing a Dynamic Prioritization Engine:
- Farmers immediately see Agromet advisories, soil moisture percentages, and sowing windows.
- Fishermen instantly get sea state warnings, wave height indicators, and coastal wind alerts.
- City Dwellers are prioritized with urban AQI (PM2.5), heat index, and waterlogging risks.
- Travelers & Commuters receive highway surface visibility, route safety index, and flight delay advisories.
| Persona | Priority Focus Areas | Core Metric Widgets | Visual Token |
|---|---|---|---|
| 🌾 Farmer | Agromet advisories, soil moisture, rainfall forecasts | Soil Moisture %, Sowing Risk Bar, 48h Rain Forecast | agriculture |
| ⛵ Fisherman | Marine alerts, wave height, coastal wind speed | Wave Height Ring Chart, Sea State Badge, Wind Speed | sailing |
| 🏙️ City Dweller | Urban air quality (AQI), heat index, flood risks | AQI PM2.5 Gauge, Heat Index, UV Index | location_city |
| 🚗 Traveler | Highway visibility, route weather, flight delays | Fog Visibility km, Flight Risk Status, Transit Alert | directions_car |
Mausam follows a strict 4-Layer Architecture (UI, State, Service, Data) designed for fast reactive rendering and low-latency mobile performance on Android devices.
graph TB
subgraph "Android Mobile Environment"
A["Dioxus Native App<br/>(Rust → Android APK)"]
B["WebView Renderer<br/>(Dioxus Mobile Runtime)"]
C["Local Storage<br/>(SQLite Caching)"]
KS["Android Keystore<br/>(Secure Auth Tokens)"]
end
subgraph "Core App Layers"
D["UI Layer<br/>(RSX Components & Views)"]
E["State Layer<br/>(Signals & Context API)"]
F["Service Layer<br/>(API Client & Sync Engine)"]
G["Data Layer<br/>(Models & Serde Parsers)"]
end
subgraph "External Meteorological APIs"
H["IMD Open API / Weather Data"]
J["AQI PM2.5 / Air Quality API"]
K["Marine & Sea State API"]
L["Geocoding Nominatim API"]
M["OpenStreetMap Tile Server"]
N["Mausam Backend Service<br/>(Auth + Witness Feed)"]
end
D --> E
E --> F
F --> G
F --> C
F --> KS
F -->|HTTP GET| H
F -->|HTTP GET| J
F -->|HTTP GET| K
F -->|HTTP GET| L
F -->|HTTP GET| M
F -->|HTTPS REST| N
A --> B
B --> D
flowchart LR
subgraph "Auth Signals"
A1["auth_token: Signal<Option<String>>"]
A2["current_user: Signal<Option<User>>"]
A3["is_guest: Signal<bool>"]
end
subgraph "Location Signals"
L1["gps_coords: Signal<Option<LatLng>>"]
L2["selected_city: Signal<City>"]
L3["saved_cities: Signal<Vec<City>>"]
end
subgraph "Search Signals"
S1["search_query: Signal<String>"]
S2["search_results: Signal<Vec<City>>"]
S3["search_history: Signal<Vec<City>>"]
end
subgraph "Content Signals"
C1["weather_data: Signal<Option<WeatherData>>"]
C2["active_alerts: Signal<Vec<Alert>>"]
C3["witness_reports: Signal<Vec<WitnessReport>>"]
C4["active_personas: Signal<Vec<Persona>>"]
end
flowchart TD
A["Component requests data for selected_city"] --> B{"Cache valid?"}
B -->|Yes| C["Return SQLite cached data"]
B -->|No| D["Fetch from Open-Meteo / IMD API"]
D --> E{"Success?"}
E -->|Yes| F["Update SQLite cache + return"]
E -->|No| G{"Stale cache?"}
G -->|Yes| H["Return stale + warn offline"]
G -->|No| I["Error state"]
J["City Search: type query"] --> K["Debounce 300ms"]
K --> L["GeocodingService.search_cities()"]
L --> M["Show dropdown results"]
M --> N["User selects city"]
N --> O["set selected_city Signal"]
O --> D
P["Witness: tap Submit"] --> Q{"is_guest?"}
Q -->|Yes| R["Prompt Login Auth Modal"]
Q -->|No| S["POST /reports"]
S --> T["Optimistic UI update"]
T --> U{"Server confirms?"}
U -->|No| V["Roll back + show error"]
flowchart TD
A["App Launch"] --> B{"Refresh token in Keystore?"}
B -->|Yes, valid| C["Restore auth session"]
B -->|No / expired| D{"Has persona saved in SQLite?"}
C --> E{"Has persona?"}
E -->|Yes| F["→ Dashboard (Logged In)"]
E -->|No| G["→ Onboarding (Logged In)"]
D -->|Yes| H["→ Dashboard (Guest Mode)"]
D -->|No| I["→ Onboarding (Guest) + Soft Login Prompt"]
The Dynamic Prioritization Engine assigns priority weights (0 to 100) to weather metric modules based on active user personas:
| Module / Widget | 🌾 Farmer | ⛵ Fisherman | 🏙️ City Dweller | 🚗 Traveler | Render Treatment |
|---|---|---|---|---|---|
| Agromet & Soil Moisture | 100 | 10 | 10 | 10 | Full Bento Card |
| Marine & Sea Waves | 10 | 100 | 10 | 20 | Full Bento Card |
| Urban AQI (PM2.5) | 20 | 10 | 100 | 30 | Full Bento Card |
| Highway & Commute | 10 | 10 | 90 | 40 | Standard Card |
| Rainfall Window | 90 | 50 | 40 | 50 | Standard Card |
| Aviation & Fog Risk | 10 | 10 | 20 | 100 | Full Bento Card |
| Community Witness Feed | 40 | 40 | 60 | 40 | Full Section |
The application implements the Mausam Atmospheric System — a visual framework crafted for clarity, legibility under direct sunlight, and high contrast accessibility.
| Token | Hex Code | Purpose & Usage |
|---|---|---|
PRIMARY_CONTAINER |
#003366 |
IMD Deep Blue — Authority, trust, top app bar |
PRIMARY |
#001E40 |
Dark navy typography & title headers |
SECONDARY_CONTAINER |
#2DBCFE |
Atmospheric Cyan — Interactive highlights & progress indicators |
BACKGROUND |
#F8F9FA |
Light neutral page canvas |
SURFACE_CONTAINER_LOWEST |
#FFFFFF |
Elevating metric cards and modal dialogs |
DANGER_RED |
#E74C3C |
Severe weather warnings & non-venture marine alerts |
WARNING_ORANGE |
#F39C12 |
Advisory alerts & moderate AQI warnings |
SAFE_GREEN |
#27AE60 |
Favorable agricultural sowing & safe sea state |
mausam/ # Project Root
├── Cargo.toml # Dependencies (dioxus, reqwest, rusqlite, serde, chrono)
├── Dioxus.toml # Android SDK parameters (SDK 26-34, package: gov.imd.mausam)
├── assets/ # Global stylesheet and brand icons
│ └── main.css # Mausam Atmospheric CSS design system & Material Symbols
├── src/
│ ├── main.rs # Application entry point, Signal state & View router
│ ├── theme/ # Design System Tokens
│ │ ├── colors.rs # IMD Deep Blue, Atmospheric Cyan, Alert Tokens
│ │ ├── typography.rs # Font hierarchy specs (Inter / Outfit)
│ │ ├── spacing.rs # 8pt grid metrics & card paddings
│ │ ├── elevation.rs # Glassmorphism & elevation shadows
│ │ ├── shapes.rs # Border radius definitions
│ │ └── mod.rs
│ ├── models/ # Core Data Structs & Enums
│ │ ├── persona.rs # Persona enum & metadata methods
│ │ ├── city.rs # City location struct (lat, lng, state)
│ │ ├── weather.rs # WeatherData multi-parameter struct
│ │ ├── auth.rs # UserProfile struct (Guest vs Authenticated)
│ │ ├── witness.rs # WitnessReport struct & upvotes
│ │ └── mod.rs
│ ├── services/ # Async API & Storage Services
│ │ ├── db_service.rs # Local SQLite database caching (rusqlite)
│ │ ├── weather_service.rs # Open-Meteo REST API client & metric generator
│ │ ├── geocoding_service.rs # Nominatim city autocomplete & reverse geocoding
│ │ └── mod.rs
│ ├── components/ # Reusable UI Component Library
│ │ ├── app_bar.rs # Top AppBar with city selector & avatar
│ │ ├── bottom_nav.rs # 5-Tab Material bottom navigation
│ │ ├── alert_banner.rs # Flush IMD Warning & Advisory banners
│ │ ├── weather_hero.rs # Dynamic weather hero card
│ │ ├── metric_card.rs # Bento grid metric container shell
│ │ ├── progress_bar.rs # Linear indicator bar
│ │ ├── ring_chart.rs # Donut indicator chart
│ │ ├── loading_skeleton.rs # Shimmer placeholder component
│ │ └── mod.rs
│ └── pages/ # Views & Screens
│ ├── onboarding.rs # 2x2 Persona selection & soft login prompt
│ ├── dashboard.rs # Dynamic persona-driven weather dashboard
│ ├── city_search.rs # Search bar, recent history & GPS trigger
│ ├── map_picker.rs # OpenStreetMap interactive tile picker
│ ├── auth.rs # Login, Register, Google OAuth & Guest mode
│ ├── witness_reports.rs # Community witness report feed & submit modal
│ ├── profile.rs # User profile, saved cities & active personas
│ └── mod.rs
└── artifacts/ # Phased design & implementation specifications
gantt
title Mausam App Development Timeline (SIH 2026)
dateFormat YYYY-MM-DD
axisFormat %b %d
section Phase 0 - Setup & Targets
Android SDK & Rust Targets Setup :done, p0, 2026-08-27, 1d
section Phase 1 - Design System
Theme Tokens & Shared Components :done, p1, 2026-08-27, 1d
section Phase 2 - Onboarding & Search
Persona Grid & Map City Picker :done, p2, 2026-08-27, 1d
section Phase 3 - Auth & Witness Feed
Auth Screens & Witness Feed :done, p3, 2026-08-27, 1d
section Phase 4 - Data Layer & Cache
SQLite Caching & API Client :done, p4, 2026-08-27, 1d
- Phase 0: Environment & Target Setup (Rust targets
aarch64-linux-android,JAVA_HOME,dxCLI setup). - Phase 1: Design System & Shared Core Components (
AppBar,BottomNav,AlertBanner,WeatherHero,MetricCard,ProgressBar,RingChart,LoadingSkeleton). - Phase 2: Persona Onboarding & City/Map Selection (
OnboardingPage,CitySearchPage,MapPickerPage). - Phase 3: Auth Management & Witness Reports Feed (
AuthPage,ProfilePage,WitnessReportsPage). - Phase 4: SQLite Caching & IMD Live API Service Integration (
DbService,WeatherService,GeocodingService).
Ensure you have the following installed on your system:
- Rust Toolchain:
rustc 1.80+with Android targets (rustup target add aarch64-linux-android) - Dioxus CLI (
dx): Version0.7.10+(cargo install dioxus-cli --version 0.7.10) - Android SDK & NDK: SDK API Level 26–34 (
ANDROID_HOMEenvironment variable set) - Java Development Kit: JDK 17 or 21 (
JAVA_HOMEenvironment variable set)
-
Clone the Repository:
git clone https://github.com/mausam-sih/mausam.git cd mausam -
Verify Code Correctness:
cargo check
-
Run Application Window (Desktop Target):
cargo run --features desktop
-
Build & Find Android Native Package (APK Bundle):
dx build --platform android
Generated output binary location:
- Project Root Copy:
./mausam-debug.apk - Gradle Build Output:
target/dx/mausam/debug/android/app/app/build/outputs/apk/debug/app-debug.apk
- Project Root Copy:
| Test Layer | Framework / Tools | Primary Objectives | Status |
|---|---|---|---|
| Static Code & Type Analysis | cargo check, clippy |
Type safety, Dioxus RSX syntax validation | ✅ Verified |
| Component Unit Tests | cargo test |
Model serialization, persona fallback logic | ✅ Passed |
| Android Build Validation | dx build --platform android |
APK generation, Kotlin source compilation | ✅ Verified |
| UI Integration Testing | Dioxus Signal Runner | State transitions across search, map, and auth | ✅ Verified |
Distributed under the MIT License. See LICENSE for more information.
- India Meteorological Department (IMD) for domain guidance and weather advisory specifications.
- Smart India Hackathon (SIH 2026) for Problem Statement SIH26076.
- Dioxus Labs for the high-performance cross-platform Rust GUI framework.