No description
  • Python 76.6%
  • TypeScript 8.6%
  • Shell 6%
  • CSS 4.1%
  • Dockerfile 2.1%
  • Other 2.6%
Find a file
ThaMitree 00f3943a27
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
ci: mirror main and version tags to code.overheid.nl (#2)
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>
2026-07-02 16:12:32 +02:00
.claude WIM v0.1.0 — eerste publieke release 2026-07-02 14:16:24 +02:00
.github ci: mirror main and version tags to code.overheid.nl (#2) 2026-07-02 16:12:32 +02:00
.vscode WIM v0.1.0 — eerste publieke release 2026-07-02 14:16:24 +02:00
db chore(scrub): neutralize example domains (nos.nl, vakbladen) 2026-07-02 14:24:56 +02:00
docs/adr WIM v0.1.0 — eerste publieke release 2026-07-02 14:16:24 +02:00
frontend chore(scrub): neutralize example domains (nos.nl, vakbladen) 2026-07-02 14:24:56 +02:00
scripts WIM v0.1.0 — eerste publieke release 2026-07-02 14:16:24 +02:00
services chore(scrub): neutralize example domains (nos.nl, vakbladen) 2026-07-02 14:24:56 +02:00
tests WIM v0.1.0 — eerste publieke release 2026-07-02 14:16:24 +02:00
.env.example WIM v0.1.0 — eerste publieke release 2026-07-02 14:16:24 +02:00
.gitignore WIM v0.1.0 — eerste publieke release 2026-07-02 14:16:24 +02:00
.pre-commit-config.yaml WIM v0.1.0 — eerste publieke release 2026-07-02 14:16:24 +02:00
ADAPTING.md WIM v0.1.0 — eerste publieke release 2026-07-02 14:16:24 +02:00
AGENTS.md WIM v0.1.0 — eerste publieke release 2026-07-02 14:16:24 +02:00
CHANGELOG.md WIM v0.1.0 — eerste publieke release 2026-07-02 14:16:24 +02:00
CONTRIBUTING.md WIM v0.1.0 — eerste publieke release 2026-07-02 14:16:24 +02:00
docker-compose.images.yml WIM v0.1.0 — eerste publieke release 2026-07-02 14:16:24 +02:00
docker-compose.yml WIM v0.1.0 — eerste publieke release 2026-07-02 14:16:24 +02:00
LICENSE WIM v0.1.0 — eerste publieke release 2026-07-02 14:16:24 +02:00
Makefile WIM v0.1.0 — eerste publieke release 2026-07-02 14:16:24 +02:00
openapi.yml chore(scrub): neutralize example domains (nos.nl, vakbladen) 2026-07-02 14:24:56 +02:00
publiccode.yml WIM v0.1.0 — eerste publieke release 2026-07-02 14:16:24 +02:00
pytest.ini WIM v0.1.0 — eerste publieke release 2026-07-02 14:16:24 +02:00
README.md docs(readme): state the project is purely experimental, not in production (#1) 2026-07-02 15:56:30 +02:00
ruff.toml WIM v0.1.0 — eerste publieke release 2026-07-02 14:16:24 +02:00
SECURITY.md WIM v0.1.0 — eerste publieke release 2026-07-02 14:16:24 +02:00
start.sh WIM v0.1.0 — eerste publieke release 2026-07-02 14:16:24 +02:00

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. /db is 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 own pyproject.toml, tests, and Dockerfile
  • frontend/ — the Vite/React dashboard
  • openapi.yml — the frozen wire contract between services
  • tests/ — root-level cross-service tests (contract-drift guard)
  • docs/adr/ — architecture decision records
  • scripts/ — 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.