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.
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.
- Overdue
Riverbank Joinery — call back re: quoteoverdueWhy — 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 scopedue todayWhy — 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 EngineeringflaggedWhy — 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
- enquiry
- discovery
- proposal
- active
- delivered
- dormant
- archived
03 / Inside the tool
The design brief, stated as limits. Almost every line here is a feature a commercial CRM would sell you.
| 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.
- 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.
- 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.
- 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.
- 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.
- 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
Where this leads
The engagements this work sits under.
- AI adoption Useful, low-risk automation around your website, content, admin, and reporting.
- Custom software Custom software, internal tools, and AI assistants for one business.
- AI CRM Bespoke lightweight CRM and pipeline tools shaped around how your team sells.
- Internal reporting Dashboards, digests, and workflow routing that take reporting off the team.
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