OpenPlanner

Open source · EUPL-1.2 · WCAG 2.2 AA

Video-afspraken met je team, in seconden geboekt.

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.

Probeer de demo Installeren Bekijk de broncode

0
cookies op deze site en op de boekingspagina
24 u
na het gesprek zijn persoonsgegevens gewist
2
containers en één SQLite-bestand, meer niet

Zo voelt boeken voor een deelnemer

Een echte afspraakpagina, zonder de echte afspraak. Alles werkt met het toetsenbord. Er wordt niets opgeslagen of verstuurd.

Van klik tot gesprek, en alles wat erachter zit

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.

De deelnemer

Het team en de beheerders

Schermopname van de echte interface

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.

Hoe het werkt

  1. 1

    Jij richt een groep in

    Een team is een groep: openingstijden, bezetting per blok, feestdagen, uitzonderingen, teksten en huisstijl. Alles in het beheerportaal, zonder code.

  2. 2

    Je website linkt naar de pagina

    Elke groep heeft een eigen pagina op jouw domein. Of je plaatst de kalender als Web Component midden in je eigen site.

  3. 3

    Het gesprek komt vanzelf binnen

    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.

Alles wat een gesprek nodig heeft, niets wat afleidt

Gebouwd voor teams die veel mensen per video helpen: klantenservice, adviesbalies, intake, helpdesks.

  • Boeken zonder drempel

    Maandkalender, vrije tijden, drie velden. Verzetten of annuleren via een persoonlijke link. Werkt zonder JavaScript en volledig met het toetsenbord.

  • Webex ingebouwd

    Elke afspraak krijgt een eigen Webex-meeting. De deelnemer belt vanuit de browser, zonder app of account; je team stapt in als cohost.

  • Landt waar je team werkt

    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.

  • Nu praten

    Een groep die open is kan een direct gesprek aanbieden, met een plafond op het aantal wachtenden en eerlijke wachtrijfeedback.

  • Multitenant met echte rollen

    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.

  • Groepen als skills

    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.

  • Privacy by design

    Persoonsgegevens staan alleen op de boeking en zijn 24 uur na het gesprek weg. Nooit in logs, URL's, jobs of foutmeldingen.

  • Jouw merk, jouw woorden

    Kleuren, logo en lettertype per organisatie. Elke tekst is aanpasbaar in het portaal. Nederlands en Engels standaard, meer talen mogelijk.

  • Berichten die aankomen

    Bevestiging, wijziging, herinnering en annulering per e-mail (met .ics) en sms. SPF, DKIM en DMARC worden voor je gecontroleerd.

  • Agenda en planner

    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.

Webex Meetings is het hart. De rest sluit erop aan.

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.

OpenPlanner

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 0017

dispatch

Webex Contact Center

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 0018

alerts

Webex Messaging

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 0082

OIDC

Jouw identity provider

Beheerders loggen in via jullie eigen IdP (PingFederate, Keycloak, Entra ID, elke OIDC-provider), per organisatie, met rollen uit de claims.

ADR 0083

kanalen

E-mail en sms

SMTP en een providerneutrale sms-gateway per organisatie. Teksten per kanaal en per groep aanpasbaar in het portaal.

ADR 0022

machine-API

AI-agents en bots

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.md

Waarom we OpenPlanner enterprise-klaar noemen

Niet 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.

Architectuur en bouwblokken

Kanalen

  • Deelnemerspagina's en widget
  • Beheerportaal
  • Machine-API voor bots
  • Worker voor geplande taken

Gedeelde bouwblokken

  • Autorisatiematrix
  • Vertalingen nl en en
  • Instellingenregister
  • Auditlog en events

Domein

  • Boeken en capaciteit
  • Groepen en bezetting
  • Rechten en scope
  • Privacyregels

Pure Python, geen framework, ≥ 90% testdekking

Poorten en adapters

  • VideoProviderWebex Meetings
  • ContactCenterDispatcherWebex Contact Center, eigen wachtrij
  • MessageSenderSMTP, sms-gateway
  • IdentityProviderOIDC: PingFederate, Keycloak, Entra ID
  • EventSinksyslog, Splunk, Elastic
  • TransactionSQLite
De pijlen lopen één kant op. import-linter weigert bij elke pull request een import die deze lagen doorbreekt. Architectuur met diagrammen
  • Eén kern, vervangbare randen

    Een ander contact center of videoplatform is een nieuwe adapter achter een bestaande poort. Domein, schermen en teksten veranderen niet.

  • Afgedwongen, niet afgesproken

    Lagen, typen, rechten en privacyregels worden bij elke pull request gecontroleerd. Wat niet klopt, komt niet op main.

  • Eén bron per onderwerp

    Rechten, instellingen en de structuur van het portaal staan elk op één plek; de documentatie daarvan wordt uit de code gegenereerd.

  • Besluit voor besluit vastgelegd

    Meer dan tachtig ADR's met context, keuze, instellingen en bouwstatus. Een architect leest waarom iets zo is, en wat nog niet draait.

Schaalbaar, eerlijk gezegd

  1. draait nu

    Nu: één host, ruim boven de ontwerpdoelstelling

    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.

  2. draait nu

    Vastgelegde grens

    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.

  3. ontworpen

    Daarna: ontworpen, nog niet gebouwd

    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

Beveiliging en beheer

  • Eén autorisatiematrix

    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.

  • Multitenant, gescheiden per organisatie

    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.

  • Single sign-on, geen omweg

    OIDC met PKCE, state en nonce, alleen asymmetrische algoritmes, sessie van acht uur. Geen lokale accounts, geen break-glass login, bewust.

  • Auditlog dat je kunt doorsturen

    Logins, wijzigingen en weigeringen als gestructureerde events, naar syslog, Splunk of Elastic. Zonder persoonsgegevens.

  • Getekende releases

    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.

  • Een strenge pipeline

    mypy strict, ruff, bandit, semgrep, gitleaks, mutatietesten, schemathesis, OWASP ZAP, Playwright met axe-core en Lighthouse. Alles blokkeert de merge.

  • Licht in beheer

    Twee containers, één SQLite-bestand, HTTPS met automatische certificaten of je eigen proxy. Updates en releasekanaal vanuit het portaal. Back-up is één bestand.

  • Toegankelijk, aantoonbaar

    WCAG 2.2 AA op elke publieke pagina, in elke taal, elke pull request opnieuw getest. Geen tijdslimieten, geen CAPTCHA-puzzels.

  • Configureerbaar, niet hard-coded

    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.

Kwaliteit en standaarden, aantoonbaar

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.

StandaardWat het betekentStatusBewijs
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

Codestandaarden

  • Python 3.12 met volledige typecontrole (mypy strict) en ruff voor stijl en veelgemaakte fouten.
  • Een gelaagde architectuur, afgedwongen met import-linter: het domein kent geen framework.
  • Elke module en functie met een docstring in Google-stijl, leesbaar voor documentatietools.
  • Testdekking ≥ 90% op domein en vertalingen, mutatiescore ≥ 80%, misbruikscenario's als tests.
  • Conventional Commits, één ADR per besluit met bouwstatus, en elke PR beantwoordt zeven reviewvragen.
  • bandit, semgrep, gitleaks, pip-audit en een licentiecontrole bij elke pull request.

Automatisch bijwerken

  • De superuser kiest in het portaal het kanaal: stabiel, of release candidate voor een testomgeving.
  • Een nieuwe versie installeer je met één klik in het portaal, of laat je de installatie zelf doen.
  • De host controleert de handtekening van elke image vóór de update; een ongetekende image draait niet.
  • Renovate houdt afhankelijkheden wekelijks bij, beveiligingsupdates meteen; een PR ouder dan 14 dagen alarmeert.
  • Database-migraties lopen automatisch en zijn altijd terug te draaien.

Open source, open besluiten

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.

  • EUPL-1.2

    Gebruik, wijzig en verspreid, ook commercieel. Compatibel met GPL, AGPL en de meeste Europese aanbestedingsregels.

  • Architecture Decision Records

    Meer dan tachtig besluiten, elk met context, keuze, instellingen en bouwstatus. Je leest wat waarom zo is, en wat nog niet draait.

  • Beveiliging op de voorgrond

    Dreigingsmodel per flow, misbruikscenario per endpoint, elk met een test. Responsible disclosure via SECURITY.md.

  • Bijdragen is welkom

    Issues, discussies en pull requests op GitHub. Een CLA houdt de licentie schoon. Elke PR beantwoordt dezelfde zeven reviewvragen.

Bekijk op GitHub Bijdragen Kwetsbaarheid melden

Roadmap

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

Alle open stappen op GitHub

Releases

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

v0.3.0

Laatste release candidate

v0.4.0-rc.75

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.

Zet 'm vanmiddag op een testserver

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.

Lees de installatiehandleiding Snelstart in de README