1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
|
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{relay_name}</title>
<style>
* {{
margin: 0;
padding: 0;
box-sizing: border-box;
}}
body {{
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', sans-serif;
line-height: 1.6;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
color: #333;
min-height: 100vh;
display: flex;
align-items: center;
justify-content: center;
padding: 20px;
}}
.container {{
max-width: 800px;
background: white;
padding: 40px;
border-radius: 12px;
box-shadow: 0 20px 60px rgba(0,0,0,0.3);
}}
h1 {{
color: #667eea;
margin-bottom: 10px;
font-size: 2.5em;
}}
h2 {{
color: #764ba2;
margin-top: 30px;
margin-bottom: 15px;
font-size: 1.5em;
border-bottom: 2px solid #667eea;
padding-bottom: 10px;
}}
.subtitle {{
color: #666;
margin-bottom: 30px;
font-size: 1.1em;
}}
.info-grid {{
display: grid;
grid-template-columns: 140px 1fr;
gap: 15px;
margin: 20px 0;
}}
.info-label {{
font-weight: 600;
color: #555;
}}
.info-value {{
color: #333;
}}
code {{
background: #f4f4f4;
padding: 3px 8px;
border-radius: 4px;
font-family: 'Courier New', monospace;
color: #667eea;
font-size: 0.9em;
}}
ul {{
margin: 15px 0;
padding-left: 30px;
}}
li {{
margin: 8px 0;
}}
.feature-box {{
background: #f9f9f9;
padding: 20px;
border-radius: 8px;
margin: 15px 0;
border-left: 4px solid #667eea;
}}
.footer {{
margin-top: 40px;
padding-top: 20px;
border-top: 1px solid #eee;
text-align: center;
color: #999;
font-size: 0.9em;
}}
.badge {{
display: inline-block;
background: #667eea;
color: white;
padding: 4px 12px;
border-radius: 12px;
font-size: 0.85em;
margin-right: 8px;
}}
</style>
</head>
<body>
<div class="container">
<h1>{relay_name}</h1>
<p class="subtitle">{relay_description}</p>
<h2>📡 Connection Information</h2>
<div class="info-grid">
<div class="info-label">Domain:</div>
<div class="info-value"><code>{domain}</code></div>
<div class="info-label">WebSocket:</div>
<div class="info-value"><code>ws://{bind_address}/</code></div>
<div class="info-label">HTTP:</div>
<div class="info-value"><code>http://{bind_address}/</code></div>
</div>
<h2>🔌 Supported NIPs</h2>
<div class="feature-box">
<ul>
<li><span class="badge">NIP-01</span> Basic protocol flow and event structure</li>
<li><span class="badge">NIP-11</span> Relay information document</li>
<li><span class="badge">NIP-34</span> Git repository events and announcements</li>
</ul>
</div>
<h2>🎯 GRASP Features</h2>
<div class="feature-box">
<ul>
<li><strong>Repository Announcements</strong> (kind 30617) - Declare Git repositories with validation</li>
<li><strong>Repository State</strong> (kind 30618) - Track repository state changes</li>
<li><strong>NIP-34 Validation</strong> - Automatic validation of repository events</li>
<li><strong>Git HTTP Backend</strong> - Coming soon in Phase 2</li>
</ul>
</div>
<h2>📚 Documentation</h2>
<p>For more information about GRASP (Git Relays Authorized via Signed-Nostr Proofs):</p>
<ul>
<li><a href="https://gitworkshop.dev/danconwaydev.com/grasp/01.md" target="_blank">GRASP-01 Specification</a></li>
<li><a href="https://github.com/nostr-protocol/nips/blob/master/34.md" target="_blank">NIP-34: Git Stuff</a></li>
</ul>
<div class="footer">
<p>Powered by <strong>ngit-grasp</strong> with <strong>nostr-relay-builder</strong></p>
</div>
</div>
</body>
</html>
|