{
  "markdown": "<div align=\"center\"><a name=\"readme-top\"></a>\n\n[![Project Banner](./public/vitex.svg)](#)\n\n# Vitex<br/><h3>AI-Powered Resume Generation Platform</h3>\n\nPaste a job description, describe your background, and get a tailored, ATS-optimized resume PDF + cover letter in ~30 seconds.<br/>\nBuilt with Next.js 16, React 19, TypeScript 6, and the Vercel AI SDK.\n\n[Live Demo][demo-link] · [Report Bug][github-issues-link] · [Request Feature][github-issues-link]\n\n<br/>\n\n<!-- SHIELD GROUP -->\n\n[![][github-release-shield]][github-release-link]\n[![][deployment-shield]][deployment-link]\n[![][github-stars-shield]][github-stars-link]\n[![][github-forks-shield]][github-forks-link]\n[![][github-issues-shield]][github-issues-link]\n[![][github-license-shield]][github-license-link]\n\n**Share Vitex**\n\n[![][share-x-shield]][share-x-link]\n[![][share-linkedin-shield]][share-linkedin-link]\n[![][share-reddit-shield]][share-reddit-link]\n\n</div>\n\n<!-- SHOWCASE:START — generated by readme-showcase; edit docs/showcase/showcase.scenario.json and re-run instead of hand-editing -->\n## ✨ See it live\n\n<a href=\"https://www.vitex.org.nz/\">\n  <img src=\"docs/showcase/hero.webp\" alt=\"Vitex landing page — 'Your Resume, Perfected by AI' headline with Job Description and Your Background input areas and a purple Generate My Resume button\" width=\"100%\">\n</a>\n\n![Demo: typing a job description and background into Vitex — the AI resume generator form in action](docs/showcase/demo.gif)\n\n<details>\n<summary>⚙️ How it works + pricing</summary>\n\n<img src=\"docs/showcase/how-it-works.webp\" width=\"100%\" alt=\"How It Works section: three steps — Paste JD, AI Generates (tailored resume with optimal ATS score), Download PDF (professional PDF ready in seconds)\">\n\n<img src=\"docs/showcase/pricing.webp\" width=\"100%\" alt=\"Simple, Transparent Pricing — Free ($0/forever, 3 free credits on signup), Pro ($29/month, 20 credits for active job seekers), Unlimited ($49/month, unlimited everything)\">\n\n</details>\n\n<details>\n<summary>📱 Mobile view</summary>\n\n<img src=\"docs/showcase/mobile-hero.webp\" width=\"390\" alt=\"Vitex on mobile — stacked layout with Job Description and Your Background textareas filling the screen\">\n\n</details>\n\n<!-- docs/showcase/demo.mp4 holds a higher-quality version of the demo — drag it into a GitHub release or comment for crisp playback. -->\n<!-- SHOWCASE:END -->\n\n## Introduction\n\nVitex is an AI-powered resume generation platform that transforms a job description and your professional background into a polished, ATS-optimized resume PDF and cover letter. An 8-step AI pipeline handles everything from JD parsing and skill matching to server-side PDF compilation, with Typst compiling PDFs locally in under 100ms. It is **agent-ready**: every capability is reachable over an authenticated HTTP API (the web UI and the public v1 API share one pipeline core), and billing is **outcome-based** — you are charged only when a resume is successfully produced. The UI follows the **Phantom** design system: a soft, flat aubergine-and-lavender aesthetic with pill geometry, whisper-weight typography, and generous whitespace.\n\nVitex is built for **a person plus their AI assistant** on a **\"one core, N thin adapters\"** design — \"The API is the UI\". Everything the web app does, an agent can do over the public v1 HTTP API, the published [`vitex-cli`](cli/README.md), or the hosted MCP connector. The guiding framing is **Career as Code**: your career facts are the source, each tailored PDF is a reproducible build artifact, the refinement chain is a series of commits, outcome billing means you pay per successful build, and the exported `.typ` source means zero lock-in. See [ADR 0003](docs/decisions/0003-adapter-strategy-and-hosted-mcp.md).\n\n## Key Features\n\n- **AI Resume Generation** -- Paste a job description + describe your background, get a tailored resume PDF\n- **8-Step AI Pipeline** -- JD parsing, background parsing, match analysis, tailoring, ATS scoring, cover letter, document generation, server-side PDF compilation\n- **Agent-Ready API** -- Operate the whole product over HTTP with an API key; no browser, 2FA, or CAPTCHA (see `docs/api/v1.md`, the OpenAPI spec at `public/openapi.yaml`, and the runnable curl playbook at [`public/skill.md`](public/skill.md))\n- **CLI & MCP server** -- [`vitex-cli`](cli/README.md) (bin `vitex`) is a thin client over the hosted API: a token-cheap CLI for terminals and coding agents, plus `vitex mcp` (a stdio MCP server via `npx -y vitex-cli mcp`) for Claude Desktop, Claude Code, and Cursor\n- **Hosted MCP connector** -- a browser-OAuth remote MCP server at `https://www.vitex.org.nz/api/mcp` lets non-technical users connect Vitex inside ChatGPT or Claude with a sign-in (no API key to paste): [ChatGPT guide](docs/connectors/chatgpt.md), [Claude guide](docs/connectors/claude.md). For agent-driven setup from docs alone, see [`llms-install.md`](llms-install.md)\n- **Outcome-Based Billing** -- Credits are charged only when a resume is successfully produced (failures are free), idempotently\n- **7 Professional Templates** -- Auto-selected by AI based on industry and role (two-column, modern-cv, executive, creative, compact, banking, academic)\n- **ATS Optimization** -- Real-time ATS compatibility scoring with actionable feedback\n- **Cover Letter Generation** -- Automatically generated alongside the resume\n- **Typst-Powered PDF** -- Local compilation in <100ms, no external APIs required\n- **Natural Language Refinement** -- Describe changes in plain English; AI applies a targeted, free refinement (resume and/or cover letter) — not a full regeneration\n- **Voice Profile** -- Save a writing sample on a candidate profile so generated cover letters match your voice\n- **Public Career Endpoint** -- Publish a profile to a stable, agent-readable page at `/p/<slug>` (HTML, `/json`, and `/md`); contact PII and raw text are never exposed\n- **Credit System** -- Stripe-powered subscription plans for usage management\n- **Cloud Storage** -- Persistent resume management with user accounts (My Resumes history, search, and re-open)\n\n## How It Works\n\n1. **Input** -- Paste a job description and describe your professional background on the homepage\n2. **Generate** -- AI analyzes, matches, tailors, and compiles your resume through an 8-step pipeline streamed via SSE\n3. **Refine & Export** -- Review the PDF preview, ATS score, and cover letter; refine with natural language; download or share\n\n## Tech Stack\n\n| Layer | Technology |\n|-------|-----------|\n| Framework | Next.js 16, React 19, TypeScript 6 |\n| AI | Vercel AI SDK v7 + OpenAI (tiered GPT-5 models) |\n| Resume Rendering | Typst (local binary, <100ms compilation) |\n| Design System | Phantom — soft, flat aubergine/lavender (Tailwind CSS + shadcn/ui) |\n| Database | Neon PostgreSQL + Drizzle ORM |\n| Auth | Neon Auth (Stack Auth) + API keys for agents |\n| Payments | Stripe (outcome-based credits) |\n| Rate limiting | Neon Postgres (fixed-window) |\n| Observability | OpenTelemetry / Langfuse (optional) |\n| Deployment | DigitalOcean VPS, Docker, Traefik, GitHub Actions CI/CD |\n\n## Getting Started\n\n### Prerequisites\n\n- Node.js 18+\n- Docker (for production deployment)\n- Typst binary (for local PDF compilation)\n\n### Installation\n\n```bash\ngit clone https://github.com/ChanMeng666/easy-resume.git\ncd easy-resume\nnpm install\n```\n\n### Environment Variables\n\nCreate a `.env.local` file:\n\n```env\n# AI\nOPENAI_API_KEY=sk-...\n\n# Database\nDATABASE_URL=postgresql://user:password@host:5432/dbname\n\n# Neon Auth (Stack Auth)\nNEXT_PUBLIC_STACK_PROJECT_ID=...\nNEXT_PUBLIC_STACK_PUBLISHABLE_CLIENT_KEY=...\nSTACK_SECRET_SERVER_KEY=...\n\n# Payments (Stripe)\nSTRIPE_SECRET_KEY=...\nSTRIPE_WEBHOOK_SECRET=...\nSTRIPE_PRICE_CREDITS_5=...\nSTRIPE_PRICE_PRO_MONTHLY=...\nSTRIPE_PRICE_UNLIMITED_MONTHLY=...\n\n# Canonical app origin (drives the OAuth issuer + advertised OAuth/MCP/public URLs)\nNEXT_PUBLIC_APP_URL=http://localhost:3000   # prod: https://www.vitex.org.nz\n\n# Optional: model tiering + observability\nAI_MODEL_EXTRACT=gpt-5.4-mini-2026-03-17   # JD parse\nAI_MODEL_REASON=gpt-5.5-2026-04-23         # generation / quality-critical steps\nAI_MODEL_CHAT=gpt-5.5-2026-04-23           # edit-agent tool loop (same as reason)\nAI_TELEMETRY_ENABLED=false\n```\n\n> See `.env.example` for the full annotated list. Rate limiting and webhook\n> idempotency use the existing Neon Postgres — no Redis required.\n\n### Development\n\n```bash\nnpm run dev          # Start dev server on http://localhost:3000\nnpm run build        # Production build\nnpm run start        # Start production server\nnpm run lint         # Run ESLint\n```\n\n## Deployment\n\nVitex runs as a Docker container on a VPS behind Traefik reverse proxy, with GitHub Actions for CI/CD.\n\n```bash\n# Build Docker image\ndocker build -t vitex .\n\n# Run container\ndocker run -p 3000:3000 --env-file .env vitex\n```\n\nThe production deployment uses:\n- **DigitalOcean VPS** as the host\n- **Docker** for containerization\n- **Traefik** for reverse proxy and TLS\n- **GitHub Actions** for automated build and deploy on push\n\n## Architecture\n\n```\nMonolith Next.js App (Docker Container on VPS)\n|\n|-- Pages\n|   |-- /                    Landing page: JD + background input\n|   |-- /editor              Result review: PDF preview, ATS score, cover letter, refinement\n|   |-- /resumes             My Resumes history (search, open, download, delete)\n|   |-- /profiles            Candidate profiles (background + voice sample) + publish\n|   |-- /applications        Application tracker\n|   |-- /dashboard           Credits, billing + Connections & API Keys\n|   |-- /pricing             Subscription plans\n|   |-- /p/[slug]            Public career endpoint (HTML, +/json, +/md)\n|\n|-- Transports (thin adapters over one shared core -- \"the API is the UI\")\n|   |-- POST /api/generate     SSE stream for the web UI\n|   |-- /api/v1/resumes        Public agent REST API (API key, job-based) + /api/v1/me\n|   |-- /api/mcp               Hosted remote MCP (Streamable HTTP, OAuth-protected)\n|   |-- /api/oauth/*           OAuth 2.1 Authorization Server (facade minting API keys)\n|   |-- vitex-cli              Published npm package: CLI + stdio MCP server\n|\n|-- Backend Core (src/server/, transport-agnostic)\n|   |-- 8-Step Pipeline: JD parse || background parse -> match -> tailor\n|   |   -> ATS score || cover letter -> render (Typst) -> compile (PDF)\n|   |-- Outcome billing: charge once, only on a compiled PDF, idempotent\n|   |-- Auth: getCaller() resolves API key or Neon Auth cookie session\n|   |-- Errors: machine-readable envelope; structured JSON logs\n|\n|-- Services\n|   |-- Neon PostgreSQL (Drizzle ORM) -- data, credits, rate limits, job queue\n|   |-- Neon Auth / Stack Auth (authentication)\n|   |-- Stripe (payments)\n|   |-- OpenAI (3 tiers: gpt-5.4-mini extract / gpt-5.5 reason / gpt-5.5 chat)\n```\n\n## License\n\nThis project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.\n\n## Contact\n\n**Chan Meng**\n- LinkedIn: [chanmeng666](https://www.linkedin.com/in/chanmeng666/)\n- GitHub: [ChanMeng666](https://github.com/ChanMeng666)\n- Email: [chanmeng.dev@gmail.com](mailto:chanmeng.dev@gmail.com)\n- Website: [chanmeng.org](https://chanmeng.org/)\n\n---\n\n<div align=\"center\">\n\n**Vitex - AI-Powered Resume Generation Platform**\n\nMade with care by Chan Meng\n\n</div>\n\n---\n\n<!-- LINK DEFINITIONS -->\n\n[back-to-top]: https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square\n\n<!-- Project Links -->\n[demo-link]: https://vitex.org.nz\n[docs-link]: https://github.com/ChanMeng666/easy-resume#readme\n\n<!-- GitHub Links -->\n[github-issues-link]: https://github.com/ChanMeng666/easy-resume/issues\n[github-stars-link]: https://github.com/ChanMeng666/easy-resume/stargazers\n[github-forks-link]: https://github.com/ChanMeng666/easy-resume/forks\n[github-release-link]: https://github.com/ChanMeng666/easy-resume/releases\n[pr-welcome-link]: https://github.com/ChanMeng666/easy-resume/pulls\n[github-license-link]: https://github.com/ChanMeng666/easy-resume/blob/master/LICENSE\n\n<!-- Shield Badges -->\n[github-release-shield]: https://img.shields.io/github/v/release/ChanMeng666/easy-resume?color=369eff&labelColor=black&logo=github&style=flat-square\n[deployment-shield]: https://img.shields.io/badge/deployment-online-55b467?labelColor=black&logo=docker&style=flat-square\n[deployment-link]: https://vitex.org.nz\n[github-stars-shield]: https://img.shields.io/github/stars/ChanMeng666/easy-resume?color=ffcb47&labelColor=black&style=flat-square\n[github-forks-shield]: https://img.shields.io/github/forks/ChanMeng666/easy-resume?color=8ae8ff&labelColor=black&style=flat-square\n[github-issues-shield]: https://img.shields.io/github/issues/ChanMeng666/easy-resume?color=ff80eb&labelColor=black&style=flat-square\n[github-license-shield]: https://img.shields.io/badge/license-MIT-white?labelColor=black&style=flat-square\n[pr-welcome-shield]: https://img.shields.io/badge/PRs_welcome-%E2%86%92-ffcb47?labelColor=black&style=for-the-badge\n\n<!-- Social Share Links -->\n[share-x-link]: https://x.com/intent/tweet?hashtags=vitex,resume,ai&text=Check%20out%20Vitex%20-%20AI-Powered%20Resume%20Generation&url=https%3A%2F%2Fgithub.com%2FChanMeng666%2Feasy-resume\n[share-linkedin-link]: https://linkedin.com/sharing/share-offsite/?url=https://github.com/ChanMeng666/easy-resume\n[share-reddit-link]: https://www.reddit.com/submit?title=Vitex%20-%20AI-Powered%20Resume%20Generation%20Platform&url=https%3A%2F%2Fgithub.com%2FChanMeng666%2Feasy-resume\n\n[share-x-shield]: https://img.shields.io/badge/-share%20on%20x-black?labelColor=black&logo=x&logoColor=white&style=flat-square\n[share-linkedin-shield]: https://img.shields.io/badge/-share%20on%20linkedin-black?labelColor=black&logo=linkedin&logoColor=white&style=flat-square\n[share-reddit-shield]: https://img.shields.io/badge/-share%20on%20reddit-black?labelColor=black&logo=reddit&logoColor=white&style=flat-square\n\n---\n\n<!-- CHAN MENG PERSONAL BRAND -->\n<div align=\"center\">\n  <a href=\"https://github.com/ChanMeng666\" target=\"_blank\">\n    <img src=\"./.github/brand/chan-meng-logo.svg\" alt=\"Chan Meng\" width=\"160\" />\n  </a>\n\n  <p><strong>Chan Meng</strong><br/>Need a custom app like this one? I build them — let's talk.</p>\n\n  <a href=\"mailto:chanmeng.dev@gmail.com\"><img src=\"https://img.shields.io/badge/Email-chanmeng.dev@gmail.com-EA4335?style=flat-square&logo=gmail&logoColor=white\" alt=\"Email Chan Meng\"/></a>\n  <a href=\"https://github.com/ChanMeng666\"><img src=\"https://img.shields.io/badge/GitHub-ChanMeng666-181717?style=flat-square&logo=github&logoColor=white\" alt=\"Chan Meng on GitHub\"/></a>\n</div>\n<!-- /CHAN MENG PERSONAL BRAND -->\n",
  "bytes": 14599,
  "sha": "ab4363fa176bb77d5a99c4b2b992ba4bd6a80407984cbf8786d9d26123ecdf92",
  "repo_slug": "chanmeng666/easy-resume",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_chanmeng666_vitex_c4e1cf5a/readme"
}