Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
64 commits
Select commit Hold shift + click to select a range
e2d4662
feat: min-salary filter on scan (#36) (#49)
CloneBro Jul 14, 2026
9d2327e
Improve product: upgrade cycle 2026-07-15j samples and tooling
TUPM96 Jul 14, 2026
5949af3
Improve product: upgrade cycle 2026-07-15k samples and tooling
TUPM96 Jul 14, 2026
43d9086
Improve product: upgrade cycle 2026-07-15l samples and tooling
TUPM96 Jul 14, 2026
df433a1
Improve product: upgrade cycle 2026-07-15m samples and tooling
TUPM96 Jul 14, 2026
1ac57e6
Improve product: upgrade cycle 2026-07-15n samples and tooling
TUPM96 Jul 14, 2026
875b053
Improve product: upgrade cycle 2026-07-15o samples and tooling
TUPM96 Jul 15, 2026
4e26ec2
Improve product: upgrade cycle 2026-07-15p samples and tooling
TUPM96 Jul 15, 2026
e207a7a
Improve product: upgrade cycle 2026-07-15q samples and tooling
TUPM96 Jul 15, 2026
d584613
Improve NeraJob: hardware skill aliases (cycle 15r)
TUPM96 Jul 15, 2026
b42cb78
Improve NeraJob: logistics skill aliases (cycle 15s)
TUPM96 Jul 15, 2026
9e6c91a
Improve NeraJob: finance skill aliases (cycle 15t)
TUPM96 Jul 15, 2026
912fcb0
Improve NeraJob: cybersecurity skill aliases (cycle 15u)
TUPM96 Jul 15, 2026
97aceb4
Improve NeraJob: data_engineering skill aliases (cycle 15v)
TUPM96 Jul 15, 2026
45b2cb2
Improve NeraJob: ux_design skill aliases (cycle 15w)
TUPM96 Jul 15, 2026
9559a1c
Improve NeraJob: devops skill aliases (cycle 15x)
TUPM96 Jul 15, 2026
ba4a6e6
Improve NeraJob: mobile_dev skill aliases (cycle 15y)
TUPM96 Jul 15, 2026
0994357
Improve NeraJob: ml_ai skill aliases (cycle 16a)
TUPM96 Jul 15, 2026
de48a3e
Improve NeraJob: cloud_eng skill aliases (cycle 16b)
TUPM96 Jul 15, 2026
c99865d
Improve NeraJob: web3 skill aliases
TUPM96 Jul 15, 2026
96772fc
Improve NeraJob: game_dev skill aliases
TUPM96 Jul 15, 2026
31394f6
Improve NeraJob: qa_test skill aliases
TUPM96 Jul 15, 2026
dd889c2
Improve NeraJob: customer_success skill aliases
TUPM96 Jul 15, 2026
eb5967a
Improve NeraJob: sales_eng skill aliases
TUPM96 Jul 16, 2026
f563b17
docs: add contributor guide for adding new skill domains (#73)
CloneBro Jul 17, 2026
bed5e6a
feat: implement [200 MRG] Feature: multi-CV profiles with selector (#…
CloneBro Jul 17, 2026
b6314b7
Add EdTech skill aliases (#71)
Wang4F Jul 17, 2026
16b6ed3
Docs: add skill alias contributor guide (#70)
Wang4F Jul 17, 2026
4f9978c
test: add offline match precision fixtures (#68)
bingmokaka Jul 17, 2026
9146286
Add configurable match scoring weights (#67)
Rajesh270712 Jul 17, 2026
f7e69e0
Improve NeraJob: security_ops skill aliases
TUPM96 Jul 17, 2026
2df26f9
Expand product design and UX skill aliases (#75)
Wang4F Jul 17, 2026
ba3b526
Fix issue #65: Fixture: remote-only job pack (JSON) for location filt…
CloneBro Jul 17, 2026
d0a5ca7
feat: expand skill aliases for cloud/devops, mobile, and finance (bou…
lwq19850429 Jul 17, 2026
9d1531c
Improve NeraJob: platform_eng keyword pack (cycle 16i)
TUPM96 Jul 17, 2026
46404a2
fix(NeraJob): clean pyproject encoding + version 0.2.58 (cycle 16i)
TUPM96 Jul 17, 2026
0792055
Improve NeraJob: SRE skill aliases + BOM fix (cycle 16j)
TUPM96 Jul 17, 2026
e8f2d16
Improve NeraJob: observability skill aliases (cycle 16k)
TUPM96 Jul 17, 2026
797d2d8
docs: add ML/MLOps skill aliases (#80)
gtmdev-br Jul 17, 2026
f5ee9cf
docs: add data engineering skill aliases (#81)
gtmdev-br Jul 17, 2026
03870d0
feat: add GitHub Jobs public API scraper (#84)
gtmdev-br Jul 17, 2026
1a467a1
test: add cybersecurity skill aliases tests (#82)
gtmdev-br Jul 17, 2026
b3a5a86
Improve NeraJob: product_ops skill aliases (cycle 16l)
TUPM96 Jul 17, 2026
bba96e9
Improve NeraJob: technical_writing skill aliases (cycle 16m)
TUPM96 Jul 18, 2026
004a88c
feat: add nerajob skills extract --text-file for offline skill extrac…
elevasyncsolutions-jpg Jul 18, 2026
0a5c1a7
feat: shared HTTP client with retry/rate-limit/robots [bounty #18] (#91)
elevasyncsolutions-jpg Jul 18, 2026
2e7d00b
feat: fixture packs, ethical scraping docs, offline match CLI [bounti…
elevasyncsolutions-jpg Jul 18, 2026
f6a083e
Improve NeraJob: solutions_arch skill aliases (cycle 16n)
TUPM96 Jul 18, 2026
7da053f
feat: scan preset profile + dedupe count report [bounties #41 #19] (#90)
elevasyncsolutions-jpg Jul 18, 2026
20ffd3c
Improve NeraJob: people_ops aliases + pytest-asyncio (cycle 16o)
TUPM96 Jul 18, 2026
b0a4023
feat(scrapers): add Findwork.dev adapter with offline fallback (#99)
airdropia Jul 19, 2026
e0d5e97
docs: expand ETHICAL_SCRAPING.md with ToS, APIs, backoff, checklist (…
airdropia Jul 19, 2026
f56a40d
feat: add ethical scraping policy documentation (#53) (#96)
CloneBro Jul 19, 2026
25acabd
feat(aliases): expand cloud, devops, mobile, and finance domains (#77)
jamiedcphillips Jul 19, 2026
7a72401
Improve NeraJob: growth_marketing skill aliases
TUPM96 Jul 19, 2026
58ac425
feat: application tracker status states [bounty #40] (#95)
elevasyncsolutions-jpg Jul 19, 2026
3df26dd
feat: Jooble API multi-region scraper [bounty #15] (#94)
elevasyncsolutions-jpg Jul 19, 2026
33b2730
feat: PDF CV export from Markdown profile [bounty #21] (#93)
elevasyncsolutions-jpg Jul 19, 2026
a5a6cb8
feat: jobs list --sort match [bounty #20] (#92)
elevasyncsolutions-jpg Jul 19, 2026
7097389
Improve NeraJob: customer_success skill aliases
TUPM96 Jul 19, 2026
1cae4eb
Implement: [50 MRG] CLI: nerajob skills extract --text-file offline (…
jamiedcphillips Jul 19, 2026
e191cbb
feat(scrapers): add Reed.co.uk adapter (bounty #9) (#105)
fitzerooqq Jul 19, 2026
5e0665a
[50 MRG] Scraper: Adzuna Jobs API (multi-country) [Fixes #7] (#102)
fitzerooqq Jul 19, 2026
d0c50f2
feat: add Himalayas.app scraper (NeraJob#5)
Jul 20, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ Thumbs.db
data/profile.json
data/jobs.json
data/applications/
data/cv/
data/*.local.json
.env
.env.*
Expand Down
5 changes: 5 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@

# Update for issue #65

# Update for issue #65\n
# Update for issue #65\n
70 changes: 69 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
- [Repository layout](#repository-layout)
- [Data layout](#data-layout)
- [Adding a job site](#adding-a-job-site)
- [Skill aliases](#skill-aliases)
- [Compliance](#compliance)
- [Development](#development)
- [MergeOS bounties](#mergeos-bounties)
Expand Down Expand Up @@ -216,6 +217,7 @@ nerajob-gui
| `nerajob scan --source …` | Scan one scraper |
| `nerajob scan --all` | All registered scrapers |
| `nerajob jobs list` | List cached jobs |
| `nerajob jobs match` | Rank cached jobs with configurable match weights |
| `nerajob cv build --target "…"` | Build Markdown + text CV |
| `nerajob apply prepare --job-id <id>` | Apply package for one job |
| `nerajob gui` / `nerajob-gui` | **Qt desktop app** (needs `.[gui]`) |
Expand All @@ -226,8 +228,13 @@ nerajob scan --source remoteok -q python -n 20
nerajob cv build --target "Backend Engineer"
nerajob apply prepare --job-id <id>
nerajob jobs list
nerajob jobs match --skill-weight 70 --title-weight 20 --location-weight 12
```

Match scoring defaults to a 70-point skills cap, 20-point title/headline cap, and
12-point location/remote cap. Adjust those weights when a search should favor
role wording or location fit over direct skill hits.

---

## Diagrams
Expand Down Expand Up @@ -273,6 +280,7 @@ src/nerajob/
cv/builder.py
apply/assistant.py
docs/SOURCES.md
docs/SKILL_ALIASES.md
docs/screenshots/
docs/diagrams/
```
Expand Down Expand Up @@ -302,18 +310,78 @@ data/

See [docs/BOUNTY.md](docs/BOUNTY.md) for MergeOS scraper bounty acceptance.

## Adding a skill domain

Skill aliases live in `src/nerajob/match.py` as `SKILL_ALIASES` — a `dict[str, set[str]]`. Each key is a canonical skill domain, and its set contains matching keywords used for resume ↔ job matching via `expand_skills()`.

### Pattern

Add a new domain entry in `SKILL_ALIASES`:

```python
"new_domain": {"new_domain", "alias1", "alias2", "alias3"},
```

Then add a test in `tests/test_skill_aliases.py`:

```python
def test_expand_skills_new_domain():
out = expand_skills({"new_domain"})
assert "alias1" in out
assert "alias2" in out
```

Verify with the CLI:

```bash
nerajob skills | grep new_domain
pytest tests/test_skill_aliases.py -q
```

### Existing domains (for reference)

Run `nerajob skills` to list all domains and their aliases.

| Domain key | Covers |
| --- | --- |
| `python` | django, fastapi, flask |
| `javascript` | js, typescript, node, react |
| `devops` | docker, kubernetes, k8s, ci/cd |
| `ml_ai` | machine learning, deep learning, nlp, pytorch, tensorflow |
| `data_engineering` | etl, spark, airflow, dbt, warehouse |
| `cybersecurity` | soc, siem, iam, infosec |
| `education` | teaching, curriculum, edtech, tutor |
| *(full list via `nerajob skills`)* | |

Add new domains that don't overlap with existing keys. Each domain set should be self-contained — aliases only expand inward, not across domains.

---

## Skill aliases

NeraJob expands profile skills with `SKILL_ALIASES` in `src/nerajob/match.py`
before scoring jobs. When adding a new skill domain, keep the alias set focused
and add tests that exercise `expand_skills()`.

Contributor guide: **[docs/SKILL_ALIASES.md](docs/SKILL_ALIASES.md)**.

---

## Compliance

NeraJob is built for **ethical, ToS-aware** job discovery:
See [SCRAPING_POLICY.md](docs/SCRAPING_POLICY.md) for ethical scraping guidelines and rate limit policies.

## MergeOS bounties

See [docs/BOUNTY.md](docs/BOUNTY.md) for bounty details.
- Prefer **official / public APIs** over brittle HTML scrapers
- Respect **robots.txt**, published rate limits, and site **Terms of Service**
- **Never** commit secrets, long-lived tokens, or production `.env` values
- Degrade gracefully on network failure (`[]` + optional sample fallback)
- CI uses mocks — live smoke is optional and manual

**Full policy:** [docs/ETHICAL_SCRAPING.md](docs/ETHICAL_SCRAPING.md) — covers principles, preferred official APIs, source-specific ToS notes, rate limit configuration, exponential backoff strategy, User-Agent standard, and a compliance checklist for new scrapers.

Details: [docs/SOURCES.md § Compliance](docs/SOURCES.md#compliance).

---
Expand Down
3 changes: 3 additions & 0 deletions STUB.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# Stub for issue #42
Title: [200 MRG] Feature: multi-CV profiles with selector
This is a placeholder implementation.
23 changes: 23 additions & 0 deletions data/cv/cv-software-engineer.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# Your Name
**Software Engineer**
Remote · you@example.com

https://github.com/your-handle · https://linkedin.com/in/your-handle

## Summary
Results-driven engineer building reliable products.

## Skills
Python, APIs, SQL

## Experience
### Software Engineer — Example Co
*2022 – Present*
- Built APIs and automation used by product teams
- Improved reliability and delivery speed

## Education
- B.S. Computer Science · University · 2021

## Languages
English
23 changes: 23 additions & 0 deletions data/cv/cv-software-engineer.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
Your Name
Software Engineer
Remote · you@example.com

https://github.com/your-handle · https://linkedin.com/in/your-handle

#Summary
Results-driven engineer building reliable products.

#Skills
Python, APIs, SQL

#Experience
##Software Engineer — Example Co
2022 – Present
- Built APIs and automation used by product teams
- Improved reliability and delivery speed

#Education
- B.S. Computer Science · University · 2021

#Languages
English
122 changes: 122 additions & 0 deletions data/samples/jobs_devops_remote.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,122 @@
[
{
"id": "devops_01",
"title": "Senior DevOps Engineer",
"company": "CloudScale",
"location": "Remote",
"salary": "$110k-$150k",
"tags": [
"kubernetes",
"terraform",
"aws",
"ci/cd"
],
"posted": "2026-07-15",
"source": "fixture"
},
{
"id": "devops_02",
"title": "Platform Engineer",
"company": "InfraCo",
"location": "Remote",
"salary": "$100k-$140k",
"tags": [
"kubernetes",
"docker",
"helm",
"istio"
],
"posted": "2026-07-14",
"source": "fixture"
},
{
"id": "devops_03",
"title": "Site Reliability Engineer",
"company": "ReliableOps",
"location": "Remote",
"salary": "$120k-$160k",
"tags": [
"sre",
"prometheus",
"grafana",
"terraform"
],
"posted": "2026-07-13",
"source": "fixture"
},
{
"id": "devops_04",
"title": "Cloud Infrastructure Engineer",
"company": "AWSFirst",
"location": "Remote",
"salary": "$95k-$135k",
"tags": [
"aws",
"terraform",
"ansible",
"python"
],
"posted": "2026-07-12",
"source": "fixture"
},
{
"id": "devops_05",
"title": "CI/CD Engineer",
"company": "PipelinePro",
"location": "Remote",
"salary": "$85k-$125k",
"tags": [
"jenkins",
"github actions",
"gitlab ci",
"docker"
],
"posted": "2026-07-11",
"source": "fixture"
},
{
"id": "devops_06",
"title": "Security DevOps Engineer",
"company": "SecurePipe",
"location": "Remote",
"salary": "$115k-$155k",
"tags": [
"devsecops",
"vault",
"terraform",
"kubernetes"
],
"posted": "2026-07-10",
"source": "fixture"
},
{
"id": "devops_07",
"title": "Infrastructure as Code Engineer",
"company": "IaCFirst",
"location": "Remote",
"salary": "$90k-$130k",
"tags": [
"terraform",
"pulumi",
"cloudformation",
"ansible"
],
"posted": "2026-07-09",
"source": "fixture"
},
{
"id": "devops_08",
"title": "Observability Engineer",
"company": "DataDogInc",
"location": "Remote",
"salary": "$105k-$145k",
"tags": [
"prometheus",
"grafana",
"datadog",
"opentelemetry"
],
"posted": "2026-07-08",
"source": "fixture"
}
]
Loading