Skip to content

Find My Friends — Detailed#

flowchart TB
  subgraph Apps
    A([User A app])
    B([User B app])
  end

  subgraph Edge
    LB
    WS[WebSocket gateway<br/>persistent connection]
  end

  subgraph Loc[Location plane]
    ING([Location Ingest])
    BATCH[Adaptive batching<br/>battery aware]
    GEO[(Presence KV<br/>user_id -> lat lng ts)]
    HIST[(Optional history)]
  end

  subgraph Sharing[Sharing graph]
    REL[Sharing Service]
    ACL[(Permissions)]
    GRP[Groups / families]
    TEMP[Temp share link]
  end

  subgraph Fanout[Notify subscribers]
    PUB[[Pub/Sub per-user channel]]
    SUB[Subscriber sessions]
  end

  subgraph Privacy[Privacy & precision]
    BLUR[Coarsen / blur]
    OFF[Stop sharing]
    AUDIT[Audit log]
  end

  subgraph Notif
    PUSH((APNS / FCM))
    GEOFENCE([Geofence trigger])
    EMERG[SOS / emergency]
  end

  A --> LB --> WS --> ING --> GEO
  GEO --> PUB --> SUB --> WS
  ING --> HIST
  Sharing --- A
  Sharing --- B
  Privacy --- ING
  Privacy --- GEO
  Notif --- GEOFENCE

    classDef client fill:#dbeafe,stroke:#1e40af,stroke-width:1px,color:#0f172a;
    classDef edge fill:#cffafe,stroke:#0e7490,stroke-width:1px,color:#0f172a;
    classDef service fill:#fef3c7,stroke:#92400e,stroke-width:1px,color:#0f172a;
    classDef datastore fill:#fee2e2,stroke:#991b1b,stroke-width:1px,color:#0f172a;
    classDef cache fill:#fed7aa,stroke:#9a3412,stroke-width:1px,color:#0f172a;
    classDef queue fill:#ede9fe,stroke:#5b21b6,stroke-width:1px,color:#0f172a;
    classDef compute fill:#d1fae5,stroke:#065f46,stroke-width:1px,color:#0f172a;
    classDef storage fill:#e5e7eb,stroke:#374151,stroke-width:1px,color:#0f172a;
    classDef external fill:#fce7f3,stroke:#9d174d,stroke-width:1px,color:#0f172a;
    classDef obs fill:#f3e8ff,stroke:#6b21a8,stroke-width:1px,color:#0f172a;
    class A,B client;
    class WS edge;
    class BATCH,REL,GRP,TEMP,SUB,BLUR,OFF,EMERG service;
    class GEO,HIST,ACL datastore;
    class PUB queue;
    class ING,GEOFENCE compute;
    class PUSH external;
    class AUDIT obs;

Update cadence#

  • High when moving fast / app in foreground; rare when stationary or background.
  • Significant-location-change OS callback to save battery.

Privacy#

  • Sharing is opt-in per friend, with temporary share windows.
  • Coarsen precision for low-trust grants.
  • Server stores last known location only by default; history is per-user opt-in.

Subscriber notification#

  • Each user has a topic; subscribers receive deltas over WS.
  • Geofence triggers: client-side or server-side rules (e.g., "notify me when X gets home").

Glossary & fundamentals#

Concepts referenced in this design. Each row links to its canonical page; the tag column shows whether it is a high-level (HLD) or low-level (LLD) concept.

Tag Concept What it is Page
HLD Pub/Sub & message brokers topics, consumer groups, delivery semantics pub-sub-pattern
HLD Observability metrics, logs, traces, SLOs observability
HLD Realtime protocols WS / SSE / polling / gRPC streaming realtime-protocols
LLD Async models futures / async-await / coroutines / actors async-models