Case Study: Tuile Éireann Water Level Notifications & Warnings App

Case Study: Tuile Éireann – Water Level Notifications & Warnings App
Authors

TL;DR

Tuile Éireann is a cross-platform mobile app that delivers real-time flood alerts and water level monitoring across Ireland using data from the Office of Public Works (OPW).

  • Live river level data nationwide
  • Real-time alerts when water levels rise
  • Historical data for trend analysis

Tuile — the Irish word for flood.

⚠️ Disclaimer: Tuile Éireann is an independent, unofficial app. It is not affiliated with, endorsed by, or representing the Office of Public Works (OPW) or any Irish government body. Data sourced from the OPW Water Level Network: https://waterlevel.ie


Download

Currently in testing — download links will be available once testing is complete.

  • iOS: coming soon
  • Android: coming soon
Fig.1 — Android mobile demo

Introduction

Climate change is increasingly visible through rising sea levels and more volatile weather patterns. In Ireland, this is most evident in the growing frequency and severity of flooding events.

During recent floods, many residents experienced a critical gap in communication — warnings either arrived too late or not at all. For those living near rivers, timing is everything. Even a short delay can mean the difference between protecting a home and suffering significant damage.

Recognising that mobile devices are the fastest way to reach people, I developed Tuile Éireann — a cross-platform mobile app that transforms public hydrometric data into real-time, actionable flood alerts.

For a homeowner in Cork or a farmer in the Shannon basin, ten minutes of warning can be the difference between a dry home and devastating loss.

This case study outlines the design and development of Tuile Éireann, a React Native app built using the publicly available OPW waterlevel.ie API, and explores the challenges of turning raw environmental data into a reliable public safety tool.


The Problem

Ireland already has extensive hydrometric monitoring infrastructure through the OPW. However, this data is primarily designed for technical or institutional use, is not easily accessible on mobile devices, is difficult for non-experts to interpret quickly, and provides no alerts for water level changes or flood warnings.

As a result, there is a gap between data availability and public awareness. People who need this information most — homeowners, farmers, and local communities — often cannot access or interpret it quickly enough to act.


The Solution

Tuile Éireann bridges this gap by delivering real-time water level data directly to users in a clear, accessible format. The app transforms complex hydrometric readings into intuitive visual indicators and timely notifications, allowing users to understand flood risk at a glance and take action when it matters most.


Key Features

Real-time monitoring

Live river level readings from OPW monitoring stations across Ireland, with continuous updates to reflect changing conditions.

Custom notifications

Users can select their preferred stations and receive two types of alerts — a daily informational update and an immediate warning when water levels cross critical thresholds.

Interactive map

A map of Ireland showing all monitoring stations, with each station colour-coded based on its current flood classification.

Historical insights

Access to historical water level data and trend analysis to better understand local flood patterns.

Nationwide coverage

Browse by province and county, with coverage across major river basins including the Shannon, Liffey, Lee, and Boyne.

Accurate flood risk data

Gauge datum and water level data enable users to accurately evaluate flood risk for specific locations.


Who It's For

Tuile Éireann is designed for anyone affected by or interested in river conditions: homeowners in flood-prone areas, farmers and landowners, kayakers, anglers and waterway users, canal and inland navigation users, and local communities near rivers and floodplains.


Technical Challenges

1. CORS and Cloudflare Workers

The waterlevel.ie API does not support direct requests from a mobile app due to CORS restrictions. To solve this I deployed three lightweight Cloudflare Workers as proxies, allowing the app to query station metadata, percentile thresholds, and live readings without hitting browser or mobile security restrictions.

This also improved performance — instead of making one API call per station, the thresholds Worker fetches all ~450 station thresholds in a single request which is then cached at the edge.

2. Expo Router navigation

Expo Router introduced a subtle navigation challenge due to how tab-based layouts handle screen stacking. Screens nested inside the /(tabs)/ directory do not stack in the expected way, which caused issues with back navigation.

This was resolved by restructuring routes so that county/[id] and station/[id] exist outside the tab group, allowing proper stack-based navigation and restoring expected back behaviour.

3. Understanding exceedance percentiles

The most significant challenge in this project was not technical implementation — it was understanding the data model.

The waterlevel.ie API uses exceedance percentiles, which behave differently from standard statistical percentiles. In this system, lower percentile numbers represent higher water levels — Percentile-01 corresponds to extreme flood conditions, while Percentile-99 represents very low water levels.

This inversion initially led to incorrect classification logic in early versions of the app. The correct mapping was established by manually validating station data against official sources, ensuring each classification accurately reflected real-world conditions.

Water level classification

ClassificationMeaningColourExample — Station 11582
< 5%Very lowDark Blue< 2.830m
5–25%Low / normalLight Blue2.433m – 2.830m
25–50%NormalGreen2.253m – 2.433m
50–75%ModerateYellow2.130m – 2.253m
75–90%HighOrange2.061m – 2.130m
90% – AMAX medianVery highDark Orangeup to 4.102m
AMAX median – highest AMAXFlood riskRed4.102m – 4.872m
> Highest AMAXExtreme flood riskDark Red> 4.872m
No thresholdLight GreyNo defined thresholds
Outdated valueVery Light GreyStale or missing reading

Note: Recent data is provisional and may not yet be validated for anomalies. Source: waterlevel.ie


Architecture & Data Flow

Tuile Éireann architecture: OPW API → Cloudflare Workers → Expo app → Map, Station detail, Push notifications
Fig.2 — Tuile Éireann data flow architecture.

Data flows across five layers. The OPW waterlevel.ie API is the single source of truth. Three Cloudflare Workers handle CORS, aggregation, and edge caching. The Expo app merges the three data sources client-side using TanStack Query. A classification engine maps exceedance percentiles to colour and warning level. The results are surfaced in the map view, station detail screen, and push notifications.

Core data strategy

The GeoJSON endpoint provides a static list of all active Irish monitoring stations including their name, ID, and GPS coordinates. This forms the foundation of the app — without it there are no stations to query.

DataEndpointPurpose
Station list/geojson/All sensors in Ireland with coordinates
Live readings/hydro-data/data/internet/stations/0/{id}/S/week.jsonCurrent water level per station
Thresholds/hydro-data/thresholds/spercentiles.jsonHistorical percentiles for classification

County boundary data is sourced from the data.gov.ie statutory boundaries dataset.

Understanding the station data

Each station in the GeoJSON response looks like this:

{
    "type": "Feature",
    "id": 3,
    "properties": {
        "name": "Sandy Mills",
        "ref": "0000001041"
    },
    "geometry": {
        "type": "Point",
        "coordinates": [-7.575758, 54.838318]
    }
}

The ref field is the station ID used to query live readings. The coordinates are in [longitude, latitude] order — note this is reversed from what React Native Maps expects ([latitude, longitude]), which is an easy bug to introduce early on.

The app merges three data sources client-side: static station metadata from GeoJSON, live readings from the hydro-data API, and historical percentile thresholds — producing a real-time classified view of flood risk for each station.

Example response from the waterlevel.ie hydro-data API. The ts_value field represents the current water level in metres:

{
    "ts_id": 70526042,
    "timestamp": "2026-02-23T12:30:00.000Z",
    "ts_value": 4.473,
    "station_id": "12211",
    "station_no": "01041",
    "station_name": "Sandy Mills",
    "ts_unitsymbol": "m",
    "stationparameter_name": "S",
    "catchment_name": "DEELE",
    "CATCHMENT_SIZE": "113.00 km²",
    "RBD": "NORTH WESTERN RBD",
    "GAUGE_DATUM": "3.655",
    "station_gauge_datum_unit": "Malin Head OSGM15",
    "Stn_Class": "Level & Flow"
}

Querying the endpoints

Data fetching is handled using TanStack Query, allowing efficient caching, background updates, and separation of concerns between UI and data logic. Each station detail view requires two independent queries — one for live water level data and one for historical percentile thresholds.

The station data endpoint uses a parameter code to specify what is being measured:

CodeMeaningUnitsWhat it measures
SStagemetres (m)Water level height
QDischargem³/sFlow rate of the river

For the seven-day chart on the station detail screen, the S (stage) endpoint is used, as it directly reflects water height rather than flow volume.

TypeScript and Expo Router types

Expo Router generates strict types for all route pathnames. Any string passed to router.push() must exactly match a known route. This caught several navigation bugs at compile time rather than at runtime — a genuine benefit, but it required learning to use the object form of router.push() with explicit pathname and params rather than interpolated strings.

Notifications vs. warnings

As I was building the notification system, I had to decide between two approaches — running checks on-device or delegating to a backend worker.

On-deviceCloudflare Worker
Works when app is closedLimitedAlways
Works when phone is offNoYes, delivers on next open
Setup complexitySimpleModerate
CostFreeFree (Cloudflare free tier)
Battery impactSomeNone
Duplicate notification riskHigherEasy to control

Phase 1 — on-device (current)

  • expo-notifications setup and permission request on launch
  • Warning notification fires when ts_value crosses a threshold
  • Daily notification scheduled at 8am
  • Notifications cancelled when toggled off per station

Phase 2 — backend (planned)

  • Cloudflare D1 database + /register endpoint
  • Push token sent to worker on app launch
  • Worker cron trigger every 30 minutes replaces on-device polling
  • On-device scheduling logic removed

Product Development Journey

The waterlevel.ie/geojson/ endpoint was the natural starting point — it returns the location of every active sensor in Ireland, forming the backbone of the app's map view. From there, each sensor can be queried individually for real-time water levels and historical data.

After establishing the map view, the next step was designing the county-level station listing and station detail screens.

User journey

  1. Home screen — The user opens the app and sees an interactive map of Ireland with all monitoring stations colour-coded by current flood classification. They can filter by classification level, view active alerts, or tap a county to drill down.

  2. County stations screen — Stations are displayed in a sortable table showing station name, number, and current flood classification. The table defaults to descending order — highest flood risk first. The user taps a station to go to the detail screen.

  3. Station detail screen — Shows the station name, county, and catchment, a line chart of water levels over the last seven days, current classification status, and controls to toggle two types of alert:

    • Water level notifications (daily) — scheduled once per day, fires if the water level has changed meaningfully since yesterday. Informational, not urgent.
    • Water level warnings (immediate) — fires as soon as ts_value crosses a threshold (Yellow / Orange / Red), and again if the warning level changes (e.g. Red → Orange).
  4. Alerts screen — A list of all active notifications and warnings across monitored stations, with the option to tap through to the station detail or dismiss individual alerts.

Station detail screen

I started with the station name as the title, plus county and catchment metadata. I then added a seven-day chart using the S (stage) endpoint, rendered with victory-native. Below the chart sits a detailed breakdown of the station's current classification, threshold values, and alert toggles.

Explore screen

An introduction to Tuile Éireann with a summary of use cases and an illustrated guide to the warning classification levels.

Info screen

An explanation of how Tuile works, including a static SVG map of Ireland and an example of what station alerts look like in practice.


UI/UX Design

The UI is built with React Native Paper for a clean, accessible, and consistent look across iOS and Android.

The home screen centres around a map of Ireland displaying monitoring stations, each colour-coded based on current flood classification.

The initial implementation used a static SVG map generated from GeoJSON data. While functional, this approach proved limited in interactivity and scalability. The app was later migrated to a Leaflet-based map rendered inside a WebView, allowing greater flexibility, better performance, and richer interaction capabilities such as dynamic markers and popups.

Fig.3 — First iteration: GeoJSON-generated SVG map of Ireland.


Implementation

The app is built in React Native with Expo, targeting both iOS and Android. It was tested across both platforms to ensure consistent behaviour in real-time data updates, navigation flows, and notification delivery. All water level data is sourced from the publicly available OPW waterlevel.ie API.


Impact

Tuile Éireann demonstrates how publicly available data can be transformed into a meaningful public safety tool. By reducing the delay between data collection and user awareness, the app enables faster, more informed decision-making during flood events.

This project highlights the role of civic technology in bridging the gap between government infrastructure and everyday users — making critical environmental data accessible, understandable, and actionable.


Tech Stack

CategoryTechnology
FrameworkExpo + React Native
NavigationExpo Router
MapLeaflet in a WebView (migrated from SVG + Google Maps)
Data fetchingTanStack Query
State managementZustand + Context API
UI componentsReact Native Paper
ChartsVictory Native
Edge proxyCloudflare Workers
Notificationsexpo-notifications
TestingJest + React Native Testing Library

Key Learnings

Domain understanding can be more challenging than implementation — misreading the exceedance percentile direction caused incorrect classifications that would have completely undermined user trust. Real-time systems must also handle incomplete or stale data gracefully, and simplicity is critical when designing for emergency situations where users need to act fast.


Conclusion

Tuile Éireann is a practical application of real-world data solving a real local problem. By combining environmental data, mobile technology, and user-focused design, it provides a tool that can help individuals and communities respond more effectively to flood risks.


References

Photo by Chris Gallagher on Unsplash


Disclaimer

⚠️ Tuile Éireann is an independent, unofficial application developed by a private individual. It is not affiliated with, endorsed by, developed by, or representing any government entity, including the Office of Public Works (OPW) or any department of the Irish government. All hydrometric and river level data displayed in this app is sourced from the OPW Water Level Network and remains the property of the Office of Public Works. Users should always refer to official government sources for emergency flood-related decisions. Source: waterlevel.ie | opw.ie