[{"data":1,"prerenderedAt":460},["ShallowReactive",2],{"navigation_docs":3,"-decisions-0012-documentation-is-example-first":223,"-decisions-0012-documentation-is-example-first-surround":455},[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":159,"body":225,"description":448,"extension":449,"links":450,"meta":451,"navigation":452,"path":160,"seo":453,"stem":161,"__hash__":454},"docs\u002F4.decisions\u002F0012-documentation-is-example-first.md",{"type":226,"value":227,"toc":437},"minimark",[228,233,237,253,257,260,264,306,310,358,362,398,402,419,423],[229,230,232],"h2",{"id":231},"status","Status",[234,235,236],"p",{},"Accepted. The docs site landed on 2026-10-20 (L5).",[234,238,239,240,244,245,248,249,252],{},"The Vercel project is a human step: the session's connector could not create it. The docs workflow (",[241,242,243],"code",{},".github\u002Fworkflows\u002Fdocs.yml",") builds the site on each push to ",[241,246,247],{},"main"," and each pull request that changes ",[241,250,251],{},"docs\u002F",", and on demand.",[229,254,256],{"id":255},"date","Date",[234,258,259],{},"2026-10-19 (D17, D18; D11 host). The Docus choice is from 2026-09-30.",[229,261,263],{"id":262},"context","Context",[265,266,267,271,281,288,295,303],"ul",{},[268,269,270],"li",{},"The user reviews only the usage examples, in the code and outside it (D17: \"Documentation = usage examples\").",[268,272,273,276,277,280],{},[241,274,275],{},"ReadmeSuite"," already checks README blocks marked as regions against the example files. The README quick start is a region of ",[241,278,279],{},"examples\u002Fcounter\u002FCounter.scala",".",[268,282,283,284,287],{},"The branch ",[241,285,286],{},"docs\u002Fdocus"," (2026-10-01) predates kyo-ui. It describes the old DSL and claims ZIO and Cats Effect modules that do not exist.",[268,289,290,291,294],{},"The PTY kit (",[241,292,293],{},"examples\u002Fptycheck",") already drives every example in a pseudo-terminal, so it can record casts.",[268,296,297,298,302],{},"The web build of the assistant (",[299,300,301],"a",{"href":156},"ADR 0011",") can run in a page as a live demo.",[268,304,305],{},"The stacked pull requests of 2026-10-14 needed manual rebases and a GitHub stack merge that only the web UI could do.",[229,307,309],{"id":308},"decision","Decision",[265,311,312,315,326,341,344,347],{},[268,313,314],{},"Every public API ships with a compiled example: a snippet suite, a Scaladoc example, or a region of an example app.",[268,316,317,318,321,322,325],{},"README and docs code blocks are regions of compiled and tested files. ",[241,319,320],{},"MarkdownRegionsSuite"," checks the README and each page of ",[241,323,324],{},"docs\u002Fcontent"," (L5).",[268,327,328,329,331,332,334,335,337,338,340],{},"The docs site is Nuxt Docus in ",[241,330,251],{}," on ",[241,333,247],{},". Only ",[241,336,251],{}," is copied from ",[241,339,286],{},", and its text is rewritten; the branch is not merged.",[268,342,343],{},"The site leads with the examples, shows asciinema casts that the PTY kit records, and shows the web assistant in a frame with the fake provider.",[268,345,346],{},"The host is Vercel. The session creates the Vercel project when the docs land (D11). The domain is open.",[268,348,349,350,353,354,357],{},"No pull requests during the program (D18): all work lands on ",[241,351,352],{},"chore\u002Fcleanup-7p2rll","; CI runs on demand (",[241,355,356],{},"workflow_dispatch","). The user merges.",[229,359,361],{"id":360},"alternatives-considered","Alternatives considered",[265,363,364,371,377,383,392],{},[268,365,366,370],{},[367,368,369],"strong",{},"Prose-first docs."," Rejected by D17: the user reviews only the examples. The notes give no other reason.",[268,372,373,376],{},[367,374,375],{},"Scaladoc only."," Not recorded as an option. Scaladoc examples are one channel of D17, not the whole site.",[268,378,379,382],{},[367,380,381],{},"mdoc."," Not chosen: it compiles slower with Kyo macros, and its support of Scala 3.9.0 on JDK 25 is unverified. The region approach already exists.",[268,384,385,391],{},[367,386,387,388,390],{},"Merge the ",[241,389,286],{}," branch."," Rejected: stale, and it overclaims the ZIO and Cats Effect modules.",[268,393,394,397],{},[367,395,396],{},"One pull request per phase, stacked"," (the kyo-ui stack, PRs #10 to #16). Replaced by D18. D18 gives no reason. The handoff records the cost of the stack: on 2026-10-14 every branch had to be re-parented by hand before GitHub merged it.",[229,399,401],{"id":400},"consequences","Consequences",[265,403,404,407,410,413,416],{},[268,405,406],{},"Good: a snippet in the docs cannot drift from the code without a red test.",[268,408,409],{},"Good: the casts and the web demo come from the same code as the tests.",[268,411,412],{},"Bad: every public change needs an example; the cost is in each phase.",[268,414,415],{},"Bad: with no pull requests, review happens in the session's workflow (implementer, reviewer, fixer), not on GitHub.",[268,417,418],{},"Bad: the domain and the Vercel token owner are human steps.",[229,420,422],{"id":421},"references","References",[265,424,425,428,431],{},[268,426,427],{},"Decision log: first round (Docus on Vercel), sixteenth round (D17, D18, D11).",[268,429,430],{},"Roadmap: 2.6 (the stale docs branch), D11, section 5.",[268,432,433,434,436],{},"CONTRIBUTING.md: \"Daily commands\" (",[241,435,275],{},", the PTY kit). ",{"title":438,"searchDepth":439,"depth":439,"links":440},"",2,[441,442,443,444,445,446,447],{"id":231,"depth":439,"text":232},{"id":255,"depth":439,"text":256},{"id":262,"depth":439,"text":263},{"id":308,"depth":439,"text":309},{"id":360,"depth":439,"text":361},{"id":400,"depth":439,"text":401},{"id":421,"depth":439,"text":422},"Every public API ships with a compiled example; README and docs code blocks are regions of tested files; the docs site is Nuxt Docus on Vercel; work lands on one branch with CI on demand.","md",null,{},true,{"title":159,"description":448},"_o9eANlD6UBWb1oL-3OSBuH1zftmtglA8iYFav3BN3E",[456,458],{"title":155,"path":156,"stem":157,"description":457,"children":-1},"The web build of the assistant is a static Scala.js app from the shared module, with no server and no link to the terminal app; one Theme value renders both looks to one Stylesheet.",{"title":163,"path":164,"stem":165,"description":459,"children":-1},"The comparison lives in bench\u002F with its own sbt build and other languages in bench\u002Fimpl\u002F\u003Clanguage>; its headline is compactness, expressiveness, correctness and resource management, and performance is published honestly on its own page.",1792528756911]