[{"data":1,"prerenderedAt":4846},["ShallowReactive",2],{"cycle-doc-design-c130-research\u002Fplatform.md":3},{"cycle":4,"project":7,"path":10,"title":11,"toc":12,"ast":28},{"id":5,"title":6},"c130","Native App (program)",{"id":8,"label":9},"design","Design","research\u002Fplatform.md","Platform: what the kit leaves to us",[13,14,15,16,17,18,19,20,21,22,23,24,25,26,27],"1. The tray on three OSes","2. System notifications","3. Menus","4. Packaging and signing","5. Auto-update","6. Startup at login","7. Single instance","8. Deep links for the Connect flow","9. Fonts and licensing","10. Minimum OS versions and hardware","11. Measuring the footprint","What the spike must test (c131 Phase 0)","Open questions for Tyler's session","Sources","From the spike (c131 Phase 0, 2026-11-09 and 2026-11-10)",{"type":29,"children":30},"root",[31,45,51,68,418,540,545,550,782,787,872,877,1205,1272,1277,1451,1456,1577,1582,1648,1653,1843,1848,1972,2068,2073,2208,2213,2218,2492,2497,2576,2581,2630,2635,3102,3107,3140,3147,3380,3386,3855,3861,4091,4186,4292,4298,4481,4494,4500,4769,4775],{"type":32,"tag":33,"props":34,"children":35},"element","p",{},[36,43],{"type":32,"tag":37,"props":38,"children":39},"strong",{},[40],{"type":41,"value":42},"text","Use this file to",{"type":41,"value":44}," plan the OS work that neither GPUI nor GPUI Kit does: the tray on three OSes, notifications, menus, packaging and signing, auto-update, login items, single instance, deep links, fonts, minimum OS versions, and how the footprint is measured. Each section says what is known, which crate or OS API does it, and what the c131 spike must test before the plan promises it. It answers Tyler's Q4, Q5, Q7 and Q9 as far as reading can. Every source was read on 2026-11-09. The c131 spike appends its measured numbers at the end of this file under \"From the spike\".",{"type":32,"tag":46,"props":47,"children":49},"h2",{"id":48},"_1-the-tray-on-three-oses",[50],{"type":41,"value":13},{"type":32,"tag":33,"props":52,"children":53},{},[54],{"type":32,"tag":37,"props":55,"children":56},{},[57,59,66],{"type":41,"value":58},"The question that decides D7 (does the tray move into the app?): GPUI has no tray API, and nobody has published ",{"type":32,"tag":60,"props":61,"children":63},"code",{"className":62},[],[64],{"type":41,"value":65},"tray-icon",{"type":41,"value":67}," running inside a GPUI app.",{"type":32,"tag":69,"props":70,"children":71},"ul",{},[72,99,177,200,291,348,395],{"type":32,"tag":73,"props":74,"children":75},"li",{},[76,81,83,91,93],{"type":32,"tag":37,"props":77,"children":78},{},[79],{"type":41,"value":80},"Upstream GPUI refused it twice.",{"type":41,"value":82}," GPUI 1 had a macOS status item in 2022; it is gone. PR 13098 (Linux tray, 2024) was closed: \"I don't think we want to add large APIs to GPUI without a direct usage in Zed itself first.\" PR 44047 (macOS and Windows tray, by the GPUI Kit author, December 2025) was closed: \"without a Zed use case, I can't validate this code\". — ",{"type":32,"tag":84,"props":85,"children":89},"a",{"href":86,"rel":87},"https:\u002F\u002Fgithub.com\u002Fzed-industries\u002Fzed\u002Fpull\u002F13098",[88],"nofollow",[90],{"type":41,"value":86},{"type":41,"value":92},", ",{"type":32,"tag":84,"props":94,"children":97},{"href":95,"rel":96},"https:\u002F\u002Fgithub.com\u002Fzed-industries\u002Fzed\u002Fpull\u002F44047",[88],[98],{"type":41,"value":95},{"type":32,"tag":73,"props":100,"children":101},{},[102,107,109,115,117,123,125,131,133,139,140,146,147,153,155,161,163,169,171],{"type":32,"tag":37,"props":103,"children":104},{},[105],{"type":41,"value":106},"What GPUI does give a tray app",{"type":41,"value":108},", on Zed ",{"type":32,"tag":60,"props":110,"children":112},{"className":111},[],[113],{"type":41,"value":114},"main",{"type":41,"value":116},": ",{"type":32,"tag":60,"props":118,"children":120},{"className":119},[],[121],{"type":41,"value":122},"QuitMode::Explicit",{"type":41,"value":124}," (do not quit when the last window closes), ",{"type":32,"tag":60,"props":126,"children":128},{"className":127},[],[129],{"type":41,"value":130},"ActivationPolicy::Accessory",{"type":41,"value":132}," (\"for an accessory app that shows windows, such as a menu bar utility\"), ",{"type":32,"tag":60,"props":134,"children":136},{"className":135},[],[137],{"type":41,"value":138},"on_reopen",{"type":41,"value":92},{"type":32,"tag":60,"props":141,"children":143},{"className":142},[],[144],{"type":41,"value":145},"activate",{"type":41,"value":92},{"type":32,"tag":60,"props":148,"children":150},{"className":149},[],[151],{"type":41,"value":152},"hide",{"type":41,"value":154},". These are not in crates.io ",{"type":32,"tag":60,"props":156,"children":158},{"className":157},[],[159],{"type":41,"value":160},"gpui",{"type":41,"value":162}," 0.2.2; whether the kit's pinned ",{"type":32,"tag":60,"props":164,"children":166},{"className":165},[],[167],{"type":41,"value":168},"gpui-pre",{"type":41,"value":170}," snapshot has them is unverified. — ",{"type":32,"tag":84,"props":172,"children":175},{"href":173,"rel":174},"https:\u002F\u002Fraw.githubusercontent.com\u002Fzed-industries\u002Fzed\u002Fmain\u002Fcrates\u002Fgpui\u002Fsrc\u002Fapp.rs",[88],[176],{"type":41,"value":173},{"type":32,"tag":73,"props":178,"children":179},{},[180,185,187,193,194],{"type":32,"tag":37,"props":181,"children":182},{},[183],{"type":41,"value":184},"The working pattern",{"type":41,"value":186},", used by every third-party integration found: the native callback (AppKit, Win32, D-Bus) must not touch GPUI state (\"the App RefCell is whatever the interrupted turn left it as\"); it fills a channel, and a GPUI foreground task drains it and dispatches actions. — ",{"type":32,"tag":84,"props":188,"children":191},{"href":189,"rel":190},"https:\u002F\u002Fgithub.com\u002Fremorses\u002Fgpuix\u002Fissues\u002F111",[88],[192],{"type":41,"value":189},{"type":41,"value":92},{"type":32,"tag":84,"props":195,"children":198},{"href":196,"rel":197},"https:\u002F\u002Fgithub.com\u002Fremorses\u002Fzed\u002Fpull\u002F15",[88],[199],{"type":41,"value":196},{"type":32,"tag":73,"props":201,"children":202},{},[203,208,210,216,218,224,225,231,233,239,241,246,247,253,255,261,263,268,270,276,278,284,285],{"type":32,"tag":37,"props":204,"children":205},{},[206],{"type":41,"value":207},"Third-party crates.",{"type":41,"value":209}," ",{"type":32,"tag":60,"props":211,"children":213},{"className":212},[],[214],{"type":41,"value":215},"gpui-tray",{"type":41,"value":217}," by domenkozar, 0.3.0 (2026-10-21, 19 stars): AppKit through ",{"type":32,"tag":60,"props":219,"children":221},{"className":220},[],[222],{"type":41,"value":223},"objc2",{"type":41,"value":92},{"type":32,"tag":60,"props":226,"children":228},{"className":227},[],[229],{"type":41,"value":230},"Shell_NotifyIconW",{"type":41,"value":232}," on Windows, StatusNotifierItem over ",{"type":32,"tag":60,"props":234,"children":236},{"className":235},[],[237],{"type":41,"value":238},"zbus",{"type":41,"value":240}," on Linux without GTK; \"The crate uses GPUI's existing event loop\"; feature flags for ",{"type":32,"tag":60,"props":242,"children":244},{"className":243},[],[245],{"type":41,"value":160},{"type":41,"value":92},{"type":32,"tag":60,"props":248,"children":250},{"className":249},[],[251],{"type":41,"value":252},"gpui-kit",{"type":41,"value":254}," or ",{"type":32,"tag":60,"props":256,"children":258},{"className":257},[],[259],{"type":41,"value":260},"gpui-ce",{"type":41,"value":262},", but its kit dependency is pinned at 0.6 against today's 0.9.1, and its author wrote \"macOS can't be built from crates at the moment\" in August. A second ",{"type":32,"tag":60,"props":264,"children":266},{"className":265},[],[267],{"type":41,"value":215},{"type":41,"value":269}," (kkkqkx123, 2 stars, no release) targets gpui-kit 0.8 and exposes ",{"type":32,"tag":60,"props":271,"children":273},{"className":272},[],[274],{"type":41,"value":275},"Tray::is_available()",{"type":41,"value":277}," so an app starts without a tray host. — ",{"type":32,"tag":84,"props":279,"children":282},{"href":280,"rel":281},"https:\u002F\u002Fgithub.com\u002Fdomenkozar\u002Fgpui-tray",[88],[283],{"type":41,"value":280},{"type":41,"value":92},{"type":32,"tag":84,"props":286,"children":289},{"href":287,"rel":288},"https:\u002F\u002Fgithub.com\u002Fkkkqkx123\u002Fgpui-tray",[88],[290],{"type":41,"value":287},{"type":32,"tag":73,"props":292,"children":293},{},[294,302,304,310,312,317,319,325,327,333,335,341,342],{"type":32,"tag":37,"props":295,"children":296},{},[297],{"type":32,"tag":60,"props":298,"children":300},{"className":299},[],[301],{"type":41,"value":65},{"type":41,"value":303}," (tauri-apps, 0.26.1, 2026-10-07): Windows, macOS, Linux via AppIndicator or ",{"type":32,"tag":60,"props":305,"children":307},{"className":306},[],[308],{"type":41,"value":309},"ksni",{"type":41,"value":311},". Its rules: on macOS \"an event loop must be running on the main thread\" and the icon is created after the loop has started; on Linux the default backend needs a GTK 3 main loop, which GPUI does not run, so only the ",{"type":32,"tag":60,"props":313,"children":315},{"className":314},[],[316],{"type":41,"value":309},{"type":41,"value":318}," backend (\"manages its own worker thread\") fits; events arrive through ",{"type":32,"tag":60,"props":320,"children":322},{"className":321},[],[323],{"type":41,"value":324},"TrayIconEvent::receiver()",{"type":41,"value":326}," or a handler you bridge yourself. ",{"type":32,"tag":60,"props":328,"children":330},{"className":329},[],[331],{"type":41,"value":332},"Application::run(|cx| …)",{"type":41,"value":334}," fires on the main thread after AppKit has launched, which is the point where a macOS tray may be created. Untested anywhere public. — ",{"type":32,"tag":84,"props":336,"children":339},{"href":337,"rel":338},"https:\u002F\u002Fdocs.rs\u002Ftray-icon\u002Flatest\u002Ftray_icon\u002F",[88],[340],{"type":41,"value":337},{"type":41,"value":92},{"type":32,"tag":84,"props":343,"children":346},{"href":344,"rel":345},"https:\u002F\u002Fgithub.com\u002Ftauri-apps\u002Ftray-icon",[88],[347],{"type":41,"value":344},{"type":32,"tag":73,"props":349,"children":350},{},[351,356,358,364,366,371,373,379,381,386,387,393],{"type":32,"tag":37,"props":352,"children":353},{},[354],{"type":41,"value":355},"qtray today",{"type":41,"value":357}," (",{"type":32,"tag":60,"props":359,"children":361},{"className":360},[],[362],{"type":41,"value":363},"..\u002Fqcontrol\u002Fcrates\u002Fqtray",{"type":41,"value":365},"): ",{"type":32,"tag":60,"props":367,"children":369},{"className":368},[],[370],{"type":41,"value":65},{"type":41,"value":372}," 0.24 on a ",{"type":32,"tag":60,"props":374,"children":376},{"className":375},[],[377],{"type":41,"value":378},"tao",{"type":41,"value":380}," 0.35 event loop with ",{"type":32,"tag":60,"props":382,"children":384},{"className":383},[],[385],{"type":41,"value":130},{"type":41,"value":92},{"type":32,"tag":60,"props":388,"children":390},{"className":389},[],[391],{"type":41,"value":392},"objc2-app-kit",{"type":41,"value":394}," for alerts and progress, menu rebuilds debounced at 100 ms; macOS only. GPUI uses neither tao nor winit, so qtray's loop cannot run inside a GPUI process; its model and menu port, its loop does not.",{"type":32,"tag":73,"props":396,"children":397},{},[398,403,405,411,412],{"type":32,"tag":37,"props":399,"children":400},{},[401],{"type":41,"value":402},"Linux variance.",{"type":41,"value":404}," GNOME dropped status icons by default in 3.26 (2017); the \"AppIndicator and KStatusNotifierItem Support\" extension restores them (versions for Shell 45 to 51); KDE hosts StatusNotifierItem natively; on Wayland it is pure D-Bus. The app must run tray-less on a stock GNOME. — ",{"type":32,"tag":84,"props":406,"children":409},{"href":407,"rel":408},"https:\u002F\u002Fblogs.gnome.org\u002Faday\u002F2017\u002F08\u002F31\u002Fstatus-icons-and-gnome\u002F",[88],[410],{"type":41,"value":407},{"type":41,"value":92},{"type":32,"tag":84,"props":413,"children":416},{"href":414,"rel":415},"https:\u002F\u002Fextensions.gnome.org\u002Fextension\u002F615\u002Fappindicator-support\u002F",[88],[417],{"type":41,"value":414},{"type":32,"tag":419,"props":420,"children":421},"table",{},[422,446],{"type":32,"tag":423,"props":424,"children":425},"thead",{},[426],{"type":32,"tag":427,"props":428,"children":429},"tr",{},[430,436,441],{"type":32,"tag":431,"props":432,"children":433},"th",{},[434],{"type":41,"value":435},"Path for D7",{"type":32,"tag":431,"props":437,"children":438},{},[439],{"type":41,"value":440},"Cost",{"type":32,"tag":431,"props":442,"children":443},{},[444],{"type":41,"value":445},"Risk",{"type":32,"tag":447,"props":448,"children":449},"tbody",{},[450,483,522],{"type":32,"tag":427,"props":451,"children":452},{},[453,473,478],{"type":32,"tag":454,"props":455,"children":456},"td",{},[457,459,464,466,471],{"type":41,"value":458},"A. One process: tray through AppKit \u002F Win32 \u002F ",{"type":32,"tag":60,"props":460,"children":462},{"className":461},[],[463],{"type":41,"value":238},{"type":41,"value":465}," on GPUI's loop (the ",{"type":32,"tag":60,"props":467,"children":469},{"className":468},[],[470],{"type":41,"value":215},{"type":41,"value":472}," shape), window on demand",{"type":32,"tag":454,"props":474,"children":475},{},[476],{"type":41,"value":477},"Port qtray's model and menu; write or adopt the three backends",{"type":32,"tag":454,"props":479,"children":480},{},[481],{"type":41,"value":482},"Third-party crates lag the kit by two or three minors; macOS build gap reported",{"type":32,"tag":427,"props":484,"children":485},{},[486,512,517],{"type":32,"tag":454,"props":487,"children":488},{},[489,491,496,498,504,505,510],{"type":41,"value":490},"B. One process: ",{"type":32,"tag":60,"props":492,"children":494},{"className":493},[],[495],{"type":41,"value":65},{"type":41,"value":497}," created inside ",{"type":32,"tag":60,"props":499,"children":501},{"className":500},[],[502],{"type":41,"value":503},"Application::run",{"type":41,"value":92},{"type":32,"tag":60,"props":506,"children":508},{"className":507},[],[509],{"type":41,"value":309},{"type":41,"value":511}," on Linux, events bridged by channel",{"type":32,"tag":454,"props":513,"children":514},{},[515],{"type":41,"value":516},"Smallest code; the crate qtray already uses",{"type":32,"tag":454,"props":518,"children":519},{},[520],{"type":41,"value":521},"Untested with GPUI; Windows message-loop sharing unverified",{"type":32,"tag":427,"props":523,"children":524},{},[525,530,535],{"type":32,"tag":454,"props":526,"children":527},{},[528],{"type":41,"value":529},"C. Two processes: qtray stays (macOS) and opens the app; Windows and Linux trays come later",{"type":32,"tag":454,"props":531,"children":532},{},[533],{"type":41,"value":534},"Zero new tray code for V1",{"type":32,"tag":454,"props":536,"children":537},{},[538],{"type":41,"value":539},"Two binaries, two lifecycles; Tyler's Q4 stays open",{"type":32,"tag":33,"props":541,"children":542},{},[543],{"type":41,"value":544},"The spike tries B, then A, on macOS first, and records which one the window and the tray survive together.",{"type":32,"tag":46,"props":546,"children":548},{"id":547},"_2-system-notifications",[549],{"type":41,"value":14},{"type":32,"tag":69,"props":551,"children":552},{},[553,624,671,702,726,777],{"type":32,"tag":73,"props":554,"children":555},{},[556,561,562,568,570,576,578,584,586,592,594,600,602,608,610,616,618],{"type":32,"tag":37,"props":557,"children":558},{},[559],{"type":41,"value":560},"GPUI has it",{"type":41,"value":116},{"type":32,"tag":60,"props":563,"children":565},{"className":564},[],[566],{"type":41,"value":567},"show_system_notification(SystemNotification { tag, title, body, actions })",{"type":41,"value":569},"; the kit routes ",{"type":32,"tag":60,"props":571,"children":573},{"className":572},[],[574],{"type":41,"value":575},"Notification::info(...).system()",{"type":41,"value":577}," to it. Limits the kit states: the call \"returns ",{"type":32,"tag":60,"props":579,"children":581},{"className":580},[],[582],{"type":41,"value":583},"()",{"type":41,"value":585},", not a delivery result\"; on macOS \"A plain ",{"type":32,"tag":60,"props":587,"children":589},{"className":588},[],[590],{"type":41,"value":591},"cargo run",{"type":41,"value":593}," process cannot post\", a real ",{"type":32,"tag":60,"props":595,"children":597},{"className":596},[],[598],{"type":41,"value":599},".app",{"type":41,"value":601}," bundle in ",{"type":32,"tag":60,"props":603,"children":605},{"className":604},[],[606],{"type":41,"value":607},"\u002FApplications",{"type":41,"value":609}," is required and ",{"type":32,"tag":60,"props":611,"children":613},{"className":612},[],[614],{"type":41,"value":615},"cx.set_app_identity(...)",{"type":41,"value":617}," must be set early; on Linux a session D-Bus and an XDG notification daemon are needed and the adapter \"neither retracts nor replaces by tag\". — ",{"type":32,"tag":84,"props":619,"children":622},{"href":620,"rel":621},"https:\u002F\u002Fgpui-kit.com\u002Fdocs\u002Fsystem-notification",[88],[623],{"type":41,"value":620},{"type":32,"tag":73,"props":625,"children":626},{},[627,632,634,640,642,648,650,656,658,664,665],{"type":32,"tag":37,"props":628,"children":629},{},[630],{"type":41,"value":631},"macOS",{"type":41,"value":633}," asks the person once: ",{"type":32,"tag":60,"props":635,"children":637},{"className":636},[],[638],{"type":41,"value":639},"requestAuthorization",{"type":41,"value":641}," prompts the first time and records the answer; ",{"type":32,"tag":60,"props":643,"children":645},{"className":644},[],[646],{"type":41,"value":647},".provisional",{"type":41,"value":649}," delivers quietly with no prompt. The modern API (",{"type":32,"tag":60,"props":651,"children":653},{"className":652},[],[654],{"type":41,"value":655},"UNUserNotificationCenter",{"type":41,"value":657},") needs a signed bundle; the deprecated one works unbundled. — ",{"type":32,"tag":84,"props":659,"children":662},{"href":660,"rel":661},"https:\u002F\u002Fdeveloper.apple.com\u002Fdocumentation\u002Fusernotifications\u002Fasking-permission-to-use-notifications",[88],[663],{"type":41,"value":660},{"type":41,"value":92},{"type":32,"tag":84,"props":666,"children":669},{"href":667,"rel":668},"https:\u002F\u002Fgithub.com\u002Fhoodie\u002Fnotify-rust",[88],[670],{"type":41,"value":667},{"type":32,"tag":73,"props":672,"children":673},{},[674,679,681,687,689,695,696],{"type":32,"tag":37,"props":675,"children":676},{},[677],{"type":41,"value":678},"Windows",{"type":41,"value":680}," needs a Start-menu shortcut carrying an ",{"type":32,"tag":60,"props":682,"children":684},{"className":683},[],[685],{"type":41,"value":686},"AppUserModelID",{"type":41,"value":688},", written by the installer (Zed's Inno script does exactly this); \"App notifications aren't supported for elevated (admin) apps\"; action buttons need a COM activator. — ",{"type":32,"tag":84,"props":690,"children":693},{"href":691,"rel":692},"https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fprevious-versions\u002Fwindows\u002Fdesktop\u002Flegacy\u002Fhh802762(v=vs.85)",[88],[694],{"type":41,"value":691},{"type":41,"value":92},{"type":32,"tag":84,"props":697,"children":700},{"href":698,"rel":699},"https:\u002F\u002Fraw.githubusercontent.com\u002Fzed-industries\u002Fzed\u002Fmain\u002Fcrates\u002Fzed\u002Fresources\u002Fwindows\u002Fzed.iss",[88],[701],{"type":41,"value":698},{"type":32,"tag":73,"props":703,"children":704},{},[705,710,712,718,720],{"type":32,"tag":37,"props":706,"children":707},{},[708],{"type":41,"value":709},"Linux",{"type":41,"value":711}," is the freedesktop spec: ",{"type":32,"tag":60,"props":713,"children":715},{"className":714},[],[716],{"type":41,"value":717},"Notify(app_name, replaces_id, icon, summary, body, actions, hints, timeout)",{"type":41,"value":719},"; action buttons depend on the daemon (\"Clients should not assume the server sends this signal\"). — ",{"type":32,"tag":84,"props":721,"children":724},{"href":722,"rel":723},"http:\u002F\u002Fspecifications.freedesktop.org\u002Fnotification\u002Flatest\u002Fprotocol.html",[88],[725],{"type":41,"value":722},{"type":32,"tag":73,"props":727,"children":728},{},[729,731,737,739,745,747,753,755,761,763,769,771],{"type":41,"value":730},"Crates if GPUI's is not enough: ",{"type":32,"tag":60,"props":732,"children":734},{"className":733},[],[735],{"type":41,"value":736},"notify-rust",{"type":41,"value":738}," 4.19 (Linux and BSD first; macOS via ",{"type":32,"tag":60,"props":740,"children":742},{"className":741},[],[743],{"type":41,"value":744},"mac-notification-sys",{"type":41,"value":746},", Windows via ",{"type":32,"tag":60,"props":748,"children":750},{"className":749},[],[751],{"type":41,"value":752},"winrt-notification",{"type":41,"value":754},", no action buttons there), ",{"type":32,"tag":60,"props":756,"children":758},{"className":757},[],[759],{"type":41,"value":760},"tauri-winrt-notification",{"type":41,"value":762}," 0.8, ",{"type":32,"tag":60,"props":764,"children":766},{"className":765},[],[767],{"type":41,"value":768},"objc2-user-notifications",{"type":41,"value":770}," 0.3. — ",{"type":32,"tag":84,"props":772,"children":775},{"href":773,"rel":774},"https:\u002F\u002Fcrates.io\u002Fapi\u002Fv1\u002Fcrates\u002Fnotify-rust",[88],[776],{"type":41,"value":773},{"type":32,"tag":73,"props":778,"children":779},{},[780],{"type":41,"value":781},"For c137: the OS gives one channel with a per-app permission; \"the person controls delivery per type\" has to be our own layer in front of it, and the Windows and macOS gates mean notifications only work from an installed, signed build.",{"type":32,"tag":46,"props":783,"children":785},{"id":784},"_3-menus",[786],{"type":41,"value":15},{"type":32,"tag":69,"props":788,"children":789},{},[790,815],{"type":32,"tag":73,"props":791,"children":792},{},[793,799,801,807,809],{"type":32,"tag":60,"props":794,"children":796},{"className":795},[],[797],{"type":41,"value":798},"App::set_menus",{"type":41,"value":800}," builds a native ",{"type":32,"tag":60,"props":802,"children":804},{"className":803},[],[805],{"type":41,"value":806},"NSMenu",{"type":41,"value":808}," bar on macOS only; on Windows and Linux GPUI stores the menus and Zed draws them in its title bar as GPUI popovers. Context menus are GPUI-drawn everywhere. — ",{"type":32,"tag":84,"props":810,"children":813},{"href":811,"rel":812},"https:\u002F\u002Fraw.githubusercontent.com\u002Fzed-industries\u002Fzed\u002Fmain\u002Fcrates\u002Ftitle_bar\u002Fsrc\u002Fapplication_menu.rs",[88],[814],{"type":41,"value":811},{"type":32,"tag":73,"props":816,"children":817},{},[818,820,826,828,834,836,841,843,849,851,857,859,865,866],{"type":41,"value":819},"The kit's ",{"type":32,"tag":60,"props":821,"children":823},{"className":822},[],[824],{"type":41,"value":825},"TitleBar",{"type":41,"value":827}," takes a menu bar; its ",{"type":32,"tag":60,"props":829,"children":831},{"className":830},[],[832],{"type":41,"value":833},"NativeMenu",{"type":41,"value":835}," is ",{"type":32,"tag":60,"props":837,"children":839},{"className":838},[],[840],{"type":41,"value":806},{"type":41,"value":842}," on macOS, ",{"type":32,"tag":60,"props":844,"children":846},{"className":845},[],[847],{"type":41,"value":848},"TrackPopupMenuEx",{"type":41,"value":850}," on Windows and a drawn fallback on Linux. ",{"type":32,"tag":60,"props":852,"children":854},{"className":853},[],[855],{"type":41,"value":856},"muda",{"type":41,"value":858}," would need GTK (Linux) or GPUI's HWND and message loop (Windows); not needed. — ",{"type":32,"tag":84,"props":860,"children":863},{"href":861,"rel":862},"https:\u002F\u002Fgpui-kit.com\u002Fcomponent\u002Ftitle-bar",[88],[864],{"type":41,"value":861},{"type":41,"value":92},{"type":32,"tag":84,"props":867,"children":870},{"href":868,"rel":869},"https:\u002F\u002Fgpui-kit.com\u002Fdocs\u002Fnative-extension",[88],[871],{"type":41,"value":868},{"type":32,"tag":46,"props":873,"children":875},{"id":874},"_4-packaging-and-signing",[876],{"type":41,"value":16},{"type":32,"tag":419,"props":878,"children":879},{},[880,911],{"type":32,"tag":423,"props":881,"children":882},{},[883],{"type":32,"tag":427,"props":884,"children":885},{},[886,891,896,901,906],{"type":32,"tag":431,"props":887,"children":888},{},[889],{"type":41,"value":890},"OS",{"type":32,"tag":431,"props":892,"children":893},{},[894],{"type":41,"value":895},"Artifact",{"type":32,"tag":431,"props":897,"children":898},{},[899],{"type":41,"value":900},"Signing",{"type":32,"tag":431,"props":902,"children":903},{},[904],{"type":41,"value":905},"What Zed does",{"type":32,"tag":431,"props":907,"children":908},{},[909],{"type":41,"value":910},"Cost and gates",{"type":32,"tag":447,"props":912,"children":913},{},[914,1036,1100],{"type":32,"tag":427,"props":915,"children":916},{},[917,921,947,975,1011],{"type":32,"tag":454,"props":918,"children":919},{},[920],{"type":41,"value":631},{"type":32,"tag":454,"props":922,"children":923},{},[924,929,931,937,939,945],{"type":32,"tag":60,"props":925,"children":927},{"className":926},[],[928],{"type":41,"value":599},{"type":41,"value":930}," in a ",{"type":32,"tag":60,"props":932,"children":934},{"className":933},[],[935],{"type":41,"value":936},".dmg",{"type":41,"value":938},"; ",{"type":32,"tag":60,"props":940,"children":942},{"className":941},[],[943],{"type":41,"value":944},"Info.plist",{"type":41,"value":946}," with bundle id, URL schemes, icons",{"type":32,"tag":454,"props":948,"children":949},{},[950,952,958,960,966,967,973],{"type":41,"value":951},"Developer ID certificate, ",{"type":32,"tag":60,"props":953,"children":955},{"className":954},[],[956],{"type":41,"value":957},"codesign --options runtime",{"type":41,"value":959}," (hardened runtime), ",{"type":32,"tag":60,"props":961,"children":963},{"className":962},[],[964],{"type":41,"value":965},"notarytool submit --wait",{"type":41,"value":92},{"type":32,"tag":60,"props":968,"children":970},{"className":969},[],[971],{"type":41,"value":972},"stapler staple",{"type":41,"value":974},". \"all software… distributed with Developer ID must be notarized\"",{"type":32,"tag":454,"props":976,"children":977},{},[978,980,986,987,993,995,1001,1003,1009],{"type":41,"value":979},"Zed's fork of ",{"type":32,"tag":60,"props":981,"children":983},{"className":982},[],[984],{"type":41,"value":985},"cargo-bundle",{"type":41,"value":92},{"type":32,"tag":60,"props":988,"children":990},{"className":989},[],[991],{"type":41,"value":992},"MACOSX_DEPLOYMENT_TARGET=12.0",{"type":41,"value":994},", signs binary, helpers and bundle, DMG via ",{"type":32,"tag":60,"props":996,"children":998},{"className":997},[],[999],{"type":41,"value":1000},"hdiutil",{"type":41,"value":1002},"; ad hoc ",{"type":32,"tag":60,"props":1004,"children":1006},{"className":1005},[],[1007],{"type":41,"value":1008},"--sign -",{"type":41,"value":1010}," without certificates",{"type":32,"tag":454,"props":1012,"children":1013},{},[1014,1016,1022,1023,1029,1030],{"type":41,"value":1015},"Apple Developer Program $99 a year. Since Sequoia no Control-click override: unsigned apps are blocked until the person visits Privacy & Security. — ",{"type":32,"tag":84,"props":1017,"children":1020},{"href":1018,"rel":1019},"https:\u002F\u002Fdeveloper.apple.com\u002Fdocumentation\u002Fsecurity\u002Fnotarizing-macos-software-before-distribution",[88],[1021],{"type":41,"value":1018},{"type":41,"value":92},{"type":32,"tag":84,"props":1024,"children":1027},{"href":1025,"rel":1026},"https:\u002F\u002Fdeveloper.apple.com\u002Fnews\u002F?id=saqachfa",[88],[1028],{"type":41,"value":1025},{"type":41,"value":92},{"type":32,"tag":84,"props":1031,"children":1034},{"href":1032,"rel":1033},"https:\u002F\u002Fraw.githubusercontent.com\u002Fzed-industries\u002Fzed\u002Fmain\u002Fscript\u002Fbundle-mac",[88],[1035],{"type":41,"value":1032},{"type":32,"tag":427,"props":1037,"children":1038},{},[1039,1043,1064,1069,1074],{"type":32,"tag":454,"props":1040,"children":1041},{},[1042],{"type":41,"value":678},{"type":32,"tag":454,"props":1044,"children":1045},{},[1046,1048,1054,1056,1062],{"type":41,"value":1047},"Inno Setup ",{"type":32,"tag":60,"props":1049,"children":1051},{"className":1050},[],[1052],{"type":41,"value":1053},".exe",{"type":41,"value":1055}," (per-user, ",{"type":32,"tag":60,"props":1057,"children":1059},{"className":1058},[],[1060],{"type":41,"value":1061},"PrivilegesRequired=lowest",{"type":41,"value":1063},", no UAC), or WiX MSI, or MSIX (identity, needed for Store and some platform APIs)",{"type":32,"tag":454,"props":1065,"children":1066},{},[1067],{"type":41,"value":1068},"Authenticode: Azure Artifact Signing \"~$9.99\u002Fmonth\" (org in US, Canada, EU, UK and others; 1 to 20 business days to validate), OV certificate $150 to 300 a year on an HSM, EV $400+ with no SmartScreen bypass since 2024",{"type":32,"tag":454,"props":1070,"children":1071},{},[1072],{"type":41,"value":1073},"Inno Setup with an AUMID shortcut, HKCU registry, Azure Artifact Signing",{"type":32,"tag":454,"props":1075,"children":1076},{},[1077,1079,1085,1087,1093,1094],{"type":41,"value":1078},"SmartScreen reputation \"can take several weeks and hundreds of clean installs\" whatever the certificate; enterprises can whitelist intranet sources. winget by PR to ",{"type":32,"tag":60,"props":1080,"children":1082},{"className":1081},[],[1083],{"type":41,"value":1084},"microsoft\u002Fwinget-pkgs",{"type":41,"value":1086},". — ",{"type":32,"tag":84,"props":1088,"children":1091},{"href":1089,"rel":1090},"https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fwindows\u002Fapps\u002Fpackage-and-deploy\u002Fcode-signing-options",[88],[1092],{"type":41,"value":1089},{"type":41,"value":92},{"type":32,"tag":84,"props":1095,"children":1098},{"href":1096,"rel":1097},"https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fwindows\u002Fapps\u002Fpackage-and-deploy\u002Fsmartscreen-reputation",[88],[1099],{"type":41,"value":1096},{"type":32,"tag":427,"props":1101,"children":1102},{},[1103,1107,1177,1182,1187],{"type":32,"tag":454,"props":1104,"children":1105},{},[1106],{"type":41,"value":709},{"type":32,"tag":454,"props":1108,"children":1109},{},[1110,1116,1118,1124,1125,1131,1133,1139,1141,1147,1148,1154,1156,1161,1163,1169,1171],{"type":32,"tag":60,"props":1111,"children":1113},{"className":1112},[],[1114],{"type":41,"value":1115},".tar.gz",{"type":41,"value":1117}," with ",{"type":32,"tag":60,"props":1119,"children":1121},{"className":1120},[],[1122],{"type":41,"value":1123},"bin\u002F",{"type":41,"value":92},{"type":32,"tag":60,"props":1126,"children":1128},{"className":1127},[],[1129],{"type":41,"value":1130},"libexec\u002F",{"type":41,"value":1132},", bundled libs minus GLib, ",{"type":32,"tag":60,"props":1134,"children":1136},{"className":1135},[],[1137],{"type":41,"value":1138},".desktop",{"type":41,"value":1140}," and icons; install script into ",{"type":32,"tag":60,"props":1142,"children":1144},{"className":1143},[],[1145],{"type":41,"value":1146},"~\u002F.local",{"type":41,"value":938},{"type":32,"tag":60,"props":1149,"children":1151},{"className":1150},[],[1152],{"type":41,"value":1153},".deb",{"type":41,"value":1155}," \u002F AppImage via ",{"type":32,"tag":60,"props":1157,"children":1159},{"className":1158},[],[1160],{"type":41,"value":985},{"type":41,"value":1162},", plus ",{"type":32,"tag":60,"props":1164,"children":1166},{"className":1165},[],[1167],{"type":41,"value":1168},".rpm",{"type":41,"value":1170}," \u002F pacman via ",{"type":32,"tag":60,"props":1172,"children":1174},{"className":1173},[],[1175],{"type":41,"value":1176},"cargo-packager",{"type":32,"tag":454,"props":1178,"children":1179},{},[1180],{"type":41,"value":1181},"none required",{"type":32,"tag":454,"props":1183,"children":1184},{},[1185],{"type":41,"value":1186},"The tarball above; community packages for Arch, Fedora, Nix, Flathub are \"not official\"",{"type":32,"tag":454,"props":1188,"children":1189},{},[1190,1192,1198,1199],{"type":41,"value":1191},"Runtime: Vulkan 1.3, portals for file chooser, OpenURI and secrets, glibc 2.31+. — ",{"type":32,"tag":84,"props":1193,"children":1196},{"href":1194,"rel":1195},"https:\u002F\u002Fraw.githubusercontent.com\u002Fzed-industries\u002Fzed\u002Fmain\u002Fscript\u002Fbundle-linux",[88],[1197],{"type":41,"value":1194},{"type":41,"value":92},{"type":32,"tag":84,"props":1200,"children":1203},{"href":1201,"rel":1202},"https:\u002F\u002Fzed.dev\u002Fdocs\u002Flinux",[88],[1204],{"type":41,"value":1201},{"type":32,"tag":33,"props":1206,"children":1207},{},[1208,1210,1215,1217,1222,1223,1228,1230,1235,1237,1242,1244,1250,1252,1258,1259,1265,1266],{"type":41,"value":1209},"Tools: ",{"type":32,"tag":60,"props":1211,"children":1213},{"className":1212},[],[1214],{"type":41,"value":985},{"type":41,"value":1216}," 0.12 (",{"type":32,"tag":60,"props":1218,"children":1220},{"className":1219},[],[1221],{"type":41,"value":599},{"type":41,"value":92},{"type":32,"tag":60,"props":1224,"children":1226},{"className":1225},[],[1227],{"type":41,"value":1153},{"type":41,"value":1229},", AppImage, MSI experimental; signs but \"does not notarize\"), ",{"type":32,"tag":60,"props":1231,"children":1233},{"className":1232},[],[1234],{"type":41,"value":1176},{"type":41,"value":1236}," 0.11 (DMG, ",{"type":32,"tag":60,"props":1238,"children":1240},{"className":1239},[],[1241],{"type":41,"value":1153},{"type":41,"value":1243},", AppImage, pacman, NSIS, WiX, with a matching updater), ",{"type":32,"tag":60,"props":1245,"children":1247},{"className":1246},[],[1248],{"type":41,"value":1249},"cargo-dist",{"type":41,"value":1251}," 0.34 (tarballs, shell and MSI installers, GitHub Releases pipeline; CLIs, not bundles). — ",{"type":32,"tag":84,"props":1253,"children":1256},{"href":1254,"rel":1255},"https:\u002F\u002Fgithub.com\u002Fburtonageo\u002Fcargo-bundle",[88],[1257],{"type":41,"value":1254},{"type":41,"value":92},{"type":32,"tag":84,"props":1260,"children":1263},{"href":1261,"rel":1262},"https:\u002F\u002Fgithub.com\u002Fcrabnebula-dev\u002Fcargo-packager",[88],[1264],{"type":41,"value":1261},{"type":41,"value":92},{"type":32,"tag":84,"props":1267,"children":1270},{"href":1268,"rel":1269},"https:\u002F\u002Faxodotdev.github.io\u002Fcargo-dist\u002Fbook\u002Fintroduction.html",[88],[1271],{"type":41,"value":1268},{"type":32,"tag":46,"props":1273,"children":1275},{"id":1274},"_5-auto-update",[1276],{"type":41,"value":17},{"type":32,"tag":69,"props":1278,"children":1279},{},[1280,1359,1404,1414],{"type":32,"tag":73,"props":1281,"children":1282},{},[1283,1288,1289,1295,1297,1303,1305,1311,1313,1319,1321,1327,1329,1335,1337,1343,1345,1351,1353],{"type":32,"tag":37,"props":1284,"children":1285},{},[1286],{"type":41,"value":1287},"How Zed does it",{"type":41,"value":357},{"type":32,"tag":60,"props":1290,"children":1292},{"className":1291},[],[1293],{"type":41,"value":1294},"crates\u002Fauto_update",{"type":41,"value":1296},"): poll hourly (",{"type":32,"tag":60,"props":1298,"children":1300},{"className":1299},[],[1301],{"type":41,"value":1302},"POLL_INTERVAL = 60 * 60",{"type":41,"value":1304},"), ask the release endpoint for the asset by channel, OS and arch; macOS mounts the DMG and ",{"type":32,"tag":60,"props":1306,"children":1308},{"className":1307},[],[1309],{"type":41,"value":1310},"rsync --delete",{"type":41,"value":1312},"s into the running bundle's path; Linux untars and ",{"type":32,"tag":60,"props":1314,"children":1316},{"className":1315},[],[1317],{"type":41,"value":1318},"rsync",{"type":41,"value":1320},"s into the prefix; Windows runs the Inno installer ",{"type":32,"tag":60,"props":1322,"children":1324},{"className":1323},[],[1325],{"type":41,"value":1326},"\u002Fverysilent \u002Fupdate=true",{"type":41,"value":1328}," and hands off to ",{"type":32,"tag":60,"props":1330,"children":1332},{"className":1331},[],[1333],{"type":41,"value":1334},"auto_update_helper.exe",{"type":41,"value":1336}," because a running exe cannot be replaced; then ",{"type":32,"tag":60,"props":1338,"children":1340},{"className":1339},[],[1341],{"type":41,"value":1342},"set_restart_path",{"type":41,"value":1344}," + ",{"type":32,"tag":60,"props":1346,"children":1348},{"className":1347},[],[1349],{"type":41,"value":1350},"restart()",{"type":41,"value":1352},". Status machine Idle → Checking → Downloading → Installing → Updated | Errored. No checksum or signature check was found in that file; trust is HTTPS plus Gatekeeper. — ",{"type":32,"tag":84,"props":1354,"children":1357},{"href":1355,"rel":1356},"https:\u002F\u002Fraw.githubusercontent.com\u002Fzed-industries\u002Fzed\u002Fmain\u002Fcrates\u002Fauto_update\u002Fsrc\u002Fauto_update.rs",[88],[1358],{"type":41,"value":1355},{"type":32,"tag":73,"props":1360,"children":1361},{},[1362,1367,1368,1374,1376,1382,1384,1390,1391,1397,1398],{"type":32,"tag":37,"props":1363,"children":1364},{},[1365],{"type":41,"value":1366},"Alternatives",{"type":41,"value":116},{"type":32,"tag":60,"props":1369,"children":1371},{"className":1370},[],[1372],{"type":41,"value":1373},"self_update",{"type":41,"value":1375}," 1.3 (GitHub, S3 or a static manifest; zipsign signatures; single binaries, not bundles); ",{"type":32,"tag":60,"props":1377,"children":1379},{"className":1378},[],[1380],{"type":41,"value":1381},"cargo-packager-updater",{"type":41,"value":1383}," (JSON endpoint, minisign, formats app, appimage, nsis, wix); Tauri's updater (signatures \"cannot be disabled\"); Sparkle 2.10 (macOS, EdDSA, an Objective-C framework, no Rust binding found). — ",{"type":32,"tag":84,"props":1385,"children":1388},{"href":1386,"rel":1387},"https:\u002F\u002Fgithub.com\u002Fjaemk\u002Fself_update",[88],[1389],{"type":41,"value":1386},{"type":41,"value":92},{"type":32,"tag":84,"props":1392,"children":1395},{"href":1393,"rel":1394},"https:\u002F\u002Fraw.githubusercontent.com\u002Fcrabnebula-dev\u002Fcargo-packager\u002Fmain\u002Fcrates\u002Fupdater\u002FREADME.md",[88],[1396],{"type":41,"value":1393},{"type":41,"value":92},{"type":32,"tag":84,"props":1399,"children":1402},{"href":1400,"rel":1401},"https:\u002F\u002Fgithub.com\u002Fsparkle-project\u002FSparkle",[88],[1403],{"type":41,"value":1400},{"type":32,"tag":73,"props":1405,"children":1406},{},[1407,1412],{"type":32,"tag":37,"props":1408,"children":1409},{},[1410],{"type":41,"value":1411},"What the OS requires",{"type":41,"value":1413},": a replaced macOS bundle must be signed and notarized again or Gatekeeper stops it; the person needs write access to the install path; Windows needs a per-user install to avoid elevation and a helper to swap the running exe.",{"type":32,"tag":73,"props":1415,"children":1416},{},[1417,1426,1427,1433,1435,1441,1443,1449],{"type":32,"tag":37,"props":1418,"children":1419},{},[1420],{"type":32,"tag":60,"props":1421,"children":1423},{"className":1422},[],[1424],{"type":41,"value":1425},"qupdate",{"type":41,"value":357},{"type":32,"tag":60,"props":1428,"children":1430},{"className":1429},[],[1431],{"type":41,"value":1432},"..\u002Fqcontrol\u002Fcrates\u002Fqupdate",{"type":41,"value":1434},", \"Fetch and apply CI-published qcontrol binaries\") already does the sidecar check (",{"type":32,"tag":60,"props":1436,"children":1438},{"className":1437},[],[1439],{"type":41,"value":1440},"latest",{"type":41,"value":1442}," JSON with version, git SHA, artifact, SHA-256), the tarball download with integrity, and the in-place replace, with an elevation rule. What a GUI app adds: the visible status machine, a non-interruptible install phase, a \"restart to update\" affordance, a channel-aware cadence, a kill switch for package-managed installs (Zed's ",{"type":32,"tag":60,"props":1444,"children":1446},{"className":1445},[],[1447],{"type":41,"value":1448},"ZED_UPDATE_EXPLANATION",{"type":41,"value":1450},"), and a bundle-aware replace on macOS.",{"type":32,"tag":46,"props":1452,"children":1454},{"id":1453},"_6-startup-at-login",[1455],{"type":41,"value":18},{"type":32,"tag":69,"props":1457,"children":1458},{},[1459,1493,1512,1545,1572],{"type":32,"tag":73,"props":1460,"children":1461},{},[1462,1464,1470,1472,1478,1479,1485,1487],{"type":41,"value":1463},"macOS 13+: ",{"type":32,"tag":60,"props":1465,"children":1467},{"className":1466},[],[1468],{"type":41,"value":1469},"SMAppService.mainApp.register()",{"type":41,"value":1471}," (\"the application launches on subsequent logins\"; status may be ",{"type":32,"tag":60,"props":1473,"children":1475},{"className":1474},[],[1476],{"type":41,"value":1477},"requiresApproval",{"type":41,"value":938},{"type":32,"tag":60,"props":1480,"children":1482},{"className":1481},[],[1483],{"type":41,"value":1484},"openSystemSettingsLoginItems()",{"type":41,"value":1486}," sends the person to the switch). Before 13: a LaunchAgent plist. — ",{"type":32,"tag":84,"props":1488,"children":1491},{"href":1489,"rel":1490},"https:\u002F\u002Fdeveloper.apple.com\u002Fdocumentation\u002Fservicemanagement\u002Fsmappservice",[88],[1492],{"type":41,"value":1489},{"type":32,"tag":73,"props":1494,"children":1495},{},[1496,1498,1504,1506],{"type":41,"value":1497},"Windows: ",{"type":32,"tag":60,"props":1499,"children":1501},{"className":1500},[],[1502],{"type":41,"value":1503},"HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run",{"type":41,"value":1505},"; \"The system does not provide guarantees about how promptly the programs in the Run key are run\". — ",{"type":32,"tag":84,"props":1507,"children":1510},{"href":1508,"rel":1509},"https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fwindows\u002Fwin32\u002Fsetupapi\u002Frun-and-runonce-registry-keys",[88],[1511],{"type":41,"value":1508},{"type":32,"tag":73,"props":1513,"children":1514},{},[1515,1517,1522,1524,1530,1531,1537,1539],{"type":41,"value":1516},"Linux: a ",{"type":32,"tag":60,"props":1518,"children":1520},{"className":1519},[],[1521],{"type":41,"value":1138},{"type":41,"value":1523}," in ",{"type":32,"tag":60,"props":1525,"children":1527},{"className":1526},[],[1528],{"type":41,"value":1529},"~\u002F.config\u002Fautostart\u002F",{"type":41,"value":938},{"type":32,"tag":60,"props":1532,"children":1534},{"className":1533},[],[1535],{"type":41,"value":1536},"Hidden=true",{"type":41,"value":1538}," disables. — ",{"type":32,"tag":84,"props":1540,"children":1543},{"href":1541,"rel":1542},"http:\u002F\u002Fspecifications.freedesktop.org\u002Fautostart\u002Flatest\u002F",[88],[1544],{"type":41,"value":1541},{"type":32,"tag":73,"props":1546,"children":1547},{},[1548,1550,1556,1558,1564,1566],{"type":41,"value":1549},"Crates: ",{"type":32,"tag":60,"props":1551,"children":1553},{"className":1552},[],[1554],{"type":41,"value":1555},"auto-launch",{"type":41,"value":1557}," 0.6 (LaunchAgent, AppleScript or SMAppService; HKCU or HKLM Run; XDG autostart), ",{"type":32,"tag":60,"props":1559,"children":1561},{"className":1560},[],[1562],{"type":41,"value":1563},"tauri-plugin-autostart",{"type":41,"value":1565}," 2.7. — ",{"type":32,"tag":84,"props":1567,"children":1570},{"href":1568,"rel":1569},"https:\u002F\u002Fgithub.com\u002Fzzzgydi\u002Fauto-launch",[88],[1571],{"type":41,"value":1568},{"type":32,"tag":73,"props":1573,"children":1574},{},[1575],{"type":41,"value":1576},"The natural V1 shape is c131's \"tray-only mode as the default launch\": the login item starts the tray; the window opens on demand.",{"type":32,"tag":46,"props":1578,"children":1580},{"id":1579},"_7-single-instance",[1581],{"type":41,"value":19},{"type":32,"tag":69,"props":1583,"children":1584},{},[1585,1610,1643],{"type":32,"tag":73,"props":1586,"children":1587},{},[1588,1590,1596,1597,1603,1604],{"type":41,"value":1589},"Zed, per OS: macOS binds a loopback TCP port derived from the channel and the user id and exchanges a handshake string; Windows a named mutex plus a named pipe the second instance writes its arguments into; Linux a Unix datagram socket in the data dir that receives URLs. — ",{"type":32,"tag":84,"props":1591,"children":1594},{"href":1592,"rel":1593},"https:\u002F\u002Fraw.githubusercontent.com\u002Fzed-industries\u002Fzed\u002Fmain\u002Fcrates\u002Fzed\u002Fsrc\u002Fzed\u002Fmac_only_instance.rs",[88],[1595],{"type":41,"value":1592},{"type":41,"value":92},{"type":32,"tag":84,"props":1598,"children":1601},{"href":1599,"rel":1600},"https:\u002F\u002Fraw.githubusercontent.com\u002Fzed-industries\u002Fzed\u002Fmain\u002Fcrates\u002Fzed\u002Fsrc\u002Fzed\u002Fwindows_only_instance.rs",[88],[1602],{"type":41,"value":1599},{"type":41,"value":92},{"type":32,"tag":84,"props":1605,"children":1608},{"href":1606,"rel":1607},"https:\u002F\u002Fraw.githubusercontent.com\u002Fzed-industries\u002Fzed\u002Fmain\u002Fcrates\u002Fzed\u002Fsrc\u002Fzed\u002Fopen_listener.rs",[88],[1609],{"type":41,"value":1606},{"type":32,"tag":73,"props":1611,"children":1612},{},[1613,1614,1620,1622,1628,1630,1636,1637],{"type":41,"value":1549},{"type":32,"tag":60,"props":1615,"children":1617},{"className":1616},[],[1618],{"type":41,"value":1619},"single-instance",{"type":41,"value":1621}," 0.3.3 (dormant since 2021, no message forwarding), ",{"type":32,"tag":60,"props":1623,"children":1625},{"className":1624},[],[1626],{"type":41,"value":1627},"tauri-plugin-single-instance",{"type":41,"value":1629}," 2.5 (D-Bus on Linux). — ",{"type":32,"tag":84,"props":1631,"children":1634},{"href":1632,"rel":1633},"https:\u002F\u002Fcrates.io\u002Fapi\u002Fv1\u002Fcrates\u002Fsingle-instance",[88],[1635],{"type":41,"value":1632},{"type":41,"value":92},{"type":32,"tag":84,"props":1638,"children":1641},{"href":1639,"rel":1640},"https:\u002F\u002Fv2.tauri.app\u002Fplugin\u002Fsingle-instance\u002F",[88],[1642],{"type":41,"value":1639},{"type":32,"tag":73,"props":1644,"children":1645},{},[1646],{"type":41,"value":1647},"It matters because on Windows and Linux a deep link starts a new process; the second process must forward the URL to the first.",{"type":32,"tag":46,"props":1649,"children":1651},{"id":1650},"_8-deep-links-for-the-connect-flow",[1652],{"type":41,"value":20},{"type":32,"tag":69,"props":1654,"children":1655},{},[1656,1732,1806,1838],{"type":32,"tag":73,"props":1657,"children":1658},{},[1659,1664,1666,1672,1674,1680,1682,1688,1689,1695,1697,1703,1705,1710,1711,1717,1719,1725,1726],{"type":32,"tag":37,"props":1660,"children":1661},{},[1662],{"type":41,"value":1663},"Registration per OS",{"type":41,"value":1665},": macOS ",{"type":32,"tag":60,"props":1667,"children":1669},{"className":1668},[],[1670],{"type":41,"value":1671},"CFBundleURLTypes",{"type":41,"value":1673}," in the plist (cargo-bundle's ",{"type":32,"tag":60,"props":1675,"children":1677},{"className":1676},[],[1678],{"type":41,"value":1679},"url_schemes",{"type":41,"value":1681},"); Windows ",{"type":32,"tag":60,"props":1683,"children":1685},{"className":1684},[],[1686],{"type":41,"value":1687},"HKCU\\Software\\Classes\\\u003Cscheme>",{"type":41,"value":1117},{"type":32,"tag":60,"props":1690,"children":1692},{"className":1691},[],[1693],{"type":41,"value":1694},"URL Protocol",{"type":41,"value":1696}," and ",{"type":32,"tag":60,"props":1698,"children":1700},{"className":1699},[],[1701],{"type":41,"value":1702},"shell\\open\\command \"…exe\" \"%1\"",{"type":41,"value":1704}," (Zed's installer writes it); Linux ",{"type":32,"tag":60,"props":1706,"children":1708},{"className":1707},[],[1709],{"type":41,"value":1138},{"type":41,"value":209},{"type":32,"tag":60,"props":1712,"children":1714},{"className":1713},[],[1715],{"type":41,"value":1716},"MimeType=x-scheme-handler\u002F\u003Cscheme>",{"type":41,"value":1718}," plus the desktop database. Apple: \"If multiple apps register the same scheme, the app the system targets is undefined\"; validate every parameter. — ",{"type":32,"tag":84,"props":1720,"children":1723},{"href":1721,"rel":1722},"https:\u002F\u002Fdeveloper.apple.com\u002Fdocumentation\u002Fxcode\u002Fdefining-a-custom-url-scheme-for-your-app",[88],[1724],{"type":41,"value":1721},{"type":41,"value":92},{"type":32,"tag":84,"props":1727,"children":1730},{"href":1728,"rel":1729},"https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fprevious-versions\u002Fwindows\u002Finternet-explorer\u002Fie-developer\u002Fplatform-apis\u002Faa767914(v=vs.85)",[88],[1731],{"type":41,"value":1728},{"type":32,"tag":73,"props":1733,"children":1734},{},[1735,1740,1741,1747,1749,1755,1757,1763,1765,1771,1772,1778,1779,1785,1786,1792,1794,1800,1801],{"type":32,"tag":37,"props":1736,"children":1737},{},[1738],{"type":41,"value":1739},"GPUI's side",{"type":41,"value":116},{"type":32,"tag":60,"props":1742,"children":1744},{"className":1743},[],[1745],{"type":41,"value":1746},"Application::on_open_urls",{"type":41,"value":1748}," receives the URLs (macOS ",{"type":32,"tag":60,"props":1750,"children":1752},{"className":1751},[],[1753],{"type":41,"value":1754},"application:openURLs:",{"type":41,"value":1756},"; on Windows and Linux they arrive as arguments to the new process); ",{"type":32,"tag":60,"props":1758,"children":1760},{"className":1759},[],[1761],{"type":41,"value":1762},"App::register_url_scheme",{"type":41,"value":1764}," registers at runtime on macOS 12+ only, and only for a bundled, installed app; Linux and Windows return \"unimplemented\". Zed routes ",{"type":32,"tag":60,"props":1766,"children":1768},{"className":1767},[],[1769],{"type":41,"value":1770},"zed:\u002F\u002Ffile",{"type":41,"value":92},{"type":32,"tag":60,"props":1773,"children":1775},{"className":1774},[],[1776],{"type":41,"value":1777},"zed:\u002F\u002Fssh",{"type":41,"value":92},{"type":32,"tag":60,"props":1780,"children":1782},{"className":1781},[],[1783],{"type":41,"value":1784},"zed:\u002F\u002Fextension\u002F\u003Cid>",{"type":41,"value":92},{"type":32,"tag":60,"props":1787,"children":1789},{"className":1788},[],[1790],{"type":41,"value":1791},"zed:\u002F\u002Fsettings",{"type":41,"value":1793}," and more through one parser. — ",{"type":32,"tag":84,"props":1795,"children":1798},{"href":1796,"rel":1797},"https:\u002F\u002Fraw.githubusercontent.com\u002Fzed-industries\u002Fzed\u002Fmain\u002Fcrates\u002Fgpui_macos\u002Fsrc\u002Fplatform.rs",[88],[1799],{"type":41,"value":1796},{"type":41,"value":92},{"type":32,"tag":84,"props":1802,"children":1804},{"href":1606,"rel":1803},[88],[1805],{"type":41,"value":1606},{"type":32,"tag":73,"props":1807,"children":1808},{},[1809,1814,1816,1822,1824,1830,1832],{"type":32,"tag":37,"props":1810,"children":1811},{},[1812],{"type":41,"value":1813},"The alternative",{"type":41,"value":1815},": RFC 8252's loopback redirect, ",{"type":32,"tag":60,"props":1817,"children":1819},{"className":1818},[],[1820],{"type":41,"value":1821},"http:\u002F\u002F127.0.0.1:{port}\u002F…",{"type":41,"value":1823}," with PKCE, needs no registration, works in dev builds, and the server \"MUST allow any port\"; the RFC also recommends claimed ",{"type":32,"tag":60,"props":1825,"children":1827},{"className":1826},[],[1828],{"type":41,"value":1829},"https",{"type":41,"value":1831}," links where possible. Trade-off: a custom scheme needs an installed signed bundle on macOS and second-instance forwarding elsewhere; a loopback port is simpler but open to any local process during the flow, and the qcontrol sensor's own view of loopback traffic was not researched. — ",{"type":32,"tag":84,"props":1833,"children":1836},{"href":1834,"rel":1835},"https:\u002F\u002Fdatatracker.ietf.org\u002Fdoc\u002Fhtml\u002Frfc8252",[88],[1837],{"type":41,"value":1834},{"type":32,"tag":73,"props":1839,"children":1840},{},[1841],{"type":41,"value":1842},"For Tyler's Q6: the scheme is the right destination once the app is installed; loopback is the right tool for the spike and for unbundled builds.",{"type":32,"tag":46,"props":1844,"children":1846},{"id":1845},"_9-fonts-and-licensing",[1847],{"type":41,"value":21},{"type":32,"tag":419,"props":1849,"children":1850},{},[1851,1877],{"type":32,"tag":423,"props":1852,"children":1853},{},[1854],{"type":32,"tag":427,"props":1855,"children":1856},{},[1857,1862,1867,1872],{"type":32,"tag":431,"props":1858,"children":1859},{},[1860],{"type":41,"value":1861},"Font",{"type":32,"tag":431,"props":1863,"children":1864},{},[1865],{"type":41,"value":1866},"Licence",{"type":32,"tag":431,"props":1868,"children":1869},{},[1870],{"type":41,"value":1871},"Reserved Font Name",{"type":32,"tag":431,"props":1873,"children":1874},{},[1875],{"type":41,"value":1876},"Consequence",{"type":32,"tag":447,"props":1878,"children":1879},{},[1880,1909,1937],{"type":32,"tag":427,"props":1881,"children":1882},{},[1883,1888,1893,1898],{"type":32,"tag":454,"props":1884,"children":1885},{},[1886],{"type":41,"value":1887},"Inter 4.1",{"type":32,"tag":454,"props":1889,"children":1890},{},[1891],{"type":41,"value":1892},"SIL OFL 1.1",{"type":32,"tag":454,"props":1894,"children":1895},{},[1896],{"type":41,"value":1897},"\"Inter\"",{"type":32,"tag":454,"props":1899,"children":1900},{},[1901,1903],{"type":41,"value":1902},"Ship the unmodified file under its own name; a subset or format change is a Modified Version and must be renamed. — ",{"type":32,"tag":84,"props":1904,"children":1907},{"href":1905,"rel":1906},"https:\u002F\u002Fgithub.com\u002Frsms\u002Finter",[88],[1908],{"type":41,"value":1905},{"type":32,"tag":427,"props":1910,"children":1911},{},[1912,1917,1921,1926],{"type":32,"tag":454,"props":1913,"children":1914},{},[1915],{"type":41,"value":1916},"Geist Mono 1.9.2",{"type":32,"tag":454,"props":1918,"children":1919},{},[1920],{"type":41,"value":1892},{"type":32,"tag":454,"props":1922,"children":1923},{},[1924],{"type":41,"value":1925},"none in the licence header",{"type":32,"tag":454,"props":1927,"children":1928},{},[1929,1931],{"type":41,"value":1930},"Simpler to subset or rename; confirm the embedded licence strings first. — ",{"type":32,"tag":84,"props":1932,"children":1935},{"href":1933,"rel":1934},"https:\u002F\u002Fgithub.com\u002Fvercel\u002Fgeist-font",[88],[1936],{"type":41,"value":1933},{"type":32,"tag":427,"props":1938,"children":1939},{},[1940,1945,1949,1954],{"type":32,"tag":454,"props":1941,"children":1942},{},[1943],{"type":41,"value":1944},"IBM Plex Mono",{"type":32,"tag":454,"props":1946,"children":1947},{},[1948],{"type":41,"value":1892},{"type":32,"tag":454,"props":1950,"children":1951},{},[1952],{"type":41,"value":1953},"\"Plex\"",{"type":32,"tag":454,"props":1955,"children":1956},{},[1957,1959,1965,1966],{"type":41,"value":1958},"Zed's \"Zed Plex Mono\" had to be withdrawn: it \"conflicts with the open font license due to the use of 'Plex' in the name\". — ",{"type":32,"tag":84,"props":1960,"children":1963},{"href":1961,"rel":1962},"https:\u002F\u002Fraw.githubusercontent.com\u002FIBM\u002Fplex\u002Fmaster\u002FLICENSE.txt",[88],[1964],{"type":41,"value":1961},{"type":41,"value":92},{"type":32,"tag":84,"props":1967,"children":1970},{"href":1968,"rel":1969},"https:\u002F\u002Fgithub.com\u002Fzed-industries\u002Fzed-fonts",[88],[1971],{"type":41,"value":1968},{"type":32,"tag":69,"props":1973,"children":1974},{},[1975,1986,2063],{"type":32,"tag":73,"props":1976,"children":1977},{},[1978,1980],{"type":41,"value":1979},"The OFL permits bundling in sold software; \"At a minimum you must include the copyright statement, the license notice and the license text.\" — ",{"type":32,"tag":84,"props":1981,"children":1984},{"href":1982,"rel":1983},"https:\u002F\u002Fopenfontlicense.org\u002Fofl-faq\u002F",[88],[1985],{"type":41,"value":1982},{"type":32,"tag":73,"props":1987,"children":1988},{},[1989,1994,1996,2002,2004,2010,2011,2017,2018,2024,2026,2032,2034,2040,2042,2048,2050,2056,2057],{"type":32,"tag":37,"props":1990,"children":1991},{},[1992],{"type":41,"value":1993},"Ruled (c131 D14, 2026-11-09): Inter for the UI and Geist Mono for code, both bundled, not the system font.",{"type":41,"value":1995}," The kit's path is one call at startup, before any window opens: ",{"type":32,"tag":60,"props":1997,"children":1999},{"className":1998},[],[2000],{"type":41,"value":2001},"cx.text_system().add_fonts(vec![Cow::Borrowed(include_bytes!(\"..\u002Ffonts\u002FInter-Regular.ttf\").as_slice())])",{"type":41,"value":2003},", then ",{"type":32,"tag":60,"props":2005,"children":2007},{"className":2006},[],[2008],{"type":41,"value":2009},"Theme::update(cx, |theme| theme.font_family = \"Inter\".into())",{"type":41,"value":254},{"type":32,"tag":60,"props":2012,"children":2014},{"className":2013},[],[2015],{"type":41,"value":2016},"\"font.family\": \"Inter\"",{"type":41,"value":1696},{"type":32,"tag":60,"props":2019,"children":2021},{"className":2020},[],[2022],{"type":41,"value":2023},"\"mono_font.family\": \"Geist Mono\"",{"type":41,"value":2025}," in the theme JSON. Register every face the UI uses (\"a single regular file is not a promise of all styles\"); refer to the family by the name inside the file, which for the variable ",{"type":32,"tag":60,"props":2027,"children":2029},{"className":2028},[],[2030],{"type":41,"value":2031},"Inter-Regular.ttf",{"type":41,"value":2033}," the kit bundles in its web gallery is \"Inter Variable\", not \"Inter\"; the docs add \"Keep the font's redistribution license with the app\". If the family fails to load, GPUI falls back to its default stack; if nothing loads, layout panics, so the spike checks the load on all three OSes. Zed does the same at a larger scale: every ",{"type":32,"tag":60,"props":2035,"children":2037},{"className":2036},[],[2038],{"type":41,"value":2039},".ttf",{"type":41,"value":2041}," under ",{"type":32,"tag":60,"props":2043,"children":2045},{"className":2044},[],[2046],{"type":41,"value":2047},"assets\u002Ffonts",{"type":41,"value":2049}," on the background executor, named through aliases. — ",{"type":32,"tag":84,"props":2051,"children":2054},{"href":2052,"rel":2053},"https:\u002F\u002Fgpui-kit.com\u002Fdocs\u002Ffonts.md",[88],[2055],{"type":41,"value":2052},{"type":41,"value":92},{"type":32,"tag":84,"props":2058,"children":2061},{"href":2059,"rel":2060},"https:\u002F\u002Fraw.githubusercontent.com\u002Fzed-industries\u002Fzed\u002Fmain\u002Fcrates\u002Fzed\u002Fsrc\u002Fmain.rs",[88],[2062],{"type":41,"value":2059},{"type":32,"tag":73,"props":2064,"children":2065},{},[2066],{"type":41,"value":2067},"The OFL side of that ruling: ship the unmodified Inter file under its own name (Reserved Font Name \"Inter\"); a subset or a renamed build is a Modified Version. c131 Q5 is therefore closed as a product choice; what remains is the licence text in the bundle.",{"type":32,"tag":46,"props":2069,"children":2071},{"id":2070},"_10-minimum-os-versions-and-hardware",[2072],{"type":41,"value":22},{"type":32,"tag":419,"props":2074,"children":2075},{},[2076,2101],{"type":32,"tag":423,"props":2077,"children":2078},{},[2079],{"type":32,"tag":427,"props":2080,"children":2081},{},[2082,2086,2091,2096],{"type":32,"tag":431,"props":2083,"children":2084},{},[2085],{"type":41,"value":890},{"type":32,"tag":431,"props":2087,"children":2088},{},[2089],{"type":41,"value":2090},"Zed's runtime floor",{"type":32,"tag":431,"props":2092,"children":2093},{},[2094],{"type":41,"value":2095},"The kit's requirements page",{"type":32,"tag":431,"props":2097,"children":2098},{},[2099],{"type":41,"value":2100},"Notes",{"type":32,"tag":447,"props":2102,"children":2103},{},[2104,2146,2174],{"type":32,"tag":427,"props":2105,"children":2106},{},[2107,2111,2123,2128],{"type":32,"tag":454,"props":2108,"children":2109},{},[2110],{"type":41,"value":631},{"type":32,"tag":454,"props":2112,"children":2113},{},[2114,2116,2121],{"type":41,"value":2115},"12.0 Monterey, Intel and Apple silicon (",{"type":32,"tag":60,"props":2117,"children":2119},{"className":2118},[],[2120],{"type":41,"value":992},{"type":41,"value":2122},")",{"type":32,"tag":454,"props":2124,"children":2125},{},[2126],{"type":41,"value":2127},"\"macOS 15 or later\" (reads as the build machine; unverified as a runtime floor)",{"type":32,"tag":454,"props":2129,"children":2130},{},[2131,2133,2139,2140],{"type":41,"value":2132},"Metal is always present. If nsh is ever embedded, its floor is macOS 14. — ",{"type":32,"tag":84,"props":2134,"children":2137},{"href":2135,"rel":2136},"https:\u002F\u002Fzed.dev\u002Fdocs\u002Finstallation",[88],[2138],{"type":41,"value":2135},{"type":41,"value":92},{"type":32,"tag":84,"props":2141,"children":2144},{"href":2142,"rel":2143},"https:\u002F\u002Fgpui-kit.com\u002Fdocs\u002Finstallation",[88],[2145],{"type":41,"value":2142},{"type":32,"tag":427,"props":2147,"children":2148},{},[2149,2153,2158,2163],{"type":32,"tag":454,"props":2150,"children":2151},{},[2152],{"type":41,"value":678},{"type":32,"tag":454,"props":2154,"children":2155},{},[2156],{"type":41,"value":2157},"Windows 10 1903+ and 11 22H2+, 64-bit, x64 and Arm64; \"a GPU supporting DirectX 11\" with a vendor driver, \"not the Microsoft Basic Display Adapter\"",{"type":32,"tag":454,"props":2159,"children":2160},{},[2161],{"type":41,"value":2162},"Windows 10 or later, MSVC toolchain",{"type":32,"tag":454,"props":2164,"children":2165},{},[2166,2168],{"type":41,"value":2167},"VMs and RDP sessions on the basic adapter are outside the stated support. — ",{"type":32,"tag":84,"props":2169,"children":2172},{"href":2170,"rel":2171},"https:\u002F\u002Fzed.dev\u002Fdocs\u002Fwindows",[88],[2173],{"type":41,"value":2170},{"type":32,"tag":427,"props":2175,"children":2176},{},[2177,2181,2186,2191],{"type":32,"tag":454,"props":2178,"children":2179},{},[2180],{"type":41,"value":709},{"type":32,"tag":454,"props":2182,"children":2183},{},[2184],{"type":41,"value":2185},"x86_64 and aarch64; \"a Vulkan 1.3 driver is required\"; glibc 2.31+; Wayland or X11; portals",{"type":32,"tag":454,"props":2187,"children":2188},{},[2189],{"type":41,"value":2190},"Ubuntu 24.04 verified; Vulkan, Wayland or X11, fontconfig, xkbcommon",{"type":32,"tag":454,"props":2192,"children":2193},{},[2194,2196,2201,2202],{"type":41,"value":2195},"\"Zed failed to open a window\" is the symptom of no Vulkan 1.3 device; software rendering is an opt-in, slow path at best. — ",{"type":32,"tag":84,"props":2197,"children":2199},{"href":1201,"rel":2198},[88],[2200],{"type":41,"value":1201},{"type":41,"value":92},{"type":32,"tag":84,"props":2203,"children":2206},{"href":2204,"rel":2205},"https:\u002F\u002Fgithub.com\u002Fzed-industries\u002Fzed\u002Fissues\u002F16428",[88],[2207],{"type":41,"value":2204},{"type":32,"tag":33,"props":2209,"children":2210},{},[2211],{"type":41,"value":2212},"For employee laptops: any Mac on macOS 12 qualifies; Windows needs a 2012-or-later GPU with a real driver; Linux VMs without Vulkan get no window. The app needs a \"GPU unavailable\" state that still shows the tray or a plain message rather than nothing (c131 R5).",{"type":32,"tag":46,"props":2214,"children":2216},{"id":2215},"_11-measuring-the-footprint",[2217],{"type":41,"value":23},{"type":32,"tag":69,"props":2219,"children":2220},{},[2221,2333,2395,2475],{"type":32,"tag":73,"props":2222,"children":2223},{},[2224,2229,2231,2237,2239,2245,2247,2253,2255,2260,2262,2268,2269,2275,2276,2282,2283,2289,2290,2296,2298,2304,2305,2311,2313,2319,2320,2326,2327],{"type":32,"tag":37,"props":2225,"children":2226},{},[2227],{"type":41,"value":2228},"strobe",{"type":41,"value":2230}," (github.com\u002Fanomalyco\u002Fstrobe): \"One tool for web, Electron and native apps on Windows, macOS and Linux.\" Install ",{"type":32,"tag":60,"props":2232,"children":2234},{"className":2233},[],[2235],{"type":41,"value":2236},"bun add -d @hona\u002Fstrobe && bunx strobe up",{"type":41,"value":2238}," once per machine; ",{"type":32,"tag":60,"props":2240,"children":2242},{"className":2241},[],[2243],{"type":41,"value":2244},"strobe up",{"type":41,"value":2246}," also installs the agent skill (",{"type":32,"tag":60,"props":2248,"children":2250},{"className":2249},[],[2251],{"type":41,"value":2252},"skill\u002FSKILL.md",{"type":41,"value":2254},", name ",{"type":32,"tag":60,"props":2256,"children":2258},{"className":2257},[],[2259],{"type":41,"value":2228},{"type":41,"value":2261},") and sets up the daemon and the MCP server (five tools: ",{"type":32,"tag":60,"props":2263,"children":2265},{"className":2264},[],[2266],{"type":41,"value":2267},"status",{"type":41,"value":92},{"type":32,"tag":60,"props":2270,"children":2272},{"className":2271},[],[2273],{"type":41,"value":2274},"record",{"type":41,"value":92},{"type":32,"tag":60,"props":2277,"children":2279},{"className":2278},[],[2280],{"type":41,"value":2281},"bench",{"type":41,"value":92},{"type":32,"tag":60,"props":2284,"children":2286},{"className":2285},[],[2287],{"type":41,"value":2288},"query",{"type":41,"value":92},{"type":32,"tag":60,"props":2291,"children":2293},{"className":2292},[],[2294],{"type":41,"value":2295},"report",{"type":41,"value":2297},", each \"exactly a CLI command\"). Workspace version 0.26.0, npm 0.25.0 published 2026-11-09, five versions in two days, 141 stars, no GitHub release or tag; ",{"type":32,"tag":60,"props":2299,"children":2301},{"className":2300},[],[2302],{"type":41,"value":2303},"license = \"MIT\"",{"type":41,"value":1523},{"type":32,"tag":60,"props":2306,"children":2308},{"className":2307},[],[2309],{"type":41,"value":2310},"Cargo.toml",{"type":41,"value":2312}," but no LICENSE file in the repo. — ",{"type":32,"tag":84,"props":2314,"children":2317},{"href":2315,"rel":2316},"https:\u002F\u002Fraw.githubusercontent.com\u002Fanomalyco\u002Fstrobe\u002Fmain\u002FREADME.md",[88],[2318],{"type":41,"value":2315},{"type":41,"value":92},{"type":32,"tag":84,"props":2321,"children":2324},{"href":2322,"rel":2323},"https:\u002F\u002Fraw.githubusercontent.com\u002Fanomalyco\u002Fstrobe\u002Fmain\u002Fskill\u002FSKILL.md",[88],[2325],{"type":41,"value":2322},{"type":41,"value":92},{"type":32,"tag":84,"props":2328,"children":2331},{"href":2329,"rel":2330},"https:\u002F\u002Fregistry.npmjs.org\u002F@hona\u002Fstrobe",[88],[2332],{"type":41,"value":2329},{"type":32,"tag":73,"props":2334,"children":2335},{},[2336,2341,2343,2349,2350,2356,2357,2363,2365,2371,2373,2379,2381,2387,2389],{"type":32,"tag":37,"props":2337,"children":2338},{},[2339],{"type":41,"value":2340},"The recipe for our budget",{"type":41,"value":2342}," (from the skill): ",{"type":32,"tag":60,"props":2344,"children":2346},{"className":2345},[],[2347],{"type":41,"value":2348},"strobe record exe:\u003Cpath> --native --windowless --for 60s",{"type":41,"value":2003},{"type":32,"tag":60,"props":2351,"children":2353},{"className":2352},[],[2354],{"type":41,"value":2355},"query \u003Crec> memory",{"type":41,"value":92},{"type":32,"tag":60,"props":2358,"children":2360},{"className":2359},[],[2361],{"type":41,"value":2362},"threads",{"type":41,"value":2364}," (wakes per second and CPU per thread) and ",{"type":32,"tag":60,"props":2366,"children":2368},{"className":2367},[],[2369],{"type":41,"value":2370},"insights",{"type":41,"value":2372}," (idle wake-ups). ",{"type":32,"tag":60,"props":2374,"children":2376},{"className":2375},[],[2377],{"type":41,"value":2378},"memory.app.private",{"type":41,"value":2380}," is Windows private commit, macOS physical footprint, Linux ",{"type":32,"tag":60,"props":2382,"children":2384},{"className":2383},[],[2385],{"type":41,"value":2386},"smaps_rollup",{"type":41,"value":2388}," anonymous plus swapped pages; the spec's own example is a tray app. — ",{"type":32,"tag":84,"props":2390,"children":2393},{"href":2391,"rel":2392},"https:\u002F\u002Fraw.githubusercontent.com\u002Fanomalyco\u002Fstrobe\u002Fmain\u002FSPEC.md",[88],[2394],{"type":41,"value":2391},{"type":32,"tag":73,"props":2396,"children":2397},{},[2398,2403,2404,2410,2411,2417,2419,2425,2426,2432,2433,2439,2440,2446,2447,2453,2455,2461,2462,2468,2469],{"type":32,"tag":37,"props":2399,"children":2400},{},[2401],{"type":41,"value":2402},"By hand, per OS",{"type":41,"value":1665},{"type":32,"tag":60,"props":2405,"children":2407},{"className":2406},[],[2408],{"type":41,"value":2409},"footprint -p \u003Cpid>",{"type":41,"value":357},{"type":32,"tag":60,"props":2412,"children":2414},{"className":2413},[],[2415],{"type":41,"value":2416},"phys_footprint",{"type":41,"value":2418},", dirty memory, which Apple's man page prefers over RSS); Linux ",{"type":32,"tag":60,"props":2420,"children":2422},{"className":2421},[],[2423],{"type":41,"value":2424},"\u002Fproc\u002F\u003Cpid>\u002Fsmaps_rollup",{"type":41,"value":357},{"type":32,"tag":60,"props":2427,"children":2429},{"className":2428},[],[2430],{"type":41,"value":2431},"Anonymous",{"type":41,"value":92},{"type":32,"tag":60,"props":2434,"children":2436},{"className":2435},[],[2437],{"type":41,"value":2438},"Swap",{"type":41,"value":92},{"type":32,"tag":60,"props":2441,"children":2443},{"className":2442},[],[2444],{"type":41,"value":2445},"Pss",{"type":41,"value":1681},{"type":32,"tag":60,"props":2448,"children":2450},{"className":2449},[],[2451],{"type":41,"value":2452},"PrivateUsage",{"type":41,"value":2454}," and the private working set. — ",{"type":32,"tag":84,"props":2456,"children":2459},{"href":2457,"rel":2458},"https:\u002F\u002Fmanp.gs\u002Fmac\u002F1\u002Ffootprint",[88],[2460],{"type":41,"value":2457},{"type":41,"value":92},{"type":32,"tag":84,"props":2463,"children":2466},{"href":2464,"rel":2465},"https:\u002F\u002Fman7.org\u002Flinux\u002Fman-pages\u002Fman5\u002Fproc_pid_status.5.html",[88],[2467],{"type":41,"value":2464},{"type":41,"value":92},{"type":32,"tag":84,"props":2470,"children":2473},{"href":2471,"rel":2472},"https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fwindows\u002Fwin32\u002Fapi\u002Fpsapi\u002Fns-psapi-process_memory_counters_ex",[88],[2474],{"type":41,"value":2471},{"type":32,"tag":73,"props":2476,"children":2477},{},[2478,2483,2485,2490],{"type":32,"tag":37,"props":2479,"children":2480},{},[2481],{"type":41,"value":2482},"State the budget as",{"type":41,"value":2484}," \"",{"type":32,"tag":60,"props":2486,"children":2488},{"className":2487},[],[2489],{"type":41,"value":2378},{"type":41,"value":2491},", idle, windowless, after 60 s\" plus idle CPU and wakes per second, binary size and time to first frame, per OS, per release (c131 R7). Never RSS alone: it undercounts swapped pages and overcounts shared clean ones, and it differs per OS.",{"type":32,"tag":46,"props":2493,"children":2495},{"id":2494},"what-the-spike-must-test-c131-phase-0",[2496],{"type":41,"value":24},{"type":32,"tag":2498,"props":2499,"children":2500},"ol",{},[2501,2519,2538,2559,2571],{"type":32,"tag":73,"props":2502,"children":2503},{},[2504,2506,2511,2512,2517],{"type":41,"value":2505},"Tray path B, then A, on macOS: does the window and the tray survive together on GPUI's loop; do ",{"type":32,"tag":60,"props":2507,"children":2509},{"className":2508},[],[2510],{"type":41,"value":122},{"type":41,"value":1696},{"type":32,"tag":60,"props":2513,"children":2515},{"className":2514},[],[2516],{"type":41,"value":130},{"type":41,"value":2518}," exist in the pinned snapshot.",{"type":32,"tag":73,"props":2520,"children":2521},{},[2522,2524,2529,2531,2536],{"type":41,"value":2523},"A notification from an unbundled ",{"type":32,"tag":60,"props":2525,"children":2527},{"className":2526},[],[2528],{"type":41,"value":591},{"type":41,"value":2530}," (expected: nothing on macOS), then from a bundled ",{"type":32,"tag":60,"props":2532,"children":2534},{"className":2533},[],[2535],{"type":41,"value":599},{"type":41,"value":2537},".",{"type":32,"tag":73,"props":2539,"children":2540},{},[2541,2543,2549,2551,2557],{"type":41,"value":2542},"A ",{"type":32,"tag":60,"props":2544,"children":2546},{"className":2545},[],[2547],{"type":41,"value":2548},"qpoint:\u002F\u002Fconnect?...",{"type":41,"value":2550}," link on macOS through ",{"type":32,"tag":60,"props":2552,"children":2554},{"className":2553},[],[2555],{"type":41,"value":2556},"on_open_urls",{"type":41,"value":2558},", and a loopback redirect, both against the fixture plane.",{"type":32,"tag":73,"props":2560,"children":2561},{},[2562,2564,2569],{"type":41,"value":2563},"Idle ",{"type":32,"tag":60,"props":2565,"children":2567},{"className":2566},[],[2568],{"type":41,"value":2378},{"type":41,"value":2570},", CPU and wakes with strobe for the hello app with a table bound to the fixture world, on Mark's Mac; Windows and Linux in CI, numbers recorded even when the build fails.",{"type":32,"tag":73,"props":2572,"children":2573},{},[2574],{"type":41,"value":2575},"Whether the Linux build opens a window in a VM without Vulkan 1.3, and what the app says when it cannot.",{"type":32,"tag":46,"props":2577,"children":2579},{"id":2578},"open-questions-for-tylers-session",[2580],{"type":41,"value":25},{"type":32,"tag":69,"props":2582,"children":2583},{},[2584,2589,2594,2606,2611],{"type":32,"tag":73,"props":2585,"children":2586},{},[2587],{"type":41,"value":2588},"Q4: tray path A, B or C; and whether Windows and Linux trays are V1 or later.",{"type":32,"tag":73,"props":2590,"children":2591},{},[2592],{"type":41,"value":2593},"Q5: notifications in or out; if in, the installed-and-signed prerequisite applies on macOS and Windows.",{"type":32,"tag":73,"props":2595,"children":2596},{},[2597,2599,2604],{"type":41,"value":2598},"Q7: who holds the Apple Developer ID and the Windows signing account; per-user Windows install (no UAC) as the default; which Linux formats; does ",{"type":32,"tag":60,"props":2600,"children":2602},{"className":2601},[],[2603],{"type":41,"value":1425},{"type":41,"value":2605}," grow bundle-awareness or does the app get its own updater.",{"type":32,"tag":73,"props":2607,"children":2608},{},[2609],{"type":41,"value":2610},"Q9: the macOS floor (12 as Zed, or higher), DirectX 11 and Vulkan 1.3 as stated hardware requirements, and the GPU-unavailable fallback.",{"type":32,"tag":73,"props":2612,"children":2613},{},[2614,2616,2621,2623,2628],{"type":41,"value":2615},"Not answerable by reading: whether ",{"type":32,"tag":60,"props":2617,"children":2619},{"className":2618},[],[2620],{"type":41,"value":215},{"type":41,"value":2622}," builds against gpui-kit 0.9.x; which GPUI features the kit's ",{"type":32,"tag":60,"props":2624,"children":2626},{"className":2625},[],[2627],{"type":41,"value":168},{"type":41,"value":2629}," pin exposes; Windows toasts from an unpackaged app on current Windows 11; whether an in-place macOS update keeps TCC permissions; whether the sensor sees loopback OAuth traffic.",{"type":32,"tag":46,"props":2631,"children":2633},{"id":2632},"sources",[2634],{"type":41,"value":26},{"type":32,"tag":33,"props":2636,"children":2637},{},[2638,2640,2645,2647,2652,2653,2659,2660,2665,2666,2671,2672,2677,2678,2683,2684,2689,2690,2695,2696,2701,2702,2707,2708,2713,2714,2720,2721,2727,2729,2734,2735,2740,2741,2746,2747,2753,2754,2759,2760,2765,2766,2771,2772,2777,2778,2784,2786,2791,2792,2798,2799,2804,2805,2811,2812,2817,2818,2823,2824,2829,2830,2835,2836,2842,2843,2849,2850,2855,2856,2862,2863,2868,2869,2874,2875,2880,2881,2886,2887,2892,2893,2899,2900,2905,2906,2912,2914,2919,2920,2925,2926,2931,2932,2937,2938,2943,2944,2949,2950,2955,2956,2961,2962,2968,2969,2974,2975,2980,2981,2986,2987,2992,2994,2999,3000,3005,3006,3011,3012,3017,3018,3023,3024,3030,3031,3036,3037,3042,3043,3048,3049,3054,3055,3060,3061,3066,3067,3072,3073,3078,3079,3084,3085,3090,3091,3096,3097],{"type":41,"value":2639},"Tray: ",{"type":32,"tag":84,"props":2641,"children":2643},{"href":337,"rel":2642},[88],[2644],{"type":41,"value":337},{"type":41,"value":2646}," · ",{"type":32,"tag":84,"props":2648,"children":2650},{"href":344,"rel":2649},[88],[2651],{"type":41,"value":344},{"type":41,"value":2646},{"type":32,"tag":84,"props":2654,"children":2657},{"href":2655,"rel":2656},"https:\u002F\u002Fcrates.io\u002Fapi\u002Fv1\u002Fcrates\u002Fksni",[88],[2658],{"type":41,"value":2655},{"type":41,"value":2646},{"type":32,"tag":84,"props":2661,"children":2663},{"href":86,"rel":2662},[88],[2664],{"type":41,"value":86},{"type":41,"value":2646},{"type":32,"tag":84,"props":2667,"children":2669},{"href":95,"rel":2668},[88],[2670],{"type":41,"value":95},{"type":41,"value":2646},{"type":32,"tag":84,"props":2673,"children":2675},{"href":280,"rel":2674},[88],[2676],{"type":41,"value":280},{"type":41,"value":2646},{"type":32,"tag":84,"props":2679,"children":2681},{"href":287,"rel":2680},[88],[2682],{"type":41,"value":287},{"type":41,"value":2646},{"type":32,"tag":84,"props":2685,"children":2687},{"href":196,"rel":2686},[88],[2688],{"type":41,"value":196},{"type":41,"value":2646},{"type":32,"tag":84,"props":2691,"children":2693},{"href":189,"rel":2692},[88],[2694],{"type":41,"value":189},{"type":41,"value":2646},{"type":32,"tag":84,"props":2697,"children":2699},{"href":173,"rel":2698},[88],[2700],{"type":41,"value":173},{"type":41,"value":2646},{"type":32,"tag":84,"props":2703,"children":2705},{"href":407,"rel":2704},[88],[2706],{"type":41,"value":407},{"type":41,"value":2646},{"type":32,"tag":84,"props":2709,"children":2711},{"href":414,"rel":2710},[88],[2712],{"type":41,"value":414},{"type":41,"value":2646},{"type":32,"tag":60,"props":2715,"children":2717},{"className":2716},[],[2718],{"type":41,"value":2719},"..\u002Fqcontrol\u002Fcrates\u002Fqtray\u002FCargo.toml",{"type":41,"value":1696},{"type":32,"tag":60,"props":2722,"children":2724},{"className":2723},[],[2725],{"type":41,"value":2726},"src\u002Ftray.rs",{"type":41,"value":2728},"\nNotifications and menus: ",{"type":32,"tag":84,"props":2730,"children":2732},{"href":620,"rel":2731},[88],[2733],{"type":41,"value":620},{"type":41,"value":2646},{"type":32,"tag":84,"props":2736,"children":2738},{"href":660,"rel":2737},[88],[2739],{"type":41,"value":660},{"type":41,"value":2646},{"type":32,"tag":84,"props":2742,"children":2744},{"href":691,"rel":2743},[88],[2745],{"type":41,"value":691},{"type":41,"value":2646},{"type":32,"tag":84,"props":2748,"children":2751},{"href":2749,"rel":2750},"https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fwindows\u002Fapps\u002Fdevelop\u002Fnotifications\u002Fapp-notifications\u002Fapp-notifications-quickstart",[88],[2752],{"type":41,"value":2749},{"type":41,"value":2646},{"type":32,"tag":84,"props":2755,"children":2757},{"href":722,"rel":2756},[88],[2758],{"type":41,"value":722},{"type":41,"value":2646},{"type":32,"tag":84,"props":2761,"children":2763},{"href":667,"rel":2762},[88],[2764],{"type":41,"value":667},{"type":41,"value":2646},{"type":32,"tag":84,"props":2767,"children":2769},{"href":811,"rel":2768},[88],[2770],{"type":41,"value":811},{"type":41,"value":2646},{"type":32,"tag":84,"props":2773,"children":2775},{"href":868,"rel":2774},[88],[2776],{"type":41,"value":868},{"type":41,"value":2646},{"type":32,"tag":84,"props":2779,"children":2782},{"href":2780,"rel":2781},"https:\u002F\u002Fgithub.com\u002Ftauri-apps\u002Fmuda",[88],[2783],{"type":41,"value":2780},{"type":41,"value":2785},"\nPackaging and updates: ",{"type":32,"tag":84,"props":2787,"children":2789},{"href":1018,"rel":2788},[88],[2790],{"type":41,"value":1018},{"type":41,"value":2646},{"type":32,"tag":84,"props":2793,"children":2796},{"href":2794,"rel":2795},"https:\u002F\u002Fdeveloper.apple.com\u002Fdocumentation\u002Fsecurity\u002Fhardened-runtime",[88],[2797],{"type":41,"value":2794},{"type":41,"value":2646},{"type":32,"tag":84,"props":2800,"children":2802},{"href":1025,"rel":2801},[88],[2803],{"type":41,"value":1025},{"type":41,"value":2646},{"type":32,"tag":84,"props":2806,"children":2809},{"href":2807,"rel":2808},"https:\u002F\u002Fdeveloper.apple.com\u002Fprograms\u002F",[88],[2810],{"type":41,"value":2807},{"type":41,"value":2646},{"type":32,"tag":84,"props":2813,"children":2815},{"href":1032,"rel":2814},[88],[2816],{"type":41,"value":1032},{"type":41,"value":2646},{"type":32,"tag":84,"props":2819,"children":2821},{"href":698,"rel":2820},[88],[2822],{"type":41,"value":698},{"type":41,"value":2646},{"type":32,"tag":84,"props":2825,"children":2827},{"href":1089,"rel":2826},[88],[2828],{"type":41,"value":1089},{"type":41,"value":2646},{"type":32,"tag":84,"props":2831,"children":2833},{"href":1096,"rel":2832},[88],[2834],{"type":41,"value":1096},{"type":41,"value":2646},{"type":32,"tag":84,"props":2837,"children":2840},{"href":2838,"rel":2839},"https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fazure\u002Fartifact-signing\u002Fquickstart",[88],[2841],{"type":41,"value":2838},{"type":41,"value":2646},{"type":32,"tag":84,"props":2844,"children":2847},{"href":2845,"rel":2846},"https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fwindows\u002Fpackage-manager\u002Fpackage\u002Frepository",[88],[2848],{"type":41,"value":2845},{"type":41,"value":2646},{"type":32,"tag":84,"props":2851,"children":2853},{"href":1194,"rel":2852},[88],[2854],{"type":41,"value":1194},{"type":41,"value":2646},{"type":32,"tag":84,"props":2857,"children":2860},{"href":2858,"rel":2859},"https:\u002F\u002Fraw.githubusercontent.com\u002Fzed-industries\u002Fzed\u002Fmain\u002Fscript\u002Finstall.sh",[88],[2861],{"type":41,"value":2858},{"type":41,"value":2646},{"type":32,"tag":84,"props":2864,"children":2866},{"href":1254,"rel":2865},[88],[2867],{"type":41,"value":1254},{"type":41,"value":2646},{"type":32,"tag":84,"props":2870,"children":2872},{"href":1261,"rel":2871},[88],[2873],{"type":41,"value":1261},{"type":41,"value":2646},{"type":32,"tag":84,"props":2876,"children":2878},{"href":1268,"rel":2877},[88],[2879],{"type":41,"value":1268},{"type":41,"value":2646},{"type":32,"tag":84,"props":2882,"children":2884},{"href":1355,"rel":2883},[88],[2885],{"type":41,"value":1355},{"type":41,"value":2646},{"type":32,"tag":84,"props":2888,"children":2890},{"href":1386,"rel":2889},[88],[2891],{"type":41,"value":1386},{"type":41,"value":2646},{"type":32,"tag":84,"props":2894,"children":2897},{"href":2895,"rel":2896},"https:\u002F\u002Fv2.tauri.app\u002Fplugin\u002Fupdater\u002F",[88],[2898],{"type":41,"value":2895},{"type":41,"value":2646},{"type":32,"tag":84,"props":2901,"children":2903},{"href":1400,"rel":2902},[88],[2904],{"type":41,"value":1400},{"type":41,"value":2646},{"type":32,"tag":60,"props":2907,"children":2909},{"className":2908},[],[2910],{"type":41,"value":2911},"..\u002Fqcontrol\u002Fcrates\u002Fqupdate\u002Fsrc\u002Flib.rs",{"type":41,"value":2913},"\nLogin, instance, links: ",{"type":32,"tag":84,"props":2915,"children":2917},{"href":1489,"rel":2916},[88],[2918],{"type":41,"value":1489},{"type":41,"value":2646},{"type":32,"tag":84,"props":2921,"children":2923},{"href":1508,"rel":2922},[88],[2924],{"type":41,"value":1508},{"type":41,"value":2646},{"type":32,"tag":84,"props":2927,"children":2929},{"href":1541,"rel":2928},[88],[2930],{"type":41,"value":1541},{"type":41,"value":2646},{"type":32,"tag":84,"props":2933,"children":2935},{"href":1568,"rel":2934},[88],[2936],{"type":41,"value":1568},{"type":41,"value":2646},{"type":32,"tag":84,"props":2939,"children":2941},{"href":1592,"rel":2940},[88],[2942],{"type":41,"value":1592},{"type":41,"value":2646},{"type":32,"tag":84,"props":2945,"children":2947},{"href":1599,"rel":2946},[88],[2948],{"type":41,"value":1599},{"type":41,"value":2646},{"type":32,"tag":84,"props":2951,"children":2953},{"href":1606,"rel":2952},[88],[2954],{"type":41,"value":1606},{"type":41,"value":2646},{"type":32,"tag":84,"props":2957,"children":2959},{"href":1639,"rel":2958},[88],[2960],{"type":41,"value":1639},{"type":41,"value":2646},{"type":32,"tag":84,"props":2963,"children":2966},{"href":2964,"rel":2965},"https:\u002F\u002Fv2.tauri.app\u002Fplugin\u002Fdeep-linking\u002F",[88],[2967],{"type":41,"value":2964},{"type":41,"value":2646},{"type":32,"tag":84,"props":2970,"children":2972},{"href":1721,"rel":2971},[88],[2973],{"type":41,"value":1721},{"type":41,"value":2646},{"type":32,"tag":84,"props":2976,"children":2978},{"href":1728,"rel":2977},[88],[2979],{"type":41,"value":1728},{"type":41,"value":2646},{"type":32,"tag":84,"props":2982,"children":2984},{"href":1796,"rel":2983},[88],[2985],{"type":41,"value":1796},{"type":41,"value":2646},{"type":32,"tag":84,"props":2988,"children":2990},{"href":1834,"rel":2989},[88],[2991],{"type":41,"value":1834},{"type":41,"value":2993},"\nFonts, OS floors, measurement: ",{"type":32,"tag":84,"props":2995,"children":2997},{"href":1905,"rel":2996},[88],[2998],{"type":41,"value":1905},{"type":41,"value":2646},{"type":32,"tag":84,"props":3001,"children":3003},{"href":1933,"rel":3002},[88],[3004],{"type":41,"value":1933},{"type":41,"value":2646},{"type":32,"tag":84,"props":3007,"children":3009},{"href":1961,"rel":3008},[88],[3010],{"type":41,"value":1961},{"type":41,"value":2646},{"type":32,"tag":84,"props":3013,"children":3015},{"href":1982,"rel":3014},[88],[3016],{"type":41,"value":1982},{"type":41,"value":2646},{"type":32,"tag":84,"props":3019,"children":3021},{"href":1968,"rel":3020},[88],[3022],{"type":41,"value":1968},{"type":41,"value":2646},{"type":32,"tag":84,"props":3025,"children":3028},{"href":3026,"rel":3027},"https:\u002F\u002Fgpui-kit.com\u002Fdocs\u002Ffonts",[88],[3029],{"type":41,"value":3026},{"type":41,"value":2646},{"type":32,"tag":84,"props":3032,"children":3034},{"href":2135,"rel":3033},[88],[3035],{"type":41,"value":2135},{"type":41,"value":2646},{"type":32,"tag":84,"props":3038,"children":3040},{"href":2170,"rel":3039},[88],[3041],{"type":41,"value":2170},{"type":41,"value":2646},{"type":32,"tag":84,"props":3044,"children":3046},{"href":1201,"rel":3045},[88],[3047],{"type":41,"value":1201},{"type":41,"value":2646},{"type":32,"tag":84,"props":3050,"children":3052},{"href":2142,"rel":3051},[88],[3053],{"type":41,"value":2142},{"type":41,"value":2646},{"type":32,"tag":84,"props":3056,"children":3058},{"href":2204,"rel":3057},[88],[3059],{"type":41,"value":2204},{"type":41,"value":2646},{"type":32,"tag":84,"props":3062,"children":3064},{"href":2315,"rel":3063},[88],[3065],{"type":41,"value":2315},{"type":41,"value":2646},{"type":32,"tag":84,"props":3068,"children":3070},{"href":2322,"rel":3069},[88],[3071],{"type":41,"value":2322},{"type":41,"value":2646},{"type":32,"tag":84,"props":3074,"children":3076},{"href":2391,"rel":3075},[88],[3077],{"type":41,"value":2391},{"type":41,"value":2646},{"type":32,"tag":84,"props":3080,"children":3082},{"href":2329,"rel":3081},[88],[3083],{"type":41,"value":2329},{"type":41,"value":2646},{"type":32,"tag":84,"props":3086,"children":3088},{"href":2457,"rel":3087},[88],[3089],{"type":41,"value":2457},{"type":41,"value":2646},{"type":32,"tag":84,"props":3092,"children":3094},{"href":2464,"rel":3093},[88],[3095],{"type":41,"value":2464},{"type":41,"value":2646},{"type":32,"tag":84,"props":3098,"children":3100},{"href":2471,"rel":3099},[88],[3101],{"type":41,"value":2471},{"type":32,"tag":46,"props":3103,"children":3105},{"id":3104},"from-the-spike-c131-phase-0-2026-11-09-and-2026-11-10",[3106],{"type":41,"value":27},{"type":32,"tag":33,"props":3108,"children":3109},{},[3110,3115,3117,3123,3125,3131,3133,3138],{"type":32,"tag":37,"props":3111,"children":3112},{},[3113],{"type":41,"value":3114},"Use this section to",{"type":41,"value":3116}," replace the \"unverified\" and \"untested anywhere public\" qualifiers above with what a running app showed. The spike lives in ",{"type":32,"tag":60,"props":3118,"children":3120},{"className":3119},[],[3121],{"type":41,"value":3122},"..\u002F..\u002F..\u002F..\u002Fqnative",{"type":41,"value":3124}," (provisional name), cycle ",{"type":32,"tag":60,"props":3126,"children":3128},{"className":3127},[],[3129],{"type":41,"value":3130},"c1.spike",{"type":41,"value":3132},"; every claim below has a commit there. Machine: Apple M2 Max, 32 GB, macOS 15.6, Homebrew Rust 1.99.1; GPUI Kit 0.9.1 on ",{"type":32,"tag":60,"props":3134,"children":3136},{"className":3135},[],[3137],{"type":41,"value":168},{"type":41,"value":3139}," 0.3.12; strobe 0.26.0.",{"type":32,"tag":3141,"props":3142,"children":3144},"h3",{"id":3143},"tray-coexistence-yes-on-macos-in-one-process-d7-path-b",[3145],{"type":41,"value":3146},"Tray coexistence: yes, on macOS, in one process (D7 path B)",{"type":32,"tag":69,"props":3148,"children":3149},{},[3150,3183,3212,3225,3368],{"type":32,"tag":73,"props":3151,"children":3152},{},[3153,3158,3160,3165,3167,3173,3175,3181],{"type":32,"tag":60,"props":3154,"children":3156},{"className":3155},[],[3157],{"type":41,"value":65},{"type":41,"value":3159}," 0.26.1 (qtray's crate, two minors on) created inside ",{"type":32,"tag":60,"props":3161,"children":3163},{"className":3162},[],[3164],{"type":41,"value":503},{"type":41,"value":3166},"'s callback works: AppKit's loop is running there (the callback is ",{"type":32,"tag":60,"props":3168,"children":3170},{"className":3169},[],[3171],{"type":41,"value":3172},"applicationDidFinishLaunching",{"type":41,"value":3174},"), which is the crate's one requirement. No second loop exists; ",{"type":32,"tag":60,"props":3176,"children":3178},{"className":3177},[],[3179],{"type":41,"value":3180},"NSStatusItem",{"type":41,"value":3182}," rides GPUI's.",{"type":32,"tag":73,"props":3184,"children":3185},{},[3186,3188,3194,3196,3202,3204,3210],{"type":41,"value":3187},"Menu clicks: AppKit → ",{"type":32,"tag":60,"props":3189,"children":3191},{"className":3190},[],[3192],{"type":41,"value":3193},"MenuEvent::set_event_handler",{"type":41,"value":3195}," → an unbounded ",{"type":32,"tag":60,"props":3197,"children":3199},{"className":3198},[],[3200],{"type":41,"value":3201},"futures",{"type":41,"value":3203}," channel → a GPUI foreground task with ",{"type":32,"tag":60,"props":3205,"children":3207},{"className":3206},[],[3208],{"type":41,"value":3209},"&mut App",{"type":41,"value":3211},". The AppKit side never touches GPUI; the pattern in §1 holds and costs twelve lines.",{"type":32,"tag":73,"props":3213,"children":3214},{},[3215,3217,3223],{"type":41,"value":3216},"Proof without a screenshot: CoreGraphics lists two windows for the process, the main one (layer 0, 1120×721) and the status item (layer 25, 38×24, top right). Closing the window leaves the process and the status item; the tray's Open command reopens the window; ",{"type":32,"tag":60,"props":3218,"children":3220},{"className":3219},[],[3221],{"type":41,"value":3222},"cx.quit()",{"type":41,"value":3224}," removes both. The AppKit click itself was not exercised (no pointer in the session); the code path from the channel on was.",{"type":32,"tag":73,"props":3226,"children":3227},{},[3228,3240,3241,3247,3248,3254,3255,3261,3263,3269,3270,3276,3277,3283,3284,3290,3291,3296,3297,3303,3304,3309,3310,3315,3316,3322,3323,3329,3330,3336,3338,3343,3345,3351,3353,3359,3360,3366],{"type":32,"tag":37,"props":3229,"children":3230},{},[3231,3233,3238],{"type":41,"value":3232},"Every lifecycle call §1 listed as unverified is in ",{"type":32,"tag":60,"props":3234,"children":3236},{"className":3235},[],[3237],{"type":41,"value":168},{"type":41,"value":3239}," 0.3.12:",{"type":41,"value":209},{"type":32,"tag":60,"props":3242,"children":3244},{"className":3243},[],[3245],{"type":41,"value":3246},"QuitMode::{Default, LastWindowClosed, Explicit}",{"type":41,"value":357},{"type":32,"tag":60,"props":3249,"children":3251},{"className":3250},[],[3252],{"type":41,"value":3253},"Application::with_quit_mode",{"type":41,"value":92},{"type":32,"tag":60,"props":3256,"children":3258},{"className":3257},[],[3259],{"type":41,"value":3260},"App::set_quit_mode",{"type":41,"value":3262},"; the default already means Explicit on macOS), ",{"type":32,"tag":60,"props":3264,"children":3266},{"className":3265},[],[3267],{"type":41,"value":3268},"App::set_activation_policy(Regular | Accessory)",{"type":41,"value":92},{"type":32,"tag":60,"props":3271,"children":3273},{"className":3272},[],[3274],{"type":41,"value":3275},"Application::on_reopen",{"type":41,"value":92},{"type":32,"tag":60,"props":3278,"children":3280},{"className":3279},[],[3281],{"type":41,"value":3282},"App::activate",{"type":41,"value":92},{"type":32,"tag":60,"props":3285,"children":3287},{"className":3286},[],[3288],{"type":41,"value":3289},"App::hide",{"type":41,"value":92},{"type":32,"tag":60,"props":3292,"children":3294},{"className":3293},[],[3295],{"type":41,"value":798},{"type":41,"value":92},{"type":32,"tag":60,"props":3298,"children":3300},{"className":3299},[],[3301],{"type":41,"value":3302},"App::set_dock_menu",{"type":41,"value":92},{"type":32,"tag":60,"props":3305,"children":3307},{"className":3306},[],[3308],{"type":41,"value":1746},{"type":41,"value":92},{"type":32,"tag":60,"props":3311,"children":3313},{"className":3312},[],[3314],{"type":41,"value":1762},{"type":41,"value":92},{"type":32,"tag":60,"props":3317,"children":3319},{"className":3318},[],[3320],{"type":41,"value":3321},"App::set_app_identity",{"type":41,"value":92},{"type":32,"tag":60,"props":3324,"children":3326},{"className":3325},[],[3327],{"type":41,"value":3328},"App::show_system_notification",{"type":41,"value":1696},{"type":32,"tag":60,"props":3331,"children":3333},{"className":3332},[],[3334],{"type":41,"value":3335},"dismiss_system_notification",{"type":41,"value":3337},". Tray-only mode is ",{"type":32,"tag":60,"props":3339,"children":3341},{"className":3340},[],[3342],{"type":41,"value":122},{"type":41,"value":3344}," plus ",{"type":32,"tag":60,"props":3346,"children":3348},{"className":3347},[],[3349],{"type":41,"value":3350},"set_activation_policy(Accessory)",{"type":41,"value":3352}," when the last window closes and ",{"type":32,"tag":60,"props":3354,"children":3356},{"className":3355},[],[3357],{"type":41,"value":3358},"Regular",{"type":41,"value":3344},{"type":32,"tag":60,"props":3361,"children":3363},{"className":3362},[],[3364],{"type":41,"value":3365},"activate(true)",{"type":41,"value":3367}," on Open; the spike does exactly that.",{"type":32,"tag":73,"props":3369,"children":3370},{},[3371,3373,3378],{"type":41,"value":3372},"Path C (qtray stays) is not needed on macOS. Windows (default backend) and Linux (",{"type":32,"tag":60,"props":3374,"children":3376},{"className":3375},[],[3377],{"type":41,"value":309},{"type":41,"value":3379},", no GTK loop) are wired per target and build only in CI; neither was run.",{"type":32,"tag":3141,"props":3381,"children":3383},{"id":3382},"what-the-kit-gives-and-does-not-give",[3384],{"type":41,"value":3385},"What the kit gives and does not give",{"type":32,"tag":419,"props":3387,"children":3388},{},[3389,3410],{"type":32,"tag":423,"props":3390,"children":3391},{},[3392],{"type":32,"tag":427,"props":3393,"children":3394},{},[3395,3400,3405],{"type":32,"tag":431,"props":3396,"children":3397},{},[3398],{"type":41,"value":3399},"Need",{"type":32,"tag":431,"props":3401,"children":3402},{},[3403],{"type":41,"value":3404},"The kit",{"type":32,"tag":431,"props":3406,"children":3407},{},[3408],{"type":41,"value":3409},"Found",{"type":32,"tag":447,"props":3411,"children":3412},{},[3413,3436,3474,3518,3554,3631,3677,3746,3790,3822],{"type":32,"tag":427,"props":3414,"children":3415},{},[3416,3421,3426],{"type":32,"tag":454,"props":3417,"children":3418},{},[3419],{"type":41,"value":3420},"Tray",{"type":32,"tag":454,"props":3422,"children":3423},{},[3424],{"type":41,"value":3425},"nothing",{"type":32,"tag":454,"props":3427,"children":3428},{},[3429,3434],{"type":32,"tag":60,"props":3430,"children":3432},{"className":3431},[],[3433],{"type":41,"value":65},{"type":41,"value":3435}," beside GPUI's loop, as above",{"type":32,"tag":427,"props":3437,"children":3438},{},[3439,3444,3469],{"type":32,"tag":454,"props":3440,"children":3441},{},[3442],{"type":41,"value":3443},"Menu bar",{"type":32,"tag":454,"props":3445,"children":3446},{},[3447,3449,3454,3456,3461,3463],{"type":41,"value":3448},"GPUI ",{"type":32,"tag":60,"props":3450,"children":3452},{"className":3451},[],[3453],{"type":41,"value":798},{"type":41,"value":3455}," (native ",{"type":32,"tag":60,"props":3457,"children":3459},{"className":3458},[],[3460],{"type":41,"value":806},{"type":41,"value":3462}," on macOS; drawn elsewhere), ",{"type":32,"tag":60,"props":3464,"children":3466},{"className":3465},[],[3467],{"type":41,"value":3468},"set_dock_menu",{"type":32,"tag":454,"props":3470,"children":3471},{},[3472],{"type":41,"value":3473},"present in 0.3.12; not used by the spike",{"type":32,"tag":427,"props":3475,"children":3476},{},[3477,3482,3513],{"type":32,"tag":454,"props":3478,"children":3479},{},[3480],{"type":41,"value":3481},"Context and popup menus",{"type":32,"tag":454,"props":3483,"children":3484},{},[3485,3491,3493,3498,3499,3504,3506,3511],{"type":32,"tag":60,"props":3486,"children":3488},{"className":3487},[],[3489],{"type":41,"value":3490},"PopupMenu",{"type":41,"value":3492}," (drawn, actions and key bindings) and ",{"type":32,"tag":60,"props":3494,"children":3496},{"className":3495},[],[3497],{"type":41,"value":833},{"type":41,"value":357},{"type":32,"tag":60,"props":3500,"children":3502},{"className":3501},[],[3503],{"type":41,"value":806},{"type":41,"value":3505}," \u002F ",{"type":32,"tag":60,"props":3507,"children":3509},{"className":3508},[],[3510],{"type":41,"value":848},{"type":41,"value":3512}," \u002F drawn fallback on Linux)",{"type":32,"tag":454,"props":3514,"children":3515},{},[3516],{"type":41,"value":3517},"documented; not used",{"type":32,"tag":427,"props":3519,"children":3520},{},[3521,3526,3549],{"type":32,"tag":454,"props":3522,"children":3523},{},[3524],{"type":41,"value":3525},"Title bar",{"type":32,"tag":454,"props":3527,"children":3528},{},[3529,3534,3535,3541,3543],{"type":32,"tag":60,"props":3530,"children":3532},{"className":3531},[],[3533],{"type":41,"value":825},{"type":41,"value":1117},{"type":32,"tag":60,"props":3536,"children":3538},{"className":3537},[],[3539],{"type":41,"value":3540},"TitleBar::window_options()",{"type":41,"value":3542},": transparent title bar with traffic lights at (9, 9) on macOS, drawn controls on Windows and Linux, ",{"type":32,"tag":60,"props":3544,"children":3546},{"className":3545},[],[3547],{"type":41,"value":3548},"app_owns_titlebar_drag",{"type":32,"tag":454,"props":3550,"children":3551},{},[3552],{"type":41,"value":3553},"used; works on macOS",{"type":32,"tag":427,"props":3555,"children":3556},{},[3557,3562,3605],{"type":32,"tag":454,"props":3558,"children":3559},{},[3560],{"type":41,"value":3561},"Notifications",{"type":32,"tag":454,"props":3563,"children":3564},{},[3565,3566,3572,3574,3580,3581,3587,3589,3595,3597,3603],{"type":41,"value":3448},{"type":32,"tag":60,"props":3567,"children":3569},{"className":3568},[],[3570],{"type":41,"value":3571},"show_system_notification",{"type":41,"value":3573}," and the kit's ",{"type":32,"tag":60,"props":3575,"children":3577},{"className":3576},[],[3578],{"type":41,"value":3579},"Notification::system()",{"type":41,"value":3505},{"type":32,"tag":60,"props":3582,"children":3584},{"className":3583},[],[3585],{"type":41,"value":3586},"in_app_and_system()",{"type":41,"value":3588}," on ",{"type":32,"tag":60,"props":3590,"children":3592},{"className":3591},[],[3593],{"type":41,"value":3594},"Root",{"type":41,"value":3596},"; one app-wide response handler that ",{"type":32,"tag":60,"props":3598,"children":3600},{"className":3599},[],[3601],{"type":41,"value":3602},"gpui_kit::init",{"type":41,"value":3604}," installs",{"type":32,"tag":454,"props":3606,"children":3607},{},[3608,3610,3615,3617,3622,3624,3629],{"type":41,"value":3609},"present; ",{"type":32,"tag":37,"props":3611,"children":3612},{},[3613],{"type":41,"value":3614},"not tested",{"type":41,"value":3616},": the docs say a ",{"type":32,"tag":60,"props":3618,"children":3620},{"className":3619},[],[3621],{"type":41,"value":591},{"type":41,"value":3623}," binary cannot post on macOS and a bundled ",{"type":32,"tag":60,"props":3625,"children":3627},{"className":3626},[],[3628],{"type":41,"value":599},{"type":41,"value":3630}," is required; a bundle was out of the spike's scope",{"type":32,"tag":427,"props":3632,"children":3633},{},[3634,3639,3656],{"type":32,"tag":454,"props":3635,"children":3636},{},[3637],{"type":41,"value":3638},"Bundled fonts",{"type":32,"tag":454,"props":3640,"children":3641},{},[3642,3648,3650],{"type":32,"tag":60,"props":3643,"children":3645},{"className":3644},[],[3646],{"type":41,"value":3647},"cx.text_system().add_fonts(vec![Cow::Borrowed(bytes)])",{"type":41,"value":3649}," before the window, then ",{"type":32,"tag":60,"props":3651,"children":3653},{"className":3652},[],[3654],{"type":41,"value":3655},"Theme::update(cx, |t| t.font_family = \"...\".into())",{"type":32,"tag":454,"props":3657,"children":3658},{},[3659,3661,3667,3669,3675],{"type":41,"value":3660},"works: ",{"type":32,"tag":60,"props":3662,"children":3664},{"className":3663},[],[3665],{"type":41,"value":3666},"all_font_names()",{"type":41,"value":3668}," lists \"Inter Variable\" (the name inside ",{"type":32,"tag":60,"props":3670,"children":3672},{"className":3671},[],[3673],{"type":41,"value":3674},"InterVariable.ttf",{"type":41,"value":3676},", not the file name); two calls, no asset plumbing; Inter 4.1 upright and italic add 1.8 MB to the binary",{"type":32,"tag":427,"props":3678,"children":3679},{},[3680,3685,3733],{"type":32,"tag":454,"props":3681,"children":3682},{},[3683],{"type":41,"value":3684},"Data table",{"type":32,"tag":454,"props":3686,"children":3687},{},[3688,3694,3695,3701,3702,3708,3709,3715,3717,3723,3725,3731],{"type":32,"tag":60,"props":3689,"children":3691},{"className":3690},[],[3692],{"type":41,"value":3693},"DataTable",{"type":41,"value":1344},{"type":32,"tag":60,"props":3696,"children":3698},{"className":3697},[],[3699],{"type":41,"value":3700},"TableState\u003CD: TableDelegate>",{"type":41,"value":938},{"type":32,"tag":60,"props":3703,"children":3705},{"className":3704},[],[3706],{"type":41,"value":3707},"Column::new(key, name)",{"type":41,"value":938},{"type":32,"tag":60,"props":3710,"children":3712},{"className":3711},[],[3713],{"type":41,"value":3714},"render_td",{"type":41,"value":3716}," draws, ",{"type":32,"tag":60,"props":3718,"children":3720},{"className":3719},[],[3721],{"type":41,"value":3722},"cell_text",{"type":41,"value":3724}," is what copy, ",{"type":32,"tag":60,"props":3726,"children":3728},{"className":3727},[],[3729],{"type":41,"value":3730},"dump",{"type":41,"value":3732}," and the default accessibility label read",{"type":32,"tag":454,"props":3734,"children":3735},{},[3736,3738,3744],{"type":41,"value":3737},"works; bind a ",{"type":32,"tag":60,"props":3739,"children":3741},{"className":3740},[],[3742],{"type":41,"value":3743},"Vec\u003CRow>",{"type":41,"value":3745}," in a delegate, nothing else",{"type":32,"tag":427,"props":3747,"children":3748},{},[3749,3754,3785],{"type":32,"tag":454,"props":3750,"children":3751},{},[3752],{"type":41,"value":3753},"Sidebar",{"type":32,"tag":454,"props":3755,"children":3756},{},[3757,3763,3765,3771,3772,3778,3779],{"type":32,"tag":60,"props":3758,"children":3760},{"className":3759},[],[3761],{"type":41,"value":3762},"Sidebar::new(id)",{"type":41,"value":3764}," (the docs show no id), ",{"type":32,"tag":60,"props":3766,"children":3768},{"className":3767},[],[3769],{"type":41,"value":3770},"SidebarGroup",{"type":41,"value":92},{"type":32,"tag":60,"props":3773,"children":3775},{"className":3774},[],[3776],{"type":41,"value":3777},"SidebarMenu",{"type":41,"value":92},{"type":32,"tag":60,"props":3780,"children":3782},{"className":3781},[],[3783],{"type":41,"value":3784},"SidebarMenuItem",{"type":32,"tag":454,"props":3786,"children":3787},{},[3788],{"type":41,"value":3789},"works",{"type":32,"tag":427,"props":3791,"children":3792},{},[3793,3798,3817],{"type":32,"tag":454,"props":3794,"children":3795},{},[3796],{"type":41,"value":3797},"Honest states",{"type":32,"tag":454,"props":3799,"children":3800},{},[3801,3807,3809,3815],{"type":32,"tag":60,"props":3802,"children":3804},{"className":3803},[],[3805],{"type":41,"value":3806},"Empty",{"type":41,"value":3808}," (header, title, description), ",{"type":32,"tag":60,"props":3810,"children":3812},{"className":3811},[],[3813],{"type":41,"value":3814},"StatusBar",{"type":41,"value":3816}," for the footer",{"type":32,"tag":454,"props":3818,"children":3819},{},[3820],{"type":41,"value":3821},"used for the empty table and the footer",{"type":32,"tag":427,"props":3823,"children":3824},{},[3825,3830,3834],{"type":32,"tag":454,"props":3826,"children":3827},{},[3828],{"type":41,"value":3829},"Preferences on disk",{"type":32,"tag":454,"props":3831,"children":3832},{},[3833],{"type":41,"value":3425},{"type":32,"tag":454,"props":3835,"children":3836},{},[3837,3839,3845,3847,3853],{"type":41,"value":3838},"an unbundled binary named ",{"type":32,"tag":60,"props":3840,"children":3842},{"className":3841},[],[3843],{"type":41,"value":3844},"app",{"type":41,"value":3846}," made AppKit write ",{"type":32,"tag":60,"props":3848,"children":3850},{"className":3849},[],[3851],{"type":41,"value":3852},"~\u002FLibrary\u002FPreferences\u002Fapp.plist",{"type":41,"value":3854}," on first run; a bare executable's identity is its file name until it is bundled (strobe refused to measure it for that reason)",{"type":32,"tag":3141,"props":3856,"children":3858},{"id":3857},"footprint-strobe-0260-2026-11-09-and-2026-11-10-the-recipe-is-in-the-repos-readme",[3859],{"type":41,"value":3860},"Footprint (strobe 0.26.0, 2026-11-09 and 2026-11-10; the recipe is in the repo's README)",{"type":32,"tag":419,"props":3862,"children":3863},{},[3864,3924],{"type":32,"tag":423,"props":3865,"children":3866},{},[3867],{"type":32,"tag":427,"props":3868,"children":3869},{},[3870,3875,3880,3892,3897,3902,3907,3919],{"type":32,"tag":431,"props":3871,"children":3872},{},[3873],{"type":41,"value":3874},"Build",{"type":32,"tag":431,"props":3876,"children":3877},{},[3878],{"type":41,"value":3879},"Mode",{"type":32,"tag":431,"props":3881,"children":3882},{},[3883,3885,3890],{"type":41,"value":3884},"Private memory (",{"type":32,"tag":60,"props":3886,"children":3888},{"className":3887},[],[3889],{"type":41,"value":2378},{"type":41,"value":3891}," = physical footprint)",{"type":32,"tag":431,"props":3893,"children":3894},{},[3895],{"type":41,"value":3896},"RSS",{"type":32,"tag":431,"props":3898,"children":3899},{},[3900],{"type":41,"value":3901},"CPU, idle, 60 s",{"type":32,"tag":431,"props":3903,"children":3904},{},[3905],{"type":41,"value":3906},"Wakes\u002Fs",{"type":32,"tag":431,"props":3908,"children":3909},{},[3910,3912,3917],{"type":41,"value":3911},"Startup, ",{"type":32,"tag":60,"props":3913,"children":3915},{"className":3914},[],[3916],{"type":41,"value":114},{"type":41,"value":3918}," → first render",{"type":32,"tag":431,"props":3920,"children":3921},{},[3922],{"type":41,"value":3923},"Binary",{"type":32,"tag":447,"props":3925,"children":3926},{},[3927,3970,4011,4054],{"type":32,"tag":427,"props":3928,"children":3929},{},[3930,3935,3940,3945,3950,3955,3960,3965],{"type":32,"tag":454,"props":3931,"children":3932},{},[3933],{"type":41,"value":3934},"release",{"type":32,"tag":454,"props":3936,"children":3937},{},[3938],{"type":41,"value":3939},"window, Inventory page over the bundled world",{"type":32,"tag":454,"props":3941,"children":3942},{},[3943],{"type":41,"value":3944},"52 MB (11-09) · 80 MB (11-10)",{"type":32,"tag":454,"props":3946,"children":3947},{},[3948],{"type":41,"value":3949},"66–68 MB",{"type":32,"tag":454,"props":3951,"children":3952},{},[3953],{"type":41,"value":3954},"0.005% of one core (2.9 ms)",{"type":32,"tag":454,"props":3956,"children":3957},{},[3958],{"type":41,"value":3959},"0.9",{"type":32,"tag":454,"props":3961,"children":3962},{},[3963],{"type":41,"value":3964},"264 ms (median of 3)",{"type":32,"tag":454,"props":3966,"children":3967},{},[3968],{"type":41,"value":3969},"17.9 MB",{"type":32,"tag":427,"props":3971,"children":3972},{},[3973,3977,3982,3987,3992,3997,4002,4007],{"type":32,"tag":454,"props":3974,"children":3975},{},[3976],{"type":41,"value":3934},{"type":32,"tag":454,"props":3978,"children":3979},{},[3980],{"type":41,"value":3981},"tray only",{"type":32,"tag":454,"props":3983,"children":3984},{},[3985],{"type":41,"value":3986},"16 MB",{"type":32,"tag":454,"props":3988,"children":3989},{},[3990],{"type":41,"value":3991},"39 MB",{"type":32,"tag":454,"props":3993,"children":3994},{},[3995],{"type":41,"value":3996},"0.002% (1.2 ms)",{"type":32,"tag":454,"props":3998,"children":3999},{},[4000],{"type":41,"value":4001},"0.3",{"type":32,"tag":454,"props":4003,"children":4004},{},[4005],{"type":41,"value":4006},"—",{"type":32,"tag":454,"props":4008,"children":4009},{},[4010],{"type":41,"value":3969},{"type":32,"tag":427,"props":4012,"children":4013},{},[4014,4019,4024,4029,4034,4039,4044,4049],{"type":32,"tag":454,"props":4015,"children":4016},{},[4017],{"type":41,"value":4018},"debug",{"type":32,"tag":454,"props":4020,"children":4021},{},[4022],{"type":41,"value":4023},"window",{"type":32,"tag":454,"props":4025,"children":4026},{},[4027],{"type":41,"value":4028},"80 MB",{"type":32,"tag":454,"props":4030,"children":4031},{},[4032],{"type":41,"value":4033},"83 MB",{"type":32,"tag":454,"props":4035,"children":4036},{},[4037],{"type":41,"value":4038},"0.005% (2.8 ms)",{"type":32,"tag":454,"props":4040,"children":4041},{},[4042],{"type":41,"value":4043},"1.2",{"type":32,"tag":454,"props":4045,"children":4046},{},[4047],{"type":41,"value":4048},"270 ms",{"type":32,"tag":454,"props":4050,"children":4051},{},[4052],{"type":41,"value":4053},"122 MB",{"type":32,"tag":427,"props":4055,"children":4056},{},[4057,4061,4065,4069,4074,4079,4083,4087],{"type":32,"tag":454,"props":4058,"children":4059},{},[4060],{"type":41,"value":4018},{"type":32,"tag":454,"props":4062,"children":4063},{},[4064],{"type":41,"value":3981},{"type":32,"tag":454,"props":4066,"children":4067},{},[4068],{"type":41,"value":3986},{"type":32,"tag":454,"props":4070,"children":4071},{},[4072],{"type":41,"value":4073},"51 MB",{"type":32,"tag":454,"props":4075,"children":4076},{},[4077],{"type":41,"value":4078},"0.002% (1.1 ms)",{"type":32,"tag":454,"props":4080,"children":4081},{},[4082],{"type":41,"value":4001},{"type":32,"tag":454,"props":4084,"children":4085},{},[4086],{"type":41,"value":4006},{"type":32,"tag":454,"props":4088,"children":4089},{},[4090],{"type":41,"value":4053},{"type":32,"tag":33,"props":4092,"children":4093},{},[4094,4096,4102,4104,4110,4112,4117,4119,4125,4126,4132,4134,4139,4141,4147,4149,4155,4156,4162,4163,4169,4170,4176,4178,4184],{"type":41,"value":4095},"Method: the app launched by hand with ",{"type":32,"tag":60,"props":4097,"children":4099},{"className":4098},[],[4100],{"type":41,"value":4101},"QPOINT_DATA=synthetic",{"type":41,"value":4103},", 5 s to settle, then ",{"type":32,"tag":60,"props":4105,"children":4107},{"className":4106},[],[4108],{"type":41,"value":4109},"strobe record pid:\u003Cn> --for 60s",{"type":41,"value":4111}," (attached from outside: frames refused without Screen Recording for the session's host app; CPU, wakes, energy and ",{"type":32,"tag":60,"props":4113,"children":4115},{"className":4114},[],[4116],{"type":41,"value":2378},{"type":41,"value":4118}," recorded); ",{"type":32,"tag":60,"props":4120,"children":4122},{"className":4121},[],[4123],{"type":41,"value":4124},"footprint(1)",{"type":41,"value":1696},{"type":32,"tag":60,"props":4127,"children":4129},{"className":4128},[],[4130],{"type":41,"value":4131},"ps",{"type":41,"value":4133}," at 60 s as the cross-check. Startup is the app's own clock: ",{"type":32,"tag":60,"props":4135,"children":4137},{"className":4136},[],[4138],{"type":41,"value":114},{"type":41,"value":4140}," to the first ",{"type":32,"tag":60,"props":4142,"children":4144},{"className":4143},[],[4145],{"type":41,"value":4146},"render",{"type":41,"value":4148}," of the shell, median of three. The release profile is ",{"type":32,"tag":60,"props":4150,"children":4152},{"className":4151},[],[4153],{"type":41,"value":4154},"opt-level = 3",{"type":41,"value":92},{"type":32,"tag":60,"props":4157,"children":4159},{"className":4158},[],[4160],{"type":41,"value":4161},"lto = \"thin\"",{"type":41,"value":92},{"type":32,"tag":60,"props":4164,"children":4166},{"className":4165},[],[4167],{"type":41,"value":4168},"codegen-units = 1",{"type":41,"value":92},{"type":32,"tag":60,"props":4171,"children":4173},{"className":4172},[],[4174],{"type":41,"value":4175},"strip = true",{"type":41,"value":4177},". strobe refused a launch-controlled recording of the windowed app twice: once because of the generic executable name (above), once because it will not measure a window that is not frontmost unless the Mac has been idle for a minute and strobe has the Accessibility permission; attaching by PID has neither rule. ",{"type":32,"tag":60,"props":4179,"children":4181},{"className":4180},[],[4182],{"type":41,"value":4183},"--windowless",{"type":41,"value":4185}," works for the tray-only mode.",{"type":32,"tag":69,"props":4187,"children":4188},{},[4189,4208,4213,4225,4252],{"type":32,"tag":73,"props":4190,"children":4191},{},[4192,4194,4199,4201,4206],{"type":41,"value":4193},"Read against §11's rule (\"",{"type":32,"tag":60,"props":4195,"children":4197},{"className":4196},[],[4198],{"type":41,"value":2378},{"type":41,"value":4200},", idle, after 60 s, plus idle CPU and wakes, binary size, time to first frame\"): every column is there except frames, which strobe could not capture without Screen Recording; the startup figure is the app's own clock to the first ",{"type":32,"tag":60,"props":4202,"children":4204},{"className":4203},[],[4205],{"type":41,"value":4146},{"type":41,"value":4207},", not the first presented frame.",{"type":32,"tag":73,"props":4209,"children":4210},{},[4211],{"type":41,"value":4212},"The two windowed release readings are 28 MB apart while RSS moved 2 MB: the physical footprint counts GPU-backed surfaces (GPUI's Metal layer), which follow the display the window is on (an external 5K display on 11-09, the next day's display set on 11-10). State the budget as a range per display until Phase 1 measures it per display. Tray-only has no Metal layer and is 16 MB in both builds, both days.",{"type":32,"tag":73,"props":4214,"children":4215},{},[4216,4218,4223],{"type":41,"value":4217},"Idle is quiet: no steady wake-up source, package idle wake-ups 0.00–0.02\u002Fs, ",{"type":32,"tag":60,"props":4219,"children":4221},{"className":4220},[],[4222],{"type":41,"value":2370},{"type":41,"value":4224}," empty in all four recordings. A 10 s look taken 2 s after launch showed 6% of a core and 181 wakes\u002Fs; that is the start-up tail, gone by the 5 s settle. The shape's \"idle app under a stated RSS, nothing resident when closed, the tray alone minimal\" is met in kind; the numbers to put in it are these.",{"type":32,"tag":73,"props":4226,"children":4227},{},[4228,4230,4235,4237,4243,4245,4250],{"type":41,"value":4229},"Binary: 17.9 MB release with ",{"type":32,"tag":60,"props":4231,"children":4233},{"className":4232},[],[4234],{"type":41,"value":4175},{"type":41,"value":4236}," and thin LTO, of which 1.8 MB is Inter; ",{"type":32,"tag":60,"props":4238,"children":4240},{"className":4239},[],[4241],{"type":41,"value":4242},"ureq",{"type":41,"value":4244}," with rustls and ",{"type":32,"tag":60,"props":4246,"children":4248},{"className":4247},[],[4249],{"type":41,"value":65},{"type":41,"value":4251}," are in it. 122 MB debug, unstripped.",{"type":32,"tag":73,"props":4253,"children":4254},{},[4255,4257,4263,4264,4270,4271,4277,4278,4284,4285,4291],{"type":41,"value":4256},"Recordings on Mark's Mac, for ",{"type":32,"tag":60,"props":4258,"children":4260},{"className":4259},[],[4261],{"type":41,"value":4262},"strobe query \u003Crec> threads|memory|insights",{"type":41,"value":116},{"type":32,"tag":60,"props":4265,"children":4267},{"className":4266},[],[4268],{"type":41,"value":4269},"rec_cdfcb0",{"type":41,"value":92},{"type":32,"tag":60,"props":4272,"children":4274},{"className":4273},[],[4275],{"type":41,"value":4276},"rec_2b2d45",{"type":41,"value":92},{"type":32,"tag":60,"props":4279,"children":4281},{"className":4280},[],[4282],{"type":41,"value":4283},"rec_79dba9",{"type":41,"value":92},{"type":32,"tag":60,"props":4286,"children":4288},{"className":4287},[],[4289],{"type":41,"value":4290},"rec_deabd6",{"type":41,"value":2537},{"type":32,"tag":3141,"props":4293,"children":4295},{"id":4294},"build-times-m2-max-rust-1991",[4296],{"type":41,"value":4297},"Build times (M2 Max, Rust 1.99.1)",{"type":32,"tag":419,"props":4299,"children":4300},{},[4301,4320],{"type":32,"tag":423,"props":4302,"children":4303},{},[4304],{"type":32,"tag":427,"props":4305,"children":4306},{},[4307,4311,4316],{"type":32,"tag":431,"props":4308,"children":4309},{},[4310],{"type":41,"value":3874},{"type":32,"tag":431,"props":4312,"children":4313},{},[4314],{"type":41,"value":4315},"Time",{"type":32,"tag":431,"props":4317,"children":4318},{},[4319],{"type":41,"value":2100},{"type":32,"tag":447,"props":4321,"children":4322},{},[4323,4349,4388,4445,4463],{"type":32,"tag":427,"props":4324,"children":4325},{},[4326,4331,4336],{"type":32,"tag":454,"props":4327,"children":4328},{},[4329],{"type":41,"value":4330},"Debug, from a clean target dir",{"type":32,"tag":454,"props":4332,"children":4333},{},[4334],{"type":41,"value":4335},"about 3 min",{"type":32,"tag":454,"props":4337,"children":4338},{},[4339,4341,4347],{"type":41,"value":4340},"424 crates; ",{"type":32,"tag":60,"props":4342,"children":4344},{"className":4343},[],[4345],{"type":41,"value":4346},"cargo build -p app",{"type":41,"value":4348}," with the kit's default features",{"type":32,"tag":427,"props":4350,"children":4351},{},[4352,4357,4362],{"type":32,"tag":454,"props":4353,"children":4354},{},[4355],{"type":41,"value":4356},"Release, from a clean target dir",{"type":32,"tag":454,"props":4358,"children":4359},{},[4360],{"type":41,"value":4361},"1 min 42 s",{"type":32,"tag":454,"props":4363,"children":4364},{},[4365,4370,4371,4376,4377,4382,4383],{"type":32,"tag":60,"props":4366,"children":4368},{"className":4367},[],[4369],{"type":41,"value":4154},{"type":41,"value":92},{"type":32,"tag":60,"props":4372,"children":4374},{"className":4373},[],[4375],{"type":41,"value":4161},{"type":41,"value":92},{"type":32,"tag":60,"props":4378,"children":4380},{"className":4379},[],[4381],{"type":41,"value":4168},{"type":41,"value":92},{"type":32,"tag":60,"props":4384,"children":4386},{"className":4385},[],[4387],{"type":41,"value":4175},{"type":32,"tag":427,"props":4389,"children":4390},{},[4391,4396,4401],{"type":32,"tag":454,"props":4392,"children":4393},{},[4394],{"type":41,"value":4395},"Release, after a dependency-feature change",{"type":32,"tag":454,"props":4397,"children":4398},{},[4399],{"type":41,"value":4400},"1 min 12 s",{"type":32,"tag":454,"props":4402,"children":4403},{},[4404,4406,4411,4412,4417,4418,4424,4425,4430,4432,4438,4439],{"type":41,"value":4405},"adding ",{"type":32,"tag":60,"props":4407,"children":4409},{"className":4408},[],[4410],{"type":41,"value":65},{"type":41,"value":92},{"type":32,"tag":60,"props":4413,"children":4415},{"className":4414},[],[4416],{"type":41,"value":3201},{"type":41,"value":92},{"type":32,"tag":60,"props":4419,"children":4421},{"className":4420},[],[4422],{"type":41,"value":4423},"png",{"type":41,"value":1696},{"type":32,"tag":60,"props":4426,"children":4428},{"className":4427},[],[4429],{"type":41,"value":4242},{"type":41,"value":4431}," re-unified features and rebuilt ",{"type":32,"tag":60,"props":4433,"children":4435},{"className":4434},[],[4436],{"type":41,"value":4437},"gpui-pre-platform",{"type":41,"value":1696},{"type":32,"tag":60,"props":4440,"children":4442},{"className":4441},[],[4443],{"type":41,"value":4444},"gpui-component",{"type":32,"tag":427,"props":4446,"children":4447},{},[4448,4453,4458],{"type":32,"tag":454,"props":4449,"children":4450},{},[4451],{"type":41,"value":4452},"Debug, app crate only",{"type":32,"tag":454,"props":4454,"children":4455},{},[4456],{"type":41,"value":4457},"2–5 s",{"type":32,"tag":454,"props":4459,"children":4460},{},[4461],{"type":41,"value":4462},"the edit loop",{"type":32,"tag":427,"props":4464,"children":4465},{},[4466,4471,4476],{"type":32,"tag":454,"props":4467,"children":4468},{},[4469],{"type":41,"value":4470},"Release, app crate only",{"type":32,"tag":454,"props":4472,"children":4473},{},[4474],{"type":41,"value":4475},"30 s",{"type":32,"tag":454,"props":4477,"children":4478},{},[4479],{"type":41,"value":4480},"thin LTO and one codegen unit on the final link",{"type":32,"tag":33,"props":4482,"children":4483},{},[4484,4486,4492],{"type":41,"value":4485},"Cargo's lock on the target directory serialises a release build and the debug edit loop; the spike gave the release build its own ",{"type":32,"tag":60,"props":4487,"children":4489},{"className":4488},[],[4490],{"type":41,"value":4491},"CARGO_TARGET_DIR",{"type":41,"value":4493}," to keep iterating.",{"type":32,"tag":3141,"props":4495,"children":4497},{"id":4496},"api-surprises-in-091-against-the-docs",[4498],{"type":41,"value":4499},"API surprises in 0.9.1 (against the docs)",{"type":32,"tag":2498,"props":4501,"children":4502},{},[4503,4533,4559,4599,4626,4658,4700,4721],{"type":32,"tag":73,"props":4504,"children":4505},{},[4506,4516,4517,4523,4525,4531],{"type":32,"tag":37,"props":4507,"children":4508},{},[4509,4514],{"type":32,"tag":60,"props":4510,"children":4512},{"className":4511},[],[4513],{"type":41,"value":168},{"type":41,"value":4515}," 0.3.12 does not build on Rust 1.94.",{"type":41,"value":209},{"type":32,"tag":60,"props":4518,"children":4520},{"className":4519},[],[4521],{"type":41,"value":4522},"profiler.rs",{"type":41,"value":4524}," calls ",{"type":32,"tag":60,"props":4526,"children":4528},{"className":4527},[],[4529],{"type":41,"value":4530},"std::hint::cold_path",{"type":41,"value":4532},", stable since 1.95; the Installation page says 1.92. Homebrew's Rust was 1.94.1 on this Mac; 1.99.1 builds it.",{"type":32,"tag":73,"props":4534,"children":4535},{},[4536,4542,4544,4550,4552,4558],{"type":32,"tag":60,"props":4537,"children":4539},{"className":4538},[],[4540],{"type":41,"value":4541},"Sidebar::new",{"type":41,"value":4543}," takes an ",{"type":32,"tag":60,"props":4545,"children":4547},{"className":4546},[],[4548],{"type":41,"value":4549},"ElementId",{"type":41,"value":4551},"; the Sidebar page shows ",{"type":32,"tag":60,"props":4553,"children":4555},{"className":4554},[],[4556],{"type":41,"value":4557},"Sidebar::new()",{"type":41,"value":2537},{"type":32,"tag":73,"props":4560,"children":4561},{},[4562,4568,4570,4576,4577,4582,4584,4590,4592,4597],{"type":32,"tag":60,"props":4563,"children":4565},{"className":4564},[],[4566],{"type":41,"value":4567},"TableDelegate::render_empty",{"type":41,"value":4569}," takes ",{"type":32,"tag":60,"props":4571,"children":4573},{"className":4572},[],[4574],{"type":41,"value":4575},"&mut self",{"type":41,"value":938},{"type":32,"tag":60,"props":4578,"children":4580},{"className":4579},[],[4581],{"type":41,"value":3722},{"type":41,"value":4583},", not ",{"type":32,"tag":60,"props":4585,"children":4587},{"className":4586},[],[4588],{"type":41,"value":4589},"cell_label",{"type":41,"value":4591},", is the seam that copy, ",{"type":32,"tag":60,"props":4593,"children":4595},{"className":4594},[],[4596],{"type":41,"value":3730},{"type":41,"value":4598}," and the default row label read.",{"type":32,"tag":73,"props":4600,"children":4601},{},[4602,4608,4610,4616,4618,4624],{"type":32,"tag":60,"props":4603,"children":4605},{"className":4604},[],[4606],{"type":41,"value":4607},"gpui_kit::open_window",{"type":41,"value":4609}," returns ",{"type":32,"tag":60,"props":4611,"children":4613},{"className":4612},[],[4614],{"type":41,"value":4615},"(AnyWindowHandle, Entity\u003CV>)",{"type":41,"value":4617},", not a ",{"type":32,"tag":60,"props":4619,"children":4621},{"className":4620},[],[4622],{"type":41,"value":4623},"WindowHandle\u003CV>",{"type":41,"value":4625},"; a later update goes through the handle.",{"type":32,"tag":73,"props":4627,"children":4628},{},[4629,4634,4636,4641,4643,4649,4651,4657],{"type":32,"tag":60,"props":4630,"children":4632},{"className":4631},[],[4633],{"type":41,"value":3275},{"type":41,"value":4635}," (and ",{"type":32,"tag":60,"props":4637,"children":4639},{"className":4638},[],[4640],{"type":41,"value":2556},{"type":41,"value":4642},") borrow the builder and return ",{"type":32,"tag":60,"props":4644,"children":4646},{"className":4645},[],[4647],{"type":41,"value":4648},"&Self",{"type":41,"value":4650},"; they cannot be chained after ",{"type":32,"tag":60,"props":4652,"children":4654},{"className":4653},[],[4655],{"type":41,"value":4656},"with_quit_mode",{"type":41,"value":2537},{"type":32,"tag":73,"props":4659,"children":4660},{},[4661,4667,4669,4675,4677,4683,4685,4691,4693,4699],{"type":32,"tag":60,"props":4662,"children":4664},{"className":4663},[],[4665],{"type":41,"value":4666},"IconName",{"type":41,"value":4668}," comes in two: ",{"type":32,"tag":60,"props":4670,"children":4672},{"className":4671},[],[4673],{"type":41,"value":4674},"gpui_kit::component::IconName",{"type":41,"value":4676}," (the component set) and ",{"type":32,"tag":60,"props":4678,"children":4680},{"className":4679},[],[4681],{"type":41,"value":4682},"gpui_kit::assets::IconName",{"type":41,"value":4684}," (the Lucide catalog); only the default set in ",{"type":32,"tag":60,"props":4686,"children":4688},{"className":4687},[],[4689],{"type":41,"value":4690},"gpui-kit-assets\u002Fdefault-icons.txt",{"type":41,"value":4692}," is embedded without ",{"type":32,"tag":60,"props":4694,"children":4696},{"className":4695},[],[4697],{"type":41,"value":4698},"icon_assets!",{"type":41,"value":2537},{"type":32,"tag":73,"props":4701,"children":4702},{},[4703,4705,4711,4713,4719],{"type":41,"value":4704},"The ",{"type":32,"tag":60,"props":4706,"children":4708},{"className":4707},[],[4709],{"type":41,"value":4710},"\u002Fskills",{"type":41,"value":4712}," page for 0.9.1 lists no skills; ",{"type":32,"tag":60,"props":4714,"children":4716},{"className":4715},[],[4717],{"type":41,"value":4718},"llms-full.txt",{"type":41,"value":4720}," is 4.7 MB and 100 831 lines, of which the second half is the zh-CN mirror.",{"type":32,"tag":73,"props":4722,"children":4723},{},[4724,4726,4731,4733,4739,4741,4747,4748,4753,4755,4761,4762,4768],{"type":41,"value":4725},"Outside the kit: ",{"type":32,"tag":60,"props":4727,"children":4729},{"className":4728},[],[4730],{"type":41,"value":65},{"type":41,"value":4732},"'s ",{"type":32,"tag":60,"props":4734,"children":4736},{"className":4735},[],[4737],{"type":41,"value":4738},"with_icon_as_template",{"type":41,"value":4740}," is deprecated for ",{"type":32,"tag":60,"props":4742,"children":4744},{"className":4743},[],[4745],{"type":41,"value":4746},"with_icon_templated",{"type":41,"value":938},{"type":32,"tag":60,"props":4749,"children":4751},{"className":4750},[],[4752],{"type":41,"value":4423},{"type":41,"value":4754}," 0.18's ",{"type":32,"tag":60,"props":4756,"children":4758},{"className":4757},[],[4759],{"type":41,"value":4760},"output_buffer_size",{"type":41,"value":4609},{"type":32,"tag":60,"props":4763,"children":4765},{"className":4764},[],[4766],{"type":41,"value":4767},"Option\u003Cusize>",{"type":41,"value":2537},{"type":32,"tag":3141,"props":4770,"children":4772},{"id":4771},"still-open-after-the-spike",[4773],{"type":41,"value":4774},"Still open after the spike",{"type":32,"tag":69,"props":4776,"children":4777},{},[4778,4806,4833],{"type":32,"tag":73,"props":4779,"children":4780},{},[4781,4783,4789,4791,4797,4798,4804],{"type":41,"value":4782},"The AppKit click on the status item, a Dock reopen, and whether the Dock icon actually disappears on ",{"type":32,"tag":60,"props":4784,"children":4786},{"className":4785},[],[4787],{"type":41,"value":4788},"Accessory",{"type":41,"value":4790},": a person with a pointer confirms them in a minute (the app prints ",{"type":32,"tag":60,"props":4792,"children":4794},{"className":4793},[],[4795],{"type":41,"value":4796},"tray: Open requested from the menu",{"type":41,"value":1696},{"type":32,"tag":60,"props":4799,"children":4801},{"className":4800},[],[4802],{"type":41,"value":4803},"app: reopen requested",{"type":41,"value":4805},").",{"type":32,"tag":73,"props":4807,"children":4808},{},[4809,4811,4816,4818,4824,4826,4831],{"type":41,"value":4810},"Notifications from a bundled ",{"type":32,"tag":60,"props":4812,"children":4814},{"className":4813},[],[4815],{"type":41,"value":599},{"type":41,"value":4817}," (§2), ",{"type":32,"tag":60,"props":4819,"children":4821},{"className":4820},[],[4822],{"type":41,"value":4823},"qpoint:\u002F\u002F",{"type":41,"value":4825}," through ",{"type":32,"tag":60,"props":4827,"children":4829},{"className":4828},[],[4830],{"type":41,"value":2556},{"type":41,"value":4832}," (§8), the Linux window without Vulkan (§10): not attempted.",{"type":32,"tag":73,"props":4834,"children":4835},{},[4836,4838,4844],{"type":41,"value":4837},"Windows and Linux builds: the workflow exists in ",{"type":32,"tag":60,"props":4839,"children":4841},{"className":4840},[],[4842],{"type":41,"value":4843},".github\u002Fworkflows\u002Fbuild.yml",{"type":41,"value":4845},"; the repository has no remote, so it has not run.",1794599388981]