Target interaction specification

Swimmable Cities

What do we actually know about this place, how current is that knowledge, and where do I check today before entering the water?

Swimmable Cities may present official historical assessments and clearly labelled seeded context, but it must never dress a seasonal baseline as a live safety status. Source, data age, official-versus-seeded provenance, and the path to the current local notice must remain part of the primary interaction.

Case-study thesis

What the finished product should prove.

This is the behavior to build toward. The implementation receipts below remain the record of what exists today.

The interaction is a trust handoff from a map to evidence. The most important state is often not good or bad, but old, unknown, seeded, or check today elsewhere.

State model

The interface has to make these states real.

If two states would look identical to the person, the implementation is not finished.

01

Nearby places

Managed swim places can be found even if map tiles, geolocation, or rich media fail.

02

Official baseline

A sourced classification is shown with season, date, jurisdiction, and history.

03

Seeded context

A prototype or manually seeded place is visibly different from an official assessment.

04

Source detail

The person can open the agency, measurement basis, classification history, and data age.

05

Current notice available

The interface provides the authoritative local path for today without paraphrasing it into its own safety claim.

06

Current notice unavailable

The absence of a live local notice is explicit and does not fall back to the seasonal baseline as if it were current.

07

Out of season or stale

Old assessments remain useful context but are visually downgraded as current decision support.

08

Map unavailable

The place list and evidence remain accessible when tile services or tokens fail.

Edge cases

The boring failures are part of the product.

  • A user checks the spot outside the official bathing season
  • Heavy rain or another local event may make the seasonal baseline less relevant
  • The current local notice cannot be reached
  • Two agencies publish conflicting or differently dated information
  • A seeded place later gains an official source
  • Geolocation is denied
  • Mapbox or another tile provider is unavailable

Definition of done

The future case study needs these receipts.

  • Every official classification exposes source, season, date, and jurisdiction on the primary spot flow
  • Seeded places cannot visually or semantically masquerade as official assessments
  • The interface never turns a seasonal baseline into the statement safe to swim today
  • If a current notice is unavailable, that absence is a first-class state rather than a hidden broken link
  • The place list and source information remain usable without map tiles or geolocation
HAAMin tuotteet

HAAMin tuoteversio · 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.

How we learned

Research

Public-data research

A map pin is not enough to decide whether to enter the water today.

Research combines managed swimming places, official baseline information, nearby pollution signals, local notices, and the actions still available to the city. The product keeps long-term context and today's local warning separate so neither is mistaken for the other.

  • Official sources
  • Place comparison
  • Pollution context
  • Local notices

Help improve this website?

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