yakmesh 2.8.2 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (232) hide show
  1. package/CHANGELOG.md +637 -0
  2. package/CONTRIBUTING.md +42 -0
  3. package/Caddyfile +77 -0
  4. package/README.md +119 -29
  5. package/adapters/adapter-mlv-bible/README.md +124 -0
  6. package/adapters/adapter-mlv-bible/index.js +400 -0
  7. package/adapters/chat-mod-adapter.js +532 -0
  8. package/adapters/content-adapter.js +273 -0
  9. package/content/api.js +50 -41
  10. package/content/index.js +2 -2
  11. package/content/store.js +355 -173
  12. package/dashboard/index.html +19 -3
  13. package/database/replication.js +117 -37
  14. package/docs/CRYPTO-AGILITY.md +204 -0
  15. package/docs/MTLS-RESEARCH.md +367 -0
  16. package/docs/NAMCHE-SPEC.md +681 -0
  17. package/docs/PEERQUANTA-YAKMESH-INTEGRATION.md +407 -0
  18. package/docs/PRECISION-DISCLOSURE.md +96 -0
  19. package/docs/README.md +76 -0
  20. package/docs/ROADMAP-2.4.0.md +447 -0
  21. package/docs/ROADMAP-2.5.0.md +244 -0
  22. package/docs/SECURITY-AUDIT-REPORT.md +306 -0
  23. package/docs/SST-INTEGRATION.md +712 -0
  24. package/docs/STEADYWATCH-IMPLEMENTATION.md +303 -0
  25. package/docs/TERNARY-AUDIT-REPORT.md +247 -0
  26. package/docs/TME-FAQ.md +221 -0
  27. package/docs/WHITEPAPER.md +623 -0
  28. package/docs/adapters.html +1001 -0
  29. package/docs/advanced-systems.html +1045 -0
  30. package/docs/annex.html +1046 -0
  31. package/docs/api.html +970 -0
  32. package/docs/business/response-templates.md +160 -0
  33. package/docs/c2c.html +1225 -0
  34. package/docs/cli.html +1332 -0
  35. package/docs/configuration.html +1248 -0
  36. package/docs/darshan.html +1085 -0
  37. package/docs/dharma.html +966 -0
  38. package/docs/docs-bundle.html +1075 -0
  39. package/docs/docs.css +3120 -0
  40. package/docs/docs.js +556 -0
  41. package/docs/doko.html +969 -0
  42. package/docs/geo-proof.html +858 -0
  43. package/docs/getting-started.html +840 -0
  44. package/docs/gumba-tutorial.html +1144 -0
  45. package/docs/gumba.html +1098 -0
  46. package/docs/index.html +914 -0
  47. package/docs/jhilke.html +1312 -0
  48. package/docs/karma.html +1100 -0
  49. package/docs/katha.html +1037 -0
  50. package/docs/lama.html +978 -0
  51. package/docs/mandala.html +1067 -0
  52. package/docs/mani.html +964 -0
  53. package/docs/mantra.html +967 -0
  54. package/docs/mesh.html +1409 -0
  55. package/docs/nakpak.html +869 -0
  56. package/docs/namche.html +928 -0
  57. package/docs/nav-order.json +53 -0
  58. package/docs/prahari.html +1043 -0
  59. package/docs/prism-bash.min.js +1 -0
  60. package/docs/prism-javascript.min.js +1 -0
  61. package/docs/prism-json.min.js +1 -0
  62. package/docs/prism-tomorrow.min.css +1 -0
  63. package/docs/prism.min.js +1 -0
  64. package/docs/privacy.html +699 -0
  65. package/docs/quick-reference.html +1181 -0
  66. package/docs/sakshi.html +1402 -0
  67. package/docs/sandboxing.md +386 -0
  68. package/docs/seva.html +911 -0
  69. package/docs/sherpa.html +871 -0
  70. package/docs/studio.html +860 -0
  71. package/docs/stupa.html +995 -0
  72. package/docs/tailwind.min.css +2 -0
  73. package/docs/tattva.html +1332 -0
  74. package/docs/terms.html +686 -0
  75. package/docs/time-server-deployment.md +166 -0
  76. package/docs/time-sources.html +1392 -0
  77. package/docs/tivra.html +1127 -0
  78. package/docs/trademark-policy.html +686 -0
  79. package/docs/tribhuj.html +1183 -0
  80. package/docs/trust-security.html +1029 -0
  81. package/docs/tutorials/backup-recovery.html +654 -0
  82. package/docs/tutorials/dashboard.html +604 -0
  83. package/docs/tutorials/domain-setup.html +605 -0
  84. package/docs/tutorials/host-website.html +456 -0
  85. package/docs/tutorials/mesh-network.html +505 -0
  86. package/docs/tutorials/mobile-access.html +445 -0
  87. package/docs/tutorials/privacy.html +467 -0
  88. package/docs/tutorials/raspberry-pi.html +600 -0
  89. package/docs/tutorials/security-basics.html +539 -0
  90. package/docs/tutorials/share-files.html +431 -0
  91. package/docs/tutorials/troubleshooting.html +637 -0
  92. package/docs/tutorials/trust-karma.html +419 -0
  93. package/docs/tutorials/yak-protocol.html +456 -0
  94. package/docs/tutorials.html +1034 -0
  95. package/docs/vani.html +1270 -0
  96. package/docs/webserver.html +809 -0
  97. package/docs/yak-protocol.html +940 -0
  98. package/docs/yak-timeserver-design.md +475 -0
  99. package/docs/yakapp.html +1015 -0
  100. package/docs/ypc27.html +1069 -0
  101. package/docs/yurt.html +1344 -0
  102. package/embedded-docs/bundle.js +334 -74
  103. package/gossip/protocol.js +247 -27
  104. package/identity/key-resolver.js +262 -0
  105. package/identity/machine-seed.js +632 -0
  106. package/identity/node-key.js +669 -368
  107. package/identity/tribhuj-ratchet.js +506 -0
  108. package/knowledge-base.js +37 -8
  109. package/launcher/yakmesh.bat +62 -0
  110. package/launcher/yakmesh.sh +70 -0
  111. package/mesh/annex.js +462 -108
  112. package/mesh/beacon-broadcast.js +113 -1
  113. package/mesh/darshan.js +1718 -0
  114. package/mesh/gumba.js +1567 -0
  115. package/mesh/jhilke.js +651 -0
  116. package/mesh/katha.js +1012 -0
  117. package/mesh/nakpak-routing.js +8 -5
  118. package/mesh/network.js +724 -34
  119. package/mesh/pulse-sync.js +4 -1
  120. package/mesh/rate-limiter.js +127 -15
  121. package/mesh/seva.js +526 -0
  122. package/mesh/sherpa-discovery.js +89 -8
  123. package/mesh/sybil-defense.js +19 -5
  124. package/mesh/temporal-encoder.js +4 -3
  125. package/mesh/vani.js +1364 -0
  126. package/mesh/yurt.js +1340 -0
  127. package/models/entropy-sentinel.onnx +0 -0
  128. package/models/karma-trust.onnx +0 -0
  129. package/models/manifest.json +43 -0
  130. package/models/sakshi-anomaly.onnx +0 -0
  131. package/oracle/code-proof-protocol.js +7 -6
  132. package/oracle/codebase-lock.js +257 -28
  133. package/oracle/index.js +74 -15
  134. package/oracle/ma902-snmp.js +678 -0
  135. package/oracle/module-sealer.js +5 -3
  136. package/oracle/network-identity.js +16 -0
  137. package/oracle/packet-checksum.js +201 -0
  138. package/oracle/sst.js +579 -0
  139. package/oracle/ternary-144t.js +714 -0
  140. package/oracle/ternary-ml.js +481 -0
  141. package/oracle/time-api.js +239 -0
  142. package/oracle/time-source.js +137 -47
  143. package/oracle/validation-oracle-hardened.js +1111 -1071
  144. package/oracle/validation-oracle.js +4 -2
  145. package/oracle/ypc27.js +211 -0
  146. package/package.json +20 -3
  147. package/protocol/yak-handler.js +35 -9
  148. package/protocol/yak-protocol.js +28 -13
  149. package/reference/cpp/yakmesh_mceliece_shard.cpp +168 -0
  150. package/reference/cpp/yakmesh_ypc27.cpp +179 -0
  151. package/sbom.json +87 -0
  152. package/scripts/security-audit.mjs +264 -0
  153. package/scripts/update-docs-nav.js +194 -0
  154. package/scripts/update-docs-sidebar.cjs +164 -0
  155. package/security/crypto-config.js +4 -3
  156. package/security/dharma-moderation.js +517 -0
  157. package/security/doko-identity.js +193 -143
  158. package/security/domain-consensus.js +86 -85
  159. package/security/fs-hardening.js +620 -0
  160. package/security/hardware-attestation.js +5 -3
  161. package/security/hybrid-trust.js +227 -87
  162. package/security/karma-rate-limiter.js +692 -0
  163. package/security/khata-protocol.js +22 -21
  164. package/security/khata-trust-integration.js +277 -150
  165. package/security/memory-safety.js +635 -0
  166. package/security/mesh-auth.js +11 -10
  167. package/security/mesh-revocation.js +373 -5
  168. package/security/namche-gateway.js +298 -69
  169. package/security/sakshi.js +460 -3
  170. package/security/sangha.js +770 -0
  171. package/security/secure-config.js +473 -0
  172. package/security/silicon-parity.js +13 -10
  173. package/security/steadywatch.js +1142 -0
  174. package/security/strike-system.js +32 -3
  175. package/security/temporal-signing.js +488 -0
  176. package/security/trit-commitment.js +464 -0
  177. package/server/crypto/annex.js +247 -0
  178. package/server/darshan-api.js +343 -0
  179. package/server/index.js +3259 -362
  180. package/server/komm-api.js +668 -0
  181. package/utils/accel.js +2273 -0
  182. package/utils/ternary-id.js +79 -0
  183. package/utils/verify-worker.js +57 -0
  184. package/webserver/index.js +95 -5
  185. package/assets/yakmesh-logo.png +0 -0
  186. package/assets/yakmesh-logo.svg +0 -80
  187. package/assets/yakmesh-logo2.png +0 -0
  188. package/assets/yakmesh-logo2sm.png +0 -0
  189. package/assets/ymsm.png +0 -0
  190. package/website/assets/silhouettes/adapters.svg +0 -107
  191. package/website/assets/silhouettes/api-endpoints.svg +0 -115
  192. package/website/assets/silhouettes/atomic-clock.svg +0 -83
  193. package/website/assets/silhouettes/base-camp.svg +0 -81
  194. package/website/assets/silhouettes/bridge.svg +0 -69
  195. package/website/assets/silhouettes/docs-bundle.svg +0 -113
  196. package/website/assets/silhouettes/doko-basket.svg +0 -70
  197. package/website/assets/silhouettes/fortress.svg +0 -93
  198. package/website/assets/silhouettes/gateway.svg +0 -54
  199. package/website/assets/silhouettes/gears.svg +0 -93
  200. package/website/assets/silhouettes/globe-satellite.svg +0 -67
  201. package/website/assets/silhouettes/karma-wheel.svg +0 -137
  202. package/website/assets/silhouettes/lama-council.svg +0 -141
  203. package/website/assets/silhouettes/mandala-network.svg +0 -169
  204. package/website/assets/silhouettes/mani-stones.svg +0 -149
  205. package/website/assets/silhouettes/mantra-wheel.svg +0 -116
  206. package/website/assets/silhouettes/mesh-nodes.svg +0 -113
  207. package/website/assets/silhouettes/nakpak.svg +0 -56
  208. package/website/assets/silhouettes/peak-lightning.svg +0 -73
  209. package/website/assets/silhouettes/sherpa.svg +0 -69
  210. package/website/assets/silhouettes/stupa-tower.svg +0 -119
  211. package/website/assets/silhouettes/tattva-eye.svg +0 -78
  212. package/website/assets/silhouettes/terminal.svg +0 -74
  213. package/website/assets/silhouettes/webserver.svg +0 -145
  214. package/website/assets/silhouettes/yak.svg +0 -78
  215. package/website/assets/yakmesh-logo.png +0 -0
  216. package/website/assets/yakmesh-logo.webp +0 -0
  217. package/website/assets/yakmesh-logo128x140.webp +0 -0
  218. package/website/assets/yakmesh-logo2.png +0 -0
  219. package/website/assets/yakmesh-logo2.svg +0 -51
  220. package/website/assets/yakmesh-logo40x44.webp +0 -0
  221. package/website/assets/yakmesh.gif +0 -0
  222. package/website/assets/yakmesh.ico +0 -0
  223. package/website/assets/yakmesh.jpg +0 -0
  224. package/website/assets/yakmesh.pdf +0 -0
  225. package/website/assets/yakmesh.png +0 -0
  226. package/website/assets/yakmesh.svg +0 -70
  227. package/website/assets/yakmesh128.webp +0 -0
  228. package/website/assets/yakmesh32.png +0 -0
  229. package/website/assets/yakmesh32.svg +0 -65
  230. package/website/assets/yakmesh32o.ico +0 -2
  231. package/website/assets/yakmesh32o.svg +0 -65
  232. package/website/assets/yakmesh32o.svgz +0 -0
package/docs/yurt.html ADDED
@@ -0,0 +1,1344 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en" data-theme="yurt">
3
+
4
+ <head>
5
+ <meta charset="UTF-8">
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
+ <link rel="icon" href="favicon.ico" sizes="32x32">
8
+ <link rel="icon" href="icon.svg" type="image/svg+xml">
9
+ <link rel="apple-touch-icon" href="apple-touch-icon.png">
10
+ <title>YURT - Room Discovery | YAKMESH Documentation</title>
11
+ <meta name="description"
12
+ content="YURT: YAK Unified Room Tags. Decentralized room discovery for YakApp chat rooms with direct yak:// links and gossip propagation.">
13
+
14
+ <link rel="stylesheet" href="tailwind.min.css">
15
+ <link rel="stylesheet" href="prism-tomorrow.min.css" media="print" onload="this.media='all'">
16
+ <noscript>
17
+ <link rel="stylesheet" href="prism-tomorrow.min.css">
18
+ </noscript>
19
+ <link rel="stylesheet" href="docs.css">
20
+ <style>
21
+ /* Page-specific theme - Nomadic Steppe theme (warm browns/oranges) */
22
+ .theme-accent {
23
+ color: #fb923c;
24
+ }
25
+
26
+ .theme-accent-hover:hover {
27
+ color: #fdba74;
28
+ }
29
+
30
+ .theme-badge {
31
+ background: rgba(251, 146, 60, 0.2);
32
+ color: #fb923c;
33
+ }
34
+
35
+ .theme-border {
36
+ border-color: #ea580c;
37
+ }
38
+
39
+ .theme-callout {
40
+ background: rgba(251, 146, 60, 0.1);
41
+ border-color: #c2410c;
42
+ }
43
+
44
+ .active-link {
45
+ background: rgba(251, 146, 60, 0.2) !important;
46
+ color: #fb923c !important;
47
+ }
48
+
49
+ .discovery-card {
50
+ background: rgba(30, 41, 59, 0.5);
51
+ border: 1px solid #334155;
52
+ border-radius: 0.75rem;
53
+ padding: 1.5rem;
54
+ }
55
+
56
+ .discovery-card:hover {
57
+ border-color: #ea580c;
58
+ }
59
+
60
+ .visibility-badge {
61
+ display: inline-block;
62
+ padding: 0.25rem 0.5rem;
63
+ border-radius: 0.25rem;
64
+ font-size: 0.75rem;
65
+ font-weight: 600;
66
+ }
67
+
68
+ .vis-public {
69
+ background: #16a34a;
70
+ color: white;
71
+ }
72
+
73
+ .vis-invite {
74
+ background: #7c3aed;
75
+ color: white;
76
+ }
77
+
78
+ .vis-unlisted {
79
+ background: #6b7280;
80
+ color: white;
81
+ }
82
+
83
+ .uri-example {
84
+ font-family: monospace;
85
+ background: rgba(0, 0, 0, 0.3);
86
+ padding: 0.5rem 1rem;
87
+ border-radius: 0.5rem;
88
+ border-left: 3px solid #fb923c;
89
+ }
90
+ </style>
91
+
92
+ <!-- Open Graph -->
93
+ <meta property="og:type" content="article">
94
+ <meta property="og:site_name" content="Yakmesh Documentation">
95
+ <meta property="og:title" content="YURT — Yakmesh">
96
+ <meta property="og:description" content="YURT room discovery and management — create and find mesh chat rooms.">
97
+ </head>
98
+
99
+ <body class="bg-mountain-900 text-white min-h-screen">
100
+ <!-- YAKMESH-ICON-SPRITE-START -->
101
+ <svg xmlns="http://www.w3.org/2000/svg" style="display:none">
102
+ <!--
103
+ Yakmesh Docs Icon Sprite Sheet
104
+ 24×24 viewBox — stroke/fill set via .doc-icon CSS
105
+ Usage: <svg class="doc-icon"><use href="#icon-name"/></svg>
106
+ -->
107
+
108
+ <!-- ═══ GUIDES ═══ -->
109
+
110
+ <symbol id="icon-home" viewBox="0 0 24 24">
111
+ <path d="M3 9.5L12 3l9 6.5V20a1 1 0 01-1 1H4a1 1 0 01-1-1V9.5z" />
112
+ <polyline points="9 22 9 12 15 12 15 22" />
113
+ </symbol>
114
+
115
+ <symbol id="icon-rocket" viewBox="0 0 24 24">
116
+ <path d="M4.5 16.5c-1.5 1.26-2 5-2 5s3.74-.5 5-2c.71-.84.7-2.13-.09-2.91a2.18 2.18 0 00-2.91-.09z" />
117
+ <path d="M12 15l-3-3a22 22 0 012-3.95A12.88 12.88 0 0122 2c0 2.72-.78 7.5-6 11a22.35 22.35 0 01-4 2z" />
118
+ <path d="M9 12H4s.55-3.03 2-4c1.62-1.08 5 0 5 0" />
119
+ <path d="M12 15v5s3.03-.55 4-2c1.08-1.62 0-5 0-5" />
120
+ </symbol>
121
+
122
+ <symbol id="icon-book" viewBox="0 0 24 24">
123
+ <path d="M4 19.5A2.5 2.5 0 016.5 17H20" />
124
+ <path d="M6.5 2H20v20H6.5A2.5 2.5 0 014 19.5v-15A2.5 2.5 0 016.5 2z" />
125
+ <line x1="8" y1="7" x2="16" y2="7" />
126
+ <line x1="8" y1="11" x2="13" y2="11" />
127
+ </symbol>
128
+
129
+ <!-- ═══ PROTOCOL STACK ═══ -->
130
+
131
+ <!-- YAK:// — Content addressing (yak horns) -->
132
+ <symbol id="icon-yak" viewBox="0 0 24 24">
133
+ <path d="M4 4c1 3 3 5 5 6" />
134
+ <path d="M20 4c-1 3-3 5-5 6" />
135
+ <circle cx="12" cy="14" r="5" />
136
+ <circle cx="10" cy="13" r="0.5" fill="currentColor" />
137
+ <circle cx="14" cy="13" r="0.5" fill="currentColor" />
138
+ <path d="M10 16c1 1 3 1 4 0" />
139
+ </symbol>
140
+
141
+ <!-- ANNEX — Encrypted bridge -->
142
+ <symbol id="icon-annex" viewBox="0 0 24 24">
143
+ <path d="M4 18h3a4 4 0 004-4V8" />
144
+ <path d="M20 18h-3a4 4 0 01-4-4V8" />
145
+ <circle cx="7" cy="6" r="2" />
146
+ <circle cx="17" cy="6" r="2" />
147
+ <line x1="7" y1="8" x2="7" y2="18" />
148
+ <line x1="17" y1="8" x2="17" y2="18" />
149
+ </symbol>
150
+
151
+ <!-- JHILKE — Cricket / steganographic key lifecycle -->
152
+ <symbol id="icon-jhilke" viewBox="0 0 24 24">
153
+ <ellipse cx="12" cy="14" rx="4" ry="6" />
154
+ <path d="M8 10c-2-3-4-6-3-8" />
155
+ <path d="M16 10c2-3 4-6 3-8" />
156
+ <line x1="10" y1="20" x2="8" y2="23" />
157
+ <line x1="14" y1="20" x2="16" y2="23" />
158
+ <path d="M9 12l-4 2" />
159
+ <path d="M15 12l4 2" />
160
+ </symbol>
161
+
162
+ <!-- NAKPAK — Onion layers / backpack -->
163
+ <symbol id="icon-nakpak" viewBox="0 0 24 24">
164
+ <circle cx="12" cy="12" r="10" opacity="0.3" />
165
+ <circle cx="12" cy="12" r="7" opacity="0.5" />
166
+ <circle cx="12" cy="12" r="4" opacity="0.8" />
167
+ <circle cx="12" cy="12" r="1.5" fill="currentColor" />
168
+ </symbol>
169
+
170
+ <!-- NAMCHE — Gateway door -->
171
+ <symbol id="icon-namche" viewBox="0 0 24 24">
172
+ <rect x="3" y="3" width="18" height="18" rx="2" />
173
+ <path d="M9 3v18" />
174
+ <path d="M15 3v18" />
175
+ <line x1="3" y1="8" x2="9" y2="8" />
176
+ <line x1="15" y1="8" x2="21" y2="8" />
177
+ <circle cx="12" cy="14" r="1" fill="currentColor" />
178
+ </symbol>
179
+
180
+ <!-- DOKO — Basket / certificate -->
181
+ <symbol id="icon-doko" viewBox="0 0 24 24">
182
+ <path d="M6 8l-2 12h16l-2-12" />
183
+ <path d="M6 8c0-3 2.7-5 6-5s6 2 6 5" />
184
+ <line x1="8" y1="10" x2="10" y2="18" />
185
+ <line x1="16" y1="10" x2="14" y2="18" />
186
+ <line x1="12" y1="10" x2="12" y2="18" />
187
+ </symbol>
188
+
189
+ <!-- SHERPA — Mountain climber -->
190
+ <symbol id="icon-sherpa" viewBox="0 0 24 24">
191
+ <path d="M4 20L10 6l3 6 3-4 4 12" />
192
+ <line x1="4" y1="20" x2="20" y2="20" />
193
+ <circle cx="13" cy="4" r="1.5" />
194
+ </symbol>
195
+
196
+ <!-- MANDALA — Network topology web -->
197
+ <symbol id="icon-mandala" viewBox="0 0 24 24">
198
+ <circle cx="12" cy="12" r="9" />
199
+ <circle cx="12" cy="12" r="4.5" />
200
+ <line x1="12" y1="3" x2="12" y2="21" />
201
+ <line x1="3" y1="12" x2="21" y2="12" />
202
+ <line x1="5.6" y1="5.6" x2="18.4" y2="18.4" />
203
+ <line x1="18.4" y1="5.6" x2="5.6" y2="18.4" />
204
+ </symbol>
205
+
206
+ <!-- MANTRA — Gossip / prayer wheel -->
207
+ <symbol id="icon-mantra" viewBox="0 0 24 24">
208
+ <circle cx="12" cy="10" r="7" />
209
+ <path d="M12 3v14" />
210
+ <path d="M8 7c2 1.5 6 1.5 8 0" />
211
+ <path d="M8 13c2-1.5 6-1.5 8 0" />
212
+ <line x1="12" y1="17" x2="12" y2="22" />
213
+ <line x1="9" y1="22" x2="15" y2="22" />
214
+ </symbol>
215
+
216
+ <!-- GUMBA — Temple / access control -->
217
+ <symbol id="icon-gumba" viewBox="0 0 24 24">
218
+ <path d="M12 2L3 9h18z" />
219
+ <line x1="5" y1="9" x2="5" y2="19" />
220
+ <line x1="9" y1="9" x2="9" y2="19" />
221
+ <line x1="15" y1="9" x2="15" y2="19" />
222
+ <line x1="19" y1="9" x2="19" y2="19" />
223
+ <line x1="3" y1="19" x2="21" y2="19" />
224
+ <line x1="3" y1="21" x2="21" y2="21" />
225
+ </symbol>
226
+
227
+ <!-- YURT — Camp / room -->
228
+ <symbol id="icon-yurt" viewBox="0 0 24 24">
229
+ <path d="M3 20L12 4l9 16" />
230
+ <line x1="3" y1="20" x2="21" y2="20" />
231
+ <path d="M10 20v-5a2 2 0 014 0v5" />
232
+ <path d="M6 14h12" />
233
+ </symbol>
234
+
235
+ <!-- KATHA — Chat / story scroll -->
236
+ <symbol id="icon-katha" viewBox="0 0 24 24">
237
+ <path d="M21 15a2 2 0 01-2 2H7l-4 4V5a2 2 0 012-2h14a2 2 0 012 2z" />
238
+ <line x1="8" y1="8" x2="16" y2="8" />
239
+ <line x1="8" y1="12" x2="13" y2="12" />
240
+ </symbol>
241
+
242
+ <!-- VANI — Voice / microphone -->
243
+ <symbol id="icon-vani" viewBox="0 0 24 24">
244
+ <rect x="9" y="2" width="6" height="11" rx="3" />
245
+ <path d="M5 10a7 7 0 0014 0" />
246
+ <line x1="12" y1="17" x2="12" y2="22" />
247
+ <line x1="8" y1="22" x2="16" y2="22" />
248
+ </symbol>
249
+
250
+ <!-- DARSHAN — Eye / viewing -->
251
+ <symbol id="icon-darshan" viewBox="0 0 24 24">
252
+ <path d="M1 12s4-8 11-8 11 8 11 8-4 8-11 8S1 12 1 12z" />
253
+ <circle cx="12" cy="12" r="3" />
254
+ </symbol>
255
+
256
+ <!-- STUPA — Tower / distributed storage -->
257
+ <symbol id="icon-stupa" viewBox="0 0 24 24">
258
+ <line x1="12" y1="2" x2="12" y2="5" />
259
+ <path d="M10 5h4l1 3H9z" />
260
+ <ellipse cx="12" cy="11" rx="5" ry="3" />
261
+ <ellipse cx="12" cy="15" rx="6" ry="3" />
262
+ <ellipse cx="12" cy="19" rx="7" ry="3" />
263
+ </symbol>
264
+
265
+ <!-- LAMA — Crystal ball / consensus -->
266
+ <symbol id="icon-lama" viewBox="0 0 24 24">
267
+ <circle cx="12" cy="10" r="7" />
268
+ <path d="M12 3c-1.5 2-2 5 0 7s4.5 2 6 0" />
269
+ <path d="M7 19h10" />
270
+ <path d="M9 22h6" />
271
+ <line x1="9" y1="17" x2="9" y2="19" />
272
+ <line x1="15" y1="17" x2="15" y2="19" />
273
+ </symbol>
274
+
275
+ <!-- MANI — Prayer stone / time sync -->
276
+ <symbol id="icon-mani" viewBox="0 0 24 24">
277
+ <circle cx="12" cy="12" r="9" />
278
+ <polyline points="12 6 12 12 16 14" />
279
+ <circle cx="12" cy="12" r="1" fill="currentColor" />
280
+ </symbol>
281
+
282
+ <!-- KARMA — Yin-yang / reputation -->
283
+ <symbol id="icon-karma" viewBox="0 0 24 24">
284
+ <circle cx="12" cy="12" r="9" />
285
+ <path d="M12 3a4.5 4.5 0 010 9 4.5 4.5 0 000 9" />
286
+ <circle cx="12" cy="7.5" r="1.5" fill="currentColor" />
287
+ <circle cx="12" cy="16.5" r="1.5" />
288
+ </symbol>
289
+
290
+ <!-- TATTVA — Quantum elements / atom -->
291
+ <symbol id="icon-tattva" viewBox="0 0 24 24">
292
+ <circle cx="12" cy="12" r="2.5" fill="currentColor" stroke="none" />
293
+ <ellipse cx="12" cy="12" rx="10" ry="4" />
294
+ <ellipse cx="12" cy="12" rx="10" ry="4" transform="rotate(60 12 12)" />
295
+ <ellipse cx="12" cy="12" rx="10" ry="4" transform="rotate(120 12 12)" />
296
+ </symbol>
297
+
298
+ <!-- TRIBHUJ — Triangle / balanced ternary -->
299
+ <symbol id="icon-tribhuj" viewBox="0 0 24 24">
300
+ <polygon points="12,3 21,20 3,20" />
301
+ <line x1="12" y1="3" x2="12" y2="20" />
302
+ <line x1="7.5" y1="11.5" x2="16.5" y2="11.5" />
303
+ <circle cx="12" cy="14" r="1" fill="currentColor" />
304
+ </symbol>
305
+
306
+ <!-- YPC-27 — Lock / cipher -->
307
+ <symbol id="icon-ypc27" viewBox="0 0 24 24">
308
+ <rect x="5" y="11" width="14" height="10" rx="2" />
309
+ <path d="M8 11V7a4 4 0 118 0v4" />
310
+ <circle cx="12" cy="16" r="1" fill="currentColor" />
311
+ <line x1="12" y1="17" x2="12" y2="19" />
312
+ </symbol>
313
+
314
+ <!-- SAKSHI — Witness / aperture eye -->
315
+ <symbol id="icon-sakshi" viewBox="0 0 24 24">
316
+ <circle cx="12" cy="12" r="9" />
317
+ <path d="M12 3l3 9-3 9" />
318
+ <path d="M12 3l-3 9 3 9" />
319
+ <circle cx="12" cy="12" r="2.5" />
320
+ <circle cx="12" cy="12" r="0.8" fill="currentColor" />
321
+ </symbol>
322
+
323
+ <!-- PRAMAAN — Globe / geographic proof -->
324
+ <symbol id="icon-pramaan" viewBox="0 0 24 24">
325
+ <circle cx="12" cy="12" r="9" />
326
+ <ellipse cx="12" cy="12" rx="4" ry="9" />
327
+ <line x1="3" y1="9" x2="21" y2="9" />
328
+ <line x1="3" y1="15" x2="21" y2="15" />
329
+ <path d="M18 4l-2 2 1 3" />
330
+ <path d="M6 18l2-1 3 1" />
331
+ </symbol>
332
+
333
+ <!-- SURAKSHA — Shield / security -->
334
+ <symbol id="icon-suraksha" viewBox="0 0 24 24">
335
+ <path d="M12 2l8 4v6c0 5.5-3.8 10.7-8 12-4.2-1.3-8-6.5-8-12V6z" />
336
+ <polyline points="9 12 11 14 15 10" />
337
+ </symbol>
338
+
339
+ <!-- TIVRA — Lightning bolt / acceleration -->
340
+ <symbol id="icon-tivra" viewBox="0 0 24 24">
341
+ <polygon points="13,2 3,14 12,14 11,22 21,10 12,10" />
342
+ </symbol>
343
+
344
+ <!-- PRAHARI — Satellite / sentinel -->
345
+ <symbol id="icon-prahari" viewBox="0 0 24 24">
346
+ <rect x="9" y="9" width="6" height="6" rx="1" transform="rotate(45 12 12)" />
347
+ <line x1="12" y1="5" x2="12" y2="2" />
348
+ <line x1="19" y1="12" x2="22" y2="12" />
349
+ <line x1="12" y1="19" x2="12" y2="22" />
350
+ <line x1="5" y1="12" x2="2" y2="12" />
351
+ <path d="M7 7L5 5" />
352
+ <path d="M17 7l2-2" />
353
+ </symbol>
354
+
355
+ <!-- DHARMA — Balance scale / content moderation -->
356
+ <symbol id="icon-dharma" viewBox="0 0 24 24">
357
+ <line x1="12" y1="3" x2="12" y2="21" />
358
+ <line x1="4" y1="7" x2="20" y2="7" />
359
+ <path d="M4 7l2 7h0a3 3 0 006 0h0l2-7" />
360
+ <path d="M14 7l2 7h0a3 3 0 006 0h0l2-7" />
361
+ <line x1="10" y1="21" x2="14" y2="21" />
362
+ </symbol>
363
+
364
+ <!-- SEVA — Helping hands / NPU sharing -->
365
+ <symbol id="icon-seva" viewBox="0 0 24 24">
366
+ <path d="M12 22c-4 0-8-2-8-6 0-2 1-3 3-4l5-3 5 3c2 1 3 2 3 4 0 4-4 6-8 6z" />
367
+ <path d="M12 11V5" />
368
+ <path d="M9 8l3-3 3 3" />
369
+ <circle cx="12" cy="16" r="2" />
370
+ </symbol>
371
+
372
+ <!-- ═══ APPLICATIONS ═══ -->
373
+
374
+ <!-- YakApp — Messenger -->
375
+ <symbol id="icon-yakapp" viewBox="0 0 24 24">
376
+ <path
377
+ d="M21 11.5a8.38 8.38 0 01-.9 3.8 8.5 8.5 0 01-7.6 4.7 8.38 8.38 0 01-3.8-.9L3 21l1.9-5.7a8.38 8.38 0 01-.9-3.8 8.5 8.5 0 014.7-7.6 8.38 8.38 0 013.8-.9h.5a8.48 8.48 0 018 8v.5z" />
378
+ </symbol>
379
+
380
+ <!-- C2C — Core to Cosmos -->
381
+ <symbol id="icon-c2c" viewBox="0 0 24 24">
382
+ <circle cx="12" cy="12" r="3" />
383
+ <circle cx="12" cy="12" r="9" />
384
+ <path d="M12 3v3" />
385
+ <path d="M12 18v3" />
386
+ <path d="M3 12h3" />
387
+ <path d="M18 12h3" />
388
+ </symbol>
389
+
390
+ <!-- Studio — Creative suite -->
391
+ <symbol id="icon-studio" viewBox="0 0 24 24">
392
+ <circle cx="13.5" cy="6.5" r="2.5" />
393
+ <path d="M6 21l4-10 3 5 4-7 4 12" />
394
+ <rect x="2" y="2" width="20" height="20" rx="2" />
395
+ </symbol>
396
+
397
+
398
+ <!-- ═══ REFERENCE ═══ -->
399
+
400
+ <!-- Quick Reference — Clipboard -->
401
+ <symbol id="icon-quickref" viewBox="0 0 24 24">
402
+ <path d="M16 4h2a2 2 0 012 2v14a2 2 0 01-2 2H6a2 2 0 01-2-2V6a2 2 0 012-2h2" />
403
+ <rect x="8" y="2" width="8" height="4" rx="1" />
404
+ <line x1="8" y1="10" x2="16" y2="10" />
405
+ <line x1="8" y1="14" x2="16" y2="14" />
406
+ <line x1="8" y1="18" x2="12" y2="18" />
407
+ </symbol>
408
+
409
+ <!-- GRANTH — Docs bundle -->
410
+ <symbol id="icon-granth" viewBox="0 0 24 24">
411
+ <path d="M4 19.5A2.5 2.5 0 016.5 17H20" />
412
+ <path d="M6.5 2H20v20H6.5A2.5 2.5 0 014 19.5v-15A2.5 2.5 0 016.5 2z" />
413
+ <path d="M8 7h8" />
414
+ <path d="M8 11h5" />
415
+ <path d="M8 15h3" />
416
+ </symbol>
417
+
418
+ <!-- API — Signal tower -->
419
+ <symbol id="icon-api" viewBox="0 0 24 24">
420
+ <line x1="12" y1="10" x2="12" y2="22" />
421
+ <path d="M8 6a6 6 0 018 0" />
422
+ <path d="M5 3a10 10 0 0114 0" />
423
+ <circle cx="12" cy="10" r="2" />
424
+ </symbol>
425
+
426
+ <!-- Adapters — Plug connector -->
427
+ <symbol id="icon-adapters" viewBox="0 0 24 24">
428
+ <path d="M6 3v4" />
429
+ <path d="M10 3v4" />
430
+ <path d="M4 7h8v3a4 4 0 01-8 0V7z" />
431
+ <line x1="8" y1="14" x2="8" y2="17" />
432
+ <path d="M14 10h4v3a2 2 0 01-4 0v-3z" />
433
+ <line x1="16" y1="7" x2="16" y2="10" />
434
+ <line x1="16" y1="13" x2="16" y2="17" />
435
+ <line x1="8" y1="17" x2="16" y2="17" />
436
+ <line x1="12" y1="17" x2="12" y2="21" />
437
+ </symbol>
438
+
439
+ <!-- ═══ EXTRA (pages outside nav-order) ═══ -->
440
+
441
+ <!-- Terminal / CLI -->
442
+ <symbol id="icon-terminal" viewBox="0 0 24 24">
443
+ <rect x="2" y="3" width="20" height="18" rx="2" />
444
+ <polyline points="7 9 10 12 7 15" />
445
+ <line x1="13" y1="15" x2="17" y2="15" />
446
+ </symbol>
447
+
448
+ <!-- Gear / Configuration -->
449
+ <symbol id="icon-gear" viewBox="0 0 24 24">
450
+ <circle cx="12" cy="12" r="3" />
451
+ <path
452
+ d="M19.4 15a1.65 1.65 0 00.33 1.82l.06.06a2 2 0 01-2.83 2.83l-.06-.06a1.65 1.65 0 00-1.82-.33 1.65 1.65 0 00-1 1.51V21a2 2 0 01-4 0v-.09A1.65 1.65 0 009 19.4a1.65 1.65 0 00-1.82.33l-.06.06a2 2 0 01-2.83-2.83l.06-.06A1.65 1.65 0 004.68 15a1.65 1.65 0 00-1.51-1H3a2 2 0 010-4h.09A1.65 1.65 0 004.6 9a1.65 1.65 0 00-.33-1.82l-.06-.06a2 2 0 012.83-2.83l.06.06A1.65 1.65 0 009 4.68a1.65 1.65 0 001-1.51V3a2 2 0 014 0v.09a1.65 1.65 0 001 1.51 1.65 1.65 0 001.82-.33l.06-.06a2 2 0 012.83 2.83l-.06.06A1.65 1.65 0 0019.4 9a1.65 1.65 0 001.51 1H21a2 2 0 010 4h-.09a1.65 1.65 0 00-1.51 1z" />
453
+ </symbol>
454
+
455
+ <!-- Server / Web hosting -->
456
+ <symbol id="icon-server" viewBox="0 0 24 24">
457
+ <rect x="2" y="2" width="20" height="8" rx="2" />
458
+ <rect x="2" y="14" width="20" height="8" rx="2" />
459
+ <line x1="6" y1="6" x2="6.01" y2="6" />
460
+ <line x1="6" y1="18" x2="6.01" y2="18" />
461
+ </symbol>
462
+
463
+ <!-- ═══ CHROME / UI ═══ -->
464
+
465
+ <!-- Mountain peak — logo icon (replaces 🏔️) -->
466
+ <symbol id="icon-mountain" viewBox="0 0 24 24">
467
+ <path d="M8 21l4.5-9 3 5.5L19 12l3 9H2l6-9z" />
468
+ <path d="M12 12l1.5-3L16 14" />
469
+ </symbol>
470
+
471
+ <!-- Dashboard / bar chart (replaces 📊) -->
472
+ <symbol id="icon-dashboard" viewBox="0 0 24 24">
473
+ <line x1="18" y1="20" x2="18" y2="10" />
474
+ <line x1="12" y1="20" x2="12" y2="4" />
475
+ <line x1="6" y1="20" x2="6" y2="14" />
476
+ <rect x="2" y="2" width="20" height="20" rx="2" stroke-opacity="0.4" />
477
+ </symbol>
478
+
479
+ <!-- ═══ GENERIC / CONTENT ICONS ═══ -->
480
+
481
+ <!-- Lock / encrypted (replaces 🔐) -->
482
+ <symbol id="icon-lock" viewBox="0 0 24 24">
483
+ <rect x="3" y="11" width="18" height="11" rx="2" />
484
+ <path d="M7 11V7a5 5 0 0110 0v4" />
485
+ </symbol>
486
+
487
+ <!-- Signal / broadcast (replaces 📡) -->
488
+ <symbol id="icon-signal" viewBox="0 0 24 24">
489
+ <path d="M2 12a10 10 0 0118 0" />
490
+ <path d="M5 12a7 7 0 0112 0" />
491
+ <path d="M8 12a4 4 0 016 0" />
492
+ <circle cx="11" cy="12" r="1" />
493
+ </symbol>
494
+
495
+ <!-- Link / chain (replaces 🔗) -->
496
+ <symbol id="icon-link" viewBox="0 0 24 24">
497
+ <path d="M10 13a5 5 0 007.54.54l3-3a5 5 0 00-7.07-7.07l-1.72 1.71" />
498
+ <path d="M14 11a5 5 0 00-7.54-.54l-3 3a5 5 0 007.07 7.07l1.71-1.71" />
499
+ </symbol>
500
+
501
+ <!-- Globe / network (replaces 🌐) -->
502
+ <symbol id="icon-globe" viewBox="0 0 24 24">
503
+ <circle cx="12" cy="12" r="10" />
504
+ <line x1="2" y1="12" x2="22" y2="12" />
505
+ <path d="M12 2a15.3 15.3 0 014 10 15.3 15.3 0 01-4 10 15.3 15.3 0 01-4-10 15.3 15.3 0 014-10z" />
506
+ </symbol>
507
+
508
+ <!-- Sync / refresh (replaces 🔄) -->
509
+ <symbol id="icon-sync" viewBox="0 0 24 24">
510
+ <polyline points="23 4 23 10 17 10" />
511
+ <polyline points="1 20 1 14 7 14" />
512
+ <path d="M3.51 9a9 9 0 0114.85-3.36L23 10M1 14l4.64 4.36A9 9 0 0020.49 15" />
513
+ </symbol>
514
+
515
+ <!-- Users / group (replaces 👥) -->
516
+ <symbol id="icon-users" viewBox="0 0 24 24">
517
+ <path d="M17 21v-2a4 4 0 00-4-4H5a4 4 0 00-4 4v2" />
518
+ <circle cx="9" cy="7" r="4" />
519
+ <path d="M23 21v-2a4 4 0 00-3-3.87" />
520
+ <path d="M16 3.13a4 4 0 010 7.75" />
521
+ </symbol>
522
+
523
+ <!-- Shield / protection (replaces 🛡) -->
524
+ <symbol id="icon-shield" viewBox="0 0 24 24">
525
+ <path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z" />
526
+ </symbol>
527
+
528
+ <!-- Heartbeat / pulse (replaces 💓) -->
529
+ <symbol id="icon-heartbeat" viewBox="0 0 24 24">
530
+ <path d="M3 12h4l3-9 4 18 3-9h4" />
531
+ </symbol>
532
+
533
+ <!-- Map pin / location (replaces 📍) -->
534
+ <symbol id="icon-pin" viewBox="0 0 24 24">
535
+ <path d="M21 10c0 7-9 13-9 13s-9-6-9-13a9 9 0 0118 0z" />
536
+ <circle cx="12" cy="10" r="3" />
537
+ </symbol>
538
+
539
+ <!-- Traffic light / status (replaces 🚦) -->
540
+ <symbol id="icon-traffic" viewBox="0 0 24 24">
541
+ <rect x="7" y="2" width="10" height="20" rx="3" />
542
+ <circle cx="12" cy="7" r="1.5" />
543
+ <circle cx="12" cy="12" r="1.5" />
544
+ <circle cx="12" cy="17" r="1.5" />
545
+ </symbol>
546
+
547
+ <!-- Check circle (replaces ✅) -->
548
+ <symbol id="icon-check" viewBox="0 0 24 24">
549
+ <path d="M22 11.08V12a10 10 0 11-5.93-9.14" />
550
+ <polyline points="22 4 12 14.01 9 11.01" />
551
+ </symbol>
552
+
553
+ <!-- Megaphone / broadcast (replaces 📢) -->
554
+ <symbol id="icon-megaphone" viewBox="0 0 24 24">
555
+ <path d="M21 15a2 2 0 01-2 2H7l-4 4V5a2 2 0 012-2h14a2 2 0 012 2z" />
556
+ </symbol>
557
+
558
+ <!-- Pen / signed (replaces ✍) -->
559
+ <symbol id="icon-pen" viewBox="0 0 24 24">
560
+ <path d="M12 20h9" />
561
+ <path d="M16.5 3.5a2.121 2.121 0 013 3L7 19l-4 1 1-4L16.5 3.5z" />
562
+ </symbol>
563
+
564
+ <!-- Warning / alert (replaces ⚠) -->
565
+ <symbol id="icon-warning" viewBox="0 0 24 24">
566
+ <path d="M10.29 3.86L1.82 18a2 2 0 001.71 3h16.94a2 2 0 001.71-3L13.71 3.86a2 2 0 00-3.42 0z" />
567
+ <line x1="12" y1="9" x2="12" y2="13" />
568
+ <line x1="12" y1="17" x2="12.01" y2="17" />
569
+ </symbol>
570
+
571
+ <!-- Hourglass / timer (replaces ⏳) -->
572
+ <symbol id="icon-hourglass" viewBox="0 0 24 24">
573
+ <path d="M6 2h12v5l-4 4 4 4v5H6v-5l4-4-4-4V2z" />
574
+ </symbol>
575
+
576
+ <!-- Scroll / document (replaces 📜) -->
577
+ <symbol id="icon-scroll" viewBox="0 0 24 24">
578
+ <path d="M14 2H6a2 2 0 00-2 2v16a2 2 0 002 2h12a2 2 0 002-2V8z" />
579
+ <polyline points="14 2 14 8 20 8" />
580
+ <line x1="16" y1="13" x2="8" y2="13" />
581
+ <line x1="16" y1="17" x2="8" y2="17" />
582
+ </symbol>
583
+
584
+ <!-- Bolt / lightning (replaces ⚡) -->
585
+ <symbol id="icon-bolt" viewBox="0 0 24 24">
586
+ <polygon points="13 2 3 14 12 14 11 22 21 10 12 10 13 2" />
587
+ </symbol>
588
+
589
+ <!-- Target / crosshair (replaces 🎯) -->
590
+ <symbol id="icon-target" viewBox="0 0 24 24">
591
+ <circle cx="12" cy="12" r="10" />
592
+ <circle cx="12" cy="12" r="6" />
593
+ <circle cx="12" cy="12" r="2" />
594
+ </symbol>
595
+
596
+ <!-- Handshake / trust (replaces 🤝) -->
597
+ <symbol id="icon-handshake" viewBox="0 0 24 24">
598
+ <path d="M11 17l-3.5-3.5a2.12 2.12 0 013-3L14 14" />
599
+ <path d="M20.88 7.12l-3.17 3.17" />
600
+ <path d="M3.12 7.12l3.17 3.17" />
601
+ <path d="M2 12h4" />
602
+ <path d="M18 12h4" />
603
+ <path d="M7.76 4.25L12 2l4.24 2.25" />
604
+ </symbol>
605
+
606
+ <!-- Leaf / organic (replaces 🌿) -->
607
+ <symbol id="icon-leaf" viewBox="0 0 24 24">
608
+ <path d="M17 8C8 10 5.9 16.17 3.82 21.34l1.89.66.95-2.3c.48.17.98.3 1.34.3C19 20 22 3 22 3c-1 0-8 0-10 2" />
609
+ <path d="M7 15c2-2 5.5-3 9-3" />
610
+ </symbol>
611
+
612
+ <!-- Satellite (replaces 🛰) -->
613
+ <symbol id="icon-satellite" viewBox="0 0 24 24">
614
+ <path d="M13 7L9 3 5 7l4 4" />
615
+ <path d="M17 11l4 4-4 4-4-4" />
616
+ <line x1="8" y1="11" x2="13" y2="16" />
617
+ <line x1="3" y1="21" x2="3.01" y2="21" />
618
+ <path d="M6 18a3 3 0 000 0" />
619
+ <path d="M9 15a6 6 0 000 0" />
620
+ </symbol>
621
+
622
+ <!-- Phone / mobile (replaces 📱) -->
623
+ <symbol id="icon-phone" viewBox="0 0 24 24">
624
+ <rect x="5" y="2" width="14" height="20" rx="2" />
625
+ <line x1="12" y1="18" x2="12.01" y2="18" />
626
+ </symbol>
627
+
628
+ <!-- Masks / theater (replaces 🎭) -->
629
+ <symbol id="icon-masks" viewBox="0 0 24 24">
630
+ <circle cx="12" cy="12" r="10" />
631
+ <path d="M8 14s1.5 2 4 2 4-2 4-2" />
632
+ <line x1="9" y1="9" x2="9.01" y2="9" />
633
+ <line x1="15" y1="9" x2="15.01" y2="9" />
634
+ </symbol>
635
+
636
+ <!-- Stars / cosmos (replaces 🌌) -->
637
+ <symbol id="icon-cosmos" viewBox="0 0 24 24">
638
+ <polygon
639
+ points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2" />
640
+ </symbol>
641
+
642
+ <!-- Gem / diamond (replaces 💎) -->
643
+ <symbol id="icon-gem" viewBox="0 0 24 24">
644
+ <polygon points="6 3 18 3 22 9 12 22 2 9 6 3" />
645
+ <line x1="2" y1="9" x2="22" y2="9" />
646
+ <line x1="12" y1="22" x2="8" y2="9" />
647
+ <line x1="12" y1="22" x2="16" y2="9" />
648
+ <line x1="8" y1="9" x2="10" y2="3" />
649
+ <line x1="16" y1="9" x2="14" y2="3" />
650
+ </symbol>
651
+
652
+ <!-- Search / magnifying glass (replaces 🔍) -->
653
+ <symbol id="icon-search" viewBox="0 0 24 24">
654
+ <circle cx="11" cy="11" r="8" />
655
+ <line x1="21" y1="21" x2="16.65" y2="16.65" />
656
+ </symbol>
657
+
658
+ </svg>
659
+ <!-- YAKMESH-ICON-SPRITE-END -->
660
+ <a href="#mainContent" class="skip-link">Skip to main content</a>
661
+
662
+ <nav class="docs-sidebar" id="sidebar">
663
+ <a href="index.html" class="sidebar-logo">
664
+ <span class="logo-icon"><svg class="doc-icon" aria-hidden="true">
665
+ <use href="#icon-mountain" />
666
+ </svg></span>
667
+ <span class="logo-text">Yakmesh</span>
668
+ </a>
669
+ <a href="/dashboard" class="sidebar-dashboard-link"><svg class="doc-icon" aria-hidden="true">
670
+ <use href="#icon-dashboard" />
671
+ </svg> <span>Dashboard</span></a>
672
+ <ul class="sidebar-nav">
673
+ <li class="sidebar-section"><span><svg class="doc-icon" aria-hidden="true">
674
+ <use href="#icon-book" />
675
+ </svg> Guides</span></li>
676
+ <li><a href="index.html"><svg class="doc-icon" aria-hidden="true">
677
+ <use href="#icon-home" />
678
+ </svg> <span>Overview</span></a></li>
679
+ <li><a href="getting-started.html"><svg class="doc-icon" aria-hidden="true">
680
+ <use href="#icon-rocket" />
681
+ </svg> <span>Getting Started</span></a></li>
682
+ <li><a href="tutorials.html"><svg class="doc-icon" aria-hidden="true">
683
+ <use href="#icon-book" />
684
+ </svg> <span>Tutorials</span></a></li>
685
+ <li class="sidebar-section"><span><svg class="doc-icon" aria-hidden="true">
686
+ <use href="#icon-yak" />
687
+ </svg> Protocol Stack</span></li>
688
+ <li><a href="yak-protocol.html"><svg class="doc-icon" aria-hidden="true">
689
+ <use href="#icon-yak" />
690
+ </svg> <span>YAK://</span></a></li>
691
+ <li><a href="annex.html"><svg class="doc-icon" aria-hidden="true">
692
+ <use href="#icon-annex" />
693
+ </svg> <span>ANNEX</span></a></li>
694
+ <li><a href="jhilke.html"><svg class="doc-icon" aria-hidden="true">
695
+ <use href="#icon-jhilke" />
696
+ </svg> <span>JHILKE</span></a></li>
697
+ <li><a href="nakpak.html"><svg class="doc-icon" aria-hidden="true">
698
+ <use href="#icon-nakpak" />
699
+ </svg> <span>NAKPAK</span></a></li>
700
+ <li><a href="namche.html"><svg class="doc-icon" aria-hidden="true">
701
+ <use href="#icon-namche" />
702
+ </svg> <span>NAMCHE</span></a></li>
703
+ <li><a href="doko.html"><svg class="doc-icon" aria-hidden="true">
704
+ <use href="#icon-doko" />
705
+ </svg> <span>DOKO</span></a></li>
706
+ <li><a href="sherpa.html"><svg class="doc-icon" aria-hidden="true">
707
+ <use href="#icon-sherpa" />
708
+ </svg> <span>SHERPA</span></a></li>
709
+ <li><a href="mandala.html"><svg class="doc-icon" aria-hidden="true">
710
+ <use href="#icon-mandala" />
711
+ </svg> <span>MANDALA</span></a></li>
712
+ <li><a href="mantra.html"><svg class="doc-icon" aria-hidden="true">
713
+ <use href="#icon-mantra" />
714
+ </svg> <span>MANTRA</span></a></li>
715
+ <li><a href="gumba.html"><svg class="doc-icon" aria-hidden="true">
716
+ <use href="#icon-gumba" />
717
+ </svg> <span>GUMBA</span></a></li>
718
+ <li><a href="yurt.html" class="active"><svg class="doc-icon" aria-hidden="true">
719
+ <use href="#icon-yurt" />
720
+ </svg> <span>YURT</span></a></li>
721
+ <li><a href="katha.html"><svg class="doc-icon" aria-hidden="true">
722
+ <use href="#icon-katha" />
723
+ </svg> <span>KATHA</span></a></li>
724
+ <li><a href="vani.html"><svg class="doc-icon" aria-hidden="true">
725
+ <use href="#icon-vani" />
726
+ </svg> <span>VANI</span></a></li>
727
+ <li><a href="darshan.html"><svg class="doc-icon" aria-hidden="true">
728
+ <use href="#icon-darshan" />
729
+ </svg> <span>DARSHAN</span></a></li>
730
+ <li><a href="stupa.html"><svg class="doc-icon" aria-hidden="true">
731
+ <use href="#icon-stupa" />
732
+ </svg> <span>STUPA</span></a></li>
733
+ <li><a href="lama.html"><svg class="doc-icon" aria-hidden="true">
734
+ <use href="#icon-lama" />
735
+ </svg> <span>LAMA</span></a></li>
736
+ <li><a href="mani.html"><svg class="doc-icon" aria-hidden="true">
737
+ <use href="#icon-mani" />
738
+ </svg> <span>MANI</span></a></li>
739
+ <li><a href="karma.html"><svg class="doc-icon" aria-hidden="true">
740
+ <use href="#icon-karma" />
741
+ </svg> <span>KARMA</span></a></li>
742
+ <li><a href="tattva.html"><svg class="doc-icon" aria-hidden="true">
743
+ <use href="#icon-tattva" />
744
+ </svg> <span>TATTVA</span></a></li>
745
+ <li><a href="tribhuj.html"><svg class="doc-icon" aria-hidden="true">
746
+ <use href="#icon-tribhuj" />
747
+ </svg> <span>TRIBHUJ</span></a></li>
748
+ <li><a href="ypc27.html"><svg class="doc-icon" aria-hidden="true">
749
+ <use href="#icon-ypc27" />
750
+ </svg> <span>YPC-27</span></a></li>
751
+ <li><a href="sakshi.html"><svg class="doc-icon" aria-hidden="true">
752
+ <use href="#icon-sakshi" />
753
+ </svg> <span>SAKSHI</span></a></li>
754
+ <li><a href="geo-proof.html"><svg class="doc-icon" aria-hidden="true">
755
+ <use href="#icon-pramaan" />
756
+ </svg> <span>PRAMAAN</span></a></li>
757
+ <li><a href="trust-security.html"><svg class="doc-icon" aria-hidden="true">
758
+ <use href="#icon-suraksha" />
759
+ </svg> <span>SURAKSHA</span></a></li>
760
+ <li><a href="tivra.html"><svg class="doc-icon" aria-hidden="true">
761
+ <use href="#icon-tivra" />
762
+ </svg> <span>TIVRA</span></a></li>
763
+ <li><a href="prahari.html"><svg class="doc-icon" aria-hidden="true">
764
+ <use href="#icon-prahari" />
765
+ </svg> <span>PRAHARI</span></a></li>
766
+ <li><a href="dharma.html"><svg class="doc-icon" aria-hidden="true">
767
+ <use href="#icon-dharma" />
768
+ </svg> <span>DHARMA</span></a></li>
769
+ <li><a href="seva.html"><svg class="doc-icon" aria-hidden="true">
770
+ <use href="#icon-seva" />
771
+ </svg> <span>SEVA</span></a></li>
772
+ <li><a href="docs-bundle.html"><svg class="doc-icon" aria-hidden="true">
773
+ <use href="#icon-granth" />
774
+ </svg> <span>GRANTH</span></a></li>
775
+ <li><a href="api.html"><svg class="doc-icon" aria-hidden="true">
776
+ <use href="#icon-api" />
777
+ </svg> <span>API</span></a></li>
778
+ <li><a href="adapters.html"><svg class="doc-icon" aria-hidden="true">
779
+ <use href="#icon-adapters" />
780
+ </svg> <span>Adapters</span></a></li>
781
+ <li class="sidebar-section"><span><svg class="doc-icon" aria-hidden="true">
782
+ <use href="#icon-rocket" />
783
+ </svg> Applications</span></li>
784
+ <li><a href="yakapp.html"><svg class="doc-icon" aria-hidden="true">
785
+ <use href="#icon-yakapp" />
786
+ </svg> <span>YakApp</span></a></li>
787
+ <li><a href="c2c.html"><svg class="doc-icon" aria-hidden="true">
788
+ <use href="#icon-c2c" />
789
+ </svg> <span>C2C</span></a></li>
790
+ <li><a href="studio.html"><svg class="doc-icon" aria-hidden="true">
791
+ <use href="#icon-studio" />
792
+ </svg> <span>Studio</span></a></li>
793
+ <li class="sidebar-section"><span><svg class="doc-icon" aria-hidden="true">
794
+ <use href="#icon-gear" />
795
+ </svg> Infrastructure</span></li>
796
+ <li><a href="cli.html"><svg class="doc-icon" aria-hidden="true">
797
+ <use href="#icon-terminal" />
798
+ </svg> <span>CLI</span></a></li>
799
+ <li><a href="configuration.html"><svg class="doc-icon" aria-hidden="true">
800
+ <use href="#icon-gear" />
801
+ </svg> <span>Configuration</span></a></li>
802
+ <li><a href="mesh.html"><svg class="doc-icon" aria-hidden="true">
803
+ <use href="#icon-mandala" />
804
+ </svg> <span>Mesh Network</span></a></li>
805
+ <li><a href="time-sources.html"><svg class="doc-icon" aria-hidden="true">
806
+ <use href="#icon-mani" />
807
+ </svg> <span>Time Sources</span></a></li>
808
+ <li><a href="webserver.html"><svg class="doc-icon" aria-hidden="true">
809
+ <use href="#icon-server" />
810
+ </svg> <span>Web Server</span></a></li>
811
+ <li><a href="advanced-systems.html"><svg class="doc-icon" aria-hidden="true">
812
+ <use href="#icon-tivra" />
813
+ </svg> <span>Advanced Systems</span></a></li>
814
+ <li class="sidebar-section"><span><svg class="doc-icon" aria-hidden="true">
815
+ <use href="#icon-book" />
816
+ </svg> Tutorials</span></li>
817
+ <li><a href="gumba-tutorial.html"><svg class="doc-icon" aria-hidden="true">
818
+ <use href="#icon-gumba" />
819
+ </svg> <span>GUMBA Tutorial</span></a></li>
820
+ <li class="sidebar-section"><span><svg class="doc-icon" aria-hidden="true">
821
+ <use href="#icon-quickref" />
822
+ </svg> Reference</span></li>
823
+ <li><a href="quick-reference.html"><svg class="doc-icon" aria-hidden="true">
824
+ <use href="#icon-quickref" />
825
+ </svg> <span>Quick Ref</span></a></li>
826
+ </ul>
827
+ </nav>
828
+
829
+ <button class="sidebar-toggle" id="sidebarToggle" title="Toggle sidebar">
830
+ <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor">
831
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M11 19l-7-7 7-7m8 14l-7-7 7-7" />
832
+ </svg>
833
+ </button>
834
+
835
+ <div class="sidebar-overlay" id="sidebarOverlay"></div>
836
+
837
+ <main class="docs-main" id="mainContent">
838
+ <div class="docs-content">
839
+
840
+ <!-- Page Header -->
841
+ <div class="flex items-center gap-3 mb-4">
842
+ <svg class="doc-icon hero-icon" aria-hidden="true">
843
+ <use href="#icon-yurt" />
844
+ </svg>
845
+ <div>
846
+ <h1 class="text-4xl font-bold">YURT</h1>
847
+ <p class="theme-accent">YAK Unified Room Tags</p>
848
+ </div>
849
+ </div>
850
+ <p class="text-xl text-mountain-300 mb-4">Decentralized room discovery for YakApp chat rooms</p>
851
+ <span class="inline-block text-xs theme-badge px-2 py-1 rounded mb-8">v1.0.0</span>
852
+
853
+ <!-- Philosophy Quote -->
854
+ <div class="theme-callout border-l-4 rounded-r-xl p-6 mb-8 italic text-mountain-200">
855
+ "Every yurt on the steppe has its own fire. Find them by the smoke, or follow the path you know.
856
+ <strong class="theme-accent">Discovery is optional. Direct access always works.</strong>"
857
+ </div>
858
+
859
+ <!-- Key Insight -->
860
+ <div class="bg-mountain-800 border border-mountain-700 rounded-xl p-6 mb-8">
861
+ <h2 class="font-bold text-lg mb-3 theme-accent">The YURT Insight</h2>
862
+ <p class="text-mountain-300 mb-4">
863
+ Traditional chat apps require central servers to discover rooms. YURT provides <strong>three discovery
864
+ modes</strong>
865
+ that work independently:
866
+ </p>
867
+ <ul class="space-y-2 text-mountain-300">
868
+ <li class="flex items-start gap-2">
869
+ <span class="theme-accent mt-1">1.</span>
870
+ <div><strong>Direct Link</strong> — Click a yak:// link from any website. Works immediately, no gossip
871
+ needed.</div>
872
+ </li>
873
+ <li class="flex items-start gap-2">
874
+ <span class="theme-accent mt-1">2.</span>
875
+ <div><strong>Website Embed</strong> — "Join Chat" buttons on websites that link to yak:// or HTTPS gateway.
876
+ </div>
877
+ </li>
878
+ <li class="flex items-start gap-2">
879
+ <span class="theme-accent mt-1">3.</span>
880
+ <div><strong>Gossip</strong> — Browse rooms propagated through the mesh network.</div>
881
+ </li>
882
+ </ul>
883
+ </div>
884
+
885
+ <!-- URI Format Section -->
886
+ <h2 class="text-2xl font-bold mt-12 mb-6" id="uri-format">The yak:// URI Scheme</h2>
887
+
888
+ <p class="text-mountain-300 mb-6">
889
+ YURT uses the <code class="theme-accent">yak://</code> URI scheme for direct room links.
890
+ Like clicking a Zoom link, but for decentralized chat.
891
+ </p>
892
+
893
+ <div class="space-y-4 mb-8">
894
+ <div class="uri-example">
895
+ yak://qrl-node.theqrl.org:8787/qrl-official
896
+ </div>
897
+ <p class="text-sm text-mountain-400">Basic format: yak://host:port/bundleId</p>
898
+
899
+ <div class="uri-example">
900
+ yak://example.com/private-room?invite=eyJ0eXBlIjoiYXR0ZXN0YXRpb24i...
901
+ </div>
902
+ <p class="text-sm text-mountain-400">With invite attestation for private rooms</p>
903
+ </div>
904
+
905
+ <pre class="bg-mountain-950 rounded-xl p-4 overflow-x-auto mb-8"><code class="language-javascript">import { YurtLink } from 'yakmesh/mesh/yurt.js';
906
+
907
+ // Parse any yak:// link
908
+ const link = YurtLink.parse('yak://qrl-node.theqrl.org:8787/qrl-official');
909
+ console.log(link.host); // 'qrl-node.theqrl.org'
910
+ console.log(link.port); // 8787
911
+ console.log(link.bundleId); // 'qrl-official'
912
+ console.log(link.invite); // null (or attestation object if present)
913
+
914
+ // Create a yak:// link
915
+ const uri = YurtLink.create('my-node.example.com', 'my-room');
916
+ // → 'yak://my-node.example.com/my-room'
917
+
918
+ // Browser fallback (for browsers without yak:// handler)
919
+ const httpsUrl = YurtLink.toHttpsGateway(uri);
920
+ // → 'https://yak.to/join/my-node.example.com:8787/my-room'</code></pre>
921
+
922
+ <!-- Discovery Modes Section -->
923
+ <h2 class="text-2xl font-bold mt-12 mb-6" id="discovery-modes">Discovery Modes</h2>
924
+
925
+ <div class="grid md:grid-cols-2 gap-6 mb-8">
926
+ <div class="discovery-card">
927
+ <div class="flex items-center gap-2 mb-3">
928
+ <svg class="doc-icon card-icon" aria-hidden="true">
929
+ <use href="#icon-link" />
930
+ </svg>
931
+ <h3 class="font-bold theme-accent">Direct Link</h3>
932
+ </div>
933
+ <p class="text-mountain-300 text-sm mb-4">
934
+ The simplest path. User clicks a link, app connects directly to the host node.
935
+ No gossip propagation required.
936
+ </p>
937
+ <div class="text-xs text-mountain-400">
938
+ <strong>Use case:</strong> QRL posts "Join Official Chat" on theqrl.org
939
+ </div>
940
+ </div>
941
+
942
+ <div class="discovery-card">
943
+ <div class="flex items-center gap-2 mb-3">
944
+ <svg class="doc-icon card-icon" aria-hidden="true">
945
+ <use href="#icon-globe" />
946
+ </svg>
947
+ <h3 class="font-bold theme-accent">Website Embed</h3>
948
+ </div>
949
+ <p class="text-mountain-300 text-sm mb-4">
950
+ Websites embed join buttons. Works with yak:// for native apps or HTTPS gateway for browsers.
951
+ </p>
952
+ <div class="text-xs text-mountain-400">
953
+ <strong>Use case:</strong> Project documentation with "Chat with us" button
954
+ </div>
955
+ </div>
956
+
957
+ <div class="discovery-card">
958
+ <div class="flex items-center gap-2 mb-3">
959
+ <svg class="doc-icon card-icon" aria-hidden="true">
960
+ <use href="#icon-signal" />
961
+ </svg>
962
+ <h3 class="font-bold theme-accent">Gossip Propagation</h3>
963
+ </div>
964
+ <p class="text-mountain-300 text-sm mb-4">
965
+ Rooms are advertised through the mesh. Users can browse and search for public rooms.
966
+ </p>
967
+ <div class="text-xs text-mountain-400">
968
+ <strong>Use case:</strong> Discovering new communities in the network
969
+ </div>
970
+ </div>
971
+
972
+ <div class="discovery-card">
973
+ <div class="flex items-center gap-2 mb-3">
974
+ <svg class="doc-icon card-icon" aria-hidden="true">
975
+ <use href="#icon-phone" />
976
+ </svg>
977
+ <h3 class="font-bold theme-accent">QR Code</h3>
978
+ </div>
979
+ <p class="text-mountain-300 text-sm mb-4">
980
+ QR codes encode yak:// URIs. Scan to join rooms at events, conferences, or physical locations.
981
+ </p>
982
+ <div class="text-xs text-mountain-400">
983
+ <strong>Use case:</strong> Conference networking, local meetups
984
+ </div>
985
+ </div>
986
+ </div>
987
+
988
+ <!-- Room Entry Section -->
989
+ <h2 class="text-2xl font-bold mt-12 mb-6" id="room-entry">Room Entries</h2>
990
+
991
+ <p class="text-mountain-300 mb-6">
992
+ A <code>YurtEntry</code> represents a discoverable room listing. Entries are signed by the host node
993
+ and can be propagated via gossip or accessed directly.
994
+ </p>
995
+
996
+ <pre class="bg-mountain-950 rounded-xl p-4 overflow-x-auto mb-8"><code class="language-javascript">import { YurtEntry, YURT_CONFIG } from 'yakmesh/mesh/yurt.js';
997
+
998
+ // Create a room entry
999
+ const entry = new YurtEntry({
1000
+ bundleId: 'qrl-official',
1001
+ hostNodeId: myNode.identity.nodeId,
1002
+ hostEndpoint: 'qrl-node.theqrl.org:8787',
1003
+ name: 'QRL Official',
1004
+ description: 'Official Quantum Resistant Ledger community chat',
1005
+ visibility: YURT_CONFIG.visibility.PUBLIC,
1006
+ tags: ['qrl', 'crypto', 'quantum', 'official'],
1007
+ memberCount: 500,
1008
+ });
1009
+
1010
+ // Sign with host's secret key (proves ownership)
1011
+ entry.sign(myNode.identity.secretKey);
1012
+
1013
+ // Generate shareable link
1014
+ const link = entry.toUri();
1015
+ // → 'yak://qrl-node.theqrl.org:8787/qrl-official'
1016
+
1017
+ // For invite-only rooms, include attestation
1018
+ const inviteLink = entry.toInviteUri(attestation);
1019
+ // → 'yak://...?invite=...'</code></pre>
1020
+
1021
+ <!-- Visibility Types -->
1022
+ <h3 class="text-xl font-bold mt-8 mb-4" id="visibility">Visibility Types</h3>
1023
+
1024
+ <div class="bg-mountain-800 rounded-xl overflow-hidden mb-8">
1025
+ <table class="w-full text-left">
1026
+ <thead class="bg-mountain-700">
1027
+ <tr>
1028
+ <th class="px-4 py-3">Type</th>
1029
+ <th class="px-4 py-3">Badge</th>
1030
+ <th class="px-4 py-3">Gossip</th>
1031
+ <th class="px-4 py-3">Direct Link</th>
1032
+ <th class="px-4 py-3">Access</th>
1033
+ </tr>
1034
+ </thead>
1035
+ <tbody class="text-mountain-300">
1036
+ <tr class="border-t border-mountain-700">
1037
+ <td class="px-4 py-3 font-mono">public</td>
1038
+ <td class="px-4 py-3"><span class="visibility-badge vis-public">PUBLIC</span></td>
1039
+ <td class="px-4 py-3 text-green-400">✓ Propagated</td>
1040
+ <td class="px-4 py-3 text-green-400">✓ Works</td>
1041
+ <td class="px-4 py-3">Anyone can request to join</td>
1042
+ </tr>
1043
+ <tr class="border-t border-mountain-700">
1044
+ <td class="px-4 py-3 font-mono">invite-only</td>
1045
+ <td class="px-4 py-3"><span class="visibility-badge vis-invite">INVITE</span></td>
1046
+ <td class="px-4 py-3 text-green-400">✓ Propagated</td>
1047
+ <td class="px-4 py-3 text-green-400">✓ Works</td>
1048
+ <td class="px-4 py-3">Requires GUMBA attestation</td>
1049
+ </tr>
1050
+ <tr class="border-t border-mountain-700">
1051
+ <td class="px-4 py-3 font-mono">unlisted</td>
1052
+ <td class="px-4 py-3"><span class="visibility-badge vis-unlisted">UNLISTED</span></td>
1053
+ <td class="px-4 py-3 text-red-400">✗ Not shared</td>
1054
+ <td class="px-4 py-3 text-green-400">✓ Works</td>
1055
+ <td class="px-4 py-3">Only via direct link sharing</td>
1056
+ </tr>
1057
+ </tbody>
1058
+ </table>
1059
+ </div>
1060
+
1061
+ <!-- Directory Section -->
1062
+ <h2 class="text-2xl font-bold mt-12 mb-6" id="directory">Local Directory</h2>
1063
+
1064
+ <p class="text-mountain-300 mb-6">
1065
+ The <code>YurtDirectory</code> maintains a local index of known rooms. It handles searching,
1066
+ indexing by tags/host, and automatic cleanup of expired entries.
1067
+ </p>
1068
+
1069
+ <pre class="bg-mountain-950 rounded-xl p-4 overflow-x-auto mb-8"><code class="language-javascript">import { YurtDirectory } from 'yakmesh/mesh/yurt.js';
1070
+
1071
+ const directory = new YurtDirectory();
1072
+
1073
+ // Add entries (from gossip or manual)
1074
+ directory.add(entry);
1075
+
1076
+ // Search rooms
1077
+ const results = directory.search({
1078
+ query: 'QRL',
1079
+ tags: ['crypto'],
1080
+ visibility: 'public',
1081
+ limit: 20,
1082
+ });
1083
+
1084
+ // Get by bundle ID
1085
+ const room = directory.getByBundle('qrl-official');
1086
+
1087
+ // List all public rooms
1088
+ const publicRooms = directory.listPublic(100);
1089
+
1090
+ // Get rooms by a specific host
1091
+ const qrlRooms = directory.getByHost(qrlNodeId);
1092
+
1093
+ // Manual cleanup of expired entries
1094
+ directory.cleanup();</code></pre>
1095
+
1096
+ <!-- Gossip Section -->
1097
+ <h2 class="text-2xl font-bold mt-12 mb-6" id="gossip">Gossip Propagation</h2>
1098
+
1099
+ <p class="text-mountain-300 mb-6">
1100
+ The <code>YurtGossip</code> module handles advertising rooms to the mesh network.
1101
+ Entries expire after 7 days without refresh, preventing stale listings.
1102
+ </p>
1103
+
1104
+ <pre class="bg-mountain-950 rounded-xl p-4 overflow-x-auto mb-8"><code class="language-javascript">import { YurtGossip, YurtDirectory } from 'yakmesh/mesh/yurt.js';
1105
+
1106
+ const directory = new YurtDirectory();
1107
+ const gossip = new YurtGossip(identity, directory, mesh);
1108
+
1109
+ // Start gossip (periodic announcements + refresh)
1110
+ gossip.start();
1111
+
1112
+ // Announce a new room
1113
+ gossip.announce(entry);
1114
+
1115
+ // Search the network
1116
+ const queryId = gossip.query({ query: 'QRL', tags: ['crypto'] });
1117
+ gossip.on('query:response', (response) => {
1118
+ console.log('Found rooms:', response.entries);
1119
+ });
1120
+
1121
+ // Withdraw a room from the network
1122
+ gossip.withdraw('my-bundle-id');
1123
+
1124
+ // Stop gossip
1125
+ gossip.stop();</code></pre>
1126
+
1127
+ <!-- Integration with GUMBA -->
1128
+ <h2 class="text-2xl font-bold mt-12 mb-6" id="integration">Integration with GUMBA</h2>
1129
+
1130
+ <p class="text-mountain-300 mb-6">
1131
+ YURT handles <strong>discovery</strong>. GUMBA handles <strong>access control</strong>.
1132
+ They work together seamlessly.
1133
+ </p>
1134
+
1135
+ <div class="bg-mountain-800 border border-mountain-700 rounded-xl p-6 mb-8">
1136
+ <h3 class="font-bold mb-4 theme-accent">The Complete Flow</h3>
1137
+ <ol class="space-y-3 text-mountain-300">
1138
+ <li class="flex items-start gap-3">
1139
+ <span
1140
+ class="bg-orange-600 text-white rounded-full w-6 h-6 flex items-center justify-center text-sm shrink-0">1</span>
1141
+ <div><strong>Discovery</strong> — User finds room via YURT (link, gossip, or embed)</div>
1142
+ </li>
1143
+ <li class="flex items-start gap-3">
1144
+ <span
1145
+ class="bg-orange-600 text-white rounded-full w-6 h-6 flex items-center justify-center text-sm shrink-0">2</span>
1146
+ <div><strong>Connect</strong> — App connects to host node at the endpoint</div>
1147
+ </li>
1148
+ <li class="flex items-start gap-3">
1149
+ <span
1150
+ class="bg-orange-600 text-white rounded-full w-6 h-6 flex items-center justify-center text-sm shrink-0">3</span>
1151
+ <div><strong>Challenge</strong> — Host issues GUMBA challenge to visitor</div>
1152
+ </li>
1153
+ <li class="flex items-start gap-3">
1154
+ <span
1155
+ class="bg-orange-600 text-white rounded-full w-6 h-6 flex items-center justify-center text-sm shrink-0">4</span>
1156
+ <div><strong>Proof</strong> — Visitor proves identity (challenge-response, attestation, or Merkle)</div>
1157
+ </li>
1158
+ <li class="flex items-start gap-3">
1159
+ <span
1160
+ class="bg-orange-600 text-white rounded-full w-6 h-6 flex items-center justify-center text-sm shrink-0">5</span>
1161
+ <div><strong>Session</strong> — Host grants session, messages delivered via ANNEX</div>
1162
+ </li>
1163
+ </ol>
1164
+ </div>
1165
+
1166
+ <!-- YurtHub Section -->
1167
+ <h2 class="text-2xl font-bold mt-12 mb-6" id="hub">YurtHub</h2>
1168
+
1169
+ <p class="text-mountain-300 mb-6">
1170
+ <code>YurtHub</code> combines directory, gossip, and GUMBA integration into one convenient interface.
1171
+ </p>
1172
+
1173
+ <pre class="bg-mountain-950 rounded-xl p-4 overflow-x-auto mb-8"><code class="language-javascript">import { YurtHub } from 'yakmesh/mesh/yurt.js';
1174
+
1175
+ const hub = new YurtHub(identity, gumbaHub, mesh, options);
1176
+ hub.start();
1177
+
1178
+ // Publish a room from your GUMBA hub
1179
+ hub.publishRoom('my-bundle-id', {
1180
+ name: 'My Awesome Room',
1181
+ description: 'A great place to chat',
1182
+ visibility: 'public',
1183
+ tags: ['community', 'tech'],
1184
+ });
1185
+
1186
+ // Browse public rooms
1187
+ const rooms = hub.browse({ limit: 50 });
1188
+
1189
+ // Search by query
1190
+ const results = hub.search('crypto', { tags: ['qrl'] });
1191
+
1192
+ // Join via direct link
1193
+ const joinResult = await hub.joinViaLink('yak://example.com/room-id');
1194
+
1195
+ // Get a shareable link
1196
+ const link = hub.getJoinLink('my-bundle-id');
1197
+
1198
+ // With invite for private rooms
1199
+ const inviteLink = hub.getJoinLink('private-room', { invite: attestation });</code></pre>
1200
+
1201
+ <!-- Real-World Example -->
1202
+ <h2 class="text-2xl font-bold mt-12 mb-6" id="example">Real-World Example: QRL Official</h2>
1203
+
1204
+ <div class="bg-mountain-800 border border-orange-700 rounded-xl p-6 mb-8">
1205
+ <h3 class="font-bold mb-4 theme-accent">Setting Up the QRL Community Room</h3>
1206
+
1207
+ <pre class="bg-mountain-950 rounded-xl p-4 overflow-x-auto mb-6"><code class="language-javascript">// On the QRL server (qrl-node.theqrl.org)
1208
+ import { YurtHub, YurtEntry } from 'yakmesh/mesh/yurt.js';
1209
+ import { GumbaHub } from 'yakmesh/mesh/gumba.js';
1210
+
1211
+ // Create the GUMBA bundle for the room
1212
+ const gumbaHub = new GumbaHub(identity, annex);
1213
+ const bundle = gumbaHub.createBundle('qrl-official', {
1214
+ name: 'QRL Official',
1215
+ description: 'Official Quantum Resistant Ledger community',
1216
+ });
1217
+
1218
+ // Create the YURT hub and publish the room
1219
+ const yurtHub = new YurtHub(identity, gumbaHub, mesh, {
1220
+ endpoint: 'qrl-node.theqrl.org:8787',
1221
+ });
1222
+ yurtHub.start();
1223
+
1224
+ yurtHub.publishRoom('qrl-official', {
1225
+ name: 'QRL Official',
1226
+ description: 'Official Quantum Resistant Ledger community chat',
1227
+ tags: ['qrl', 'crypto', 'quantum', 'official'],
1228
+ visibility: 'public',
1229
+ });
1230
+
1231
+ // Get the link to post on theqrl.org
1232
+ const joinLink = yurtHub.getJoinLink('qrl-official');
1233
+ console.log('Post this on the website:', joinLink);
1234
+ // → yak://qrl-node.theqrl.org:8787/qrl-official</code></pre>
1235
+
1236
+ <p class="text-mountain-300 text-sm">
1237
+ Now QRL can add a "Join Official Chat" button on their website that links directly to the room.
1238
+ Users with YakApp installed get a native experience. Browser users can use the HTTPS gateway.
1239
+ </p>
1240
+ </div>
1241
+
1242
+ <!-- Security Notes -->
1243
+ <h2 class="text-2xl font-bold mt-12 mb-6" id="security">Security Considerations</h2>
1244
+
1245
+ <div class="space-y-4 mb-8">
1246
+ <div class="bg-mountain-800 border-l-4 border-green-500 rounded-r-xl p-4">
1247
+ <h3 class="font-bold text-green-400">All entries are signed</h3>
1248
+ <p class="text-mountain-300 text-sm">Only the hosting node can create valid entries for its rooms. Signatures
1249
+ are verified before adding to directories.</p>
1250
+ </div>
1251
+
1252
+ <div class="bg-mountain-800 border-l-4 border-green-500 rounded-r-xl p-4">
1253
+ <h4 class="font-bold text-green-400">Discovery ≠ Access</h4>
1254
+ <p class="text-mountain-300 text-sm">Finding a room in YURT doesn't grant access. GUMBA proofs are still
1255
+ required. YURT only handles visibility.</p>
1256
+ </div>
1257
+
1258
+ <div class="bg-mountain-800 border-l-4 border-green-500 rounded-r-xl p-4">
1259
+ <h4 class="font-bold text-green-400">Spam dies naturally</h4>
1260
+ <p class="text-mountain-300 text-sm">Unsigned or invalid entries are rejected. Stale entries expire after 7
1261
+ days. Nodes can filter by reputation.</p>
1262
+ </div>
1263
+
1264
+ <div class="bg-mountain-800 border-l-4 border-blue-500 rounded-r-xl p-4">
1265
+ <h4 class="font-bold text-blue-400">Unlisted rooms are truly private</h4>
1266
+ <p class="text-mountain-300 text-sm">Rooms marked as "unlisted" never enter the gossip network. They only
1267
+ exist via direct link sharing.</p>
1268
+ </div>
1269
+ </div>
1270
+
1271
+ <!-- Protocol Family -->
1272
+ <h2 class="text-2xl font-bold mt-12 mb-6" id="family">Himalayan Protocol Family</h2>
1273
+
1274
+ <div class="bg-mountain-800 rounded-xl p-6 mb-8">
1275
+ <p class="text-mountain-300 mb-4">YURT is part of the Himalayan Protocol Family for secure, decentralized
1276
+ communication:</p>
1277
+ <ul class="space-y-2">
1278
+ <li class="flex items-center gap-2">
1279
+ <svg class="doc-icon inline-icon" aria-hidden="true">
1280
+ <use href="#icon-annex" />
1281
+ </svg> <a href="annex.html" class="theme-accent hover:underline">ANNEX</a>
1282
+ <span class="text-mountain-400">— E2E encrypted channels for content delivery</span>
1283
+ </li>
1284
+ <li class="flex items-center gap-2">
1285
+ <svg class="doc-icon inline-icon" aria-hidden="true">
1286
+ <use href="#icon-doko" />
1287
+ </svg> <a href="doko.html" class="theme-accent hover:underline">DOKO</a>
1288
+ <span class="text-mountain-400">— Identity certificates for membership</span>
1289
+ </li>
1290
+ <li class="flex items-center gap-2">
1291
+ <svg class="doc-icon inline-icon" aria-hidden="true">
1292
+ <use href="#icon-gumba" />
1293
+ </svg> <a href="gumba.html" class="theme-accent hover:underline">GUMBA</a>
1294
+ <span class="text-mountain-400">— Proof-based access control</span>
1295
+ </li>
1296
+ <li class="flex items-center gap-2">
1297
+ <svg class="doc-icon inline-icon" aria-hidden="true">
1298
+ <use href="#icon-yurt" />
1299
+ </svg> <strong class="theme-accent">YURT</strong>
1300
+ <span class="text-mountain-400">— Room discovery (this module)</span>
1301
+ </li>
1302
+ </ul>
1303
+ </div>
1304
+
1305
+ <!-- Journey Navigation -->
1306
+ <div class="border-t border-mountain-700 mt-12 pt-8">
1307
+ <h2 class="text-xl font-bold mb-6">Continue the Journey</h2>
1308
+ <div class="flex flex-col sm:flex-row gap-4">
1309
+ <a href="gumba.html"
1310
+ class="flex-1 block bg-mountain-800 border border-mountain-700 rounded-xl p-4 hover:border-theme-accent transition group">
1311
+ <div class="text-xs text-mountain-400 mb-1">← Previous</div>
1312
+ <div class="flex items-center gap-2">
1313
+ <svg class="doc-icon journey-icon" aria-hidden="true">
1314
+ <use href="#icon-gumba" />
1315
+ </svg>
1316
+ <span class="font-semibold group-hover:text-theme-accent">GUMBA</span>
1317
+ </div>
1318
+ <p class="text-mountain-400 text-sm mt-1">Access control</p>
1319
+ </a>
1320
+ <a href="katha.html"
1321
+ class="flex-1 block bg-mountain-800 border border-theme-primary rounded-xl p-4 hover:border-theme-accent transition group">
1322
+ <div class="text-xs text-mountain-400 mb-1">Next →</div>
1323
+ <div class="flex items-center gap-2">
1324
+ <svg class="doc-icon journey-icon" aria-hidden="true">
1325
+ <use href="#icon-katha" />
1326
+ </svg>
1327
+ <span class="font-semibold group-hover:text-theme-accent">KATHA</span>
1328
+ </div>
1329
+ <p class="text-mountain-400 text-sm mt-1">Rich chat features</p>
1330
+ </a>
1331
+ </div>
1332
+ </div>
1333
+ </main>
1334
+
1335
+ <footer class="docs-footer">
1336
+ <p>© 2026 YAKMESH™</p>
1337
+ </footer>
1338
+
1339
+ <script src="prism.min.js" defer></script>
1340
+ <script src="prism-javascript.min.js" defer></script>
1341
+ <script src="docs.js" defer></script>
1342
+ </body>
1343
+
1344
+ </html>