Architecture Overview¶
Kairos follows Clean Architecture with a Python package separating concerns into independent modules. Multiple frontends (CLI, Web) share a single FastAPI backend.
High-Level Architecture¶
graph TB
subgraph Frontend Layer
CLI["kairos-cli\ntyper + httpx"]
Web["Web App\nReact 19 + Vite+"]
end
subgraph API Layer
API["kairos-api\nFastAPI + uvicorn"]
end
subgraph Application Layer
Core["kairos.core\nEntities + Interfaces + Services"]
end
subgraph Infrastructure Layer
Platform["kairos.platform\nAdzuna / Seek / LinkedIn"]
LLM["kairos.llm\nLiteLLM + Claude/GPT/Gemini"]
DB["kairos.db\nSQLAlchemy + PostgreSQL"]
end
CLI --> API
Web --> API
API --> Core
Platform --> Core
LLM --> Core
DB --> Core
Dependency Flow¶
kairos.api (FastAPI server — the unified backend)
+-- kairos.core (domain: entities, interfaces, errors)
+-- kairos.platform (implements JobSearchService)
| +-- kairos.core
+-- kairos.llm (implements JdAnalysisService, ResumeTailorService)
| +-- kairos.core
+-- kairos.db (implements *Repository ABCs)
+-- kairos.core
kairos.client (shared HTTP client library)
+-- kairos.core (shared types for deserialization)
kairos.cli (HTTP client via kairos.client)
+-- kairos.core
+-- kairos.client
Rule: Infrastructure modules depend on kairos.core for interface definitions. kairos.core depends on nothing external — it's the innermost layer. All frontends go through kairos.api — no exceptions.
Module Responsibilities¶
| Module | Responsibility | Key Interface |
|---|---|---|
| kairos.core | Domain entities, service ABCs, error types | All ABC definitions |
| kairos.api | FastAPI HTTP server, routes, auth, WebSocket | — (entry point) |
| kairos.client | Shared HTTP client library for CLI (and future frontends) | — (library) |
| kairos.cli | Command-line HTTP client | — (entry point) |
| kairos.platform | Job data from Adzuna API, Seek/LinkedIn scrapers | JobSearchService |
| kairos.llm | JD analysis + resume tailoring via Claude | JdAnalysisService, ResumeTailorService |
| kairos.db | PostgreSQL persistence via SQLAlchemy | JobRepository, ResumeRepository, ApplicationRepository |
Async Architecture¶
flowchart LR
subgraph API Server
Routes[FastAPI Routes]
Scrape["Scrape Jobs\nasyncio.create_task"]
Analyze["Analyze JD\nasyncio.create_task"]
Tailor["Tailor Resume\nasyncio.create_task"]
end
Clients["CLI / Web"] --> |HTTP/WS| Routes
Routes --> Scrape
Routes --> Analyze
Routes --> Tailor
Scrape --> |WebSocket| Clients
Analyze --> |WebSocket| Clients
Tailor --> |WebSocket| Clients
All I/O-heavy operations (scraping, LLM calls) run as background tasks in the FastAPI server. Frontends receive progress updates via WebSocket.