Check-ins and photo locations: a draft "place pin" record + a new Eurosky place service

Hi y’all, I’m writing this with 2 hats on.

Hat 1, app dev: I make https://www.flashes.blue and https://www.skeetsapp.com. Both are about to ship locations: Flashes will let people say where their photos and videos were taken, Skeets will get check-ins.

Hat 2, Eurosky: to power that, we’ve just started places.eurosky.tech, a place service for the open social web. Behind the URL:

  • a worldwide gazetteer rebuilt monthly from Overture (places, divisions, addresses), Foursquare Open Source Places and OpenStreetMap;

  • records merged across the sources (~112M places), ranked with Wikipedia importance.

It offers:

  • suggestions for a position: nearby places, the street, and the areas that contain it (district, city, country), for e.g. a check-in picker;

  • type-ahead search;

  • a privacy-preserving fixed ~1 km squares query API: cacheable, and the server only learns which square you asked for.

It’s built on ATGeo’s conventions: every place carries its ATGeo URN in origin (plus sameAs for the same place in other sources), areas are Overture divisions as in garganorn, and the squares follow garganorn’s idea that a client fetches a whole area so the server never learns its position. It also answers org.atgeo.getPlace, so ATGeo clients can look places up by URN (for example McDonald’s at Hermannplatz); the tile interface (getTiles) could follow if ATGeo apps want a European server. The code is public: https://github.com/eurosky-social/eurosky-places

Before my apps ship, I’d like to agree the record format with you rather than add yet another one. This picks up the check-in thread from last summer, this time with something concrete.

Here’s the draft: https://github.com/eurosky-social/eurosky-places/blob/main/docs/place-pin.md (lexicon: pin.json)

The short version:

  • A small record next to the post, one place per record. It can be limited to some of the post’s photos or videos, named by their blob CIDs, so it works for any media in any app. Without a post it’s a check-in on its own.

  • It follows where we landed in 2025: no at:// URIs for external places. The record carries the place’s ATGeo URN in origin, plus the subset readers need: name, a coarse category, a point, the containing areas and the place’s IDs in other sources. It uses the same field names as org.atgeo.place, and community.lexicon.location.* objects for locations. About 0.5–1.3 KB per record.

  • The author picks the level: venue, street, district, city, region or country. Coordinates are rounded to it, and the device’s own position is never written.

  • Readers can group by origin (and sameAs), draw maps and show thumbnails without any gazetteer lookup or fetching the post. Constellation could answer “all pins at this place”.

It’s under our namespace (social.eurosky.place.pin) for now but I’d rather see it become org.atgeo.checkin or a lexicon.community record if that’s the better home.

Questions I’d love input on:

  1. Home: org.atgeo.checkin, lexicon.community, or leave it with us?

  2. The dataset name for Foursquare in URNs (we currently use foursquare.com).

  3. A shared coarse category list, or app-defined?

  4. Is a pin without a post the check-in record, or should a check-in be its own record with text?

Some things we learned building the service that may help garganorn:

  • Foursquare Open Source Places isn’t discontinued. It has been gated on Hugging Face since October 2025, and works with a token once you accept the terms.

  • Only ~38% of Overture place IDs survived a year (Overture re-matched its places in July 2026), against ~99% of Foursquare IDs over 19 months and ~97% of OSM IDs over 5 months. That’s why the draft puts the longest-lived ID in origin.

  • Overture’s September 2026 release added company-registry records (BrightQuery) that aren’t venues. Also, Overture’s own “signals” source shouldn’t count as a second confirmation.

  • Overture piles up records at a city’s reference point when it only knows the town: 428 at one point in Nairobi, including national parks.

3 Likes

Very cool! I’m curious how this compares to beaconbits.app by @montoulieu.dev

Hi Sebastian, thanks for sharing this. I’m fairly new to the lexicon side of things, so please correct me where I get it wrong.

It’s a nice coincidence. I just released my app, Placita, in private alpha. One of my goals now is to look at the wider Atmosphere and see how I can connect with what others are building. Your post came at the right moment. I would be happy to help where I can, because getting a few of these formats to line up is exactly what I hope for.

Placita is a saved-places app. People keep places they want to visit or have been to, with tags, notes and a rating. It is not a check-in app, and I will leave check-ins to others for now. I use OpenStreetMap today and have not worked with Foursquare data, so your notes on it were useful.

My approach is to use open data where I can and add richer sources where they help. I also want to build from the bottom up. People start with their own places in their own account, and the data gets richer over time. For that to work across apps, records need a shared way to point at the same place. That is why your URNs interest me. I am happy to add optional fields to my lexicon so our records line up.

On your questions:

  • Home (your question 1): I prefer a neutral one, ATGeo or lexicon.community. It is better long term, because several check-in lexicons already exist.
  • Categories (your question 3): a shared coarse list sounds useful. Placita has a longer list of its own, and I could map it onto yours. I would keep it open for new values.

One more question, from testing in Barcelona, where I live. I took 53 Foursquare places around Gràcia, El Born and Eixample that your suggestions endpoint matches to an OSM place. For 45 of them, getPlace on the OSM record points back to the Foursquare ID. For 8 it does not. One example is Cactus Bar in El Born. The suggestions answer says the Foursquare place and OSM node 4321293689 are the same, but getPlace on that node has an empty sameAs. An app that only knows the OSM ID, like mine, would not find the Foursquare pin in those cases. Is this a known gap, or do the links only show up in some answers?

@montoulieu.dev, I would be interested in your view too, since Beacon Bits already has a check-in record.

2 Likes

Hi Sebastian, this lands nicelyon something I’m working on. CultureBlocs (intro here: https://discourse.atmosphere.community/t/cultureblocs-data-points-on-cultural-and-creative-activity/1321) records cultural activity: venues publish their profile and listings, and people mint “I went” records against events. Places are the missing join.

A few thoughts from the cultural-venue side:

  • Home: +1 for a neutral home (ATGeo or Lexicon Community).

  • Reusable place reference: could the place reference itself (URN in origin, sameAs, name, level, areas) be a reusable def as well as part of the pin record? I’d like to embed it in our own records (a visit or screening, a venue profile, an event location) rather than write a separate pin alongside each one. Your precision levels and the never-write-device-position rule fit our privacy defaults exactly.

  • Categories: a shared coarse list, open-ended, with gallery, museum, cinema, theatre, music venue, festival site and library in it.

  • Venue edge cases: venues nest (a hall, cinemas and a gallery in one building), some are temporary (art fair tents, festival stages) and won’t be in any gazetteer, and they rename and move. How would you handle a place that isn’t in the gazetteer yet?

Happy to test against places.eurosky.tech with some London venues.

mark