Why a reader's city is thrown away before it reaches the database
We can see it. Our hosting provider hands it to us on every request. It is dropped at the door, and one of our own pages had to be corrected to keep that true.
A recruiter opening your CV arrives with an IP address, and the network in front of us turns that into a country, a city, and sometimes coordinates. All of it is available. Storing it would cost nothing and would make a nicer map.
The reader has no relationship with us. They clicked a link somebody sent them. The most that is defensible to keep about a person in that position is the country, and only because it answers a real question the sender has — did this reach the market I applied into.
So the ingest route reduces the location to a country and drops the rest before writing the row. The IP itself is never stored at all. The helper that renders a location on screen makes the same reduction a second time, deliberately, because rows written before the rule existed are still in the archive and the surface must not widen what the door narrowed.
The promise is only as good as its narrowest surface. One page was rendering "Berlin, DE" while the notice two elements below it promised country-level only. That is not a privacy policy problem, it is a correctness problem, and it was fixed as one.
Where this happened
The files this post is about. Named so the claim can be checked rather than taken.
- app/api/analytics/enhanced-track/route.ts
- lib/readings.ts