1:"$Sreact.fragment" 2:I[22016,["/_next/static/chunks/3fntmmi971322.js","/_next/static/chunks/0ahwd129-7-30.js"],""] 3:I[29306,["/_next/static/chunks/3fntmmi971322.js","/_next/static/chunks/0ahwd129-7-30.js"],"ProductMenu"] 4:I[5014,["/_next/static/chunks/3fntmmi971322.js","/_next/static/chunks/0ahwd129-7-30.js"],"default"] 5:I[33964,["/_next/static/chunks/3fntmmi971322.js","/_next/static/chunks/0ahwd129-7-30.js"],"PublicMobileNav"] c:X 11:X 11:C 0:{"buildId":"B8hBXTSnfA3UAgbX2EKsx","data":[{"rsc":["$","$1","c",{"children":[["$","div",null,{"className":"bricolage_grotesque_bcc75999-module__ZKECFW__variable relative min-h-screen overflow-x-clip bg-[#07090E] text-[#EAEDF2]","children":[["$","header",null,{"className":"sticky top-0 z-40 border-b border-white/[0.07] bg-[#07090E]/85 backdrop-blur-md","children":["$","div",null,{"className":"mx-auto flex max-w-7xl items-center justify-between gap-4 px-4 py-3.5 sm:px-6","children":[["$","div",null,{"className":"flex min-w-0 items-center gap-8","children":[["$","$L2",null,{"href":"/","className":"font-display inline-flex items-baseline gap-2 text-lg font-bold tracking-tight text-white focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-emerald-400","children":[["$","span",null,{"className":"h-2 w-2 translate-y-[-1px] bg-emerald-400","aria-hidden":"true"}],"ShakerScan"]}],["$","nav",null,{"className":"hidden items-center gap-6 text-sm text-[#98A2B3] lg:flex","aria-label":"Primary","children":[["$","$L3",null,{"items":[{"label":"Scan","href":"/product/scan","description":"Repeatable DAST for web apps and APIs"},{"label":"Hunt","href":"/product/hunt","description":"Adaptive investigation with your coding agent"},{"label":"AI Security","href":"/product/ai-security","description":"Test chat, RAG, agent, and MCP systems","badge":"Preview"},{"label":"Model Intake","href":"/product/model-intake","description":"Check model artifacts before deployment","badge":"Preview"},{"label":"Attack Surface","href":"/product/attack-surface","description":"Endpoint inventory, subdomains, CT monitoring"},{"label":"Connected Devices","href":"/product/connected-devices","description":"TVs, cameras, printers, routers, appliances"}]}],[["$","a","/check/",{"href":"/check/","className":"transition-colors hover:text-white focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-emerald-400","children":"Free check"}],["$","$L2","/docs",{"href":"/docs","className":"transition-colors hover:text-white focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-emerald-400","children":"Docs"}],["$","$L2","/enterprise",{"href":"/enterprise","className":"transition-colors hover:text-white focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-emerald-400 font-semibold text-[#EAEDF2]","children":"Enterprise"}]],["$","a",null,{"href":"https://github.com/andriyze/shakerscan","target":"_blank","rel":"noreferrer","className":"inline-flex items-center gap-1.5 transition-colors hover:text-white focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-emerald-400","children":[["$","$L4",null,{"icon":{"name":"git-fork","size":24,"node":[["circle",{"cx":"12","cy":"18","r":"3","key":"1mpf1b"}],["circle",{"cx":"6","cy":"6","r":"3","key":"1lh9wr"}],["circle",{"cx":"18","cy":"6","r":"3","key":"1h7g24"}],["path",{"d":"M18 9v2c0 .6-.4 1-1 1H7c-.6 0-1-.4-1-1V9","key":"1uq4wg"}],["path",{"d":"M12 12v3","key":"158kv8"}]]},"className":"h-3.5 w-3.5","aria-hidden":"true"}],"GitHub"]}]]}]]}],["$","div",null,{"className":"flex items-center gap-2 sm:gap-4","children":[["$","$L5",null,{"items":[{"label":"Scan","href":"/product/scan"},{"label":"Hunt","href":"/product/hunt"},{"label":"AI Security","href":"/product/ai-security"},{"label":"Model Intake","href":"/product/model-intake"},{"label":"Attack Surface","href":"/product/attack-surface"},{"label":"Connected Devices","href":"/product/connected-devices"},{"label":"Free check","href":"/check/","isAnchor":true,"emphasis":false},{"label":"Docs","href":"/docs","isAnchor":false,"emphasis":false},{"label":"Enterprise","href":"/enterprise","isAnchor":false,"emphasis":true},{"label":"GitHub","href":"https://github.com/andriyze/shakerscan"},{"label":"Open Source","href":"/open-source"}]}],["$","$L2",null,{"href":"/open-source#install","className":"rounded-lg bg-emerald-400 px-3.5 py-2 text-sm font-semibold text-emerald-950 transition-colors hover:bg-emerald-300 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-emerald-400","children":"Install ShakerScan"}]]}]]}]}],"$L6","$L7"]}],["$L8","$L9"],"$La"]}],"isPartial":"$@b","staleTime":"$c","varyParams":null},{"rsc":"$Ld","isPartial":"$@e","staleTime":"$c","varyParams":null},{"rsc":"$Lf","isPartial":"$@10","staleTime":"$c","varyParams":"$11"},{"rsc":"$L12","isPartial":"$@13","staleTime":"$c","varyParams":"$11"},{"rsc":"$L14","isPartial":"$@15","staleTime":"$c","varyParams":"$11"},{"rsc":"$L16","isPartial":"$@17","staleTime":"$c","varyParams":null}],"isUpgradeableISRFallback":false,"a":"$@18","rootVaryParams":null,"needsRuntimeRequest":"$@19"} 26:I[97367,["/_next/static/chunks/3fntmmi971322.js"],"OutletBoundary"] 27:"$Sreact.suspense" 29:I[97367,["/_next/static/chunks/3fntmmi971322.js"],"ViewportBoundary"] 2a:I[97367,["/_next/static/chunks/3fntmmi971322.js"],"MetadataBoundary"] 2b:I[27201,["/_next/static/chunks/3fntmmi971322.js"],"IconMark"] 2c:I[39756,["/_next/static/chunks/3fntmmi971322.js"],"default"] 2d:I[37457,["/_next/static/chunks/3fntmmi971322.js"],"default"] 2e:I[8821,["/_next/static/chunks/3fntmmi971322.js","/_next/static/chunks/22aga_6h1t_-r.js"],"default"] :HL["/_next/static/chunks/17s1t3rwlqr6e.css","style"] :HL["/_next/static/chunks/0p5_b9mq-qlz-.css","style"] 6:["$","div",null,{"className":"mx-auto max-w-7xl px-4 py-8 sm:px-6 sm:py-12 lg:grid lg:grid-cols-[230px_minmax(0,1fr)] lg:gap-10 xl:grid-cols-[230px_minmax(0,1fr)_200px]","children":[["$","aside",null,{"className":"lg:sticky lg:top-20 lg:self-start","children":[["$","details",null,{"className":"rounded-lg border border-white/10 bg-[#0C1118] lg:hidden","children":[["$","summary",null,{"className":"cursor-pointer px-4 py-3 text-sm font-medium text-white","children":"Documentation menu"}],["$","div",null,{"className":"border-t border-white/[0.07] px-4 py-4","children":["$","nav",null,{"aria-label":"Open-source documentation","className":"space-y-6","children":[["$","$L2",null,{"href":"/docs/open-source","className":"block text-sm font-semibold text-white hover:text-emerald-200","children":"Documentation home"}],[["$","div","Getting started",{"children":[["$","h2",null,{"className":"font-mono text-[10px] tracking-[0.2em] text-[#5F6B7A] uppercase","children":"Getting started"}],["$","ul",null,{"className":"mt-2.5 space-y-1","children":[["$","li","README.md",{"children":["$","$L2",null,{"href":"/docs/open-source/readme","className":"block rounded-md px-2 py-1.5 text-sm leading-5 transition-colors text-[#98A2B3] hover:bg-white/[0.04] hover:text-white","children":"README: install and first scan"}]}],["$","li","WALKTHROUGH.md",{"children":["$","$L2",null,{"href":"/docs/open-source/walkthrough","className":"block rounded-md px-2 py-1.5 text-sm leading-5 transition-colors text-[#98A2B3] hover:bg-white/[0.04] hover:text-white","children":"First-run walkthrough"}]}],["$","li","docs/upgrade-and-rollback.md",{"children":["$","$L2",null,{"href":"/docs/open-source/upgrade-and-rollback","className":"block rounded-md px-2 py-1.5 text-sm leading-5 transition-colors text-[#98A2B3] hover:bg-white/[0.04] hover:text-white","children":"Upgrade and rollback"}]}],["$","li","docs/client.md",{"children":["$","$L2",null,{"href":"/docs/open-source/client","className":"block rounded-md px-2 py-1.5 text-sm leading-5 transition-colors text-[#98A2B3] hover:bg-white/[0.04] hover:text-white","children":"Client, CLI and public checks"}]}],["$","li","skills/README.md",{"children":["$","$L2",null,{"href":"/docs/open-source/skills","className":"block rounded-md px-2 py-1.5 text-sm leading-5 transition-colors text-[#98A2B3] hover:bg-white/[0.04] hover:text-white","children":"Agent skills and setup"}]}]]}]]}],["$","div","Workflows",{"children":[["$","h2",null,{"className":"font-mono text-[10px] tracking-[0.2em] text-[#5F6B7A] uppercase","children":"Workflows"}],["$","ul",null,{"className":"mt-2.5 space-y-1","children":[["$","li","docs/product-model.md",{"children":["$","$L2",null,{"href":"/docs/open-source/product-model","className":"block rounded-md px-2 py-1.5 text-sm leading-5 transition-colors text-[#98A2B3] hover:bg-white/[0.04] hover:text-white","children":"Product model and vocabulary"}]}],["$","li","docs/hunt-architecture.md",{"children":["$","$L2",null,{"href":"/docs/open-source/hunt-architecture","className":"block rounded-md px-2 py-1.5 text-sm leading-5 transition-colors text-[#98A2B3] hover:bg-white/[0.04] hover:text-white","children":"Hunt architecture"}]}],["$","li","docs/hunt-authorization-workflow.md",{"children":["$","$L2",null,{"href":"/docs/open-source/hunt-authorization-workflow","className":"block rounded-md px-2 py-1.5 text-sm leading-5 transition-colors text-[#98A2B3] hover:bg-white/[0.04] hover:text-white","children":"Hunt authorization workflow"}]}],["$","li","docs/hunt-authorization-behavior.md",{"children":["$","$L2",null,{"href":"/docs/open-source/hunt-authorization-behavior","className":"block rounded-md px-2 py-1.5 text-sm leading-5 transition-colors text-[#98A2B3] hover:bg-white/[0.04] hover:text-white","children":"Hunt authorization behavior"}]}],["$","li","docs/AI_TEST_WORKFLOWS.md",{"children":["$","$L2",null,{"href":"/docs/open-source/AI_TEST_WORKFLOWS","className":"block rounded-md px-2 py-1.5 text-sm leading-5 transition-colors text-[#98A2B3] hover:bg-white/[0.04] hover:text-white","children":"AI test workflows"}]}],"$L1a","$L1b"]}]]}],"$L1c","$L1d"],"$L1e"]}]}]]}],"$L1f"]}],"$L20","$L21"]}] 7:["$","footer",null,{"className":"border-t border-white/[0.07]","children":["$","div",null,{"className":"mx-auto max-w-7xl px-4 py-12 sm:px-6 sm:py-16","children":[["$","div",null,{"className":"grid gap-10 sm:grid-cols-2 lg:grid-cols-[1.4fr_1fr_1fr_1fr]","children":[["$","div",null,{"children":[["$","$L2",null,{"href":"/","className":"font-display inline-flex items-baseline gap-2 text-lg font-bold tracking-tight text-white","children":[["$","span",null,{"className":"h-2 w-2 translate-y-[-1px] bg-emerald-400","aria-hidden":"true"}],"ShakerScan"]}],["$","p",null,{"className":"mt-3 max-w-xs text-sm leading-6 text-[#7C8798]","children":"Open-source security testing platform for web applications, APIs, AI systems, and network-connected devices. Self-hosted in Docker."}],["$","p",null,{"className":"mt-4 text-xs leading-5 text-[#5F6B7A]","children":"Only test systems you own or are explicitly authorized to assess."}]]}],[["$","div","Product",{"children":[["$","h4",null,{"className":"font-mono text-[11px] tracking-[0.22em] text-[#5F6B7A] uppercase","children":"Product"}],["$","ul",null,{"className":"mt-4 space-y-2.5","children":[["$","li","/product/scan",{"children":["$","$L2",null,{"href":"/product/scan","className":"inline-flex items-center gap-1 text-sm text-[#98A2B3] transition-colors hover:text-white","children":"Scan"}]}],["$","li","/product/hunt",{"children":["$","$L2",null,{"href":"/product/hunt","className":"inline-flex items-center gap-1 text-sm text-[#98A2B3] transition-colors hover:text-white","children":"Hunt"}]}],["$","li","/product/ai-security",{"children":["$","$L2",null,{"href":"/product/ai-security","className":"inline-flex items-center gap-1 text-sm text-[#98A2B3] transition-colors hover:text-white","children":"AI Security"}]}],["$","li","/product/model-intake",{"children":["$","$L2",null,{"href":"/product/model-intake","className":"inline-flex items-center gap-1 text-sm text-[#98A2B3] transition-colors hover:text-white","children":"Model Intake"}]}],["$","li","/product/attack-surface",{"children":["$","$L2",null,{"href":"/product/attack-surface","className":"inline-flex items-center gap-1 text-sm text-[#98A2B3] transition-colors hover:text-white","children":"Attack Surface"}]}],["$","li","/product/connected-devices",{"children":["$","$L2",null,{"href":"/product/connected-devices","className":"inline-flex items-center gap-1 text-sm text-[#98A2B3] transition-colors hover:text-white","children":"Connected Devices"}]}]]}]]}],["$","div","Resources",{"children":[["$","h4",null,{"className":"font-mono text-[11px] tracking-[0.22em] text-[#5F6B7A] uppercase","children":"Resources"}],["$","ul",null,{"className":"mt-4 space-y-2.5","children":[["$","li","/open-source",{"children":["$","$L2",null,{"href":"/open-source","className":"inline-flex items-center gap-1 text-sm text-[#98A2B3] transition-colors hover:text-white","children":"Open Source"}]}],["$","li","/check/",{"children":["$","a",null,{"href":"/check/","className":"inline-flex items-center gap-1 text-sm text-[#98A2B3] transition-colors hover:text-white","children":"Free posture check"}]}],["$","li","/docs",{"children":["$","$L2",null,{"href":"/docs","className":"inline-flex items-center gap-1 text-sm text-[#98A2B3] transition-colors hover:text-white","children":"Documentation"}]}],["$","li","/research",{"children":["$","$L2",null,{"href":"/research","className":"inline-flex items-center gap-1 text-sm text-[#98A2B3] transition-colors hover:text-white","children":"Research"}]}],["$","li","/about",{"children":["$","$L2",null,{"href":"/about","className":"inline-flex items-center gap-1 text-sm text-[#98A2B3] transition-colors hover:text-white","children":"About"}]}]]}]]}],["$","div","Trust",{"children":[["$","h4",null,{"className":"font-mono text-[11px] tracking-[0.22em] text-[#5F6B7A] uppercase","children":"Trust"}],["$","ul",null,{"className":"mt-4 space-y-2.5","children":[["$","li","/security",{"children":["$","$L2",null,{"href":"/security","className":"inline-flex items-center gap-1 text-sm text-[#98A2B3] transition-colors hover:text-white","children":"Security"}]}],"$L22","$L23","$L24"]}]]}]]]}],"$L25"]}]}] 8:["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/17s1t3rwlqr6e.css","precedence":"next"}] 9:["$","script","script-0",{"src":"/_next/static/chunks/0ahwd129-7-30.js","async":true}] a:["$","$L26",null,{"children":["$","$27",null,{"name":"Next.MetadataOutlet","children":"$@28"}]}] d:["$","$1","h",{"children":[null,["$","$L29",null,{"children":[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]}],["$","div",null,{"hidden":true,"children":["$","$L2a",null,{"children":["$","$27",null,{"name":"Next.Metadata","children":[["$","title","0",{"children":"ShakerScan 2.4.1 — ShakerScan Docs"}],["$","meta","1",{"name":"description","content":"Fixes found by driving an open-source engine from the client over a LAN, each reproduced live and retested from a second machine: a target on a non-standard…"}],["$","meta","2",{"name":"robots","content":"index, follow"}],["$","link","3",{"rel":"canonical","href":"https://shakerscan.com/docs/open-source/releases/2.4.1"}],["$","meta","4",{"property":"og:title","content":"ShakerScan 2.4.1 — ShakerScan Docs"}],["$","meta","5",{"property":"og:description","content":"Fixes found by driving an open-source engine from the client over a LAN, each reproduced live and retested from a second machine: a target on a non-standard…"}],["$","meta","6",{"property":"og:url","content":"https://shakerscan.com/docs/open-source/releases/2.4.1"}],["$","meta","7",{"property":"og:site_name","content":"ShakerScan"}],["$","meta","8",{"property":"og:type","content":"article"}],["$","meta","9",{"name":"twitter:card","content":"summary"}],["$","meta","10",{"name":"twitter:title","content":"ShakerScan 2.4.1 — ShakerScan Docs"}],["$","meta","11",{"name":"twitter:description","content":"Fixes found by driving an open-source engine from the client over a LAN, each reproduced live and retested from a second machine: a target on a non-standard…"}],["$","link","12",{"rel":"icon","href":"/favicon.svg","type":"image/svg+xml"}],["$","link","13",{"rel":"apple-touch-icon","href":"/apple-icon.svg","type":"image/svg+xml"}],["$","$L2b","14",{}]]}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}] f:["$","$1","c",{"children":[null,["$","$L2c",null,{"parallelRouterKey":"children","template":["$","$L2d",null,{}]}]]}] 12:["$","$1","c",{"children":[null,["$","$L2c",null,{"parallelRouterKey":"children","template":["$","$L2d",null,{}]}]]}] 14:["$","$1","c",{"children":[null,["$","$L2c",null,{"parallelRouterKey":"children","template":["$","$L2d",null,{}]}]]}] 16:["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/0p5_b9mq-qlz-.css","precedence":"next"}],["$","script","script-0",{"src":"/_next/static/chunks/3fntmmi971322.js","async":true}]],["$","html",null,{"lang":"en","data-theme":"dark","style":{"colorScheme":"dark"},"children":["$","body",null,{"className":"geist_a71539c9-module__T19VSG__variable geist_mono_8d43a2aa-module__8Li5zG__variable antialiased","children":["$","$L2c",null,{"parallelRouterKey":"children","error":"$2e","errorStyles":[],"errorScripts":[["$","script","script-0",{"src":"/_next/static/chunks/22aga_6h1t_-r.js","async":true}]],"template":["$","$L2d",null,{}],"notFound":[["$","div",null,{"className":"flex min-h-screen flex-col items-center justify-center bg-stone-950 text-stone-100","children":[["$","h1",null,{"className":"text-6xl font-bold tracking-tight text-stone-400","children":"404"}],["$","p",null,{"className":"mt-4 text-lg text-stone-500","children":"Page not found"}],["$","$L2",null,{"href":"/","className":"mt-8 rounded-md bg-stone-800 px-5 py-2.5 text-sm font-medium text-stone-200 transition hover:bg-stone-700","children":"Back to home"}]]}],[]]}]}]}]]}] 1a:["$","li","docs/connected-device-security.md",{"children":["$","$L2",null,{"href":"/docs/open-source/connected-device-security","className":"block rounded-md px-2 py-1.5 text-sm leading-5 transition-colors text-[#98A2B3] hover:bg-white/[0.04] hover:text-white","children":"Connected-device security"}]}] 1b:["$","li","docs/model-intake-security-review-roadmap.md",{"children":["$","$L2",null,{"href":"/docs/open-source/model-intake-security-review-roadmap","className":"block rounded-md px-2 py-1.5 text-sm leading-5 transition-colors text-[#98A2B3] hover:bg-white/[0.04] hover:text-white","children":"Model Intake boundary"}]}] 1c:["$","div","Architecture and operations",{"children":[["$","h2",null,{"className":"font-mono text-[10px] tracking-[0.2em] text-[#5F6B7A] uppercase","children":"Architecture and operations"}],["$","ul",null,{"className":"mt-2.5 space-y-1","children":[["$","li","docs/dast-asm-architecture.md",{"children":["$","$L2",null,{"href":"/docs/open-source/dast-asm-architecture","className":"block rounded-md px-2 py-1.5 text-sm leading-5 transition-colors text-[#98A2B3] hover:bg-white/[0.04] hover:text-white","children":"DAST execution and Continuous ASM"}]}],["$","li","docs/multi-node-guide.md",{"children":["$","$L2",null,{"href":"/docs/open-source/multi-node-guide","className":"block rounded-md px-2 py-1.5 text-sm leading-5 transition-colors text-[#98A2B3] hover:bg-white/[0.04] hover:text-white","children":"Multi-node Fleet guide"}]}],["$","li","docs/multi-node-architecture.md",{"children":["$","$L2",null,{"href":"/docs/open-source/multi-node-architecture","className":"block rounded-md px-2 py-1.5 text-sm leading-5 transition-colors text-[#98A2B3] hover:bg-white/[0.04] hover:text-white","children":"Multi-node architecture"}]}],["$","li","docs/mcp.md",{"children":["$","$L2",null,{"href":"/docs/open-source/mcp","className":"block rounded-md px-2 py-1.5 text-sm leading-5 transition-colors text-[#98A2B3] hover:bg-white/[0.04] hover:text-white","children":"MCP adapter"}]}],["$","li","docs/owasp-coverage-matrix.md",{"children":["$","$L2",null,{"href":"/docs/open-source/owasp-coverage-matrix","className":"block rounded-md px-2 py-1.5 text-sm leading-5 transition-colors text-[#98A2B3] hover:bg-white/[0.04] hover:text-white","children":"OWASP coverage matrix"}]}],["$","li","docs/functionality-reference.md",{"children":["$","$L2",null,{"href":"/docs/open-source/functionality-reference","className":"block rounded-md px-2 py-1.5 text-sm leading-5 transition-colors text-[#98A2B3] hover:bg-white/[0.04] hover:text-white","children":"Functionality reference"}]}]]}]]}] 1d:["$","div","Releases and process",{"children":[["$","h2",null,{"className":"font-mono text-[10px] tracking-[0.2em] text-[#5F6B7A] uppercase","children":"Releases and process"}],["$","ul",null,{"className":"mt-2.5 space-y-1","children":[["$","li","docs/release-process.md",{"children":["$","$L2",null,{"href":"/docs/open-source/release-process","className":"block rounded-md px-2 py-1.5 text-sm leading-5 transition-colors text-[#98A2B3] hover:bg-white/[0.04] hover:text-white","children":"Release process"}]}],["$","li","docs/sbom.md",{"children":["$","$L2",null,{"href":"/docs/open-source/sbom","className":"block rounded-md px-2 py-1.5 text-sm leading-5 transition-colors text-[#98A2B3] hover:bg-white/[0.04] hover:text-white","children":"Release SBOMs"}]}],["$","li","docs/releases/README.md",{"children":["$","$L2",null,{"href":"/docs/open-source/releases/README","className":"block rounded-md px-2 py-1.5 text-sm leading-5 transition-colors text-[#98A2B3] hover:bg-white/[0.04] hover:text-white","children":"Release notes index"}]}],["$","li","RELEASES.md",{"children":["$","$L2",null,{"href":"/docs/open-source/release-mapping","className":"block rounded-md px-2 py-1.5 text-sm leading-5 transition-colors text-[#98A2B3] hover:bg-white/[0.04] hover:text-white","children":"Release mapping"}]}],["$","li","benchmarks/README.md",{"children":["$","$L2",null,{"href":"/docs/open-source/benchmarks","className":"block rounded-md px-2 py-1.5 text-sm leading-5 transition-colors text-[#98A2B3] hover:bg-white/[0.04] hover:text-white","children":"Benchmark fixtures"}]}],["$","li","AGENTS.md",{"children":["$","$L2",null,{"href":"/docs/open-source/agents","className":"block rounded-md px-2 py-1.5 text-sm leading-5 transition-colors text-[#98A2B3] hover:bg-white/[0.04] hover:text-white","children":"Agent operating policy"}]}]]}]]}] 1e:["$","div",null,{"className":"border-t border-white/[0.07] pt-4 text-xs leading-5 text-[#5F6B7A]","children":["Rendered from"," ",["$","a",null,{"href":"https://github.com/andriyze/shakerscan/tree/v2.5.4/docs","target":"_blank","rel":"noreferrer","className":"inline-flex items-center gap-1 text-[#98A2B3] hover:text-white","children":["v2.5.4"," ",["$","$L4",null,{"icon":{"name":"external-link","size":24,"node":[["path",{"d":"M15 3h6v6","key":"1q9fwt"}],["path",{"d":"M10 14 21 3","key":"gplh6r"}],["path",{"d":"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6","key":"a6xqqp"}]]},"className":"h-3 w-3","aria-hidden":"true"}]]}],", the current stable channel."]}] 1f:["$","div",null,{"className":"hidden max-h-[calc(100vh-6rem)] overflow-y-auto pr-2 lg:block","children":"$6:props:children:0:props:children:0:props:children:1:props:children"}] 20:["$","main",null,{"className":"mt-8 min-w-0 lg:mt-0","children":[["$","script",null,{"type":"application/ld+json","dangerouslySetInnerHTML":{"__html":"{\"@context\":\"https://schema.org\",\"@type\":\"BreadcrumbList\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https://shakerscan.com/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Docs\",\"item\":\"https://shakerscan.com/docs\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Open Source\",\"item\":\"https://shakerscan.com/docs/open-source\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"ShakerScan 2.4.1\",\"item\":\"https://shakerscan.com/docs/open-source/releases/2.4.1\"}]}"}}],["$","script",null,{"type":"application/ld+json","dangerouslySetInnerHTML":{"__html":"{\"@context\":\"https://schema.org\",\"@type\":\"TechArticle\",\"headline\":\"ShakerScan 2.4.1\",\"description\":\"Fixes found by driving an open-source engine from the client over a LAN, each reproduced live and retested from a second machine: a target on a non-standard…\",\"url\":\"https://shakerscan.com/docs/open-source/releases/2.4.1\",\"version\":\"2.5.4\",\"inLanguage\":\"en\",\"author\":{\"@type\":\"Organization\",\"name\":\"ShakerScan\",\"url\":\"https://shakerscan.com\"},\"isPartOf\":{\"@type\":\"WebSite\",\"name\":\"ShakerScan\",\"url\":\"https://shakerscan.com\"}}"}}],["$","nav",null,{"className":"font-mono text-[11px] tracking-wide text-[#5F6B7A] uppercase","aria-label":"Breadcrumb","children":[["$","$L2",null,{"href":"/docs","className":"transition-colors hover:text-[#98A2B3]","children":"Docs"}],["$","span",null,{"className":"mx-2 text-white/20","children":"/"}],["$","$L2",null,{"href":"/docs/open-source","className":"transition-colors hover:text-[#98A2B3]","children":"Open Source"}],["$","span",null,{"className":"mx-2 text-white/20","children":"/"}],["$","span",null,{"className":"normal-case","children":"docs/releases/2.4.1.md"}]]}],["$","div",null,{"className":"mt-4 flex flex-wrap items-center gap-x-5 gap-y-2 border-b border-white/[0.07] pb-4 text-xs text-[#7C8798]","children":[["$","span",null,{"children":["Pinned to ",["$","span",null,{"className":"font-mono text-[#C6CDD8]","children":"v2.5.4"}]]}],["$","a",null,{"href":"https://github.com/andriyze/shakerscan/blob/v2.5.4/docs/releases/2.4.1.md","target":"_blank","rel":"noreferrer","className":"inline-flex items-center gap-1 text-[#98A2B3] hover:text-white","children":["View source on GitHub ",["$","$L4",null,{"icon":"$1e:props:children:2:props:children:2:props:icon","className":"h-3 w-3","aria-hidden":"true"}]]}],["$","a",null,{"href":"https://github.com/andriyze/shakerscan/issues","target":"_blank","rel":"noreferrer","className":"inline-flex items-center gap-1 text-[#98A2B3] hover:text-white","children":["Report an issue ",["$","$L4",null,{"icon":"$1e:props:children:2:props:children:2:props:icon","className":"h-3 w-3","aria-hidden":"true"}]]}]]}],["$","article",null,{"className":"mt-6","children":["$","div",null,{"className":"oss-markdown","children":[["$","h1","h1-0",{"id":"shakerscan-241","children":["$","a",null,{"href":"#shakerscan-241","className":"oss-heading-anchor","children":"ShakerScan 2.4.1"}]}],"\n",["$","p","p-0",{"children":"Fixes found by driving an open-source engine from the client over a LAN, each reproduced live and\nretested from a second machine: a target on a non-standard port could not exist, a scanned or\nhunted target could not be deleted, and a Hunt asked for active work on an unauthorized target\nanswered with a refusal nobody could act on. Upgrade in place from 2.4.0; the target-identity\nchange runs a recorded one-time key recompute at startup. No change to the deterministic proof\nboundary."}],"\n",["$","h2","h2-0",{"id":"changes","children":["$","a",null,{"href":"#changes","className":"oss-heading-anchor","children":"Changes"}]}],"\n",["$","h3","h3-0",{"id":"targets-a-non-default-port-is-part-of-the-identity-187","children":["$","a",null,{"href":"#targets-a-non-default-port-is-part-of-the-identity-187","className":"oss-heading-anchor","children":"Targets: a non-default port is part of the identity (#187)"}]}],"\n","$L2f","\n","$L30","\n","$L31","\n","$L32","\n","$L33","\n","$L34","\n","$L35","\n","$L36","\n","$L37","\n","$L38","\n","$L39"]}]}],"$L3a"]}] 21:["$","aside",null,{"className":"hidden xl:sticky xl:top-20 xl:block xl:self-start","children":["$","nav",null,{"aria-label":"On this page","children":[["$","h2",null,{"className":"font-mono text-[10px] tracking-[0.2em] text-[#5F6B7A] uppercase","children":"On this page"}],["$","ul",null,{"className":"mt-2.5 max-h-[calc(100vh-8rem)] space-y-1 overflow-y-auto border-l border-white/[0.07] pl-3 text-xs leading-5","children":[["$","li","changes-2",{"children":["$","a",null,{"href":"#changes","className":"block text-[#98A2B3] hover:text-white ","children":"Changes"}]}],["$","li","targets-a-non-default-port-is-part-of-the-identity-187-3",{"children":["$","a",null,{"href":"#targets-a-non-default-port-is-part-of-the-identity-187","className":"block text-[#98A2B3] hover:text-white pl-3 text-[#7C8798]","children":"Targets: a non-default port is part of the identity (#187)"}]}],["$","li","deletion-works-after-scans-and-hunts-185-187-3",{"children":["$","a",null,{"href":"#deletion-works-after-scans-and-hunts-185-187","className":"block text-[#98A2B3] hover:text-white pl-3 text-[#7C8798]","children":"Deletion works after scans and Hunts (#185, #187)"}]}],["$","li","request-collections-can-be-deleted-3",{"children":["$","a",null,{"href":"#request-collections-can-be-deleted","className":"block text-[#98A2B3] hover:text-white pl-3 text-[#7C8798]","children":"Request collections can be deleted"}]}],["$","li","hunt-184-3",{"children":["$","a",null,{"href":"#hunt-184","className":"block text-[#98A2B3] hover:text-white pl-3 text-[#7C8798]","children":"Hunt (#184)"}]}],["$","li","launcher-187-3",{"children":["$","a",null,{"href":"#launcher-187","className":"block text-[#98A2B3] hover:text-white pl-3 text-[#7C8798]","children":"Launcher (#187)"}]}],["$","li","client-3",{"children":["$","a",null,{"href":"#client","className":"block text-[#98A2B3] hover:text-white pl-3 text-[#7C8798]","children":"Client"}]}]]}]]}]}] 22:["$","li","/vulnerability-disclosure",{"children":["$","$L2",null,{"href":"/vulnerability-disclosure","className":"inline-flex items-center gap-1 text-sm text-[#98A2B3] transition-colors hover:text-white","children":"Vulnerability disclosure"}]}] 23:["$","li","/privacy",{"children":["$","$L2",null,{"href":"/privacy","className":"inline-flex items-center gap-1 text-sm text-[#98A2B3] transition-colors hover:text-white","children":"Privacy"}]}] 24:["$","li","/terms",{"children":["$","$L2",null,{"href":"/terms","className":"inline-flex items-center gap-1 text-sm text-[#98A2B3] transition-colors hover:text-white","children":"Terms"}]}] 25:["$","div",null,{"className":"mt-12 flex flex-col items-center justify-between gap-4 border-t border-white/[0.07] pt-6 sm:flex-row","children":[["$","span",null,{"className":"font-mono text-[11px] text-[#5F6B7A]","children":["© ",2026," ShakerScan. Source available under"," ",["$","a",null,{"href":"https://github.com/andriyze/shakerscan/blob/main/LICENSE","target":"_blank","rel":"noreferrer","className":"text-[#7C8798] underline decoration-white/20 underline-offset-2 transition-colors hover:text-white","children":"AGPL-3.0"}],"."]}],["$","div",null,{"className":"flex flex-wrap items-center justify-center gap-x-5 gap-y-2","children":[[["$","$L2","/enterprise",{"href":"/enterprise","className":"inline-flex items-center gap-1 font-mono text-[11px] text-[#7C8798] transition-colors hover:text-white","children":"Enterprise"}],["$","a","mailto:sales@shakerscan.com",{"href":"mailto:sales@shakerscan.com","target":"_blank","rel":"noreferrer","className":"inline-flex items-center gap-1 font-mono text-[11px] text-[#7C8798] transition-colors hover:text-white","children":["Contact",["$","$L4",null,{"icon":"$1e:props:children:2:props:children:2:props:icon","className":"h-3 w-3","aria-hidden":"true"}]]}]],["$","a",null,{"href":"https://github.com/andriyze/shakerscan","target":"_blank","rel":"noreferrer","className":"inline-flex items-center gap-2 font-mono text-[11px] text-[#7C8798] transition-colors hover:text-white","children":[["$","$L4",null,{"icon":"$0:data:0:rsc:props:children:0:props:children:0:props:children:props:children:0:props:children:1:props:children:2:props:children:0:props:icon","className":"h-3.5 w-3.5","aria-hidden":"true"}],"github.com/andriyze/shakerscan"]}]]}]]}] 28:null 19:true c:300 2f:["$","ul","ul-0",{"children":["\n",["$","li","li-0",{"children":["Web identity was host-only, so ",["$","code","code-0",{"children":"https://host:8443"}]," deduped into the ",["$","code","code-1",{"children":"https://host"}]," row, every\nscan and Hunt kept going to the closed default port, and recreating the target with the port\nanswered ",["$","code","code-2",{"children":"already_exists"}],". The canonical key now keeps a port that is not the scheme's default;\nhttp and https on the default ports still merge into one asset. The Python key and the SQL\ntrigger agree, and a recorded startup migration recomputes existing keys (they can only split)."]}],"\n"]}] 30:["$","h3","h3-1",{"id":"deletion-works-after-scans-and-hunts-185-187","children":["$","a",null,{"href":"#deletion-works-after-scans-and-hunts-185-187","className":"oss-heading-anchor","children":"Deletion works after scans and Hunts (#185, #187)"}]}] 31:["$","ul","ul-1",{"children":["\n",["$","li","li-0",{"children":["Every recorded HTTP transaction is classified ",["$","code","code-0",{"children":"sensitive"}]," by default, and the deletion inventory\ntreated that as a hold: any target that had ever been scanned or hunted answered \"legal hold or\nprotected evidence blocks deletion; archive the target instead\". Sensitive is a classification;\nonly ",["$","code","code-1",{"children":"legal_hold"}],"/",["$","code","code-2",{"children":"audit"}]," classes and explicit hold flags block erasure."]}],"\n",["$","li","li-1",{"children":["Abandoned work no longer blocks deletion forever. Work a worker is actively updating still\nblocks, and the message names the rows and the cancel route; rows never picked up or untouched\nfor 15 minutes are reported as ",["$","code","code-0",{"children":"abandoned"}]," in the preview and cancelled by the approved\ndeletion, which also stops the target's automatic work (ASM, schedules)."]}],"\n",["$","li","li-2",{"children":["Cancelling a scan settles its ASM campaign; a campaign with no unfinished scan is done. Before,\na cancelled scan left its campaign ",["$","code","code-0",{"children":"active"}]," and the target read as having running work."]}],"\n",["$","li","li-3",{"children":"Archived targets stay reachable: the Targets page has a \"Show archived\" toggle, an archived\nbadge, a Restore action, and the delete dialog no longer offers \"archive instead\" for a row that\nalready is."}],"\n",["$","li","li-4",{"children":["Agents get a guarded ",["$","code","code-0",{"children":"/delete-target"}]," command: archive, restore, preview, the exact dangerous\napproval body, execute, and the rules (explicit user request, show the preview, never batch).\nThe frozen-source installer downloads it, and a test now pins the installer's command list to\nthe repository's commands so the next new command cannot be left out."]}],"\n"]}] 32:["$","h3","h3-2",{"id":"request-collections-can-be-deleted","children":["$","a",null,{"href":"#request-collections-can-be-deleted","className":"oss-heading-anchor","children":"Request collections can be deleted"}]}] 33:["$","ul","ul-2",{"children":["\n",["$","li","li-0",{"children":["A web request collection could be uploaded but never removed: the API had no route and the\npage had no control, so a stale or mistaken upload stayed selectable forever.\n",["$","code","code-0",{"children":"DELETE /request-collections/{collection_id}"}]," retires it: hidden from the list, its saved\nselections, bindings and environments revoked, no new Scan or Hunt can use it, and a\nre-upload under the same name replaces it. Historical scan records keep their immutable\nselection digests; the encrypted document is erased with the owning target's records. The\nRequest Collections page has a Delete button with a confirmation. Credential profiles already\nhad Deactivate with a \"Show inactive\" toggle; that is unchanged."]}],"\n"]}] 34:["$","h3","h3-3",{"id":"hunt-184","children":["$","a",null,{"href":"#hunt-184","className":"oss-heading-anchor","children":"Hunt (#184)"}]}] 35:["$","ul","ul-3",{"children":["\n",["$","li","li-0",{"children":["A Hunt asked for active, state-changing or network-discovery work on a target with no standing\nauthorization is refused with a message that names the remedy\n(",["$","code","code-0",{"children":"POST /targets/{target_id}/authorization"}],"); the MCP ",["$","code","code-1",{"children":"shakerscan_hunt_start"}]," policy schema says\nthe same up front. The gate itself is unchanged."]}],"\n"]}] 36:["$","h3","h3-4",{"id":"launcher-187","children":["$","a",null,{"href":"#launcher-187","className":"oss-heading-anchor","children":"Launcher (#187)"}]}] 37:["$","ul","ul-4",{"children":["\n",["$","li","li-0",{"children":[["$","code","code-0",{"children":"rebuild"}]," right after ",["$","code","code-1",{"children":"install-deps"}]," in the same shell built the scanner image and then failed\nto resolve it: Compose had gone through sudo while the plain ",["$","code","code-2",{"children":"docker image inspect"}]," was refused\nat the socket. The resolve now follows Compose's choice."]}],"\n"]}] 38:["$","h3","h3-5",{"id":"client","children":["$","a",null,{"href":"#client","className":"oss-heading-anchor","children":"Client"}]}] 39:["$","ul","ul-5",{"children":["\n",["$","li","li-0",{"children":["Client 0.7.0 carries the updated agent kit (the ",["$","code","code-0",{"children":"/delete-target"}]," command and the Hunt\nauthorization guidance) and everything from 0.5.0 and 0.6.0: ",["$","code","code-1",{"children":"agent --url"}]," and\n",["$","code","code-2",{"children":"connect http://:8080"}]," for an open-source engine on a trusted LAN."]}],"\n"]}] 3a:["$","p",null,{"className":"mt-10 border-t border-white/[0.07] pt-4 text-xs leading-5 text-[#5F6B7A]","children":["This page is rendered from ",["$","span",null,{"className":"font-mono","children":"docs/releases/2.4.1.md"}]," in the open-source repository at ","v2.5.4",". When documentation and implementation disagree, the code, database schema, and tests at that tag are authoritative."]}] c:C 18:0 e:"$undefined" 10:"$undefined" 13:"$undefined" 15:"$undefined" 17:"$undefined" b:"$undefined"