001 Software care
We fix the
software
your business
runs on.
The system that takes your orders, books your appointments or holds your customer records. If it still works but nobody maintains it anymore, that’s the thing we fix.
The short version
- What we do
- Repair, secure and modernize software that already has users Audits, security work, migrations, and monthly care afterwards
- Who calls us
- Owners of business software nobody maintains anymore The system still runs. The person who understood it is gone
- Also in scope
- The front end, the hosting, and the move off either React and the rest of it included, when that is what the system needs
- Not our work
- A new product from scratch, marketing sites, design
- Start here
- Write and tell us what breaks A written reply within one business day, from an engineer
002 Is this you
You don’t need to know what’s wrong. Just pick the sentence that sounds familiar.
003 What's actually going on
Software goes bad even when nobody touches it.
Still in use, no longer receiving security fixes
- Magento 1
- past end of life for 6 yrs 2 mths since June 2020
- PHP 7.4
- unpatched for 3 yrs 9 mths since November 2022
- Joomla 3
- past end of life for 3 yrs 1 mth since August 2023
- Node 16
- unpatched for 3 yrs since September 2023
- MySQL 5.7
- past end of life for 2 yrs 10 mths since October 2023
- PHP 8.0
- unpatched for 2 yrs 9 mths since November 2023
- CentOS 7
- past end of life for 2 yrs 2 mths since June 2024
- Python 3.8
- unpatched for 1 yr 11 mths since October 2024
- Drupal 7
- past end of life for 1 yr 8 mths since January 2025
- PHP 8.1
- unpatched for 8 mths since December 2025
Your system didn’t change. Everything underneath it did.
Software is built on other software — the language it’s written in, the pieces other people wrote, the server it sits on. All of those get security fixes for a few years, and then the people who made them stop. Your system keeps working. It just stops being protected.
Most owners find out in one of three ways. Your insurance company asks a question on the renewal form. A customer’s IT department sends you a security questionnaire before signing. Or somebody gets in, and you find out last.
None of that means your business is badly run. It means the one person who used to watch this is gone, and nobody replaced them.
004 What we do
We look, we tell you in plain English, then we fix it — in that order.
Nothing gets rebuilt from scratch. Your system knows how your business works. We keep that and replace what’s rotten underneath it.
What each stage costs you in time
- Audit
- Five business days Written report you own
- Safe to touch
- Two to three weeks Backups, alarms, a test copy
- Migration
- Quoted from the audit One number, it does not grow
- Downtime
- None so far Switch-overs at night, with a way back
- Your web addresses
- Unchanged Nothing you built up in search is lost
-
We look first
Five days. We read the code, the server and the history. You get a written report: what’s there, what’s dangerous, what it would cost to fix, ranked by what it’s costing you now. Plain language, no jargon.
-
We make it safe to touch
Backups that actually restore. Alarms that tell us before they tell you. A copy of your system where changes can be tested without customers seeing them. Most businesses in this position have none of these three.
-
We move it somewhere modern
Off the old server, onto proper cloud hosting with a shield in front of it. Your web addresses stay exactly the same, so nothing you’ve built up in Google is lost. Done at night, with a way to undo it.
-
We bring it up to date
Step by step, each one live and checked before the next. Not one big scary switch-over. If something’s wrong we’re one small step back, not a month back.
-
We keep watching it
Monthly. Patches, updates, the old bugs everyone gave up on, and one page each month telling you what got blocked and what got fixed. If it goes down at 3am, the alarm comes to us.
If your system has to reach pharmacies or prescribing networks, there is a separate page on Surescripts, ScripSure and pharmacy ordering.
005 What happens if you write to us
Here’s the whole thing, so nothing surprises you.
- Right now You send the form
Your address, what’s going wrong in your own words, how to reach you. That’s it.
- Day 1 You get a written reply from a person
Not a brochure. What we think is happening, what we’d check first, and whether we’re the right people for it. If we’re not, we’ll tell you who is.
- Day 2 You decide about the audit
$2,400, fixed. If you say no, nothing further happens — no follow-ups, no reminders, no sequence. You’ll never hear from us again unless you write.
- Day 3–7 The audit
We work. You don’t have to do anything except give read access.
- Day 8 The report, and a fixed price
Everything we found, and exactly what fixing it costs. One number, not a range that grows later.
- Then You choose
Hire us, hire your own people using our report, or do nothing. All three are real options and we’ve had clients pick each one.
006 The obvious question
“What if you disappear too?”
You got burned once. Here’s how this is built so it can’t happen the same way twice.
-
Everything lives in accounts you own
Your cloud account, your code repository, your domain, your card on file. We get invited in. We’re never the owner. If we vanish tomorrow you lock the door and keep everything.
-
Every change is written down
Not in our heads. Every edit is recorded with a note explaining why, in a place you control, that any other developer can read.
-
You get a handover document
How your system works, where everything lives, how to deploy it. Written so a new developer can pick it up in a day. Updated as we go, not promised at the end.
-
Monthly, cancel any month
No annual lock-in, no notice period, no cancellation fee. If we stop earning it, you stop paying. That’s the only guarantee that means anything.
007 Work we've done
What the work actually looks like, in detail.
-
The server that could not be updated
The single machine the whole company worked on had gone three years without a security update, because updates for it had stopped being made. It had never been restarted in almost three years, its main disk was 96% full, and its login had recorded more than forty-five thousand failed attempts. The software moved to hosting that can be kept current, exactly as it was, and the old machine was checked, emptied and switched off for good.
- Found
- Three years without a security update, and no way to get one
- Now
- The same software, running where updates are still published
3 yrsSince the last security fix45,878Failed login attempts0Lines rewritten -
640 GB with no second copy
Every customer file the company held — uploads, documents, signed agreements going back years — lived on one machine and nowhere else. An old routine that was supposed to copy them elsewhere had been failing into a destination that no longer existed. The first thing the migration did was make a second copy, which was also the first real backup this data had ever had; today it sits under a daily backup with restore points kept for three months, and a restore has been performed rather than assumed.
- Found
- The only copy of every customer file was on one machine
- Now
- Copied, verified, and backed up daily with tested restores
640 GBWith no second copy3Kinds of file at risk36Restore points today -
Screens that took half a minute
The lists staff live in — their own work, their own clients, this month's payments — were reading entire tables from top to bottom on every single load, because the software had no quick way to find the rows belonging to one person. One of those lists also re-counted a table of 829,000 rows once for every row it displayed. Nobody had reported it, because it had always been that way and slow is not the same as broken.
- Found
- Six of the busiest lists read every row in the table, every time
- Now
- Direct lookups instead of full scans, and one count instead of thirty
829kRows re-counted per screen6Lists doing full scans0Features changed -
A public form that handed its records back
A form collecting names, dates of birth and contact numbers had a second behaviour nobody had asked for: the address that accepted a submission would also list the submissions back, 3,788 of them, to anyone who knew how to ask. It was closed in the software itself rather than by unticking a permission, so that no future settings change can re-open it, and the now-meaningless permission was deliberately left in place as a second lock.
- Found
- The form's own address would list every record it had ever taken
- Now
- Reading removed in code, so no setting can turn it back on
3,788Records reachable1Way in, closed in code0Settings left to trust -
Somebody was copying the whole directory
The public directory that the business exists to publish could be extracted in its entirety in about sixteen requests, because a single page request could be persuaded to return more than a thousand records at once. Automated traffic was doing exactly that, on a schedule. A guard now limits how much one request can pull, the edge blocks the pattern rather than counting it, and every real page on the site was replayed before and after to prove nothing a visitor does was affected.
- Found
- The whole directory extractable in about sixteen requests
- Now
- Bulk copying priced out, ordinary browsing untouched
16Requests to take everything1,167 → 24Records per request0Pages broken -
Updates that stopped signing everyone out
Releasing a change logged every user out and lost whatever they had half-finished, so releases were pushed to evenings and then postponed, which made each one bigger and riskier than the last. Sign-in state now lives outside the software, two copies always serve, and a release swaps them one at a time with an automatic undo if the new one misbehaves. Releases happen in the middle of the working day and nobody in the office can tell.
- Found
- Every release signed all staff out and lost work in progress
- Now
- Releases mid-morning, nobody signed out, automatic rollback
0People signed out by a release2Copies serving at all times1Automatic undo, no human -
Which payment system the money runs through
Four payment providers were installed on a store that had taken more than 160,000 orders, and the plan was to rebuild the ones people remembered. One query over three years of orders showed that a single provider carried 94% of revenue and 98% of active subscriptions, while the one everybody named carried about two per cent. The same query surfaced the expensive part nobody had costed: the stored card details behind every recurring customer live with that provider and have to move with it.
- Found
- The rebuild order was being decided from memory, not from the ledger
- Now
- One query, an afternoon, and a plan built on the actual numbers
94%Of revenue on one provider4Providers installed1Afternoon to find out -
One customer could see another's records
One database served many separate customer organizations, under a rule that has to hold in every single place: organization A never sees organization B. Fifteen places in the software returned records without checking which organization was asking, clustered exactly where you would expect — in detail views and in listings written before the platform had more than one customer. Nothing crashed and nobody reported it, which is what makes this class of gap almost impossible to catch by reading changes as they go by.
- Found
- Fifteen places returned records without checking who was asking
- Now
- One rule, asked at every point a record is handed out
15Places without the check1Rule, applied everywhere0Reports from users -
Anyone could say an order had shipped
Six outside systems sent automatic updates into the platform, and two of them were believed without question — the code that verified senders ended in a fallback that answered "valid" for anything it did not recognise. Nobody could have read records this way; they could have written false ones, which is quieter and more expensive to unpick. Verification went in over three stages so the platform never went down, and twenty-eight tests now cover forged and replayed messages.
- Found
- The sender check ended in a fallback that answered "valid"
- Now
- Every sender verified on arrival; an unknown sender is refused
6Systems sending updates2Believed without proof28Tests added -
The feature broken for years
Two live paths in the software referred to parts of the system that no longer existed, left behind by a rename during an old restructure. One of them checked whether a component was available, found it was not, and returned an error — on every single request, for years. There were no bug reports, because people had quietly stopped trying. The references were corrected, the genuinely unwanted path was deleted rather than repaired, and the build now refuses a name that does not resolve.
- Found
- Live code referring to parts of the system that no longer existed
- Now
- References corrected, dead paths deleted, the build now catches it
503Returned, every time0Bug reports2Kinds of broken -
Personal details in the error logs
When a request failed, the software recorded the whole request so somebody could understand it later — which meant names, dates of birth and everything else the form carried, written into a file with weaker access control than the database it came from. A second, quieter version of the same problem was writing straight to disk, invisible to the logging settings entirely. One filter now sits on the single path every error already takes, and sixty-four tests keep it honest.
- Found
- Failing requests wrote whole request contents into the log
- Now
- One filter on the path every error takes, with tests
1Place it is decided0Rules to remember64Tests on the filter -
Live passwords in the source code
The production database password, a payment provider key, mail credentials and several partner keys were sitting in files inside the code — and therefore in its history, in every copy anyone had ever made, and in every backup of those copies. Moving them into a managed store took about a day. The half that takes longer is rotation: until each value is reissued, the old ones are still live wherever they were copied, and that is the part this write-up refuses to round up.
- Found
- Live credentials in tracked files, plus a backup copy of one
- Now
- Values injected at run time from a managed store, never in the code
1Day to move them0Credentials left in the codeEveryCopy still holds the old ones
Every write-up is anonymized and every one of them says what we would do differently. All of the work.
008 What it costs
You shouldn’t have to book a call to find out the price.
The audit fee comes off the migration price if you go ahead. If you don’t, you still keep the report. Why isn’t the migration price listed? Because anyone who quotes a migration before reading your code is guessing — and guessers come back later asking for more.
009 Honest limits
Things we don’t do, so you don’t waste a week finding out.
Scope, in one screen
- Systems
- Existing, with real users
- Most often
- PHP, and what runs underneath it
- Also
- Node, Python, the front end, the hosting, the move
- New connections
- Yes, into a system that already runs
- Back ends we skip
- .NET, Java, Ruby
- Not
- New products from scratch, marketing sites, design
- We decline
- Work not worth doing In writing, with the reason
We don’t build new products from scratch. We repair and modernize systems that already exist and already have users. Connecting one of those to an outside service is not a new product — building that connection where there wasn’t one is part of the job, and often the reason someone writes.
We don’t do marketing websites, design or SEO. If your site is just brochure pages, you don’t need us and we’ll say so.
We don’t take on .NET, Java or Ruby back ends. Everything else that a business system is actually made of, we do: PHP most often, Node and Python services beside it, the front end on top of it, the hosting under it, and the move to something newer.
We won’t take the job if it isn’t worth doing. Sometimes the honest answer is that replacing a system costs less than repairing it. You’ll get that in writing, and you’ll have paid for the audit that told you so — which is cheaper than finding out halfway through a migration.
010 Questions people ask
Questions people ask
I already have a developer. Is this a problem?
No, and you should keep them. Most of our work sits next to an in-house developer who is good at building features but has never had to move a system, harden it, or answer a compliance questionnaire. Different job. We do that part and hand it back.
How do I even know something’s wrong?
Ask whoever maintains your software two questions in writing: when the server’s operating system stops receiving security updates, and when somebody last restored a file from your backups. Both answers are dates. If neither has one, that is the finding.
Can you do this without taking my system offline?
Yes. That’s the entire reason we work in stages instead of rebuilding. Across the work written up on this site, no switch-over took a system offline. They happen out of hours, with a tested way to undo them.
Do I have to change hosting companies?
Usually yes, and that’s often where most of the risk is. But the new account is opened in your name with your card — you own it, we’re just invited in. You can remove us at any time and everything keeps running.
Will I lose my Google rankings?
No. Keeping every existing web address exactly as it is comes before everything else. This is the single most common way a rebuild quietly destroys a business, and it’s why we don’t rebuild.
Who actually reads my code?
Greg or Elguja — the two people whose photographs are on the about page. We own the practice and take on few systems on purpose, so you are never handed to somebody you have not met, and there is nobody behind us to escalate to.
Why are there no client names or logos here?
Because most of this is security work on systems that are still running. A logo next to a write-up about what was wrong tells a stranger exactly where to go looking. Every case on this site is anonymised for that reason, and yours would be too.
What do you need before a full audit?
A signed NDA, and read-only access to the code and to the server it runs on. That is the whole list. The NDA is signed before anything is opened — yours, or one we put in place — and nothing is changed while we look.
What if you look and tell me it’s fine?
Then it’s fine, and you’ve spent $2,400 to stop worrying about it. That happens. We’d rather say it than invent work.
I’m not technical at all. Is that a problem?
It’s normal. Most of our clients own the business and hired someone else to handle this. Everything you get from us is written for you, not for a developer — and if something isn’t clear, say so and it gets rewritten.
Will you sell my email or put me in a funnel?
No. Your enquiry goes to one inbox and a person reads it and replies. There is no mailing list and no automated follow-up sequence — nothing is sent to you unless someone writes it. If you don’t reply, you never hear from us again.
011 Start here
-
Tell us what actually breaks.
No specification needed. Plain English is exactly right — most of the useful enquiries are three paragraphs written by somebody who is not technical.
Nothing you wrote is lost. Press Send it to try again, or send it as an email — it opens with what you typed already in it.
Sent.
A person reads this and replies within one business day — one written reply from an engineer who would do the work.
Nothing else will arrive in the meantime. We send no confirmation mail and no follow-up sequence, so the next thing you hear is that reply.
A person reads this. Not an AI assistant, not a chatbot, not an automated sequence. One written reply from an engineer who would do the work, within one business day. If we’re not the right fit, we’ll say so and point you somewhere better. Your address goes to one inbox and nowhere else.
012 Reading