v0.7 · Compare · Search · 3 languages

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 — plus cross-country comparison and indicator search, all 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
19
Eurostat datasets
8
thematic modules
5
platforms, one codebase
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 — 19 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.

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.

Speaks three languages

English, Polish and Ukrainian across every screen — and the Settings picker switches the whole UI at runtime, no restart needed. This site itself ships in nine languages.

Adaptive master-detail

On tablets and desktop, every one of the eight screens switches to a two-pane layout — a 320 dp controls pane beside the content — while phones keep the exact single-column ordering.

Tap a chart, get the number

Tapping near any point on a line chart opens a detail sheet with the country, year, formatted value, unit and dataset code — even in Indexed-100 mode it resolves the true absolute value.

New in v0.7

Compare across borders. Search everything.

The two newest screens turn eight separate modules into one connected statistical atlas.

feature-compare

Compare 2–5 countries on one chart

Pick one of eight headline indicators — population, GDP, emissions, exports, air passengers, tourism nights, poverty risk, R&D intensity — and overlay up to five countries. Colours stay stable in selection order, and the Absolute / Indexed-100 toggle rebases every series to a common starting point: the honest way to compare economies of different sizes.

feature-search

27 indicators, one search box

A compiled-in index of every indicator across all eight modules — labels, dataset codes, keywords — with tiered ranking. Type “poverty”, “R&D” or “emissions” and jump straight to the right screen; a blank query browses the catalogue module by module.

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_peps01n · 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 20 Gradle modules, guarded by 600+ unit tests — including a real iOS-simulator suite. 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 & migrations
  • 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 · bundled Inter + IBM Plex Mono
  • Eight chart types on pure Compose Canvas — no Koalaplot
  • AdaptiveTwoPane master-detail · locale switching at runtime
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. At 840 dp and wider, every screen switches to a master-detail two-pane layout.

Economy module running on Android
Android phone · tablet
Population pyramid running on iPhone
iPhone · iPad
Same Compose UI · .dmg · .msi · .deb
Compose Desktop

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

Get the app

Download for your platform.

Every tagged release is built by CI — a universal Android APK plus native desktop installers, attached automatically to the GitHub Release.

Android

Universal APK for Android 8.0+. F-Droid metadata is ready in-repo; store submission is on the roadmap.

.apk F-Droid: planned
GitHub Releases

Desktop

Native installers for macOS, Windows and Debian/Ubuntu. Currently unsigned — your OS will ask for confirmation on first launch.

.dmg .msi .deb
GitHub Releases

iOS

Builds and runs on the iPhone simulator with live Eurostat data. Build from source with the XcodeGen project; TestFlight distribution is a funding goal.

Xcode + XcodeGen TestFlight: planned
Build guide

The first tagged release is being prepared — the tag-triggered CI workflow (APK + all three installers) is already merged and verified. Watch the repository on GitHub to be notified the moment it lands.

Roadmap

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

The project is at v0.7: all Phase 5 product work — overview, compare, search, settings, localization — has shipped. Phase 6 cuts the first public release.

Shipping today

v0.7 · verified
  • Eight thematic modules wired end-to-end to real Eurostat data
  • Overview dashboard · cross-module Compare · indicator Search
  • Settings with runtime language switching · EN, PL, UK
  • Master-detail two-pane layouts on all eight screens
  • Stale-while-revalidate caching · offline survives a flight
  • Desktop installers built by a tag-triggered CI release workflow
  • 600+ unit tests · including a real iOS-simulator suite

Next: first public release

Phase 6 · in progress
  • Tagged v0.7.0 release — APK + installers attached by CI
  • Real Android release signing key — replacing the debug fallback
  • Smoke-test on a physical Android device · full iOS walkthrough
  • F-Droid submission — fastlane metadata already in-repo

Funding goals

NLnet application under review
  • Signed & notarized installers — Apple and Windows certificates
  • Flatpak on Flathub · TestFlight / App Store presence
  • Tap-the-map country picker · choropleth charts
  • Accessibility audit — TalkBack & VoiceOver
  • More EU languages in the app UI
Open source · public interest

Built independently. Released under AGPL-3.0.

An application to the NLnet NGI Zero Commons Fund is under review 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