HAAM-produkter

HAAM produktudgave · Where the water is kept open

Swimmable Cities

Swimmable Cities is a map-first prototype for urban and cold-water swimming. Estonia and Finland spots carry official 2025 EU bathing-water classifications. Taiwan spots are seeded and labelled. The app will not say it is safe to swim today.

Swimmable Cities Tallinn view with the EEA 2025 baseline and the map waiting on a Mapbox token.
EEA 2025 baselineLocal notice before you enter

EU season

2025

Estonia and Finland spots carry EEA classifications under the Bathing Water Directive.

indicators

E. coli

Official assessments use E. coli and intestinal enterococci. History stays on the spot.

Taiwan

Seeded

Taiwan spots are labelled as seeded. The app does not invent official grades for them.

non-advisory

Copy

Tests forbid “safe to swim today.” Check the official local notice before you enter the water.

The job

A spot card you can read at the water’s edge.

Official bathing-water portals are authoritative and hard to use when you are already standing at the railing. I wanted a spot card with data age, an official grade or a seeded label, nearby context, and a city action brief.

The card still has to send you back to today’s local notice. A prototype map that poses as a live advisory would be the wrong public object.

Live sample feeds, medical safety guarantees, and crowd-sourced bacteria were out of this pass.

At the water

Find the place. Read the baseline. Check today’s notice.

Spots render without Mapbox. Interactivity needs a public token. Rain-triggered CSO is open work, not in this pass.

01

Find a managed place

The map is first. Closest spots, city, country, and a season label sit on the card before any promise about today.

02

Read official or seeded

EU spots must carry an officialAssessment. Taiwan spots must be seeded. The UI keeps those labels distinct.

03

Open sources

The sources panel cites the European Environment Agency and the Swimmable Cities movement workstreams. Data age stays visible.

04

Check the local notice

Copy tests keep the app from saying it is safe to swim today. The last step is still the city’s own notice.

Design decisions

What had to stay true in the interface.

swim.haam.co

Data contract

Official and seeded cannot share a costume.

If an Estonia or Finland spot is on the map, it has an official assessment. If a Taiwan spot is on the map, it is seeded and labelled. Tests enforce the split so a later edit cannot blur it.

  • EU versus seeded contract in swimData tests
  • Official classification plus history on EU spots
  • Taiwan official grades must not be claimed

Language

The caveat is part of the product.

I did not want a sources footnote that a hurried reader could miss. Copy tests and the sources panel keep the non-advisory sentence in the interface.

  • Non-advisory copy covered by tests
  • Sources panel on the spot
  • City action brief for what can still be done

Map

The places exist even when tiles do not.

A missing Mapbox token should not erase the spots. The prototype renders without tiles; interactivity waits on a public pk. token.

  • Spots render without Mapbox
  • Token stays in env, not in Git
  • Native swim logic deferred

The working stack

What actually runs.

Data

swimData.ts

EEA 2025 classifications for Estonia and Finland. Seeded Taiwan. Tests for the split.

Copy

Non-advisory contract

copy.test.ts and SourcesPanel. The UI must not say safe to swim today.

Map

Mapbox

Tiles only. Token in .env. Prototype works without it.

Host

swim.haam.co

Vercel Vite/React map prototype. Movement name: Swimmable Cities.

In evidence

What a reviewer can check.

01Official EU 2025 baselines on Estonia and Finland spots

02Taiwan spots labelled as seeded

03A sources caveat that tests will fail if it disappears

04A map that still lists places when tiles are missing

Where it stops

The baseline is last season. Today is still the city’s.

There is no live sample engine and no rain-triggered CSO in this pass. Mapbox tiles on the public host need a token. Native swim logic is deferred.

Do not say safe to swim today. Do not call it a live water-quality product. Accessibility audit not recorded.

HAAM’s role

I kept the official baseline, and I kept today in the city’s hands.

Baseline versus today, seeded versus official labels, city action brief, Mapbox prototype, EEA 2025 data, and copy tests. Direct work, 2026.

Help improve this website?

Optional analytics. Google Analytics and Clarity load only if allowed; form, email, and chat content are excluded.