Upload once. Share forever. Stand out.
A modern developer portfolio generator built with Next.js 16 that turns your PDF resume into a beautiful, shareable portfolio page — powered by Google Gemini AI.
- AI-Powered Parsing — Upload a PDF resume and Gemini 2.5 Flash automatically extracts your experience, skills, projects, education, and social links
- Instant Portfolio Page — Get a shareable portfolio at
/u/your-namewith zero design effort - Live Editor — Edit every section (hero, about, skills, experience, projects, education, social links) with real-time preview
- Publish & Draft — Keep a draft while you polish, then publish when ready. Your URL never changes
- PDF Download — Export your portfolio back as a clean, formatted PDF resume
- Smart Profile Photo — Uses your GitHub avatar automatically, falls back to gendered placeholder
- Rich Data Extraction — Location, CGPA/GPA, bullet-point descriptions, and human-readable date formats
- Encrypted Storage — All portfolio data is encrypted at rest with AES-256-GCM
- Form Validation — All editor fields validated with React Hook Form + Zod
- Prettier + ESLint — Consistent code style enforced across the entire codebase
- 170+ tests — Vitest + React Testing Library across 20+ test files, 85%+ coverage
| Category | Technology |
|---|---|
| Framework | Next.js 16 (App Router) |
| Language | TypeScript |
| Styling | Tailwind CSS v4 |
| UI Components | shadcn/ui |
| Database | Neon PostgreSQL (Serverless) |
| ORM/Migrations | Drizzle ORM + drizzle-kit |
| Authentication | Clerk v7 |
| AI | Google Generative AI SDK + Gemini 2.5 Flash |
| PDF Parsing | pdf-parse v2 |
| PDF Generation | @react-pdf/renderer v4 |
| Forms | React Hook Form + Zod |
| Testing | Vitest + React Testing Library |
| Linting | ESLint 9 + Prettier |
| Deployment | Vercel |
app/
├── (auth)/ # Sign-in, sign-up pages (Clerk)
├── (protected)/dashboard/ # Authenticated dashboard
├── api/
│ ├── parse/ # PDF upload + Gemini AI parsing
│ ├── portfolio/ # Portfolio CRUD + publish
│ └── user/sync/ # First-login user creation
├── u/[slug]/ # Public portfolio page
└── page.tsx # Landing page
components/
├── dashboard/
│ ├── editor/ # 7 section editors (react-hook-form + zod)
│ ├── DashboardClient.tsx # Main dashboard client component
│ ├── PortfolioEditor.tsx # Tabbed editor shell
│ └── ResumeUploader.tsx # Drag-and-drop PDF uploader
├── landing/ # Hero + Features sections
├── portfolio/
│ ├── sections/ # 7 portfolio section components
│ ├── PortfolioTemplate.tsx
│ └── PortfolioPDF.tsx # PDF export document
└── ui/ # shadcn/ui primitives
lib/
├── crypto.ts # AES-256-GCM encrypt/decrypt
├── db/ # Drizzle schema + Neon client
├── gemini-prompt.ts # AI resume parse prompt
├── portfolio-schemas.ts # Zod validation schemas
├── portfolio-types.ts # TypeScript interfaces
└── slug.ts # Auto-slug generator
- Node.js 18+
- Neon Database account (free tier)
- Clerk account (free tier)
- Google AI Studio API key (free tier)
git clone https://github.com/dreamweiver/digiresume.git
cd digiresume
npm installCreate .env.local with:
# Clerk
NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY=pk_test_...
CLERK_SECRET_KEY=sk_test_...
NEXT_PUBLIC_CLERK_SIGN_IN_URL=/sign-in
NEXT_PUBLIC_CLERK_SIGN_UP_URL=/sign-up
NEXT_PUBLIC_CLERK_SIGN_IN_FORCE_REDIRECT_URL=/dashboard
NEXT_PUBLIC_CLERK_SIGN_UP_FORCE_REDIRECT_URL=/dashboard
# Neon PostgreSQL
DATABASE_URL=postgresql://username:password@ep-xxx.region.aws.neon.tech/neondb?sslmode=require
# Encryption (generate with: openssl rand -hex 32)
PORTFOLIO_ENCRYPTION_KEY=your_64_char_hex_key
# Google Gemini
GOOGLE_GENERATIVE_AI_API_KEY=AIza...| Variable | Where to find it |
|---|---|
NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY |
Clerk dashboard > API Keys |
CLERK_SECRET_KEY |
Clerk dashboard > API Keys |
DATABASE_URL |
Neon dashboard > Connection Details |
PORTFOLIO_ENCRYPTION_KEY |
Run openssl rand -hex 32 in terminal |
GOOGLE_GENERATIVE_AI_API_KEY |
aistudio.google.com > Get API key |
npx drizzle-kit migrate # Apply database migrations
npm run dev # Start dev server at http://localhost:3000npm test # Single run
npm run test:watch # Watch mode
npm run test:coverage # With coverage report20+ test files, 170+ tests covering API routes, lib utilities, zod schemas, and all UI components.
- PDF resume upload with drag-and-drop
- AI-powered resume parsing (Gemini 2.5 Flash)
- Auto-generated username slug
- Public portfolio page at
/u/[slug] - Live editor for all 7 portfolio sections
- Draft / Publish workflow
- PDF resume download
- AES-256-GCM encryption for all stored data
- Form validation with React Hook Form + Zod
- Neon-inspired dark UI with green accents
- Devportfolio-style two-column layout with IBM Plex Mono font
- Smart profile photo (GitHub avatar fallback)
- Rich extraction: location, CGPA/GPA, bullet points, date format
- Side Projects section with Demo button links
- Prettier + ESLint code formatting
- Deployed to Vercel
DigiResume is created and maintained by dreamweiver.
- Live App — digiresume-eight.vercel.app
- Source Code — github.com/dreamweiver/digiresume
- Report a Bug — Open an issue
- Feature Requests & Feedback — View all issues
Found a bug or have a suggestion? Please open a GitHub issue — it helps improve DigiResume for everyone.
MIT
Upload once. Share forever. Stand out.