- Python 76.6%
- TypeScript 8.6%
- Shell 6%
- CSS 4.1%
- Dockerfile 2.1%
- Other 2.6%
|
Some checks failed
CI / test (api) (push) Has been cancelled
CI / test (discovery) (push) Has been cancelled
CI / test (gate) (push) Has been cancelled
CI / test (scraper2) (push) Has been cancelled
CI / cron poll.sh smoke (push) Has been cancelled
CI / contract drift guard (push) Has been cancelled
CI / ruff check (push) Has been cancelled
CI / frontend build (push) Has been cancelled
Mirror to code.overheid.nl / mirror (push) Has been cancelled
The code.overheid.nl copy was created as a one-time import, so it never syncs on its own — it was already a commit behind. GitHub stays the source of truth; this workflow force-pushes main and v* tags to the Forgejo repo on every push, keeping the published copy identical. Needs the CODE_OVERHEID_TOKEN secret (Forgejo token, write:repository). Co-authored-by: Claude Fable 5 <noreply@anthropic.com> |
||
|---|---|---|
| .claude | ||
| .github | ||
| .vscode | ||
| db | ||
| docs/adr | ||
| frontend | ||
| scripts | ||
| services | ||
| tests | ||
| .env.example | ||
| .gitignore | ||
| .pre-commit-config.yaml | ||
| ADAPTING.md | ||
| AGENTS.md | ||
| CHANGELOG.md | ||
| CONTRIBUTING.md | ||
| docker-compose.images.yml | ||
| docker-compose.yml | ||
| LICENSE | ||
| Makefile | ||
| openapi.yml | ||
| publiccode.yml | ||
| pytest.ini | ||
| README.md | ||
| ruff.toml | ||
| SECURITY.md | ||
| start.sh | ||
WIM — Werkgevers Informatie op Maat
Warning
Purely experimental. Everything in this repository was built during a hackathon to research the capabilities of building software with AI. It is not used in production anywhere, and there are currently no plans to do so. It is published solely as a research artifact and learning resource.
A pipeline of reusable microservice building blocks for profile-filtered news monitoring, built at UWV: it discovers pages from configured public sources (sitemaps and RSS feeds), classifies them against advisor profiles (sector / regio / specialisatie), and shows the on-profile matches in a dashboard — so an advisor sees the handful of items that matter to their employers, not a firehose.
[cron] ─hourly /run─▶ [discovery] ─POST /crawl─▶ [scraper2] ─POST /ingest─▶ [gate] ─write─▶ [Postgres] ◀─read─ [api] ◀─HTTP─ [frontend]
Everything organisation-specific — which sources are polled, what vocabulary classifies an item as relevant, whose profiles filter the feed — is declarative content, not code: ADAPTING.md walks another organisation through the four files to edit. For the full architecture, data flow, service contracts, and guidance on working in this repo (including AI coding agents), see AGENTS.md.
Quickstart
docker compose up --build
This brings up Postgres, the Gate, the read API, the frontend dashboard, the
discovery service, the crawl4ai scraper, and the cron sidecar. No .env is
required — every value has a demo-safe inline default (copy .env.example to .env
to override any of them, e.g. to enable the Azure OpenAI classifier).
Then open the frontend at http://localhost:5173.
Prebuilt images
Every version tag publishes all service images to GHCR
(.github/workflows/publish.yml), so you can skip the local build entirely:
docker compose -f docker-compose.yml -f docker-compose.images.yml up --no-build -d
Pin a version with WIM_IMAGE_TAG=0.1.0, or point WIM_IMAGE_BASE at your own
registry namespace.
Origin & maturity — read this before adopting
WIM is a purely experimental project: it was built in two days at a UWV hackathon (use case IKR5 — "Ik zoek een medewerker") to research the capabilities of building software with AI coding agents. It is not running in production anywhere at UWV or elsewhere, and there are no plans to take it there. It is published deliberately as-is, in the spirit of the Dutch government's "open, tenzij" policy: a working, adaptable starting point for your own experiments, not a polished product. Honest expectations:
- No migration framework.
/dbis plain SQL run once on an empty volume; schema changes mean a volume reset or hand-applied SQL. - Smoke-level test suites. Each service ships focused offline tests plus a cross-service contract guard and an e2e smoke script — good tripwires, not exhaustive coverage.
- Dutch domain terms in the wire contract (
bron,sector,regio,specialisatie) — kept on purpose as the ubiquitous language of the reference implementation. - The frontend is UWV-styled and Dutch-only; it sits behind a single API seam and is meant to be restyled or replaced.
What you can lean on: each service is self-contained (own dependencies, tests, Dockerfile), the classifier runs fully offline by default (LLM optional, never required), sources/taxonomy/profiles are declarative content files, and CI guards the contract between the service copies.
Common tasks
A root Makefile wraps the everyday commands — run make (or make help) to list
them:
make test # run every service's test suite + the contract-drift guard
make lint # ruff check across all services
make up # docker compose up --build
make smoke # full-pipeline e2e smoke test
Repository layout
services/— one directory per microservice (gate,api,discovery,scraper2,cron); each owns its ownpyproject.toml, tests, and Dockerfilefrontend/— the Vite/React dashboardopenapi.yml— the frozen wire contract between servicestests/— root-level cross-service tests (contract-drift guard)docs/adr/— architecture decision recordsscripts/— operational scripts (db backup/restore, e2e smoke test, demo seed)
Contributing & security
Contributions welcome — see CONTRIBUTING.md for the dev setup and conventions. To report a vulnerability, see SECURITY.md (please don't open public issues for security problems).
License
Copyright © 2026 UWV.
Licensed under the European Union Public Licence v1.2 (EUPL-1.2). You may reuse, modify, and redistribute this work under the terms of that licence.