Handover

How do I transfer a codebase to a new development team?

The mechanics, in the order that does not lock anybody out. Most of this is administration; the part that is not is the demonstration week.

Short answer

Transfer the repository organisation with its full history rather than a snapshot, list every environment and secret by name, and then spend a week having the incoming team run, deploy and restore the system themselves while the outgoing team is available to unblock them. Rotate credentials only after ownership is confirmed and your own routes in are verified — doing it the other way round can remove the only access to an account that was never yours.

#The repository

The easiest part, and the one most often done in a way that quietly loses something.

  1. Transfer the organisation, not the repository

    A repository moved out of a supplier organisation into yours keeps its history. A repository copied into a fresh one usually does not keep issues, pull requests, review comments or releases.

    Those artefacts are where a new team finds out why a decision was taken. They are worth more than most of the documentation that gets written instead.

  2. Insist on full history

    Not a zip, not a squashed initial commit. If the first commit in the history you receive is “initial import”, ask what happened to the years before it.

  3. Check for other repositories

    A mobile app, an internal library, infrastructure-as-code, a separate admin tool, a data pipeline. Ask directly rather than assuming the one you were shown is all of it.

  4. Give two of your own people owner rights

    Not one. An organisation with a single owner is the same single point of failure you are trying to remove, wearing different clothes.

  5. Look at the history for secrets

    Credentials committed and later removed are still in the history. Before you widen access, check — and rotate anything you find, since it has been readable to everybody with a clone since the day it landed.

#Environments and secrets

Two separate lists, and the second one is the reason the first one matters.

Environments. Build the list from the cloud console rather than from a conversation. The forgotten ones are the entire point of the exercise, and an old staging environment holding a copy of production data is both a security problem and a surprising cost line.

Secrets. Document them by name and purpose, not by value: what each variable is for, what breaks without it, and where the real value lives. Values move separately, through a channel neither team keeps, and every one of them is rotated afterwards.

An environment variable, documented usefully Invented example — not a customer
PAYMENT_PROVIDER_KEY
  What      Authenticates us to the payment provider
  Owner     Company payment provider account (finance@)
  Rotate    Provider dashboard → API keys → roll
  Breaks    All card payments, immediately
  Value     Not in this document. See the company vault.

Five lines, no secret. This is what makes a variable transferable: the new team can rotate it, and knows what will break while they do.

#The demonstration week

The single highest-value part of any codebase transfer, and the part most often replaced by a presentation.

Book a week in which the incoming team does four things themselves, with the outgoing team available but not driving:

  1. Get it running locally, from the written instructions alone. Every step they have to ask about is a correction to the instructions.
  2. Deploy a trivial real change to production, through the real process.
  3. Roll it back, through the real rollback procedure.
  4. Restore a backup into a scratch environment and confirm the data is usable.

Each of these converts a belief into a fact, and each one reliably finds something. The most common findings: an undocumented setup step, a deployment step that only works from one person's machine, a rollback procedure that does not cover database changes, and a backup that restores but is missing something.

Why 'themselves' matters

Watching somebody deploy transfers nothing. The knowledge that is being transferred is procedural — it lives in having done it, including having got it wrong once with somebody there to explain why.

#What is not in the repository

Ask this explicitly. It is the category that produces the month-three surprises.

  • Scheduled tasks on a server. A crontab that nobody has looked at since it was written.
  • Cloud resources created by hand. A function, a bucket rule, a queue, a scheduled trigger created in a console and referenced by nothing in the code.
  • Scripts on somebody's machine. A monthly report, a data fix, a deployment helper.
  • Configuration held in a provider dashboard. Webhook endpoints, email templates, payment rules, feature flags.
  • Manual processes. Somebody who exports something every Monday and emails it to a partner.

None of these will appear in an analysis of the code, which is why an analysis reports them as open questions rather than pretending they do not exist. Asking the outgoing team directly, in those words, is faster than any other method.

#Rotation, in the right order

Do it in this sequence, and not in any other:

  1. Establish ownership of every account — whose identity is it in?
  2. Transfer anything in a personal or supplier name. Several of these take days.
  3. Create and verify your own admin routes, with recovery going to company mailboxes.
  4. Then rotate every credential the outgoing team could have seen, and remove their personal access.

The failure this prevents

Revoking a person's access to an account that is registered in their name does not transfer it to you. It removes the only route into it. Domain registrations, cloud organisations, app store accounts and payment provider logins are the usual candidates, and each one is recoverable only through a support process you would rather not need.

#What goes wrong

Accepting a zip file of the source.

Instead Transfer the organisation with its history, issues and pull requests. A zip is the code without any of the reasoning attached to it.

Documenting environment variables by value.

Instead Document them by name, purpose, owner and how to rotate. Values go through a separate channel and are rotated afterwards anyway.

Replacing the demonstration week with a presentation.

Instead A presentation transfers a feeling of having been told. Only doing it transfers the ability to do it.

Assuming the repository is the system.

Instead Ask what runs outside it, explicitly, and check the cloud console and the crontabs yourself.

One owner on the new organisation.

Instead Two, minimum, and neither of them a contractor.

#What this does not cover

What this does not do

  • Intellectual property and licensing. If any component is licensed from the supplier rather than owned, that is a contract question and it does not move with the repository.
  • Data protection obligations when a new processor takes over. Ask somebody qualified.
  • Onboarding the new team into the domain — what the product does and for whom.
  • Whether the code is any good. A transfer establishes that it can be operated.

Find out what you actually own.

No repository access. No source-code upload. No card.

Build your project map — free