Story/2017 — Present/A nine-year practice

I bought a book in February 2017.
Nine years later, it became a research practice.

The path from one developer struggling with an inherited Android codebase in Delhi to a lab that builds custom tools, methods, and tradecraft for the code most engineers will only ever read, never write.

§ 01   The first codebase

I picked up Working Effectively with Legacy Code because I had no idea how to maintain the codebase I had just inherited. There were no tests. There was no architecture. I was supposed to hire a team around it.

9 years
From the first book to a company
1 question
How do you understand code you didn’t write?
§ 02   The timeline

Nine years of field notes,
compiled in order.

01
2017Delhi · Fintech

The book that started it: Michael Feathers.

I was at a financial-technology company in Delhi, taking ownership of a codebase another agency had built. No tests. No architecture. I was supposed to hire a team around it. I bought Working Effectively with Legacy Code in February. It was the first time I saw the problem named.

AndroidInherited codebaseFirst principles

Marginalia. Putting tests and architecture into a codebase that has neither is its own discipline. The book pointed at it; the years that followed filled it in.

02
2019Consulting · Larger client

UML hit a wall. So I started building tools.

Two years later, consulting on a much larger client, I ran into the same problem at a different scale. I tried UML diagrams. The complexity ate them. I started experimenting with custom visualisations — Observable notebooks, hierarchical edge bundling, force-directed graphs — to filter and transform a codebase until I could see it. That was the first taste: the right view of the right slice of code is often the whole job.

TimeLapse  ·  v0.1 · JavaFX
TimeLapse — file-system-centric Git client showing per-file commit churnsrc/main/java/App.javaRepo.javaWalker.javaDiff.javaTree.javaresources/test/java/RepoTest.javaCHURN — Diff.java
ObservableEdge bundlingBehavioural analysis
03
2019–21Influences

The three books on the desk.

Three books became the through-line of everything that followed. Feathers gave language to the problem; Tornhill gave a method for seeing it. After that the work was building tools that do the seeing.

Michael C. Feathers
Working Effectively
with Legacy Code
Robert C. Martin Series
2017  ·  where it began
Adam Tornhill
Your Code as a
Crime Scene
Pragmatic Bookshelf
2019 · behavioural analysis
Adam Tornhill
Software Design
X-Rays
Pragmatic Bookshelf
2019 · structural × behavioural
Field notebook
Notes & marginalia
2017–present
Unpublished
ongoing  ·  everything else
04
2022Pattern recognition

The pattern that kept repeating.

Across very different clients with very different stacks, the same shape kept showing up: high-churn, high-complexity files clustered at the top or the bottom of the conversion funnel — old code, many authors, often very large. I was asked, again and again, to break them down. So I started building a tool for exactly that job.

Eureka  ·  v0.3 · large-file decomposition
Eureka — churn × complexity heatmap and proposed module split for a 4,219-LOC fileCHURN × COMPLEXITYCHURN →COMPLEXITY ↑CheckoutController.kt — 4,219 LOCPaymentValidationCartStatePriceCalculatorTelemetryAddressFormCouponEngineSessionGuardRoutingSUGGESTED MODULES — 8CO-CHANGE COUPLING — 0.34 → 0.08SAFE TO SPLIT

Marginalia. The seams are already there in the version-control history. You are not creating modules; you are finding the ones the team already wrote, accidentally, over years.

05
2023A name for it

I bought LegacyCode.com.

By 2023 the question I’d been chasing for six years had a name and a shape. I bought the domain because this is the area I want to work in — not “modernisation,” not “platform,” not “DevX.” Legacy code. The code you didn’t write. The most code there is.

Domain registeredCommitment
06
2024Incorporated · Jan 1

The lab, and a tool called Appsplitter.

On January 1, 2024 I incorporated Legacy Code Labs and started work on Appsplitter — a tool aimed squarely at the pattern from 2022: modularising large monolithic Android codebases. I worked on it for the better part of two years.

Appsplitter  ·  module proposal · android
Appsplitter — splitting one Android :app monolith into 11 proposed modules:app — 1 module · 412 packagesPROPOSED — 11 modules:feature-onboarding42 files:feature-checkout88 files:feature-search31 files:feature-account26 files:feature-cart53 files:feature-orders19 files:core-network14 files:core-storage22 files:core-ui38 files:design-system61 files:platform-bridge18 filesBUILD — 6m 12s → 1m 48sCYCLES BROKEN — 23PARALLEL TEAMS — 4
07
2025Polyglot · AI

The pivot to polyglot — and a new family of tools.

By the end of 2025 it was obvious AI had become capable enough to re-shape the work. I committed to a polyglot stance: not just Android, not just one stack — any codebase, any language. I doubled down on deterministic tooling for both comprehension and refactoring, and started building a new family of in-house tools.

Tool / 01

Clarity

Generate readable, navigable mental maps of unfamiliar codebases — for humans first, agents second.

Tool / 02

Terrain

Topographic views of repositories: where the load-bearing code lives, where the rot is, where to start.

Terrain  ·  repo topography
Terrain — repository topography highlighting peak file CheckoutController.ktCheckoutController.ktPEAK · churn 0.94REPO TOPOGRAPHY — :app · last 18 months↑ COMPLEXITY × CHURN
PolyglotDeterministic toolsAI-assistedComprehension × refactoring
08
2026The case for it

The reason this page exists.

AI is now writing a lot of code — and a lot of it is hard to understand. The work of the last nine years compounds against exactly this problem. So this is the year I stop being quiet about it. The methodology, the tooling, the way of approaching engineering — all of it goes outward.

If most of the code you’ll touch this year you didn’t write, that’s the discipline. Not a side quest.

§ 03   What this lab is for

Nine years, four commitments.

01 / Stance

Reading > writing.

We optimise for the engineer who has just opened a file they did not create. The tools, the methods, the language — all built for that first hour.

02 / Method

Structural × behavioural.

Static analysis on its own is half a picture. Behavioural analysis on its own is the other half. Combined, they show you where to start and where to stop.

03 / Posture

Deterministic first.

AI helps. Determinism decides. The expensive part of legacy work is being wrong about the codebase — and that is a tooling problem, not a model problem.

04 / Output

Tools, methods, tradecraft.

A research lab, not a consultancy hour-counter. The deliverable is how you think about the code — backed by a stack of tools that let you do it.

§ 04   What’s next

Bring the methodology
into your codebase.

Whether you have a 4,000-line file no one wants to touch, or an Android app whose build is six minutes and climbing, or a polyglot codebase you inherited last week — the lab is open.

Workshop

Two-day intensive

Your codebase, your team. We work the actual files together using the lab’s tooling.

Methodology & Toolset

Embedded engagement

Multi-week placement of methods and custom tooling. Your team retains both.

Advisory

Standing line

A retained advisory relationship for engineering leadership — on demand.