Built for MemoryVerse AI '26
"I never have to search through folders again."
Pathfolio turns a student's scattered certificates, resumes, project reports, internship letters, and portfolio links into a single, intelligent digital identity — automatically organized, semantically connected, and instantly searchable in plain English.
| Module | What it solves |
|---|---|
| 1. AI Data Ingestion | Upload any certificate, resume, report, letter, or portfolio link. Original file/format is preserved via Cloudinary. |
| 2. Intelligent Categorization | Every upload is auto-classified into Projects / Skills / Certifications / Internships / Achievements / Academics — no manual sorting. |
| 3. Relationship Engine | A hybrid embeddings + LLM pipeline finds and labels connections: Certification → Skill → Project → Internship → Career Path. |
| 4. Digital Journey Timeline | Every document is placed on a year-by-year visual timeline of your growth. |
| 5. Smart Retrieval | Ask "show my AI projects" or "show my latest resume" in plain English and get the original files back instantly. |
- Frontend: React (Vite) + Tailwind CSS v4, React Router, Recharts/Lucide icons
- Backend: Python FastAPI
- LLM: Groq API (Llama 3.3 70B) — free tier, used for categorization, relationship labeling, and natural-language query parsing
- Embeddings:
sentence-transformers(all-MiniLM-L6-v2) — runs locally, free, no rate limits - Vector DB: ChromaDB (embedded, persisted locally)
- File storage: Cloudinary (free tier) — preserves original file format, gives instant shareable URLs
- Metadata DB: SQLite (via SQLAlchemy)
- OCR: Tesseract (
pytesseract) for scanned certificates/images;pypdf+pdf2imagefor PDFs
Why this stack: everything except the Groq LLM call runs entirely in your own backend (embeddings, vector search, OCR) — so the only external dependency that needs a real API key is Groq, which is free.
See docs/architecture.md for the full diagram and
data-flow explanation.
Upload (file or link)
│
▼
Text Extraction (pypdf / pytesseract OCR / python-docx)
│
▼
Groq LLM ── classify category, extract title/summary/entities/year
│
▼
Cloudinary ── stores original file, returns permanent URL
│
▼
SQLite ── persists Document row (category, entities, year, url)
│
▼
MiniLM Embedding ── vectorize (title+summary+category+entities)
│
▼
ChromaDB ── stores vector for semantic search
│
▼
Relationship Engine ── nearest-neighbour candidates (Chroma) → Groq confirms + labels edge
│
▼
Timeline Service ── places document on the year timeline
Retrieval flow:
Natural language query → Groq parses intent (category/keywords/sort)
→ MiniLM embeds query → ChromaDB similarity search
→ SQLite fetch full records → return original file URLs
pathfolio/
├── backend/
│ ├── app/
│ │ ├── main.py FastAPI app entrypoint
│ │ ├── config.py Settings from .env
│ │ ├── database.py SQLAlchemy engine/session
│ │ ├── schemas.py Pydantic response models
│ │ ├── models/models.py Document, Relationship, TimelineEntry
│ │ ├── services/
│ │ │ ├── cloudinary_service.py
│ │ │ ├── extraction_service.py PDF/OCR/DOCX text extraction
│ │ │ ├── groq_service.py LLM categorization/relationships/query parsing
│ │ │ ├── embedding_service.py MiniLM + ChromaDB
│ │ │ ├── relationship_engine.py Hybrid embedding+LLM relationship builder
│ │ │ └── timeline_service.py
│ │ └── routers/
│ │ ├── upload.py Module 1 + 2 (ingestion pipeline)
│ │ ├── documents.py CRUD + category summary
│ │ ├── search.py Module 5 (smart retrieval)
│ │ ├── timeline.py Module 4
│ │ └── relationships.py Module 3 (knowledge graph)
│ ├── requirements.txt
│ ├── .env.example
│ ├── Dockerfile
│ └── run.sh
├── frontend/
│ ├── src/
│ │ ├── api/client.js Axios API client
│ │ ├── components/ Sidebar, DocumentCard
│ │ ├── pages/ Dashboard, Upload, Timeline, Graph, Search
│ │ ├── App.jsx, main.jsx, index.css
│ ├── .env.example
│ └── package.json
└── docs/
├── architecture.md
└── thought-process.md
cd backend
cp .env.example .env
# Edit .env and paste in your FREE API keys:
# GROQ_API_KEY -> https://console.groq.com/keys
# CLOUDINARY_CLOUD_NAME / API_KEY / API_SECRET -> https://cloudinary.com/users/register/free
./run.sh
# or manually:
python3 -m venv venv && source venv/bin/activate
pip install -r requirements.txt
uvicorn app.main:app --reloadBackend runs at http://localhost:8000 (interactive API docs at /docs).
System dependency: Tesseract OCR must be installed for scanned-image certificates to be readable:
# Ubuntu/Debian
sudo apt-get install tesseract-ocr poppler-utils
# Mac
brew install tesseract popplercd frontend
cp .env.example .env # points to http://localhost:8000 by default
npm install
npm run devFrontend runs at http://localhost:5173.
- Backend: Deploy via the included
Dockerfileto Render / Railway / Fly.io. Set the three env vars (GROQ_API_KEY,CLOUDINARY_*) in the platform's environment variable settings — never commit.env. - Frontend: Deploy to Vercel/Netlify. Set
VITE_API_BASE_URLto your deployed backend URL. - ChromaDB and SQLite persist to disk — on ephemeral hosts (like Render's free tier) attach a persistent disk/volume, or swap SQLite for a managed Postgres and Chroma for a hosted vector DB if you need durability across restarts.
| Service | Free tier | Where |
|---|---|---|
| Groq | Yes, generous free tier | https://console.groq.com/keys |
| Cloudinary | Yes, free tier (25 credits/mo) | https://cloudinary.com/users/register/free |
Everything else (embeddings, vector DB, OCR) runs locally at no cost.
- Upload a certificate (PDF/image) — watch it get auto-classified into Certifications with extracted skills, in seconds.
- Upload a project report and an internship letter.
- Open Knowledge Graph — see the certificate's skill connected to the project, and the project connected to the internship.
- Open Timeline — see all three placed on the correct year.
- Go to Smart Search, type "show my AI projects" — the original file opens instantly, no folder browsing.