pushcv-ui — a minimalist local web UI for pushcv. Same workspace, same SQLite, zero cloud.
Project description
pushcv-ui
A minimalist local web UI for pushcv
— your job-application pipeline as a clean Kanban board in the browser, with
the same local-first guarantees as the CLI: same folder, same pushcv.db,
bound to 127.0.0.1, no accounts, no telemetry, no CDN assets.
pushcv-cli stays terminal-only by design; this is a separate, optional
frontend for people who want a visual board. Both frontends share one service
layer (pushcv.core), so anything you do here shows up in pushcv status
and vice versa.
What you get
- 📋 The four-column pipeline (Drafting → Applied → Interviewing → Closed)
with the same position numbers
[1],[2], … the CLI uses. - 🔎 Paste a posting URL (LinkedIn, Greenhouse, Lever, SmartRecruiters, or any page with JobPosting metadata) → preview → track.
- 📄 A detail drawer per job: move between statuses, dated notes timeline, full description, posting + apply links, delete.
- ⏱ Follow-up nudges on stale applications, salary estimates when the CLI has filled them in.
- ✍️ A built-in profile editor — view and edit the
profile.mdthe AI tailors resumes from, with a first-run template and ⌘S/Ctrl+S save. - ✨ AI features guided, not hidden — each job shows copyable
pushcv draftcommands, lists the drafts they generate (view them right in the drawer), and nudges you when your profile is still the blank template. A "local AI setup" explainer covers the Lemonade/.envdetails. - 🌗 Light and dark, following your system preference. One self-contained HTML page — no build step, no external fonts or scripts.
Install & run
With uv (recommended — no install at all):
cd ~/job-hunt # the folder where your pushcv.db lives
uvx pushcv-ui
Or install it with pipx:
pipx install pushcv-ui --include-deps
cd ~/job-hunt
pushcv-ui
Why
--include-deps?pushcv-uidepends on the pushcv CLI — installing the UI always brings the CLI along, and the AI features (pushcv draft, salary estimates) run through it. The flag puts thepushcvcommand on your PATH too. Without it, install the CLI separately:pipx install pushcv— the two share data through the workspace folder either way.
The server starts on http://127.0.0.1:7878/ and opens your browser. Options:
pushcv-ui [--dir PATH] [--port N] [--no-browser]
Setting up the AI features
Resume/cover-letter drafting and AI salary synthesis are pushcv CLI
features — the UI guides you to them rather than reimplementing them.
Installing pushcv-ui already brought the CLI along; to use the AI:
- Run a local model. Any OpenAI-compatible inference server works — e.g.
Lemonade — serving a chat
model (the default model id is
Qwen3-8B-GGUF; override withpushcv draft <n> --model <id>). pushcv talks tohttp://localhost:13305/v1by default; point it elsewhere withPUSHCV_AI_BASEin a.envfile in your job-hunt folder. - Fill in your profile — click Profile in the UI header. It's the source of truth the AI tailors from; drafts sign off with the name you put there, and the prompts never invent experience you didn't list.
- Copy the command from the job's drawer (e.g.
pushcv draft 3) and run it in a terminal in the same folder. The generated draft appears in the job's drawer — and indrafts/— when it's done.
Everything stays on your machine: the model is local, and nothing is sent to a remote provider. Full details live in the pushcv README.
Local-first, like the CLI
- Binds to
127.0.0.1only — nothing is reachable from your network — and rejects non-localhostHostheaders (DNS-rebinding protection). - Operates on the directory you start it in (or
--dir); all writes go to the same SQLite file the CLI uses. - The AI features execute in the CLI — the UI hands you the exact command
for the job you're looking at, and the results (drafts, estimates) appear
on the board the moment they exist. Same folder, same
pushcv.db, one source of truth.
Development
git clone https://github.com/notnotparas/pushcv-ui.git && cd pushcv-ui
python3 -m venv .venv && source .venv/bin/activate
pip install -e ".[dev]" # resolves pushcv from PyPI
pushcv-ui --dir /tmp/demo
Hacking on the UI and the CLI/service layer at the same time? Install the
sibling checkout editably first: pip install -e ../pushcv-cli.
Layout:
pushcv-ui/
├── pyproject.toml
├── tests/ # API tests over a throwaway workspace
└── src/pushcv_ui/
├── server.py # FastAPI over pushcv.core.Workspace (localhost only)
└── static/index.html # the whole UI — one hand-written page, zero deps
License
MIT © pushcv contributors
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file pushcv_ui-0.1.0.tar.gz.
File metadata
- Download URL: pushcv_ui-0.1.0.tar.gz
- Upload date:
- Size: 19.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ff362e430dee7aff7a7df1e61decb5895ec81fea8a487880651bc74b273fd9b8
|
|
| MD5 |
cb672fad6d2af87456ff8f2d6338d064
|
|
| BLAKE2b-256 |
c65aaf8cb924d2b3fcd33ad75525fb62235bf5b542fd9db54032959057b6cd98
|
Provenance
The following attestation bundles were made for pushcv_ui-0.1.0.tar.gz:
Publisher:
release.yml on notnotparas/pushcv-ui
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pushcv_ui-0.1.0.tar.gz -
Subject digest:
ff362e430dee7aff7a7df1e61decb5895ec81fea8a487880651bc74b273fd9b8 - Sigstore transparency entry: 2084978363
- Sigstore integration time:
-
Permalink:
notnotparas/pushcv-ui@4bb7ff7d8b582231b8519cde36f4a0e61e961a09 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/notnotparas
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@4bb7ff7d8b582231b8519cde36f4a0e61e961a09 -
Trigger Event:
push
-
Statement type:
File details
Details for the file pushcv_ui-0.1.0-py3-none-any.whl.
File metadata
- Download URL: pushcv_ui-0.1.0-py3-none-any.whl
- Upload date:
- Size: 19.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a5291b6ec3c2ac79ce8a1f3fb293ef6207108ab26edafd42dd6d391d46a622d3
|
|
| MD5 |
6ebe73a86332ef9b53548cac2cbefe04
|
|
| BLAKE2b-256 |
8a2345b16bf9bf3d9002f7df5f20516e46e29d49780bbac35799e85b09b088be
|
Provenance
The following attestation bundles were made for pushcv_ui-0.1.0-py3-none-any.whl:
Publisher:
release.yml on notnotparas/pushcv-ui
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pushcv_ui-0.1.0-py3-none-any.whl -
Subject digest:
a5291b6ec3c2ac79ce8a1f3fb293ef6207108ab26edafd42dd6d391d46a622d3 - Sigstore transparency entry: 2084978378
- Sigstore integration time:
-
Permalink:
notnotparas/pushcv-ui@4bb7ff7d8b582231b8519cde36f4a0e61e961a09 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/notnotparas
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@4bb7ff7d8b582231b8519cde36f4a0e61e961a09 -
Trigger Event:
push
-
Statement type: