[{"data":1,"prerenderedAt":1009},["ShallowReactive",2],{"navigation":3,"\u002Fdocs\u002Fgetting-started\u002Flicense-configuration":38,"\u002Fdocs\u002Fgetting-started\u002Flicense-configuration-surround":1004},[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":18,"body":40,"description":998,"extension":999,"meta":1000,"navigation":1001,"path":19,"seo":1002,"stem":20,"__hash__":1003},"docs\u002F1.docs\u002F1.getting-started\u002F3.license-configuration.md",{"type":41,"value":42,"toc":989},"minimark",[43,56,130,135,151,191,194,211,214,376,380,399,407,432,459,462,469,511,514,563,567,574,584,676,679,735,739,749,905,919,923,966,970,985],[44,45,46,47,51,52,55],"p",{},"StoatFlow validates a license at startup (and re-checks it on a periodic heartbeat). You give it two things: your ",[48,49,50],"strong",{},"license key"," and — for production — an ",[48,53,54],{},"environment"," label. This page covers every way to provide them, for local development and CI\u002FCD.",[57,58,59],"tldr-panel",{},[60,61,62,86,102,116],"ul",{},[63,64,65,66,68,69,73,74,77,78,81,82,85],"li",{},"Set your ",[48,67,50],{}," via ",[70,71,72],"code",{},"STOATFLOW_LICENSE_KEY",", the ",[70,75,76],{},"stoatflow.license.key"," system property, a ",[70,79,80],{},"~\u002F.stoatflow\u002Flicense.key"," file, or ",[70,83,84],{},"application.yaml",".",[63,87,88,91,92,95,96,99,100,85],{},[48,89,90],{},"Resolution:"," an explicit ",[48,93,94],{},"key"," beats a key ",[48,97,98],{},"file","; within each, an environment variable beats a system property beats ",[70,101,84],{},[63,103,104,105,107,108,111,112,115],{},"The ",[48,106,54],{}," label scopes your license seat (",[70,109,110],{},"SHA-256(application-id || environment)","). Production ",[48,113,114],{},"requires"," it explicitly.",[63,117,118,121,122,125,126,129],{},[48,119,120],{},"CI\u002FCD:"," on GitHub Actions the environment is auto-derived as ",[70,123,124],{},"cicd-\u003Crun id>","; elsewhere set ",[70,127,128],{},"STOATFLOW_LICENSE_ENVIRONMENT"," yourself.",[131,132,134],"h2",{"id":133},"the-license-key","The license key",[44,136,137,138,141,142,144,145,147,148,150],{},"Your key is the signed string from your onboarding email — it starts with ",[70,139,140],{},"key\u002F",". The runtime resolves it by looking for an explicit ",[48,143,94],{}," first, then a key ",[48,146,98],{}," — and within each, an environment variable beats a system property (which is what an ",[70,149,84],{}," value becomes):",[152,153,154,172],"ol",{},[63,155,156,159,160,162,163,165,166,168,169,171],{},[48,157,158],{},"An explicit key"," — ",[70,161,72],{}," (environment variable), else the ",[70,164,76],{}," system property (which ",[70,167,84],{},"'s ",[70,170,76],{}," feeds).",[63,173,174,159,177,162,180,183,184,168,186,188,189,85],{},[48,175,176],{},"A key file",[70,178,179],{},"STOATFLOW_LICENSE_FILE",[70,181,182],{},"stoatflow.license.file"," system property (fed by ",[70,185,84],{},[70,187,182],{},"), else the default ",[70,190,80],{},[44,192,193],{},"So an explicit key always wins over a key file, regardless of where each came from.",[195,196,198],"callout",{"icon":197},"i-lucide-info",[44,199,200,202,203,206,207,210],{},[70,201,84],{}," values are applied ",[48,204,205],{},"below"," environment variables and ",[70,208,209],{},"-D"," system properties — so an env var always wins over YAML. This lets you commit a YAML default and override it per environment without touching the file.",[44,212,213],{},"Pick whichever fits — by source:",[215,216,217,262,333],"code-group",{},[218,219,225],"pre",{"className":220,"code":221,"filename":222,"language":223,"meta":224,"style":224},"language-bash shiki shiki-themes vitesse-light","# Highest precedence. Good for containers, CI, and one-off local runs.\nexport STOATFLOW_LICENSE_KEY=\"key\u002F...your key from the onboarding email...\"\n","Shell env","bash","",[70,226,227,236],{"__ignoreMap":224},[228,229,232],"span",{"class":230,"line":231},"line",1,[228,233,235],{"class":234},"s8zF2","# Highest precedence. Good for containers, CI, and one-off local runs.\n",[228,237,239,243,247,251,255,259],{"class":230,"line":238},2,[228,240,242],{"class":241},"si04Y","export",[228,244,246],{"class":245},"svycV"," STOATFLOW_LICENSE_KEY",[228,248,250],{"class":249},"sYZai","=",[228,252,254],{"class":253},"sSP4y","\"",[228,256,258],{"class":257},"spphp","key\u002F...your key from the onboarding email...",[228,260,261],{"class":253},"\"\n",[218,263,266],{"className":220,"code":264,"filename":265,"language":223,"meta":224,"style":224},"# Set once, every local app picks it up — no env var needed.\n# Must be chmod 600 (owner-only) on Linux\u002FmacOS, or startup is refused.\nmkdir -p ~\u002F.stoatflow\nprintf '%s' 'key\u002F...your key...' > ~\u002F.stoatflow\u002Flicense.key\nchmod 600 ~\u002F.stoatflow\u002Flicense.key\n","Key file",[70,267,268,273,278,292,321],{"__ignoreMap":224},[228,269,270],{"class":230,"line":231},[228,271,272],{"class":234},"# Set once, every local app picks it up — no env var needed.\n",[228,274,275],{"class":230,"line":238},[228,276,277],{"class":234},"# Must be chmod 600 (owner-only) on Linux\u002FmacOS, or startup is refused.\n",[228,279,281,285,289],{"class":230,"line":280},3,[228,282,284],{"class":283},"sySUi","mkdir",[228,286,288],{"class":287},"sEi1f"," -p",[228,290,291],{"class":257}," ~\u002F.stoatflow\n",[228,293,295,299,302,305,308,310,313,315,318],{"class":230,"line":294},4,[228,296,298],{"class":297},"su6XF","printf",[228,300,301],{"class":253}," '",[228,303,304],{"class":257},"%s",[228,306,307],{"class":253},"'",[228,309,301],{"class":253},[228,311,312],{"class":257},"key\u002F...your key...",[228,314,307],{"class":253},[228,316,317],{"class":241}," >",[228,319,320],{"class":257}," ~\u002F.stoatflow\u002Flicense.key\n",[228,322,324,327,331],{"class":230,"line":323},5,[228,325,326],{"class":283},"chmod",[228,328,330],{"class":329},"s-TwI"," 600",[228,332,320],{"class":257},[218,334,338],{"className":335,"code":336,"filename":84,"language":337,"meta":224,"style":224},"language-yaml shiki shiki-themes vitesse-light","# Runtime module only. Interpolate from an env var so the literal key\n# never lands in source control.\nstoatflow:\n  license:\n    key: ${STOATFLOW_LICENSE_KEY}\n","yaml",[70,339,340,345,350,358,365],{"__ignoreMap":224},[228,341,342],{"class":230,"line":231},[228,343,344],{"class":234},"# Runtime module only. Interpolate from an env var so the literal key\n",[228,346,347],{"class":230,"line":238},[228,348,349],{"class":234},"# never lands in source control.\n",[228,351,352,355],{"class":230,"line":280},[228,353,354],{"class":297},"stoatflow",[228,356,357],{"class":249},":\n",[228,359,360,363],{"class":230,"line":294},[228,361,362],{"class":297},"  license",[228,364,357],{"class":249},[228,366,367,370,373],{"class":230,"line":323},[228,368,369],{"class":297},"    key",[228,371,372],{"class":249},":",[228,374,375],{"class":257}," ${STOATFLOW_LICENSE_KEY}\n",[131,377,379],{"id":378},"the-environment-label","The environment label",[44,381,104,382,384,385,388,389,388,392,388,395,398],{},[48,383,54],{}," is a label for the deployment a license seat is bound to — e.g. ",[70,386,387],{},"prod",", ",[70,390,391],{},"prod-eu-west",[70,393,394],{},"staging",[70,396,397],{},"dev",". StoatFlow derives a machine fingerprint from it:",[218,400,405],{"className":401,"code":403,"language":404},[402],"language-text","fingerprint = SHA-256(application-id || environment)\n","text",[70,406,403],{"__ignoreMap":224},[44,408,409,410,413,414,416,417,420,421,73,423,426,427,429,430,85],{},"So the same ",[70,411,412],{},"application-id"," + the same ",[70,415,54],{}," is ",[48,418,419],{},"one seat","; distinct environments are distinct seats. Set it with ",[70,422,128],{},[70,424,425],{},"stoatflow.license.environment"," system property, or ",[70,428,425],{}," in ",[70,431,84],{},[60,433,434,444],{},[63,435,436,439,440,443],{},[48,437,438],{},"Local development"," (Trial \u002F Developer tiers): if you don't set it, the environment defaults to ",[70,441,442],{},"\u003Cyour-username>-\u003Chostname>"," — one seat per developer machine, no configuration needed.",[63,445,446,449,450,453,454,388,456,458],{},[48,447,448],{},"Production",": the Production tier ",[48,451,452],{},"requires an explicit environment"," — startup fails if it has to auto-generate one. Set it per deployment (",[70,455,387],{},[70,457,391],{},", …) so each gets its own node-locked seat.",[131,460,438],{"id":461},"local-development",[44,463,464,465,468],{},"The simplest local setup is the ",[48,466,467],{},"key file"," — write it once and every StoatFlow app you run locally is licensed, with no env vars and an auto-derived per-machine environment:",[218,470,472],{"className":220,"code":471,"language":223,"meta":224,"style":224},"mkdir -p ~\u002F.stoatflow\nprintf '%s' 'key\u002F...your developer key...' > ~\u002F.stoatflow\u002Flicense.key\nchmod 600 ~\u002F.stoatflow\u002Flicense.key\n",[70,473,474,482,503],{"__ignoreMap":224},[228,475,476,478,480],{"class":230,"line":231},[228,477,284],{"class":283},[228,479,288],{"class":287},[228,481,291],{"class":257},[228,483,484,486,488,490,492,494,497,499,501],{"class":230,"line":238},[228,485,298],{"class":297},[228,487,301],{"class":253},[228,489,304],{"class":257},[228,491,307],{"class":253},[228,493,301],{"class":253},[228,495,496],{"class":257},"key\u002F...your developer key...",[228,498,307],{"class":253},[228,500,317],{"class":241},[228,502,320],{"class":257},[228,504,505,507,509],{"class":230,"line":280},[228,506,326],{"class":283},[228,508,330],{"class":329},[228,510,320],{"class":257},[44,512,513],{},"Prefer per-run configuration? Export the key (and optionally the environment) in your shell:",[218,515,517],{"className":220,"code":516,"language":223,"meta":224,"style":224},"export STOATFLOW_LICENSE_KEY=\"key\u002F...your developer key...\"\n# Optional — defaults to \u003Cusername>-\u003Chostname> if unset:\nexport STOATFLOW_LICENSE_ENVIRONMENT=\"dev-$(whoami)\"\n",[70,518,519,533,538],{"__ignoreMap":224},[228,520,521,523,525,527,529,531],{"class":230,"line":231},[228,522,242],{"class":241},[228,524,246],{"class":245},[228,526,250],{"class":249},[228,528,254],{"class":253},[228,530,496],{"class":257},[228,532,261],{"class":253},[228,534,535],{"class":230,"line":238},[228,536,537],{"class":234},"# Optional — defaults to \u003Cusername>-\u003Chostname> if unset:\n",[228,539,540,542,545,547,549,552,555,558,561],{"class":230,"line":280},[228,541,242],{"class":241},[228,543,544],{"class":245}," STOATFLOW_LICENSE_ENVIRONMENT",[228,546,250],{"class":249},[228,548,254],{"class":253},[228,550,551],{"class":257},"dev-",[228,553,554],{"class":249},"$(",[228,556,557],{"class":283},"whoami",[228,559,560],{"class":249},")",[228,562,261],{"class":253},[131,564,566],{"id":565},"cicd","CI\u002FCD",[44,568,569,570,573],{},"Use your ",[48,571,572],{},"CI\u002FCD-tier"," key (it carries a higher machine cap suited to short-lived build agents). Store it as an encrypted secret — never in the repo.",[44,575,576,577,580,581,583],{},"On ",[48,578,579],{},"GitHub Actions",", StoatFlow auto-detects the run and sets the environment to ",[70,582,124],{}," for you, so each run gets a fresh, ephemeral seat — you only need to provide the key:",[218,585,587],{"className":335,"code":586,"language":337,"meta":224,"style":224},"# .github\u002Fworkflows\u002Fyour-workflow.yml\njobs:\n  integration-test:\n    runs-on: ubuntu-latest\n    env:\n      STOATFLOW_LICENSE_KEY: ${{ secrets.STOATFLOW_CI_LICENSE }}\n      # Optional — auto-derived as cicd-${GITHUB_RUN_ID} on GitHub Actions:\n      # STOATFLOW_LICENSE_ENVIRONMENT: cicd-${{ github.run_id }}\n    steps:\n      - uses: actions\u002Fcheckout@v4\n      # ... build + run StoatFlow tests ...\n",[70,588,589,594,601,608,618,625,636,642,648,656,670],{"__ignoreMap":224},[228,590,591],{"class":230,"line":231},[228,592,593],{"class":234},"# .github\u002Fworkflows\u002Fyour-workflow.yml\n",[228,595,596,599],{"class":230,"line":238},[228,597,598],{"class":297},"jobs",[228,600,357],{"class":249},[228,602,603,606],{"class":230,"line":280},[228,604,605],{"class":297},"  integration-test",[228,607,357],{"class":249},[228,609,610,613,615],{"class":230,"line":294},[228,611,612],{"class":297},"    runs-on",[228,614,372],{"class":249},[228,616,617],{"class":257}," ubuntu-latest\n",[228,619,620,623],{"class":230,"line":323},[228,621,622],{"class":297},"    env",[228,624,357],{"class":249},[228,626,628,631,633],{"class":230,"line":627},6,[228,629,630],{"class":297},"      STOATFLOW_LICENSE_KEY",[228,632,372],{"class":249},[228,634,635],{"class":257}," ${{ secrets.STOATFLOW_CI_LICENSE }}\n",[228,637,639],{"class":230,"line":638},7,[228,640,641],{"class":234},"      # Optional — auto-derived as cicd-${GITHUB_RUN_ID} on GitHub Actions:\n",[228,643,645],{"class":230,"line":644},8,[228,646,647],{"class":234},"      # STOATFLOW_LICENSE_ENVIRONMENT: cicd-${{ github.run_id }}\n",[228,649,651,654],{"class":230,"line":650},9,[228,652,653],{"class":297},"    steps",[228,655,357],{"class":249},[228,657,659,662,665,667],{"class":230,"line":658},10,[228,660,661],{"class":249},"      -",[228,663,664],{"class":297}," uses",[228,666,372],{"class":249},[228,668,669],{"class":257}," actions\u002Fcheckout@v4\n",[228,671,673],{"class":230,"line":672},11,[228,674,675],{"class":234},"      # ... build + run StoatFlow tests ...\n",[44,677,678],{},"On other CI systems (GitLab CI, Jenkins, …) there's no auto-detection — set the environment explicitly to something unique-per-run so concurrent builds don't contend for one seat:",[218,680,682],{"className":220,"code":681,"language":223,"meta":224,"style":224},"export STOATFLOW_LICENSE_KEY=\"$STOATFLOW_CI_LICENSE\"\nexport STOATFLOW_LICENSE_ENVIRONMENT=\"cicd-${CI_PIPELINE_ID:-$(date +%s)}\"\n",[70,683,684,699],{"__ignoreMap":224},[228,685,686,688,690,692,694,697],{"class":230,"line":231},[228,687,242],{"class":241},[228,689,246],{"class":245},[228,691,250],{"class":249},[228,693,254],{"class":253},[228,695,696],{"class":257},"$STOATFLOW_CI_LICENSE",[228,698,261],{"class":253},[228,700,701,703,705,707,709,712,715,718,721,724,727,730,733],{"class":230,"line":238},[228,702,242],{"class":241},[228,704,544],{"class":245},[228,706,250],{"class":249},[228,708,254],{"class":253},[228,710,711],{"class":257},"cicd-",[228,713,714],{"class":249},"${",[228,716,717],{"class":257},"CI_PIPELINE_ID",[228,719,720],{"class":241},":-",[228,722,723],{"class":257},"$(date +",[228,725,726],{"class":241},"%",[228,728,729],{"class":257},"s)",[228,731,732],{"class":249},"}",[228,734,261],{"class":253},[131,736,738],{"id":737},"all-license-settings","All license settings",[44,740,741,742,744,745,748],{},"Every setting, with its environment variable, system property, and ",[70,743,84],{}," key (under ",[70,746,747],{},"stoatflow.license","). Environment variable wins over system property wins over YAML.",[750,751,752,779],"table",{},[753,754,755],"thead",{},[756,757,758,767,770,773,776],"tr",{},[759,760,761,763,764,560],"th",{},[70,762,84],{}," (",[70,765,766],{},"stoatflow.license.*",[759,768,769],{},"Environment variable",[759,771,772],{},"System property",[759,774,775],{},"Default",[759,777,778],{},"Purpose",[780,781,782,807,828,855,880],"tbody",{},[756,783,784,789,793,797,800],{},[785,786,787],"td",{},[70,788,94],{},[785,790,791],{},[70,792,72],{},[785,794,795],{},[70,796,76],{},[785,798,799],{},"—",[785,801,802,803,806],{},"The signed license key (",[70,804,805],{},"key\u002F…",").",[756,808,809,813,817,821,825],{},[785,810,811],{},[70,812,98],{},[785,814,815],{},[70,816,179],{},[785,818,819],{},[70,820,182],{},[785,822,823],{},[70,824,80],{},[785,826,827],{},"Path to a file containing the key.",[756,829,830,834,838,842,848],{},[785,831,832],{},[70,833,54],{},[785,835,836],{},[70,837,128],{},[785,839,840],{},[70,841,425],{},[785,843,844,847],{},[70,845,846],{},"\u003Cusername>-\u003Chostname>"," (auto)",[785,849,850,851,854],{},"Seat label; ",[48,852,853],{},"required"," for Production.",[756,856,857,862,867,872,877],{},[785,858,859],{},[70,860,861],{},"cache-dir",[785,863,864],{},[70,865,866],{},"STOATFLOW_LICENSE_CACHE_DIR",[785,868,869],{},[70,870,871],{},"stoatflow.license.cache-dir",[785,873,874],{},[70,875,876],{},"~\u002F.stoatflow\u002Flicense-cache\u002F",[785,878,879],{},"Where the offline-grace cache is stored.",[756,881,882,887,892,897,902],{},[785,883,884],{},[70,885,886],{},"verbose-banner",[785,888,889],{},[70,890,891],{},"STOATFLOW_LICENSE_VERBOSE_BANNER",[785,893,894],{},[70,895,896],{},"stoatflow.license.verbose-banner",[785,898,899],{},[70,900,901],{},"false",[785,903,904],{},"Log a detailed license banner at startup.",[195,906,907],{"icon":197},[44,908,909,912,913,918],{},[48,910,911],{},"Heartbeat cadence and offline-grace are set by your license tier, not by configuration."," They govern how quickly a license change takes effect and how long the engine tolerates a Keygen outage — so they're tuned per tier rather than left to each deployment. If your environment needs a longer offline-grace window (intermittent connectivity, restricted egress), ",[914,915,917],"a",{"href":916},"\u002Fcontact","talk to us"," and we'll set it on your license.",[131,920,922],{"id":921},"troubleshooting","Troubleshooting",[60,924,925,931,942,954,960],{},[63,926,927,930],{},[48,928,929],{},"Startup fails: license missing \u002F invalid \u002F expired \u002F revoked."," StoatFlow hard-fails fast rather than running unlicensed. Check the key is set (precedence above) and current.",[63,932,933,938,939,85],{},[48,934,935,85],{},[70,936,937],{},"license key file has insecure permissions"," The key file must be owner-only — ",[70,940,941],{},"chmod 600 ~\u002F.stoatflow\u002Flicense.key",[63,943,944,947,948,950,951,953],{},[48,945,946],{},"Production refuses to start without an environment."," Set ",[70,949,128],{}," (or ",[70,952,425],{},") explicitly — Production won't auto-generate one.",[63,955,956,959],{},[48,957,958],{},"Brief Keygen outage."," The runtime keeps serving from its offline cache for the grace window, then fails on the next check. Normal restarts within the window are fine.",[63,961,962,965],{},[48,963,964],{},"Lost your key or token?"," We re-issue rather than retrieve — reply to your onboarding email and we'll rotate it.",[131,967,969],{"id":968},"next-steps","Next steps",[60,971,972,979],{},[63,973,974,978],{},[48,975,976],{},[914,977,28],{"href":29}," — how the engine runs your topology.",[63,980,981,982,85],{},"Questions about your license tier or seats? ",[914,983,984],{"href":916},"Get in touch",[986,987,988],"style",{},"html pre.shiki code .s8zF2, html code.shiki .s8zF2{--shiki-default:#A0ADA0}html pre.shiki code .si04Y, html code.shiki .si04Y{--shiki-default:#AB5959}html pre.shiki code .svycV, html code.shiki .svycV{--shiki-default:#B07D48}html pre.shiki code .sYZai, html code.shiki .sYZai{--shiki-default:#999999}html pre.shiki code .sSP4y, html code.shiki .sSP4y{--shiki-default:#B5695977}html pre.shiki code .spphp, html code.shiki .spphp{--shiki-default:#B56959}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 .sySUi, html code.shiki .sySUi{--shiki-default:#59873A}html pre.shiki code .sEi1f, html code.shiki .sEi1f{--shiki-default:#A65E2B}html pre.shiki code .su6XF, html code.shiki .su6XF{--shiki-default:#998418}html pre.shiki code .s-TwI, html code.shiki .s-TwI{--shiki-default:#2F798A}",{"title":224,"searchDepth":238,"depth":238,"links":990},[991,992,993,994,995,996,997],{"id":133,"depth":238,"text":134},{"id":378,"depth":238,"text":379},{"id":461,"depth":238,"text":438},{"id":565,"depth":238,"text":566},{"id":737,"depth":238,"text":738},{"id":921,"depth":238,"text":922},{"id":968,"depth":238,"text":969},"Configure your StoatFlow license key for local development and CI\u002FCD — environment variables, system properties, key files, and application.yaml.","md",{},{"icon":21},{"title":18,"description":998},"BZGXt5wqQPblXOEwMZ_7vhQB1gKQDvlzBDNOof8-bSI",[1005,1007],{"title":13,"path":14,"stem":15,"description":1006,"icon":16,"children":-1},"Add the private StoatFlow Maven repository, pull the dependency, and set up your Gradle or Maven build.",{"title":23,"path":24,"stem":25,"description":1008,"icon":26,"children":-1},"Build and run a complete word-count stream processor on the StoatFlow runtime — in Kotlin or Java.",1780332013456]