| ci: forge attest runs typecheck and tests on your machine for src.rest | cat | | +7 | -0 | ✓ |
| fix: keep fuel receipts working during Git transfers | Dami | | +139 | -15 | |
| fix: keep nested connection details open | Dami | | +2 | -2 | |
| fix: accept whole numbers in Git capacity fields | Dami | | +9 | -9 | |
| feat: add configurable connection shortcuts (#27) | FelineStateMachine | | +2492 | -122 | |
| feat: configure Git capacity and stream SQLite repository downloads | Dami | | +844 | -145 | |
| docs: the network exercise has a finite lifecycle, explicit external coverage and recoverable teardown | Dami | | +70 | -2 | |
| scripts: a manual production network exercise checks relay relationships, records usage and recovers cleanup from a private manifest | Dami | | +664 | -1 | |
| docs: repositories share the SQLite allowance and portable backups preserve Git history | Dami | | +145 | -132 | |
| backups: compressed Git snapshots verify identities, graphs and receipts before atomic restore | Dami | | +260 | -34 | |
| grasp: repositories and selective fetches use SQLite with atomic event visibility | Dami | | +300 | -796 | |
| git: compressed objects, refs and retry receipts publish in one metered SQLite transaction | Dami | | +766 | -4 | |
| git: ntig exposes bounded indexed object reads and lazy thin-pack bases | Dami | | +33 | -69 | |
| test: delivery drives contended alarms until the target receives the event | Dami | | +7 | -2 | |
| docs: GRASP synchronization and alternative PR hosting describe bounded behavior | Dami | | +93 | -24 | |
| test: GRASP extensions preserve authority, expiry and bounded retries | Dami | | +396 | -4 | |
| grasp: bounded synchronization and alternative PR storage share relay authority | Dami | | +526 | -35 | |
| vendor: ntig 0.4.0 carries bounded GRASP extension contracts | Dami | | +71 | -138 | |
| recovery: private lists, reliable delivery, broader imports and portable backups (#25) | FelineStateMachine | | +1523 | -79 | |
| test: push payload assertions accept either callback order (#24) | FelineStateMachine | | +19 | -15 | |
| push: bounded author-private callbacks run through alarms with opt-in lettered capability advertisements (#23) | FelineStateMachine | | +1138 | -37 | |
| invites: NIP-86 membership claims share existing invitations (#21) | FelineStateMachine | | +322 | -7 | |
| nipad: web URLs resolve to live Nostr counterparts under existing access rules (#22) | FelineStateMachine | | +616 | -24 | |
| nip11: Git acceptance describes eligible authors and guest exceptions so clients can classify hosting | Dami | | +57 | -2 | |
| console: GitWorkshop opens this relay's repositories directly from Connect | Dami | | +5 | -4 | |
| docs: cost guidance centers tenant application budgets and storage decisions | Dami | | +149 | -357 | |
| console: git connections include GitWorkshop only while hosting is available | Dami | | +9 | -1 | |
| test: interrupted Git promotion and its retry share one fixture owner | Dami | | +79 | -69 | |
| manage: authenticated requests acquire authority after their bodies arrive | Dami | | +82 | -34 | |
| docs: repository inventory explains retained bytes, scan costs and live admission without promising collection | Dami | | +131 | -47 | |
| grasp: owners compare bounded Git inventories with reservations without changing stored objects | Dami | | +276 | -2 | |
| grasp: ntig 0.3.0 supplies bounded read-only inventory with preserved source and package provenance | Dami | | +19 | -13 | |
| grasp: git requests, controls, events and alarms share live admission while nested work keeps its owner | Dami | | +188 | -168 | |
| grasp: live repository ownership follows nested work across awaits | Dami | | +109 | -0 | |
| test: paused Git and alarm reads prove admission fences and expose the limits of metadata collection coordination | Dami | | +150 | -0 | |
| test: interrupted promotion checks publication directly because expiry cleanup can remove pending rows | Dami | | +16 | -2 | |
| docs: retained Git bookkeeping explains file usage and the measured storage total is not a per-repository floor | Dami | | +45 | -0 | |
| test: git storage inventories reconcile every reserved key and separate current dependencies from superseded metadata | Dami | | +114 | -6 | |
| grasp: one scoped read session spans Git authority and promotion while roots, writes and quota checks stay fresh | Dami | | +51 | -8 | |
| vendor: ntig 0.2.1 pins scoped immutable reads and bulk checkpoint construction without migrating repository roots | Dami | | +12 | -11 | |
| grasp: promotion loads packs only for relevant pending events and retries finish interrupted publication | Dami | | +112 | -8 | |
| grasp: checkpoint-aware ref advertisements preserve authority, indexed correction retries survive later commits, and retained metadata stays reserved | Dami | | +353 | -14 | |
| vendor: ntig 0.2.0 and its source are pinned by checksum, existing repository roots stay in format 1 | Dami | | +23 | -10 | |
| relay-templates: Marmot members admits accountable publishers with public encrypted reads, alongside the open transport preset | Dami | | +92 | -12 | |
| relay-templates: quiet switches Marmot and Git hosting off alongside the other optional features | Dami | | +8 | -4 | |
| relay-templates: default resets rules and leaves feature settings unchanged | Dami | | +12 | -7 | |
| sites: hostname replacements stay routed while coalesced index writes retry | Dami | | +83 | -12 | |
| sites: verified responses forbid edge transforms so hashes and cache validators remain intact | Dami | | +8 | -4 | |
| host: cost projections distinguish tenant meters from provider expenses and proposed maintenance budgets | FelineStateMachine | | +219 | -37 | |
| grasp: relays host bounded Git repositories through ntig with signed repository state | FelineStateMachine | | +1631 | -63 | |
| marmot: relays carry accountable encrypted group transport (#13) | FelineStateMachine | | +303 | -14 | |
| sites: relays host NIP-5A manifests on isolated origins (#12) | FelineStateMachine | | +1879 | -60 | |
| scripts: every tool has an npm name, and the docs, the headers and the workflow use it; a tutorial never says node and a path | Dami | | +51 | -42 | |
| relay-templates: $schema is the schema's own URL, so a copied template keeps its reference | Dami | | +12 | -11 | |
| relay-templates: the README is a catalog, one line per template on when to choose it, and the build fails when a file has no row | Dami | | +38 | -8 | |
| docs: the README and the guides say what a relay can switch off, that its configuration is a file with a schema, where the presets live and how a host changes them | Dami | | +33 | -9 | |
| views: a view's setting is its trigger or off; the owner picks on write, hourly or daily for a stored view and on or off for presence, the scheduler and the write-time republish read it, and true or false still mean the default and off | Dami | | +79 | -23 | |
| ops: relay.mjs checks, plans, pushes or pulls a relay's configuration file, with the plan being importconfig's dry run; the guide for scripts and agents describes the file, its schema and the four verbs | Dami | | +97 | -0 | |
| config file: a schema for the editor (served at the apex), an offline check that runs the schema and the relay's parser over a JSONC file, and relay-templates/, one configuration per template, folded into the presets the console offers; a quiet template switches every costly feature off | Dami | | +946 | -193 | |
| config: the configuration document is a module of its own, parsed into what a relay would take with a line for each entry it would not, planned into a summary of changes, and applied section by section; importconfig takes {dryRun: true} and answers with the plan; a section left out is left alone, so a document can carry rules only | Dami | | +349 | -95 | |
| features: an owner switches search (prose, full, off), sync, counts, discovery, names, files, pages and signer traffic; supported_nips, the routes, the gates and the index read the map, and the console has a block for it | Dami | | +255 | -20 | |
| docs: the architecture and the developer guide name the new modules and where a NIP is wired in | Dami | | +17 | -9 | |
| scripts: build, check, dev and ops folders, so a generator, a typecheck guard, a dev fixture and the weekly report are told apart by their path; zaptest gets the header it lacked | Dami | | +38 | -33 | |
| tsconfig: unused locals fail the typecheck, now that there are none | Dami | | +10 | -3 | |
| tidy: relay.ts imports each module once and nothing it no longer uses; verifyNIP98 is imported from auth.ts, not re-exported through manage.ts; the suite typechecks with unused locals on | Dami | | +8 | -17 | |
| routes: the HTTP doors are a table in their own module, in the order they are tried, each saying whether a blocked address may use it; fetch keeps the socket upgrade and asks the table for the rest | Dami | | +134 | -74 | |
| nip11: the information document and the supported-NIP list are a module, read by the router and the discovery record | Dami | | +75 | -63 | |
| views: publishing a view, the write-triggered republish and presence scheduling move from relay.ts into views.ts, beside the folds they run | Dami | | +116 | -108 | |
| invites: the claim door joins the invite code it reads, in invites.ts | Dami | | +28 | -25 | |
| fuel: the LNURL cache, the receipt door and the invoice door move from relay.ts into fuel.ts; hostOf, a URL helper both need, lives in edge.ts | Dami | | +89 | -83 | |
| succession: the heir and the dead-man's switch are a class of their own, held by the relay like fuel and identity, with the object's storage exposed for it | Dami | | +150 | -124 | |
| gates: the write gate and the read gate leave relay.ts for a module of their own, wired from the socket handlers and the bridge | Dami | | +99 | -86 | |
| manage: one METHODS table per method, with its action, whether it reads, and its handler; supportedmethods, the permission check and the moderation log read it, where three lists in three files had to agree | Dami | | +434 | -306 | |
| kinds: every special event kind in one module, by NIP; 30078 had three names in three files, and the NIP-46 and report kinds lived in relay.ts | Dami | | +69 | -52 | |
| console: the page is three ordinary files in src/console, folded into a generated module; celld deploy refuses wrangler's text-module rules, so it is a generator like the signer's, with the same staleness check in typecheck | Dami | | +1612 | -18 | |
| test: the object tests are named after the feature or module they exercise, so Blossom, moderation, members, identity and the configuration each live in one file | Dami | | +1236 | -1240 | |
| test: the pure functions run on node in a unit project, the Durable Object tests in an object project, both under one vitest config | Dami | | +373 | -351 | |
| test: the conformance suite is one file per NIP, with the tracked connect in the helpers | Dami | | +309 | -286 | |
| test: the object tests share one client and one set of helpers instead of a copy of each in every file | Dami | | +394 | -1567 | |
| readme: fresh pictures of the relay page and the People tab, with the banner, the folds and the nine tabs as they are now | Dami | | +1 | -1 | |
| docs: the celld suite is on demand, not on every push | Dami | | +3 | -3 | |
| ci: the celld suite runs on demand in its own workflow, since the runner's timing makes the sync test flaky on every push | Dami | | +38 | -33 | |
| host: a reserved name is ours too so its redirect gets a certificate, the config check reads trailing commas and pins the lease figures to the bindings, and the guide leans on celld's own pages for what will change | Dami | | +26 | -21 | |
| host: the same Worker runs on celld with an S3 bucket; the path is documented, checked in CI, and not dropped without notice | Dami | | +544 | -41 | |
| wrangler: no trailing comma in the observability block, so a plain JSONC reader parses the file | Dami | | +1 | -1 | |
| console: the phone rule that drops a table's time column leaves the kind and job columns alone, since those name the row | Dami | | +1 | -1 | |
| console: the two-column blocks keep to the phone's width, add rows wrap instead of pushing the panel wide, list text breaks so a long address keeps its button, and the log's Older button hides when there is no more | Dami | | +2 | -2 | |
| docs: the readme, the develop guide and the groups guide say what the console, the log, the word rules and the discovery record now do, and the tab count is right | Dami | | +9 | -6 | |
| moderation: every management method that changed something and every NIP-29 moderation event leaves a row in a log the owner and moderators read back, since bans, deletions and report resolutions had no history | Dami | | +208 | -6 | |
| config: address blocks travel with the exported configuration, and an import drops the sockets it now refuses | Dami | | +60 | -14 | |
| rules: a blocked word may be a /pattern/, a bad one is refused with its reason, and a switch searches tag values too | Dami | | +124 | -19 | |
| rules: the socket message cap is the owner's, 16 KB to 1 MB, and NIP-11 reports it; the numeric limits share one validator | Dami | | +131 | -15 | |
| nip66: the relay signs a kind 30166 discovery record about itself under its primary URL, re-signed only when the rules, kinds, identity or fuel state it restates change, so directories find it without a probe | Dami | | +184 | -11 | |
| relay: a negentropy sync carries on after a wake, since its filter rides on the socket's attachment and the next message rebuilds the item list from the store | Dami | | +185 | -5 | |
| observe: each relay writes a meter line per usage flush and a data point when a dataset is bound, and the worker exports logs and traces over OTLP, since the platform has no process to scrape | Dami | | +63 | -5 | |
| nip11: auth_required whenever a fresh socket cannot read, 46 in supported_nips; the card's QR is scanned in the test | Dami | | +33 | -15 | |
| docs: the socket's NIP list on the landing page and in the HTTP reference matches the relay, and says how signer traffic is delivered | Dami | | +2 | -2 | |
| qr: format bits were placed transposed and version 10's alignment pattern sat two modules off, so no phone could scan the signer link; an independent decoder now checks every version | Dami | | +56 | -13 | |
| relay: NIP-46 traffic reaches whoever names the key under any read rule, so Amber's probe passes | Dami | | +26 | -22 | |
| relay: NIP-46 traffic reaches a listener that names the key, so app bunkers work | Dami | | +45 | -14 | |
| console: front matter, About and Connect share one card, one fold open at a time | Dami | | +3 | -3 | |
| console: the front matter stays up top; Connect and About fold together beneath it | Dami | | +4 | -4 | |
| console: the Connect section opens the relay in each app people use | Dami | | +5 | -3 | |
| card: the owner's nprofile with this relay as the hint, for apps that have no relay pages | Dami | | +10 | -4 | |
| docs: main takes commits, not pull requests | Dami | | +1 | -1 | |
| docs: what the read rule covers, door by door | Dami | | +17 | -13 | |
| test: the door walk knocks on every path of a members-only relay | Dami | | +329 | -0 | |
| console: the remote signer answers AUTH with its session key; zap payers come with stats | Dami | | +5 | -4 | |
| relay: every door that shows a member, an event or a file asks the read rule | Dami | | +140 | -42 | |
| settings: the read rule is one function, mayRead, with mayList for the directory | Dami | | +27 | -0 | |
| auth: the two header verifiers live together, and one helper says who is asking | Dami | | +99 | -52 | |
| console: the active tab takes the pastel for its position, cycling through the four | Dami | | +1 | -1 | |
| console: the active tab wears the sun colour | Dami | | +1 | -1 | |
| console: the tab strip fades on whichever side has more | Dami | | +3 | -2 | |
| console: the tab strip fades where it scrolls off | Dami | | +1 | -1 | |
| console: views as rows, meta under the row on phones, gauges with quarter marks and a percentage | Dami | | +3 | -3 | |
| console: the care line names the follows rule | Dami | | +1 | -1 | |
| console: the About block's image links are links only | Dami | | +2 | -2 | |
| console: the About block shows URLs as short links, images with a thumbnail | Dami | | +2 | -2 | |
| console: the relay's banner, icon, tags, place and links show on its page | Dami | | +4 | -4 | |
| ui: the toast sits above the console panel | Dami | | +1 | -1 | |
| console: keys keep the normal cursor | Dami | | +1 | -1 | |
| console: a shortened key keeps its whole self in the page | Dami | | +3 | -3 | |
| console: the lists block says what it is for | Dami | | +6 | -6 | |
| console: Data keeps what is stored, Sync takes jobs and forks, Views has its own tab | Dami | | +17 | -9 | |
| console: checkboxes in single-line forms sit on the row's centre line | Dami | | +1 | -1 | |
| check: only the console script's synchronous start is judged | Dami | | +17 | -16 | |
| check: the console script must start against a stub document | Dami | | +47 | -1 | |
| console: guard is defined before the first handler that uses it | Dami | | +1 | -1 | |
| docs: views, for readers, clients, the console and the architecture | Dami | | +38 | -0 | |
| console: a Views block on the Data tab, each with its schedule, audience, last run, rows and a switch | Dami | | +2 | -2 | |
| relay: views, folds the relay signs as records | Dami | | +767 | -13 | |
| docs: search, pins, importing a file and the weekly digest | Dami | | +10 | -2 | |
| console: search above the feed, a Pinned block, an Import block and the digest switch | Dami | | +2 | -2 | |
| relay: search in the console, importing a file, pins and a weekly digest | Dami | | +547 | -16 | |
| docs: guests, the web of trust, blocked words, erasing and report thresholds | Dami | | +21 | -2 | |
| console: the follows rule, guests, blocked words, ban with erase and the report threshold | Dami | | +3 | -3 | |
| test: the write gate and the moderation tools | Dami | | +293 | -0 | |
| relay: guests, a web of trust, blocked words, ban with erase, report thresholds | Dami | | +217 | -24 | |
| test: the expected charge follows the 250,000 allowance | Dami | | +3 | -2 | |
| test: the fuel case overruns the smaller rows allowance by an amount one zap covers | Dami | | +1 | -1 | |
| fuel: the rows allowance is 250,000 a month | Dami | | +7 | -7 | |
| margins: fuel prices against Cloudflare's rates at the bitcoin price of the day | Dami | | +266 | -2 | |
| docs: a gloss read the wrong way round | Dami | | +1 | -1 | |
| docs: the HTTP reference, every path the worker and a relay answer | Dami | | +111 | -0 | |
| docs: scripts and agents, the path from lease to handover and every method by action | Dami | | +168 | -0 | |
| docs: how a NIP lands as a module, and the browser check loop | Dami | | +16 | -3 | |
| docs: architecture by subsystem, with a current diagram | Dami | | +73 | -48 | |
| docs: the configuration and fuel guides point at the new guides instead of repeating them | Dami | | +10 | -10 | |
| docs: your relay on the web | Dami | | +46 | -0 | |
| docs: data and names | Dami | | +71 | -0 | |
| docs: people and groups | Dami | | +56 | -0 | |
| docs: getting started, cut to the first hour | Dami | | +29 | -109 | |
| readme: what a name gives you, the new guides, fresh pictures | Dami | | +75 | -6 | |
| docs: a duplicated paragraph, a duplicated bullet, the missing source files and the roles step | Dami | | +9 | -12 | |
| docs: the Data tab by its new name | Dami | | +2 | -2 | |
| console: seven tabs, one job each | Dami | | +45 | -29 | |
| console: client list rows keep the buttons on the right, state and results under them | Dami | | +2 | -2 | |
| console: tabs scroll instead of wrapping, client lists as rows, the share block uses the width | Dami | | +3 | -3 | |
| card: the facts line wraps into two, clear of the QR plate | Dami | | +7 | -5 | |
| hosting: the catch-all route is live, Cloudflare for SaaS is on | Dami | | +4 | -4 | |
| hosting: the catch-all route waits for Cloudflare for SaaS | Dami | | +5 | -3 | |
| docs, landing: custom domains, and the one-time zone setup for the host | Dami | | +40 | -0 | |
| console: your own domain on the Identity tab | Dami | | +2 | -2 | |
| manage: adddomain, checkdomain, removedomain and listdomains | Dami | | +190 | -0 | |
| relay: custom domains, a hostname routed through KV to its object, registered at Cloudflare | Dami | | +285 | -6 | |
| docs: succession, if you lose your key | Dami | | +11 | -1 | |
| console: name an heir under If I lose my key, and a fourth notification switch | Dami | | +2 | -2 | |
| relay: succession, an heir and a dead-man's switch | Dami | | +401 | -14 | |
| docs: one name per job, forks and replica presets | Dami | | +17 | -0 | |
| console: fork this relay on the Identity tab, a source for replica presets on Rules | Dami | | +2 | -2 | |
| relay: fork a name, a lease that pulls this relay and hands the claim to a key | Dami | | +233 | -1 | |
| relay: kind-scoped presets, single-purpose names and replicas on a standing pull | Dami | | +141 | -45 | |
| docs, landing: the relay card | Dami | | +7 | -0 | |
| console: a Share block with the card, the naddr and its QR, and a QR for the signer link | Dami | | +2 | -2 | |
| relay: the card, a status card for every name with the group naddr as a QR | Dami | | +339 | -0 | |
| qr: a byte-mode QR encoder, level M, versions 1 to 20, no dependencies | Dami | | +361 | -0 | |
| docs: dumps, per-member limits and members inviting members | Dami | | +18 | -1 | |
| console: dumps on the Storage tab, member limits and the invite tree on People | Dami | | +2 | -2 | |
| relay: members invite members, a tree the owner bounds | Dami | | +195 | -19 | |
| relay: per-member keep-for and storage caps | Dami | | +164 | -10 | |
| relay: scheduled dumps of every event to R2, kept for a few runs | Dami | | +327 | -6 | |
| pages: a leased relay has pages too, only an unclaimed one has nothing to show | Dami | | +3 | -1 | |
| docs: pages, the feed and relay-signed notifications | Dami | | +18 | -0 | |
| console: notification switches and a test button on the Identity tab | Dami | | +2 | -2 | |
| relay: signed notifications to the owner over NIP-17 | Dami | | +415 | -6 | |
| relay: pages for notes and articles, and an atom feed | Dami | | +271 | -2 | |
| docs: jobs, the pull generalised: backfill, rebroadcast, standing mirrors, and what they cost | Dami | | +15 | -6 | |
| console: a jobs table on the Storage tab, with pull, fetch my history and rebroadcast forms | Dami | | +2 | -2 | |
| relay: jobs, the pull generalised: once or standing, pull or push, with a filter | Dami | | +675 | -44 | |
| docs: presets and telling your clients about the relay | Dami | | +16 | -0 | |
| console: preset buttons on the Rules tab, and wire-me-in on the Identity tab | Dami | | +7 | -7 | |
| relay: presets, Haven's four relays as one-click rule bundles | Dami | | +215 | -4 | |
| docs, landing: two media doors, nip94 tags and blob reports | Dami | | +12 | -5 | |
| media: NIP-96 door with NIP-94 metadata onto the same bucket and table | Dami | | +208 | -2 | |
| blossom: NIP-94 tags in descriptors, blob reports into the moderation queue (BUD-08, BUD-09) | Dami | | +190 | -28 | |
| test: the pow case picks an event that is actually weak | Dami | | +5 | -1 | |
| docs: the NIP-11 extras, the terms page, the relay's profile and the one publish path | Dami | | +10 | -4 | |
| console: banner, policy links, tags, languages and countries on the Identity tab | Dami | | +2 | -2 | |
| relay: the relay's own profile, NIP-43 role definitions and requests, one publish path for members | Dami | | +344 | -63 | |
| relay: NIP-11 extras, banner, policy links, tags, languages, countries and a terms page | Dami | | +183 | -2 | |
| docs: moderation list, address blocks and the per-address limit | Dami | | +6 | -1 | |
| console: blocked addresses on the People tab | Dami | | +2 | -2 | |
| relay: address blocks and a per-address rate limit | Dami | | +306 | -9 | |
| manage: listeventsneedingmoderation over the reports queue | Dami | | +14 | -2 | |
| console: NIP-46 remote signing, claim and manage from a phone (#10) | FelineStateMachine | | +218 | -5 | |
| relay: NIP-29 groups, moderators and ownership transfer (#9) | FelineStateMachine | | +794 | -42 | |
| blossom: HEAD /upload and PUT /mirror (BUD-06, BUD-04) (#8) | FelineStateMachine | | +261 | -6 | |
| relay: temporary leases and pulling from another relay (#7) | FelineStateMachine | | +832 | -22 | |
| build(deps-dev): bump typescript from 5.9.3 to 7.0.2 in the npm group (#3) | dependabot[bot] | | +350 | -8 | |
| build(deps): bump the actions group with 2 updates (#2) | dependabot[bot] | | +2 | -2 | |
| readme: wordmark on its own paper sticker so it reads on dark themes (#6) | FelineStateMachine | | +12 | -10 | |
| readme: svg wordmark instead of the front page screenshot (#5) | FelineStateMachine | | +12 | -3 | |
| docs: front-matter README and six guides for users and developers (#4) | FelineStateMachine | | +404 | -73 | |
| repo: MIT license, weekly grouped dependabot (#1) | FelineStateMachine | | +38 | -0 | |
| ci: typecheck and test on push and pull request | Dami | | +17 | -0 | |
| bind.ws: relay on demand | Dami | | +23852 | -0 | |