Samrat Neupane

Fractional CTO & Technical Co-Founder

Software Rescue

Software rescue for founders whose app is slow, unstable, or breaking under load

By the time founders call me, they've already spent months trying to patch a system that was never designed to scale. The symptoms are obvious. The cause usually isn't.

I've watched this happen many times. A team ships something real. It works fine at launch. Then the user count climbs, or the data grows, or the business adds a new workflow. And the software starts cracking. Slowly at first, then all at once.

You're not dealing with a fluke. You're dealing with a system that hit a wall it was always going to hit. The question is what to do about it.

What this page coversWe audit the code and architecture, find the actual bottleneck, fix it, harden the system, and stay to watch it. No unnecessary rewrites. No vague timelines. Just the work.

You're in the right place if any of this sounds familiar

Not every struggling app looks the same, but the patterns repeat. Here's what I hear most often:

That last one is the one I hear most. It's rarely true. But it's what people say when they've run out of other explanations.

The problem isn't that the software is beyond saving. The problem is that nobody's looked at it the right way.


What we actually find when we look

Every codebase is different, but the root causes aren't. After doing this many times, the same things come up again and again.

No proper database indexing

A query that runs fine on 10,000 rows becomes unusable at 500,000. Nobody noticed because it was fine until it wasn't. Adding the right index can cut query time from seconds to milliseconds.

N+1 query problems

The code loads a list of records, then fires a separate database query for each one. Load a page with 50 items and you've just run 51 queries. That's not a code style issue. That's a performance catastrophe at scale.

No caching layer

Every request hits the database, even for data that doesn't change. A properly placed cache means most requests never touch the database at all.

Architecture that can't scale horizontally

Some systems are built around a single server holding state in memory or on disk. You can't just add another server because the second one doesn't share that state. The system was never designed to grow beyond one box.

No monitoring

Problems only surface when users complain. There's no alerting, no visibility into what's actually happening under load. By the time you know something's wrong, it's already been wrong for a while.

Tech debt from shipping fast

Shortcuts taken to hit a launch date compound. One shortcut is fine. Ten shortcuts layered on top of each other, with no documentation and no tests, is what makes a codebase genuinely hard to change.

None of these problems are unique. None of them are unfixable. They just need someone willing to read the code instead of guessing.


How the rescue process works

There's no script that applies to every system. But there's a sequence that works.

Audit

We read the code, the architecture, and the infrastructure. Not a surface scan. A real read. Where are the queries? What does the data model look like? How is traffic routed? Where are the dependencies? We're building a picture of the system as it actually is, not as it was intended to be.

Diagnosis

We find the actual bottleneck, not just the symptom. A slow page isn't the problem. The missing index or the 60-query loop underneath it is the problem. We trace it down until we hit the root cause.

Fix

Targeted, not a rewrite unless a rewrite is genuinely the only option. We fix what's broken. We don't touch what's working. Every change is tested before it goes to production.

Harden

Monitoring, alerting, and load testing. You should know your system is under stress before your users do. We set up the instrumentation so you can see what's happening in real time.

Maintain

We don't fix it and leave. At Asteroid Studio, we stay to watch how the system behaves after the fixes go in. If something new surfaces, we're already looking at it.


Here's a real example

A payments platform came to us with a recurring outage: the payment confirmation flow would stall for a subset of users, and nobody could reproduce it reliably. The team had been chasing it for six weeks.

The audit found two things. A third-party payment webhook was firing retries, and the system was processing each retry as a new transaction instead of deduplicating by event ID. At the same time, the order status update was running inside a long database transaction that held a row lock, so concurrent retries were deadlocking against each other.

We added idempotency handling on the webhook endpoint and moved the row lock to the shortest possible window. The outage stopped that week.

Six weeks of guessing, resolved in one week of looking at the right thing.

"We'd been told we needed to rebuild the payments module from scratch. We didn't. The architecture was fine. Two specific bugs were causing the whole problem."

When we say rewrite, and when we don't

We only recommend a rewrite when the codebase is genuinely unsalvageable. That means: no tests, no documentation, no original developer available, and architecture so entangled that no change can be made without risking the whole system.

That's rare. Most teams think they're in that situation when they're not. What they have is a codebase with specific, fixable problems that have compounded over time.

A rewrite takes six to twelve months minimum, costs more than a rescue, and introduces brand new bugs. It's the right call in a small number of cases. We'll tell you honestly if yours is one of them.

Most of the time, it isn't. Period.


Who this is not a fit for

If you're looking for someone to validate the decision to rewrite before you've done an audit, this isn't the right engagement. We don't confirm conclusions before we've looked at the data.

If your app is genuinely pre-product-market-fit and you're not yet sure what it's supposed to do, performance work is premature. Fix the product direction first.

If you need a team of 10 engineers and a six-month runway, we're not the right fit. We're a small, focused operation. We go deep, not wide.


Common questions

How long does a software rescue take?

The audit and diagnosis phase usually takes one to two weeks. Targeted fixes on specific bottlenecks can be deployed within days after that. A full rescue engagement, from audit to hardened and monitored system, typically runs four to eight weeks depending on the state of the codebase.

Can you fix it without a full rewrite?

Most of the time, yes. The majority of performance and stability problems come from a small number of root causes: missing indexes, unoptimised queries, no caching, no monitoring. Fixing those doesn't require starting over. A rewrite is only recommended when the architecture is genuinely impossible to improve incrementally.

What does it cost?

It depends on the scope. The technical fit check is free. After that, the audit and diagnosis is a fixed-scope engagement. Fixes and ongoing work are scoped based on what the audit finds. We don't quote a number before we know what we're dealing with.

When should I just rebuild instead of rescue?

When the codebase has no tests, no documentation, no original developer available, and the architecture is so entangled that no change can be made safely. That's genuinely rare. Most teams think they're in this situation when they're not. The audit tells you which one it actually is.

Samrat Neupane

I work with founders and technical teams to fix unstable software, scale what’s working, and build the systems their business actually needs. Based in Nepal, working globally.

neupanesamrat.com.np

Not sure if your system can be rescued?

Start with a technical fit check. Free, no commitment. We look at what you have and tell you what we think, straight.

Apply for Technical Fit Check