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.
- package/CHANGELOG.md +637 -0
- package/CONTRIBUTING.md +42 -0
- package/Caddyfile +77 -0
- package/README.md +119 -29
- package/adapters/adapter-mlv-bible/README.md +124 -0
- package/adapters/adapter-mlv-bible/index.js +400 -0
- package/adapters/chat-mod-adapter.js +532 -0
- package/adapters/content-adapter.js +273 -0
- package/content/api.js +50 -41
- package/content/index.js +2 -2
- package/content/store.js +355 -173
- package/dashboard/index.html +19 -3
- package/database/replication.js +117 -37
- package/docs/CRYPTO-AGILITY.md +204 -0
- package/docs/MTLS-RESEARCH.md +367 -0
- package/docs/NAMCHE-SPEC.md +681 -0
- package/docs/PEERQUANTA-YAKMESH-INTEGRATION.md +407 -0
- package/docs/PRECISION-DISCLOSURE.md +96 -0
- package/docs/README.md +76 -0
- package/docs/ROADMAP-2.4.0.md +447 -0
- package/docs/ROADMAP-2.5.0.md +244 -0
- package/docs/SECURITY-AUDIT-REPORT.md +306 -0
- package/docs/SST-INTEGRATION.md +712 -0
- package/docs/STEADYWATCH-IMPLEMENTATION.md +303 -0
- package/docs/TERNARY-AUDIT-REPORT.md +247 -0
- package/docs/TME-FAQ.md +221 -0
- package/docs/WHITEPAPER.md +623 -0
- package/docs/adapters.html +1001 -0
- package/docs/advanced-systems.html +1045 -0
- package/docs/annex.html +1046 -0
- package/docs/api.html +970 -0
- package/docs/business/response-templates.md +160 -0
- package/docs/c2c.html +1225 -0
- package/docs/cli.html +1332 -0
- package/docs/configuration.html +1248 -0
- package/docs/darshan.html +1085 -0
- package/docs/dharma.html +966 -0
- package/docs/docs-bundle.html +1075 -0
- package/docs/docs.css +3120 -0
- package/docs/docs.js +556 -0
- package/docs/doko.html +969 -0
- package/docs/geo-proof.html +858 -0
- package/docs/getting-started.html +840 -0
- package/docs/gumba-tutorial.html +1144 -0
- package/docs/gumba.html +1098 -0
- package/docs/index.html +914 -0
- package/docs/jhilke.html +1312 -0
- package/docs/karma.html +1100 -0
- package/docs/katha.html +1037 -0
- package/docs/lama.html +978 -0
- package/docs/mandala.html +1067 -0
- package/docs/mani.html +964 -0
- package/docs/mantra.html +967 -0
- package/docs/mesh.html +1409 -0
- package/docs/nakpak.html +869 -0
- package/docs/namche.html +928 -0
- package/docs/nav-order.json +53 -0
- package/docs/prahari.html +1043 -0
- package/docs/prism-bash.min.js +1 -0
- package/docs/prism-javascript.min.js +1 -0
- package/docs/prism-json.min.js +1 -0
- package/docs/prism-tomorrow.min.css +1 -0
- package/docs/prism.min.js +1 -0
- package/docs/privacy.html +699 -0
- package/docs/quick-reference.html +1181 -0
- package/docs/sakshi.html +1402 -0
- package/docs/sandboxing.md +386 -0
- package/docs/seva.html +911 -0
- package/docs/sherpa.html +871 -0
- package/docs/studio.html +860 -0
- package/docs/stupa.html +995 -0
- package/docs/tailwind.min.css +2 -0
- package/docs/tattva.html +1332 -0
- package/docs/terms.html +686 -0
- package/docs/time-server-deployment.md +166 -0
- package/docs/time-sources.html +1392 -0
- package/docs/tivra.html +1127 -0
- package/docs/trademark-policy.html +686 -0
- package/docs/tribhuj.html +1183 -0
- package/docs/trust-security.html +1029 -0
- package/docs/tutorials/backup-recovery.html +654 -0
- package/docs/tutorials/dashboard.html +604 -0
- package/docs/tutorials/domain-setup.html +605 -0
- package/docs/tutorials/host-website.html +456 -0
- package/docs/tutorials/mesh-network.html +505 -0
- package/docs/tutorials/mobile-access.html +445 -0
- package/docs/tutorials/privacy.html +467 -0
- package/docs/tutorials/raspberry-pi.html +600 -0
- package/docs/tutorials/security-basics.html +539 -0
- package/docs/tutorials/share-files.html +431 -0
- package/docs/tutorials/troubleshooting.html +637 -0
- package/docs/tutorials/trust-karma.html +419 -0
- package/docs/tutorials/yak-protocol.html +456 -0
- package/docs/tutorials.html +1034 -0
- package/docs/vani.html +1270 -0
- package/docs/webserver.html +809 -0
- package/docs/yak-protocol.html +940 -0
- package/docs/yak-timeserver-design.md +475 -0
- package/docs/yakapp.html +1015 -0
- package/docs/ypc27.html +1069 -0
- package/docs/yurt.html +1344 -0
- package/embedded-docs/bundle.js +334 -74
- package/gossip/protocol.js +247 -27
- package/identity/key-resolver.js +262 -0
- package/identity/machine-seed.js +632 -0
- package/identity/node-key.js +669 -368
- package/identity/tribhuj-ratchet.js +506 -0
- package/knowledge-base.js +37 -8
- package/launcher/yakmesh.bat +62 -0
- package/launcher/yakmesh.sh +70 -0
- package/mesh/annex.js +462 -108
- package/mesh/beacon-broadcast.js +113 -1
- package/mesh/darshan.js +1718 -0
- package/mesh/gumba.js +1567 -0
- package/mesh/jhilke.js +651 -0
- package/mesh/katha.js +1012 -0
- package/mesh/nakpak-routing.js +8 -5
- package/mesh/network.js +724 -34
- package/mesh/pulse-sync.js +4 -1
- package/mesh/rate-limiter.js +127 -15
- package/mesh/seva.js +526 -0
- package/mesh/sherpa-discovery.js +89 -8
- package/mesh/sybil-defense.js +19 -5
- package/mesh/temporal-encoder.js +4 -3
- package/mesh/vani.js +1364 -0
- package/mesh/yurt.js +1340 -0
- package/models/entropy-sentinel.onnx +0 -0
- package/models/karma-trust.onnx +0 -0
- package/models/manifest.json +43 -0
- package/models/sakshi-anomaly.onnx +0 -0
- package/oracle/code-proof-protocol.js +7 -6
- package/oracle/codebase-lock.js +257 -28
- package/oracle/index.js +74 -15
- package/oracle/ma902-snmp.js +678 -0
- package/oracle/module-sealer.js +5 -3
- package/oracle/network-identity.js +16 -0
- package/oracle/packet-checksum.js +201 -0
- package/oracle/sst.js +579 -0
- package/oracle/ternary-144t.js +714 -0
- package/oracle/ternary-ml.js +481 -0
- package/oracle/time-api.js +239 -0
- package/oracle/time-source.js +137 -47
- package/oracle/validation-oracle-hardened.js +1111 -1071
- package/oracle/validation-oracle.js +4 -2
- package/oracle/ypc27.js +211 -0
- package/package.json +20 -3
- package/protocol/yak-handler.js +35 -9
- package/protocol/yak-protocol.js +28 -13
- package/reference/cpp/yakmesh_mceliece_shard.cpp +168 -0
- package/reference/cpp/yakmesh_ypc27.cpp +179 -0
- package/sbom.json +87 -0
- package/scripts/security-audit.mjs +264 -0
- package/scripts/update-docs-nav.js +194 -0
- package/scripts/update-docs-sidebar.cjs +164 -0
- package/security/crypto-config.js +4 -3
- package/security/dharma-moderation.js +517 -0
- package/security/doko-identity.js +193 -143
- package/security/domain-consensus.js +86 -85
- package/security/fs-hardening.js +620 -0
- package/security/hardware-attestation.js +5 -3
- package/security/hybrid-trust.js +227 -87
- package/security/karma-rate-limiter.js +692 -0
- package/security/khata-protocol.js +22 -21
- package/security/khata-trust-integration.js +277 -150
- package/security/memory-safety.js +635 -0
- package/security/mesh-auth.js +11 -10
- package/security/mesh-revocation.js +373 -5
- package/security/namche-gateway.js +298 -69
- package/security/sakshi.js +460 -3
- package/security/sangha.js +770 -0
- package/security/secure-config.js +473 -0
- package/security/silicon-parity.js +13 -10
- package/security/steadywatch.js +1142 -0
- package/security/strike-system.js +32 -3
- package/security/temporal-signing.js +488 -0
- package/security/trit-commitment.js +464 -0
- package/server/crypto/annex.js +247 -0
- package/server/darshan-api.js +343 -0
- package/server/index.js +3259 -362
- package/server/komm-api.js +668 -0
- package/utils/accel.js +2273 -0
- package/utils/ternary-id.js +79 -0
- package/utils/verify-worker.js +57 -0
- package/webserver/index.js +95 -5
- package/assets/yakmesh-logo.png +0 -0
- package/assets/yakmesh-logo.svg +0 -80
- package/assets/yakmesh-logo2.png +0 -0
- package/assets/yakmesh-logo2sm.png +0 -0
- package/assets/ymsm.png +0 -0
- package/website/assets/silhouettes/adapters.svg +0 -107
- package/website/assets/silhouettes/api-endpoints.svg +0 -115
- package/website/assets/silhouettes/atomic-clock.svg +0 -83
- package/website/assets/silhouettes/base-camp.svg +0 -81
- package/website/assets/silhouettes/bridge.svg +0 -69
- package/website/assets/silhouettes/docs-bundle.svg +0 -113
- package/website/assets/silhouettes/doko-basket.svg +0 -70
- package/website/assets/silhouettes/fortress.svg +0 -93
- package/website/assets/silhouettes/gateway.svg +0 -54
- package/website/assets/silhouettes/gears.svg +0 -93
- package/website/assets/silhouettes/globe-satellite.svg +0 -67
- package/website/assets/silhouettes/karma-wheel.svg +0 -137
- package/website/assets/silhouettes/lama-council.svg +0 -141
- package/website/assets/silhouettes/mandala-network.svg +0 -169
- package/website/assets/silhouettes/mani-stones.svg +0 -149
- package/website/assets/silhouettes/mantra-wheel.svg +0 -116
- package/website/assets/silhouettes/mesh-nodes.svg +0 -113
- package/website/assets/silhouettes/nakpak.svg +0 -56
- package/website/assets/silhouettes/peak-lightning.svg +0 -73
- package/website/assets/silhouettes/sherpa.svg +0 -69
- package/website/assets/silhouettes/stupa-tower.svg +0 -119
- package/website/assets/silhouettes/tattva-eye.svg +0 -78
- package/website/assets/silhouettes/terminal.svg +0 -74
- package/website/assets/silhouettes/webserver.svg +0 -145
- package/website/assets/silhouettes/yak.svg +0 -78
- package/website/assets/yakmesh-logo.png +0 -0
- package/website/assets/yakmesh-logo.webp +0 -0
- package/website/assets/yakmesh-logo128x140.webp +0 -0
- package/website/assets/yakmesh-logo2.png +0 -0
- package/website/assets/yakmesh-logo2.svg +0 -51
- package/website/assets/yakmesh-logo40x44.webp +0 -0
- package/website/assets/yakmesh.gif +0 -0
- package/website/assets/yakmesh.ico +0 -0
- package/website/assets/yakmesh.jpg +0 -0
- package/website/assets/yakmesh.pdf +0 -0
- package/website/assets/yakmesh.png +0 -0
- package/website/assets/yakmesh.svg +0 -70
- package/website/assets/yakmesh128.webp +0 -0
- package/website/assets/yakmesh32.png +0 -0
- package/website/assets/yakmesh32.svg +0 -65
- package/website/assets/yakmesh32o.ico +0 -2
- package/website/assets/yakmesh32o.svg +0 -65
- package/website/assets/yakmesh32o.svgz +0 -0
|
@@ -0,0 +1,1144 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en" data-theme="gumba">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
+
<link rel="icon" href="favicon.ico" sizes="32x32">
|
|
7
|
+
<link rel="icon" href="icon.svg" type="image/svg+xml">
|
|
8
|
+
<link rel="apple-touch-icon" href="apple-touch-icon.png">
|
|
9
|
+
<title>GUMBA Tutorial | YAKMESH Documentation</title>
|
|
10
|
+
<meta name="description" content="Step-by-step tutorial for using GUMBA proof-based access control in YAKMESH.">
|
|
11
|
+
|
|
12
|
+
<link rel="stylesheet" href="tailwind.min.css">
|
|
13
|
+
<link rel="stylesheet" href="prism-tomorrow.min.css" media="print" onload="this.media='all'">
|
|
14
|
+
<noscript><link rel="stylesheet" href="prism-tomorrow.min.css"></noscript>
|
|
15
|
+
<link rel="stylesheet" href="docs.css">
|
|
16
|
+
<style>
|
|
17
|
+
.theme-accent { color: #fbbf24; }
|
|
18
|
+
.theme-accent-hover:hover { color: #fcd34d; }
|
|
19
|
+
.theme-badge { background: rgba(251, 191, 36, 0.2); color: #fbbf24; }
|
|
20
|
+
.theme-border { border-color: #f59e0b; }
|
|
21
|
+
.theme-callout { background: rgba(251, 191, 36, 0.1); border-color: #d97706; }
|
|
22
|
+
.active-link { background: rgba(251, 191, 36, 0.2) !important; color: #fbbf24 !important; }
|
|
23
|
+
.tutorial-card { background: rgba(30, 41, 59, 0.5); border: 1px solid #334155; border-radius: 0.75rem; padding: 1.5rem; margin-bottom: 1.5rem; }
|
|
24
|
+
.tutorial-card:hover { border-color: #f59e0b; }
|
|
25
|
+
.step-number { display: inline-flex; align-items: center; justify-content: center; width: 2rem; height: 2rem; background: #f59e0b; color: white; border-radius: 50%; font-weight: bold; margin-right: 0.75rem; }
|
|
26
|
+
.warning-box { background: rgba(239, 68, 68, 0.1); border: 1px solid #dc2626; border-radius: 0.5rem; padding: 1rem; }
|
|
27
|
+
.info-box { background: rgba(59, 130, 246, 0.1); border: 1px solid #2563eb; border-radius: 0.5rem; padding: 1rem; }
|
|
28
|
+
</style>
|
|
29
|
+
|
|
30
|
+
<!-- Open Graph -->
|
|
31
|
+
<meta property="og:type" content="article">
|
|
32
|
+
<meta property="og:site_name" content="Yakmesh Documentation">
|
|
33
|
+
<meta property="og:title" content="GUMBA Tutorial — Yakmesh">
|
|
34
|
+
<meta property="og:description" content="GUMBA tutorial — step-by-step guide to implementing role-based access control.">
|
|
35
|
+
</head>
|
|
36
|
+
<body class="bg-mountain-900 text-white min-h-screen">
|
|
37
|
+
<!-- YAKMESH-ICON-SPRITE-START -->
|
|
38
|
+
<svg xmlns="http://www.w3.org/2000/svg" style="display:none">
|
|
39
|
+
<!--
|
|
40
|
+
Yakmesh Docs Icon Sprite Sheet
|
|
41
|
+
24×24 viewBox — stroke/fill set via .doc-icon CSS
|
|
42
|
+
Usage: <svg class="doc-icon"><use href="#icon-name"/></svg>
|
|
43
|
+
-->
|
|
44
|
+
|
|
45
|
+
<!-- ═══ GUIDES ═══ -->
|
|
46
|
+
|
|
47
|
+
<symbol id="icon-home" viewBox="0 0 24 24">
|
|
48
|
+
<path d="M3 9.5L12 3l9 6.5V20a1 1 0 01-1 1H4a1 1 0 01-1-1V9.5z"/>
|
|
49
|
+
<polyline points="9 22 9 12 15 12 15 22"/>
|
|
50
|
+
</symbol>
|
|
51
|
+
|
|
52
|
+
<symbol id="icon-rocket" viewBox="0 0 24 24">
|
|
53
|
+
<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"/>
|
|
54
|
+
<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"/>
|
|
55
|
+
<path d="M9 12H4s.55-3.03 2-4c1.62-1.08 5 0 5 0"/>
|
|
56
|
+
<path d="M12 15v5s3.03-.55 4-2c1.08-1.62 0-5 0-5"/>
|
|
57
|
+
</symbol>
|
|
58
|
+
|
|
59
|
+
<symbol id="icon-book" viewBox="0 0 24 24">
|
|
60
|
+
<path d="M4 19.5A2.5 2.5 0 016.5 17H20"/>
|
|
61
|
+
<path d="M6.5 2H20v20H6.5A2.5 2.5 0 014 19.5v-15A2.5 2.5 0 016.5 2z"/>
|
|
62
|
+
<line x1="8" y1="7" x2="16" y2="7"/>
|
|
63
|
+
<line x1="8" y1="11" x2="13" y2="11"/>
|
|
64
|
+
</symbol>
|
|
65
|
+
|
|
66
|
+
<!-- ═══ PROTOCOL STACK ═══ -->
|
|
67
|
+
|
|
68
|
+
<!-- YAK:// — Content addressing (yak horns) -->
|
|
69
|
+
<symbol id="icon-yak" viewBox="0 0 24 24">
|
|
70
|
+
<path d="M4 4c1 3 3 5 5 6"/>
|
|
71
|
+
<path d="M20 4c-1 3-3 5-5 6"/>
|
|
72
|
+
<circle cx="12" cy="14" r="5"/>
|
|
73
|
+
<circle cx="10" cy="13" r="0.5" fill="currentColor"/>
|
|
74
|
+
<circle cx="14" cy="13" r="0.5" fill="currentColor"/>
|
|
75
|
+
<path d="M10 16c1 1 3 1 4 0"/>
|
|
76
|
+
</symbol>
|
|
77
|
+
|
|
78
|
+
<!-- ANNEX — Encrypted bridge -->
|
|
79
|
+
<symbol id="icon-annex" viewBox="0 0 24 24">
|
|
80
|
+
<path d="M4 18h3a4 4 0 004-4V8"/>
|
|
81
|
+
<path d="M20 18h-3a4 4 0 01-4-4V8"/>
|
|
82
|
+
<circle cx="7" cy="6" r="2"/>
|
|
83
|
+
<circle cx="17" cy="6" r="2"/>
|
|
84
|
+
<line x1="7" y1="8" x2="7" y2="18"/>
|
|
85
|
+
<line x1="17" y1="8" x2="17" y2="18"/>
|
|
86
|
+
</symbol>
|
|
87
|
+
|
|
88
|
+
<!-- JHILKE — Cricket / steganographic key lifecycle -->
|
|
89
|
+
<symbol id="icon-jhilke" viewBox="0 0 24 24">
|
|
90
|
+
<ellipse cx="12" cy="14" rx="4" ry="6"/>
|
|
91
|
+
<path d="M8 10c-2-3-4-6-3-8"/>
|
|
92
|
+
<path d="M16 10c2-3 4-6 3-8"/>
|
|
93
|
+
<line x1="10" y1="20" x2="8" y2="23"/>
|
|
94
|
+
<line x1="14" y1="20" x2="16" y2="23"/>
|
|
95
|
+
<path d="M9 12l-4 2"/>
|
|
96
|
+
<path d="M15 12l4 2"/>
|
|
97
|
+
</symbol>
|
|
98
|
+
|
|
99
|
+
<!-- NAKPAK — Onion layers / backpack -->
|
|
100
|
+
<symbol id="icon-nakpak" viewBox="0 0 24 24">
|
|
101
|
+
<circle cx="12" cy="12" r="10" opacity="0.3"/>
|
|
102
|
+
<circle cx="12" cy="12" r="7" opacity="0.5"/>
|
|
103
|
+
<circle cx="12" cy="12" r="4" opacity="0.8"/>
|
|
104
|
+
<circle cx="12" cy="12" r="1.5" fill="currentColor"/>
|
|
105
|
+
</symbol>
|
|
106
|
+
|
|
107
|
+
<!-- NAMCHE — Gateway door -->
|
|
108
|
+
<symbol id="icon-namche" viewBox="0 0 24 24">
|
|
109
|
+
<rect x="3" y="3" width="18" height="18" rx="2"/>
|
|
110
|
+
<path d="M9 3v18"/>
|
|
111
|
+
<path d="M15 3v18"/>
|
|
112
|
+
<line x1="3" y1="8" x2="9" y2="8"/>
|
|
113
|
+
<line x1="15" y1="8" x2="21" y2="8"/>
|
|
114
|
+
<circle cx="12" cy="14" r="1" fill="currentColor"/>
|
|
115
|
+
</symbol>
|
|
116
|
+
|
|
117
|
+
<!-- DOKO — Basket / certificate -->
|
|
118
|
+
<symbol id="icon-doko" viewBox="0 0 24 24">
|
|
119
|
+
<path d="M6 8l-2 12h16l-2-12"/>
|
|
120
|
+
<path d="M6 8c0-3 2.7-5 6-5s6 2 6 5"/>
|
|
121
|
+
<line x1="8" y1="10" x2="10" y2="18"/>
|
|
122
|
+
<line x1="16" y1="10" x2="14" y2="18"/>
|
|
123
|
+
<line x1="12" y1="10" x2="12" y2="18"/>
|
|
124
|
+
</symbol>
|
|
125
|
+
|
|
126
|
+
<!-- SHERPA — Mountain climber -->
|
|
127
|
+
<symbol id="icon-sherpa" viewBox="0 0 24 24">
|
|
128
|
+
<path d="M4 20L10 6l3 6 3-4 4 12"/>
|
|
129
|
+
<line x1="4" y1="20" x2="20" y2="20"/>
|
|
130
|
+
<circle cx="13" cy="4" r="1.5"/>
|
|
131
|
+
</symbol>
|
|
132
|
+
|
|
133
|
+
<!-- MANDALA — Network topology web -->
|
|
134
|
+
<symbol id="icon-mandala" viewBox="0 0 24 24">
|
|
135
|
+
<circle cx="12" cy="12" r="9"/>
|
|
136
|
+
<circle cx="12" cy="12" r="4.5"/>
|
|
137
|
+
<line x1="12" y1="3" x2="12" y2="21"/>
|
|
138
|
+
<line x1="3" y1="12" x2="21" y2="12"/>
|
|
139
|
+
<line x1="5.6" y1="5.6" x2="18.4" y2="18.4"/>
|
|
140
|
+
<line x1="18.4" y1="5.6" x2="5.6" y2="18.4"/>
|
|
141
|
+
</symbol>
|
|
142
|
+
|
|
143
|
+
<!-- MANTRA — Gossip / prayer wheel -->
|
|
144
|
+
<symbol id="icon-mantra" viewBox="0 0 24 24">
|
|
145
|
+
<circle cx="12" cy="10" r="7"/>
|
|
146
|
+
<path d="M12 3v14"/>
|
|
147
|
+
<path d="M8 7c2 1.5 6 1.5 8 0"/>
|
|
148
|
+
<path d="M8 13c2-1.5 6-1.5 8 0"/>
|
|
149
|
+
<line x1="12" y1="17" x2="12" y2="22"/>
|
|
150
|
+
<line x1="9" y1="22" x2="15" y2="22"/>
|
|
151
|
+
</symbol>
|
|
152
|
+
|
|
153
|
+
<!-- GUMBA — Temple / access control -->
|
|
154
|
+
<symbol id="icon-gumba" viewBox="0 0 24 24">
|
|
155
|
+
<path d="M12 2L3 9h18z"/>
|
|
156
|
+
<line x1="5" y1="9" x2="5" y2="19"/>
|
|
157
|
+
<line x1="9" y1="9" x2="9" y2="19"/>
|
|
158
|
+
<line x1="15" y1="9" x2="15" y2="19"/>
|
|
159
|
+
<line x1="19" y1="9" x2="19" y2="19"/>
|
|
160
|
+
<line x1="3" y1="19" x2="21" y2="19"/>
|
|
161
|
+
<line x1="3" y1="21" x2="21" y2="21"/>
|
|
162
|
+
</symbol>
|
|
163
|
+
|
|
164
|
+
<!-- YURT — Camp / room -->
|
|
165
|
+
<symbol id="icon-yurt" viewBox="0 0 24 24">
|
|
166
|
+
<path d="M3 20L12 4l9 16"/>
|
|
167
|
+
<line x1="3" y1="20" x2="21" y2="20"/>
|
|
168
|
+
<path d="M10 20v-5a2 2 0 014 0v5"/>
|
|
169
|
+
<path d="M6 14h12"/>
|
|
170
|
+
</symbol>
|
|
171
|
+
|
|
172
|
+
<!-- KATHA — Chat / story scroll -->
|
|
173
|
+
<symbol id="icon-katha" viewBox="0 0 24 24">
|
|
174
|
+
<path d="M21 15a2 2 0 01-2 2H7l-4 4V5a2 2 0 012-2h14a2 2 0 012 2z"/>
|
|
175
|
+
<line x1="8" y1="8" x2="16" y2="8"/>
|
|
176
|
+
<line x1="8" y1="12" x2="13" y2="12"/>
|
|
177
|
+
</symbol>
|
|
178
|
+
|
|
179
|
+
<!-- VANI — Voice / microphone -->
|
|
180
|
+
<symbol id="icon-vani" viewBox="0 0 24 24">
|
|
181
|
+
<rect x="9" y="2" width="6" height="11" rx="3"/>
|
|
182
|
+
<path d="M5 10a7 7 0 0014 0"/>
|
|
183
|
+
<line x1="12" y1="17" x2="12" y2="22"/>
|
|
184
|
+
<line x1="8" y1="22" x2="16" y2="22"/>
|
|
185
|
+
</symbol>
|
|
186
|
+
|
|
187
|
+
<!-- DARSHAN — Eye / viewing -->
|
|
188
|
+
<symbol id="icon-darshan" viewBox="0 0 24 24">
|
|
189
|
+
<path d="M1 12s4-8 11-8 11 8 11 8-4 8-11 8S1 12 1 12z"/>
|
|
190
|
+
<circle cx="12" cy="12" r="3"/>
|
|
191
|
+
</symbol>
|
|
192
|
+
|
|
193
|
+
<!-- STUPA — Tower / distributed storage -->
|
|
194
|
+
<symbol id="icon-stupa" viewBox="0 0 24 24">
|
|
195
|
+
<line x1="12" y1="2" x2="12" y2="5"/>
|
|
196
|
+
<path d="M10 5h4l1 3H9z"/>
|
|
197
|
+
<ellipse cx="12" cy="11" rx="5" ry="3"/>
|
|
198
|
+
<ellipse cx="12" cy="15" rx="6" ry="3"/>
|
|
199
|
+
<ellipse cx="12" cy="19" rx="7" ry="3"/>
|
|
200
|
+
</symbol>
|
|
201
|
+
|
|
202
|
+
<!-- LAMA — Crystal ball / consensus -->
|
|
203
|
+
<symbol id="icon-lama" viewBox="0 0 24 24">
|
|
204
|
+
<circle cx="12" cy="10" r="7"/>
|
|
205
|
+
<path d="M12 3c-1.5 2-2 5 0 7s4.5 2 6 0"/>
|
|
206
|
+
<path d="M7 19h10"/>
|
|
207
|
+
<path d="M9 22h6"/>
|
|
208
|
+
<line x1="9" y1="17" x2="9" y2="19"/>
|
|
209
|
+
<line x1="15" y1="17" x2="15" y2="19"/>
|
|
210
|
+
</symbol>
|
|
211
|
+
|
|
212
|
+
<!-- MANI — Prayer stone / time sync -->
|
|
213
|
+
<symbol id="icon-mani" viewBox="0 0 24 24">
|
|
214
|
+
<circle cx="12" cy="12" r="9"/>
|
|
215
|
+
<polyline points="12 6 12 12 16 14"/>
|
|
216
|
+
<circle cx="12" cy="12" r="1" fill="currentColor"/>
|
|
217
|
+
</symbol>
|
|
218
|
+
|
|
219
|
+
<!-- KARMA — Yin-yang / reputation -->
|
|
220
|
+
<symbol id="icon-karma" viewBox="0 0 24 24">
|
|
221
|
+
<circle cx="12" cy="12" r="9"/>
|
|
222
|
+
<path d="M12 3a4.5 4.5 0 010 9 4.5 4.5 0 000 9"/>
|
|
223
|
+
<circle cx="12" cy="7.5" r="1.5" fill="currentColor"/>
|
|
224
|
+
<circle cx="12" cy="16.5" r="1.5"/>
|
|
225
|
+
</symbol>
|
|
226
|
+
|
|
227
|
+
<!-- TATTVA — Quantum elements / atom -->
|
|
228
|
+
<symbol id="icon-tattva" viewBox="0 0 24 24">
|
|
229
|
+
<circle cx="12" cy="12" r="2.5" fill="currentColor" stroke="none"/>
|
|
230
|
+
<ellipse cx="12" cy="12" rx="10" ry="4"/>
|
|
231
|
+
<ellipse cx="12" cy="12" rx="10" ry="4" transform="rotate(60 12 12)"/>
|
|
232
|
+
<ellipse cx="12" cy="12" rx="10" ry="4" transform="rotate(120 12 12)"/>
|
|
233
|
+
</symbol>
|
|
234
|
+
|
|
235
|
+
<!-- TRIBHUJ — Triangle / balanced ternary -->
|
|
236
|
+
<symbol id="icon-tribhuj" viewBox="0 0 24 24">
|
|
237
|
+
<polygon points="12,3 21,20 3,20"/>
|
|
238
|
+
<line x1="12" y1="3" x2="12" y2="20"/>
|
|
239
|
+
<line x1="7.5" y1="11.5" x2="16.5" y2="11.5"/>
|
|
240
|
+
<circle cx="12" cy="14" r="1" fill="currentColor"/>
|
|
241
|
+
</symbol>
|
|
242
|
+
|
|
243
|
+
<!-- YPC-27 — Lock / cipher -->
|
|
244
|
+
<symbol id="icon-ypc27" viewBox="0 0 24 24">
|
|
245
|
+
<rect x="5" y="11" width="14" height="10" rx="2"/>
|
|
246
|
+
<path d="M8 11V7a4 4 0 118 0v4"/>
|
|
247
|
+
<circle cx="12" cy="16" r="1" fill="currentColor"/>
|
|
248
|
+
<line x1="12" y1="17" x2="12" y2="19"/>
|
|
249
|
+
</symbol>
|
|
250
|
+
|
|
251
|
+
<!-- SAKSHI — Witness / aperture eye -->
|
|
252
|
+
<symbol id="icon-sakshi" viewBox="0 0 24 24">
|
|
253
|
+
<circle cx="12" cy="12" r="9"/>
|
|
254
|
+
<path d="M12 3l3 9-3 9"/>
|
|
255
|
+
<path d="M12 3l-3 9 3 9"/>
|
|
256
|
+
<circle cx="12" cy="12" r="2.5"/>
|
|
257
|
+
<circle cx="12" cy="12" r="0.8" fill="currentColor"/>
|
|
258
|
+
</symbol>
|
|
259
|
+
|
|
260
|
+
<!-- PRAMAAN — Globe / geographic proof -->
|
|
261
|
+
<symbol id="icon-pramaan" viewBox="0 0 24 24">
|
|
262
|
+
<circle cx="12" cy="12" r="9"/>
|
|
263
|
+
<ellipse cx="12" cy="12" rx="4" ry="9"/>
|
|
264
|
+
<line x1="3" y1="9" x2="21" y2="9"/>
|
|
265
|
+
<line x1="3" y1="15" x2="21" y2="15"/>
|
|
266
|
+
<path d="M18 4l-2 2 1 3"/>
|
|
267
|
+
<path d="M6 18l2-1 3 1"/>
|
|
268
|
+
</symbol>
|
|
269
|
+
|
|
270
|
+
<!-- SURAKSHA — Shield / security -->
|
|
271
|
+
<symbol id="icon-suraksha" viewBox="0 0 24 24">
|
|
272
|
+
<path d="M12 2l8 4v6c0 5.5-3.8 10.7-8 12-4.2-1.3-8-6.5-8-12V6z"/>
|
|
273
|
+
<polyline points="9 12 11 14 15 10"/>
|
|
274
|
+
</symbol>
|
|
275
|
+
|
|
276
|
+
<!-- TIVRA — Lightning bolt / acceleration -->
|
|
277
|
+
<symbol id="icon-tivra" viewBox="0 0 24 24">
|
|
278
|
+
<polygon points="13,2 3,14 12,14 11,22 21,10 12,10"/>
|
|
279
|
+
</symbol>
|
|
280
|
+
|
|
281
|
+
<!-- PRAHARI — Satellite / sentinel -->
|
|
282
|
+
<symbol id="icon-prahari" viewBox="0 0 24 24">
|
|
283
|
+
<rect x="9" y="9" width="6" height="6" rx="1" transform="rotate(45 12 12)"/>
|
|
284
|
+
<line x1="12" y1="5" x2="12" y2="2"/>
|
|
285
|
+
<line x1="19" y1="12" x2="22" y2="12"/>
|
|
286
|
+
<line x1="12" y1="19" x2="12" y2="22"/>
|
|
287
|
+
<line x1="5" y1="12" x2="2" y2="12"/>
|
|
288
|
+
<path d="M7 7L5 5"/>
|
|
289
|
+
<path d="M17 7l2-2"/>
|
|
290
|
+
</symbol>
|
|
291
|
+
|
|
292
|
+
<!-- DHARMA — Balance scale / content moderation -->
|
|
293
|
+
<symbol id="icon-dharma" viewBox="0 0 24 24">
|
|
294
|
+
<line x1="12" y1="3" x2="12" y2="21"/>
|
|
295
|
+
<line x1="4" y1="7" x2="20" y2="7"/>
|
|
296
|
+
<path d="M4 7l2 7h0a3 3 0 006 0h0l2-7"/>
|
|
297
|
+
<path d="M14 7l2 7h0a3 3 0 006 0h0l2-7"/>
|
|
298
|
+
<line x1="10" y1="21" x2="14" y2="21"/>
|
|
299
|
+
</symbol>
|
|
300
|
+
|
|
301
|
+
<!-- SEVA — Helping hands / NPU sharing -->
|
|
302
|
+
<symbol id="icon-seva" viewBox="0 0 24 24">
|
|
303
|
+
<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"/>
|
|
304
|
+
<path d="M12 11V5"/>
|
|
305
|
+
<path d="M9 8l3-3 3 3"/>
|
|
306
|
+
<circle cx="12" cy="16" r="2"/>
|
|
307
|
+
</symbol>
|
|
308
|
+
|
|
309
|
+
<!-- ═══ APPLICATIONS ═══ -->
|
|
310
|
+
|
|
311
|
+
<!-- YakApp — Messenger -->
|
|
312
|
+
<symbol id="icon-yakapp" viewBox="0 0 24 24">
|
|
313
|
+
<path 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"/>
|
|
314
|
+
</symbol>
|
|
315
|
+
|
|
316
|
+
<!-- C2C — Core to Cosmos -->
|
|
317
|
+
<symbol id="icon-c2c" viewBox="0 0 24 24">
|
|
318
|
+
<circle cx="12" cy="12" r="3"/>
|
|
319
|
+
<circle cx="12" cy="12" r="9"/>
|
|
320
|
+
<path d="M12 3v3"/>
|
|
321
|
+
<path d="M12 18v3"/>
|
|
322
|
+
<path d="M3 12h3"/>
|
|
323
|
+
<path d="M18 12h3"/>
|
|
324
|
+
</symbol>
|
|
325
|
+
|
|
326
|
+
<!-- Studio — Creative suite -->
|
|
327
|
+
<symbol id="icon-studio" viewBox="0 0 24 24">
|
|
328
|
+
<circle cx="13.5" cy="6.5" r="2.5"/>
|
|
329
|
+
<path d="M6 21l4-10 3 5 4-7 4 12"/>
|
|
330
|
+
<rect x="2" y="2" width="20" height="20" rx="2"/>
|
|
331
|
+
</symbol>
|
|
332
|
+
|
|
333
|
+
|
|
334
|
+
<!-- ═══ REFERENCE ═══ -->
|
|
335
|
+
|
|
336
|
+
<!-- Quick Reference — Clipboard -->
|
|
337
|
+
<symbol id="icon-quickref" viewBox="0 0 24 24">
|
|
338
|
+
<path d="M16 4h2a2 2 0 012 2v14a2 2 0 01-2 2H6a2 2 0 01-2-2V6a2 2 0 012-2h2"/>
|
|
339
|
+
<rect x="8" y="2" width="8" height="4" rx="1"/>
|
|
340
|
+
<line x1="8" y1="10" x2="16" y2="10"/>
|
|
341
|
+
<line x1="8" y1="14" x2="16" y2="14"/>
|
|
342
|
+
<line x1="8" y1="18" x2="12" y2="18"/>
|
|
343
|
+
</symbol>
|
|
344
|
+
|
|
345
|
+
<!-- GRANTH — Docs bundle -->
|
|
346
|
+
<symbol id="icon-granth" viewBox="0 0 24 24">
|
|
347
|
+
<path d="M4 19.5A2.5 2.5 0 016.5 17H20"/>
|
|
348
|
+
<path d="M6.5 2H20v20H6.5A2.5 2.5 0 014 19.5v-15A2.5 2.5 0 016.5 2z"/>
|
|
349
|
+
<path d="M8 7h8"/>
|
|
350
|
+
<path d="M8 11h5"/>
|
|
351
|
+
<path d="M8 15h3"/>
|
|
352
|
+
</symbol>
|
|
353
|
+
|
|
354
|
+
<!-- API — Signal tower -->
|
|
355
|
+
<symbol id="icon-api" viewBox="0 0 24 24">
|
|
356
|
+
<line x1="12" y1="10" x2="12" y2="22"/>
|
|
357
|
+
<path d="M8 6a6 6 0 018 0"/>
|
|
358
|
+
<path d="M5 3a10 10 0 0114 0"/>
|
|
359
|
+
<circle cx="12" cy="10" r="2"/>
|
|
360
|
+
</symbol>
|
|
361
|
+
|
|
362
|
+
<!-- Adapters — Plug connector -->
|
|
363
|
+
<symbol id="icon-adapters" viewBox="0 0 24 24">
|
|
364
|
+
<path d="M6 3v4"/>
|
|
365
|
+
<path d="M10 3v4"/>
|
|
366
|
+
<path d="M4 7h8v3a4 4 0 01-8 0V7z"/>
|
|
367
|
+
<line x1="8" y1="14" x2="8" y2="17"/>
|
|
368
|
+
<path d="M14 10h4v3a2 2 0 01-4 0v-3z"/>
|
|
369
|
+
<line x1="16" y1="7" x2="16" y2="10"/>
|
|
370
|
+
<line x1="16" y1="13" x2="16" y2="17"/>
|
|
371
|
+
<line x1="8" y1="17" x2="16" y2="17"/>
|
|
372
|
+
<line x1="12" y1="17" x2="12" y2="21"/>
|
|
373
|
+
</symbol>
|
|
374
|
+
|
|
375
|
+
<!-- ═══ EXTRA (pages outside nav-order) ═══ -->
|
|
376
|
+
|
|
377
|
+
<!-- Terminal / CLI -->
|
|
378
|
+
<symbol id="icon-terminal" viewBox="0 0 24 24">
|
|
379
|
+
<rect x="2" y="3" width="20" height="18" rx="2"/>
|
|
380
|
+
<polyline points="7 9 10 12 7 15"/>
|
|
381
|
+
<line x1="13" y1="15" x2="17" y2="15"/>
|
|
382
|
+
</symbol>
|
|
383
|
+
|
|
384
|
+
<!-- Gear / Configuration -->
|
|
385
|
+
<symbol id="icon-gear" viewBox="0 0 24 24">
|
|
386
|
+
<circle cx="12" cy="12" r="3"/>
|
|
387
|
+
<path 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"/>
|
|
388
|
+
</symbol>
|
|
389
|
+
|
|
390
|
+
<!-- Server / Web hosting -->
|
|
391
|
+
<symbol id="icon-server" viewBox="0 0 24 24">
|
|
392
|
+
<rect x="2" y="2" width="20" height="8" rx="2"/>
|
|
393
|
+
<rect x="2" y="14" width="20" height="8" rx="2"/>
|
|
394
|
+
<line x1="6" y1="6" x2="6.01" y2="6"/>
|
|
395
|
+
<line x1="6" y1="18" x2="6.01" y2="18"/>
|
|
396
|
+
</symbol>
|
|
397
|
+
|
|
398
|
+
<!-- ═══ CHROME / UI ═══ -->
|
|
399
|
+
|
|
400
|
+
<!-- Mountain peak — logo icon (replaces 🏔️) -->
|
|
401
|
+
<symbol id="icon-mountain" viewBox="0 0 24 24">
|
|
402
|
+
<path d="M8 21l4.5-9 3 5.5L19 12l3 9H2l6-9z"/>
|
|
403
|
+
<path d="M12 12l1.5-3L16 14"/>
|
|
404
|
+
</symbol>
|
|
405
|
+
|
|
406
|
+
<!-- Dashboard / bar chart (replaces 📊) -->
|
|
407
|
+
<symbol id="icon-dashboard" viewBox="0 0 24 24">
|
|
408
|
+
<line x1="18" y1="20" x2="18" y2="10"/>
|
|
409
|
+
<line x1="12" y1="20" x2="12" y2="4"/>
|
|
410
|
+
<line x1="6" y1="20" x2="6" y2="14"/>
|
|
411
|
+
<rect x="2" y="2" width="20" height="20" rx="2" stroke-opacity="0.4"/>
|
|
412
|
+
</symbol>
|
|
413
|
+
|
|
414
|
+
<!-- ═══ GENERIC / CONTENT ICONS ═══ -->
|
|
415
|
+
|
|
416
|
+
<!-- Lock / encrypted (replaces 🔐) -->
|
|
417
|
+
<symbol id="icon-lock" viewBox="0 0 24 24">
|
|
418
|
+
<rect x="3" y="11" width="18" height="11" rx="2"/>
|
|
419
|
+
<path d="M7 11V7a5 5 0 0110 0v4"/>
|
|
420
|
+
</symbol>
|
|
421
|
+
|
|
422
|
+
<!-- Signal / broadcast (replaces 📡) -->
|
|
423
|
+
<symbol id="icon-signal" viewBox="0 0 24 24">
|
|
424
|
+
<path d="M2 12a10 10 0 0118 0"/>
|
|
425
|
+
<path d="M5 12a7 7 0 0112 0"/>
|
|
426
|
+
<path d="M8 12a4 4 0 016 0"/>
|
|
427
|
+
<circle cx="11" cy="12" r="1"/>
|
|
428
|
+
</symbol>
|
|
429
|
+
|
|
430
|
+
<!-- Link / chain (replaces 🔗) -->
|
|
431
|
+
<symbol id="icon-link" viewBox="0 0 24 24">
|
|
432
|
+
<path d="M10 13a5 5 0 007.54.54l3-3a5 5 0 00-7.07-7.07l-1.72 1.71"/>
|
|
433
|
+
<path d="M14 11a5 5 0 00-7.54-.54l-3 3a5 5 0 007.07 7.07l1.71-1.71"/>
|
|
434
|
+
</symbol>
|
|
435
|
+
|
|
436
|
+
<!-- Globe / network (replaces 🌐) -->
|
|
437
|
+
<symbol id="icon-globe" viewBox="0 0 24 24">
|
|
438
|
+
<circle cx="12" cy="12" r="10"/>
|
|
439
|
+
<line x1="2" y1="12" x2="22" y2="12"/>
|
|
440
|
+
<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"/>
|
|
441
|
+
</symbol>
|
|
442
|
+
|
|
443
|
+
<!-- Sync / refresh (replaces 🔄) -->
|
|
444
|
+
<symbol id="icon-sync" viewBox="0 0 24 24">
|
|
445
|
+
<polyline points="23 4 23 10 17 10"/>
|
|
446
|
+
<polyline points="1 20 1 14 7 14"/>
|
|
447
|
+
<path d="M3.51 9a9 9 0 0114.85-3.36L23 10M1 14l4.64 4.36A9 9 0 0020.49 15"/>
|
|
448
|
+
</symbol>
|
|
449
|
+
|
|
450
|
+
<!-- Users / group (replaces 👥) -->
|
|
451
|
+
<symbol id="icon-users" viewBox="0 0 24 24">
|
|
452
|
+
<path d="M17 21v-2a4 4 0 00-4-4H5a4 4 0 00-4 4v2"/>
|
|
453
|
+
<circle cx="9" cy="7" r="4"/>
|
|
454
|
+
<path d="M23 21v-2a4 4 0 00-3-3.87"/>
|
|
455
|
+
<path d="M16 3.13a4 4 0 010 7.75"/>
|
|
456
|
+
</symbol>
|
|
457
|
+
|
|
458
|
+
<!-- Shield / protection (replaces 🛡) -->
|
|
459
|
+
<symbol id="icon-shield" viewBox="0 0 24 24">
|
|
460
|
+
<path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z"/>
|
|
461
|
+
</symbol>
|
|
462
|
+
|
|
463
|
+
<!-- Heartbeat / pulse (replaces 💓) -->
|
|
464
|
+
<symbol id="icon-heartbeat" viewBox="0 0 24 24">
|
|
465
|
+
<path d="M3 12h4l3-9 4 18 3-9h4"/>
|
|
466
|
+
</symbol>
|
|
467
|
+
|
|
468
|
+
<!-- Map pin / location (replaces 📍) -->
|
|
469
|
+
<symbol id="icon-pin" viewBox="0 0 24 24">
|
|
470
|
+
<path d="M21 10c0 7-9 13-9 13s-9-6-9-13a9 9 0 0118 0z"/>
|
|
471
|
+
<circle cx="12" cy="10" r="3"/>
|
|
472
|
+
</symbol>
|
|
473
|
+
|
|
474
|
+
<!-- Traffic light / status (replaces 🚦) -->
|
|
475
|
+
<symbol id="icon-traffic" viewBox="0 0 24 24">
|
|
476
|
+
<rect x="7" y="2" width="10" height="20" rx="3"/>
|
|
477
|
+
<circle cx="12" cy="7" r="1.5"/>
|
|
478
|
+
<circle cx="12" cy="12" r="1.5"/>
|
|
479
|
+
<circle cx="12" cy="17" r="1.5"/>
|
|
480
|
+
</symbol>
|
|
481
|
+
|
|
482
|
+
<!-- Check circle (replaces ✅) -->
|
|
483
|
+
<symbol id="icon-check" viewBox="0 0 24 24">
|
|
484
|
+
<path d="M22 11.08V12a10 10 0 11-5.93-9.14"/>
|
|
485
|
+
<polyline points="22 4 12 14.01 9 11.01"/>
|
|
486
|
+
</symbol>
|
|
487
|
+
|
|
488
|
+
<!-- Megaphone / broadcast (replaces 📢) -->
|
|
489
|
+
<symbol id="icon-megaphone" viewBox="0 0 24 24">
|
|
490
|
+
<path d="M21 15a2 2 0 01-2 2H7l-4 4V5a2 2 0 012-2h14a2 2 0 012 2z"/>
|
|
491
|
+
</symbol>
|
|
492
|
+
|
|
493
|
+
<!-- Pen / signed (replaces ✍) -->
|
|
494
|
+
<symbol id="icon-pen" viewBox="0 0 24 24">
|
|
495
|
+
<path d="M12 20h9"/>
|
|
496
|
+
<path d="M16.5 3.5a2.121 2.121 0 013 3L7 19l-4 1 1-4L16.5 3.5z"/>
|
|
497
|
+
</symbol>
|
|
498
|
+
|
|
499
|
+
<!-- Warning / alert (replaces ⚠) -->
|
|
500
|
+
<symbol id="icon-warning" viewBox="0 0 24 24">
|
|
501
|
+
<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"/>
|
|
502
|
+
<line x1="12" y1="9" x2="12" y2="13"/>
|
|
503
|
+
<line x1="12" y1="17" x2="12.01" y2="17"/>
|
|
504
|
+
</symbol>
|
|
505
|
+
|
|
506
|
+
<!-- Hourglass / timer (replaces ⏳) -->
|
|
507
|
+
<symbol id="icon-hourglass" viewBox="0 0 24 24">
|
|
508
|
+
<path d="M6 2h12v5l-4 4 4 4v5H6v-5l4-4-4-4V2z"/>
|
|
509
|
+
</symbol>
|
|
510
|
+
|
|
511
|
+
<!-- Scroll / document (replaces 📜) -->
|
|
512
|
+
<symbol id="icon-scroll" viewBox="0 0 24 24">
|
|
513
|
+
<path d="M14 2H6a2 2 0 00-2 2v16a2 2 0 002 2h12a2 2 0 002-2V8z"/>
|
|
514
|
+
<polyline points="14 2 14 8 20 8"/>
|
|
515
|
+
<line x1="16" y1="13" x2="8" y2="13"/>
|
|
516
|
+
<line x1="16" y1="17" x2="8" y2="17"/>
|
|
517
|
+
</symbol>
|
|
518
|
+
|
|
519
|
+
<!-- Bolt / lightning (replaces ⚡) -->
|
|
520
|
+
<symbol id="icon-bolt" viewBox="0 0 24 24">
|
|
521
|
+
<polygon points="13 2 3 14 12 14 11 22 21 10 12 10 13 2"/>
|
|
522
|
+
</symbol>
|
|
523
|
+
|
|
524
|
+
<!-- Target / crosshair (replaces 🎯) -->
|
|
525
|
+
<symbol id="icon-target" viewBox="0 0 24 24">
|
|
526
|
+
<circle cx="12" cy="12" r="10"/>
|
|
527
|
+
<circle cx="12" cy="12" r="6"/>
|
|
528
|
+
<circle cx="12" cy="12" r="2"/>
|
|
529
|
+
</symbol>
|
|
530
|
+
|
|
531
|
+
<!-- Handshake / trust (replaces 🤝) -->
|
|
532
|
+
<symbol id="icon-handshake" viewBox="0 0 24 24">
|
|
533
|
+
<path d="M11 17l-3.5-3.5a2.12 2.12 0 013-3L14 14"/>
|
|
534
|
+
<path d="M20.88 7.12l-3.17 3.17"/>
|
|
535
|
+
<path d="M3.12 7.12l3.17 3.17"/>
|
|
536
|
+
<path d="M2 12h4"/>
|
|
537
|
+
<path d="M18 12h4"/>
|
|
538
|
+
<path d="M7.76 4.25L12 2l4.24 2.25"/>
|
|
539
|
+
</symbol>
|
|
540
|
+
|
|
541
|
+
<!-- Leaf / organic (replaces 🌿) -->
|
|
542
|
+
<symbol id="icon-leaf" viewBox="0 0 24 24">
|
|
543
|
+
<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"/>
|
|
544
|
+
<path d="M7 15c2-2 5.5-3 9-3"/>
|
|
545
|
+
</symbol>
|
|
546
|
+
|
|
547
|
+
<!-- Satellite (replaces 🛰) -->
|
|
548
|
+
<symbol id="icon-satellite" viewBox="0 0 24 24">
|
|
549
|
+
<path d="M13 7L9 3 5 7l4 4"/>
|
|
550
|
+
<path d="M17 11l4 4-4 4-4-4"/>
|
|
551
|
+
<line x1="8" y1="11" x2="13" y2="16"/>
|
|
552
|
+
<line x1="3" y1="21" x2="3.01" y2="21"/>
|
|
553
|
+
<path d="M6 18a3 3 0 000 0"/>
|
|
554
|
+
<path d="M9 15a6 6 0 000 0"/>
|
|
555
|
+
</symbol>
|
|
556
|
+
|
|
557
|
+
<!-- Phone / mobile (replaces 📱) -->
|
|
558
|
+
<symbol id="icon-phone" viewBox="0 0 24 24">
|
|
559
|
+
<rect x="5" y="2" width="14" height="20" rx="2"/>
|
|
560
|
+
<line x1="12" y1="18" x2="12.01" y2="18"/>
|
|
561
|
+
</symbol>
|
|
562
|
+
|
|
563
|
+
<!-- Masks / theater (replaces 🎭) -->
|
|
564
|
+
<symbol id="icon-masks" viewBox="0 0 24 24">
|
|
565
|
+
<circle cx="12" cy="12" r="10"/>
|
|
566
|
+
<path d="M8 14s1.5 2 4 2 4-2 4-2"/>
|
|
567
|
+
<line x1="9" y1="9" x2="9.01" y2="9"/>
|
|
568
|
+
<line x1="15" y1="9" x2="15.01" y2="9"/>
|
|
569
|
+
</symbol>
|
|
570
|
+
|
|
571
|
+
<!-- Stars / cosmos (replaces 🌌) -->
|
|
572
|
+
<symbol id="icon-cosmos" viewBox="0 0 24 24">
|
|
573
|
+
<polygon 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"/>
|
|
574
|
+
</symbol>
|
|
575
|
+
|
|
576
|
+
<!-- Gem / diamond (replaces 💎) -->
|
|
577
|
+
<symbol id="icon-gem" viewBox="0 0 24 24">
|
|
578
|
+
<polygon points="6 3 18 3 22 9 12 22 2 9 6 3"/>
|
|
579
|
+
<line x1="2" y1="9" x2="22" y2="9"/>
|
|
580
|
+
<line x1="12" y1="22" x2="8" y2="9"/>
|
|
581
|
+
<line x1="12" y1="22" x2="16" y2="9"/>
|
|
582
|
+
<line x1="8" y1="9" x2="10" y2="3"/>
|
|
583
|
+
<line x1="16" y1="9" x2="14" y2="3"/>
|
|
584
|
+
</symbol>
|
|
585
|
+
|
|
586
|
+
<!-- Search / magnifying glass (replaces 🔍) -->
|
|
587
|
+
<symbol id="icon-search" viewBox="0 0 24 24">
|
|
588
|
+
<circle cx="11" cy="11" r="8"/>
|
|
589
|
+
<line x1="21" y1="21" x2="16.65" y2="16.65"/>
|
|
590
|
+
</symbol>
|
|
591
|
+
|
|
592
|
+
</svg>
|
|
593
|
+
<!-- YAKMESH-ICON-SPRITE-END -->
|
|
594
|
+
<a href="#mainContent" class="skip-link">Skip to main content</a>
|
|
595
|
+
|
|
596
|
+
<nav class="docs-sidebar" id="sidebar">
|
|
597
|
+
<a href="index.html" class="sidebar-logo">
|
|
598
|
+
<span class="logo-icon"><svg class="doc-icon" aria-hidden="true"><use href="#icon-mountain"/></svg></span>
|
|
599
|
+
<span class="logo-text">Yakmesh</span>
|
|
600
|
+
</a>
|
|
601
|
+
<a href="/dashboard" class="sidebar-dashboard-link"><svg class="doc-icon" aria-hidden="true"><use href="#icon-dashboard"/></svg> <span>Dashboard</span></a>
|
|
602
|
+
<ul class="sidebar-nav">
|
|
603
|
+
<li class="sidebar-section"><span><svg class="doc-icon" aria-hidden="true"><use href="#icon-book"/></svg> Guides</span></li>
|
|
604
|
+
<li><a href="index.html"><svg class="doc-icon" aria-hidden="true"><use href="#icon-home"/></svg> <span>Overview</span></a></li>
|
|
605
|
+
<li><a href="getting-started.html"><svg class="doc-icon" aria-hidden="true"><use href="#icon-rocket"/></svg> <span>Getting Started</span></a></li>
|
|
606
|
+
<li><a href="tutorials.html"><svg class="doc-icon" aria-hidden="true"><use href="#icon-book"/></svg> <span>Tutorials</span></a></li>
|
|
607
|
+
<li class="sidebar-section"><span><svg class="doc-icon" aria-hidden="true"><use href="#icon-yak"/></svg> Protocol Stack</span></li>
|
|
608
|
+
<li><a href="yak-protocol.html"><svg class="doc-icon" aria-hidden="true"><use href="#icon-yak"/></svg> <span>YAK://</span></a></li>
|
|
609
|
+
<li><a href="annex.html"><svg class="doc-icon" aria-hidden="true"><use href="#icon-annex"/></svg> <span>ANNEX</span></a></li>
|
|
610
|
+
<li><a href="jhilke.html"><svg class="doc-icon" aria-hidden="true"><use href="#icon-jhilke"/></svg> <span>JHILKE</span></a></li>
|
|
611
|
+
<li><a href="nakpak.html"><svg class="doc-icon" aria-hidden="true"><use href="#icon-nakpak"/></svg> <span>NAKPAK</span></a></li>
|
|
612
|
+
<li><a href="namche.html"><svg class="doc-icon" aria-hidden="true"><use href="#icon-namche"/></svg> <span>NAMCHE</span></a></li>
|
|
613
|
+
<li><a href="doko.html"><svg class="doc-icon" aria-hidden="true"><use href="#icon-doko"/></svg> <span>DOKO</span></a></li>
|
|
614
|
+
<li><a href="sherpa.html"><svg class="doc-icon" aria-hidden="true"><use href="#icon-sherpa"/></svg> <span>SHERPA</span></a></li>
|
|
615
|
+
<li><a href="mandala.html"><svg class="doc-icon" aria-hidden="true"><use href="#icon-mandala"/></svg> <span>MANDALA</span></a></li>
|
|
616
|
+
<li><a href="mantra.html"><svg class="doc-icon" aria-hidden="true"><use href="#icon-mantra"/></svg> <span>MANTRA</span></a></li>
|
|
617
|
+
<li><a href="gumba.html"><svg class="doc-icon" aria-hidden="true"><use href="#icon-gumba"/></svg> <span>GUMBA</span></a></li>
|
|
618
|
+
<li><a href="yurt.html"><svg class="doc-icon" aria-hidden="true"><use href="#icon-yurt"/></svg> <span>YURT</span></a></li>
|
|
619
|
+
<li><a href="katha.html"><svg class="doc-icon" aria-hidden="true"><use href="#icon-katha"/></svg> <span>KATHA</span></a></li>
|
|
620
|
+
<li><a href="vani.html"><svg class="doc-icon" aria-hidden="true"><use href="#icon-vani"/></svg> <span>VANI</span></a></li>
|
|
621
|
+
<li><a href="darshan.html"><svg class="doc-icon" aria-hidden="true"><use href="#icon-darshan"/></svg> <span>DARSHAN</span></a></li>
|
|
622
|
+
<li><a href="stupa.html"><svg class="doc-icon" aria-hidden="true"><use href="#icon-stupa"/></svg> <span>STUPA</span></a></li>
|
|
623
|
+
<li><a href="lama.html"><svg class="doc-icon" aria-hidden="true"><use href="#icon-lama"/></svg> <span>LAMA</span></a></li>
|
|
624
|
+
<li><a href="mani.html"><svg class="doc-icon" aria-hidden="true"><use href="#icon-mani"/></svg> <span>MANI</span></a></li>
|
|
625
|
+
<li><a href="karma.html"><svg class="doc-icon" aria-hidden="true"><use href="#icon-karma"/></svg> <span>KARMA</span></a></li>
|
|
626
|
+
<li><a href="tattva.html"><svg class="doc-icon" aria-hidden="true"><use href="#icon-tattva"/></svg> <span>TATTVA</span></a></li>
|
|
627
|
+
<li><a href="tribhuj.html"><svg class="doc-icon" aria-hidden="true"><use href="#icon-tribhuj"/></svg> <span>TRIBHUJ</span></a></li>
|
|
628
|
+
<li><a href="ypc27.html"><svg class="doc-icon" aria-hidden="true"><use href="#icon-ypc27"/></svg> <span>YPC-27</span></a></li>
|
|
629
|
+
<li><a href="sakshi.html"><svg class="doc-icon" aria-hidden="true"><use href="#icon-sakshi"/></svg> <span>SAKSHI</span></a></li>
|
|
630
|
+
<li><a href="geo-proof.html"><svg class="doc-icon" aria-hidden="true"><use href="#icon-pramaan"/></svg> <span>PRAMAAN</span></a></li>
|
|
631
|
+
<li><a href="trust-security.html"><svg class="doc-icon" aria-hidden="true"><use href="#icon-suraksha"/></svg> <span>SURAKSHA</span></a></li>
|
|
632
|
+
<li><a href="tivra.html"><svg class="doc-icon" aria-hidden="true"><use href="#icon-tivra"/></svg> <span>TIVRA</span></a></li>
|
|
633
|
+
<li><a href="prahari.html"><svg class="doc-icon" aria-hidden="true"><use href="#icon-prahari"/></svg> <span>PRAHARI</span></a></li>
|
|
634
|
+
<li><a href="dharma.html"><svg class="doc-icon" aria-hidden="true"><use href="#icon-dharma"/></svg> <span>DHARMA</span></a></li>
|
|
635
|
+
<li><a href="seva.html"><svg class="doc-icon" aria-hidden="true"><use href="#icon-seva"/></svg> <span>SEVA</span></a></li>
|
|
636
|
+
<li><a href="docs-bundle.html"><svg class="doc-icon" aria-hidden="true"><use href="#icon-granth"/></svg> <span>GRANTH</span></a></li>
|
|
637
|
+
<li><a href="api.html"><svg class="doc-icon" aria-hidden="true"><use href="#icon-api"/></svg> <span>API</span></a></li>
|
|
638
|
+
<li><a href="adapters.html"><svg class="doc-icon" aria-hidden="true"><use href="#icon-adapters"/></svg> <span>Adapters</span></a></li>
|
|
639
|
+
<li class="sidebar-section"><span><svg class="doc-icon" aria-hidden="true"><use href="#icon-rocket"/></svg> Applications</span></li>
|
|
640
|
+
<li><a href="yakapp.html"><svg class="doc-icon" aria-hidden="true"><use href="#icon-yakapp"/></svg> <span>YakApp</span></a></li>
|
|
641
|
+
<li><a href="c2c.html"><svg class="doc-icon" aria-hidden="true"><use href="#icon-c2c"/></svg> <span>C2C</span></a></li>
|
|
642
|
+
<li><a href="studio.html"><svg class="doc-icon" aria-hidden="true"><use href="#icon-studio"/></svg> <span>Studio</span></a></li>
|
|
643
|
+
<li class="sidebar-section"><span><svg class="doc-icon" aria-hidden="true"><use href="#icon-gear"/></svg> Infrastructure</span></li>
|
|
644
|
+
<li><a href="cli.html"><svg class="doc-icon" aria-hidden="true"><use href="#icon-terminal"/></svg> <span>CLI</span></a></li>
|
|
645
|
+
<li><a href="configuration.html"><svg class="doc-icon" aria-hidden="true"><use href="#icon-gear"/></svg> <span>Configuration</span></a></li>
|
|
646
|
+
<li><a href="mesh.html"><svg class="doc-icon" aria-hidden="true"><use href="#icon-mandala"/></svg> <span>Mesh Network</span></a></li>
|
|
647
|
+
<li><a href="time-sources.html"><svg class="doc-icon" aria-hidden="true"><use href="#icon-mani"/></svg> <span>Time Sources</span></a></li>
|
|
648
|
+
<li><a href="webserver.html"><svg class="doc-icon" aria-hidden="true"><use href="#icon-server"/></svg> <span>Web Server</span></a></li>
|
|
649
|
+
<li><a href="advanced-systems.html"><svg class="doc-icon" aria-hidden="true"><use href="#icon-tivra"/></svg> <span>Advanced Systems</span></a></li>
|
|
650
|
+
<li class="sidebar-section"><span><svg class="doc-icon" aria-hidden="true"><use href="#icon-book"/></svg> Tutorials</span></li>
|
|
651
|
+
<li><a href="gumba-tutorial.html" class="active"><svg class="doc-icon" aria-hidden="true"><use href="#icon-gumba"/></svg> <span>GUMBA Tutorial</span></a></li>
|
|
652
|
+
<li class="sidebar-section"><span><svg class="doc-icon" aria-hidden="true"><use href="#icon-quickref"/></svg> Reference</span></li>
|
|
653
|
+
<li><a href="quick-reference.html"><svg class="doc-icon" aria-hidden="true"><use href="#icon-quickref"/></svg> <span>Quick Ref</span></a></li>
|
|
654
|
+
</ul>
|
|
655
|
+
</nav>
|
|
656
|
+
|
|
657
|
+
<button class="sidebar-toggle" id="sidebarToggle" title="Toggle sidebar">
|
|
658
|
+
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
659
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M11 19l-7-7 7-7m8 14l-7-7 7-7" />
|
|
660
|
+
</svg>
|
|
661
|
+
</button>
|
|
662
|
+
|
|
663
|
+
<div class="sidebar-overlay" id="sidebarOverlay"></div>
|
|
664
|
+
|
|
665
|
+
<main class="docs-main" id="mainContent">
|
|
666
|
+
<div class="docs-content">
|
|
667
|
+
|
|
668
|
+
<!-- Page Header -->
|
|
669
|
+
<div class="flex items-center gap-3 mb-4">
|
|
670
|
+
<svg class="doc-icon hero-icon" aria-hidden="true"><use href="#icon-gumba"/></svg>
|
|
671
|
+
<div>
|
|
672
|
+
<h1 class="text-4xl font-bold">GUMBA Tutorial</h1>
|
|
673
|
+
<p class="theme-accent">Build a private chat room in 15 minutes</p>
|
|
674
|
+
</div>
|
|
675
|
+
</div>
|
|
676
|
+
<p class="text-xl text-mountain-300 mb-8">
|
|
677
|
+
Learn to create and manage GUMBA-protected spaces with step-by-step instructions.
|
|
678
|
+
</p>
|
|
679
|
+
|
|
680
|
+
<!-- Prerequisites -->
|
|
681
|
+
<div class="info-box mb-8">
|
|
682
|
+
<h2 class="font-bold mb-2"><svg class="doc-icon inline-icon" width="24" height="24" aria-hidden="true"><use href="#icon-scroll"/></svg> Prerequisites</h2>
|
|
683
|
+
<ul class="text-mountain-300 text-sm space-y-1">
|
|
684
|
+
<li>• YAKMESH node installed and running</li>
|
|
685
|
+
<li>• Basic understanding of Node.js and async/await</li>
|
|
686
|
+
<li>• DOKO identity created (see <a href="doko.html" class="theme-accent">DOKO documentation</a>)</li>
|
|
687
|
+
</ul>
|
|
688
|
+
</div>
|
|
689
|
+
|
|
690
|
+
<!-- Tutorial 1: Create a Private Chat Room -->
|
|
691
|
+
<section id="tutorial-1" class="mb-16">
|
|
692
|
+
<h2 class="text-3xl font-bold mb-6 flex items-center gap-3">
|
|
693
|
+
<svg class="doc-icon hero-icon" aria-hidden="true"><use href="#icon-gumba"/></svg> Tutorial 1: Create a Private Chat Room
|
|
694
|
+
</h2>
|
|
695
|
+
|
|
696
|
+
<p class="text-mountain-300 mb-6">
|
|
697
|
+
In this tutorial, you'll create a GUMBA-protected chat room, add members,
|
|
698
|
+
and handle access requests from visitors.
|
|
699
|
+
</p>
|
|
700
|
+
|
|
701
|
+
<!-- Step 1 -->
|
|
702
|
+
<div class="tutorial-card">
|
|
703
|
+
<h3 class="text-xl font-bold mb-3"><span class="step-number">1</span> Import GUMBA Components</h3>
|
|
704
|
+
<p class="text-mountain-300 mb-4">First, import the necessary GUMBA components:</p>
|
|
705
|
+
<pre class="language-javascript"><code>import {
|
|
706
|
+
GumbaHub,
|
|
707
|
+
GumbaProof,
|
|
708
|
+
GUMBA_ROLE,
|
|
709
|
+
GUMBA_PROOF_TYPE,
|
|
710
|
+
} from 'yakmesh/mesh/gumba.js';
|
|
711
|
+
|
|
712
|
+
// You'll also need your node's identity
|
|
713
|
+
import { loadIdentity } from 'yakmesh/mesh/identity.js';</code></pre>
|
|
714
|
+
</div>
|
|
715
|
+
|
|
716
|
+
<!-- Step 2 -->
|
|
717
|
+
<div class="tutorial-card">
|
|
718
|
+
<h3 class="text-xl font-bold mb-3"><span class="step-number">2</span> Initialize the GUMBA Hub</h3>
|
|
719
|
+
<p class="text-mountain-300 mb-4">Create a GumbaHub with your node's identity:</p>
|
|
720
|
+
<pre class="language-javascript"><code>// Load your node's identity
|
|
721
|
+
const identity = await loadIdentity();
|
|
722
|
+
|
|
723
|
+
// Create the GUMBA hub
|
|
724
|
+
// The second parameter is an ANNEX instance for secure delivery (optional)
|
|
725
|
+
const hub = new GumbaHub(identity, null);
|
|
726
|
+
|
|
727
|
+
console.log('GUMBA Hub initialized');</code></pre>
|
|
728
|
+
</div>
|
|
729
|
+
|
|
730
|
+
<!-- Step 3 -->
|
|
731
|
+
<div class="tutorial-card">
|
|
732
|
+
<h3 class="text-xl font-bold mb-3"><span class="step-number">3</span> Create a Bundle (Chat Room)</h3>
|
|
733
|
+
<p class="text-mountain-300 mb-4">Create a new encrypted bundle for your chat room:</p>
|
|
734
|
+
<pre class="language-javascript"><code>// Create a new bundle with a unique ID
|
|
735
|
+
hub.createBundle('team-chat', {
|
|
736
|
+
name: 'Team Chat Room',
|
|
737
|
+
description: 'Private discussions for the team',
|
|
738
|
+
});
|
|
739
|
+
|
|
740
|
+
// Get the bundle reference
|
|
741
|
+
const bundle = hub.getBundle('team-chat');
|
|
742
|
+
|
|
743
|
+
console.log('Bundle created:', bundle.getInfo());</code></pre>
|
|
744
|
+
<div class="info-box mt-4">
|
|
745
|
+
<p class="text-sm text-mountain-300">
|
|
746
|
+
<svg class="doc-icon inline-icon" width="24" height="24" aria-hidden="true"><use href="#icon-bolt"/></svg> The bundle ID must be unique within your hub. The bundle is automatically
|
|
747
|
+
encrypted with a key derived from your node's secret.
|
|
748
|
+
</p>
|
|
749
|
+
</div>
|
|
750
|
+
</div>
|
|
751
|
+
|
|
752
|
+
<!-- Step 4 -->
|
|
753
|
+
<div class="tutorial-card">
|
|
754
|
+
<h3 class="text-xl font-bold mb-3"><span class="step-number">4</span> Add Members</h3>
|
|
755
|
+
<p class="text-mountain-300 mb-4">Add members with appropriate roles:</p>
|
|
756
|
+
<pre class="language-javascript"><code>// Add Alice as an admin
|
|
757
|
+
bundle.addMember(
|
|
758
|
+
'doko-alice-abc123', // Alice's DOKO ID
|
|
759
|
+
GUMBA_ROLE.ADMIN, // Role
|
|
760
|
+
identity.identity.dokoId // Your DOKO ID (as owner)
|
|
761
|
+
);
|
|
762
|
+
|
|
763
|
+
// Add Bob as a regular member
|
|
764
|
+
bundle.addMember(
|
|
765
|
+
'doko-bob-def456',
|
|
766
|
+
GUMBA_ROLE.MEMBER,
|
|
767
|
+
identity.identity.dokoId
|
|
768
|
+
);
|
|
769
|
+
|
|
770
|
+
// Add Carol as read-only
|
|
771
|
+
bundle.addMember(
|
|
772
|
+
'doko-carol-ghi789',
|
|
773
|
+
GUMBA_ROLE.READER,
|
|
774
|
+
identity.identity.dokoId
|
|
775
|
+
);
|
|
776
|
+
|
|
777
|
+
console.log('Members added:', bundle.memberTree.getMembers());</code></pre>
|
|
778
|
+
</div>
|
|
779
|
+
|
|
780
|
+
<!-- Step 5 -->
|
|
781
|
+
<div class="tutorial-card">
|
|
782
|
+
<h3 class="text-xl font-bold mb-3"><span class="step-number">5</span> Register Public Keys</h3>
|
|
783
|
+
<p class="text-mountain-300 mb-4">Register member public keys for signature verification:</p>
|
|
784
|
+
<pre class="language-javascript"><code>// Register public keys for each member
|
|
785
|
+
// In production, these would come from KHATA network lookup
|
|
786
|
+
hub.registerPublicKey('doko-alice-abc123', alicePublicKey);
|
|
787
|
+
hub.registerPublicKey('doko-bob-def456', bobPublicKey);
|
|
788
|
+
hub.registerPublicKey('doko-carol-ghi789', carolPublicKey);</code></pre>
|
|
789
|
+
<div class="warning-box mt-4">
|
|
790
|
+
<p class="text-sm text-red-300">
|
|
791
|
+
<svg class="doc-icon inline-icon" width="24" height="24" aria-hidden="true"><use href="#icon-warning"/></svg> In production, public keys are resolved via the KHATA protocol.
|
|
792
|
+
Manual registration is for testing or pre-cached keys only.
|
|
793
|
+
</p>
|
|
794
|
+
</div>
|
|
795
|
+
</div>
|
|
796
|
+
|
|
797
|
+
<!-- Step 6 -->
|
|
798
|
+
<div class="tutorial-card">
|
|
799
|
+
<h3 class="text-xl font-bold mb-3"><span class="step-number">6</span> Add Some Messages</h3>
|
|
800
|
+
<p class="text-mountain-300 mb-4">Add initial messages to the chat room:</p>
|
|
801
|
+
<pre class="language-javascript"><code>// Add messages (as the owner)
|
|
802
|
+
bundle.addMessage(
|
|
803
|
+
{ text: 'Welcome to the team chat!', type: 'text' },
|
|
804
|
+
identity.identity.dokoId
|
|
805
|
+
);
|
|
806
|
+
|
|
807
|
+
bundle.addMessage(
|
|
808
|
+
{ text: 'Please introduce yourselves.', type: 'text' },
|
|
809
|
+
identity.identity.dokoId
|
|
810
|
+
);
|
|
811
|
+
|
|
812
|
+
console.log('Messages added');</code></pre>
|
|
813
|
+
</div>
|
|
814
|
+
|
|
815
|
+
<!-- Step 7 -->
|
|
816
|
+
<div class="tutorial-card">
|
|
817
|
+
<h3 class="text-xl font-bold mb-3"><span class="step-number">7</span> Handle Access Requests</h3>
|
|
818
|
+
<p class="text-mountain-300 mb-4">When a visitor wants to access the chat room:</p>
|
|
819
|
+
<pre class="language-javascript"><code>// Visitor requests access (on their node)
|
|
820
|
+
// Step 1: Issue a challenge
|
|
821
|
+
const challenge = hub.issueChallenge('team-chat', visitorDokoId);
|
|
822
|
+
|
|
823
|
+
// Step 2: Send challenge to visitor (via mesh network)
|
|
824
|
+
// ... challenge is sent to visitor node ...
|
|
825
|
+
|
|
826
|
+
// Step 3: Visitor signs the challenge (on their node)
|
|
827
|
+
const signedProof = GumbaProof.signChallenge(challenge, visitorSecretKey);
|
|
828
|
+
|
|
829
|
+
// Step 4: Visitor sends signed proof back
|
|
830
|
+
// ... signed proof is received ...
|
|
831
|
+
|
|
832
|
+
// Step 5: Verify and grant access (on your node)
|
|
833
|
+
const access = await hub.handleAccessRequest(
|
|
834
|
+
'team-chat',
|
|
835
|
+
signedProof,
|
|
836
|
+
'visitor-node-id'
|
|
837
|
+
);
|
|
838
|
+
|
|
839
|
+
if (access.granted) {
|
|
840
|
+
console.log('Access granted!');
|
|
841
|
+
console.log('Session ID:', access.sessionId);
|
|
842
|
+
console.log('Role:', access.role);
|
|
843
|
+
} else {
|
|
844
|
+
console.log('Access denied:', access.reason);
|
|
845
|
+
}</code></pre>
|
|
846
|
+
</div>
|
|
847
|
+
|
|
848
|
+
<!-- Step 8 -->
|
|
849
|
+
<div class="tutorial-card">
|
|
850
|
+
<h3 class="text-xl font-bold mb-3"><span class="step-number">8</span> Serve Messages</h3>
|
|
851
|
+
<p class="text-mountain-300 mb-4">Retrieve and deliver messages for an active session:</p>
|
|
852
|
+
<pre class="language-javascript"><code>// Get messages for a session
|
|
853
|
+
const result = await hub.getMessages(access.sessionId);
|
|
854
|
+
|
|
855
|
+
if (result.error) {
|
|
856
|
+
console.log('Error:', result.error);
|
|
857
|
+
} else {
|
|
858
|
+
console.log('Messages:', result.messages);
|
|
859
|
+
// Messages are decrypted locally before delivery
|
|
860
|
+
}
|
|
861
|
+
|
|
862
|
+
// Post a message (if the session has write permission)
|
|
863
|
+
const postResult = await hub.postMessage(access.sessionId, {
|
|
864
|
+
text: 'Hello from visitor!',
|
|
865
|
+
type: 'text',
|
|
866
|
+
});
|
|
867
|
+
|
|
868
|
+
console.log('Message posted:', postResult.success);</code></pre>
|
|
869
|
+
</div>
|
|
870
|
+
</section>
|
|
871
|
+
|
|
872
|
+
<!-- Tutorial 2: Attestation-Based Access -->
|
|
873
|
+
<section id="tutorial-2" class="mb-16">
|
|
874
|
+
<h2 class="text-3xl font-bold mb-6 flex items-center gap-3">
|
|
875
|
+
<svg class="doc-icon hero-icon" aria-hidden="true"><use href="#icon-gumba"/></svg> Tutorial 2: Attestation-Based Access
|
|
876
|
+
</h2>
|
|
877
|
+
|
|
878
|
+
<p class="text-mountain-300 mb-6">
|
|
879
|
+
Learn how existing members can vouch for new members without owner involvement.
|
|
880
|
+
</p>
|
|
881
|
+
|
|
882
|
+
<!-- Step 1 -->
|
|
883
|
+
<div class="tutorial-card">
|
|
884
|
+
<h3 class="text-xl font-bold mb-3"><span class="step-number">1</span> Create an Attestation</h3>
|
|
885
|
+
<p class="text-mountain-300 mb-4">An existing member with sufficient role creates an attestation:</p>
|
|
886
|
+
<pre class="language-javascript"><code>// Alice (admin) creates attestation for Dave
|
|
887
|
+
const attestation = GumbaProof.createAttestation({
|
|
888
|
+
bundleId: 'team-chat',
|
|
889
|
+
grantorDokoId: alice.dokoId,
|
|
890
|
+
granteeDokoId: 'doko-dave-xyz999',
|
|
891
|
+
grantorSecretKey: alice.secretKey,
|
|
892
|
+
grantedRole: GUMBA_ROLE.MEMBER, // Alice can grant up to MEMBER
|
|
893
|
+
expiry: Date.now() + 24 * 60 * 60 * 1000, // Valid for 24 hours
|
|
894
|
+
});
|
|
895
|
+
|
|
896
|
+
// Alice sends attestation to Dave out-of-band
|
|
897
|
+
// (email, secure message, QR code, etc.)</code></pre>
|
|
898
|
+
</div>
|
|
899
|
+
|
|
900
|
+
<!-- Step 2 -->
|
|
901
|
+
<div class="tutorial-card">
|
|
902
|
+
<h3 class="text-xl font-bold mb-3"><span class="step-number">2</span> Use Attestation for Access</h3>
|
|
903
|
+
<p class="text-mountain-300 mb-4">Dave uses the attestation to request access:</p>
|
|
904
|
+
<pre class="language-javascript"><code>// Dave presents the attestation to the hub
|
|
905
|
+
const access = await hub.handleAccessRequest(
|
|
906
|
+
'team-chat',
|
|
907
|
+
attestation, // Use attestation as proof
|
|
908
|
+
'dave-node-id'
|
|
909
|
+
);
|
|
910
|
+
|
|
911
|
+
if (access.granted) {
|
|
912
|
+
console.log('Dave granted access via attestation!');
|
|
913
|
+
console.log('Role:', access.role); // Should be MEMBER
|
|
914
|
+
}</code></pre>
|
|
915
|
+
</div>
|
|
916
|
+
|
|
917
|
+
<div class="info-box">
|
|
918
|
+
<h4 class="font-bold mb-2"><svg class="doc-icon inline-icon" width="24" height="24" aria-hidden="true"><use href="#icon-pen"/></svg> Attestation Rules</h4>
|
|
919
|
+
<ul class="text-sm text-mountain-300 space-y-1">
|
|
920
|
+
<li>• Grantors can only attest roles equal to or below their own role</li>
|
|
921
|
+
<li>• OWNERs can attest any role except OWNER</li>
|
|
922
|
+
<li>• ADMINs can attest MEMBER or READER</li>
|
|
923
|
+
<li>• MEMBERs can only attest READER</li>
|
|
924
|
+
<li>• READERs cannot create attestations</li>
|
|
925
|
+
</ul>
|
|
926
|
+
</div>
|
|
927
|
+
</section>
|
|
928
|
+
|
|
929
|
+
<!-- Tutorial 3: Anonymous Access with Merkle Proofs -->
|
|
930
|
+
<section id="tutorial-3" class="mb-16">
|
|
931
|
+
<h2 class="text-3xl font-bold mb-6 flex items-center gap-3">
|
|
932
|
+
<svg class="doc-icon hero-icon" aria-hidden="true"><use href="#icon-gumba"/></svg> Tutorial 3: Anonymous Access
|
|
933
|
+
</h2>
|
|
934
|
+
|
|
935
|
+
<p class="text-mountain-300 mb-6">
|
|
936
|
+
Use Merkle proofs for privacy-preserving access where identity should remain hidden.
|
|
937
|
+
</p>
|
|
938
|
+
|
|
939
|
+
<!-- Step 1 -->
|
|
940
|
+
<div class="tutorial-card">
|
|
941
|
+
<h3 class="text-xl font-bold mb-3"><span class="step-number">1</span> Generate Merkle Proof</h3>
|
|
942
|
+
<p class="text-mountain-300 mb-4">Member generates a proof of their membership:</p>
|
|
943
|
+
<pre class="language-javascript"><code>// Get the bundle's member tree
|
|
944
|
+
const bundle = hub.getBundle('whistleblower-channel');
|
|
945
|
+
|
|
946
|
+
// Generate Merkle proof (proves membership without revealing to others)
|
|
947
|
+
const merkleProof = GumbaProof.createMerkleProof(
|
|
948
|
+
alice.dokoId,
|
|
949
|
+
bundle.memberTree
|
|
950
|
+
);
|
|
951
|
+
|
|
952
|
+
// The proof contains:
|
|
953
|
+
// - type: MERKLE
|
|
954
|
+
// - dokoId: (can be hidden for true ZK)
|
|
955
|
+
// - proof: Merkle path to root
|
|
956
|
+
// - timestamp</code></pre>
|
|
957
|
+
</div>
|
|
958
|
+
|
|
959
|
+
<!-- Step 2 -->
|
|
960
|
+
<div class="tutorial-card">
|
|
961
|
+
<h3 class="text-xl font-bold mb-3"><span class="step-number">2</span> Verify Merkle Proof</h3>
|
|
962
|
+
<p class="text-mountain-300 mb-4">Verify membership without knowing the full member list:</p>
|
|
963
|
+
<pre class="language-javascript"><code>// Verify the proof against the known root
|
|
964
|
+
const verified = GumbaProof.verifyMerkleProof(
|
|
965
|
+
merkleProof,
|
|
966
|
+
bundle.memberTree.getRoot()
|
|
967
|
+
);
|
|
968
|
+
|
|
969
|
+
if (verified) {
|
|
970
|
+
console.log('Member verified via Merkle proof');
|
|
971
|
+
// Grant read access without logging identity
|
|
972
|
+
}</code></pre>
|
|
973
|
+
</div>
|
|
974
|
+
|
|
975
|
+
<div class="warning-box">
|
|
976
|
+
<h4 class="font-bold mb-2"><svg class="doc-icon inline-icon" aria-hidden="true"><use href="#icon-warning"/></svg> Privacy Considerations</h4>
|
|
977
|
+
<p class="text-sm text-red-300 mb-2">
|
|
978
|
+
True zero-knowledge Merkle proofs require additional work:
|
|
979
|
+
</p>
|
|
980
|
+
<ul class="text-sm text-red-300 space-y-1">
|
|
981
|
+
<li>• The dokoId in the proof can reveal identity</li>
|
|
982
|
+
<li>• For full anonymity, use commitment schemes</li>
|
|
983
|
+
<li>• Consider timing attacks on proof generation</li>
|
|
984
|
+
</ul>
|
|
985
|
+
</div>
|
|
986
|
+
</section>
|
|
987
|
+
|
|
988
|
+
<!-- Tutorial 4: Member Management -->
|
|
989
|
+
<section id="tutorial-4" class="mb-16">
|
|
990
|
+
<h2 class="text-3xl font-bold mb-6 flex items-center gap-3">
|
|
991
|
+
<span class="text-4xl"><svg class="doc-icon hero-icon" width="24" height="24" aria-hidden="true"><use href="#icon-users"/></svg></span> Tutorial 4: Managing Members
|
|
992
|
+
</h2>
|
|
993
|
+
|
|
994
|
+
<div class="tutorial-card">
|
|
995
|
+
<h3 class="text-xl font-bold mb-3">Add, Promote, and Remove Members</h3>
|
|
996
|
+
<pre class="language-javascript"><code>const bundle = hub.getBundle('team-chat');
|
|
997
|
+
const ownerDokoId = identity.identity.dokoId;
|
|
998
|
+
|
|
999
|
+
// Add a new member
|
|
1000
|
+
bundle.addMember('doko-eve-new123', GUMBA_ROLE.READER, ownerDokoId);
|
|
1001
|
+
|
|
1002
|
+
// Members can be added with different roles
|
|
1003
|
+
// (subject to the adder's own role level)
|
|
1004
|
+
|
|
1005
|
+
// Remove a member
|
|
1006
|
+
bundle.removeMember('doko-eve-new123', ownerDokoId);
|
|
1007
|
+
|
|
1008
|
+
// Note: Owner cannot be removed!
|
|
1009
|
+
// This will throw an error:
|
|
1010
|
+
// bundle.removeMember(ownerDokoId, ownerDokoId); // Error!
|
|
1011
|
+
|
|
1012
|
+
// Check membership
|
|
1013
|
+
if (bundle.memberTree.isMember('doko-alice-abc123')) {
|
|
1014
|
+
const role = bundle.memberTree.getRole('doko-alice-abc123');
|
|
1015
|
+
console.log('Alice is a member with role:', role);
|
|
1016
|
+
}
|
|
1017
|
+
|
|
1018
|
+
// List all members
|
|
1019
|
+
const members = bundle.memberTree.getMembers();
|
|
1020
|
+
console.log('All members:', members);</code></pre>
|
|
1021
|
+
</div>
|
|
1022
|
+
</section>
|
|
1023
|
+
|
|
1024
|
+
<!-- Complete Example -->
|
|
1025
|
+
<section id="complete-example" class="mb-16">
|
|
1026
|
+
<h2 class="text-3xl font-bold mb-6 flex items-center gap-3">
|
|
1027
|
+
<span class="text-4xl"><svg class="doc-icon hero-icon" width="24" height="24" aria-hidden="true"><use href="#icon-target"/></svg></span> Complete Example
|
|
1028
|
+
</h2>
|
|
1029
|
+
|
|
1030
|
+
<div class="tutorial-card">
|
|
1031
|
+
<h3 class="text-xl font-bold mb-3">Full Chat Room Implementation</h3>
|
|
1032
|
+
<pre class="language-javascript"><code>import { GumbaHub, GumbaProof, GUMBA_ROLE } from 'yakmesh/mesh/gumba.js';
|
|
1033
|
+
import { loadIdentity } from 'yakmesh/mesh/identity.js';
|
|
1034
|
+
|
|
1035
|
+
async function createPrivateChatRoom() {
|
|
1036
|
+
// 1. Load identity and create hub
|
|
1037
|
+
const identity = await loadIdentity();
|
|
1038
|
+
const hub = new GumbaHub(identity, null);
|
|
1039
|
+
|
|
1040
|
+
// 2. Create the chat room
|
|
1041
|
+
hub.createBundle('private-chat', {
|
|
1042
|
+
name: 'Private Chat',
|
|
1043
|
+
});
|
|
1044
|
+
|
|
1045
|
+
const bundle = hub.getBundle('private-chat');
|
|
1046
|
+
const ownerDokoId = identity.identity.dokoId;
|
|
1047
|
+
|
|
1048
|
+
// 3. Add initial members (you'd get these from somewhere)
|
|
1049
|
+
const members = [
|
|
1050
|
+
{ dokoId: 'doko-alice-123', role: GUMBA_ROLE.ADMIN, publicKey: '...' },
|
|
1051
|
+
{ dokoId: 'doko-bob-456', role: GUMBA_ROLE.MEMBER, publicKey: '...' },
|
|
1052
|
+
];
|
|
1053
|
+
|
|
1054
|
+
members.forEach(m => {
|
|
1055
|
+
bundle.addMember(m.dokoId, m.role, ownerDokoId);
|
|
1056
|
+
hub.registerPublicKey(m.dokoId, m.publicKey);
|
|
1057
|
+
});
|
|
1058
|
+
|
|
1059
|
+
// 4. Add welcome message
|
|
1060
|
+
bundle.addMessage({ text: 'Welcome to the chat!' }, ownerDokoId);
|
|
1061
|
+
|
|
1062
|
+
// 5. Handle incoming access requests
|
|
1063
|
+
async function handleAccessRequest(visitorDokoId, signedProof, visitorNodeId) {
|
|
1064
|
+
// Verify and grant access
|
|
1065
|
+
const result = await hub.handleAccessRequest(
|
|
1066
|
+
'private-chat',
|
|
1067
|
+
signedProof,
|
|
1068
|
+
visitorNodeId
|
|
1069
|
+
);
|
|
1070
|
+
|
|
1071
|
+
if (result.granted) {
|
|
1072
|
+
// Send session token to visitor
|
|
1073
|
+
return {
|
|
1074
|
+
success: true,
|
|
1075
|
+
sessionId: result.sessionId,
|
|
1076
|
+
role: result.role,
|
|
1077
|
+
};
|
|
1078
|
+
} else {
|
|
1079
|
+
return {
|
|
1080
|
+
success: false,
|
|
1081
|
+
reason: result.reason,
|
|
1082
|
+
};
|
|
1083
|
+
}
|
|
1084
|
+
}
|
|
1085
|
+
|
|
1086
|
+
// 6. Handle message requests
|
|
1087
|
+
async function handleGetMessages(sessionId, options = {}) {
|
|
1088
|
+
return await hub.getMessages(sessionId, options);
|
|
1089
|
+
}
|
|
1090
|
+
|
|
1091
|
+
async function handlePostMessage(sessionId, content) {
|
|
1092
|
+
return await hub.postMessage(sessionId, content);
|
|
1093
|
+
}
|
|
1094
|
+
|
|
1095
|
+
return {
|
|
1096
|
+
hub,
|
|
1097
|
+
bundle,
|
|
1098
|
+
handleAccessRequest,
|
|
1099
|
+
handleGetMessages,
|
|
1100
|
+
handlePostMessage,
|
|
1101
|
+
};
|
|
1102
|
+
}
|
|
1103
|
+
|
|
1104
|
+
// Usage
|
|
1105
|
+
const chatRoom = await createPrivateChatRoom();
|
|
1106
|
+
console.log('Chat room ready!');</code></pre>
|
|
1107
|
+
</div>
|
|
1108
|
+
</section>
|
|
1109
|
+
|
|
1110
|
+
<!-- Navigation -->
|
|
1111
|
+
<div class="mt-16 pt-8 border-t border-mountain-700">
|
|
1112
|
+
<div class="flex flex-col sm:flex-row gap-4">
|
|
1113
|
+
<a href="gumba.html" class="flex-1 block bg-mountain-800 border border-mountain-700 rounded-xl p-4 hover:border-amber-500 transition group">
|
|
1114
|
+
<div class="text-xs text-mountain-400 mb-1">← Reference</div>
|
|
1115
|
+
<div class="flex items-center gap-2">
|
|
1116
|
+
<span class="text-xl"><svg class="doc-icon card-icon" width="24" height="24" aria-hidden="true"><use href="#icon-stupa"/></svg></span>
|
|
1117
|
+
<span class="font-semibold group-hover:text-amber-400">GUMBA Documentation</span>
|
|
1118
|
+
</div>
|
|
1119
|
+
<p class="text-mountain-400 text-sm mt-1">Full API reference and concepts</p>
|
|
1120
|
+
</a>
|
|
1121
|
+
<a href="tutorials.html" class="flex-1 block bg-mountain-800 border border-amber-700 rounded-xl p-4 hover:border-amber-500 transition group">
|
|
1122
|
+
<div class="text-xs text-mountain-400 mb-1">More Tutorials →</div>
|
|
1123
|
+
<div class="flex items-center gap-2">
|
|
1124
|
+
<span class="text-xl"><svg class="doc-icon card-icon" width="24" height="24" aria-hidden="true"><use href="#icon-book"/></svg></span>
|
|
1125
|
+
<span class="font-semibold group-hover:text-amber-400">All Tutorials</span>
|
|
1126
|
+
</div>
|
|
1127
|
+
<p class="text-mountain-400 text-sm mt-1">Explore other YAKMESH tutorials</p>
|
|
1128
|
+
</a>
|
|
1129
|
+
</div>
|
|
1130
|
+
</div>
|
|
1131
|
+
|
|
1132
|
+
</div>
|
|
1133
|
+
</main>
|
|
1134
|
+
|
|
1135
|
+
<footer class="docs-footer">
|
|
1136
|
+
<p>© 2026 YAKMESH™</p>
|
|
1137
|
+
</footer>
|
|
1138
|
+
|
|
1139
|
+
<script src="prism.min.js" defer></script>
|
|
1140
|
+
<script src="prism-javascript.min.js" defer></script>
|
|
1141
|
+
<script src="docs.js" defer></script>
|
|
1142
|
+
</body>
|
|
1143
|
+
</html>
|
|
1144
|
+
|