Derivation you can open
Every on-hand figure drills into the movements that produced it, with a running balance column that ends on exactly that number.
Forty parts across twelve locations, with up to 50,000 stock movements generated in front of you. On-hand is written down nowhere. It is a fold over the ledger, and one button re-folds the whole thing and reports the difference.
Opens warehouse.taiphamsolutions.com in a new tab. No account, no signup, and nothing you do in it leaves your browser.
A stock figure opens into the movements behind it, with a running balance whose last row is the number on the screen before. The ledger has no edit control and no delete control anywhere, because the only correction available is a reversal that points back at what it reverses. Every row carries actor, role, timestamp and reason, which is what makes the audit page a query rather than a feature.
Folding 50,000 rows on every render is not viable, so there is a stored balances projection, and it is handled in the open rather than hidden. It is written inside the same transaction as the append that produced it, it records the sequence it is valid up to, and Rebuild and verify re-folds the entire ledger from the movements store rather than from any cache, then reports rows, milliseconds and any disagreement. The disagreement is zero, and the test suite asserts the same equivalence for random streams written in interrupted batches.
Four roles are enforced in the command layer rather than in template conditions. An operator posting an issue larger than the bin holds is blocked and told what the resulting balance would have been. A supervisor may override that with a written reason, and the override lands in the audit trail. A counter counting blind never receives the expected quantity at all, because it is stripped before the data reaches the screen rather than hidden once it is there.
In Admin, tamper with a row behind the application's back, then verify the ledger chain. It goes red and names the sequence where the chain breaks.
40 items across 12 locations, 8 people in four roles, and a year of activity at 1,000, 10,000 or 50,000 movements, generated on first open.
Every on-hand figure drills into the movements that produced it, with a running balance column that ends on exactly that number.
No edit and no delete. Each row stores a digest of the row before it, so a record changed outside the application is both detectable and locatable.
Count without expected quantities, submit, review as a supervisor, accept or send back for a recount, and post only accepted lines as adjustment movements.
Accuracy, valuation and worst offenders, with net and absolute variance reported apart, because plus forty in one bin and minus forty in the next nets to zero and is still a problem.
Every step below happens inside the demo. There is no point in it where the work leaves the browser and comes back.
1,000, 10,000 or 50,000 movements, built in a worker so the page stays interactive while the progress bar moves.
A receipt, an issue or a transfer. A transfer is two legs that sum to zero, and a refused one leaves neither leg behind.
The append and the balance it changes are one transaction, so the ledger and the cache cannot diverge across a crash.
An issue larger than the bin holds is refused. Only a supervisor may proceed, only with a reason, and the reason is part of the record.
A blind count is submitted, reviewed line by line, and posted as adjustment movements referencing the session. A line nobody accepted stays visible as an unresolved variance.
The whole ledger is re-folded from the movements store and diffed against the projection, with the row count, the time it took, and any disagreement on screen.
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.