Transforming Your Professional Profile Into a Standout Resume
Generate professional resumes effortlessly using data from LinkedIn and GitHub. SimpleResu.me makes resume creation quick, simple, and customizable with a modern tech stack built for Vercel deployment.
- π Resume Builder: Create beautiful resumes with real-time preview
- π LinkedIn Integration: Import your professional profile automatically
- π» GitHub Integration: Showcase your repositories and contributions
- π¨ Multiple Templates: Choose from various professional resume designs
- π Secure Authentication: Powered by Clerk for seamless login (Google OAuth, Email, etc.)
- β‘ Automatic User Sync: Users automatically synced to database on first login
- βοΈ Cloud Storage: All your data safely stored in Supabase
- π Interactive API Docs: Swagger UI at
/api-docsfor testing APIs - π Dark Mode: Built-in theme support for comfortable viewing
- π± Responsive Design: Works beautifully on all devices
- Frontend: Next.js 15 (App Router), React 19, TypeScript
- Styling: Tailwind CSS, Radix UI, Framer Motion
- Authentication: Clerk
- Database: Supabase (PostgreSQL)
- Deployment: Vercel
- Rich Text: TipTap Editor
- Drag & Drop: dnd-kit
- Validation: Zod
- Node.js 18+ and npm
- Clerk account (clerk.com)
- Supabase project (supabase.com)
- LinkedIn API credentials (optional, for OAuth)
-
Clone the repository
git clone https://github.com/yourusername/simpleresu.me.git cd simpleresu.me -
Install dependencies
npm install
-
Set up environment variables
Use the provided example file as a starting point:
cp .env.example .env.local
Then edit
.env.localand fill in your own keys:- Clerk:
NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY,CLERK_SECRET_KEY - Supabase:
NEXT_PUBLIC_SUPABASE_URL,SUPABASE_SERVICE_ROLE_KEY - Resend (emails):
RESEND_API_KEY,FROM_EMAIL - Google Analytics (optional):
GA_TRACKING_ID - App URL:
NEXT_PUBLIC_APP_URL(usuallyhttp://localhost:3000for local dev)
- Clerk:
-
Set up the database
- Go to your Supabase project dashboard
- Navigate to the SQL Editor
- Run the migration script from
supabase-full-migration.sql
# The SQL file is located at: # ./supabase-full-migration.sql
This will create all necessary tables for:
users- User profiles and email preferencesfeedback- User feedback (with admin replies)bug_reports- Bug reports (status, comments, screenshots)admins- Admin accounts for the custom admin panel
-
Run the development server
npm run dev
Open http://localhost:3000 in your browser.
simpleresu.me/
βββ app/ # Next.js App Router
β βββ api/ # API Routes
β β βββ lib/ # API utilities
β β β βββ auth.ts # Clerk authentication helper
β β β βββ errors.ts # Error handling
β β β βββ supabase-server.ts # Supabase admin client
β β β βββ validation.ts # Zod schemas
β β βββ users/sync/ # User sync endpoint
β β βββ resumes/ # Resume CRUD endpoints
β β βββ linkedin/ # LinkedIn OAuth handlers
β βββ resume-builder/ # Resume builder page
β βββ sign-in/ # Auth pages
β βββ layout.tsx # Root layout
βββ components/ # React components
β βββ ui/ # shadcn/ui components
β βββ resume-templates/ # Resume templates
β βββ resume-sections/ # Resume section components
βββ lib/ # Utilities
β βββ supabase.ts # Supabase client
β βββ github-api.ts # GitHub API helper
β βββ utils.ts # Helper functions
βββ hooks/ # Custom React hooks
βββ types/ # TypeScript types
β βββ resume.ts # Resume types
βββ public/ # Static assets
βββ middleware.ts # Clerk middleware
βββ supabase-migration.sql # Database schema
βββ package.json # Dependencies
Want to hack on SimpleResu.me locally?
-
Fork & clone
- Fork this repo on GitHub, then:
git clone <your-fork-url> && cd simpleresu.me- Install deps with
pnpm install(ornpm install/yarn).
-
Environment variables
- Copy the example file:
cp .env.example .env.local - Fill in your own keys (do not reuse production keys):
- Create a Clerk app β set
NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY,CLERK_SECRET_KEY - Create a Supabase project β set
NEXT_PUBLIC_SUPABASE_URL,SUPABASE_SERVICE_ROLE_KEY - Create a Resend account & domain (for emails) β set
RESEND_API_KEY,FROM_EMAIL - Optionally add
GA_TRACKING_IDif you want Google Analytics locally.
- Create a Clerk app β set
- Copy the example file:
-
Supabase schema
-
In Supabase, open the SQL editor and run
supabase-full-migration.sql. -
This creates all app tables: users, feedback, bug_reports, admins, etc.
-
Create at least one admin user manually (example, donβt commit this):
INSERT INTO admins (username, password) VALUES ('admin', 'your-strong-password');
-
-
Run the app
- Start dev server:
pnpm dev - App:
http://localhost:3000 - Admin login:
http://localhost:3000/admin/login(use the admin user you inserted).
- Start dev server:
When opening a PR, please mention any schema or env changes so others can keep their setup in sync.
Visit /api-docs for interactive Swagger UI documentation where you can:
- View all API endpoints
- See request/response schemas
- Test APIs directly in your browser
- Get authentication examples
All API routes (except LinkedIn OAuth) require Clerk authentication. Include the Clerk session token in requests.
Automatic User Sync: When a user logs in via Clerk (Google OAuth, email, etc.), they are automatically synced to the Supabase database. This happens transparently in the background using the UserSyncProvider component.
Development: http://localhost:3000/api
Production: https://yourdomain.com/api
Swagger UI: http://localhost:3000/api-docs
POST /api/users/syncSync Clerk user with Supabase database. Call this once after user signs in for the first time.
Request Body:
{
"email": "user@example.com"
}Response:
{
"user": {
"id": "uuid",
"clerk_user_id": "clerk_user_id",
"email": "user@example.com",
"created_at": "2024-01-01T00:00:00Z"
}
}GET /api/resumesGet all resumes for the authenticated user.
Response:
{
"resumes": [
{
"id": "uuid",
"name": "My Resume",
"first_name": "John",
"last_name": "Doe",
"email": "john@example.com",
"positions": [...],
"educations": [...],
"skills": [...],
"config": {...},
"created_at": "2024-01-01T00:00:00Z"
}
]
}POST /api/resumesRequest Body:
{
"name": "My Resume",
"firstName": "John",
"lastName": "Doe",
"email": "john@example.com",
"headline": "Software Engineer",
"summary": "Experienced developer...",
"positions": [
{
"title": "Senior Developer",
"company": "Tech Corp",
"startDate": "2020-01",
"endDate": "Present",
"description": "Led development team..."
}
],
"educations": [...],
"skills": [{ "name": "JavaScript" }],
"config": {
"showPhoto": true,
"showSummary": true,
"showExperience": true
}
}Response: 201 Created
{
"resume": { ... }
}GET /api/resumes/:idPUT /api/resumes/:idRequest Body: Partial resume data (any fields from create)
DELETE /api/resumes/:idSoft delete (sets is_active to false).
Response:
{
"success": true
}id(UUID, PK)clerk_user_id(TEXT, UNIQUE) - Synced with Clerkemail(TEXT)created_at,updated_at(TIMESTAMPTZ)
id(UUID, PK)user_id(UUID, FK β users)name(TEXT) - Resume title- Personal info:
first_name,last_name,email,headline,summary,location,phone_number - Social:
linkedin_id,github_id - Complex data (JSONB):
positions,educations,skills,projects,certifications,custom_sections - Configuration (JSONB):
config- visibility toggles - Metadata:
template,zoom,is_active,created_at,updated_at id(UUID, PK)user_id(UUID, FK β users)title(TEXT) - Custom status namecolor(TEXT) - Tailwind classis_default(BOOLEAN)created_at(TIMESTAMPTZ)
-
Push your code to GitHub
git add . git commit -m "Initial commit" git push origin main
-
Import project to Vercel
- Go to vercel.com
- Click "Add New" β "Project"
- Import your GitHub repository
- Vercel will auto-detect Next.js
-
Configure Environment Variables
Add all variables from your
.envfile in the Vercel dashboard:- Project Settings β Environment Variables
- Add each variable for Production, Preview, and Development
-
Deploy
Vercel will automatically deploy your app. Each push to
maintriggers a new deployment.
Make sure to add these in Vercel:
NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY
CLERK_SECRET_KEY
NEXT_PUBLIC_SUPABASE_URL
NEXT_PUBLIC_SUPABASE_ANON_KEY
SUPABASE_SERVICE_ROLE_KEY
NEXT_PUBLIC_LINKEDIN_CLIENT_ID (optional)
LINKEDIN_CLIENT_SECRET (optional)
NEXT_PUBLIC_APP_URL
npm run dev # Start development server (localhost:3000)
npm run build # Build for production
npm run start # Start production server
npm run lint # Run ESLint
npm run analyze # Analyze bundle size- TypeScript: Strict mode enabled
- ESLint: Next.js recommended config
- Prettier: Integrated with Tailwind
- Validation: Zod schemas for API routes
We welcome contributions! Here's how:
- Fork the repository
- Create a feature branch:
git checkout -b feature/amazing-feature - Commit your changes:
git commit -m "Add amazing feature" - Push to the branch:
git push origin feature/amazing-feature - Open a Pull Request
- Follow the existing code style
- Write clear commit messages
- Add tests for new features
- Update documentation as needed
- Ensure all tests pass before submitting
This project is licensed under the MIT License - see the LICENSE file for details.
- Next.js - The React Framework
- Clerk - User authentication
- Supabase - Backend as a Service
- Vercel - Deployment platform
- shadcn/ui - Beautiful UI components
- Radix UI - Accessible components
- TailwindCSS - Utility-first CSS
- Issues: GitHub Issues
- Discussions: GitHub Discussions
- Email: support@simpleresu.me
- PDF Export functionality
- Email resume sharing
- Resume analytics
- AI-powered resume suggestions
- Cover letter generator
- Mobile app (React Native)
- Resume templates marketplace
- Interview prep integration
Made with β€οΈ by the SimpleResu.me team