A new
visualization
library.
And some other stuff
Jose Saarimaa(used to be) developer
The starting point
No more HighCharts.
The initial choice
Highcharts seemed to offer most of the features we wanted "out of the box".
The license
Not the right fit for our open-source applications.
The styling
Making it look like us took too much work.
The updates
Upgrades regularly brought new problems.
AI can build anything.
What do we
actually want?
The wish list
Open & free
An open-source foundation, without a license barrier.
Works out of the box
Useful defaults. Less configuration to get started.
JSON-stat 2.0 in
API responses straight to charts. No middleware or wrappers.
Our look, easy customization
Change fonts, colors, and styling within sensible limits.
Maps
Bring your own GeoJSON geometry.
Accessible
Keyboard interaction, symbols, and a table alternative.
The result
Jsonstatgraphs.
Built on D3.
JSON-stat 2.0 in, SVG out.
The actual library, right here
Let's see it.
The integration
Data in. Chart out.
The JSON-stat response is the input.
import { createChart } from
'@statisticsfinland/jsonstatgraphs';
const response = await fetch(apiUrl);
const dataset = await response.json();
createChart(container, dataset, {
chartType: 'line',
layout: { rows: [areaCode], columns: [timeCode] }
});
Bring your own geometry.
GeoJSON + JSON-stat
const geometry = await (await fetch(geoUrl)).json();
createChart(container, dataset, {
chartType: 'map',
title: 'Population aged 65 or over',
subtitle: 'Share of population (%), 2025',
mapProvider: async () => geometry,
map: {
geoIdProperty: 'maakunta',
geoCodeMapper: code =>
code.replace(/^MK/, '')
}
});
Smaller features
Automatic chart selection
Chooses an applicable visualization from the dataset.
Automatic pivoting
Arranges data dimensions into chart series and axes.
Titles & subtitles
Generates titles from metadata and subtitles from selections.
Subset views
Shows selected categories from one response without changing the original data.
Downloads
Exports data as CSV and charts as SVG or PNG.
Localization
Localized controls, number formatting, and CSV exports.
Give your agent
the repo link.
Documentation and examples should be enough to integrate the library.
Jose Saarimaa / Px-meeting 2026
Part 2 / Team status update
New dissemination system
Includes the main PX data distribution APIs and a preview environment, running in Azure.
The challenge
Turns out serving large amounts of data with no latency and instant updates is kinda hard.
Infrastructure
We had to learn how to build maintainable infrastructure at scale with IaC.
Testing & analytics
Good automated test suites and analytics take time and planning.
Almost there
Development and test environments are up and running.
Part 2 / Team status update
Leaps in agentic development
No code is written by humans anymore.
With output this fast, we had to rethink our review practices.
Agentic review tools, risk classification for changes, and scope management.
Sandboxing developer agents
Lots of trial and error, manual tinkering, and helping others set up their environments.
Importance of available documentation
Source code is usually not enough. Architecture, integrations, deployment details, etc. matter.
We have successfully moved the bottleneck away from development
Requirements, QA, integrations, infrastructure.
Part 2 / Team status update
MCP on top of PX based APIs
Learning by building
We built one mainly to learn. Several MCP servers for PxWeb are also available on GitHub.
Simple questions
Questions like "How many people live in Helsinki?" are rather easy to get working.
Discovery is hard
Finding the right data is the hard part: it depends heavily on the metadata.
Beyond translation?
Should it offer more than a translation layer over current APIs: classifications, publications, semantic information, operations/combinations?
Part 3