Foxxe Labs
The model

Sruth

sruth — Irish for stream, flow

The circular flow of the Irish economy: what moves between the five institutional sectors — households, corporations, government, financial, rest of world — with county drilldowns, trade by commodity and by partner, and the energy balance underneath it.

Cadence
Annual, with a quarterly cadence signal
Shape
Static site over committed CSO snapshots
Answers
“Where does the money actually go?”

The number it exists to make unavoidable: on the 2025 vintage, modified gross national income was €334bn against a headline GDP of €602bn. Roughly 45% of Irish GDP is not the domestic economy — it is intellectual property relocation, aircraft leasing and redomiciled PLCs. Every figure on the site is badged with whether it was measured, derived, or illustrative.

The tap

Saothar

saothar — Irish for labour, work, toil

The labour market as the CSO publishes it: seasonally adjusted monthly unemployment, quarterly employment by economic sector, unemployment by age band and by region. Served as a page, as a REST API, and to AI agents over MCP.

Cadence
Monthly and quarterly; polled daily at 11:05 Irish time
Shape
Live service, cached, with the release date on every row
Answers
“What has just been published?”

The spread it exists to keep visible: in July 2026 the unemployment rate was 5.1% overall, 4.1% for those aged 25–74, and 12.3% for those aged 15–24. A single headline rate hides a gap of eight percentage points between the young and everyone else.

Why not one thing

They fail correctly in opposite directions, and that is the whole argument.

Sruth is a model, so its first duty is to be consistent with itself. Its breakdowns must sum to their measured parents; its sectoral balances must close. Those are assertions that run before it builds, and if one fails the site does not ship. A model that refuses to publish rather than publish something that does not add up is behaving properly.

Saothar is a feed, so its first duty is to be current. It checks the CSO every morning after the 11:00 release window and serves what is there, tagged with when it was published. A feed that refuses to serve is simply broken.

Wire the second into the first and you get the worst of both: a static site that now depends on a live service being up, and figures that arrive too late for the assertions that were the point. So the labour data stays where it can be current, the model stays where it can be consistent, and this page is the join.

What they do share