{{define "people"}}

People

Members

{{if .Review}}

Access requests

People who asked to join without an invite. Approving adds them as members.

{{with pendingRequests .Requests}} {{range .}}{{$r := asMap .}}{{$pk := str (index $r "pubkey")}} {{end}}
personreasonasked
{{template "nostrName" $pk}}{{with str (index $r "reason")}}{{.}}{{else}}no reason given{{end}}
{{else}}

No pending requests.

{{end}} {{with decidedRequests .Requests}}{{end}} {{end}}

Invites

Claims

Lists

{{end}} {{define "agents"}}

Agents

Agents are members with their own keys. Each one acts under a grant you sign, and stays the author of everything it does.

{{template "alert" .Error}} {{range .Feed}}{{$a := asMap .}}{{$pk := str (index $a "pubkey")}} {{else}} {{end}}
agentscopeownerstate
{{agentLabel $a}}{{agentScope $a}}{{template "nostrName" (str (index $a "owner"))}}{{agentState $a}}{{with agentSince $a}} | {{.}}{{end}}
No agents yet. Sign a grant below to add one.
{{range .Feed}}{{$a := asMap .}}{{$pk := str (index $a "pubkey")}}{{$state := agentState $a}}{{$scope := asMap (index $a "scope")}}

{{agentLabel $a}} {{$state}} | signed by {{if eq (str (index $a "owner")) $.Actor}}you{{else}}{{template "nostrName" (str (index $a "owner"))}}{{end}} | expires {{short (index $a "expires")}}

{{with index $a "lastEvent"}}{{if when .}}{{end}}{{end}}
key{{$pk}} click to copy
rooms{{or (scopeList $a "rooms") "none"}}
repositories{{range $i, $r := index $scope "repos"}}{{$repo := asMap $r}}{{if $i}}
{{end}}{{str (index $repo "identifier")}} {{str (index $repo "level")}}, owner {{template "nostrName" (str (index $repo "owner"))}}{{else}}none{{end}}
wiki{{or (str (index $scope "wiki")) "none"}}
sites{{range $i, $s := index $scope "sites"}}{{$site := asMap $s}}{{if $i}}
{{end}}{{str (index $site "label")}}{{with index $site "ttl"}} {{str .}} days{{end}}{{if index $site "encrypted"}} encrypted{{end}}{{else}}none{{end}}
kinds{{or (scopeList $a "kinds") "profile and relay list only"}}
rate{{str (index $scope "rate")}} events per minute
expires
owner{{template "nostrName" (str (index $a "owner"))}}
last event
callbacks{{range $c := callbacksFor $.Callbacks $pk}}{{$cm := asMap $c}}{{$cs := callbackState $c}}{{$cid := str (index $cm "id")}}{{str (index $cm "host")}} kinds {{callbackKinds $c}} | {{$cs}}{{with index $cm "lastDelivery"}}{{if when .}} | delivered {{end}}{{end}} {{if eq $cs "paused"}}{{else}}{{end}}{{else}}none{{end}}

{{if eq $state "paused"}}{{else if eq $state "active"}}{{end}}{{if ne $state "revoked"}}{{end}}recent activity{{if ne $state "revoked"}} edit{{end}}

{{end}}{{with asMap .Event}}{{$agent := asMap (index . "agent")}}

Recent activity of {{agentLabel $agent}}

{{$events := index . "events"}}{{if $events}}
    {{range $events}}
  1. {{template "nostrEvent" .}}
  2. {{end}}
{{else}}

No events from this agent yet.

{{end}}{{end}} {{$edit := agentByKey .Feed (.Query.Get "edit")}}{{$es := asMap (index (asMap $edit) "scope")}}

{{if $edit}}Replace the grant for {{agentLabel $edit}}{{else}}New agent{{end}}

{{if $edit}}The form holds the current grant. Signing it publishes a new kind 30392 event for the same key, which replaces the old grant at once.{{else}}The grant is a kind 30392 event signed by your key. The agent's own key signs everything it publishes.{{end}}

{{end}} {{define "moderation"}}

Moderation

Reports

Events

Pins

Pubkeys

{{end}} {{define "rules"}}

Rules

Policy

Kinds

Retention

{{end}} {{define "identity"}}

Identity

Profile

Directory listing

Ownership

{{end}} {{define "connect"}}

Connect

{{if .Private}}

This private relay requires current membership. Connect a signer to sign in.

{{end}}

Connections

The cards on the home page, in order. Remove what you will not use; add more from the catalog. Cards whose feature is off stay hidden.

cardappaudience
Loading…

Edit as JSON

Publish signed relay records

These actions open the configured signer and publish owner-authored Nostr records.

Private Git relay list

GRASP-08 stores private relay URLs in your encrypted kind 10318 list. The relay URLs and any list entries are encrypted to your signer with NIP-44.

{{if not .Actor}}

Sign in

{{template "signerControls" .}} {{end}}
{{end}} {{define "data"}}

Data

Files

Storage

Dumps

Backups

Import

{{end}} {{define "sync"}}

Sync and delivery

Jobs

Job status is idle.

Pull and delivery

{{end}} {{define "views"}}

Views

{{if .Owner}}

Block transforms

Block transforms render fenced code as images. Choose the event kinds and languages to send to your rendering service.

{{if .CustomViews}}{{range .CustomViews}}{{$v := asMap .}}{{end}}
namekindslanguagestriggeraudiencestatelast run
{{str (index $v "name")}} {{viewKinds $v}} {{viewLanguages $v}} {{str (index $v "trigger")}} {{str (index $v "audience")}} {{viewState $v}}{{with str (index $v "lastStatus")}} | {{.}}{{end}} {{with index $v "lastRun"}}{{when .}}{{else}}never{{end}} {{if eq (viewState $v) "paused"}}{{else}}{{end}}
{{else}}

No custom views yet.

{{end}} {{end}}
{{end}} {{define "health"}}

Health

relay{{or .Version "dev"}}{{with .Revision}} {{.}}{{end}}
scripts{{scriptsVersion}}
browser toolsNeeds JavaScript to report.
About browser tools

Browser agents use WebMCP tools registered on every page; Chrome's Application panel lists them and their calls. In Chrome, open chrome://flags/#enable-webmcp-testing, enable WebMCP for testing and relaunch. Your usual pages and signed forms work in other browsers.

Service

{{if .Error}}{{template "alert" .Error}}{{else}}{{template "jsonView" .Event}}{{end}}

Jobs and delivery | Storage and backups

Reports

{{end}} {{define "owner"}}

Owner operations

Destructive actions ask the signer. The browser never receives or submits a private key.

Configuration

Succession

Delete

Any management method

Every retained NIP-86 method remains callable through the signed form bridge. Dedicated tabs supply guided fields for the common ones.

{{end}}