Ayaan2907/wingmic

voice-first networking memory · your social RAM, on disk

★ 1Forks 1TypeScriptGitHub ↗Compare

Project website ↗

aiclaudecrmdeveloper-toolsmemory-graphnetworkingnextjsopen-sourcetypescriptvoice-first

README

wingmic logo

wingmic

wingmic.xyz hero — you met twelve people this week. Wingmic remembers everyone.

voice-first networking memory · open source · MIT

Stop forgetting. Start building.

License: MIT Status PRs Welcome Live CI

Live site · App · Roadmap · Self-host · Contribute · Discussions


the handshake memory leak

You meet 12 people at a conference. By day's end you remember 3 names, 1 company, and zero context. Your brain's RAM got garbage-collected.

Your brain is RAM. Conferences are memory pressure. 12 people met · 3 names recalled · 0 follow-ups sent.

LinkedIn is a graveyard. Notion CRMs want typing time you don't have. Phone contacts are a graveyard. Between two sessions at a conf you have ninety seconds and a coffee in one hand. There's no typing budget.

Wingmic is the tool you open right after you meet someone. Voice-dump the context, commit to your memory graph, never forget a connection again.


three verbs · speak. extract. query.

Three verbs: Speak. Extract. Query. No CRM tax. No form filling. No manual tagging.
you, after a meetup, into your phone:
  > "met sarah from acme at the rust meetup, she leads their edge runtime team,
     send her the github link tomorrow morning"

wingmic, instantly:
  ✓ committed to graph
    → person:    Sarah  (Lead · Edge runtime @ Acme)
    → event:     Rust meetup  (canonical, shared)
    → topics:    rust · edge runtime
    → action:    send github link · tomorrow 9:00 AM

you, three weeks later:
  > "who at acme works on rust?"

  ↪ found 1 match in 0.3s:
    • Sarah  ·  Lead · Edge runtime  ·  Acme  ·  met at Rust meetup
      "she leads their edge runtime team, send her the repo"

That's the whole product. Hold a button. Talk for twenty seconds. Ask anything later, in plain English, get an answer.

Ask in plain English. Voice capture builds your graph — recall answers in the app.

features

🎤 voice capture AssemblyAI hosted transcription. Swap providers via OpenRouter model env.
🧠 hybrid extraction heuristics + Haiku relation linker (via OpenRouter) → Zod schema. Pulls people, companies, events, topics, follow-up actions.
🔍 NL recall "who at acme ships rust?" → top matches in < 500ms. text-embedding-3-small (via OpenRouter) + libSQL vector_top_k.
🔒 private people, public facts Sarah-the-person stays yours alone. Acme-the-company is canonical, shared across users (lazy promotion).
✉️ magic-link auth BetterAuth + Resend. No passwords, no OAuth, no install friction.
🌐 mobile-first PWA Responsive web. No App Store, no DMG, no install. Visit and use.
🛠 typed end-to-end Drizzle + tRPC + TypeScript. One source of truth from DB to UI.

roadmap

version what ships status
v1.0.0 speak · extract · query — voice capture, NL recall, magic-link sign-in at app.wingmic.xyz ✅ shipped Aug 25, 2026
v1.1 contact imports — LinkedIn export, Google Contacts, vCard, OAuth connectors 📋 coming next · #10 epic
v1.2 Acts agent — drafts emails / check-ins / intros, permission-first 📋 coming next · #11 epic
v1.3 MCP server + Slack bot — query your network from Claude / ChatGPT / Slack 📋 coming next
v1.4 self-host — Docker Compose + BYO API keys 📋 planned
v1.2 preview — Acts agent mockup, not live. Permission-first drafts only: warm intro, reminder, follow-up email — you review and click send.

v1.2 preview — Acts agent drafts the email, you click send. Not live yet.

Roadmap and milestone progress live on the project board.


stack

layer choice why
Web framework Next.js 15 (App Router + RSC) Mature, edge-ready; tRPC covers the API surface
Runtime + pkgs Bun 1.3 + workspaces 10-20× faster install, native TS, native sqlite
Styling Tailwind 3 + design tokens App surface only — homepage uses inline styles by design
DB + ORM Drizzle + libSQL/Turso Edge-native, ~50 KB runtime, sqlite-with-replicas
LLM framework Vercel AI SDK v6 via OpenRouter (Claude Haiku 4.5 linker) Hybrid extraction; swap providers with one env value
Embeddings text-embedding-3-small (1536-d, via OpenRouter) $0.02 / 1M tokens, native libSQL F32_BLOB(1536)
Auth BetterAuth + Resend OSS, self-hostable, magic-link only
API tRPC v11 Typed end-to-end, multi-client (RN / MCP later)
State React Context for capture state; React Query for server Minimal, no Redux
Hosting Cloudflare Pages (landing) + Railway (product) Static edge + Node.js runtime, Turso replicas for low-latency reads
Tests Vitest unit + Playwright E2E Fastest TS testing, mobile + desktop projects

monorepo layout

apps/web              ← static landing → wingmic.xyz (Cloudflare Pages)
apps/app              ← dynamic product → app.wingmic.xyz (Railway, Node.js)
packages/
  brand               ← logos, favicons, OG, manifest
  design-tokens       ← Tailwind preset + token TS exports
  db                  ← Drizzle schema + libSQL + migrations
  extractor           ← entity-detection pipeline + eval harness
  config/{tsconfig,eslint,vitest}
design/               ← canonical mocks (read-only)
docs/                 ← architecture.md, deploy.md, packages.md, superpowers/
CLAUDE.md             ← Claude Code project context
turbo.json

Built as a Turborepo monorepo. See docs/architecture.md § 0 for the full map.

two deploy targets

Surface Source Hosting URL
Landing (static) apps/web → next export Cloudflare Pages wingmic.xyz
Product (dynamic) apps/app → next start Railway (Node.js) app.wingmic.xyz

Operator runbook: docs/deploy.md.


quick start

Pick your path. Both work.

🤖 with an agent (Claude Code, Cursor, Codex, etc.)

Paste this prompt into your AI coding assistant. It walks you through clone → secrets → first run, asking at each step.

Set up wingmic for me on this machine. The repo is github.com/Ayaan2907/wingmic — an
open-source voice-first networking memory app.

Do this in order, stopping for me at each step:

  1. Check if Bun (>=1.3) and Node (>=20) are installed. Install Bun if missing
     via `curl -fsSL https://bun.sh/install | bash`.
  2. Clone https://github.com/Ayaan2907/wingmic.git into ./wingmic if not already.
  3. Run `bun install` from the repo root.
  4. Copy apps/app/.env.example to apps/app/.env.local.
  5. Walk me through obtaining the required secrets per docs/deploy.md § 2:
       - TURSO_DB_URL + TURSO_AUTH_TOKEN  (turso CLI)
       - BETTER_AUTH_SECRET                (openssl rand -base64 48)
       - BETTER_AUTH_URL                   (http://localhost:3211 for local dev)
       - RESEND_API_KEY                    (resend.com — domain must be verified)
       - OPENROUTER_API_KEY                (openrouter.ai — LLM + embeddings)
       - ASSEMBLYAI_API_KEY                (assemblyai.com — hosted ASR)
     Stop and ask me at each one — do NOT generate or fetch any keys yourself.
     For local dev only OPENROUTER_API_KEY and ASSEMBLYAI_API_KEY are required;
     the rest can be left blank with safe defaults.
  6. Once .env.local is filled, run `bun run db:apply` to create
     a local SQLite at apps/app/local.db.
  7. Run `bun run dev:app` from the repo root. Show me http://localhost:3211 once it's up.
  8. Tell me to sign in: visit /signin, type any email, and check the dev-server
     console — the magic link is always logged there (email sends only when RESEND_API_KEY is set).

Brand voice rule: when committing or summarizing, do NOT add "Co-Authored-By: Claude"
or any AI co-author trailer. Authorship is mine.

🛠 manually

Prerequisites: Bun 1.3+ (curl -fsSL https://bun.sh/install | bash) and Node 20+.

git clone https://github.com/Ayaan2907/wingmic.git
cd wingmic
bun install

cp apps/app/.env.example apps/app/.env.local
# Fill in OPENROUTER_API_KEY and ASSEMBLYAI_API_KEY at minimum.
# See docs/deploy.md for how to acquire each.

bun run db:apply

bun run dev:app   # → http://localhost:3211 (product)
# or: bun run dev:web  # → http://localhost:3210 (landing)

Sign in: type any email at /signin. The magic link is logged to the dev console since RESEND_API_KEY isn't set locally.

🤝 making your first contribution

Paste this into your AI coding assistant when you want to send a PR.

Help me make my first contribution to wingmic (github.com/Ayaan2907/wingmic).

  1. Read these in order — they're the maintainer contract:
       - README.md
       - CONTRIBUTING.md
       - docs/architecture.md
       - design/design-system.md (only if the work is UI / brand-voice)
  2. List open issues tagged `good first issue`:
       gh issue list --label "good first issue" --state open
  3. Ask me which issue number I want to tackle. Don't pick one for me.
  4. Read the issue body in full. Identify exact files to touch.
  5. Branch from staging: `git checkout staging && git pull && git checkout -b feat/<short-name>`
     (or fix/, docs/, chore/) per CONTRIBUTING.md branch conventions.
  6. Make the change. Add or update Vitest or Playwright tests for new behavior.
  7. Run the local CI checks before committing:
       - bun run typecheck
       - bun --filter @wingmic/web lint
       - bun run test
       - bun run build
     All must pass.
  8. Commit using Conventional Commits (e.g. `feat(capture): add text fallback`).
     Do NOT add "Co-Authored-By: Claude" or any AI trailer to the commit message.
  9. Push and open a PR with the template-required fields filled in. Reference
     the issue number with `closes #N`.
 10. Stop and let me review before pushing or merging.

Stay focused on the chosen issue. If you spot unrelated improvements, file
them as separate issues — don't pile them into the PR.

scripts (workspace root)

bun run dev          # turbo dev — defaults to apps/web; use dev:app for product
bun run dev:web      # apps/web on :3210
bun run dev:app      # apps/app on :3211
bun run typecheck    # all workspaces
bun run lint         # all workspaces
bun run test         # all workspaces
bun run build        # apps/web (next export) + apps/app (next build)
bun run db:apply     # apply migrations against TURSO_DB_URL or local file
bun run db:studio    # open Drizzle Studio
bun run extract:eval # run canonical 50-fixture extractor accuracy suite

Filter to one workspace: bun --filter=@wingmic/<name> <script>.


self-host

Wingmic is fully open source. You can run the entire stack on your own infra without touching the hosted version.

Status:

  • v1.0.0 — manual self-host works today (clone, fill env, deploy to your provider). Documented in docs/deploy.md.
  • v1.4 — single-command docker-compose up with BYO API keys is on the roadmap.

From the workspace root:

# Landing (static, no secrets) — Cloudflare Pages dashboard
# Build command:  bun run --filter=@wingmic/web build
# Output dir:     apps/web/out

# Product (dynamic, 8 secrets) — Railway
# Service root:   apps/app
# Build:          bun install --frozen-lockfile && bun --filter @wingmic/app build
# Start:          bun --filter @wingmic/app start
# (defined in railway.json at repo root)

The hosted wingmic.xyz and the self-host code are identical — same repo, same migrations, same secrets. We don't keep a paid SaaS-only fork.


privacy

  • People are private. Captured people stay scoped to your user. Never shared, never used to enrich anyone else's graph.
  • Companies / events / topics are public facts. Acme is Acme regardless of who knows about it. The canonical layer is shared across users with no consent surface (because it doesn't need one).
  • Voice transcripts are sent to Anthropic for extraction. We disclose this in the UI before first capture; you can review the exact prompt.
  • Embeddings are sent to OpenAI (text-embedding-3-small). 1536-d float vectors, no metadata.
  • No analytics on the homepage by default. Self-host to verify.
  • Magic links are short-lived (10 min) and single-use.

Read the full ethics + data handling page (in progress at /ethics).


contributing

PRs are welcome. Read CONTRIBUTING.md and the Code of Conduct before opening a pull request.

If you're new, look for the good first issue label. Each labeled issue includes context, acceptance criteria, and which file(s) to touch.

Bugs go to issues. Security to SECURITY.md. Ideas + general questions to discussions.


brand voice

Wingmic has a defined voice. Lowercase confident. One italic-serif twist per heading. Editorial-brutalist + terminal aesthetic. No "powered by," no "seamless," no "cutting-edge." See design/design-system.md for the full reference. Match it in any UI copy.


license

MIT — see LICENSE.

If you build something on top of wingmic, we'd love to see it — open a discussion or tag @Ayaan2907.

Contributors

Ayaan2907cursoragentclaudeobvious-autobuild[bot]ObviousApprailway-app[bot]TanzeelsameenCopilot

Issues