[{"data":1,"prerenderedAt":734},["ShallowReactive",2],{"navigation_docs":3,"-architecture-monorepo-nx":222,"-architecture-monorepo-nx-surround":729},[4,25,46,89,131,170,206],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":24},"Overview","i-lucide-house","\u002Fgetting-started","1.getting-started",[10,14,19],{"title":11,"path":12,"stem":13,"icon":6},"Introduction","\u002Fgetting-started\u002Fintroduction","1.getting-started\u002F2.introduction",{"title":15,"path":16,"stem":17,"icon":18},"Installation","\u002Fgetting-started\u002Finstallation","1.getting-started\u002F3.installation","i-lucide-download",{"title":20,"path":21,"stem":22,"icon":23},"Project structure","\u002Fgetting-started\u002Fproject-structure","1.getting-started\u002F4.project-structure","i-lucide-folder-tree",false,{"title":26,"icon":27,"path":28,"stem":29,"children":30,"page":24},"Architecture","i-lucide-cpu","\u002Farchitecture","3.architecture",[31,36,41],{"title":32,"path":33,"stem":34,"icon":35},"Core, themes, and apps","\u002Farchitecture\u002Foverview","3.architecture\u002F1.overview","i-lucide-layers",{"title":37,"path":38,"stem":39,"icon":40},"Monorepo & Nx Task Runner","\u002Farchitecture\u002Fmonorepo-nx","3.architecture\u002F2.monorepo-nx","i-lucide-box",{"title":42,"path":43,"stem":44,"icon":45},"Kits and extension modules","\u002Farchitecture\u002Fkits","3.architecture\u002F3.kits","i-lucide-puzzle",{"title":47,"icon":48,"path":49,"stem":50,"children":51,"page":24},"Apps","i-lucide-app-window","\u002Fapps","4.apps",[52,56,60,65,69,74,79,84],{"title":5,"path":53,"stem":54,"icon":55},"\u002Fapps\u002Foverview","4.apps\u002F1.overview","i-lucide-info",{"title":57,"path":58,"stem":59,"icon":23},"Package layout","\u002Fapps\u002Fpackage-layout","4.apps\u002F2.package-layout",{"title":61,"path":62,"stem":63,"icon":64},"Create from scratch","\u002Fapps\u002Fcreate-from-scratch","4.apps\u002F3.create-from-scratch","i-lucide-list-checks",{"title":66,"path":67,"stem":68,"icon":45},"Module and runtime","\u002Fapps\u002Fmodule-and-runtime","4.apps\u002F4.module-and-runtime",{"title":70,"path":71,"stem":72,"icon":73},"Plugins","\u002Fapps\u002Fplugins","4.apps\u002F5.plugins","i-lucide-plug",{"title":75,"path":76,"stem":77,"icon":78},"Windows and commands","\u002Fapps\u002Fwindows-and-commands","4.apps\u002F6.windows-and-commands","i-lucide-layout-panel-top",{"title":80,"path":81,"stem":82,"icon":83},"Playground","\u002Fapps\u002Fplayground","4.apps\u002F7.playground","i-lucide-flask-conical",{"title":85,"path":86,"stem":87,"icon":88},"Build and publish","\u002Fapps\u002Fbuild-and-publish","4.apps\u002F8.build-and-publish","i-lucide-package",{"title":90,"icon":91,"path":92,"stem":93,"children":94,"page":24},"Themes","i-lucide-palette","\u002Fthemes","5.themes",[95,98,103,107,111,116,121,126],{"title":5,"path":96,"stem":97,"icon":55},"\u002Fthemes\u002Foverview","5.themes\u002F1.overview",{"title":99,"path":100,"stem":101,"icon":102},"Theme anatomy","\u002Fthemes\u002Ftheme-anatomy","5.themes\u002F2.theme-anatomy","i-lucide-component",{"title":104,"path":105,"stem":106},"Create From Scratch","\u002Fthemes\u002Fcreate-from-scratch","5.themes\u002F3.create-from-scratch",{"title":108,"path":109,"stem":110,"icon":73},"Theme plugins","\u002Fthemes\u002Fplugins","5.themes\u002F4.plugins",{"title":112,"path":113,"stem":114,"icon":115},"Styling and Tailwind","\u002Fthemes\u002Fstyling-and-tailwind","5.themes\u002F5.styling-and-tailwind","i-lucide-brush",{"title":117,"path":118,"stem":119,"icon":120},"Pages and boot flow","\u002Fthemes\u002Fpages-and-boot-flow","5.themes\u002F6.pages-and-boot-flow","i-lucide-power",{"title":122,"path":123,"stem":124,"icon":125},"Theme and optional modules","\u002Fthemes\u002Ftheme-and-optional-modules","5.themes\u002F7.theme-and-optional-modules","i-lucide-link",{"title":127,"path":128,"stem":129,"icon":130},"Window chrome and nav buttons","\u002Fthemes\u002Fwindow-chrome-and-nav-buttons","5.themes\u002F8.window-chrome-and-nav-buttons","i-lucide-square-mouse-pointer",{"title":132,"icon":133,"path":134,"stem":135,"children":136,"page":24},"Client & CLI","i-lucide-terminal","\u002Fsetup","6.setup",[137,141,146,151,156,161,166],{"title":138,"path":139,"stem":140,"icon":133},"desktop CLI","\u002Fsetup\u002Fdesktop-cli","6.setup\u002F1.desktop-cli",{"title":142,"path":143,"stem":144,"icon":145},"Package linking","\u002Fsetup\u002Fpackage-linking","6.setup\u002F2.package-linking","i-lucide-link-2",{"title":147,"path":148,"stem":149,"icon":150},"Monorepo and workspace","\u002Fsetup\u002Fmonorepo-workspace","6.setup\u002F3.monorepo-workspace","i-lucide-blocks",{"title":152,"path":153,"stem":154,"icon":155},"desktop.config.ts","\u002Fsetup\u002Fdesktop-config","6.setup\u002F4.desktop-config","i-lucide-file-code",{"title":157,"path":158,"stem":159,"icon":160},"Migrate themes, apps, and modules (3.3.2)","\u002Fsetup\u002Fmigrate-packages-3.3.2","6.setup\u002F5.migrate-packages-3.3.2","i-lucide-arrow-right-left",{"title":162,"path":163,"stem":164,"icon":165},"Migrate themes, apps, and modules (3.4)","\u002Fsetup\u002Fmigrate-packages-3.4","6.setup\u002F6.migrate-packages-3.4","i-lucide-arrow-up-right",{"title":167,"path":168,"stem":169},"Troubleshooting","\u002Fsetup\u002Ftroubleshooting","6.setup\u002F7.troubleshooting",{"title":171,"icon":172,"path":173,"stem":174,"children":175,"page":24},"Internals","i-lucide-book-open","\u002Finternals","7.internals",[176,181,186,191,196,201],{"title":177,"path":178,"stem":179,"icon":180},"Boot sequence","\u002Finternals\u002Fboot-sequence","7.internals\u002F1.boot-sequence","i-lucide-list-ordered",{"title":182,"path":183,"stem":184,"icon":185},"Stores and composables","\u002Finternals\u002Fstores-and-composables","7.internals\u002F2.stores-and-composables","i-lucide-database",{"title":187,"path":188,"stem":189,"icon":190},"Core components","\u002Finternals\u002Fcore-components","7.internals\u002F3.core-components","i-lucide-layout-grid",{"title":192,"path":193,"stem":194,"icon":195},"Dialog provider","\u002Finternals\u002Fdialog-provider","7.internals\u002F4.dialog-provider","i-lucide-message-square",{"title":197,"path":198,"stem":199,"icon":200},"Kernel contract","\u002Finternals\u002Fkernel-contract","7.internals\u002F5.kernel-contract","i-lucide-shield-check",{"title":202,"path":203,"stem":204,"icon":205},"Shell identity","\u002Finternals\u002Fshell-identity","7.internals\u002F6.shell-identity","i-lucide-user",{"title":207,"icon":208,"path":209,"stem":210,"children":211,"page":24},"Reference","i-lucide-book-marked","\u002Freference","8.reference",[212,217],{"title":213,"path":214,"stem":215,"icon":216},"Glossary","\u002Freference\u002Fglossary","8.reference\u002F1.glossary","i-lucide-book-a",{"title":218,"path":219,"stem":220,"icon":221},"Ecosystem","\u002Freference\u002Fuseful-links","8.reference\u002F2.useful-links","i-lucide-external-link",{"id":223,"title":37,"body":224,"description":721,"extension":722,"links":723,"meta":724,"navigation":725,"path":38,"seo":726,"stem":39,"__hash__":728},"docs\u002F3.architecture\u002F2.monorepo-nx.md",{"type":225,"value":226,"toc":707},"minimark",[227,240,243,248,256,342,357,359,363,369,374,385,391,466,480,484,490,494,497,515,518,520,528,534,538,559,563,566,662,666,680,703],[228,229,230,231,235,236,239],"p",{},"Open Web Desktop is managed as a monorepo using ",[232,233,234],"strong",{},"pnpm workspaces"," for package linking and dependency resolution, and ",[232,237,238],{},"Nx"," for task orchestration, caching, and release automation.",[241,242],"hr",{},[244,245,247],"h2",{"id":246},"_1-monorepo-structure-pnpm-workspaces","1. Monorepo Structure & pnpm Workspaces",[228,249,250,251,255],{},"All internal packages, modules, themes, and applications live in a single repository. The linking between these packages is defined in ",[252,253,254],"code",{},"pnpm-workspace.yaml",":",[257,258,263],"pre",{"className":259,"code":260,"language":261,"meta":262,"style":262},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","packages:\n  - 'packages\u002F*'\n  - 'apps\u002F*'\n  - 'themes\u002F*'\n  - 'desktop'\n  - 'docs'\n","yaml","",[252,264,265,278,294,306,318,330],{"__ignoreMap":262},[266,267,270,274],"span",{"class":268,"line":269},"line",1,[266,271,273],{"class":272},"swJcz","packages",[266,275,277],{"class":276},"sMK4o",":\n",[266,279,281,284,287,291],{"class":268,"line":280},2,[266,282,283],{"class":276},"  -",[266,285,286],{"class":276}," '",[266,288,290],{"class":289},"sfazB","packages\u002F*",[266,292,293],{"class":276},"'\n",[266,295,297,299,301,304],{"class":268,"line":296},3,[266,298,283],{"class":276},[266,300,286],{"class":276},[266,302,303],{"class":289},"apps\u002F*",[266,305,293],{"class":276},[266,307,309,311,313,316],{"class":268,"line":308},4,[266,310,283],{"class":276},[266,312,286],{"class":276},[266,314,315],{"class":289},"themes\u002F*",[266,317,293],{"class":276},[266,319,321,323,325,328],{"class":268,"line":320},5,[266,322,283],{"class":276},[266,324,286],{"class":276},[266,326,327],{"class":289},"desktop",[266,329,293],{"class":276},[266,331,333,335,337,340],{"class":268,"line":332},6,[266,334,283],{"class":276},[266,336,286],{"class":276},[266,338,339],{"class":289},"docs",[266,341,293],{"class":276},[228,343,344,345,348,349,352,353,356],{},"Using pnpm workspaces allows packages to refer to each other locally (e.g., using ",[252,346,347],{},"workspace:*"," in ",[252,350,351],{},"package.json","). During development, changes in ",[252,354,355],{},"@owdproject\u002Fcore"," are instantly available inside local apps and themes without needing to publish to npm.",[241,358],{},[244,360,362],{"id":361},"_2-nx-task-orchestration","2. Nx Task Orchestration",[228,364,365,366,368],{},"While pnpm links the folders, ",[232,367,238],{}," coordinates running scripts and build pipelines across the monorepo.",[370,371,373],"h3",{"id":372},"dependency-task-pipelines","Dependency Task Pipelines",[228,375,376,377,380,381,384],{},"Instead of manually building dependencies, Nx understands how packages relate to each other. We define pipelines inside the root ",[252,378,379],{},"nx.json"," under ",[252,382,383],{},"targetDefaults",".",[228,386,387,388,390],{},"For example, when running a test or build on a theme, Nx knows that ",[252,389,355],{}," must be built first. It automatically runs the core module compilation in the correct order:",[257,392,396],{"className":393,"code":394,"language":395,"meta":262,"style":262},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\"targetDefaults\": {\n  \"test\": {\n    \"dependsOn\": [\"^build\"]\n  }\n}\n","json",[252,397,398,414,430,456,461],{"__ignoreMap":262},[266,399,400,403,405,407,411],{"class":268,"line":269},[266,401,402],{"class":276},"\"",[266,404,383],{"class":289},[266,406,402],{"class":276},[266,408,410],{"class":409},"sTEyZ",": ",[266,412,413],{"class":276},"{\n",[266,415,416,419,423,425,427],{"class":268,"line":280},[266,417,418],{"class":276},"  \"",[266,420,422],{"class":421},"spNyl","test",[266,424,402],{"class":276},[266,426,255],{"class":276},[266,428,429],{"class":276}," {\n",[266,431,432,435,439,441,443,446,448,451,453],{"class":268,"line":296},[266,433,434],{"class":276},"    \"",[266,436,438],{"class":437},"sBMFI","dependsOn",[266,440,402],{"class":276},[266,442,255],{"class":276},[266,444,445],{"class":276}," [",[266,447,402],{"class":276},[266,449,450],{"class":289},"^build",[266,452,402],{"class":276},[266,454,455],{"class":276},"]\n",[266,457,458],{"class":268,"line":308},[266,459,460],{"class":276},"  }\n",[266,462,463],{"class":268,"line":320},[266,464,465],{"class":276},"}\n",[228,467,468],{},[469,470,471,472,475,476,479],"em",{},"(The ",[252,473,474],{},"^"," symbol specifies that the task depends on the ",[252,477,478],{},"build"," target of all upstream dependencies).",[370,481,483],{"id":482},"local-task-caching","Local Task Caching",[228,485,486,487,384],{},"Nx caches the output of successful builds, lints, and tests. If you run a build or test command on a package and the code has not changed, Nx restores the output from the cache in ",[232,488,489],{},"0 milliseconds",[370,491,493],{"id":492},"visualizing-the-workspace-graph","Visualizing the Workspace Graph",[228,495,496],{},"You can inspect how all packages, modules, themes, and apps are connected by running:",[257,498,502],{"className":499,"code":500,"language":501,"meta":262,"style":262},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","pnpm nx graph\n","bash",[252,503,504],{"__ignoreMap":262},[266,505,506,509,512],{"class":268,"line":269},[266,507,508],{"class":437},"pnpm",[266,510,511],{"class":289}," nx",[266,513,514],{"class":289}," graph\n",[228,516,517],{},"This launches an interactive browser graph showing OWD's dependency tree.",[241,519],{},[244,521,523,524,527],{"id":522},"_3-automated-releases-nx-release","3. Automated Releases (",[252,525,526],{},"nx release",")",[228,529,530,531,533],{},"OWD uses ",[252,532,526],{}," to orchestrate independent version bumps, autogenerate changelogs, create Git tags, and automate npm publishing.",[370,535,537],{"id":536},"versioning-model","Versioning Model",[228,539,540,541,544,545,547,548,551,552,554,555,558],{},"OWD uses an ",[232,542,543],{},"independent versioning model"," (configured in ",[252,546,379],{}," under the ",[252,549,550],{},"release"," block). This means different packages (e.g., ",[252,553,355],{},", ",[252,556,557],{},"@owdproject\u002Fcli",", or themes) can be versioned and published independently.",[370,560,562],{"id":561},"running-a-release-maintainers","Running a Release (Maintainers)",[228,564,565],{},"When you are ready to prepare a release:",[567,568,569,591,614,634],"ol",{},[570,571,572,575,576,583,584,554,587,590],"li",{},[232,573,574],{},"Commit your changes"," using ",[577,578,582],"a",{"href":579,"rel":580},"https:\u002F\u002Fwww.conventionalcommits.org\u002F",[581],"nofollow","Conventional Commits"," (e.g. ",[252,585,586],{},"feat: add new window snapping",[252,588,589],{},"fix: resolve drag bounds offset",").",[570,592,593,596,597],{},[232,594,595],{},"Run a Dry Run:"," Inspect what version bumps and changelog updates Nx will generate without writing changes:\n",[257,598,600],{"className":499,"code":599,"language":501,"meta":262,"style":262},"pnpm nx release --dry-run\n",[252,601,602],{"__ignoreMap":262},[266,603,604,606,608,611],{"class":268,"line":269},[266,605,508],{"class":437},[266,607,511],{"class":289},[266,609,610],{"class":289}," release",[266,612,613],{"class":289}," --dry-run\n",[570,615,616,619,620],{},[232,617,618],{},"Execute the Release:"," Bump versions, update changelogs, commit, and create Git tags locally:\n",[257,621,623],{"className":499,"code":622,"language":501,"meta":262,"style":262},"pnpm nx release\n",[252,624,625],{"__ignoreMap":262},[266,626,627,629,631],{"class":268,"line":269},[266,628,508],{"class":437},[266,630,511],{"class":289},[266,632,633],{"class":289}," release\n",[570,635,636,639,640],{},[232,637,638],{},"Push the Tags:"," Push your commits and tags to GitHub:\n",[257,641,643],{"className":499,"code":642,"language":501,"meta":262,"style":262},"git push origin main --tags\n",[252,644,645],{"__ignoreMap":262},[266,646,647,650,653,656,659],{"class":268,"line":269},[266,648,649],{"class":437},"git",[266,651,652],{"class":289}," push",[266,654,655],{"class":289}," origin",[266,657,658],{"class":289}," main",[266,660,661],{"class":289}," --tags\n",[370,663,665],{"id":664},"github-actions-publishing","GitHub Actions Publishing",[228,667,668,669,583,672,675,676,679],{},"Once you push a tag starting with ",[252,670,671],{},"v*",[252,673,674],{},"v3.4.2","), our GitHub Action workflow ",[252,677,678],{},".github\u002Fworkflows\u002Fpublish.yml"," automatically triggers. It will:",[681,682,683,686,692],"ul",{},[570,684,685],{},"Run linting and test suites.",[570,687,688,689,691],{},"Build ",[252,690,355],{}," and other packages.",[570,693,694,695,698,699,702],{},"Run ",[252,696,697],{},"pnpm publish -r --no-git-checks --access public"," to publish the updated packages to npm using a secure ",[252,700,701],{},"NPM_TOKEN"," repository secret.",[704,705,706],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}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 .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}",{"title":262,"searchDepth":280,"depth":280,"links":708},[709,710,715],{"id":246,"depth":280,"text":247},{"id":361,"depth":280,"text":362,"children":711},[712,713,714],{"id":372,"depth":296,"text":373},{"id":482,"depth":296,"text":483},{"id":492,"depth":296,"text":493},{"id":522,"depth":280,"text":716,"children":717},"3. Automated Releases (nx release)",[718,719,720],{"id":536,"depth":296,"text":537},{"id":561,"depth":296,"text":562},{"id":664,"depth":296,"text":665},"How pnpm workspaces and Nx coordinate tasks, caching, and automated releases in the OWD monorepo.","md",null,{},{"icon":40},{"title":37,"description":727},"Deep dive on OWD's workspace structure, task pipelines, caching, and release orchestration.","RjTpfie_q3qIIGQCvqqjeOJ11G2N4XOLIqT9miH2VA4",[730,732],{"title":32,"path":33,"stem":34,"description":731,"icon":35,"children":-1},"How Open Web Desktop is layered so you can ship any “OS” UI while staying agnostic at the engine level.",{"title":42,"path":43,"stem":44,"description":733,"icon":45,"children":-1},"core shell\u002Fexplorer, kit-primevue, module-fs, and deprecated kits.",1782428929620]