Phase 4 · 8 modules shipping real data

Eurostat data,
on every screen.

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.

Overview of all eight modules in the EU Stats app
18
Eurostat datasets
8
thematic modules
444
unit tests passing
AGPL-3.0
open-source license
What it does

Public European data, treated like a first-class product.

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.

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.

Stale-while-revalidate caching

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.

Eight thematic modules

Economy, population, environment, trade, transport, tourism, social, science. Each owns its dataset, its switcher pattern, and a signature chart that fits the data shape.

Pure Compose Canvas charts

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.

Multi-platform from day one

Android phone & tablet, iPhone & iPad, and a self-contained Compose Desktop .jar for macOS, Linux, and Windows — all from one shared Kotlin codebase.

Year picker on every screen

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.

Eight modules

Open any tab. Pick a country. Scrub a year.

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.

Population module — drag the year slider to morph the pyramid

Population

demo_pjangroup · 18 cohorts · M/F/T

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.

pyramid chart year slider M/F/T segmented
Economy module — GDP, HICP inflation, and deficit

Economy

nama_10_gdp · prc_hicp_aind · gov_10dd_edpt1

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.

multi-line chart metric segmented dual-handle scrubber
Environment module — GHG, energy, SDG climate index

Environment

env_air_gge · nrg_bal_c · sdg_13_10

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.

metric dropdown sector chip row peer comparison line
Trade module — diverging bars for exports, imports, balance

Trade

ext_lt_intratrd

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.

diverging bar chart underline tabs year dropdown
Transport module — small multiples of road and air passengers

Transport

road_pa_buscoa · avia_paoc

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.

small multiples pill toggle log-scale switch
Tourism module — stacked nights and seasonality heatmap

Tourism

tour_occ_ninat · tour_occ_nim

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.

stacked bars chip row seasonality heatmap
Social module — KPI tiles drive a highlighted line chart

Social

ilc_li02 · ilc_peps01 · hlth_silc_01

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.

multi-line highlighted KPI tile selector year scrubber
Science module — radar chart of R&D, internet usage and tertiary education

Science

rd_e_gerdtot · isoc_ci_ifp_iu · edat_lfse_03

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.

radar chart peer overlay three sparklines
Under the hood

Boring, conservative choices — on purpose.

Clean Architecture across 17 Gradle modules. Each layer has a sealed contract. No !! operator anywhere; no third-party charts; no dispatch leakage.

Architecture

  • Multi-module Clean Architecture — datadomainui
  • Result<T> · AppError · DispatcherProvider contracts
  • Decompose for navigation, components & lifecycle
  • Koin for dependency injection
  • Stale-while-revalidate repository pattern

Data

  • Ktor Client — Darwin engine on iOS, OkHttp on Android
  • kotlinx.serialization for JSON & cache blobs
  • SQLDelight schemas with typed DAOs
  • Hand-rolled JSON-stat 2.0 parser in core-jsonstat
  • Coroutines + Flow + StateFlow throughout

UI

  • Compose Multiplatform — Android, iOS, Desktop
  • object Euro design tokens — colors, type, spacing, shapes
  • ~25 reusable composables in core-ui
  • Eight chart types on pure Compose Canvas — no Koalaplot
  • kotlin.test & Turbine for unit & flow tests
Three form factors

Phone, tablet, desktop — same Compose code.

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

Android
Android phone · tablet
iOS
iPhone · iPad
macOS · Linux · Windows
Compose Desktop

Single Kotlin codebase. Compose Multiplatform UI. Native widgets on each platform.

Roadmap

Honest about what ships, what is next, what needs funding.

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.

Shipping today

Phase 4 · verified
  • Eight thematic modules wired end-to-end to real Eurostat data
  • Stale-while-revalidate caching · offline survives a flight
  • Year picker on every module · headline updates without re-fetch
  • Eight chart types on pure Compose Canvas
  • Android APK assembles · Compose Desktop .jar runs on macOS/Linux/Windows
  • Released under AGPL-3.0

Next milestone (M1)

Phase 5 · in progress
  • Overview dashboard screen — landing tile grid
  • Country picker — searchable list and tap-the-map
  • iOS smoke-test in simulator · verify all eight tabs
  • Settings persistence · theme, default country, language
  • Real flag rendering · bundled Inter font

Funding goals (M2 · M3)

Phase 6 · NLnet candidate
  • Localization · Polish & Ukrainian translations
  • Native installers · .dmg, .msi, .deb, Flatpak
  • Multi-country comparison · overlay or small-multiples
  • Cross-module search · indicator index across all eight modules
  • Wide-screen master-detail layouts for tablet and desktop
Open source · public interest

Built independently. Released under AGPL-3.0.

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