[{"data":1,"prerenderedAt":698},["ShallowReactive",2],{"navigation":3,"\u002Fdocs\u002Foperating":314,"\u002Fdocs\u002Foperating-surround":693},[4,38,86,149,176,219,257,273],{"title":5,"path":6,"stem":7,"children":8,"icon":37},"Getting Started","\u002Fdocs\u002Fgetting-started","1.docs\u002F1.getting-started\u002F1.index",[9,12,17,22,27,32],{"title":10,"path":6,"stem":7,"icon":11},"Getting started","i-lucide-flag",{"title":13,"path":14,"stem":15,"icon":16},"Modules overview","\u002Fdocs\u002Fgetting-started\u002Fmodules-overview","1.docs\u002F1.getting-started\u002F2.modules-overview","i-lucide-boxes",{"title":18,"path":19,"stem":20,"icon":21},"Installation","\u002Fdocs\u002Fgetting-started\u002Finstallation","1.docs\u002F1.getting-started\u002F3.installation","i-lucide-download",{"title":23,"path":24,"stem":25,"icon":26},"License configuration","\u002Fdocs\u002Fgetting-started\u002Flicense-configuration","1.docs\u002F1.getting-started\u002F4.license-configuration","i-lucide-key-round",{"title":28,"path":29,"stem":30,"icon":31},"Your first app","\u002Fdocs\u002Fgetting-started\u002Ffirst-app","1.docs\u002F1.getting-started\u002F5.first-app","i-lucide-square-play",{"title":33,"path":34,"stem":35,"icon":36},"Project setup","\u002Fdocs\u002Fgetting-started\u002Fproject-setup","1.docs\u002F1.getting-started\u002F6.project-setup","i-lucide-package",false,{"title":39,"path":40,"stem":41,"children":42,"icon":45},"Core Concepts","\u002Fdocs\u002Fconcepts","1.docs\u002F2.concepts\u002F1.index",[43,46,51,56,61,66,71,76,81],{"title":44,"path":40,"stem":41,"icon":45},"Core concepts","i-lucide-book-open",{"title":47,"path":48,"stem":49,"icon":50},"Architecture","\u002Fdocs\u002Fconcepts\u002Farchitecture","1.docs\u002F2.concepts\u002F2.architecture","i-lucide-layers",{"title":52,"path":53,"stem":54,"icon":55},"Exactly-once semantics","\u002Fdocs\u002Fconcepts\u002Fexactly-once","1.docs\u002F2.concepts\u002F3.exactly-once","i-lucide-shield-check",{"title":57,"path":58,"stem":59,"icon":60},"Lanes and parallelism","\u002Fdocs\u002Fconcepts\u002Flanes-and-parallelism","1.docs\u002F2.concepts\u002F4.lanes-and-parallelism","i-lucide-split",{"title":62,"path":63,"stem":64,"icon":65},"State and thread-safety","\u002Fdocs\u002Fconcepts\u002Fstate-and-thread-safety","1.docs\u002F2.concepts\u002F5.state-and-thread-safety","i-lucide-lock",{"title":67,"path":68,"stem":69,"icon":70},"Event time and watermarks","\u002Fdocs\u002Fconcepts\u002Fevent-time-and-watermarks","1.docs\u002F2.concepts\u002F6.event-time-and-watermarks","i-lucide-clock",{"title":72,"path":73,"stem":74,"icon":75},"The configuration model","\u002Fdocs\u002Fconcepts\u002Fconfiguration-model","1.docs\u002F2.concepts\u002F7.configuration-model","i-lucide-sliders-horizontal",{"title":77,"path":78,"stem":79,"icon":80},"The error-handling model","\u002Fdocs\u002Fconcepts\u002Ferror-handling-model","1.docs\u002F2.concepts\u002F8.error-handling-model","i-lucide-triangle-alert",{"title":82,"path":83,"stem":84,"icon":85},"How StoatFlow differs from Kafka Streams","\u002Fdocs\u002Fconcepts\u002Fhow-stoatflow-differs-from-ks","1.docs\u002F2.concepts\u002F9.how-stoatflow-differs-from-ks","i-lucide-arrow-left-right",{"title":87,"path":88,"stem":89,"children":90,"icon":93},"Building Topologies","\u002Fdocs\u002Fbuilding","1.docs\u002F3.building\u002F1.index",[91,94,99,104,109,114,119,124,129,134,139,144],{"title":92,"path":88,"stem":89,"icon":93},"Building topologies","i-lucide-blocks",{"title":95,"path":96,"stem":97,"icon":98},"Error handling and DLQ","\u002Fdocs\u002Fbuilding\u002Ferror-handling-dlq","1.docs\u002F3.building\u002F10.error-handling-dlq","i-lucide-circle-x",{"title":100,"path":101,"stem":102,"icon":103},"State stores","\u002Fdocs\u002Fbuilding\u002Fstate-stores","1.docs\u002F3.building\u002F11.state-stores","i-lucide-database",{"title":105,"path":106,"stem":107,"icon":108},"Testing topologies","\u002Fdocs\u002Fbuilding\u002Ftesting","1.docs\u002F3.building\u002F12.testing","i-lucide-flask-conical",{"title":110,"path":111,"stem":112,"icon":113},"Sources and sinks","\u002Fdocs\u002Fbuilding\u002Fstreams-builder","1.docs\u002F3.building\u002F2.streams-builder","i-lucide-import",{"title":115,"path":116,"stem":117,"icon":118},"KStream and KTable operations","\u002Fdocs\u002Fbuilding\u002Fkstream-ktable","1.docs\u002F3.building\u002F3.kstream-ktable","i-lucide-waypoints",{"title":120,"path":121,"stem":122,"icon":123},"Aggregations","\u002Fdocs\u002Fbuilding\u002Faggregations","1.docs\u002F3.building\u002F4.aggregations","i-lucide-sigma",{"title":125,"path":126,"stem":127,"icon":128},"Windowing","\u002Fdocs\u002Fbuilding\u002Fwindowing","1.docs\u002F3.building\u002F5.windowing","i-lucide-calendar-clock",{"title":130,"path":131,"stem":132,"icon":133},"Joins","\u002Fdocs\u002Fbuilding\u002Fjoins","1.docs\u002F3.building\u002F6.joins","i-lucide-git-merge",{"title":135,"path":136,"stem":137,"icon":138},"The Processor API","\u002Fdocs\u002Fbuilding\u002Fprocessor-api","1.docs\u002F3.building\u002F7.processor-api","i-lucide-cpu",{"title":140,"path":141,"stem":142,"icon":143},"Scheduled sources","\u002Fdocs\u002Fbuilding\u002Fscheduled-sources","1.docs\u002F3.building\u002F8.scheduled-sources","i-lucide-timer",{"title":145,"path":146,"stem":147,"icon":148},"Serdes and Avro","\u002Fdocs\u002Fbuilding\u002Fserdes","1.docs\u002F3.building\u002F9.serdes","i-lucide-binary",{"title":150,"path":151,"stem":152,"children":153,"icon":75},"Configuration","\u002Fdocs\u002Fconfiguration","1.docs\u002F4.configuration\u002F1.index",[154,156,161,166,171],{"title":155,"path":151,"stem":152,"icon":75},"How configuration works",{"title":157,"path":158,"stem":159,"icon":160},"Engine configuration (:core)","\u002Fdocs\u002Fconfiguration\u002Fcore-config","1.docs\u002F4.configuration\u002F2.core-config","i-lucide-settings-2",{"title":162,"path":163,"stem":164,"icon":165},"Runtime configuration (:runtime)","\u002Fdocs\u002Fconfiguration\u002Fruntime-config","1.docs\u002F4.configuration\u002F3.runtime-config","i-lucide-server-cog",{"title":167,"path":168,"stem":169,"icon":170},"Defaults, adaptivity, and presets","\u002Fdocs\u002Fconfiguration\u002Fdefaults-and-presets","1.docs\u002F4.configuration\u002F4.defaults-and-presets","i-lucide-gauge",{"title":172,"path":173,"stem":174,"icon":175},"Kafka client configuration","\u002Fdocs\u002Fconfiguration\u002Fkafka-client-config","1.docs\u002F4.configuration\u002F5.kafka-client-config","i-lucide-plug",{"title":177,"path":178,"stem":179,"children":180,"icon":183},"Running in Production","\u002Fdocs\u002Fruntime","1.docs\u002F5.runtime\u002F1.index",[181,184,189,194,199,204,209,214],{"title":182,"path":178,"stem":179,"icon":183},"The runtime","i-lucide-server",{"title":185,"path":186,"stem":187,"icon":188},"The REST API","\u002Fdocs\u002Fruntime\u002Frest-api","1.docs\u002F5.runtime\u002F2.rest-api","i-lucide-globe",{"title":190,"path":191,"stem":192,"icon":193},"Health checks","\u002Fdocs\u002Fruntime\u002Fhealth-checks","1.docs\u002F5.runtime\u002F3.health-checks","i-lucide-heart-pulse",{"title":195,"path":196,"stem":197,"icon":198},"Metrics","\u002Fdocs\u002Fruntime\u002Fmetrics","1.docs\u002F5.runtime\u002F4.metrics","i-lucide-activity",{"title":200,"path":201,"stem":202,"icon":203},"Pause and resume","\u002Fdocs\u002Fruntime\u002Fpause-unpause","1.docs\u002F5.runtime\u002F5.pause-unpause","i-lucide-pause",{"title":205,"path":206,"stem":207,"icon":208},"Plugins and lifecycle hooks","\u002Fdocs\u002Fruntime\u002Fplugins","1.docs\u002F5.runtime\u002F6.plugins","i-lucide-puzzle",{"title":210,"path":211,"stem":212,"icon":213},"Docker images","\u002Fdocs\u002Fruntime\u002Fdocker","1.docs\u002F5.runtime\u002F7.docker","i-lucide-container",{"title":215,"path":216,"stem":217,"icon":218},"GraalVM native image","\u002Fdocs\u002Fruntime\u002Fnative-image","1.docs\u002F5.runtime\u002F8.native-image","i-lucide-zap",{"title":220,"path":221,"stem":222,"children":223,"icon":226},"Deploying & Operating","\u002Fdocs\u002Foperating","1.docs\u002F6.operating\u002F1.index",[224,227,232,237,242,247,252],{"title":225,"path":221,"stem":222,"icon":226},"Deploying and operating","i-lucide-life-buoy",{"title":228,"path":229,"stem":230,"icon":231},"Running on Kubernetes","\u002Fdocs\u002Foperating\u002Fkubernetes","1.docs\u002F6.operating\u002F2.kubernetes","i-lucide-ship",{"title":233,"path":234,"stem":235,"icon":236},"High availability","\u002Fdocs\u002Foperating\u002Fhigh-availability","1.docs\u002F6.operating\u002F3.high-availability","i-lucide-copy",{"title":238,"path":239,"stem":240,"icon":241},"Liveness and readiness probes","\u002Fdocs\u002Foperating\u002Fprobes","1.docs\u002F6.operating\u002F4.probes","i-lucide-stethoscope",{"title":243,"path":244,"stem":245,"icon":246},"Observability","\u002Fdocs\u002Foperating\u002Fobservability","1.docs\u002F6.operating\u002F5.observability","i-lucide-telescope",{"title":248,"path":249,"stem":250,"icon":251},"Tuning under load","\u002Fdocs\u002Foperating\u002Ftuning","1.docs\u002F6.operating\u002F6.tuning","i-lucide-sliders",{"title":253,"path":254,"stem":255,"icon":256},"Production checklist","\u002Fdocs\u002Foperating\u002Fproduction-checklist","1.docs\u002F6.operating\u002F7.production-checklist","i-lucide-clipboard-check",{"title":258,"path":259,"stem":260,"children":261,"icon":85},"Migrating from Kafka Streams","\u002Fdocs\u002Fmigration","1.docs\u002F7.migration\u002F1.index",[262,263,268],{"title":258,"path":259,"stem":260,"icon":85},{"title":264,"path":265,"stem":266,"icon":267},"Migration without carrying state","\u002Fdocs\u002Fmigration\u002Fwithout-data-migration","1.docs\u002F7.migration\u002F2.without-data-migration","i-lucide-sparkles",{"title":269,"path":270,"stem":271,"icon":272},"Migration carrying state","\u002Fdocs\u002Fmigration\u002Fwith-data-migration","1.docs\u002F7.migration\u002F3.with-data-migration","i-lucide-database-backup",{"title":274,"path":275,"stem":276,"children":277,"icon":279},"Reference","\u002Fdocs\u002Freference","1.docs\u002F8.reference\u002F1.index",[278,280,285,290,295,300,305,309],{"title":274,"path":275,"stem":276,"icon":279},"i-lucide-list",{"title":281,"path":282,"stem":283,"icon":284},"Configuration reference","\u002Fdocs\u002Freference\u002Fconfiguration-reference","1.docs\u002F8.reference\u002F2.configuration-reference","i-lucide-table",{"title":286,"path":287,"stem":288,"icon":289},"REST API reference","\u002Fdocs\u002Freference\u002Frest-api-reference","1.docs\u002F8.reference\u002F3.rest-api-reference","i-lucide-network",{"title":291,"path":292,"stem":293,"icon":294},"Gradle plugin reference","\u002Fdocs\u002Freference\u002Fgradle-plugin-reference","1.docs\u002F8.reference\u002F4.gradle-plugin-reference","i-lucide-box",{"title":296,"path":297,"stem":298,"icon":299},"Maven reference","\u002Fdocs\u002Freference\u002Fmaven-reference","1.docs\u002F8.reference\u002F5.maven-reference","i-simple-icons-apachemaven",{"title":301,"path":302,"stem":303,"icon":304},"Kafka Streams compatibility matrix","\u002Fdocs\u002Freference\u002Fks-compatibility-matrix","1.docs\u002F8.reference\u002F6.ks-compatibility-matrix","i-lucide-table-2",{"title":306,"path":307,"stem":308,"icon":170},"Metrics reference","\u002Fdocs\u002Freference\u002Fmetrics-reference","1.docs\u002F8.reference\u002F7.metrics-reference",{"title":310,"path":311,"stem":312,"icon":313},"Glossary","\u002Fdocs\u002Freference\u002Fglossary","1.docs\u002F8.reference\u002F8.glossary","i-lucide-book-a",{"id":315,"title":225,"body":316,"description":686,"extension":687,"meta":688,"navigation":689,"pageType":690,"path":221,"seo":691,"stem":222,"__hash__":692},"docs\u002F1.docs\u002F6.operating\u002F1.index.md",{"type":317,"value":318,"toc":677},"minimark",[319,328,375,380,383,386,399,403,413,425,428,467,470,504,507,513,536,539,567,577,584,588,632,636],[320,321,322,323,327],"p",{},"This section is for the people who run StoatFlow in production: deploying it, sizing it, probing it, and keeping it healthy. The model is unusual in one way that shapes everything else — a StoatFlow application has exactly one ",[324,325,326],"strong",{},"active"," process. Most of operating it follows from that.",[329,330,331],"tldr-panel",{},[332,333,334,345,355,369],"ul",{},[335,336,337,340,341,344],"li",{},[324,338,339],{},"Deployment unit:"," one JVM process. Exactly one ",[342,343,326],"em",{}," instance — never two processing the same source topics.",[335,346,347,350,351,354],{},[324,348,349],{},"Why one active:"," two active instances writing the same state corrupts it. The ",[352,353,47],"a",{"href":48}," page sets out the model in full.",[335,356,357,360,361,364,365,368],{},[324,358,359],{},"High availability:"," fast restart by default, or an opt-in ",[352,362,363],{"href":234},"hot-standby cluster"," — one or more warm ",[342,366,367],{},"passive"," standbys — for near-instant, lag-aware failover. Choose per application.",[335,370,371,374],{},[324,372,373],{},"What's here:"," Kubernetes deployment, high availability, liveness\u002Freadiness probes, observability, tuning, and a production checklist.",[376,377,379],"h2",{"id":378},"the-deployment-model","The deployment model",[320,381,382],{},"A StoatFlow application runs as exactly one JVM process. That process opens a Kafka consumer group with a single member — itself — and that member is assigned every partition of every source topic the topology reads from. There is no cluster, no scheduler, no worker pool, and no second instance sharing the load.",[320,384,385],{},"For an operator, this collapses a lot of moving parts. You deploy one pod, not a StatefulSet of N. There is no rebalancing to wait out on a rolling restart, no partition reassignment to reason about, no inter-instance coordination to monitor. The unit you scale, probe, restart, and observe is a single process.",[320,387,388,389,392,393,395,396,398],{},"You scale it ",[324,390,391],{},"vertically"," — more CPU and memory for the one process — not horizontally by adding replicas. Processing parallelism inside the process comes from lanes running on virtual threads, and lane count is decoupled from the partition count of your input topics. The full conceptual model is on ",[352,394,47],{"href":48},"; how lanes turn one process into many concurrent units of work is on ",[352,397,57],{"href":58},".",[376,400,402],{"id":401},"one-active-instance","One active instance",[320,404,405,406,412],{},"This is the one rule that an operator must not break: ",[324,407,408,409,411],{},"run exactly one ",[342,410,326],{}," instance."," By default that means exactly one replica — not zero, not two.",[320,414,415,416,418,419,421,422,424],{},"Two ",[342,417,326],{}," instances of the same application, pointed at the same source topics and writing the same state, will corrupt that state. By default StoatFlow runs a single process with no second instance to coordinate with, and the exactly-once commit protocol is built around that assumption. The one supported way to run more than one instance is the opt-in ",[352,420,363],{"href":234},": the extra instances stay ",[324,423,367],{}," standbys — each follows the changelog and keeps its state warm, but never processes or commits — and the cluster fences a single active so that, under exactly-once, split-brain is impossible. Outside that mode, never run more than one.",[320,426,427],{},"Kafka's consumer-group semantics make the default-mode failure concrete. If you did start a second instance in the same group, Kafka would assign all partitions to one member and idle the other — at best you'd have a hot spare doing nothing useful, at worst a flapping reassignment if both keep trying to claim partitions. And because each instance also holds its own local state and writes its own changelog, two instances racing on the same changelog topics and the same transactional output produce interleaved, inconsistent writes that neither instance can reconcile. The result is corrupted state, not graceful degradation.",[429,430,433],"callout",{"color":431,"icon":432},"error","i-lucide-alert-triangle",[320,434,435,441,442,446,447,450,451,454,455,458,459,462,463,466],{},[324,436,437,438,440],{},"Never run two ",[342,439,326],{}," replicas of the same StoatFlow application against the same source topics."," With the default ",[443,444,445],"code",{},"ha.mode: off",", set your Kubernetes Deployment to ",[443,448,449],{},"replicas: 1"," and a rollout strategy where a new pod fully replaces the old one — not one that briefly runs both. For a hot-standby cluster, use ",[352,452,453],{"href":234},"hot standby"," (",[443,456,457],{},"replicas: 2"," or more, ",[443,460,461],{},"ha.mode: active-standby","), which keeps the standbys passive. The ",[352,464,465],{"href":229},"Kubernetes"," page shows the exact manifest.",[320,468,469],{},"The practical consequences for an operator are small and specific:",[332,471,472,488,494],{},[335,473,474,479,480,482,483,485,486,398],{},[324,475,476,477],{},"Set ",[443,478,449],{}," on the Deployment under the default mode, and use a rollout strategy that tears the old pod down before — or as — the new one comes up, so the two never process concurrently. (Hot standby is the exception: a readiness-gated cluster of ",[443,481,457],{}," or more — see ",[352,484,233],{"href":234},".) See ",[352,487,465],{"href":229},[335,489,490,493],{},[324,491,492],{},"Don't run a manual instance against production topics"," while the deployed one is live — for a debug session, point a throwaway instance at a different consumer group and, ideally, copies of the topics.",[335,495,496,499,500,503],{},[324,497,498],{},"Treat the application id as identity."," Two processes sharing the ",[443,501,502],{},"application-id"," share a consumer group and changelog topics; that's the collision to avoid.",[376,505,233],{"id":506},"high-availability",[320,508,509,510,512],{},"StoatFlow offers two HA tiers, and you choose per application. Neither involves two ",[342,511,326],{}," instances — that remains the rule.",[332,514,515,525],{},[335,516,517,520,521,398],{},[324,518,519],{},"Fast restart (the default)."," The one instance comes back fast after it goes down, with no data loss and no duplicate output. Recovery is a restart plus a changelog restore. This is the right answer for most workloads; the reasoning and the trade-offs are on ",[352,522,524],{"href":523},"\u002Fproduct\u002Fmotivation","Motivation",[335,526,527,530,531,533,534,398],{},[324,528,529],{},"Hot standby (opt-in)."," One active plus one or more warm ",[342,532,367],{}," standbys that continuously follow the changelog; on failover a lag-aware election promotes the freshest in seconds — independent of state size. Choose it for large state or a tight recovery-time objective where a cold restore is too slow. The full how-to is on ",[352,535,233],{"href":234},[320,537,538],{},"The rest of this section describes the default, fast-restart tier. Three properties make fast restart a credible availability story rather than a downgrade:",[332,540,541,547,558],{},[335,542,543,546],{},[324,544,545],{},"No rebalancing tax."," A standard multi-instance stream processor pays a rebalance whenever an instance joins or leaves — partitions stop, get reassigned, and resume. With one instance and one group member, there is nothing to rebalance. Restart cost is restoration cost, full stop.",[335,548,549,552,553,557],{},[324,550,551],{},"Bounded, parallel state recovery."," On restart, local state rebuilds from the Kafka changelog topics, and restoration runs in parallel across stores rather than one at a time. Restart time scales with state size; see ",[352,554,556],{"href":555},"\u002Fproduct\u002Fbenchmarks","Benchmarks"," for measured cold-start numbers on representative workloads.",[335,559,560,563,564,398],{},[324,561,562],{},"Exactly-once across the restart."," The last successful commit barrier is the recovery point. Work the crashed process hadn't committed was aborted at the broker, so a restart resumes from the last committed offsets with no duplicate output downstream and no lost state. The mechanism is on ",[352,565,566],{"href":53},"Exactly-once",[320,568,569,570,573,574,398],{},"For an operator this means availability is an orchestration concern, not an application-clustering one. Let Kubernetes restart the pod on failure; let the readiness probe hold traffic off until state has recovered. The probe contract is the lever that makes this clean — ",[443,571,572],{},"\u002Fhealth\u002Fready"," returns 503 throughout restoration, so nothing routes to a process that isn't caught up yet. See ",[352,575,576],{"href":239},"Probes",[320,578,579,580,583],{},"If your tolerance for restart-window downtime is tight, the levers are state size (smaller state restores faster), disk persistence (a warm local store on a persistent volume means restoration only reads the changelog gap since the last commit, not the whole topic), and broker read throughput. ",[352,581,582],{"href":249},"Tuning"," covers these.",[376,585,587],{"id":586},"the-operating-pages","The operating pages",[589,590,591,600,605,617,622,627],"path-cards",{},[592,593,594],"path-card",{"icon":231,"title":465,"to":229},[320,595,596,597,398],{},"The single-replica StatefulSet manifest, rollout strategy, resource requests, persistent volumes for warm restart, and graceful shutdown on ",[443,598,599],{},"SIGTERM",[592,601,602],{"icon":236,"title":233,"to":234},[320,603,604],{},"The two HA tiers, the opt-in hot-standby cluster (one active + one or more warm standbys), the exactly-once-versus-at-least-once failover trade-off, and the multi-replica StatefulSet that deploys it.",[592,606,607],{"icon":193,"title":576,"to":239},[320,608,609,610,613,614,616],{},"Liveness versus readiness, how readiness holds traffic off during state restoration, and how to wire the ",[443,611,612],{},"\u002Fhealth\u002Flive"," and ",[443,615,572],{}," endpoints into an orchestrator.",[592,618,619],{"icon":198,"title":243,"to":244},[320,620,621],{},"The Prometheus metrics surface, the introspection and debug endpoints, structured logs, and what to alert on for a single-instance application.",[592,623,624],{"icon":75,"title":582,"to":249},[320,625,626],{},"Sizing CPU and memory, lane count, the commit-cadence bounds, and the levers that trade latency against throughput and restart time.",[592,628,629],{"icon":256,"title":253,"to":254},[320,630,631],{},"The pre-flight list before going live — replica count, probes, resources, persistence, license, metrics, and the failure policies you've chosen.",[376,633,635],{"id":634},"where-to-go-next","Where to go next",[332,637,638,645,656,663,670],{},[335,639,640,644],{},[324,641,642],{},[352,643,47],{"href":48}," — the single-instance model in full: data flow, lanes, state, commit barriers, and the operational surface.",[335,646,647,651,652,655],{},[324,648,649],{},[352,650,182],{"href":178}," — the batteries-included ",[443,653,654],{},":runtime"," module that exposes the health, metrics, and admin endpoints operators rely on.",[335,657,658,662],{},[324,659,660],{},[352,661,465],{"href":229}," — start here when you're ready to deploy.",[335,664,665,669],{},[324,666,667],{},[352,668,233],{"href":234}," — the opt-in hot-standby cluster, for when fast restart isn't fast enough.",[335,671,672,676],{},[324,673,674],{},[352,675,524],{"href":523}," — why StoatFlow is single-active-instance, and the trade-offs that come with it.",{"title":678,"searchDepth":679,"depth":679,"links":680},"",2,[681,682,683,684,685],{"id":378,"depth":679,"text":379},{"id":401,"depth":679,"text":402},{"id":506,"depth":679,"text":233},{"id":586,"depth":679,"text":587},{"id":634,"depth":679,"text":635},"The deployment model for operators — one active instance and why two corrupt state, the two HA tiers (fast restart and opt-in hot standby), and a map of the operating pages.","md",{},{"icon":226},"explanation",{"title":225,"description":686},"U9bnPMIXf1wDmrXzirK6A_9OtBpcfauEwtqTisj-w_s",[694,696],{"title":215,"path":216,"stem":217,"description":695,"icon":218,"children":-1},"Compile your StoatFlow app to a GraalVM native binary — a one-line opt-in. The framework ships its own reflection\u002FJNI\u002FFFM metadata; you choose the GC, optionally PGO, and add metadata only for your own serde value classes.",{"title":228,"path":229,"stem":230,"description":697,"icon":231,"children":-1},"Deploy a StoatFlow application as a single-replica StatefulSet — persistent state volume, termination grace aligned with shutdown, secure license injection, and a representative manifest.",1783713353645]