AXIS is an AI agent workspace for resume generation and refinement. It turns raw career materials, uploaded resumes, and target job descriptions into structured JSON Resume content, then routes the work through generation, JD matching, field-level rewriting, compression, LaTeX rendering, PDF export, cloud snapshots, and public sharing.
- Agentic workflow instead of one fixed prompt.
- Schema-first resume data instead of fragile free text.
- RAG memory over projects, skills, previous versions, and target roles.
- Field-level editing and version rollback before PDF export.
- Production-oriented Flask APIs with auth, usage limits, sharing, subscriptions, and payments.
AXIS separates intent, memory, task execution, and rendering.
flowchart LR
U[User input / files / JD] --> API[Flask API]
API --> RAG[RAG memory retrieval]
API --> WF[LangGraph Resume Workflow]
RAG --> WF
WF --> IR[Intent Routing]
IR --> G[Full generation]
IR --> M[JD matching]
IR --> L[Local rewrite]
IR --> C[Compression]
G --> JSON[JSON Resume]
M --> JSON
L --> JSON
C --> JSON
JSON --> PDF[LaTeX / PDF Renderer]
JSON --> DB[(Snapshots + Vector Memory)]
PDF --> FE[React editor preview]
Core backend pieces:
| Area | File | Role |
|---|---|---|
| Agent workflow | backend/services/resume_agent_workflow.py |
LangGraph task orchestration for import, generation, continuation, local edits, retargeting, compression, and polishing |
| Chat agent | backend/services/resume_chat_agent.py |
Chat-panel intent handling, trace-friendly state, and response writing |
| RAG memory | backend/services/resume_memory_service.py |
Embedding, vector storage, retrieval, and context formatting |
| Resume pipeline | backend/services/resume_generation_pipeline.py |
Stable service boundary used by routes and graph nodes |
| Renderer | backend/services/latex_service.py |
Structured JSON Resume to LaTeX/PDF |
Saved and generated resumes are indexed into resume_memory_vectors:
- project and work experience chunks
- skill keywords
- awards and optimization summaries
- target JD and role instructions
The default embedding is deterministic and database-backed, so local tests and low-cost deployments work without another vector service. The storage boundary can later be swapped for pgvector or an external vector database without changing the agent workflow contract.
| Module | Capability |
|---|---|
| Editor | Agent chat, file input, field editing, template/layout controls, PDF preview |
| Resume tools | parsing, structured generation, JD matching, local rewrite, compression, LaTeX compile, PDF export |
| Persistence | cloud save, snapshots, rollback, public share links |
| Account | email verification, login, OAuth hooks, password reset, profile management |
| Billing | Free/Pro/Max entitlements, Stripe, Alipay, Bitcoin unique-amount flow |
| Layer | Stack |
|---|---|
| Frontend | React 18, Vite, React Router, i18next, TipTap, react-pdf |
| Backend | Flask 3, LangGraph, SQLAlchemy 2, Alembic, Pydantic, PyJWT |
| AI | OpenAI-compatible chat API, Google AI Studio fallback |
| Data | Postgres in Docker, SQLite fallback, DB-backed vector memory |
| Render | LaTeX template renderer and PDF compilation |
| Deploy | Docker Compose, Gunicorn backend, Nginx frontend |
cp .env.example .env
docker compose up --buildOpen:
- Frontend: http://localhost:3000
- Backend: http://localhost:5001
Run locally without Docker:
python -m venv .venv
source .venv/bin/activate
pip install -r backend/requirements.txt
alembic upgrade head
python -m flask --app backend.app run --host 0.0.0.0 --port 5001 --debugcd frontend
npm install
npm run devProduction-style compose:
docker compose -f docker-compose.prod.yml up --buildpython -m pytest backend/tests
cd frontend && npm run build
