[{"data":1,"prerenderedAt":667},["ShallowReactive",2],{"navigation_docs":3,"-decisions":223,"-decisions-surround":662},[4,26,96,105,202],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":25},"Getting started","i-lucide-rocket","\u002Fgetting-started","1.getting-started",[10,15,20],{"title":11,"path":12,"stem":13,"icon":14},"Installation","\u002Fgetting-started\u002Finstallation","1.getting-started\u002F1.installation","i-lucide-download",{"title":16,"path":17,"stem":18,"icon":19},"The first app","\u002Fgetting-started\u002Ffirst-app","1.getting-started\u002F2.first-app","i-lucide-play",{"title":21,"path":22,"stem":23,"icon":24},"The first test","\u002Fgetting-started\u002Ffirst-test","1.getting-started\u002F3.first-test","i-lucide-flask-conical",false,{"title":27,"icon":28,"path":29,"stem":30,"children":31,"page":25},"Guide","i-lucide-book-open","\u002Fguide","2.guide",[32,37,42,47,52,57,62,67,72,77,81,86,91],{"title":33,"path":34,"stem":35,"icon":36},"Components","\u002Fguide\u002Fcomponents","2.guide\u002F01.components","i-lucide-component",{"title":38,"path":39,"stem":40,"icon":41},"Inputs and forms","\u002Fguide\u002Finputs-and-forms","2.guide\u002F02.inputs-and-forms","i-lucide-text-cursor-input",{"title":43,"path":44,"stem":45,"icon":46},"Scrolling and viewports","\u002Fguide\u002Fscrolling","2.guide\u002F03.scrolling","i-lucide-scroll-text",{"title":48,"path":49,"stem":50,"icon":51},"Overlays and layers","\u002Fguide\u002Foverlays","2.guide\u002F04.overlays","i-lucide-layers",{"title":53,"path":54,"stem":55,"icon":56},"Styles and theme","\u002Fguide\u002Fstyles","2.guide\u002F05.styles","i-lucide-palette",{"title":58,"path":59,"stem":60,"icon":61},"Composables","\u002Fguide\u002Fcomposables","2.guide\u002F06.composables","i-lucide-puzzle",{"title":63,"path":64,"stem":65,"icon":66},"Widgets","\u002Fguide\u002Fwidgets","2.guide\u002F07.widgets","i-lucide-blocks",{"title":68,"path":69,"stem":70,"icon":71},"The assistant","\u002Fguide\u002Fassistant","2.guide\u002F08.assistant","i-lucide-message-square",{"title":73,"path":74,"stem":75,"icon":76},"The same app on the web","\u002Fguide\u002Fweb","2.guide\u002F09.web","i-lucide-globe",{"title":78,"path":79,"stem":80,"icon":24},"Testing","\u002Fguide\u002Ftesting","2.guide\u002F10.testing",{"title":82,"path":83,"stem":84,"icon":85},"Running and packaging","\u002Fguide\u002Fpackaging","2.guide\u002F11.packaging","i-lucide-package",{"title":87,"path":88,"stem":89,"icon":90},"The terminal contract","\u002Fguide\u002Fterminal","2.guide\u002F12.terminal","i-lucide-square-terminal",{"title":92,"path":93,"stem":94,"icon":95},"Benchmarks","\u002Fguide\u002Fbenchmarks","2.guide\u002F13.benchmarks","i-lucide-gauge",{"title":97,"icon":98,"path":99,"stem":100,"children":101,"page":25},"AI and agents","i-lucide-bot","\u002Fai","3.ai",[102],{"title":97,"path":103,"stem":104,"icon":98},"\u002Fai\u002Fagents","3.ai\u002F1.agents",{"title":106,"icon":107,"path":108,"stem":109,"children":110},"Decisions","i-lucide-scale","\u002Fdecisions","4.decisions",[111,114,118,122,126,130,134,138,142,146,150,154,158,162,166,170,174,178,182,186,190,194,198],{"title":112,"path":108,"stem":113,"icon":46},"All decisions","4.decisions\u002Findex",{"title":115,"path":116,"stem":117},"0001. kyo-ui is the DSL","\u002Fdecisions\u002F0001-kyo-ui-is-the-dsl","4.decisions\u002F0001-kyo-ui-is-the-dsl",{"title":119,"path":120,"stem":121},"0002. jatatui renders the cells","\u002Fdecisions\u002F0002-jatatui-renders-the-cells","4.decisions\u002F0002-jatatui-renders-the-cells",{"title":123,"path":124,"stem":125},"0003. Pin Kyo 1.0.0-RC7 and JDK 25","\u002Fdecisions\u002F0003-pin-kyo-rc7-and-jdk-25","4.decisions\u002F0003-pin-kyo-rc7-and-jdk-25",{"title":127,"path":128,"stem":129},"0004. Public Kyo APIs only","\u002Fdecisions\u002F0004-public-kyo-apis-only","4.decisions\u002F0004-public-kyo-apis-only",{"title":131,"path":132,"stem":133},"0005. A SOFT frame contract and an own watcher loop","\u002Fdecisions\u002F0005-soft-frame-contract-and-own-watcher-loop","4.decisions\u002F0005-soft-frame-contract-and-own-watcher-loop",{"title":135,"path":136,"stem":137},"0006. Purity: edge files, lint and a pure painter","\u002Fdecisions\u002F0006-purity-edge-files-and-lint","4.decisions\u002F0006-purity-edge-files-and-lint",{"title":139,"path":140,"stem":141},"0007. Compiler flags from sbt-tpolecat","\u002Fdecisions\u002F0007-compiler-flags-from-sbt-tpolecat","4.decisions\u002F0007-compiler-flags-from-sbt-tpolecat",{"title":143,"path":144,"stem":145},"0008. The artifact split: runner, app, testkit and core","\u002Fdecisions\u002F0008-artifact-split-runner-app-testkit-core","4.decisions\u002F0008-artifact-split-runner-app-testkit-core",{"title":147,"path":148,"stem":149},"0009. tui4s-use and tui4s-widgets, cross-built","\u002Fdecisions\u002F0009-use-and-widgets-cross-built","4.decisions\u002F0009-use-and-widgets-cross-built",{"title":151,"path":152,"stem":153},"0010. The flagship assistant is the blueprint of a real app","\u002Fdecisions\u002F0010-the-flagship-assistant-as-blueprint","4.decisions\u002F0010-the-flagship-assistant-as-blueprint",{"title":155,"path":156,"stem":157},"0011. The web target: a standalone Scala.js app and one theme","\u002Fdecisions\u002F0011-web-target-standalone-scalajs-and-one-theme","4.decisions\u002F0011-web-target-standalone-scalajs-and-one-theme",{"title":159,"path":160,"stem":161},"0012. The documentation is example-first","\u002Fdecisions\u002F0012-documentation-is-example-first","4.decisions\u002F0012-documentation-is-example-first",{"title":163,"path":164,"stem":165},"0013. Benchmarks in the repository, with their own build","\u002Fdecisions\u002F0013-benchmarks-in-repo-with-own-build","4.decisions\u002F0013-benchmarks-in-repo-with-own-build",{"title":167,"path":168,"stem":169},"0014. Release per module, by tag, as 0.1.0-RC1","\u002Fdecisions\u002F0014-release-per-module-tags-and-rc1","4.decisions\u002F0014-release-per-module-tags-and-rc1",{"title":171,"path":172,"stem":173},"0015. Packaging: the AOT cache in the start scripts, native-image as an option","\u002Fdecisions\u002F0015-packaging-aot-cache-and-native-image","4.decisions\u002F0015-packaging-aot-cache-and-native-image",{"title":175,"path":176,"stem":177},"0016. Process: lean mode and agent roles","\u002Fdecisions\u002F0016-process-lean-mode-and-agent-roles","4.decisions\u002F0016-process-lean-mode-and-agent-roles",{"title":179,"path":180,"stem":181},"0017. Deferred: templates, mouse, the kitty keyboard protocol and Windows","\u002Fdecisions\u002F0017-deferred-templates-mouse-and-kitty","4.decisions\u002F0017-deferred-templates-mouse-and-kitty",{"title":183,"path":184,"stem":185},"0018. pini4s is a vendored Git submodule","\u002Fdecisions\u002F0018-pini4s-as-a-vendored-submodule","4.decisions\u002F0018-pini4s-as-a-vendored-submodule",{"title":187,"path":188,"stem":189},"0019. Upstream issues are drafts that the user posts","\u002Fdecisions\u002F0019-upstream-kyo-issues-as-drafts","4.decisions\u002F0019-upstream-kyo-issues-as-drafts",{"title":191,"path":192,"stem":193},"0020. Release from the Actions form","\u002Fdecisions\u002F0020-release-from-the-actions-form","4.decisions\u002F0020-release-from-the-actions-form",{"title":195,"path":196,"stem":197},"0021. The rulebook is CONTRIBUTING.md","\u002Fdecisions\u002F0021-the-rulebook-is-contributing-md","4.decisions\u002F0021-the-rulebook-is-contributing-md",{"title":199,"path":200,"stem":201},"0022. The logo is text","\u002Fdecisions\u002F0022-the-logo-is-text","4.decisions\u002F0022-the-logo-is-text",{"title":203,"icon":204,"path":205,"stem":206,"children":207,"page":25},"Project","i-lucide-compass","\u002Fproject","5.project",[208,213,218],{"title":209,"path":210,"stem":211,"icon":212},"Roadmap","\u002Fproject\u002Froadmap","5.project\u002F1.roadmap","i-lucide-map",{"title":214,"path":215,"stem":216,"icon":217},"Contributing","\u002Fproject\u002Fcontributing","5.project\u002F2.contributing","i-lucide-git-pull-request",{"title":219,"path":220,"stem":221,"icon":222},"Security","\u002Fproject\u002Fsecurity","5.project\u002F3.security","i-lucide-shield",{"id":224,"title":225,"body":226,"description":655,"extension":656,"links":657,"meta":658,"navigation":659,"path":108,"seo":660,"stem":113,"__hash__":661},"docs\u002F4.decisions\u002Findex.md","Architecture decision records",{"type":227,"value":228,"toc":651},"minimark",[229,233,648],[230,231,232],"p",{},"Each record states one decision: the forces, the decision, the alternatives that lost, and the consequences. The ids in the references (D-1 to D-32, D1 to D25, S1 to S8, K29, RR N9) are the ids of the working notes of the project, which are not in the repository. The ADRs keep what a reader needs from them.",[234,235,236,255],"table",{},[237,238,239],"thead",{},[240,241,242,246,249,252],"tr",{},[243,244,245],"th",{},"#",[243,247,248],{},"Title",[243,250,251],{},"Status",[243,253,254],{},"Decision in one line",[256,257,258,276,291,306,326,341,356,375,398,413,428,447,462,480,499,518,533,549,569,584,607,633],"tbody",{},[240,259,260,267,270,273],{},[261,262,263],"td",{},[264,265,266],"a",{"href":116},"0001",[261,268,269],{},"kyo-ui is the DSL",[261,271,272],{},"Accepted",[261,274,275],{},"tui4s has no UI DSL: kyo-ui describes the screen, and tui4s is its terminal runner.",[240,277,278,283,286,288],{},[261,279,280],{},[264,281,282],{"href":120},"0002",[261,284,285],{},"jatatui renders the cells",[261,287,272],{},[261,289,290],{},"jatatui 0.31.0 and its crossterm JNI are the backend; tui-scala never goes on the classpath.",[240,292,293,298,301,303],{},[261,294,295],{},[264,296,297],{"href":124},"0003",[261,299,300],{},"Pin Kyo 1.0.0-RC7 and JDK 25",[261,302,272],{},[261,304,305],{},"Kyo and kyo-ui stay at RC7 for 0.1, on JDK 25; a tasty-query guard pins what the runner reads.",[240,307,308,313,316,318],{},[261,309,310],{},[264,311,312],{"href":128},"0004",[261,314,315],{},"Public Kyo APIs only",[261,317,272],{},[261,319,320,321,325],{},"No ",[322,323,324],"code",{},"private[kyo]"," member and no reflection; the runner copies private rules and the guard pins them.",[240,327,328,333,336,338],{},[261,329,330],{},[264,331,332],{"href":132},"0005",[261,334,335],{},"A SOFT frame contract and an own watcher loop",[261,337,272],{},[261,339,340],{},"One frame per event, 0 splits with no load, at most 1 per 10 000 under load; own watcher loop and a 1 s repair tick.",[240,342,343,348,351,353],{},[261,344,345],{},[264,346,347],{"href":136},"0006",[261,349,350],{},"Purity: edge files, lint and a pure painter",[261,352,272],{},[261,354,355],{},"Impure code only in 9 edge files and 15 KEEP sites, checked by scalafix; a pure painter, a release stack, a fiber gauge.",[240,357,358,363,366,368],{},[261,359,360],{},[264,361,362],{"href":140},"0007",[261,364,365],{},"Compiler flags from sbt-tpolecat",[261,367,272],{},[261,369,370,371,374],{},"Warnings stay warnings on a developer machine; CI adds ",[322,372,373],{},"-Werror",".",[240,376,377,382,385,387],{},[261,378,379],{},[264,380,381],{"href":144},"0008",[261,383,384],{},"The artifact split: runner, app, testkit and core",[261,386,272],{},[261,388,389,390,393,394,397],{},"Four artifacts in one repository and the same packages; ",[322,391,392],{},"tui4s-core"," is the composite; ",[322,395,396],{},"tui4s.internal"," is sealed.",[240,399,400,405,408,410],{},[261,401,402],{},[264,403,404],{"href":148},"0009",[261,406,407],{},"tui4s-use and tui4s-widgets, cross-built",[261,409,272],{},[261,411,412],{},"Composables and widgets are plain kyo-ui for the JVM and Scala.js, with no dependency on the core.",[240,414,415,420,423,425],{},[261,416,417],{},[264,418,419],{"href":152},"0010",[261,421,422],{},"The flagship assistant is the blueprint of a real app",[261,424,272],{},[261,426,427],{},"One AI chat app shows the app structure; API keys only; no redirects; no CLI backend in published code.",[240,429,430,435,438,440],{},[261,431,432],{},[264,433,434],{"href":156},"0011",[261,436,437],{},"The web target: a standalone Scala.js app and one theme",[261,439,272],{},[261,441,442,443,446],{},"The web app is static Scala.js from the shared module, with no server; one ",[322,444,445],{},"Theme"," gives both looks.",[240,448,449,454,457,459],{},[261,450,451],{},[264,452,453],{"href":160},"0012",[261,455,456],{},"The documentation is example-first",[261,458,272],{},[261,460,461],{},"Every public API has a compiled example; doc blocks are tested regions; Docus on Vercel; no PRs in the program.",[240,463,464,469,472,474],{},[261,465,466],{},[264,467,468],{"href":164},"0013",[261,470,471],{},"Benchmarks in the repository, with their own build",[261,473,272],{},[261,475,476,479],{},[322,477,478],{},"bench\u002F"," has its own build; the headline is compactness, expressiveness, correctness and resources; performance on its own page.",[240,481,482,487,490,492],{},[261,483,484],{},[264,485,486],{"href":168},"0014",[261,488,489],{},"Release per module, by tag, as 0.1.0-RC1",[261,491,272],{},[261,493,494,495,498],{},"One tag per module, 0.1.0-RC1 while Kyo is RC, a human approves each release; zio, cats and ",[322,496,497],{},"useSignal"," go before 0.1. ADR 0020 changes the trigger.",[240,500,501,506,509,511],{},[261,502,503],{},[264,504,505],{"href":172},"0015",[261,507,508],{},"Packaging: the AOT cache in the start scripts, native-image as an option",[261,510,272],{},[261,512,513,514,517],{},"Start scripts have the flags and use the AOT cache after one run of ",[322,515,516],{},"bin\u002Faot-train","; the runner carries native-image metadata; a GraalVM CE smoke job in CI.",[240,519,520,525,528,530],{},[261,521,522],{},[264,523,524],{"href":176},"0016",[261,526,527],{},"Process: lean mode and agent roles",[261,529,272],{},[261,531,532],{},"Implementer, one reviewer, fixer; a skeptic only for concurrency and restore code; the notes leave the repository.",[240,534,535,540,543,546],{},[261,536,537],{},[264,538,539],{"href":180},"0017",[261,541,542],{},"Deferred: templates, mouse, the kitty keyboard protocol and Windows",[261,544,545],{},"Accepted (deferred)",[261,547,548],{},"No template interpolator, no mouse, no kitty flags and no supported Windows port in 0.1.",[240,550,551,556,559,562],{},[261,552,553],{},[264,554,555],{"href":184},"0018",[261,557,558],{},"pini4s is a vendored Git submodule",[261,560,561],{},"Accepted (one part proposed)",[261,563,564,565,568],{},"Optional keyed shared state in ",[322,566,567],{},"vendor\u002Fpini4s",", used only by the examples; a published artifact later.",[240,570,571,576,579,581],{},[261,572,573],{},[264,574,575],{"href":188},"0019",[261,577,578],{},"Upstream issues are drafts that the user posts",[261,580,272],{},[261,582,583],{},"The session drafts upstream issues; the user posts them; each bug has a workaround with a named exit.",[240,585,586,591,594,596],{},[261,587,588],{},[264,589,590],{"href":192},"0020",[261,592,593],{},"Release from the Actions form",[261,595,272],{},[261,597,598,599,602,603,606],{},"One run of the form on ",[322,600,601],{},"main"," checks everything before the tag, and one approval publishes all its modules in order; ",[322,604,605],{},"CHANGELOG.md"," gives the notes.",[240,608,609,614,617,619],{},[261,610,611],{},[264,612,613],{"href":196},"0021",[261,615,616],{},"The rulebook is CONTRIBUTING.md",[261,618,272],{},[261,620,621,624,625,628,629,632],{},[322,622,623],{},"CONTRIBUTING.md"," is the rulebook for humans and agents; ",[322,626,627],{},"ARCHITECTURE.md"," tells how the runner works; ",[322,630,631],{},"AGENTS.md"," is short and imports both.",[240,634,635,640,643,645],{},[261,636,637],{},[264,638,639],{"href":200},"0022",[261,641,642],{},"The logo is text",[261,644,272],{},[261,646,647],{},"The ASCII art of the maintainer is the logotype and its \"4\" is the isomark; one script makes all the logo assets from the text, and CI checks them.",[230,649,650],{},"Format: MADR-lite. Each record has the sections Status, Date, Context, Decision, Alternatives considered, Consequences and References. The text uses ASD-STE100. When a source does not record a reason, the record says \"not recorded\"; a reason that the record adds is marked PROPOSAL.",{"title":652,"searchDepth":653,"depth":653,"links":654},"",2,[],"The decisions that shaped tui4s, with the alternatives that lost and why.","md",null,{},{"title":112,"icon":46},{"title":225,"description":655},"YifiPcy0pgd7U2cgwwLgjmPxTjEcNTyckwVDt8SmcVQ",[663,665],{"title":97,"path":103,"stem":104,"description":664,"icon":98,"children":-1},"How an AI agent reads this documentation and works on the tui4s repository.",{"title":115,"path":116,"stem":117,"description":666,"children":-1},"tui4s has no UI DSL of its own: kyo-ui describes the screen, and tui4s is its terminal runner.",1792528755459]