Covers July 23 - August 2, 2026.
StarSync started as a small command that pulled my starred GitHub repositories into one folder. It did that well enough that the folder turned into an archive I actually cared about, and then the small version wasn’t enough anymore.
What broke it is that a repository can be renamed or transferred without becoming a different repository. Folder names can’t tell me that. So StarSync now writes GitHub’s stable repository identity into each checkout, and new folders use both the owner and repository names. Existing archives get a preview before anything moves, and a migration picks up where it left off if one checkout fails partway through.
I also had to decide what StarSync owns when something goes wrong. New repositories clone into a StarSync-owned staging directory and get checked before they receive their final name, so a bad clone can be thrown away without touching a good checkout. Dirty or divergent repositories are left alone, and one failure doesn’t make the rest of the archive useless. Initialization, sync, verification, migration, and date repair all share one archive lock now: a dead local process can be recovered, and a lock held by another machine makes you decide explicitly. That is a lot more machinery than the original script had, but the original script was never allowed to rename hundreds of folders.
Versions 1.2 and 1.3 shipped the first round of that. The release gate builds and compiles on Windows, macOS, and Linux, then runs an offline journey against a copied archive. 177 tests at that point, and I felt better about letting it near the real thing:
sync complete. Added: 0. Updated: 3. Current: 281. Skipped: 18. Failed: 0.
Checkout lifecycle. Active: 284. Retained: 18. Blocked: 0. Pending rename: 0.
Succeeded: 284. Failed: 0.
By 1.5 it also handled moved upstream tags, missing Git LFS objects, and repository paths Windows refuses to put in a working tree. Then I cut 2.0, which is mostly a heavily audited 1.5 with the old archive format removed.
Those releases had accumulated quite a bit of migration code: recognizing configless folders, inspecting older archives, previewing conversions, writing identity, and resuming after partial failures. I needed it to move my archive to format 2. Once that was done, I checked whether anyone still needed the old format. I was the only remaining consumer, and I’d already moved.
So I deleted it. StarSync 2 wants an exact format-2 configuration with an owner, and requires every
checkout to carry its GitHub identity. The migration command is gone along with its report shapes. A
much smaller rename operation covers the thing I do still need, which is a repository changing its
name, owner, origin, or canonical folder without becoming a different repository.
The removal went through the runtime, the command line, the public API, tests, documentation, and the local feature records. Most of the work was checking for old-format paths I had missed. Final quality run passed 187 tests, plus the build and the native executable compile.
Then the full archive test ran out of disk space. I had sized the volume for what I thought the archive needed rather than what the test actually demonstrated. Corrected the allocation, went back to testing. Not how I wanted to spend the evening before calling something 2.0, though I would rather hit it there than halfway through an unattended sync.