Applicant Tracking
Business & SaaS · React + Node (Express) · 21 @molecule/* packages
Greenhouse-like ATS with job posts, applications, pipeline, and scoring — with built-in Stripe-backed subscription tiers
Try it
Opens instantly. Runs on sample data, so changes reset on reload.
What is inside
Screens (18)
- Landing
/ - Login
/login - Signup
/signup - ForgotPassword
/forgot-password - ResetPassword
/reset-password - Dashboard
/dashboard(signed in) - Pipeline
/pipeline(signed in) - CandidateDetail
/candidates/:id(signed in) - Jobs
/jobs(signed in) - Interviews
/interviews(signed in) - Settings
/settings(signed in) - JobDetail
/jobs/:id(signed in) - NewJob
/jobs/new(signed in) - Candidates
/candidates(signed in) - Reports
/reports(signed in) - Notifications
/notifications(signed in) - Profile
/profile(signed in) - Billing
/billing(signed in)
Data model (18 tables)
- activities — id, actorId, action, resourceType, resourceId, metadata, createdAt
- activity_seen_status — userId, lastSeenActivityId, updatedAt
- ai_score_breakdowns — id, user_id, candidate_id, criterion, score, comment, generated_at, updatedAt
- applications — id, user_id, job_id, candidate_id, stage, source, resume_url, cover_letter, …
- candidate_stage_events — id, user_id, candidate_id, application_id, from_stage, to_stage, actor_user_id, occurred_at, …
- candidates — id, user_id, first_name, last_name, email, phone, location, source, …
- comments — id, resourceType, resourceId, userId, parentId, body, editedAt, createdAt, …
- devices — id, createdAt, updatedAt, userId, name, pushPlatform, pushSubscription, hasPushSubscription
- interviews — id, user_id, candidate_id, job_id, scheduled_at, duration_minutes, panel_user_ids, stage, …
- jobs — id, user_id, title, department, location, type, description, requirements, …
- notes — id, user_id, candidate_id, author_user_id, body, created_at, updatedAt
- notifications — id, user_id, kind, payload, read_at, created_at, updatedAt
- offers — id, user_id, candidate_id, job_id, salary_cents, currency, start_date, status, …
- payments — id, createdAt, updatedAt, userId, transactionId, productId, platformKey, data, …
- resource_tags — id, tagId, resourceType, resourceId, createdAt
- resume_uploads — id, user_id, candidate_id, s3_key, filename, content_type, size_bytes, uploaded_at, …
- scorecards — id, user_id, candidate_id, application_id, interview_id, reviewer_id, criterion, overall_rating, …
- tags — id, name, slug, color, description, createdAt, updatedAt
API (9 handlers)
- applications
api/src/handlers/applications.ts - candidates
api/src/handlers/candidates.ts - interviews
api/src/handlers/interviews.ts - jobs
api/src/handlers/jobs.ts - notifications
api/src/handlers/notifications.ts - profile
api/src/handlers/profile.ts - reports
api/src/handlers/reports.ts - scorecards
api/src/handlers/scorecards.ts - settings
api/src/handlers/settings.ts
Subscription tiers
free / pro / team — gated by: maxApplications, maxCandidates, maxJobs, maxScorecards, advancedFeatures, canExport, retentionDays
Built from 21 @molecule/* packages
@molecule/api-ai-classification@molecule/api-database-postgresql@molecule/api-email-templates@molecule/api-emails-mailgun@molecule/api-entitlements@molecule/api-payments-stripe@molecule/api-permissions-custom@molecule/api-resource-activity-feed@molecule/api-resource-comment@molecule/api-resource-payment@molecule/api-resource-tag@molecule/api-resource-user@molecule/api-search-meilisearch@molecule/api-uploads-s3@molecule/app-billing-react@molecule/app-command-palette@molecule/app-data-table@molecule/app-file-upload@molecule/app-kanban@molecule/app-notification-feed-react@molecule/app-sidebar-layout-react
Required secrets
DATABASE_URLPostgreSQL connection stringMEILISEARCH_API_KEYMeiliSearch API keyS3_BUCKETS3 bucket for resumesMAILGUN_API_KEYMailgun API keyMAILGUN_DOMAINMailgun sending domain
The @molecule/* packages are Apache-2.0. The app you build from this template is yours to export and self-host. Licensing