An AI-powered career coaching platform that helps professionals accelerate their career growth through intelligent resume building, cover letter generation, interview preparation, and industry insights.
- Overview
- Features
- Tech Stack
- Database Schema
- Project Structure
- Installation
- Environment Variables
- Usage
- API Endpoints
- Database Relationships
- Contributing
- License
Uproot is a comprehensive career development platform that leverages artificial intelligence to help professionals:
- Create ATS-optimized resumes with AI assistance
- Generate personalized cover letters
- Practice interviews with AI-powered mock sessions
- Track career progress with detailed analytics
- Access real-time industry insights and market trends
- Schedule automated calls for career coaching
- Get personalized career guidance through an AI chatbot
The platform follows a freemium business model with tiered subscriptions (Free, Basic, Pro) and supports both traditional payment methods (Stripe) and Web3 payments.
-
AI-Powered Resume Builder
- ATS (Applicant Tracking System) optimization
- Multiple resume versions with version control
- Cloud-based storage with Cloudinary integration
- PDF export capabilities
- Public sharing links
-
Cover Letter Generator
- AI-generated personalized cover letters
- Job description analysis
- Multiple drafts and iterations
- Company and role-specific customization
-
Interview Preparation System
- AI-powered mock interviews
- Role-specific questions
- Performance assessments with scores
- Improvement tips and feedback
- Category-based quiz system
-
Industry Insights Dashboard
- Real-time industry trends
- Salary range data
- Growth rate analysis
- Market outlook
- Recommended skills
- Key trends identification
-
Scheduled Call Automation
- Automated call scheduling
- Call logs and transcripts
- Recording storage
- Status tracking
-
AI Career Chatbot
- 24/7 career guidance
- Personalized recommendations
- Industry-specific advice
-
Subscription Management
- Multiple subscription tiers (Free, Basic, Pro)
- Stripe integration for payments
- Web3/Blockchain payment support
- Usage tracking and limits
- Subscription cancellation and renewal
-
User Authentication & Authorization
- NextAuth.js integration
- OAuth provider support
- Email/password authentication
- Password reset functionality
- Email verification
- Next.js 15.1.7 - React framework with App Router
- React 19.0.0 - UI library
- TypeScript 5.0 - Type safety
- Tailwind CSS - Styling
- Radix UI - Component library
- Framer Motion - Animations
- Lucide React - Icons
- Next.js API Routes - Server-side API
- NextAuth.js 5.0 - Authentication
- Prisma 6.4.1 - ORM
- PostgreSQL - Database
- Node.js - Runtime environment
- OpenAI GPT-4 - AI-powered features
- Cloudinary - File storage and image processing
- Stripe - Payment processing
- Inngest - Background job processing
- Resend - Email service
- Ethers.js - Web3 integration
- ESLint - Code linting
- PostCSS - CSS processing
- Zod - Schema validation
Note:
- Primary Keys (PK): All entities have their primary key marked with
PKafter the attribute (e.g.,string id PK). Theidfield in each entity is the primary key.- Foreign Keys (FK): Foreign key relationships are shown by the connecting lines between entities (e.g.,
userIdin Account referencesidin User).- Unique Constraints (UK): Unique constraints are documented in the Database Models Description section below.
- Array Types: Array types (string[], json[]) are represented as
stringin the diagram for Mermaid compatibility.Viewing the Diagram: This diagram uses standard Mermaid ER diagram syntax. For best results, view on GitHub, GitLab, or use VS Code with the Mermaid extension. If PK markers don't appear, ensure your viewer supports Mermaid ER diagrams (version 9.0+).
erDiagram
User ||--o{ Account : "has"
User ||--o{ Session : "has"
User ||--o| Subscription : "has"
User ||--o{ Resume : "creates"
User ||--o{ CoverLetter : "creates"
User ||--o{ Assessment : "takes"
User ||--o{ ScheduledCall : "schedules"
User ||--o{ CallLog : "has"
User ||--o{ UsageTracking : "tracks"
IndustryInsight ||--o{ User : "has"
Resume ||--o{ ResumeVersion : "has"
ScheduledCall ||--o| CallLog : "generates"
User {
string id PK
string email
string name
string imageUrl
string industry
datetime createdAt
datetime updatedAt
string bio
int experience
string skills
string stripeCustomerId
string walletAddress
datetime emailVerified
string password
datetime passwordResetExpires
string passwordResetToken
}
Account {
string id PK
string userId
string type
string provider
string providerAccountId
string refresh_token
string access_token
int expires_at
string token_type
string scope
string id_token
string session_state
}
Session {
string id PK
string sessionToken
string userId
datetime expires
}
VerificationToken {
string identifier PK
string token
datetime expires
}
Subscription {
string id PK
string userId
string stripeSubscriptionId
string tier
string status
datetime currentPeriodStart
datetime currentPeriodEnd
boolean cancelAtPeriodEnd
datetime canceledAt
datetime createdAt
datetime updatedAt
string stripeCustomerId
string stripePriceId
string paymentMethod
string transactionHash
string walletAddress
}
Resume {
string id PK
string userId
datetime createdAt
datetime updatedAt
string currentVersionId
string publicLinkId
string title
}
ResumeVersion {
string id PK
string resumeId
int versionNumber
boolean isCurrent
string content
string cloudinaryUrl
string fileName
float atsScore
string feedback
datetime createdAt
datetime updatedAt
}
CoverLetter {
string id PK
string userId
string content
string jobDescription
string companyName
string jobTitle
string status
datetime createdAt
datetime updatedAt
}
Assessment {
string id PK
string userId
float quizScore
string questions
string category
string improvementTip
datetime createdAt
datetime updatedAt
}
ScheduledCall {
string id PK
string userId
string phoneNumber
datetime scheduledTime
string recipientName
string status
string inngestEventId
datetime createdAt
datetime updatedAt
}
CallLog {
string id PK
string userId
string scheduledCallId
string phoneNumber
string recipientName
string status
int duration
datetime startedAt
datetime endedAt
string recordingUrl
string transcript
string errorMessage
datetime createdAt
datetime updatedAt
}
UsageTracking {
string id PK
string userId
string feature
int count
datetime createdAt
datetime updatedAt
datetime month
}
IndustryInsight {
string id PK
string industry
string salaryRanges
float growthRate
string demandLevel
string topSkills
string marketOutlook
string keyTrends
string recommendedSkills
datetime lastUpdated
datetime nextUpdate
}
Central entity representing platform users. Stores profile information, authentication data, and references to all user-related entities.
Key Fields:
id: Primary Key (UUID)email: Unique constraintstripeCustomerId: Unique constraint, nullablewalletAddress: Unique constraint, nullablepasswordResetToken: Unique constraint, nullableindustry: Foreign Key to IndustryInsight.industryskills: Array of strings (stored as PostgreSQL array)
Relationships:
- One-to-Many: Account, Session, Resume, CoverLetter, Assessment, ScheduledCall, CallLog, UsageTracking
- One-to-One: Subscription
- Many-to-One: IndustryInsight (optional)
OAuth account information for users who sign in via third-party providers (Google, GitHub, etc.).
Key Fields:
id: Primary Key (UUID)userId: Foreign Key to User.idprovider,providerAccountId: Composite Unique constraint
Relationships:
- Many-to-One: User
User session tokens for authentication management via NextAuth.js.
Key Fields:
id: Primary Key (UUID)sessionToken: Unique constraintuserId: Foreign Key to User.id
Relationships:
- Many-to-One: User
Email verification tokens for account verification.
Key Fields:
identifier,token: Composite Primary Keytoken: Unique constraint
Relationships:
- None (standalone entity)
User subscription information including tier, status, payment method, and billing details. Supports both Stripe and Web3 payments.
Key Fields:
id: Primary Key (UUID)userId: Foreign Key to User.id, Unique constraint (one subscription per user)stripeSubscriptionId: Unique constraint, nullable
Subscription Tiers:
Free: Basic features with limited usageBasic: $9.99/month - Enhanced featuresPro: $19.99/month - Unlimited access
Relationships:
- One-to-One: User
Resume container that can have multiple versions. Each resume has a unique public link for sharing.
Key Fields:
id: Primary Key (CUID)userId: Foreign Key to User.idpublicLinkId: Unique constraintuserId,title: Composite Unique constraint (one resume per title per user)
Relationships:
- Many-to-One: User
- One-to-Many: ResumeVersion
Individual version of a resume with content, ATS score, feedback, and file storage information.
Key Fields:
id: Primary Key (UUID)resumeId: Foreign Key to Resume.idresumeId,versionNumber: Composite Unique constraint
Relationships:
- Many-to-One: Resume
AI-generated cover letters with job-specific information and status tracking.
Key Fields:
id: Primary Key (CUID)userId: Foreign Key to User.idstatus: Default value "draft"
Relationships:
- Many-to-One: User
Interview quiz results with scores, questions, categories, and improvement tips.
Key Fields:
id: Primary Key (CUID)userId: Foreign Key to User.idquestions: JSON arrayquizScore: Float value
Relationships:
- Many-to-One: User
Scheduled call information with phone numbers, timing, and status. Linked to Inngest for automation.
Key Fields:
id: Primary Key (UUID)userId: Foreign Key to User.idstatus: Default value "scheduled"inngestEventId: Inngest event identifier for automation
Relationships:
- Many-to-One: User
- One-to-One: CallLog (optional)
Call execution logs with duration, transcripts, recordings, and error information.
Key Fields:
id: Primary Key (UUID)userId: Foreign Key to User.idscheduledCallId: Foreign Key to ScheduledCall.id, Unique constraint (one log per scheduled call)
Relationships:
- Many-to-One: User
- One-to-One: ScheduledCall (optional)
Feature usage tracking per user per month. Tracks usage counts for subscription limit enforcement.
Key Fields:
id: Primary Key (UUID)userId: Foreign Key to User.iduserId,feature,month: Composite Unique constraint (one record per user per feature per month)count: Default value 0
Relationships:
- Many-to-One: User
Industry-specific insights including salary ranges, growth rates, skills, trends, and market outlook.
Key Fields:
id: Primary Key (CUID)industry: Unique constraint (primary identifier)salaryRanges: JSON arraytopSkills: Array of stringskeyTrends: Array of stringsrecommendedSkills: Array of strings
Relationships:
- One-to-Many: User (via industry field)
Team-Potato-Coders/
βββ prisma/
β βββ migrations/ # Database migration files
β βββ schema.prisma # Prisma schema definition
βββ public/ # Static assets
β βββ logo-uproot.ico
β βββ logo-uproot.webp
βββ src/
β βββ actions/ # Server actions
β β βββ calls.js
β β βββ cover-letter.js
β β βββ dashboard.js
β β βββ interview.js
β β βββ resume.js
β β βββ subscription.js
β β βββ usage.js
β β βββ user.js
β βββ app/ # Next.js App Router
β β βββ (auth)/ # Authentication routes
β β β βββ sign-in/
β β β βββ sign-up/
β β β βββ forgot-password/
β β β βββ reset-password/
β β βββ (main)/ # Main application routes
β β β βββ dashboard/
β β β βββ resume/
β β β βββ ai-cover-letter/
β β β βββ interview/
β β β βββ pricing/
β β β βββ schedule-call/
β β β βββ settings/
β β β βββ subscription/
β β βββ api/ # API routes
β β β βββ auth/
β β β βββ calls/
β β β βββ chat/
β β β βββ resume/
β β β βββ stripe/
β β β βββ subscription/
β β β βββ usage/
β β β βββ wallet/
β β βββ lib/ # Library utilities
β β βββ globals.css
β βββ components/ # React components
β β βββ ui/ # UI components
β β βββ header.jsx
β β βββ hero.jsx
β β βββ chatbot.jsx
β β βββ ...
β βββ data/ # Static data
β β βββ features.js
β β βββ faqs.js
β β βββ howItWorks.js
β β βββ industries.js
β βββ hooks/ # Custom React hooks
β β βββ use-fetch.js
β β βββ useWeb3.js
β βββ lib/ # Utility libraries
β β βββ prisma.js
β β βββ stripe.js
β β βββ cloudinary.js
β β βββ auth.js
β β βββ web3.js
β β βββ ...
β βββ auth.js # NextAuth configuration
β βββ auth.config.js # Auth configuration
β βββ middleware.js # Next.js middleware
βββ scripts/ # Utility scripts
βββ .env.example # Environment variables template
βββ next.config.ts # Next.js configuration
βββ package.json # Dependencies
βββ tailwind.config.ts # Tailwind CSS configuration
βββ README.md # Project documentation
- Node.js 18.x or higher
- PostgreSQL 14.x or higher
- pnpm (or npm/yarn)
- Git
-
Clone the repository
git clone https://github.com/your-username/Team-Potato-Coders.git cd Team-Potato-Coders -
Install dependencies
pnpm install # or npm install -
Set up environment variables
cp .env.example .env
Fill in all required environment variables (see Environment Variables)
-
Set up the database
# Generate Prisma Client pnpm prisma generate # Run database migrations pnpm prisma migrate dev # (Optional) Seed the database pnpm prisma db seed
-
Run the development server
pnpm dev # or npm run dev -
Open your browser Navigate to http://localhost:3000
Create a .env file in the root directory with the following variables:
# Database
DATABASE_URL="postgresql://user:password@localhost:5432/uproot?schema=public"
# NextAuth
NEXTAUTH_URL="http://localhost:3000"
NEXTAUTH_SECRET="your-nextauth-secret-key"
# OpenAI
OPENAI_API_KEY="your-openai-api-key"
# Stripe
STRIPE_SECRET_KEY="your-stripe-secret-key"
STRIPE_PUBLISHABLE_KEY="your-stripe-publishable-key"
STRIPE_WEBHOOK_SECRET="your-stripe-webhook-secret"
# Cloudinary
CLOUDINARY_CLOUD_NAME="your-cloudinary-cloud-name"
CLOUDINARY_API_KEY="your-cloudinary-api-key"
CLOUDINARY_API_SECRET="your-cloudinary-api-secret"
# Resend (Email)
RESEND_API_KEY="your-resend-api-key"
# Inngest
INNGEST_EVENT_KEY="your-inngest-event-key"
INNGEST_SIGNING_KEY="your-inngest-signing-key"
# Web3 (Optional)
WEB3_PROVIDER_URL="your-web3-provider-url"
# PhonePe (Payment Gateway - Optional)
PHONEPE_MERCHANT_ID="your-phonepe-merchant-id"
PHONEPE_SALT_KEY="your-phonepe-salt-key"
PHONEPE_SALT_INDEX="your-phonepe-salt-index"# Start development server
pnpm dev
# Build for production
pnpm build
# Start production server
pnpm start
# Run linting
pnpm lint# Create a new migration
pnpm prisma migrate dev --name migration_name
# Apply migrations to production
pnpm prisma migrate deploy
# Open Prisma Studio (Database GUI)
pnpm prisma studio
# Reset database (WARNING: Deletes all data)
pnpm prisma migrate resetPOST /api/auth/signup- User registrationPOST /api/auth/reset-password- Password reset requestPOST /api/auth/password-reset- Verify password reset token
POST /api/resume/upload- Upload resume fileGET /resume/public/[publicLinkId]- Public resume view
GET /api/subscription/current- Get current subscriptionPOST /api/subscription/web3- Process Web3 paymentPOST /api/stripe/create-checkout- Create Stripe checkout sessionPOST /api/stripe/webhook- Stripe webhook handlerPOST /api/stripe/verify-session- Verify Stripe sessionPOST /api/stripe/customer-portal- Access Stripe customer portal
GET /api/usage/current- Get current usage statistics
POST /api/calls/schedule- Schedule a callGET /api/calls/logs- Get call logs
POST /api/chat- AI chatbot endpoint
POST /api/wallet/link- Link Web3 wallet
POST /api/contact-us- Contact form submission
# Run tests (if implemented)
pnpm test
# Run tests in watch mode
pnpm test:watch
# Run tests with coverage
pnpm test:coverage- Fork the repository
- Create a feature branch (
git checkout -b feature/AmazingFeature) - Commit your changes (
git commit -m 'Add some AmazingFeature') - Push to the branch (
git push origin feature/AmazingFeature) - Open a Pull Request
- Follow ESLint configuration
- Use TypeScript for type safety
- Follow Next.js best practices
- Write meaningful commit messages
This project is licensed under the MIT License - see the LICENSE file for details.
- Next.js team for the amazing framework
- Prisma for the excellent ORM
- OpenAI for AI capabilities
- All open-source contributors
For support, create an issue in the repository.
- Enterprise tier implementation
- Advanced analytics dashboard
- Mobile app development
- API documentation with Swagger
- Multi-language support
- Enhanced Web3 integration
- Video interview practice
- LinkedIn integration