A job application tracker built to stop losing track of where you applied.
- Backend: FastAPI, async SQLAlchemy, PostgreSQL
- Auth: JWT (PyJWT), bcrypt
- Frontend: vanilla HTML/CSS/JS
- Tests: pytest, httpx, Playwright
- Register and log in with JWT sessions
- Track company, role, status, date applied, notes, and job posting links
- Update status as things progress (Applied, Interview, Offer, Rejected, Withdrawn)
- Search by company or role, filter by status
- Dashboard with live counts per status
Requires Python 3.12 (latest security patch) and PostgreSQL.
1. Clone the repo
git clone https://github.com/Affaniqbal234/applyvault.git
cd applyvault2. Create and activate a virtual environment
Windows Command Prompt:
python -m venv .venv
.venv\Scripts\activatemacOS / Linux:
python3 -m venv .venv
source .venv/bin/activate3. Install dependencies
From the repository root:
python -m pip install -r backend/requirements.txt4. Set up environment variables
Copy the template from the repository root:
:: Windows Command Prompt
copy .env.example .env# macOS / Linux
cp .env.example .envOpen .env and fill in your values:
DATABASE_URL=postgresql+asyncpg://<user>:<password>@localhost:5432/applyvault
APP_ENV=development
JWT_SECRET=<paste-a-generated-secret-here>
FRONTEND_ORIGIN=http://localhost:5500Generate JWT_SECRET with python -c "import secrets; print(secrets.token_urlsafe(48))".
Secrets must contain at least 32 bytes. Keep .env outside Git.
Use your local PostgreSQL credentials. Create an empty database named applyvault
in pgAdmin or with createdb -U <user> applyvault.
5. Migrate the database and start the API
From the repository root:
cd backend
python -m alembic upgrade head
uvicorn main:app --reloadThe API does not change the schema at startup. Run migrations before starting it or releasing a new version. If the database already contains ApplyVault tables, follow the database adoption procedure first.
6. Serve the frontend
In a second terminal, from the repository root:
cd frontend
python -m http.server 5500Then open http://localhost:5500/index.html in your browser.
See deployment configuration for hosting settings.
Backend/API and browser tests use isolated SQLite databases. With the virtual environment active, run the backend suite from the repository root:
cd backend
python -m pip install -r requirements-dev.txt
python -m pytest tests/ -vRun the Playwright browser suite with headless Chromium from the same backend/ directory:
python -m pip install -r requirements-browser.txt
python -m playwright install chromium
python -m pytest browser_tests/ -vOn Linux, use python -m playwright install --with-deps chromium to install the
browser's system dependencies too.
PostgreSQL integration tests cover migrations, constraints, existing database
adoption, and persistence after an API restart. They create a disposable cluster
and ignore your configured DATABASE_URL. Install PostgreSQL binaries and add
their bin directory to PATH, or set POSTGRES_BIN to that directory. Run as a
non-root user from the repository root:
python -m pytest integration_tests/ -qGitHub Actions CI runs all three suites, JavaScript syntax checks, and a production dependency audit with Python 3.12 and PostgreSQL 16.
