Open-Source Career Intelligence Platform for the DACH Market
Transform hours of CV tailoring into seconds. Upload your CVs, paste a job description, and let AI guide you through an intelligent interview to create perfectly matched application documents.
π Quick Start β’ π Documentation β’ π¬ Community β’ π Report Bug
Applire is an open-source AI platform that combines deep career intelligence with DACH-specific cultural expertise to automate high-quality CV tailoring.
Built for all job seekers in the DACH market, with unmatched depth in regulated industries (Pharma, GxP, Medtech) β a specialization that proves our precision for every user.
Unlike generic CV builders, Applire:
- π§ Learns from you: Builds a persistent Master Profile that gets smarter with every CV you upload
- π¬ Interviews you intelligently: Asks targeted questions to fill gaps between your experience and job requirements
- β¨ Tailors with precision: Generates culturally appropriate CVs optimized for DACH recruiters and ATS systems
- π€ Agent-first design: Accessible to AI assistants via the Model Context Protocol (MCP)
- π Privacy by design: GDPR-compliant, self-hosted, full data sovereignty
In 3 simple steps:
- π Upload 2-4 versions of your CV
- π Paste the job description
- π¬ Answer a few intelligent questions β β¨ Get a perfectly tailored CV
Applire serves diverse personas across the DACH job market:
Experienced professional with deep domain expertise who needs precision tailoring for demanding roles. Values efficiency and quality over hand-holding.
International candidate moving to DACH who needs cultural "translation" of their career history to meet local CV conventions and recruiter expectations.
Any user who wants surgical, section-level control over their CV. Trusts AI to draft but wants to fine-tune the output to sound authentic and personal.
AI assistant (Claude, ChatGPT, custom agents) calling Applire on behalf of human users via MCP or REST API for seamless career intelligence integration.
- Multi-CV Consolidation: Upload multiple CVs and automatically merge them into a rich, conflict-aware Master Profile
- Additive Enrichment: Every CV upload, interview session, and edit enriches your profile β it never overwrites, only accumulates
- Source Tracking: Full audit trail of where every piece of information came from
- Conflict Resolution: Smart detection of factual contradictions (dates, degrees) with user-controlled resolution
- Deep JD Analysis: Extracts requirements, skills, cultural signals, and industry context from job descriptions
- Transparent Gap Scoring: 0-100% match score with detailed explanations of what's missing
- Categorized Gaps:
- Category A (Hard blockers): Must-have requirements you don't meet
- Category B (Confirmation needed): You likely have this, but it's not stated clearly
- Category C (Exploratory): Soft requirements worth discussing
- Two Modes:
- Targeted Mode (for experienced users): Focuses on filling specific gaps identified in your profile
- Guided Mode (for new users): Systematically builds your profile section by section
- Stateful Backend: Pause and resume anytime β your progress is saved server-side
- Smart Completion: Automatically detects when you're done or when all gaps are resolved
- Profile Updates: Every answer enriches your Master Profile in real-time
- ATS-Optimized PDFs: Generated via Playwright/Chromium with CSS-based themes
- Live Browser Preview: See exactly what your CV will look like before downloading
- Section-Level Editing: Fine-tune individual sections (introduction, positions, skills) with live re-rendering
- Dual Save Path: Save edits to your Master Profile (permanent) or just to this CV (one-time)
- AI-Assisted Editing: Optional "Let Kaile help" for targeted gap completion within the editor
- Cover Letter Generation: AI-powered cover letter creation based on JD and Master Profile
- Cultural Adaptation: Automatic detection and formatting for German, Austrian, and Swiss CV conventions
- Market-Specific Formatting: Lebenslauf vs. international CV formats
- Cultural Signal Detection: Identifies when a CV needs adaptation (e.g., Indian β German pharma standards)
- Multilingual Support: German and English UI; French and Spanish planned
- Regulatory Industry Depth: Specialized knowledge for Pharma, GxP, Medtech roles
- Privacy by Design (GDPR Art. 25): Minimal data collection, encryption at rest
- Automated Retention: Daily cron job enforces TTLs:
- Uploaded files: 7 days
- Interview sessions: 30 days
- Generated CVs: 90 days (human) / 24 hours (agent)
- Right to Erasure (GDPR Art. 17): One-click full data deletion
- Self-Hosted: Your data never leaves your infrastructure
Applire is the first career platform optimized for AI agents as customers:
- Seamless Integration: First-class support for Claude Desktop, ChatGPT, Cursor, and custom AI agents
- Stateful Sessions: Agents can pause, resume, and recover from interruptions
- Flow Orchestrator: Guides agents through the correct sequence (JD analysis β CV import β gap analysis β interview β generation)
- Async Generation: Non-blocking CV generation with polling-based status checks
- Full HTTP API: Programmatic access for remote integrations
- OpenAPI Documentation: Interactive Swagger UI at
/docs
# Start MCP server (stdio transport)
python -m applire.mcp
# Agent calls:
1. start_flow() β flow_id
2. analyze_jd(text="Senior Python Engineer...") β job_id
3. analyze_gaps(job_id) β gap_report
4. run_interview(session_id, message="I have 5 years...") β next_question
5. generate_cv(job_id) β cv_id (async)
6. get_cv_status(cv_id) β {status: "ready", pdf_url: "..."}- Python 3.12+: Modern async Python with type hints
- FastAPI: High-performance async web framework
- PostgreSQL 16: JSONB for flexible Master Profile schema
- Pydantic: Type-safe data validation and serialization
- SQLAlchemy 2.0: Async ORM with full type support
- Alembic: Database migrations
- Next.js 15: React framework with App Router
- TypeScript: Type-safe JavaScript
- ShadCN/UI: Accessible component library
- Tailwind CSS v4: Utility-first styling
- OpenRouter (default): Multi-model gateway giving access to Mistral, Claude, and others with a single API key
- LLM Provider Abstraction: Pluggable backends for Mistral, OpenAI, Ollama (self-hosted)
- Custom State Machine: Async interview orchestrator (no LangGraph dependency)
- Playwright: Headless Chromium for PDF generation
- Docker & Docker Compose: Containerized deployment
- PostgreSQL 16: Primary database with JSONB support
- Retention Worker: Daily cron for GDPR TTL enforcement
- GitHub Actions: CI/CD pipeline with pytest and Playwright E2E tests
- Model Context Protocol (MCP): stdio transport for local AI agents
- REST API: Full HTTP API for remote integrations
- Flow Orchestrator: State machine for multi-step agent workflows
- Session Recovery: Agents can resume interrupted sessions via
flow_id
- Docker & Docker Compose
- LLM API Key: Mistral AI (default), OpenRouter, OpenAI, or Ollama (local/free)
# 1. Download the two required files
curl -O https://raw.githubusercontent.com/tobias-rosenbaum/Applire/main/docker-compose.yml
curl -O https://raw.githubusercontent.com/tobias-rosenbaum/Applire/main/.env.example
# 2. Configure your environment
cp .env.example .env
# Edit .env: set LLM_PROVIDER and the matching API key (see Configuration below)
# 3. Start all services
docker compose up -d
# 4. Run database migrations (first run only)
docker compose exec backend alembic upgrade headAccess the application:
- Frontend: http://localhost:3000
- API docs: http://localhost:8001/docs
To update to the latest release:
docker compose pull && docker compose up -dContributing? See CONTRIBUTING.md for the build-from-source developer setup.
Copy .env.example to .env and configure:
# Database
DATABASE_URL=postgresql+asyncpg://applire:applire@postgres:5432/applire
# LLM Provider β choose one: mistral | openrouter | openai | ollama
LLM_PROVIDER=mistral
# Mistral AI β EU-hosted, GDPR-native, default
MISTRAL_API_KEY=your-mistral-api-key-here
MISTRAL_MODEL=mistral-medium-latest
# OpenRouter β multi-model gateway, recommended alternative
# Get a key at https://openrouter.ai/keys
OPENROUTER_API_KEY=your-openrouter-api-key-here
OPENROUTER_MODEL=mistralai/mistral-medium-3
# OpenAI or any OpenAI-compatible server (e.g. LM Studio)
OPENAI_API_KEY=your-openai-api-key-here
#OPENAI_MODEL=gpt-4o
#OPENAI_BASE_URL=http://host.docker.internal:1234/v1
# Ollama β fully offline (docker compose --profile ollama up)
OLLAMA_BASE_URL=http://ollama:11434
OLLAMA_MODEL=llama3.2
# LLM timeout in seconds (raise for reasoning models)
LLM_TIMEOUT=180
# Auth (none for Community Edition single-user mode)
AUTH_PROVIDER=none
# CORS β comma-separated list of allowed origins
CORS_ORIGINS=http://localhost:3000,http://localhost:3001
# nginx proxy timeout β must be greater than LLM_TIMEOUT
#NGINX_PROXY_TIMEOUT=300
# Frontend API URL
# docker compose: leave empty β nginx at :80 routes /api/* to the backend
# standalone dev: set to http://localhost:8001
#NEXT_PUBLIC_API_URL=http://localhost:8001Applire supports multiple LLM backends via a pluggable abstraction layer:
| Provider | Configuration | Use Case |
|---|---|---|
| OpenRouter (default) | LLM_PROVIDER=openrouterOPENROUTER_API_KEY=... |
Multi-model gateway; access Mistral, Claude, and others with one key |
| Mistral AI | LLM_PROVIDER=mistralMISTRAL_API_KEY=... |
EU-hosted, GDPR-native, strong German proficiency |
| OpenAI | LLM_PROVIDER=openaiOPENAI_API_KEY=... |
High quality, widely available; also supports LM Studio via OPENAI_BASE_URL |
| Ollama (local) | LLM_PROVIDER=ollamaOLLAMA_BASE_URL=http://localhost:11434 |
Fully offline, no API costs, privacy-first |
Full OpenAPI documentation available at http://localhost:8001/docs (Swagger UI).
# Job Description Analysis
POST /api/job/analyze
{
"text": "Senior Software Engineer role...",
"url": "https://example.com/job" # Optional
}
# CV Upload & Profile Enrichment
POST /api/profile/upload
Content-Type: multipart/form-data
files: [cv1.pdf, cv2.pdf]
# Gap Analysis
POST /api/gap/analyze
{ "job_id": "uuid" }
# Start Interview Session
POST /api/session
{ "job_id": "uuid", "mode": "targeted" }
# Send Interview Message
POST /api/session/{session_id}/message
{ "message": "I have 5 years of experience with Python..." }
# Generate CV
POST /api/cv/generate
{ "job_id": "uuid", "theme": "classic_german" }
# Check CV Generation Status
GET /api/cv/{cv_id}/status
# Returns: { "status": "pending" | "ready" | "failed" }
# Download CV
GET /api/cv/{cv_id}/pdf# Start MCP server (stdio transport)
python -m applire.mcp| Tool | Description |
|---|---|
start_flow(job_id?) |
Create or resume a flow session |
analyze_jd(text?, url?) |
Analyze a job description |
analyze_gaps(job_id) |
Detect gaps between profile and JD |
run_interview(session_id, message) |
Send a message in an interview session |
generate_cv(job_id, options?) |
Initiate async CV generation |
get_cv_status(cv_id) |
Poll CV generation status |
advance_flow(flow_id, step, artifact_id?) |
Advance to next step in flow |
get_flow_state(flow_id) |
Get current flow state and available actions |
profile://currentβ User's Master Profilejob://{job_id}β Job analysiscv://{cv_id}β Generated CVflow://{flow_id}β Flow session state
# Run all tests
pytest
# Run with coverage (enforces β₯75% threshold)
pytest --cov=applire --cov-fail-under=75
# Generate HTML coverage report
pytest --cov=applire --cov-report=html# Run unit tests
npm test
# Run E2E tests (Playwright)
npm run test:e2e
# Run E2E tests in UI mode
npm run test:e2e:uiGitHub Actions runs:
- Backend unit tests (pytest, β₯75% coverage)
- Backend integration tests (Docker stack)
- E2E tests (Playwright, Chromium + Firefox)
All tiers must pass before merge.
Applire/
βββ backend/
β βββ applire/
β β βββ main.py # FastAPI application entry point
β β βββ models/ # SQLAlchemy ORM models
β β βββ schemas/ # Pydantic request/response schemas
β β βββ routers/ # FastAPI route handlers
β β βββ services/ # Business logic layer
β β β βββ interview/ # Interview Orchestrator (state machine)
β β β βββ flow/ # Flow Orchestrator
β β β βββ profile/ # Master Profile merge logic
β β β βββ cv/ # CV generation & section editing
β β β βββ gap/ # Gap analysis
β β βββ providers/ # LLM, Auth, Storage abstractions
β β βββ mcp/ # Model Context Protocol server
β β βββ retention/ # GDPR retention worker
β β βββ templates/ # Jinja2 CV templates
β βββ alembic/ # Database migrations
β βββ tests/ # Pytest test suite
β βββ requirements.txt
βββ frontend/
β βββ app/ # Next.js App Router pages
β βββ components/ # React components
β βββ lib/ # Utilities and API clients
β βββ public/
βββ docs/
β βββ TESTING.md # Testing strategy and commands
β βββ CI_CD_GUIDE.md # CI/CD pipeline documentation
β βββ TRACEABILITY.md # Requirements traceability
βββ tests/ # Integration and E2E tests
βββ docker-compose.yml
βββ .env.example
βββ README.md
- Multi-CV upload and parsing (PDF, DOCX, images via OCR)
- Master Profile consolidation with conflict resolution
- Job description analysis (text + URL scraping)
- Gap detection and match scoring
- Conversational interview flow (Targeted + Guided modes)
- CV generation (PDF via Playwright, multiple templates)
- CV Section Editor (Finetuner) with live preview and AI-assisted editing
- Cover letter generation
- Photo management (upload, crop, remove)
- Cultural adaptation detection (DACH-specific)
- MCP Server (stdio transport for AI agents)
- Flow Orchestrator (state machine for user journey)
- GDPR Retention Worker (automated TTL enforcement)
- Multilingual UI (de/en via next-intl)
Core Experience Improvements
- Gap Interview Refinement: Enhanced question quality and relevance
- Additional CV Layouts: Expanding template library
Market Expansion
- European Country Support: Gradual rollout beyond DACH (France, Italy, Spain, Portugal, Poland) with localized formats and language support
Developer Experience
- MCP Marketplace Listing: Distribution via Anthropic, OpenAI, and Cursor marketplaces
- Mock Interview Preparation: AI-powered practice sessions with role-specific questions
- Career Path Advisory: Skill gap analysis and training recommendations
- Job Search & Recommendation: Curated job suggestions based on Master Profile
- Mobile App: iOS and Android native applications
We welcome contributions! Please follow these steps:
- Fork the repository
- Create a feature branch:
git checkout -b feature/amazing-feature - Commit your changes:
git commit -m 'feat: add amazing feature' - Push to the branch:
git push origin feature/amazing-feature - Open a Pull Request
- Follow PEP 8 for Python code (enforced by
black) - Use TypeScript for all frontend code (strict mode, no
any) - Write tests for new features (β₯75% backend coverage)
- Keep commits atomic and use Conventional Commits
- All schema changes go through Alembic migrations β never raw DDL
# Backend: Format with Black
black .
# Frontend: Lint with ESLint
npm run lintBy submitting a pull request you agree to the Applire CLA. This allows us to maintain the open-core model while keeping the Community Edition fully open-source. See CONTRIBUTING.md for details.
- π Documentation β Testing, CI/CD, and architecture guides
- π GitHub Issues β Report bugs and request features
- π¬ GitHub Discussions β Ask questions and share ideas
This project is licensed under the GNU Affero General Public License v3.0 (AGPL-3.0) β see the LICENSE file for details.
We chose AGPL to ensure that:
- β The software remains free and open source β Always accessible to everyone
- β Modifications must be shared β Even when used as a service (SaaS)
- β The community benefits β All improvements flow back to the project
- β Your privacy is protected β Full transparency in how your data is processed
- β No vendor lock-in β You control your data and infrastructure
For organizations that cannot comply with AGPL requirements (e.g., proprietary SaaS offerings), commercial licenses are available. Contact applire@posteo.com for details.
- Mistral AI for EU-hosted LLM infrastructure
- FastAPI and Next.js communities
- All contributors and early adopters
- DACH industry professionals who provided domain expertise
- The open-source community for inspiration and tools
- Website: applire.de (coming soon)
- Email: applire@posteo.com
- Issues: GitHub Issues
- Security: applire@posteo.com (see SECURITY.md)
Built with β€οΈ for job seekers in the DACH market
Open-source career intelligence. Privacy-first. Agent-ready.
