CleverTech bouwde een multi-tenant huurdersportaal: een SaaS-platform waarin Business Center Altena de eerste organisatie is, opgezet zodat het later voor meer beheerders/verhuurders herbruikbaar is. Het draait als een moderne Next.js 16 / React 19 applicatie met PostgreSQL 17 en Prisma, bovenop een datamodel van bijna veertig modellen.
Het portaal kent vier rollen (platformbeheer, verhuurder, huurder, aannemer) met een rol-bewust dashboard. Een huurder dient onderhoudsmeldingen in met foto's, volgt de status, bekijkt het eigen huurcontract, ziet en betaalt facturen, downloadt documenten en reserveert gedeelde voorzieningen zoals vergaderruimtes. De verhuurder (Henk) beheert panden, units, huurders en aannemers, zet werkorders uit, genereert facturen en servicekosten-verdelingen, beheert de energiemonitoring en plaatst aankondigingen. Aannemers ontvangen werkorders, werken de status bij en leggen kosten vast.
De WhatsApp-stroom is vervangen door een onderhoudsmodule met een statusworkflow (van open tot afgehandeld), interne en externe reactie-threads en SLA-termijnen — zodat elke melding een spoor en een eigenaar heeft.
Het opvallendste onderdeel lost het meterstanden-probleem op met eigen hardware. CleverTech ontwikkelde firmware voor een ESP32-CAM (een goedkope camera-microcontroller, in C++ via PlatformIO). Dat kastje maakt 's nachts — standaard rond 03:00 — een foto van een analoge meter of een hele meterkast en stuurt die via een beveiligde upload naar het portaal. Tussendoor staat het in deep-sleep om zuinig te zijn; bij een mislukte upload bewaart het de foto op de SD-kaart en probeert het de volgende nacht opnieuw.
Aan de serverkant sluit de lus zich volledig:
- De foto komt binnen op een afgeschermd device-endpoint (eigen API-sleutel per meter, gehasht opgeslagen) en wordt opgeslagen in Cloudflare R2.
- Een BullMQ/Redis-job pakt de foto op en laat Anthropic Claude Vision de meterstand van de wijzerplaat aflezen, met een betrouwbaarheidsscore.
- De uitkomst wordt gevalideerd: bij een te lage betrouwbaarheid of een onwaarschijnlijke sprong (een uitschieter) gaat er een alert uit in plaats van een foute stand.
- Bij een meterkast fotografeert een camera meerdere meters tegelijk; de server knipt per meter het juiste gebied uit en leest die afzonderlijk af.
Zo wordt een dom analoog kastje effectief een slimme meter. De afgelezen standen voeden de energiemodule, waarmee de verhuurder servicekosten per huurder kan verdelen op basis van werkelijk verbruik. Voor units met een digitale slimme meter is er een tweede route: het portaal accepteert ook P1/DSMR-telemetrie rechtstreeks als JSON.
Naast de meter-OCR zit er AI-triage op onderhoudsmeldingen: inkomende meldingen worden automatisch ingedeeld op categorie en prioriteit. De boekhouding is gekoppeld via een zelfgebouwde Yuki-integratie (SOAP). Voor de eigen datastroom richting Henks AI-dashboard zijn er HMAC-ondertekende webhooks en een partner-REST-API met gehashte API-sleutels.
Omdat meerdere organisaties op hetzelfde platform draaien, is tenant-isolatie geen bijzaak maar een ingebouwd principe: een Prisma-extensie injecteert automatisch het organisatie-filter op alle queries (over 24 modellen), met Postgres row-level security en middleware als extra lagen. Verder: Auth.js v5 met rollen, een Redis-gebaseerde rate-limiter, eenmalige invite-tokens, gehashte API-sleutels, SSRF-bescherming op webhooks, een volledig audit-log, en een complete CSP/HSTS-set. Het platform is tweetalig (Nederlands als standaard, Engels volledig vertaald) en draait via Docker Compose achter een Plesk-proxy, met een GitHub Actions-pipeline die lint, type-check en build afdwingt voor elke deploy.