[{"data":1,"prerenderedAt":2212},["ShallowReactive",2],{"navigation":3,"\u002Fdocs\u002Fgetting-started\u002Ffirst-app":38,"\u002Fdocs\u002Fgetting-started\u002Ffirst-app-surround":2207},[4],{"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},"Installation","\u002Fdocs\u002Fgetting-started\u002Finstallation","1.docs\u002F1.getting-started\u002F2.installation","i-lucide-download",{"title":18,"path":19,"stem":20,"icon":21},"License configuration","\u002Fdocs\u002Fgetting-started\u002Flicense-configuration","1.docs\u002F1.getting-started\u002F3.license-configuration","i-lucide-key-round",{"title":23,"path":24,"stem":25,"icon":26},"Your first app","\u002Fdocs\u002Fgetting-started\u002Ffirst-app","1.docs\u002F1.getting-started\u002F4.first-app","i-lucide-square-play",{"title":28,"path":29,"stem":30,"icon":31},"Architecture","\u002Fdocs\u002Fgetting-started\u002Farchitecture","1.docs\u002F1.getting-started\u002F5.architecture","i-lucide-layers",{"title":33,"path":34,"stem":35,"icon":36},"Migrating from Kafka Streams","\u002Fdocs\u002Fgetting-started\u002Fmigration","1.docs\u002F1.getting-started\u002F6.migration","i-lucide-shuffle",false,{"id":39,"title":23,"body":40,"description":2201,"extension":2202,"meta":2203,"navigation":2204,"path":24,"seo":2205,"stem":25,"__hash__":2206},"docs\u002F1.docs\u002F1.getting-started\u002F4.first-app.md",{"type":41,"value":42,"toc":2195},"minimark",[43,57,76,113,118,144,155,1744,1748,1755,1864,1879,1883,1886,1995,1998,2014,2017,2056,2065,2109,2124,2132,2163,2167,2191],[44,45,46,47,51,52,56],"p",{},"Let's build a complete StoatFlow app on the ",[48,49,50],"code",{},":runtime"," module: a ",[53,54,55],"strong",{},"word count"," that reads lines of text, splits them into words, and keeps a running total for each word.",[44,58,59,60,63,64,67,68,71,72,75],{},"This page assumes you've finished ",[61,62,13],"a",{"href":14}," — the private Maven repository, the ",[48,65,66],{},"io.stoatflow:stoatflow-runtime"," dependency, and the ",[48,69,70],{},"io.stoatflow"," Gradle plugin — and ",[61,73,74],{"href":19},"configured a license",".",[77,78,79],"tldr-panel",{},[80,81,82,97,103],"ul",{},[83,84,85,88,89,92,93,96],"li",{},[53,86,87],{},"What you build:"," counts words from a ",[48,90,91],{},"text-lines"," topic into a ",[48,94,95],{},"word-counts"," topic — a stateful aggregation.",[83,98,99,102],{},[53,100,101],{},"What you need:"," a running Kafka 4.x broker, your license key, and the two topics.",[83,104,105,108,109,112],{},[53,106,107],{},"Run:"," ",[48,110,111],{},".\u002Fgradlew run",", then produce a few lines of text and watch the counts climb.",[114,115,117],"h2",{"id":116},"the-topology","The topology",[44,119,120,123,124,127,128,130,131,133,134,137,138,140,141,75],{},[48,121,122],{},"StoatFlowRuntime.fromConfig(...)"," loads ",[48,125,126],{},"application.yaml",", starts the HTTP + metrics server, and runs your topology until terminated. The topology reads ",[48,129,91],{},", splits each line into lowercase words, groups by word, counts, and writes each word's running total to ",[48,132,95],{},". Counts are ",[48,135,136],{},"Long",", so the sink uses a ",[48,139,136],{}," value serde — everything else is ",[48,142,143],{},"String",[44,145,146,147,150,151,154],{},"Every operator is given an explicit name (",[48,148,149],{},"Named.as(...)",", ",[48,152,153],{},"Grouped.as(...)",", …); StoatFlow uses these stable names for its topology graph, metrics, and state-store identity.",[156,157,159,749],"code-tabs",{"group":158},"lang",[160,161,167],"pre",{"className":162,"code":163,"filename":164,"language":165,"meta":166,"style":166},"language-kotlin shiki shiki-themes vitesse-light","package com.example\n\nimport io.stoatflow.core.state.StateStore\nimport io.stoatflow.core.topology.Consumed\nimport io.stoatflow.core.topology.Grouped\nimport io.stoatflow.core.topology.Materialized\nimport io.stoatflow.core.topology.Named\nimport io.stoatflow.core.topology.Produced\nimport io.stoatflow.core.topology.StreamsBuilder\nimport io.stoatflow.runtime.StoatFlowRuntime\nimport org.apache.kafka.common.serialization.Serdes\n\nfun main() {\n    val runtime = StoatFlowRuntime.fromConfig(\n        topologyBuilder = { buildTopology(it) },\n        configure = {\n            streamsConfigOverrides {\n                defaultKeySerde(Serdes.String())\n                defaultValueSerde(Serdes.String())\n            }\n        },\n    )\n    runtime.start()\n    runtime.awaitTermination()\n}\n\nprivate fun buildTopology(builder: StreamsBuilder) {\n    val whitespace = \"\\\\s+\".toRegex()\n    builder\n        .stream\u003CString, String>(\"text-lines\", Consumed.`as`(\"source\"))\n        .flatMapValues(\n            { line -> line.lowercase().split(whitespace).filter { it.isNotBlank() } },\n            Named.`as`(\"split-words\"),\n        )\n        .groupBy({ _, word -> word }, Grouped.`as`(\"group-by-word\"))\n        .count(Named.`as`(\"count\"), Materialized.`as`\u003CString, Long, StateStore>(\"word-counts\"))\n        .toStream(Named.`as`(\"to-stream\"))\n        .to(\n            \"word-counts\",\n            Produced.`as`\u003CString, Long>(\"sink\")\n                .withKeySerde(Serdes.String())\n                .withValueSerde(Serdes.Long()),\n        )\n}\n","Kotlin","kotlin","",[48,168,169,182,189,198,206,214,222,230,238,246,254,262,267,280,302,319,330,338,352,364,370,376,382,394,404,410,415,438,466,472,511,521,557,573,579,604,647,666,676,685,709,724,739,744],{"__ignoreMap":166},[170,171,174,178],"span",{"class":172,"line":173},"line",1,[170,175,177],{"class":176},"sbBg2","package",[170,179,181],{"class":180},"sySUi"," com.example\n",[170,183,185],{"class":172,"line":184},2,[170,186,188],{"emptyLinePlaceholder":187},true,"\n",[170,190,192,195],{"class":172,"line":191},3,[170,193,194],{"class":176},"import",[170,196,197],{"class":180}," io.stoatflow.core.state.StateStore\n",[170,199,201,203],{"class":172,"line":200},4,[170,202,194],{"class":176},[170,204,205],{"class":180}," io.stoatflow.core.topology.Consumed\n",[170,207,209,211],{"class":172,"line":208},5,[170,210,194],{"class":176},[170,212,213],{"class":180}," io.stoatflow.core.topology.Grouped\n",[170,215,217,219],{"class":172,"line":216},6,[170,218,194],{"class":176},[170,220,221],{"class":180}," io.stoatflow.core.topology.Materialized\n",[170,223,225,227],{"class":172,"line":224},7,[170,226,194],{"class":176},[170,228,229],{"class":180}," io.stoatflow.core.topology.Named\n",[170,231,233,235],{"class":172,"line":232},8,[170,234,194],{"class":176},[170,236,237],{"class":180}," io.stoatflow.core.topology.Produced\n",[170,239,241,243],{"class":172,"line":240},9,[170,242,194],{"class":176},[170,244,245],{"class":180}," io.stoatflow.core.topology.StreamsBuilder\n",[170,247,249,251],{"class":172,"line":248},10,[170,250,194],{"class":176},[170,252,253],{"class":180}," io.stoatflow.runtime.StoatFlowRuntime\n",[170,255,257,259],{"class":172,"line":256},11,[170,258,194],{"class":176},[170,260,261],{"class":180}," org.apache.kafka.common.serialization.Serdes\n",[170,263,265],{"class":172,"line":264},12,[170,266,188],{"emptyLinePlaceholder":187},[170,268,270,273,276],{"class":172,"line":269},13,[170,271,272],{"class":176},"fun",[170,274,275],{"class":180}," main",[170,277,279],{"class":278},"suHK_","() {\n",[170,281,283,286,289,293,296,299],{"class":172,"line":282},14,[170,284,285],{"class":176},"    val",[170,287,288],{"class":278}," runtime ",[170,290,292],{"class":291},"sYZai","=",[170,294,295],{"class":278}," StoatFlowRuntime.",[170,297,298],{"class":180},"fromConfig",[170,300,301],{"class":278},"(\n",[170,303,305,308,310,313,316],{"class":172,"line":304},15,[170,306,307],{"class":278},"        topologyBuilder ",[170,309,292],{"class":291},[170,311,312],{"class":278}," { ",[170,314,315],{"class":180},"buildTopology",[170,317,318],{"class":278},"(it) },\n",[170,320,322,325,327],{"class":172,"line":321},16,[170,323,324],{"class":278},"        configure ",[170,326,292],{"class":291},[170,328,329],{"class":278}," {\n",[170,331,333,336],{"class":172,"line":332},17,[170,334,335],{"class":180},"            streamsConfigOverrides",[170,337,329],{"class":278},[170,339,341,344,347,349],{"class":172,"line":340},18,[170,342,343],{"class":180},"                defaultKeySerde",[170,345,346],{"class":278},"(Serdes.",[170,348,143],{"class":180},[170,350,351],{"class":278},"())\n",[170,353,355,358,360,362],{"class":172,"line":354},19,[170,356,357],{"class":180},"                defaultValueSerde",[170,359,346],{"class":278},[170,361,143],{"class":180},[170,363,351],{"class":278},[170,365,367],{"class":172,"line":366},20,[170,368,369],{"class":278},"            }\n",[170,371,373],{"class":172,"line":372},21,[170,374,375],{"class":278},"        },\n",[170,377,379],{"class":172,"line":378},22,[170,380,381],{"class":278},"    )\n",[170,383,385,388,391],{"class":172,"line":384},23,[170,386,387],{"class":278},"    runtime.",[170,389,390],{"class":180},"start",[170,392,393],{"class":278},"()\n",[170,395,397,399,402],{"class":172,"line":396},24,[170,398,387],{"class":278},[170,400,401],{"class":180},"awaitTermination",[170,403,393],{"class":278},[170,405,407],{"class":172,"line":406},25,[170,408,409],{"class":278},"}\n",[170,411,413],{"class":172,"line":412},26,[170,414,188],{"emptyLinePlaceholder":187},[170,416,418,422,425,428,431,435],{"class":172,"line":417},27,[170,419,421],{"class":420},"si04Y","private",[170,423,424],{"class":176}," fun",[170,426,427],{"class":180}," buildTopology",[170,429,430],{"class":278},"(builder: ",[170,432,434],{"class":433},"sUxyF","StreamsBuilder",[170,436,437],{"class":278},") {\n",[170,439,441,443,446,448,452,456,459,461,464],{"class":172,"line":440},28,[170,442,285],{"class":176},[170,444,445],{"class":278}," whitespace ",[170,447,292],{"class":291},[170,449,451],{"class":450},"spphp"," \"",[170,453,455],{"class":454},"sEi1f","\\\\",[170,457,458],{"class":450},"s+\"",[170,460,75],{"class":278},[170,462,463],{"class":180},"toRegex",[170,465,393],{"class":278},[170,467,469],{"class":172,"line":468},29,[170,470,471],{"class":278},"    builder\n",[170,473,475,478,481,484,486,488,490,493,496,499,502,505,508],{"class":172,"line":474},30,[170,476,477],{"class":278},"        .",[170,479,480],{"class":180},"stream",[170,482,483],{"class":278},"\u003C",[170,485,143],{"class":433},[170,487,150],{"class":278},[170,489,143],{"class":433},[170,491,492],{"class":278},">(",[170,494,495],{"class":450},"\"text-lines\"",[170,497,498],{"class":278},", Consumed.",[170,500,501],{"class":180},"`as`",[170,503,504],{"class":278},"(",[170,506,507],{"class":450},"\"source\"",[170,509,510],{"class":278},"))\n",[170,512,514,516,519],{"class":172,"line":513},31,[170,515,477],{"class":278},[170,517,518],{"class":180},"flatMapValues",[170,520,301],{"class":278},[170,522,524,527,530,533,536,539,542,545,548,551,554],{"class":172,"line":523},32,[170,525,526],{"class":278},"            { line ",[170,528,529],{"class":291},"->",[170,531,532],{"class":278}," line.",[170,534,535],{"class":180},"lowercase",[170,537,538],{"class":278},"().",[170,540,541],{"class":180},"split",[170,543,544],{"class":278},"(whitespace).",[170,546,547],{"class":180},"filter",[170,549,550],{"class":278}," { it.",[170,552,553],{"class":180},"isNotBlank",[170,555,556],{"class":278},"() } },\n",[170,558,560,563,565,567,570],{"class":172,"line":559},33,[170,561,562],{"class":278},"            Named.",[170,564,501],{"class":180},[170,566,504],{"class":278},[170,568,569],{"class":450},"\"split-words\"",[170,571,572],{"class":278},"),\n",[170,574,576],{"class":172,"line":575},34,[170,577,578],{"class":278},"        )\n",[170,580,582,584,587,590,592,595,597,599,602],{"class":172,"line":581},35,[170,583,477],{"class":278},[170,585,586],{"class":180},"groupBy",[170,588,589],{"class":278},"({ _, word ",[170,591,529],{"class":291},[170,593,594],{"class":278}," word }, Grouped.",[170,596,501],{"class":180},[170,598,504],{"class":278},[170,600,601],{"class":450},"\"group-by-word\"",[170,603,510],{"class":278},[170,605,607,609,612,615,617,619,622,625,627,629,631,633,635,637,640,642,645],{"class":172,"line":606},36,[170,608,477],{"class":278},[170,610,611],{"class":180},"count",[170,613,614],{"class":278},"(Named.",[170,616,501],{"class":180},[170,618,504],{"class":278},[170,620,621],{"class":450},"\"count\"",[170,623,624],{"class":278},"), Materialized.",[170,626,501],{"class":180},[170,628,483],{"class":278},[170,630,143],{"class":433},[170,632,150],{"class":278},[170,634,136],{"class":433},[170,636,150],{"class":278},[170,638,639],{"class":433},"StateStore",[170,641,492],{"class":278},[170,643,644],{"class":450},"\"word-counts\"",[170,646,510],{"class":278},[170,648,650,652,655,657,659,661,664],{"class":172,"line":649},37,[170,651,477],{"class":278},[170,653,654],{"class":180},"toStream",[170,656,614],{"class":278},[170,658,501],{"class":180},[170,660,504],{"class":278},[170,662,663],{"class":450},"\"to-stream\"",[170,665,510],{"class":278},[170,667,669,671,674],{"class":172,"line":668},38,[170,670,477],{"class":278},[170,672,673],{"class":180},"to",[170,675,301],{"class":278},[170,677,679,682],{"class":172,"line":678},39,[170,680,681],{"class":450},"            \"word-counts\"",[170,683,684],{"class":278},",\n",[170,686,688,691,693,695,697,699,701,703,706],{"class":172,"line":687},40,[170,689,690],{"class":278},"            Produced.",[170,692,501],{"class":180},[170,694,483],{"class":278},[170,696,143],{"class":433},[170,698,150],{"class":278},[170,700,136],{"class":433},[170,702,492],{"class":278},[170,704,705],{"class":450},"\"sink\"",[170,707,708],{"class":278},")\n",[170,710,712,715,718,720,722],{"class":172,"line":711},41,[170,713,714],{"class":278},"                .",[170,716,717],{"class":180},"withKeySerde",[170,719,346],{"class":278},[170,721,143],{"class":180},[170,723,351],{"class":278},[170,725,727,729,732,734,736],{"class":172,"line":726},42,[170,728,714],{"class":278},[170,730,731],{"class":180},"withValueSerde",[170,733,346],{"class":278},[170,735,136],{"class":180},[170,737,738],{"class":278},"()),\n",[170,740,742],{"class":172,"line":741},43,[170,743,578],{"class":278},[170,745,747],{"class":172,"line":746},44,[170,748,409],{"class":278},[160,750,755],{"className":751,"code":752,"filename":753,"language":754,"meta":166,"style":166},"language-java shiki shiki-themes vitesse-light","package com.example;\n\nimport io.stoatflow.core.state.StateStore;\nimport io.stoatflow.core.topology.Consumed;\nimport io.stoatflow.core.topology.Grouped;\nimport io.stoatflow.core.topology.KStream;\nimport io.stoatflow.core.topology.Materialized;\nimport io.stoatflow.core.topology.Named;\nimport io.stoatflow.core.topology.Produced;\nimport io.stoatflow.core.topology.StreamsBuilder;\nimport io.stoatflow.core.topology.ValueMapper;\nimport io.stoatflow.runtime.StoatFlowRuntime;\nimport org.apache.kafka.common.serialization.Serdes;\n\nimport java.util.Arrays;\nimport java.util.stream.Collectors;\n\npublic class Main {\n\n    public static void main(String[] args) {\n        var runtime = StoatFlowRuntime.fromConfig(\n            Main::buildTopology,\n            builder -> builder.streamsConfigOverrides(cfg -> {\n                cfg.defaultKeySerde(Serdes.String());\n                cfg.defaultValueSerde(Serdes.String());\n            })\n        );\n        runtime.start();\n        runtime.awaitTermination();\n    }\n\n    private static void buildTopology(StreamsBuilder builder) {\n        KStream\u003CString, String> lines = builder.stream(\"text-lines\", Consumed.as(\"source\"));\n        lines\n            .flatMapValues(\n                (ValueMapper\u003CString, Iterable\u003CString>>) line ->\n                    Arrays.stream(line.toLowerCase().split(\"\\\\s+\"))\n                        .filter(word -> !word.isBlank())\n                        .collect(Collectors.toList()),\n                Named.as(\"split-words\"))\n            .groupBy((key, word) -> word, Grouped.as(\"group-by-word\"))\n            .count(Named.as(\"count\"), Materialized.\u003CString, Long, StateStore>as(\"word-counts\"))\n            .toStream(Named.as(\"to-stream\"))\n            .to(\n                \"word-counts\",\n                Produced.\u003CString, Long>as(\"sink\")\n                    .withKeySerde(Serdes.String())\n                    .withValueSerde(Serdes.Long()));\n    }\n}\n","Java","java",[48,756,757,772,776,804,830,855,880,905,930,955,979,1004,1026,1060,1064,1083,1104,1108,1121,1125,1154,1174,1186,1210,1231,1250,1255,1260,1272,1282,1287,1291,1314,1375,1380,1389,1420,1455,1482,1500,1520,1564,1622,1647,1655,1667,1698,1716,1734,1739],{"__ignoreMap":166},[170,758,759,761,764,766,769],{"class":172,"line":173},[170,760,177],{"class":176},[170,762,763],{"class":278}," com",[170,765,75],{"class":291},[170,767,768],{"class":278},"example",[170,770,771],{"class":291},";\n",[170,773,774],{"class":172,"line":184},[170,775,188],{"emptyLinePlaceholder":187},[170,777,778,780,783,785,788,790,793,795,798,800,802],{"class":172,"line":191},[170,779,194],{"class":176},[170,781,782],{"class":278}," io",[170,784,75],{"class":291},[170,786,787],{"class":278},"stoatflow",[170,789,75],{"class":291},[170,791,792],{"class":278},"core",[170,794,75],{"class":291},[170,796,797],{"class":278},"state",[170,799,75],{"class":291},[170,801,639],{"class":278},[170,803,771],{"class":291},[170,805,806,808,810,812,814,816,818,820,823,825,828],{"class":172,"line":200},[170,807,194],{"class":176},[170,809,782],{"class":278},[170,811,75],{"class":291},[170,813,787],{"class":278},[170,815,75],{"class":291},[170,817,792],{"class":278},[170,819,75],{"class":291},[170,821,822],{"class":278},"topology",[170,824,75],{"class":291},[170,826,827],{"class":278},"Consumed",[170,829,771],{"class":291},[170,831,832,834,836,838,840,842,844,846,848,850,853],{"class":172,"line":208},[170,833,194],{"class":176},[170,835,782],{"class":278},[170,837,75],{"class":291},[170,839,787],{"class":278},[170,841,75],{"class":291},[170,843,792],{"class":278},[170,845,75],{"class":291},[170,847,822],{"class":278},[170,849,75],{"class":291},[170,851,852],{"class":278},"Grouped",[170,854,771],{"class":291},[170,856,857,859,861,863,865,867,869,871,873,875,878],{"class":172,"line":216},[170,858,194],{"class":176},[170,860,782],{"class":278},[170,862,75],{"class":291},[170,864,787],{"class":278},[170,866,75],{"class":291},[170,868,792],{"class":278},[170,870,75],{"class":291},[170,872,822],{"class":278},[170,874,75],{"class":291},[170,876,877],{"class":278},"KStream",[170,879,771],{"class":291},[170,881,882,884,886,888,890,892,894,896,898,900,903],{"class":172,"line":224},[170,883,194],{"class":176},[170,885,782],{"class":278},[170,887,75],{"class":291},[170,889,787],{"class":278},[170,891,75],{"class":291},[170,893,792],{"class":278},[170,895,75],{"class":291},[170,897,822],{"class":278},[170,899,75],{"class":291},[170,901,902],{"class":278},"Materialized",[170,904,771],{"class":291},[170,906,907,909,911,913,915,917,919,921,923,925,928],{"class":172,"line":232},[170,908,194],{"class":176},[170,910,782],{"class":278},[170,912,75],{"class":291},[170,914,787],{"class":278},[170,916,75],{"class":291},[170,918,792],{"class":278},[170,920,75],{"class":291},[170,922,822],{"class":278},[170,924,75],{"class":291},[170,926,927],{"class":278},"Named",[170,929,771],{"class":291},[170,931,932,934,936,938,940,942,944,946,948,950,953],{"class":172,"line":240},[170,933,194],{"class":176},[170,935,782],{"class":278},[170,937,75],{"class":291},[170,939,787],{"class":278},[170,941,75],{"class":291},[170,943,792],{"class":278},[170,945,75],{"class":291},[170,947,822],{"class":278},[170,949,75],{"class":291},[170,951,952],{"class":278},"Produced",[170,954,771],{"class":291},[170,956,957,959,961,963,965,967,969,971,973,975,977],{"class":172,"line":248},[170,958,194],{"class":176},[170,960,782],{"class":278},[170,962,75],{"class":291},[170,964,787],{"class":278},[170,966,75],{"class":291},[170,968,792],{"class":278},[170,970,75],{"class":291},[170,972,822],{"class":278},[170,974,75],{"class":291},[170,976,434],{"class":278},[170,978,771],{"class":291},[170,980,981,983,985,987,989,991,993,995,997,999,1002],{"class":172,"line":256},[170,982,194],{"class":176},[170,984,782],{"class":278},[170,986,75],{"class":291},[170,988,787],{"class":278},[170,990,75],{"class":291},[170,992,792],{"class":278},[170,994,75],{"class":291},[170,996,822],{"class":278},[170,998,75],{"class":291},[170,1000,1001],{"class":278},"ValueMapper",[170,1003,771],{"class":291},[170,1005,1006,1008,1010,1012,1014,1016,1019,1021,1024],{"class":172,"line":264},[170,1007,194],{"class":176},[170,1009,782],{"class":278},[170,1011,75],{"class":291},[170,1013,787],{"class":278},[170,1015,75],{"class":291},[170,1017,1018],{"class":278},"runtime",[170,1020,75],{"class":291},[170,1022,1023],{"class":278},"StoatFlowRuntime",[170,1025,771],{"class":291},[170,1027,1028,1030,1033,1035,1038,1040,1043,1045,1048,1050,1053,1055,1058],{"class":172,"line":269},[170,1029,194],{"class":176},[170,1031,1032],{"class":278}," org",[170,1034,75],{"class":291},[170,1036,1037],{"class":278},"apache",[170,1039,75],{"class":291},[170,1041,1042],{"class":278},"kafka",[170,1044,75],{"class":291},[170,1046,1047],{"class":278},"common",[170,1049,75],{"class":291},[170,1051,1052],{"class":278},"serialization",[170,1054,75],{"class":291},[170,1056,1057],{"class":278},"Serdes",[170,1059,771],{"class":291},[170,1061,1062],{"class":172,"line":282},[170,1063,188],{"emptyLinePlaceholder":187},[170,1065,1066,1068,1071,1073,1076,1078,1081],{"class":172,"line":304},[170,1067,194],{"class":176},[170,1069,1070],{"class":278}," java",[170,1072,75],{"class":291},[170,1074,1075],{"class":278},"util",[170,1077,75],{"class":291},[170,1079,1080],{"class":278},"Arrays",[170,1082,771],{"class":291},[170,1084,1085,1087,1089,1091,1093,1095,1097,1099,1102],{"class":172,"line":321},[170,1086,194],{"class":176},[170,1088,1070],{"class":278},[170,1090,75],{"class":291},[170,1092,1075],{"class":278},[170,1094,75],{"class":291},[170,1096,480],{"class":278},[170,1098,75],{"class":291},[170,1100,1101],{"class":278},"Collectors",[170,1103,771],{"class":291},[170,1105,1106],{"class":172,"line":332},[170,1107,188],{"emptyLinePlaceholder":187},[170,1109,1110,1113,1116,1119],{"class":172,"line":340},[170,1111,1112],{"class":420},"public",[170,1114,1115],{"class":420}," class",[170,1117,1118],{"class":433}," Main",[170,1120,329],{"class":291},[170,1122,1123],{"class":172,"line":354},[170,1124,188],{"emptyLinePlaceholder":187},[170,1126,1127,1130,1133,1136,1138,1140,1142,1145,1149,1152],{"class":172,"line":366},[170,1128,1129],{"class":420},"    public",[170,1131,1132],{"class":420}," static",[170,1134,1135],{"class":420}," void",[170,1137,275],{"class":180},[170,1139,504],{"class":291},[170,1141,143],{"class":420},[170,1143,1144],{"class":291},"[]",[170,1146,1148],{"class":1147},"svycV"," args",[170,1150,1151],{"class":291},")",[170,1153,329],{"class":291},[170,1155,1156,1159,1162,1165,1168,1170,1172],{"class":172,"line":372},[170,1157,1158],{"class":420},"        var",[170,1160,1161],{"class":1147}," runtime",[170,1163,1164],{"class":291}," =",[170,1166,1167],{"class":1147}," StoatFlowRuntime",[170,1169,75],{"class":291},[170,1171,298],{"class":180},[170,1173,301],{"class":291},[170,1175,1176,1179,1182,1184],{"class":172,"line":378},[170,1177,1178],{"class":278},"            Main",[170,1180,1181],{"class":176},"::",[170,1183,315],{"class":278},[170,1185,684],{"class":291},[170,1187,1188,1191,1193,1196,1198,1201,1203,1206,1208],{"class":172,"line":384},[170,1189,1190],{"class":278},"            builder ",[170,1192,529],{"class":291},[170,1194,1195],{"class":1147}," builder",[170,1197,75],{"class":291},[170,1199,1200],{"class":180},"streamsConfigOverrides",[170,1202,504],{"class":291},[170,1204,1205],{"class":278},"cfg ",[170,1207,529],{"class":291},[170,1209,329],{"class":291},[170,1211,1212,1215,1217,1220,1222,1224,1226,1228],{"class":172,"line":396},[170,1213,1214],{"class":1147},"                cfg",[170,1216,75],{"class":291},[170,1218,1219],{"class":180},"defaultKeySerde",[170,1221,504],{"class":291},[170,1223,1057],{"class":1147},[170,1225,75],{"class":291},[170,1227,143],{"class":180},[170,1229,1230],{"class":291},"());\n",[170,1232,1233,1235,1237,1240,1242,1244,1246,1248],{"class":172,"line":406},[170,1234,1214],{"class":1147},[170,1236,75],{"class":291},[170,1238,1239],{"class":180},"defaultValueSerde",[170,1241,504],{"class":291},[170,1243,1057],{"class":1147},[170,1245,75],{"class":291},[170,1247,143],{"class":180},[170,1249,1230],{"class":291},[170,1251,1252],{"class":172,"line":412},[170,1253,1254],{"class":291},"            })\n",[170,1256,1257],{"class":172,"line":417},[170,1258,1259],{"class":291},"        );\n",[170,1261,1262,1265,1267,1269],{"class":172,"line":440},[170,1263,1264],{"class":1147},"        runtime",[170,1266,75],{"class":291},[170,1268,390],{"class":180},[170,1270,1271],{"class":291},"();\n",[170,1273,1274,1276,1278,1280],{"class":172,"line":468},[170,1275,1264],{"class":1147},[170,1277,75],{"class":291},[170,1279,401],{"class":180},[170,1281,1271],{"class":291},[170,1283,1284],{"class":172,"line":474},[170,1285,1286],{"class":291},"    }\n",[170,1288,1289],{"class":172,"line":513},[170,1290,188],{"emptyLinePlaceholder":187},[170,1292,1293,1296,1298,1300,1302,1304,1307,1310,1312],{"class":172,"line":523},[170,1294,1295],{"class":420},"    private",[170,1297,1132],{"class":420},[170,1299,1135],{"class":420},[170,1301,427],{"class":180},[170,1303,504],{"class":291},[170,1305,1306],{"class":278},"StreamsBuilder ",[170,1308,1309],{"class":1147},"builder",[170,1311,1151],{"class":291},[170,1313,329],{"class":291},[170,1315,1316,1319,1321,1323,1326,1329,1332,1335,1337,1339,1341,1343,1345,1349,1351,1353,1355,1358,1360,1363,1365,1367,1370,1372],{"class":172,"line":559},[170,1317,1318],{"class":278},"        KStream",[170,1320,483],{"class":291},[170,1322,143],{"class":420},[170,1324,1325],{"class":291},",",[170,1327,1328],{"class":420}," String",[170,1330,1331],{"class":291},">",[170,1333,1334],{"class":1147}," lines",[170,1336,1164],{"class":291},[170,1338,1195],{"class":1147},[170,1340,75],{"class":291},[170,1342,480],{"class":180},[170,1344,504],{"class":291},[170,1346,1348],{"class":1347},"sSP4y","\"",[170,1350,91],{"class":450},[170,1352,1348],{"class":1347},[170,1354,1325],{"class":291},[170,1356,1357],{"class":1147}," Consumed",[170,1359,75],{"class":291},[170,1361,1362],{"class":180},"as",[170,1364,504],{"class":291},[170,1366,1348],{"class":1347},[170,1368,1369],{"class":450},"source",[170,1371,1348],{"class":1347},[170,1373,1374],{"class":291},"));\n",[170,1376,1377],{"class":172,"line":575},[170,1378,1379],{"class":278},"        lines\n",[170,1381,1382,1385,1387],{"class":172,"line":581},[170,1383,1384],{"class":291},"            .",[170,1386,518],{"class":180},[170,1388,301],{"class":291},[170,1390,1391,1394,1396,1398,1400,1402,1405,1407,1409,1412,1414,1417],{"class":172,"line":606},[170,1392,1393],{"class":291},"                (",[170,1395,1001],{"class":278},[170,1397,483],{"class":420},[170,1399,143],{"class":278},[170,1401,1325],{"class":291},[170,1403,1404],{"class":278}," Iterable",[170,1406,483],{"class":420},[170,1408,143],{"class":278},[170,1410,1411],{"class":420},">>",[170,1413,1151],{"class":291},[170,1415,1416],{"class":278}," line ",[170,1418,1419],{"class":291},"->\n",[170,1421,1422,1425,1427,1429,1431,1433,1435,1438,1440,1442,1444,1446,1448,1451,1453],{"class":172,"line":649},[170,1423,1424],{"class":1147},"                    Arrays",[170,1426,75],{"class":291},[170,1428,480],{"class":180},[170,1430,504],{"class":291},[170,1432,172],{"class":1147},[170,1434,75],{"class":291},[170,1436,1437],{"class":180},"toLowerCase",[170,1439,538],{"class":291},[170,1441,541],{"class":180},[170,1443,504],{"class":291},[170,1445,1348],{"class":1347},[170,1447,455],{"class":454},[170,1449,1450],{"class":450},"s+",[170,1452,1348],{"class":1347},[170,1454,510],{"class":291},[170,1456,1457,1460,1462,1464,1467,1469,1472,1475,1477,1480],{"class":172,"line":668},[170,1458,1459],{"class":291},"                        .",[170,1461,547],{"class":180},[170,1463,504],{"class":291},[170,1465,1466],{"class":278},"word ",[170,1468,529],{"class":291},[170,1470,1471],{"class":420}," !",[170,1473,1474],{"class":1147},"word",[170,1476,75],{"class":291},[170,1478,1479],{"class":180},"isBlank",[170,1481,351],{"class":291},[170,1483,1484,1486,1489,1491,1493,1495,1498],{"class":172,"line":678},[170,1485,1459],{"class":291},[170,1487,1488],{"class":180},"collect",[170,1490,504],{"class":291},[170,1492,1101],{"class":1147},[170,1494,75],{"class":291},[170,1496,1497],{"class":180},"toList",[170,1499,738],{"class":291},[170,1501,1502,1505,1507,1509,1511,1513,1516,1518],{"class":172,"line":687},[170,1503,1504],{"class":1147},"                Named",[170,1506,75],{"class":291},[170,1508,1362],{"class":180},[170,1510,504],{"class":291},[170,1512,1348],{"class":1347},[170,1514,1515],{"class":450},"split-words",[170,1517,1348],{"class":1347},[170,1519,510],{"class":291},[170,1521,1522,1524,1526,1529,1532,1534,1537,1539,1542,1544,1546,1549,1551,1553,1555,1557,1560,1562],{"class":172,"line":711},[170,1523,1384],{"class":291},[170,1525,586],{"class":180},[170,1527,1528],{"class":291},"((",[170,1530,1531],{"class":278},"key",[170,1533,1325],{"class":291},[170,1535,1536],{"class":278}," word",[170,1538,1151],{"class":291},[170,1540,1541],{"class":291}," ->",[170,1543,1536],{"class":278},[170,1545,1325],{"class":291},[170,1547,1548],{"class":1147}," Grouped",[170,1550,75],{"class":291},[170,1552,1362],{"class":180},[170,1554,504],{"class":291},[170,1556,1348],{"class":1347},[170,1558,1559],{"class":450},"group-by-word",[170,1561,1348],{"class":1347},[170,1563,510],{"class":291},[170,1565,1566,1568,1570,1572,1574,1576,1578,1580,1582,1584,1586,1589,1592,1594,1596,1598,1600,1603,1605,1608,1610,1612,1614,1616,1618,1620],{"class":172,"line":726},[170,1567,1384],{"class":291},[170,1569,611],{"class":180},[170,1571,504],{"class":291},[170,1573,927],{"class":1147},[170,1575,75],{"class":291},[170,1577,1362],{"class":180},[170,1579,504],{"class":291},[170,1581,1348],{"class":1347},[170,1583,611],{"class":450},[170,1585,1348],{"class":1347},[170,1587,1588],{"class":291},"),",[170,1590,1591],{"class":278}," Materialized",[170,1593,75],{"class":291},[170,1595,483],{"class":420},[170,1597,143],{"class":278},[170,1599,1325],{"class":291},[170,1601,1602],{"class":278}," Long",[170,1604,1325],{"class":291},[170,1606,1607],{"class":278}," StateStore",[170,1609,1331],{"class":420},[170,1611,1362],{"class":180},[170,1613,504],{"class":291},[170,1615,1348],{"class":1347},[170,1617,95],{"class":450},[170,1619,1348],{"class":1347},[170,1621,510],{"class":291},[170,1623,1624,1626,1628,1630,1632,1634,1636,1638,1640,1643,1645],{"class":172,"line":741},[170,1625,1384],{"class":291},[170,1627,654],{"class":180},[170,1629,504],{"class":291},[170,1631,927],{"class":1147},[170,1633,75],{"class":291},[170,1635,1362],{"class":180},[170,1637,504],{"class":291},[170,1639,1348],{"class":1347},[170,1641,1642],{"class":450},"to-stream",[170,1644,1348],{"class":1347},[170,1646,510],{"class":291},[170,1648,1649,1651,1653],{"class":172,"line":746},[170,1650,1384],{"class":291},[170,1652,673],{"class":180},[170,1654,301],{"class":291},[170,1656,1658,1661,1663,1665],{"class":172,"line":1657},45,[170,1659,1660],{"class":1347},"                \"",[170,1662,95],{"class":450},[170,1664,1348],{"class":1347},[170,1666,684],{"class":291},[170,1668,1670,1673,1675,1677,1679,1681,1683,1685,1687,1689,1691,1694,1696],{"class":172,"line":1669},46,[170,1671,1672],{"class":278},"                Produced",[170,1674,75],{"class":291},[170,1676,483],{"class":420},[170,1678,143],{"class":278},[170,1680,1325],{"class":291},[170,1682,1602],{"class":278},[170,1684,1331],{"class":420},[170,1686,1362],{"class":180},[170,1688,504],{"class":291},[170,1690,1348],{"class":1347},[170,1692,1693],{"class":450},"sink",[170,1695,1348],{"class":1347},[170,1697,708],{"class":291},[170,1699,1701,1704,1706,1708,1710,1712,1714],{"class":172,"line":1700},47,[170,1702,1703],{"class":291},"                    .",[170,1705,717],{"class":180},[170,1707,504],{"class":291},[170,1709,1057],{"class":1147},[170,1711,75],{"class":291},[170,1713,143],{"class":180},[170,1715,351],{"class":291},[170,1717,1719,1721,1723,1725,1727,1729,1731],{"class":172,"line":1718},48,[170,1720,1703],{"class":291},[170,1722,731],{"class":180},[170,1724,504],{"class":291},[170,1726,1057],{"class":1147},[170,1728,75],{"class":291},[170,1730,136],{"class":180},[170,1732,1733],{"class":291},"()));\n",[170,1735,1737],{"class":172,"line":1736},49,[170,1738,1286],{"class":291},[170,1740,1742],{"class":172,"line":1741},50,[170,1743,409],{"class":291},[114,1745,1747],{"id":1746},"configuration","Configuration",[44,1749,1750,1751,1754],{},"Add ",[48,1752,1753],{},"src\u002Fmain\u002Fresources\u002Fapplication.yaml",". Topic names live in the topology code above; this file configures the engine, your license, and the runtime's HTTP + metrics endpoints:",[160,1756,1760],{"className":1757,"code":1758,"language":1759,"meta":166,"style":166},"language-yaml shiki shiki-themes vitesse-light","stoatflow:\n  application-id: word-count\n  bootstrap-servers: ${KAFKA_BOOTSTRAP_SERVERS:-localhost:9092}\n\n  license:\n    key: ${STOATFLOW_LICENSE_KEY}\n\nruntime:\n  http:\n    enabled: true\n    port: ${HTTP_PORT:-8080}\n  metrics:\n    enabled: true\n","yaml",[48,1761,1762,1770,1781,1791,1795,1802,1812,1816,1822,1829,1839,1849,1856],{"__ignoreMap":166},[170,1763,1764,1767],{"class":172,"line":173},[170,1765,787],{"class":1766},"su6XF",[170,1768,1769],{"class":291},":\n",[170,1771,1772,1775,1778],{"class":172,"line":184},[170,1773,1774],{"class":1766},"  application-id",[170,1776,1777],{"class":291},":",[170,1779,1780],{"class":450}," word-count\n",[170,1782,1783,1786,1788],{"class":172,"line":191},[170,1784,1785],{"class":1766},"  bootstrap-servers",[170,1787,1777],{"class":291},[170,1789,1790],{"class":450}," ${KAFKA_BOOTSTRAP_SERVERS:-localhost:9092}\n",[170,1792,1793],{"class":172,"line":200},[170,1794,188],{"emptyLinePlaceholder":187},[170,1796,1797,1800],{"class":172,"line":208},[170,1798,1799],{"class":1766},"  license",[170,1801,1769],{"class":291},[170,1803,1804,1807,1809],{"class":172,"line":216},[170,1805,1806],{"class":1766},"    key",[170,1808,1777],{"class":291},[170,1810,1811],{"class":450}," ${STOATFLOW_LICENSE_KEY}\n",[170,1813,1814],{"class":172,"line":224},[170,1815,188],{"emptyLinePlaceholder":187},[170,1817,1818,1820],{"class":172,"line":232},[170,1819,1018],{"class":1766},[170,1821,1769],{"class":291},[170,1823,1824,1827],{"class":172,"line":240},[170,1825,1826],{"class":1766},"  http",[170,1828,1769],{"class":291},[170,1830,1831,1834,1836],{"class":172,"line":248},[170,1832,1833],{"class":1766},"    enabled",[170,1835,1777],{"class":291},[170,1837,1838],{"class":176}," true\n",[170,1840,1841,1844,1846],{"class":172,"line":256},[170,1842,1843],{"class":1766},"    port",[170,1845,1777],{"class":291},[170,1847,1848],{"class":450}," ${HTTP_PORT:-8080}\n",[170,1850,1851,1854],{"class":172,"line":264},[170,1852,1853],{"class":1766},"  metrics",[170,1855,1769],{"class":291},[170,1857,1858,1860,1862],{"class":172,"line":269},[170,1859,1833],{"class":1766},[170,1861,1777],{"class":291},[170,1863,1838],{"class":176},[1865,1866,1869],"callout",{"color":1867,"icon":1868},"info","i-lucide-database",[44,1870,1871,1872,1875,1876,1878],{},"Word count is ",[53,1873,1874],{},"stateful"," — StoatFlow keeps a ",[48,1877,95],{}," state store (the running totals) and backs it with a changelog topic so the state survives restarts and recovers quickly. Both are created automatically with sensible defaults; you don't need to configure anything extra to run locally.",[114,1880,1882],{"id":1881},"run-it","Run it",[44,1884,1885],{},"Make sure Kafka is running and the topics exist, export your license key, then start the app:",[160,1887,1891],{"className":1888,"code":1889,"language":1890,"meta":166,"style":166},"language-bash shiki shiki-themes vitesse-light","export KAFKA_BOOTSTRAP_SERVERS=localhost:9092\nexport STOATFLOW_LICENSE_KEY=\"key\u002F...your key from the onboarding email...\"\n\n# Create the topics (one-off)\nkafka-topics.sh --bootstrap-server localhost:9092 --create --topic text-lines --if-not-exists\nkafka-topics.sh --bootstrap-server localhost:9092 --create --topic word-counts --if-not-exists\n\n# Run (the io.stoatflow Gradle plugin provides the `run` task + the JVM flags)\n.\u002Fgradlew run\n","bash",[48,1892,1893,1911,1928,1932,1938,1961,1978,1982,1987],{"__ignoreMap":166},[170,1894,1895,1898,1901,1903,1906,1908],{"class":172,"line":173},[170,1896,1897],{"class":420},"export",[170,1899,1900],{"class":1147}," KAFKA_BOOTSTRAP_SERVERS",[170,1902,292],{"class":291},[170,1904,1905],{"class":1147},"localhost",[170,1907,1777],{"class":278},[170,1909,1910],{"class":1147},"9092\n",[170,1912,1913,1915,1918,1920,1922,1925],{"class":172,"line":184},[170,1914,1897],{"class":420},[170,1916,1917],{"class":1147}," STOATFLOW_LICENSE_KEY",[170,1919,292],{"class":291},[170,1921,1348],{"class":1347},[170,1923,1924],{"class":450},"key\u002F...your key from the onboarding email...",[170,1926,1927],{"class":1347},"\"\n",[170,1929,1930],{"class":172,"line":191},[170,1931,188],{"emptyLinePlaceholder":187},[170,1933,1934],{"class":172,"line":200},[170,1935,1937],{"class":1936},"s8zF2","# Create the topics (one-off)\n",[170,1939,1940,1943,1946,1949,1952,1955,1958],{"class":172,"line":208},[170,1941,1942],{"class":180},"kafka-topics.sh",[170,1944,1945],{"class":454}," --bootstrap-server",[170,1947,1948],{"class":450}," localhost:9092",[170,1950,1951],{"class":454}," --create",[170,1953,1954],{"class":454}," --topic",[170,1956,1957],{"class":450}," text-lines",[170,1959,1960],{"class":454}," --if-not-exists\n",[170,1962,1963,1965,1967,1969,1971,1973,1976],{"class":172,"line":216},[170,1964,1942],{"class":180},[170,1966,1945],{"class":454},[170,1968,1948],{"class":450},[170,1970,1951],{"class":454},[170,1972,1954],{"class":454},[170,1974,1975],{"class":450}," word-counts",[170,1977,1960],{"class":454},[170,1979,1980],{"class":172,"line":224},[170,1981,188],{"emptyLinePlaceholder":187},[170,1983,1984],{"class":172,"line":232},[170,1985,1986],{"class":1936},"# Run (the io.stoatflow Gradle plugin provides the `run` task + the JVM flags)\n",[170,1988,1989,1992],{"class":172,"line":240},[170,1990,1991],{"class":180},".\u002Fgradlew",[170,1993,1994],{"class":450}," run\n",[44,1996,1997],{},"Health and metrics come up on port 8080:",[160,1999,2001],{"className":1888,"code":2000,"language":1890,"meta":166,"style":166},"curl -s localhost:8080\u002Fhealth\u002Fready\n",[48,2002,2003],{"__ignoreMap":166},[170,2004,2005,2008,2011],{"class":172,"line":173},[170,2006,2007],{"class":180},"curl",[170,2009,2010],{"class":454}," -s",[170,2012,2013],{"class":450}," localhost:8080\u002Fhealth\u002Fready\n",[44,2015,2016],{},"Now feed it some text:",[160,2018,2020],{"className":1888,"code":2019,"language":1890,"meta":166,"style":166},"printf 'the quick brown fox\\nthe lazy dog\\nthe quick fox\\n' \\\n  | kafka-console-producer.sh --bootstrap-server localhost:9092 --topic text-lines\n",[48,2021,2022,2039],{"__ignoreMap":166},[170,2023,2024,2027,2030,2033,2036],{"class":172,"line":173},[170,2025,2026],{"class":1766},"printf",[170,2028,2029],{"class":1347}," '",[170,2031,2032],{"class":450},"the quick brown fox\\nthe lazy dog\\nthe quick fox\\n",[170,2034,2035],{"class":1347},"'",[170,2037,2038],{"class":454}," \\\n",[170,2040,2041,2044,2047,2049,2051,2053],{"class":172,"line":184},[170,2042,2043],{"class":420},"  |",[170,2045,2046],{"class":180}," kafka-console-producer.sh",[170,2048,1945],{"class":454},[170,2050,1948],{"class":450},[170,2052,1954],{"class":454},[170,2054,2055],{"class":450}," text-lines\n",[44,2057,2058,2059,2061,2062,1777],{},"And watch the counts. The values are ",[48,2060,136],{},", so tell the consumer to print the key and decode the value with the ",[48,2063,2064],{},"LongDeserializer",[160,2066,2068],{"className":1888,"code":2067,"language":1890,"meta":166,"style":166},"kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic word-counts \\\n  --from-beginning --property print.key=true \\\n  --value-deserializer org.apache.kafka.common.serialization.LongDeserializer\n",[48,2069,2070,2085,2101],{"__ignoreMap":166},[170,2071,2072,2075,2077,2079,2081,2083],{"class":172,"line":173},[170,2073,2074],{"class":180},"kafka-console-consumer.sh",[170,2076,1945],{"class":454},[170,2078,1948],{"class":450},[170,2080,1954],{"class":454},[170,2082,1975],{"class":450},[170,2084,2038],{"class":454},[170,2086,2087,2090,2093,2096,2099],{"class":172,"line":184},[170,2088,2089],{"class":454},"  --from-beginning",[170,2091,2092],{"class":454}," --property",[170,2094,2095],{"class":450}," print.key=",[170,2097,2098],{"class":176},"true",[170,2100,2038],{"class":454},[170,2102,2103,2106],{"class":172,"line":191},[170,2104,2105],{"class":454},"  --value-deserializer",[170,2107,2108],{"class":450}," org.apache.kafka.common.serialization.LongDeserializer\n",[44,2110,2111,2112,2115,2116,2119,2120,2123],{},"You'll see each word's total update as the lines are processed — ",[48,2113,2114],{},"the"," climbing to 3, ",[48,2117,2118],{},"quick"," and ",[48,2121,2122],{},"fox"," to 2, the rest at 1:",[160,2125,2130],{"className":2126,"code":2128,"language":2129,"meta":166},[2127],"language-text","the 1\nquick   1\nbrown   1\nfox 1\nthe 2\nlazy    1\ndog 1\nthe 3\nquick   2\nfox 2\n","text",[48,2131,2128],{"__ignoreMap":166},[1865,2133,2135],{"color":1867,"icon":2134},"i-lucide-info",[44,2136,2137,2140,2141,2144,2145,2148,2149,2151,2152,2155,2156,2155,2159,2162],{},[48,2138,2139],{},"count()"," produces a ",[48,2142,2143],{},"KTable",", so the output is a ",[53,2146,2147],{},"changelog",": every time a word's total changes, StoatFlow emits that word's new count. That's why you see ",[48,2150,2114],{}," reported as ",[48,2153,2154],{},"1",", then ",[48,2157,2158],{},"2",[48,2160,2161],{},"3"," rather than only the final tally — each is the running total at that point in the stream.",[114,2164,2166],{"id":2165},"next-steps","Next steps",[80,2168,2169,2176,2183],{},[83,2170,2171,2175],{},[53,2172,2173],{},[61,2174,28],{"href":29}," — how the single-instance engine runs your topology (lane dispatcher, commit barriers, state stores).",[83,2177,2178,2182],{},[53,2179,2180],{},[61,2181,18],{"href":19}," — the full license reference for local development and CI\u002FCD.",[83,2184,2185,2186,2190],{},"Building something and stuck? ",[61,2187,2189],{"href":2188},"\u002Fcontact","Get in touch"," — real people read every email during the alpha.",[2192,2193,2194],"style",{},"html pre.shiki code .sbBg2, html code.shiki .sbBg2{--shiki-default:#1E754F}html pre.shiki code .sySUi, html code.shiki .sySUi{--shiki-default:#59873A}html pre.shiki code .suHK_, html code.shiki .suHK_{--shiki-default:#393A34}html pre.shiki code .sYZai, html code.shiki .sYZai{--shiki-default:#999999}html pre.shiki code .si04Y, html code.shiki .si04Y{--shiki-default:#AB5959}html pre.shiki code .sUxyF, html code.shiki .sUxyF{--shiki-default:#2E8F82}html pre.shiki code .spphp, html code.shiki .spphp{--shiki-default:#B56959}html pre.shiki code .sEi1f, html code.shiki .sEi1f{--shiki-default:#A65E2B}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .su6XF, html code.shiki .su6XF{--shiki-default:#998418}html pre.shiki code .svycV, html code.shiki .svycV{--shiki-default:#B07D48}html pre.shiki code .sSP4y, html code.shiki .sSP4y{--shiki-default:#B5695977}html pre.shiki code .s8zF2, html code.shiki .s8zF2{--shiki-default:#A0ADA0}",{"title":166,"searchDepth":184,"depth":184,"links":2196},[2197,2198,2199,2200],{"id":116,"depth":184,"text":117},{"id":1746,"depth":184,"text":1747},{"id":1881,"depth":184,"text":1882},{"id":2165,"depth":184,"text":2166},"Build and run a complete word-count stream processor on the StoatFlow runtime — in Kotlin or Java.","md",{},{"icon":26},{"title":23,"description":2201},"ha_Mu5IpbqxyqlknHOjvq9bmNDu3hVtQD6mklg2T97U",[2208,2210],{"title":18,"path":19,"stem":20,"description":2209,"icon":21,"children":-1},"Configure your StoatFlow license key for local development and CI\u002FCD — environment variables, system properties, key files, and application.yaml.",{"title":28,"path":29,"stem":30,"description":2211,"icon":31,"children":-1},"How StoatFlow runs your Kafka Streams topology as a single replica — the conceptual model, processing lanes, commit barriers, state, and operational surface.",1780332013514]