Skip to content

Build Not yet confirmed elsewhere1 publisher 3 min read Published

Killing the internal NuGet feed is what pays for a monorepo migration

A shared DTO change on a private package feed costs a library PR, a version bump, and one consumer PR per service. FilmTailor's answer was a single repo; the work was carrying git history across rather than copying files in.

The Engineer · Build desk

How we use AI Send a correction

Illustration accompanying Killing the internal NuGet feed is what pays for a monorepo migration
Generated illustration

What happened

  • FilmTailor consolidated its services after each new one meant another repo and another pipeline, with a single API contract change producing pull requests across three separate repositories.
  • The stated payoff is retiring the internal NuGet feed, where every shared-code change needed a library PR, a version bump, and a consuming PR in each service.
  • The merge was done with git-filter-repo, the rewriting tool the Git project now points people towards in place of the slower filter-branch, run only inside throwaway clones.

Why it matters

  • cost Copying source across is cheaper this sprint and charges interest later, because every blame query on a moved file stops at the migration date and no bisect run crosses it.
  • constraint For .NET teams, Aspire's single-AppHost model makes repository layout an orchestration decision rather than a preference, at least until multi-repo support ships.
  • decision Shops with separate access control per component, or a component heading for open source, have a concrete reason to stay split, so none of this reads as general advice.
  • precedent Fowler's habit of asking why the repos were split in the first place inverts the burden of proof: the split is what now needs a written justification.

Price one field added to a shared DTO under a private package feed. You open a PR against the shared library, bump the version, then open one PR per consuming service to pick the new version up [4]. The post describes five terminals and five slightly stale READMEs [3], so call it five services: six pull requests and a version bump to move one field [21]. The count is irritating rather than fatal. The drift is the defect, because there is always a service running a few versions behind the contract because nobody got round to bumping it [5]. Consolidation turns that dependency into an internal project reference, and skew has nowhere left to live [6].

The migration itself is a history-rewriting job, which is where the cost sits. FilmTailor used git-filter-repo, the tool the Git project now points people towards in place of filter-branch, which is slower and carries enough sharp edges that the docs discourage it [16]. On macOS that is a brew install [17]. Because the tool rewrites rather than edits, a typo is durable, so the post's own discipline is to work in a throwaway clone, never your working copy, and to keep the result off any shared branch until you are happy with it [18]. It also specifies a fresh clone of the service repo rather than your existing checkout, since that checkout is about to have its history rewritten [19]. The destination is a new repository initialised with a README and pushed [20]. The text supplied to me breaks off mid-sentence before the command sequence [1], so read the flags there, not here.

What copying files in destroys is specific: git blame, bisectability across the service's whole lifetime, and tags and releases [13]. The author concedes the shortcut is faster and that nobody is going to fire you for it [14], and says outright that if none of those three matter, copy the files and skip the exercise [15]. In my context the ranking is not equal. A bisect that cannot cross the move date can be worked around by keeping the old repo readable and switching to it for old regressions. Blame is the query you run weekly, and a blame wall dated the day of the move is the artefact you cannot reconstruct afterwards.

Whether the rest of the case transfers depends on your stack. Aspire, which Microsoft now calls just that, having dropped the .NET prefix [8], wants to orchestrate an entire solution from one AppHost [7], and multi-repo is not officially supported, with maintainer David Fowler placing it mid-term rather than short-term on the roadmap [9]. Teams bridge that with uber solutions that clone every repo into sibling folders, with git submodules, or by shipping the shared bits as NuGet packages [10]. Strip Aspire and the private feed out of the ledger and you are paying a rewrite plus a CI overhaul for editor ergonomics.

That CI overhaul is the line the whiteboard drawing leaves off. The promised follow-up covers tag-triggered selective builds so a change to one service does not kick off a full pipeline run for all of them [22], which tells you what the default looks like the morning after you merge: every push builds everything. That bill arrives immediately, while the preserved blame history pays out over years.

What to watch

  • The promised follow-up on tag-triggered selective builds, which is where the claim that a monorepo does not force full pipeline runs gets tested.
  • Aspire multi-repo support moving from mid-term roadmap talk to a shipped AppHost feature, which would remove one of the two stated reasons to consolidate.
  • Reports from teams confirming that tags and releases survive the filter-repo rewrite, since that is the third thing the post says copying files destroys.

Clarity's read

What the record supports and how the coverage leans. The claims behind it follow.

Reality

Evidence38
Adoption18
Hype gap+8
Incentives25
Confidence45
Why these scores

Claim ledger

Ranked by verification strength, evidence, and original report placement.

  1. [1]

    The supplied text of the post breaks off mid-sentence after the destination-repo setup step, before the git-filter-repo command sequence is given.

  2. [2]

    At FilmTailor, every new service meant a new repo, a new pipeline, and recurring questions about which version of the shared library a given service was on.

    Reported SupportedView cited source
  3. [3]

    The author describes the pre-migration state as five terminals open, five READMEs slightly out of date, and PRs that touched three repos because one API contract changed.

    Reported SupportedView cited source

Get this ledger inside ChatGPT. Ask about any of our stories and the answer brings its figure, each claim’s verdict and the sources. Free, no account.

Add to ChatGPTAdd to Claude

Sources

1 independent publisher whose own reporting we read for this story.

  1. dev.to

    1 article · August 29, 2026

    The Monorepo Migration: Merging Histories Without Losing Your Mind

Share your take

Let Clarity write the post for you.

Signed-in readers get a short post drafted on this story in the register they choose — narrative, analytical, or a direct position — editable to the last word before it goes anywhere. The share buttons at the top of this story work without an account.

Topics and entities

Follow any of these and your For You feed starts watching them — no settings page required.

Topics

Entities

Loading related stories