PageSourceSearch

https://www.luxalgo.com/_next/static/chunks/pages/whale-options-a38f2be867647155.js

js luxalgo.com collected 2026-10-04 00:02:01 UTC 29,398 bytes, 1 lines download raw bytes

1(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[1402],{9811:(e,t,s)=>{"use strict";s.d(t,{A:()=>r});var n=s(66352),a=s(95132);function r(e){let{domain:t,name:s,src:r,className:i="size-7",imgSize:l=18}=e,o=(0,a.useMemo)(()=>{let e=[];return r&&e.push(r),t&&(e.push("https://www.google.com/s2/favicons?domain=".concat(t,"&sz=64")),e.push("https://icons.duckduckgo.com/ip3/".concat(t,".ico"))),e},[r,t]),[d,c]=(0,a.useState)(0),h=o.join("|");(0,a.useEffect)(()=>c(0),[h]);let m=o[d];return m?(0,n.jsx)("span",{className:"flex ".concat(i," shrink-0 items-center justify-center overflow-hidden rounded-md border border-white/10 bg-white"),"aria-hidden":!0,children:(0,n.jsx)("img",{src:m,alt:"",width:l,height:l,loading:"lazy",onError:()=>c(e=>e+1)},m)}):(0,n.jsx)("span",{className:"flex ".concat(i," shrink-0 items-center justify-center rounded-md border border-white/10 bg-white/[0.05] text-[11px] font-semibold text-fg-300"),"aria-hidden":!0,children:s.charAt(0).toUpperCase()})}},20916:(e,t,s)=>{"use strict";s.r(t),s.d(t,{default:()=>E});var n=s(66352),a=s(94092),r=s.n(a),i=s(83643),l=s(22233),o=s.n(l),d=s(56900),c=s(59038),h=s(72766),m=s(75271),p=s(69626),x=s(19932),u=s(75623),g=s(61737),f=s(99082),w=s(50821),b=s(26505),y=s(50056);let v="https://github.com/LuxAlgo/whale-options",j={hosted:!1,label:"Local MCP server",note:"Sixteen tools over your own tape",menuTitle:"@luxalgo/whale-mcp \xb7 from a clone",actions:[{label:"Copy quickstart (clone + build)",copy:"git clone https://github.com/LuxAlgo/whale-options && cd whale-options && pnpm install && pnpm build",icon:"terminal"},{label:"Setup guide on GitHub",href:"https://github.com/LuxAlgo/whale-options",icon:"github"}],tools:[{name:"whale_status",when:"Live engine or recording? Tape depth, baseline warmth: the right first call."},{name:"whale_recent",when:"The latest flow, filterable by ticker, kind, side, premium."},{name:"whale_top",when:"Highest-scored events in a window, full component breakdowns attached."},{name:"whale_event",when:"One event’s complete story: every leg, its sale conditions, the NBBO it was judged against."},{name:"whale_gex",when:"The GEX ladder plus zero-gamma, sign convention stated in the payload."},{name:"whale_rules",when:"List, add, and remove alert rules."},{name:"whale_replay",when:"Re-run a stored window under the current config and diff against what was recorded."},{name:"whale_oi_deltas",when:"Session-to-session open-interest change per contract, strike, and expiry."},{name:"whale_max_pain",when:"Per-expiry max-pain strike, the static-not-prediction note carried in the payload."},{name:"whale_iv_rank",when:"IV rank and percentile over recorded ATM-IV history, real window stated."},{name:"whale_net_flow",when:"Net premium flow leaderboard per underlying; emitted events only."},{name:"whale_audit",when:"Calibrate recorded scores against forward underlying moves, caveats always attached."},{name:"whale_short_volume",when:"Cached FINRA daily short-sale volume; end-of-day context, local cache only."}
1,{name:"whale_flow_series",when:"Net premium, directional delta, and net volume per bucket, built from every print, with what was excluded counted."},{name:"whale_bars",when:"Underlying bars for a session: feed bars when the vendor serves them, otherwise the spot tape from prints, source stated."},{name:"whale_gex_heatmap",when:"Net GEX per strike and expiry, re-priced at the latest spot, dealer convention stated."}]},N=[{time:"09:30:20",kind:"PRINT",side:"BUY",contract:"AAPL C $205 09-04",fill:"35 @ 27.36",premium:"$96K",score:42},{time:"09:30:23",kind:"BLOCK",side:"SELL",contract:"SPY C $650 09-04",fill:"2210 @ 2.52",premium:"$557K",score:47},{time:"09:30:23",kind:"SWEEP",side:"BUY",contract:"AMD C $162.5 09-18",fill:"983 @ 9.38",premium:"$922K",score:67,extra:"6 legs / 6 exch",hot:!0},{time:"09:30:27",kind:"PRINT",side:"MID",contract:"NVDA P $217.5 09-04",fill:"14 @ 27.55",premium:"$39K",score:11},{time:"09:30:30",kind:"BLOCK",side:"SELL",contract:"AMD P $200 09-25",fill:"105 @ 35.07",premium:"$368K",score:38},{time:"09:30:33",kind:"BLOCK",side:"BUY",contract:"AMD P $155 09-04",fill:"279 @ 0.96",premium:"$27K",score:51},{time:"09:30:34",kind:"PRINT",side:"BUY",contract:"SPY P $700 09-04",fill:"24 @ 54.81",premium:"$132K",score:45},{time:"09:30:51",kind:"SWEEP",side:"BUY",contract:"NVDA P $187.5 09-25",fill:"1067 @ 7.89",premium:"$842K",score:72,extra:"6 legs / 6 exch"},{time:"09:30:53",kind:"PRINT",side:"BUY",contract:"TSLA C $315 09-18",fill:"18 @ 33.46",premium:"$60K",score:45}],k={SWEEP:"border-green-400/30 bg-green-400/10 text-green-300",BLOCK:"border-sky-400/30 bg-sky-400/10 text-sky-300",SPLIT:"border-purple-400/30 bg-purple-400/10 text-purple-300",PRINT:"border-white/15 bg-white/[0.04] text-fg-300"},A={BUY:"text-[#2ebd85]",SELL:"text-[#f23645]",MID:"text-fg-300"},T=["sweep: 6 legs across 6 exchanges in 312ms","ISO-flagged legs corroborate an intermarket sweep","aggressor buy: 9.38 at ask 9.38 (nbbo 9.22\xd79.38, 327ms old)","cold start: 0/5 baseline sessions; score uncertainty is wider"],_=[{name:"volumeVsBaseline",pts:null,note:"no volume baseline for this contract yet"},{name:"premiumVsBaseline",pts:null,note:"premium distribution too thin (12/50 samples)"},{name:"volOi",pts:20.3,note:"ratio 2.693 \xb7 opening flow likely"},{name:"aggression",pts:33.3,note:"buy \xb7 sweep \xb7 ISO corroborated"},{name:"urgency",pts:.9,note:"dte 20.27 \xb7 ITM 1.6%"},{name:"repetition",pts:12.5,note:"4 underlying hits this session"}];function P(){let e=(0,p.Ib)(),[t,s]=(0,p.Wx)(),a=s||e;return(0,n.jsx)("div",{className:"dark",ref:t,children:(0,n.jsxs)("div",{className:"relative overflow-hidden rounded-2xl border border-white/10 bg-[#060606]",children:[(0,n.jsxs)("div",{className:"flex items-center justify-between gap-4 border-b border-white/[0.06] px-5 py-3 sm:px-6",children:[(0,n.jsx)("span",{className:"text-xs font-medium text-fg-300",children:"live flow \xb7 event drawer"}),(0,n.jsx)("span",{className:"hidden text-[11px] font-medium text-fg-300 sm:inline",children:"synthetic tape"})]}),(0,n.jsxs)("div",{className:"grid gap-0 lg:grid-cols-[1.5fr_1fr]",children:[(0,n.jsx)("div",{className:"min-w-0 overflow-x-auto border-b border-white/[0.06] lg:border-b-0 lg:border-r",children:(0,n.jsx)("table",{className:"w-full min-w-[560px] border-collapse font-mono text-[11px] leading-relaxed",children:(0,n.jsx)("tbody",{children:N.map((t,s)=>(0,n.jsxs)("tr",{className:"border-b border-white/[0.04] transition-[opacity,transform] duration-500 ease-out-quart last:border-b-0 ".concat(t.hot?"bg-green-400/[0.05]":""),style:e?void 0:{opacity:+!!a,transform:a?"none":"translateY(6px)",transitionDelay:"".concat(70*s,"ms")},children:[(0,n.jsx)("td",{className:"whitespace-nowrap px-3 py-2 text-fg-300 sm:px-4",children:t.time}),(0,n.jsx)("td",{className:"px-1.5 py-2",children:(0,n.jsx)("span",{className:"rounded border px-1.5 py-0.5 text-[10px] ".concat(k[t.kind]),children:t.kind})}),(0,n.jsx)("td",{className:"whitespace-nowrap px-1.5 py-2 ".concat(A[t.side]),children:t.side}),(0,n.jsx)("td",{className:"whitespace-nowrap px-1.5 py-2 text-fg-100",children:t.contract}),(0,n.jsx)("td",{className:"whitespace-nowrap px-1.5 py-2 text-fg-300",children:t.fill}),(0,n.jsx)("td",{className:"whitespace-nowrap px-1.5 py-2 text-right tabular-nums text-fg-100",children:t.premium}),(0,n.jsxs)("td",{className:"whitespace-nowrap px-3 py-2 text-right tabular-nums text-fg-200 sm:px-4",children:[t.score,(0,n.jsx)("span",{className:"text-fg-300",children:"*"})]})]},"".concat(t.time).concat(t.contract)))})})}),(0,n.jsxs)("div",{className:"min-w-0 p-4 sm:p-5",children:[(0,n.jsxs)("div",{className:"flex flex-wrap items-baseline gap-x-3 gap-y-1",children:[(0,n.jsx)("span",{className:"rounded border px-1.5 py-0.5 font-mono text-[10px] ".concat(k.SWEEP),children:"SWEEP"}),(0,n.jsx)("span",{className:"font-mono text-sm text-fg-100",children:"AMD C $162.5 09-18"}),(0,n.jsx)("span",{className:"font-mono text-sm text-fg-300",children:"$922K \xb7 score 67*"})]}),(0,n.jsx)("div",{className:"mt-3 space-y-1 font-mono text-[11px] leading-relaxed text-fg-300",children:T.map(e=>(0,n.jsxs)("p",{children:["\xb7 ",e]},e))}),(0,n.jsx)("div",{className:"mt-4 space-y-1.5",children:_.map(e=>(0,n.jsxs)("div",{className:"grid grid-cols-[130px_1fr] items-center gap-2",children:[(0,n.jsx)("span",{className:"truncate font-mono text-[10px] text-fg-200",children:e.name}),null===e.pts?(0,n.jsxs)("span",{className:"truncate font-mono text-[10px] text-fg-300",children:["n/a \xb7 ",e.note]}):(0,n.jsxs)("span",{className:"flex items-center gap-2",children:[(0,n.jsx)("span",{"aria-hidden":!0,
1className:"h-1.5 rounded-full bg-green-400/70",style:{width:"".concat(Math.max(3,2.4*e.pts),"px")}}),(0,n.jsxs)("span",{className:"whitespace-nowrap font-mono text-[10px] tabular-nums text-fg-200",children:[e.pts.toFixed(1)," pts"]}),(0,n.jsx)("span",{className:"hidden truncate font-mono text-[10px] text-fg-300 xl:inline",children:e.note})]})]},e.name))}),(0,n.jsx)("p",{className:"mt-4 text-xs leading-relaxed text-fg-300",children:"* cold start: missing components report themselves and the remaining weights renormalize. The score never silently pretends it knew something it didn’t."})]})]})]})})}let S=[{name:"Sweeps",rule:"2+ exchanges \xb7 500 ms",detail:"Someone in a hurry: the same order racing across two or more exchanges inside half a second, stitched back together as one event."},{name:"Blocks",rule:"99.5th percentile",detail:"Size that is huge for this contract, judged against its own recent volume, with floors so quiet names can’t fake it."},{name:"Splits",rule:"4+ clips",detail:"The same order worked quietly over minutes, in four or more clips. Patience reads differently than urgency, and the engine keeps them apart."}],I=[["volumeVsBaseline","day volume vs its own 20-session average, log-scaled",20],["premiumVsBaseline","premium percentile in the underlying’s distribution",20],["volOi","day volume over open interest; ratio above 1 flags likely opening flow",15],["aggression","how it hit the NBBO: mid 0.2, at-quote 0.7, through-quote 1.0",20],["urgency","short-dated plus out-of-the-money distance",10],["repetition","same-contract, same-side recurrence this session",15]],L=[[[null,"{"]],[[null,"  "],[u.T.str,'"id"'],[null,": "],[u.T.str,'"nvda-big-sweeps"'],[null,","]],[[null,"  "],[u.T.str,'"match"'],[null,": { "],[u.T.str,'"tickers"'],[null,": ["],[u.T.str,'"NVDA"'],[null,"], "],[u.T.str,'"kind"'],[null,": ["],[u.T.str,'"sweep"'],[null,"],"]],[[null,"             "],[u.T.str,'"minScore"'],[null,": "],[u.T.str,"75"],[null,", "],[u.T.str,'"minPremium"'],[null,": "],[u.T.str,"250000"],[null," },"]],[[null,"  "],[u.T.str,'"sink"'],[null,": { "],[u.T.str,'"type"'],[null,": "],[u.T.str,'"discord"'],[null," },"]],[[null,"  "],[u.T.str,'"cooldownSec"'],[null,": "],[u.T.str,"300"]],[[null,"}"]]],O=[[[u.T.dim,"$ "],[u.T.hi,"git clone https://github.com/LuxAlgo/whale-options"]],[[u.T.dim,"$ "],[u.T.hi,"cd whale-options && pnpm install && pnpm build"]],[[u.T.dim,"$ "],[u.T.hi,"node packages/cli/dist/index.js run --feed synthetic"]],[],[[u.T.cmt,"# zero keys, synthetic tape, real engine"]],[[u.T.cmt,"# dashboard on http://127.0.0.1:8787"]]],C=[{name:"GEX ladder",body:"Where dealer hedging pressure sits, strike by strike, plus the flip level."},{name:"OI deltas",body:"What actually changed in a chain overnight, contract by contract."},{name:"Max pain",body:"The classic pin level per expiry, labeled as a snapshot, not a prediction."},{name:"IV rank",body:"Is volatility rich or cheap right now, against your own recorded history."},{name:"Net flow",body:"Which names the big money leaned into today, netted per underlying."},{name:"Short volume",body:"Daily short-sale volume from the public FINRA files, cached locally."}];function E(){return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(d.A,{title:"Whale Options: Free Open-Source Options Flow Scanner | LuxAlgo",description:"Track unusual options activity on your own machine. Whale Options spots sweeps, blocks, and split orders in live options flow and shows the math behind every score. Free, open source, no telemetry.",canonicalUrl:"".concat("https://www.luxalgo.com","/whale-options"),openGraphImageUrl:"/api/og/page/?title=Whale%20Options",markdownPath:"/whale-options.md"}),(0,n.jsx)(c.gk,{items:[{name:"LuxAlgo",url:"/"},{name:"Whale Options",url:"/whale-options/"}]}),(0,n.jsx)(c.Ec,{project:"whale-options"}),(0,n.jsxs)("section",{className:"relative overflow-hidden px-6 pt-24 pb-16 sm:pt-32 sm:pb-20",children:[(0,n.jsx)(w.A,{wgsl:"\nstruct Params { time: f32, aspect: f32, light: f32 }\n@group(0) @binding(0) var<uniform> params: Params;\n\nfn hash11(p: f32) -> f32 {\n  var q = fract(p * 0.1031);\n  q *= q + 33.33;\n  q *= q + q;\n  return fract(q);\n}\nfn hash21(p: vec2f) -> f32 {\n  var q = fract(p * vec2f(123.34, 345.45));\n  q += dot(q, q + 34.345);\n  return fract(q.x * q.y);\n}\n\n@fragment fn fs_main(@location(0) uv: vec2f) -> @location(0) vec4f {\n  let x = uv.x * params.aspect;\n  let colId = floor(x * 34.0);\n  let speed = 0.02 + hash11(colId) * 0.09;\n  let phase = hash11(colId * 7.7);\n  let y = fract(uv.y + params.time * speed + phase);\n\n  let cellId = floor(y * 20.0);
1\n  let h = hash21(vec2f(colId, cellId));\n  let on = step(0.90, h);\n  let fy = fract(y * 20.0);\n  let dash = smoothstep(0.02, 0.2, fy) * smoothstep(0.98, 0.8, fy);\n  var lum = on * dash * (0.07 + 0.11 * hash21(vec2f(cellId, colId)));\n\n  let d = distance(vec2f(uv.x, uv.y * 1.5), vec2f(0.5, 0.08));\n  lum += smoothstep(0.8, 0.0, d) * 0.05;\n  lum *= smoothstep(0.0, 0.08, uv.y) * smoothstep(1.0, 0.72, uv.y);\n  lum += (hash21(uv * 719.3) - 0.5) * 0.004;\n\n  let tintPick = hash21(vec2f(colId * 3.1, cellId * 1.7));\n  var tint = vec3f(0.95, 0.98, 1.0);\n  if (tintPick > 0.82) { tint = vec3f(0.5, 1.1, 0.78); }\n  else if (tintPick < 0.14) { tint = vec3f(1.2, 0.55, 0.58); }\n\n  let dark = vec3f(lum) * tint;\n  let paper = vec3f(1.0) - vec3f(lum * 1.4) * (vec3f(2.0) - tint);\n  let col = mix(dark, paper, params.light);\n  return vec4f(col, 1.0);\n}\n"}),(0,n.jsxs)("div",{className:"relative mx-auto max-w-3xl space-y-8 text-center",children:[(0,n.jsx)(m.A,{immediate:!0,children:(0,n.jsxs)("div",{className:"space-y-6",children:[(0,n.jsx)("h1",{className:"text-[clamp(38px,5.5vw,64px)] leading-[1.06] font-medium tracking-tight text-fg-100 text-balance",children:"Options flow was never magic."}),(0,n.jsx)(h.Y0,{children:(0,n.jsx)("span",{className:"mx-auto block max-w-2xl",children:"See the size the moment it prints. Whale Options watches every options trade, flags the sweeps, blocks, and split orders that matter, and scores each one with the math shown in full. Free, open source, on your own machine."})})]})}),(0,n.jsx)(m.A,{immediate:!0,delay:120,children:(0,n.jsxs)("div",{className:"flex flex-wrap items-center justify-center gap-4",children:[(0,n.jsx)(y.jY,{config:j}),(0,n.jsx)(g.A,{repo:"LuxAlgo/whale-options",href:v})]})})]}),(0,n.jsx)(m.A,{delay:260,className:"relative mx-auto mt-14 max-w-[1160px]",children:(0,n.jsx)(P,{})})]}),(0,n.jsx)(x.Ay,{hue:"green",hue2:"pink",children:(0,n.jsxs)("div",{className:"space-y-12",children:[(0,n.jsxs)("div",{className:"grid items-start gap-6 lg:grid-cols-[1fr_1.1fr] lg:gap-12",children:[(0,n.jsx)(m.A,{children:(0,n.jsx)("h2",{className:"text-[clamp(30px,4vw,52px)] leading-[1.06] font-medium tracking-tight text-fg-100 text-balance",children:"Three shapes of size."})}),(0,n.jsx)(m.A,{delay:100,children:(0,n.jsx)("p",{className:"max-w-xl text-base leading-relaxed text-fg-300 sm:text-lg",children:"A sweep is urgency, a block is conviction, a split is patience, and the engine never confuses them. Every print is judged against the live quote at the exact moment it happened, and when that quote can’t be trusted it says unknown instead of guessing."})})]}),(0,n.jsx)(m.A,{delay:140,children:(0,n.jsx)("div",{className:"dark",children:(0,n.jsx)("div",{className:"grid gap-4 lg:grid-cols-3",children:S.map(e=>(0,n.jsxs)("div",{className:"relative flex flex-col overflow-hidden rounded-2xl border border-white/10 bg-[#060606]",children:[(0,n.jsxs)("div",{className:"flex items-baseline justify-between gap-3 px-5 pt-4",children:[(0,n.jsx)("p",{className:"text-[15px] font-medium text-fg-100",children:e.name}),(0,n.jsx)("p",{className:"font-mono text-[10px] whitespace-nowrap text-fg-300",children:e.rule})]}),(0,n.jsxs)("div",{"aria-hidden":!0,className:"relative mx-5 mt-4 h-32 overflow-hidden rounded-lg border border-white/[0.07] bg-white/[0.02]",children:["Sweeps"===e.name&&(0,n.jsxs)(n.Fragment,{children:[[[26,8,30,.8],[50,20,22,.6],[74,14,26,.45]].map(e=>{let[t,s,a,r]=e;return(0,n.jsxs)("span",{children:[(0,n.jsx)("span",{className:"absolute inset-x-3 h-px bg-white/[0.06]",style:{top:"".concat(t,"%")}}),(0,n.jsx)("span",{className:"absolute h-3 -translate-y-1/2 rounded-sm bg-green-400",style:{to
1p:"".concat(t,"%"),left:"".concat(s,"%"),width:"".concat(a,"%"),opacity:r}})]},t)}),(0,n.jsx)("span",{className:"absolute right-3 bottom-2 text-[10px] font-medium text-fg-300",children:"3 exchanges \xb7 <500ms"})]}),"Blocks"===e.name&&(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)("span",{className:"absolute inset-x-3 top-1/2 h-px bg-white/[0.06]"}),(0,n.jsx)("span",{className:"absolute top-1/2 left-[14%] h-6 w-[46%] -translate-y-1/2 rounded-sm bg-pink-400/70"}),(0,n.jsx)("span",{className:"absolute right-3 bottom-2 text-[10px] font-medium text-fg-300",children:"one print \xb7 huge for this contract"})]}),"Splits"===e.name&&(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)("span",{className:"absolute inset-x-3 top-1/2 h-px bg-white/[0.06]"}),[[8,.8],[31,.65],[54,.5],[77,.4]].map(e=>{let[t,s]=e;return(0,n.jsx)("span",{className:"absolute top-1/2 h-3 w-[10%] -translate-y-1/2 rounded-sm bg-sky-400",style:{left:"".concat(t,"%"),opacity:s}},t)}),(0,n.jsx)("span",{className:"absolute right-3 bottom-2 text-[10px] font-medium text-fg-300",children:"4+ clips \xb7 minutes apart"})]})]}),(0,n.jsx)("p",{className:"px-5 py-4 text-[13px] leading-relaxed text-fg-300",children:e.detail})]},e.name))})})})]})}),(0,n.jsx)(x.Ay,{hue:"pink",hue2:"green",glow:!1,children:(0,n.jsxs)("div",{children:[(0,n.jsxs)("div",{className:"grid items-start gap-6 lg:grid-cols-[1fr_1.1fr] lg:gap-12",children:[(0,n.jsx)(m.A,{children:(0,n.jsx)("h2",{className:"text-[clamp(30px,4vw,52px)] leading-[1.06] font-medium tracking-tight text-fg-100 text-balance",children:"A score you can audit."})}),(0,n.jsx)(m.A,{delay:100,children:(0,n.jsx)("p",{className:"max-w-xl text-base leading-relaxed text-fg-300 sm:text-lg",children:"One number, zero to one hundred, built from six ingredients you can see. If an ingredient can’t be measured it says so and drops out; nothing gets hidden in the weighting, and new contracts are flagged as new instead of quietly fudged."})})]}),(0,n.jsx)(m.A,{delay:140,className:"mt-12",children:(0,n.jsx)("div",{className:"overflow-hidden rounded-xl border border-white/10",children:I.map((e,t)=>{let[s,a,r]=e;return(0,n.jsxs)("div",{className:"grid grid-cols-[1fr_auto] items-center gap-4 bg-surface-100 px-5 py-3.5 sm:grid-cols-[210px_1fr_auto] sm:px-6 ".concat(t>0?"border-t border-white/[0.06]":""),children:[(0,n.jsx)("p",{className:"font-mono text-[13px] text-fg-100",children:s}),(0,n.jsx)("p",{className:"hidden text-sm text-fg-300 sm:block",children:a}),(0,n.jsxs)("div",{className:"flex items-center gap-3",children:[(0,n.jsx)("span",{"aria-hidden":!0,className:"hidden h-1.5 rounded-full sm:block",style:{width:"".concat(3*r,"px"),background:"linear-gradient(90deg, color-mix(in srgb, var(--color-green-400, #34d399) 75%, transparent), color-mix(in srgb, var(--color-pink-400) 75%, transparent))"}}),(0,n.jsxs)("span",{className:"font-mono text-xs tabular-nums text-fg-200",children:["0.",r]})]})]},s)})})})]})}),(0,n.jsx)(x.Ay,{hue:"green",hue2:"pink",children:(0,n.jsxs)("div",{className:"space-y-10",children:[(0,n.jsxs)("div",{className:"grid items-start gap-6 lg:grid-cols-[1fr_1.1fr] lg:gap-12",children:[(0,n.jsx)(m.A,{children:(0,n.jsx)("h2",{className:"text-[clamp(30px,4vw,52px)] leading-[1.06] font-medium tracking-tight text-fg-100 text-balance",children:"The flow, on the tape."})}),(0,n.jsx)(m.A,{delay:100,children:(0,n.jsxs)("p",{className:"max-w-xl text-base leading-relaxed text-fg-300 sm:text-lg",children:["Candles of the underlying, and under them three panes built from every print, not just the ones above the premium floor: net premium with calls and puts split, directional delta, and net volume. Sweeps and blocks sit on the bar where they printed, sized by premium; click one and the same score breakdown the flow table shows opens. A GEX toggle draws the strike ladder against the price axis. Drawn in your browser by"," ",(0,n.jsx)(r(),{href:(0,i.Wx)("/"),className:"text-fg-100 underline decoration-white/25 underline-offset-2 transition-colors duration-150 hover:decoration-white/60",children:"Vela for Developers"}),", our"," ",(0,n.jsx)("a",{href:"https://github.com/LuxAlgo/Vela",target:"_blank",rel:"noopener noreferrer",className:"text-fg-100 underline decoration-white/25 underline-offset-2 transition-colors duration-150 hover:decoration-white/60",children:"open source"})," ","charting library."]})})]}),(0,n.jsx)(m.A,{delay:140,children:(0,n.jsx)("div",{className:"overflow-hidden rounded-2xl border border-white/10 bg-[#0b0d10]",children:(0,n.jsx)(o(),{src:"/images/vela/whale-options-flow-chart.png",alt:"Whale Options chart tab: AAPL five-minute candles with sweep and block markers, and net premium, directional delta, and net volume panes built from every print",width:2e3,height:1058,sizes:"(min-width: 1280px) 1200px, 100vw",className:"h-auto w-full"})})})]})}),(0,n.jsx)(x.Ay,{hue:"green",hue2:"sky",glow:!1,innerClassName:"grid gap-12 sm:grid-cols-3 sm:gap-8",children:[["Deterministic replay","Same tape plus same config produces a byte-identical event stream, ids included. A tested property, not a slogan."],["The flight recorder","
1Every tick is self-contained: NBBO, spot, and OI ride along, so any session can be replayed and audited. Replay never re-fires alerts."],["Calibration, with caveats","whale audit measures recorded scores against forward moves of the underlying, never option P&L, and prints its caveats with every report."]].map((e,t)=>{let[s,a]=e;return(0,n.jsx)(m.A,{delay:80*t,children:(0,n.jsxs)("div",{className:"space-y-3",children:[(0,n.jsx)(x.v0,{hue:["green","sky","pink"][t%3],children:s}),(0,n.jsx)("p",{className:"max-w-[38ch] text-lg leading-snug text-fg-100 text-balance",children:a})]})},s)})}),(0,n.jsx)(x.Ay,{hue:"sky",hue2:"green",children:(0,n.jsxs)("div",{className:"space-y-12",children:[(0,n.jsx)(m.A,{children:(0,n.jsxs)("div",{className:"max-w-2xl space-y-4",children:[(0,n.jsx)("h2",{className:"text-[clamp(32px,4vw,52px)] leading-[1.08] font-medium tracking-tight text-fg-100",children:"Around the tape."}),(0,n.jsx)(h.Y0,{children:"The context around the prints, computed from your own recorded data, with every assumption stated in the output."})]})}),(0,n.jsx)(m.A,{delay:140,children:(0,n.jsx)("div",{className:"dark",children:(0,n.jsx)("div",{className:"relative overflow-hidden rounded-2xl border border-white/10 bg-[#060606]",children:(0,n.jsx)("div",{className:"grid sm:grid-cols-2",children:C.map((e,t)=>(0,n.jsxs)("div",{className:"flex items-baseline gap-4 border-white/[0.05] px-5 py-3.5 sm:px-6 ".concat(t>1?"border-t":t>0?"border-t sm:border-t-0":""," ").concat(t%2==0?"sm:border-r":""),children:[(0,n.jsx)("span",{className:"w-24 shrink-0 font-mono text-[12px] text-green-300/80",children:e.name.toLowerCase().replace(/ /g,"_")}),(0,n.jsx)("span",{className:"text-[13px] leading-relaxed text-fg-200",children:e.body})]},e.name))})})})})]})}),(0,n.jsxs)(x.Ay,{hue:"green",hue2:"pink",glow:!1,innerClassName:"grid items-center gap-10 lg:grid-cols-2 lg:gap-16",children:[(0,n.jsx)(m.A,{children:(0,n.jsxs)("div",{className:"space-y-5",children:[(0,n.jsx)("h2",{className:"text-2xl font-medium tracking-tight text-fg-100 sm:text-[28px]",children:"Alerts as plain JSON."}),(0,n.jsx)(h.iq,{children:"Tell it what matters (ticker, kind, side, score, premium) and it pings you on Discord, Telegram, your desktop, or any webhook. Cooldowns are on by default so it never spams, and every webhook is signed so you can trust what arrives."}),(0,n.jsx)("div",{className:"flex flex-wrap items-center gap-2",children:["stdout","webhook","discord","telegram","desktop"].map(e=>(0,n.jsx)("span",{className:"rounded-full border border-white/10 px-3 py-1 font-mono text-xs text-fg-200",children:e},e))})]})}),(0,n.jsx)(m.A,{delay:120,className:"min-w-0",children:(0,n.jsx)(u.A,{title:"rules/nvda-big-sweeps.json",lines:L})})]}),(0,n.jsxs)(x.Ay,{hue:"pink",hue2:"green",innerClassName:"space-y-12",children:[(0,n.jsxs)("div",{className:"grid items-start gap-6 lg:grid-cols-[1fr_1.1fr] lg:gap-12",children:[(0,n.jsx)(m.A,{children:(0,n.jsx)("h2",{className:"text-[clamp(30px,4vw,52px)] leading-[1.06] font-medium tracking-tight text-fg-100 text-balance",children:"Sixteen tools. One tape."})}),(0,n.jsx)(m.A,{delay:100,children:(0,n.jsx)("p",{className:"max-w-xl text-base leading-relaxed text-fg-300 sm:text-lg",children:"The MCP server runs against your own engine, live or recorded, so an agent can pull the top-scored events with their full breakdowns, open one event’s complete story, or replay a window under a new config and diff what changes."})})]}),(0,n.jsx)(m.A,{delay:120,children:(0,n.jsx)(y._d,{tools:j.tools,columns:4})}),(0,n.jsx)(m.A,{delay:80,className:"flex justify-center",children:(0,n.jsx)(y.jY,{config:j})})]}),(0,n.jsxs)(x.Ay,{hue:"green",hue2:"sky",glow:!1,innerClassName:"space-y-10",children:[(0,n.jsxs)("div",{className:"grid items-center gap-10 lg:grid-cols-2 lg:gap-16",children:[(0,n.jsx)(m.A,{children:(0,n.jsxs)("div",{className:"space-y-4",children:[(0,n.jsx)("h2",{className:"text-2xl font-medium tracking-tight text-fg-100 sm:text-[28px]",children:"Keys later. Tape now."}),(0,n.jsx)(h.iq,{children:"The synthetic feed is a seeded, plausible tape with injected sweeps, blocks, and ladders, so the whole engine runs before you hold any vendor key. Plug in a real feed when you’re ready; servers bind loopback by default."})]})}),(0,n.jsx)(m.A,{delay:120,className:"min-w-0",children:(0,n.jsx)(u.A,{title:"terminal",lines:O,typewriter:!0})})]}),(0,n.jsx)(m.A,{delay:80,children:(0,n.jsx)(f.A,{connections:[{name:"Synthetic tape",note:"seeded and deterministic, runs with zero keys",tag:"built in"},{name:"Tradier",domain:"tradier.com",note:"live options prints",tag:"your key"},{name:"ThetaData",domain:"thetadata.net",note:"live and historical options tape",tag:"your key"},{name:"Alpaca",domain:"alpaca.markets",src:"https://github.com/alpacahq.png?size=64",note:"live options prints",tag:"your key"},{name:"Massive",domain:"massive.com",note:"flat files from disk",tag:"your files"}]})})]}),(0,n.jsx)(b.A,{statement:"Just tape. All math.",hue:"green",hue2:"pink",heading:"Open the detection. It's just tape.",body:"MIT-licensed and self-host only: the engine phones home to no one, ever. No hosted mode, no order execution, no win-rate claims. Prints, classifications, and arithmetic, with the work shown.",repo:"LuxAlgo/whale-options",repoUrl:v,licenseLine:"MIT \xa9 LuxAlgo Global, LLC \xb7 self-host only \xb7 no telemetry, ever"}),(0,n.jsx)("div",{className:"border-t border-white/[0.06] px-6 py-8",children:(0,n.jsx)("p",{className:"mx-auto max-w-3xl text-center text-xs leading-relaxed text-fg-300",children:"Whale Options is an independent project by LuxAlgo, not affiliated with, endorsed by, or derived from any commercial flow platform. Classifications and scores describe prints, not intent; audit returns measure moves of the underlying, never option P&L, and a calibration table is a measurement of one recorded window, not a forecast and not trading advice."})})]})}},87370:(e,t,s)=>{(window.__NEXT_P=window.__NEXT_P||[]).push(["/whale-options",function(){return s(20916)}])},99082:(e,t,s)=>{"use strict";s.d(t,{A:()=>r});var n=s(66352),a=s(9811);
1function r(e){let{connections:t,footer:s,columns:r=2}=e;return(0,n.jsx)("div",{className:"dark",children:(0,n.jsxs)("div",{className:"relative overflow-hidden rounded-2xl border border-white/10 bg-[#060606]",children:[(0,n.jsx)("div",{className:2===r?"grid sm:grid-cols-2":"grid",children:t.map((e,t)=>(0,n.jsxs)("div",{className:"flex items-center gap-3 border-white/[0.05] px-5 sm:px-6 ".concat(1===r?"py-4 ".concat(t>0?"border-t":""):"py-3 ".concat(t>1?"border-t":t>0?"border-t sm:border-t-0":""," ").concat(t%2==0?"sm:border-r":"")),children:[(0,n.jsx)(a.A,{domain:e.domain,src:e.src,name:e.name,className:"size-7",imgSize:17}),(0,n.jsxs)("span",{className:"min-w-0 flex-1",children:[(0,n.jsx)("span",{className:"block truncate text-[13px] font-medium text-fg-100",children:e.name}),(0,n.jsx)("span",{className:"block truncate text-xs text-fg-300",children:e.note})]}),e.tag&&(0,n.jsx)("span",{className:"shrink-0 rounded-full border border-white/10 bg-white/[0.03] px-2 py-0.5 text-[10px] font-medium whitespace-nowrap text-fg-300",children:e.tag})]},e.name))}),s&&(0,n.jsx)("p",{className:"border-t border-white/[0.06] px-5 py-3 text-xs text-fg-300 sm:px-6",children:s})]})})}}},e=>{e.O(0,[2233,8626,9546,8404,636,6593,8792],()=>e(e.s=87370)),_N_E=e.O()}]);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.