Files
VacatureRadar/README.md
T

9.2 KiB

VacatureRadar

VacatureRadar is een persoonlijke, vrijwel autonome vacature-assistent voor toegestane publieke werkgeversbronnen, publieke ATS-pagina's, RSS/Atom en vacaturemails. De applicatie verzamelt vacatures, normaliseert en dedupliceert ze, past harde filters toe, berekent een uitlegbare matchscore en presenteert vacatures, skillsvraag, werkgevers, opvolging en bronstatus in een Stitch-gebaseerde Intelligence Cockpit.

De repository bevat zowel een werkende MVP-kern als de volledige product-, architectuur-, UX-, beveiligings-, operationele en agentische overdrachtsdocumentatie om het project verder autonoom af te bouwen.

Huidige status

Reeds geïmplementeerd:

  • Django 5.2-modulaire monoliet met de volledige Nederlandstalige, responsive dark/light Stitch Intelligence Cockpit;
  • PostgreSQL in productie en SQLite voor lokale ontwikkeling;
  • Celery-worker en scheduler via Redis;
  • veilige HTTP-fetcher met domeinbeleid, redirecthercontrole, contentlimieten en SSRF-blokkering;
  • JSON-LD JobPosting, generieke HTML-, RSS/Atom- en vacaturemailparsers;
  • normalisatie, herkomstbewijs, vacatureversies en idempotente opslag;
  • exacte en fuzzy deduplicatie;
  • deterministische kenmerken, harde uitsluitregels en uitlegbare scoring;
  • zoekprofielen met revisiehistoriek en begrensde feedbackaanpassing;
  • dagelijkse digests, vacaturelevenscyclus, auditbare sollicitatiepipeline en activiteitstijdlijn;
  • werkgeversintelligence, persoonlijke skillsradar en eerlijke operationele automatiseringsstatus;
  • optionele lokale Ollama-analyse met prompt-injectionguardrails;
  • Docker Compose voor lokaal gebruik en een Unraid-variant;
  • tests, fixtures, CI, back-up-/herstelscripts en healthchecks.

Nog niet als productievoltooid beschouwd:

  • periodieke menselijke voorwaardenreview voor bijkomende live werkgeversbronnen;
  • productiespecifieke secrets, mailboxcredentials, domein/TLS en containerregistry.

Deze punten staan als uitvoerbare taken in docs/ai/BACKLOG.yaml. Externe credentials blokkeren nooit de rest van het werk: taken worden met mocks en interfaces afgewerkt en daarna als blocked-external gedocumenteerd waar echte configuratie nodig is.

Frontend en visuele validatie

De enige normale browserfrontend is de server-rendered Stitch Intelligence Cockpit. Alle negen referentieschermen zijn aan echte Django-data gekoppeld; er is geen SPA, runtime-CDN, demo-KPI of oude parallelle shell. De ontwerpcontracten en gemotiveerde afwijkingen staan in:

De elf desktop-/mobielbeelden staan in artifacts/visual-validation/ en zijn uitgesloten van de productiecontainer. De browsermatrix bestrijkt 360 tot 2560 px.

Release-productiepad:

  • ./scripts/release_verify.sh bouwt de smoke-, backup/restore- en artifactcontrole;
  • docs/operations/UNRAID_DEPLOYMENT.md bevat een expliciet upgrade/rollbackpad met releaseartefacten.

Snelste start voor Codex

Open de uitgepakte repository als project en geef Codex deze opdracht:

Lees CODEX_START_HERE.md en AGENTS.md volledig. Voer daarna het autonome uitvoeringsprotocol uit. Werk alle taken met status ready in docs/ai/BACKLOG.yaml op volgorde af. Vraag geen productbeslissingen; gebruik de vastgelegde defaults. Wanneer een extern secret, account of live bronreview ontbreekt, implementeer en test de interface met fixtures, markeer uitsluitend dat externe deel als blocked-external en ga meteen door met de volgende taak. Stop pas nadat alle ready taken done zijn en scripts/codex_verify.sh volledig slaagt.

De repository-instructies staan in AGENTS.md. De handmatige startpagina staat in CODEX_START_HERE.md.

Lokale quickstart

Vereisten: Python 3.12 of 3.13 en uv.

./scripts/codex_bootstrap.sh
uv run python manage.py runserver 0.0.0.0:8080

Het bootstrap-script:

  1. maakt alleen wanneer nodig een lokale .env aan;
  2. installeert exact de gelockte dependencies;
  3. voert migraties uit;
  4. maakt demo-inhoud aan;
  5. draait lint, systeemchecks, migratiecheck, tests en taakledgervalidatie.

Bij een door het script aangemaakte ontwikkelomgeving is de tijdelijke login:

admin / codex-local-only

Gebruik die nooit buiten lokale ontwikkeling.

Docker Compose

APP_HOST=localhost APP_SCHEME=http bash scripts/deploy_docker.sh

De webinterface luistert op 0.0.0.0:1226 (containerpoort 8080). Voor een one-shot deploy kun je nu draaien:

APP_HOST=localhost APP_SCHEME=http bash scripts/deploy_docker.sh

De script zet ontbrekende .env-waarden automatisch met sterke defaults (secrets, database-wachtwoord, admin-credentials, ports) en start direct de volledige Docker-stack. Daarna:

  • http://127.0.0.1:1226/health/ready/
  • http://127.0.0.1:1226/health/live/

Zet voor publieke productie:

  • APP_HOST=<jouw-domein>
  • APP_SCHEME=https
  • DJANGO_DEBUG=0
  • SESSION_COOKIE_SECURE=1
  • CSRF_COOKIE_SECURE=1
  • SECURE_SSL_REDIRECT=1

De script blijft geen handmatige invulstappen voor compose vereisen; pas deze omgevingsvariabelen aan vóór eerste deploy.

Push-to-deploy via Gitea

Er is een .gitea/workflows/deploy.yml toegevoegd voor automatisch deployen op elke push naar main en master.

Wat je nodig hebt:

  • éénmalige setup van een self-hosted Gitea-runner op je server met Docker-toegang

Daarna doet elke push automatisch:

  • checkout van de repo op de runner
  • bash scripts/deploy_docker.sh op de server
  • automatische healthcheck + collectstatic

De workflow verwacht geen host/SSH-repo secrets uit het Actions-configuratiescherm.

Zie Gitea push-to-deploy voor de exacte serverconfiguratie.

Zelf een schone overdrachts-ZIP maken

uv run python scripts/package_project.py ../VacatureRadar_Project.zip
uv run python scripts/verify_package.py ../VacatureRadar_Project.zip

Het packaging-script sluit .env, virtuele omgevingen, caches, lokale databases, logs, media en back-ups uit. In de ZIP staat PROJECT_MANIFEST.json met grootte en SHA-256 per bestand.

Kwaliteitsgates

./scripts/codex_verify.sh

De gate vereist:

  • Ruff zonder bevindingen;
  • een geldige Django-configuratie;
  • geen ontbrekende migraties;
  • alle tests geslaagd;
  • minimaal 70% branch-aware codedekking;
  • een geldige machineleesbare backlog.

Repositorykaart

apps/                    Django-domeinmodules
  core/                  dashboard, health en beveiligingsheaders
  profiles/              zoekprofielen en revisies
  sources/               bronbeleid, fetcher, adapters en IMAP
  jobs/                  normalisatie, dedupe, scoring en sollicitaties
  notifications/         digest-outbox en verzending
config/                  Django/Celery-configuratie
config-data/             voorbeeldprofielen en bronbeleid
fixtures/                deterministische parser- en integratietestdata
templates/ + static/     server-rendered interface en designimplementatie
docs/                    alle product-, technische en operationele specificaties
deployment/unraid/       Unraid-installatiehandleiding
.agents/skills/          repo-eigen Codex-workflow
scripts/                 bootstrap, verificatie, back-up en beheer
tests/                   unit-, integratie- en securitytests

Veiligheidsgrenzen

Vacature-inhoud, e-mailinhoud en externe HTML zijn altijd onbetrouwbare data. Ze mogen nooit instructies worden voor AI of automatisering. De applicatie:

  • logt niet automatisch in op vacaturesites;
  • omzeilt geen CAPTCHA, rate limit of toegangscontrole;
  • scrapt denylistplatformen niet rechtstreeks;
  • solliciteert nooit automatisch;
  • bewaart alleen beperkte brondata en verwijdert ruwe documenten volgens retentie;
  • laat harde uitsluitregels niet door een taalmodel wijzigen;
  • maakt netwerktoegang opt-in per goedgekeurde bron.

Lees SECURITY.md en docs/quality/THREAT_MODEL.md vóór productiegebruik.

Documentatie-ingangen

Licentie

MIT voor de broncode. Controleer voor iedere externe vacaturebron afzonderlijk de voorwaarden, robotsregels, databankrechten en toepasselijke wetgeving. Dit project levert technisch bronbeleid, maar geen juridisch advies.