ObservationWe study the running feature directly
SpecificationEvery state and rule is documented first
Verified codeThe new implementation passes the same tests the original does

The real danger in rebuilding without this process

Most teams approach a rebuild the same way: they look at the main screen, copy what they see, and ship it. Then users start reporting that things behave differently. The loading state is wrong. A calculation is off. An edge case that everyone quietly relied on is gone.

That happens because the visible interface is only a fraction of what a feature actually is. Behind the screen there are validation rules, permission checks, retry logic, background sync, data relationships, keyboard flows, and a hundred small decisions users already depend on. If you rebuild from the outside, you miss all of it.

We start from the inside. We run the feature, observe every state it can reach, trace every network call and data change, and document all of it before we write a single line of your new code.

Who this is for

Source code was lost

The original repository was deleted, corrupted, or never properly handed over. The only thing that exists is the running app.

The platform is shutting down

A SaaS tool, internal system, or legacy platform is being retired and you need its behavior extracted into your own product before it goes offline.

The developer is gone

The person who built it left without documentation. Nobody on your current team fully understands what it does or how.

Migration to a new stack

You are moving from a desktop app to web, from a monolith to microservices, or between mobile frameworks — and you cannot afford to lose behavior along the way.

How we approach the work

01

Agree on the feature boundary

We define exactly what is in scope: the starting point, the end state, the user roles, the platforms, and the acceptance criteria. Nothing is left open to interpretation.

02

Run every path in the original

We exercise the feature: normal use, empty states, errors, permissions, retries, timeouts, concurrent actions, and every edge case we can reach. We record network traffic, data changes, and UI transitions throughout.

03

Write the acceptance matrix

Every observed behavior becomes a test case with a clear input, starting state, action, and expected result. Your team reviews and signs off on this before we build anything.

04

Build in your stack

We implement the feature using your architecture, component system, data layer, test framework, and coding conventions. It is built to slot into your existing codebase, not alongside it.

05

Test parity against the original

We run every case in the acceptance matrix. The new implementation and the original must produce the same result. Gaps stay visible and tracked until resolved.

06

Hand it over completely

You receive the source code, test suite, setup guide, architecture notes, open decisions, and a live walkthrough with your team. No loose ends.

Choose how far you want to go

Specification only

Get the full behavior document, state model, data requirements, API mapping, and acceptance matrix. Your own team does the build; you just need to know exactly what to build.

Working implementation

Specification plus clean source code, unit and integration tests, fixtures, and a runnable demo your team can inspect and run locally.

Production integration

We fit the finished feature into your actual repository — connecting it to your design system, APIs, analytics, deployment pipeline, and review process.

Parity plus approved improvements

We preserve what must stay the same and apply agreed changes — better loading states, stronger error messages, accessibility improvements, or simplified internals — tracked separately from the parity work.

What every delivery includes

Behavior specification

Flows, states, rules, inputs, outputs, permissions, failures, and edge cases in one reviewable document your whole team can read.

Acceptance matrix

Every required behavior has a case, expected result, status, and evidence. Nothing is implied.

Architecture map

Components, data, services, events, and integration boundaries are shown and agreed before implementation begins.

Source code

Readable implementation in your stack, following your conventions and repository structure.

Test suite

Unit, integration, and end-to-end tests that prove the behavior specified in the matrix.

Handover pack

Setup steps, deployment notes, open decisions, known gaps, and a live walkthrough with your team.

Common projects we take on

What to send us to get started

Tell us which feature, where it currently lives, which stack you want it built in, and when you need it. Add any recordings, screenshots, test accounts, old code, design files, or notes you have. We will scope the exact boundary, delivery level, and timeline before we start charging.

Tell us which feature you need and where it currently exists.

Start this project

Feature to code questions

Can you rebuild a feature when we have no source code at all?

Yes. We work from a running app, video recording, screenshots, test account, old binary, partial docs, or network captures. Source code is useful but never required. If the feature runs somewhere, that is enough.

Can you rebuild just one feature without touching the rest of the app?

Yes. One focused feature is the best starting point. We scope exactly the screens, states, rules, data needs, and edge cases that feature requires — nothing more, nothing outside it.

How do you make sure the new version behaves the same as the original?

Before we write a line of code, we build an acceptance matrix — every state, every input, every expected result from the original. The new implementation passes that matrix before we hand it over. You can see the test results yourself.

Can you match our existing architecture, stack, and coding standards?

Yes. Share your repository, conventions, component system, test tools, and deployment setup. The delivery is built to look and behave like it was always part of your codebase.

What if you cannot observe a particular behavior in the original?

We mark every requirement by confidence level. Confirmed behavior comes from repeatable observation. Anything ambiguous becomes an explicit documented decision for your team — nothing stays hidden in an assumption.

Can you improve the feature while rebuilding it?

Yes, but we keep two separate lists. The parity list captures what must stay exactly the same. The improvement list tracks approved changes. Neither list bleeds into the other, so your team always knows what changed and why.