Creates the app skeleton and the seam everything else in the project hangs
off: region-specific data lives in an asset file, not in code, so adding a
region later is a new JSON file rather than a refactor.
Notable choices:
- applicationId and namespace are it.nuvolari.app rather than the doubled
it.nuvolari.nuvolari that `flutter create` produces, with the Kotlin package
and the iOS bundle identifiers moved to match.
- SDK levels are pinned instead of inherited from `flutter.*`. Google Play
requires API 36, and that is a release blocker rather than something to let a
Flutter upgrade change silently. minSdk 24 is the highest floor the planned
dependencies impose.
- Riverpod and Dio-free for now, no code generation: see docs/stack-decisions.md.
- Italian is the l10n source language, so app_it.arb is the template rather
than a translation of an English original.
The region parser rejects rather than repairs. An inverted bounding box, a map
centre outside its own bounds, an unknown adapter name, a duplicate zone code
or an empty attribution list all throw with the offending field named. Each of
those would otherwise fail silently and visibly wrong: a swapped latitude and
longitude renders the radar in the wrong place, an unknown adapter falling back
to mock would show demo frames where live data was expected, and a missing
attribution is a licence violation rather than a cosmetic gap.
Tests run against the asset that actually ships and against a captured copy of
the live ARPA CAP feed, so the eleven zone codes in the config are checked
against the eleven the feed really emits rather than against a list retyped
from documentation.
Verified: dart format clean, flutter analyze 0 issues, 50 tests passing,
flutter build appbundle --debug produces an AAB with applicationId
it.nuvolari.app, minSdk 24, targetSdk 36.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Sets up the Nuvolari monorepo layout (app/, backend/, docs/, tool/) with the
groundwork that does not depend on the Flutter toolchain: gitignore covering
Flutter, Python and every secret file shape; env.example.json as the template
for --dart-define-from-file; a verification script that skips stages whose
target does not exist yet so it is runnable from day one; and a CI workflow in
GitHub Actions syntax so it runs unchanged on Gitea or GitHub.
The documentation records facts verified against the live services rather than
restated from the brief. Two of them change the design:
- DPC VMI rasters are 1200x1400 Float32 on a 1 km grid in a custom projection
centred on Italy, not EPSG:4326 or EPSG:3857, and their GeoKeys are
internally inconsistent. Reprojection is mandatory and the source CRS must be
read from each file rather than hardcoded.
- The ARPA CAP feed carries six level values, not four: BIANCO for the
avalanche scale out of season and "-" for no data. Collapsing either into
VERDE would report "no alert" where the bulletin reports "not assessed".
Also documents why the frames we publish inherit CC BY-SA from the DPC source,
and why rain notifications subscribe to cell topics from the device so no user
location ever reaches a server.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The Nuvolari app is being rebuilt as a Flutter project targeting Android
first and iOS later on a single codebase, so the original Xamarin.Android
skeleton no longer applies. Its files were already removed from the working
tree; this records the removal.
Adds CLAUDE.md with the golden rules that constrain the rewrite: English
code and commit messages with Italian UI via ARB, no secrets in the repo,
AdMob test IDs only, no direct polling of ARPA/DPC from the app, and no
server-side precise user locations.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Implementate le configurazioni iniziali in `AndroidManifest.xml` e `Nuvolari.csproj`.
Creata la classe `MainActivity` per gestire la mappa con `SearchView` per la ricerca di luoghi.
Definiti i layout in `activity_main.axml` e `activity_main.xml`.
Aggiunti file di risorse per le icone dell'app e creato `ic_launcher_background.xml` per il colore di sfondo.
Definiti i testi dell'app in `strings.xml`.