Skip to main content

Tech Stack

Frontend

The frontend is a TypeScript React application built with Vite. It deploys to Vercel.

TechnologyVersionPurpose
React19.1.1UI framework
TypeScript~5.9.3Type safety
Vite7.1.7Build tool and dev server
React Router7.9.4Client-side routing
Tailwind CSS4.1.14Utility-first styling
Recharts3.2.1Data visualization (analysis charts)
Lucide React0.545.0Icon library
Supabase JS2.75.0Auth client (login/signup only)

Dev server port: 5173

Frontend Pages (8)

PagePurpose
LoginPageEmail/password authentication
SignupPageNew account creation
DashboardPageCampaign list and overview
MissionWizardPageAI-guided question creation
ConfigureCampaignPageCampaign settings and participant upload
CampaignDetailPageCampaign monitoring and conversation list
ParticipantResponsePageChat interface for participants
AnalysisPageAI-generated analysis dashboard

Backend

The backend is a plain JavaScript Express application. It deploys to Render.

TechnologyVersionPurpose
Node.js18+Runtime
Express5.1.0Web framework
Anthropic SDK0.66.0Claude AI API client
Supabase JS2.75.0Database and auth client
Resend6.1.3Transactional email delivery
node-cron4.2.1Scheduled reminder jobs
csv-parse6.1.0CSV participant upload parsing
multer2.0.2File upload handling
cors2.8.5Cross-origin request handling
uuid13.0.0Unique ID generation

Server port: 3001

Backend Structure

backend/src/
├── server.js # Entry point
├── config/
│ ├── supabase.js # Supabase client setup
│ └── resend.js # Resend client setup
├── middleware/
│ └── auth.js # JWT authentication
├── routes/
│ ├── campaigns.js # Campaign endpoints
│ ├── conversations.js # Conversation endpoints
│ ├── mission.js # Mission wizard endpoints
│ └── analysis.js # Analysis endpoints
├── controllers/
│ ├── campaignController.js
│ ├── conversationController.js
│ ├── missionController.js
│ └── analysisController.js
├── services/
│ ├── aiService.js # All Claude AI functions (1000+ lines)
│ ├── emailService.js # Email templates and sending
│ └── reminderScheduler.js # Cron-based reminders
└── utils/
└── jsonExtractor.js # Safe JSON parsing from AI responses

Database

TechnologyPurpose
SupabaseHosted PostgreSQL with built-in auth and row-level security
PostgreSQLRelational database (7 tables)
Row-Level SecurityMulti-tenant data isolation
JWTAuthentication tokens managed by Supabase Auth

See Data Model for the full schema.

Infrastructure

ServicePurposeEnvironment
VercelFrontend hosting and CDNProduction
RenderBackend API hostingProduction
Supabase CloudDatabase and authProduction
ResendEmail delivery (hello@tap.yelin.io)Production
Anthropic APIClaude AI accessProduction

Environment Variables

Backend

VariablePurpose
PORTServer port (3001)
NODE_ENVEnvironment (development/production)
SUPABASE_URLSupabase project URL
SUPABASE_ANON_KEYPublic Supabase key
SUPABASE_SERVICE_ROLE_KEYAdmin Supabase key (bypasses RLS)
ANTHROPIC_API_KEYClaude AI API key
RESEND_API_KEYResend email API key
FROM_EMAILSender address for emails
APP_URLFrontend URL for email links

Frontend

VariablePurpose
VITE_SUPABASE_URLSupabase project URL
VITE_SUPABASE_ANON_KEYPublic Supabase key
VITE_API_URLBackend API base URL