Skip to content

Repository files navigation

DigiResume

Resume + Portfolio = DigiResume

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.

Live Demo Next.js React TypeScript Tailwind CSS


Features

  • 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-name with 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

Tech Stack

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

Project Structure

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

Getting Started

Prerequisites

Installation

git clone https://github.com/dreamweiver/digiresume.git
cd digiresume
npm install

Environment Variables

Create .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

Run

npx drizzle-kit migrate   # Apply database migrations
npm run dev               # Start dev server at http://localhost:3000

Testing

npm test                  # Single run
npm run test:watch        # Watch mode
npm run test:coverage     # With coverage report

20+ test files, 170+ tests covering API routes, lib utilities, zod schemas, and all UI components.


Roadmap

Done

  • 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

Contact & Feedback

DigiResume is created and maintained by dreamweiver.

Found a bug or have a suggestion? Please open a GitHub issue — it helps improve DigiResume for everyone.


License

MIT


Upload once. Share forever. Stand out.

About

Upload your PDF resume and get a shareable developer portfolio page in seconds, powered by Google Gemini AI

Topics

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages