<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Publishing on XAML.io Blog</title>
        <link>https://blog.xaml.io/tags/publishing/</link>
        <description>Recent content in Publishing on XAML.io Blog</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>en-us</language>
        <lastBuildDate>Tue, 26 May 2026 10:00:00 +0200</lastBuildDate><atom:link href="https://blog.xaml.io/tags/publishing/index.xml" rel="self" type="application/rss+xml" /><item>
            <title>Compile C#&#43;XAML to a Native Windows, macOS, or Linux App, From Your Browser</title>
            <link>https://blog.xaml.io/post/publish-native-desktop-apps/</link>
            <pubDate>Tue, 26 May 2026 10:00:00 +0200</pubDate>
            <guid>https://blog.xaml.io/post/publish-native-desktop-apps/</guid>
            <description>&lt;img src=&#34;https://blog.xaml.io/&#34; alt=&#34;Featured image of post Compile C#+XAML to a Native Windows, macOS, or Linux App, From Your Browser&#34; /&gt;&lt;p&gt;What if you could turn a C#+XAML project edited in your browser into a native Windows, macOS, or Linux desktop app, without leaving the browser, and without your code ever touching a server?&lt;/p&gt;&#xA;&lt;p&gt;That&amp;rsquo;s what XAML.io v0.7 can now do. Click &lt;strong&gt;Publish&lt;/strong&gt;, pick a platform, and a self-contained &lt;code&gt;.exe&lt;/code&gt;, &lt;code&gt;.app&lt;/code&gt; bundle, or Linux executable lands in your Downloads folder in well under a minute on a modern laptop. Everything runs in your browser tab: the compilation, the packaging, and even the Apple Mach-O ad-hoc code-signing pass for macOS bundles.&lt;/p&gt;&#xA;&#xA;    &lt;blockquote&gt;&#xA;        &lt;p&gt;&lt;strong&gt;Preview status.&lt;/strong&gt; This feature is in &lt;strong&gt;Preview / Alpha&lt;/strong&gt; in XAML.io v0.7 (May 2026). Expect rough edges, occasional breakages, and changes between releases. We&amp;rsquo;d rather ship the rough version and iterate with you than wait for everything to be perfect. Bug reports and &amp;ldquo;this is missing X&amp;rdquo; notes are both welcome.&lt;/p&gt;&#xA;    &lt;/blockquote&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://blog.xaml.io/post/publish-native-desktop-apps/publish-menu.png&#34;&#xA;&#x9;width=&#34;1093&#34;&#xA;&#x9;height=&#34;989&#34;&#xA;&#x9;loading=&#34;lazy&#34;&#xA;&#x9;&#xA;&#x9;&#x9;alt=&#34;The Publish menu open in XAML.io, showing the three OS buttons under “Download as a desktop app”.&#34;&#xA;&#x9;&#xA;    &#xA;&#x9;&#xA;&#x9;&#x9;class=&#34;gallery-image&#34; &#xA;&#x9;&#x9;data-flex-grow=&#34;110&#34;&#xA;&#x9;&#x9;data-flex-basis=&#34;265px&#34;&#xA;&#x9;&#xA;&gt;&lt;/p&gt;&#xA;&#xA;    &lt;blockquote&gt;&#xA;        &lt;p&gt;&lt;strong&gt;New to XAML.io?&lt;/strong&gt; &lt;a class=&#34;link&#34; href=&#34;https://xaml.io&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;XAML.io&lt;/a&gt; is a free, browser-based IDE for building .NET applications using C# and XAML. It includes a visual drag-and-drop XAML designer with 100+ controls, a code editor, and in-browser .NET compilation via WebAssembly. No installation, no signup required. It&amp;rsquo;s built by &lt;a class=&#34;link&#34; href=&#34;https://userware.dev&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Userware&lt;/a&gt; and powered by the open-source &lt;a class=&#34;link&#34; href=&#34;https://opensilver.net&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;OpenSilver&lt;/a&gt; framework. &lt;a class=&#34;link&#34; href=&#34;https://xaml.io&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Try it →&lt;/a&gt;&lt;/p&gt;&#xA;    &lt;/blockquote&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;how-it-works&#34;&gt;How it works&#xA;&lt;/h2&gt;&lt;p&gt;In XAML.io&amp;rsquo;s title bar, the &lt;strong&gt;Publish&lt;/strong&gt; dropdown now has a &lt;em&gt;&amp;ldquo;Download as a desktop app&amp;rdquo;&lt;/em&gt; section with three buttons inside it: one each for Windows, macOS, and Linux. Click a button and a dialog walks through what you&amp;rsquo;re about to get (format, size, first-launch caveats), then the publish pipeline runs locally in your browser tab. The browser&amp;rsquo;s native download dialog handles the rest.&lt;/p&gt;&#xA;&lt;p&gt;There&amp;rsquo;s no signup. There&amp;rsquo;s no backend compile queue. The first time you publish for a given OS, the browser fetches a small per-platform &lt;em&gt;launcher template&lt;/em&gt; (~30 MB, cached after first publish), assembles it with your compiled assemblies, and hands the result off as a download.&lt;/p&gt;&#xA;&lt;h2 id=&#34;what-you-get-on-each-platform&#34;&gt;What you get on each platform&#xA;&lt;/h2&gt;&lt;h3 id=&#34;windows&#34;&gt;Windows&#xA;&lt;/h3&gt;&lt;p&gt;A self-contained &lt;code&gt;.exe&lt;/code&gt; packaged in a &lt;code&gt;.zip&lt;/code&gt; alongside an &lt;code&gt;app/&lt;/code&gt; folder (your compiled assemblies, sidecar DLLs, and resources) and a &lt;code&gt;README.txt&lt;/code&gt;. Recipients extract the archive and double-click the &lt;code&gt;.exe&lt;/code&gt;. No .NET install required on the recipient&amp;rsquo;s machine.&lt;/p&gt;&#xA;&lt;p&gt;Windows SmartScreen will show a &lt;em&gt;&amp;ldquo;Windows protected your PC&amp;rdquo;&lt;/em&gt; dialog on first launch because the &lt;code&gt;.exe&lt;/code&gt; is unsigned (we haven&amp;rsquo;t yet shipped support for user-supplied code-signing certificates). The bundled &lt;code&gt;README.txt&lt;/code&gt; has the &lt;em&gt;&amp;ldquo;More info → Run anyway&amp;rdquo;&lt;/em&gt; bypass steps.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://blog.xaml.io/post/publish-native-desktop-apps/windows-download-dialog.png&#34;&#xA;&#x9;width=&#34;1076&#34;&#xA;&#x9;height=&#34;799&#34;&#xA;&#x9;loading=&#34;lazy&#34;&#xA;&#x9;&#xA;&#x9;&#x9;alt=&#34;The Windows .exe download dialog inside XAML.io.&#34;&#xA;&#x9;&#xA;    &#xA;&#x9;&#xA;&#x9;&#x9;class=&#34;gallery-image&#34; &#xA;&#x9;&#x9;data-flex-grow=&#34;134&#34;&#xA;&#x9;&#x9;data-flex-basis=&#34;323px&#34;&#xA;&#x9;&#xA;&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;macos&#34;&gt;macOS&#xA;&lt;/h3&gt;&lt;p&gt;A self-contained &lt;code&gt;.app&lt;/code&gt; bundle inside a &lt;code&gt;.zip&lt;/code&gt;. The bundle is &lt;strong&gt;ad-hoc signed&lt;/strong&gt; client-side as part of the publish pipeline (more on how that works below). Because there&amp;rsquo;s no Apple Developer ID involved, macOS Gatekeeper still prompts on first launch, but the bundled &lt;code&gt;README.txt&lt;/code&gt; has the right-click → Open path for macOS 12-14 (Monterey, Ventura, Sonoma) and the &lt;em&gt;System Settings → Privacy &amp;amp; Security → Open Anyway&lt;/em&gt; path for macOS 15 (Sequoia).&lt;/p&gt;&#xA;&lt;p&gt;Apple Silicon (arm64) only for now. Intel Mac support is on the roadmap.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://blog.xaml.io/post/publish-native-desktop-apps/mac-download-dialog.png&#34;&#xA;&#x9;width=&#34;1073&#34;&#xA;&#x9;height=&#34;1169&#34;&#xA;&#x9;loading=&#34;lazy&#34;&#xA;&#x9;&#xA;&#x9;&#x9;alt=&#34;The macOS .app download dialog inside XAML.io.&#34;&#xA;&#x9;&#xA;    &#xA;&#x9;&#xA;&#x9;&#x9;class=&#34;gallery-image&#34; &#xA;&#x9;&#x9;data-flex-grow=&#34;91&#34;&#xA;&#x9;&#x9;data-flex-basis=&#34;220px&#34;&#xA;&#x9;&#xA;&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;linux&#34;&gt;Linux&#xA;&lt;/h3&gt;&lt;p&gt;A self-contained ELF executable in a &lt;code&gt;.tar.gz&lt;/code&gt;. Recipients extract the archive and run the executable. The UI is rendered via WebKitGTK 4.1, which ships preinstalled on every current LTS or rolling release (Ubuntu 22.04+, Debian 12+, Fedora 38+, Mint 21+, Arch). x86_64 only for now.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://blog.xaml.io/post/publish-native-desktop-apps/linux-download-dialog.png&#34;&#xA;&#x9;width=&#34;1070&#34;&#xA;&#x9;height=&#34;807&#34;&#xA;&#x9;loading=&#34;lazy&#34;&#xA;&#x9;&#xA;&#x9;&#x9;alt=&#34;The Linux executable download dialog inside XAML.io.&#34;&#xA;&#x9;&#xA;    &#xA;&#x9;&#xA;&#x9;&#x9;class=&#34;gallery-image&#34; &#xA;&#x9;&#x9;data-flex-grow=&#34;132&#34;&#xA;&#x9;&#x9;data-flex-basis=&#34;318px&#34;&#xA;&#x9;&#xA;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;these-are-real-native-desktop-apps&#34;&gt;These are real native desktop apps&#xA;&lt;/h2&gt;&lt;p&gt;Same project, three OSes, three native processes:&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://blog.xaml.io/post/publish-native-desktop-apps/windows-app-running.jpg&#34;&#xA;&#x9;width=&#34;1440&#34;&#xA;&#x9;height=&#34;900&#34;&#xA;&#x9;loading=&#34;lazy&#34;&#xA;&#x9;&#xA;&#x9;&#x9;alt=&#34;The published app running natively on Windows.&#34;&#xA;&#x9;&#xA;    &#xA;&#x9;&#xA;&#x9;&#x9;class=&#34;gallery-image&#34; &#xA;&#x9;&#x9;data-flex-grow=&#34;160&#34;&#xA;&#x9;&#x9;data-flex-basis=&#34;384px&#34;&#xA;&#x9;&#xA;&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://blog.xaml.io/post/publish-native-desktop-apps/mac-app-running.jpg&#34;&#xA;&#x9;width=&#34;1400&#34;&#xA;&#x9;height=&#34;768&#34;&#xA;&#x9;loading=&#34;lazy&#34;&#xA;&#x9;&#xA;&#x9;&#x9;alt=&#34;The published app running natively on macOS.&#34;&#xA;&#x9;&#xA;    &#xA;&#x9;&#xA;&#x9;&#x9;class=&#34;gallery-image&#34; &#xA;&#x9;&#x9;data-flex-grow=&#34;182&#34;&#xA;&#x9;&#x9;data-flex-basis=&#34;437px&#34;&#xA;&#x9;&#xA;&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://blog.xaml.io/post/publish-native-desktop-apps/linux-app-running.jpg&#34;&#xA;&#x9;width=&#34;1065&#34;&#xA;&#x9;height=&#34;573&#34;&#xA;&#x9;loading=&#34;lazy&#34;&#xA;&#x9;&#xA;&#x9;&#x9;alt=&#34;The published app running natively on Linux.&#34;&#xA;&#x9;&#xA;    &#xA;&#x9;&#xA;&#x9;&#x9;class=&#34;gallery-image&#34; &#xA;&#x9;&#x9;data-flex-grow=&#34;185&#34;&#xA;&#x9;&#x9;data-flex-basis=&#34;446px&#34;&#xA;&#x9;&#xA;&gt;&lt;/p&gt;&#xA;&lt;p&gt;The downloaded artifact is a real native .NET process, not a packaged web page or a WebAssembly container. Your C# runs as native code on the recipient&amp;rsquo;s machine via the &lt;strong&gt;.NET 10&lt;/strong&gt; runtime (JIT-compiled, in-process, with full access to threading, sockets, file I/O, and P/Invoke), the same &lt;strong&gt;execution model&lt;/strong&gt; as a WPF or WinForms app.&lt;/p&gt;&#xA;&lt;p&gt;The &lt;strong&gt;rendering model&lt;/strong&gt; is different: XAML.io builds &lt;a class=&#34;link&#34; href=&#34;https://opensilver.net&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;OpenSilver&lt;/a&gt; apps. At build time, OpenSilver&amp;rsquo;s XAML compiler emits C# that knows how to construct the visual tree. At runtime, that C# runs, and each OpenSilver control attaches its underlying DOM element to the document: a &lt;code&gt;TextBox&lt;/code&gt; becomes an actual &lt;code&gt;&amp;lt;textarea&amp;gt;&lt;/code&gt;, an &lt;code&gt;Image&lt;/code&gt; becomes an &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt;, a &lt;code&gt;Path&lt;/code&gt; becomes an &lt;code&gt;&amp;lt;svg&amp;gt;&lt;/code&gt; (see &lt;a class=&#34;link&#34; href=&#34;https://blog.xaml.io/post/xaml-io-v0-6/#under-the-hood-client-side-compilation-no-lock-in&#34; &gt;the v0.6 deep dive&lt;/a&gt; for the long version). In the published desktop app that DOM lives inside the OS&amp;rsquo;s built-in WebView (&lt;a class=&#34;link&#34; href=&#34;https://learn.microsoft.com/en-us/microsoft-edge/webview2/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Edge WebView2&lt;/a&gt; on Windows, &lt;a class=&#34;link&#34; href=&#34;https://developer.apple.com/documentation/webkit/wkwebview&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;WKWebView&lt;/a&gt; on macOS, &lt;a class=&#34;link&#34; href=&#34;https://webkitgtk.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;WebKitGTK&lt;/a&gt; on Linux), embedded into the .NET process via &lt;a class=&#34;link&#34; href=&#34;https://www.tryphotino.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Photino&lt;/a&gt; and driven by the OpenSilver runtime directly (no Blazor WASM in the desktop app; that&amp;rsquo;s IDE-only). So: &lt;strong&gt;native .NET execution, DOM-based UI rendering, no bundled browser engine, no WASM at runtime&lt;/strong&gt;.&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;reactions-so-far&#34;&gt;Reactions so far&#xA;&lt;/h2&gt;&lt;p&gt;&amp;ldquo;Fucking hell this is really getting so much better, thanks a whole lot to the team!!&amp;rdquo;&lt;br&gt;&#xA;— &lt;em&gt;Infinite_Track_9210 on Reddit (&lt;a class=&#34;link&#34; href=&#34;https://www.reddit.com/r/dotnet/comments/1t7a3fg/xamlio_now_exports_to_native_windows_exe/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;source&lt;/a&gt;)&lt;/em&gt;&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;under-the-hood&#34;&gt;Under the Hood&#xA;&lt;/h2&gt;&lt;p&gt;There are four pieces worth pulling apart, because each one is the kind of thing that&amp;rsquo;s often assumed to need a backend.&lt;/p&gt;&#xA;&lt;h3 id=&#34;1-the-packaging-pipeline-runs-entirely-in-your-browser-tab&#34;&gt;1. The packaging pipeline runs entirely in your browser tab&#xA;&lt;/h3&gt;&lt;p&gt;No backend compile step. No server upload. No build queue. When you click Publish, the browser:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Compiles your C#+XAML project to .NET assemblies using the same in-browser Roslyn that powers XAML.io&amp;rsquo;s Run button (see our earlier post on &lt;a class=&#34;link&#34; href=&#34;https://blog.xaml.io/post/dotnet-ide-in-the-browser-no-backend/&#34; &gt;in-browser .NET compilation&lt;/a&gt;).&lt;/li&gt;&#xA;&lt;li&gt;Fetches a per-OS launcher template from XAML.io&amp;rsquo;s CDN. The template is a pre-built &lt;a class=&#34;link&#34; href=&#34;https://www.tryphotino.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Photino&lt;/a&gt; app for that platform, bundled with the .NET runtime. It&amp;rsquo;s cached after first publish, so subsequent publishes for the same OS skip this step.&lt;/li&gt;&#xA;&lt;li&gt;Assembles your compiled assemblies + a small &lt;code&gt;manifest.json&lt;/code&gt; + resources into the launcher&amp;rsquo;s expected sidecar layout, on an in-memory filesystem (Emscripten&amp;rsquo;s MEMFS, the same virtual FS Blazor WebAssembly uses).&lt;/li&gt;&#xA;&lt;li&gt;Re-packs the result into the right archive format (&lt;code&gt;.zip&lt;/code&gt; for Windows and macOS, &lt;code&gt;.tar.gz&lt;/code&gt; for Linux) with the correct executable bits, then hands the byte array to the browser&amp;rsquo;s native download dialog.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;Your code never leaves your machine. The only network traffic during a publish is the one-time launcher-template fetch, which is the same pre-built bytes for everyone; the launcher knows nothing about your project.&lt;/p&gt;&#xA;&lt;h3 id=&#34;2-native-net-execution-dom-based-rendering&#34;&gt;2. Native .NET execution, DOM-based rendering&#xA;&lt;/h3&gt;&lt;p&gt;This is the part that surprises people, so it&amp;rsquo;s worth being explicit about: the WebAssembly part is only the IDE itself. The desktop apps it produces are real native &lt;strong&gt;.NET 10&lt;/strong&gt; processes. Your C# is JIT-compiled by the runtime and runs in-process, with the same execution model as a WPF or WinForms app.&lt;/p&gt;&#xA;&lt;p&gt;The UI is rendered as real DOM elements (OpenSilver&amp;rsquo;s design choice; see &lt;a class=&#34;link&#34; href=&#34;https://blog.xaml.io/post/xaml-io-v0-6/#under-the-hood-client-side-compilation-no-lock-in&#34; &gt;the v0.6 deep dive&lt;/a&gt;), displayed inside the OS&amp;rsquo;s built-in WebView via &lt;a class=&#34;link&#34; href=&#34;https://www.tryphotino.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Photino&lt;/a&gt;. In the published desktop app the OpenSilver runtime is loaded &lt;em&gt;directly&lt;/em&gt; by Photino through the &lt;code&gt;OpenSilver.Photino&lt;/code&gt; bridge: there&amp;rsquo;s no Blazor WebAssembly intermediate at runtime, and no client-side compilation either (that&amp;rsquo;s all IDE-only).&lt;/p&gt;&#xA;&lt;p&gt;That separation matters in two practical ways:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;No bundled browser engine.&lt;/strong&gt; Photino uses the OS&amp;rsquo;s built-in WebView (Edge WebView2 / WKWebView / WebKitGTK) rather than bundling Chromium the way Electron does. That keeps the download size to roughly the cost of the .NET runtime alone.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;C# / .NET libraries work the same as on any desktop .NET process.&lt;/strong&gt; All the things WebAssembly normally sandboxes away (file I/O, sockets, threading, P/Invoke, native interop) work normally in the published app, because it&amp;rsquo;s a normal .NET process. Your code can do things the IDE itself can&amp;rsquo;t.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;3-even-macos-ad-hoc-code-signing-happens-client-side&#34;&gt;3. Even macOS ad-hoc code-signing happens client-side&#xA;&lt;/h3&gt;&lt;p&gt;This was the trickiest part to get working. Apple&amp;rsquo;s Mach-O format and the CodeDirectory hashing dance that produces a valid &lt;code&gt;.app&lt;/code&gt; bundle signature are normally handled by &lt;code&gt;codesign&lt;/code&gt;, which is a macOS-only command-line tool. To make publishing a &lt;code&gt;.app&lt;/code&gt; from the browser work without a server-side signer, and without requiring you to be on a Mac, we needed an in-WebAssembly implementation of the signing pass.&lt;/p&gt;&#xA;&lt;p&gt;The answer: we pulled the Mach-O writer and CodeDirectory hasher out of &lt;a class=&#34;link&#34; href=&#34;https://github.com/filipnavara/CodeSign&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Filip Navara&amp;rsquo;s CodeSign / Melanzana&lt;/a&gt;, trimmed them to the parts we actually use, and run the ad-hoc signing pass entirely in the browser&amp;rsquo;s WebAssembly runtime. The bundle&amp;rsquo;s Mach-O binary is re-hashed, the &lt;code&gt;_CodeSignature/CodeResources&lt;/code&gt; plist is regenerated, and the LC_CODE_SIGNATURE load command is rewritten. All of that happens on MEMFS, in C# compiled to WASM. The output is a valid ad-hoc signed bundle that Gatekeeper will accept (with the standard first-launch prompt that ad-hoc bundles always trigger).&lt;/p&gt;&#xA;&lt;p&gt;The Melanzana subset is &lt;strong&gt;lazy-loaded&lt;/strong&gt;: it ships as a separate &lt;code&gt;~500 KB&lt;/code&gt; compressed assembly that&amp;rsquo;s only fetched the first time you click &lt;em&gt;Download as a macOS app&lt;/em&gt;. Windows-only and Linux-only publishers never download those bytes, so the IDE&amp;rsquo;s first-paint payload is unchanged for them.&lt;/p&gt;&#xA;&lt;p&gt;Honestly, signing a macOS app from inside a browser tab is the kind of thing we&amp;rsquo;d have called impossible. Until we got it working.&lt;/p&gt;&#xA;&lt;h3 id=&#34;4-file-sizes&#34;&gt;4. File sizes&#xA;&lt;/h3&gt;&lt;p&gt;The launcher is a &lt;strong&gt;.NET 10 self-contained, single-file deployment&lt;/strong&gt; with compression enabled (&lt;code&gt;EnableCompressionInSingleFile=true&lt;/code&gt;) and trimming deliberately &lt;strong&gt;off&lt;/strong&gt; (&lt;code&gt;PublishTrimmed=false&lt;/code&gt;). Trimming is off on purpose: the launcher loads your compiled assemblies via &lt;code&gt;Assembly.Load(byte[])&lt;/code&gt; and the trimmer cannot reason about that. Compression brings an &lt;em&gt;untrimmed&lt;/em&gt; self-contained .NET 10 app under 40 MB; without it, the same artifact lands closer to 60-80 MB.&lt;/p&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;Platform&lt;/th&gt;&#xA;          &lt;th&gt;Compressed download&lt;/th&gt;&#xA;          &lt;th&gt;What&amp;rsquo;s inside&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Windows&lt;/td&gt;&#xA;          &lt;td&gt;~30-40 MB &lt;code&gt;.zip&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Single-file &lt;code&gt;.exe&lt;/code&gt; with the .NET 10 runtime + OpenSilver runtime + Photino bridge bundled inside, alongside an &lt;code&gt;app/&lt;/code&gt; folder with your compiled assemblies and a &lt;code&gt;README.txt&lt;/code&gt;.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;macOS&lt;/td&gt;&#xA;          &lt;td&gt;~30-40 MB &lt;code&gt;.zip&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Ad-hoc-signed &lt;code&gt;.app&lt;/code&gt; bundle following the same layout as Windows. Apple Silicon (arm64).&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Linux&lt;/td&gt;&#xA;          &lt;td&gt;~30-40 MB &lt;code&gt;.tar.gz&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Single-file ELF executable with the same internal layout. x86_64.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;Sizes don&amp;rsquo;t balloon to Electron&amp;rsquo;s ~150 MB+ territory because Photino uses the OS&amp;rsquo;s built-in WebView rather than bundling Chromium. You pay for the .NET runtime, not for a browser engine.&lt;/p&gt;&#xA;&lt;p&gt;The floor stays flat across platforms because the .NET runtime is the dominant cost. Project assets (images, fonts, media, embedded resources) add to that linearly.&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;limitations-and-whats-missing&#34;&gt;Limitations and what&amp;rsquo;s missing&#xA;&lt;/h2&gt;&lt;p&gt;We want to be upfront about what isn&amp;rsquo;t there yet:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Preview / Alpha in XAML.io v0.7 (May 2026).&lt;/strong&gt; Behavior, UI, and the on-disk layout of the produced artifacts may change between releases. We&amp;rsquo;d rather ship the rough version and iterate with feedback than wait for everything to be perfect.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;No publisher-identity signing or notarization.&lt;/strong&gt; Apps are unsigned in the Apple Developer ID / Windows Authenticode sense, so first-launch Gatekeeper and SmartScreen warnings still apply. Support for user-supplied code-signing certificates is on the way; for macOS, apps distributed via the web also need Apple&amp;rsquo;s notarization step for the smoothest first-launch experience, and we&amp;rsquo;ll wire that up alongside cert support. Until then, the bundled &lt;code&gt;README.txt&lt;/code&gt; walks recipients through the one-click bypass for each OS.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Architecture coverage is partial.&lt;/strong&gt; macOS publish is Apple Silicon (arm64) only. Linux publish is x86_64 only. Intel Macs and Linux ARM64 are on the roadmap.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Linux distro floor.&lt;/strong&gt; Modern distros (Ubuntu 22.04+, Debian 12+, Fedora 38+, Arch, Mint 21+) ship WebKitGTK 4.1 preinstalled and run the published app with no setup. On older releases (Ubuntu 18.04 / 20.04, Debian 11) recipients may need a one-time &lt;code&gt;apt install libwebkit2gtk-4.1-0&lt;/code&gt; or equivalent. The bundled &lt;code&gt;README.txt&lt;/code&gt; has the per-distro commands.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Publish is best on desktop browsers.&lt;/strong&gt; The packaging pass uses the WebAssembly heap heavily; mobile browsers may run out of memory on larger projects. Editing and running on mobile is fine, as before.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;whats-coming-next&#34;&gt;What&amp;rsquo;s coming next&#xA;&lt;/h2&gt;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;Feature&lt;/th&gt;&#xA;          &lt;th&gt;Description&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;User-supplied code-signing certificates&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Upload your Apple Developer ID or Authenticode certificate; published apps then ship with publisher-identity signing and skip the first-launch warning entirely.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;Broader CPU coverage&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;macOS Intel (x86_64) and Linux ARM64 publish targets.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;One-click web deployment&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Already on the &lt;a class=&#34;link&#34; href=&#34;https://blog.xaml.io/post/xaml-io-v0-6/#limitations-and-whats-next&#34; &gt;v0.6 roadmap&lt;/a&gt;; the desktop publish flow is the local-distribution side of the same story.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;Suggest or vote on features at &lt;a class=&#34;link&#34; href=&#34;https://feedback.xaml.io&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;feedback.xaml.io&lt;/a&gt;, ask questions on the &lt;a class=&#34;link&#34; href=&#34;https://forums.xaml.io&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;forums&lt;/a&gt;, or &lt;a class=&#34;link&#34; href=&#34;https://opensilver.net/contact&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;contact us directly&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;try-it&#34;&gt;Try it&#xA;&lt;/h2&gt;&lt;p&gt;Open &lt;a class=&#34;link&#34; href=&#34;https://xaml.io&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;xaml.io&lt;/a&gt;, build something, click &lt;strong&gt;Publish&lt;/strong&gt;, pick a platform. In well under a minute on a modern laptop you&amp;rsquo;ll have a real native desktop app you can hand to anyone with that OS.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://xaml.io&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;&lt;strong&gt;xaml.io&lt;/strong&gt;&lt;/a&gt; | Free. No install. No signup required.&lt;/p&gt;&#xA;</description>
        </item></channel>
</rss>
