Software

Thirteen plugins that had to look like one

A shared frame so a suite of plugins behaves like one product — written the day after copy-and-paste proved it could not, and vindicated again this month in an entirely different codebase.

homeseerarchitectureshared codedrifttoolingsoftware

Thirteen plugins is not thirteen projects. It is one product with thirteen faces, and the moment they stop agreeing about what a header looks like or how a health indicator behaves, it stops feeling designed and starts feeling accumulated.

What is shared

The page styling, the navigation and sub-navigation, the health pill, the log controls, the live-refresh logic, the packaging scripts, and a small shared library of the types every plugin needs — health checks, dependency declarations, log levels.

There is also a rule that matters more than any of it: every plugin must stand entirely on its own. Some are natural companions — the three media-server ones, the AV work — but none may require another to be installed. A suite that only functions assembled is not a suite; it is one large plugin wearing several hats.

The drift

The shared files began life copied by hand into each repository.

They drifted within a day.

Three plugins were packaged with an older build script that wrote an icon path HomeSeer could not resolve. Nobody noticed until the icons vanished from the updater — by which point the three were already published and those version numbers were spent.

What replaced it

One canonical copy, and an explicit sync step that pushes it into each repository.

The important word is explicit. Drift is still possible — this is copying, not linking — but it is now visible, because syncing is a thing somebody does rather than a thing everybody assumes has happened. The live-refresh logic also does keyed DOM reconciliation rather than redrawing, so a page refresh does not destroy the control you were in the middle of using.

The part that keeps proving itself

I made the identical mistake this month, in a completely unrelated codebase.

Two copies of the same authentication stack, across two websites. A bug was reported, I fixed it in both, and one of the two edits silently did not apply — the pattern I was replacing had already been reshaped by earlier work, so the replacement matched nothing and reported success anyway.

The copy that got the real fix was then deleted during a consolidation. The bug shipped in the survivor, and I only found it because I happened to test that exact screen afterwards.

Copy-and-paste is not a shortcut. It is a decision to maintain something twice, made quietly, usually by somebody in a hurry, and reliably regretted later.