Files
bitgate/docs/adr/0005-rename-to-bitgate.md
T
thePR0M3TH3AN adeba151b8 feat: rename to BitGate and close the drop-in gap
Renames the project and makes it as easy to adopt as BitLogin, which was the
stated bar and which it did not previously meet.

Rename (ADR 0005): @nostr-governance/* -> @bitgate/*, governance-* elements ->
bitgate-*, createGovernanceRuntime -> createBitGate. "Governance" reads as DAO
voting to this audience and named a category rather than a product; BitGate
names the benefit and joins the bit- family that BitVid and BitRoad compose
with. Domain types keep their names — the product is BitGate, the subject
matter is still governance. The migration plan is left as written; this ADR
records the change rather than rewriting history.

Drop-in distribution (ADR 0006): adopting BitGate meant supplying a transport,
authoring a policy, and wiring every element in JavaScript. Now:

- createRelayTransport(urls) — WebSocket transport with reconnection, backoff,
  subscription replay, and cross-relay dedupe
- policy presets (social, commerce, admin-only) addressable by name; the engine
  still carries no thresholds of its own
- <bitgate-provider> — configuration in markup, with descendants finding the
  runtime through a bubbling context event rather than DOM walking, which
  breaks across shadow boundaries
- npm run build:widget — a self-contained dist/bitgate.js

That last one came from running it in a browser rather than from a test. Bare
specifiers resolve in Node and vitest but not in a browser, so the widget
source worked everywhere except a plain static page — the one place it exists
to serve. The bundle is not committed: consumers build from reviewed source.

Also found by running it: the provider's ready event fires during element
upgrade, before a page that defines elements after parsing can attach a
listener, so it now exposes `ready` as a promise too.

Four bugs fixed along the way, three found by new tests and one by the browser:
admin state stayed silent when a roster change altered capabilities but no
denials; the relay transport sent every subscription twice on connect; the
commerce preset computed a meaningless visibility verdict at checkout and could
hide a listing from its own seller; <bitgate-status> threw on an unusable
decision.

759 tests; lint, typecheck, and both builds clean.
2026-08-09 19:58:45 -04:00

2.2 KiB

ADR 0005 — Rename to BitGate

Status: accepted (supersedes the repository-name decision in §5.1 of the migration plan)

Context

The project shipped as nostr-governance, a name chosen while it was still a specification exercise. Three problems emerged once it became a product.

"Governance" means something specific and different to this audience. In Nostr and crypto circles it reads as DAO voting and token-weighted proposals. The project is a moderation and access-control policy engine; the word misdirects.

It named a category rather than a product. It could not be verbed, and it gave no signal that BitVid and BitRoad compose with it.

It named the mechanism rather than the benefit. The sibling project BitLogin is not called "Nostr Portable Auth" — it is called BitLogin, because login is what people want.

Decision

Rename to BitGate, joining the existing bit- family (BitVid, BitRoad, BitLogin, BitUnlock). Gates open and close, which maps onto the allow/deny ladder, and "gate your app" is a natural verb.

  • npm scope: @nostr-governance/* → @bitgate/*
  • custom elements: governance-* → bitgate-*
  • custom events: governance:* → bitgate:*
  • storage key prefix: nostr-governance: → bitgate:
  • consumer entry points: createGovernanceRuntime → createBitGate, defineGovernanceElements → defineBitGateElements

Domain vocabulary is unchanged. GovernanceDecision, GovernanceTarget, and GovernanceRuntime keep their names: the product is BitGate, the subject matter is still governance.

The migration plan and the .hermes execution plan are left as written. They record decisions as they were made; this ADR records the change rather than rewriting history.

Consequences

Done at 0.1.0, unpublished, with no external consumers — the cheapest this could ever be. The storage key prefix changed, which would have invalidated caches had anything been deployed.

The bit- prefix signals membership in one author's suite, which is a mild cost for infrastructure intended for wider adoption. BitLogin carries the same cost and it has not hurt it; the composability signal is worth more, especially since BitLogin and BitGate are designed to be used together.