Files
hireme/docs/architecture.md

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 DB struct (queries.go).

2. Worker Pool & Task Queue (internal/worker, internal/db/tasks.go)

  • Technology: Custom goroutine worker pool pulling from a tasks SQLite 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.Bool flags 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 .go files (template_layout.go, template_jobs.go) rather than external .html files to keep the binary fully self-contained.

6. Logging (internal/logger)

  • Technology: go.uber.org/zap (Sugared Logger).
  • Pattern: Structured logging using w methods (Infow, Errorw, Debugw) to allow for strongly-typed key-value pairs ("component", "API") instead of string formatting.