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