- Authors

- Name
- Stephen ♔ Ó Conchubhair
- Bluesky
- @stethewhitefox.bsky.social
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
- Download
- Introduction
- The Problem
- The Solution
- Key Features
- Who It's For
- Technical Challenges
- Architecture & Data Flow
- Product Development Journey
- UI/UX Design
- Implementation
- Impact
- Tech Stack
- Key Learnings
- Conclusion
- References
- Disclaimer
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
| Classification | Meaning | Colour | Example — Station 11582 |
|---|---|---|---|
| < 5% | Very low | Dark Blue | < 2.830m |
| 5–25% | Low / normal | Light Blue | 2.433m – 2.830m |
| 25–50% | Normal | Green | 2.253m – 2.433m |
| 50–75% | Moderate | Yellow | 2.130m – 2.253m |
| 75–90% | High | Orange | 2.061m – 2.130m |
| 90% – AMAX median | Very high | Dark Orange | up to 4.102m |
| AMAX median – highest AMAX | Flood risk | Red | 4.102m – 4.872m |
| > Highest AMAX | Extreme flood risk | Dark Red | > 4.872m |
| No threshold | — | Light Grey | No defined thresholds |
| Outdated value | — | Very Light Grey | Stale or missing reading |
Note: Recent data is provisional and may not yet be validated for anomalies. Source: waterlevel.ie
Architecture & Data Flow
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.
| Data | Endpoint | Purpose |
|---|---|---|
| Station list | /geojson/ | All sensors in Ireland with coordinates |
| Live readings | /hydro-data/data/internet/stations/0/{id}/S/week.json | Current water level per station |
| Thresholds | /hydro-data/thresholds/spercentiles.json | Historical 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:
| Code | Meaning | Units | What it measures |
|---|---|---|---|
| S | Stage | metres (m) | Water level height |
| Q | Discharge | m³/s | Flow 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-device | Cloudflare Worker | |
|---|---|---|
| Works when app is closed | Limited | Always |
| Works when phone is off | No | Yes, delivers on next open |
| Setup complexity | Simple | Moderate |
| Cost | Free | Free (Cloudflare free tier) |
| Battery impact | Some | None |
| Duplicate notification risk | Higher | Easy to control |
Phase 1 — on-device (current)
expo-notificationssetup and permission request on launch- Warning notification fires when
ts_valuecrosses a threshold - Daily notification scheduled at 8am
- Notifications cancelled when toggled off per station
Phase 2 — backend (planned)
- Cloudflare D1 database +
/registerendpoint - 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
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.
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.
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_valuecrosses a threshold (Yellow / Orange / Red), and again if the warning level changes (e.g. Red → Orange).
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
| Category | Technology |
|---|---|
| Framework | Expo + React Native |
| Navigation | Expo Router |
| Map | Leaflet in a WebView (migrated from SVG + Google Maps) |
| Data fetching | TanStack Query |
| State management | Zustand + Context API |
| UI components | React Native Paper |
| Charts | Victory Native |
| Edge proxy | Cloudflare Workers |
| Notifications | expo-notifications |
| Testing | Jest + 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
- NASA — Climate change effects
- Mastering useQuery — TanStack React Query guide
- OPW waterlevel.ie API
- data.gov.ie — County boundaries dataset
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
