Skip to content
Adam Probert

Professional work · Platform · 2025

A source-control and workflow-platform migration

Hundreds of repositories and a major orchestration upgrade, against a tight timeline.

What it was

The project

Moving our clients source control and workflow orchestration onto modern, supported platforms: hundreds of repositories from Bitbucket to GitHub, Airflow from 2 to 3, and the Kubernetes infrastructure around it reconfigured in step - all while day-to-day delivery carried on.

Build

How it fits together

  • A purpose-built LLM workflow for analysis. No repository estate this size fits in a context window, so it assembled its own per-repository context from code, build configuration and deployment manifests rather than being handed the lot.
  • A shared metadata layer underneath it, recording what each repository was and how it related to the others, so a dependency between two repositories was a lookup rather than a guess.
  • Deployment methodologies and patterns categorised across the estate, which turned 214 individual migrations into a handful of repeatable shapes.
  • The migration itself in plain Python against REST APIs: Bitbucket, GitHub, AWS, Airflow and Snowflake, so every move was scripted, repeatable and reviewable.
  • Automated testing after each move and a report per repository, so the client could see it had landed intact rather than take our word for it.
  • Clean-up carried along the way: standardised documentation and auth patterns, Python version upgrades, and Kubernetes-layer infrastructure upgrades that improved the platform and made the automation simpler.
Key decisions

The trade-offs that mattered

  • Let the model read, keep the decisions

    The LLM workflow was the only practical way to understand 214 repositories in the time available, but it produced input to a decision rather than the decision. Everything it inferred landed in the shared metadata layer where it could be checked, corrected and reused.

  • Categorise before you migrate

    Sorting the estate by deployment methodology first meant we were solving a handful of patterns rather than 214 special cases. Most of the schedule risk disappeared at that point.

  • Boring tools for the moving parts

    The analysis was the novel half. The migration was Python calling REST APIs, because the thing that moves 214 repositories should be the thing you can read, rerun and reason about at two in the morning.

  • Earn trust through transparency

    With sceptical engineers, a comprehensive validation report per repository did more for credibility than any amount of reassurance. Showing the plan and the safeguards is what changed the conversation.

Lesson learned

What I took from it

Hundreds of repositories is a coordination problem wearing a technical costume. Automating the migration was the straightforward half; the work was sequencing it so nobody's Monday got ruined, and earning the trust of engineers who quite reasonably did not want an external team anywhere near their source control. You win that by being visibly careful in public, not by giving assurances in private.

Contact

Say hello.

Whether it’s work, something you’re stuck on, or a project you’re thinking about starting, I’m happy to chat through it.

Get in touch
  • Something you're building, or thinking about building
  • A problem you're stuck on and want another pair of eyes on
  • Anything on this site you want to know more about
  • A role or piece of work worth a conversation