MCPcopy Index your code
hub / github.com/Aditya190803/Application-Tracking-System

github.com/Aditya190803/Application-Tracking-System @main

Chat with this repo
repository ↗ · DeepWiki ↗ · + Follow
316 symbols 1,065 edges 132 files 0 documented · 0%
What it actually does AI analysis from the code graph — generated when you open this
loading…
README

Application Tracking System

AI-powered resume analysis and cover-letter generation built with Next.js, Stack Auth, Convex, and Google Gemini.

Features

  • Resume analysis with match scoring, strengths, weaknesses, skills match, and recommendations
  • Cover-letter generation with configurable tone and length
  • Tailored LaTeX resume generation using selectable templates
  • PDF resume upload and parsing
  • Searchable history for analyses and cover letters
  • Auth-protected dashboard flows
  • Rate limiting (Upstash Redis in production, in-memory fallback for local/test only)

Tech Stack

  • Next.js 16 (App Router)
  • React 19 + TypeScript 5
  • Tailwind CSS 4
  • Convex (data storage and queries)
  • Stack Auth
  • Google Gemini (@google/generative-ai)
  • Radix UI + Lucide icons
  • Vitest + Testing Library

Getting Started

Prerequisites

  • Node.js 18+
  • Bun 1.0+
  • A Google Gemini API key
  • A Convex project URL
  • Stack Auth project credentials

Installation

  1. Clone and install dependencies
git clone https://github.com/Aditya190803/application-tracking-system.git
cd application-tracking-system
bun install --frozen-lockfile
  1. Create local env file
cp .env.example .env.local
  1. Set required variables in .env.local
# Gemini
GOOGLE_API_KEY=""

# Convex
NEXT_PUBLIC_CONVEX_URL=""

# Stack Auth
NEXT_PUBLIC_STACK_PROJECT_ID=""
NEXT_PUBLIC_STACK_PUBLISHABLE_CLIENT_KEY=""
STACK_SECRET_SERVER_KEY=""

# Optional
NEXT_PUBLIC_APP_URL="http://localhost:3000"
MODEL_NAME="gemini-2.5-flash"
AI_TIMEOUT_MS="30000"
PDF_PARSE_TIMEOUT_MS="12000"
COVER_LETTER_ROUTE_TIMEOUT_MS="35000"
RESUME_ROUTE_TIMEOUT_MS="45000"
LATEX_RENDER_API_BASE="https://latexonline.cc"
UPSTASH_REDIS_REST_URL=""
UPSTASH_REDIS_REST_TOKEN=""
# Only set true for local emergency fallback; keep false/empty in production
ALLOW_IN_MEMORY_RATE_LIMIT=""

# Axiom (production logging)
AXIOM_TOKEN=""
AXIOM_DATASET=""
AXIOM_SERVICE="ats"
LOG_OBS_ERROR_DETAILS=""
  1. Start Convex dev backend and Next.js app
bunx convex dev
bun run dev

App runs at http://localhost:3000.

Observability (Axiom)

Server routes emit structured JSON logs ([obs] prefix) via src/lib/observability.ts.

  1. Create an Axiom dataset (e.g. ats-prod).
  2. Create an API token with ingest permission.
  3. Set on Vercel (and in .env.local for dev ingest):
  4. AXIOM_TOKEN — bearer token (never commit)
  5. AXIOM_DATASET — e.g. ats-prod
  6. AXIOM_EDGE — optional, e.g. us-east-1.aws.edge.axiom.co (matches your ingest URL region)
  7. Optional: add the Vercel → Axiom integration for raw platform logs in addition to direct ingest.

Useful Axiom queries

['your-dataset']
| where event == "pdf.parse_failed" or event == "pdf.parse_no_text"
| sort by _time desc
['your-dataset']
| where requestId == "paste-ref-from-user"

PDF upload failures include requestId in the API error; the upload UI shows it as (ref: …) so users can share it with support.

Set LOG_OBS_ERROR_DETAILS=true temporarily to include sanitized errorMessage on failure events (never resume or job description content).

Extension points exported contracts — how you extend this code

ResumeItem (Interface)
(no doc)
src/types/domain.ts
ResumeSelectProps (Interface)
(no doc)
src/components/resume/ResumeSelect.tsx
NormalizedMatchAnalysis (Interface)
(no doc)
src/lib/analysis-normalizer.ts
ExportDocxBody (Interface)
(no doc)
src/app/api/export-cover-letter-docx/route.ts
UseGenerationFlowOptions (Interface)
(no doc)
src/hooks/useGenerationFlow.ts
MatchAnalysisResult (Interface)
(no doc)
src/types/domain.ts
ResumeUploadProps (Interface)
(no doc)
src/components/resume/ResumeUpload.tsx
RetrySignal (Interface)
(no doc)
src/lib/client-retry.ts

Core symbols most depended-on inside this repo

apiError
called by 105
src/lib/api-response.ts
get
called by 58
src/lib/utils.ts
cn
called by 43
src/lib/utils.ts
escapeLatex
called by 41
src/lib/resume-latex.ts
POST
called by 28
src/app/api/resumes/route.ts
apiSuccess
called by 24
src/lib/api-response.ts
set
called by 24
src/lib/utils.ts
getAuthenticatedUser
called by 24
src/lib/auth.ts

Shape

Function 238
Interface 67
Class 6
Method 5

Languages

TypeScript100%

Modules by API surface

src/lib/convex-server.ts28 symbols
src/lib/resume-latex.ts22 symbols
src/app/dashboard/cover-letter/page.tsx13 symbols
src/lib/observability.ts12 symbols
src/lib/utils.ts11 symbols
src/app/dashboard/cover-letter/[slug]/page.tsx10 symbols
src/lib/gemini.ts9 symbols
src/app/dashboard/resume-builder/[slug]/page.tsx9 symbols
src/lib/pdf-parser.ts8 symbols
src/app/dashboard/resume-builder/step-2/page.tsx8 symbols
src/app/dashboard/resume-builder/page.tsx8 symbols
src/components/ui/toast.tsx7 symbols

For agents

$ claude mcp add Application-Tracking-System \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact