Skip to content

Repository files navigation

Mausam (मौसम) — Intelligent Weather Companion App

Framework Platform Language Problem Statement Design System License

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.


🌟 Executive Summary & Problem Vision

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 & UI Specifications

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

🏗️ System Architecture

Mausam follows a strict 4-Layer Architecture (UI, State, Service, Data) designed for fast reactive rendering and low-latency mobile performance on Android devices.

1. High-Level System Architecture

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
Loading

2. Reactive Signal State Architecture

flowchart LR
    subgraph "Auth Signals"
        A1["auth_token: Signal&lt;Option&lt;String&gt;&gt;"]
        A2["current_user: Signal&lt;Option&lt;User&gt;&gt;"]
        A3["is_guest: Signal&lt;bool&gt;"]
    end
    subgraph "Location Signals"
        L1["gps_coords: Signal&lt;Option&lt;LatLng&gt;&gt;"]
        L2["selected_city: Signal&lt;City&gt;"]
        L3["saved_cities: Signal&lt;Vec&lt;City&gt;&gt;"]
    end
    subgraph "Search Signals"
        S1["search_query: Signal&lt;String&gt;"]
        S2["search_results: Signal&lt;Vec&lt;City&gt;&gt;"]
        S3["search_history: Signal&lt;Vec&lt;City&gt;&gt;"]
    end
    subgraph "Content Signals"
        C1["weather_data: Signal&lt;Option&lt;WeatherData&gt;&gt;"]
        C2["active_alerts: Signal&lt;Vec&lt;Alert&gt;&gt;"]
        C3["witness_reports: Signal&lt;Vec&lt;WitnessReport&gt;&gt;"]
        C4["active_personas: Signal&lt;Vec&lt;Persona&gt;&gt;"]
    end
Loading

3. Service Layer Caching & API Strategy

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"]
Loading

4. App Launch & Session Decision Tree

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"]
Loading

⚙️ Dynamic Persona Prioritization Engine

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

🎨 Design System & Aesthetics

The application implements the Mausam Atmospheric System — a visual framework crafted for clarity, legibility under direct sunlight, and high contrast accessibility.

Color Palette Tokens (src/theme/colors.rs)

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

📁 Repository Directory Structure

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

📅 Implementation Roadmap & Phased Status

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
Loading

Execution Status Matrix

  • Phase 0: Environment & Target Setup (Rust targets aarch64-linux-android, JAVA_HOME, dx CLI 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).

💻 Getting Started & Development Guide

Prerequisites

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): Version 0.7.10+ (cargo install dioxus-cli --version 0.7.10)
  • Android SDK & NDK: SDK API Level 26–34 (ANDROID_HOME environment variable set)
  • Java Development Kit: JDK 17 or 21 (JAVA_HOME environment variable set)

Running Locally

  1. Clone the Repository:

    git clone https://github.com/mausam-sih/mausam.git
    cd mausam
  2. Verify Code Correctness:

    cargo check
  3. Run Application Window (Desktop Target):

    cargo run --features desktop
  4. 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

🧪 Testing & Quality Assurance Strategy

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

📄 License & Acknowledgments

Distributed under the MIT License. See LICENSE for more information.

Acknowledgments

  • 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.

About

Mausam (मौसम) - Intelligent Weather Companion App

Topics

Resources

Stars

2 stars

Watchers

0 watching

Forks

Contributors

Languages