Brent Ceulemans
All work

Case 01 · Live product

A snag list that survives the building site

Project-Point is my own product: site registration and project management for the building trade. Points, photos and planning in one place, and a portal where the customer follows along without sitting inside your administration.

Role
My own product — design, build, run
Live at
project-point.be
Built with
Plain JavaScript · esbuild · Supabase · Cloudflare
Shape
Site app, customer portal and marketing site

Context

What it replaced

A snag list on a building site lives in three places at once: photos in a group chat, notes on the back of a delivery slip, and one phone call that never got written down. Everybody has a version, nobody has the version.

The cost shows up at handover. Something was agreed in March, the photo proving it is somewhere in a chat thread with four hundred other pictures, and the argument is no longer about the work — it is about who remembers what.

So the product is not a project management tool that happens to have photos. It is a point: a photo, a mark on that photo, an action, an owner and a status — captured while standing in front of it, on a phone, with gloves on.

Product

What it does

four things, not forty

  • Sites and points

    Per site, what still has to happen. Every point carries an action — follow up, information needed, extra work, price to confirm — and a status you read in one look.

  • Photos you can draw on

    Take the photo on site and mark it immediately: arrow, circle, highlight. The note stays attached to the point, with the name of whoever wrote it.

  • Planning and Gantt

    Work laid out over time, and every site next to each other in one Gantt view — by week, month or quarter.

  • Customer portal

    One link per customer, per site. You decide point by point what they see, and they can answer and add photos of their own.

Engineering

Decisions that mattered

and what the alternative costs

The customer gets in without an account

Access to the portal runs on an email address and a PIN. No registration, no password to forget, no account to manage on either side.

Why not the other way

A customer opens this twice in a year. A registration form is exactly where that person stops, and a portal nobody opens is worth less than an email. The cost is real: without an identity provider you carry link expiry, rate limiting and session scope yourself, and you only get that right by testing it as the wrong recipient.

Visibility is decided per point, not per site

The contractor marks each point as visible or internal. Prices under discussion, remarks about a subcontractor and the note about a dispute stay on the inside.

Why not the other way

A single switch per site forces a choice between hiding everything useful and showing the argument about extra work. Per point is more work to build and it is the only granularity that matches how people actually talk about a job.

Annotating happens at the point, not back at the office

The arrow is drawn on the phone, standing in front of the thing. The photo is stored with the mark, not next to a description of it.

Why not the other way

A photo without a mark is a discussion. Whoever was standing there knows which crack it is about; three weeks later nobody does, including them. Doing it later is cheaper to build and it is the feature that quietly never gets used.

The planning runs across sites, not inside one

The Gantt view puts every running site on one timeline instead of giving each site its own chart.

Why not the other way

Planning one site is not hard — the contractor already has that in their head. The question that costs money is which crew is standing where next Tuesday, and that question is invisible until the sites are drawn next to each other.

Build

How it is built

  1. 01

    No framework

    Plain JavaScript, bundled with esbuild. This app gets opened on a phone on a roof over a bad connection, so every kilobyte is a second of someone standing still.

  2. 02

    The database does the work

    Roughly 180 KB of PL/pgSQL in Postgres: access rules, status transitions and the portal’s view of a site are decided there, not in the client.

  3. 03

    Push, not polling

    Web push, so a new point reaches the person who has to act on it without anyone keeping a tab open.

  4. 04

    Cloudflare end to end

    The marketing site, the app and the portal are served from the edge, which keeps the first paint fast on a site connection and the running cost near zero.

Run the check, read the output, then say it works.