Skip to content

Repository files navigation

Ingest

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.


Key Features

  • 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.
  • Real-Time Live Preview:
    • Dynamic editing panel with real-time updates rendered inside an iframe sandbox (srcdoc).
    • Multi-template support (minimal-mono, clean-sans).
  • Containerized & Fully Tested: Ready for Docker/Docker Compose deployment with full unit test coverage (Jest + Pytest).

Architecture Overview

┌─────────────────┐       ┌──────────────────────────────┐
│  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 │
                                              └─────────────────────┘

Tech Stack

  • 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

Environment Configuration

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_limits

Docker Usage (Recommended)

Docker isolates both the Python backend runtime and Nginx frontend server into a single containerized environment.

1. Build and Run with Docker Compose

Start the full application stack in the background:

docker compose up -d --build

The application will be accessible at:

  • Frontend App: http://localhost:3000
  • Backend API: http://localhost:8000

2. View Logs

docker compose logs -f

3. Stop Containers

docker compose down

4. Single Container Standalone Build (Backend Only)

If 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

Local Development (Without Docker)

Prerequisites

  • Python: 3.9 or higher
  • Node.js: v18 or higher (v20 recommended)

1. Backend Setup

# 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 8000

2. Frontend Setup

In a new terminal window, serve the frontend assets:

npm install
npx serve .

Running Tests

Run the full test suite (both Jest frontend and Pytest backend) using the built-in runner script:

chmod +x test.sh
./test.sh

Running Test Suites Individually

  • 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

API Reference

POST /api/generate

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
}

License

MIT License. See LICENSE for details.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages