Brent Ceulemans
Al het werk

Case 01 · Eigen product

Een puntenlijst die de werf overleeft

Project-Point is mijn eigen product: werfregistratie en projectbeheer voor de bouw. Punten, foto’s en planning op één plek, en een portaal waar de klant meevolgt zonder in je administratie te zitten.

Rol
Eigen product — ontwerp, bouw, uitbating
Live op
project-point.be
Gebouwd met
Pure JavaScript · esbuild · Supabase · Cloudflare
Vorm
Werf-app, klantenportaal en marketingsite

Context

Wat het verving

Een puntenlijst op een werf zit op drie plaatsen tegelijk: foto’s in een groepschat, notities op de achterkant van een leveringsbon, en één telefoontje dat nooit ergens terechtkwam. Iedereen heeft een versie, niemand heeft dé versie.

De rekening komt bij de oplevering. Er is iets afgesproken in maart, de foto die dat bewijst zit ergens in een gesprek met vierhonderd andere beelden, en de discussie gaat niet meer over het werk — ze gaat over wie zich wat herinnert.

Het product is dus geen projectbeheertool met foto’s erbij. Het is een punt: een foto, een markering op die foto, een actie, een eigenaar en een status — vastgelegd terwijl je ervoor staat, op een gsm, met werkhandschoenen aan.

Product

Wat het doet

vier dingen, geen veertig

  • Werven en punten

    Per werf wat er nog moet gebeuren. Elk punt krijgt een actie — opvolging, info nodig, regiewerk of prijs doorgeven — en een status die je in één blik ziet.

  • Foto’s waarop je tekent

    Maak de foto op de werf en teken er meteen op: pijl, cirkel of markering. De notitie blijft bij het punt staan, met de naam van wie ze schreef.

  • Planning en Gantt

    Werken uitgezet in de tijd, en al je werven naast elkaar in één Gantt-overzicht — per week, maand of kwartaal.

  • Klantenportaal

    Eén link per klant, per werf. Jij bepaalt punt per punt wat hij ziet, en hij kan reageren en zelf foto’s toevoegen.

Techniek

Keuzes die telden

en wat het alternatief kost

De klant raakt binnen zonder account

Toegang tot het portaal loopt via een e-mailadres en een pincode. Geen registratie, geen wachtwoord om te vergeten, geen account dat iemand moet beheren.

Waarom niet andersom

Een klant opent dit twee keer per jaar. Een registratieformulier is precies de plek waar die persoon afhaakt, en een portaal dat niemand opent is minder waard dan een mail. De prijs is echt: zonder identiteitsprovider draag je zelf de vervaltijd van de link, de rate limiting en de reikwijdte van de sessie — en dat krijg je alleen juist door het te testen als de verkeerde ontvanger.

Zichtbaarheid wordt per punt beslist, niet per werf

De aannemer zet elk punt op zichtbaar of intern. Prijzen die nog in discussie zijn, opmerkingen over een onderaannemer en de notitie over een betwisting blijven binnen.

Waarom niet andersom

Eén schakelaar per werf dwingt een keuze af tussen alles nuttigs verbergen en de discussie over meerwerk tonen. Per punt is meer werk om te bouwen en het is de enige fijnmazigheid die past bij hoe mensen echt over een werf praten.

Annoteren gebeurt bij het punt, niet later op kantoor

De pijl wordt op de gsm getekend, staand voor het ding zelf. De foto wordt opgeslagen mét de markering, niet naast een beschrijving ervan.

Waarom niet andersom

Een foto zonder markering is een discussie. Wie erbij stond weet over welke scheur het gaat; drie weken later weet niemand dat nog, hijzelf ook niet. Het achteraf doen is goedkoper om te bouwen en is precies de functie die stilletjes nooit gebruikt wordt.

De planning loopt over werven heen, niet binnen één werf

Het Gantt-overzicht zet elke lopende werf op dezelfde tijdlijn in plaats van elke werf zijn eigen schema te geven.

Waarom niet andersom

Eén werf plannen is niet moeilijk — dat zit al in het hoofd van de aannemer. De vraag die geld kost is welke ploeg volgende dinsdag waar staat, en die vraag is onzichtbaar tot de werven naast elkaar getekend staan.

Bouw

Hoe het gebouwd is

  1. 01

    Geen framework

    Pure JavaScript, gebundeld met esbuild. Deze app wordt geopend op een gsm op een dak met slechte ontvangst, dus elke kilobyte is een seconde dat iemand staat te wachten.

  2. 02

    De database doet het werk

    Ruwweg 180 KB PL/pgSQL in Postgres: toegangsregels, statusovergangen en wat het portaal van een werf te zien krijgt worden daar beslist, niet in de client.

  3. 03

    Push in plaats van pollen

    Web push, zodat een nieuw punt terechtkomt bij wie er iets mee moet, zonder dat iemand een tabblad moet openhouden.

  4. 04

    Cloudflare van voor tot achter

    De marketingsite, de app en het portaal komen van de edge. Dat houdt het eerste beeld snel op een werfverbinding en de vaste kost zo goed als nul.

Draai de check, lees de output, en dan pas zeggen dat het werkt.