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.3.2 — ShakerScan Docs"}],["$","meta","1",{"name":"description","content":"A maintenance release for self-hosted deployments. It fixes the crawler memory blow-up on JavaScript-heavy sites, makes coverage truthful when a scanner dies,…"}],["$","meta","2",{"name":"robots","content":"index, follow"}],["$","link","3",{"rel":"canonical","href":"https://shakerscan.com/docs/open-source/releases/2.3.2"}],["$","meta","4",{"property":"og:title","content":"ShakerScan 2.3.2 — ShakerScan Docs"}],["$","meta","5",{"property":"og:description","content":"A maintenance release for self-hosted deployments. It fixes the crawler memory blow-up on JavaScript-heavy sites, makes coverage truthful when a scanner dies,…"}],["$","meta","6",{"property":"og:url","content":"https://shakerscan.com/docs/open-source/releases/2.3.2"}],["$","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.3.2 — ShakerScan Docs"}],["$","meta","11",{"name":"twitter:description","content":"A maintenance release for self-hosted deployments. It fixes the crawler memory blow-up on JavaScript-heavy sites, makes coverage truthful when a scanner dies,…"}],["$","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.3.2\",\"item\":\"https://shakerscan.com/docs/open-source/releases/2.3.2\"}]}"}}],["$","script",null,{"type":"application/ld+json","dangerouslySetInnerHTML":{"__html":"{\"@context\":\"https://schema.org\",\"@type\":\"TechArticle\",\"headline\":\"ShakerScan 2.3.2\",\"description\":\"A maintenance release for self-hosted deployments. It fixes the crawler memory blow-up on JavaScript-heavy sites, makes coverage truthful when a scanner dies,…\",\"url\":\"https://shakerscan.com/docs/open-source/releases/2.3.2\",\"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.3.2.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.3.2.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-232","children":["$","a",null,{"href":"#shakerscan-232","className":"oss-heading-anchor","children":"ShakerScan 2.3.2"}]}],"\n",["$","p","p-0",{"children":"A maintenance release for self-hosted deployments. It fixes the crawler memory blow-up on\nJavaScript-heavy sites, makes coverage truthful when a scanner dies, lets a target be authorized\nonce instead of per scan, and gives hardened deployments without the Docker socket honest\ncapacity and inventory. Upgrade in place from 2.3.1; 0.8.18 remains the oldest directly certified\nupgrade base. No change to the deterministic proof boundary."}],"\n",["$","h2","h2-0",{"id":"changes","children":["$","a",null,{"href":"#changes","className":"oss-heading-anchor","children":"Changes"}]}],"\n",["$","h3","h3-0",{"id":"crawler-bounded-memory-and-truthful-coverage","children":["$","a",null,{"href":"#crawler-bounded-memory-and-truthful-coverage","className":"oss-heading-anchor","children":"Crawler: bounded memory and truthful coverage"}]}],"\n",["$","ul","ul-0",{"children":["\n","$L2f","\n","$L30","\n","$L31","\n"]}],"\n","$L32","\n","$L33","\n","$L34","\n","$L35","\n","$L36","\n","$L37","\n","$L38","\n","$L39","\n","$L3a","\n","$L3b"]}]}],"$L3c"]}] 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","crawler-bounded-memory-and-truthful-coverage-3",{"children":["$","a",null,{"href":"#crawler-bounded-memory-and-truthful-coverage","className":"block text-[#98A2B3] hover:text-white pl-3 text-[#7C8798]","children":"Crawler: bounded memory and truthful coverage"}]}],["$","li","authorize-a-target-once-3",{"children":["$","a",null,{"href":"#authorize-a-target-once","className":"block text-[#98A2B3] hover:text-white pl-3 text-[#7C8798]","children":"Authorize a target once"}]}],["$","li","deployments-without-the-docker-socket-3",{"children":["$","a",null,{"href":"#deployments-without-the-docker-socket","className":"block text-[#98A2B3] hover:text-white pl-3 text-[#7C8798]","children":"Deployments without the Docker socket"}]}],["$","li","ui-3",{"children":["$","a",null,{"href":"#ui","className":"block text-[#98A2B3] hover:text-white pl-3 text-[#7C8798]","children":"UI"}]}],["$","li","release-and-ci-hygiene-3",{"children":["$","a",null,{"href":"#release-and-ci-hygiene","className":"block text-[#98A2B3] hover:text-white pl-3 text-[#7C8798]","children":"Release and CI hygiene"}]}],["$","li","upgrade-2",{"children":["$","a",null,{"href":"#upgrade","className":"block text-[#98A2B3] hover:text-white ","children":"Upgrade"}]}]]}]]}]}] 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:["$","li","li-0",{"children":["The static crawler (",["$","code","code-0",{"children":"katana"}]," 1.7.0) parses JavaScript with a fork of jsluice pinned to a March\n2026 snapshot of the pure-Go tree-sitter port whose string-literal lexing is super-linear. One\ninline script with a few thousand escaped quotes, which every Next.js page carries as its flight\npayload, took the crawler past 6 GiB in about 20 s and got it killed. The scanner image now\nbuilds katana against gotreesitter v0.52.0: the same crawl peaks at 599 MiB and finds 427\nendpoints where the old build emitted one line. Reported upstream (projectdiscovery/katana\ndiscussion 1840)."]}] 30:["$","li","li-1",{"children":["The static crawler runs under a data-segment bound (",["$","code","code-0",{"children":"prlimit --data"}],", Linux; default 2 GiB,\n",["$","code","code-1",{"children":"SHAKERSCAN_CRAWLER_MEMORY_LIMIT_MB"}],", 0 disables), so a future parser regression ends with Go's\nown out-of-memory error at the bound instead of taking the worker container to its cgroup limit.\nThe headless crawler is not bounded because Chromium inherits the limit."]}] 31:["$","li","li-2",{"children":["A scanner that emitted output and then exited non-zero or by signal (the kernel's OOM kill, the\ncrawler's memory bound) is recorded as ",["$","code","code-0",{"children":"partial"}]," with ",["$","code","code-1",{"children":"exit_"}]," or\n",["$","code","code-2",{"children":"crawler_memory_bound_exceeded"}],", never as complete. A required action that ends partial, timed\nout, failed or blocked makes the scan's top-level coverage ",["$","code","code-3",{"children":"partial"}]," with\n",["$","code","code-4",{"children":"_[:]"}]," among the reasons."]}] 32:["$","h3","h3-1",{"id":"authorize-a-target-once","children":["$","a",null,{"href":"#authorize-a-target-once","className":"oss-heading-anchor","children":"Authorize a target once"}]}] 33:["$","ul","ul-1",{"children":["\n",["$","li","li-0",{"children":["Active testing still requires a target-bound approval receipt, but the receipt is now the\ntarget's standing authorization: ",["$","code","code-0",{"children":"POST /targets/{id}/authorization"}]," records it once (tier\n",["$","code","code-1",{"children":"active"}]," or ",["$","code","code-2",{"children":"intrusive"}],", ",["$","code","code-3",{"children":"approved_by"}]," recorded, no expiry), ",["$","code","code-4",{"children":"GET"}]," reads it, ",["$","code","code-5",{"children":"DELETE"}]," revokes\nit, and ",["$","code","code-6",{"children":"TargetCreate.authorized_by"}]," records it at creation. Target lists carry\n",["$","code","code-7",{"children":"authorized_for_active_testing"}],"."]}],"\n",["$","li","li-1",{"children":["A scan submitted with ",["$","code","code-0",{"children":"policy.active_testing"}]," and no receipt resolves the target's standing\nauthorization; a privileged Hunt start does the same and treats it as the confirmed\nauthorization. The authorization ends by revocation or when the target's scope changes to\nanother host. Credential use keeps its explicit credential-tier receipt; the dangerous tier\nkeeps bounded per-action approvals."]}],"\n",["$","li","li-2",{"children":"The UI offers \"I own or am authorized to test this target\" when a target is added, shows each\nroot target's authorization with authorize and revoke actions, and no longer mints a two-hour\nreceipt per active scan."}],"\n"]}] 34:["$","h3","h3-2",{"id":"deployments-without-the-docker-socket","children":["$","a",null,{"href":"#deployments-without-the-docker-socket","className":"oss-heading-anchor","children":"Deployments without the Docker socket"}]}] 35:["$","ul","ul-2",{"children":["\n",["$","li","li-0",{"children":[["$","code","code-0",{"children":"SHAKERSCAN_PRIVATE_NETWORK_TARGETS=allow"}]," (default ",["$","code","code-1",{"children":"refuse"}],") admits loopback, private and\nreserved addresses for every environment, recorded on every scope receipt as\n",["$","code","code-2",{"children":"allowed_by_deployment_policy"}],"; link-local, multicast and unspecified addresses stay refused."]}],"\n",["$","li","li-1",{"children":[["$","code","code-0",{"children":"SHAKERSCAN_FLEET_MEMORY_GB"}]," declares the fleet memory when Docker's ",["$","code","code-1",{"children":"/info"}]," is unreachable, so\nthe active-scan cap no longer falls back silently to five. ",["$","code","code-2",{"children":"/health"}]," reports\n",["$","code","code-3",{"children":"capacity"}]," (effective cap and its source) and ",["$","code","code-4",{"children":"deployment_policy"}],"."]}],"\n",["$","li","li-2",{"children":["The worker inventory no longer turns an unknown local container count into \"expected 0\": fresh\nbuild reports are the authority when no inventory exists, and ",["$","code","code-0",{"children":"worker_build.inventory"}]," says\nwhether ",["$","code","code-1",{"children":"docker"}]," or ",["$","code","code-2",{"children":"reports"}]," applied. A healthy hardened deployment stops showing \"Workers\nmixed/stale\"."]}],"\n",["$","li","li-3",{"children":["The API and every worker fail fast with the cause and remedy named when the engine database\nhas no schema (an unreadable ",["$","code","code-0",{"children":"db/init.sql"}]," at first start), instead of crash-looping on\n",["$","code","code-1",{"children":"relation \"scans\" does not exist"}],"."]}],"\n"]}] 36:["$","h3","h3-3",{"id":"ui","children":["$","a",null,{"href":"#ui","className":"oss-heading-anchor","children":"UI"}]}] 37:["$","ul","ul-3",{"children":["\n",["$","li","li-0",{"children":"The sidebar shows the edition named by a managed deployment's capability manifest instead of a\nfixed \"Open Source Edition\" label; standalone installs are unchanged."}],"\n"]}] 38:["$","h3","h3-4",{"id":"release-and-ci-hygiene","children":["$","a",null,{"href":"#release-and-ci-hygiene","className":"oss-heading-anchor","children":"Release and CI hygiene"}]}] 39:["$","ul","ul-4",{"children":["\n",["$","li","li-0",{"children":"The Model Intake signer image applies Debian's security fixes at build time, so a published fix\nfor an OS package no longer fails the image gate for every pull request."}],"\n"]}] 3a:["$","h2","h2-1",{"id":"upgrade","children":["$","a",null,{"href":"#upgrade","className":"oss-heading-anchor","children":"Upgrade"}]}] 3b:["$","p","p-1",{"children":"Upgrade in place from 2.3.1. The stable installer channel advances only after publication and public\nsmoke. Existing approval receipts stay valid; targets gain a standing authorization the first time\nan operator authorizes them. No destructive migration."}] 3c:["$","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.3.2.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"