An AI-powered portfolio generator that transforms raw resumes and GitHub profiles into polished, customizable developer portfolio websites in seconds.
It pairs deterministic data scraping (GitHub repos, top languages, social link annotations) with Claude AI storytelling (career summaries and experience extraction) to automate portfolio creation without hallucinating technical proof of work.
- Dual-Source Data Extraction:
- Resume Parser: Extracts PDF text layer and embedded hyperlink targets (detects hidden LinkedIn, X/Twitter, and website URLs).
- GitHub API Integration: Auto-derives top technical skills based on repo language frequency and selects top-starred projects.
- AI Career Storytelling (Claude):
- Generates first-person professional summaries tuned to specific tones (
engineering-focused,founder-creative,corporate). - Converts dense resume text into structured work experience and volunteering bullet arrays.
- Graceful Fallback: Automatically reverts to basic heuristic text parsing if the LLM API is unavailable.
- Generates first-person professional summaries tuned to specific tones (
- Real-Time Live Preview:
- Dynamic editing panel with real-time updates rendered inside an
iframesandbox (srcdoc). - Multi-template support (
minimal-mono,clean-sans).
- Dynamic editing panel with real-time updates rendered inside an
- Containerized & Fully Tested: Ready for Docker/Docker Compose deployment with full unit test coverage (Jest + Pytest).
┌─────────────────┐ ┌──────────────────────────────┐
│ Resume (.pdf) ├──────►│ PDF Link & Text Extractor │
└─────────────────┘ └──────────────┬───────────────┘
│
┌─────────────────┐ ┌──────────────▼───────────────┐ ┌──────────────────────┐
│ GitHub URL ├──────►│ GitHub REST API (Repos/Stars)├──────►│ Skills & Top Projects│
└─────────────────┘ └──────────────┬───────────────┘ └──────────┬───────────┘
│ │
┌──────▼───────┐ │
│ Claude Model │ │
└──────┬───────┘ │
│ │
┌──────▼──────────────────────────────────▼──┐
│ Normalized Portfolio JSON Payload │
└──────────────────────┬─────────────────────┘
│
┌──────────▼──────────┐
│ Live Preview Canvas │
└─────────────────────┘
- Backend: Python 3.9+, FastAPI, Pydantic v2, PyPDF, Anthropic SDK, Requests
- Frontend: Vanilla JavaScript (ES6+), HTML5, CSS3, DOM manipulation
- Containerization: Docker, Docker Compose, Nginx
- Testing: Pytest, Pytest-Asyncio, Requests-Mock, Jest, JSDOM
- CI/CD: GitHub Actions
Create a .env file in the project root before running the application:
ANTHROPIC_API_KEY=your_claude_api_key_here
GITHUB_TOKEN=optional_github_pat_for_higher_rate_limitsDocker isolates both the Python backend runtime and Nginx frontend server into a single containerized environment.
Start the full application stack in the background:
docker compose up -d --buildThe application will be accessible at:
- Frontend App:
http://localhost:3000 - Backend API:
http://localhost:8000
docker compose logs -fdocker compose downIf you only want to containerize the FastAPI backend server:
# Build image
docker build -t portfolio-api .
# Run container
docker run -d \
-p 8000:8000 \
--env-file .env \
--name portfolio-api-instance \
portfolio-api- Python: 3.9 or higher
- Node.js: v18 or higher (v20 recommended)
# Create and activate virtual environment
python3 -m venv venv
source venv/bin/activate
# Install dependencies
pip install -r requirements.txt
# Start FastAPI server
uvicorn processor:app --reload --port 8000In a new terminal window, serve the frontend assets:
npm install
npx serve .Run the full test suite (both Jest frontend and Pytest backend) using the built-in runner script:
chmod +x test.sh
./test.sh-
Frontend Tests (Jest):
npx jest app.test.js
-
Backend Tests (Pytest):
source venv/bin/activate PYTHONPATH=. pytest test_main.py -v -
Running Tests Inside Docker Container:
docker compose exec api pytest test_main.py -v
Processes a resume file and GitHub URL to produce portfolio payload data.
Request (multipart/form-data):
resume(File, required): PDF or plain text resume file (Max 10MB).github_url(string, required): Public GitHub profile URL.tone(string, optional): Voice style (engineering-focused,founder-creative,corporate). Default:engineering-focused.
Response (200 OK):
{
"profile": {
"name": "Jane Doe",
"roleTitle": "Senior Systems Engineer",
"headline": "",
"about": "Full stack engineer specializing in distributed systems...",
"email": "jane@example.com",
"location": "Lagos, Nigeria",
"avatarUrl": "",
"socials": [
{ "platform": "LinkedIn", "url": "https://linkedin.com/in/janedoe" },
{ "platform": "GitHub", "url": "https://github.com/janedoe" }
]
},
"skills": ["TypeScript", "Python", "Go"],
"experience": [
{
"id": "exp-0",
"company": "Acme Corp",
"role": "Lead Engineer",
"duration": "2023 - Present",
"description": ["Designed scalable microservices architecture."]
}
],
"volunteering": [],
"projects": [
{
"id": "cool-app",
"name": "cool-app",
"description": "High performance HTTP proxy",
"techStack": ["Go"],
"stars": 42,
"url": "https://github.com/janedoe/cool-app"
}
],
"aiGenerated": true,
"warning": null
}MIT License. See LICENSE for details.