Skip to content
DearestEllie — because their story is our legacy
AboutResourcesPrivacySign inStart an archive
GOVERNANCE · PRINCIPLES AS CODE

Promises that compile.

Most organizations write their values on a page. We wrote ours as code with a test suite, so violating a promise fails the build before it can reach a family.

The problem with values pages

A values page has no enforcement mechanism. It is prose, maintained by whoever last remembered it existed, drifting quietly away from what the product actually does. Nobody sets out to break a promise like “export is always free” — it erodes: a new checkout flow here, a copywriting change there, and one day the promise and the product disagree, and only the families notice.

DearestEllie holds family memory archives — a domain where broken promises are not a churn metric but a betrayal of grief. So the non-negotiable commitments live in the repository as data, functions, and tests. The prose version exists too, but it mirrors the code, not the other way around.

The principles, as data

lib/guiding-principles.ts exports the 8 commitments as a typed constant — the same object this page is rendering right now:

no-ads
No ads
Families are never the product. No advertising, ever.
no-selling-data
No selling family data
Family memories are never sold, brokered, or mined.
export-anytime
Export anytime
A family can export their complete archive at any time, for free, in an open format — with originals.
ai-optional
AI is optional
The Family Archivist is optional and off by default; the product is fully usable without it, and AI content is always marked and reviewable before sharing.
basic-archives-free
Basic archives stay free
Remembrance — creating, contributing to, and preserving a basic archive — is always free.
no-archive-lost-to-money
No archive disappears because a family cannot pay
Privacy, export, and basic preservation are never gated behind payment; no archive is deleted or locked for inability to pay.
donors-cannot-buy-control
Supporters cannot buy control
Contributions and sponsorships sustain DearestEllie; they never purchase influence over the service or control over any family's archive. Supporters receive recognition only.
private-by-default
Private by default
Every archive is private and invite-only unless a Steward explicitly opts into sharing.

Because a principle is data, other code can reference it by id, and a test can verify that every enforcement mechanism names a principle that actually exists. A typo in a promise is a compile error.

The invariant: an always-free list

The commitments about money reduce to one executable idea: a list of capabilities that are always free, and a predicate any code path can ask. This list is imported from lib/stewardship.ts at render time — it cannot go stale on this page:

create-basic-archive → protects basic-archives-free ✓
keep-archive → protects no-archive-lost-to-money ✓
full-export → protects export-anytime ✓
privacy-controls → protects private-by-default ✓
invite-contributors → protects basic-archives-free ✓
present-mode → protects basic-archives-free ✓
// lib/stewardship.ts
const ALWAYS_FREE_SET: ReadonlySet<string> = new Set(
  ALWAYS_FREE_CAPABILITIES.map((c) => c.capability),
);

/** Whether a capability is guaranteed free (and therefore un-gateable). */
export function isAlwaysFree(capability: string): boolean {
  return ALWAYS_FREE_SET.has(capability);
}

The guard: a payment path that cannot gate an essential

Every contribution request passes through one function before any payment provider is invoked. If a request’s purpose names an always-free capability, the code throws — by construction, there is no way to write a checkout that charges for remembrance, export, or privacy without first deleting the guard in a reviewed diff:

// lib/payments.ts
export class EssentialChargeError extends Error {
  constructor(purpose: string) {
    super(`Refusing to charge for an always-free capability: "${purpose}". ` +
      `Remembrance, export, and privacy are never paid for.`);
    this.name = "EssentialChargeError";
  }
}

export function assertNotChargingEssential(
  request: Pick<ContributionRequest, "purpose">,
): void {
  const purpose = request.purpose?.trim();
  if (purpose && isAlwaysFree(purpose)) {
    throw new EssentialChargeError(purpose);
  }
}

The same check runs in the test suite on every change, so a promise cannot quietly stop being true: if the code changes, the build says so.

Tests as governance

The test suite is the governance layer. It asserts that the always-free list contains export, privacy, and the basic archive; that no stewardship tier’s copy gates a protected capability; and — the part people find strangest — it scans every user-facing source file against 7 forbidden-copy patterns, so lock-in phrasing in a button label fails continuous integration the same way a broken function would. The AI layer gets the same treatment at the type level: the proposal type carries requiresReview: true as a literal type, so an auto-applied AI result is not merely forbidden, it is unrepresentable.

The effect is that the principles have the same lifecycle as the code: they are reviewed in pull requests, they block merges when violated, and their history is the git history. “Did we keep the promise this year?” is answerable by a machine.

Why we publish this

Partly because it works, and grief-tech needs patterns that work. But also because it is self-selecting: contributors who like the idea of promises with a test suite are exactly the contributors a memory commons wants, and anyone can check the mission by reading the repository instead of trusting a brochure. A commitment that fails the build is a commitment a supporter, a partner, or a future maintainer can verify without taking anyone’s word.

Adopting the pattern in your organization

  1. Write your non-negotiables as a typed constant with stable ids — one file, no dependencies, importable from anywhere.
  2. Find the invariant inside each promise and express it as a predicate or an assertion that throws (“never charge for X” becomes a guard on the payment path, not a paragraph).
  3. Write the tests that would fail if the promise were broken — including copy scans, if your promises are about language.
  4. Make the public pages import the constants instead of restating them, so the marketing cannot drift from the mechanism.

The whole pattern is a few hundred lines. Ours is open to read, and this page is rendered from it.

How DearestEllie is run →Essays on the choices behind this →
DearestEllie — because their story is our legacy

A private family memory archive — built to preserve love, and kept free for every family.

PRESERVE
Start an ArchiveGuides & PrintablesKeepsakes / PrintsTribute VideosGift an ArchivePreservationRestore an Export
THE SERVICE
How It's FundedFamily Memory FundStewardship / PricingHow It's RunProgramsImpact
TRUST
Our PromisePrivacy PolicyTerms of ServiceOpen Memory FormatGuiding PrinciplesAccessibility
ABOUT
About DearestEllieLeadershipWhat's NewEssaysHelp CenterCommunity PartnersPressMedia Kit
© 2026 DearestEllie · because their story is our legacy · An independent, supporter-funded serviceNo ads · No selling data · Export always free
DearestEllie is an independent service operated by Michael Davis in Wilmington, North Carolina. It is not a 501(c)(3) organization. Contact: [email protected]