Files
Kareer/README.md
T
austinandClaude Fable 5 506b66cfdd
Lint / REUSE compliance (push) Failing after 13s
Build and Test / Build and run tests (push) Failing after 44s
Lint / clang-format (push) Failing after 57s
Build and Publish Flatpak / Build Flatpak (push) Failing after 14s
Build and Publish Flatpak / Deploy hosted repo to Pages (push) Skipped
v0.1.3: redesign the Sankey pipeline layout
- Spread columns by rank among the stages actually present, so sparse
  pipelines fill the width instead of leaving dead stretches
- Top-align columns: the funnel's success path runs level along the top
  and drop-off ribbons only ever descend
- Give each ribbon its slot per node side (outgoing by target height,
  incoming by source height) so ribbons stop braiding over each other
- Move the last column's labels to its left so they always stay
  on-screen, with a theme halo to stay legible over ribbons
- Never hide small-node labels; elide with tooltip instead
- Guarantee columns and ribbons fit the viewport (clamp-aware scale,
  spill-proof ribbon thickness)
- Debounce resize relayouts and stop re-querying SQLite on resize
- Canonicalize stage names on write (CLI "rejected" -> "Rejected") and
  repair pre-existing rows on database open
- Take Sankey node width/padding from Kirigami units
- Add QuickShapesPrivate configure-time guard for QtQuick.Shapes
- Extend sankeylayouttest: viewport fit, ribbon containment, slot
  ordering, sparse-column spread, canonicalization, degenerate sizes
- README: build-dependency and generator fixes, document SettingsPage

Co-Authored-By: Claude Fable 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_019FXfh48mASRsE1WEhy9jcM
2026-08-31 18:51:49 -05:00

5.0 KiB

Kareer

A job application tracker built the KDE way - C++ with a QML/Kirigami frontend, ECM/CMake, and KDE Frameworks 6. Every application you log is stored in a local SQLite database, and every stage change is kept as history so the whole pipeline can be visualized as a Sankey diagram.

Everything the GUI can do is also available from the command line, so other tools - a resume generator, a job-search script - can log applications without ever opening a window.

Features

  • Track company, title, location, remote type, source, salary range, salary expectation, notes, contact, and the date applied
  • A fixed pipeline of stages (Applied, Screening, Interview, Onsite, Offer, Accepted, Rejected, Withdrawn, Ghosted) with full history of every transition
  • A Sankey diagram of the whole pipeline, showing where applications progress and where they drop off
  • Dashboard summary stats: total applications, active count, offers, response rate
  • A full CLI (kareer add|list|show|update|stage|delete|stats|stages) for scripting

Command line usage

Running kareer with no arguments (or an unrecognized first argument) starts the GUI. A recognized first argument runs headlessly instead - handy for other tools to call directly.

# Add an application (stage defaults to Applied, date defaults to today)
kareer add --company "Acme Corp" --title "Senior Software Engineer" \
    --location "Remote" --remote remote --source "LinkedIn" \
    --salary-min 140000 --salary-max 170000 --salary-expectation 160000 \
    --notes "Great team, async-friendly"

# Machine-readable output for scripting (prints the new record, including its id)
kareer add --company "Acme Corp" --title "Senior Software Engineer" --json

# List / filter
kareer list
kareer list --stage Interview
kareer list --company Acme --json

# Show, update, and move through the pipeline
kareer show 1
kareer update 1 --salary-max 175000
kareer stage 1 Interview

# Delete (requires --yes to actually happen)
kareer delete 1 --yes

# Summary stats and the canonical stage list
kareer stats
kareer stages

Run kareer <command> --help for the full option list of any subcommand. Data lives in $XDG_DATA_HOME/kareer/kareer.sqlite (under Flatpak, that's sandboxed to the app's own data directory); set KAREER_DB_PATH to point at a different file.

Wiring up a resume-builder tool

Any script that generates or sends out a resume can log the application in the same step:

kareer add --company "$COMPANY" --title "$TITLE" --url "$POSTING_URL" \
    --source "resume-builder" --json

Install

Tagged releases are built by CI into a single-file bundle (attached to each GitHub Release) and a hosted Flatpak repository on GitHub Pages:

flatpak remote-add --if-not-exists --user kareer \
  https://toservetheking.github.io/Kareer/kareer.flatpakrepo
flatpak install --user kareer io.github.toservetheking.Kareer

The repository and bundle are GPG-signed; the public key is embedded in the .flatpakrepo (and available at keys/kareer.asc).

Or install the downloaded bundle directly:

flatpak install --user ./io.github.toservetheking.Kareer.flatpak

Building

Requires Qt 6, KDE Frameworks 6, Kirigami, Kirigami Addons and the CMake toolchain. On Arch/CachyOS:

sudo pacman -S --needed cmake ninja extra-cmake-modules base-devel \
    qt6-base qt6-declarative vulkan-headers kirigami kirigami-addons \
    ki18n kcoreaddons kiconthemes kcrash kitemmodels \
    kcolorscheme qqc2-desktop-style

Then:

cmake -B build
cmake --build build
./build/bin/kareer

(If you have ninja installed, add -G Ninja to the configure step or use the ninja-dev preset: cmake --preset ninja-dev.)

Run the tests with ctest --test-dir build.

Architecture

  • job.h - the Job and StageTransition plain data structs.
  • jobstage.{h,cpp} - the fixed stage vocabulary: ordering, Sankey column/stacking position, and color.
  • jobsdatabase.{h,cpp} - SQLite storage (via QtSql) for applications and stage history; the only class that touches the database.
  • jobsmodel.{h,cpp} - QAbstractListModel wrapper over JobsDatabase for the QML application list and edit dialog.
  • statsmodel.{h,cpp} - summary counters for the dashboard.
  • sankeymodel.{h,cpp} - turns stage history into laid-out Sankey geometry (node columns/stacking, ribbon SVG path data); QML only draws what this hands back.
  • jobfieldcatalog.{h,cpp} - the static catalog of edit-form fields and categories.
  • jobeditmodel.{h,cpp} - QAbstractListModel-backed edit-form state, built from the field catalog.
  • clicommands.{h,cpp} - the add/list/show/update/stage/ delete/stats/stages subcommands.
  • appcolorscheme.{h,cpp} - QML-facing wrapper around KColorSchemeManager for the Preferences page.
  • qml/ - Kirigami UI: ApplicationsPage (list + search), ApplicationEditPage (add/edit/delete form), DashboardPage (stat cards + pipeline), SankeyDiagram (the renderer), SettingsPage (the Preferences page).