Your relationship memory.
Ping remembers who you met, when to reach out, and what to say — so your network works for you without the anxiety of figuring it all out yourself.
A native iOS app for students and early-career professionals who meet valuable people but lose touch because they don't know when or what to say.
Core loop: Meet → Log (< 30s) → Get nudged → Edit AI draft → Send
The user always sends manually. Authenticity is everything.
All architecture, design, and product decisions live in /design-docs/:
| Doc | Contents |
|---|---|
| 01 — Product Vision | What Ping is, who it's for, JTBD, competitive positioning |
| 02 — Architecture | Stack, Supabase schema, data flows, iOS structure |
| 03 — Design System | Colors, typography, components, motion |
| 04 — Navigation & Screens | Screen inventory, wireframes, user flows |
| 05 — AI Pipeline | Embeddings, nudge algorithm, draft generation |
| 06 — Integrations | LinkedIn, Google (Contacts/Calendar/Gmail), Share Sheet |
| 07 — Engineering Setup | Xcode setup, Supabase config, secrets management |
- iOS — Swift / SwiftUI, iOS 17+
- Backend — Supabase (Postgres + pgvector + Edge Functions)
- AI — HuggingFace inference (drafts + contact extraction from voice) + Gemini text-embedding-004 (semantic search)
- Auth — Sign in with Apple + Sign in with Google
- Frictionless contact capture — voice (hold-to-speak) or text, under 30 seconds. AI extracts name, company, title, and notes from speech.
- Semantic search — natural language + goal-triggered contact surfacing using pgvector embeddings.
- Smart adaptive nudges — AI-scored timing, push notification with draft preview.
- AI message drafting — tone-calibrated via user writing samples, always user-edited and user-sent.
- LinkedIn sync — CSV import + iOS Share Sheet extension.
- Google sync — Contacts import, Calendar scan, Gmail suggestions.
- Guided interactive tutorial — 5-step walkthrough (Welcome → Import → About You → First Capture → Done) that teaches by doing. Users finish with real data in the app. Replayable from Profile → Replay Tutorial.
- VoiceInputField — reusable hold-to-speak mic component embedded in all freeform text fields:
- QuickCapture Notes
- Edit Contact: How You Met + Notes
- Log Interaction: Note and Interaction Notes
- Streams partial transcripts live; appends to existing text rather than replacing it.
- Uses
SFSpeechRecognizer+AVAudioEnginewith full permission handling and Settings deep-link fallback.
- Users describe themselves (career role/company/industry/seniority, interests, city, hometown, school, freeform "what I'm looking for").
- Editable from Profile tab → About You, and presented as a skippable tutorial step.
- Feeds into the recommendation engine:
CommonalityMatchersurfaces contacts who share interests, industry, school, or company with the user;RecommendationViewModelpersonalizes the position-tier heuristic based on user seniority.
TabView with 4 tabs: Ping (nudges), Network (contacts), Search (semantic + recommendations), You (profile).
Modern Swift @Observable macro throughout (not ObservableObject in new code). AuthViewModel is ObservableObject for legacy compatibility with @StateObject / @ObservedObject in the TabView host.
- Supabase — all contacts, interactions, nudges, goals, and user profiles.
- Keychain — auth tokens via
KeychainHelper. @AppStorage—hasCompletedTutorial, tone sample cache flag, UI preferences.
| Migration | Contents |
|---|---|
| 001 | Initial schema (contacts, profiles, interactions, nudges, goals) |
| 002 | Enable pgvector extension |
| 003 | RLS policies |
| 004 | Vector search functions |
| 005 | Triggers (updated_at, profile auto-create on signup) |
| 006 | Device token for push notifications |
| 007 | App config (remote config table) |
| 008 | Contact dedup indexes |
| 009 | About You profile fields (career, interests, location) |