<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>cat/tinyrelay</title>
<subtitle>a self-hosted multitenant nostr relay with sites, file storage, git hosting, and inbox and outbox delivery</subtitle>
<id>https://src.rest/cat/tinyrelay/</id>
<link href="https://src.rest/cat/tinyrelay/"/>
<updated>2026-10-17T16:55:34-06:00</updated><entry>
<id>e06f6c9390854c97978cc796fe2cd4cbecb402b5</id>
<title>ci: run make verify on your machine for src.rest</title>
<link href="https://src.rest/cat/tinyrelay/commit/e06f6c9390854c97978cc796fe2cd4cbecb402b5/"/>
<author><name>cat</name></author>
<updated>2026-10-17T16:55:34-06:00</updated>
<content type="text">forge attest runs .forge/ci in a clean worktree of each commit and signs the
result into refs/notes/ci; forge push sends it with the branch. The script
installs the JavaScript dependencies with npm ci, then runs make verify: Go
tests, go vet, the bundle check and the JavaScript tests.</content>
</entry>
<entry>
<id>92682824e5668ced1ecd25f7358730d82194beb3</id>
<title>docs: clarify feed filters in reading positions</title>
<link href="https://src.rest/cat/tinyrelay/commit/92682824e5668ced1ecd25f7358730d82194beb3/"/>
<author><name>Dami</name></author>
<updated>2026-09-23T16:38:23-06:00</updated>
<content type="text"></content>
</entry>
<entry>
<id>561b0a75cca1a1dab534d7503b8deccaf7aef994</id>
<title>docs: draft filter-scoped reading positions</title>
<link href="https://src.rest/cat/tinyrelay/commit/561b0a75cca1a1dab534d7503b8deccaf7aef994/"/>
<author><name>Dami</name></author>
<updated>2026-09-23T12:08:56-06:00</updated>
<content type="text">Define a canonical Nostr filter context and addressable cursor event for cross-client resume positions. Document relay-scoped group identity, replacement behavior, privacy, and the limits of derived feeds.</content>
</entry>
<entry>
<id>46d32538d616d6bc85850f22eb02a8e1ad9032ee</id>
<title>fix(tinyagent): task lifecycle, admission receipts and profile scope</title>
<link href="https://src.rest/cat/tinyrelay/commit/46d32538d616d6bc85850f22eb02a8e1ad9032ee/"/>
<author><name>Dami</name></author>
<updated>2026-09-15T11:46:35-06:00</updated>
<content type="text">Each task request runs in its own session so Hermes cannot merge two
requests into one turn, and a request Hermes still merges ends with an
error naming the carrier. The session is assigned before subscribing so
events delivered ahead of the acknowledgment cannot reach a missing
helper. A file-only task whose deliveries the adapter observed publishes
a result even when Hermes core grades the turn as failed. Events are
marked seen only after Hermes issues an admission receipt, terminal
cards are retried, the private key and settings resolve through the
profile&#39;s secret scope, identity locks live in a root shared by all
profiles, and the replay cache keeps every ID inside its window.</content>
</entry>
<entry>
<id>64d4ccea8f3d2ee0c28d75a72c2d59714dd6c325</id>
<title>fix(tinyagent): sign only expected kinds for write tools and harden diagnostics</title>
<link href="https://src.rest/cat/tinyrelay/commit/64d4ccea8f3d2ee0c28d75a72c2d59714dd6c325/"/>
<author><name>Dami</name></author>
<updated>2026-09-15T11:37:23-06:00</updated>
<content type="text">The facade signs a relay-supplied event template only when writes are
enabled, the called tool is a write tool and the template&#39;s kind is one
that tool publishes; any other template is returned unsigned with an
error the model can see. tools/list still offers tiny_diagnose when the
relay table cannot load, and structuredContent is bounded at 256 KiB.
diagnose treats only an unsupported-method answer as an old relay,
reports a rate limit as unreachable and other 4xx answers as errors,
never as an accepted signature.</content>
</entry>
<entry>
<id>d90c59f67254b76283f04ee589f96a266ab4db30</id>
<title>docs: rename the agents guide to agent-access.md</title>
<link href="https://src.rest/cat/tinyrelay/commit/d90c59f67254b76283f04ee589f96a266ab4db30/"/>
<author><name>Dami</name></author>
<updated>2026-09-15T11:23:22-06:00</updated>
<content type="text">Agent runners treat any agents.md as an instruction file for
themselves, and this page is user documentation about relay agents,
so it now lives at docs/agent-access.md. Links follow.</content>
</entry>
<entry>
<id>4c4f3249a74b6ad0148005dcd96d5f8287e4406e</id>
<title>feat(tinyagent): durable task cards and handoff threads for Hermes</title>
<link href="https://src.rest/cat/tinyrelay/commit/4c4f3249a74b6ad0148005dcd96d5f8287e4406e/"/>
<author><name>Dami</name></author>
<updated>2026-09-15T10:41:52-06:00</updated>
<content type="text">A kind 43001 request addressed to the agent becomes a Hermes turn in a
thread anchored at the request. The adapter publishes one accepted
event when processing starts, throttled progress while the turn runs,
and exactly one result or error when it ends, skipping requests that
already carry a terminal answer. A kind 43005 from the requester, or a
!cancel mention in Buzz&#39;s convention, stops the turn. Handoffs open a
kind 11 thread so a handed-off session continues in its own thread.</content>
</entry>
<entry>
<id>7472b16121c5ed4ccbce9e324aba80cd86f409bb</id>
<title>feat: permission-aware diagnostics for agents</title>
<link href="https://src.rest/cat/tinyrelay/commit/7472b16121c5ed4ccbce9e324aba80cd86f409bb/"/>
<author><name>Dami</name></author>
<updated>2026-09-15T10:40:51-06:00</updated>
<content type="text">browsegrant lets any signed key read its own membership, grant state
and effective scope, and reports which requested rooms and kinds the
grant is missing. tinyagent diagnose, its rpc method and the facade&#39;s
tiny_diagnose tool probe reachability, signature acceptance, membership
and grant coverage, and answer with a verdict that separates
authorization failures from transport failures and advises a
request_grant call when scope is missing.</content>
</entry>
<entry>
<id>e5002d7633eedc71044a4d60582bf9843321b192</id>
<title>chore(tinyclient): drop NIP-90 task status styles</title>
<link href="https://src.rest/cat/tinyrelay/commit/e5002d7633eedc71044a4d60582bf9843321b192/"/>
<author><name>Dami</name></author>
<updated>2026-09-15T10:39:06-06:00</updated>
<content type="text"></content>
</entry>
<entry>
<id>c1cb426afbb03b7357c41bd09742865bd03e1484</id>
<title>feat(tinyclient): start and cancel long tasks from the room chat</title>
<link href="https://src.rest/cat/tinyrelay/commit/c1cb426afbb03b7357c41bd09742865bd03e1484/"/>
<author><name>Dami</name></author>
<updated>2026-09-15T10:38:20-06:00</updated>
<content type="text">The chat activity panel gains an Ask an agent form that publishes a
kind 43001 request to one of the room&#39;s agents, scoped to the thread
when the panel is, and a Cancel button on open cards the signed-in
requester owns that publishes a kind 43005. Cards show the status, the
newest progress line, assignees, results with artifact links and
errors, and keep rendering without JavaScript.</content>
</entry>
<entry>
<id>fc78fb98e165ce877adcac1af1537ad73060d2ed</id>
<title>feat: carry long tasks on the job kinds Buzz reserves instead of NIP-90</title>
<link href="https://src.rest/cat/tinyrelay/commit/fc78fb98e165ce877adcac1af1537ad73060d2ed/"/>
<author><name>Dami</name></author>
<updated>2026-09-15T10:30:12-06:00</updated>
<content type="text">NIP-90 is marked unrecommended upstream. Long tasks now use kinds
43001 to 43006 (request, accepted, progress, result, cancel, error)
with Tinyrelay&#39;s own tag contract: a request names its room and the
keys asked, every answer names the request and the requester and stays
in the request&#39;s room, and only asked keys may answer. Task cards,
browsejobs and browsejob, push notices, the MCP tools (request_job,
accept_job, job_progress, job_result, job_error, cancel_job), WebMCP,
the agent runner, the QA fixtures and the docs follow the new shape.
Agent grants keep the jobs tag with request, serve and both.</content>
</entry>
<entry>
<id>242a31ff4c0fe2c17967727d91dd85f709863600</id>
<title>fix(tinyagent): deliver reliably across replay overflow and helper restarts</title>
<link href="https://src.rest/cat/tinyrelay/commit/242a31ff4c0fe2c17967727d91dd85f709863600/"/>
<author><name>Dami</name></author>
<updated>2026-09-15T10:27:32-06:00</updated>
<content type="text">The replay cache no longer advances its floor past live seconds when it
fills: IDs outside the replay window are dropped first, and the floor
moves only when the cache is still over budget. Events are marked as
seen only after Hermes accepts them, with a bounded attempt count so a
poison event retires after three failures. When the Go helper dies the
adapter marks the platform disconnected, respawns the helper with
backoff and resubscribes from the persisted cursor. The helper now
receives a minimal environment, state lives under the active Hermes
home, and an identity lock stops two gateways from running one key.
Home-channel auto-configuration returns the structured object Hermes
expects, typing resumes after an approval resolves, and pending request
cards are bounded and swept.</content>
</entry>
<entry>
<id>c1fefe784b4facc2e6b2f730fe9bdfb7e86ab721</id>
<title>feat(tinyagent): bridge relay MCP tools into Hermes with per-request signing</title>
<link href="https://src.rest/cat/tinyrelay/commit/c1fefe784b4facc2e6b2f730fe9bdfb7e86ab721/"/>
<author><name>Dami</name></author>
<updated>2026-09-15T10:26:31-06:00</updated>
<content type="text">tinyagent mcp is a stdio MCP server Hermes runs like any other server
entry. It forwards tools/list and tools/call to the relay&#39;s stateless
MCP endpoint with a fresh NIP-98 signature and the relay&#39;s header and
_meta contract on every request, offers a curated read set by default
and a write set behind --allow-writes, signs the unsigned events write
tools return and resubmits them, and reports permission refusals and
transport failures as distinct tool errors.</content>
</entry>
<entry>
<id>e98cef486f70dcbe7d2d88b5aff0dc60577b86e1</id>
<title>feat(tinyclient): answer native agent requests from the Approvals page</title>
<link href="https://src.rest/cat/tinyrelay/commit/e98cef486f70dcbe7d2d88b5aff0dc60577b86e1/"/>
<author><name>Dami</name></author>
<updated>2026-09-15T10:21:26-06:00</updated>
<content type="text">The standalone Approvals page now renders the same choice card as the
room timeline for Tiny agent questions, approvals and confirmations:
single and multiple selection, free-text answers and combined answers.
It reuses the chat-decision element so one implementation publishes
kind 1111 answers from both pages.</content>
</entry>
<entry>
<id>bdd572c1db4a716eb9761a8fd283bdad422b84d6</id>
<title>feat(tinyclient): build and parse path addresses in the browser</title>
<link href="https://src.rest/cat/tinyrelay/commit/bdd572c1db4a716eb9761a8fd283bdad422b84d6/"/>
<author><name>Dami</name></author>
<updated>2026-09-15T08:24:53-06:00</updated>
<content type="text">File links, the file catalog, same-document navigation and the WebMCP
open tools use the path scheme; the QA scripts follow.</content>
</entry>
<entry>
<id>f35f8dff89e66aebe8a44ec0fd7c41a71485a6a1</id>
<title>feat(daemon): emit path addresses for pages</title>
<link href="https://src.rest/cat/tinyrelay/commit/f35f8dff89e66aebe8a44ec0fd7c41a71485a6a1/"/>
<author><name>Dami</name></author>
<updated>2026-09-15T08:24:53-06:00</updated>
<content type="text">Approval, push notice, file, folder and wiki proposal links use the
path scheme, with people written by member name when they have one.</content>
</entry>
<entry>
<id>196be3813d45b7d852cc18e69856e0ca47cd76c3</id>
<title>feat(tinyclient): name resources in the path</title>
<link href="https://src.rest/cat/tinyrelay/commit/196be3813d45b7d852cc18e69856e0ca47cd76c3/"/>
<author><name>Dami</name></author>
<updated>2026-09-15T08:24:53-06:00</updated>
<content type="text">Repositories, stored files, file collections, approval requests,
agents, wiki proposals and addressed social threads are reached by
path segments instead of query parameters. A person in a path is the
member name when the relay has one, else the hex pubkey; name, npub
and hex all resolve. The query keeps only filters, cursors and the
branch. The old query forms are gone.</content>
</entry>
<entry>
<id>ddccb24bbf0bd23b4d8a3d573e2e22975351913c</id>
<title>feat(tinyclient): modernize page internals</title>
<link href="https://src.rest/cat/tinyrelay/commit/ddccb24bbf0bd23b4d8a3d573e2e22975351913c/"/>
<author><name>Dami</name></author>
<updated>2026-09-15T08:04:52-06:00</updated>
<content type="text">Controls share one radius scale, a 32px height and an accent focus
ring. Management, publish and room forms sit on flat bordered surfaces
with stacked labels. Alerts render as callouts, empty lists as quiet
dashed states, and disclosures use a turning chevron. Hover and pressed
states transition briefly unless motion is reduced.</content>
</entry>
<entry>
<id>6b2b10970f6c620fe5d99bd13ecff4af1339f8af</id>
<title>fix(tinyclient): guard timeline scroll hooks outside a window</title>
<link href="https://src.rest/cat/tinyrelay/commit/6b2b10970f6c620fe5d99bd13ecff4af1339f8af/"/>
<author><name>Dami</name></author>
<updated>2026-09-15T07:59:42-06:00</updated>
<content type="text"></content>
</entry>
<entry>
<id>57e8eb326beb7ed24daec8bf073d30bb282c57e8</id>
<title>fix(tinyclient): open room timelines at the newest message</title>
<link href="https://src.rest/cat/tinyrelay/commit/57e8eb326beb7ed24daec8bf073d30bb282c57e8/"/>
<author><name>Dami</name></author>
<updated>2026-09-15T07:59:02-06:00</updated>
<content type="text">The timeline scrolls to its end on load, after layout and after assets
settle, and in-app navigation into a room no longer resets it to the top.</content>
</entry>
<entry>
<id>c8053d2f3cc58c68c6abe37bfbdf7fe28ea4a88a</id>
<title>fix(tinyclient): keep row tables inside the content column</title>
<link href="https://src.rest/cat/tinyrelay/commit/c8053d2f3cc58c68c6abe37bfbdf7fe28ea4a88a/"/>
<author><name>Dami</name></author>
<updated>2026-09-15T07:59:02-06:00</updated>
<content type="text">Row tables use a fixed layout everywhere so long cells truncate instead
of widening the page. The answered approvals table gets asker and answer
columns of fixed width and clamps the request to two lines on phones.
The sites blurb is gone.</content>
</entry>
<entry>
<id>e9ffeddda9b3ca5a13ae3151a04df06a071167c6</id>
<title>fix(tinyclient): replace the tap highlight with explicit pressed states</title>
<link href="https://src.rest/cat/tinyrelay/commit/e9ffeddda9b3ca5a13ae3151a04df06a071167c6/"/>
<author><name>Dami</name></author>
<updated>2026-09-15T07:59:02-06:00</updated>
<content type="text">Hover rules apply only on pointer devices, every interactive element
gets a matching active state, row highlights paint the row instead of
each cell, and the browser tap highlight is switched off.</content>
</entry>
<entry>
<id>86bcf35c230c5d0c7b424e6551144b0832ba98c9</id>
<title>fix(community): state the member name rule in the error</title>
<link href="https://src.rest/cat/tinyrelay/commit/86bcf35c230c5d0c7b424e6551144b0832ba98c9/"/>
<author><name>Dami</name></author>
<updated>2026-09-14T22:42:57-06:00</updated>
<content type="text"></content>
</entry>
<entry>
<id>54bb70e9819f25c49b2eeff42b7fbf2c28a3f573</id>
<title>fix(replication): tolerate AUTH frames and report the CLOSED reason</title>
<link href="https://src.rest/cat/tinyrelay/commit/54bb70e9819f25c49b2eeff42b7fbf2c28a3f573/"/>
<author><name>Dami</name></author>
<updated>2026-09-14T22:42:57-06:00</updated>
<content type="text">Pulls from relays that send an unsolicited AUTH challenge no longer
fail; only a CLOSED with an auth-required or restricted reason stops
the pull, and that reason is surfaced in the job error.</content>
</entry>
<entry>
<id>a17b474809e2f2c6e2ee31fe66119b8f46adb553</id>
<title>fix(tinyclient): gate management pages by access and 404 unknown paths</title>
<link href="https://src.rest/cat/tinyrelay/commit/a17b474809e2f2c6e2ee31fe66119b8f46adb553/"/>
<author><name>Dami</name></author>
<updated>2026-09-14T22:42:57-06:00</updated>
<content type="text">Keys a members-only or private relay does not admit see a short notice
instead of management forms that fail once signed. Paths that match no
page return 404 instead of rendering the home page.</content>
</entry>
<entry>
<id>d9651de022c4c2283f82eb390a00bde09f477cc8</id>
<title>refactor(tinyclient): adopt button levels and badges, trim descriptions</title>
<link href="https://src.rest/cat/tinyrelay/commit/d9651de022c4c2283f82eb390a00bde09f477cc8/"/>
<author><name>Dami</name></author>
<updated>2026-09-14T22:42:57-06:00</updated>
<content type="text">Mark one primary action per view and destructive actions as danger,
show access, state and agent markers as badges, label rail groups,
render errors as sentences, hide forms guests and restricted keys
cannot use, and drop explanatory paragraphs across the pages.</content>
</entry>
<entry>
<id>660e78b96c421647fa7ebe3a6cf06ad10e88a789</id>
<title>feat(tinyclient): template helpers for rail labels, friendly errors and safe links</title>
<link href="https://src.rest/cat/tinyrelay/commit/660e78b96c421647fa7ebe3a6cf06ad10e88a789/"/>
<author><name>Dami</name></author>
<updated>2026-09-14T22:42:27-06:00</updated>
<content type="text">Add navGroupLabel, friendlyError, restricted, authRequired, refName and
safeURL to the template function map, and title invite pages Join.</content>
</entry>
<entry>
<id>2a6a4e0799246808479eadce40e738a21baa2af6</id>
<title>feat(tinyclient): design tokens, button levels, badges and a square screen tier</title>
<link href="https://src.rest/cat/tinyrelay/commit/2a6a4e0799246808479eadce40e738a21baa2af6/"/>
<author><name>Dami</name></author>
<updated>2026-09-14T22:42:20-06:00</updated>
<content type="text">Add wait and surface tokens for both themes, a primary and danger button
level, a status-badge element, rail group labels and counts, a square
tier from 681 to 1023 pixels with a page header and slide-over panel,
and a bottom sheet for page details on phones.</content>
</entry>
<entry>
<id>91db918a29027af86590e14623551125bebfae76</id>
<title>fix(tinyagent): preserve threads and accept explained choices</title>
<link href="https://src.rest/cat/tinyrelay/commit/91db918a29027af86590e14623551125bebfae76/"/>
<author><name>Dami</name></author>
<updated>2026-09-14T21:42:56-06:00</updated>
<content type="text">Keep questions, approvals and follow-up attachments with their originating conversation. Accept selected options with explanatory text, show readable answers and give mobile choices separate touch targets.

Validate with mainline and installed Hermes adapter suites, the disposable integration lab, repository checks, race tests and mobile browser checks.</content>
</entry>
<entry>
<id>1e42b938a8831675a48bf0f911175677196522a5</id>
<title>fix(tinyagent): support installed Hermes and room triggers</title>
<link href="https://src.rest/cat/tinyrelay/commit/1e42b938a8831675a48bf0f911175677196522a5/"/>
<author><name>Dami</name></author>
<updated>2026-09-14T16:15:35-06:00</updated>
<content type="text">Use the public approval hook across Hermes versions and preserve configured mention requirements for incoming messages. Verify exact approval callbacks and trigger behavior against mainline and Hermes 0.21.1.</content>
</entry>
</feed>
