Blinds Measure
Recess blind sizing for a house full of windows
- The tightest point sets the size
- Out of square, drawn not described
- Built while measuring the house it was for
I moved into a new house that needed blinds in every room, and I spent an evening walking round with a tape measure and my phone's notes app. Six numbers per window — three widths, three heights — and by the third room the note was an undifferentiated wall of digits. I could no longer tell which figures belonged to which window, so the next day I started again.
Blinds Measure is the thing I should have had on that first evening. Houses contain rooms, rooms contain windows, windows carry six measurements, and the app gives you back the size to order.
The tightest point sets the size
A recess blind hangs inside the opening, so it has to clear the narrowest point of that opening. Recesses are rarely square — plaster bows, frames settle, sills are not level — which is why you measure the width at the top, middle and bottom, and the height at the left, centre and right. The size you order is the smallest of each. Order to the average and the blind jams on the way down.
The rule itself is a Math.min over each trio, and it is about six lines with a test to hold it
in place. Making it visible was the interesting part.

Drawing the window
Every measurement form I have used treats six numbers as six numbers. But the six describe a shape, and a shape can be drawn — so the add-window form draws it, to scale, as you type: an outline of the recess with the widths stacked as dimension lines underneath it and the heights down the left, the governing measurement in accent with arrowheads, the other four muted.
A window out of square comes out visibly out of square. That immediately raised an honesty problem: 4mm of bow on a 1200mm window is a third of one percent, and at true scale it is invisible — an accurate drawing that shows you nothing. So deviation from the governing figure is amplified, and capped so one mistyped entry cannot distort the drawing beyond the frame. A diagram that exaggerates silently is a lying diagram, so it says "deviation exaggerated" whenever it is doing it, and the real figures are always printed on the lines.

The geometry lives in a pure function with no Vue and no DOM in it, and the component is a few dozen lines of SVG over the top. Boundaries symmetric about the centre, each edge a three-point profile, so the outline pinches exactly where the measurement is tightest.
The shape of the thing
A Vue 3 SPA with Pinia over a Fastify API and Postgres. The SPA and the API build into a single
image — the API serves the built frontend — with Postgres alongside it, so the whole thing comes up
on one docker compose up. Results export as CSV, or print as an order sheet — title block, rooms
grouped, tabular sizes, and the out-of-square warnings carried through as text, because a supplier
needs to know that.

Authentication is the part worth mentioning, because there isn't any. The app sits behind a Cloudflare tunnel with an Access policy in front of the hostname, and has no login of its own. That is a real decision rather than a shortcut, and it is only safe under conditions that are easy to break by accident later — so the README states them: never publish the origin port, never add a second ingress that bypasses Access, and add app-level auth first if it ever moves off the tunnel. A security posture you cannot see is one you will violate in six months.
It is the smallest thing on this page, and it exists because measuring a houseful of windows into a notes app is a genuinely bad way to spend an evening.