Real public-API data
All eight modules ship live data from the official Eurostat dissemination API — 18 datasets in total. No hardcoded mocks; no demo databases.
An open-source mobile and desktop client for the public Eurostat API. Eight thematic modules — economy, population, environment, trade, transport, tourism, social, science — all running on a single Kotlin Multiplatform codebase.
🇪🇺Independent third-party open-source client. Not affiliated with Eurostat or the European Commission.
Calm, editorial UI. Stale-while-revalidate caching. Real API calls, no mocks. Designed for citizens, journalists, and students who want to explore European statistics without depending on any single vendor.
All eight modules ship live data from the official Eurostat dissemination API — 18 datasets in total. No hardcoded mocks; no demo databases.
SQLDelight cache with a 12-hour TTL. Cached data renders instantly, network refresh happens behind a calm stale banner, and offline never means a blank screen.
Economy, population, environment, trade, transport, tourism, social, science. Each owns its dataset, its switcher pattern, and a signature chart that fits the data shape.
Eight chart types — line, stacked-bar, pyramid, heatmap, diverging-bar, radar, small-multiples, multi-line-highlighted — drawn on a Compose Canvas with zero third-party rendering dependencies.
Android phone & tablet, iPhone & iPad, and a self-contained Compose Desktop .jar for macOS, Linux, and Windows — all from one shared Kotlin codebase.
Recently shipped: pick any historical year and the headline plus stat tiles update instantly — no network round-trip. The chart keeps the full series; the year only drives the readout.
Each module owns a dataset, a switcher pattern, and a signature chart that fits the shape of the data. Descriptions are pulled verbatim from the project README.
A demographic pyramid for 18 age cohorts (five-year bands, Y_LT5 through Y_GE85). The headline shows total population with year-over-year change. A three-option segmented control (Total / Men / Women) dims the opposite side of the pyramid when a single sex is selected. A year slider scrubs through available years; a country chips row switches the active country without re-fetching.
Three macro indicators — GDP in current prices (billion EUR), HICP inflation index (2015 = 100), and government net lending/borrowing as % of GDP — displayed as a multi-country line chart. A segmented control switches the active metric; the two inactive metrics remain visible as dimmed secondary stat tiles. A dual-handle year scrubber trims the chart's x-range; a separate year dropdown picks the year used by the headline.
Three climate datasets selectable via a dropdown: greenhouse gas emissions in Mt CO₂-eq, final energy consumption in ktoe, and the SDG 13 climate index at 1990 = 100. When GHG or Energy is active, a chip row filters by sector (TOTAL / TRANSPORT / INDUSTRY). The hero is a line chart comparing the active country against one peer; two stat tiles show the other two metrics for the same year.
Intra-EU goods trade flows — exports, imports, and trade balance in billion EUR. The hero is a diverging bar chart spanning the eight most recent years, with exports extending to the right and imports to the left. Three underline tabs (Exports / Imports / Balance) highlight the relevant direction. Two compact stat tiles show the active country's figures for the selected year.
Road and air passenger volumes presented as small-multiple line charts side by side. Road data (billion passengers) and air data (million passengers) are independently scaled per panel. A pill toggle (ROAD / AIR / ALL) controls which panels are visible. A log-scale switch compresses the axis for countries with very different magnitudes. Three stat tiles summarise road, air, and a "sea: n/a" tile that honestly explains the port-keyed dataset is intentionally excluded.
Accommodation overnight stays — domestic, foreign, and total nights — rendered as a stacked bar chart covering the nine most recent years. A chip row controls which metric drives the headline figure. Below the stacked bars, a monthly seasonality heatmap (cells = month × year) shows the distribution of nights through the calendar.
Three welfare percentage indicators drawn from EU-SILC surveys: at-risk-of-poverty rate, at-risk-of-poverty-or-social-exclusion rate, and the share of population reporting very-good self-perceived health. All three are plotted together as a multi-line highlighted chart; tapping a KPI tile shifts the emphasis to that series and updates the headline value.
Three innovation indicators — R&D expenditure as % of GDP, internet usage rate, and tertiary education attainment among 25–64 year-olds — shown simultaneously on a radar chart. The radar overlays the active country against a single peer (preferring DE, then FR, then EU27). Three sparklines beneath always show the full trend. There is no metric switcher; the radar presents all three axes at once.
Clean Architecture across 17 Gradle modules. Each layer has a sealed contract. No !! operator anywhere; no third-party charts; no dispatch leakage.
data → domain → uiResult<T> · AppError · DispatcherProvider contractscore-jsonstatobject Euro design tokens — colors, type, spacing, shapescore-uiCanvas — no KoalaplotA journalist on desktop, a student on a tablet, a citizen on a phone — the same data, the same components, the same rendering. Already implemented at the infrastructure level.
Single Kotlin codebase. Compose Multiplatform UI. Native widgets on each platform.
The project is at Phase 4: all eight modules render real data on Android. Phase 5 finishes the shell — overview, picker, settings — and Phase 6 cuts the first release.
Canvas
.jar runs on macOS/Linux/Windows
.dmg, .msi, .deb, Flatpak
Currently exploring an NLnet open-call submission to fund the next milestones. Citizens, journalists, and students should be able to explore public European data without depending on any single vendor — on any device they already own.
Read the roadmap