Skip to content

Services · 04

App Maintenance & Code Optimization

Rescue, stabilize and speed up the app you already have, without a risky rewrite.

React NativeReactNode.jsSentry

How this runs

First deliverable
A written audit, inside week one
How work ships
Small verified steps, ranked by impact
Downtime
None — fixes go out as normal releases
What you keep
Baselines, dashboards and numbers for stakeholders

Where we start

Three ways projects land on my desk

Most apps do not need a rewrite. They need someone to read the crash logs, measure what is slow, upgrade what is out of support and put tests around the parts that keep breaking. I have done this for apps with hundreds of thousands of users and for small teams who inherited a codebase nobody understood — always the same way: audit first, agree priorities, fix in small verified steps, and leave monitoring behind so the next regression is caught by a dashboard instead of a one-star review.

  • Your app keeps crashing

    The reviews say it, the uninstall curve says it, and nobody on the team can say exactly why. You need the bleeding stopped before anything else.

    Week one · Crash clusters triaged from Sentry or Crashlytics, the top crashers root-caused, and the first fixes shipped with tests pinning them down.

  • Your app got slow

    Startup takes forever, screens stutter, the bundle has been growing for years. Users feel it before your dashboards do — if you have dashboards.

    Week one · A measured baseline — startup, renders, bundle, API latency — and the quick wins (often config and caching) already in review.

  • You inherited a codebase

    The original developers are gone, the dependencies are years old, and every change feels like defusing something. You need a map before you need fixes.

    Week one · An architecture read-through and dependency audit, with the quick wins separated from the structural problems — in writing.

The build sheet

What's on the menu

  1. Codebase & health audit

    A written report on crashes, performance, dependencies, security and architecture, with a ranked fix list.

    • Report
    • Ranked fixes
  2. Crash & bug fixing

    Root-cause analysis from Sentry or Crashlytics, fixed with tests so it stays fixed.

    • Sentry
    • Crashlytics
  3. Performance optimization

    Startup time, render performance, bundle size, memory, API latency and caching.

    • Startup
    • Bundle
  4. Framework & dependency upgrades

    React Native, Expo, Next.js, Node.js and library upgrades done in safe increments.

    • RN
    • Next.js
    • Node
  5. Security & compliance fixes

    Vulnerable dependencies, auth gaps, data exposure and store policy requirements.

    • CVEs
    • Store policy
  6. Monitoring & alerting

    Crash-free rate, error rate, latency and vitals on one dashboard with sensible alerts.

    • Dashboards
    • Alerts

Standards I don't negotiate

What an engagement moves

The first two rows are measured ranges from past rescues; the rest are the metrics I baseline in every audit and report on afterwards.

  • Crash rate

    Before
    Baseline
    After
    Up to 90% lower
  • App performance

    Before
    Baseline
    After
    25-40% faster
  • Production incidents

    Before
    Baseline
    After
    50% fewer
  • Cold start time

    TODO
    Before
    TODO: your baseline
    After
    TODO: measured after fix
  • Bundle size

    TODO
    Before
    TODO: your baseline
    After
    TODO: measured after fix
  • Dependencies out of support

    TODO
    Before
    TODO: audit count
    After
    0

Always true, whatever the project

  • No rewrite required

    Incremental fixes inside your existing architecture, so the product keeps shipping.

  • Measured, not guessed

    Every fix starts with a baseline and ends with a number you can show your stakeholders.

  • Safer with every step

    Tests added around each change; upgrades done one version at a time.

  • Your team levels up

    Standards, review checklists and docs that reduced incidents by 50% on past teams.

Proof, from shipped work

Codebases other people were afraid to touch

A clinical imaging app with untyped global state, a statewide field app that had to get 30% faster on 2G, an enterprise app de-duplicated across 15+ modules — rescue work I can show you in full:

90%

Crash-rate reduction, up to

Measured on rescued apps

25-40%

Performance improvement

Clean architecture, caching, CI/CD

30%

Shorter feature delivery cycles

After de-duplicating 15+ modules

The do-nothing cost is real: Stripe's developer research found engineers lose roughly a third of their week to technical debt and bad code instead of new features.

The stack

Tools picked for the job in front of us

Diagnose

  • Sentry
  • Firebase Crashlytics
  • LILighthouse

Codebases I rescue

  • React Native
  • React
  • Next.js
  • Node.js
  • TypeScript

Quality

  • Jest
  • DEDetox
  • Playwright
  • ESLint
  • Storybook

Ship

  • GitHub Actions
  • Fastlane
  • Docker

AI in the engagement

Where AI actually shows up

Legacy code is where AI tooling earns its keep: reading large unfamiliar codebases, drafting migrations and generating the tests that were never written.

  1. 01

    Audit

    The codebase, mapped fast

    Agents map modules, data flow and dead code, so the written audit covers more ground in the same week.

  2. 02

    Stabilize

    Tests that pin behaviour

    Characterization tests drafted by AI before any refactor, so 'it still works' is verified, not assumed.

  3. 03

    Upgrade

    Migrations with a co-pilot

    Breaking-change diffs summarized and codemods drafted for framework upgrades, applied one version at a time.

  4. 04

    Triage

    Crash clusters, summarized

    Logs and crash groups distilled into root-cause hypotheses I verify on device before fixing.

45%

CI time cut by pipelines that follow the diff

Measured on a three-app monorepo

5

Agentic coding tools in daily use

Cursor, Claude Code, Codex, Windsurf, Antigravity

70-80%

Test coverage reached on past codebases

AI-drafted, human-kept

The guardrail · An agent can read ten thousand lines in a minute; deciding which hundred to change is still the job. Nothing lands on a legacy codebase without a test pinning the old behaviour first.

Process

How an engagement runs

Expand each step to see what happens and what you receive.

    • Crash and error log review, bundle and startup analysis, Lighthouse and vitals baseline.
    • Dependency and runtime audit: end-of-life versions, known vulnerabilities, upgrade blockers.
    • Architecture read-through with the quick wins and the structural problems separated.

FAQ

Asked before you had to ask

Almost always maintenance. A rewrite is justified only when the platform itself is dead or the data model is wrong at the core. The audit answers this honestly in the first week, with evidence.

Got an app that crashes, lags or nobody dares to touch?

Send me the repo or the crash dashboard. I will tell you what I see and what I would fix first.