Skip to content

Web App

The Kairos web app is a React 19 + Vite+ + TypeScript frontend that consumes the same /api/v1/ endpoints as the CLI. The current vertical slice covers job search.

Vite+ is VoidZero's unified toolchain — one vp CLI replaces Vite, Vitest, ESLint, Prettier, and a Node version manager. The vp binary is bundled as the vite-plus npm dep, so npm run * scripts also work for tooling that expects them.

Running it

cd frontend
vp install                 # first-time deps  (or `npm install`)
vp dev                     # Dev server on http://localhost:5173

Or via Docker (full stack: postgres + backend + frontend):

docker compose up -d       # frontend on http://localhost:5180

Vite proxies /api/* to the backend at localhost:8880, so relative URLs work in dev and prod (see frontend/vite.config.ts).

Current capabilities

  • Search — every documented kairos jobs search flag has a UI control: country, city, platforms (Adzuna / Seek / LinkedIn), salary minimum, job type, posted-within-N-days, max results.
  • Submit-on-Enter — filter changes are staged; pressing Enter in the topbar dispatches the search.
  • Per-platform error surfacing — if Seek scraping fails but Adzuna succeeds, results from Adzuna still render and the failure is shown as a callout (no all-or-nothing).
  • Cursor pagination — "Load more" appends the next page of saved jobs.
  • Visa sponsorship filter — quick chip toggle to filter to roles flagged as offering sponsorship.

Design system

No third-party UI library. The frontend ships with a small token-based design system in frontend/src/styles/tokens.css and a Primitives.tsx exporting Microlabel, Caption, Button, Card, Badge, Chip, Divider. Inline styles bind to the tokens via var(--…).

Testing & validation

vp test run     # vitest, headless
vp test         # vitest watch mode
vp check        # format + lint + type check (the CI gate)
vp check --fix  # auto-fix formatting + safe lint issues

Tech stack

Framework React 19
Toolchain Vite+ (Vite 8 + Vitest 4 + Oxc lint/fmt)
Language TypeScript 5.7+
Tests Vitest + @testing-library/react 16
Routing none yet (single-page job search)
State local hooks (no Redux/Zustand)
Styling inline + CSS custom properties (no Tailwind / no shadcn)

Planned

  • Job detail view + JD analysis surface
  • Resume tailor diff viewer
  • Application tracker board