Data

What a toilet listing owes you

Six fields decide whether a toilet listing is useful or decorative: hours, fee, access, accessibility, freshness, source. How Phoo handles each one.

A map pin tells you where a toilet is listed. The details behind it help you decide whether it works for your next stop.

Hours, fees, entry, accessibility, confirmation dates and sources each answer a different practical question. Here is how Phoo brings them together.

Hours, structured, in the toilet’s own time zone

“Open now” is a computed answer, and it can be computed wrong in three ways: the hours are free text nobody can parse, the exceptions are missing, or the clock is wrong.

So opening hours are stored as structured periods rather than a string, holiday and seasonal exceptions are stored alongside them, and every toilet carries its own time zone rather than inheriting the city’s. That last one sounds like over-engineering until you meet a metropolitan area that spans a boundary, or an app that decided every listing in the database was on Central European Time because the first city was.

Then the part that matters more than any of that: most public toilets have no published hours at all. In Paris, 166 of the 889 toilets in OpenStreetMap carry an opening_hours tag — under a fifth. So the common case is not a schedule, it is the absence of one, and the listing says “Hours not confirmed” rather than inventing a plausible 09:00–18:00. A structured field that is empty four times out of five is still worth having structured, because the one time in five it is filled is the time it saves you a walk.

The evaluation then happens on your phone, against your clock. That has a pleasant side effect: because openness is not baked into the data, the whole city fits in one cacheable file that can be revalidated instead of refetched. A snapshot that never says “open” can be kept for a week; a snapshot that does goes stale in an hour.

The fee, with the amount

There is a real difference between “paid” and “€0.50”, and the difference is whether you turn around to find a machine that breaks a note.

Phoo stores the amount, the currency and, where it is known, what the gate accepts. In Sweden the answer is increasingly that it accepts nothing physical at all, which is worth knowing before you arrive holding coins.

Access type, as its own field

This is the field most databases do not have, and its absence is why so many trips fail. A toilet can be:

  • public, walk in
  • for customers, which in practice means buy something first
  • for ticket holders, inside a barrier you have already passed or have not
  • locked, with a key or a code at a counter
  • for staff, which is a polite way of saying no

None of these are the same thing, and “toilet exists at this coordinate” flattens all five into one. Phoo keeps them separate, shows the restriction on the card, and lets you filter to the ones that will not ask you to buy an espresso you do not want.

Accessibility, or an honest blank

Accessibility is the field where guessing does the most damage, so Phoo does not guess.

A toilet whose wheelchair access has not been confirmed does not pass the accessible filter. It shows as unknown, in a deliberately unsaturated grey that reads as absent rather than as uncertain-but-probably-fine. The filter’s promise is that everything it returns has been confirmed by a source or a visitor, and a filter that quietly includes maybes is not a filter, it is a liability.

The same rule applies to baby changing and to gender-neutral facilities. A blank is shown as a blank.

Freshness, with the date visible

Every claim in a directory decays. A listing confirmed this morning and a listing imported in 2021 are not equally true, and hiding that behind a uniform interface is the most common way toilet maps mislead people.

So each listing carries a last-confirmed date and one of four confidence levels: official, when an operator or authoritative public source says so; recently confirmed, when reliable recent reports agree; listed, when it came from a source and nobody has checked since; uncertain, when reports conflict or the record is incomplete.

Confidence decays with time on its own. A single conflicting report lowers it immediately, which is the asymmetry you want: one person saying “this is closed” should change what you see faster than one person saying “still fine”.

Source, identifier, licence

Every record keeps where it came from, the identifier it had there, when it was imported, and the licence that governs its reuse. You can read all of it in the app, under data sources.

This is partly a legal obligation. Most of the directory comes from OpenStreetMap, which is available under the ODbL, and attribution is a condition rather than a courtesy. It is also the only way to be accountable: when a listing is wrong, provenance is what makes the error traceable to a source and fixable at the source instead of patched over locally.

The part where the street corrects us

Ten thousand listings per city cannot be checked by hand before publication. We looked hard for a version of this product where they could, and the arithmetic does not work: at a few minutes per record, one city is a year of somebody’s life, and it would be a year out of date by the end.

So imported data publishes, and correction is a loop rather than a gate:

  • Anyone can report a problem or confirm details, without an account.
  • A report is checked against what other visitors say before anything changes.
  • Corroborated changes apply automatically. Isolated, unusual claims wait for a second independent voice, or expire.
  • Reports touching closures, access and safety face a stricter corroboration bar, not a faster human.
  • Every decision, automated or not, is kept in the record’s history.

That design has a failure mode worth naming: a wrong listing that nobody visits stays wrong. Freshness dates are the honest signal there, and they are why the date is on the card rather than in a debug menu.

What this adds up to

A Phoo listing is not a location. It is a set of dated, sourced, individually challengeable claims about whether you can get in. Some of those claims are blank, and the blanks are shown as blanks.

Those details help you choose where to go, whether you are exploring somewhere new or out on a familiar route.

Not on the App Store yet

Bring Phoo along

Get the App Store link when Phoo launches, then occasional news about new cities and useful additions.

We use Kit to send these emails. Unsubscribe at any time.

Need help signing up? Email hello@phoo.app.