A native Kotlin/Jetpack Compose weather app for Android. Current conditions, hourly and 7-day forecast, powered by Open-Meteo (no API key required).
Ventus uses a custom, non-Material3 theming system: a small set of color tokens, 19 built-in
themes, user-importable .toml themes, and a font picker — all via CompositionLocal, with no
MaterialTheme anywhere in the app.
- Current conditions, 24-hour hourly strip, 7-day forecast
- GPS auto-detected location, with manual city search as a fallback or override
- Auto units by locale (metric/imperial), with a manual override in Settings
- Pull-to-refresh, with the last successful forecast cached for offline viewing
- 19 built-in themes +
.tomltheme import - User-selectable font (Inter, monospace variants, system fonts, etc.)
Or download the latest .apk from the releases page and install it manually:
# Via ADB (sideloading):
adb install ventus_*.apkOr transfer the APK to your device and open it with a file manager. You may need to enable Install from unknown sources in your device settings.
- Android Studio (or the command-line Gradle wrapper) with an Android SDK installed
minSdk 26(Android 8.0+),compileSdk/targetSdk 36- Location permission (
ACCESS_COARSE_LOCATION) for GPS-based weather; not required if you only use manual city search
./gradlew assembleDebug # debug APK
./gradlew installDebug # build and install on a connected device/emulator
./gradlew testDebugUnitTest # run the unit test suiteNo API keys or secrets are needed — Open-Meteo's forecast and geocoding endpoints are free and keyless.
app/src/main/java/com/fossisawesome/ventus/
├── ui/
│ ├── theme/ # AppColors, AppTheme (19 built-ins), .toml import, font picker
│ ├── components/ # Custom Text/IconButton/Toggle/Divider/Spinner/TextButton (no Material3)
│ ├── navigation/ # AppNavGraph — "main" / "settings" routes
│ └── screens/ # MainScreen, SettingsScreen
├── data/
│ ├── api/ # Open-Meteo forecast + geocoding clients (OkHttp + Gson)
│ ├── model/ # Response models + WeatherSnapshot/WeatherUiState domain types
│ ├── repository/ # WeatherRepository — fetch, cache, offline fallback
│ ├── location/ # Fused location provider wrapper
│ ├── storage/ # DataStore-backed AppPreferences
│ └── UnitConversions.kt
├── viewmodel/ # WeatherViewModel, SettingsViewModel
├── VentusApplication.kt # Manual DI container
└── MainActivity.kt
See CONTRIBUTING.md.
See SECURITY.md for how to report a vulnerability.
GPL-3.0. See LICENSE.