This release is a pre-release and may not be stable for production use.
Jobforge
Turn your real work history into a resume and cover letter tailored to one job posting, on your own computer, for free, without the tool ever stating a fact you did not give it.
Status: pre-release. It works end to end, but it is not on PyPI yet.
- Free and local. Nothing runs on a server. Your AI coding agent (Claude Code first; Codex, Gemini CLI and others also work) does the writing, and Jobforge does everything else.
- No invented facts. Every number, employer, tool, and credential in your documents is checked against facts you confirmed. If your agent invents one, Jobforge refuses to write the document.
- Built for applicant tracking systems. It writes
.docxfiles with no tables, columns, or hidden characters, then reads them back to prove what a parser will see.
Source-available under PolyForm Noncommercial 1.0.0: free for personal use and for nonprofits, schools, and public institutions. Not for commercial use.
What you need
- Windows or Linux (macOS is untested).
- Python 3.11 or newer. Check with
python3 --versionon Linux, orpython --versionon Windows. - An AI coding agent that runs in a terminal, such as Claude Code.
Set up (once)
On Linux, install with pipx. Ubuntu, Debian, and others block pip for the
system Python, and pipx is how they want apps like this one installed:
sudo apt install pipx
pipx ensurepath # then open a new terminal
pipx install jobforge # or: git clone, then `pipx install .`
jobforge init ~/jobsearch
On Windows:
pip install jobforge # or: git clone, then `pip install .`
jobforge init ~/jobsearch
That makes a folder with everything Jobforge needs:
jobsearch/
CLAUDE.md, AGENTS.md instructions for your agent (generated)
profile/profile.toml your name and contact details
profile/atoms/ your confirmed facts
profile/pending/ facts your agent drafted, waiting for you
intake/ put your old resume here
jobs/ one folder per job you apply to
- Copy your old resume (and any cover letters) into
intake/. - Open your agent in the
jobsearchfolder and say "set me up". It reads your resume, fills in your profile, and drafts your facts intoprofile/pending/. Where your resume is unclear, it asks. - Run
jobforge confirm. For each drafted fact, you choose keep, drop, or skip. Only facts you keep are ever used.
To remove Jobforge later, pipx uninstall jobforge (Linux) or
pip uninstall jobforge (Windows). Your jobsearch folder stays as it is.
Apply to a job
Tell your agent: "apply to this job: " (or paste the posting). It will:
jobforge prepare --from-url <link>to save the posting,- write a plan for which facts to use and how to word them,
jobforge check <job>until the plan passes,jobforge apply <job>, which writesYour_Name_Resume.docxandYour_Name_Cover_Letter.docxinto the job's folder.
Read both documents, then upload the .docx files yourself. cover_letter.md
is a working copy for review; never send it.
When you have applied: jobforge applied --mark <job> --status applied.
Record later news the same way (screen, interview, offer, rejected,
...). jobforge jobs lists everything; a job with no reply after 30 days shows
as ghosted.
Bring in past applications
Already applied to jobs before Jobforge? Put them in a CSV (your agent can
make one from your tracker) and import them, so jobforge jobs lists them and
prepare warns you before applying to the same posting twice.
company,title,location,url,applied,status,status_date,notes
Prairie Freight Co.,Operations Supervisor,"Springfield, IL",https://example.com/jobs/1,2026-09-02,rejected,2026-09-20,
Cedar Mill Foods,Shift Supervisor,"Decatur, IL",,2026-09-10,applied,,
company, title, and applied are required. Write dates as YYYY-MM-DD. A
status after applied (screen, interview, rejected, ...) needs the date
it happened in status_date; if you do not know it, import the row as
applied and record the rest later with jobforge applied.
jobforge import past.csvshows what each row will become and writes nothing. Check it.jobforge import past.csv --writecreates the job folders. Running it again skips rows already imported.
Imported jobs hold only what happened: no posting text, plan, or documents.
Commands
| Command | Does |
|---|---|
jobforge init <folder> |
Make a workspace (--refresh regenerates the agent files) |
jobforge confirm |
Review drafted facts: keep, drop, or skip |
jobforge inventory |
List your confirmed facts |
jobforge prepare --from-url <url> |
Save a posting (or --from-text <file> with --company and --title) |
jobforge check <job> |
Check a plan without writing documents |
jobforge apply <job> |
Check, then write the resume and cover letter |
jobforge applied --mark <job> --status <stage> |
Record what happened |
jobforge jobs |
List your jobs and their status (search works too) |
jobforge import <file.csv> |
Preview past applications from a CSV; --write imports them |
<job> is the job folder's name or any unique piece of it.
Optional extras
Not needed to use Jobforge. Planned for later releases:
- PDF output (via Tectonic). Upload the
.docxmeanwhile; it is the format applicant tracking systems read most reliably. - A progress page showing applications over time, callback rate, and outcomes.
For maintainers
pip install -e ".[dev]"
python -m pytest # also works uninstalled: pytest finds src/
python -m coverage run -m pytest && python -m coverage report
docs/COMPONENTS.md: what each part is called and where it livesdocs/MVP.md: what the first public release does, and build statusdocs/DECISIONS.md: every scope decision; the governing recorddocs/SOW.md: phases to 1.0docs/MAINTAINING.md: how work is assigned and mergedCONTRIBUTING.md: issues welcome; outside PRs closed until the regression harness exists (D-19)SECURITY.md: how to report a problem that could expose a user's datadocs/VM_CHECKLIST.md: the clean-machine check before every release
Metadata
Release files for jobforge 0.1.0rc2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| jobforge-0.1.0rc2.tar.gz | 129.6 kB | With provenance | Details for jobforge-0.1.0rc2.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| jobforge-0.1.0rc2-py3-none-any.whl | Python 3 | none | any | Details for jobforge-0.1.0rc2-py3-none-any.whl |
Total release size: 207.2 kB
Release files / jobforge-0.1.0rc2.tar.gz
| Download URL | jobforge-0.1.0rc2.tar.gz |
|---|---|
| Size | 129.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
6ffa6bc068fda0cd343dc47daa4dbc26e95340739f0f94c1d77df50382a0f4cb
|
|
BLAKE2b-256 checksum How to use checksums |
e3fd8545a2f17c1443f1ab5af54ce346c9ba1f5727f1129eb7307e55c2a44fbc
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 7, 2026.
Transparency logRelease files / jobforge-0.1.0rc2-py3-none-any.whl
| Download URL | jobforge-0.1.0rc2-py3-none-any.whl |
|---|---|
| Size | 77.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
43c6cd1bf161679a67b5f04933b693ace10b634472b9b145aaa8174a13407249
|
|
BLAKE2b-256 checksum How to use checksums |
ffc9212a86b0641f379b53f3f93cc91417fda87e78ee398d4b9e7fb5e448026a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 7, 2026.
Transparency logSecurity for jobforge 0.1.0rc2
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
Both files in this release have been uploaded with provenance metadata.
Attestation for jobforge-0.1.0rc2.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 7, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.