Publish curated VacatureRadar source from 38736f0f41ecf0f1e3f31fff6db4005b24ff79ed
No files matched your search
@@ -1,3 +1,3 @@
|
|||||||
# Public source export
|
# Public source export
|
||||||
|
|
||||||
This source snapshot was generated from the private canonical repository at revision `8ee115406c33b4e3f11e9513a6a1c85c00706ebe`. It contains no private Git history or operational evidence. Changes are published from the canonical repository.
|
Generated from the private canonical repository at revision `38736f0f41ecf0f1e3f31fff6db4005b24ff79ed`. This snapshot excludes private Git history and operational evidence. Changes are published from the canonical repository.
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"schemaVersion": 1,
|
"schemaVersion": 1,
|
||||||
"sourceRevision": "8ee115406c33b4e3f11e9513a6a1c85c00706ebe",
|
"sourceRevision": "38736f0f41ecf0f1e3f31fff6db4005b24ff79ed",
|
||||||
"files": [
|
"files": [
|
||||||
{
|
{
|
||||||
"path": ".dockerignore",
|
"path": ".dockerignore",
|
||||||
@@ -59,8 +59,8 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"path": "README.md",
|
"path": "README.md",
|
||||||
"sha256": "1c001f617ab718459c08e135827c87d595c84a14486b30fad5d769df03aa2fb0",
|
"sha256": "4bbba41d2b667f41c5a725b07189dcfa9a42f1bfc94559242321f7e7d9b2d6fe",
|
||||||
"bytes": 639
|
"bytes": 4769
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"path": "SECURITY.md",
|
"path": "SECURITY.md",
|
||||||
@@ -767,6 +767,51 @@
|
|||||||
"sha256": "8fd30ee701133e2e02bf5116e38628fb3732b3578a15037b2d4abe79953f3724",
|
"sha256": "8fd30ee701133e2e02bf5116e38628fb3732b3578a15037b2d4abe79953f3724",
|
||||||
"bytes": 2888
|
"bytes": 2888
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"path": "docs/screenshots/readme/applications-dark.png",
|
||||||
|
"sha256": "82ff022837b585f7d90b5b726c8f92f331a3e8f098559d5839d9dc9226beb3a2",
|
||||||
|
"bytes": 89267
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "docs/screenshots/readme/automation-dark.png",
|
||||||
|
"sha256": "93774f2117bfa31aa7a304e051e5d084a12db89ea067c6d84ef115775b71b675",
|
||||||
|
"bytes": 121025
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "docs/screenshots/readme/dashboard-light.png",
|
||||||
|
"sha256": "35cee6d7a9333b293d533482557f3411ce17e0583bf087b3edaed05760dc69a3",
|
||||||
|
"bytes": 126696
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "docs/screenshots/readme/employers-light.png",
|
||||||
|
"sha256": "21244a639627aadc3c9d4bab2cf3ffa7eefe66e7f5642fd4d541f78f3e7fe739",
|
||||||
|
"bytes": 116548
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "docs/screenshots/readme/job-analysis-dark.png",
|
||||||
|
"sha256": "aba2519018348593ee6a31c4120e2e62995c7410b385f0b232ba52b3c80e2e78",
|
||||||
|
"bytes": 126364
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "docs/screenshots/readme/matches-dark.png",
|
||||||
|
"sha256": "1e52edf01d9ee18d5022b6dd5ecb0644fb77983e6f69b0780a32e10d94d5b7ee",
|
||||||
|
"bytes": 120441
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "docs/screenshots/readme/profile-mobile-light.png",
|
||||||
|
"sha256": "ae258eb1e6c088d54879a7d5b26f155f868ee1e1428adadc594f43d47228f15c",
|
||||||
|
"bytes": 28906
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "docs/screenshots/readme/skills-light.png",
|
||||||
|
"sha256": "044984044c347d7b07226123e8c5a9cd63102a4188306f83b4eda29e2b8643d7",
|
||||||
|
"bytes": 125568
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "docs/screenshots/readme/sources-light.png",
|
||||||
|
"sha256": "19636843ca48a7ec31982d39ab981751e31edd606ca4fed155c0d257a5f42e78",
|
||||||
|
"bytes": 124013
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"path": "fixtures/ai/evaluation_set.json",
|
"path": "fixtures/ai/evaluation_set.json",
|
||||||
"sha256": "6d9ec1c4ace7624200bc69fa4362f7d741a50758b56411b6436bea9a36e93b13",
|
"sha256": "6d9ec1c4ace7624200bc69fa4362f7d741a50758b56411b6436bea9a36e93b13",
|
||||||
|
|||||||
@@ -1,7 +1,70 @@
|
|||||||
# VacatureRadar · publieke broncode
|
<p align="center"><img src="static/img/vacatureradar-logo.svg" width="88" alt="VacatureRadar logo"></p>
|
||||||
|
<h1 align="center">VacatureRadar</h1>
|
||||||
|
<p align="center"><strong>An explainable, self-hosted job-search assistant for Belgium.</strong></p>
|
||||||
|
<p align="center"><a href="#product-tour">Product tour</a> · <a href="#features">Features</a> · <a href="#run-it-locally">Quick start</a> · <a href="#deployment-guide">Deployment</a></p>
|
||||||
|
|
||||||
VacatureRadar is een persoonlijke vacature-assistent met uitlegbare matching en menselijke controle over sollicitaties. Dit is een gecontroleerde publieke bronexport uit de private ontwikkelrepo. De private geschiedenis en operationele gegevens zijn niet opgenomen.
|
VacatureRadar follows permitted employer sites, ATS pages, feeds and job-alert mailboxes, removes duplicate or irrelevant results, and ranks the remaining opportunities against your own search profile. It helps you discover, compare and track jobs while keeping the final decision with you. **It never applies automatically.**
|
||||||
|
|
||||||
De code bevat een Django-app, templates, statische bestanden, tests en synthetische fixtures. Start lokaal met de configuratie in `.env.example` en de taken in `Makefile`; externe mailboxen en productiegegevens zijn niet inbegrepen.
|

|
||||||
|
|
||||||
Zie [LICENSE](LICENSE) voor de licentie en [SECURITY.md](SECURITY.md) voor kwetsbaarheidsmeldingen.
|
## Product tour
|
||||||
|
|
||||||
|
These captures use a sanitised local demo; the visible counts are sample data.
|
||||||
|
|
||||||
|
| Ranked matches | Explainable job detail |
|
||||||
|
| --- | --- |
|
||||||
|
|  |  |
|
||||||
|
|
||||||
|
| Application tracking | Source health |
|
||||||
|
| --- | --- |
|
||||||
|
|  |  |
|
||||||
|
|
||||||
|
Also explore the [skills radar](docs/screenshots/readme/skills-light.png), [employer intelligence](docs/screenshots/readme/employers-light.png), [automation center](docs/screenshots/readme/automation-dark.png) and [mobile profile](docs/screenshots/readme/profile-mobile-light.png).
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
- **Personal radar:** roles, skills, region, travel radius, work model and hard limits.
|
||||||
|
- **Source-aware ingestion:** permitted sources only, URL and redirect validation, normalization and deduplication.
|
||||||
|
- **Explainable ranking:** fit score, data quality, positive evidence and concerns shown separately.
|
||||||
|
- **Market context:** recurring skills and employer activity compared with your profile.
|
||||||
|
- **Application pipeline:** stages, notes, interviews and deadlines, always controlled by the user.
|
||||||
|
- **Operational visibility:** source runs, pipeline status and explicit unknowns when data has not been measured.
|
||||||
|
|
||||||
|
External HTML, email and model output are treated as untrusted data. The system does not bypass CAPTCHAs or rate limits, crawl denied sources directly, or send applications without a person.
|
||||||
|
|
||||||
|
## Run it locally
|
||||||
|
|
||||||
|
For a local development demo, install Python 3.12 or 3.13 and [`uv`](https://docs.astral.sh/uv/). Copy `.env.example` to `.env`, replace every `CHANGE_ME` value, leave `DATABASE_URL` empty for SQLite, then run:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
uv sync --frozen --all-groups
|
||||||
|
uv run python manage.py migrate
|
||||||
|
uv run python manage.py bootstrap_instance --with-demo
|
||||||
|
uv run python manage.py runserver 127.0.0.1:8080
|
||||||
|
```
|
||||||
|
|
||||||
|
Open <http://127.0.0.1:8080> and sign in with the admin credentials you set in `.env`. The bootstrap command loads fictional demo data. Keep this development server local.
|
||||||
|
|
||||||
|
## How it is built
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
flowchart LR
|
||||||
|
Browser[Server-rendered Django UI] --> App[Django domain services]
|
||||||
|
Sources[Permitted sites, feeds and mail] --> Ingest[Policy-aware ingestion]
|
||||||
|
Ingest --> App
|
||||||
|
App --> DB[(PostgreSQL)]
|
||||||
|
App --> Queue[Redis and Celery]
|
||||||
|
Queue --> Ingest
|
||||||
|
```
|
||||||
|
|
||||||
|
Django 5.2 provides the application and UI; PostgreSQL persists production state; Redis and Celery schedule ingestion and background work. Optional Ollama analysis never replaces deterministic filters or source policy. Microsoft 365 mailbox support uses app-only OAuth/XOAUTH2.
|
||||||
|
|
||||||
|
## Deployment guide
|
||||||
|
|
||||||
|
The supplied `docker-compose.yml` starts web, worker, scheduler, PostgreSQL and Redis services. Before running it, create `.env` with unique `DJANGO_SECRET_KEY`, admin and database credentials, set a production `DATABASE_URL`, and keep `DJANGO_DEBUG=0`. The Compose file binds port `1226`; restrict that port to a trusted interface or firewall and publish through an HTTPS reverse proxy. Persist `local/` and PostgreSQL data, then test `/health/ready/`, backups and restore. Review source-specific terms before enabling any external fetcher.
|
||||||
|
|
||||||
|
`apps/` contains domain modules, `config/` contains Django and Celery configuration, `templates/` plus `static/` contain the UI, and `tests/` contains unit, integration and security checks. See [SECURITY.md](SECURITY.md) for vulnerability reporting and [LICENSE](LICENSE) for the MIT license.
|
||||||
|
|
||||||
|
## Public-source provenance
|
||||||
|
|
||||||
|
This is a reviewed content-only export from a private canonical repository. `PUBLIC_SOURCE_MANIFEST.json` records the source revision and file hashes; private Git history and operational deployment material are excluded.
|
||||||
|
After Width: | Height: | Size: 87 KiB |
|
After Width: | Height: | Size: 118 KiB |
|
After Width: | Height: | Size: 124 KiB |
|
After Width: | Height: | Size: 114 KiB |
|
After Width: | Height: | Size: 123 KiB |
|
After Width: | Height: | Size: 118 KiB |
|
After Width: | Height: | Size: 28 KiB |
|
After Width: | Height: | Size: 123 KiB |
|
After Width: | Height: | Size: 121 KiB |