@oracle-agent/oracle 0.12.0 → 0.13.1

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 (124) hide show
  1. package/README.md +31 -4
  2. package/SETUP.md +5 -2
  3. package/artifacts/specialist-packs/oracle-full-crypto.json +3 -0
  4. package/dist/address-book.mjs +2 -2
  5. package/dist/assets/profiles/_template/SOUL.md +54 -0
  6. package/dist/assets/profiles/_template/profile.json +22 -0
  7. package/dist/assets/profiles/bitcoin-agent/SOUL.md +31 -0
  8. package/dist/assets/profiles/bitcoin-agent/profile.json +32 -0
  9. package/dist/assets/profiles/hyperliquid-agent/SOUL.md +34 -0
  10. package/dist/assets/profiles/hyperliquid-agent/profile.json +38 -0
  11. package/dist/assets/profiles/oracle/SOUL.md +134 -0
  12. package/dist/assets/profiles/oracle/profile.json +40 -0
  13. package/dist/assets/profiles/polymarket-agent/SOUL.md +35 -0
  14. package/dist/assets/profiles/polymarket-agent/profile.json +34 -0
  15. package/dist/assets/profiles/profile.schema.json +90 -0
  16. package/dist/assets/profiles/protocol-builder/SOUL.md +57 -0
  17. package/dist/assets/profiles/protocol-builder/profile.json +39 -0
  18. package/dist/assets/profiles/robinhood-agent/SOUL.md +53 -0
  19. package/dist/assets/profiles/robinhood-agent/profile.json +41 -0
  20. package/dist/assets/profiles/solana-agent/SOUL.md +37 -0
  21. package/dist/assets/profiles/solana-agent/profile.json +38 -0
  22. package/dist/assets/profiles/stable-agent/SOUL.md +43 -0
  23. package/dist/assets/profiles/stable-agent/profile.json +38 -0
  24. package/dist/assets/skills/balance/SKILL.md +176 -0
  25. package/dist/assets/skills/bitcoin-l1.md +33 -0
  26. package/dist/assets/skills/chain-defi-ecosystem-profiling.md +27 -0
  27. package/dist/assets/skills/evm-contract-research.md +27 -0
  28. package/dist/assets/skills/hyperliquid.md +26 -0
  29. package/dist/assets/skills/multichain-exec-desk.md +33 -0
  30. package/dist/assets/skills/oracle-action-semantics/SKILL.md +40 -0
  31. package/dist/assets/skills/oracle-best-execution/SKILL.md +127 -0
  32. package/dist/assets/skills/oracle-best-execution.md +27 -0
  33. package/dist/assets/skills/oracle-bitcoin/SKILL.md +53 -0
  34. package/dist/assets/skills/oracle-chain-graphs-telegram-cards/SKILL.md +59 -0
  35. package/dist/assets/skills/oracle-chat/SKILL.md +61 -0
  36. package/dist/assets/skills/oracle-chat/chain.SKILL.md +31 -0
  37. package/dist/assets/skills/oracle-chat/setup.SKILL.md +37 -0
  38. package/dist/assets/skills/oracle-circuit-breaker/SKILL.md +51 -0
  39. package/dist/assets/skills/oracle-contract-research/SKILL.md +55 -0
  40. package/dist/assets/skills/oracle-desk/SKILL.md +58 -0
  41. package/dist/assets/skills/oracle-desk.md +27 -0
  42. package/dist/assets/skills/oracle-dex-launch/SKILL.md +38 -0
  43. package/dist/assets/skills/oracle-equities/SKILL.md +62 -0
  44. package/dist/assets/skills/oracle-grants/SKILL.md +69 -0
  45. package/dist/assets/skills/oracle-hypercore-staking/SKILL.md +57 -0
  46. package/dist/assets/skills/oracle-hyperliquid/SKILL.md +56 -0
  47. package/dist/assets/skills/oracle-meme-token-sniper/SKILL.md +73 -0
  48. package/dist/assets/skills/oracle-multichain-nft-launch/SKILL.md +338 -0
  49. package/dist/assets/skills/oracle-multichain-token-launch/SKILL.md +300 -0
  50. package/dist/assets/skills/oracle-nft-gacha-launch/SKILL.md +48 -0
  51. package/dist/assets/skills/oracle-nft-mint-gas-war/SKILL.md +63 -0
  52. package/dist/assets/skills/oracle-polymarket/SKILL.md +60 -0
  53. package/dist/assets/skills/oracle-protocol-builder/SKILL.md +59 -0
  54. package/dist/assets/skills/oracle-protocol-security/SKILL.md +60 -0
  55. package/dist/assets/skills/oracle-public-product/SKILL.md +44 -0
  56. package/dist/assets/skills/oracle-receipts/SKILL.md +52 -0
  57. package/dist/assets/skills/oracle-receipts.md +29 -0
  58. package/dist/assets/skills/oracle-rfq-tokenized-assets/SKILL.md +69 -0
  59. package/dist/assets/skills/oracle-smart-wallet-scanner/SKILL.md +49 -0
  60. package/dist/assets/skills/oracle-solana/SKILL.md +65 -0
  61. package/dist/assets/skills/oracle-solana-nft/SKILL.md +54 -0
  62. package/dist/assets/skills/oracle-token-research/SKILL.md +67 -0
  63. package/dist/assets/skills/solana.md +22 -0
  64. package/dist/bin/desk-server.mjs +56 -11
  65. package/dist/bin/oracle-data-mcp.mjs +6 -6
  66. package/dist/bin/oracle-equities.mjs +20 -0
  67. package/dist/bin/oracle-init.mjs +19 -19
  68. package/dist/bin/oracle-public-server.mjs +4 -4
  69. package/dist/bin/oracle-route.mjs +13 -13
  70. package/dist/bin/oracle-scan.mjs +10 -10
  71. package/dist/bin/oracle.mjs +35 -27
  72. package/dist/cli/commands/auth.mjs +11 -11
  73. package/dist/cli/commands/bootstrap.mjs +6 -6
  74. package/dist/cli/commands/chain.mjs +12 -12
  75. package/dist/cli/commands/chat.mjs +39 -29
  76. package/dist/cli/commands/data-mcp.mjs +2 -2
  77. package/dist/cli/commands/data.mjs +5 -5
  78. package/dist/cli/commands/doctor.mjs +3 -3
  79. package/dist/cli/commands/equities.mjs +15 -0
  80. package/dist/cli/commands/farm.mjs +59 -0
  81. package/dist/cli/commands/follow.mjs +28 -0
  82. package/dist/cli/commands/gate.mjs +4 -4
  83. package/dist/cli/commands/harness.mjs +15 -0
  84. package/dist/cli/commands/init.mjs +3 -3
  85. package/dist/cli/commands/mcp.mjs +50 -23
  86. package/dist/cli/commands/model.mjs +44 -34
  87. package/dist/cli/commands/plugins.mjs +38 -0
  88. package/dist/cli/commands/prepare.mjs +2 -2
  89. package/dist/cli/commands/public.mjs +3 -3
  90. package/dist/cli/commands/resolve.mjs +23 -0
  91. package/dist/cli/commands/route.mjs +2 -2
  92. package/dist/cli/commands/scan.mjs +2 -2
  93. package/dist/cli/commands/setup.mjs +12 -12
  94. package/dist/cli/commands/sign.mjs +19 -2
  95. package/dist/cli/commands/swap.mjs +36 -0
  96. package/dist/cli/commands/upgrade.mjs +2 -2
  97. package/dist/cli/commands/version.mjs +2 -2
  98. package/dist/data/desk-data.mjs +53 -10
  99. package/dist/data/names.mjs +2 -0
  100. package/dist/data/providers/farming.mjs +2 -0
  101. package/dist/equities/index.mjs +1 -0
  102. package/dist/index.mjs +58 -15
  103. package/dist/public-api/agent-grants.mjs +3 -0
  104. package/dist/router/index.mjs +2 -2
  105. package/dist/scanner/index.mjs +3 -3
  106. package/package.json +8 -3
  107. package/public/oracle-splash/_variants/ice.html +2073 -0
  108. package/public/oracle-splash/_variants/ivory.html +2075 -0
  109. package/public/oracle-splash/assets/agents/claude.png +0 -0
  110. package/public/oracle-splash/assets/agents/codex.png +0 -0
  111. package/public/oracle-splash/assets/desktop-app.jpg +0 -0
  112. package/public/oracle-splash/assets/hero/cli-session-poster.jpg +0 -0
  113. package/public/oracle-splash/assets/hero/cli-session.mp4 +0 -0
  114. package/public/oracle-splash/assets/hero/cli-session.webm +0 -0
  115. package/public/oracle-splash/assets/hero/orb-poster.jpg +0 -0
  116. package/public/oracle-splash/assets/hero/orb.webm +0 -0
  117. package/public/oracle-splash/assets/hero/risk-session-poster.jpg +0 -0
  118. package/public/oracle-splash/assets/hero/risk-session.mp4 +0 -0
  119. package/public/oracle-splash/assets/hero/risk-session.webm +0 -0
  120. package/public/oracle-splash/assets/hero/route-session-poster.jpg +0 -0
  121. package/public/oracle-splash/assets/hero/route-session.mp4 +0 -0
  122. package/public/oracle-splash/assets/hero/route-session.webm +0 -0
  123. package/public/oracle-splash/downloads/index.html +241 -0
  124. package/public/oracle-splash/index.html +1211 -242
@@ -11,7 +11,7 @@
11
11
  <meta name="robots" content="noindex,nofollow" />
12
12
  <link rel="preconnect" href="https://fonts.googleapis.com" />
13
13
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
14
- <link href="https://fonts.googleapis.com/css2?family=Archivo+Black&family=Cormorant+Garamond:ital,wght@0,300;0,400;0,500;1,300;1,400;1,500&family=DM+Sans:wght@500;700&family=IBM+Plex+Mono:wght@400;500&family=Inter:wght@500;650;750;850&family=UnifrakturCook:wght@700&family=Manrope:wght@600;800&family=Outfit:wght@300;400;500;700&family=Sora:wght@500;700&family=Space+Grotesk:wght@500;700&display=swap" rel="stylesheet" />
14
+ <link href="https://fonts.googleapis.com/css2?family=Cormorant+Garamond:ital,wght@0,300;0,400;0,500;1,300;1,400;1,500&family=IBM+Plex+Mono:wght@400;500;600&family=Outfit:wght@300;400;500;600;700&family=UnifrakturCook:wght@700&display=swap" rel="stylesheet" />
15
15
  <style>
16
16
  :root{
17
17
  --bg:#0B1018;
@@ -36,21 +36,45 @@
36
36
  --mono:"IBM Plex Mono",ui-monospace,monospace;
37
37
  --ease:cubic-bezier(.16,1,.3,1);
38
38
  --pad:clamp(18px,4vw,48px);
39
+
40
+ --fs-micro:10px;
41
+ --fs-xs:12px;
42
+ --fs-sm:13.5px;
43
+ --fs-base:15px;
44
+ --fs-md:clamp(18px,1.6vw,20px);
45
+ --fs-lg:clamp(22px,2.2vw,26px);
46
+ --fs-xl:clamp(28px,3.2vw,34px);
47
+ --fs-2xl:clamp(34px,4.4vw,50px);
48
+ --fs-3xl:clamp(46px,6.5vw,84px);
49
+ --fs-4xl:clamp(64px,10vw,150px);
50
+ --r-sm:12px;
51
+ --r-md:16px;
52
+ --r-lg:22px;
53
+ --r-pill:999px;
54
+ --space-1:4px;
55
+ --space-2:8px;
56
+ --space-3:12px;
57
+ --space-4:16px;
58
+ --space-5:24px;
59
+ --space-6:32px;
60
+ --space-7:48px;
61
+ --space-8:72px;
62
+ --space-9:110px;
39
63
  --max:1100px;
40
64
  }
41
65
  *{box-sizing:border-box;margin:0;padding:0}
42
- html{scroll-behavior:smooth;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-rendering:optimizeLegibility}
66
+ html{scroll-behavior:smooth;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-rendering:optimizeLegibility;overflow-x:clip;max-width:100%}
43
67
  body{
44
68
  min-height:100dvh;background:var(--bg);color:var(--ink);position:relative;isolation:isolate;
45
- font-family:var(--sans);font-weight:400;overflow-x:hidden;
69
+ font-family:var(--sans);font-weight:400;overflow-x:clip;max-width:100vw;
46
70
  }
47
- ::selection{background:var(--blue);color:#061018}
71
+ ::selection{background:var(--blue);color:#071018}
48
72
  a{color:inherit;text-decoration:none}
49
73
  button{font:inherit;color:inherit;background:none;border:0;cursor:pointer}
50
74
  img{display:inline-block}
51
75
 
52
76
  .grain{
53
- position:fixed;inset:-40%;z-index:40;pointer-events:none;opacity:.04;mix-blend-mode:soft-light;
77
+ position:fixed;inset:0;z-index:40;pointer-events:none;opacity:.04;mix-blend-mode:soft-light;
54
78
  background-image:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='220' height='220'><filter id='n'><feTurbulence type='fractalNoise' baseFrequency='.85' numOctaves='2' stitchTiles='stitch'/><feColorMatrix values='0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 .55 0'/></filter><rect width='100%25' height='100%25' filter='url(%23n)'/></svg>");
55
79
  }
56
80
 
@@ -77,10 +101,7 @@ img{display:inline-block}
77
101
  }
78
102
  .loader.out{opacity:0;visibility:hidden;pointer-events:none}
79
103
  .loader-inner{display:flex;flex-direction:column;align-items:center;gap:18px}
80
- .loader-mark{width:64px;height:64px;filter:drop-shadow(0 0 18px rgba(124,196,255,.4))}
81
- .loader-word{font-family:var(--display);font-size:18px;letter-spacing:.08em;text-transform:none;color:var(--cool);font-style:italic}
82
- .loader-bar{width:120px;height:1px;background:rgba(124,196,255,.15);overflow:hidden}
83
- .loader-bar span{display:block;height:100%;width:0;background:var(--blue);transition:width 1.1s var(--ease)}
104
+ .loader-mark{width:clamp(150px,26vmin,240px);height:clamp(150px,26vmin,240px);filter:drop-shadow(0 0 34px rgba(124,196,255,.42))}
84
105
 
85
106
  .progress{
86
107
  position:fixed;top:0;left:0;right:0;height:2px;z-index:35;pointer-events:none;
@@ -100,18 +121,18 @@ img{display:inline-block}
100
121
  }
101
122
  .brand{
102
123
  display:flex;align-items:center;gap:12px;
103
- font-family:var(--display);font-size:24px;font-weight:400;letter-spacing:.02em;
124
+ font-family:var(--display);font-size:var(--fs-lg);font-weight:400;letter-spacing:.02em;
104
125
  text-transform:none;justify-self:start;
105
126
  }
106
127
  .brand .orbital{width:26px;height:26px;filter:drop-shadow(0 0 10px rgba(124,196,255,.6))}
107
128
  .nav-links{
108
129
  display:flex;align-items:center;gap:18px;justify-self:end;
109
- font-family:var(--mono);font-size:10px;letter-spacing:.18em;text-transform:uppercase;color:var(--cool);
130
+ font-family:var(--mono);font-size:var(--fs-micro);letter-spacing:.18em;text-transform:uppercase;color:var(--cool);
110
131
  }
111
132
  .nav-links a{opacity:.78;transition:opacity .25s,color .25s}
112
133
  .nav-links a:hover{opacity:1;color:var(--blue2)}
113
134
  .nav-chip{
114
- font-family:var(--mono);font-size:9px;letter-spacing:.16em;text-transform:uppercase;
135
+ font-family:var(--mono);font-size:var(--fs-micro);letter-spacing:.16em;text-transform:uppercase;
115
136
  border:1px solid rgba(124,196,255,.3);border-radius:999px;padding:7px 11px;color:var(--blue2);opacity:.95;
116
137
  }
117
138
  .nav-cta{
@@ -133,27 +154,26 @@ main{position:relative;z-index:2;padding-top:84px}
133
154
 
134
155
  /* homepage */
135
156
  .home{
157
+ overflow-x:clip;
136
158
  min-height:calc(100dvh - 84px);
159
+ padding-block:clamp(28px,6vh,72px);
137
160
  display:grid;place-items:center;
138
161
  padding:clamp(20px,4vh,44px) var(--pad) clamp(56px,9vh,96px);
139
- position:relative;overflow:hidden;text-align:center;
162
+ position:relative;overflow:hidden;text-align:left;
140
163
  }
141
164
  .home::after{
142
165
  content:"";position:absolute;left:50%;bottom:22px;width:1px;height:74px;
143
166
  background:linear-gradient(180deg, rgba(124,196,255,.65), transparent);
144
167
  transform-origin:50% 0;animation:drop-line 2.8s var(--ease) infinite;
145
168
  }
146
- .home-inner{max-width:min(920px,100%);width:100%;margin:0 auto;position:relative}
169
+ .home-inner{max-width:min(1180px,100%);width:100%;margin:0 auto;position:relative}
147
170
  .hero-primary{min-width:0;display:flex;flex-direction:column;align-items:center}
148
171
  .home-kicker{
149
- font-family:var(--mono);font-size:10px;letter-spacing:.34em;text-transform:uppercase;color:var(--blue);
172
+ font-family:var(--mono);font-size:var(--fs-micro);letter-spacing:.34em;text-transform:uppercase;color:var(--blue);
150
173
  margin-bottom:6px;position:relative;z-index:3;
151
174
  }
152
175
  .hero-stage{position:relative;width:100%;display:grid;place-items:center;min-height:clamp(360px,52vh,560px)}
153
- .hero-art{position:absolute;inset:0;display:grid;place-items:center;z-index:0;pointer-events:none}
154
- #orb-vid{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);width:min(74vw,620px);aspect-ratio:1;object-fit:contain;opacity:0;transition:opacity 1.4s var(--ease);mix-blend-mode:screen}
155
- #orb-vid.ready{opacity:.62}
156
- .blender-orb .hero-orb{display:none}
176
+ .hero-art{position:absolute;inset:0;display:grid;place-items:center;z-index:0;pointer-events:none;overflow:clip}
157
177
  .hero-orb{
158
178
  width:clamp(380px,50vw,640px);aspect-ratio:1;position:relative;transform-style:preserve-3d;
159
179
  animation:orb-slew 22s linear infinite;
@@ -193,58 +213,67 @@ main{position:relative;z-index:2;padding-top:84px}
193
213
  .hero-orb .orbit-dot{position:absolute;width:9px;height:9px;border-radius:50%;background:radial-gradient(circle at 38% 34%, #fff, var(--blue2) 55%, rgba(124,196,255,.5));box-shadow:0 0 22px rgba(167,216,255,.95), 0 0 44px rgba(124,196,255,.4);left:calc(50% - 4.5px);top:calc(50% - 4.5px);transform-style:preserve-3d;animation:orbit-travel 14s linear infinite}
194
214
  .home-title{
195
215
  position:relative;z-index:2;
196
- font-family:var(--display);font-weight:300;font-size:clamp(72px,10vw,150px);line-height:.9;letter-spacing:-.045em;
216
+ font-family:var(--display);font-weight:300;font-size:var(--fs-4xl);line-height:.9;letter-spacing:-.045em;
197
217
  text-transform:uppercase;color:var(--ink);
198
218
  text-shadow:0 2px 30px rgba(0,0,0,.6);
199
219
  }
200
220
  .home-title em{font-style:italic;color:var(--blue2)}
201
- .hero-lockup{position:relative;z-index:2;display:flex;flex-direction:column;align-items:center}
202
- .hero-byline{margin-top:12px;font-family:var(--mono);font-size:10px;font-weight:500;letter-spacing:.28em;text-transform:uppercase;color:var(--blue2);position:relative;z-index:3}
203
- .hero-byline:hover{color:var(--ink)}
204
221
  .home-copy{position:relative;z-index:3;display:flex;flex-direction:column;align-items:center}
205
- .home-copy p:not(.home-kicker){max-width:56ch;color:#aac0d6;font-size:16px;line-height:1.7;margin:18px 0 0;text-shadow:0 1px 20px rgba(0,0,0,.65)}
222
+ .home-copy p:not(.home-kicker){max-width:56ch;color:var(--mute);font-size:var(--fs-base);line-height:1.7;margin:18px 0 0;text-shadow:0 1px 20px rgba(0,0,0,.65)}
206
223
  .home-actions{display:flex;flex-wrap:wrap;gap:14px;margin-top:26px;align-items:center;justify-content:center}
207
224
  .enter-cta{
208
225
  display:inline-flex;align-items:center;gap:12px;border:1px solid rgba(124,196,255,.45);border-radius:999px;
209
- padding:14px 22px;color:var(--ink);font-family:var(--mono);font-size:10px;letter-spacing:.18em;text-transform:uppercase;
226
+ padding:14px 22px;color:var(--ink);font-family:var(--mono);font-size:var(--fs-micro);letter-spacing:.18em;text-transform:uppercase;
210
227
  background:linear-gradient(180deg, rgba(124,196,255,.12), rgba(124,196,255,.035));
211
228
  box-shadow:0 0 0 1px rgba(124,196,255,.08),0 20px 46px rgba(0,0,0,.3);
212
229
  transition:transform .35s var(--ease),border-color .35s,box-shadow .35s;
213
230
  }
214
- .enter-cta::after{content:"↓";font-size:13px;color:var(--blue)}
231
+ .enter-cta::after{content:"↓";font-size:var(--fs-sm);color:var(--blue)}
215
232
  .enter-cta:hover{transform:translateY(-2px);border-color:var(--blue);box-shadow:0 0 0 1px rgba(124,196,255,.18),0 24px 58px rgba(0,0,0,.36)}
216
- .hero-note{font-family:var(--mono);font-size:10px;letter-spacing:.16em;text-transform:uppercase;color:var(--mute)}
233
+ .hero-note{font-family:var(--mono);font-size:var(--fs-micro);letter-spacing:.16em;text-transform:uppercase;color:var(--mute)}
217
234
  @keyframes orb-slew{0%{transform:rotateX(18deg) rotateZ(-8deg) rotateY(0deg)}100%{transform:rotateX(18deg) rotateZ(-8deg) rotateY(360deg)}}
218
235
  @keyframes home-breathe{0%,100%{opacity:.65;transform:scale(1)}50%{opacity:1;transform:scale(1.07)}}
219
236
  @keyframes drop-line{0%,100%{opacity:.25;transform:translateX(-50%) scaleY(.45)}50%{opacity:1;transform:translateX(-50%) scaleY(1)}}
220
237
 
221
238
 
239
+ code{font-family:var(--mono)}
240
+
241
+ .hero-note-line{white-space:nowrap;overflow:visible}
242
+ .hero-note-line code{white-space:nowrap}
243
+ @media (max-width:1180px){
244
+ .hero-note-line{white-space:normal}
245
+ .hero-note-line code{display:inline-block}
246
+ }
247
+ /* figcaption was stranded at the far left of a 742px figure while the orb sits
248
+ right of centre -- it read as a loose fragment, not a caption. Centre it under
249
+ the mark it belongs to. */
250
+ .hero-product figcaption{text-align:center;width:100%}
222
251
  .section{
223
252
  position:relative;z-index:2;max-width:var(--max);margin:0 auto;
224
- padding:clamp(56px,10vh,110px) var(--pad) 0;
253
+ padding:clamp(56px,10vh,110px) var(--pad) var(--space-8);
225
254
  }
226
255
  .section:first-of-type{padding-top:clamp(18px,3vh,28px)}
227
256
  .section-label{
228
- font-family:var(--mono);font-size:10px;letter-spacing:.34em;text-transform:uppercase;color:var(--blue);margin-bottom:14px;
257
+ font-family:var(--mono);font-size:var(--fs-micro);letter-spacing:.34em;text-transform:uppercase;color:var(--blue);margin-bottom:14px;
229
258
  display:inline-flex;align-items:center;gap:12px;
230
259
  }
231
260
  .section-title{
232
261
  font-family:var(--display);font-weight:400;
233
- font-size:clamp(34px,5vw,54px);line-height:1.06;letter-spacing:-.01em;
262
+ font-size:var(--fs-2xl);line-height:1.06;letter-spacing:-.01em;
234
263
  max-width:18ch;margin-bottom:12px;
235
264
  }
236
265
  .section-title em{font-style:italic;color:var(--blue2)}
237
- .section-lede{max-width:52ch;color:#C9DAEC;font-size:16px;line-height:1.7;margin-bottom:clamp(28px,4vw,44px)}
266
+ .section-lede{max-width:52ch;color:var(--cool);font-size:var(--fs-base);line-height:1.7;margin-bottom:clamp(28px,4vw,44px)}
238
267
 
239
268
  /* orchestration graph */
240
269
  .graph-shell{
241
- border:1px solid var(--line);border-radius:20px;overflow:hidden;
270
+ border:1px solid var(--line);border-radius:var(--r-lg);overflow:hidden;
242
271
  background:linear-gradient(180deg, rgba(124,196,255,.04), transparent 42%), var(--panel);
243
272
  }
244
273
  .graph-top{
245
274
  display:flex;flex-wrap:wrap;justify-content:center;gap:10px;
246
275
  padding:14px 18px;border-bottom:1px solid var(--line);
247
- font-family:var(--mono);font-size:10.5px;letter-spacing:.16em;text-transform:uppercase;color:#9FB8D2;
276
+ font-family:var(--mono);font-size:var(--fs-micro);letter-spacing:.16em;text-transform:uppercase;color:var(--mute);
248
277
  }
249
278
  .graph-top b{color:var(--blue);font-weight:500}
250
279
  .graph-canvas{padding:clamp(28px,4vw,40px) clamp(14px,2.5vw,24px) clamp(22px,3vw,30px);overflow:auto}
@@ -269,7 +298,7 @@ main{position:relative;z-index:2;padding-top:84px}
269
298
  .route-strip{grid-template-columns:repeat(3,minmax(0,1fr))}
270
299
  }
271
300
  .node{
272
- border:1px solid rgba(124,196,255,.42);border-radius:14px;background:rgba(21,32,49,.92);
301
+ border:1px solid rgba(124,196,255,.42);border-radius:var(--r-md);background:rgba(21,32,49,.92);
273
302
  padding:14px 12px;text-align:center;
274
303
  transition:border-color .4s var(--ease),transform .4s var(--ease),box-shadow .4s var(--ease);
275
304
  }
@@ -283,18 +312,19 @@ main{position:relative;z-index:2;padding-top:84px}
283
312
  display:flex;flex-direction:column;align-items:center;
284
313
  }
285
314
  .node.hub .orbital{width:74px;height:74px;margin:2px 0 10px;filter:drop-shadow(0 0 20px rgba(124,196,255,.35))}
286
- .node .tag{font-family:var(--mono);font-size:10px;letter-spacing:.18em;text-transform:uppercase;color:#9FB8D2;margin-bottom:8px}
315
+ .node .tag{font-family:var(--mono);font-size:var(--fs-micro);letter-spacing:.18em;text-transform:uppercase;color:var(--mute);margin-bottom:8px}
287
316
  .node.hub .tag{color:var(--blue)}
288
- .node .name{font-family:var(--display);font-size:22px;font-weight:500;color:#DCEAF6;line-height:1;letter-spacing:.01em;margin-bottom:6px}
289
- .node.hub .name{font-size:34px;font-weight:400;font-style:italic}
290
- .node .sub{font-family:var(--mono);font-size:11px;letter-spacing:.05em;color:#C9DAEC;line-height:1.5}
317
+ .node .name{font-family:var(--display);font-size:var(--fs-lg);font-weight:500;color:var(--ink);line-height:1;letter-spacing:.01em;margin-bottom:6px}
318
+ .node.hub .name{font-size:var(--fs-xl);font-weight:400;font-style:italic}
319
+ .node .sub{font-family:var(--mono);font-size:var(--fs-xs);letter-spacing:.05em;color:var(--cool);line-height:1.5}
291
320
  .node.route{min-height:138px;display:flex;flex-direction:column;justify-content:flex-start;text-align:left;padding:14px}
292
- .node.route .name{font-size:18px;margin-bottom:8px}
321
+ .node.route .name{font-size:var(--fs-md);margin-bottom:8px}
293
322
  .node.route .chains{
294
323
  margin-top:auto;padding-top:10px;
295
- font-family:var(--mono);font-size:10px;letter-spacing:.04em;line-height:1.7;
324
+ font-family:var(--mono);font-size:var(--fs-micro);letter-spacing:.04em;line-height:1.7;
296
325
  display:flex;flex-wrap:wrap;gap:4px 10px;align-items:center;
297
326
  }
327
+ .ch-add{border:1px dashed color-mix(in oklab,var(--blue) 42%,transparent);border-radius:999px;padding:1px 7px;color:var(--blue);opacity:.92}
298
328
  .ch{display:inline-flex;align-items:center;gap:5px;white-space:nowrap}
299
329
  .ch img{width:13px;height:13px;border-radius:50%;object-fit:cover;background:rgba(255,255,255,.06)}
300
330
  .node.add{
@@ -303,13 +333,13 @@ main{position:relative;z-index:2;padding-top:84px}
303
333
  min-height:138px;display:flex;flex-direction:column;justify-content:center;align-items:flex-start;
304
334
  text-align:left;padding:14px;
305
335
  }
306
- .node.add .name{font-size:18px;color:var(--blue2)}
336
+ .node.add .name{font-size:var(--fs-md);color:var(--blue2)}
307
337
  .node.add .sub{color:var(--mute)}
308
338
  .node.add:hover{border-color:rgba(124,196,255,.55);background:rgba(124,196,255,.06)}
309
339
 
310
340
  .builder-row{margin-top:0;display:flex;justify-content:center}
311
341
  .node.builder-sink{width:min(430px,100%);text-align:center;align-items:center;min-height:162px;position:relative}
312
- .node.builder-sink .name{font-size:26px}
342
+ .node.builder-sink .name{font-size:var(--fs-lg)}
313
343
  .node.builder-sink .chains{justify-content:center}
314
344
  .wires.funnel{height:62px}
315
345
  .wires.funnel path{stroke:rgba(255,176,137,.48)}
@@ -320,33 +350,33 @@ main{position:relative;z-index:2;padding-top:84px}
320
350
  /* protocol colors */
321
351
  .node.p-hl{border-color:rgba(80,210,193,.45);background:linear-gradient(180deg, rgba(80,210,193,.14), rgba(11,16,24,.88))}
322
352
  .node.p-hl .tag,.node.p-hl .name{color:var(--hl)}
323
- .node.p-hl .chains{color:rgba(80,210,193,.9)}
353
+ .node.p-hl .chains{color:var(--hl)}
324
354
  .node.p-hl:hover{border-color:var(--hl);box-shadow:0 12px 30px rgba(80,210,193,.12)}
325
355
 
326
356
  .node.p-rh{border-color:rgba(215,255,77,.55);background:linear-gradient(180deg, rgba(215,255,77,.14), rgba(11,16,24,.88))}
327
357
  .node.p-rh .tag,.node.p-rh .name{color:var(--rh)}
328
- .node.p-rh .chains{color:rgba(215,255,77,.92)}
358
+ .node.p-rh .chains{color:var(--rh)}
329
359
  .node.p-rh:hover{border-color:var(--rh);box-shadow:0 12px 30px rgba(215,255,77,.16)}
330
360
 
331
361
  .node.p-sol{border-color:rgba(153,69,255,.5);background:linear-gradient(180deg, rgba(153,69,255,.14), rgba(11,16,24,.88))}
332
362
  .node.p-sol .tag,.node.p-sol .name{color:#c4a0ff}
333
- .node.p-sol .chains{color:rgba(196,160,255,.9)}
363
+ .node.p-sol .chains{color:#c4a0ff}
334
364
  .node.p-sol:hover{border-color:var(--sol);box-shadow:0 12px 30px rgba(153,69,255,.14)}
335
365
 
336
366
  .node.p-poly{border-color:rgba(59,130,246,.5);background:linear-gradient(180deg, rgba(59,130,246,.14), rgba(11,16,24,.88))}
337
367
  .node.p-poly .tag,.node.p-poly .name{color:#93c5fd}
338
- .node.p-poly .chains{color:rgba(147,197,253,.9)}
368
+ .node.p-poly .chains{color:#93c5fd}
339
369
  .node.p-poly:hover{border-color:var(--poly);box-shadow:0 12px 30px rgba(59,130,246,.14)}
340
370
 
341
371
  .node.p-stable{border-color:rgba(240,185,11,.5);background:linear-gradient(180deg, rgba(240,185,11,.12), rgba(11,16,24,.88))}
342
372
  .node.p-build{border-color:rgba(255,140,90,.55);background:linear-gradient(180deg, rgba(255,140,90,.14), rgba(11,16,24,.88))}
343
373
  .node.p-build .tag,.node.p-build .name{color:#ffb089}
344
- .node.p-build .chains{color:rgba(255,176,137,.92)}
374
+ .node.p-build .chains{color:#ffb089}
345
375
  .node.p-build:hover{border-color:#ff8c5a;box-shadow:0 12px 30px rgba(255,140,90,.14)}
346
376
  .route-card.p-build .where{color:#ffb089}
347
377
  .route-card.p-build{box-shadow:inset 3px 0 0 #ff8c5a}
348
378
  .node.p-stable .tag,.node.p-stable .name{color:#fcd34d}
349
- .node.p-stable .chains{color:rgba(252,211,77,.9)}
379
+ .node.p-stable .chains{color:#fcd34d}
350
380
  .node.p-stable:hover{border-color:var(--stable);box-shadow:0 12px 30px rgba(240,185,11,.12)}
351
381
 
352
382
  .route-card.p-hl .where{color:var(--hl)}
@@ -364,22 +394,40 @@ main{position:relative;z-index:2;padding-top:84px}
364
394
 
365
395
  .node.p-btc{border-color:rgba(247,147,26,.55);background:linear-gradient(180deg, rgba(247,147,26,.14), rgba(11,16,24,.88))}
366
396
  .node.p-btc .tag,.node.p-btc .name{color:#fbbf24}
367
- .node.p-btc .chains{color:rgba(251,191,36,.92)}
397
+ .node.p-btc .chains{color:#fbbf24}
368
398
  .node.p-btc:hover{border-color:#f7931a;box-shadow:0 12px 30px rgba(247,147,26,.14)}
369
399
  .route-card.p-btc .where{color:#fbbf24}
370
400
  .route-card.p-btc{box-shadow:inset 3px 0 0 #f7931a}
371
401
 
402
+ .node.p-base{border-color:rgba(0,82,255,.5);background:linear-gradient(180deg, rgba(0,82,255,.14), rgba(11,16,24,.88))}
403
+ .node.p-base .tag,.node.p-base .name{color:#7aa2ff}
404
+ .node.p-base .chains{color:#7aa2ff}
405
+ .node.p-base:hover{border-color:#0052ff;box-shadow:0 12px 30px rgba(0,82,255,.16)}
406
+ .route-card.p-base .where{color:#7aa2ff}
407
+ .route-card.p-base{box-shadow:inset 3px 0 0 #0052ff}
372
408
  .node.p-evm{border-color:rgba(98,126,234,.5);background:linear-gradient(180deg, rgba(98,126,234,.14), rgba(11,16,24,.88))}
373
409
  .node.p-evm .tag,.node.p-evm .name{color:#a5b4fc}
374
- .node.p-evm .chains{color:rgba(165,180,252,.92)}
410
+ .node.p-evm .chains{color:#a5b4fc}
375
411
  .node.p-evm:hover{border-color:#627eea;box-shadow:0 12px 30px rgba(98,126,234,.14)}
376
412
  .route-card.p-evm .where{color:#a5b4fc}
377
413
  .route-card.p-evm{box-shadow:inset 3px 0 0 #627eea}
378
414
 
379
415
 
416
+ .selfcustody{margin-top:clamp(34px,5vw,58px);padding-top:clamp(28px,4vw,40px);border-top:1px solid var(--line)}
417
+ .selfcustody h3{font-family:var(--display);font-weight:400;font-size:var(--fs-xl);line-height:1.12;margin-top:8px;max-width:24ch}
418
+ .selfcustody-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:clamp(18px,2.6vw,30px);margin-top:clamp(22px,3vw,32px)}
419
+ .selfcustody-grid h4{font-family:var(--mono);font-size:var(--fs-micro);letter-spacing:.14em;text-transform:uppercase;color:var(--blue2);font-weight:500;margin-bottom:8px}
420
+ .selfcustody-grid p{color:var(--cool);font-size:var(--fs-base);line-height:1.65;max-width:52ch}
421
+ .selfcustody-grid > *{opacity:0;transform:translate3d(0,18px,0);transition:opacity .55s var(--ease),transform .55s var(--ease)}
422
+ .selfcustody-grid > *:nth-child(1){transition-delay:.05s}
423
+ .selfcustody-grid > *:nth-child(2){transition-delay:.15s}
424
+ .selfcustody-grid > *:nth-child(3){transition-delay:.25s}
425
+ .selfcustody-grid > *:nth-child(4){transition-delay:.35s}
426
+ .selfcustody.in .selfcustody-grid > *{opacity:1;transform:none}
427
+ @media (max-width:760px){.selfcustody-grid{grid-template-columns:1fr}}
380
428
  .moat-grid{
381
429
  display:grid;grid-template-columns:repeat(2,minmax(0,1fr));
382
- gap:1px;background:var(--line);border:1px solid var(--line);border-radius:18px;overflow:hidden;
430
+ gap:1px;background:var(--line);border:1px solid var(--line);border-radius:var(--r-md);overflow:hidden;
383
431
  margin-top:22px;
384
432
  }
385
433
  .moat-card{
@@ -388,49 +436,212 @@ main{position:relative;z-index:2;padding-top:84px}
388
436
  transition:background .35s;
389
437
  }
390
438
  .moat-card:hover{background:var(--panel-2)}
391
- .moat-card .n{font-family:var(--mono);font-size:10px;letter-spacing:.2em;text-transform:uppercase;color:var(--blue)}
392
- .moat-card h3{font-family:var(--display);font-weight:400;font-size:clamp(20px,2.2vw,26px)}
393
- .moat-card p{color:#C9DAEC;font-size:15px;line-height:1.55;max-width:44ch}
439
+ .moat-card .n{font-family:var(--mono);font-size:var(--fs-micro);letter-spacing:.2em;text-transform:uppercase;color:var(--blue)}
440
+ .moat-card h3{font-family:var(--display);font-weight:400;font-size:var(--fs-lg)}
441
+ .moat-card p{color:var(--cool);font-size:var(--fs-base);line-height:1.55;max-width:44ch}
394
442
  @media (max-width:860px){.moat-grid{grid-template-columns:1fr}}
395
443
 
396
444
  .strategy-surface{
397
- margin-top:clamp(30px,5vw,52px);border:1px solid var(--line);border-radius:20px;overflow:hidden;
445
+ margin-top:clamp(30px,5vw,52px);border:1px solid var(--line);border-radius:var(--r-lg);overflow:hidden;
398
446
  background:linear-gradient(145deg,rgba(124,196,255,.07),rgba(17,25,37,.92) 40%,rgba(11,16,24,.98));
447
+ max-width:960px;margin-left:auto;margin-right:auto;
399
448
  }
400
449
  .strategy-head{display:flex;align-items:end;justify-content:space-between;gap:20px;padding:clamp(22px,3vw,34px);border-bottom:1px solid var(--line)}
401
- .strategy-kicker{font-family:var(--mono);font-size:10px;letter-spacing:.2em;text-transform:uppercase;color:var(--blue)}
402
- .strategy-head h3{font-family:var(--display);font-weight:400;font-size:clamp(28px,4vw,42px);line-height:1.05;margin-top:8px}
403
- .strategy-head p{max-width:50ch;color:#C9DAEC;font-size:14px;line-height:1.6}
404
- .strategy-grid{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:1px;background:var(--line)}
450
+ .strategy-kicker{font-family:var(--mono);font-size:var(--fs-micro);letter-spacing:.2em;text-transform:uppercase;color:var(--blue)}
451
+ .strategy-head h3{font-family:var(--display);font-weight:400;font-size:var(--fs-xl);line-height:1.05;margin-top:8px}
452
+ .strategy-head p{max-width:50ch;color:var(--cool);font-size:var(--fs-sm);line-height:1.6}
453
+ .strategy-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(230px,1fr));gap:1px;background:var(--line)}
405
454
  .strategy-card{min-height:205px;padding:clamp(20px,2.6vw,28px);background:rgba(11,16,24,.96);display:flex;flex-direction:column;gap:11px}
406
- .strategy-card .mode{font-family:var(--mono);font-size:9px;letter-spacing:.16em;text-transform:uppercase;color:var(--blue2)}
407
- .strategy-card h4{font-family:var(--display);font-weight:400;font-size:clamp(23px,2.5vw,30px)}
408
- .strategy-card p{color:#C9DAEC;font-size:14px;line-height:1.6}
409
- .strategy-posture{padding:14px clamp(20px,3vw,34px);border-top:1px solid var(--line);font-family:var(--mono);font-size:9px;line-height:1.6;letter-spacing:.11em;text-transform:uppercase;color:var(--mute)}
455
+ .strategy-card .mode{font-family:var(--mono);font-size:var(--fs-micro);letter-spacing:.16em;text-transform:uppercase;color:var(--blue2)}
456
+ .strategy-card h4{font-family:var(--display);font-weight:400;font-size:var(--fs-lg)}
457
+ .strategy-card p{color:var(--cool);font-size:var(--fs-sm);line-height:1.6}
458
+ .strategy-posture{padding:14px clamp(20px,3vw,34px);border-top:1px solid var(--line);font-family:var(--mono);font-size:var(--fs-micro);line-height:1.6;letter-spacing:.11em;text-transform:uppercase;color:var(--mute)}
459
+ .strategy-posture b{font-weight:500;color:var(--warm);letter-spacing:.04em}
460
+ @media (max-width:900px){
461
+ .strategy-grid{grid-template-columns:repeat(2,minmax(0,1fr))}
462
+ .strategy-head{align-items:start;flex-direction:column}
463
+ .strategy-posture{padding:12px clamp(16px,2.5vw,28px)}
464
+ .route-proof{margin-top:14px}
465
+ .route-tree{width:100%;height:auto}
466
+ }
467
+
410
468
  .strategy-posture b{color:var(--blue2);font-weight:500}
411
- @media (max-width:1180px){.strategy-grid{grid-template-columns:repeat(3,minmax(0,1fr))}}
412
469
  @media (max-width:980px){.strategy-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.strategy-head{align-items:start;flex-direction:column}}
413
470
  @media (max-width:620px){.strategy-grid{grid-template-columns:1fr}.strategy-card{min-height:0}}
414
471
 
415
472
  /* actual Oracle CLI */
416
473
  .convert-grid{display:grid;grid-template-columns:1fr;gap:clamp(18px,3vw,28px);align-items:stretch;margin-top:8px}
417
474
  .convert-copy{display:flex;flex-direction:column;gap:14px;text-align:left;max-width:780px}
418
- .convert-copy h3{font-family:var(--display);font-weight:400;font-size:clamp(26px,3vw,34px);line-height:1.1}
419
- .convert-copy p{color:#C9DAEC;font-size:15px;line-height:1.65;max-width:54ch}
475
+ .convert-copy h3{font-family:var(--display);font-weight:400;font-size:var(--fs-xl);line-height:1.1}
476
+ .convert-copy p{color:var(--cool);font-size:var(--fs-base);line-height:1.65;max-width:54ch}
420
477
  .convert-pills{display:flex;flex-wrap:wrap;gap:8px;margin-top:4px}
421
- .convert-pills span{font-family:var(--mono);font-size:10px;letter-spacing:.14em;text-transform:uppercase;border:1px solid rgba(124,196,255,.28);border-radius:999px;padding:8px 12px;color:var(--blue2)}
422
- .platform-beta{display:inline-flex;align-items:center;gap:10px;width:max-content;max-width:100%;font-family:var(--mono);font-size:11px;letter-spacing:.08em;color:var(--cool)}
423
- .platform-beta b{font-size:9px;letter-spacing:.16em;text-transform:uppercase;color:#071018;background:var(--blue2);border-radius:999px;padding:5px 8px}
478
+ .convert-pills span{font-family:var(--mono);font-size:var(--fs-micro);letter-spacing:.14em;text-transform:uppercase;border:1px solid rgba(124,196,255,.28);border-radius:999px;padding:8px 12px;color:var(--blue2)}
479
+ .platform-beta{display:block;max-width:56ch;font-family:var(--sans);font-size:var(--fs-sm);line-height:1.7;letter-spacing:0;color:var(--mute)}
480
+ .platform-beta b{float:left;margin:3px 10px 0 0;font-family:var(--mono);font-size:var(--fs-micro);letter-spacing:.16em;text-transform:uppercase;color:#071018;background:var(--blue2);border-radius:var(--r-pill);padding:4px 9px}
481
+ .app-shot-title{margin-top:clamp(34px,4.5vw,56px)}
482
+ .app-shot{margin-top:clamp(20px,2.6vw,30px);display:flex;flex-direction:column;gap:10px}
483
+ .app-shot{margin-top:12px}
484
+ .app-shot + .platform-beta{margin-top:14px}
485
+ .os-dl{display:flex;gap:14px;flex-wrap:wrap;margin-top:20px}
486
+ .os-link{font-family:var(--mono);font-size:12px;letter-spacing:.12em;text-transform:uppercase;padding:10px 18px;border:1px solid var(--line);border-radius:var(--r-sm);color:var(--warm);text-decoration:none;transition:border-color .2s}
487
+ .os-link:hover{border-color:var(--blue)}
488
+ .app-shot img{width:100%;height:auto;display:block;border-radius:var(--r-md);border:1px solid rgba(124,196,255,.2);box-shadow:0 24px 60px rgba(0,0,0,.45)}
489
+ .app-shot figcaption{font-family:var(--mono);font-size:var(--fs-micro);letter-spacing:.12em;text-transform:uppercase;color:var(--mute)}
490
+
424
491
  .cli-install{margin:0 0 22px;display:flex;flex-direction:column;gap:12px;align-items:flex-start}
425
- .cli-install-cmd{padding:16px 20px;border-radius:12px;border:1px solid rgba(124,196,255,.34);background:rgba(17,25,37,.9);max-width:100%;overflow-x:auto}
426
- .cli-install-cmd code{font-family:var(--mono);font-size:15px;letter-spacing:.02em;color:var(--blue2);white-space:nowrap}
427
- .cli-install-gate{display:flex;align-items:center;flex-wrap:wrap;gap:10px;font-family:var(--mono);font-size:11px;letter-spacing:.06em;color:var(--cool);margin:0;max-width:62ch;line-height:1.7}
428
- .cli-install-gate b{font-size:9px;letter-spacing:.16em;text-transform:uppercase;color:#071018;background:var(--blue2);border-radius:999px;padding:5px 8px;white-space:nowrap}
492
+ .agent-caret{display:inline-block;width:2px;height:1.15em;margin-left:1px;vertical-align:-.2em;background:#7cc4ff;animation:agentblink 1s step-end infinite;flex:0 0 auto}
493
+ @keyframes agentblink{50%{opacity:0}}
494
+ .agent-prompt .agent-does,.agent-prompt .agent-out{opacity:0;transform:translateY(6px);transition:opacity .35s ease,transform .35s ease}
495
+ .agent-prompt .agent-does.in,.agent-prompt .agent-out.in{opacity:1;transform:none}
496
+ .agent-tool.working{position:relative}
497
+ .agent-tool.working::after{content:"";position:absolute;inset:-1px;border-radius:999px;border:1px solid rgba(124,196,255,.85);animation:agentpulse 1.1s ease-out infinite}
498
+ @keyframes agentpulse{from{opacity:.9;transform:scale(1)}to{opacity:0;transform:scale(1.35)}}
499
+ @media (prefers-reduced-motion:reduce){
500
+ .agent-caret{animation:none}
501
+ .agent-tool.working::after{animation:none}
502
+ .agent-prompt .agent-does,.agent-prompt .agent-out{opacity:1;transform:none;transition:none}
503
+ }
504
+ .agent-install{display:inline-flex;align-items:center;gap:14px;flex-wrap:wrap;margin:22px 0 0;padding:13px 18px;border:1px solid rgba(124,196,255,.3);border-radius:var(--r-sm);background:rgba(8,13,21,.7)}
505
+ .agent-install code{font-family:var(--mono);font-size:14px;color:var(--ink)}
506
+ .agent-install span{font-family:var(--mono);font-size:var(--fs-micro);letter-spacing:.1em;text-transform:uppercase;color:var(--mute)}
507
+ .agent-install b{color:var(--dim);font-weight:600}
508
+ .agent-install .btn{font-family:var(--mono);font-size:13px;color:var(--ink);text-decoration:none;padding:7px 16px;border:1px solid rgba(124,196,255,.35);border-radius:999px;transition:background .2s var(--ease),border-color .2s var(--ease)}
509
+ .agent-install .btn:hover{background:rgba(124,196,255,.12);border-color:var(--blue)}
510
+ .agent-install .btn-claude{color:#d97706;border-color:rgba(217,119,6,.35)}
511
+ .agent-install .btn-claude:hover{background:rgba(217,119,6,.1);border-color:#d97706}
512
+ .agent-install .btn-chatgpt{color:#10a37f;border-color:rgba(16,163,127,.35)}
513
+ .agent-install .btn-chatgpt:hover{background:rgba(16,163,127,.1);border-color:#10a37f}
514
+ .agent-install .btn-cursor{color:#a855f7;border-color:rgba(168,85,247,.35)}
515
+ .agent-install .btn-cursor:hover{background:rgba(168,85,247,.1);border-color:#a855f7}
516
+ .agent-install .btn-vscode{color:#0078d4;border-color:rgba(0,120,212,.35)}
517
+ .agent-install .btn-vscode:hover{background:rgba(0,120,212,.1);border-color:#0078d4}
518
+ .agent-install .btn-copilot{color:#2ea44f;border-color:rgba(46,164,79,.35)}
519
+ .agent-install .btn-copilot:hover{background:rgba(46,164,79,.1);border-color:#2ea44f}
520
+ .harness-marquee{margin:24px 0 0}
521
+ .harness-marquee .track{gap:18px;padding:14px 0}
522
+ .harness-marquee .btn{font-family:var(--mono);font-size:13px;color:var(--ink);text-decoration:none;padding:8px 18px;border:1px solid rgba(124,196,255,.35);border-radius:999px;transition:background .2s var(--ease),border-color .2s var(--ease);white-space:nowrap}
523
+ .harness-marquee .btn:hover{background:rgba(124,196,255,.12);border-color:var(--blue)}
524
+ .harness-marquee .btn-claude{color:#d97706;border-color:rgba(217,119,6,.35)}
525
+ .harness-marquee .btn-claude:hover{background:rgba(217,119,6,.1);border-color:#d97706}
526
+ .harness-marquee .btn-chatgpt{color:#10a37f;border-color:rgba(16,163,127,.35)}
527
+ .harness-marquee .btn-chatgpt:hover{background:rgba(16,163,127,.1);border-color:#10a37f}
528
+ .harness-marquee .btn-cursor{color:#a855f7;border-color:rgba(168,85,247,.35)}
529
+ .harness-marquee .btn-cursor:hover{background:rgba(168,85,247,.1);border-color:#a855f7}
530
+ .harness-marquee .btn-vscode{color:#0078d4;border-color:rgba(0,120,212,.35)}
531
+ .harness-marquee .btn-vscode:hover{background:rgba(0,120,212,.1);border-color:#0078d4}
532
+ .harness-marquee .btn-copilot{color:#2ea44f;border-color:rgba(46,164,79,.35)}
533
+ .harness-marquee .btn-copilot:hover{background:rgba(46,164,79,.1);border-color:#2ea44f}
534
+ .harness-marquee code{font-family:var(--mono);font-size:13px;color:var(--cool);white-space:nowrap}
535
+ .agent-prompts{display:grid;grid-template-columns:repeat(auto-fit,minmax(380px,1fr));gap:22px;margin:32px 0 0}
536
+ .agent-prompt{padding:0;text-align:left}
537
+ .agent-chips{display:flex;align-items:center;gap:8px;margin:0 0 12px}
538
+ .agent-chip{font-family:var(--mono);font-size:11.5px;letter-spacing:.04em;color:var(--dim);border:1px solid var(--line);border-radius:8px;padding:5px 11px;background:rgba(255,255,255,.02)}
539
+ /* Real app composers. Text is positioned in % of the shot so it tracks the
540
+ image at every width -- derived from measured pixel geometry:
541
+ claude.png 1610x264 text band y136-160, left inset x54
542
+ codex.png 1490x204 text band y42-64, left inset x84 */
543
+ .agent-shot{margin:0}
544
+ /* Claude and Codex composers rebuilt 1:1 in DOM from DEMI's screenshots.
545
+ Real elements, so they stay crisp at any width -- a 1474px PNG could only
546
+ ever be downscaled. Colours and geometry sampled from the source images:
547
+ Claude field #292929 on #161716, radius ~37px, coral #d87656 accent;
548
+ Codex field #2c2c2a on #20201f, radius ~9px, amber "Auto". */
549
+ .agent-panel{margin:0;padding:20px;border-radius:14px}
550
+ .is-claude{background:#161716}
551
+ .is-codex{background:#20201f}
552
+ .agent-panel .ai{width:19px;height:19px;flex:0 0 auto;fill:none;stroke:currentColor;stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round}
553
+ .agent-spacer{flex:1}
554
+ .agent-line{display:flex;align-items:center;min-height:26px;font-family:var(--sans);font-size:19px;line-height:1.4;color:#ececec;overflow-wrap:anywhere}
555
+ .agent-typed:empty::before{content:attr(data-ph);color:#8b8b8b}
556
+ .agent-caret{display:inline-block;width:2px;height:1.15em;margin-left:2px;background:#c9c9c9;animation:agentblink 1.05s step-end infinite;flex:0 0 auto}
557
+ .agent-bar{display:flex;align-items:center;gap:13px}
558
+ @keyframes agentblink{50%{opacity:0}}
559
+
560
+ /* Claude: one rounded field, controls on the bottom row inside it. */
561
+ .is-claude .agent-box{background:#292929;border-radius:26px;padding:18px 20px 14px}
562
+ .is-claude .agent-line{margin:0 0 22px}
563
+ .is-claude .agent-bar{color:#9a9a9a}
564
+ .ca-access{display:inline-flex;align-items:center;gap:7px;color:#e0763f;font-size:15px}
565
+ .ca-model{display:inline-flex;align-items:center;gap:9px;font-size:15px}
566
+ .ca-model b{color:#ededed;font-weight:600}
567
+ .ca-model span{color:#8f8f8f}
568
+ .ca-orb{display:inline-flex;align-items:center;justify-content:center;width:34px;height:34px;border-radius:50%;background:#fff;color:#1a1a1a;transition:transform .2s ease}
569
+ .ca-orb svg{width:18px;height:18px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round}
570
+ .agent-panel.sent .ca-orb{transform:scale(1.12)}
571
+
572
+ /* Codex: chips above, bordered field, controls below it. */
573
+ .cx-chips{display:flex;align-items:center;gap:9px;margin:0 0 12px}
574
+ .cx-chip{display:inline-flex;align-items:center;gap:7px;padding:7px 12px;border-radius:9px;background:#2f2f2e;color:#d6d6d4;font-size:14px}
575
+ .cx-chip .ai{width:16px;height:16px;opacity:.75}
576
+ .cx-sq{padding:7px 9px}
577
+ .is-codex .agent-box{display:flex;align-items:center;gap:12px;background:#2c2c2a;border:1px solid #4a4a48;border-radius:12px;padding:15px 16px;transition:border-color .3s ease}
578
+ .is-codex .agent-box.focus{border-color:#6f6f6c}
579
+ .is-codex .agent-line{flex:1;min-width:0}
580
+ .cx-return{color:#8b8b89}
581
+ .is-codex .agent-bar{margin:13px 0 0;color:#8b8b89;gap:12px}
582
+ .cx-auto{color:#e3b341;font-size:14px}
583
+ .cx-model,.cx-eff{color:#c8c8c6;font-size:14px}
584
+ .cx-ring{width:15px;height:15px;border-radius:50%;border:1.7px solid #6f6f6c;border-right-color:transparent;flex:0 0 auto}
585
+
586
+ @media (max-width:640px){
587
+ .agent-line{font-size:16px}
588
+ .is-claude .agent-box{padding:14px 15px 11px;border-radius:20px}
589
+ .agent-bar{gap:9px}
590
+ .ca-model span,.cx-eff{display:none}
591
+ }
592
+ .agent-prompt .agent-does,.agent-prompt .agent-out{opacity:0;transform:translateY(6px);transition:opacity .35s ease,transform .35s ease}
593
+ .agent-prompt .agent-does.in,.agent-prompt .agent-out.in{opacity:1;transform:none}
594
+ .agent-tool.working{position:relative}
595
+ .agent-tool.working::after{content:"";position:absolute;inset:-1px;border-radius:999px;border:1px solid rgba(124,196,255,.85);animation:agentpulse 1.1s ease-out infinite}
596
+ @keyframes agentpulse{from{opacity:.9;transform:scale(1)}to{opacity:0;transform:scale(1.35)}}
597
+ @media (prefers-reduced-motion:reduce){
598
+ .agent-caret{animation:none}
599
+ .agent-tool.working::after{animation:none}
600
+ .agent-prompt .agent-does,.agent-prompt .agent-out{opacity:1;transform:none;transition:none}
601
+ }
602
+ .agent-install{display:inline-flex;align-items:center;gap:14px;flex-wrap:wrap;margin:22px 0 0;padding:13px 18px;border:1px solid rgba(124,196,255,.3);border-radius:var(--r-sm);background:rgba(8,13,21,.7)}
603
+ .agent-install code{font-family:var(--mono);font-size:14px;color:var(--ink)}
604
+ .agent-install span{font-family:var(--mono);font-size:var(--fs-micro);letter-spacing:.1em;text-transform:uppercase;color:var(--mute)}
605
+ .agent-install b{color:var(--dim);font-weight:600}
606
+ .agent-prompts{display:grid;grid-template-columns:1fr;gap:34px;margin:32px 0 0}
607
+ .agent-prompt{padding:0;text-align:left}
608
+ .agent-chips{display:flex;align-items:center;gap:8px;margin:0 0 12px}
609
+ .agent-chip{font-family:var(--mono);font-size:11.5px;letter-spacing:.04em;color:var(--dim);border:1px solid var(--line);border-radius:8px;padding:5px 11px;background:rgba(255,255,255,.02)}
610
+ /* Real app composers. Text is positioned in % of the shot so it tracks the
611
+ image at every width -- derived from measured pixel geometry:
612
+ claude.png 1610x264 text band y136-160, left inset x54
613
+ codex.png 1490x204 text band y42-64, left inset x84 */
614
+ .agent-shot{margin:0}
615
+ .agent-frame{position:relative;container-type:inline-size;overflow:hidden}
616
+ .is-claude .agent-frame{border-radius:2.5cqw}
617
+ .is-codex .agent-frame{border-radius:.6cqw}
618
+ .agent-frame img{display:block;width:100%;height:auto}
619
+ .agent-type{position:absolute;display:flex;align-items:center;white-space:nowrap;overflow:hidden;pointer-events:none}
620
+ .is-claude .agent-type{left:5.22%;right:6%;top:17.7%;height:16.2%;font-family:var(--sans);font-size:1.02cqw;color:#f5f6f6}
621
+ .is-codex .agent-type{left:1.30%;right:6%;top:44.4%;height:19.4%;font-family:var(--sans);font-size:0.98cqw;color:#f5f4ee}
622
+ .agent-caret{display:inline-block;width:2px;height:1.05em;margin-left:2px;animation:agentblink 1s step-end infinite;flex:0 0 auto}
623
+ .is-claude .agent-caret{background:#f5f6f6}
624
+ .is-codex .agent-caret{background:#d87656}
625
+ @keyframes agentblink{50%{opacity:0}}
626
+ .agent-ask{margin:14px 0 16px;font-size:19px;line-height:1.45;color:var(--ink)}
627
+ .agent-does{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin:14px 0 0;padding:11px 14px;border-radius:10px;background:rgba(8,13,21,.6);border:1px solid rgba(124,196,255,.18)}
628
+ .agent-tool{font-family:var(--mono);font-size:11px;letter-spacing:.1em;text-transform:uppercase;color:#7cc4ff;border:1px solid rgba(124,196,255,.4);border-radius:999px;padding:3px 9px;flex:0 0 auto}
629
+ .agent-does code{font-family:var(--mono);font-size:13px;color:var(--ink);overflow-wrap:anywhere}
630
+ .agent-out{margin:16px 0 0;font-family:var(--mono);font-size:14.5px;line-height:1.65;color:var(--dim)}
631
+ .agent-out b{color:var(--ink);font-weight:600}
632
+ .agent-caption{margin:20px 0 0;color:var(--mute);font-size:14px}
633
+ .agent-caption code{font-family:var(--mono);font-size:12.5px;color:var(--dim)}
634
+ @media (max-width:640px){.agent-prompts{grid-template-columns:1fr}.agent-ask{font-size:17px}}
635
+ .cli-install-hint{display:block;margin-top:8px;font-family:var(--mono);font-size:var(--fs-micro);letter-spacing:.12em;text-transform:uppercase;color:var(--mute)}
636
+ .cli-install-cmd{padding:16px 20px;border-radius:var(--r-sm);border:1px solid rgba(124,196,255,.34);background:rgba(17,25,37,.9);max-width:100%;overflow-x:auto}
637
+ .cli-install-cmd code{font-family:var(--mono);font-size:var(--fs-base);letter-spacing:.02em;color:var(--blue2);white-space:nowrap}
638
+ .cli-install-gate{display:block;font-family:var(--sans);font-size:var(--fs-sm);letter-spacing:0;color:var(--mute);margin:0;line-height:1.7}
639
+ .cli-install-gate b{display:inline;font-family:var(--mono);font-size:var(--fs-micro);letter-spacing:.16em;text-transform:uppercase;color:#071018;background:var(--blue2);border-radius:var(--r-pill);padding:4px 9px;white-space:nowrap}
429
640
  .cli-install-gate a{color:var(--blue2);text-decoration:underline;text-underline-offset:3px}
430
- .cli-frame{border:1px solid var(--line);border-radius:16px;overflow:hidden;background:#0d1420;box-shadow:0 24px 60px rgba(0,0,0,.35)}
641
+ .cli-frame{border:1px solid var(--line);border-radius:var(--r-md);overflow:hidden;background:#0d1420;box-shadow:0 24px 60px rgba(0,0,0,.35)}
431
642
  .cli-frame img{display:block;width:100%;height:auto}
432
- .cli-cap{font-family:var(--mono);font-size:10px;letter-spacing:.16em;text-transform:uppercase;color:var(--mute);margin-top:10px;text-align:left}
433
- .cli-code{margin-top:14px;padding:14px 16px;border-radius:12px;border:1px solid var(--line);background:rgba(17,25,37,.9);font-family:var(--mono);font-size:12px;line-height:1.55;color:var(--cool);overflow-x:auto;text-align:left}
643
+ .cli-cap{font-family:var(--mono);font-size:var(--fs-micro);letter-spacing:.16em;text-transform:uppercase;color:var(--mute);margin-top:10px;text-align:left}
644
+ .cli-code{margin-top:14px;padding:14px 16px;border-radius:var(--r-sm);border:1px solid var(--line);background:rgba(17,25,37,.9);font-family:var(--mono);font-size:var(--fs-xs);line-height:1.55;color:var(--cool);overflow-x:auto;text-align:left}
434
645
  .cli-code b{color:var(--blue2);font-weight:500}
435
646
 
436
647
  .evolve-rail{
@@ -438,7 +649,7 @@ main{position:relative;z-index:2;padding-top:84px}
438
649
  padding:14px 16px 4px;
439
650
  }
440
651
  .evolve-pill{
441
- font-family:var(--mono);font-size:10px;letter-spacing:.14em;text-transform:uppercase;
652
+ font-family:var(--mono);font-size:var(--fs-micro);letter-spacing:.14em;text-transform:uppercase;
442
653
  border:1px solid var(--line);border-radius:999px;padding:8px 12px;color:var(--cool);
443
654
  }
444
655
  .evolve-pill.on{border-color:rgba(124,196,255,.35);color:var(--blue2)}
@@ -466,24 +677,49 @@ main{position:relative;z-index:2;padding-top:84px}
466
677
  .wires.multi circle.c-rh{fill:var(--rh)}
467
678
  .wires.multi circle.c-sol{fill:var(--sol)}
468
679
 
680
+ /* Live lanes. The wires draw once on scroll and then sit still, which reads as
681
+ a diagram rather than a control plane moving traffic. A second stroked copy
682
+ of each path runs a short dash along it on a loop, so every lane shows flow
683
+ in its own colour. Pure CSS on paths that already exist -- no extra DOM. */
684
+ .wires.in path{animation:lane-flow 2.6s linear infinite}
685
+ .wires.in path.w-2{animation-delay:.35s}
686
+ .wires.in path.w-3{animation-delay:.7s}
687
+ .wires.in path.w-4{animation-delay:1.05s}
688
+ .wires.in path.w-5{animation-delay:1.4s}
689
+ @keyframes lane-flow{
690
+ 0%{stroke-dasharray:.16 .84;stroke-dashoffset:1}
691
+ 100%{stroke-dasharray:.16 .84;stroke-dashoffset:0}
692
+ }
693
+ /* The endpoint dots breathe so the lane reads as connected, not decorative. */
694
+ .wires.in circle{animation:lane-node 2.6s var(--ease) infinite}
695
+ @keyframes lane-node{0%,100%{opacity:.55;r:1.4}50%{opacity:1;r:1.8}}
696
+ @media (prefers-reduced-motion:reduce){
697
+ .wires.in path,.wires.in circle{animation:none}
698
+ .wires.in path{stroke-dasharray:1;stroke-dashoffset:0}
699
+ }
700
+
469
701
  /* route detail cards */
470
702
  .route-card{background:rgba(17,25,37,.94);
471
703
  background:var(--bg);padding:22px 20px;min-height:150px;
472
704
  display:flex;flex-direction:column;gap:10px;transition:background .35s;
473
705
  }
474
706
  .route-card:hover{background:var(--panel-2)}
475
- .route-card h3{font-family:var(--display);font-weight:400;font-size:26px;display:flex;align-items:center;gap:10px}
707
+ .route-card h3{font-family:var(--display);font-weight:400;font-size:var(--fs-lg);display:flex;align-items:center;gap:10px}
476
708
  .route-card h3 img{width:20px;height:20px;border-radius:50%;object-fit:cover;background:rgba(255,255,255,.06)}
477
- .route-card .where{font-family:var(--mono);font-size:10px;letter-spacing:.16em;text-transform:uppercase;color:var(--blue)}
478
- .route-card p{color:#C9DAEC;font-size:15px;line-height:1.55}
709
+ .route-card .where{font-family:var(--mono);font-size:var(--fs-micro);letter-spacing:.16em;text-transform:uppercase;color:var(--blue)}
710
+ .route-card p{color:var(--cool);font-size:var(--fs-base);line-height:1.55}
479
711
  .route-card .chips{display:flex;flex-wrap:wrap;gap:6px;margin-top:auto}
480
712
  .route-card.p-add{grid-column:1/-1;align-items:center;text-align:center;justify-content:center;gap:14px;padding:30px 22px}
481
713
  .route-card.p-add .chips{justify-content:center;margin-top:4px}
482
714
  .route-card.p-add p{max-width:46ch}
483
715
  .chip-s{
484
- font-family:var(--mono);font-size:9px;letter-spacing:.1em;text-transform:uppercase;
716
+ font-family:var(--mono);font-size:var(--fs-micro);letter-spacing:.1em;text-transform:uppercase;
485
717
  border:1px solid var(--line);border-radius:999px;padding:5px 8px;color:var(--cool);
486
718
  }
719
+ .band-head{max-width:var(--max);margin:96px auto 0;padding:0 var(--pad)}
720
+ .band-head .eyebrow{font-family:var(--mono);font-size:var(--fs-micro);letter-spacing:3.4px;text-transform:uppercase;color:var(--mute);margin-bottom:10px}
721
+ .band-head h2{font-family:var(--display);font-weight:400;font-size:var(--fs-2xl);line-height:1.06;letter-spacing:-.01em}
722
+ @media (max-width:760px){.band-head{margin-top:60px}}
487
723
  .why-band{
488
724
  border-top:1px solid var(--line);
489
725
  padding:22px 24px 24px;
@@ -492,48 +728,52 @@ main{position:relative;z-index:2;padding-top:84px}
492
728
  .why-band p{
493
729
  max-width:62ch;margin:0 auto;text-align:center;
494
730
  font-family:var(--display);font-style:italic;font-weight:400;
495
- font-size:clamp(18px,2.2vw,24px);line-height:1.4;color:var(--blue2);
731
+ font-size:var(--fs-md);line-height:1.4;color:var(--blue2);
496
732
  }
497
733
  .why-band span{
498
734
  display:block;margin-top:10px;
499
- font-family:var(--mono);font-size:10px;letter-spacing:.16em;text-transform:uppercase;color:var(--mute);font-style:normal;
735
+ font-family:var(--mono);font-size:var(--fs-micro);letter-spacing:.16em;text-transform:uppercase;color:var(--mute);font-style:normal;
500
736
  }
501
737
 
502
738
  /* chains */
503
- .chain-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:10px}
504
- .hl-surface{margin-top:34px;border:1px solid var(--line);border-radius:14px;padding:20px;background:rgba(124,196,255,.02)}
739
+ .chain-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(190px,1fr));gap:12px}
740
+ .chain{transition:border-color .5s var(--ease),transform .5s var(--ease),background .5s var(--ease)}
741
+ .chain:hover{transform:translateY(-2px);border-color:color-mix(in oklab,var(--blue) 34%,transparent)}
742
+ .chain .badge{font-variant-numeric:tabular-nums;letter-spacing:.1em}
743
+ .chain .badge:not(.live){opacity:.62;border-style:dashed}
744
+ .hl-surface{margin-top:34px;border:1px solid var(--line);border-radius:var(--r-md);padding:20px;background:rgba(124,196,255,.02)}
505
745
  .hl-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px;margin-top:16px}
506
- .hl-grid article{border:1px solid rgba(124,196,255,.22);border-radius:10px;padding:16px 17px;background:rgba(17,25,37,.92)}
507
- .hl-grid h3{font-family:var(--display);font-size:15px;font-weight:500;color:var(--ink);margin:0 0 6px}
508
- .hl-grid p{font-size:14px;line-height:1.6;color:#C9DAEC;margin:0}
509
- .hl-note{margin:16px 0 0;font-family:var(--mono);font-size:10.5px;letter-spacing:.04em;color:var(--cool);opacity:.62}
746
+ .hl-grid article{border:1px solid rgba(124,196,255,.22);border-radius:var(--r-sm);padding:16px 17px;background:rgba(17,25,37,.92)}
747
+ .hl-grid h3{font-family:var(--display);font-size:var(--fs-base);font-weight:500;color:var(--ink);margin:0 0 6px}
748
+ .hl-grid p{font-size:var(--fs-sm);line-height:1.6;color:var(--cool);margin:0}
749
+ .hl-note{margin:16px 0 0;font-family:var(--mono);font-size:var(--fs-micro);letter-spacing:.04em;color:var(--cool);opacity:.62}
510
750
  .hip3{margin-top:20px;padding-top:18px;border-top:1px solid var(--line)}
511
751
  .hl-note code{font-family:var(--mono);color:var(--blue2);opacity:.9}
512
752
  @media(max-width:900px){.hl-grid{grid-template-columns:repeat(2,minmax(0,1fr))}}
513
753
  @media(max-width:620px){.hl-grid{grid-template-columns:1fr}}
514
754
  .chain{
515
- border:1px solid var(--line);border-radius:14px;padding:16px;
755
+ border:1px solid var(--line);border-radius:var(--r-md);padding:16px;
516
756
  background:linear-gradient(180deg, rgba(124,196,255,.06), transparent 55%), rgba(17,25,37,.94);
517
757
  min-height:100px;display:flex;flex-direction:column;justify-content:space-between;gap:12px;
518
758
  transition:border-color .4s var(--ease),transform .4s var(--ease),box-shadow .4s var(--ease);
519
759
  }
520
760
  .chain:hover{border-color:rgba(124,196,255,.45);transform:translate3d(0,-3px,0)}
521
761
  .chain-top{display:flex;justify-content:space-between;gap:8px;align-items:flex-start}
522
- .chain .nm{font-family:var(--display);font-size:20px;display:flex;align-items:center;gap:8px}
762
+ .chain .nm{font-family:var(--display);font-size:var(--fs-md);display:flex;align-items:center;gap:8px}
523
763
  .chain .nm img{width:18px;height:18px;border-radius:50%;object-fit:cover;background:rgba(255,255,255,.06)}
524
- .chain .id{font-family:var(--mono);font-size:11px;color:var(--blue);white-space:nowrap;padding-top:4px}
764
+ .chain .id{font-family:var(--mono);font-size:var(--fs-xs);color:var(--blue);white-space:nowrap;padding-top:4px}
525
765
  .chain .meta{
526
766
  display:flex;justify-content:space-between;gap:8px;
527
- font-family:var(--mono);font-size:10px;letter-spacing:.12em;text-transform:uppercase;color:var(--mute);
767
+ font-family:var(--mono);font-size:var(--fs-micro);letter-spacing:.12em;text-transform:uppercase;color:var(--mute);
528
768
  }
529
769
  .badge{border:1px solid var(--line);border-radius:999px;padding:4px 8px;color:var(--cool)}
530
770
  .badge.live{border-color:rgba(124,196,255,.35);color:var(--blue)}
531
771
 
532
- .venues{margin-top:14px;border:1px solid var(--line);border-radius:14px;overflow:hidden;background:rgba(17,25,37,.85)}
533
- .venues{background:rgba(17,25,37,.86);border:1px solid rgba(124,196,255,.16);border-radius:16px;overflow:hidden;margin-bottom:14px}
772
+ .venues{margin-top:14px;border:1px solid var(--line);border-radius:var(--r-md);overflow:hidden;background:rgba(17,25,37,.85)}
773
+ .venues{background:rgba(17,25,37,.86);border:1px solid rgba(124,196,255,.16);border-radius:var(--r-md);overflow:hidden;margin-bottom:14px}
534
774
  .venues-head{
535
775
  padding:11px 14px;border-bottom:1px solid var(--line);
536
- font-family:var(--mono);font-size:10px;letter-spacing:.2em;text-transform:uppercase;color:var(--mute);
776
+ font-family:var(--mono);font-size:var(--fs-micro);letter-spacing:.2em;text-transform:uppercase;color:var(--mute);
537
777
  display:flex;justify-content:space-between;gap:10px;flex-wrap:wrap;
538
778
  }
539
779
  .venues-head b{color:var(--blue);font-weight:500}
@@ -545,7 +785,7 @@ main{position:relative;z-index:2;padding-top:84px}
545
785
  a.chip{text-decoration:none;color:inherit}
546
786
  .chip{
547
787
  display:inline-flex;align-items:center;gap:10px;
548
- font-size:15px;letter-spacing:-.015em;text-transform:none;color:var(--proto-color,var(--cool));
788
+ font-size:var(--fs-base);letter-spacing:-.015em;text-transform:none;color:var(--proto-color,var(--cool));
549
789
  padding:8px 13px;border:1px solid rgba(124,196,255,.1);border-radius:999px;background:rgba(11,16,24,.38);
550
790
  box-shadow:inset 0 0 0 1px rgba(255,255,255,.025);
551
791
  transition:border-color .35s var(--ease),background .35s var(--ease),transform .35s var(--ease);
@@ -554,7 +794,7 @@ a.chip:hover{border-color:rgba(124,196,255,.3);background:rgba(21,32,49,.6);tran
554
794
  .chip img{width:18px;height:18px;border-radius:50%;object-fit:cover;background:rgba(255,255,255,.06)}
555
795
  .chip.wm-chip{padding:11px 18px}
556
796
  .chip img.wm{width:auto;height:27px;max-width:180px;border-radius:0;object-fit:contain;background:none;opacity:1}
557
- .chip img.wm.tall{height:28px;max-width:32px}
797
+ .chip img.wm.tall{width:30px;height:30px;min-width:30px;max-width:30px;border-radius:50%;object-fit:cover;background:rgba(255,255,255,.08);box-shadow:inset 0 0 0 1px rgba(255,255,255,.08)}
558
798
  .chip img.wm.mono{filter:brightness(0) invert(1)}
559
799
 
560
800
  .chip .wordmark{font-family:var(--proto-font,var(--sans));font-weight:var(--proto-weight,750);font-style:var(--proto-style,normal);text-transform:var(--proto-transform,none);letter-spacing:var(--proto-track,-.025em);line-height:1.2}
@@ -584,8 +824,200 @@ a.chip:hover{border-color:rgba(124,196,255,.3);background:rgba(21,32,49,.6);tran
584
824
  @keyframes scroll{from{transform:translate3d(0,0,0)}to{transform:translate3d(-50%,0,0)}}
585
825
 
586
826
 
827
+
828
+ /* dense premium layer: protocol atlas + hero metrics */
829
+ .home-stats{margin-top:clamp(40px,6vw,72px);border-top:1px solid var(--line);padding-top:26px;
830
+ display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:1px;
831
+ width:100%;margin:28px 0 0;border:1px solid var(--line);border-radius:var(--r-md);overflow:hidden;
832
+ background:var(--line);position:relative;z-index:3;box-shadow:0 24px 70px rgba(0,0,0,.28);
833
+ }
834
+ .home-stat{background:rgba(17,25,37,.82);padding:15px 16px 14px;text-align:left;min-height:86px;position:relative;overflow:hidden}
835
+ .home-stat::after{content:"";position:absolute;inset:-1px;opacity:0;background:radial-gradient(160px 120px at var(--mx,50%) var(--my,50%),rgba(124,196,255,.16),transparent 65%);transition:opacity .35s var(--ease)}
836
+ .home-stat:hover::after{opacity:1}
837
+ .home-stat b{display:block;font-family:var(--display);font-weight:400;font-size:var(--fs-2xl);line-height:.9;color:var(--ink);letter-spacing:-.03em;position:relative;z-index:1}
838
+ .home-stat .stat-suffix{font-size:.42em;letter-spacing:0;color:var(--cool);margin-left:.18em;vertical-align:.42em}
839
+ .home-stat span{display:block;margin-top:9px;font-family:var(--mono);font-size:var(--fs-micro);letter-spacing:.16em;text-transform:uppercase;color:var(--mute);position:relative;z-index:1}
840
+
841
+ .protocol-atlas{max-width:min(1280px,100%)}
842
+ .protocol-atlas .section-title{max-width:15ch;font-size:var(--fs-3xl);line-height:.94;letter-spacing:-.035em}
843
+ .protocol-atlas .section-lede{max-width:62ch}
844
+ .atlas-sticky{position:sticky;top:96px;border:1px solid var(--line);border-radius:var(--r-lg);overflow:hidden;background:linear-gradient(180deg,rgba(124,196,255,.10),rgba(17,25,37,.88) 42%,rgba(11,16,24,.94));box-shadow:0 30px 90px rgba(0,0,0,.34)}
845
+ .atlas-orbit{height:220px;position:relative;display:grid;place-items:center;border-bottom:1px solid var(--line);overflow:hidden}
846
+ .atlas-orbit::before{content:"";position:absolute;width:360px;height:360px;border-radius:50%;background:radial-gradient(circle,rgba(124,196,255,.24),rgba(124,196,255,.08) 28%,transparent 62%);filter:blur(12px);animation:home-breathe 5.8s var(--ease) infinite}
847
+ .atlas-orbit .orbital{width:124px;height:124px;filter:drop-shadow(0 0 32px rgba(124,196,255,.4))}
848
+ .atlas-copy{padding:clamp(20px,3vw,30px)}
849
+ .atlas-count{font-family:var(--display);font-weight:300;font-size:var(--fs-4xl);line-height:.82;letter-spacing:-.055em;color:var(--ink)}
850
+ .atlas-count span{font-style:italic;color:var(--blue2)}
851
+ .atlas-sub{margin-top:16px;color:var(--cool);font-size:var(--fs-base);line-height:1.68;max-width:34ch}
852
+ .atlas-ledger{display:grid;gap:1px;margin-top:24px;border:1px solid var(--line);border-radius:var(--r-md);overflow:hidden;background:var(--line)}
853
+ .atlas-ledger div{display:grid;grid-template-columns:1fr auto;gap:16px;padding:11px 13px;background:rgba(11,16,24,.62);font-family:var(--mono);font-size:var(--fs-micro);letter-spacing:.13em;text-transform:uppercase;color:var(--mute)}
854
+ .atlas-ledger b{color:var(--blue2);font-weight:500}
855
+ .mega-oracle{font-family:var(--display);font-weight:300;font-size:var(--fs-4xl);line-height:.8;letter-spacing:-.06em;text-align:center;color:transparent;-webkit-text-stroke:1px rgba(124,196,255,.20);margin:clamp(54px,9vw,110px) auto -26px;max-width:1280px;mask-image:linear-gradient(180deg,#000 28%,transparent 96%);-webkit-mask-image:linear-gradient(180deg,#000 28%,transparent 96%)}
856
+
857
+ @media (max-width:960px){
858
+ .home-stats{grid-template-columns:repeat(2,minmax(0,1fr))}
859
+ .atlas-sticky{position:relative;top:auto}
860
+ }
861
+ @media (max-width:560px){.home-stats{grid-template-columns:1fr}.home-stat{min-height:0}.atlas-orbit{height:170px}.atlas-count{font-size:var(--fs-3xl)}}
862
+
863
+
864
+
865
+ /* high-end motion surface, replaces visible DEX/lending lists */
866
+ .motion-lab{display:grid;grid-template-columns:minmax(280px,.72fr) minmax(0,1.55fr);gap:clamp(22px,4vw,54px);align-items:start;margin-top:clamp(26px,5vw,58px);perspective:1200px}
867
+ .motion-main{display:flex;flex-direction:column;gap:16px;min-width:0}
868
+ .motion-command{transform-style:preserve-3d}
869
+ .toolbelt{display:flex;flex-wrap:wrap;gap:8px;border:1px solid var(--line);border-radius:999px;padding:9px;background:rgba(11,16,24,.5);box-shadow:inset 0 0 0 1px rgba(255,255,255,.02);overflow:hidden}
870
+ .toolbelt span{font-family:var(--mono);font-size:var(--fs-micro);letter-spacing:.16em;text-transform:uppercase;color:var(--blue2);border:1px solid rgba(124,196,255,.18);border-radius:999px;padding:8px 10px;background:rgba(124,196,255,.045);white-space:nowrap}
871
+ .operator-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:14px}
872
+ .motion-card{--mx:50%;--my:50%;position:relative;min-height:252px;border:1px solid var(--line);border-radius:var(--r-lg);overflow:hidden;padding:clamp(20px,3vw,30px);background:linear-gradient(155deg,rgba(124,196,255,.095),rgba(17,25,37,.84) 34%,rgba(11,16,24,.96));box-shadow:0 30px 90px rgba(0,0,0,.22);transform-style:preserve-3d;will-change:transform;transition:transform .55s var(--ease),border-color .45s var(--ease),box-shadow .45s var(--ease)}
873
+ .motion-card::before{content:"";position:absolute;inset:-40%;opacity:.62;background:radial-gradient(340px 220px at var(--mx) var(--my),rgba(184,240,255,.18),transparent 58%),conic-gradient(from var(--spin,0deg),transparent,rgba(124,196,255,.24),transparent 34%,rgba(80,210,193,.18),transparent 66%);filter:blur(26px);transform:translateZ(-1px);animation:card-spin 12s linear infinite}
874
+ .motion-card::after{content:"";position:absolute;inset:0;background:linear-gradient(120deg,transparent 0%,rgba(255,255,255,.08) 44%,transparent 58%);transform:translateX(-120%);transition:transform .9s var(--ease);pointer-events:none}
875
+ .motion-card:hover{border-color:rgba(184,240,255,.38);box-shadow:0 34px 110px rgba(0,0,0,.34),0 0 0 1px rgba(184,240,255,.06)}
876
+ .motion-card:hover::after{transform:translateX(120%)}
877
+ .motion-card .num{position:relative;z-index:1;font-family:var(--mono);font-size:var(--fs-micro);letter-spacing:.2em;text-transform:uppercase;color:var(--blue)}
878
+ .motion-card h3{position:relative;z-index:1;margin:44px 0 12px;font-family:var(--display);font-weight:400;font-size:var(--fs-2xl);line-height:.96;letter-spacing:-.03em}
879
+ .motion-card p{position:relative;z-index:1;color:var(--cool);font-size:var(--fs-base);line-height:1.62;max-width:34ch}
880
+ .motion-card .sig{position:absolute;left:clamp(20px,3vw,30px);right:clamp(20px,3vw,30px);bottom:18px;z-index:1;display:flex;justify-content:space-between;gap:14px;font-family:var(--mono);font-size:var(--fs-micro);letter-spacing:.14em;text-transform:uppercase;color:var(--mute);border-top:1px solid rgba(124,196,255,.12);padding-top:13px}
881
+ .motion-card.is-hot .sig span:last-child{color:var(--blue2)}
882
+ .motion-scan{position:absolute;inset:0;pointer-events:none;background:linear-gradient(180deg,transparent,rgba(124,196,255,.08),transparent);height:38%;animation:scan-pass 4.8s var(--ease) infinite;mix-blend-mode:screen}
883
+ .word-mask{display:inline-block;overflow:hidden;vertical-align:bottom;padding-bottom:.16em;margin-bottom:-.16em}.word-mask>span{display:inline-block}
884
+ @keyframes card-spin{to{--spin:360deg}}
885
+ @keyframes scan-pass{0%,100%{transform:translateY(-115%);opacity:0}18%,70%{opacity:.7}100%{transform:translateY(215%);opacity:0}}
886
+ @media (max-width:960px){.motion-lab{grid-template-columns:1fr}.operator-grid{grid-template-columns:1fr}.toolbelt{border-radius:var(--r-md)}.motion-card{min-height:220px}}
887
+ @media (prefers-reduced-motion:reduce){.motion-card::before,.motion-scan{animation:none}.motion-card{will-change:auto}}
888
+
889
+ /* ── hero: product-first split. Real artifact leads, orb is ambience ── */
890
+ .hero-split{
891
+ display:grid;grid-template-columns:minmax(0,.68fr) minmax(0,1.32fr);
892
+ gap:clamp(28px,4vw,56px);align-items:center;text-align:left;width:100%;
893
+ }
894
+ .hero-lede{min-width:0;display:flex;flex-direction:column;align-items:flex-start}
895
+ .hero-lede .home-kicker{margin-bottom:14px}
896
+ .hero-split .home-title{
897
+ font-size:var(--fs-3xl);line-height:.98;letter-spacing:-.035em;
898
+ text-transform:none;text-align:left;margin:0;
899
+ }
900
+ .hero-sub{
901
+ max-width:46ch;margin:20px 0 0;color:var(--cool);
902
+ font-size:var(--fs-base);line-height:1.65;text-shadow:0 1px 20px rgba(0,0,0,.6);
903
+ }
904
+ .hero-split .home-actions{justify-content:flex-start;margin-top:30px}
905
+ .enter-cta.primary{
906
+ background:linear-gradient(180deg,rgba(184,240,255,.98),rgba(124,196,255,.9));
907
+ color:#071018;border-color:transparent;font-weight:600;
908
+ }
909
+ .enter-cta.primary::after{color:#071018}
910
+ .enter-cta.primary:hover{box-shadow:0 0 0 1px rgba(184,240,255,.4),0 22px 54px rgba(124,196,255,.22)}
911
+ .enter-cta.ghost{background:none}
912
+ .hero-note-line{
913
+ margin-top:18px;font-family:var(--mono);font-size:var(--fs-micro);letter-spacing:.14em;
914
+ text-transform:uppercase;color:var(--mute);
915
+ }
916
+ .hero-note-line code{color:var(--blue2);font-size:var(--fs-micro)}
917
+
918
+ .hero-product{position:relative;margin:0;min-width:0;perspective:1600px;overflow:clip}
919
+ .hero-product .hero-art{display:none}
920
+ .hero-product .hero-orb{width:min(100%,560px)}
921
+ .hero-shot{
922
+ position:relative;z-index:1;border-radius:var(--r-md);overflow:hidden;
923
+ border:1px solid var(--line-2);background:#05080D;
924
+ box-shadow:0 40px 120px rgba(0,0,0,.62),0 0 0 1px rgba(184,240,255,.06),inset 0 1px 0 rgba(255,255,255,.05);
925
+ transform:perspective(2000px) rotateY(-4deg) rotateX(1.5deg);
926
+ transition:transform 1s var(--ease),box-shadow 1s var(--ease);
927
+ /* Bleed toward the viewport edge so the shot reads at a legible size. */
928
+ width:calc(100% + max(0px,(100vw - var(--max))/2 - var(--pad) + 20px));
929
+ max-width:none;
930
+ }
931
+ .hero-shot img{display:block;width:100%;height:auto}
932
+ .hero-shot::after{
933
+ content:"";position:absolute;inset:0;pointer-events:none;
934
+ background:linear-gradient(130deg,rgba(184,240,255,.1),transparent 42%);
935
+ }
936
+ .hero-product:hover .hero-shot{transform:perspective(2000px) rotateY(-1deg) rotateX(.5deg)}
937
+ .hero-product figcaption{
938
+ position:relative;z-index:1;margin-top:14px;font-family:var(--mono);font-size:var(--fs-micro);
939
+ letter-spacing:.2em;text-transform:uppercase;color:var(--mute);text-align:right;
940
+ }
941
+ @media (max-width:960px){
942
+ .hero-split{grid-template-columns:minmax(0,1fr);gap:36px}
943
+ .hero-shot{transform:none;width:100%}
944
+ .hero-product .hero-art{inset:-10% -6%;opacity:.34}
945
+ .hero-product figcaption{text-align:left}
946
+ }
947
+ @media (prefers-reduced-motion:reduce){.hero-shot{transform:none;transition:none}}
948
+
949
+ /* Route proof: the ranking claim, recorded. */
950
+ .risk-proof,
951
+ .route-proof{position:relative;margin:0 auto var(--space-5);max-width:868px;border:1px solid rgba(124,196,255,.16);border-radius:var(--r-md);overflow:hidden;background:#080d15;line-height:0}
952
+ .risk-proof video,
953
+ .route-proof video{display:block;width:100%;max-width:868px;height:auto;opacity:0;transition:opacity .5s var(--ease)}
954
+ .risk-proof video.ready,
955
+ .route-proof video.ready{opacity:1}
956
+ .risk-proof #risk-still,
957
+ .route-proof #route-still{display:block;width:100%;max-width:868px;height:auto}
958
+ .risk-proof video.ready ~ #risk-still,
959
+ .route-proof video.ready ~ #route-still{position:absolute;inset:0;opacity:0;pointer-events:none}
960
+ .risk-proof figcaption,
961
+ .route-proof figcaption{line-height:1.4;padding:10px 14px;border-top:1px solid rgba(124,196,255,.12);font-family:var(--mono);font-size:var(--fs-micro);letter-spacing:.14em;text-transform:uppercase;color:var(--blue2)}
962
+ @media (prefers-reduced-motion:reduce){
963
+ .risk-proof video,
964
+ .route-proof video{display:none}
965
+ .risk-proof #risk-still,
966
+ .route-proof #route-still{position:static;opacity:1}
967
+ }
968
+
969
+ /* The orb is the hero mark, so it drops the terminal panel chrome entirely:
970
+ no border, no dark fill, no 3D tilt, no edge bleed. */
971
+ .hero-shot-orb{
972
+ border:0;background:transparent;box-shadow:none;transform:none;overflow:visible;
973
+ width:min(100%,560px);margin-inline:auto;border-radius:0;
974
+ }
975
+ .hero-shot-orb::after{display:none}
976
+ .hero-product:hover .hero-shot-orb{transform:none}
977
+ .hero-shot-orb video,
978
+ .hero-shot-orb #orb-still{
979
+ display:block;width:100%;height:auto;
980
+ /* The render's background is rgb(10,16,23) at full alpha -- near-black, but not
981
+ black. Screen/additive blending can only cancel true #000, which is why the
982
+ plate stayed visible. Crush the floor to real black first, then screen it
983
+ away. Highlights sit at 244+ so they survive the crush untouched. */
984
+ filter:brightness(1.16) contrast(1.3);
985
+ mix-blend-mode:screen;
986
+ /* Belt and braces: feather the boundary so no engine can show a hard edge. */
987
+ -webkit-mask-image:radial-gradient(ellipse 64% 64% at 50% 47%, #000 42%, transparent 74%);
988
+ mask-image:radial-gradient(ellipse 64% 64% at 50% 47%, #000 42%, transparent 74%);
989
+ }
990
+ .hero-shot-orb video{opacity:0;transition:opacity .6s var(--ease)}
991
+ .hero-shot-orb video.ready{opacity:1}
992
+ .hero-shot-orb video.ready ~ #orb-still{position:absolute;inset:0;opacity:0;pointer-events:none}
993
+ @media (prefers-reduced-motion:reduce){
994
+ .hero-shot-orb video{display:none}
995
+ .hero-shot-orb #orb-still{position:static;opacity:1}
996
+ }
997
+ /* CLI section leads with the filled active-surface still. */
998
+ .cli-proof{position:relative;aspect-ratio:auto;height:auto;min-height:0;padding:0;
999
+ max-width:868px;margin-inline:auto;line-height:0;display:block}
1000
+ .cli-proof #cli-still{display:block;width:100%;height:auto}
1001
+ .cli-proof video.ready ~ #cli-still{position:absolute;inset:0;opacity:0;pointer-events:none}
1002
+ @media (prefers-reduced-motion:reduce){
1003
+ .cli-proof video{display:none}
1004
+ .cli-proof #cli-still{position:static;opacity:1}
1005
+ }
1006
+
1007
+ /* Recorded session leads; the still is the fallback underneath it. */
1008
+ .hero-shot{position:relative}
1009
+ .hero-shot video{display:block;width:100%;height:auto;opacity:0;transition:opacity .6s var(--ease)}
1010
+ .hero-shot video.ready{opacity:1}
1011
+ .hero-shot video.ready + #cli-still{opacity:0}
1012
+ #cli-still{display:block;width:100%;height:auto;transition:opacity .6s var(--ease)}
1013
+ .hero-shot video.ready ~ #cli-still{position:absolute;inset:0;pointer-events:none}
1014
+ @media (prefers-reduced-motion:reduce){
1015
+ .hero-shot video{display:none}
1016
+ #cli-still{position:static;opacity:1}
1017
+ }
1018
+
587
1019
  footer{margin-top:clamp(72px,12vh,120px);border-top:1px solid var(--line);padding:32px var(--pad) 40px;position:relative;z-index:2}
588
- .labs-link{font-family:"UnifrakturCook","Old English Text MT","Lucida Blackletter",serif;font-size:16px;letter-spacing:.04em;text-transform:none;color:var(--blue2)}
1020
+ .labs-link{font-family:"UnifrakturCook","Old English Text MT","Lucida Blackletter",serif;font-size:var(--fs-base);letter-spacing:.04em;text-transform:none;color:var(--blue2)}
589
1021
  .labs-link:hover{color:var(--ink)}
590
1022
  .foot-row{
591
1023
  max-width:var(--max);margin:0 auto 14px;
@@ -593,17 +1025,17 @@ footer{margin-top:clamp(72px,12vh,120px);border-top:1px solid var(--line);paddin
593
1025
  }
594
1026
  .powered{
595
1027
  display:inline-flex;align-items:center;gap:10px;
596
- font-family:var(--mono);font-size:11px;letter-spacing:.2em;text-transform:uppercase;color:var(--mute);
1028
+ font-family:var(--mono);font-size:var(--fs-xs);letter-spacing:.2em;text-transform:uppercase;color:var(--mute);
597
1029
  }
598
1030
  .powered .mark{width:7px;height:7px;border-radius:50%;background:var(--blue);box-shadow:0 0 12px rgba(124,196,255,.7)}
599
1031
  .powered a{color:var(--blue);font-weight:600;border-bottom:1px solid transparent;transition:border-color .25s,color .25s}
600
1032
  .powered a:hover{border-bottom-color:var(--blue);color:var(--ink)}
601
- .foot-links{display:flex;gap:18px;font-family:var(--mono);font-size:10px;letter-spacing:.16em;text-transform:uppercase;color:var(--mute)}
1033
+ .foot-links{display:flex;gap:18px;font-family:var(--mono);font-size:var(--fs-micro);letter-spacing:.16em;text-transform:uppercase;color:var(--mute)}
602
1034
  .foot-links a:hover{color:var(--blue)}
603
1035
  .foot-meta{
604
1036
  max-width:var(--max);margin:0 auto;
605
1037
  display:flex;flex-wrap:wrap;gap:12px 22px;justify-content:space-between;
606
- font-family:var(--mono);font-size:10px;letter-spacing:.16em;text-transform:uppercase;color:var(--mute);
1038
+ font-family:var(--mono);font-size:var(--fs-micro);letter-spacing:.16em;text-transform:uppercase;color:var(--mute);
607
1039
  }
608
1040
 
609
1041
  .js .rv{opacity:0;transform:translate3d(0,22px,0);will-change:opacity,transform}
@@ -612,7 +1044,7 @@ footer{margin-top:clamp(72px,12vh,120px);border-top:1px solid var(--line);paddin
612
1044
 
613
1045
  @media (max-width:960px){
614
1046
  .home-inner{max-width:760px}
615
- .hero-stage{min-height:clamp(300px,44vh,460px)}.home-title{font-size:clamp(80px,20vw,150px)}
1047
+ .hero-stage{min-height:clamp(300px,44vh,460px)}.home-title{font-size:var(--fs-4xl)}
616
1048
  .nav-chip{display:none}
617
1049
  .nav-links .hide-sm{display:none}
618
1050
  .route-strip{grid-template-columns:1fr}
@@ -621,27 +1053,28 @@ footer{margin-top:clamp(72px,12vh,120px);border-top:1px solid var(--line);paddin
621
1053
  }
622
1054
  @media (max-width:720px){
623
1055
  :root{--pad:clamp(16px,5vw,24px)}
1056
+ .cli-frame,.cli-frame img,.convert-copy,.convert-grid{max-width:100%;width:100%}
1057
+ .cli-frame img{height:auto}
624
1058
  main{padding-top:68px}
625
1059
  .nav{padding:12px var(--pad)}
626
- .brand{font-size:22px}
1060
+ .brand{font-size:var(--fs-lg)}
627
1061
  .brand .orbital{width:24px;height:24px}
628
1062
  .home{min-height:auto;padding-top:22px;padding-bottom:58px}
629
1063
  .home::after{bottom:8px;height:48px}
630
1064
  .hero-stage{min-height:240px}
631
- #orb-vid,.hero-orb{width:min(78vw,300px)}
1065
+ .hero-orb{width:min(78vw,300px)}
632
1066
  .hero-orb .orbit-dot{animation-name:orbit-travel-mobile}
633
1067
  @keyframes orbit-travel-mobile{from{transform:rotateX(76deg) rotateZ(0deg) translateX(min(30vw,128px))}to{transform:rotateX(76deg) rotateZ(360deg) translateX(min(30vw,128px))}}
634
- .home-title{font-size:clamp(64px,19vw,82px);letter-spacing:-.05em}
635
- .hero-byline{margin-top:8px;font-size:9px;letter-spacing:.2em}
636
- .home-kicker{font-size:9px;letter-spacing:.22em}
637
- .home-copy p:not(.home-kicker){max-width:34ch;font-size:15px;line-height:1.58;margin-top:14px}
1068
+ .home-title{font-size:var(--fs-4xl);letter-spacing:-.05em}
1069
+ .home-kicker{font-size:var(--fs-micro);letter-spacing:.22em}
1070
+ .home-copy p:not(.home-kicker){max-width:34ch;font-size:var(--fs-base);line-height:1.58;margin-top:14px}
638
1071
  .home-actions{width:100%;margin-top:22px}
639
1072
  .enter-cta{width:100%;max-width:280px;min-height:48px;justify-content:center;padding:13px 18px}
640
1073
  .section{padding:clamp(44px,8vh,72px) var(--pad) 0}
641
1074
  .section-label{letter-spacing:.22em}
642
- .section-title{font-size:clamp(30px,11vw,42px);max-width:12ch}
643
- .section-lede{font-size:15px;line-height:1.6;margin-bottom:24px}
644
- .graph-top{justify-content:flex-start;padding:12px;font-size:9px;line-height:1.55;letter-spacing:.12em}
1075
+ .section-title{font-size:var(--fs-xl);max-width:12ch}
1076
+ .section-lede{font-size:var(--fs-base);line-height:1.6;margin-bottom:24px}
1077
+ .graph-top{justify-content:flex-start;padding:12px;font-size:var(--fs-micro);line-height:1.55;letter-spacing:.12em}
645
1078
  .evolve-rail{justify-content:flex-start;flex-wrap:nowrap;overflow-x:auto;padding:12px;-webkit-overflow-scrolling:touch}
646
1079
  .evolve-pill{white-space:nowrap;flex:0 0 auto}
647
1080
  .graph-canvas{overflow:visible;padding:22px 12px 24px}
@@ -656,18 +1089,19 @@ footer{margin-top:clamp(72px,12vh,120px);border-top:1px solid var(--line);paddin
656
1089
  .wires.funnel{height:42px}
657
1090
  .builder-row{margin-top:4px}
658
1091
  .route-card{min-height:auto;padding:20px 16px;background:rgba(17,25,37,.94)}
659
- .route-card h3{font-size:23px;line-height:1.05;flex-wrap:wrap}
1092
+ .route-card h3{font-size:var(--fs-lg);line-height:1.05;flex-wrap:wrap}
660
1093
  .why-band{padding:20px 16px 22px}
661
1094
  .hl-surface{padding:16px}
662
1095
  .chain .id{white-space:normal;text-align:right}
663
- .venues-head{font-size:9px;letter-spacing:.12em;line-height:1.5}
1096
+ .venues-head{font-size:var(--fs-micro);letter-spacing:.12em;line-height:1.5}
664
1097
  .marquee{overflow-x:auto;overflow-y:hidden;mask-image:none;-webkit-mask-image:none;scrollbar-width:none;overscroll-behavior-inline:contain;-webkit-overflow-scrolling:touch}
665
1098
  .marquee::-webkit-scrollbar{display:none}
666
1099
  .marquee .track,.marquee.rev .track{min-width:max-content;animation:none;transform:none;will-change:auto}
667
1100
  .track{gap:16px}
668
- .chip{font-size:14px;padding:8px 11px}
1101
+ .chip{font-size:var(--fs-sm);padding:8px 11px}
669
1102
  .chip.wm-chip{padding:10px 14px}
670
1103
  .chip img.wm{height:24px;max-width:132px}
1104
+ .chip img.wm.tall{width:26px;height:26px;min-width:26px;max-width:26px}
671
1105
  footer{padding:28px var(--pad) 34px}
672
1106
  .foot-row,.foot-meta{justify-content:center;text-align:center}
673
1107
  .foot-links{flex-wrap:wrap;justify-content:center;gap:12px 16px}
@@ -676,9 +1110,9 @@ footer{margin-top:clamp(72px,12vh,120px);border-top:1px solid var(--line);paddin
676
1110
  .chain-grid{grid-template-columns:1fr}
677
1111
  }
678
1112
  @media (max-width:380px){
679
- .home-title{font-size:62px}
1113
+ .home-title{font-size:var(--fs-3xl)}
680
1114
  .hero-stage{min-height:220px}
681
- .section-title{font-size:30px}
1115
+ .section-title{font-size:var(--fs-xl)}
682
1116
  }
683
1117
  @media (prefers-reduced-motion:reduce){
684
1118
  html{scroll-behavior:auto}
@@ -706,8 +1140,6 @@ footer{margin-top:clamp(72px,12vh,120px);border-top:1px solid var(--line);paddin
706
1140
  <circle class="core" cx="50" cy="50" r="6.5"/>
707
1141
  </svg>
708
1142
  </div>
709
- <div class="loader-word">oracle</div>
710
- <div class="loader-bar"><span id="loader-fill"></span></div>
711
1143
  </div>
712
1144
  </div>
713
1145
 
@@ -726,7 +1158,6 @@ footer{margin-top:clamp(72px,12vh,120px);border-top:1px solid var(--line);paddin
726
1158
  <a class="hide-sm" href="#cli">CLI</a>
727
1159
  <a class="hide-sm" href="#orchestration">Profiles</a>
728
1160
  <a class="hide-sm" href="#strategies">Strategies</a>
729
- <a class="hide-sm" href="#chains">Chains</a>
730
1161
  </nav>
731
1162
  </header>
732
1163
 
@@ -736,12 +1167,20 @@ footer{margin-top:clamp(72px,12vh,120px);border-top:1px solid var(--line);paddin
736
1167
 
737
1168
  <section class="home" id="home">
738
1169
  <div class="home-inner">
739
- <div class="hero-primary">
740
- <div class="hero-stage">
1170
+ <div class="hero-split">
1171
+ <div class="hero-lede">
1172
+ <p class="home-kicker rv">self-custody agent control</p>
1173
+ <h1 class="home-title rv">Trade every chain<br>from <em>one</em> agent</h1>
1174
+ <p class="hero-sub rv">Hyperliquid, EVM, Bitcoin, Solana, Stable and Robinhood Chain in a single control plane. Oracle reads state, prices routes and prepares the transaction. Your wallet signs it.</p>
1175
+ <div class="home-actions">
1176
+ <a class="enter-cta primary" href="#cli">Download</a>
1177
+ <a class="enter-cta ghost" href="#cli">See the CLI</a>
1178
+ </div>
1179
+ <p class="hero-note-line">macOS · Windows · Linux &nbsp;/&nbsp; desktop app or holder-gated CLI</p>
1180
+ </div>
1181
+
1182
+ <figure class="hero-product">
741
1183
  <div class="hero-art" aria-hidden="true">
742
- <video id="orb-vid" muted loop playsinline preload="none" hidden>
743
- <source src="assets/hero/orb.webm" type="video/webm">
744
- </video>
745
1184
  <div class="hero-orb" id="hero-orb">
746
1185
  <span class="lat l1"></span><span class="lat l2"></span><span class="lat l3"></span><span class="lat l4"></span>
747
1186
  <span class="par p1"></span><span class="par p2"></span><span class="par p3"></span>
@@ -750,55 +1189,27 @@ footer{margin-top:clamp(72px,12vh,120px);border-top:1px solid var(--line);paddin
750
1189
  <span class="orbit-dot"></span>
751
1190
  </div>
752
1191
  </div>
753
- <div class="hero-lockup" id="hero-title">
754
- <h1 class="home-title">OR<em>ACLE</em></h1>
755
- </div>
756
- </div>
757
- <div class="home-copy">
758
- <p class="home-kicker">self-custody agent control</p>
759
- <p>One control plane for Hyperliquid, Polymarket, EVM, Bitcoin, Solana, Stable, Robinhood Chain, and new protocol builds. Cross-chain research, trade, protocol interactions, NFT listing and buying. The all-in-one crypto agent. The future is agentic.</p>
760
- <div class="home-actions">
761
- <a class="enter-cta" href="#cli">See the CLI</a>
762
- <a class="enter-cta" href="#orchestration" style="margin-left:10px;opacity:.85">See profiles</a>
1192
+ <div class="hero-shot hero-shot-orb" id="hero-title">
1193
+ <video id="orb-video" width="900" height="900"
1194
+ poster="assets/hero/orb-poster.jpg?v=2026080623"
1195
+ muted loop playsinline autoplay preload="metadata"
1196
+ aria-label="Oracle mark">
1197
+ <source src="assets/hero/orb.webm?v=2026080623" type="video/webm">
1198
+ </video>
1199
+ <img id="orb-still" src="assets/hero/orb-poster.jpg?v=2026080623" alt="Oracle mark" width="900" height="900" loading="eager" fetchpriority="high" decoding="async">
763
1200
  </div>
764
- </div>
765
- </div>
766
- </div>
767
- </section>
768
-
769
- <section class="section cli-section" id="cli">
770
- <p class="section-label rv">Oracle CLI</p>
771
- <h2 class="section-title rv">One surface. <em>Every chain.</em></h2>
772
- <div class="cli-install rv">
773
- <div class="cli-install-cmd"><code>npm i -g @oracle-agent/oracle</code></div>
774
- <p class="cli-install-gate"><b>Locals Only access</b> Oracle unlocks when your agent wallet, or a wallet you import, holds a <a href="https://opensea.io/collection/locals-only-hyperevm" target="_blank" rel="noopener noreferrer">Locals Only</a> NFT.</p>
775
- </div>
776
- <p class="section-lede rv">The real Oracle shell, isolated from desktop chrome. Pin the active surface with <code style="color:var(--blue2)">/chain hyperliquid</code>, switch models with <code style="color:var(--blue2)">/model</code>, then ask naturally.</p>
777
- <div class="convert-grid rv">
778
- <div>
779
- <figure class="cli-frame">
780
- <img src="assets/cli-chain-hyperliquid.jpg?v=cli-visible" alt="Oracle CLI selecting Hyperliquid with the /chain hyperliquid command" width="1600" height="900" loading="eager" fetchpriority="high" />
1201
+ <figcaption>the future is agentic</figcaption>
781
1202
  </figure>
782
- <p class="cli-cap">actual oracle shell // /chain hyperliquid</p>
783
1203
  </div>
784
- <div class="convert-copy">
785
- <h3>The actual Oracle CLI</h3>
786
- <p>The active chain follows each read, quote, prepare, and bounded execution path.</p>
787
- <div class="convert-pills">
788
- <span>HyperCore + HyperEVM</span>
789
- <span>multichain routing</span>
790
- <span>self-custody</span>
791
- </div>
792
- <p class="platform-beta"><b>Beta</b> Linux, Windows, and macOS desktop apps are in beta and not yet downloadable. The CLI runs on all three today.</p>
793
- <div class="cli-code">
794
- <div><b>oracle ›</b> /chain hyperliquid</div>
795
- <div><b>oracle ›</b> /chain show</div>
796
- <div><b>oracle ›</b> what can you do on hyperliquid?</div>
797
- </div>
1204
+
1205
+ <div class="home-stats rv" aria-label="Oracle surface metrics">
1206
+ <div class="home-stat"><b id="hero-protocol-count" data-count="110">110</b><span>protocol entries wired</span></div>
1207
+ <div class="home-stat"><b id="hero-provider-count" data-count="70">70</b><span>data providers</span></div>
1208
+ <div class="home-stat"><b id="hero-op-count" data-count="322">322</b><span>data operations</span></div>
1209
+ <div class="home-stat"><b id="hero-chain-count">13 + EVM</b><span>chains wired</span></div>
798
1210
  </div>
799
1211
  </div>
800
1212
  </section>
801
-
802
1213
  <section class="section" id="orchestration">
803
1214
  <p class="section-label rv">Profiles</p>
804
1215
  <h2 class="section-title rv">Multi-profile. <em>Customizable.</em></h2>
@@ -886,27 +1297,33 @@ footer{margin-top:clamp(72px,12vh,120px);border-top:1px solid var(--line);paddin
886
1297
  <div class="node route p-sol">
887
1298
  <div class="tag">profile</div>
888
1299
  <div class="name">solana agent</div>
889
- <div class="sub">jup · nfts · dexs</div>
1300
+ <div class="sub">jup · lst · lending · mev</div>
890
1301
  <div class="chains"><span class="ch">Solana <img src="https://icons.llamao.fi/icons/chains/rsz_solana?w=24&h=24" alt="" loading="lazy"></span></div>
891
1302
  </div>
892
1303
  <div class="node route p-btc">
893
1304
  <div class="tag">profile</div>
894
1305
  <div class="name">bitcoin agent</div>
895
- <div class="sub">ord · runes · research</div>
1306
+ <div class="sub">ord · runes · staking · lightning</div>
896
1307
  <div class="chains"><span class="ch">Bitcoin <img src="https://icons.llamao.fi/icons/chains/rsz_bitcoin?w=24&h=24" alt="" loading="lazy"></span><span class="ch">inscriptions</span></div>
897
1308
  </div>
898
- <div class="node route p-evm">
899
- <div class="tag">profile</div>
900
- <div class="name">evm / bridge agent</div>
901
- <div class="sub">swaps · bridges · defi</div>
902
- <div class="chains"><span class="ch">ETH <img src="https://icons.llamao.fi/icons/chains/rsz_ethereum?w=24&h=24" alt="" loading="lazy"></span><span class="ch">Base <img src="https://icons.llamao.fi/icons/chains/rsz_base?w=24&h=24" alt="" loading="lazy"></span><span class="ch">Arb <img src="https://icons.llamao.fi/icons/chains/rsz_arbitrum?w=24&h=24" alt="" loading="lazy"></span><span class="ch">OP <img src="https://icons.llamao.fi/icons/chains/rsz_optimism?w=24&h=24" alt="" loading="lazy"></span><span class="ch">BNB <img src="https://icons.llamao.fi/icons/chains/rsz_binance?w=24&h=24" alt="" loading="lazy"></span><span class="ch">Avax <img src="https://icons.llamao.fi/icons/chains/rsz_avalanche?w=24&h=24" alt="" loading="lazy"></span></div>
903
- </div>
904
1309
  <div class="node route p-stable">
905
1310
  <div class="tag">profile</div>
906
1311
  <div class="name">stable agent</div>
907
1312
  <div class="sub">launches · memecoins</div>
908
1313
  <div class="chains"><span class="ch">Stable <img src="https://icons.llamao.fi/icons/chains/rsz_stable?w=24&h=24" alt="" loading="lazy"></span></div>
909
1314
  </div>
1315
+ <div class="node route p-base">
1316
+ <div class="tag">profile</div>
1317
+ <div class="name">base agent</div>
1318
+ <div class="sub">swaps · defi · onchain apps</div>
1319
+ <div class="chains"><span class="ch">Base <img src="https://icons.llamao.fi/icons/chains/rsz_base?w=24&h=24" alt="" loading="lazy"></span></div>
1320
+ </div>
1321
+ <div class="node route p-evm">
1322
+ <div class="tag">profile</div>
1323
+ <div class="name">evm / bridge agent</div>
1324
+ <div class="sub">swaps · bridges · lending · restaking</div>
1325
+ <div class="chains"><span class="ch">ETH <img src="https://icons.llamao.fi/icons/chains/rsz_ethereum?w=24&h=24" alt="" loading="lazy"></span><span class="ch">Arb <img src="https://icons.llamao.fi/icons/chains/rsz_arbitrum?w=24&h=24" alt="" loading="lazy"></span><span class="ch">OP <img src="https://icons.llamao.fi/icons/chains/rsz_optimism?w=24&h=24" alt="" loading="lazy"></span><span class="ch">BNB <img src="https://icons.llamao.fi/icons/chains/rsz_binance?w=24&h=24" alt="" loading="lazy"></span><span class="ch">Avax <img src="https://icons.llamao.fi/icons/chains/rsz_avalanche?w=24&h=24" alt="" loading="lazy"></span><span class="ch">Polygon <img src="https://icons.llamao.fi/icons/chains/rsz_polygon?w=24&h=24" alt="" loading="lazy"></span><span class="ch">Abstract <img src="https://icons.llamao.fi/icons/chains/rsz_abstract?w=24&h=24" alt="" loading="lazy"></span><span class="ch ch-add" title="Any EVM chain: register a chainId and RPC, no code change">+ any EVM chain</span></div>
1326
+ </div>
910
1327
  </div>
911
1328
 
912
1329
  <div class="wires funnel" aria-hidden="true">
@@ -934,6 +1351,8 @@ footer{margin-top:clamp(72px,12vh,120px);border-top:1px solid var(--line);paddin
934
1351
  </div>
935
1352
  </div>
936
1353
 
1354
+
1355
+
937
1356
  <div class="route-strip">
938
1357
  <article class="route-card p-poly">
939
1358
  <div class="where">polymarket agent →</div>
@@ -969,7 +1388,7 @@ footer{margin-top:clamp(72px,12vh,120px);border-top:1px solid var(--line);paddin
969
1388
  <article class="route-card p-sol">
970
1389
  <div class="where">solana agent →</div>
971
1390
  <h3>Solana <img src="https://icons.llamao.fi/icons/chains/rsz_solana?w=40&h=40" alt="Solana" loading="lazy"></h3>
972
- <p>Swaps, research, Jupiter routes. The bounded lane decodes every instruction and bans delegation ops outright.</p>
1391
+ <p>Jupiter routes, Sanctum liquid-staking tokens, Solend lending, Kamino strategies, Meteora DLMM, Jito MEV, and Pyth feeds. The bounded lane decodes every instruction and bans delegation ops outright.</p>
973
1392
  <div class="chips">
974
1393
  <span class="chip-s">Jupiter</span>
975
1394
  <span class="chip-s">swaps</span>
@@ -979,7 +1398,7 @@ footer{margin-top:clamp(72px,12vh,120px);border-top:1px solid var(--line);paddin
979
1398
  <article class="route-card p-btc">
980
1399
  <div class="where">bitcoin agent →</div>
981
1400
  <h3>Bitcoin <img src="https://icons.llamao.fi/icons/chains/rsz_bitcoin?w=40&h=40" alt="Bitcoin" loading="lazy"></h3>
982
- <p>Ordinals, runes, and BTC research. Every PSBT input carries proven provenance, so fees are computed, not asserted.</p>
1401
+ <p>Ordinals, runes, Babylon staking, Lightning topology, mining economics, and the Liquid and Stacks sidechains. Every PSBT input carries proven provenance, so fees are computed, not asserted.</p>
983
1402
  <div class="chips">
984
1403
  <span class="chip-s">ordinals</span>
985
1404
  <span class="chip-s">runes</span>
@@ -989,7 +1408,7 @@ footer{margin-top:clamp(72px,12vh,120px);border-top:1px solid var(--line);paddin
989
1408
  <article class="route-card p-evm">
990
1409
  <div class="where">evm / bridge agent →</div>
991
1410
  <h3>Multi-chain EVM <img src="https://icons.llamao.fi/icons/chains/rsz_ethereum?w=40&h=40" alt="Ethereum" loading="lazy"></h3>
992
- <p>DEX routes, LI.FI and Relay bridges, DeFi across ETH and L2s. Bounded evm-swap and evm-bridge lanes.</p>
1411
+ <p>Multi-chain routes, LI.FI and Relay bridges, Aave lending, Spark, Beefy, Symbiotic restaking, and CoW solver auctions. Bounded evm-swap and evm-bridge lanes.</p>
993
1412
  <div class="chips">
994
1413
  <span class="chip-s">evm-swap</span>
995
1414
  <span class="chip-s">evm-bridge</span>
@@ -1028,12 +1447,15 @@ footer{margin-top:clamp(72px,12vh,120px);border-top:1px solid var(--line);paddin
1028
1447
  </div>
1029
1448
  </article>
1030
1449
  </div>
1031
-
1032
1450
  <div class="why-band">
1033
1451
  <p>The model proposes. Policy bounds. You own signatures. Multi-profile desks route each request to the right surface. Vaults, perps, bridges, and protocol scaffolds, not just swaps. Empty allowlists refuse everything until you configure them.</p>
1034
1452
  </div>
1035
1453
  </div>
1036
1454
 
1455
+ <div class="band-head rv">
1456
+ <p class="eyebrow">Custody</p>
1457
+ <h2>The wallet stays yours.</h2>
1458
+ </div>
1037
1459
  <div class="moat-grid rv" style="margin-top:28px">
1038
1460
  <article class="moat-card">
1039
1461
  <div class="n">bound grants</div>
@@ -1046,28 +1468,144 @@ footer{margin-top:clamp(72px,12vh,120px);border-top:1px solid var(--line);paddin
1046
1468
  <p>hl, poly, evm-swap, evm-bridge, btc, sol. Each decodes its own envelope, proves every value-moving field, and refuses while its allowlists are empty.</p>
1047
1469
  </article>
1048
1470
  <article class="moat-card">
1049
- <div class="n">receipts</div>
1050
- <h3>Every action ends in a receipt</h3>
1051
- <p>Prepared actions ship as stamped, hash-bound envelopes. Money claims end in tx hash, receipt status, balance delta, and allowance state. No “looks filled.”</p>
1052
- </article>
1053
- <article class="moat-card">
1054
- <div class="n">simulation</div>
1055
- <h3>Show the work before you sign</h3>
1056
- <p>minOut, impact, spender, and decoded calldata before approval. Export unsigned artifacts for hardware wallets.</p>
1057
- </article>
1058
- <article class="moat-card">
1059
- <div class="n">allowlists</div>
1060
- <h3>Where money may land</h3>
1061
- <p>Destination allowlists stop silent router drift. New contracts stay blocked until you add them.</p>
1471
+ <div class="n">evidence</div>
1472
+ <h3>Decoded before you sign, receipted after</h3>
1473
+ <p>minOut, impact, spender, and decoded calldata before approval; tx hash, receipt status, balance delta, and allowance state after. Unsigned artifacts export to hardware wallets. No “looks filled.”</p>
1062
1474
  </article>
1063
1475
  <article class="moat-card">
1064
1476
  <div class="n">fail closed</div>
1065
1477
  <h3>Unconfigured means refused</h3>
1066
- <p>A fresh install signs nothing. Every lane refuses while its allowlists are empty, so nothing moves until you set the bounds.</p>
1478
+ <p>A fresh install signs nothing. Destination allowlists stop silent router drift, and every lane refuses while its allowlists are empty, so new contracts stay blocked until you add them.</p>
1067
1479
  </article>
1068
1480
  </div>
1069
1481
 
1070
- <div class="strategy-surface rv" id="strategies" aria-labelledby="strategies-title">
1482
+ <div class="selfcustody rv">
1483
+ <p class="section-label rv">Works in any harness</p>
1484
+ <h2 class="section-title rv" data-split>Ask in <em>your</em> agent.</h2>
1485
+ <p class="section-lede rv">Oracle installs as an MCP server, so the agent you already use gets 110 protocol entries across 13 chains. Type the request the way you would say it. Oracle reads state, prices routes and prepares the transaction. You sign.</p>
1486
+ <div class="agent-install rv">
1487
+ <span>Add Oracle to your agent:</span>
1488
+ <div class="install-cmds">
1489
+ <button class="btn btn-claude" onclick="navigator.clipboard.writeText('oracle mcp install claude-code');var b=this;b.textContent='Copied ✓';setTimeout(function(){b.textContent='Claude'},1500)">Claude</button>
1490
+ <button class="btn btn-chatgpt" onclick="navigator.clipboard.writeText('oracle mcp install chatgpt');var b=this;b.textContent='Copied ✓';setTimeout(function(){b.textContent='ChatGPT'},1500)">ChatGPT</button>
1491
+ <button class="btn btn-cursor" onclick="navigator.clipboard.writeText('oracle mcp install cursor');var b=this;b.textContent='Copied ✓';setTimeout(function(){b.textContent='Cursor'},1500)">Cursor</button>
1492
+ <button class="btn btn-vscode" onclick="navigator.clipboard.writeText('oracle mcp install vscode');var b=this;b.textContent='Copied ✓';setTimeout(function(){b.textContent='VS Code'},1500)">VS Code</button>
1493
+ <button class="btn btn-copilot" onclick="navigator.clipboard.writeText('oracle mcp install copilot');var b=this;b.textContent='Copied ✓';setTimeout(function(){b.textContent='Copilot'},1500)">Copilot</button>
1494
+ </div>
1495
+ <p class="cmd-hint">Click copies the install command — paste it in your terminal</p>
1496
+ </div>
1497
+ <div class="agent-prompts rv">
1498
+ <figure class="agent-panel is-claude" data-agent-seq
1499
+ data-ask="is this token safe to buy on base?">
1500
+ <div class="agent-box">
1501
+ <div class="agent-line"><span class="agent-typed" data-ph="Do anything"></span><span class="agent-caret"></span></div>
1502
+ <div class="agent-bar">
1503
+ <svg class="ai" viewBox="0 0 24 24" aria-hidden="true"><path d="M12 5v14M5 12h14"/></svg>
1504
+ <span class="ca-access"><svg class="ai" viewBox="0 0 24 24" aria-hidden="true"><path d="M8.2 3h7.6L21 8.2v7.6L15.8 21H8.2L3 15.8V8.2z"/><path d="M12 8v5"/><path d="M12 16.2v.1"/></svg>Full access</span>
1505
+ <span class="agent-spacer"></span>
1506
+ <span class="ca-model"><b>5.6 Sol</b><span>Extra High</span><svg class="ai" viewBox="0 0 24 24" aria-hidden="true"><path d="M6 9l6 6 6-6"/></svg></span>
1507
+ <svg class="ai" viewBox="0 0 24 24" aria-hidden="true"><rect x="9" y="3" width="6" height="11" rx="3"/><path d="M5 11a7 7 0 0 0 14 0M12 18v3"/></svg>
1508
+ <span class="ca-orb"><svg viewBox="0 0 24 24" aria-hidden="true"><path d="M5 10v4M9 6v12M13 8v8M17 10v4M21 11v2"/></svg></span>
1509
+ </div>
1510
+ </div>
1511
+ <p class="agent-out" hidden><b>PASS</b> metadata &middot; <b>PASS</b> liquidity &middot; <b>PASS</b> sellable &middot; unknown is not pass</p>
1512
+ <noscript><p class="agent-ask">is this token safe to buy on base?</p></noscript>
1513
+ </figure>
1514
+ <figure class="agent-panel is-codex" data-agent-seq
1515
+ data-ask="move 5k usdc into weth, cheapest route">
1516
+ <div class="cx-chips">
1517
+ <span class="cx-chip"><svg class="ai" viewBox="0 0 24 24" aria-hidden="true"><rect x="3" y="5" width="18" height="12" rx="2"/><path d="M2 20h20"/></svg>Local</span>
1518
+ <span class="cx-chip"><svg class="ai" viewBox="0 0 24 24" aria-hidden="true"><path d="M3 7a2 2 0 0 1 2-2h4l2 2h8a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"/></svg>clawd-local</span>
1519
+ <span class="cx-chip cx-sq"><svg class="ai" viewBox="0 0 24 24" aria-hidden="true"><path d="M3 7a2 2 0 0 1 2-2h4l2 2h8a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"/><path d="M12 11v5M9.5 13.5h5"/></svg></span>
1520
+ </div>
1521
+ <div class="agent-box">
1522
+ <div class="agent-line"><span class="agent-typed" data-ph="Describe a task or ask a question"></span><span class="agent-caret"></span></div>
1523
+ <svg class="ai cx-return" viewBox="0 0 24 24" aria-hidden="true"><path d="M20 6v5a3 3 0 0 1-3 3H5"/><path d="M8 11l-3 3 3 3"/></svg>
1524
+ </div>
1525
+ <div class="agent-bar">
1526
+ <span class="cx-auto">Auto</span>
1527
+ <svg class="ai" viewBox="0 0 24 24" aria-hidden="true"><path d="M12 5v14M5 12h14"/></svg>
1528
+ <svg class="ai" viewBox="0 0 24 24" aria-hidden="true"><rect x="9" y="3" width="6" height="11" rx="3"/><path d="M5 11a7 7 0 0 0 14 0M12 18v3"/></svg>
1529
+ <svg class="ai" viewBox="0 0 24 24" aria-hidden="true"><path d="M6 9l6 6 6-6"/></svg>
1530
+ <span class="agent-spacer"></span>
1531
+ <span class="cx-model">Fable 5</span>
1532
+ <span class="cx-eff">High</span>
1533
+ <span class="cx-ring"></span>
1534
+ </div>
1535
+ <p class="agent-out" hidden>best route across 5 aggregators &middot; quoted live &middot; <b>unsigned</b> &mdash; your wallet signs</p>
1536
+ <noscript><p class="agent-ask">move 5k usdc into weth, cheapest route</p></noscript>
1537
+ </figure>
1538
+ </div>
1539
+ <p class="agent-caption rv">Same tool from the terminal, the desktop app, or any MCP client. Prepare-only everywhere: Oracle never holds your keys.</p>
1540
+ <div class="venues rv">
1541
+ <div class="venues-head"><span>models // harnesses</span><span><b>bring your own model</b> · oracle is the control plane</span></div>
1542
+ <div class="marquee"><div class="track" id="llm-track"></div></div>
1543
+ </div>
1544
+
1545
+ <p class="section-label rv">Self-custodial agents</p>
1546
+ <h2 class="section-title rv">No third party holds your keys. Not even Oracle.</h2>
1547
+ <div class="selfcustody-grid">
1548
+ <div>
1549
+ <h4>Everything runs on your machine</h4>
1550
+ <p>The CLI and the desktop app are the whole product. There is no Oracle account, no hosted wallet, and no server that brokers your trades. Reads go straight from your machine to public RPCs and venue APIs.</p>
1551
+ </div>
1552
+ <div>
1553
+ <h4>Your keys never reach Oracle</h4>
1554
+ <p>The shipped package contains no signer, no vault, and no key material. Whatever key you use stays where you already keep it, in your wallet extension or on your hardware device, under that tool&rsquo;s own protection. A boundary test walks the real import graph on every build and fails if a public module so much as reaches toward signer code.</p>
1555
+ </div>
1556
+ <div>
1557
+ <h4>Your wallet signs, not Oracle</h4>
1558
+ <p>Oracle prepares an unsigned transaction and hands it to your browser extension or hardware wallet. It cannot broadcast. If you close the prompt, nothing happened.</p>
1559
+ </div>
1560
+ <div>
1561
+ <h4>Nothing to seize, nothing to leak</h4>
1562
+ <p>No custody means no honeypot. There is no server holding user keys to breach, no operator who can freeze you, and no counterparty risk from Oracle itself. Delete the app and your funds never moved.</p>
1563
+ </div>
1564
+ </div>
1565
+ </div>
1566
+
1567
+
1568
+ <div class="motion-lab rv" aria-label="Oracle high-end operator stack">
1569
+ <aside class="atlas-sticky motion-command" aria-label="Oracle runtime metrics">
1570
+ <div class="atlas-orbit" aria-hidden="true">
1571
+ <div class="orbital">
1572
+ <svg viewBox="0 0 100 100">
1573
+ <g class="ring r1"><ellipse cx="50" cy="50" rx="46" ry="16"/></g>
1574
+ <g class="ring r2"><ellipse cx="50" cy="50" rx="46" ry="16" transform="rotate(60 50 50)"/></g>
1575
+ <g class="ring r3"><ellipse cx="50" cy="50" rx="46" ry="16" transform="rotate(120 50 50)"/></g>
1576
+ <circle class="tickring" cx="50" cy="50" r="32"/>
1577
+ <circle class="halo" cx="50" cy="50" r="10"/>
1578
+ <circle class="core" cx="50" cy="50" r="7.5"/>
1579
+ </svg>
1580
+ </div>
1581
+ </div>
1582
+ <div class="atlas-copy">
1583
+ <div class="atlas-count"><span id="atlas-protocol-count">110</span></div>
1584
+ <p class="atlas-sub">Source-backed roster stays in the runtime. The landing page shows the control system, not a grocery list.</p>
1585
+ <div class="atlas-ledger">
1586
+ <div><span>quote / route</span><b id="atlas-route-count">0</b></div>
1587
+ <div><span>prepare / policy</span><b id="atlas-prepare-count">0</b></div>
1588
+ <div><span>chains</span><b id="atlas-chain-count">13 + EVM</b></div>
1589
+ <div><span>custody</span><b>self</b></div>
1590
+ </div>
1591
+ </div>
1592
+ </aside>
1593
+ <div class="motion-main">
1594
+ <div class="toolbelt" aria-label="What the operator stack does">
1595
+ <span>read state</span><span>price routes</span><span>prepare unsigned</span><span>enforce policy</span><span>you sign</span>
1596
+ </div>
1597
+ <div class="operator-grid" id="protocol-atlas-grid" aria-live="polite"></div>
1598
+ </div>
1599
+ </div>
1600
+ <div class="venues rv">
1601
+ <div class="venues-head"><span>protocols // venues</span></div>
1602
+ <div class="marquee"><div class="track" id="proto-track-a"></div></div>
1603
+ <div class="marquee rev"><div class="track" id="proto-track-b"></div></div>
1604
+ </div>
1605
+ </section>
1606
+
1607
+
1608
+ <div class="strategy-surface rv" id="strategies" aria-labelledby="strategies-title">
1071
1609
  <div class="strategy-head">
1072
1610
  <div>
1073
1611
  <div class="strategy-kicker">Agentic strategies</div>
@@ -1075,6 +1613,61 @@ footer{margin-top:clamp(72px,12vh,120px);border-top:1px solid var(--line);paddin
1075
1613
  </div>
1076
1614
  <p>Oracle reads the position, models the route and costs, then prepares only the steps the selected lane can actually support.</p>
1077
1615
  </div>
1616
+ <figure class="route-proof rv">
1617
+ <video id="route-session" width="868" height="456"
1618
+ poster="assets/hero/route-session-poster.jpg"
1619
+ muted loop playsinline preload="none"
1620
+ aria-label="Recorded Oracle session pricing one swap across five venues and ranking them net of cost">
1621
+ <source src="assets/hero/route-session.webm" type="video/webm">
1622
+ <source src="assets/hero/route-session.mp4" type="video/mp4">
1623
+ </video>
1624
+ <img id="route-still" src="assets/hero/route-session-poster.jpg" alt="Oracle pricing a swap across paraswap, cow, uniswap-v3, lifi and uniswap-v4, ranked net of cost" width="868" height="456" loading="lazy" decoding="async">
1625
+ <figcaption>one swap, five venues, ranked net of cost</figcaption>
1626
+ </figure>
1627
+ <figure class="route-proof rv" style="margin-top:18px">
1628
+ <svg viewBox="0 0 868 456" preserveAspectRatio="xMidYMid meet" class="route-tree" aria-label="Oracle routing tree">
1629
+ <style>
1630
+ .route-tree line { stroke-dasharray: 20 8; animation: flow-down 3s linear infinite; opacity:1; }
1631
+ @keyframes flow-down { to { stroke-dashoffset: -56; } }
1632
+ </style>
1633
+ <defs>
1634
+ <marker id="arrow-t2" markerWidth="8" markerHeight="6" refX="0" refY="3" orient="auto"><path d="M0 0l8 3L0 6z" fill="var(--blue)" opacity=".8"/></marker>
1635
+ </defs>
1636
+ <rect x="334" y="30" width="200" height="40" rx="8" fill="rgba(124,196,255,.1)" stroke="var(--blue)" stroke-width="1.5"/>
1637
+ <text x="434" y="55" text-anchor="middle" fill="var(--warm)" font-family="var(--mono)" font-size="13">oracle route swap</text>
1638
+ <line x1="434" y1="70" x2="434" y2="110" stroke="var(--blue)" stroke-width="2" opacity=".8"/>
1639
+ <line x1="434" y1="110" x2="110" y2="160" stroke="var(--blue)" stroke-width="1.5" marker-end="url(#arrow-t2)" opacity=".8"/>
1640
+ <line x1="434" y1="110" x2="270" y2="160" stroke="var(--blue)" stroke-width="1.5" marker-end="url(#arrow-t2)" opacity=".8"/>
1641
+ <line x1="434" y1="110" x2="434" y2="160" stroke="var(--blue)" stroke-width="1.5" marker-end="url(#arrow-t2)" opacity=".8"/>
1642
+ <line x1="434" y1="110" x2="598" y2="160" stroke="var(--blue)" stroke-width="1.5" marker-end="url(#arrow-t2)" opacity=".8"/>
1643
+ <line x1="434" y1="110" x2="758" y2="160" stroke="var(--blue)" stroke-width="1.5" marker-end="url(#arrow-t2)" opacity=".8"/>
1644
+ <rect x="35" y="170" width="150" height="34" rx="7" fill="rgba(124,196,255,.08)" stroke="rgba(124,196,255,.25)" stroke-width="1"/>
1645
+ <text x="110" y="192" text-anchor="middle" fill="var(--blue2)" font-family="var(--mono)" font-size="12">paraswap</text>
1646
+ <rect x="195" y="170" width="150" height="34" rx="7" fill="rgba(124,196,255,.08)" stroke="rgba(124,196,255,.25)" stroke-width="1"/>
1647
+ <text x="270" y="192" text-anchor="middle" fill="var(--blue2)" font-family="var(--mono)" font-size="12">cow protocol</text>
1648
+ <rect x="359" y="170" width="150" height="34" rx="7" fill="rgba(124,196,255,.08)" stroke="rgba(124,196,255,.25)" stroke-width="1"/>
1649
+ <text x="434" y="192" text-anchor="middle" fill="var(--blue2)" font-family="var(--mono)" font-size="12">uniswap v3</text>
1650
+ <rect x="523" y="170" width="150" height="34" rx="7" fill="rgba(124,196,255,.08)" stroke="rgba(124,196,255,.25)" stroke-width="1"/>
1651
+ <text x="598" y="192" text-anchor="middle" fill="var(--blue2)" font-family="var(--mono)" font-size="12">lifi</text>
1652
+ <rect x="683" y="170" width="150" height="34" rx="7" fill="rgba(124,196,255,.08)" stroke="rgba(124,196,255,.25)" stroke-width="1"/>
1653
+ <text x="758" y="192" text-anchor="middle" fill="var(--blue2)" font-family="var(--mono)" font-size="12">uniswap v4</text>
1654
+ <line x1="110" y1="204" x2="110" y2="240" stroke="var(--blue)" stroke-width="1.5" opacity=".6"/>
1655
+ <line x1="270" y1="204" x2="270" y2="240" stroke="var(--blue)" stroke-width="1.5" opacity=".6"/>
1656
+ <line x1="434" y1="204" x2="434" y2="240" stroke="var(--blue)" stroke-width="1.5" opacity=".6"/>
1657
+ <line x1="598" y1="204" x2="598" y2="240" stroke="var(--blue)" stroke-width="1.5" opacity=".6"/>
1658
+ <line x1="758" y1="204" x2="758" y2="240" stroke="var(--blue)" stroke-width="1.5" opacity=".6"/>
1659
+ <rect x="334" y="248" width="200" height="40" rx="8" fill="rgba(124,196,255,.15)" stroke="var(--blue)" stroke-width="1.5"/>
1660
+ <text x="434" y="271" text-anchor="middle" fill="var(--warm)" font-family="var(--mono)" font-size="12">ranked net of cost</text>
1661
+ <line x1="110" y1="240" x2="434" y2="248" stroke="var(--blue)" stroke-width="1.5" opacity=".5"/>
1662
+ <line x1="270" y1="240" x2="434" y2="248" stroke="var(--blue)" stroke-width="1.5" opacity=".5"/>
1663
+ <line x1="434" y1="240" x2="434" y2="248" stroke="var(--blue)" stroke-width="1.5" opacity=".5"/>
1664
+ <line x1="598" y1="240" x2="434" y2="248" stroke="var(--blue)" stroke-width="1.5" opacity=".5"/>
1665
+ <line x1="758" y1="240" x2="434" y2="248" stroke="var(--blue)" stroke-width="1.5" opacity=".5"/>
1666
+ </svg>
1667
+ </figure>
1668
+
1669
+
1670
+
1078
1671
  <div class="strategy-grid">
1079
1672
  <article class="strategy-card">
1080
1673
  <div class="mode">read · model · prepare</div>
@@ -1099,17 +1692,49 @@ footer{margin-top:clamp(72px,12vh,120px);border-top:1px solid var(--line);paddin
1099
1692
  <article class="strategy-card">
1100
1693
  <div class="mode">discover · compare · prepare</div>
1101
1694
  <h4>Yield</h4>
1102
- <p>Rank lending, staking, vault and LP opportunities by net APY after fees, liquidity, lockups and smart-contract risk, then prepare supported deposits or migrations for your signature.</p>
1695
+ <p>Rank staking, vault and LP opportunities by net APY after fees, liquidity, lockups and smart-contract risk, then prepare supported deposits or migrations for your signature.</p>
1696
+ </article>
1697
+ <article class="strategy-card">
1698
+ <div class="mode">model · hedge · prepare</div>
1699
+ <h4>Farming methods</h4>
1700
+ <p>Six delta-aware playbooks, from stablecoin loops to collateral-plus-perp hedges and LP incentive hedges. Each one carries explicit exposure, hedge, monitoring and exit rules rather than a bare APR.</p>
1701
+ </article>
1702
+ <article class="strategy-card">
1703
+ <div class="mode">hedge · fund · rebalance</div>
1704
+ <h4>Delta neutral</h4>
1705
+ <p>Pair a spot or LP leg against a short perp so the position earns funding and fees without directional exposure. Oracle reads both legs, models funding, borrow and rebalance drag, then prepares each leg for your signature.</p>
1706
+ </article>
1707
+ <article class="strategy-card">
1708
+ <div class="mode">split · schedule · prepare</div>
1709
+ <h4>TWAP accumulate &amp; distribute</h4>
1710
+ <p>Buy or sell over time instead of in one print. Oracle splits the notional into scheduled child orders, prices each against live venue depth, and prepares them individually so a single fill never moves the market against you. Same engine for distribution — size each tranche, cap participation, keep every child order unsigned.</p>
1711
+ </article>
1712
+ <article class="strategy-card">
1713
+ <div class="mode">route · revoke · bridge</div>
1714
+ <h4>deBridge · ChangeNOW · LI.FI · revoke.cash</h4>
1715
+ <p>Bridge and cross-chain integration with deBridge, ChangeNOW, LI.FI, Squid, Stargate, THORChain, Bungee, Connext, Wormhole, and Across. Every route checks revoke.cash before execution — Oracle prepares the unsigned tx, you sign.</p>
1716
+ </article>
1717
+ <article class="strategy-card">
1718
+ <div class="mode">discover · score · rank</div>
1719
+ <h4>Live farm discovery</h4>
1720
+ <p>Scan live pools across chains and score each candidate on net APR after estimated borrow, funding and gas, minus a risk haircut for thin TVL. Ranked candidates feed straight into a prepare plan.</p>
1721
+ </article>
1722
+ <article class="strategy-card">
1723
+ <div class="mode">alert · shadow · notify</div>
1724
+ <h4>Custom alerts + shadow trading</h4>
1725
+ <p>Follow favorite chains, wallets, funds and deployer addresses, then get notified when one opens, rotates or exits. Run the playbook in shadow mode against live prices before you arm it for live execution.</p>
1103
1726
  </article>
1727
+
1104
1728
  </div>
1105
- <div class="strategy-posture"><b>Public posture:</b> research, simulation and unsigned preparation. MEV and flash-loan broadcast stays off; supported staking, LP and yield actions require the user wallet to sign.</div>
1106
- </div>
1107
- </section>
1729
+ <div class="strategy-posture"><b>Public posture:</b> research, simulation and unsigned preparation. MEV and flash-loan broadcast stays off; supported staking, LP, yield and farming actions require the user wallet to sign. Farm discovery reads live third-party yield data. Custom alerts and shadow loops notify or simulate first; live execution still requires arming and a user signature.</div>
1108
1730
 
1109
- <section class="section" id="chains">
1731
+ </div>
1732
+ </div>
1733
+
1734
+ <section class="section" id="chains">
1110
1735
  <p class="section-label rv">Chains</p>
1111
1736
  <h2 class="section-title rv">Where you can <em>operate.</em></h2>
1112
- <p class="section-lede rv">Live coverage grows with the profile mesh. Each chain maps to an agent, and new agents can join.</p>
1737
+ <p class="section-lede rv">Every chain reads live. <b>Route</b> means Oracle can also price and prepare a swap there; <b>read only</b> means the venue registry is still empty, so routing fail-closes rather than guessing a router. Any EVM chain can be registered with a chain id and an RPC.</p>
1113
1738
  <div class="chain-grid" id="chain-grid"></div>
1114
1739
  <div class="hl-surface rv">
1115
1740
  <div class="venues-head"><span>hyperliquid // what oracle actually does</span></div>
@@ -1121,19 +1746,42 @@ footer{margin-top:clamp(72px,12vh,120px);border-top:1px solid var(--line);paddin
1121
1746
  <article><h3>Account state</h3><p>Clearinghouse state, open orders, user fills, positions.</p></article>
1122
1747
  <article><h3>HyperEVM</h3><p>Token search and metadata on Hyperliquid, routed with the EVM lane.</p></article>
1123
1748
  </div>
1749
+ </div>
1750
+ </section>
1751
+ <section class="section cli-section" id="cli">
1752
+ <p class="section-label rv">Oracle CLI</p>
1753
+ <h2 class="section-title rv">One surface. <em>Every chain.</em></h2>
1754
+ <div class="cli-install rv">
1755
+ <div class="cli-install-cmd"><code>oracle</code> <span class="cli-install-hint">npm install -g @oracle-agent/oracle</span></div>
1756
+ <p class="cli-install-gate"><b>Locals Only</b> Holders get 0% Oracle fees. The CLI recognises your agent wallet and applies the holder rate automatically. The public package never touches keys.</p>
1124
1757
  </div>
1125
- <div class="venues rv">
1126
- <div class="venues-head"><span>protocols // venues</span></div>
1127
- <div class="marquee"><div class="track" id="proto-track-a"></div></div>
1128
- <div class="marquee rev"><div class="track" id="proto-track-b"></div></div>
1129
- </div>
1130
- <div class="venues rv">
1131
- <div class="venues-head"><span>models // harnesses</span><span><b>bring your own model</b> · oracle is the control plane</span></div>
1132
- <div class="marquee"><div class="track" id="llm-track"></div></div>
1758
+ <p class="section-lede rv">The real Oracle shell, isolated from desktop chrome. No accounts, no servers. The CLI runs on your machine and reads straight from public RPCs.</p>
1759
+ <p class="section-lede rv">Pin the active surface with <code style="color:var(--blue2)">/chain hyperliquid</code>, switch models, ask naturally. Oracle reads, prices, and prepares — you sign.</p>
1760
+ <div class="convert-grid rv">
1761
+ <div>
1762
+ <figure class="cli-frame cli-proof">
1763
+ <img id="cli-still" src="assets/cli-chain-hyperliquid.jpg?v=cli-visible" alt="Oracle CLI selecting Hyperliquid with the /chain hyperliquid command, showing the active surface: chain, chain id, agent, HyperCore and HyperEVM" width="1600" height="900" loading="eager" fetchpriority="high" />
1764
+ </figure>
1765
+ <p class="cli-cap">actual oracle shell</p>
1766
+ </div>
1767
+ <div class="convert-copy">
1768
+ <p>The active chain follows each read, quote, prepare, and bounded execution path.</p>
1769
+ <div class="convert-pills">
1770
+ <span>HyperCore + HyperEVM</span>
1771
+ <span>multichain routing</span>
1772
+ <span>self-custody</span>
1773
+ </div>
1774
+ <h2 class="section-title app-shot-title">Oracle Desktop App</h2>
1775
+ <figure class="app-shot">
1776
+ <img src="assets/desktop-app.jpg" width="1736" height="959" loading="lazy" decoding="async" alt="Oracle desktop app showing the specialist mesh, with Portfolio, Approvals, Prepare, CLI, Farming Methods, Agent Connect, Receipts, Campaigns and Routes panes.">
1777
+ <figcaption>Portfolio, approvals, prepare, farming, receipts and routes in one pane.</figcaption>
1778
+ </figure>
1779
+ <div class="os-dl"><a class="os-link" href="https://github.com/demi-hl/oracle/releases/download/v0.2.0/Oracle-0.2.0-arm64.dmg">macOS</a><a class="os-link" href="https://github.com/demi-hl/oracle/releases/download/v0.2.0/Oracle-0.2.0.AppImage">Linux</a><a class="os-link" href="https://github.com/demi-hl/oracle/releases/download/v0.2.0/Oracle-Setup-0.2.0.exe">Windows</a></div>
1780
+ </div>
1133
1781
  </div>
1134
- </section>
1782
+ </section>
1135
1783
 
1136
- <section class="section" id="custody" style="padding-top:clamp(48px,8vh,80px)">
1784
+ <section class="section" id="custody" style="padding-top:clamp(48px,8vh,80px)">
1137
1785
  <div class="strip-inner rv" style="border:1px solid var(--line);border-radius:16px;padding:22px 24px;display:flex;flex-wrap:wrap;gap:18px 28px;align-items:center;justify-content:space-between;background:linear-gradient(180deg, rgba(124,196,255,.05), transparent)">
1138
1786
  <div class="strip-left">
1139
1787
  <strong style="font-family:var(--display);font-weight:400;font-size:26px;display:block;margin-bottom:6px">You keep custody.</strong>
@@ -1144,10 +1792,10 @@ footer{margin-top:clamp(72px,12vh,120px);border-top:1px solid var(--line);paddin
1144
1792
  <span class="pill on" style="font-family:var(--mono);font-size:10px;letter-spacing:.16em;text-transform:uppercase;border:1px solid rgba(124,196,255,.35);border-radius:999px;padding:9px 12px;color:var(--blue)">Per-wallet limits</span>
1145
1793
  <span class="pill" style="font-family:var(--mono);font-size:10px;letter-spacing:.16em;text-transform:uppercase;border:1px solid var(--line);border-radius:999px;padding:9px 12px;color:var(--cool)">Revoke anytime</span>
1146
1794
  </div>
1147
- </div>
1148
- </section>
1149
- </main>
1795
+ </div>
1796
+ </section>
1150
1797
 
1798
+ <div class="mega-oracle rv" aria-hidden="true">oracle</div>
1151
1799
  <footer>
1152
1800
  <div class="foot-row">
1153
1801
  <div class="powered">
@@ -1161,10 +1809,13 @@ footer{margin-top:clamp(72px,12vh,120px);border-top:1px solid var(--line);paddin
1161
1809
  </div>
1162
1810
  <div class="foot-meta">
1163
1811
  <span>oracle · <a class="labs-link" href="https://demi.la">locals only labs</a></span>
1164
- <span>self custodial // the future is agentic</span>
1812
+ <span>self custodial // locals only labs</span>
1165
1813
  </div>
1166
1814
  </footer>
1167
1815
 
1816
+ <script src="https://cdn.jsdelivr.net/npm/gsap@3.13.0/dist/gsap.min.js"></script>
1817
+ <script src="https://cdn.jsdelivr.net/npm/gsap@3.13.0/dist/ScrollTrigger.min.js"></script>
1818
+ <script src="https://cdn.jsdelivr.net/npm/lenis@1.3.11/dist/lenis.min.js"></script>
1168
1819
  <script>
1169
1820
  (function () {
1170
1821
  "use strict";
@@ -1172,22 +1823,23 @@ footer{margin-top:clamp(72px,12vh,120px);border-top:1px solid var(--line);paddin
1172
1823
 
1173
1824
  var ICON = "https://icons.llamao.fi/icons/";
1174
1825
  var CHAINS = [
1175
- { name: "Ethereum", id: "1", logo: "chains/rsz_ethereum", note: "evm / bridge agent", badge: "live" },
1176
- { name: "Base", id: "8453", logo: "chains/rsz_base", note: "evm / bridge agent", badge: "live" },
1177
- { name: "Arbitrum", id: "42161", logo: "chains/rsz_arbitrum", note: "evm / bridge agent", badge: "live" },
1178
- { name: "Optimism", id: "10", logo: "chains/rsz_optimism", note: "evm / bridge agent", badge: "live" },
1179
- { name: "BNB Chain", id: "56", logo: "chains/rsz_binance", note: "evm / bridge agent", badge: "live" },
1180
- { name: "Avalanche", id: "43114", logo: "chains/rsz_avalanche", note: "evm / bridge agent", badge: "live" },
1181
- { name: "Hyperliquid", id: "999", logo: "chains/rsz_hyperliquid", note: "hyperliquid agent", badge: "live" },
1182
- { name: "Abstract", id: "2741", logo: "chains/rsz_abstract", note: "open / add agent", badge: "live" },
1183
- { name: "Stable", id: "988", logo: "chains/rsz_stable", note: "stable agent", badge: "live" },
1184
- { name: "Robinhood", id: "4663", logo: "chains/rsz_robinhood", note: "robinhood agent", badge: "live" },
1185
- { name: "Solana", id: "SOL", logo: "chains/rsz_solana", note: "solana agent", badge: "live" },
1186
- { name: "Bitcoin", id: "BTC", logo: "chains/rsz_bitcoin", note: "bitcoin agent", badge: "live" }
1826
+ { name: "Ethereum", id: "1", logo: "chains/rsz_ethereum", note: "evm / bridge agent", badge: "route" },
1827
+ { name: "Base", id: "8453", logo: "chains/rsz_base", note: "evm / bridge agent", badge: "route" },
1828
+ { name: "Arbitrum", id: "42161", logo: "chains/rsz_arbitrum", note: "evm / bridge agent", badge: "route" },
1829
+ { name: "Optimism", id: "10", logo: "chains/rsz_optimism", note: "evm / bridge agent", badge: "route" },
1830
+ { name: "BNB Chain", id: "56", logo: "chains/rsz_binance", note: "evm / bridge agent", badge: "route" },
1831
+ { name: "Avalanche", id: "43114", logo: "chains/rsz_avalanche", note: "evm / bridge agent", badge: "route" },
1832
+ { name: "Polygon", id: "137", logo: "chains/rsz_polygon", note: "evm / bridge agent", badge: "route" },
1833
+ { name: "Robinhood", id: "4663", logo: "chains/rsz_robinhood", note: "robinhood agent", badge: "route" },
1834
+ { name: "Hyperliquid", id: "999", logo: "chains/rsz_hyperliquid", note: "hyperliquid agent", badge: "route" },
1835
+ { name: "Abstract", id: "2741", logo: "chains/rsz_abstract", note: "open / add agent", badge: "route" },
1836
+ { name: "Stable", id: "988", logo: "chains/rsz_stable", note: "stable agent", badge: "route" },
1837
+ { name: "Solana", id: "SOL", logo: "chains/rsz_solana", note: "solana agent", badge: "route" },
1838
+ { name: "Bitcoin", id: "BTC", logo: "chains/rsz_bitcoin", note: "bitcoin agent", badge: "route" }
1187
1839
  ];
1188
1840
  document.getElementById("chain-grid").innerHTML = CHAINS.map(function (c) {
1189
- var cls = c.badge === "live" ? "badge live" : "badge";
1190
- var label = c.badge === "live" ? "live" : "read";
1841
+ var cls = c.badge === "route" ? "badge live" : "badge";
1842
+ var label = c.badge === "route" ? "route" : "read only";
1191
1843
  return '<article class="chain rv"><div class="chain-top"><div class="nm">' + c.name +
1192
1844
  ' <img src="' + ICON + c.logo + '?w=36&h=36" alt="' + c.name + ' logo" loading="lazy"></div></div><div class="meta"><span>' + c.note + '</span><span class="' + cls + '">' + label + '</span></div></article>';
1193
1845
  }).join("");
@@ -1200,7 +1852,7 @@ var BRAND = "brand/";
1200
1852
  { n: "Pancake V3", wm: "pancakeswap.svg", cap: "read + quote", u: "https://pancakeswap.finance/swap" },
1201
1853
  { n: "LFJ Liquidity Book", img: "lfj", cap: "read + quote", u: "https://lfj.gg/avalanche/trade" },
1202
1854
  { n: "Curve RouterNG", img: "curve", cap: "read + quote + prepare + policy", u: "https://curve.finance" },
1203
- { n: "Pendle Router", img: "pendle", cap: "read + quote + prepare + policy", u: "https://pendle.finance/" },
1855
+ { n: "Pendle Router", wm: "pendle.png", cap: "read + quote + prepare + policy", u: "https://pendle.finance/" },
1204
1856
  { n: "Morpho vaults", wm: "morpho.svg", cap: "read + deposit prepare", u: "https://app.morpho.org/" },
1205
1857
  { n: "Lido stETH", img: "lido", cap: "read + stake prepare + policy", u: "https://lido.fi/" },
1206
1858
  { n: "Kinetiq kHYPE", wm: "kinetiq.svg", tall: 1, cap: "read + quote + stake prepare + policy", u: "https://kinetiq.xyz/stake" },
@@ -1225,7 +1877,7 @@ var BRAND = "brand/";
1225
1877
  { n: "Lista CDP", img: "lista", cap: "read", u: "https://lista.org/" },
1226
1878
  { n: "Benqi Lending", img: "benqi", cap: "read", u: "https://benqi.fi" },
1227
1879
  { n: "Pharaoh V3", img: "pharaoh", cap: "read + quote", u: "https://www.phar.gg/" },
1228
- { n: "Polymarket", img: "polymarket", cap: "read", u: "https://polymarket.com/" },
1880
+ { n: "Polymarket", wm: "polymarket.png", cap: "read", u: "https://polymarket.com/" },
1229
1881
  { n: "XSY", img: "xsy", cap: "read", u: "https://xsy.fi" },
1230
1882
  { n: "Balancer V2", wm: "balancer.svg", cap: "read + quote", u: "https://balancer.fi/" },
1231
1883
  { n: "Harmonix", img: "harmonix", cap: "read + quote", u: "https://app.harmonix.fi/" },
@@ -1255,7 +1907,7 @@ var BRAND = "brand/";
1255
1907
  var PROTOS_B = [
1256
1908
  { n: "Uniswap V3 LP", img: "uniswap", cap: "preview + mint/collect prepare", u: "https://app.uniswap.org/" },
1257
1909
  { n: "Velodrome V2", wm: "velodrome.svg", cap: "read + quote", u: "https://velodrome.finance/" },
1258
- { n: "QuickSwap", img: "quickswap", cap: "read + quote", u: "https://quickswap.exchange/" },
1910
+ { n: "QuickSwap", wm: "quickswap.png", cap: "read + quote", u: "https://quickswap.exchange/" },
1259
1911
  { n: "HyperSwap V3", wm: "hyperswap.svg", cap: "read + quote", u: "https://app.hyperswap.exchange/" },
1260
1912
  { n: "Balancer V3", img: "balancer", cap: "read + quote + prepare + policy", u: "https://balancer.fi/" },
1261
1913
  { n: "Aave V3", img: "aave", cap: "read + supply/withdraw prepare + policy", u: "https://aave.com/" },
@@ -1303,7 +1955,7 @@ var PROTOS_B = [
1303
1955
  { n: "Folks Finance", img: "folks", cap: "read", u: "https://folks.finance/" },
1304
1956
  { n: "Velodrome V1", img: "velodrome", cap: "read + quote", u: "https://velodrome.finance/" },
1305
1957
  { n: "Looped Hype", img: "loopedhype", cap: "read + quote", u: "https://www.loopingcollective.org/" },
1306
- { n: "LI.FI", img: "lifi", cap: "read + route source", u: "https://li.fi/" },
1958
+ { n: "LI.FI", wm: "lifi.png", cap: "read + route source", u: "https://li.fi/" },
1307
1959
  { n: "Velora", img: "velora", cap: "read + route source", u: "https://app.velora.xyz" },
1308
1960
  { n: "CoW Swap", wm: "cowswap.svg", cap: "read + route source", u: "https://cow.fi/" },
1309
1961
  { n: "Across", wm: "across.svg", cap: "read + bridge route", u: "https://across.to" }
@@ -1319,6 +1971,7 @@ var PROTOS_B = [
1319
1971
  img.style.height = h.toFixed(1) + "px";
1320
1972
  }
1321
1973
  function wireMarks(root) {
1974
+ if (!root) return;
1322
1975
  root.querySelectorAll("img.wm").forEach(function (img) {
1323
1976
  if (img.complete) {
1324
1977
  if (!img.classList.contains("tall") && img.naturalWidth) normalizeMark(img);
@@ -1401,9 +2054,63 @@ var PROTOS_B = [
1401
2054
  return '<a class="chip wm-chip" href="' + x.u + '" target="_blank" rel="noopener noreferrer" aria-label="' + label + '">' + body + '</a>';
1402
2055
  }).join("");
1403
2056
  }
1404
- var visibleProtocols = Object.create(null);
1405
- document.getElementById("proto-track-a").innerHTML = chipRow(uniqueProtocols(PROTOS_A, visibleProtocols));
1406
- document.getElementById("proto-track-b").innerHTML = chipRow(uniqueProtocols(PROTOS_B, visibleProtocols));
2057
+ (function () {
2058
+ // Marquee is the BREADTH signal (every brand, moving). The per-tier chip
2059
+ // wall that used to sit below it was removed: this section states "110
2060
+ // protocol entries without the list wall", and printing all 110 names in
2061
+ // three stacked grids WAS the list wall.
2062
+ var marqueeSeen = Object.create(null);
2063
+ var trackA = document.getElementById("proto-track-a");
2064
+ var trackB = document.getElementById("proto-track-b");
2065
+ if (trackA) trackA.innerHTML = chipRow(uniqueProtocols(PROTOS_A, marqueeSeen));
2066
+ if (trackB) trackB.innerHTML = chipRow(uniqueProtocols(PROTOS_B, marqueeSeen));
2067
+ wireMarks(trackA);
2068
+ wireMarks(trackB);
2069
+ })();
2070
+
2071
+ function exactProtocolEntries() {
2072
+ var out = [];
2073
+ var seen = Object.create(null);
2074
+ PROTOS_A.concat(PROTOS_B).forEach(function (x) {
2075
+ var key = String(x.n).toLowerCase();
2076
+ if (seen[key]) return;
2077
+ seen[key] = true;
2078
+ out.push(x);
2079
+ });
2080
+ return out;
2081
+ }
2082
+ function renderProtocolAtlas() {
2083
+ var root = document.getElementById("protocol-atlas-grid");
2084
+ var entries = exactProtocolEntries();
2085
+ var routeCount = entries.filter(function (x) { return /quote|route|bridge/i.test(x.cap); }).length;
2086
+ var prepareCount = entries.filter(function (x) { return /prepare|policy|mint|collect|supply|withdraw|stake/i.test(x.cap); }).length;
2087
+ // The hero stat is animated from data-count, so only the atlas value is
2088
+ // written directly here -- otherwise this would stomp the count mid-flight.
2089
+ ["atlas-protocol-count"].forEach(function (id) { var el = document.getElementById(id); if (el) el.textContent = String(entries.length); });
2090
+ // Keep the hero target honest: if the protocol table grows, the number the
2091
+ // counter climbs to grows with it.
2092
+ var heroProto = document.getElementById("hero-protocol-count");
2093
+ if (heroProto) heroProto.setAttribute("data-count", String(entries.length));
2094
+ // Only the atlas count tracks the splash's own chain cards. The hero stat
2095
+ // reports the catalog's 21 wired chainIds, which is a different, larger set.
2096
+ ["atlas-chain-count"].forEach(function (id) { var el = document.getElementById(id); if (el) el.textContent = CHAINS.length + " + EVM"; });
2097
+ var r = document.getElementById("atlas-route-count"); if (r) r.textContent = String(routeCount);
2098
+ var pr = document.getElementById("atlas-prepare-count"); if (pr) pr.textContent = String(prepareCount);
2099
+ if (!root) return;
2100
+ var cards = [
2101
+ ["01", "State engine", "Portfolio, markets, positions, pools, NFTs, ordinals and venue state pulled before any action is proposed.", String(entries.length) + " sources"],
2102
+ ["02", "Route brain", "Quotes and bridges normalize into comparable intents, with slippage, destination and calldata shape surfaced before signing.", routeCount + " route-capable"],
2103
+ ["03", "Policy wall", "Every value-moving path passes local bounds: chain, spender, destination, amount, TTL and simulation posture.", prepareCount + " prepare paths"],
2104
+ ["04", "Wallet handoff", "Oracle prepares. Your wallet signs. Broadcast lives behind owner auth, armed state and receipts.", "self custody"],
2105
+ ["05", "Agent mesh", "Hyperliquid, Polymarket, Solana, Bitcoin, EVM, Stable, Robinhood Chain and protocol builder profiles stay separate.", CHAINS.length + " lanes"],
2106
+ ["06", "Builder layer", "New contracts, route modules and chain-specific scaffolds get generated with checks before deployment ever reaches a wallet.", "extendable"]
2107
+ ];
2108
+ root.innerHTML = cards.map(function (x) {
2109
+ return '<article class="motion-card"><div class="motion-scan"></div><div class="num">' + x[0] + '</div><h3>' + x[1] + '</h3><p>' + x[2] + '</p><div class="sig"><span>oracle</span><span>' + x[3] + '</span></div></article>';
2110
+ }).join("");
2111
+ }
2112
+ renderProtocolAtlas();
2113
+
1407
2114
 
1408
2115
  var LM = "assets/llms/";
1409
2116
  var LLMS = [
@@ -1426,8 +2133,6 @@ var PROTOS_B = [
1426
2133
  return '<a class="chip wm-chip" href="' + x.u + '" target="_blank" rel="noopener noreferrer" aria-label="' + x.n + '"><img class="' + cls + '" src="' + LM + x.wm + '" alt="' + x.n + '" decoding="async">' + (x.tall ? '<span class="wordmark">' + x.n + '</span>' : '') + '</a>';
1427
2134
  }).join("");
1428
2135
 
1429
- wireMarks(document.getElementById("proto-track-a"));
1430
- wireMarks(document.getElementById("proto-track-b"));
1431
2136
  wireMarks(document.getElementById("llm-track"));
1432
2137
  syncMarqueeVelocity();
1433
2138
  if (document.fonts && document.fonts.ready) document.fonts.ready.then(syncMarqueeVelocity);
@@ -1438,14 +2143,35 @@ var PROTOS_B = [
1438
2143
  });
1439
2144
 
1440
2145
  var loader = document.getElementById("loader");
1441
- var fill = document.getElementById("loader-fill");
1442
- requestAnimationFrame(function () { fill.style.width = "100%"; });
1443
2146
  window.addEventListener("load", function () {
1444
2147
  setTimeout(function () { loader.classList.add("out"); }, 650);
1445
2148
  });
1446
2149
 
1447
2150
  var reduced = window.matchMedia("(prefers-reduced-motion: reduce)").matches;
1448
2151
  var coarse = window.matchMedia("(pointer: coarse)").matches;
2152
+ var activeLenis = null;
2153
+
2154
+
2155
+ if (!reduced && !coarse) {
2156
+ document.querySelectorAll(".home-stat,.motion-card").forEach(function (card) {
2157
+ card.addEventListener("pointermove", function (ev) {
2158
+ var r = card.getBoundingClientRect();
2159
+ var x = (ev.clientX - r.left) / r.width;
2160
+ var y = (ev.clientY - r.top) / r.height;
2161
+ card.style.setProperty("--mx", (x * 100).toFixed(2) + "%");
2162
+ card.style.setProperty("--my", (y * 100).toFixed(2) + "%");
2163
+ if (card.classList.contains("motion-card")) {
2164
+ card.classList.add("is-hot");
2165
+ card.style.transform = "rotateX(" + ((.5 - y) * 5).toFixed(2) + "deg) rotateY(" + ((x - .5) * 7).toFixed(2) + "deg) translateY(-3px)";
2166
+ }
2167
+ });
2168
+ card.addEventListener("pointerleave", function () {
2169
+ if (!card.classList.contains("motion-card")) return;
2170
+ card.classList.remove("is-hot");
2171
+ card.style.transform = "";
2172
+ });
2173
+ });
2174
+ }
1449
2175
 
1450
2176
  var progress = document.getElementById("progress");
1451
2177
  var ticking = false;
@@ -1453,7 +2179,7 @@ var PROTOS_B = [
1453
2179
  if (ticking) return;
1454
2180
  ticking = true;
1455
2181
  requestAnimationFrame(function () {
1456
- var h = document.documentElement;
2182
+ var h = document.scrollingElement || document.documentElement;
1457
2183
  var max = h.scrollHeight - h.clientHeight;
1458
2184
  progress.style.transform = "scaleX(" + (max > 0 ? h.scrollTop / max : 0) + ")";
1459
2185
  ticking = false;
@@ -1498,9 +2224,65 @@ var PROTOS_B = [
1498
2224
  io.unobserve(e.target);
1499
2225
  }
1500
2226
  });
1501
- }, { threshold: 0.1, rootMargin: "0px 0px -6% 0px" });
2227
+ }, { threshold: 0.01, rootMargin: "0px 0px -2% 0px" });
1502
2228
  nodes.forEach(function (n) { io.observe(n); });
2229
+ setTimeout(function () {
2230
+ nodes.forEach(function (n) { n.classList.add("in"); n.classList.add("done"); });
2231
+ }, 2600);
2232
+ }
2233
+
2234
+ function splitWords(root) {
2235
+ root.querySelectorAll("[data-split]").forEach(function (el) {
2236
+ if (el.dataset.splitDone) return;
2237
+ el.dataset.splitDone = "1";
2238
+ el.innerHTML = el.textContent.split(/(\s+)/).map(function (w) {
2239
+ if (/^\s+$/.test(w)) return w;
2240
+ return '<span class="word-mask"><span>' + w + '</span></span>';
2241
+ }).join("");
2242
+ });
2243
+ }
2244
+ function initPremiumMotion() {
2245
+ if (reduced || coarse || !window.gsap) return;
2246
+ var gsap = window.gsap;
2247
+ if (window.ScrollTrigger) gsap.registerPlugin(window.ScrollTrigger);
2248
+ var LenisCtor = typeof window.Lenis === "function" ? window.Lenis : (window.Lenis && window.Lenis.Lenis);
2249
+ if (LenisCtor && window.ScrollTrigger) {
2250
+ activeLenis = new LenisCtor({ lerp:.08, smoothWheel:true, wheelMultiplier:.86 });
2251
+ activeLenis.on("scroll", window.ScrollTrigger.update);
2252
+ gsap.ticker.add(function (time) { activeLenis.raf(time * 1000); });
2253
+ gsap.ticker.lagSmoothing(0);
2254
+ }
2255
+ splitWords(document);
2256
+ if (window.ScrollTrigger) {
2257
+ gsap.fromTo("[data-split] .word-mask > span", { yPercent:112, rotate:2 }, { yPercent:0, rotate:0, duration:1.1, ease:"power4.out", stagger:.035, scrollTrigger:{ trigger:"#protocols", start:"top 78%" }, clearProps:"transform" });
2258
+ gsap.to(".hero-art", { yPercent:18, scale:.9, ease:"none", scrollTrigger:{ trigger:".home", start:"top top", end:"bottom top", scrub:true } });
2259
+ gsap.fromTo(".motion-card", { y:80, rotateX:8, scale:.965 }, { y:0, rotateX:0, scale:1, duration:1.25, ease:"power4.out", stagger:.08, scrollTrigger:{ trigger:".operator-grid", start:"top 82%" }, clearProps:"transform" });
2260
+ gsap.to(".motion-command", { y:-34, rotateX:3, ease:"none", scrollTrigger:{ trigger:".motion-lab", start:"top 70%", end:"bottom top", scrub:true } });
2261
+ gsap.to(".mega-oracle", { xPercent:-8, ease:"none", scrollTrigger:{ trigger:".mega-oracle", start:"top bottom", end:"bottom top", scrub:true } });
2262
+ }
2263
+ document.documentElement.classList.add("premium-motion");
2264
+ }
2265
+ initPremiumMotion();
2266
+
2267
+ function scrollToHash(hash) {
2268
+ var target = document.getElementById(hash.slice(1));
2269
+ if (!target) return false;
2270
+ var top = target.getBoundingClientRect().top + (document.scrollingElement || document.documentElement).scrollTop - 88;
2271
+ if (activeLenis && activeLenis.scrollTo) activeLenis.scrollTo(top, { duration: 1.05, easing: function (t) { return 1 - Math.pow(1 - t, 4); } });
2272
+ else window.scrollTo({ top: top, behavior: reduced ? "auto" : "smooth" });
2273
+ return true;
1503
2274
  }
2275
+ document.querySelectorAll('a[href^="#"]').forEach(function (a) {
2276
+ a.addEventListener("click", function (ev) {
2277
+ var hash = a.getAttribute("href");
2278
+ if (!hash || hash === "#") return;
2279
+ if (scrollToHash(hash)) {
2280
+ ev.preventDefault();
2281
+ history.replaceState(null, "", hash);
2282
+ }
2283
+ });
2284
+ });
2285
+ if (location.hash) setTimeout(function () { scrollToHash(location.hash); }, 60);
1504
2286
 
1505
2287
  var canvas = document.getElementById("gl");
1506
2288
  if (!canvas || reduced || coarse) return;
@@ -1564,5 +2346,192 @@ var PROTOS_B = [
1564
2346
  requestAnimationFrame(frame);
1565
2347
  })();
1566
2348
  </script>
2349
+ <script>
2350
+ (function(){
2351
+ var orb=document.getElementById("orb-video")||document.getElementById("hero-cli-video");
2352
+ if(orb){
2353
+ var showOrb=function(){orb.classList.add("ready");};
2354
+ if(orb.readyState>=2)showOrb();else orb.addEventListener("loadeddata",showOrb,{once:true});
2355
+ orb.addEventListener("error",function(){orb.style.display="none";},{once:true});
2356
+ var pl=orb.play&&orb.play();if(pl&&pl.catch)pl.catch(function(){});
2357
+ }
2358
+ var vids=[document.getElementById("route-session"),document.getElementById("risk-session")].filter(Boolean);
2359
+ if(!vids.length)return;
2360
+ var reduce=window.matchMedia&&window.matchMedia("(prefers-reduced-motion:reduce)").matches;
2361
+ if(reduce)return;
2362
+ vids.forEach(function(v){
2363
+ function start(){var pr=v.play();if(pr&&pr.catch)pr.catch(function(){});}
2364
+ v.addEventListener("loadeddata",function(){v.classList.add("ready");},{once:true});
2365
+ if(!("IntersectionObserver" in window)){v.preload="auto";start();return;}
2366
+ var io=new IntersectionObserver(function(es){
2367
+ es.forEach(function(e){
2368
+ if(e.isIntersecting){v.preload="auto";start();}
2369
+ else{v.pause();}
2370
+ });
2371
+ },{threshold:.15});
2372
+ io.observe(v);
2373
+ });
2374
+ })();
2375
+ </script>
2376
+ <script>
2377
+ (function () {
2378
+ var cards = [].slice.call(document.querySelectorAll("[data-agent-seq]"));
2379
+ if (!cards.length) return;
2380
+ var reduced = window.matchMedia && window.matchMedia("(prefers-reduced-motion: reduce)").matches;
2381
+
2382
+ function fill(card) {
2383
+ var typed = card.querySelector(".agent-typed");
2384
+ var caret = card.querySelector(".agent-caret");
2385
+ var out = card.querySelector(".agent-out");
2386
+ if (typed) typed.textContent = card.dataset.ask;
2387
+ if (out) { out.hidden = false; out.classList.add("in"); }
2388
+ if (caret) caret.style.display = "none";
2389
+ }
2390
+
2391
+ function play(card, delay) {
2392
+ if (card.dataset.played) return;
2393
+ card.dataset.played = "1";
2394
+ // Reduced motion still needs the content, just not the theatre.
2395
+ if (reduced) { fill(card); return; }
2396
+ var typed = card.querySelector(".agent-typed");
2397
+ var caret = card.querySelector(".agent-caret");
2398
+ var out = card.querySelector(".agent-out");
2399
+ var box = card.querySelector(".agent-box");
2400
+ var ask = card.dataset.ask;
2401
+ var i = 0;
2402
+ setTimeout(function step() {
2403
+ if (i <= ask.length) {
2404
+ if (box) box.classList.add("focus");
2405
+ typed.textContent = ask.slice(0, i);
2406
+ i += 1;
2407
+ setTimeout(step, 26 + Math.random() * 34);
2408
+ return;
2409
+ }
2410
+ if (caret) caret.style.display = "none";
2411
+ // Send: the field releases focus and the button kicks, like a real submit.
2412
+ if (box) box.classList.remove("focus");
2413
+ card.classList.add("sent");
2414
+ setTimeout(function () { card.classList.remove("sent"); }, 300);
2415
+ // Straight from the question to the answer. The oracle_cli row in
2416
+ // between was implementation detail cluttering the card.
2417
+ setTimeout(function () {
2418
+ if (!out) return;
2419
+ out.hidden = false;
2420
+ requestAnimationFrame(function () { out.classList.add("in"); });
2421
+ }, 700);
2422
+ }, delay);
2423
+ }
2424
+
2425
+ if (!("IntersectionObserver" in window)) { cards.forEach(fill); return; }
2426
+ var io = new IntersectionObserver(function (entries) {
2427
+ entries.forEach(function (e) {
2428
+ if (!e.isIntersecting) return;
2429
+ play(e.target, cards.indexOf(e.target) * 900);
2430
+ io.unobserve(e.target);
2431
+ });
2432
+ }, { threshold: 0.35 });
2433
+ cards.forEach(function (c) { io.observe(c); });
2434
+ })();
2435
+
2436
+ // Hero stats count up when the row scrolls into view. Numbers that snap into
2437
+ // place read as static text; numbers that climb read as a system reporting
2438
+ // itself. Targets live in data-count so the markup stays the source of truth.
2439
+ // The counter waits for the page loader to disappear — an earlier version
2440
+ // fired behind the fullscreen loader, finished, and showed dead numbers.
2441
+ (function () {
2442
+ var stats = document.querySelectorAll(".home-stat b[data-count]");
2443
+ if (!stats.length) return;
2444
+ var reduced = window.matchMedia && window.matchMedia("(prefers-reduced-motion: reduce)").matches;
2445
+ function paint(el, value) {
2446
+ var suffix = el.getAttribute("data-suffix") || "";
2447
+ el.textContent = String(value);
2448
+ if (suffix) {
2449
+ var s = document.createElement("span");
2450
+ s.className = "stat-suffix";
2451
+ s.textContent = suffix;
2452
+ el.appendChild(s);
2453
+ }
2454
+ }
2455
+ function land(el) {
2456
+ paint(el, el.getAttribute("data-count"));
2457
+ }
2458
+ if (reduced || !("IntersectionObserver" in window)) { stats.forEach(land); return; }
2459
+ function run(el) {
2460
+ var target = parseInt(el.getAttribute("data-count"), 10);
2461
+ if (!isFinite(target)) { land(el); return; }
2462
+ var dur = 1400, t0 = null;
2463
+ function step(ts) {
2464
+ if (t0 === null) t0 = ts;
2465
+ var k = Math.min(1, (ts - t0) / dur);
2466
+ // Ease out cubic: slow settle for the last few frames so the number
2467
+ // visibly lands rather than snapping.
2468
+ var v = Math.round(target * (1 - Math.pow(1 - k, 3)));
2469
+ paint(el, v);
2470
+ if (k < 1) requestAnimationFrame(step); else land(el);
2471
+ }
2472
+ requestAnimationFrame(step);
2473
+ }
2474
+ function start() {
2475
+ var io = new IntersectionObserver(function (entries) {
2476
+ entries.forEach(function (e) {
2477
+ if (!e.isIntersecting || e.target.dataset.counted) return;
2478
+ e.target.dataset.counted = "1";
2479
+ run(e.target);
2480
+ });
2481
+ }, { threshold: 0.4 });
2482
+ stats.forEach(function (el) { io.observe(el); });
2483
+ }
2484
+ var loader = document.getElementById("loader");
2485
+ if (!loader || loader.classList.contains("out")) { start(); }
2486
+ else {
2487
+ loader.addEventListener("transitionend", function go() {
2488
+ if (!loader.classList.contains("out")) return;
2489
+ loader.removeEventListener("transitionend", go);
2490
+ start();
2491
+ });
2492
+ }
2493
+ })();
2494
+ </script>
2495
+ <script>
2496
+ // Scroll-triggered reveal animations
2497
+ (function(){
2498
+ var observer = new IntersectionObserver(function(entries) {
2499
+ entries.forEach(function(e) {
2500
+ if (e.isIntersecting) {
2501
+ e.target.classList.add('revealed');
2502
+ observer.unobserve(e.target);
2503
+ }
2504
+ });
2505
+ }, { threshold: 0.15, rootMargin: '0px 0px -40px 0px' });
2506
+
2507
+ // Animate: section titles, agent panels, strategy cards, profile cards, proto-cards, bridge demo
2508
+ var targets = document.querySelectorAll('.rv, .agent-panel, .strategy-card, .proto-card, .bridge-demo, .strategy-head, .strategy-grid article');
2509
+ for (var i = 0; i < targets.length; i++) {
2510
+ targets[i].style.opacity = '0';
2511
+ targets[i].style.transform = 'translateY(24px)';
2512
+ targets[i].style.transition = 'opacity .6s var(--ease), transform .6s var(--ease)';
2513
+ observer.observe(targets[i]);
2514
+ }
2515
+
2516
+ // CSS class applied on scroll
2517
+ var style = document.createElement('style');
2518
+ style.textContent =
2519
+ '.revealed { opacity: 1 !important; transform: translateY(0) !important; }' +
2520
+ '.strategy-card:nth-child(1) { transition-delay: 0s !important; }' +
2521
+ '.strategy-card:nth-child(2) { transition-delay: .1s !important; }' +
2522
+ '.strategy-card:nth-child(3) { transition-delay: .15s !important; }' +
2523
+ '.strategy-card:nth-child(4) { transition-delay: .2s !important; }' +
2524
+ '.strategy-card:nth-child(5) { transition-delay: .25s !important; }' +
2525
+ '.strategy-card:nth-child(6) { transition-delay: .3s !important; }' +
2526
+ '.strategy-card:nth-child(7) { transition-delay: .35s !important; }' +
2527
+ '.proto-card:nth-child(1) { transition-delay: 0s !important; }' +
2528
+ '.proto-card:nth-child(2) { transition-delay: .06s !important; }' +
2529
+ '.proto-card:nth-child(3) { transition-delay: .12s !important; }' +
2530
+ '.proto-card:nth-child(4) { transition-delay: .18s !important; }' +
2531
+ '.proto-card:nth-child(5) { transition-delay: .24s !important; }' +
2532
+ '.proto-card:nth-child(6) { transition-delay: .3s !important; }';
2533
+ document.head.appendChild(style);
2534
+ })();
2535
+ </script>
1567
2536
  </body>
1568
2537
  </html>