Most call scorers grade what you said. Playcall grades whether what you said was right for who you were talking to.
** Demo** Β·
Β·
SetupΒ·
SecurityFramework: 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
SupabaseaccountVercelaccountOpenAIAPI key (scoring + audio transcription)LlamaParseAPI key (free tier: 10k credits/month)- Enrichment key β
Exa(
EXA_API_KEY
) orTheHog(THEHOG_ACCESS_KEY
+THEHOG_SECRET_KEY
)
git clone https://github.com/Dphenomenal101/playcall.git
cd playcall
pnpm install
Go 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
supabase login
supabase link --project-ref <your-project-ref> # Project Settings β General
supabase db push
supabase functions deploy process-job
Set 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
supabase secrets set ANTHROPIC_API_KEY=your_key
supabase secrets set EXA_API_KEY=your_key
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_TOKEN
to.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_URL
NEXT_PUBLIC_SUPABASE_ANON_KEY
SUPABASE_SERVICE_ROLE_KEY
LlamaParse β from cloud.llamaindex.ai:
LLAMA_CLOUD_API_KEY
β your API keyLLAMA_CLOUD_WEBHOOK_SECRET
β generate withopenssl rand -hex 32
LLAMA_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:3000
for 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_SECRET
pnpm dev
Open 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_TOKEN
is injected automatically)Project Settings β Environment Variablesβ add everything from.env.local
, but setNEXT_PUBLIC_APP_URL
to 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.