Skip to content

Discovery

The map is the home of Tomoda. Discovery is how the user finds friends, events, moments, and places worth going to — and it is the surface that makes the product feel like a place rather than a feed.

The story

A social product without a feed needs a different gravitational centre. Ours is the map. It's the first thing the user sees when the app opens, the first thing they interact with, and the single surface where every other feature in the product shows up: friends as live pins, events as joinable pins, moments as ephemeral badges on places, and locations as the underlying primitive everything else hangs on.

The hardest design constraint was scale across zoom. A map of "every event in the world" at continent-level zoom is useless — visually it's a million pixels of noise; functionally it's a query that hangs the server. A map of "every friend within walking distance" at street-level zoom is the opposite — it's the most valuable view in the product and it has to be fast. We solved that by splitting the rendering into viewport tiers. At low zoom (continent / regional) we ship cluster aggregates — one marker per coarse grid cell with counts of events, locations, and moments inside it. At high zoom (city / neighbourhood / street) we ship individual markers and let the client handle visual clustering. Friends are always individual markers regardless of zoom, because seeing exactly where a friend is is the point.

The other shape that matters is the radar. The map is the spatial view; the radar is the "who and what is near me right now" view — a sorted list of friends and Near-You strangers within a radius. Same data, different presentation. We built the radar because some surfaces of the product want distance ordering, not spatial layout — picking who to ping for a coffee in the next hour is a list operation, not a map operation.

The third shape is search. Where the map and the radar are spatial, search is intent: the user already knows what they want and wants to be taken to it. One query surface covers events, places, and people, plus a natural-language path that reads a phrase like coffee tomorrow morning and resolves it against the same place vocabulary and geocoder the map uses. Search, the map, the radar, and the public profile card are one read domain. They share the taxonomy and the same privacy rules, so a place found by typing behaves exactly like the same place tapped on the map.

We made one cross-cutting privacy decision early. Every read in discovery enforces the same set of rules as every other surface: the friends-only events of a host don't show to non-friends, the invite-only event detail isn't returned without an approved participation row, the friends_only moments don't appear in a stranger's view of a profile, and the event's chat_room_id is only echoed back to people who joined. The map is the least private-feeling surface in the product; the actual privacy is one layer deeper, enforced at every read.

What we're optimising for

  • Bounded discovery. Every view has a horizon — a viewport, a radius, a zoom tier. Nothing is infinite.
  • The map is the surface. Almost everything else in the app routes back to it.
  • One read surface. The map, the radar, search across events, places, and people, and the public profile card are a single query domain sharing one place vocabulary and one privacy layer.
  • Friend markers always individual. No matter how zoomed-out, your friends are individual pins. Clustering them is anti-social.
  • Cluster aggregates do the spatial heavy lifting. Low-zoom views are a server-side roll-up, not a million markers.
  • Privacy enforced at the read. Visibility tiers in the data model are honoured by discovery, not bolted on at the UI layer.
  • Sponsorship is bounded too. Sponsor priority lets a global event bypass clustering, but only events at the highest sponsorship tier — it's not an ad slot, it's a hint that an event is large enough to matter outside its immediate neighbourhood.

What discovery is not

  • It is not a feed. There is no infinite vertical scroll of posts.
  • It is not a recommendation engine. The event listing is ranked by a simple category-affinity + distance-decay model, but the surface area is bounded by the viewport — we never push a recommendation the user didn't ask for.
  • It is not search-first. Search exists, but the gravitational centre is the map.

See also