Skip to content

Lab, Internal tool, in daily use

The one we built without any AI in it.

A small CRM for a one-person studio. It answers, in a couple of seconds, who needs chasing, what is overdue, which proposals are waiting and what to do next. There is no model anywhere in it, because the problem never called for one.

  • 30 Source files
  • 2,822 Lines of code
  • none AI features
  • none Cloud services

The problem

Why there is no AI in this one.

Every enquiry we get about automation starts from the assumption that the answer involves a model. Sometimes it does. Often the honest answer is that the work is not hard, it is just unheld: nobody has written down who is waiting on a reply, so the information exists only in somebody's memory and leaks out of it.

That was the actual problem here. Not summarising, not predicting, not drafting. Just a place where every live client has a stage, a last-contacted date, one next action and a due date for it, and where a client with no next action is visibly flagged rather than quietly forgotten. That is a schema and a sort order, not intelligence.

We include it in the lab precisely because it is the boring one. A studio that sells AI has an obvious incentive to put AI in everything, and the most useful thing we can show a prospective client is a case where we looked at the problem and decided it did not need any. If we would tell ourselves that, we will tell you.

01 / Inside the tool

The whole point of the tool: open it, and the first thing on screen is what is late.

Studio CRM / Today Sample data

3 overdue, 2 due today, 4 proposals waiting on a reply. One live client has no next action set — that is the one that quietly goes cold, so it is flagged here, in the client list, and on the client's own page.

Overdue
3 oldest first
Due today
2
Awaiting reply
4 proposals sent
Active projects
6 in delivery
No next action
1 will go cold
Pipeline
£38,400 weighted by stage, not a forecast

Data notes

Needs attention

  • A live client with no next action is a failure state, not an empty field. It is surfaced in three places so it cannot be scrolled past.

What it will not tell you

  • No lead scoring, no likelihood-to-close, no suggested next step. Those would be guesses dressed as data, and the person doing the work already knows better.

02 / Inside the tool

One ranked list, sorted by a rule you can state out loud: oldest overdue, then due today, then anyone live with nothing scheduled.

Do next ranked across every property Sample data
  • Overdue Riverbank Joinery — call back re: quote overdue

    Why — Follow-up was due 6 days ago. Last spoken to 3 weeks ago, proposal sent and unanswered.

    • due 6 days ago
    • proposal sent
    • stage: proposal
    £6,800 (quoted) confidence medium oldest overdue
  • Due today Northfield Dental — send revised scope due today

    Why — Agreed on last call to send a revised scope by end of today.

    • due today
    • stage: discovery
    unscoped confidence high due today
  • No next action Halden Engineering flagged

    Why — Live client with no scheduled next action. Set one or archive the record — leaving it in this state is how a client goes quiet without anyone noticing.

    • last contact 41 days ago
    • stage: active
    impact unscored confidence low flagged

Every action carries its own history

  1. enquiry
  2. discovery
  3. proposal
  4. active
  5. delivered
  6. dormant
  7. archived

03 / Inside the tool

The design brief, stated as limits. Almost every line here is a feature a commercial CRM would sell you.

What the tool will and will never do. Each limit is enforced in code.
It does It deliberately does not
Store everything in a single local SQLite file Sync to a cloud service, or hold your data on someone else's machine
Bind to 127.0.0.1 by default Become reachable from another machine unless you deliberately change it
Open straight into what is late Ask you to build a dashboard or pick from a widget library first
Flag any live client with no next action Score leads, predict close probability, or suggest what to say
Let you log a call, email, meeting or note in one action Read your inbox or calendar to guess that a conversation happened
Run with no accounts and no login Charge per seat for a database only one person opens
Refuse to seed demo data over a real database Delete anything without printing what it would delete and being told yes

How it is built

The decisions that matter.

  1. 01

    The absence of AI is the decision

    We looked at the problem and it was a record-keeping problem. Adding a model would have introduced a dependency, a cost and a failure mode in exchange for nothing. Knowing when not to reach for it is most of the skill.

  2. 02

    One question, answered immediately

    The tool exists to answer 'who needs chasing' in about two seconds. Everything else is arranged behind that, and any feature that would have slowed the first screen down was not built.

  3. 03

    An empty field can be a failure state

    A live client with no next action is not missing data, it is a client about to go cold. Treating it as an error and surfacing it in three places is the single most useful thing the tool does.

  4. 04

    Sorted by a rule you can say out loud

    Oldest overdue, then due today, then live clients with nothing scheduled. No weighting, no opaque score. If you disagree with the order you can see exactly why it is that order.

  5. 05

    Destructive operations ask twice

    Clearing the database prints what it would delete and changes nothing until you confirm. Seeding refuses outright if real clients already exist.

Transfer

What this has to do with your business.

If you are considering AI for something, this is the shape of the conversation we would rather have first. A good number of the jobs people want to automate turn out to be jobs nobody has written down properly, and once they are written down the automation is a sort order and a flag. That is cheaper to build, cheaper to run, and it does not break in a way nobody can explain.

  • Ask what the actual question is before asking which tool answers it
  • Prefer a rule to a model wherever a rule will do
  • Make the failure state visible rather than inferring intent
  • Keep the data where you can pick it up and take it with you
  • Accept a smaller tool that gets opened over a bigger one that does not

FAQs

Questions, answered.

Why show a tool with no AI in it on an AI page?
Because the most valuable thing a studio in this space can demonstrate is restraint. Anyone can add a model. Deciding a problem does not need one, and saying so when there is money in saying otherwise, is the part you actually want from whoever you hire.
Would you build us a CRM?
Only if you genuinely should not just buy one. Off-the-shelf CRMs are good and cheap, and for most businesses that is the right answer. Building made sense here because the requirement was unusually small and unusually specific. We will tell you which situation you are in.
Could AI be added to it later?
It could, and there is a reasonable case for one thing: drafting the follow-up message once you have decided to send it. That is a genuine writing task. Scoring leads or predicting which client will close would be inventing certainty we do not have, so we would not build it.
Is our data safe in something like this?
This one holds everything in a single local file, binds to localhost, and has no accounts because only one person uses it. That model does not suit every business, and where it does not we will say so rather than pretend a laptop is an architecture.

Start a project

Got routine work worth handing off?

Tell us what eats the most time in your week. We'll tell you honestly whether it's worth automating, and what we'd build first. You'll hear back from Jake directly.

Three questions · about a minute

See the work
What do you need?

Pick any that apply.

How soon?

A rough answer is fine. Nothing here is binding.

Where should we reply?

You'll hear back from Jake within one working day.

By sending this you agree to us using your details to reply. See our privacy policy.