The Obvious Process
You start by seeing if you can build useful extensions to the OS, you make sure it boots reliably and you can actually recompile working copies, you then focus on trying to update the build process for new branding…
This is great but it has some realistic problems: You end up with a bunch of “test” versions, if you are anything like me you can spend an hour or more trying to patch your latest test ISO to boot properly and then realise it might be broken because it’s the wrong version…
Builds can take multiple hours – sometimes many hours, it’s tempting to fit branding changes, new documentation and new features in together. Sometimes rebuilds can be corrupted in difficult-to-diagnose ways – possibly because of using obscure methods of file transfer, or because of changing a rarely-changed setting that shouldn’t really do much etc.
If you overuse things like VMs, it can also be very easy to do something silly like overwrite your working VM with your test images. In my initial tests of rebuilding old operating systems from source it’s been much the same problem as with new systems: Emulator, disk image, driver problems. These are just extensions of old problems – “how to transfer to my test machine quickly?” “what if I can’t burn CDs or boot floppies?” etc.
The Solution: Documentation & Testing First
Prior to making good builds – but after messing around a bit with test rebuilds – you should focus on making working stable builds, with the first milestone being “I can rebuild the old codebase from source, I can do this reliably in a reproducible way and I added notes referenced on the login screen”.
The important step which I have omitted is breaking anything. Things could break for numerous reasons while adding or changing details in an operating system build that you wouldn’t normally think would break everything.
What This Means For Real Products
I think the sensible option, particularly when the original codebase is an outdated version, is to start with a simpler fork that’s only a more-documented/more-tested version of the old system and then build proper updated releases from that original stable rebuild. This way you already start with a reasonably-stable system and can begin testing things & documenting how to fix them from that basis, instead of trying to make immediate updates and breaking things that haven’t even been mentioned online in over a decade.
For more complex operating systems, this would generally mean producing a minimal build which is able to rebuild itself (not necessarily reproducing the entire original ecosystem).
Or in practical terms, what this means for the user or developer is that there will probably be the original branding on early forks and updates with different branding later (the original fork versions will probably report their original version numbers to software so as not to break version checks or cause unnecessary updates to the original “stable” version).
So I’ll have to find a way to communicate this in branding, e.g. “Origin” or “Origins” versions will be rebuilds & minor patches of old operating system releases aimed at creating stable modern builds while “Legacy” or “Classic”/”Retro”/… versions will have updated features & system branding aimed at typical users (using the Origin releases, which will only be updated very sparingly mostly to add or fix documentation, as an intermediary platform for building real updates).