Live series · with Jon Skeet3 episodes · 2h 36m so far

I wrote this mess in 2006.
Now it’s unbuildable.twenty years old.still shipping.my problem.

SubSonic shipped in 2006, got popular, and has been napping on .NET 3.5 ever since. Jon Skeet and I are taking it to .NET 10 on camera, with Claude Code doing a great deal of the typing. This is what a real upgrade looks like.

I want to watch this
$79 USD · watch immediately
Every future session included · 14-day refund
Three episodes are already up, see them below
Upgrading a Legacy Project: migrating SubSonic 2.x to .NET in 2026, with Jon Skeet
JUST
$79
ALL EPISODES
2006
First commit
3.5→10
.NET, in public
3
Episodes · 2h 36m
20yr
Of my own decisions
01Person

Every shop has a codebase
nobody wants to touch.

It works, mostly. It makes money, definitely. And every year the gap between what it runs on and what you would hire for gets a little wider. Nobody gets promoted for touching it, and everyone is quietly dreading the day they have to.

Mine is called SubSonic. I wrote it, it shipped inside real products, and it has been sitting on .NET 3.5 since roughly the year the iPhone came out. So rather than upgrade it quietly, I asked Jon Skeet to do it with me in front of a camera.

“Owning every questionable decision in the codebase, and explaining them under oath.”

"
SubSonic is the patient. The procedure is the point, and it transfers to whatever twenty-year-old codebase is haunting your shop.
What this series is
Read before you buy
02Problem
Fig. 02 · The patient, as admitted
~/code/subsonic · zsh
$ git log --reverse --format=%ad | head -1
Thu Sep 28 2006
$ dotnet build
warning NU1701: restored using ‘.NETFramework,v3.5’
error CS0246: type ‘BuildProvider’ not found
Build FAILED.
TargetFramework: net35 net10.0

The migration guides
assume a clean repo.

They want a tidy solution file, passing tests, and a team with spare time. Your legacy code has none of those things, which is exactly why the guides do not help and why the upgrade keeps sliding to next quarter.

What helps is watching two people actually do it, out loud, with the dead ends left in. We do not know what will work either. That is the honest part, and it is the part you can copy.

The cost of waiting

Every year you postpone, the jump gets bigger and the people who remember how it works get further away.

03Story

In 2006, I was tired of writing
data access code by hand.

So I wrote SubSonic. It got popular, it shipped inside real products, and then, like all of us, it got older. It is still out there, still full of decisions that made perfect sense at the time and look deranged today.

2006
First commit
Sep 28
2008
Everybody uses it
ASP.NET era
2011
The web moves on
and it stops
2016
Frozen on .NET 3.5
still shipping
2026
The upgrade, live
with Jon Skeet

The sessions are edited hard, so you get the decisions, the arguments, and the dead ends worth seeing, with none of the waiting for builds.

04Recorded so far

Three sessions in,
and the build is green.

The series runs as long as the upgrade does. Buy once and every session after this one shows up in your account the day it publishes.

01

Will It Build?

43 min

This might sound crazy, but all I want is to get this thing to build. We take our time inside the SubSonic codebase and come out the other side with a concept of a plan, which is not quite the same as a plan.

02

Just One Passing Test

54 min

The build works, so now we want one test to pass. One. Claude runs the entire agenda in a single go, and Jon refuses to accept a compiler claim without a repro, which turns out to be the lesson.

03

Rip Out the Guts

57 min

We map the repo so Claude stops burning context rediscovering it, argue about whether to upgrade or start over, then tear out the provider model. By the end there is one real query running against SQLite.

Start watching
Next episode: the provider model, rebuilt
05Solution

A repeatable process
for rescuing old code.

Every session maps to a step you can run on your own codebase the next morning.

01

The Audit

Reading a codebase you did not write, or wrote and forgot, so you can size the job honestly. No more "it is 90% done" for six straight months.

02

The Safety Net

Characterization tests around untested code so you can change it without breaking behavior nobody remembers. You refactor with confidence instead of prayer.

03

The Migration Path

Old csproj to SDK-style, .NET 3.5 to .NET 10, in an order that keeps the build green while the foundation changes underneath it.

04

Modern C# on Old Bones

Jon applying two decades of language evolution: nullable reference types, generics, modern APIs. What to adopt, and what to leave exactly where it is.

05

AI on Legacy Code

Where Claude genuinely helps with a big migration and where it will cheerfully wreck it. The speed without the slop, which is the difference between weeks and quarters.

06

The Ship Decision

Knowing when it is done: what to modernize, what to leave alone, how to release. The project ends instead of becoming the new legacy problem.

·Who's in the room

Two people who have
seen some things.

JS
Jon Skeet
Author, C# in Depth

The top-ranked contributor in Stack Overflow history. If it is in the C# spec, Jon has an opinion about it, and he is usually right. He brings the language depth this upgrade deserves, and the refusal to accept any claim without a repro.

C# in Depth#1 on Stack Overflow, ever
RC
Rob Conery
Creator of SubSonic

Wrote the code we are fixing. Founded Tekpub, wrote The Imposter's Handbook, and spent a decade at Microsoft including three years on the VS Code team. Owns every questionable decision in this codebase.

Creator: SubSonicAuthor: The Imposter's Handbook
06Sell
Rob Conery
Rob Conery
Author · 25+ yrs
14-DAY
REFUND
NO QUESTIONS
Your guarantee

Watch the sessions. If they do not change how you approach the old code at your shop, tell me inside 14 days and I will refund you. No friction, no hard feelings.

Why watch someone else’s
upgrade at all?

Because the hard parts of a migration are never the syntax. They are the order you do things in, the moment you decide a rewrite is cheaper than a fix, and the discipline to keep the build green while the ground moves.

You get Jon on the language, me on twenty years of my own bad decisions, and Claude Code in the middle doing the work that used to take a week of evenings. Nothing is rehearsed, which is the only reason it is useful.

What you are buying
3 episodes nowEvery future sessionLifetime accessPublic repo
$79one time · lifetime access · no subscription required
Upgrading a Legacy Application

The upgrade you keep
postponing, on camera.

$79 gets you every session recorded so far and every one still to come. 14 days to change your mind, no questions asked.

Get the series - $79
Stripe checkout · lifetime access · refund anytime in 14 days
★ SubSonic, 2006 to now·With Jon Skeet·.NET 3.5 → .NET 10·Claude Code doing the typing·Three episodes live, more recording·The repo is public, follow along·★ SubSonic, 2006 to now·With Jon Skeet·.NET 3.5 → .NET 10·Claude Code doing the typing·Three episodes live, more recording·The repo is public, follow along·