Skip to content

// project

HireSignal

A native, multiplatform AI career-intelligence engine — and the open-source project it's built on.

HireSignal is a local-first AI career-intelligence engine: resume onboarding, reverse-ATS discovery, evidence-based fit scoring and tailored résumés, in one pipeline. The product idea and scoring model started on career-ops, an open-source Node.js job-search engine (⭐60k+) that I actively contribute to upstream. The native app is a from-scratch Kotlin Multiplatform rebuild — the same A–F fit-scoring engine, ported and verified line-for-line against the original, now running identically on Android, iOS, Desktop, Web and a Spring Boot server instead of a single Node process.

Kotlin MultiplatformCompose MultiplatformSpring Boot 4Room (KMP)Ktor62 ATS/board providers
My career-ops fork Upstream (career-ops, ⭐60k+) Field notes on this work Active · 4 PRs merged upstream

0

KMP modules · 5 targets

0k

lines of Kotlin · 543 files

0

ATS & job-board providers

0

PRs merged upstream

// multiplatform

One codebase, every surface

The real screens (and, where it's live, the running build) per platform — not a mockup.

Android screen

Real Roborazzi captures — first screenshots off the actual Compose UI, not mockups.

// deep dive

How it works

One engine, five targets

A 25-module clean-architecture split — 12 feature modules and 6 core modules — targets Android, iOS, Desktop, Web (wasmJs) and a Spring Boot 4 server from one shared Kotlin codebase: 543 files, ~45,000 lines. core:designsystem, core:protocol, core:engine, core:data, core:network and core:ai sit underneath feature modules for dashboard, pipeline, explore, intel, ops, profile, auth, assistant and more.

A no-IO engine, ported and verified

core:engine holds the A–F fit-scoring rubric, ATS search, SimHash fingerprinting for duplicate-listing detection, a liveness classifier, and the funnel math — none of it touches the network or disk. It's ported 1:1 from career-ops's original JavaScript implementation and checked against that implementation's own test vectors, so the scoring behaves identically whether it's running on Android, in a browser tab, or on the server.

Offline-first, agent-reachable

Room (KMP) plus DataStore caches everything locally over a Ktor REST + NDJSON/SSE sync layer, so the dashboard stays usable offline and catches up when connectivity returns. An agent-interop surface — Android AppFunctions, iOS App Intents/Shortcuts, hiresignal:// deep links, and a documented OpenAPI contract — lets other agents (and the OS itself) drive the app without going through the UI.

On-device AI, with a fallback that always works

Where an LLM adds real value, it runs on-device first: ML Kit GenAI / Gemini Nano on Android, Apple Foundation Models on iOS. Every AI-assisted step has a deterministic-heuristic fallback, so fit scoring and résumé tailoring keep working with zero model available — the same discipline career-ops applies with its zero-token scan path.

Zero tokens until an LLM is actually needed

The engine's scan path hits Greenhouse, Ashby and Lever APIs plus per-company local parsers directly, at zero LLM cost, falling back to an agent-driven search only for companies with no structured source. Every scanned posting passes through one shared trust-validator that scores and flags it before it reaches the tracker — 62 ATS & job-board provider modules plug into that one contract instead of reinventing trust scoring each time.

One engine, many candidates

career-ops's multi-profile architecture — a profiles.yml registry mapping each candidate to a private data root while sharing one engine install — is the same shape the native app's per-candidate routing follows: one server, N profiles, a strict User/System data contract between them.

Genuine upstream contribution, not a personal fork

Four merged pull requests against the public career-ops repository (⭐60k+, independently verifiable): two new ATS providers (BambooHR, Breezy HR), a dashboard rendering fix — rewriting only the changed Status cell instead of the whole row — and an agent-inbox feature for queuing requests across sessions.

// architecture

How it's built

One engine, five targets

Zero tokens until an LLM is actually needed

// under the hood

Tech stack

Native app

  • Kotlin Multiplatform
  • Compose Multiplatform
  • Spring Boot 4 server
  • Room (KMP) + DataStore
  • Ktor REST + NDJSON/SSE

On-device AI

  • ML Kit GenAI / Gemini Nano (Android)
  • Apple Foundation Models (iOS)
  • deterministic-heuristic fallback

Agent interop

  • Android AppFunctions
  • iOS App Intents / Shortcuts
  • hiresignal:// deep links
  • OpenAPI contract

Open-source engine (career-ops)

  • Node.js
  • 62 ATS/job-board providers
  • zero-token Greenhouse/Ashby/Lever scanning
  • A–F fit rubric

// gallery

Screens (4)

Swipe or use the arrows · tap a screen to enlarge

See how everything connects →