Safe, accessible bathrooms are a human right. Finding one shouldn't be hard. #JustLetMePee
Info punk: how JustLetMePee is built
What it is, and who it's for
JustLetMePee is an info punk project bringing together available, open or abandoned databases and repos. It aims to be a free reference tool for queer, trans and disabled folks to find accessible restrooms.
That's the whole idea. A lot of good restroom data already exists. Some of it lives in community projects, some in city open data, some in OpenStreetMap, and some in databases whose original apps are long gone. I'm pulling it together into one page you can open on your phone, with no account, no ads and nothing tracking you.
It shows the restrooms nearest to you, nearest first, with how long the walk is. For each one it says what's known: whether it's all-gender, whether it's accessible, whether it has a changing table, and a door code when someone has shared one. People who sign in can add restrooms, update what's known and flag listings that are wrong.
"Info punk" is the attitude. Use what's already out there, credit it, keep it free, and show your work. This post is me showing my work.
Where the data comes from
JustLetMePee stands on the shoulders of people who did this before me. Credit where it's due, plainly:
- Safe2Pee was the original crowd-sourced map of gender neutral and safe restrooms. The app is gone, but its database lives on.
- Refuge Restrooms was made to fill the gap Safe2Pee left. Its first 4,500 entries came from the Safe2Pee database; the rest were added by its users. Most of the all-gender restrooms in JustLetMePee come from Refuge. I read their public API, cache the answers, and credit them on every listing. JustLetMePee builds on Refuge; it isn't a fork of their code (which is open source on GitHub, AGPL-3.0).
- OpenStreetMap: public toilets mapped by volunteers all over the world. © OpenStreetMap contributors, shared under the ODbL.
- DataSF: the City of San Francisco's own list of public restrooms, with hours. That's why San Francisco is the richest city in the app right now.
- People using JustLetMePee: restrooms and updates added here, shared under the Open Database License (ODbL), the same licence as OpenStreetMap, so it can flow back.
When two sources list the same restroom (within 25 metres), it shows once, and each fills in what the other doesn't know. What people tell JustLetMePee wins over the sources, because it's usually newer. The map itself comes from OpenFreeMap, drawn from OpenStreetMap.
What every decision answers to
I wrote down my priorities before writing any code, and every choice gets checked against them. The first one comes before everything else: fast, free, easy access to as much rich and accurate bathroom data as possible for the queer, trans and disabled community. That means tags for safety, accessibility and gender, people updating the restrooms near them, and a quick "add here" with button prompts.
Running it comes down to a triad: privacy, security, accessibility. Here's one real decision each one drove.
Privacy
The people this is for get tracked enough. Where you are is sent in the body of the request, never in the web address, so it doesn't land in logs, and no table in the database has a place to keep it. The app does cache answers per area, so it can tell an area was looked up, never by whom.
The decision: OpenStreetMap's public lookup service blocks Cloudflare, so I could have routed searches through some other outside service. Instead I'm building JustLetMePee's own copy of every US restroom on OpenStreetMap, rebuilt weekly, so no outside service sees where anyone is looking. Next, the map tiles move onto the app's own storage too. Today OpenFreeMap serves them, which means their servers see which tiles your browser asks for.
Security
The rule is the fewest open doors, and never hand-rolling sign-in or payments.
The decision: for everyone who edits, sign-in will be passkeys with no email at all, through Better Auth, an open source sign-in framework that runs inside the app. With no emails there's no list of editors to leak or hand over. I picked it over a hosted service that would have held every editor's email. Moderators also pass Cloudflare Access, a second lock on the powerful accounts. Today, during the invite-only alpha, everyone signs in through Access with a one-time code, and the app keeps only a scrambled fingerprint of the email, never the address.
Accessibility
Readable, quick to use, and light enough for a weak signal on a street corner.
The decision: the body text is Atkinson Hyperlegible Next, a typeface designed for low-vision readers, served from this site, so no font company sees your visit either. Buttons are big, light and dark both get checked, and where restrooms are sparse the app looks out to 10 km, then 25 km, and tells you how far it looked instead of showing nothing.
And the proof of all of it: the code goes public. Privacy claims you can't check are just marketing. Once the repo is out, anyone can read exactly what gets stored and what doesn't.
How I use AI to build it
I build JustLetMePee with Claude, Anthropic's AI, as a tool. "Made with AI" can mean anything, so here's what it means here.
- What the AI does: it connects the data pipelines (Refuge Restrooms, OpenStreetMap, DataSF and what people add) and displays them in the app you see.
- What I do: I build the project and its workflows. The mission, the priorities, every decision and every okay are mine.
- Secrets: the AI never manages them. I add every key and password to Cloudflare manually.
- Where you are: your phone sends your location in the body of the request, never in the web address, so it can't land in an address log. The app uses it to sort the list and then forgets it: it's never stored or logged. The only place a searched area shows up is a cache of Refuge Restrooms answers, one row for each square about 1 km across, which shows that square was looked up, never by whom. Refuge is asked about that square too, never your exact spot. Don't take my word for it: the code goes public, so anyone can check.
One caveat: the map tiles still come from OpenFreeMap, so their servers see which tiles your browser asks for until the tiles move onto the app's own storage.
What's next
In this order:
- JustLetMePee's own OpenStreetMap copy, rebuilt every week, so searches never call an outside service.
- Cloudflare's $5 paid plan, with the billing guardrails set first, so a busy day can't knock the app offline.
- Passkey sign-in with no email, open sign-ups, and cryptonyms instead of names.
- Map tiles on the app's own storage, replacing OpenFreeMap.
- A Privacy page listing every single field the app stores, plus stricter security headers.
- The public repo on GitHub, starting from one fresh commit, with a security policy and a code licence.
- Quick "add here": one tap and a few buttons to log a restroom where you're standing.
- QR code stickers: just the plain address, no tracking. A business sticker later.
- Later: Sign in with Apple, a native iOS app, and asking Refuge Restrooms about a bulk copy before going national.
How to help
- Report a restroom. Open JustLetMePee, tap Add one here where you're standing, or Update and Flag as incorrect on one that's listed. Creating an account takes a passkey and nothing else.
- Fix it on OpenStreetMap too. If a restroom is wrong or missing on the map, fixing it on OpenStreetMap helps every app that uses it, not just this one. Adding it to Refuge Restrooms helps as well.
- Moderators wanted. I'm looking for a few people to keep listings honest and kind. If that's you, say so on a flag or an update and I'll find you.
- Read the code. The repo goes public soon. When it does, check my privacy claims, file issues, and send fixes.
Safe, accessible bathrooms are a human right. Finding one shouldn't be hard. #JustLetMePee