Custom Software Development · Ohio

The parts, running, so you can point at the ones you need.

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

Most people can describe the problem and not the thing.

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

Grouped by what they do.

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

Somebody has to type it in first.

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 checks itself

“a form that won’t let you submit it wrong”

Nothing submitted yet.

Sample form. Nothing typed here leaves your browser.

The fields are an afternoon. The cost is deciding what counts as wrong, saying so in words rather than red boxes, and keeping what was typed when something fails.

A multi-step flow

“a wizard — one question at a time”

  1. 1 · Site
  2. 2 · Work
  3. 3 · Check
Site
Work

Three panes, all visible until the script runs.

Splitting is easy; the work is letting someone leave in the middle and come back, going backwards without losing answers, and knowing what “finished” means.

Questions that depend on answers

“only show the bits that apply to me”

What kind of visit

All four questions show until the script runs.

The branching itself is small. The expense is that hidden answers must not silently count, and every path has to be walked before it ships.

Line items you can add rows to

“like a quote with as many lines as I need”

DescriptionQtyEachLineRow
12
3
Total units15

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.

Adding rows is trivial. Reordering, deleting the middle one, totalling, and keeping it usable on a phone are not.

Saving as you type

“it shouldn’t lose my work”

Idle

Kept in this page’s memory only. Nothing is stored and nothing is sent.

Cheap to add, and it changes the feel of the whole tool. Worth asking for.

Catching duplicates at entry

“stop me entering the same customer twice”

Try “A. Joinery”, “Corran Metal” or a name of your own.

The sample customers it is matching against

    Matching people and companies is fuzzy work: initials, trading names, typos. The right behaviour is to warn, not to block.

    A signature or an approval

    “they sign it and it’s agreed”

    Sample approval. Nothing is recorded anywhere but this page, and it goes when you close the tab.

    Nothing drawn

    Draw above or type a name, then approve. Either route records the same thing.

    Drawing the signature is the small part. Recording who agreed to what and when, so it still means something a year later, is the job.

    Records · lists, finding things, editing

    Then somebody has to find it again.

    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 table you can sort

    “a proper list, not a spreadsheet”

    J-1041Ardley JoineryBlueInvoiced12
    J-1042Bexhill Plant HireGreenScheduled4
    J-1043Corran MetalworkBlueIn progress27
    J-1044Dunmore ElectricalRedQuoted9
    J-1045Eastgate GlazingGreenDone15
    J-1046Fenwick RoofingRedInvoiced6
    J-1047Garrick InteriorsBlueQuoted31
    J-1048Halloway FabricationGreenIn progress18

    Sample data. Click a column heading, or tab to one and press Enter.

    Sorting is nearly free. What costs is the long list — see pagination below.

    Filters

    “show me just this month’s, just this crew’s”

    Crew
    Status
    RefCustomerCrewStatus
    J-1041Ardley JoineryBlueInvoiced
    J-1042Bexhill Plant HireGreenScheduled
    J-1043Corran MetalworkBlueIn progress
    J-1044Dunmore ElectricalRedQuoted
    J-1045Eastgate GlazingGreenDone
    J-1046Fenwick RoofingRedInvoiced
    J-1047Garrick InteriorsBlueQuoted
    J-1048Halloway FabricationGreenIn progress

    Sample data. Eight of eight shown.

    The cost is combinations, empty results that explain themselves, and making a filtered view something you can send to somebody.

    Saved views

    “the way I always look at it”

    • No views saved yet. Set the three above and name it.

    Sample data. Views live in this page’s memory and go when you close the tab.

    Almost free once filters exist. A good example of a feature that is only cheap in the right order.

    Pagination, or a list that keeps loading

    “it shouldn’t take forever with 5,000 rows”

    RefCustomerCrewUnits
    J-1041Ardley JoineryBlue12
    J-1042Bexhill Plant HireGreen4
    J-1043Corran MetalworkBlue27
    Rows 1–3

    Sample data. The script builds five thousand rows and draws twenty — which is the whole point of the element.

    This is the one that decides whether the tool is still usable in year three. Getting it wrong is a rescue job later.

    Editing in place

    “change it right there in the list”

    RefCustomerCrewUnits
    J-1041
    J-1042
    J-1043

    Sample data. Enter saves, Escape cancels, and the value comes back.

    Every cell becomes a small form: what saves, what cancels, what happens when two people edit the same row.

    Doing something to fifty rows at once

    “tick them all and mark them done”

    RefCustomerStatus
    J-1041Ardley JoineryInvoiced
    J-1042Bexhill Plant HireScheduled
    J-1043Corran MetalworkIn progress
    J-1044Dunmore ElectricalQuoted
    J-1045Eastgate GlazingDone
    Nothing selected

    Sample data. “Mark done” fails on one row on purpose, to show what that looks like.

    Selection is easy. Undo, partial failure, and “are you sure” on the destructive ones are the actual work.

    A picker that suggests as you type

    the thing nobody has a word for

    Sample customers. Down and Up move, Enter picks, Escape closes.

    The suggest-box. Keyboard operation, a good “nothing matched”, and adding a new one without leaving the form. Genuinely fiddly, and it is in nearly every tool.

    Numbers · dashboards, reporting, exports

    The screen somebody looks at on Monday morning.

    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.

    The numbers on one screen

    “what I add up every Monday”

    A job counts as finished when it is
    Finished this month3
    Still open5
    Units delivered33
    Oldest open job31 days

    Sample data. The counting is trivial; the three buttons above are the part that takes a call.

    The counting is easy. Agreeing what each number means — is a job “done” when it’s finished or when it’s paid — is the part that takes a call.

    A chart

    “a graph of it”

    Jobs finished per week, most recent last — sample data

    The second one costs a button, which is the entire argument for building the first one properly.

    Cheap once the numbers exist. The second and third chart are nearly free, which is a good illustration of how the price is built.

    Clicking a chart to see what’s behind it

    “which jobs are those?”

    Sample data. Pick a month and the jobs behind the bar appear underneath.

    The feature that turns a dashboard from decoration into a tool. Worth the money.

    This month against last

    “is it up or down”

    Jobs finished — Aug19
    Jul26
    Change−7 down

    Sample data. The word beside the number is deliberate — a colour and an arrow are not enough on their own.

    Comparison periods, once one period works.

    A report that arrives by email

    “Monday morning, in my inbox”

    What would go out
    
          
    Show the states that actually cost money

    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.

    Scheduling is easy; email delivery is somebody else’s infrastructure and is never as cheap as it sounds.

    Export that matches what’s on screen

    “give me it in Excel”

    RefCustomerCrewUnits
    J-1041Ardley JoineryBlue12
    J-1042Bexhill Plant HireGreen4
    J-1043Corran MetalworkBlue27
    J-1044Dunmore ElectricalRed9
    The file, exactly as it would come out
    
          

    Sample data. Change a column or a crew and the file above changes with it — that is the whole element.

    Nearly free, and it is also an ownership promise: your data leaves whenever you want.

    The page itself · demonstrated, not described

    These are not demos of anything.

    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.

    Operable entirely by keyboard

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

    Focus is on
    nothing yet — press Tab
    Which reads as
    not measured yet
    Outline drawn
    not measured yet
    Last key
    not measured yet
    and a link

    Free if it is done from the start, and a rebuild if it is not: every custom control has to earn back the behaviour a plain button had for nothing.

    Prints properly

    “I still print things”

    Stylesheets on this page
    not measured yet
    Rules written for paper
    not measured yet
    Page-box rules
    not measured yet

    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.

    A second, much simpler layout that only exists on paper — and somebody has to remember it exists when the screen one changes.

    Works with the network off

    “it shouldn’t stop when the wifi does”

    Requests to load the page
    not measured yet
    Requests since it loaded
    not measured yet
    Third-party hosts contacted
    not measured yet
    Browser thinks you are
    not measured yet

    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.

    Free when a page holds nothing back for later, and a real piece of work when it does — which is why this one is on the list rather than assumed.

    Readable with JavaScript disabled

    “it should still work in whatever they’re running”

    A picker that suggests as you type

    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.

    Building the plain version first and treating the script as an improvement, rather than writing the clever one and bolting on a fallback nobody tests.

    Contrast measured, not guessed

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

    Measured ratio
    not measured yet
    Normal text, 4.5:1
    not measured yet
    Large text and controls, 3:1
    not measured yet
    The stricter bar, 7:1
    not measured yet

    The two lists hold this page’s real colours, read out of the stylesheet as it is running.

    Measuring is the cheap half. Fixing what the measurement finds, in a palette somebody has already approved, is the half that takes the time.

    Loads in under a second on a phone

    “it shouldn’t take ten seconds to open”

    Time to first paint
    not measured yet
    Page ready to use
    not measured yet
    Everything finished
    not measured yet
    Bytes over the wire
    not measured yet
    Files fetched
    not measured yet

    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.

    Mostly restraint rather than optimisation: the fast version is the one with nothing in it that did not need to be there, and every dependency added later has to argue for itself.

    How the price is worked out

    Software cost is not the sum of its features.

    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 five things that drive it

    Records
    How many different kinds of thing does the system have to hold? Customers, jobs, invoices and materials are four kinds. Two hundred customers is not two hundred kinds, it is one, and that difference is the single most common misunderstanding we have to unpick on a first call.
    Outside
    How many systems does it have to talk to that we do not control? Your accounting package, a card processor, whatever actually sends the email. Each one is somebody else’s software with its own login, its own limits and its own release schedule.
    Consequence
    Is money or somebody’s identity involved? A tool that shows the wrong total is embarrassing and fixable in an afternoon. A tool that shows one customer another customer’s invoice is the kind of thing that ends a relationship, so that code gets written more slowly and checked more times, and you are paying for the checking.
    Surfaces
    How many places does the same information have to appear? A list on a laptop, a chart, a printed sheet and a phone in a truck are four surfaces, and each has its own idea of what counts as the same information.
    Mess
    How much of what you already have has to come across? A spreadsheet somebody has kept tidy moves over without much drama. Eleven years of one, with merged cells and a tab called do not use, does not, and nobody can tell you which of the two you have until the file is open.

    The three rules that bend the arithmetic

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

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

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

    Where a selection lands

    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.

    And if it comes out bigger than you hoped

    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.

    The method, worked through on a real shape of job

    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.

    Kinds of record
    3 customers, jobs, invoices
    Outside systems
    1 the accounting package the invoices land in
    Money or identity
    yes invoices, and a login for each person
    Surfaces
    3 a list on a laptop, a printed job sheet, a phone in a truck
    Existing data to absorb
    yes the spreadsheet it has all been living in

    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.

    What you picked, and what it means.

    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.

    Tell us what’s broken.

    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.