ernster.dev

Principles

The same few rules recur across the applications on this site. They are not a house style; each one is written into the code that ships.

A promise the architecture can break is only a sentence.

Every example below is held by a test, a code boundary or a statement in the project's own documentation, read from the repository rather than from the marketing. Where the practice still falls short of the principle, the last section says so.

A claim is a structure, not a sentence

"Read only" is not true because the README says it. A promise about what software will never do belongs in a test that fails the build the moment the promise is broken.

Outbound traffic fits on a page

If an application calls itself local-first, everything it sends off the machine should be listable: each host, each purpose, ideally each field.

Leaving is always possible

Standard formats, local files and data that stays with its provider. Nothing here should be harder to leave than it was to start.

Failure is visible; partial success is reported as partial

Software that hides a failure moves the cost to the moment you discover it. Saying what did not happen is part of the job.

Automation removes work, not agency

The software does the counting and proposes; a person decides. Nothing destructive happens behind a default.

Same input, same answer

A number someone will act on should come out the same the second time. Randomness is seeded, time is injected and the output is pinned.

Say what it does not do

The most useful line in a README is often the one a reader would otherwise have assumed.

Where the practice is behind the principle

Measured against the repositories as they stand, one gap remains. The coverage gates run on the build machine; only the MMSP specification runs its suite in continuous integration.