het hart
Webex Meetings
Elke afspraak is een echte Webex-meeting via de Meetings API. Browser-direct deelnemen, proefgesprek vooraf, live meetingstatus in de agenda.
ADR 0017Open source · EUPL-1.2 · WCAG 2.2 AA
OpenPlanner is de planner voor videogesprekken via Webex. Een deelnemer kiest een vrij moment op een pagina in jouw huisstijl, krijgt een bevestiging met agenda-uitnodiging en belt vanuit de browser. Geen account, geen app, geen login. Jouw team krijgt het gesprek op het juiste moment in Webex Contact Center, en persoonsgegevens zijn 24 uur na het gesprek weg.
Een echte afspraakpagina, zonder de echte afspraak. Alles werkt met het toetsenbord. Er wordt niets opgeslagen of verstuurd.
Twee sporen door het product: wat de deelnemer meemaakt, van tijd kiezen tot het gesprek, en wat het team en de beheerders in handen hebben, van organisatie tot de medewerker die het gesprek oppakt.
Bij elke release neemt de pipeline de boekingsflow, het portaal en de agenda opnieuw op, zodat wat je hier ziet ook is wat je installeert.
Komt met de eerstvolgende release.
Een team is een groep: openingstijden, bezetting per blok, feestdagen, uitzonderingen, teksten en huisstijl. Alles in het beheerportaal, zonder code.
Elke groep heeft een eigen pagina op jouw domein. Of je plaatst de kalender als Web Component midden in je eigen site.
Als werkitem in Webex Contact Center, of in de eigen wachtrij van OpenPlanner waar medewerkers met de agent-rol het gesprek zelf oppakken. Per groep te kiezen.
Gebouwd voor teams die veel mensen per video helpen: klantenservice, adviesbalies, intake, helpdesks.
Maandkalender, vrije tijden, drie velden. Verzetten of annuleren via een persoonlijke link. Werkt zonder JavaScript en volledig met het toetsenbord.
Elke afspraak krijgt een eigen Webex-meeting. De deelnemer belt vanuit de browser, zonder app of account; je team stapt in als cohost.
Het gesprek gaat als werkitem naar de wachtrij in Webex Contact Center. De eerste vrije medewerker neemt op. Niemand hoeft naar een agenda te kijken.
Een groep die open is kan een direct gesprek aanbieden, met een plafond op het aantal wachtenden en eerlijke wachtrijfeedback.
Eén installatie, meerdere organisaties, elk met eigen groepen, huisstijl, teksten en identity provider. Rollen en scope komen uit jouw IdP; één autorisatiematrix bepaalt wat iedereen ziet en doet.
Een groep is een vaardigheid met een onderwerp, een team en een wachtrij. De deelnemer kiest nooit een persoon; de eerste vrije medewerker neemt op. Eén medewerker kan in meerdere groepen staan.
Persoonsgegevens staan alleen op de boeking en zijn 24 uur na het gesprek weg. Nooit in logs, URL's, jobs of foutmeldingen.
Kleuren, logo en lettertype per organisatie. Elke tekst is aanpasbaar in het portaal. Nederlands en Engels standaard, meer talen mogelijk.
Bevestiging, wijziging, herinnering en annulering per e-mail (met .ics) en sms. SPF, DKIM en DMARC worden voor je gecontroleerd.
Beheerders volgen elk gesprek live, plannen bezetting per blok en sluiten bij nood een groep in één handeling, waarna deelnemers zelf een nieuw moment kiezen.
OpenPlanner is geen videoplatform en geen contact center. Het is de planner die de Webex-producten die je al hebt aan elkaar knoopt, en die elk ander systeem achter een nette adapter houdt.
het hart
Elke afspraak is een echte Webex-meeting via de Meetings API. Browser-direct deelnemen, proefgesprek vooraf, live meetingstatus in de agenda.
ADR 0017dispatch
Vijf minuten voor de start wordt het gesprek een werkitem in de wachtrij van het team, met alleen voornaam, join-link en routeringskenmerken. Webex Contact Center is de eerste koppeling; de laag erachter is leverancieronafhankelijk, en een groep kan ook zonder contact center werken met de eigen wachtrij van OpenPlanner.
ADR 0018alerts
Een bot meldt beheerders in Webex wanneer de koppeling hapert, een wachtrij volloopt of een controle faalt. Nooit persoonsgegevens, altijd een link naar het portaal.
ADR 0082OIDC
Beheerders loggen in via jullie eigen IdP (PingFederate, Keycloak, Entra ID, elke OIDC-provider), per organisatie, met rollen uit de claims.
ADR 0083kanalen
SMTP en een providerneutrale sms-gateway per organisatie. Teksten per kanaal en per groep aanpasbaar in het portaal.
ADR 0022machine-API
Een contact-center-bot (zoals de Webex AI Agent) vraagt vrije tijden op en boekt namens de deelnemer via een API met scopes en per-client sleutels.
docs/agent-api.mdNiet door een lijst vinkjes, maar door de opbouw: een kern zonder framework, elke externe dienst achter een poort, en regels die de pipeline afdwingt in plaats van een reviewer.
Pure Python, geen framework, ≥ 90% testdekking
VideoProviderWebex MeetingsContactCenterDispatcherWebex Contact Center, eigen wachtrijMessageSenderSMTP, sms-gatewayIdentityProviderOIDC: PingFederate, Keycloak, Entra IDEventSinksyslog, Splunk, ElasticTransactionSQLiteEen ander contact center of videoplatform is een nieuwe adapter achter een bestaande poort. Domein, schermen en teksten veranderen niet.
Lagen, typen, rechten en privacyregels worden bij elke pull request gecontroleerd. Wat niet klopt, komt niet op main.
Rechten, instellingen en de structuur van het portaal staan elk op één plek; de documentatie daarvan wordt uit de code gegenereerd.
Meer dan tachtig ADR's met context, keuze, instellingen en bouwstatus. Een architect leest waarom iets zo is, en wat nog niet draait.
Proxy, web en worker op één VM met SQLite in WAL-modus. Lezers blokkeren elkaar niet, een boeking is een paar rijen onder een schrijfslot, meerdere workers delen de takenwachtrij. Eén installatie bedient vele organisaties. Opschalen gaat eerst verticaal: meer CPU, geheugen en snellere schijf.
De ontwerpdoelstelling is zo'n 80 boekingen per werkdag. ADR 0036 legt vast wanneer we verder gaan: boven 2.000 boekingen per werkdag, bij een p95 boven 1 seconde, bij een strengere beschikbaarheidseis of als een klant beheerde Postgres eist.
Postgres met rijvergrendeling, meerdere webinstanties achter de proxy, workers op elke host en een gedeelde opslag voor rate limits. Alle databasetoegang zit al achter één poort in één adaptermodule, dus domein, routes en schermen blijven gelijk.
ADR 0036: schaalgrenzen en het pad voorbij één VM
Rol × recht × niveau op één plek. Elke beheerroute declareert één recht, elke query filtert op scope, elke weigering staat in het auditlog. Geen uitzondering voor superusers.
Elke query filtert op de scope van de rol; een organisatiebeheerder ziet nooit een andere organisatie, een groepsbeheerder nooit een andere groep. Dezelfde matrix stuurt menu, knoppen en de API.
OIDC met PKCE, state en nonce, alleen asymmetrische algoritmes, sessie van acht uur. Geen lokale accounts, geen break-glass login, bewust.
Logins, wijzigingen en weigeringen als gestructureerde events, naar syslog, Splunk of Elastic. Zonder persoonsgegevens.
Images keyless getekend met cosign, SBOM (CycloneDX) bij elke release, CVE-scan met trivy en grype, hashes in de lockfile. De installatie controleert de handtekening.
mypy strict, ruff, bandit, semgrep, gitleaks, mutatietesten, schemathesis, OWASP ZAP, Playwright met axe-core en Lighthouse. Alles blokkeert de merge.
Twee containers, één SQLite-bestand, HTTPS met automatische certificaten of je eigen proxy. Updates en releasekanaal vanuit het portaal. Back-up is één bestand.
WCAG 2.2 AA op elke publieke pagina, in elke taal, elke pull request opnieuw getest. Geen tijdslimieten, geen CAPTCHA-puzzels.
Elke drempel, limiet en termijn is een instelling met een klasse, een default en grenzen. Wat een beveiliging is, zet je niet uit vanuit het portaal.
Wat we beweren, staat in de code, in een test of in de pipeline. Per standaard zie je hoe ver het is en waar het bewijs staat.
| Standaard | Wat het betekent | Status | Bewijs |
|---|---|---|---|
| WCAG 2.2 AA (EN 301 549) | Toetsenbord-flow, axe-core zonder fouten en Lighthouse ≥ 95 op elke publieke pagina, in elke taal, bij elke pull request. Handmatige audit met NVDA en VoiceOver vóór livegang. | getest in CI | e2e/pages.json |
| NL Design System | Kleuren, typografie en spacing van de deelnemerspagina's komen uit NL Design System-tokens; organisaties passen ze aan binnen die tokens. | ingebouwd | docs/widget.md |
| HTTPS, HSTS en NCSC TLS-richtlijnen | HTTPS met HSTS (pas-toe-of-leg-uit van Forum Standaardisatie), TLS 1.2 en 1.3 volgens de NCSC-richtlijnen. Een controle in CI en internet.nl in de go-live-checklist zijn gepland. | deels | ADR 0086 |
| SPF, DKIM en DMARC | Pas-toe-of-leg-uit-standaarden voor e-mail. Het portaal controleert het afzenderdomein van elke organisatie en toont wat ontbreekt. | ingebouwd | ADR 0073 |
| OpenID Connect | Beheerders loggen in via de eigen identity provider: PKCE, state en nonce, alleen asymmetrische algoritmes. Getest tegen Keycloak, in productie PingFederate. | ingebouwd | ADR 0013 |
| OpenAPI 3 | De API-specificatie wordt uit de code gegenereerd, bij elke pull request vergeleken en met schemathesis aangevallen. | getest in CI | docs/api.md |
| AVG en privacy by design | Persoonsgegevens alleen op de boeking, gewist 24 uur na het gesprek, nooit in logs. Het datastroomschema is de input voor de DPIA van de organisatie. | ingebouwd | docs/dataflow.md |
| Bouwstenen voor de BIO | Auditlog van elke wijziging en weigering, beveiligingsevents bij aanvallen, een auditor-rol en export naar je logplatform. De BIO zelf blijft de verantwoordelijkheid van de organisatie. | ingebouwd | ADR 0053 |
| security.txt (RFC 9116) | Een vast meldpunt voor kwetsbaarheden op elke installatie, met SECURITY.md in de repository. | ingebouwd | SECURITY.md |
| Software supply chain | Elke image keyless getekend met cosign, een CycloneDX-SBOM bij elke release, CVE-scans met trivy en grype, afhankelijkheden met hashes vastgezet. | getest in CI | ADR 0006 |
| Standaard voor Publieke Code | EUPL-1.2, licentie per bestand via REUSE, besluiten openbaar als ADR, en een publiccode.yml die CI valideert en die elke release bijwerkt. De aanmelding bij developer.overheid.nl staat nog open. | deels | publiccode.yml |
| Penetratietest | Een externe pentest vóór livegang en daarna jaarlijks. Tot die tijd: OWASP ZAP bij elke merge en misbruikscenario's als tests. | gepland | docs/threat-model.md |
OpenPlanner is gepubliceerd onder de EUPL-1.2, de open-source-licentie van de Europese Commissie. Niet alleen de code is open: elk ontwerpbesluit staat als ADR in de repository, met wat er van gebouwd is.
Gebruik, wijzig en verspreid, ook commercieel. Compatibel met GPL, AGPL en de meeste Europese aanbestedingsregels.
Meer dan tachtig besluiten, elk met context, keuze, instellingen en bouwstatus. Je leest wat waarom zo is, en wat nog niet draait.
Dreigingsmodel per flow, misbruikscenario per endpoint, elk met een test. Responsible disclosure via SECURITY.md.
Issues, discussies en pull requests op GitHub. Een CLA houdt de licentie schoon. Elke PR beantwoordt dezelfde zeven reviewvragen.
Rechtstreeks uit GitHub: elke openstaande stap van een besluit is een issue. Wat hier staat is besloten maar nog niet gebouwd.
57 open stappen in 26 besluiten
Elke merge naar main wordt een release candidate op het rc-kanaal. Een release is een getekende image, een SBOM en deze website, in één trein.
Laatste release
Laatste release candidate
Alle releases op GitHub Installatiehandleiding
Bij elke merge naar main en bij elke release wordt deze pagina opnieuw gebouwd met de releases van dat moment. Je browser praat niet met GitHub; dat houdt deze site vrij van derden. Deze pagina is gebouwd uit commit e57030fef97e.
Eén installatiescript, een Let's Encrypt-certificaat en een demo-groep. Of start lokaal met docker compose en loop als elke rol door het portaal.