Most call scorers grade what you said. Playcall grades whether what you said was right for who you were talking to.
Demo · Setup · Deploy · Security
- Framework: Next.js 16 (App Router) + React 19
- Database / Auth: Supabase (Postgres, Auth, RLS, Edge Functions)
- AI: Vercel AI SDK — OpenAI, Anthropic, and 15 other providers; BYOK per workspace
- Document parsing: LlamaParse (PDF, DOCX, PPTX, images, 130+ formats)
- Audio transcription: OpenAI Whisper
- File uploads: Vercel Blob
- Enrichment: Exa or TheHog (buyer/company context)
- UI: Tailwind CSS + shadcn/ui
- Node.js 20+ and pnpm
- Supabase account
- Vercel account
- OpenAI API key (scoring + audio transcription)
- LlamaParse API key (free tier: 10k credits/month)
- Enrichment key — Exa (
EXA_API_KEY) or TheHog (THEHOG_ACCESS_KEY+THEHOG_SECRET_KEY)
git clone https://github.com/Dphenomenal101/playcall.git
cd playcall
pnpm installGo to supabase.com/dashboard → New project. Once provisioned:
- Authentication → URL Configuration: set Site URL and add your domain to Redirect URLs (e.g.
https://yourdomain.com/auth) - Authentication → Email Settings: enable a custom SMTP provider — Supabase's built-in sender is rate-limited on the free tier
# Install the Supabase CLI if you don't have it: https://supabase.com/docs/guides/cli
supabase login
supabase link --project-ref <your-project-ref> # Project Settings → General
supabase db pushsupabase functions deploy process-jobSet the secrets the function needs. WORKSPACE_SECRETS_ENCRYPTION_KEY must be the same value you set in your app environment — the Edge Function uses it to decrypt BYOK credentials:
supabase secrets set WORKSPACE_SECRETS_ENCRYPTION_KEY=your_key
supabase secrets set OPENAI_API_KEY=your_key
# Optional
supabase secrets set ANTHROPIC_API_KEY=your_key
supabase secrets set EXA_API_KEY=your_key
# or TheHog:
supabase secrets set THEHOG_ACCESS_KEY=your_key
supabase secrets set THEHOG_SECRET_KEY=your_key- Create a Vercel project for this repo at vercel.com/new
- Storage → Create → Blob → connect to project
- Pull env vars locally — this writes
BLOB_READ_WRITE_TOKENto.env.local:
vercel link
vercel env pull .env.local.env.local now has your Blob token. Add the remaining required values — use .env.example as the reference for what's needed and why:
Supabase — from Project Settings → API:
NEXT_PUBLIC_SUPABASE_URLNEXT_PUBLIC_SUPABASE_ANON_KEYSUPABASE_SERVICE_ROLE_KEY
LlamaParse — from cloud.llamaindex.ai:
LLAMA_CLOUD_API_KEY— your API keyLLAMA_CLOUD_WEBHOOK_SECRET— generate withopenssl rand -hex 32LLAMA_CLOUD_WEBHOOK_URL— set tohttps://yourdomain.com/api/webhooks/llamaparse(or your ngrok URL for local dev)
App URL:
NEXT_PUBLIC_APP_URL— your app's public base URL. Set tohttp://localhost:3000for local dev, and your deployed domain (e.g.https://yourdomain.com) in production. Used for invite links and the LlamaParse webhook URL.
Other secrets — generate locally:
openssl rand -base64 32 # → WORKSPACE_SECRETS_ENCRYPTION_KEY (must match step 4)
openssl rand -hex 16 # → CRON_SECRETpnpm devOpen localhost:3000 and complete the manager onboarding flow.
- Click the button above (or import your repo at vercel.com/new)
- Storage → Create → Blob → connect to your project (
BLOB_READ_WRITE_TOKENis injected automatically) - Project Settings → Environment Variables — add everything from
.env.local, but setNEXT_PUBLIC_APP_URLto your deployed domain (nothttp://localhost:3000) - Push to your default branch — Vercel deploys automatically and activates the daily keep-alive cron that prevents free-tier Supabase projects from pausing
app/
manager/ Manager dashboard, onboarding, playbooks, settings
rep/ Rep dashboard, call upload, scorecard
api/ Route handlers, webhooks, cron
lib/
data/ Supabase read/write logic
ai/ Provider registry, BYOK config resolution
enrichment/ Exa and TheHog enrichment providers
integrations/ LlamaParse and third-party API clients
extraction/ Whisper audio transcription + plain-text file reading
security/ Credential encryption at rest
jobs/ Async job dispatch
components/ Shared UI components
supabase/
migrations/ Database schema
functions/ Edge Functions (process-job)
Contributions are welcome.
- Fork the repo and create a feature branch.
- Run the app locally and verify your change in context.
- Keep changes focused and include any docs updates that make the behavior clearer.
- Open a pull request with a concise summary of what changed and why.
If your change affects setup, deployment, or security assumptions, update README.md and SECURITY.md in the same PR.
For security issues, do not open a public issue. Follow the reporting guidance in SECURITY.md.