Terminal UI for CV management — powered by Textual and cv-api
Project description
cv-tui-py
Terminal UI for CV management, powered by Python and Textual. Connects to the cv-api HTTP/WebSocket backend to manage job applications, generate tailored CV documents, and run health audits — all from the terminal.
Features
- Dashboard — Pipeline funnel bar chart and recent applications at a glance
- Applications — Searchable DataTable of all applications with async health scores
- Kanban — Drag-free board with five columns for application status (applied, interview, offer, rejected, ghosted)
- Actions — Browse Make targets grouped by category, fill arguments, execute with streaming WebSocket output and AI provider detection
- Stats — Funnel chart showing pipeline conversion and weekly activity timeline
- Audit — CV health metrics and score reporting
- Create applications — Quick dialog to add new applications directly from the TUI
- Catppuccin Mocha theme — Consistent, readable color scheme throughout
- Async streaming — All long-running operations stream real-time output without blocking the UI
Requirements
- Python 3.12 or later
- Running instance of cv-api
- Terminal with 256-color support
Installation
Install via pip:
pip install cv-tui
Or via uv:
uv add cv-tui
Configuration
Create ~/.config/cv/config.toml:
[api]
base_url = "http://localhost:3001"
api_key = "your-api-key-here"
timeout = 30.0
On Windows, use %APPDATA%\cv\config.toml instead.
The configuration is shared across cv-tui-py, cv-tui-go, and cv-tui-rs.
Usage
Launch the TUI
cv-tui
Or specify a custom config file:
cv-tui --config /path/to/config.toml
Health Check
Check if cv-api is reachable:
cv-tui health
Exits with code 0 if connected, 1 if unreachable. Useful for CI/CD and monitoring.
Debug Mode
Enable DEBUG logging:
cv-tui -v
Screens
Dashboard (Tab 1)
Shows total application count, a funnel bar chart of the pipeline (applied → interview → offer → accepted), and a list of the 10 most recent applications. Quick overview of your recruitment activity.
Applications (Tab 2)
Searchable DataTable displaying all applications. Columns include date created, company, position, status, outcome, and health score. Press Enter to open the detail view. Use / to focus the search input and filter by company, position, status, or application name. Health scores are fetched asynchronously in the background via the audit action.
Kanban (Tab 3)
Card-based board with five columns representing application status: applied, interview, offer, rejected, and ghosted. Cards are populated in real time from cv-api. Provides a visual overview of where applications stand in the pipeline.
Actions (Tab 4)
Targets loaded from cv-api are listed and grouped by category (build, deploy, tailor, review, etc.). Select a target to view its arguments. Fill in the application name (often available via dropdown) and any other required parameters. Press Run to execute the target. Output streams via WebSocket, with automatic AI provider detection (Gemini, Claude, OpenAI, Mistral, Ollama) displayed as a badge.
Stats (Tab 5)
Displays a funnel chart with conversion percentages at each stage (applied → interview → offer) and a weekly activity timeline showing the number of applications per week. Helps track recruitment trends over time.
Audit (Tab 6)
Select an application and run the health audit action. Returns a composite health score (0–100) and individual metrics (structure, content, formatting, etc.). Displays structured results with progress bars, duplicated phrases, and overused words detected in the CV.
Keybindings
| Key | Action |
|---|---|
| 1–6 | Switch to tab 1–6 |
| [ / ] | Previous / next tab |
| Ctrl+H / Ctrl+L | Previous / next tab |
| n | New application dialog |
| Ctrl+R | Refresh all screens |
| r | Refresh current screen |
| j / k | Cursor down / up |
| g / G | Jump to first / last row (Applications) |
| Enter | Open detail view (Applications) |
| / | Focus search (Applications) |
| q | Quit |
Development
Clone the repository and set up the development environment:
git clone https://github.com/jsoyer/cv-tui-py
cd cv-tui-py
uv sync
Run tests:
uv run pytest
Run linting:
uv run ruff check src/
Run type checking:
uv run mypy src/ --strict
License
MIT
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 cv_tui-1.0.0.tar.gz.
File metadata
- Download URL: cv_tui-1.0.0.tar.gz
- Upload date:
- Size: 44.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
cc260047677e42c42b40da9a1b5179314b48909e028723506a828b5df7f5e4d5
|
|
| MD5 |
7f27c67e7c4435f77f09a33e3dbda287
|
|
| BLAKE2b-256 |
92fcc8357e354f2c69d5135acece5325276655ee9e0dcbf1fd227593399cf7fc
|
Provenance
The following attestation bundles were made for cv_tui-1.0.0.tar.gz:
Publisher:
release.yml on jsoyer/cv-tui-py
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
cv_tui-1.0.0.tar.gz -
Subject digest:
cc260047677e42c42b40da9a1b5179314b48909e028723506a828b5df7f5e4d5 - Sigstore transparency entry: 1076871724
- Sigstore integration time:
-
Permalink:
jsoyer/cv-tui-py@d0ffe34a3dbcca48dd1237c00c6d9bd2681ff358 -
Branch / Tag:
refs/tags/v1.0.0 - Owner: https://github.com/jsoyer
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@d0ffe34a3dbcca48dd1237c00c6d9bd2681ff358 -
Trigger Event:
push
-
Statement type:
File details
Details for the file cv_tui-1.0.0-py3-none-any.whl.
File metadata
- Download URL: cv_tui-1.0.0-py3-none-any.whl
- Upload date:
- Size: 36.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f476d300d146d9f22618716759424fcd51de40c1426a0415a08245eab6f9c6d3
|
|
| MD5 |
dbc08e9bab2fd205b6aab3cba802aafd
|
|
| BLAKE2b-256 |
ee37895702192ba18533961ed20f020b7cf1b57b106affb71e19ca2c6d8f4f14
|
Provenance
The following attestation bundles were made for cv_tui-1.0.0-py3-none-any.whl:
Publisher:
release.yml on jsoyer/cv-tui-py
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
cv_tui-1.0.0-py3-none-any.whl -
Subject digest:
f476d300d146d9f22618716759424fcd51de40c1426a0415a08245eab6f9c6d3 - Sigstore transparency entry: 1076871746
- Sigstore integration time:
-
Permalink:
jsoyer/cv-tui-py@d0ffe34a3dbcca48dd1237c00c6d9bd2681ff358 -
Branch / Tag:
refs/tags/v1.0.0 - Owner: https://github.com/jsoyer
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@d0ffe34a3dbcca48dd1237c00c6d9bd2681ff358 -
Trigger Event:
push
-
Statement type: