Profile
One per Seeker or Organization. Read withget_profile; written with update_profile.
Seeker content
One per Seeker. Written withupdate_experience and update_what_is_next; the owner reads both back from get_profile, and Organizations and peer Seekers see both via get_profile.
Search over these blobs is plain keyword/text matching — no structured filters.
Role
Posted by Organizations; public while open.
Public role pages live at
/o/[org]/[role].
Interest
One row per(seeker, role, side) — unique, so interest is idempotent and per-side.
Match
Computed, never stored: both sides’ interest rows exist for the same(seeker, role) and the role is open.
Connection interest / Connection (Seeker ↔ Seeker)
A directedconnection_interest row per (from_seeker, to_seeker). A connection is computed: both directions exist. On connection, both Seekers’ contact_emails are shared for free — no credits, no unlock.
Public Seeker profiles show a connection count (never identities).