The conflict engine
One half-open predicate over integer minutes with buffers already folded in, running in the drag preview and again inside the write.
A salon board for six staff and fifteen days, where the conflict engine is the product and everything else is chrome around it. Time is integer minutes rather than dates, so two appointments touching at ten o'clock is legal and one minute of overlap is not.
Opens booking.taiphamsolutions.com in a new tab. No account, no signup, and nothing you do in it leaves your browser.
The board is a day of staff columns with appointments, breaks and time off drawn on it. All three are the same shape on purpose, so the engine has exactly one code path and cannot treat one of them inconsistently. Drag an appointment and the ghost turns red the moment it would collide, with the blocking block named and the exact minutes of overlap counted.
Three decisions carry the whole thing. Time is integer minutes since the epoch rather than a date object, so one end equalling another start is exact and snapping to the grid cannot drift. Buffers are folded into the interval before anything is compared, and then one half-open predicate answers, strict on both sides and guarded against empty spans. And the hard block is enforced inside the database transaction rather than in the preview, because between a check and a write another tab takes the slot.
Four roles decide who may do what. Staff may touch their own column only, a manager or an administrator may wave away a soft warning such as a workload cap, and nobody at all may override a hard conflict. A force button would make every other guarantee on the board conditional, so there is not one.
Open the boundary matrix and watch all 37 cases run live in your browser. They execute against the same engine the board uses, so they cannot drift from it.
Six staff, eight services carrying their own prep and cleanup buffers, three rooms, 24 customers, and fifteen days of shifts and appointments around today.
One half-open predicate over integer minutes with buffers already folded in, running in the drag preview and again inside the write.
All 37 boundary cases executed live in your browser against the same engine the board runs on, each with a miniature timeline explaining what it proves.
Six marked appointments on today's board: two touching at the minute, one starting as a cleanup ends, a cancelled booking under a live one, a break, half a day off, and a double booking the engine would never have made.
Staff confined to their own column, soft warnings a manager may wave away, and a hard conflict no role can override.
Every step below happens inside the demo. There is no point in it where the work leaves the browser and comes back.
Staff, service and time. The service carries its own prep and cleanup buffers, and from here they are part of the interval.
The drag ghost turns red as soon as the folded interval overlaps another, and the panel names the block and counts the minutes.
Committing re-reads the world inside a read-write transaction and runs the same function the preview ran, because a preview cannot enforce anything.
Race two tabs onto the same slot and the loser is refused for losing the transaction rather than for being slower.
Every attempt reaches the transaction, so the log holds the refusals as well as the bookings, which are the entries worth having.
Cancelling a booking that already overlaps another is allowed, because an engine must never block the action that resolves the conflict.
There is no server behind any of this, which decides both columns. The left one is what that constraint made worth building properly. The right one is what it rules out.
The write-up sells harder than the application does, so it is on the page rather than in a repository nobody can open.
A demo exists to prove something on the offer list rather than to be impressive on its own. These are the ones this one argues for.
Each one is a different kind of problem, and all of them are in the Demos menu at the top of the page.
This one was built to a constraint nobody would choose. Yours would have a server, real accounts, and the parts of the domain that are actually hard. Tell us what the software has to do and we will tell you what it takes.
Bring the messy version of the problem. That is the conversation we enjoy most.