2.7 KiB
2.7 KiB
System Architecture
Hireme is designed as a single-binary, local-first web application. It combines a high-performance backend, an embedded database, background job processing, and a lightweight frontend into a cohesive, easy-to-deploy system.
Components
1. Database Layer (internal/db)
- Technology: SQLite3 via
github.com/mattn/go-sqlite3. - Mode: WAL (Write-Ahead Logging) mode is enabled (
PRAGMA journal_mode=WAL;) to support high concurrency between the HTTP server reads and background worker writes without "database is locked" errors. - Pattern: Centralized query methods attached to a
DBstruct (queries.go).
2. Worker Pool & Task Queue (internal/worker, internal/db/tasks.go)
- Technology: Custom goroutine worker pool pulling from a
tasksSQLite table. - Tasks:
DISCOVER: Initiates crawling on a target (e.g., Google Jobs search URL).FETCH: Fetches raw HTML for a specific job posting.PROCESS: Parses raw HTML, applies rule-based filtering (keywords, scoring), and enqueues for analysis if qualified.ANALYZE: Sends the parsed job to an LLM for final qualification scoring and tailoring tips.
- Concurrency: Managed via context cancellation and
atomic.Boolflags for safe pausing and resuming.
3. Filters & Rules (internal/filter, data/config/filters.yaml)
- A pipeline pattern is used to quickly reject jobs before doing expensive LLM API calls.
- Hard Keywords: Immediate rejection if a keyword (e.g., "Clearance", "Staff") is found.
- Scoring Weights: Basic substring counting for required technologies (e.g., "Go", "Python"). If the raw score falls below a threshold, the job is rejected.
4. Crawlers (pkg/crawler)
- Currently implements Google Jobs (
pkg/crawler/google). - Mechanism: Parses embedded JSON (
AF_initDataCallback) in the raw HTML response rather than fragile DOM traversal. This ensures stability against UI changes.
5. UI Layer (internal/ui)
- Technology: Standard Go HTTP server (
net/http), Go Templates (html/template), HTMX, and Tailwind CSS. - Philosophy: Server-Side Rendered (SSR) HTML fragments returned directly to HTMX for seamless, single-page application (SPA) like updates without heavy JS payloads.
- Templates: Statically compiled strings in
.gofiles (template_layout.go,template_jobs.go) rather than external.htmlfiles to keep the binary fully self-contained.
6. Logging (internal/logger)
- Technology:
go.uber.org/zap(Sugared Logger). - Pattern: Structured logging using
wmethods (Infow,Errorw,Debugw) to allow for strongly-typed key-value pairs ("component", "API") instead of string formatting.