Initial deploy setup
deploy / deploy (push) Canceled after 0s

This commit is contained in:
Jens
2026-07-21 14:00:00 +02:00
commit b8091e59bd
285 changed files with 27854 additions and 0 deletions
@@ -0,0 +1,32 @@
# ADR-0001 — Modulaire Django-monoliet
- Status: accepted
- Datum: 2026-07-20
## Context
De applicatie is persoonlijk, self-hosted en heeft meerdere samenhangende domeinen maar beperkte operationele schaal. Afzonderlijke frontend/backend/microservices zouden deployment, auth, transacties, upgrades en debugging op Unraid verzwaren.
## Besluit
Gebruik één Django-codebase met domeinapps, server-rendered templates, PostgreSQL en Celery/Redis voor asynchroon werk. Bedrijfslogica blijft in services en adapters zodat latere extractie mogelijk blijft.
## Gevolgen
Positief:
- één image en releaseflow;
- eenvoudige auth/CSRF;
- transactionele pipeline;
- lage beheerlast;
- goede testbaarheid.
Negatief:
- frontendinteractie is minder SPA-achtig;
- domeingrenzen moeten door conventie/tests bewaakt worden;
- lange collectiontaken mogen nooit in webrequests draaien.
## Herzieningstrigger
Alleen herzien bij meetbare bottleneck, onafhankelijk releasevereiste of team-/tenantgrens die niet met modules/queues kan worden opgelost.
@@ -0,0 +1,19 @@
# ADR-0002 — Strikt bronbeleid en geen directe platformbots
- Status: accepted
- Datum: 2026-07-20
## Context
Grote vacatureplatformen hebben toegangsvoorwaarden, botdetectie en databank-/privacyrisico's. De gebruiker wil minimale handelingen, maar niet ten koste van blokkadeomzeiling of onbeheerbare scraping.
## Besluit
Onbekende bronnen starten als `review`. Alleen `allow`-bronnen worden automatisch gefetcht. LinkedIn, Indeed, StepStone, Jobat en VDAB staan standaard op de directe fetchdenylist. Platformvacatures komen binnen via door de gebruiker ingestelde e-mailalerts of handmatige import; de tool probeert de oorspronkelijke werkgeversbron te vinden.
## Gevolgen
- minder brede directe platformdekking;
- veel lagere juridische/technische onderhoudslast;
- bronaudit en policyreview worden productfunctionaliteit;
- denylistlinks mogen als alias bestaan maar worden niet automatisch bezocht.
@@ -0,0 +1,19 @@
# ADR-0003 — Deterministische kern vóór optionele AI
- Status: accepted
- Datum: 2026-07-20
## Context
Vacatureteksten zijn onbetrouwbare externe data. Taalmodellen kunnen hallucineren, gevoelig zijn voor prompt injection en niet altijd beschikbaar zijn.
## Besluit
Normalisatie, harde uitsluitingen, dedupe, lifecycle en baselinescoring zijn deterministisch. AI is standaard uit en mag alleen gestructureerde aanvullende features, evidence en samenvatting leveren. AI-uitval verandert de kernflow niet.
## Gevolgen
- voorspelbaar en offline bruikbaar;
- uitlegbare fallback;
- minder semantische nuance zonder model;
- model-/promptversie en evaluaties vereist vóór rankingimpact.
@@ -0,0 +1,19 @@
# ADR-0004 — Single-user-first, user-scoped data
- Status: accepted
- Datum: 2026-07-20
## Context
Het primaire doel is één persoonlijke Unraid-installatie. Volledige multi-tenant SaaS-architectuur zou onnodige complexiteit toevoegen, maar globale user-onafhankelijke querysets kunnen later datalekken veroorzaken.
## Besluit
Optimaliseer UX en beheer voor één gebruiker, maar koppel profielen, feedback, applications en digests altijd aan een Django-user en scope wijzigingsviews op die user. Canonieke vacatures/bronnen zijn installatiebreed gedeeld.
## Gevolgen
- eenvoudige installatie;
- veilige basis voor een tweede lokale user;
- geen tenantbilling, uitnodigingen of isolatie op databaseniveau;
- beheerfuncties blijven admin-only in productie.
@@ -0,0 +1,19 @@
# ADR-0005 — Vacaturemails als platformingress
- Status: accepted
- Datum: 2026-07-20
## Context
Vacatureplatformen bieden nuttige zoekalgoritmes en alerts, terwijl directe scraping ongewenst is. E-mail is door de gebruiker geactiveerde, begrensde input.
## Besluit
Gebruik een dedicated IMAP-mailbox en idempotente MIME/linkextractie. Bewaar platformlinks als bronalias. Volg een link alleen wanneer bronpolicy dat later toestaat; probeer bij voorkeur een oorspronkelijke werkgeverspagina te vinden.
## Gevolgen
- gebruiker stelt alerts eenmalig in;
- parser moet variërende e-mailsjablonen verdragen;
- dedicated mailbox en retentie nodig;
- geen platformcredentials in VacatureRadar.
@@ -0,0 +1,18 @@
# ADR-0006 — Geen automatische sollicitaties
- Status: accepted
- Datum: 2026-07-20
## Context
Automatisch solliciteren kan onjuiste verklaringen, privacyverlies, reputatieschade en ongewenste massacommunicatie veroorzaken. Vacatureformulieren verschillen sterk en bevatten vaak gevoelige vragen.
## Besluit
VacatureRadar archiveert, scoort, maakt een dossier en kan conceptinformatie voorbereiden, maar bevat geen externe submitactie. Alleen de gebruiker verstuurt een sollicitatie via het oorspronkelijke kanaal.
## Gevolgen
- menselijke controle blijft gegarandeerd;
- minder end-to-endautomatisering;
- een eventuele toekomstige wijziging vereist een nieuwe expliciete ADR, security/privacyreview en per-submitconfirmatie.
@@ -0,0 +1,19 @@
# ADR-0007 — PostgreSQL als waarheid, Redis/Celery voor werk
- Status: accepted
- Datum: 2026-07-20
## Context
Broncontroles, mailboxpolling en scoring mogen webrequests niet blokkeren. Taken moeten retrybaar zijn, terwijl Redisdata verloren mag gaan zonder canonieke data te verliezen.
## Besluit
PostgreSQL is de enige productiebron van waarheid. Redis is uitsluitend broker/resultbackend. Celery worker en beat voeren periodiek/asynchroon werk uit. SQLite en eager tasks blijven beschikbaar voor lokale tests.
## Gevolgen
- duidelijke herstelstrategie;
- extra twee containers;
- taken moeten idempotent zijn omdat at-least-once uitvoering mogelijk is;
- schedulerstate mag worden herbouwd uit database/sourcevelden.
@@ -0,0 +1,18 @@
# ADR-0008 — Server-rendered UI zonder aparte SPA
- Status: accepted
- Datum: 2026-07-20
## Context
De interface bestaat vooral uit lijsten, detailpagina's, formulieren en enkele POST-acties. Een React-buildketen verdubbelt contracts, auth, dependencies en deployment zonder duidelijke MVP-winst.
## Besluit
Gebruik Django templates, semantische HTML, eigen CSS en minimale vanilla JavaScript. Progressive enhancement mag; kernflows werken zonder clientframework.
## Gevolgen
- snelle, toegankelijke en eenvoudige deployment;
- minder rijke realtimeinteractie;
- API blijft intern tenzij een concrete integratiebehoefte ontstaat.