openapply 0.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. openapply-0.1.0/PKG-INFO +267 -0
  2. openapply-0.1.0/README.md +237 -0
  3. openapply-0.1.0/agent/__init__.py +26 -0
  4. openapply-0.1.0/agent/batch.py +221 -0
  5. openapply-0.1.0/agent/cv_builder.py +632 -0
  6. openapply-0.1.0/agent/evaluator.py +430 -0
  7. openapply-0.1.0/agent/ollama_client.py +304 -0
  8. openapply-0.1.0/agent/portals_config.py +98 -0
  9. openapply-0.1.0/agent/prompts/apply_form.md +46 -0
  10. openapply-0.1.0/agent/prompts/compare_offers.md +23 -0
  11. openapply-0.1.0/agent/prompts/cover_letter.md +40 -0
  12. openapply-0.1.0/agent/prompts/deep_research.md +39 -0
  13. openapply-0.1.0/agent/prompts/evaluate.md +105 -0
  14. openapply-0.1.0/agent/prompts/outreach.md +35 -0
  15. openapply-0.1.0/agent/prompts/scan_query.md +38 -0
  16. openapply-0.1.0/agent/prompts/tailor_cv.md +50 -0
  17. openapply-0.1.0/agent/scan_history.py +88 -0
  18. openapply-0.1.0/agent/scanner.py +335 -0
  19. openapply-0.1.0/agent/scraper.py +415 -0
  20. openapply-0.1.0/agent/templates/cv.html +266 -0
  21. openapply-0.1.0/agent/url_utils.py +20 -0
  22. openapply-0.1.0/cli/__init__.py +1 -0
  23. openapply-0.1.0/cli/assets/config.example.yml +54 -0
  24. openapply-0.1.0/cli/assets/portals.example.yml +60 -0
  25. openapply-0.1.0/cli/commands/__init__.py +1 -0
  26. openapply-0.1.0/cli/commands/apply.py +116 -0
  27. openapply-0.1.0/cli/commands/batch.py +155 -0
  28. openapply-0.1.0/cli/commands/compare.py +130 -0
  29. openapply-0.1.0/cli/commands/doctor.py +118 -0
  30. openapply-0.1.0/cli/commands/learn.py +242 -0
  31. openapply-0.1.0/cli/commands/outreach.py +105 -0
  32. openapply-0.1.0/cli/commands/pipeline.py +27 -0
  33. openapply-0.1.0/cli/commands/portal.py +239 -0
  34. openapply-0.1.0/cli/commands/research.py +117 -0
  35. openapply-0.1.0/cli/commands/scan.py +163 -0
  36. openapply-0.1.0/cli/commands/setup.py +287 -0
  37. openapply-0.1.0/cli/commands/tracker.py +60 -0
  38. openapply-0.1.0/cli/commands/update.py +35 -0
  39. openapply-0.1.0/cli/flows/offer_pipeline.py +335 -0
  40. openapply-0.1.0/cli/main.py +214 -0
  41. openapply-0.1.0/cli/pipeline_queue.py +109 -0
  42. openapply-0.1.0/cli/tracker_store.py +105 -0
  43. openapply-0.1.0/cli/tui/tracker_app.py +305 -0
  44. openapply-0.1.0/cli/ui.py +205 -0
  45. openapply-0.1.0/memory/db.py +241 -0
  46. openapply-0.1.0/openapply.egg-info/PKG-INFO +267 -0
  47. openapply-0.1.0/openapply.egg-info/SOURCES.txt +54 -0
  48. openapply-0.1.0/openapply.egg-info/dependency_links.txt +1 -0
  49. openapply-0.1.0/openapply.egg-info/entry_points.txt +2 -0
  50. openapply-0.1.0/openapply.egg-info/requires.txt +12 -0
  51. openapply-0.1.0/openapply.egg-info/top_level.txt +3 -0
  52. openapply-0.1.0/pyproject.toml +55 -0
  53. openapply-0.1.0/setup.cfg +4 -0
  54. openapply-0.1.0/tests/test_pipeline_queue.py +27 -0
  55. openapply-0.1.0/tests/test_scan_history.py +16 -0
  56. openapply-0.1.0/tests/test_url_utils.py +13 -0
@@ -0,0 +1,267 @@
1
+ Metadata-Version: 2.4
2
+ Name: openapply
3
+ Version: 0.1.0
4
+ Summary: Open-source autonomous job search agent. Runs locally.
5
+ License-Expression: MIT
6
+ Keywords: job-search,cli,ollama,local-first,career,resume,ats
7
+ Classifier: Development Status :: 4 - Beta
8
+ Classifier: Environment :: Console
9
+ Classifier: Intended Audience :: End Users/Desktop
10
+ Classifier: Operating System :: OS Independent
11
+ Classifier: Programming Language :: Python :: 3
12
+ Classifier: Programming Language :: Python :: 3.11
13
+ Classifier: Programming Language :: Python :: 3.12
14
+ Classifier: Programming Language :: Python :: 3.13
15
+ Classifier: Topic :: Office/Business
16
+ Requires-Python: >=3.11
17
+ Description-Content-Type: text/markdown
18
+ Requires-Dist: typer>=0.12
19
+ Requires-Dist: rich>=13
20
+ Requires-Dist: textual>=0.80
21
+ Requires-Dist: ollama>=0.3
22
+ Requires-Dist: playwright>=1.44
23
+ Requires-Dist: sqlalchemy>=2.0
24
+ Requires-Dist: alembic>=1.13
25
+ Requires-Dist: pyyaml>=6
26
+ Requires-Dist: jinja2>=3.1
27
+ Requires-Dist: httpx>=0.27
28
+ Requires-Dist: python-slugify
29
+ Requires-Dist: python-dateutil
30
+
31
+ # Open Apply
32
+
33
+ > Autonomous job search agent. Runs 100% locally. Your CV never leaves your machine.
34
+
35
+ Open Apply is an open-source, privacy-first, terminal-first job application assistant.
36
+ It helps you discover roles, score fit, tailor ATS-safe CVs, and draft applications with Human In The Loop controls.
37
+
38
+ ## Why
39
+
40
+ career-ops showed the world this is possible.
41
+ Open Apply makes it accessible to everyone:
42
+
43
+ - No paid cloud AI subscription requirement
44
+ - No cloud API key requirement
45
+ - No vendor lock-in
46
+ - Full local control over data and models
47
+
48
+ ## What It Does
49
+
50
+ Open Apply is designed as an end-to-end local pipeline:
51
+
52
+ 1. Job discovery across configured portals
53
+ - scans active portals and discovers new listings
54
+ - deduplicates against existing DB records and scan history
55
+
56
+ 2. 10-dimension fit evaluation
57
+ - scores each role from 1.0 to 5.0 across role, skills, seniority, compensation, geo, stage, PMF, growth, interview likelihood, and timeline
58
+ - computes weighted score + grade (A/B/C/D/F)
59
+ - writes a markdown report to reports/
60
+
61
+ 3. Tailored ATS CV generation
62
+ - extracts high-value JD keywords
63
+ - reorders bullets by relevance (without deleting user content)
64
+ - renders ATS-safe HTML to PDF via Playwright
65
+ - saves artifacts to output/ and metadata to DB
66
+
67
+ 4. Human-reviewed application drafting
68
+ - opens and drafts common form fields
69
+ - never auto-submits
70
+ - requires explicit human review before marking as applied
71
+
72
+ 5. Parallel batch processing
73
+ - processes queued URLs concurrently
74
+ - fault tolerant: one failure does not block the queue
75
+ - resumable behavior for previously processed jobs
76
+
77
+ 6. Outcome learning loop
78
+ - logs interview/rejection/offer/ghosted outcomes
79
+ - adjusts scoring weights in DB based on feedback patterns
80
+
81
+ ## Quick Start
82
+
83
+ ```bash
84
+ pip install openapply
85
+ openapply setup
86
+ ```
87
+
88
+ Then:
89
+
90
+ ```bash
91
+ openapply scan
92
+ ```
93
+
94
+ ### Required: enable at least 1 portal
95
+ `scan` requires at least one active portal in `portals.yml` (setup creates it for you, but everything is disabled by default).
96
+
97
+ 1) Open `portals.yml`
98
+ 2) Set at least one entry to `active: true`
99
+ 3) Run:
100
+
101
+ ```bash
102
+ openapply doctor
103
+ openapply scan --limit 5 --link-limit 30
104
+ ```
105
+ ## How To Test (Recommended)
106
+
107
+ ### 1) Developer install (this repo)
108
+
109
+ ```bash
110
+ python -m venv .venv
111
+ .venv\Scripts\activate
112
+ pip install -e .
113
+ python -m playwright install chromium
114
+ ```
115
+
116
+ Run quick health checks:
117
+
118
+ ```bash
119
+ openapply doctor
120
+ ```
121
+
122
+ Run unit tests:
123
+
124
+ ```bash
125
+ python -m unittest discover -s tests -v
126
+ ```
127
+
128
+ ### 2) User install (PyPI / TestPyPI)
129
+
130
+ Once you publish (see “Publish To PyPI” below), verify in a clean environment:
131
+
132
+ ```bash
133
+ python -m venv .venv
134
+ .venv\Scripts\activate
135
+ pip install openapply
136
+ openapply setup
137
+ openapply doctor
138
+ ```
139
+
140
+ ### 3) End-to-end CLI smoke test
141
+
142
+ - Ensure `portals.yml` exists (setup creates it) and set at least one portal to `active: true`.
143
+ - Scan:
144
+
145
+ ```bash
146
+ openapply scan --limit 5 --link-limit 30
147
+ ```
148
+
149
+ - Run auto-pipeline for a known job URL:
150
+
151
+ ```bash
152
+ openapply pipeline <job-url>
153
+ ```
154
+
155
+ - Open tracker TUI:
156
+
157
+ ```bash
158
+ openapply tracker
159
+ ```
160
+
161
+ ## Philosophy
162
+
163
+ AI analyzes. You decide. HITL always.
164
+
165
+ Open Apply intentionally avoids full autonomy on final submission actions.
166
+ The system can evaluate, draft, and prefill, but a human must review before applying.
167
+
168
+ ## Core Commands
169
+
170
+ ```bash
171
+ openapply setup
172
+ openapply doctor
173
+ openapply scan
174
+ openapply scan --auto
175
+ openapply batch --min-score B --limit 20
176
+ openapply pipeline <url-or-jd-text>
177
+ openapply apply <url-or-jd-text>
178
+ openapply tracker
179
+ openapply learn <job-id> <outcome>
180
+ ```
181
+
182
+ ## Models
183
+
184
+ Open Apply uses local Ollama models. A practical starting setup:
185
+
186
+ - `llama3.1:8b` for evaluation
187
+ - Pros: fast, low hardware footprint, good for scoring and routing
188
+ - Tradeoff: less nuanced generation quality for long-form text
189
+
190
+ - `qwen2.5:14b` for generation
191
+ - Pros: stronger CV/cover-letter drafting quality
192
+ - Tradeoff: slower and heavier resource usage
193
+
194
+ General guidance:
195
+
196
+ - Use smaller models for high-volume scan/eval loops.
197
+ - Use larger models for final artifact generation quality.
198
+ - Keep all inference local through Ollama.
199
+
200
+ ## Local-First Privacy
201
+
202
+ - CV, config, reports, and generated files are stored locally.
203
+ - SQLite DB runs locally (`data/openapply.db`).
204
+ - Prompt and model execution are local-first by design.
205
+
206
+ ## Project Status
207
+
208
+ Open Apply is in active development (`0.1.0`) and currently optimized for terminal workflows.
209
+ Web UI support is planned as secondary priority.
210
+
211
+ ## Documentation
212
+
213
+ - docs/ARCHITECTURE.md
214
+ - docs/SETUP.md
215
+ - docs/PUBLISH.md (maintainers: publish to PyPI)
216
+
217
+ ## Publish To PyPI
218
+
219
+ Use this flow to publish releases so users can run:
220
+
221
+ ```bash
222
+ pip install openapply
223
+ openapply setup
224
+ ```
225
+
226
+ Build and validate:
227
+
228
+ ```bash
229
+ python -m pip install --upgrade build twine
230
+ python -m build
231
+ python -m twine check dist/*
232
+ ```
233
+
234
+ Upload to TestPyPI first:
235
+
236
+ ```bash
237
+ python -m twine upload --repository testpypi dist/*
238
+ ```
239
+
240
+ Test install from TestPyPI in a clean environment:
241
+
242
+ ```bash
243
+ python -m pip install --index-url https://test.pypi.org/simple/ --extra-index-url https://pypi.org/simple openapply
244
+ ```
245
+
246
+ Upload to PyPI:
247
+
248
+ ```bash
249
+ python -m twine upload dist/*
250
+ ```
251
+
252
+ PowerShell helper:
253
+
254
+ ```powershell
255
+ ./scripts/publish.ps1
256
+ ./scripts/publish.ps1 -TestPyPI
257
+ ./scripts/publish.ps1 -PyPI
258
+ ```
259
+
260
+ ## Inspiration
261
+
262
+ Inspired by the ideas popularized in career-ops (MIT), including structured fit scoring, CV templating workflow, and portal scanning patterns.
263
+ Open Apply is implemented from scratch as a standalone Python product.
264
+
265
+ ## License
266
+
267
+ MIT
@@ -0,0 +1,237 @@
1
+ # Open Apply
2
+
3
+ > Autonomous job search agent. Runs 100% locally. Your CV never leaves your machine.
4
+
5
+ Open Apply is an open-source, privacy-first, terminal-first job application assistant.
6
+ It helps you discover roles, score fit, tailor ATS-safe CVs, and draft applications with Human In The Loop controls.
7
+
8
+ ## Why
9
+
10
+ career-ops showed the world this is possible.
11
+ Open Apply makes it accessible to everyone:
12
+
13
+ - No paid cloud AI subscription requirement
14
+ - No cloud API key requirement
15
+ - No vendor lock-in
16
+ - Full local control over data and models
17
+
18
+ ## What It Does
19
+
20
+ Open Apply is designed as an end-to-end local pipeline:
21
+
22
+ 1. Job discovery across configured portals
23
+ - scans active portals and discovers new listings
24
+ - deduplicates against existing DB records and scan history
25
+
26
+ 2. 10-dimension fit evaluation
27
+ - scores each role from 1.0 to 5.0 across role, skills, seniority, compensation, geo, stage, PMF, growth, interview likelihood, and timeline
28
+ - computes weighted score + grade (A/B/C/D/F)
29
+ - writes a markdown report to reports/
30
+
31
+ 3. Tailored ATS CV generation
32
+ - extracts high-value JD keywords
33
+ - reorders bullets by relevance (without deleting user content)
34
+ - renders ATS-safe HTML to PDF via Playwright
35
+ - saves artifacts to output/ and metadata to DB
36
+
37
+ 4. Human-reviewed application drafting
38
+ - opens and drafts common form fields
39
+ - never auto-submits
40
+ - requires explicit human review before marking as applied
41
+
42
+ 5. Parallel batch processing
43
+ - processes queued URLs concurrently
44
+ - fault tolerant: one failure does not block the queue
45
+ - resumable behavior for previously processed jobs
46
+
47
+ 6. Outcome learning loop
48
+ - logs interview/rejection/offer/ghosted outcomes
49
+ - adjusts scoring weights in DB based on feedback patterns
50
+
51
+ ## Quick Start
52
+
53
+ ```bash
54
+ pip install openapply
55
+ openapply setup
56
+ ```
57
+
58
+ Then:
59
+
60
+ ```bash
61
+ openapply scan
62
+ ```
63
+
64
+ ### Required: enable at least 1 portal
65
+ `scan` requires at least one active portal in `portals.yml` (setup creates it for you, but everything is disabled by default).
66
+
67
+ 1) Open `portals.yml`
68
+ 2) Set at least one entry to `active: true`
69
+ 3) Run:
70
+
71
+ ```bash
72
+ openapply doctor
73
+ openapply scan --limit 5 --link-limit 30
74
+ ```
75
+ ## How To Test (Recommended)
76
+
77
+ ### 1) Developer install (this repo)
78
+
79
+ ```bash
80
+ python -m venv .venv
81
+ .venv\Scripts\activate
82
+ pip install -e .
83
+ python -m playwright install chromium
84
+ ```
85
+
86
+ Run quick health checks:
87
+
88
+ ```bash
89
+ openapply doctor
90
+ ```
91
+
92
+ Run unit tests:
93
+
94
+ ```bash
95
+ python -m unittest discover -s tests -v
96
+ ```
97
+
98
+ ### 2) User install (PyPI / TestPyPI)
99
+
100
+ Once you publish (see “Publish To PyPI” below), verify in a clean environment:
101
+
102
+ ```bash
103
+ python -m venv .venv
104
+ .venv\Scripts\activate
105
+ pip install openapply
106
+ openapply setup
107
+ openapply doctor
108
+ ```
109
+
110
+ ### 3) End-to-end CLI smoke test
111
+
112
+ - Ensure `portals.yml` exists (setup creates it) and set at least one portal to `active: true`.
113
+ - Scan:
114
+
115
+ ```bash
116
+ openapply scan --limit 5 --link-limit 30
117
+ ```
118
+
119
+ - Run auto-pipeline for a known job URL:
120
+
121
+ ```bash
122
+ openapply pipeline <job-url>
123
+ ```
124
+
125
+ - Open tracker TUI:
126
+
127
+ ```bash
128
+ openapply tracker
129
+ ```
130
+
131
+ ## Philosophy
132
+
133
+ AI analyzes. You decide. HITL always.
134
+
135
+ Open Apply intentionally avoids full autonomy on final submission actions.
136
+ The system can evaluate, draft, and prefill, but a human must review before applying.
137
+
138
+ ## Core Commands
139
+
140
+ ```bash
141
+ openapply setup
142
+ openapply doctor
143
+ openapply scan
144
+ openapply scan --auto
145
+ openapply batch --min-score B --limit 20
146
+ openapply pipeline <url-or-jd-text>
147
+ openapply apply <url-or-jd-text>
148
+ openapply tracker
149
+ openapply learn <job-id> <outcome>
150
+ ```
151
+
152
+ ## Models
153
+
154
+ Open Apply uses local Ollama models. A practical starting setup:
155
+
156
+ - `llama3.1:8b` for evaluation
157
+ - Pros: fast, low hardware footprint, good for scoring and routing
158
+ - Tradeoff: less nuanced generation quality for long-form text
159
+
160
+ - `qwen2.5:14b` for generation
161
+ - Pros: stronger CV/cover-letter drafting quality
162
+ - Tradeoff: slower and heavier resource usage
163
+
164
+ General guidance:
165
+
166
+ - Use smaller models for high-volume scan/eval loops.
167
+ - Use larger models for final artifact generation quality.
168
+ - Keep all inference local through Ollama.
169
+
170
+ ## Local-First Privacy
171
+
172
+ - CV, config, reports, and generated files are stored locally.
173
+ - SQLite DB runs locally (`data/openapply.db`).
174
+ - Prompt and model execution are local-first by design.
175
+
176
+ ## Project Status
177
+
178
+ Open Apply is in active development (`0.1.0`) and currently optimized for terminal workflows.
179
+ Web UI support is planned as secondary priority.
180
+
181
+ ## Documentation
182
+
183
+ - docs/ARCHITECTURE.md
184
+ - docs/SETUP.md
185
+ - docs/PUBLISH.md (maintainers: publish to PyPI)
186
+
187
+ ## Publish To PyPI
188
+
189
+ Use this flow to publish releases so users can run:
190
+
191
+ ```bash
192
+ pip install openapply
193
+ openapply setup
194
+ ```
195
+
196
+ Build and validate:
197
+
198
+ ```bash
199
+ python -m pip install --upgrade build twine
200
+ python -m build
201
+ python -m twine check dist/*
202
+ ```
203
+
204
+ Upload to TestPyPI first:
205
+
206
+ ```bash
207
+ python -m twine upload --repository testpypi dist/*
208
+ ```
209
+
210
+ Test install from TestPyPI in a clean environment:
211
+
212
+ ```bash
213
+ python -m pip install --index-url https://test.pypi.org/simple/ --extra-index-url https://pypi.org/simple openapply
214
+ ```
215
+
216
+ Upload to PyPI:
217
+
218
+ ```bash
219
+ python -m twine upload dist/*
220
+ ```
221
+
222
+ PowerShell helper:
223
+
224
+ ```powershell
225
+ ./scripts/publish.ps1
226
+ ./scripts/publish.ps1 -TestPyPI
227
+ ./scripts/publish.ps1 -PyPI
228
+ ```
229
+
230
+ ## Inspiration
231
+
232
+ Inspired by the ideas popularized in career-ops (MIT), including structured fit scoring, CV templating workflow, and portal scanning patterns.
233
+ Open Apply is implemented from scratch as a standalone Python product.
234
+
235
+ ## License
236
+
237
+ MIT
@@ -0,0 +1,26 @@
1
+ """Open Apply agent layer."""
2
+
3
+ from .batch import BatchProcessor, BatchRunResult, BatchTaskResult
4
+ from .cv_builder import CVBuildResult, CVBuilder, CVBuilderError
5
+ from .evaluator import EvaluationResult, JobEvaluator
6
+ from .ollama_client import OllamaClient, OllamaClientError
7
+ from .scanner import DiscoveredJob, JobScanner, ScanResult
8
+ from .scraper import JobScraper, ScraperError
9
+
10
+ __all__ = [
11
+ "OllamaClient",
12
+ "OllamaClientError",
13
+ "BatchProcessor",
14
+ "BatchRunResult",
15
+ "BatchTaskResult",
16
+ "JobScanner",
17
+ "ScanResult",
18
+ "DiscoveredJob",
19
+ "CVBuilder",
20
+ "CVBuildResult",
21
+ "CVBuilderError",
22
+ "EvaluationResult",
23
+ "JobEvaluator",
24
+ "JobScraper",
25
+ "ScraperError",
26
+ ]