Test of Time

Test of Time (TOT) is our shorthand for software that remains useful, understandable, and fixable long after the original authors have moved on, the original hosting has vanished, and the fashionable frameworks have turned to compost.

In community-developed software, passing this test is less about predicting the future and more about designing so that future people (including strangers) can safely join, understand the system, and keep it alive without needing a priesthood.

# Where the phrase comes from In everyday English, the phrase is usually heard as “stand the test of time”, meaning “still works well / is still valued after a long time” - dictionary.cambridge.org .

The exact origin of the idiom is a bit fuzzy, but it’s generally described as coming into common use around the turn of the 19th century - grammarist.com . The metaphor is older than the idiom: “test” originally referred to an earthen vessel used to assay (try) precious metals, which is where we get the sense of “a trial that proves value” - etymonline.com

# The software version of the Test of Time For software, “time” attacks in predictable ways: dependencies rot, security assumptions change, maintainers leave, knowledge gets trapped in private chats, and the real “spec” becomes folklore.

So the test is not “will this run forever”, but: > Will a future community be able to keep it running (or port it) without betraying its users.

# Techniques for community software

- Build on Open Standards and boring, readable formats (text, JSON, CSV, SVG) so the data outlives the code.

- Treat Data Portability as a first-class feature: export, import, and documented schemas from day one, with compatibility promises.

- Keep a small, stable Core and push experiments to plugins or adapters, so novelty can come and go without breaking the heart of the system.

- Write down your Governance early: who can merge, how releases happen, how disputes get resolved, and how a project can fork cleanly without drama.

- Optimise for Bus Factor reduction: multiple maintainers, shared credentials via a project-owned org, and a clear maintainer onboarding path.

- Practice Semantic Versioning plus a real deprecation policy: warnings first, migration guides always, and “breaking changes” treated like a community event, not a maintainer mood.

- Invest in Documentation that survives turnover: a short “how it works” overview, a contributor guide, and a living architecture narrative.

- Keep an ADR log (Architecture Decision Records) so future contributors know why trade-offs were made, not just what the current code happens to do.

- Make Testing a social contract: automated tests, reproducible bug reports, and CI that proves the project still works across supported platforms.

- Be strict about Dependency Hygiene: fewer dependencies, clearer upgrade windows, and a plan for abandoned libraries (including vendoring or replacement).

- Ship releases as verifiable artifacts: signed tags, checksums, and ideally an SBOM (software bill of materials) so future rebuilders can audit what you shipped.

- Establish a lightweight Security process: a contact address, a disclosure policy, and a habit of prompt patch releases.

- Avoid “knowledge silos”: important decisions should land in issues, PRs, or docs, not only in DMs and ephemeral chat threads.

- Design for Forkability: minimise proprietary service lock-in, keep build steps documented, and make it possible for a new team to take over without begging.

- Create sustainable Funding paths (even tiny ones): sponsorship, grants, or a foundation, explicitly tied to maintenance work, not just new features.

# A practical rule of thumb

If a motivated stranger can arrive, reproduce a build, understand the architecture, fix one bug, and ship one release within a weekend, your project has a real shot at passing the Test of Time.

If they can’t, then “time” will eventually win, no matter how brilliant the original code was.