[{"data":1,"prerenderedAt":2027},["ShallowReactive",2],{"cycle-doc-design-c130-research\u002Fnative-shell.md":3},{"cycle":4,"project":7,"path":10,"title":11,"toc":12,"ast":26},{"id":5,"title":6},"c130","Native App (program)",{"id":8,"label":9},"design","Design","research\u002Fnative-shell.md","Native Shell (nsh)",[13,14,15,16,17,18,19,20,21,22,23,24,25],"What it is","How it works","Targets","The CLI","Signed modules and capabilities","Embedding in a GPUI Kit app","Styling and theming","What 0.4.0 lacks, and what `main` adds","Footprint, as nsh reports it","When nsh is the better tool, and when not","What this means for c130","Open questions","Sources",{"type":27,"children":28},"root",[29,61,67,155,160,296,301,311,587,600,605,746,751,756,888,893,898,1022,1027,1202,1215,1235,1495,1500,1511,1592,1602,1620,1625,1633,1685,1693,1735,1740,1800,1805,1851,1856],{"type":30,"tag":31,"props":32,"children":33},"element","p",{},[34,41,43,50,52,59],{"type":30,"tag":35,"props":36,"children":37},"strong",{},[38],{"type":39,"value":40},"text","Use this file to",{"type":39,"value":42}," decide where Longbridge's second framework fits: not as our shell (D2 holds GPUI Kit), possibly as a signed-module host later (c133's trainings, c137's notices), and as the reference if phones or the web ever join the native app. It also records what nsh's unreleased ",{"type":30,"tag":44,"props":45,"children":47},"code",{"className":46},[],[48],{"type":39,"value":49},"main",{"type":39,"value":51}," branch is adding, because that is the direction Longbridge is taking both frameworks. Companion: ",{"type":30,"tag":53,"props":54,"children":56},"a",{"href":55},"\u002Fcycles\u002Fdesign\u002Fc130\u002Fdoc\u002Fresearch\u002Fgpui-kit",[57],{"type":39,"value":58},"gpui-kit.md",{"type":39,"value":60},". Every source below was read on 2026-11-09.",{"type":30,"tag":62,"props":63,"children":65},"h2",{"id":64},"what-it-is",[66],{"type":39,"value":13},{"type":30,"tag":68,"props":69,"children":70},"ul",{},[71,84,102,120,137],{"type":30,"tag":72,"props":73,"children":74},"li",{},[75,77],{"type":39,"value":76},"In its own words: \"A native UI framework for every platform. Build once, native everywhere.\" You write TSX (or Rust) and the app \"renders with each platform's own controls.\" — ",{"type":30,"tag":53,"props":78,"children":82},{"href":79,"rel":80},"https:\u002F\u002Fnsh.dev",[81],"nofollow",[83],{"type":39,"value":79},{"type":30,"tag":72,"props":85,"children":86},{},[87,89,94,96],{"type":39,"value":88},"Made by Longbridge, the team behind GPUI Kit. Lead committer huacnlee; 67 contributors listed. — ",{"type":30,"tag":53,"props":90,"children":92},{"href":79,"rel":91},[81],[93],{"type":39,"value":79},{"type":39,"value":95},", ",{"type":30,"tag":53,"props":97,"children":100},{"href":98,"rel":99},"https:\u002F\u002Fapi.github.com\u002Frepos\u002Flongbridge\u002Fnsh\u002Fcontributors",[81],[101],{"type":39,"value":98},{"type":30,"tag":72,"props":103,"children":104},{},[105,107,113,114],{"type":39,"value":106},"Three weeks old as a public project: repo created 2026-10-14, v0.1.0 on 2026-10-17, v0.4.0 (current) on 2026-11-04; 2,268 stars. Four minor releases in 18 days, each breaking the previous one; the release notes say \"0.4.0 is not a frozen compatibility release.\" — ",{"type":30,"tag":53,"props":108,"children":111},{"href":109,"rel":110},"https:\u002F\u002Fnsh.dev\u002Freleases",[81],[112],{"type":39,"value":109},{"type":39,"value":95},{"type":30,"tag":53,"props":115,"children":118},{"href":116,"rel":117},"https:\u002F\u002Fapi.github.com\u002Frepos\u002Flongbridge\u002Fnsh\u002Freleases",[81],[119],{"type":39,"value":116},{"type":30,"tag":72,"props":121,"children":122},{},[123,125,131,132],{"type":39,"value":124},"Licence: code Apache-2.0 (LICENSE-APACHE in the repo); docs CC BY 4.0 per the site footer only, no docs licence file found. — ",{"type":30,"tag":53,"props":126,"children":129},{"href":127,"rel":128},"https:\u002F\u002Fgithub.com\u002Flongbridge\u002Fnsh",[81],[130],{"type":39,"value":127},{"type":39,"value":95},{"type":30,"tag":53,"props":133,"children":135},{"href":79,"rel":134},[81],[136],{"type":39,"value":79},{"type":30,"tag":72,"props":138,"children":139},{},[140,142,148,149],{"type":39,"value":141},"Maturity: no target is labelled stable, beta or experimental anywhere on the site; the App Stories page lists ten apps, six by the lead committer, three \"In development\", none shipped or in a store, and no Longbridge product. — ",{"type":30,"tag":53,"props":143,"children":146},{"href":144,"rel":145},"https:\u002F\u002Fnsh.dev\u002Fapps",[81],[147],{"type":39,"value":144},{"type":39,"value":95},{"type":30,"tag":53,"props":150,"children":153},{"href":151,"rel":152},"https:\u002F\u002Fnsh.dev\u002Fdocs\u002Fplatforms.md",[81],[154],{"type":39,"value":151},{"type":30,"tag":62,"props":156,"children":158},{"id":157},"how-it-works",[159],{"type":39,"value":14},{"type":30,"tag":68,"props":161,"children":162},{},[163,179,234,249,264,280],{"type":30,"tag":72,"props":164,"children":165},{},[166,171,173],{"type":30,"tag":35,"props":167,"children":168},{},[169],{"type":39,"value":170},"TSX over a Rust core.",{"type":39,"value":172}," Oxc strips types, nsh's own JSX compiler emits direct calls to the native renderer, rolldown bundles one ES module, and the bundle compiles to QuickJS bytecode. Rust apps skip the bundle and link into each target's runner. — ",{"type":30,"tag":53,"props":174,"children":177},{"href":175,"rel":176},"https:\u002F\u002Fnsh.dev\u002Fdocs\u002Farchitecture.md",[81],[178],{"type":39,"value":175},{"type":30,"tag":72,"props":180,"children":181},{},[182,187,189,195,197,203,205,211,213,219,221,227,229],{"type":30,"tag":35,"props":183,"children":184},{},[185],{"type":39,"value":186},"Crates.",{"type":39,"value":188}," ",{"type":30,"tag":44,"props":190,"children":192},{"className":191},[],[193],{"type":39,"value":194},"nsh-core",{"type":39,"value":196}," (shadow tree, styles, Taffy layout, text, list virtualisation, animation graph; no platform, no JS engine) ← ",{"type":30,"tag":44,"props":198,"children":200},{"className":199},[],[201],{"type":39,"value":202},"nsh-js",{"type":39,"value":204}," (QuickJS host, reactive graph, HMR) ← ",{"type":30,"tag":44,"props":206,"children":208},{"className":207},[],[209],{"type":39,"value":210},"nsh-engine",{"type":39,"value":212}," ← ",{"type":30,"tag":44,"props":214,"children":216},{"className":215},[],[217],{"type":39,"value":218},"nsh-platform-*",{"type":39,"value":220},". The core's independence is what lets ",{"type":30,"tag":44,"props":222,"children":224},{"className":223},[],[225],{"type":39,"value":226},"nsh test",{"type":39,"value":228}," run headless. — ",{"type":30,"tag":53,"props":230,"children":232},{"href":175,"rel":231},[81],[233],{"type":39,"value":175},{"type":30,"tag":72,"props":235,"children":236},{},[237,242,244],{"type":30,"tag":35,"props":238,"children":239},{},[240],{"type":39,"value":241},"Reactivity",{"type":39,"value":243}," follows Solid 1.9: components run once, only bindings re-run, \"no re-render and no virtual DOM diff.\" — ",{"type":30,"tag":53,"props":245,"children":247},{"href":175,"rel":246},[81],[248],{"type":39,"value":175},{"type":30,"tag":72,"props":250,"children":251},{},[252,257,259],{"type":30,"tag":35,"props":253,"children":254},{},[255],{"type":39,"value":256},"Two threads.",{"type":39,"value":258}," The engine thread runs app logic, layout and the commit; the main thread applies one batch per frame and draws text. \"The main thread never waits for JS.\" — ",{"type":30,"tag":53,"props":260,"children":262},{"href":175,"rel":261},[81],[263],{"type":39,"value":175},{"type":30,"tag":72,"props":265,"children":266},{},[267,272,274],{"type":30,"tag":35,"props":268,"children":269},{},[270],{"type":39,"value":271},"Hot reload",{"type":39,"value":273}," in roughly 120 ms per save, keeping component state. — ",{"type":30,"tag":53,"props":275,"children":278},{"href":276,"rel":277},"https:\u002F\u002Fnsh.dev\u002Fdocs\u002Fdev-server-and-debugging.md",[81],[279],{"type":39,"value":276},{"type":30,"tag":72,"props":281,"children":282},{},[283,288,290],{"type":30,"tag":35,"props":284,"children":285},{},[286],{"type":39,"value":287},"Sandbox limits for embedded apps:",{"type":39,"value":289}," 256 MB JS heap, 200,000 nodes, 10 s bundle evaluation. Standalone apps are unlimited. — ",{"type":30,"tag":53,"props":291,"children":294},{"href":292,"rel":293},"https:\u002F\u002Fnsh.dev\u002Fdocs\u002Fsandbox-and-capabilities",[81],[295],{"type":39,"value":292},{"type":30,"tag":62,"props":297,"children":299},{"id":298},"targets",[300],{"type":39,"value":15},{"type":30,"tag":31,"props":302,"children":303},{},[304,306],{"type":39,"value":305},"The site states minimum requirements only, never a status word. — ",{"type":30,"tag":53,"props":307,"children":309},{"href":151,"rel":308},[81],[310],{"type":39,"value":151},{"type":30,"tag":312,"props":313,"children":314},"table",{},[315,344],{"type":30,"tag":316,"props":317,"children":318},"thead",{},[319],{"type":30,"tag":320,"props":321,"children":322},"tr",{},[323,329,334,339],{"type":30,"tag":324,"props":325,"children":326},"th",{},[327],{"type":39,"value":328},"Target",{"type":30,"tag":324,"props":330,"children":331},{},[332],{"type":39,"value":333},"View layer",{"type":30,"tag":324,"props":335,"children":336},{},[337],{"type":39,"value":338},"Minimum",{"type":30,"tag":324,"props":340,"children":341},{},[342],{"type":39,"value":343},"Notes",{"type":30,"tag":345,"props":346,"children":347},"tbody",{},[348,392,429,458,487,530,558],{"type":30,"tag":320,"props":349,"children":350},{},[351,357,362,367],{"type":30,"tag":352,"props":353,"children":354},"td",{},[355],{"type":39,"value":356},"macOS",{"type":30,"tag":352,"props":358,"children":359},{},[360],{"type":39,"value":361},"AppKit + Core Animation, CoreText",{"type":30,"tag":352,"props":363,"children":364},{},[365],{"type":39,"value":366},"macOS 14+",{"type":30,"tag":352,"props":368,"children":369},{},[370,376,378,384,386],{"type":30,"tag":44,"props":371,"children":373},{"className":372},[],[374],{"type":39,"value":375},"nsh package",{"type":39,"value":377}," gives an ad hoc signed ",{"type":30,"tag":44,"props":379,"children":381},{"className":380},[],[382],{"type":39,"value":383},".app",{"type":39,"value":385},"; Developer ID and notarization are yours. — ",{"type":30,"tag":53,"props":387,"children":390},{"href":388,"rel":389},"https:\u002F\u002Fnsh.dev\u002Fdocs\u002Fmacos.md",[81],[391],{"type":39,"value":388},{"type":30,"tag":320,"props":393,"children":394},{},[395,400,405,410],{"type":30,"tag":352,"props":396,"children":397},{},[398],{"type":39,"value":399},"Windows",{"type":30,"tag":352,"props":401,"children":402},{},[403],{"type":39,"value":404},"Win32 windows drawn with Direct2D, DirectWrite",{"type":30,"tag":352,"props":406,"children":407},{},[408],{"type":39,"value":409},"Windows 10 1809+",{"type":30,"tag":352,"props":411,"children":412},{},[413,415,421,423],{"type":39,"value":414},"Output is a directory and a zip, unsigned; \"sign it yourself with ",{"type":30,"tag":44,"props":416,"children":418},{"className":417},[],[419],{"type":39,"value":420},"signtool",{"type":39,"value":422},"\". — ",{"type":30,"tag":53,"props":424,"children":427},{"href":425,"rel":426},"https:\u002F\u002Fnsh.dev\u002Fdocs\u002Fwindows.md",[81],[428],{"type":39,"value":425},{"type":30,"tag":320,"props":430,"children":431},{},[432,437,442,447],{"type":30,"tag":352,"props":433,"children":434},{},[435],{"type":39,"value":436},"Linux",{"type":30,"tag":352,"props":438,"children":439},{},[440],{"type":39,"value":441},"GTK 4 widgets, Pango",{"type":30,"tag":352,"props":443,"children":444},{},[445],{"type":39,"value":446},"GTK 4.14+",{"type":30,"tag":352,"props":448,"children":449},{},[450,452],{"type":39,"value":451},"WebKitGTK 6.0 needed for web views. — ",{"type":30,"tag":53,"props":453,"children":456},{"href":454,"rel":455},"https:\u002F\u002Fnsh.dev\u002Fdocs\u002Flinux.md",[81],[457],{"type":39,"value":454},{"type":30,"tag":320,"props":459,"children":460},{},[461,466,471,476],{"type":30,"tag":352,"props":462,"children":463},{},[464],{"type":39,"value":465},"Web",{"type":30,"tag":352,"props":467,"children":468},{},[469],{"type":39,"value":470},"HTML + CSS",{"type":30,"tag":352,"props":472,"children":473},{},[474],{"type":39,"value":475},"modern browsers",{"type":30,"tag":352,"props":477,"children":478},{},[479,481],{"type":39,"value":480},"Since 0.4.0 TSX runs on the browser's own JS engine beside a Wasm core. — ",{"type":30,"tag":53,"props":482,"children":485},{"href":483,"rel":484},"https:\u002F\u002Fnsh.dev\u002Fdocs\u002Fweb.md",[81],[486],{"type":39,"value":483},{"type":30,"tag":320,"props":488,"children":489},{},[490,495,500,505],{"type":30,"tag":352,"props":491,"children":492},{},[493],{"type":39,"value":494},"iOS \u002F Android",{"type":30,"tag":352,"props":496,"children":497},{},[498],{"type":39,"value":499},"UIKit \u002F Android views",{"type":30,"tag":352,"props":501,"children":502},{},[503],{"type":39,"value":504},"iOS 15+, API 28+",{"type":30,"tag":352,"props":506,"children":507},{},[508,514,516,522,524],{"type":30,"tag":44,"props":509,"children":511},{"className":510},[],[512],{"type":39,"value":513},".ipa",{"type":39,"value":515}," \u002F ",{"type":30,"tag":44,"props":517,"children":519},{"className":518},[],[520],{"type":39,"value":521},".apk",{"type":39,"value":523}," only; no Gradle. — ",{"type":30,"tag":53,"props":525,"children":528},{"href":526,"rel":527},"https:\u002F\u002Fnsh.dev\u002Fdocs\u002Fpackaging.md",[81],[529],{"type":39,"value":526},{"type":30,"tag":320,"props":531,"children":532},{},[533,538,543,548],{"type":30,"tag":352,"props":534,"children":535},{},[536],{"type":39,"value":537},"TUI",{"type":30,"tag":352,"props":539,"children":540},{},[541],{"type":39,"value":542},"ratatui",{"type":30,"tag":352,"props":544,"children":545},{},[546],{"type":39,"value":547},"any terminal",{"type":30,"tag":352,"props":549,"children":550},{},[551,553],{"type":39,"value":552},"README only; the docs page returns 404. — ",{"type":30,"tag":53,"props":554,"children":556},{"href":127,"rel":555},[81],[557],{"type":39,"value":127},{"type":30,"tag":320,"props":559,"children":560},{},[561,566,571,576],{"type":30,"tag":352,"props":562,"children":563},{},[564],{"type":39,"value":565},"GPUI",{"type":30,"tag":352,"props":567,"children":568},{},[569],{"type":39,"value":570},"GPUI Fast primitives",{"type":30,"tag":352,"props":572,"children":573},{},[574],{"type":39,"value":575},"Metal \u002F DirectX \u002F Vulkan",{"type":30,"tag":352,"props":577,"children":578},{},[579,581],{"type":39,"value":580},"\"Embedded in GPUI Kit apps\"; see below. — ",{"type":30,"tag":53,"props":582,"children":585},{"href":583,"rel":584},"https:\u002F\u002Fnsh.dev\u002Fdocs\u002Fgpui.md",[81],[586],{"type":39,"value":583},{"type":30,"tag":31,"props":588,"children":589},{},[590,592,598],{"type":39,"value":591},"Note the floor: macOS 14 is higher than GPUI's. If both frameworks ship in one binary, nsh sets the minimum (see ",{"type":30,"tag":53,"props":593,"children":595},{"href":594},"\u002Fcycles\u002Fdesign\u002Fc130\u002Fdoc\u002Fresearch\u002Fplatform",[596],{"type":39,"value":597},"platform.md",{"type":39,"value":599},").",{"type":30,"tag":62,"props":601,"children":603},{"id":602},"the-cli",[604],{"type":39,"value":16},{"type":30,"tag":31,"props":606,"children":607},{},[608,614,616,622,623,629,630,636,638,644,646,652,653,659,661,667,668,673,675,681,683,688,690,695,696,701,703,709,711,717,719,725,727,733,734,739,740],{"type":30,"tag":44,"props":609,"children":611},{"className":610},[],[612],{"type":39,"value":613},"nsh init",{"type":39,"value":615}," (templates ",{"type":30,"tag":44,"props":617,"children":619},{"className":618},[],[620],{"type":39,"value":621},"ts",{"type":39,"value":95},{"type":30,"tag":44,"props":624,"children":626},{"className":625},[],[627],{"type":39,"value":628},"rust",{"type":39,"value":95},{"type":30,"tag":44,"props":631,"children":633},{"className":632},[],[634],{"type":39,"value":635},"mixed",{"type":39,"value":637},") · ",{"type":30,"tag":44,"props":639,"children":641},{"className":640},[],[642],{"type":39,"value":643},"nsh run",{"type":39,"value":645}," (dev server on 8790, targets ",{"type":30,"tag":44,"props":647,"children":649},{"className":648},[],[650],{"type":39,"value":651},"macos linux windows gpui web ios android catalyst",{"type":39,"value":637},{"type":30,"tag":44,"props":654,"children":656},{"className":655},[],[657],{"type":39,"value":658},"nsh check",{"type":39,"value":660}," (cargo check, then TypeScript 7's native ",{"type":30,"tag":44,"props":662,"children":664},{"className":663},[],[665],{"type":39,"value":666},"tsc",{"type":39,"value":637},{"type":30,"tag":44,"props":669,"children":671},{"className":670},[],[672],{"type":39,"value":226},{"type":39,"value":674}," (headless on the real engine and QuickJS, JUnit output; screenshots need a real target) · ",{"type":30,"tag":44,"props":676,"children":678},{"className":677},[],[679],{"type":39,"value":680},"nsh package --target \u003CT>",{"type":39,"value":682}," (",{"type":30,"tag":44,"props":684,"children":686},{"className":685},[],[687],{"type":39,"value":383},{"type":39,"value":689},", zip, tarball, ",{"type":30,"tag":44,"props":691,"children":693},{"className":692},[],[694],{"type":39,"value":513},{"type":39,"value":95},{"type":30,"tag":44,"props":697,"children":699},{"className":698},[],[700],{"type":39,"value":521},{"type":39,"value":702},", static site; no dmg, msi, deb, rpm, AppImage or Flatpak) · ",{"type":30,"tag":44,"props":704,"children":706},{"className":705},[],[707],{"type":39,"value":708},"nsh keygen \u002F certify \u002F verify \u002F revoke",{"type":39,"value":710}," · ",{"type":30,"tag":44,"props":712,"children":714},{"className":713},[],[715],{"type":39,"value":716},"nsh publish",{"type":39,"value":718}," (signs a ",{"type":30,"tag":44,"props":720,"children":722},{"className":721},[],[723],{"type":39,"value":724},".nshpkg",{"type":39,"value":726}," to a local file; \"There is no registry, URL, or upload step\"). — ",{"type":30,"tag":53,"props":728,"children":731},{"href":729,"rel":730},"https:\u002F\u002Fnsh.dev\u002Fdocs\u002Fcli.md",[81],[732],{"type":39,"value":729},{"type":39,"value":95},{"type":30,"tag":53,"props":735,"children":737},{"href":526,"rel":736},[81],[738],{"type":39,"value":526},{"type":39,"value":95},{"type":30,"tag":53,"props":741,"children":744},{"href":742,"rel":743},"https:\u002F\u002Fnsh.dev\u002Fdocs\u002Ftesting-and-trace.md",[81],[745],{"type":39,"value":742},{"type":30,"tag":62,"props":747,"children":749},{"id":748},"signed-modules-and-capabilities",[750],{"type":39,"value":17},{"type":30,"tag":31,"props":752,"children":753},{},[754],{"type":39,"value":755},"This is the part nothing else in our stack has.",{"type":30,"tag":68,"props":757,"children":758},{},[759,777,787,849],{"type":30,"tag":72,"props":760,"children":761},{},[762,764,769,771],{"type":39,"value":763},"A ",{"type":30,"tag":44,"props":765,"children":767},{"className":766},[],[768],{"type":39,"value":724},{"type":39,"value":770}," is one file: a JSON header (app id, version, build, capabilities, minimum runtime, the release key's certificate, a SHA-256 file table), the files, and an Ed25519 signature over everything before it. — ",{"type":30,"tag":53,"props":772,"children":775},{"href":773,"rel":774},"https:\u002F\u002Fnsh.dev\u002Fdocs\u002Fsigned-packages.md",[81],[776],{"type":39,"value":773},{"type":30,"tag":72,"props":778,"children":779},{},[780,782],{"type":39,"value":781},"Keys: an offline root; release keys certified by the root for named app ids and a validity window. Hosts trust root public keys only. Verification checks the chain, revocation, the hashes, the runtime floor, and rollback (a build older than the highest accepted one is refused). A failing package \"raises an error naming the failed check. The running app keeps running.\" — ",{"type":30,"tag":53,"props":783,"children":785},{"href":773,"rel":784},[81],[786],{"type":39,"value":773},{"type":30,"tag":72,"props":788,"children":789},{},[790,792,798,800,806,808,814,815,821,822,828,829,835,836,842,844],{"type":39,"value":791},"Capabilities declared in ",{"type":30,"tag":44,"props":793,"children":795},{"className":794},[],[796],{"type":39,"value":797},"nsh.json",{"type":39,"value":799}," and narrowed by the host: ",{"type":30,"tag":44,"props":801,"children":803},{"className":802},[],[804],{"type":39,"value":805},"network",{"type":39,"value":807}," (hosts, methods, paths, sockets), ",{"type":30,"tag":44,"props":809,"children":811},{"className":810},[],[812],{"type":39,"value":813},"webview",{"type":39,"value":95},{"type":30,"tag":44,"props":816,"children":818},{"className":817},[],[819],{"type":39,"value":820},"clipboard",{"type":39,"value":95},{"type":30,"tag":44,"props":823,"children":825},{"className":824},[],[826],{"type":39,"value":827},"picker",{"type":39,"value":95},{"type":30,"tag":44,"props":830,"children":832},{"className":831},[],[833],{"type":39,"value":834},"openUrl",{"type":39,"value":95},{"type":30,"tag":44,"props":837,"children":839},{"className":838},[],[840],{"type":39,"value":841},"host",{"type":39,"value":843}," (callable functions). A request must pass both the declaration and the grant. — ",{"type":30,"tag":53,"props":845,"children":847},{"href":292,"rel":846},[81],[848],{"type":39,"value":292},{"type":30,"tag":72,"props":850,"children":851},{},[852,854,859,860,866,868,874,876,881,882],{"type":39,"value":853},"Delivery: \"NSH verifies and runs packages; it does not deliver them.\" On ",{"type":30,"tag":44,"props":855,"children":857},{"className":856},[],[858],{"type":39,"value":49},{"type":39,"value":95},{"type":30,"tag":44,"props":861,"children":863},{"className":862},[],[864],{"type":39,"value":865},"nsh\u002Fupdater",{"type":39,"value":867}," adds OTA delivery from a signed ",{"type":30,"tag":44,"props":869,"children":871},{"className":870},[],[872],{"type":39,"value":873},"latest.json",{"type":39,"value":875}," manifest with a 10 s trial period and rollback. — ",{"type":30,"tag":53,"props":877,"children":879},{"href":773,"rel":878},[81],[880],{"type":39,"value":773},{"type":39,"value":95},{"type":30,"tag":53,"props":883,"children":886},{"href":884,"rel":885},"https:\u002F\u002Fnsh.dev\u002Fversions\u002Fmain\u002Fdocs\u002Fota-updates",[81],[887],{"type":39,"value":884},{"type":30,"tag":31,"props":889,"children":890},{},[891],{"type":39,"value":892},"For us: a remediation training (c133) or an HQ notice (c137) could travel as a signed module without a new binary. The plumbing is real today; the delivery half is unreleased.",{"type":30,"tag":62,"props":894,"children":896},{"id":895},"embedding-in-a-gpui-kit-app",[897],{"type":39,"value":18},{"type":30,"tag":68,"props":899,"children":900},{},[901,919,976,1002,1012],{"type":30,"tag":72,"props":902,"children":903},{},[904,906,912,914],{"type":39,"value":905},"\"An ",{"type":30,"tag":44,"props":907,"children":909},{"className":908},[],[910],{"type":39,"value":911},"AppView",{"type":39,"value":913}," is a GPUI view, so GPUI and GPUI Kit apps can host NSH apps, either a Rust root or TSX bundles.\" Each surface is one GPUI element that paints with GPUI primitives; the engine runs on its own thread. — ",{"type":30,"tag":53,"props":915,"children":917},{"href":583,"rel":916},[81],[918],{"type":39,"value":583},{"type":30,"tag":72,"props":920,"children":921},{},[922,924,930,932,938,940,946,947,953,955,961,963,969,971],{"type":39,"value":923},"Minimal: ",{"type":30,"tag":44,"props":925,"children":927},{"className":926},[],[928],{"type":39,"value":929},"let view = AppView::new(AppOptions::default(), window, cx); view.load(App::Rust(Root::of::\u003Cmy_app::App>()));",{"type":39,"value":931}," inside ",{"type":30,"tag":44,"props":933,"children":935},{"className":934},[],[936],{"type":39,"value":937},"open_window",{"type":39,"value":939},". Host channel for ",{"type":30,"tag":44,"props":941,"children":943},{"className":942},[],[944],{"type":39,"value":945},"host.call",{"type":39,"value":515},{"type":30,"tag":44,"props":948,"children":950},{"className":949},[],[951],{"type":39,"value":952},"host.post",{"type":39,"value":954},"; ",{"type":30,"tag":44,"props":956,"children":958},{"className":957},[],[959],{"type":39,"value":960},"run_package",{"type":39,"value":962}," for signed modules; ",{"type":30,"tag":44,"props":964,"children":966},{"className":965},[],[967],{"type":39,"value":968},"handle_open_url",{"type":39,"value":970},". — ",{"type":30,"tag":53,"props":972,"children":974},{"href":583,"rel":973},[81],[975],{"type":39,"value":583},{"type":30,"tag":72,"props":977,"children":978},{},[979,981,986,988,994,996],{"type":39,"value":980},"The GPUI backend draws through ",{"type":30,"tag":35,"props":982,"children":983},{},[984],{"type":39,"value":985},"GPUI Fast",{"type":39,"value":987},", Longbridge's fork (\"incremental rendering and native window composition… The project remains experimental\", crate ",{"type":30,"tag":44,"props":989,"children":991},{"className":990},[],[992],{"type":39,"value":993},"gpui-fast",{"type":39,"value":995}," 0.1.14). — ",{"type":30,"tag":53,"props":997,"children":1000},{"href":998,"rel":999},"https:\u002F\u002Fgithub.com\u002Flongbridge\u002Fgpui-fast",[81],[1001],{"type":39,"value":998},{"type":30,"tag":72,"props":1003,"children":1004},{},[1005,1007],{"type":39,"value":1006},"Limits on this target: text stays upright under transforms, no blur or backdrop filters, rounded clips cut to the rectangle, video shows a placeholder on macOS and Windows, web views are overlays that ancestors do not clip, AccessKit covers activate, focus, set value and scroll only. — ",{"type":30,"tag":53,"props":1008,"children":1010},{"href":583,"rel":1009},[81],[1011],{"type":39,"value":583},{"type":30,"tag":72,"props":1013,"children":1014},{},[1015,1017],{"type":39,"value":1016},"Linux adds GTK 3, WebKitGTK 4.1 (X11 only) and GStreamer 1.20+ to GPUI's own requirements. — ",{"type":30,"tag":53,"props":1018,"children":1020},{"href":583,"rel":1019},[81],[1021],{"type":39,"value":583},{"type":30,"tag":62,"props":1023,"children":1025},{"id":1024},"styling-and-theming",[1026],{"type":39,"value":19},{"type":30,"tag":68,"props":1028,"children":1029},{},[1030,1053,1115,1155],{"type":30,"tag":72,"props":1031,"children":1032},{},[1033,1039,1041,1046,1047],{"type":30,"tag":44,"props":1034,"children":1036},{"className":1035},[],[1037],{"type":39,"value":1038},"nsh\u002Fbase",{"type":39,"value":1040}," is unstyled: \"handle state, focus, keyboard, and accessibility. You style every part with Tailwind classes or typed styles.\" Longbridge's position: \"NSH owns the primitives and the unstyled foundation… Applications and third-party libraries own the styled component-library layer.\" — ",{"type":30,"tag":53,"props":1042,"children":1044},{"href":79,"rel":1043},[81],[1045],{"type":39,"value":79},{"type":39,"value":95},{"type":30,"tag":53,"props":1048,"children":1051},{"href":1049,"rel":1050},"https:\u002F\u002Fnsh.dev\u002Fdocs\u002Fgoals.md",[81],[1052],{"type":39,"value":1049},{"type":30,"tag":72,"props":1054,"children":1055},{},[1056,1058,1064,1066,1072,1073,1079,1080,1086,1088,1094,1095,1101,1102,1108,1109],{"type":39,"value":1057},"Three equivalent forms over one CSS-shaped property set: typed Rust methods, a TSX ",{"type":30,"tag":44,"props":1059,"children":1061},{"className":1060},[],[1062],{"type":39,"value":1063},"style",{"type":39,"value":1065}," prop, Tailwind 4 classes; variants ",{"type":30,"tag":44,"props":1067,"children":1069},{"className":1068},[],[1070],{"type":39,"value":1071},"dark:",{"type":39,"value":95},{"type":30,"tag":44,"props":1074,"children":1076},{"className":1075},[],[1077],{"type":39,"value":1078},"hover:",{"type":39,"value":95},{"type":30,"tag":44,"props":1081,"children":1083},{"className":1082},[],[1084],{"type":39,"value":1085},"focus:",{"type":39,"value":1087},", and platform prefixes ",{"type":30,"tag":44,"props":1089,"children":1091},{"className":1090},[],[1092],{"type":39,"value":1093},"ios:",{"type":39,"value":95},{"type":30,"tag":44,"props":1096,"children":1098},{"className":1097},[],[1099],{"type":39,"value":1100},"android:",{"type":39,"value":95},{"type":30,"tag":44,"props":1103,"children":1105},{"className":1104},[],[1106],{"type":39,"value":1107},"web:",{"type":39,"value":970},{"type":30,"tag":53,"props":1110,"children":1113},{"href":1111,"rel":1112},"https:\u002F\u002Fnsh.dev\u002Fdocs\u002Fstyling.md",[81],[1114],{"type":39,"value":1111},{"type":30,"tag":72,"props":1116,"children":1117},{},[1118,1120,1126,1128,1134,1136,1142,1144,1148,1150],{"type":39,"value":1119},"No semantic token system is described: ",{"type":30,"tag":44,"props":1121,"children":1123},{"className":1122},[],[1124],{"type":39,"value":1125},"AdaptiveColor",{"type":39,"value":1127}," light\u002Fdark pairs and ",{"type":30,"tag":44,"props":1129,"children":1131},{"className":1130},[],[1132],{"type":39,"value":1133},"theme().primary",{"type":39,"value":1135}," from ",{"type":30,"tag":44,"props":1137,"children":1139},{"className":1138},[],[1140],{"type":39,"value":1141},"nsh_base",{"type":39,"value":1143},". GPUI Kit's theme tokens (see ",{"type":30,"tag":53,"props":1145,"children":1146},{"href":55},[1147],{"type":39,"value":58},{"type":39,"value":1149},") are the richer model for a brand. — ",{"type":30,"tag":53,"props":1151,"children":1153},{"href":1111,"rel":1152},[81],[1154],{"type":39,"value":1111},{"type":30,"tag":72,"props":1156,"children":1157},{},[1158,1160,1166,1168,1174,1176,1182,1184,1189,1190,1196,1197],{"type":39,"value":1159},"Agent story: declarations generated from the Rust sources, ",{"type":30,"tag":44,"props":1161,"children":1163},{"className":1162},[],[1164],{"type":39,"value":1165},"llms.txt",{"type":39,"value":1167}," (58 KB, about 50 docs and 60 element pages), ",{"type":30,"tag":44,"props":1169,"children":1171},{"className":1170},[],[1172],{"type":39,"value":1173},"AGENTS.md",{"type":39,"value":1175},", and skills installable with ",{"type":30,"tag":44,"props":1177,"children":1179},{"className":1178},[],[1180],{"type":39,"value":1181},"npx skills add longbridge\u002Fnsh",{"type":39,"value":1183},". \"Models can generate a TSX module per request. The server checks and signs it before it reaches the device.\" — ",{"type":30,"tag":53,"props":1185,"children":1187},{"href":79,"rel":1186},[81],[1188],{"type":39,"value":79},{"type":39,"value":95},{"type":30,"tag":53,"props":1191,"children":1194},{"href":1192,"rel":1193},"https:\u002F\u002Fnsh.dev\u002Fllms.txt",[81],[1195],{"type":39,"value":1192},{"type":39,"value":95},{"type":30,"tag":53,"props":1198,"children":1200},{"href":127,"rel":1199},[81],[1201],{"type":39,"value":127},{"type":30,"tag":62,"props":1203,"children":1205},{"id":1204},"what-040-lacks-and-what-main-adds",[1206,1208,1213],{"type":39,"value":1207},"What 0.4.0 lacks, and what ",{"type":30,"tag":44,"props":1209,"children":1211},{"className":1210},[],[1212],{"type":39,"value":49},{"type":39,"value":1214}," adds",{"type":30,"tag":31,"props":1216,"children":1217},{},[1218,1220,1225,1227,1233],{"type":39,"value":1219},"Checked in the live docs and by a search of ",{"type":30,"tag":44,"props":1221,"children":1223},{"className":1222},[],[1224],{"type":39,"value":1165},{"type":39,"value":1226},"; the right column is unreleased code whose docs live under ",{"type":30,"tag":44,"props":1228,"children":1230},{"className":1229},[],[1231],{"type":39,"value":1232},"nsh.dev\u002Fversions\u002Fmain\u002F",{"type":39,"value":1234},".",{"type":30,"tag":312,"props":1236,"children":1237},{},[1238,1264],{"type":30,"tag":316,"props":1239,"children":1240},{},[1241],{"type":30,"tag":320,"props":1242,"children":1243},{},[1244,1249,1254],{"type":30,"tag":324,"props":1245,"children":1246},{},[1247],{"type":39,"value":1248},"Feature",{"type":30,"tag":324,"props":1250,"children":1251},{},[1252],{"type":39,"value":1253},"v0.4.0",{"type":30,"tag":324,"props":1255,"children":1256},{},[1257,1262],{"type":30,"tag":44,"props":1258,"children":1260},{"className":1259},[],[1261],{"type":39,"value":49},{"type":39,"value":1263}," (unreleased)",{"type":30,"tag":345,"props":1265,"children":1266},{},[1267,1305,1334,1363,1407,1435,1453,1470],{"type":30,"tag":320,"props":1268,"children":1269},{},[1270,1275,1280],{"type":30,"tag":352,"props":1271,"children":1272},{},[1273],{"type":39,"value":1274},"Tray icon",{"type":30,"tag":352,"props":1276,"children":1277},{},[1278],{"type":39,"value":1279},"absent",{"type":30,"tag":352,"props":1281,"children":1282},{},[1283,1289,1291,1297,1299],{"type":30,"tag":44,"props":1284,"children":1286},{"className":1285},[],[1287],{"type":39,"value":1288},"Tray.set({icon, tooltip, menu, onClick})",{"type":39,"value":1290},": NSStatusItem, ",{"type":30,"tag":44,"props":1292,"children":1294},{"className":1293},[],[1295],{"type":39,"value":1296},"Shell_NotifyIconW",{"type":39,"value":1298},", StatusNotifierItem (\"GNOME needs the AppIndicator extension\"). \"TSX only for now; Rust components have no tray yet.\" — ",{"type":30,"tag":53,"props":1300,"children":1303},{"href":1301,"rel":1302},"https:\u002F\u002Fnsh.dev\u002Fversions\u002Fmain\u002Fmodules\u002Fnsh-desktop.md",[81],[1304],{"type":39,"value":1301},{"type":30,"tag":320,"props":1306,"children":1307},{},[1308,1313,1317],{"type":30,"tag":352,"props":1309,"children":1310},{},[1311],{"type":39,"value":1312},"Notifications",{"type":30,"tag":352,"props":1314,"children":1315},{},[1316],{"type":39,"value":1279},{"type":30,"tag":352,"props":1318,"children":1319},{},[1320,1326,1328],{"type":30,"tag":44,"props":1321,"children":1323},{"className":1322},[],[1324],{"type":39,"value":1325},"Notifications.requestPermission \u002F show \u002F setBadge",{"type":39,"value":1327},"; macOS only \"in a signed app bundle\". — ",{"type":30,"tag":53,"props":1329,"children":1332},{"href":1330,"rel":1331},"https:\u002F\u002Fraw.githubusercontent.com\u002Flongbridge\u002Fnsh\u002Fmain\u002Fwebsite\u002Fmodules\u002Fnsh.md",[81],[1333],{"type":39,"value":1330},{"type":30,"tag":320,"props":1335,"children":1336},{},[1337,1342,1347],{"type":30,"tag":352,"props":1338,"children":1339},{},[1340],{"type":39,"value":1341},"Auto-update",{"type":30,"tag":352,"props":1343,"children":1344},{},[1345],{"type":39,"value":1346},"absent (\"Auto-update is not described here\")",{"type":30,"tag":352,"props":1348,"children":1349},{},[1350,1355,1357],{"type":30,"tag":44,"props":1351,"children":1353},{"className":1352},[],[1354],{"type":39,"value":865},{"type":39,"value":1356},": GitHub Releases or any URL, Ed25519-signed manifest, swap and restart on desktop. — ",{"type":30,"tag":53,"props":1358,"children":1361},{"href":1359,"rel":1360},"https:\u002F\u002Fnsh.dev\u002Fversions\u002Fmain\u002Fdocs\u002Fapp-updates",[81],[1362],{"type":39,"value":1359},{"type":30,"tag":320,"props":1364,"children":1365},{},[1366,1371,1383],{"type":30,"tag":352,"props":1367,"children":1368},{},[1369],{"type":39,"value":1370},"Deep links",{"type":30,"tag":352,"props":1372,"children":1373},{},[1374,1376,1381],{"type":39,"value":1375},"outbound ",{"type":30,"tag":44,"props":1377,"children":1379},{"className":1378},[],[1380],{"type":39,"value":834},{"type":39,"value":1382}," only",{"type":30,"tag":352,"props":1384,"children":1385},{},[1386,1392,1394,1400,1402],{"type":30,"tag":44,"props":1387,"children":1389},{"className":1388},[],[1390],{"type":39,"value":1391},"\"schemes\": [\"myapp\"]",{"type":39,"value":1393}," → ",{"type":30,"tag":44,"props":1395,"children":1397},{"className":1396},[],[1398],{"type":39,"value":1399},"UrlScheme.on(\"open\")",{"type":39,"value":1401},"; registers on all three OSes; a second launch hands its URL to the running app. — ",{"type":30,"tag":53,"props":1403,"children":1405},{"href":1330,"rel":1404},[81],[1406],{"type":39,"value":1330},{"type":30,"tag":320,"props":1408,"children":1409},{},[1410,1415,1419],{"type":30,"tag":352,"props":1411,"children":1412},{},[1413],{"type":39,"value":1414},"Global shortcuts",{"type":30,"tag":352,"props":1416,"children":1417},{},[1418],{"type":39,"value":1279},{"type":30,"tag":352,"props":1420,"children":1421},{},[1422,1428,1430],{"type":30,"tag":44,"props":1423,"children":1425},{"className":1424},[],[1426],{"type":39,"value":1427},"GlobalShortcut.register",{"type":39,"value":1429},"; Linux through the GlobalShortcuts portal. — ",{"type":30,"tag":53,"props":1431,"children":1433},{"href":1301,"rel":1432},[81],[1434],{"type":39,"value":1301},{"type":30,"tag":320,"props":1436,"children":1437},{},[1438,1443,1448],{"type":30,"tag":352,"props":1439,"children":1440},{},[1441],{"type":39,"value":1442},"Single instance",{"type":30,"tag":352,"props":1444,"children":1445},{},[1446],{"type":39,"value":1447},"not a feature",{"type":30,"tag":352,"props":1449,"children":1450},{},[1451],{"type":39,"value":1452},"only the URL hand-off above (partial)",{"type":30,"tag":320,"props":1454,"children":1455},{},[1456,1461,1466],{"type":30,"tag":352,"props":1457,"children":1458},{},[1459],{"type":39,"value":1460},"Autostart",{"type":30,"tag":352,"props":1462,"children":1463},{},[1464],{"type":39,"value":1465},"not found",{"type":30,"tag":352,"props":1467,"children":1468},{},[1469],{"type":39,"value":1465},{"type":30,"tag":320,"props":1471,"children":1472},{},[1473,1478,1490],{"type":30,"tag":352,"props":1474,"children":1475},{},[1476],{"type":39,"value":1477},"Installers, signing",{"type":30,"tag":352,"props":1479,"children":1480},{},[1481,1483,1488],{"type":39,"value":1482},"not produced; Developer ID, notarization and ",{"type":30,"tag":44,"props":1484,"children":1486},{"className":1485},[],[1487],{"type":39,"value":420},{"type":39,"value":1489}," are yours",{"type":30,"tag":352,"props":1491,"children":1492},{},[1493],{"type":39,"value":1494},"unchanged",{"type":30,"tag":62,"props":1496,"children":1498},{"id":1497},"footprint-as-nsh-reports-it",[1499],{"type":39,"value":21},{"type":30,"tag":31,"props":1501,"children":1502},{},[1503,1505],{"type":39,"value":1504},"nsh's own figures, release builds; the metric differs per OS, so do not compare across rows. — ",{"type":30,"tag":53,"props":1506,"children":1509},{"href":1507,"rel":1508},"https:\u002F\u002Fnsh.dev\u002Fdocs\u002Fperformance-report.md",[81],[1510],{"type":39,"value":1507},{"type":30,"tag":312,"props":1512,"children":1513},{},[1514,1535],{"type":30,"tag":316,"props":1515,"children":1516},{},[1517],{"type":30,"tag":320,"props":1518,"children":1519},{},[1520,1525,1530],{"type":30,"tag":324,"props":1521,"children":1522},{},[1523],{"type":39,"value":1524},"OS",{"type":30,"tag":324,"props":1526,"children":1527},{},[1528],{"type":39,"value":1529},"Hello app at rest",{"type":30,"tag":324,"props":1531,"children":1532},{},[1533],{"type":39,"value":1534},"Bare native window for comparison",{"type":30,"tag":345,"props":1536,"children":1537},{},[1538,1556,1574],{"type":30,"tag":320,"props":1539,"children":1540},{},[1541,1546,1551],{"type":30,"tag":352,"props":1542,"children":1543},{},[1544],{"type":39,"value":1545},"macOS (M3)",{"type":30,"tag":352,"props":1547,"children":1548},{},[1549],{"type":39,"value":1550},"TSX ~20 MB footprint \u002F 89 MB resident; Rust ~19 \u002F 86",{"type":30,"tag":352,"props":1552,"children":1553},{},[1554],{"type":39,"value":1555},"AppKit label window ~17 \u002F 80",{"type":30,"tag":320,"props":1557,"children":1558},{},[1559,1564,1569],{"type":30,"tag":352,"props":1560,"children":1561},{},[1562],{"type":39,"value":1563},"Windows (i7-13700KF)",{"type":30,"tag":352,"props":1565,"children":1566},{},[1567],{"type":39,"value":1568},"TSX ~15 MB private working set; Rust ~14",{"type":30,"tag":352,"props":1570,"children":1571},{},[1572],{"type":39,"value":1573},"not given",{"type":30,"tag":320,"props":1575,"children":1576},{},[1577,1582,1587],{"type":30,"tag":352,"props":1578,"children":1579},{},[1580],{"type":39,"value":1581},"Linux (GTK 4, GL)",{"type":30,"tag":352,"props":1583,"children":1584},{},[1585],{"type":39,"value":1586},"TSX ~79 MB private \u002F 166 MB resident; Rust ~49 \u002F 142",{"type":30,"tag":352,"props":1588,"children":1589},{},[1590],{"type":39,"value":1591},"GTK label window ~62 \u002F 132",{"type":30,"tag":31,"props":1593,"children":1594},{},[1595,1597],{"type":39,"value":1596},"Hello binaries: 6 to 12 MB zipped. A gallery page at rest costs 2 to 5 % CPU on macOS; Direct2D redraws on the main thread, so Windows runs hotter (Stocks demo 36 to 43 % CPU vs 33 to 36 % on macOS). — ",{"type":30,"tag":53,"props":1598,"children":1600},{"href":1507,"rel":1599},[81],[1601],{"type":39,"value":1507},{"type":30,"tag":31,"props":1603,"children":1604},{},[1605,1607,1613,1614],{"type":39,"value":1606},"Dense live data is nsh's own stated weak spot: at 20,000 quotes per second nsh used 73 to 78 % of a core against GPUI Fast's 25 %, and the comparison page says to prefer GPUI Fast when \"Sustained, dense updates of thousands of views are the main load.\" Our Events stream is that kind of load. — ",{"type":30,"tag":53,"props":1608,"children":1611},{"href":1609,"rel":1610},"https:\u002F\u002Fnsh.dev\u002Fdocs\u002Fcomparison.md",[81],[1612],{"type":39,"value":1609},{"type":39,"value":95},{"type":30,"tag":53,"props":1615,"children":1618},{"href":1616,"rel":1617},"https:\u002F\u002Fgithub.com\u002Flongbridge\u002Fnsh-perf-bench",[81],[1619],{"type":39,"value":1616},{"type":30,"tag":62,"props":1621,"children":1623},{"id":1622},"when-nsh-is-the-better-tool-and-when-not",[1624],{"type":39,"value":22},{"type":30,"tag":31,"props":1626,"children":1627},{},[1628],{"type":30,"tag":35,"props":1629,"children":1630},{},[1631],{"type":39,"value":1632},"Better when:",{"type":30,"tag":68,"props":1634,"children":1635},{},[1636,1646,1656,1675],{"type":30,"tag":72,"props":1637,"children":1638},{},[1639,1641],{"type":39,"value":1640},"Phones and the web must come from one component tree (iOS 15+, Android 9+, macOS 14+, Windows 10, Linux GTK 4, HTML). — ",{"type":30,"tag":53,"props":1642,"children":1644},{"href":1609,"rel":1643},[81],[1645],{"type":39,"value":1609},{"type":30,"tag":72,"props":1647,"children":1648},{},[1649,1651],{"type":39,"value":1650},"OS-drawn controls, system text and per-device conventions matter more than a custom-rendered look (\"The app owns its visual design\" but \"Platform conventions for input and navigation stay in place\"). — ",{"type":30,"tag":53,"props":1652,"children":1654},{"href":1049,"rel":1653},[81],[1655],{"type":39,"value":1049},{"type":30,"tag":72,"props":1657,"children":1658},{},[1659,1661,1667,1669],{"type":39,"value":1660},"A module system is the product: signed, revocable, sandboxed modules with rollback. GPUI Kit's ",{"type":30,"tag":44,"props":1662,"children":1664},{"className":1663},[],[1665],{"type":39,"value":1666},"gpui-shell",{"type":39,"value":1668}," is at \"Milestone M0… not a stable interface\". — ",{"type":30,"tag":53,"props":1670,"children":1673},{"href":1671,"rel":1672},"https:\u002F\u002Fgpui-kit.com\u002Fshell",[81],[1674],{"type":39,"value":1671},{"type":30,"tag":72,"props":1676,"children":1677},{},[1678,1680],{"type":39,"value":1679},"Agents should generate screens at runtime behind a server-side check-and-sign step. — ",{"type":30,"tag":53,"props":1681,"children":1683},{"href":1049,"rel":1682},[81],[1684],{"type":39,"value":1049},{"type":30,"tag":31,"props":1686,"children":1687},{},[1688],{"type":30,"tag":35,"props":1689,"children":1690},{},[1691],{"type":39,"value":1692},"Not better for a desktop-only Rust app that wants one language and one renderer:",{"type":30,"tag":68,"props":1694,"children":1695},{},[1696,1701,1706,1718,1730],{"type":30,"tag":72,"props":1697,"children":1698},{},[1699],{"type":39,"value":1700},"Two runtimes (QuickJS and Rust) and a Rust side that lags the TSX side.",{"type":30,"tag":72,"props":1702,"children":1703},{},[1704],{"type":39,"value":1705},"Three native renderers plus the GPUI backend, each with documented gaps.",{"type":30,"tag":72,"props":1707,"children":1708},{},[1709,1711,1716],{"type":39,"value":1710},"Packaging stops at an ad hoc ",{"type":30,"tag":44,"props":1712,"children":1714},{"className":1713},[],[1715],{"type":39,"value":383},{"type":39,"value":1717},", a zip and a tarball.",{"type":30,"tag":72,"props":1719,"children":1720},{},[1721,1723,1728],{"type":39,"value":1722},"The desktop features we need (tray, notifications, updater, deep links) exist only on ",{"type":30,"tag":44,"props":1724,"children":1726},{"className":1725},[],[1727],{"type":39,"value":49},{"type":39,"value":1729}," as of 2026-11-09.",{"type":30,"tag":72,"props":1731,"children":1732},{},[1733],{"type":39,"value":1734},"Four breaking releases in 18 days, no compatibility baseline, no named production app.",{"type":30,"tag":62,"props":1736,"children":1738},{"id":1737},"what-this-means-for-c130",[1739],{"type":39,"value":23},{"type":30,"tag":68,"props":1741,"children":1742},{},[1743,1753,1769,1779],{"type":30,"tag":72,"props":1744,"children":1745},{},[1746,1751],{"type":30,"tag":35,"props":1747,"children":1748},{},[1749],{"type":39,"value":1750},"D2 holds.",{"type":39,"value":1752}," GPUI Kit draws our screens; nsh is not the shell.",{"type":30,"tag":72,"props":1754,"children":1755},{},[1756,1761,1762,1767],{"type":30,"tag":35,"props":1757,"children":1758},{},[1759],{"type":39,"value":1760},"Keep the embedding door open.",{"type":39,"value":188},{"type":30,"tag":44,"props":1763,"children":1765},{"className":1764},[],[1766],{"type":39,"value":911},{"type":39,"value":1768}," inside a GPUI Kit window is documented; a future module host for trainings (c133) or notices (c137) has a path that does not change the shell.",{"type":30,"tag":72,"props":1770,"children":1771},{},[1772,1777],{"type":30,"tag":35,"props":1773,"children":1774},{},[1775],{"type":39,"value":1776},"c132 medium E",{"type":39,"value":1778}," (\"Native Shell's playground \u002F TSX targeting GPUI\") is weak today: the GPUI target has rendering gaps and the API moves weekly. Note it; do not build on it.",{"type":30,"tag":72,"props":1780,"children":1781},{},[1782,1793,1795,1799],{"type":30,"tag":35,"props":1783,"children":1784},{},[1785,1787,1792],{"type":39,"value":1786},"Watch ",{"type":30,"tag":44,"props":1788,"children":1790},{"className":1789},[],[1791],{"type":39,"value":49},{"type":39,"value":1234},{"type":39,"value":1794}," Longbridge is solving tray, notifications, updater and URL schemes there, in Rust, for three OSes. Their platform crates are a reading list for our own tray and deep-link work even if we never ship nsh (",{"type":30,"tag":53,"props":1796,"children":1797},{"href":594},[1798],{"type":39,"value":597},{"type":39,"value":599},{"type":30,"tag":62,"props":1801,"children":1803},{"id":1802},"open-questions",[1804],{"type":39,"value":24},{"type":30,"tag":1806,"props":1807,"children":1808},"ol",{},[1809,1829,1834,1839],{"type":30,"tag":72,"props":1810,"children":1811},{},[1812,1814,1820,1822,1827],{"type":39,"value":1813},"When the first release is recorded as compatible in ",{"type":30,"tag":44,"props":1815,"children":1817},{"className":1816},[],[1818],{"type":39,"value":1819},"nsh-compat",{"type":39,"value":1821},", and whether the ",{"type":30,"tag":44,"props":1823,"children":1825},{"className":1824},[],[1826],{"type":39,"value":49},{"type":39,"value":1828}," desktop features land in 0.5.0.",{"type":30,"tag":72,"props":1830,"children":1831},{},[1832],{"type":39,"value":1833},"Whether nsh will offer autostart or a general single-instance lock.",{"type":30,"tag":72,"props":1835,"children":1836},{},[1837],{"type":39,"value":1838},"Whether any nsh app has shipped to a store or a customer.",{"type":30,"tag":72,"props":1840,"children":1841},{},[1842,1844,1849],{"type":39,"value":1843},"Whether a ",{"type":30,"tag":44,"props":1845,"children":1847},{"className":1846},[],[1848],{"type":39,"value":724},{"type":39,"value":1850}," module can be hosted by a plain GPUI Kit app without adopting GPUI Fast (the GPUI backend requires it).",{"type":30,"tag":62,"props":1852,"children":1854},{"id":1853},"sources",[1855],{"type":39,"value":25},{"type":30,"tag":31,"props":1857,"children":1858},{},[1859,1864,1865,1870,1871,1876,1877,1882,1883,1888,1889,1894,1895,1900,1901,1906,1907,1912,1913,1918,1919,1924,1925,1931,1932,1937,1938,1943,1944,1949,1950,1955,1956,1961,1962,1967,1968,1973,1974,1979,1980,1985,1986,1991,1992,1997,1998,2003,2004,2009,2010,2015,2016,2021,2022],{"type":30,"tag":53,"props":1860,"children":1862},{"href":79,"rel":1861},[81],[1863],{"type":39,"value":79},{"type":39,"value":710},{"type":30,"tag":53,"props":1866,"children":1868},{"href":175,"rel":1867},[81],[1869],{"type":39,"value":175},{"type":39,"value":710},{"type":30,"tag":53,"props":1872,"children":1874},{"href":151,"rel":1873},[81],[1875],{"type":39,"value":151},{"type":39,"value":710},{"type":30,"tag":53,"props":1878,"children":1880},{"href":729,"rel":1879},[81],[1881],{"type":39,"value":729},{"type":39,"value":710},{"type":30,"tag":53,"props":1884,"children":1886},{"href":526,"rel":1885},[81],[1887],{"type":39,"value":526},{"type":39,"value":710},{"type":30,"tag":53,"props":1890,"children":1892},{"href":773,"rel":1891},[81],[1893],{"type":39,"value":773},{"type":39,"value":710},{"type":30,"tag":53,"props":1896,"children":1898},{"href":292,"rel":1897},[81],[1899],{"type":39,"value":292},{"type":39,"value":710},{"type":30,"tag":53,"props":1902,"children":1904},{"href":583,"rel":1903},[81],[1905],{"type":39,"value":583},{"type":39,"value":710},{"type":30,"tag":53,"props":1908,"children":1910},{"href":1111,"rel":1909},[81],[1911],{"type":39,"value":1111},{"type":39,"value":710},{"type":30,"tag":53,"props":1914,"children":1916},{"href":1049,"rel":1915},[81],[1917],{"type":39,"value":1049},{"type":39,"value":710},{"type":30,"tag":53,"props":1920,"children":1922},{"href":1609,"rel":1921},[81],[1923],{"type":39,"value":1609},{"type":39,"value":710},{"type":30,"tag":53,"props":1926,"children":1929},{"href":1927,"rel":1928},"https:\u002F\u002Fnsh.dev\u002Fdocs\u002Fcompatibility.md",[81],[1930],{"type":39,"value":1927},{"type":39,"value":710},{"type":30,"tag":53,"props":1933,"children":1935},{"href":1507,"rel":1934},[81],[1936],{"type":39,"value":1507},{"type":39,"value":710},{"type":30,"tag":53,"props":1939,"children":1941},{"href":742,"rel":1940},[81],[1942],{"type":39,"value":742},{"type":39,"value":710},{"type":30,"tag":53,"props":1945,"children":1947},{"href":388,"rel":1946},[81],[1948],{"type":39,"value":388},{"type":39,"value":710},{"type":30,"tag":53,"props":1951,"children":1953},{"href":425,"rel":1952},[81],[1954],{"type":39,"value":425},{"type":39,"value":710},{"type":30,"tag":53,"props":1957,"children":1959},{"href":454,"rel":1958},[81],[1960],{"type":39,"value":454},{"type":39,"value":710},{"type":30,"tag":53,"props":1963,"children":1965},{"href":483,"rel":1964},[81],[1966],{"type":39,"value":483},{"type":39,"value":710},{"type":30,"tag":53,"props":1969,"children":1971},{"href":109,"rel":1970},[81],[1972],{"type":39,"value":109},{"type":39,"value":710},{"type":30,"tag":53,"props":1975,"children":1977},{"href":144,"rel":1976},[81],[1978],{"type":39,"value":144},{"type":39,"value":710},{"type":30,"tag":53,"props":1981,"children":1983},{"href":1192,"rel":1982},[81],[1984],{"type":39,"value":1192},{"type":39,"value":710},{"type":30,"tag":53,"props":1987,"children":1989},{"href":1301,"rel":1988},[81],[1990],{"type":39,"value":1301},{"type":39,"value":710},{"type":30,"tag":53,"props":1993,"children":1995},{"href":1359,"rel":1994},[81],[1996],{"type":39,"value":1359},{"type":39,"value":710},{"type":30,"tag":53,"props":1999,"children":2001},{"href":884,"rel":2000},[81],[2002],{"type":39,"value":884},{"type":39,"value":710},{"type":30,"tag":53,"props":2005,"children":2007},{"href":127,"rel":2006},[81],[2008],{"type":39,"value":127},{"type":39,"value":710},{"type":30,"tag":53,"props":2011,"children":2013},{"href":1616,"rel":2012},[81],[2014],{"type":39,"value":1616},{"type":39,"value":710},{"type":30,"tag":53,"props":2017,"children":2019},{"href":998,"rel":2018},[81],[2020],{"type":39,"value":998},{"type":39,"value":710},{"type":30,"tag":53,"props":2023,"children":2025},{"href":1671,"rel":2024},[81],[2026],{"type":39,"value":1671},1794599462433]