@oracle-agent/oracle 0.35.38 → 0.35.40

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 (60) hide show
  1. package/README.md +1 -1
  2. package/dist/agent-sessions.mjs +13 -13
  3. package/dist/assets/skills/blocked-page-recovery.md +16 -0
  4. package/dist/assets/skills/browser-use.md +19 -0
  5. package/dist/assets/skills/chrome-profile-browser.md +21 -0
  6. package/dist/assets/skills/oracle-agentic-crypto/SKILL.md +27 -0
  7. package/dist/assets/skills/oracle-desk-product/SKILL.md +1 -1
  8. package/dist/assets/skills/oracle-x402/SKILL.md +54 -11
  9. package/dist/assets/skills/web-form-filling.md +19 -0
  10. package/dist/assets/skills/web-research.md +17 -0
  11. package/dist/assets/skills/x-read-browser.md +17 -0
  12. package/dist/assets/skills/xurl.md +1 -1
  13. package/dist/bin/desk-server.mjs +30 -30
  14. package/dist/bin/oracle-data-mcp.mjs +17 -13
  15. package/dist/bin/oracle-public-server.mjs +1 -1
  16. package/dist/bin/oracle-route.mjs +26 -14
  17. package/dist/bin/oracle-scan.mjs +4 -4
  18. package/dist/bin/oracle.mjs +11 -10
  19. package/dist/cli/commands/agent-session.mjs +18 -18
  20. package/dist/cli/commands/auth.mjs +20 -17
  21. package/dist/cli/commands/chat.mjs +231 -228
  22. package/dist/cli/commands/data.mjs +5 -5
  23. package/dist/cli/commands/doctor.mjs +1 -1
  24. package/dist/cli/commands/eval.mjs +154 -152
  25. package/dist/cli/commands/extension-policy.mjs +1 -1
  26. package/dist/cli/commands/follow.mjs +57 -19
  27. package/dist/cli/commands/governance-prepare.mjs +1 -1
  28. package/dist/cli/commands/init.mjs +2 -2
  29. package/dist/cli/commands/model.mjs +235 -232
  30. package/dist/cli/commands/public.mjs +3 -3
  31. package/dist/cli/commands/route.mjs +1 -1
  32. package/dist/cli/commands/setup.mjs +62 -59
  33. package/dist/cli/commands/signer.mjs +4 -4
  34. package/dist/cli/commands/upgrade.mjs +2 -2
  35. package/dist/cli/commands/x402.mjs +19 -0
  36. package/dist/control-plane/index.mjs +1 -1
  37. package/dist/data/desk-data.mjs +28 -28
  38. package/dist/index.mjs +46 -46
  39. package/dist/local-signer/runtime.mjs +6 -6
  40. package/dist/teams/index.mjs +6 -5
  41. package/dist/tui/standalone-client.mjs +84 -82
  42. package/package.json +1 -1
  43. package/public/eval-report.json +2 -2
  44. package/public/oracle-splash/docs/browser-and-web/index.html +32 -0
  45. package/public/oracle-splash/docs/connectors/index.html +18 -0
  46. package/public/oracle-splash/docs/docs.css +21 -0
  47. package/public/oracle-splash/docs/docs.js +108 -0
  48. package/public/oracle-splash/docs/getting-started/index.html +36 -0
  49. package/public/oracle-splash/docs/index.html +26 -0
  50. package/public/oracle-splash/docs/reference/index.html +20 -0
  51. package/public/oracle-splash/docs/security/index.html +19 -0
  52. package/public/oracle-splash/docs/using-oracle/index.html +32 -0
  53. package/public/oracle-splash/download/index.html +2584 -0
  54. package/public/oracle-splash/index.html +313 -942
  55. package/public/oracle-splash/pricing/index.html +2570 -0
  56. package/public/oracle-splash/security/index.html +2574 -0
  57. package/public/oracle-splash/what-it-does/index.html +2608 -0
  58. package/public/oracle-splash/where-it-works/index.html +2635 -0
  59. package/server.json +2 -2
  60. package/dist/assets/equities-fixtures/bridge_routes.json +0 -159
@@ -3,10 +3,10 @@
3
3
  <head>
4
4
  <meta charset="UTF-8" />
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
- <title>ORACLE</title>
6
+ <title>ORACLE | The control plane between AI and on-chain action</title>
7
7
  <link rel="icon" href="/favicon.svg" type="image/svg+xml">
8
8
  <link rel="shortcut icon" href="/favicon.ico">
9
- <meta name="description" content="Trade, research, and build across Oracle's working chain surfaces, with extensible EVM support and self-custodial signing.">
9
+ <meta name="description" content="Oracle reads chain state, prices routes, and prepares unsigned transactions across 15+ chains. Your wallet signs.">
10
10
  <meta name="theme-color" content="#0B1018" />
11
11
  <meta name="robots" content="index,follow" />
12
12
  <meta property="og:title" content="ORACLE | The all-in-one multichain agent">
@@ -174,8 +174,41 @@ body[data-scene="cli"] .nav,body[data-scene="fees"] .nav{border-bottom-color:rgb
174
174
  display:flex;align-items:center;gap:18px;justify-self:end;
175
175
  font-family:var(--mono);font-size:var(--fs-micro);letter-spacing:.18em;text-transform:uppercase;color:var(--cool);
176
176
  }
177
- .nav-links a{opacity:.78;transition:opacity .25s,color .25s}
177
+ .nav-links a{opacity:.78;transition:opacity .25s,color .25s;position:relative}
178
178
  .nav-links a:hover{opacity:1;color:var(--blue2)}
179
+ .nav-links a::after{
180
+ content:"";position:absolute;left:0;right:0;bottom:-6px;height:1px;
181
+ background:var(--blue);transform:scaleX(0);transform-origin:left;
182
+ transition:transform .3s var(--ease);
183
+ }
184
+ .nav-links a:hover::after{transform:scaleX(1)}
185
+ .nav-links a.is-active{opacity:1;color:var(--blue2)}
186
+ .nav-links a.is-active::after{transform:scaleX(1)}
187
+ /* Download reads as the action, not a fifth link of equal weight. */
188
+ .nav-links a.nav-download{
189
+ opacity:1;color:#071018;
190
+ background:linear-gradient(180deg,rgba(184,240,255,.98),rgba(124,196,255,.9));
191
+ border-radius:999px;padding:8px 15px;
192
+ }
193
+ .nav-links a.nav-download::after{display:none}
194
+ .nav-links a.nav-download:hover{color:#071018;box-shadow:0 0 0 1px rgba(184,240,255,.4),0 12px 30px rgba(124,196,255,.24)}
195
+ /* Mobile menu: hidden on desktop, drawer below. */
196
+ .nav-toggle{
197
+ display:none;justify-self:end;width:38px;height:38px;
198
+ align-items:center;justify-content:center;
199
+ border:1px solid var(--line-2);border-radius:10px;background:none;
200
+ color:var(--cool);cursor:pointer;padding:0;
201
+ }
202
+ .nav-toggle span{display:block;width:16px;height:1px;background:currentColor;position:relative}
203
+ .nav-toggle span::before,.nav-toggle span::after{
204
+ content:"";position:absolute;left:0;width:16px;height:1px;background:currentColor;
205
+ transition:transform .3s var(--ease),opacity .2s;
206
+ }
207
+ .nav-toggle span::before{top:-5px}
208
+ .nav-toggle span::after{top:5px}
209
+ .nav[data-open="1"] .nav-toggle span{background:transparent}
210
+ .nav[data-open="1"] .nav-toggle span::before{transform:translateY(5px) rotate(45deg)}
211
+ .nav[data-open="1"] .nav-toggle span::after{transform:translateY(-5px) rotate(-45deg)}
179
212
  .nav-chip{
180
213
  font-family:var(--mono);font-size:var(--fs-micro);letter-spacing:.16em;text-transform:uppercase;
181
214
  border:1px solid rgba(124,196,255,.3);border-radius:999px;padding:7px 11px;color:var(--blue2);opacity:.95;
@@ -305,9 +338,10 @@ code{font-family:var(--mono)}
305
338
  .section-title{
306
339
  font-family:var(--display);font-weight:400;
307
340
  font-size:var(--fs-2xl);line-height:1.06;letter-spacing:-.01em;
308
- max-width:18ch;margin-bottom:12px;
341
+ max-width:18ch;margin-bottom:20px;
309
342
  }
310
343
  .section-title em{font-style:italic;color:var(--blue2)}
344
+ .done .word-mask{overflow:visible!important}
311
345
  .section-lede{max-width:52ch;color:var(--cool);font-size:var(--fs-base);line-height:1.7;margin-bottom:clamp(28px,4vw,44px)}
312
346
 
313
347
  /* orchestration graph */
@@ -514,6 +548,14 @@ code{font-family:var(--mono)}
514
548
  .strategy-card .mode{font-family:var(--mono);font-size:var(--fs-micro);letter-spacing:.16em;text-transform:uppercase;color:var(--blue2)}
515
549
  .strategy-card h4{font-family:var(--display);font-weight:400;font-size:var(--fs-lg)}
516
550
  .strategy-card p{color:var(--cool);font-size:var(--fs-sm);line-height:1.6}
551
+ .strategy-more{border-top:1px solid var(--line);background:rgba(11,16,24,.72)}
552
+ .strategy-more > summary{list-style:none;display:flex;align-items:center;justify-content:center;gap:12px;padding:18px 24px;cursor:pointer;font-family:var(--mono);font-size:var(--fs-micro);letter-spacing:.18em;text-transform:uppercase;color:var(--blue2);transition:background .25s var(--ease),color .25s var(--ease)}
553
+ .strategy-more > summary::-webkit-details-marker{display:none}
554
+ .strategy-more > summary::after{content:"+";font-size:var(--fs-sm);transition:transform .3s var(--ease)}
555
+ .strategy-more[open] > summary::after{transform:rotate(45deg)}
556
+ .strategy-more > summary:hover{background:rgba(124,196,255,.05);color:var(--ink)}
557
+ .strategy-more > summary:focus-visible{outline:2px solid var(--blue2);outline-offset:-4px}
558
+ .strategy-grid-more{border-top:1px solid var(--line)}
517
559
  .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)}
518
560
  .strategy-posture b{font-weight:500;color:var(--warm);letter-spacing:.04em}
519
561
  @media (max-width:900px){
@@ -526,7 +568,7 @@ code{font-family:var(--mono)}
526
568
 
527
569
  .strategy-posture b{color:var(--blue2);font-weight:500}
528
570
  @media (max-width:980px){.strategy-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.strategy-head{align-items:start;flex-direction:column}}
529
- @media (max-width:620px){.strategy-grid{grid-template-columns:1fr}.strategy-card{min-height:0}}
571
+ @media (max-width:620px){.strategy-card .mode{display:none}.strategy-grid{grid-template-columns:1fr}.strategy-card{min-height:0;padding:24px 22px;gap:8px}}
530
572
 
531
573
  /* actual Oracle CLI */
532
574
  .convert-grid{display:grid;grid-template-columns:minmax(0,1.15fr) minmax(220px,.85fr);gap:clamp(22px,3.2vw,40px);align-items:start;margin-top:clamp(20px,3vw,32px)}
@@ -905,19 +947,14 @@ a.chip:hover{border-color:rgba(124,196,255,.3);background:rgba(21,32,49,.6);tran
905
947
  .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}
906
948
  .atlas-orbit .orbital{width:124px;height:124px;filter:drop-shadow(0 0 32px rgba(124,196,255,.4))}
907
949
  .atlas-copy{padding:clamp(20px,3vw,30px)}
908
- .atlas-count{font-family:var(--display);font-weight:300;font-size:var(--fs-4xl);line-height:.82;letter-spacing:-.055em;color:var(--ink)}
909
- .atlas-count span{font-style:italic;color:var(--blue2)}
950
+ .atlas-copy h3{font-family:var(--display);font-weight:400;font-size:var(--fs-xl);line-height:1;letter-spacing:-.025em;color:var(--ink)}
910
951
  .atlas-sub{margin-top:16px;color:var(--cool);font-size:var(--fs-base);line-height:1.68;max-width:34ch}
911
- .atlas-ledger{display:grid;gap:1px;margin-top:24px;border:1px solid var(--line);border-radius:var(--r-md);overflow:hidden;background:var(--line)}
912
- .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)}
913
- .atlas-ledger b{color:var(--blue2);font-weight:500}
914
- .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%)}
915
952
 
916
953
  @media (max-width:960px){
917
954
  .home-stats{grid-template-columns:repeat(2,minmax(0,1fr))}
918
955
  .atlas-sticky{position:relative;top:auto}
919
956
  }
920
- @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)}}
957
+ @media (max-width:560px){.home-stats{grid-template-columns:1fr}.home-stat{min-height:0}.atlas-orbit{height:170px}}
921
958
 
922
959
 
923
960
 
@@ -933,11 +970,8 @@ a.chip:hover{border-color:rgba(124,196,255,.3);background:rgba(21,32,49,.6);tran
933
970
  .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}
934
971
  .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)}
935
972
  .motion-card:hover::after{transform:translateX(120%)}
936
- .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)}
937
- .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}
973
+ .motion-card h3{position:relative;z-index:1;margin:10px 0 14px;font-family:var(--display);font-weight:400;font-size:var(--fs-2xl);line-height:.96;letter-spacing:-.03em}
938
974
  .motion-card p{position:relative;z-index:1;color:var(--cool);font-size:var(--fs-base);line-height:1.62;max-width:34ch}
939
- .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}
940
- .motion-card.is-hot .sig span:last-child{color:var(--blue2)}
941
975
  .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}
942
976
  .word-mask{display:inline-block;overflow:hidden;vertical-align:bottom;padding-bottom:.16em;margin-bottom:-.16em}.word-mask>span{display:inline-block}
943
977
  @keyframes card-spin{to{--spin:360deg}}
@@ -947,17 +981,21 @@ a.chip:hover{border-color:rgba(124,196,255,.3);background:rgba(21,32,49,.6);tran
947
981
 
948
982
  /* ── hero: product-first split. Real artifact leads, orb is ambience ── */
949
983
  .hero-split{
950
- display:grid;grid-template-columns:minmax(0,.68fr) minmax(0,1.32fr);
984
+ display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);
951
985
  gap:clamp(28px,4vw,56px);align-items:center;text-align:left;width:100%;
952
986
  }
953
987
  .hero-lede{min-width:0;display:flex;flex-direction:column;align-items:flex-start}
954
988
  .hero-lede .home-kicker{margin-bottom:14px}
989
+ /* One shared measure so the headline and the paragraph under it are the same
990
+ block width; the headline is sized to break onto two lines inside it. */
991
+ .hero-lede{--hero-measure:min(100%,620px)}
955
992
  .hero-split .home-title{
956
- font-size:var(--fs-3xl);line-height:.98;letter-spacing:-.035em;
993
+ font-size:clamp(40px,4.4vw,58px);line-height:1.02;letter-spacing:-.03em;
957
994
  text-transform:none;text-align:left;margin:0;
995
+ max-width:var(--hero-measure);
958
996
  }
959
997
  .hero-sub{
960
- max-width:46ch;margin:20px 0 0;color:var(--cool);
998
+ max-width:var(--hero-measure);margin:20px 0 0;color:var(--cool);
961
999
  font-size:var(--fs-base);line-height:1.65;text-shadow:0 1px 20px rgba(0,0,0,.6);
962
1000
  }
963
1001
  .hero-split .home-actions{justify-content:flex-start;margin-top:30px}
@@ -982,6 +1020,66 @@ a.chip:hover{border-color:rgba(124,196,255,.3);background:rgba(21,32,49,.6);tran
982
1020
  .hero-note-line{flex-direction:column;align-items:flex-start}
983
1021
  .hero-note-sep{display:none}
984
1022
  }
1023
+ /* Five sequential steps. Numbers carry the order, so these are lighter than
1024
+ moat-cards: no heavy border box, just a rule per column. At five across a
1025
+ 2-column grid would strand the last one, hence its own track sizing. */
1026
+ .steps-grid{
1027
+ display:grid;grid-template-columns:repeat(5,minmax(0,1fr));
1028
+ gap:clamp(18px,2.4vw,30px);margin-top:22px;
1029
+ }
1030
+ @media (max-width:980px){.steps-grid{grid-template-columns:repeat(2,minmax(0,1fr))}}
1031
+ @media (max-width:620px){.steps-grid{grid-template-columns:1fr}}
1032
+ /* Trailing "see the full X" line under a grid. Shares moat-grid's rhythm so
1033
+ sections do not each invent their own spacing. */
1034
+ .agent-icons{display:flex;flex-wrap:wrap;gap:10px;justify-content:center;margin-top:14px}
1035
+ .agent-icons span{
1036
+ display:inline-flex;align-items:center;gap:5px;padding:4px 10px;
1037
+ border:1px solid var(--line);border-radius:999px;
1038
+ font-family:var(--mono);font-size:var(--fs-micro);color:var(--cool);letter-spacing:.08em;
1039
+ }
1040
+ .section-more{margin-top:22px}
1041
+ .section-more a{color:var(--blue2);text-decoration:none;transition:color .25s}
1042
+ .section-more a:hover{color:var(--ink)}
1043
+ .step-card{position:relative;padding-top:18px;border-top:1px solid var(--line-2)}
1044
+ .step-card .n{
1045
+ font-family:var(--mono);font-size:var(--fs-micro);letter-spacing:.14em;
1046
+ text-transform:uppercase;color:var(--blue);opacity:.85;
1047
+ }
1048
+ .step-card h3{
1049
+ font-family:var(--display);font-weight:400;font-size:var(--fs-lg);
1050
+ line-height:1.18;margin:10px 0 8px;color:var(--ink);
1051
+ }
1052
+ .step-card p{color:var(--cool);font-size:var(--fs-sm);line-height:1.6}
1053
+ /* Two-column client/chain roster on the landing. Chips are static labels, not
1054
+ links: the section header carries the one link that matters. */
1055
+ .reach-cols{
1056
+ display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));
1057
+ gap:clamp(20px,3vw,40px);margin-top:22px;
1058
+ }
1059
+ .reach-chips{display:flex;flex-wrap:wrap;gap:8px;margin-top:14px}
1060
+ .reach-chips span{
1061
+ font-family:var(--mono);font-size:var(--fs-micro);letter-spacing:.08em;
1062
+ color:var(--cool);border:1px solid var(--line);border-radius:999px;
1063
+ padding:7px 13px;background:rgba(124,196,255,.03);
1064
+ transition:border-color .25s,color .25s;
1065
+ }
1066
+ .reach-chips span:hover{border-color:var(--line-2);color:var(--ink)}
1067
+ .cmd-hint a{color:var(--blue2);text-decoration:none;transition:color .25s}
1068
+ .cmd-hint a:hover{color:var(--ink)}
1069
+ /* Inline links inside body copy need to read as links; the global rule strips
1070
+ color and underline for nav and card-wrapper anchors. */
1071
+ .section-lede a{
1072
+ color:var(--blue2);text-decoration:none;
1073
+ border-bottom:1px solid rgba(124,196,255,.35);
1074
+ transition:border-color .25s,color .25s;
1075
+ }
1076
+ .section-lede a:hover{color:var(--ink);border-bottom-color:var(--blue)}
1077
+ .moat-card p a{
1078
+ color:var(--blue2);text-decoration:none;
1079
+ border-bottom:1px solid rgba(124,196,255,.35);
1080
+ transition:border-color .25s,color .25s;
1081
+ }
1082
+ .moat-card p a:hover{color:var(--ink);border-bottom-color:var(--blue)}
985
1083
  .hero-installer{
986
1084
  margin:clamp(24px,4vw,38px) 0 0;width:100%;border:1px solid var(--line-2);border-radius:var(--r-md);
987
1085
  overflow:hidden;background:linear-gradient(145deg,rgba(17,25,37,.95),rgba(10,16,25,.98));
@@ -1118,27 +1216,16 @@ a.chip:hover{border-color:rgba(124,196,255,.3);background:rgba(21,32,49,.6);tran
1118
1216
  #cli-still{position:static;opacity:1}
1119
1217
  }
1120
1218
 
1121
- footer{margin-top:clamp(72px,12vh,120px);border-top:1px solid var(--line);padding:32px var(--pad) 40px;position:relative;z-index:2}
1219
+ footer{margin-top:clamp(64px,10vh,100px);border-top:1px solid var(--line);padding:30px var(--pad) 36px;position:relative;z-index:2}
1122
1220
  .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)}
1123
1221
  .labs-link:hover{color:var(--ink)}
1124
1222
  .foot-row{
1125
- max-width:var(--max);margin:0 auto 14px;
1223
+ max-width:var(--max);margin:0 auto;
1126
1224
  display:flex;flex-wrap:wrap;gap:14px 24px;justify-content:space-between;align-items:center;
1225
+ font-family:var(--mono);font-size:var(--fs-micro);letter-spacing:.16em;text-transform:uppercase;color:var(--mute);
1127
1226
  }
1128
- .powered{
1129
- display:inline-flex;align-items:center;gap:10px;
1130
- font-family:var(--mono);font-size:var(--fs-xs);letter-spacing:.2em;text-transform:uppercase;color:var(--mute);
1131
- }
1132
- .powered .mark{width:7px;height:7px;border-radius:50%;background:var(--blue);box-shadow:0 0 12px rgba(124,196,255,.7)}
1133
- .powered a{color:var(--blue);font-weight:600;border-bottom:1px solid transparent;transition:border-color .25s,color .25s}
1134
- .powered a:hover{border-bottom-color:var(--blue);color:var(--ink)}
1135
1227
  .foot-links{display:flex;gap:18px;font-family:var(--mono);font-size:var(--fs-micro);letter-spacing:.16em;text-transform:uppercase;color:var(--mute)}
1136
1228
  .foot-links a:hover{color:var(--blue)}
1137
- .foot-meta{
1138
- max-width:var(--max);margin:0 auto;
1139
- display:flex;flex-wrap:wrap;gap:12px 22px;justify-content:space-between;
1140
- font-family:var(--mono);font-size:var(--fs-micro);letter-spacing:.16em;text-transform:uppercase;color:var(--mute);
1141
- }
1142
1229
 
1143
1230
  .js .rv{opacity:0;transform:translate3d(0,22px,0);will-change:opacity,transform}
1144
1231
  .js .rv.in{opacity:1;transform:translate3d(0,0,0);transition:opacity 1.05s var(--ease),transform 1.05s var(--ease)}
@@ -1166,7 +1253,24 @@ footer{margin-top:clamp(72px,12vh,120px);border-top:1px solid var(--line);paddin
1166
1253
  .home-inner{max-width:760px}
1167
1254
  .hero-stage{min-height:clamp(300px,44vh,460px)}.home-title{font-size:var(--fs-4xl)}
1168
1255
  .nav-chip{display:none}
1169
- .nav-links .hide-sm{display:none}
1256
+ /* Links collapse into a drawer; the toggle takes their place. */
1257
+ .nav-toggle{display:flex}
1258
+ .nav-links{
1259
+ position:fixed;top:64px;left:0;right:0;
1260
+ flex-direction:column;align-items:stretch;gap:0;
1261
+ background:rgba(11,16,24,.97);
1262
+ backdrop-filter:blur(18px);-webkit-backdrop-filter:blur(18px);
1263
+ border-bottom:1px solid var(--line);
1264
+ padding:6px var(--pad) 18px;
1265
+ opacity:0;visibility:hidden;transform:translateY(-8px);
1266
+ transition:opacity .25s var(--ease),transform .25s var(--ease),visibility .25s;
1267
+ }
1268
+ .nav[data-open="1"] .nav-links{opacity:1;visibility:visible;transform:translateY(0)}
1269
+ .nav-links a{padding:15px 0;border-bottom:1px solid var(--line);opacity:1;font-size:var(--fs-micro)}
1270
+ .nav-links a::after{display:none}
1271
+ .nav-links a.nav-download{
1272
+ margin-top:16px;border-bottom:none;text-align:center;padding:14px 15px;
1273
+ }
1170
1274
  .route-strip{grid-template-columns:1fr}
1171
1275
  .route-card.p-build .build-copy{grid-template-columns:1fr}
1172
1276
  .convert-grid{grid-template-columns:1fr}
@@ -1225,7 +1329,7 @@ footer{margin-top:clamp(72px,12vh,120px);border-top:1px solid var(--line);paddin
1225
1329
  .chip img.wm{height:24px;max-width:132px}
1226
1330
  .chip img.wm.tall{width:26px;height:26px;min-width:26px;max-width:26px}
1227
1331
  footer{padding:28px var(--pad) 34px}
1228
- .foot-row,.foot-meta{justify-content:center;text-align:center}
1332
+ .foot-row{justify-content:center;text-align:center}
1229
1333
  .foot-links{flex-wrap:wrap;justify-content:center;gap:12px 16px}
1230
1334
  }
1231
1335
  @media (max-width:560px){
@@ -1277,7 +1381,6 @@ footer{margin-top:clamp(72px,12vh,120px);border-top:1px solid var(--line);paddin
1277
1381
  display:flex;align-items:center;gap:14px;width:100%;margin-bottom:18px;
1278
1382
  font-family:var(--mono);font-size:var(--fs-micro);letter-spacing:.3em;text-transform:uppercase;color:var(--mute);
1279
1383
  }
1280
- .hero-index b{font-weight:500;color:var(--blue2)}
1281
1384
  .hero-index i{flex:1;height:1px;background:linear-gradient(90deg,var(--line-2),transparent);font-style:normal;transform-origin:0 50%}
1282
1385
  .home{align-content:center}
1283
1386
  /* The old centred hairline was an unlabelled decoration. One cue, anchored to
@@ -1345,7 +1448,7 @@ footer{margin-top:clamp(72px,12vh,120px);border-top:1px solid var(--line);paddin
1345
1448
  .stack-readout b{display:block;color:var(--blue2);font-weight:500;font-size:var(--fs-sm);letter-spacing:.1em}
1346
1449
  .stack-layers{list-style:none;display:grid;gap:0;border-top:1px solid var(--line);margin:0}
1347
1450
  .stack-layer{
1348
- position:relative;display:grid;grid-template-columns:auto minmax(0,1fr) auto;
1451
+ position:relative;display:grid;grid-template-columns:minmax(0,1fr) auto;
1349
1452
  gap:clamp(14px,2.6vw,34px);align-items:center;
1350
1453
  padding:clamp(12px,1.7vh,20px) 0;border-bottom:1px solid var(--line);
1351
1454
  isolation:isolate;overflow:hidden;
@@ -1356,10 +1459,6 @@ footer{margin-top:clamp(72px,12vh,120px);border-top:1px solid var(--line);paddin
1356
1459
  mask-image:linear-gradient(90deg,transparent,#000 8%,#000 92%,transparent);
1357
1460
  }
1358
1461
  .stack-layer > *:not(.layer-ridge){position:relative;z-index:1}
1359
- .stack-idx{
1360
- font-family:var(--mono);font-size:var(--fs-micro);letter-spacing:.2em;color:var(--blue);
1361
- min-width:2.4em;
1362
- }
1363
1462
  .stack-body{min-width:0}
1364
1463
  .stack-body h3{
1365
1464
  font-family:var(--display);font-weight:400;font-size:var(--fs-lg);line-height:1.04;letter-spacing:-.02em;
@@ -1382,7 +1481,7 @@ footer{margin-top:clamp(72px,12vh,120px);border-top:1px solid var(--line);paddin
1382
1481
  .premium-motion .stack-sticky{position:static}
1383
1482
  .stack-head{grid-template-columns:1fr}
1384
1483
  .stack-readout{text-align:left;white-space:normal}
1385
- .stack-layer{grid-template-columns:auto minmax(0,1fr)}
1484
+ .stack-layer{grid-template-columns:minmax(0,1fr)}
1386
1485
  .stack-sig{grid-column:1/-1;justify-self:start;text-align:left;white-space:normal}
1387
1486
  /* A 900-unit ridge squeezed into a phone column reads as hatching over the
1388
1487
  copy rather than as depth. Drop it back to a texture. */
@@ -1411,65 +1510,17 @@ footer{margin-top:clamp(72px,12vh,120px);border-top:1px solid var(--line);paddin
1411
1510
  .telemetry-track span.k::before{background:var(--hl);box-shadow:0 0 10px rgba(80,210,193,.7)}
1412
1511
  .marquee{transform:skewX(var(--kin-skew,0deg));transition:transform .42s var(--ease)}
1413
1512
 
1414
- /* ── sticky chapter tabs on the existing capability sections ─────── */
1513
+ /* ── chapter labels on the existing capability sections ─────────── */
1415
1514
  .chapter-tab{
1416
- position:sticky;top:84px;z-index:6;display:flex;width:fit-content;align-items:center;gap:12px;
1417
- margin-bottom:clamp(14px,2.4vh,26px);padding:7px 14px 7px 10px;
1515
+ position:relative;top:auto;z-index:6;display:flex;width:fit-content;align-items:center;gap:12px;
1516
+ margin-bottom:clamp(14px,2.4vh,26px);padding:7px 14px;
1418
1517
  border:1px solid var(--line);border-radius:999px;background:rgba(11,16,24,.82);
1419
1518
  backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);
1420
1519
  font-family:var(--mono);font-size:var(--fs-micro);letter-spacing:.2em;text-transform:uppercase;color:var(--mute);
1421
1520
  transition:border-color .5s var(--ease),color .5s var(--ease);
1422
1521
  }
1423
- .chapter-tab b{
1424
- display:grid;place-items:center;min-width:26px;height:20px;border-radius:999px;
1425
- background:rgba(124,196,255,.12);color:var(--blue2);font-weight:500;letter-spacing:.08em;
1426
- }
1427
1522
  .section.is-scene .chapter-tab{border-color:var(--line-2);color:var(--cool)}
1428
1523
 
1429
- /* ── chapter 06 · the close ──────────────────────────────────────── */
1430
- .close-scene{
1431
- position:relative;z-index:2;margin-top:clamp(60px,12vh,140px);
1432
- padding:clamp(64px,13vh,150px) var(--pad) 0;overflow:hidden;
1433
- }
1434
- /* Sits low enough that both resolved lines run through the display title, not
1435
- through the eyebrow above it, which a hairline made unreadable on phones. */
1436
- .close-ridge{
1437
- position:absolute;left:50%;top:clamp(28px,5vh,46px);width:min(1680px,150vw);height:clamp(200px,34vh,380px);
1438
- transform:translateX(-50%);z-index:0;
1439
- -webkit-mask-image:linear-gradient(180deg,transparent,#000 46%,transparent);
1440
- mask-image:linear-gradient(180deg,transparent,#000 46%,transparent);
1441
- }
1442
- .close-inner{position:relative;z-index:1;max-width:var(--max);margin:0 auto}
1443
- .close-eyebrow{font-family:var(--mono);font-size:var(--fs-micro);letter-spacing:.34em;text-transform:uppercase;color:var(--blue);margin-bottom:16px}
1444
- .close-title{
1445
- font-family:var(--display);font-weight:300;font-size:var(--fs-3xl);line-height:.96;letter-spacing:-.04em;
1446
- max-width:16ch;margin-bottom:20px;
1447
- }
1448
- .close-title em{font-style:italic;color:var(--blue2)}
1449
- .close-lede{max-width:50ch;color:var(--cool);font-size:var(--fs-base);line-height:1.7}
1450
- .close-grid{
1451
- display:grid;grid-template-columns:minmax(0,1.25fr) minmax(0,.75fr);
1452
- gap:clamp(20px,4vw,54px);align-items:end;margin-top:clamp(26px,5vh,48px);
1453
- }
1454
- .close-cmds{display:flex;flex-direction:column;gap:12px;min-width:0}
1455
- .close-cmd{
1456
- display:flex;align-items:center;justify-content:space-between;gap:16px;min-width:0;
1457
- border:1px solid var(--line-2);border-radius:var(--r-sm);padding:14px 16px;
1458
- background:rgba(17,25,37,.9);
1459
- }
1460
- .close-cmd code{min-width:0;overflow-x:auto;white-space:nowrap;font-size:clamp(11px,1.3vw,15px);color:var(--blue2);scrollbar-width:none}
1461
- .close-cmd code::-webkit-scrollbar{display:none}
1462
- .close-cmd em{flex:none;font-style:normal;font-family:var(--mono);font-size:var(--fs-micro);letter-spacing:.14em;text-transform:uppercase;color:var(--mute)}
1463
- .close-side{display:flex;flex-direction:column;gap:12px;min-width:0}
1464
- .close-note{font-family:var(--mono);font-size:var(--fs-micro);letter-spacing:.14em;text-transform:uppercase;color:var(--mute);line-height:1.9}
1465
- .close-scene .os-dl{margin-top:4px}
1466
- /* The wordmark and footer used to follow the fees grid; behind the close they
1467
- are tightened so the whole handoff — eyebrow, title, commands — fits the
1468
- final resting viewport on a desktop instead of sliding under the nav. */
1469
- .close-scene + .mega-oracle{margin-top:clamp(36px,5vw,60px)}
1470
- .close-scene ~ footer{margin-top:clamp(52px,8vh,76px)}
1471
- @media (max-width:860px){.close-grid{grid-template-columns:1fr;align-items:start}}
1472
-
1473
1524
  /* ── environment + failure posture ───────────────────────────────── */
1474
1525
  @media (max-width:900px){
1475
1526
  .marquee{transform:none}
@@ -1522,7 +1573,7 @@ footer{margin-top:clamp(72px,12vh,120px);border-top:1px solid var(--line);paddin
1522
1573
  </div>
1523
1574
 
1524
1575
  <header class="nav">
1525
- <a class="brand" href="#top">
1576
+ <a class="brand" href="/">
1526
1577
  <span class="orbital" aria-hidden="true">
1527
1578
  <svg viewBox="0 0 100 100">
1528
1579
  <g class="ring r1"><ellipse cx="50" cy="50" rx="45" ry="17"/></g>
@@ -1532,17 +1583,19 @@ footer{margin-top:clamp(72px,12vh,120px);border-top:1px solid var(--line);paddin
1532
1583
  </svg>
1533
1584
  </span>
1534
1585
  oracle <span class="nav-chip">beta</span></a>
1535
- <nav class="nav-links" aria-label="Primary">
1536
- <a class="hide-sm" href="#cli">CLI</a>
1537
- <a class="hide-sm" href="#orchestration">Profiles</a>
1538
- <a class="hide-sm" href="#strategies">Strategies</a>
1586
+ <nav class="nav-links" id="nav-links" aria-label="Primary">
1587
+ <a href="/what-it-does/">What it does</a>
1588
+ <a href="/where-it-works/">Where it works</a>
1589
+ <a href="/security/">Security</a>
1590
+ <a href="/pricing/">Pricing</a>
1591
+ <a href="/docs/">Docs</a>
1592
+ <a class="nav-download" href="/download/">Download</a>
1539
1593
  </nav>
1594
+ <button class="nav-toggle" id="nav-toggle" type="button" aria-label="Menu" aria-expanded="false" aria-controls="nav-links"><span></span></button>
1540
1595
  </header>
1541
-
1542
1596
  <main id="top">
1543
1597
  <canvas id="gl" aria-hidden="true"></canvas>
1544
1598
  <div class="veil" aria-hidden="true"></div>
1545
-
1546
1599
  <section class="home" id="home">
1547
1600
  <svg class="ridge hero-ridge" viewBox="0 40 900 340" preserveAspectRatio="none" aria-hidden="true" focusable="false">
1548
1601
  <g class="rg rg-0"><use href="#rg0"/></g>
@@ -1554,13 +1607,12 @@ footer{margin-top:clamp(72px,12vh,120px);border-top:1px solid var(--line);paddin
1554
1607
  <div class="home-inner">
1555
1608
  <div class="hero-split">
1556
1609
  <div class="hero-lede">
1557
- <p class="hero-index rv"><b>01</b> <i></i> the premise</p>
1558
- <p class="home-kicker rv">self-custody agent control</p>
1559
- <h1 class="home-title rv" data-split>Trade across chains<br>from <em>one</em> agent</h1>
1560
- <p class="hero-sub rv">Eleven built-in EVM chains, Solana, Bitcoin, Canton reads and the Polymarket venue share one control plane; registered EVM chains extend it. Hosted Oracle reads state, prices routes and prepares unsigned artifacts without receiving a key. Your wallet signs.</p>
1610
+ <p class="home-kicker rv">control plane between AI and on-chain action</p>
1611
+ <h1 class="home-title rv" data-split>Trade, build, mint, scan across <em>15+</em> chains</h1>
1612
+ <p class="hero-sub rv">AI agents execute. You sign. Oracle is the control plane between AI and on-chain action across 15+ chains, inside any MCP client. Public routing stays unsigned. Self-hosted execution stays local, owner-gated, bounded, and receipt-verified.</p>
1561
1613
  <div class="home-actions">
1562
- <a class="enter-cta primary" href="#cli">Download</a>
1563
- <a class="enter-cta ghost" href="#cli">See the CLI</a>
1614
+ <a class="enter-cta primary" href="/download/">Download desktop</a>
1615
+ <a class="enter-cta ghost" href="/what-it-does/">How Oracle works</a>
1564
1616
  </div>
1565
1617
  <p class="hero-note-line"><span>macOS · Windows · Linux</span><i class="hero-note-sep" aria-hidden="true">·</i><span>desktop app or public CLI</span></p>
1566
1618
  </div>
@@ -1580,9 +1632,9 @@ footer{margin-top:clamp(72px,12vh,120px);border-top:1px solid var(--line);paddin
1580
1632
  poster="assets/hero/orb-poster.jpg?v=2026080623"
1581
1633
  muted loop playsinline autoplay preload="metadata"
1582
1634
  aria-label="Oracle mark">
1583
- <source src="assets/hero/orb.webm?v=2026080623" type="video/webm">
1635
+ <source src="/assets/hero/orb.webm?v=2026080623" type="video/webm">
1584
1636
  </video>
1585
- <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">
1637
+ <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">
1586
1638
  </div>
1587
1639
  <figcaption>the future is agentic</figcaption>
1588
1640
  </figure>
@@ -1614,746 +1666,104 @@ footer{margin-top:clamp(72px,12vh,120px);border-top:1px solid var(--line);paddin
1614
1666
 
1615
1667
  <div class="home-stats rv" aria-label="Oracle surface metrics">
1616
1668
  <div class="home-stat"><b id="hero-protocol-count" data-count="221">221</b><span>protocols / venues wired</span></div>
1617
- <div class="home-stat"><b id="hero-provider-count" data-count="134">134</b><span>data providers</span></div>
1618
- <div class="home-stat"><b id="hero-op-count" data-count="594">594</b><span>data operations</span></div>
1669
+ <div class="home-stat"><b id="hero-provider-count" data-count="138">138</b><span>data providers</span></div>
1670
+ <div class="home-stat"><b id="hero-op-count" data-count="605">605</b><span>data operations</span></div>
1619
1671
  <div class="home-stat"><b id="hero-chain-count">15 + EVM</b><span>working chain / venue surfaces</span></div>
1620
1672
  </div>
1621
- <p class="hero-cue" aria-hidden="true"><span></span> scroll · 02 the read</p>
1622
- </div>
1623
- </section>
1624
-
1625
- <!-- ── 02 · the thesis. A deliberately quiet passage: big type, long gaps,
1626
- one claim per line. The lines dim until the scroll reaches them, so
1627
- reading pace and scroll pace are the same thing. ── -->
1628
- <section class="thesis" id="thesis" aria-labelledby="thesis-title">
1629
- <p class="thesis-label rv" id="thesis-title">02 — the read</p>
1630
- <ol class="thesis-lines">
1631
- <li>A market emits noise continuously.</li>
1632
- <li>Most tooling hands you <em>more of it.</em></li>
1633
- <li>Oracle reads the state first — balances, positions, pools, books, venue status.</li>
1634
- <li>Then it prices routes against each other and holds every value-moving path against policy you set on your own machine.</li>
1635
- <li>What comes out is an <em>unsigned</em> action you can read before it exists.</li>
1636
- </ol>
1637
- <p class="thesis-close rv">Oracle prepares.<br>Your wallet signs.<br>Broadcast stays behind explicit arming.</p>
1638
- </section>
1639
-
1640
- <!-- ── 03 · the instrument. The frame pins and the five capability layers
1641
- resolve on scrub, each sitting on its own ridge line: raw noise at
1642
- the top, a single routed signal at the bottom. Without JS the frame
1643
- is a normal static list and every layer is already legible. ── -->
1644
- <section class="section stack-scene" id="resolve" aria-labelledby="resolve-title">
1645
- <div class="stack-run">
1646
- <div class="stack-sticky">
1647
- <div class="stack-head">
1648
- <div>
1649
- <p class="section-label rv">03 — the instrument</p>
1650
- <h2 class="section-title" id="resolve-title" data-split>Noise in. <em>Structure out.</em></h2>
1651
- </div>
1652
- <p class="stack-readout"><b data-stack-stage>read</b>five layers · one handoff</p>
1653
- </div>
1654
- <ol class="stack-layers">
1655
- <li class="stack-layer" data-stack-layer="0" data-stage="read">
1656
- <svg class="ridge layer-ridge" viewBox="0 56 900 120" preserveAspectRatio="none" aria-hidden="true" focusable="false"><g class="rg rg-0"><use href="#rg0"/></g></svg>
1657
- <div class="stack-idx">01</div>
1658
- <div class="stack-body">
1659
- <h3>Read</h3>
1660
- <p>Portfolio, markets, positions, pools, NFTs, ordinals and venue state are pulled from public RPCs and venue APIs before anything is proposed.</p>
1661
- </div>
1662
- <div class="stack-sig">state before opinion</div>
1663
- </li>
1664
- <li class="stack-layer" data-stack-layer="1" data-stage="route">
1665
- <svg class="ridge layer-ridge" viewBox="0 137 900 120" preserveAspectRatio="none" aria-hidden="true" focusable="false"><g class="rg rg-1"><use href="#rg1"/></g></svg>
1666
- <div class="stack-idx">02</div>
1667
- <div class="stack-body">
1668
- <h3>Route</h3>
1669
- <p>Quotes and bridges normalize into comparable intents, then rank net of cost — so a cheaper headline price with worse slippage cannot win by looking good.</p>
1670
- </div>
1671
- <div class="stack-sig">ranked net of cost</div>
1672
- </li>
1673
- <li class="stack-layer" data-stack-layer="2" data-stage="bound">
1674
- <svg class="ridge layer-ridge" viewBox="0 184 900 120" preserveAspectRatio="none" aria-hidden="true" focusable="false"><g class="rg rg-2"><use href="#rg2"/></g></svg>
1675
- <div class="stack-idx">03</div>
1676
- <div class="stack-body">
1677
- <h3>Bound</h3>
1678
- <p>Chain, spender, destination, amount, TTL and simulation posture are checked locally. Unconfigured means refused; an empty allowlist refuses everything.</p>
1679
- </div>
1680
- <div class="stack-sig">fail closed</div>
1681
- </li>
1682
- <li class="stack-layer" data-stack-layer="3" data-stage="prepare">
1683
- <svg class="ridge layer-ridge" viewBox="0 244 900 120" preserveAspectRatio="none" aria-hidden="true" focusable="false"><g class="rg rg-3"><use href="#rg3"/></g></svg>
1684
- <div class="stack-idx">04</div>
1685
- <div class="stack-body">
1686
- <h3>Prepare</h3>
1687
- <p>The output is an unsigned artifact: what you receive, the expected cost, the calldata shape and which app is being granted permission.</p>
1688
- </div>
1689
- <div class="stack-sig">unsigned artifact</div>
1690
- </li>
1691
- <li class="stack-layer" data-stack-layer="4" data-stage="sign">
1692
- <svg class="ridge layer-ridge" viewBox="0 281 900 120" preserveAspectRatio="none" aria-hidden="true" focusable="false"><g class="rg rg-4"><use href="#rg4"/></g></svg>
1693
- <div class="stack-idx">05</div>
1694
- <div class="stack-body">
1695
- <h3>Sign</h3>
1696
- <p>Your wallet closes the loop. Prepare is not sign, sign is not broadcast, and broadcast needs explicit arming and local signer approval.</p>
1697
- </div>
1698
- <div class="stack-sig">you sign</div>
1699
- </li>
1700
- </ol>
1701
- <div class="stack-meter" aria-hidden="true"><i></i></div>
1702
- </div>
1703
- </div>
1704
- <div class="telemetry" aria-hidden="true">
1705
- <div class="telemetry-track">
1706
- <span>read state</span><span>price routes</span><span>simulate</span><span class="k">bound by policy</span><span>prepare unsigned</span><span class="k">you sign</span><span>self custody</span><span>no hosted keys</span><span>fail closed</span><span>local signer</span><span>receipts</span>
1707
- <span>read state</span><span>price routes</span><span>simulate</span><span class="k">bound by policy</span><span>prepare unsigned</span><span class="k">you sign</span><span>self custody</span><span>no hosted keys</span><span>fail closed</span><span>local signer</span><span>receipts</span>
1708
- <span>read state</span><span>price routes</span><span>simulate</span><span class="k">bound by policy</span><span>prepare unsigned</span><span class="k">you sign</span><span>self custody</span><span>no hosted keys</span><span>fail closed</span><span>local signer</span><span>receipts</span>
1709
- </div>
1710
1673
  </div>
1711
1674
  </section>
1712
-
1713
- <section class="section" id="orchestration">
1714
- <p class="chapter-tab"><b>04</b> the control plane</p>
1715
- <p class="section-label rv">Profiles</p>
1716
- <h2 class="section-title rv" data-split>Multi-profile. <em>Customizable.</em></h2>
1717
- <p class="section-lede rv">Input hits the Oracle control plane and routes across venue profiles, multi-chain EVM, Bitcoin, Solana, and the protocol builder. Any MCP harness drives a single agent.</p>
1718
-
1719
- <div class="graph-shell rv">
1720
- <div class="graph-top">
1721
- <span>multi-profile // protocol builder // multi-chain</span>
1722
- </div>
1723
-
1724
- <div class="evolve-rail">
1725
- <span class="evolve-pill on">customizable</span>
1726
- <span class="evolve-pill on">protocol builder</span>
1727
- <span class="evolve-pill on">more chains</span>
1728
- </div>
1729
-
1730
- <div class="graph-canvas">
1731
- <div class="orch" aria-label="Oracle multi-profile graph">
1732
- <div class="row">
1733
- <div class="node" style="width:220px">
1734
- <div class="tag">you</div>
1735
- <div class="name">Input / Command</div>
1736
- <div class="sub">what you type or ask</div>
1737
- </div>
1738
- </div>
1739
-
1740
- <div class="wires" aria-hidden="true">
1741
- <svg viewBox="0 0 100 36" preserveAspectRatio="none">
1742
- <path d="M50 2 V34" pathLength="1"/><circle cx="50" cy="2" r="1.4"/><circle cx="50" cy="34" r="1.4"/>
1743
- </svg>
1744
- </div>
1745
-
1746
- <div class="row">
1747
- <div class="node hub">
1748
- <div class="tag">control plane</div>
1749
- <div class="orbital" aria-hidden="true">
1750
- <svg viewBox="0 0 100 100">
1751
- <g class="ring r1"><ellipse cx="50" cy="50" rx="46" ry="16"/></g>
1752
- <g class="ring r2"><ellipse cx="50" cy="50" rx="46" ry="16" transform="rotate(60 50 50)"/></g>
1753
- <g class="ring r3"><ellipse cx="50" cy="50" rx="46" ry="16" transform="rotate(120 50 50)"/></g>
1754
- <circle class="tickring" cx="50" cy="50" r="32"/>
1755
- <circle class="halo" cx="50" cy="50" r="10"/>
1756
- <circle class="core" cx="50" cy="50" r="7.5"/>
1757
- </svg>
1758
- </div>
1759
- <div class="name">oracle</div>
1760
- <div class="sub">route · bound · evolve</div>
1761
- </div>
1762
- </div>
1763
-
1764
- <div class="wires multi" aria-hidden="true">
1765
- <svg viewBox="0 0 100 44" preserveAspectRatio="none">
1766
- <path d="M50 2 V12" pathLength="1"/>
1767
- <path class="w-poly w-2" d="M12.5 42 V20 H50 V12" pathLength="1"/>
1768
- <path class="w-hl w-3" d="M37.5 42 V20 H50 V12" pathLength="1"/>
1769
- <path class="w-rh w-4" d="M62.5 42 V20 H50 V12" pathLength="1"/>
1770
- <path class="w-sol w-5" d="M87.5 42 V20 H50 V12" pathLength="1"/>
1771
- <circle cx="50" cy="2" r="1.3"/>
1772
- <circle class="c-poly" cx="12.5" cy="42" r="1.3"/>
1773
- <circle class="c-hl" cx="37.5" cy="42" r="1.3"/>
1774
- <circle class="c-rh" cx="62.5" cy="42" r="1.3"/>
1775
- <circle class="c-sol" cx="87.5" cy="42" r="1.3"/>
1776
- </svg>
1777
- </div>
1778
-
1779
- <div class="row profiles" id="profile-grid">
1780
- <div class="node route p-poly">
1781
- <div class="tag">profile</div>
1782
- <div class="name">polymarket agent</div>
1783
- <div class="sub">events · arb · markets</div>
1784
- <div class="chains"><span class="ch">Polymarket <img src="https://icons.llamao.fi/icons/protocols/polymarket?w=24&h=24" alt="" loading="lazy"></span></div>
1785
- </div>
1786
- <div class="node route p-hl">
1787
- <div class="tag">profile</div>
1788
- <div class="name">hyperliquid agent</div>
1789
- <div class="sub">perps · hip-3/4 · funding</div>
1790
- <div class="chains"><span class="ch">Hyperliquid <img src="https://icons.llamao.fi/icons/protocols/hyperliquid?w=24&h=24" alt="" loading="lazy"></span><span class="ch">HyperEVM 999 <img src="https://icons.llamao.fi/icons/chains/rsz_hyperliquid?w=24&h=24" alt="" loading="lazy"></span></div>
1791
- </div>
1792
- <div class="node route p-rh">
1793
- <div class="tag">profile</div>
1794
- <div class="name">robinhood agent</div>
1795
- <div class="sub">markets · memecoins · nfts</div>
1796
- <div class="chains"><span class="ch">Robinhood Chain <img src="https://icons.llamao.fi/icons/chains/rsz_robinhood?w=24&h=24" alt="" loading="lazy"></span></div>
1797
- </div>
1798
- <div class="node route p-sol">
1799
- <div class="tag">profile</div>
1800
- <div class="name">solana agent</div>
1801
- <div class="sub">jup · lst · lending · mev</div>
1802
- <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>
1803
- </div>
1804
- <div class="node route p-btc">
1805
- <div class="tag">profile</div>
1806
- <div class="name">bitcoin agent</div>
1807
- <div class="sub">ord · runes · staking · lightning</div>
1808
- <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>
1809
- </div>
1810
- <div class="node route p-stable">
1811
- <div class="tag">profile</div>
1812
- <div class="name">stable agent</div>
1813
- <div class="sub">launches · memecoins</div>
1814
- <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>
1815
- </div>
1816
- <div class="node route p-base">
1817
- <div class="tag">profile</div>
1818
- <div class="name">base agent</div>
1819
- <div class="sub">swaps · defi · onchain apps</div>
1820
- <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>
1821
- </div>
1822
- <div class="node route p-evm">
1823
- <div class="tag">profile</div>
1824
- <div class="name">evm / bridge agent</div>
1825
- <div class="sub">swaps · bridges · lending · restaking</div>
1826
- <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>
1827
- </div>
1828
- </div>
1829
-
1830
- <div class="wires funnel" aria-hidden="true">
1831
- <svg viewBox="0 0 100 62" preserveAspectRatio="none">
1832
- <path class="w-1" d="M6 2 C6 30 50 22 50 60" pathLength="1"/>
1833
- <path class="w-2" d="M19 2 C19 28 50 26 50 60" pathLength="1"/>
1834
- <path class="w-3" d="M32 2 C32 34 50 34 50 60" pathLength="1"/>
1835
- <path class="w-4" d="M45 2 C45 38 50 42 50 60" pathLength="1"/>
1836
- <path class="w-5" d="M55 2 C55 38 50 42 50 60" pathLength="1"/>
1837
- <path class="w-3" d="M68 2 C68 34 50 34 50 60" pathLength="1"/>
1838
- <path class="w-2" d="M81 2 C81 28 50 26 50 60" pathLength="1"/>
1839
- <path class="w-1" d="M94 2 C94 30 50 22 50 60" pathLength="1"/>
1840
- <circle cx="50" cy="60" r="1.8"/>
1841
- </svg>
1842
- </div>
1843
-
1844
- <div class="row builder-row">
1845
- <div class="node route p-build builder-sink">
1846
- <div class="tag">bottom layer</div>
1847
- <div class="name">protocol builder</div>
1848
- <div class="sub">every profile can funnel into new contracts, scripts, checks, deploy prep, and chain-specific scaffolds.</div>
1849
- <div class="chains"><span class="ch">any EVM · pinned factories · user-signed deploys</span></div>
1850
- </div>
1851
- </div>
1852
- </div>
1853
- </div>
1854
-
1855
-
1856
-
1857
- <div class="route-strip">
1858
- <article class="route-card p-poly">
1859
- <div class="where">polymarket agent →</div>
1860
- <h3>Polymarket <img src="https://icons.llamao.fi/icons/protocols/polymarket?w=40&h=40" alt="Polymarket" loading="lazy"></h3>
1861
- <p>Event markets, sports, arb paths, and prediction flow under bounds you set. CLOB prepare shipped in the public plane.</p>
1862
- <div class="chips">
1863
- <span class="chip-s">events</span>
1864
- <span class="chip-s">arb</span>
1865
- <span class="chip-s">clob prepare</span>
1866
- </div>
1867
- </article>
1868
- <article class="route-card p-hl">
1869
- <div class="where">hyperliquid agent →</div>
1870
- <h3>Hyperliquid <img src="https://icons.llamao.fi/icons/protocols/hyperliquid?w=40&h=40" alt="Hyperliquid" loading="lazy"></h3>
1871
- <p>Native perps, HIP-3/4 asset resolve, funding, event risk, and HyperEVM when you need HL's EVM surface.</p>
1872
- <div class="chips">
1873
- <span class="chip-s">perps</span>
1874
- <span class="chip-s">HIP-3/4</span>
1875
- <span class="chip-s">HyperEVM</span>
1876
- </div>
1877
- </article>
1878
- <article class="route-card p-rh">
1879
- <div class="where">robinhood agent →</div>
1880
- <h3>Robinhood <img src="https://icons.llamao.fi/icons/chains/rsz_robinhood?w=40&h=40" alt="Robinhood Chain" loading="lazy"></h3>
1881
- <p>RH Chain markets, memecoins, NFTs, names, token scans, and chain-local routing.</p>
1882
- <div class="chips">
1883
- <span class="chip-s">markets</span>
1884
- <span class="chip-s">memecoins</span>
1885
- <span class="chip-s">NFTs</span>
1886
- <span class="chip-s">rh chain</span>
1887
- </div>
1888
- </article>
1889
- <article class="route-card p-sol">
1890
- <div class="where">solana agent →</div>
1891
- <h3>Solana <img src="https://icons.llamao.fi/icons/chains/rsz_solana?w=40&h=40" alt="Solana" loading="lazy"></h3>
1892
- <p>Jupiter routes and one-shot swaps, Sanctum LSTs, Solend, Kamino, Meteora DLMM, Jito MEV, and Pyth feeds. The bounded lane decodes every instruction and bans delegation ops.</p>
1893
- <div class="chips">
1894
- <span class="chip-s">Jupiter</span>
1895
- <span class="chip-s">swaps</span>
1896
- <span class="chip-s">decoded ix</span>
1897
- </div>
1898
- </article>
1899
- <article class="route-card p-btc">
1900
- <div class="where">bitcoin agent →</div>
1901
- <h3>Bitcoin <img src="https://icons.llamao.fi/icons/chains/rsz_bitcoin?w=40&h=40" alt="Bitcoin" loading="lazy"></h3>
1902
- <p>Ordinals, runes, Babylon staking, Lightning, mining economics, Liquid and Stacks. Every PSBT input carries proven provenance — fees are computed, not asserted.</p>
1903
- <div class="chips">
1904
- <span class="chip-s">ordinals</span>
1905
- <span class="chip-s">runes</span>
1906
- <span class="chip-s">psbt proof</span>
1907
- </div>
1908
- </article>
1909
- <article class="route-card p-evm">
1910
- <div class="where">evm / bridge agent →</div>
1911
- <h3>Multi-chain EVM <img src="https://icons.llamao.fi/icons/chains/rsz_ethereum?w=40&h=40" alt="Ethereum" loading="lazy"></h3>
1912
- <p>Multi-chain routes, LI.FI and Relay bridges, Aave, Spark, Beefy, Symbiotic restaking. 1inch limit posts, CoW posting, ERC-8004 agent identity, EIP-7702 last-mile execute and options typed-data. Bounded evm-swap and evm-bridge lanes.</p>
1913
- <div class="chips">
1914
- <span class="chip-s">evm-swap</span>
1915
- <span class="chip-s">evm-bridge</span>
1916
- <span class="chip-s">best route</span>
1917
- </div>
1918
- </article>
1919
- <article class="route-card p-nft">
1920
- <div class="where">nft agent →</div>
1921
- <h3>Cross-chain NFTs <img src="assets/protocols/opensea.png" alt="OpenSea" loading="lazy"></h3>
1922
- <p>Research floors, holdings and PnL across 26 OpenSea chains; prepare OpenSea list, mint and cancel on six EVM networks. Ordinals via Satflow with proven PSBT provenance, Solana via Magic Eden. Reads come first, then artifacts prepared for your signature.</p>
1923
- <div class="chips">
1924
- <span class="chip-s">list</span>
1925
- <span class="chip-s">buy</span>
1926
- <span class="chip-s">floor · pnl</span>
1927
- </div>
1928
- </article>
1929
- <article class="route-card p-stable">
1930
- <div class="where">stable agent →</div>
1931
- <h3>Stable <img src="https://icons.llamao.fi/icons/chains/rsz_stable?w=40&h=40" alt="Stable" loading="lazy"></h3>
1932
- <p>Stable mainnet launch radar, memecoins, USDT0 gas, and venue ops, scanned straight from the chain's own logs.</p>
1933
- <div class="chips">
1934
- <span class="chip-s">launches</span>
1935
- <span class="chip-s">memecoins</span>
1936
- <span class="chip-s">USDT0 gas</span>
1937
- <span class="chip-s">Stable</span>
1938
- </div>
1939
- </article>
1940
- <article class="route-card p-build">
1941
- <div class="build-copy">
1942
- <div>
1943
- <div class="where">protocol builder →</div>
1944
- <h3>Build protocols</h3>
1945
- <p>Scaffold contracts, run security gates (Foundry + static checks), prepare unsigned deploys through pinned factories. You still sign every deploy.</p>
1946
- <div class="chips">
1947
- <span class="chip-s">scaffold</span>
1948
- <span class="chip-s">security gate</span>
1949
- <span class="chip-s">unsigned deploy</span>
1950
- </div>
1951
- </div>
1952
- <figure class="build-bench">
1953
- <img src="assets/protocol-build-time.jpg" width="1280" height="720" alt="Captured EVM protocol build-time comparison for a safe ERC-721 drop using Oracle-assisted and plain harness runs in one controlled trial." loading="lazy" decoding="async">
1954
- <figcaption>captured controlled comparison · safe ERC-721 drop · repository benchmark asset</figcaption>
1955
- </figure>
1956
- </div>
1957
- </article>
1958
- </div>
1959
- <div class="why-band">
1960
- <p>The model proposes. Policy bounds. You own signatures. Profiles route each request to the right surface — vaults, perps, bridges, and protocol scaffolds. Empty allowlists refuse everything.</p>
1961
- </div>
1962
- </div>
1963
-
1964
- <div class="band-head rv">
1965
- <p class="eyebrow">Custody</p>
1966
- <h2>The wallet stays yours.</h2>
1967
- </div>
1968
- <div class="moat-grid rv" style="margin-top:28px">
1969
- <article class="moat-card">
1970
- <div class="n">bound grants</div>
1971
- <h3>Wallet with temporary agent permission</h3>
1972
- <p>Max value, chain, venue, destinations, and TTL. Local x402 budgets cap what an agent may spend. Outside the grant = hard refuse, not an agent with a free wallet.</p>
1675
+ <section class="section" id="steps">
1676
+ <p class="section-label rv">What it does</p>
1677
+ <h2 class="section-title rv" data-split>Five steps. <em>You sign the last one.</em></h2>
1678
+ <p class="section-lede rv">Your agent proposes. Oracle checks it against policy you set locally, then hands your wallet something you can read before it exists.</p>
1679
+ <div class="steps-grid rv">
1680
+ <article class="step-card">
1681
+ <div class="n">01 · read</div>
1682
+ <h3>State before opinion</h3>
1683
+ <p>Balances, positions, pools, books and venue status, pulled from public RPCs before anything is proposed.</p>
1684
+ </article>
1685
+ <article class="step-card">
1686
+ <div class="n">02 · route</div>
1687
+ <h3>Ranked net of cost</h3>
1688
+ <p>Quotes and bridges compared like for like, so a cheaper headline price with worse slippage cannot win by looking good.</p>
1973
1689
  </article>
1974
- <article class="moat-card">
1975
- <div class="n">bounded surfaces</div>
1976
- <h3>Bounded signer families with format-specific decoders</h3>
1977
- <p>The optional self-hosted loopback signer decodes bounded native EVM transfers, recognized approvals, strict EVM swap and bridge calldata, EVM NFT mint envelopes, Bitcoin PSBTs, and Solana messages. It acts only after owner arming and an exact grant; hosted/keyless Oracle never receives a key. Separately installed same-host executors may expose additional exact actions under their own owner policy.</p>
1690
+ <article class="step-card">
1691
+ <div class="n">03 · bound</div>
1692
+ <h3>Fail closed</h3>
1693
+ <p>Chain, spender, destination, amount and expiry checked on your machine. Unconfigured means refused.</p>
1978
1694
  </article>
1979
- <article class="moat-card">
1980
- <div class="n">evidence</div>
1981
- <h3>See it before you approve. Prove it after.</h3>
1982
- <p>Before you approve: what you receive, the expected cost, and which app gets permission. After: whether it succeeded, what changed, and whether any permission is still active. Exact tax-lot records and observe-only finality reconciliation keep the ledger honest. Review unsigned transactions on a hardware wallet.</p>
1695
+ <article class="step-card">
1696
+ <div class="n">04 · prepare</div>
1697
+ <h3>An unsigned artifact</h3>
1698
+ <p>What you receive, the expected cost, and which app is being granted permission. Readable before it exists.</p>
1983
1699
  </article>
1984
- <article class="moat-card">
1985
- <div class="n">fail closed</div>
1986
- <h3>Unconfigured means refused</h3>
1987
- <p>A fresh install signs nothing. Prepare is not sign, and sign is not broadcast. Destination allowlists stop silent router drift; empty allowlists refuse everything until you add entries. Tenant RBAC scopes who may prepare what; governance votes prepare unsigned.</p>
1700
+ <article class="step-card">
1701
+ <div class="n">05 · sign</div>
1702
+ <h3>Your wallet closes the loop</h3>
1703
+ <p>Public routing stops at prepare. Self-hosted signing and broadcast stay local, owner-gated, bounded, and receipt-verified.</p>
1988
1704
  </article>
1989
1705
  </div>
1706
+ <p class="cmd-hint rv section-more"><a href="/what-it-does/">See the full sequence, step by step →</a></p>
1707
+ </section>
1990
1708
 
1991
- <div class="selfcustody rv">
1992
- <p class="section-label rv">Works in any harness</p>
1993
- <h2 class="section-title rv" data-split>Ask in <em>your</em> agent.</h2>
1994
- <p class="section-lede rv">Oracle installs into supported MCP clients for skills, quotes, cards, and unsigned prepare. Prepare is not sign, and sign is not broadcast. The optional self-hosted local signer (<code>oracle signer</code>) is loopback-only, owner-policy and exact-grant bounded; hosted/keyless Oracle receives no key.</p>
1995
- <div class="agent-install rv">
1996
- <span>Add Oracle to your agent:</span>
1997
- <div class="install-cmds">
1998
- <button class="btn" onclick="navigator.clipboard.writeText('oracle chat');var b=this;b.textContent='Copied ✓';setTimeout(function(){b.textContent='Oracle'},1500)">Oracle</button>
1999
- <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>
2000
- <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>
2001
- <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>
2002
- <button class="btn btn-vscode" onclick="navigator.clipboard.writeText('oracle mcp install claude-desktop');var b=this;b.textContent='Copied ✓';setTimeout(function(){b.textContent='Claude Desktop'},1500)">Claude Desktop</button>
2003
- <button class="btn btn-copilot" onclick="navigator.clipboard.writeText('oracle mcp install codex');var b=this;b.textContent='Copied ✓';setTimeout(function(){b.textContent='Codex'},1500)">Codex</button>
2004
- <button class="btn" onclick="navigator.clipboard.writeText('oracle mcp install copilot');var b=this;b.textContent='Copied ✓';setTimeout(function(){b.textContent='Copilot'},1500)">Copilot</button>
2005
- <button class="btn" onclick="navigator.clipboard.writeText('oracle mcp install vscode');var b=this;b.textContent='Copied ✓';setTimeout(function(){b.textContent='VS Code'},1500)">VS Code</button>
2006
- <button class="btn" onclick="navigator.clipboard.writeText('oracle mcp install generic');var b=this;b.textContent='Copied ✓';setTimeout(function(){b.textContent='Generic MCP'},1500)">Generic MCP</button>
2007
- </div>
2008
- <p class="cmd-hint">Click copies the install command — paste it in your terminal</p>
2009
- </div>
2010
- <div class="agent-prompts rv">
2011
- <figure class="agent-panel is-claude" data-agent-seq
2012
- data-ask="is this token safe to buy on base?">
2013
- <div class="agent-box">
2014
- <div class="agent-line"><span class="agent-typed" data-ph="Do anything"></span><span class="agent-caret"></span></div>
2015
- <div class="agent-bar">
2016
- <svg class="ai" viewBox="0 0 24 24" aria-hidden="true"><path d="M12 5v14M5 12h14"/></svg>
2017
- <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>
2018
- <span class="agent-spacer"></span>
2019
- <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>
2020
- <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>
2021
- <span class="ca-orb"><svg viewBox="0 0 24 24" aria-hidden="true"><path d="M5 10v4M9 6v12M13 8v8M17 10v4M21 11v2"/></svg></span>
2022
- </div>
2023
- </div>
2024
- <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>
2025
- <noscript><p class="agent-ask">is this token safe to buy on base?</p></noscript>
2026
- </figure>
2027
- <figure class="agent-panel is-codex" data-agent-seq
2028
- data-ask="move 5k usdc into weth, cheapest route">
2029
- <div class="cx-chips">
2030
- <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>
2031
- <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>
2032
- <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>
2033
- </div>
2034
- <div class="agent-box">
2035
- <div class="agent-line"><span class="agent-typed" data-ph="Describe a task or ask a question"></span><span class="agent-caret"></span></div>
2036
- <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>
2037
- </div>
2038
- <div class="agent-bar">
2039
- <span class="cx-auto">Auto</span>
2040
- <svg class="ai" viewBox="0 0 24 24" aria-hidden="true"><path d="M12 5v14M5 12h14"/></svg>
2041
- <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>
2042
- <svg class="ai" viewBox="0 0 24 24" aria-hidden="true"><path d="M6 9l6 6 6-6"/></svg>
2043
- <span class="agent-spacer"></span>
2044
- <span class="cx-model">Fable 5</span>
2045
- <span class="cx-eff">High</span>
2046
- <span class="cx-ring"></span>
2047
- </div>
2048
- <p class="agent-out" hidden>best route across available source adapters &middot; quoted live &middot; <b>unsigned</b> &mdash; your wallet signs</p>
2049
- <noscript><p class="agent-ask">move 5k usdc into weth, cheapest route</p></noscript>
2050
- </figure>
2051
- </div>
2052
- <p class="agent-caption rv">Same tool from the terminal, the desktop app, any MCP client, or your agent on Telegram, Discord, WhatsApp, Signal, Photon and Buzz. A multi-bot gateway runs role- and chain-scoped bots over an A2A bus, and Allow/Deny approval cards render natively on Telegram, Discord, WhatsApp and Photon. Hosted/keyless cannot hold keys; self-host fills through the local signer.</p>
2053
- <div class="agent-icons rv" style="display:flex;flex-wrap:wrap;gap:10px;justify-content:center;margin-top:14px"><span style="display:inline-flex;align-items:center;gap:5px;padding:4px 10px;border:1px solid var(--line);border-radius:999px;font-family:var(--mono);font-size:10px;color:var(--cool);letter-spacing:.08em"><svg width="14" height="14" viewBox="0 0 24 24" fill="none"><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm4.64 6.8c-.15 1.58-.8 5.42-1.13 7.19-.14.75-.42 1-.68 1.03-.58.05-1.02-.38-1.58-.75-.88-.58-1.38-.94-2.23-1.5-.99-.65-.35-1.01.22-1.59.15-.15 2.71-2.48 2.76-2.69.01-.03.01-.14-.07-.2-.08-.06-.19-.04-.27-.02-.12.03-1.96 1.25-5.54 3.66-.52.36-1 .53-1.42.52-.47-.01-1.37-.26-2.03-.48-.82-.27-1.47-.42-1.41-.87.03-.24.36-.49.99-.74 3.87-1.69 6.45-2.8 7.74-3.34 3.69-1.53 4.45-1.8 4.95-1.81.11 0 .36.03.52.17.14.12.18.28.2.4.02.11.04.37.01.56z" fill="#229ED9"/></svg>Telegram</span><span style="display:inline-flex;align-items:center;gap:5px;padding:4px 10px;border:1px solid var(--line);border-radius:999px;font-family:var(--mono);font-size:10px;color:var(--cool);letter-spacing:.08em"><svg width="14" height="14" viewBox="0 0 24 24" fill="none"><path d="M19.27 5.33C17.94 4.71 14.48 3.26 10.68 4.77a27.98 27.98 0 0 0-6.02 3.13c-.87.51-1.3.9-1.23 1.44.07.46.57.73 1.42 1.12l.33.15c.85.38 1.28.57 1.43 1.01.08.23.07.6-.08 1.1-.15.51-.5 1.15-1.02 2.02-.34.57-.5.85-.37.99.14.15.48.11 1.09-.26 1.76-1.07 3.18-1.93 4.23-2.59 3.22-2.06 5.08-2.82 5.55-2.28.18.21.06.84-.34 1.85-.39 1.01-1.05 2.32-1.51 3.13-.24.43-.37.64-.45.74-.11.14-.2.16-.3.15-.3-.03-.73-.45-1.41-1.3-.5-.62-.94-1.08-1.26-1.25-.64-.34-1.08-.13-1.14.26-.05.29.14.61.56 1.02.43.41 1.15 1.06 1.56 1.5.53.58.82.98.85 1.28.02.24-.04.47-.46.75-.42.27-.86.41-1.34.41-.41 0-.86-.1-1.35-.29-1.7-.68-3.25-1.94-4.64-3.79a18.7 18.7 0 0 1-3.13-5.08c-.38-.79-.16-1.31.41-1.63.47-.27 1.12-.22 1.96.14a10.26 10.26 0 0 1 3.74 2.28c.36.35.68.52.96.52.21 0 .44-.07.69-.22.37-.22.65-.6.86-1.13.21-.53.34-1.14.34-1.57 0-.5-.15-.88-.45-1.12-.52-.42-1.44-.52-2.76-.3-1.71.28-3.62 1.03-5.72 2.24l-.86.49a6.72 6.72 0 0 1-1.02.51c-.37.14-.64.17-.81.09-.18-.1-.24-.29-.2-.58.04-.3.16-.56.36-.76z" fill="#5865F2"/></svg>Discord</span><span style="display:inline-flex;align-items:center;gap:5px;padding:4px 10px;border:1px solid var(--line);border-radius:999px;font-family:var(--mono);font-size:10px;color:var(--cool);letter-spacing:.08em"><svg width="14" height="14" viewBox="0 0 24 24" fill="none"><path d="M17.472 14.382c-.297-.149-1.758-.867-2.03-.967-.273-.099-.471-.148-.67.15-.197.297-.767.966-.94 1.164-.173.199-.347.223-.644.075-.297-.15-1.255-.463-2.39-1.475-.883-.788-1.48-1.761-1.653-2.059-.173-.297-.018-.458.13-.606.134-.133.298-.347.446-.52.149-.174.198-.298.298-.497.099-.198.05-.371-.025-.52-.075-.149-.669-1.612-.916-2.207-.242-.579-.487-.5-.669-.51-.173-.008-.371-.01-.57-.01-.198 0-.52.074-.792.372-.272.297-1.04 1.016-1.04 2.479 0 1.462 1.065 2.875 1.213 3.074.149.198 2.096 3.2 5.077 4.487.709.306 1.262.489 1.694.625.712.227 1.36.195 1.871.118.571-.085 1.758-.719 2.006-1.413.248-.694.248-1.289.173-1.413-.074-.124-.272-.198-.57-.347m-5.421 7.403-.008-.005h.008l.005-.002h-.005V19.5c0-.248.009-.498.005-.746l.003-.003c.009 0 .018.001.027.002h-.02l-.011.008-.004.024zm-.006-.225h-.003l-.008.003.003.011.003-.005a.018.018 0 0 1 .005-.009zm-.004.17h.003l-.005-.002.002.001v.001zm.02-.003.003.003-.002-.002-.001-.001zM12 0C5.373 0 0 5.373 0 12s5.373 12 12 12 12-5.373 12-12S18.627 0 12 0z" fill="#25D366"/></svg>WhatsApp</span><span style="display:inline-flex;align-items:center;gap:5px;padding:4px 10px;border:1px solid var(--line);border-radius:999px;font-family:var(--mono);font-size:10px;color:var(--cool);letter-spacing:.08em"><svg width="14" height="14" viewBox="0 0 24 24" fill="none"><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zM7.64 15.52c-.38-.66-.6-1.41-.6-2.2 0-2.63 2.14-4.77 4.77-4.77 1.27 0 2.47.5 3.37 1.4.9.9 1.4 2.1 1.4 3.37 0 2.63-2.14 4.77-4.77 4.77-.79 0-1.54-.22-2.2-.6L7.5 18l.14-2.48z" fill="#3B82F6"/></svg>Signal</span><span style="display:inline-flex;align-items:center;gap:5px;padding:4px 10px;border:1px solid var(--line);border-radius:999px;font-family:var(--mono);font-size:10px;color:var(--cool);letter-spacing:.08em"><svg width="14" height="14" viewBox="0 0 24 24" fill="none"><path d="M12 2L2 7l10 5 10-5-10-5zM2 17l10 5 10-5M2 12l10 5 10-5" stroke="#7C4DFF" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg>Buzz</span></div>
2054
- <div class="venues rv">
2055
- <div class="venues-head"><span>models // harnesses</span><span><b>bring your own model</b> · oracle is the control plane</span></div>
2056
- <div class="marquee"><div class="track" id="llm-track"></div></div>
1709
+ <section class="section" id="reach">
1710
+ <p class="section-label rv">Where it works</p>
1711
+ <h2 class="section-title rv" data-split>Your agent. <em>Your chains.</em></h2>
1712
+ <p class="section-lede rv">Oracle installs into any MCP client and operates across 15+ chains and venues. Register any extra EVM chain with a chain id and an RPC.</p>
1713
+ <div class="venues rv" id="protocol-marquee" aria-label="Supported protocols and venues">
1714
+ <div class="venues-head"><span>protocol surface</span><b>221 protocols and venues</b></div>
1715
+ <div class="marquee"><div class="track" id="proto-track-a"></div></div>
1716
+ <div class="marquee rev"><div class="track" id="proto-track-b"></div></div>
2057
1717
  </div>
2058
-
2059
- <p class="section-label rv">Teams</p>
2060
- <h2 class="section-title rv" data-split>Specialists that <em>hand off</em>, not a single agent guessing.</h2>
2061
- <p class="section-lede rv">A team is a compiled pipeline: a scanner gathers bounded public evidence, a sentiment agent scores the narrative, a strategy agent writes a falsifiable thesis, a risk gate enforces every cap exactly, and an executor prepares an operator handoff. Each stage is a different model if you want it to be. The last stage still cannot sign.</p>
2062
- <div class="teams-flow rv">
2063
- <span class="teams-node"><b>Scanner</b><i>deterministic</i></span>
2064
- <span class="teams-arrow">→</span>
2065
- <span class="teams-node"><b>Sentiment</b><i>model</i></span>
2066
- <span class="teams-arrow">→</span>
2067
- <span class="teams-node"><b>Strategy</b><i>model</i></span>
2068
- <span class="teams-arrow">→</span>
2069
- <span class="teams-node"><b>Risk</b><i>policy</i></span>
2070
- <span class="teams-arrow">→</span>
2071
- <span class="teams-node is-terminal"><b>Executor</b><i>operator</i></span>
2072
- </div>
2073
- <div class="selfcustody-grid">
2074
- <div>
2075
- <h4>The shape is compiled, not suggested</h4>
2076
- <p>A team that lets a non-executor prepare intents, or puts the executor anywhere but last, does not compile. Policy without wallet confirmation and a kill switch is refused. So is an unbounded chain allowlist, an expired policy, and a DAG with a cycle.</p>
2077
- </div>
2078
- <div>
2079
- <h4>Autonomy is opt-in by construction</h4>
2080
- <p>Six modes: draft, shadow, confirm, armed, autonomous, halted. Templates ship as draft. Autonomous mode is rejected outright unless the policy carries an explicit opt-in flag, so it is never something you forget to turn off.</p>
2081
- </div>
2082
- <div>
2083
- <h4>Same team, same hash, every machine</h4>
2084
- <p>Compilation is canonical: key order does not change the team hash, and handoff payloads hash the same regardless of how they were assembled. A team is an identity you can pin, diff, and audit.</p>
2085
- </div>
2086
- <div>
2087
- <h4>Still prepare-only at the end</h4>
2088
- <p>Every handoff reports executionAllowed, backendSigner, signingReady and broadcastReady as false. All 14 team tools declare that they neither sign nor broadcast. Secret-like values are stripped at compile time, so a key cannot ride along in agent metadata.</p>
1718
+ <div class="reach-cols rv">
1719
+ <div>
1720
+ <div class="venues-head"><span>clients</span></div>
1721
+ <div class="reach-chips">
1722
+ <span>Claude</span><span>ChatGPT</span><span>Cursor</span><span>Codex</span>
1723
+ <span>VS Code</span><span>Copilot</span><span>Telegram</span><span>Discord</span>
1724
+ <span>WhatsApp</span><span>Signal</span><span>Any MCP client</span>
2089
1725
  </div>
2090
1726
  </div>
2091
- <p class="cmd-hint teams-templates rv">Seven templates ship in the box: Hyperliquid Alpha, Perp Market Breadth, Perp Technical Strategy, Basket Relative Value, Wallet Watch, EVM Launch Radar, NFT Mint Guard. Teams run in the <b>desktop app</b> — the CLI stays a single-agent shell.</p>
2092
-
2093
- <p class="section-label rv teams-next">Self-custodial agents</p>
2094
- <h2 class="section-title rv" data-split>No third party holds your keys. Not even Oracle.</h2>
2095
- <div class="selfcustody-grid">
2096
- <div>
2097
- <h4>Everything runs on your machine</h4>
2098
- <p>The CLI and desktop app are public clients. Hosted/keyless services may read and prepare unsigned artifacts, but they receive no wallet key. Signing stays with your wallet or an optional owner-operated local signer.</p>
2099
- </div>
2100
- <div>
2101
- <h4>Hosted keys never reach Oracle</h4>
2102
- <p>Hosted/keyless Oracle holds no cloud key. Self-host keeps your key in an encrypted local vault behind a short-lived loopback signer. Public modules cannot import house-signer code — a boundary test fails the build if they do.</p>
2103
- </div>
2104
- <div>
2105
- <h4>Hosted wallets sign outside Oracle</h4>
2106
- <p>Hosted/keyless Oracle prepares an artifact for your extension or hardware wallet; self-host executes through the loopback signer under sealed local policy. If you close the prompt, nothing happened.</p>
2107
- </div>
2108
- <div>
2109
- <h4>Nothing to seize, nothing to leak</h4>
2110
- <p>No custody means no honeypot. No server of user keys to breach, no operator who can freeze you, no counterparty risk from Oracle itself. Delete the app and your funds never moved.</p>
1727
+ <div>
1728
+ <div class="venues-head"><span>chains and venues</span></div>
1729
+ <div class="reach-chips">
1730
+ <span>Ethereum</span><span>Solana</span><span>Bitcoin</span><span>Hyperliquid</span>
1731
+ <span>Base</span><span>Arbitrum</span><span>Optimism</span><span>Polygon</span>
1732
+ <span>BNB Chain</span><span>Avalanche</span><span>HyperEVM</span><span>Polymarket</span>
1733
+ <span>Robinhood</span><span>Stable</span><span>Abstract</span><span>+ any EVM</span>
2111
1734
  </div>
2112
1735
  </div>
2113
1736
  </div>
1737
+ <p class="cmd-hint rv section-more"><a href="/where-it-works/">Every chain and what Oracle can do on it →</a></p>
1738
+ </section>
2114
1739
 
2115
-
2116
- <div class="motion-lab rv" aria-label="Oracle high-end operator stack">
2117
- <aside class="atlas-sticky motion-command" aria-label="Oracle runtime metrics">
2118
- <div class="atlas-orbit" aria-hidden="true">
2119
- <div class="orbital">
2120
- <svg viewBox="0 0 100 100">
2121
- <g class="ring r1"><ellipse cx="50" cy="50" rx="46" ry="16"/></g>
2122
- <g class="ring r2"><ellipse cx="50" cy="50" rx="46" ry="16" transform="rotate(60 50 50)"/></g>
2123
- <g class="ring r3"><ellipse cx="50" cy="50" rx="46" ry="16" transform="rotate(120 50 50)"/></g>
2124
- <circle class="tickring" cx="50" cy="50" r="32"/>
2125
- <circle class="halo" cx="50" cy="50" r="10"/>
2126
- <circle class="core" cx="50" cy="50" r="7.5"/>
2127
- </svg>
2128
- </div>
2129
- </div>
2130
- <div class="atlas-copy">
2131
- <div class="atlas-count"><span id="atlas-protocol-count">110</span></div>
2132
- <p class="atlas-sub">Featured logo-rail subset. The source-backed 221 protocol and venue total remains in the hero.</p>
2133
- <div class="atlas-ledger">
2134
- <div><span>quote / route</span><b id="atlas-route-count">0</b></div>
2135
- <div><span>prepare / policy</span><b id="atlas-prepare-count">0</b></div>
2136
- <div><span>featured chains</span><b id="atlas-chain-count">13</b></div>
2137
- <div><span>custody</span><b>self</b></div>
2138
- </div>
2139
- </div>
2140
- </aside>
2141
- <div class="motion-main">
2142
- <div class="toolbelt" aria-label="What the operator stack does">
2143
- <span>read state</span><span>price routes</span><span>prepare unsigned</span><span>enforce policy</span><span>you sign</span>
2144
- </div>
2145
- <div class="operator-grid" id="protocol-atlas-grid" aria-live="polite"></div>
2146
- </div>
2147
- </div>
2148
- <div class="venues rv">
2149
- <div class="venues-head"><span>protocols // venues</span></div>
2150
- <div class="marquee"><div class="track" id="proto-track-a"></div></div>
2151
- <div class="marquee rev"><div class="track" id="proto-track-b"></div></div>
2152
- </div>
2153
- </section>
2154
-
2155
-
2156
- <div class="strategy-surface rv" id="strategies" aria-labelledby="strategies-title">
2157
- <div class="strategy-head">
2158
- <div>
2159
- <div class="strategy-kicker">Agentic strategies</div>
2160
- <h3 id="strategies-title">Move liquidity. Bound the risk.</h3>
2161
- </div>
2162
- <p>Oracle reads live markets, checks policy, and prepares unsigned actions. The cards below are the main shipped surfaces, not a roadmap.</p>
2163
- </div>
2164
- <figure class="route-proof rv">
2165
- <video id="agent-session" width="1280" height="720"
2166
- poster="assets/hero/agent-session-poster.jpg"
2167
- muted loop playsinline preload="none"
2168
- aria-label="Oracle agent session: swap ranked net of cost, NFT mint pipeline, protocol scaffold. You sign.">
2169
- <source src="assets/hero/agent-session.webm" type="video/webm">
2170
- <source src="assets/hero/agent-session.mp4" type="video/mp4">
2171
- </video>
2172
- <img id="route-still" src="assets/hero/agent-session-poster.jpg" alt="Oracle agent session showing a route comparison, NFT mint pipeline, and protocol scaffold awaiting user review" width="1280" height="720" loading="lazy" decoding="async">
2173
- <figcaption>swap · mint · scaffold · you sign</figcaption>
2174
- </figure>
2175
- <figure class="route-proof rv" style="margin-top:18px">
2176
- <svg viewBox="0 0 868 456" preserveAspectRatio="xMidYMid meet" class="route-tree" aria-label="Oracle routing tree">
2177
- <style>
2178
- .route-tree text { fill:#f4f8fc; font-size:15px; font-weight:600; letter-spacing:.02em; paint-order:stroke; stroke:#080d15; stroke-width:2px; stroke-linejoin:round; }
2179
- .route-tree rect { fill:#111d2b; stroke:rgba(124,196,255,.72); }
2180
- .route-tree line { stroke:#8bd2ff; stroke-dasharray:20 8; animation:flow-down 3s linear infinite; opacity:.92; }
2181
- @keyframes flow-down { to { stroke-dashoffset: -56; } }
2182
- </style>
2183
- <defs>
2184
- <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>
2185
- </defs>
2186
- <rect x="334" y="30" width="200" height="40" rx="8" fill="rgba(124,196,255,.1)" stroke="var(--blue)" stroke-width="1.5"/>
2187
- <text x="434" y="55" text-anchor="middle" fill="var(--warm)" font-family="var(--mono)" font-size="13">oracle route swap</text>
2188
- <line x1="434" y1="70" x2="434" y2="110" stroke="var(--blue)" stroke-width="2" opacity=".8"/>
2189
- <line x1="434" y1="110" x2="110" y2="160" stroke="var(--blue)" stroke-width="1.5" marker-end="url(#arrow-t2)" opacity=".8"/>
2190
- <line x1="434" y1="110" x2="270" y2="160" stroke="var(--blue)" stroke-width="1.5" marker-end="url(#arrow-t2)" opacity=".8"/>
2191
- <line x1="434" y1="110" x2="434" y2="160" stroke="var(--blue)" stroke-width="1.5" marker-end="url(#arrow-t2)" opacity=".8"/>
2192
- <line x1="434" y1="110" x2="598" y2="160" stroke="var(--blue)" stroke-width="1.5" marker-end="url(#arrow-t2)" opacity=".8"/>
2193
- <line x1="434" y1="110" x2="758" y2="160" stroke="var(--blue)" stroke-width="1.5" marker-end="url(#arrow-t2)" opacity=".8"/>
2194
- <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"/>
2195
- <text x="110" y="192" text-anchor="middle" fill="var(--blue2)" font-family="var(--mono)" font-size="12">paraswap</text>
2196
- <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"/>
2197
- <text x="270" y="192" text-anchor="middle" fill="var(--blue2)" font-family="var(--mono)" font-size="12">cow protocol</text>
2198
- <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"/>
2199
- <text x="434" y="192" text-anchor="middle" fill="var(--blue2)" font-family="var(--mono)" font-size="12">uniswap v3</text>
2200
- <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"/>
2201
- <text x="598" y="192" text-anchor="middle" fill="var(--blue2)" font-family="var(--mono)" font-size="12">lifi</text>
2202
- <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"/>
2203
- <text x="758" y="192" text-anchor="middle" fill="var(--blue2)" font-family="var(--mono)" font-size="12">uniswap v4</text>
2204
- <line x1="110" y1="204" x2="110" y2="240" stroke="var(--blue)" stroke-width="1.5" opacity=".6"/>
2205
- <line x1="270" y1="204" x2="270" y2="240" stroke="var(--blue)" stroke-width="1.5" opacity=".6"/>
2206
- <line x1="434" y1="204" x2="434" y2="240" stroke="var(--blue)" stroke-width="1.5" opacity=".6"/>
2207
- <line x1="598" y1="204" x2="598" y2="240" stroke="var(--blue)" stroke-width="1.5" opacity=".6"/>
2208
- <line x1="758" y1="204" x2="758" y2="240" stroke="var(--blue)" stroke-width="1.5" opacity=".6"/>
2209
- <rect x="334" y="248" width="200" height="40" rx="8" fill="rgba(124,196,255,.15)" stroke="var(--blue)" stroke-width="1.5"/>
2210
- <text x="434" y="271" text-anchor="middle" fill="var(--warm)" font-family="var(--mono)" font-size="12">ranked net of cost</text>
2211
- <line x1="110" y1="240" x2="434" y2="248" stroke="var(--blue)" stroke-width="1.5" opacity=".5"/>
2212
- <line x1="270" y1="240" x2="434" y2="248" stroke="var(--blue)" stroke-width="1.5" opacity=".5"/>
2213
- <line x1="434" y1="240" x2="434" y2="248" stroke="var(--blue)" stroke-width="1.5" opacity=".5"/>
2214
- <line x1="598" y1="240" x2="434" y2="248" stroke="var(--blue)" stroke-width="1.5" opacity=".5"/>
2215
- <line x1="758" y1="240" x2="434" y2="248" stroke="var(--blue)" stroke-width="1.5" opacity=".5"/>
2216
- </svg>
2217
- </figure>
2218
-
2219
-
2220
-
2221
- <div class="strategy-grid">
2222
- <article class="strategy-card">
2223
- <div class="mode">quote · route · prepare</div>
2224
- <h4>Route engine</h4>
2225
- <p>Price swaps across Paraswap, Cow, Uniswap, LI.FI and more. Oracle ranks net cost and returns unsigned steps.</p>
2226
- </article>
2227
- <article class="strategy-card">
2228
- <div class="mode">bridge · revoke · sign</div>
2229
- <h4>Cross-chain bridges</h4>
2230
- <p>deBridge, ChangeNOW, LI.FI, Squid, Stargate, THORChain, Bungee, Connext, Wormhole and Across, with approval checks first.</p>
2231
- </article>
2232
- <article class="strategy-card">
2233
- <div class="mode">perps · funding · hedge</div>
2234
- <h4>Perps and funding</h4>
2235
- <p>Hyperliquid, GMX, dYdX, Drift and Vertex. Funding, books, positions and unsigned order prep in one lane.</p>
2236
- </article>
2237
- <article class="strategy-card">
2238
- <div class="mode">LP · vault · stake</div>
2239
- <h4>LP and yield</h4>
2240
- <p>Read positions, compare vaults, model fees and lockups, then prepare deposits, exits or range changes.</p>
2241
- </article>
2242
- <article class="strategy-card">
2243
- <div class="mode">farm · hedge · exit</div>
2244
- <h4>Farming playbooks</h4>
2245
- <p>Stable loops, collateral-plus-perp hedges and LP incentives, each with exposure, monitor and exit rules.</p>
2246
- </article>
2247
- <article class="strategy-card">
2248
- <div class="mode">split · limit · dca</div>
2249
- <h4>TWAP and limit orders</h4>
2250
- <p>Split buys or sells into child orders, cap participation, or stage limit/DCA plans from live depth.</p>
2251
- </article>
2252
- <article class="strategy-card">
2253
- <div class="mode">rebalance · stake · yield</div>
2254
- <h4>LP rebalance and staking</h4>
2255
- <p>Cross-chain LP rebalance ranks destination liquidity net of gas. HyperCore HYPE stake, delegate and 7-day unstake. Yield vaults compared before unsigned deposits.</p>
2256
- </article>
2257
- <article class="strategy-card">
2258
- <div class="mode">scan · approve · revoke</div>
2259
- <h4>Approval safety</h4>
2260
- <p>Find risky allowances, bind exact approval digests, and prepare revokes without treating a scoped scan as full safety.</p>
2261
- </article>
2262
- <article class="strategy-card">
2263
- <div class="mode">source · flag · gate</div>
2264
- <h4>Contract risk</h4>
2265
- <p>Heuristic source checks flag access control, reentrancy shape, unlimited approvals, oracle risk and replay hazards.</p>
2266
- </article>
2267
- <article class="strategy-card">
2268
- <div class="mode">snipe · nft · ordinals</div>
2269
- <h4>Token and NFT radar</h4>
2270
- <p>EVM token sniper, OpenSea, Magic Eden, Solana NFTs, Bitcoin ordinals and runes feed prepare-only plans.</p>
2271
- </article>
2272
- <article class="strategy-card">
2273
- <div class="mode">events · clob · outcomes</div>
2274
- <h4>Polymarket and outcomes</h4>
2275
- <p>Polymarket CLOB, Kalshi data and Hyperliquid HIP-4 outcomes share one event-market research lane.</p>
2276
- </article>
2277
- <article class="strategy-card">
2278
- <div class="mode">budget · pay · cap</div>
2279
- <h4>x402 budgets</h4>
2280
- <p>Decode payment requests and prepare exact capped spend. No signature, header or facilitator call is created by default.</p>
2281
- </article>
2282
- <article class="strategy-card">
2283
- <div class="mode">mcp · plugins · tools</div>
2284
- <h4>Agent harnesses</h4>
2285
- <p>Claude, Codex, Cursor, ChatGPT and VS Code get the same Oracle tools through MCP and plugin installs.</p>
2286
- </article>
2287
- <article class="strategy-card">
2288
- <div class="mode">xurl · vision · fence</div>
2289
- <h4>Fenced web tools</h4>
2290
- <p>xurl, vision and web helpers run through explicit allowlists. The public tool policy still has no shell tool.</p>
2291
- </article>
2292
- <article class="strategy-card">
2293
- <div class="mode">session · rename · fanout</div>
2294
- <h4>Saved sessions</h4>
2295
- <p>New chats are remembered, older chats resume from the picker, and selected sessions can rename, delete or fan out.</p>
2296
- </article>
2297
- <article class="strategy-card">
2298
- <div class="mode">chat · approve · notify</div>
2299
- <h4>Chat approvals</h4>
2300
- <p>Telegram, Discord, WhatsApp, Photon and Buzz receive scoped prompts, alerts and Allow/Deny approval cards.</p>
2301
- </article>
2302
- <article class="strategy-card">
2303
- <div class="mode">mint · quantity · gas-war</div>
2304
- <h4>Multi mint</h4>
2305
- <p>Unsigned NFT mints with a quantity you set, wallet-signable calldata, and gas-war caps so a contested drop cannot unbounded-bid.</p>
2306
- </article>
2307
- <article class="strategy-card">
2308
- <div class="mode">lp · sell-sim · native</div>
2309
- <h4>Native token exit</h4>
2310
- <p>One-sided exit quotes the bag back to the chain's native or base asset via the liquidity pool, then sell-sims before you prepare. A clean book quote is not a SAFE until the sim passes.</p>
2311
- </article>
2312
- <article class="strategy-card">
2313
- <div class="mode">wallet · etherscan · bubblemaps</div>
2314
- <h4>Chain investigator</h4>
2315
- <p>Wallet evidence via Etherscan, Solscan, Blockscout, Bitcoin. Holder graphs via Bubblemaps. Read-only. Flow is not identity.</p>
2316
- </article>
2317
- <article class="strategy-card">
2318
- <div class="mode">observe · flash-loan · arm</div>
2319
- <h4>Flash loans and MEV</h4>
2320
- <p>Loopback observer on Base and Arbitrum. Flash-loan execute stays idle until you arm one exact loan. No searcher loop. You still sign.</p>
2321
- </article>
2322
- </div>
2323
- <div class="strategy-posture"><b>Public posture:</b> read, simulate, alert and prepare unsigned actions. Anything that moves value still needs explicit arming, local signer approval and your wallet signature.</div>
2324
-
2325
- </div>
2326
-
2327
- <section class="section" id="chains">
2328
- <p class="chapter-tab"><b>05</b> the surface area</p>
2329
- <p class="section-label rv">Chains</p>
2330
- <h2 class="section-title rv" data-split>Where you can <em>operate.</em></h2>
2331
- <p class="section-lede rv">Every built-in EVM chain exposes the full scanner set. <b>Route</b> means Oracle can price and prepare a swap there. Register any extra EVM chain with a chain id and an RPC; unsupported paths fail closed.</p>
2332
- <div class="chain-grid" id="chain-grid"></div>
2333
- <div class="hl-surface rv">
2334
- <div class="venues-head"><span>hyperliquid // what oracle actually does</span></div>
2335
- <div class="hl-grid">
2336
- <article><h3>Perps</h3><p>Asset info, order + bracket prepare, cancel, leverage and isolated-margin updates. Tick and lot sizing enforced to 5 sig figs.</p></article>
2337
- <article><h3>Spot &amp; markets</h3><p>Spot meta, mids, L2 book, candles, market and coin datapoints, leaderboards.</p></article>
2338
- <article><h3>Staking</h3><p>Validator summaries, delegations, rewards and history. Stake deposit, withdraw and delegate prepare with a 7-day unstaking queue.</p></article>
2339
- <article><h3>Outcome markets</h3><p>HIP-4 outcome listing plus order and cancel prepare.</p></article>
2340
- <article><h3>Account state</h3><p>Clearinghouse state, open orders, user fills, positions.</p></article>
2341
- <article><h3>HyperEVM</h3><p>Token search and metadata on Hyperliquid, routed with the EVM lane.</p></article>
2342
- </div>
2343
- </div>
2344
- </section>
1740
+ <section class="section" id="explore">
1741
+ <p class="section-label rv">Security + pricing</p>
1742
+ <h2 class="section-title rv" data-split>Custody and cost.</h2>
1743
+ <div class="moat-grid rv">
1744
+ <a class="moat-card" href="/security/">
1745
+ <div class="n">security</div>
1746
+ <h3>The wallet stays yours</h3>
1747
+ <p>Public Oracle never holds signing keys. Self-hosted vaults stay on your machine, with capped, expiring permissions and exact owner authorization.</p>
1748
+ </a>
1749
+ <a class="moat-card" href="/pricing/">
1750
+ <div class="n">pricing</div>
1751
+ <h3>5 bps. Holders zero.</h3>
1752
+ <p>Free to install and run. You pay only on routed swaps, and Locals Only holders pay nothing.</p>
1753
+ </a>
1754
+ </div>
1755
+ </section>
2345
1756
  <section class="section cli-section" id="cli">
2346
- <p class="chapter-tab"><b>06</b> the product</p>
2347
- <p class="section-label rv">Oracle CLI</p>
2348
- <h2 class="section-title rv" data-split>One surface. <em>Working chain intelligence.</em></h2>
1757
+ <p class="section-label rv">Download</p>
1758
+ <h2 class="section-title rv" data-split>One line. <em>Then start asking.</em></h2>
2349
1759
  <div class="cli-install rv">
2350
1760
  <div class="cli-install-cmd"><code>curl -fL https://oracle.demi.la/install.sh | bash</code> <span class="cli-install-hint">then oracle setup model && oracle chat</span></div>
2351
1761
  </div>
2352
- <p class="section-lede rv">Type <code style="color:var(--blue2)">oracle</code>. Local signer. THE FUTURE IS AGENTIC. <code style="color:var(--blue2)">←/→</code> saved chats. Reads, prices, prepares — you sign.</p>
1762
+ <p class="section-lede rv">Install it, connect the model you already pay for, and type <code style="color:var(--blue2)">oracle</code>. The signer stays local. Reads, prices and prepares; you sign.</p>
2353
1763
  <div class="convert-grid rv">
2354
1764
  <div>
2355
1765
  <figure class="cli-frame cli-proof">
2356
- <img id="cli-still" src="assets/oracle-cli-v035-poster.jpg?v=20260830b" alt="Oracle CLI boot: globe wordmark, THE FUTURE IS AGENTIC, local signer ready, gpt-5.6-sol, Hyperliquid, ←/→ sessions" width="1600" height="815" loading="eager" fetchpriority="high" />
1766
+ <img id="cli-still" src="/assets/oracle-cli-v035-poster.jpg?v=20260830b" alt="Oracle CLI boot: globe wordmark, THE FUTURE IS AGENTIC, local signer ready, gpt-5.6-sol, Hyperliquid, ←/→ sessions" width="1600" height="815" loading="eager" fetchpriority="high" />
2357
1767
  </figure>
2358
1768
  <p class="cli-cap">what you see when you type oracle</p>
2359
1769
  </div>
@@ -2371,7 +1781,7 @@ footer{margin-top:clamp(72px,12vh,120px);border-top:1px solid var(--line);paddin
2371
1781
  </div>
2372
1782
  <h2 class="section-title app-shot-title">Oracle Desktop App <sup style="font-size:14px;color:var(--blue);font-weight:400">beta</sup></h2>
2373
1783
  <figure class="app-shot">
2374
- <img src="assets/desktop-app.jpg?v=20260830" width="1280" height="860" loading="lazy" decoding="async" alt="Oracle desktop 0.4.16 setup: connect Claude, Codex or Grok, local llama.cpp or Ollama, then pick model and chain.">
1784
+ <img src="/assets/desktop-app.jpg?v=20260830" width="1280" height="860" loading="lazy" decoding="async" alt="Oracle desktop 0.4.16 setup: connect Claude, Codex or Grok, local llama.cpp or Ollama, then pick model and chain.">
2375
1785
  <figcaption>Native desktop. Connect a provider, then chat.</figcaption>
2376
1786
  </figure>
2377
1787
  <div class="os-dl">
@@ -2380,83 +1790,73 @@ footer{margin-top:clamp(72px,12vh,120px);border-top:1px solid var(--line);paddin
2380
1790
  <a class="os-link" href="/downloads/artifacts/Oracle-Setup-0.4.16.exe">Windows Setup</a>
2381
1791
  </div>
2382
1792
  </section>
1793
+ </main>
1794
+ <script>
1795
+ // ── Header: mobile drawer + scrollspy. Plain DOM, no library dependency, so
1796
+ // the menu still works if the vendored animation bundles fail to load. ──
1797
+ (function () {
1798
+ "use strict";
1799
+ var nav = document.querySelector(".nav");
1800
+ var toggle = document.getElementById("nav-toggle");
1801
+ var links = document.getElementById("nav-links");
1802
+ if (!nav || !toggle || !links) return;
1803
+
1804
+ function setOpen(open) {
1805
+ nav.dataset.open = open ? "1" : "0";
1806
+ toggle.setAttribute("aria-expanded", open ? "true" : "false");
1807
+ }
1808
+ setOpen(false);
2383
1809
 
2384
- <section class="section" id="fees">
2385
- <p class="chapter-tab"><b>07</b> what it costs</p>
2386
- <p class="section-label rv">Fees</p>
2387
- <h2 class="section-title rv" data-split>5 bps. <em>Holders zero.</em></h2>
2388
- <p class="section-lede rv">5 basis points (0.05%) on swaps Oracle routes. Eligible Hyperliquid orders can add a 1–2 bps builder fee after wallet approval. Both show before you sign.</p>
2389
- <div class="moat-grid rv" style="margin-top:28px">
2390
- <article class="moat-card">
2391
- <div class="n">swap fee</div>
2392
- <h3>5 bps per routed swap</h3>
2393
- <p>Calculated on the output amount, deducted from the route before the quote reaches you. Oracle never touches your input — it prices the net you receive after the fee.</p>
2394
- </article>
2395
- <article class="moat-card">
2396
- <div class="n">locals only</div>
2397
- <h3>0% for NFT holders</h3>
2398
- <p>Hold a Locals Only NFT in the wallet Oracle reads and eligible routed swaps and Hyperliquid builder orders carry zero Oracle fees. No claim, dashboard, or manual toggle.</p>
2399
- </article>
2400
- <article class="moat-card">
2401
- <div class="n">operator seat</div>
2402
- <h3>Run your own instance</h3>
2403
- <p>The public package is free to install. Every read, route, and prepare runs on your machine. The routing fee only applies when your agent uses Oracle's aggregation.</p>
2404
- </article>
2405
- <article class="moat-card">
2406
- <div class="n">builder codes</div>
2407
- <h3>Hyperliquid builder fees</h3>
2408
- <p>Core perps use 2 bps. HIP-3 and HIP-4 use 1 bps. Spot is set to 1 bps but remains inactive until Oracle ships spot-order preparation. Your wallet approves a 2 bps maximum before Oracle can include any builder fee. This is separate from the 5 bps routed-swap fee.</p>
2409
- </article>
1810
+ toggle.addEventListener("click", function () {
1811
+ setOpen(nav.dataset.open !== "1");
1812
+ });
1813
+ // Any in-page jump closes the drawer, otherwise it covers the target.
1814
+ links.addEventListener("click", function (e) {
1815
+ if (e.target.closest("a")) setOpen(false);
1816
+ });
1817
+ document.addEventListener("keydown", function (e) {
1818
+ if (e.key === "Escape") setOpen(false);
1819
+ });
1820
+ // A resize back to desktop must not leave the drawer state stuck open.
1821
+ window.addEventListener("resize", function () {
1822
+ if (window.innerWidth > 960) setOpen(false);
1823
+ });
2410
1824
 
2411
- </div>
2412
- </section>
1825
+ // Scrollspy: mark the section currently under the header.
1826
+ var anchors = [].slice.call(links.querySelectorAll('a[href^="#"]'));
1827
+ var targets = anchors.map(function (a) {
1828
+ return { link: a, el: document.querySelector(a.getAttribute("href")) };
1829
+ }).filter(function (t) { return t.el; });
1830
+ if (!targets.length) return;
2413
1831
 
2414
- <!-- ── 08 · the close. The ridge that opened the page arrives resolved: the
2415
- noisy layers have collapsed into the single routed line, and the only
2416
- thing left to do is the same install action the hero offered. ── -->
2417
- <section class="close-scene" id="close" aria-labelledby="close-title">
2418
- <svg class="ridge close-ridge" viewBox="0 240 900 140" preserveAspectRatio="none" aria-hidden="true" focusable="false">
2419
- <g class="rg rg-3"><use href="#rg3"/></g>
2420
- <g class="rg rg-4"><use href="#rg4"/></g>
2421
- </svg>
2422
- <div class="close-inner">
2423
- <p class="close-eyebrow rv">08 — the handoff</p>
2424
- <h2 class="close-title" id="close-title" data-split>Read the chain. <em>Sign your own</em> transactions.</h2>
2425
- <p class="close-lede rv">One install puts the whole control plane on your machine — CLI, desktop app, or as an MCP server inside the agent you already use. No Oracle account, no hosted wallet.</p>
2426
- <div class="close-grid">
2427
- <div class="close-cmds rv">
2428
- <div class="close-cmd"><code>curl -fL https://oracle.demi.la/install.sh | bash</code><em>macOS · Linux</em></div>
2429
- <div class="close-cmd"><code>iex (irm https://oracle.demi.la/install.ps1)</code><em>Windows</em></div>
2430
- <div class="os-dl">
2431
- <a class="os-link" href="/downloads/artifacts/Oracle-0.4.16.AppImage">Linux AppImage</a>
2432
- <a class="os-link" href="/downloads/artifacts/Oracle-0.4.16-arm64.dmg">macOS DMG</a>
2433
- <a class="os-link" href="/downloads/artifacts/Oracle-Setup-0.4.16.exe">Windows Setup</a>
2434
- </div>
2435
- </div>
2436
- <div class="close-side rv">
2437
- <p class="close-note">then <code>oracle setup model</code><br>then <code>oracle chat</code></p>
2438
- <p class="close-note">reads run locally<br>keys never leave your machine<br>a fresh install signs nothing</p>
2439
- </div>
2440
- </div>
2441
- </div>
2442
- </section>
2443
- <div class="mega-oracle rv" aria-hidden="true">oracle</div>
1832
+ var ticking = false;
1833
+ function spy() {
1834
+ ticking = false;
1835
+ var line = window.scrollY + 120; // just under the fixed header
1836
+ var current = null;
1837
+ targets.forEach(function (t) {
1838
+ if (t.el.offsetTop <= line) current = t;
1839
+ });
1840
+ targets.forEach(function (t) {
1841
+ t.link.classList.toggle("is-active", t === current);
1842
+ });
1843
+ }
1844
+ window.addEventListener("scroll", function () {
1845
+ if (!ticking) { ticking = true; window.requestAnimationFrame(spy); }
1846
+ }, { passive: true });
1847
+ window.addEventListener("resize", spy);
1848
+ spy();
1849
+ })();
1850
+ </script>
2444
1851
  <footer>
2445
1852
  <div class="foot-row">
2446
- <div class="powered">
2447
- powered by
2448
- <a href="https://hermes-agent.nousresearch.com" target="_blank" rel="noopener noreferrer">Hermes</a>
2449
- </div>
1853
+ <span>oracle · <a class="labs-link" href="https://demi.la">locals only labs</a></span>
2450
1854
  <div class="foot-links">
2451
- <a href="#cli">Download</a>
1855
+ <a href="/download/">Download</a>
2452
1856
  <a href="/eval" target="_blank" rel="noopener noreferrer">Evals</a>
2453
- <a href="https://unpkg.com/@oracle-agent/oracle@latest/README.md" target="_blank" rel="noopener noreferrer">Docs</a>
1857
+ <a href="/docs/">Docs</a>
2454
1858
  </div>
2455
1859
  </div>
2456
- <div class="foot-meta">
2457
- <span>oracle · <a class="labs-link" href="https://demi.la">locals only labs</a></span>
2458
- <span>self custodial // locals only labs</span>
2459
- </div>
2460
1860
  </footer>
2461
1861
 
2462
1862
  <script>
@@ -2516,15 +1916,19 @@ footer{margin-top:clamp(72px,12vh,120px);border-top:1px solid var(--line);paddin
2516
1916
  { name: "Solana", id: "SOL", logo: "chains/rsz_solana", note: "solana agent", badge: "route" },
2517
1917
  { name: "Bitcoin", id: "BTC", logo: "chains/rsz_bitcoin", note: "bitcoin agent", badge: "route" }
2518
1918
  ];
2519
- document.getElementById("chain-grid").innerHTML = CHAINS.map(function (c) {
1919
+ // Guarded: this grid only exists on /where-it-works/. Throwing here would
1920
+ // abort the rest of the script, including the .rv reveal that makes hero
1921
+ // copy visible, leaving other pages blank.
1922
+ var chainGrid = document.getElementById("chain-grid");
1923
+ if (chainGrid) chainGrid.innerHTML = CHAINS.map(function (c) {
2520
1924
  var cls = c.badge === "route" ? "badge live" : "badge";
2521
1925
  var label = c.badge === "route" ? "route" : "read only";
2522
1926
  return '<article class="chain rv"><div class="chain-top"><div class="nm">' + c.name +
2523
1927
  ' <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>';
2524
1928
  }).join("");
2525
1929
 
2526
- var WM = "assets/wordmarks/";
2527
- var BRAND = "brand/";
1930
+ var WM = "/assets/wordmarks/";
1931
+ var BRAND = "/brand/";
2528
1932
  var PROTOS_A = [
2529
1933
  { n: "Uniswap V3", wm: "uniswap.svg", cap: "read + quote + prepare + policy", u: "https://app.uniswap.org/" },
2530
1934
  { n: "Aerodrome Slipstream", wm: "aerodrome.svg", cap: "read + quote + prepare", u: "https://aerodrome.finance/" },
@@ -2761,53 +2165,25 @@ var PROTOS_B = [
2761
2165
  wireMarks(trackB);
2762
2166
  })();
2763
2167
 
2764
- function exactProtocolEntries() {
2765
- var out = [];
2766
- var seen = Object.create(null);
2767
- PROTOS_A.concat(PROTOS_B).forEach(function (x) {
2768
- var key = String(x.n).toLowerCase();
2769
- if (seen[key]) return;
2770
- seen[key] = true;
2771
- out.push(x);
2772
- });
2773
- return out;
2774
- }
2775
2168
  function renderProtocolAtlas() {
2776
2169
  var root = document.getElementById("protocol-atlas-grid");
2777
- var entries = exactProtocolEntries();
2778
- var routeCount = entries.filter(function (x) { return /quote|route|bridge/i.test(x.cap); }).length;
2779
- var prepareCount = entries.filter(function (x) { return /prepare|policy|mint|collect|supply|withdraw|stake/i.test(x.cap); }).length;
2780
- // The hero stat is animated from data-count, so only the atlas value is
2781
- // written directly here -- otherwise this would stomp the count mid-flight.
2782
- ["atlas-protocol-count"].forEach(function (id) { var el = document.getElementById(id); if (el) el.textContent = String(entries.length); });
2783
- // The hero protocol total is the GROUNDED roster claim (221), verified in
2784
- // docs-accuracy against the Jupiter venue roster and pinned by
2785
- // oracle-splash-ux. `entries` is only the logo-marquee rail — a presentation
2786
- // subset (117) that has been added to and trimmed over time. Writing it here
2787
- // silently overwrote the real claim with a rail count, so the hero rendered
2788
- // 117 while the markup, README and tests all said 221.
2789
- // Only the atlas count tracks the splash's featured chain cards. The hero
2790
- // reports the CLI's 15 working chain/venue surfaces plus extensible EVM.
2791
- ["atlas-chain-count"].forEach(function (id) { var el = document.getElementById(id); if (el) el.textContent = String(CHAINS.length); });
2792
- var r = document.getElementById("atlas-route-count"); if (r) r.textContent = String(routeCount);
2793
- var pr = document.getElementById("atlas-prepare-count"); if (pr) pr.textContent = String(prepareCount);
2794
2170
  if (!root) return;
2795
2171
  var cards = [
2796
- ["01", "State engine", "Portfolio, markets, positions, pools, NFTs, ordinals and venue state pulled before any action is proposed.", String(entries.length) + " sources"],
2797
- ["02", "Route brain", "Quotes and bridges normalize into comparable intents, with slippage, destination and calldata shape surfaced before signing.", routeCount + " route-capable"],
2798
- ["03", "Policy wall", "Every value-moving path passes local bounds: chain, spender, destination, amount, TTL and simulation posture.", prepareCount + " prepare paths"],
2799
- ["04", "Wallet handoff", "Oracle prepares. Your wallet signs. Broadcast lives behind owner auth, armed state and receipts.", "self custody"],
2800
- ["05", "Agent mesh", "Hyperliquid, Polymarket, Solana, Bitcoin, EVM, Stable, Robinhood Chain and protocol builder profiles stay separate.", CHAINS.length + " lanes"],
2801
- ["06", "Builder layer", "New contracts, route modules and chain-specific scaffolds get generated with checks before deployment ever reaches a wallet.", "extendable"]
2172
+ ["State engine", "Portfolio, markets, positions, pools, NFTs, ordinals and venue state pulled before any action is proposed."],
2173
+ ["Route brain", "Quotes and bridges normalize into comparable intents, with slippage, destination and calldata shape surfaced before signing."],
2174
+ ["Policy wall", "Every value-moving path passes local bounds: chain, spender, destination, amount, TTL and simulation posture."],
2175
+ ["Wallet handoff", "Oracle prepares. Your wallet signs. Broadcast lives behind owner auth, armed state and receipts."],
2176
+ ["Agent mesh", "Hyperliquid, Polymarket, Solana, Bitcoin, EVM, Stable, Robinhood Chain and protocol builder profiles stay separate."],
2177
+ ["Builder layer", "New contracts, route modules and chain-specific scaffolds get generated with checks before deployment ever reaches a wallet."]
2802
2178
  ];
2803
2179
  root.innerHTML = cards.map(function (x) {
2804
- 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>';
2180
+ return '<article class="motion-card"><div class="motion-scan"></div><h3>' + x[0] + '</h3><p>' + x[1] + '</p></article>';
2805
2181
  }).join("");
2806
- }
2182
+ }
2807
2183
  renderProtocolAtlas();
2808
2184
 
2809
2185
 
2810
- var LM = "assets/llms/";
2186
+ var LM = "/assets/llms/";
2811
2187
  var LLMS = [
2812
2188
  { n: "Hermes Agent", wm: "hermes.png", tall: 1, u: "https://hermes.nousresearch.com" },
2813
2189
  { n: "Claude", wm: "claude.svg", u: "https://claude.ai" },
@@ -2823,12 +2199,14 @@ renderProtocolAtlas();
2823
2199
  { n: "Qwen", wm: "qwen.svg", tall: 1, u: "https://chat.qwen.ai" },
2824
2200
  { n: "Kimi", wm: "kimi-icon.svg", tall: 1, u: "https://kimi.com" }
2825
2201
  ];
2826
- document.getElementById("llm-track").innerHTML = LLMS.concat(LLMS).map(function (x) {
2202
+ // Guarded: the model marquee only exists on /where-it-works/.
2203
+ var llmTrack = document.getElementById("llm-track");
2204
+ if (llmTrack) llmTrack.innerHTML = LLMS.concat(LLMS).map(function (x) {
2827
2205
  var cls = x.tall ? "wm tall" : "wm";
2828
2206
  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>';
2829
2207
  }).join("");
2830
2208
 
2831
- wireMarks(document.getElementById("llm-track"));
2209
+ wireMarks(llmTrack);
2832
2210
  syncMarqueeVelocity();
2833
2211
  if (document.fonts && document.fonts.ready) document.fonts.ready.then(syncMarqueeVelocity);
2834
2212
  window.addEventListener("load", syncMarqueeVelocity);
@@ -3031,7 +2409,6 @@ var activeLenis = null;
3031
2409
  gsap.fromTo(".strategy-card", { y:30, opacity:.58 }, { y:0, opacity:1, duration:.95, ease:"power3.out", stagger:.025, scrollTrigger:{ trigger:".strategy-grid", start:"top 78%" }, clearProps:"transform,opacity" });
3032
2410
  gsap.fromTo(".cli-proof", { scale:.96, y:30 }, { scale:1, y:0, ease:"none", scrollTrigger:{ trigger:".cli-proof", start:"top 86%", end:"bottom 38%", scrub:1 }, clearProps:"transform" });
3033
2411
  gsap.to(".route-tree", { scale:1.018, ease:"none", transformOrigin:"50% 50%", scrollTrigger:{ trigger:".route-tree", start:"top 82%", end:"bottom 40%", scrub:1 } });
3034
- gsap.to(".mega-oracle", { xPercent:-14, letterSpacing:".02em", ease:"none", scrollTrigger:{ trigger:".mega-oracle", start:"top bottom", end:"bottom top", scrub:true } });
3035
2412
 
3036
2413
  // ── 01 · the ridge separates into depth as the opening viewport leaves ──
3037
2414
  [-64, -44, -27, -13, -4].forEach(function (dy, i) {
@@ -3089,12 +2466,6 @@ var activeLenis = null;
3089
2466
  });
3090
2467
  }
3091
2468
 
3092
- // ── 08 · the close: the noisy field arrives as one resolved line ──
3093
- gsap.fromTo(".close-ridge .rg-3", { y: 40, opacity: 0 }, { y: 0, opacity: 1, ease: "none",
3094
- scrollTrigger: { trigger: ".close-scene", start: "top 96%", end: "top 34%", scrub: .6 } });
3095
- gsap.fromTo(".close-ridge .rg-4", { y: 62, opacity: 0 }, { y: 0, opacity: 1, ease: "none",
3096
- scrollTrigger: { trigger: ".close-scene", start: "top 92%", end: "top 24%", scrub: .6 } });
3097
-
3098
2469
  window.ScrollTrigger.refresh();
3099
2470
  window.addEventListener("load", function () { window.ScrollTrigger.refresh(); });
3100
2471
  }