AI-assisted resume & job application platform (Portfolio Case Study)
Status: Portfolio / Case Study (not an actively marketed SaaS)
ExceliorHire is a full-stack project built to explore how LLM-powered features fit into real product workflows with practical constraints: cost, latency, failure modes, and guardrails.
- End-to-end product build: auth, UX flows, backend APIs, and persistence
- AI feature integration patterns (orchestration vs business logic separation)
- Multi-tenant data modeling and safe per-user scoping
- Paywall/billing wiring (Stripe price mapping, plan catalog)
- Local Development Guide:
docs/local_development.md - Test & Validation Plan:
docs/test_validation_plan.md - Customer Acceptance Test Plan:
docs/customer_acceptance_test_plan.md - Stripe Pricing Setup:
docs/stripe_pricing_setup.md
This repository contains a FastAPI backend skeleton with a Postgres database schema and Docker configuration to bootstrap the ExceliorHire project.
backend/
├── app/
│ ├── api/
│ │ ├── deps.py
│ │ └── routes/
│ │ └── health.py
│ ├── core/
│ │ └── config.py
│ ├── db/
│ │ ├── base.py
│ │ └── session.py
│ └── main.py
├── requirements.txt
└── tests/
└── test_health.py
db/
└── init/
└── 001_create_tables.sql
- Docker and Docker Compose
-
Build and start the services:
docker-compose up --build
-
Access the API at:
http://localhost:8000/health
-
Connect to Postgres:
postgresql://exceliorhire:exceliorhire@localhost:5432/exceliorhire
To stop the stack:
docker-compose down-
Install dependencies:
python -m venv .venv source .venv/bin/activate pip install -r backend/requirements.txt -
Execute tests:
cd backend && pytest -q
The db/init/001_create_tables.sql script initializes core tables:
user_profileresume_recordsjob_applications
These tables include UUID primary keys, timestamps, and indexes on user_id for quick lookups.
Generated resumes and application materials (tailored resumes, cover letters, interview answers, intro scripts, thank-you emails) are not stored in the database. Users should copy or download results before leaving the page. Generated outputs are session-scoped and ephemeral.
The system tracks usage metrics for billing and plan enforcement, but does not persist generated content itself.
The FastAPI application reads configuration via environment variables:
DATABASE_URL– SQLAlchemy connection string for PostgresENVIRONMENT–local,staging, etc.DEBUG– set to1to enable debug mode
You can override defaults by creating a .env file in the project root.
Billing and paywall behavior depends on Stripe price identifiers matching the plan catalog in backend/app/core/plan_catalog.py.
Follow docs/stripe_pricing_setup.md to create Products/Prices and map their price_xxx values to environment variables such as:
STRIPE_PRICE_MONTHLYSTRIPE_PRICE_RECRUITER_PRO
- Consolidate “product vs platform” scope earlier (avoid SaaS creep)
- Reduce moving parts and optimize for solo maintainability
- Treat docs, prompts, and debugging playbooks as first-class artifacts from day one