Skip to content

tobias-rosenbaum/Applire

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

82 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Applire

Applire

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.

License Python FastAPI Next.js Docker GitHub Stars

πŸš€ Quick Start β€’ πŸ“– Documentation β€’ πŸ’¬ Community β€’ πŸ› Report Bug


πŸ’‘ What is Applire?

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:

  1. πŸ“„ Upload 2-4 versions of your CV
  2. πŸ”— Paste the job description
  3. πŸ’¬ Answer a few intelligent questions β†’ ✨ Get a perfectly tailored CV

πŸ‘₯ Who is Applire for?

Applire serves diverse personas across the DACH job market:

πŸ’Ό Marcus - The Expert

Experienced professional with deep domain expertise who needs precision tailoring for demanding roles. Values efficiency and quality over hand-holding.

🌍 Priya - The Relocator

International candidate moving to DACH who needs cultural "translation" of their career history to meet local CV conventions and recruiter expectations.

✏️ Felix - The Finetuner

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.

πŸ€– Kaile - The AI Agent

AI assistant (Claude, ChatGPT, custom agents) calling Applire on behalf of human users via MCP or REST API for seamless career intelligence integration.


✨ Key Features

🧠 Intelligent Master Profile

  • 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

🎯 Job-First Analysis & Gap Detection

  • 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

πŸ’¬ Conversational Interview Orchestrator

  • 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

πŸ“„ CV Generation & Fine-Tuning

  • 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

πŸ—ΊοΈ DACH Cultural Intelligence

  • 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 & GDPR Compliance

  • 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

πŸ€– Built for the AI Agent Era

Applire is the first career platform optimized for AI agents as customers:

Model Context Protocol (MCP)

  • 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

REST API

  • Full HTTP API: Programmatic access for remote integrations
  • OpenAPI Documentation: Interactive Swagger UI at /docs

Agent Workflow Example

# 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: "..."}

πŸ—οΈ Architecture & Tech Stack

Backend

  • 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

Frontend

  • Next.js 15: React framework with App Router
  • TypeScript: Type-safe JavaScript
  • ShadCN/UI: Accessible component library
  • Tailwind CSS v4: Utility-first styling

AI/ML

  • 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

Infrastructure

  • 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

Agent Integration

  • 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

πŸš€ Installation

Prerequisites

  • Docker & Docker Compose
  • LLM API Key: Mistral AI (default), OpenRouter, OpenAI, or Ollama (local/free)

Self-hosting (no clone required)

# 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 head

Access the application:

To update to the latest release:

docker compose pull && docker compose up -d

Contributing? See CONTRIBUTING.md for the build-from-source developer setup.


βš™οΈ Configuration

Environment Variables

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:8001

LLM Provider Options

Applire supports multiple LLM backends via a pluggable abstraction layer:

Provider Configuration Use Case
OpenRouter (default) LLM_PROVIDER=openrouter
OPENROUTER_API_KEY=...
Multi-model gateway; access Mistral, Claude, and others with one key
Mistral AI LLM_PROVIDER=mistral
MISTRAL_API_KEY=...
EU-hosted, GDPR-native, strong German proficiency
OpenAI LLM_PROVIDER=openai
OPENAI_API_KEY=...
High quality, widely available; also supports LM Studio via OPENAI_BASE_URL
Ollama (local) LLM_PROVIDER=ollama
OLLAMA_BASE_URL=http://localhost:11434
Fully offline, no API costs, privacy-first

πŸ“– API Documentation

REST API

Full OpenAPI documentation available at http://localhost:8001/docs (Swagger UI).

Core Endpoints

# 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

Model Context Protocol (MCP)

# Start MCP server (stdio transport)
python -m applire.mcp

MCP Tools

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

MCP Resources

  • profile://current β€” User's Master Profile
  • job://{job_id} β€” Job analysis
  • cv://{cv_id} β€” Generated CV
  • flow://{flow_id} β€” Flow session state

πŸ§ͺ Testing

Backend Tests

# 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

Frontend Tests

# Run unit tests
npm test

# Run E2E tests (Playwright)
npm run test:e2e

# Run E2E tests in UI mode
npm run test:e2e:ui

CI/CD Pipeline

GitHub Actions runs:

  1. Backend unit tests (pytest, β‰₯75% coverage)
  2. Backend integration tests (Docker stack)
  3. E2E tests (Playwright, Chromium + Firefox)

All tiers must pass before merge.


πŸ“ Project Structure

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

πŸ—ΊοΈ Roadmap

βœ… Current Release (v0.31.0-beta)

  • 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)

⏳ Next Up

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

πŸ”­ Future Vision

  • 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

🀝 Contributing

We welcome contributions! Please follow these steps:

  1. Fork the repository
  2. Create a feature branch: git checkout -b feature/amazing-feature
  3. Commit your changes: git commit -m 'feat: add amazing feature'
  4. Push to the branch: git push origin feature/amazing-feature
  5. Open a Pull Request

Development Guidelines

  • 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

Code Style

# Backend: Format with Black
black .

# Frontend: Lint with ESLint
npm run lint

Contributor License Agreement

By 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.


πŸ’¬ Community & Support

Get Help


πŸ“„ License

This project is licensed under the GNU Affero General Public License v3.0 (AGPL-3.0) β€” see the LICENSE file for details.

Why AGPL?

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

Commercial Licensing

For organizations that cannot comply with AGPL requirements (e.g., proprietary SaaS offerings), commercial licenses are available. Contact applire@posteo.com for details.


πŸ™ Acknowledgments

  • 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

πŸ“¬ Contact


Built with ❀️ for job seekers in the DACH market

Open-source career intelligence. Privacy-first. Agent-ready.

⭐ Star us on GitHub

About

Open-source AI-powered CV tailoring platform for the DACH job market

Topics

Resources

License

Code of conduct

Contributing

Security policy

Stars

Watchers

Forks

Packages

 
 
 

Contributors