A form that checks itself
“a form that won’t let you submit it wrong”
Sample form. Nothing typed here leaves your browser.
Custom Software Development · Ohio
Everything below this line is working software on the page you are reading. Click it, type in it, and break it if you can. Tick the parts that sound like your job and the bottom of the page writes you a description of it, along with an honest account of which of your requirements are the ones that cost money.
What this is
You know exactly what is going wrong in your business. What you probably do not have is the vocabulary for the thing that would fix it, and that gap is why a lot of people never send the email — not because the price frightens them, but because they expect to get on a call and be asked twelve questions they have not thought about.
This page is that vocabulary, handed over as parts rather than as a glossary. Each one has a plain name, the phrase people actually use when they ask for it, a demo you can operate, and one sentence on what building it involves, which is usually not the part you would guess. Read as many as you like. Nothing here costs you anything and there is no point at which you have to identify yourself.
Nothing you type into anything on this page leaves your browser. There is no form, nothing is stored, and no request goes anywhere after the page has loaded, which you are welcome to verify by turning the network off and carrying on.
Ticking a part does not order it and does not commit either of us to a price. It writes a description of a job, and the description is yours to bring to us or to take to somebody else.
The catalogue
The numbering runs 01 to 12 across the whole catalogue and it does not shift as families arrive, so there are gaps in it. A family appears here when every part in it has a demo that genuinely works, because a part with a broken demo would do more damage to the argument than a missing family does. Everything runs on made-up data, and it says so where a reasonable person might wonder.
Capture · getting information in
This is the family people underestimate most, because a form looks like the easiest thing on the list. The actual work is in what happens when it goes wrong: a field left blank, a phone number in a format nobody planned for, a browser closed halfway through a long entry. Getting that right is most of the reason people trust a tool enough to keep using it instead of quietly going back to paper.
“a form that won’t let you submit it wrong”
Sample form. Nothing typed here leaves your browser.
“a wizard — one question at a time”
Three panes, all visible until the script runs.
“only show the bits that apply to me”
All four questions show until the script runs.
“like a quote with as many lines as I need”
| Description | Qty | Each | Line | Row |
|---|---|---|---|---|
| 12 | ||||
| 3 | ||||
| Total units | 15 | |||
Sample data. Each row gets move and remove controls; the total follows every keystroke.
Units, not money — the figures here are sample data and are nothing to do with what anything costs.
“it shouldn’t lose my work”
Kept in this page’s memory only. Nothing is stored and nothing is sent.
“stop me entering the same customer twice”
Try “A. Joinery”, “Corran Metal” or a name of your own.
“they sign it and it’s agreed”
Sample approval. Nothing is recorded anywhere but this page, and it goes when you close the tab.
Draw above or type a name, then approve. Either route records the same thing.
Records · lists, finding things, editing
Almost every tool we build is mostly this. A list, a way to narrow it down, and a way to open one thing and change it without breaking the row next to it. The parts here look plain, and they are where a build quietly succeeds or fails, because a list that is pleasant at fifty rows and unusable at nine thousand becomes somebody’s rescue job three years later.
“a proper list, not a spreadsheet”
| J-1041 | Ardley Joinery | Blue | Invoiced | 12 |
| J-1042 | Bexhill Plant Hire | Green | Scheduled | 4 |
| J-1043 | Corran Metalwork | Blue | In progress | 27 |
| J-1044 | Dunmore Electrical | Red | Quoted | 9 |
| J-1045 | Eastgate Glazing | Green | Done | 15 |
| J-1046 | Fenwick Roofing | Red | Invoiced | 6 |
| J-1047 | Garrick Interiors | Blue | Quoted | 31 |
| J-1048 | Halloway Fabrication | Green | In progress | 18 |
Sample data. Click a column heading, or tab to one and press Enter.
“show me just this month’s, just this crew’s”
| Ref | Customer | Crew | Status |
|---|---|---|---|
| J-1041 | Ardley Joinery | Blue | Invoiced |
| J-1042 | Bexhill Plant Hire | Green | Scheduled |
| J-1043 | Corran Metalwork | Blue | In progress |
| J-1044 | Dunmore Electrical | Red | Quoted |
| J-1045 | Eastgate Glazing | Green | Done |
| J-1046 | Fenwick Roofing | Red | Invoiced |
| J-1047 | Garrick Interiors | Blue | Quoted |
| J-1048 | Halloway Fabrication | Green | In progress |
Sample data. Eight of eight shown.
“the way I always look at it”
Sample data. Views live in this page’s memory and go when you close the tab.
“it shouldn’t take forever with 5,000 rows”
| Ref | Customer | Crew | Units |
|---|---|---|---|
| J-1041 | Ardley Joinery | Blue | 12 |
| J-1042 | Bexhill Plant Hire | Green | 4 |
| J-1043 | Corran Metalwork | Blue | 27 |
Sample data. The script builds five thousand rows and draws twenty — which is the whole point of the element.
“change it right there in the list”
| Ref | Customer | Crew | Units |
|---|---|---|---|
| J-1041 | |||
| J-1042 | |||
| J-1043 |
Sample data. Enter saves, Escape cancels, and the value comes back.
“tick them all and mark them done”
| Ref | Customer | Status | |
|---|---|---|---|
| J-1041 | Ardley Joinery | Invoiced | |
| J-1042 | Bexhill Plant Hire | Scheduled | |
| J-1043 | Corran Metalwork | In progress | |
| J-1044 | Dunmore Electrical | Quoted | |
| J-1045 | Eastgate Glazing | Done |
Sample data. “Mark done” fails on one row on purpose, to show what that looks like.
“one search box that finds anything”
Sample records. Part-words match; the closest match sorts first.
the thing nobody has a word for
Sample customers. Down and Up move, Enter picks, Escape closes.
Numbers · dashboards, reporting, exports
Counting things is the cheap part. What costs money is agreeing what each number means before anybody writes code — whether a job is done when it ships or when it is paid for, whether last month ended on the thirtieth or on the last invoice that went out. Two people in the same company will often answer that differently, and the usual way to discover it is halfway through the build.
“what I add up every Monday”
Sample data. The counting is trivial; the three buttons above are the part that takes a call.
“a graph of it”
The second one costs a button, which is the entire argument for building the first one properly.
“which jobs are those?”
Sample data. Pick a month and the jobs behind the bar appear underneath.
“is it up or down”
Sample data. The word beside the number is deliberate — a colour and an arrow are not enough on their own.
“Monday morning, in my inbox”
Not live. This page has no network access at all, so nothing is sent and no address is collected. The schedule and the four states above are the part I build; getting a message into an inbox is the part that makes this Heavy.
“give me it in Excel”
| Ref | Customer | Crew | Units |
|---|---|---|---|
| J-1041 | Ardley Joinery | Blue | 12 |
| J-1042 | Bexhill Plant Hire | Green | 4 |
| J-1043 | Corran Metalwork | Blue | 27 |
| J-1044 | Dunmore Electrical | Red | 9 |
Sample data. Change a column or a crew and the file above changes with it — that is the whole element.
The page itself · demonstrated, not described
They are this page doing the thing. Keyboard operation, printing, staying readable with JavaScript switched off, working once the network is gone: each one is a claim that costs nothing to make in a sales deck and about ten seconds to check here, so it is made by the page rather than about it.
One of them is deliberately missing. The home page lets you choose light, dark or system, and this page does not, because the colours it uses for structure cannot be read on a white ground. That is measured rather than assumed, and the honest fix would be an entirely different set of colours rather than the same ones nudged darker, so this page commits to one palette and says why instead of shipping a switch that quietly produces an unreadable version of itself.
“some of my staff never touch the mouse”
Put the mouse down and press Tab. This reads back whatever has focus, anywhere on the page.
“I still print things”
The button opens your own browser’s print dialogue and nothing else happens. Close it again when you have looked.
Counted from this document’s own stylesheets.
“it shouldn’t stop when the wifi does”
Turn your wifi off and press the button. Everything on this page keeps working, because after the first load it has nothing to ask anyone for.
Read from the browser’s own network log for this document.
“it should still work in whatever they’re running”
Standard · the suggest-box, keyboard-operable, with a good “nothing matched”.
This paragraph is in the HTML. Everything the script adds goes below it.
That block is a working copy of an element from the catalogue above.
You can check this without trusting the button: turn scripting off in your browser and reload. The catalogue is still a list you can read; the brief builder is simply not there.
“one of my staff can’t read pale grey text”
The quick brown fox jumps over the lazy dog.
And the same sentence at the small size this page uses for notes.
The two lists hold this page’s real colours, read out of the stylesheet as it is running.
“it shouldn’t take ten seconds to open”
Your machine, your connection, this visit. A number measured on a developer’s laptop is not a claim about anything.
Read from the browser’s own timing record.
How the price is worked out
If you read one section on this page and skip the rest, read this one. Anybody who prices a build by adding up a feature list is either guessing or padding, because the second table in a system costs a fraction of the first and the fifth chart is close to free. Five things drive what a small build costs, and three rules explain why the arithmetic bends.
The first one is the expensive one.
The first table in a system settles how information is stored, how it is loaded, how it is edited and what happens when two people change the same row at once. Everything after it inherits all of that. So within a family, the first couple of things you tick count in full and the rest count as variations on work that has already been paid for.
Things we do not control never get cheaper.
Every outside system is its own separate unknown. Its documentation is a version behind, it has an opinion about how often you may ask it questions, and it changes on a Tuesday without telling anybody. The second one is not easier than the first, because it belongs to a different company. These do not discount, and a build with three of them in it is a different animal from a build with one.
Money and identity are about care, not code.
Payments, logins and permissions are not more lines of code than a list is. They are more care — more thought about what happens when something half-works, more checking, more attention to the edge case that turns up once a year. The care is the cost, and it is the thing we will not trim to hit a number.
Four possible answers, and they are the same bands published on the front page. There is nothing here that has not already been committed to in public.
from $900
A small job
Everything you ticked is a variation on something else in the same family, nothing has to talk to a system we do not control, and no money or login is involved.
$1,500–$3,500
An ordinary project
The common case, and where most of this work lands. One demanding piece, or several ordinary ones, and at most a couple of outside systems.
No figure
A larger engagement
Two or more demanding pieces, or three or more outside systems, or money and logins and roles all at once. These are quoted exactly the same way: fixed scope, fixed price, agreed in writing before work starts. They are quoted from a conversation rather than from a list.
No band at all
Needs a conversation
Some things cannot be priced off a list, and when you tick one the page says so rather than guessing. Working offline on a phone with no signal is the usual example. It still goes in your brief, because the brief describes the job rather than filtering it.
One property of those four is worth knowing before you start ticking. Adding parts can move you up a band, or out of banding altogether, and nothing you can do moves you the other way. You cannot game it, which is mostly a protection against arriving at a call believing you have.
Then the page proposes a first phase instead of shrugging at you, and here is the rule it uses so you can check its work. A first phase is the foundations — how information gets in, where it lives, and who is allowed to see it — plus the single most valuable thing you would do with it. Everything else becomes a second project, and it is genuinely cheaper by then, because the first one paid for the floor it stands on. Knowing what to build first is the skill most people hiring a developer have never had a reason to learn, and it is worth more to you than the estimate is.
A shop that quotes work in a spreadsheet and wants the quote, the job and the invoice to live in one place. We have built versions of this more than once. Here is what the five drivers say about it.
Most of the parts in that job are variations on the same three records, so the count of parts is not what decides it. The two drivers that do not get cheaper with practice are the accounting integration and the money, and those are why this sits at $1,500–$3,500 rather than in the band below. Take the accounting integration out and it moves. Add two more outside systems and it stops being a fixed-price project.
Choosing parts needs JavaScript, which is switched off in this browser. The catalogue above is the complete list either way, and the worked example under How the price is worked out shows what this section does with a selection.
Half an hour, no charge, and nobody is going to try to talk you into anything. Describe what’s going wrong and roughly how it gets handled today, and you’ll get a straight answer on whether software is even the right fix, and what it would run you if it is.