<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://aliveos.org/feed.xml" rel="self" type="application/atom+xml" /><link href="https://aliveos.org/" rel="alternate" type="text/html" /><updated>2026-08-03T09:16:12+00:00</updated><id>https://aliveos.org/feed.xml</id><title type="html">AliveOS</title><subtitle>A minimalist, Arch-based, developer-optimized Linux distribution, designed for essential performance and a clean workflow.</subtitle><entry><title type="html">Dory: Why We Forked Nemo and What It Took to Build a Proper File Chooser Portal</title><link href="https://aliveos.org/news/dory-file-manager-deep-dive/" rel="alternate" type="text/html" title="Dory: Why We Forked Nemo and What It Took to Build a Proper File Chooser Portal" /><published>2026-08-01T10:00:00+00:00</published><updated>2026-08-01T10:00:00+00:00</updated><id>https://aliveos.org/news/dory-file-manager-deep-dive</id><content type="html" xml:base="https://aliveos.org/news/dory-file-manager-deep-dive/"><![CDATA[<h2 id="the-spark-that-started-aliveos">The Spark That Started AliveOS</h2>

<p>Every distribution has a catalyst. For AliveOS, it was a file picker dialog.</p>

<p>I was running Cinnamon on Arch, and every time a Flatpak app needed to open or save a file, the portal dialog was either missing, broken, or looked like it belonged in a different desktop environment. The <code class="language-plaintext highlighter-rouge">xdg-desktop-portal-gtk</code> backend worked, but it was generic — no custom actions, no proper sidebar integration, no native feel.</p>

<p>I tried configuring <code class="language-plaintext highlighter-rouge">xdg-desktop-portal-xapp-filepicker</code>. It worked better, but Nemo’s portal mode had quirks: it wouldn’t stay focused, multiselect was flaky, and the save dialog didn’t handle overwrites gracefully.</p>

<p>So I asked myself: what if I just forked Nemo and made it do exactly what I needed?</p>

<p>That question became Dory. And Dory became the reason AliveOS exists.</p>

<h2 id="what-dory-actually-is">What Dory Actually Is</h2>

<p>Dory is a <strong>standalone file chooser portal backend</strong> and file manager, forked from <a href="https://github.com/linuxmint/nemo">Nemo</a> (the Cinnamon file manager). But it’s not Nemo with a different name. Every namespace — binaries, D-Bus services, GSettings schemas, desktop files, library paths — has been renamed from <code class="language-plaintext highlighter-rouge">nemo</code> to <code class="language-plaintext highlighter-rouge">dory</code>.</p>

<p>This means Dory can be installed <strong>side-by-side with Nemo</strong> without conflicts. It doesn’t steal your file manager associations. It doesn’t overwrite your schemas. It just quietly handles portal file dialogs when called by <code class="language-plaintext highlighter-rouge">xdg-desktop-portal-xapp-filepicker</code>.</p>

<h2 id="the-technical-challenge-portal-dialogs-are-hard">The Technical Challenge: Portal Dialogs Are Hard</h2>

<p>File chooser portals are deceptively complex. Here’s what the D-Bus interface (<code class="language-plaintext highlighter-rouge">org.Dory.FileChooser</code>) needs to handle:</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// OpenFile — standard file/folder selection</span>
<span class="kt">void</span> <span class="nf">open_file</span><span class="p">(</span>
    <span class="n">string</span> <span class="n">parent_window</span><span class="p">,</span>
    <span class="n">string</span> <span class="n">title</span><span class="p">,</span>
    <span class="n">string</span><span class="p">[]</span> <span class="n">accept_label</span><span class="p">,</span>
    <span class="n">string</span><span class="p">[]</span> <span class="n">options</span>  <span class="c1">// filters, multiselect, directory mode, etc.</span>
<span class="p">);</span>

<span class="c1">// SaveFile — single file save with overwrite confirmation</span>
<span class="kt">void</span> <span class="nf">save_file</span><span class="p">(</span>
    <span class="n">string</span> <span class="n">parent_window</span><span class="p">,</span>
    <span class="n">string</span> <span class="n">title</span><span class="p">,</span>
    <span class="n">string</span> <span class="n">accept_label</span><span class="p">,</span>
    <span class="n">string</span> <span class="n">options</span>  <span class="c1">// suggested_name, current_folder, etc.</span>
<span class="p">);</span>

<span class="c1">// SaveFiles — multi-file save (for GIMP layers, etc.)</span>
<span class="kt">void</span> <span class="nf">save_files</span><span class="p">(</span>
    <span class="n">string</span> <span class="n">parent_window</span><span class="p">,</span>
    <span class="n">string</span> <span class="n">title</span><span class="p">,</span>
    <span class="n">string</span> <span class="n">accept_label</span><span class="p">,</span>
    <span class="n">string</span><span class="p">[]</span> <span class="n">files</span><span class="p">,</span>  <span class="c1">// list of suggested filenames</span>
    <span class="n">string</span> <span class="n">options</span>
<span class="p">);</span>
</code></pre></div></div>

<p>Each of these needs to:</p>
<ol>
  <li>Spawn a dialog window</li>
  <li>Track focus and lifecycle via GApplication holds</li>
  <li>Handle the case where the user cancels</li>
  <li>Return URIs or throw <code class="language-plaintext highlighter-rouge">org.freedesktop.DBus.Error.NoResponse</code></li>
</ol>

<p>The <strong>GApplication lifecycle</strong> was the first major roadblock.</p>

<h2 id="roadblock-1-the-daemon-that-wouldnt-stay-alive">Roadblock #1: The Daemon That Wouldn’t Stay Alive</h2>

<p>When a Flatpak app requests a file, the portal backend spawns, shows the dialog, waits for user input, then returns the result. Simple in theory. In practice, the D-Bus service activation would spawn the process, the dialog would appear, but the process would exit before the user could click anything.</p>

<p>Root cause: GApplication was releasing its hold when the D-Bus method call completed, not when the dialog closed.</p>

<p>The fix: <strong>restructure the D-Bus service activation to maintain GApplication holds throughout the dialog lifecycle</strong>:</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// Before: hold released immediately after method dispatch</span>
<span class="n">g_application_release</span><span class="p">(</span><span class="n">app</span><span class="p">);</span>

<span class="c1">// After: hold maintained until dialog response</span>
<span class="n">g_application_hold</span><span class="p">(</span><span class="n">app</span><span class="p">);</span>
<span class="c1">// ... show dialog ...</span>
<span class="c1">// In dialog response handler:</span>
<span class="n">g_application_release</span><span class="p">(</span><span class="n">app</span><span class="p">);</span>
</code></pre></div></div>

<p>This kept the process alive until the user actually selected or cancelled.</p>

<h2 id="roadblock-2-focus-stealing-and-dialog-z-order">Roadblock #2: Focus Stealing and Dialog Z-Order</h2>

<p>Portal dialogs need to appear above the requesting application. But X11 window managers (and Wayland compositors) have their own ideas about focus. The dialog would appear behind the parent window, or the parent window would steal focus back.</p>

<p>The fix was a combination of <code class="language-plaintext highlighter-rouge">gtk_window_present()</code> with <code class="language-plaintext highlighter-rouge">gdk_window_raise()</code> and <code class="language-plaintext highlighter-rouge">gdk_window_focus()</code> calls, timed after the dialog realized:</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">static</span> <span class="kt">void</span> <span class="nf">on_dialog_realized</span><span class="p">(</span><span class="n">GtkWidget</span> <span class="o">*</span><span class="n">dialog</span><span class="p">,</span> <span class="n">gpointer</span> <span class="n">user_data</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">GdkWindow</span> <span class="o">*</span><span class="n">gdk_window</span> <span class="o">=</span> <span class="n">gtk_widget_get_window</span><span class="p">(</span><span class="n">dialog</span><span class="p">);</span>
    <span class="n">gdk_window_raise</span><span class="p">(</span><span class="n">gdk_window</span><span class="p">);</span>
    <span class="n">gdk_window_focus</span><span class="p">(</span><span class="n">gdk_window</span><span class="p">,</span> <span class="n">GDK_CURRENT_TIME</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Even then, some window managers fight you. We added a GSettings persistence layer to remember the last-used directory and dialog state across invocations.</p>

<h2 id="roadblock-3-multiselect-uri-reconstruction">Roadblock #3: Multiselect URI Reconstruction</h2>

<p>The portal passes selected files as a list of URIs. But when multiselect is enabled, the D-Bus response needs to reconstruct the full URI list from the internal selection model.</p>

<p>The bug: <code class="language-plaintext highlighter-rouge">get_selected_uris()</code> was only returning the first selected file when multiple files were chosen.</p>

<p>Root cause: the selection model was being rebuilt during the response dispatch, losing the intermediate state.</p>

<p>Fix: <strong>rebuild the URI list from all selected paths before the dialog closes</strong>:</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// Rebuild selected_uris from all selected paths</span>
<span class="n">GList</span> <span class="o">*</span><span class="n">selected_paths</span> <span class="o">=</span> <span class="n">gtk_icon_view_get_selected_items</span><span class="p">(</span><span class="n">view</span><span class="p">);</span>
<span class="k">for</span> <span class="p">(</span><span class="n">GList</span> <span class="o">*</span><span class="n">l</span> <span class="o">=</span> <span class="n">selected_paths</span><span class="p">;</span> <span class="n">l</span> <span class="o">!=</span> <span class="nb">NULL</span><span class="p">;</span> <span class="n">l</span> <span class="o">=</span> <span class="n">l</span><span class="o">-&gt;</span><span class="n">next</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">GtkTreePath</span> <span class="o">*</span><span class="n">path</span> <span class="o">=</span> <span class="n">l</span><span class="o">-&gt;</span><span class="n">data</span><span class="p">;</span>
    <span class="c1">// ... convert to URI and add to list ...</span>
<span class="p">}</span>
</code></pre></div></div>

<h2 id="roadblock-4-save-dialog-overwrite-confirmation">Roadblock #4: Save Dialog Overwrite Confirmation</h2>

<p>The standard portal save dialog doesn’t handle overwrites — it just returns the path. But users expect a “file already exists, overwrite?” confirmation.</p>

<p>We implemented an <strong>intelligent overwrite modal</strong>: when the user selects a path that already exists, the dialog intercepts the selection, shows a confirmation dialog, and keeps the picker open if the user declines:</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">if</span> <span class="p">(</span><span class="n">g_file_exists</span><span class="p">(</span><span class="n">selected_file</span><span class="p">))</span> <span class="p">{</span>
    <span class="c1">// Show overwrite confirmation dialog</span>
    <span class="kt">int</span> <span class="n">response</span> <span class="o">=</span> <span class="n">gtk_dialog_run</span><span class="p">(</span><span class="n">GTK_DIALOG</span><span class="p">(</span><span class="n">overwrite_dialog</span><span class="p">));</span>
    <span class="k">if</span> <span class="p">(</span><span class="n">response</span> <span class="o">==</span> <span class="n">GTK_RESPONSE_NO</span><span class="p">)</span> <span class="p">{</span>
        <span class="c1">// Keep picker open, let user choose different path</span>
        <span class="k">return</span><span class="p">;</span>
    <span class="p">}</span>
<span class="p">}</span>
<span class="c1">// Proceed with save</span>
</code></pre></div></div>

<p>This required careful coordination between the dialog’s response handlers and the GApplication lifecycle.</p>

<h2 id="roadblock-5-the-libglycin-thumbnail-minefield">Roadblock #5: The libglycin Thumbnail Minefield</h2>

<p>Dory generates thumbnails for files in the portal dialog. This uses <code class="language-plaintext highlighter-rouge">libglycin</code> for image loading. Here’s the problem: <strong>libglycin is loaded into the Cinnamon process</strong> (the desktop shell). A crash in libglycin doesn’t just crash Dory — it segfaults Cinnamon and freezes the entire desktop.</p>

<p>The AGENTS.md in the Dory repo spells this out clearly:</p>

<blockquote>
  <ol>
    <li>Never let invalid/untrusted data reach libglycin unchecked.</li>
    <li>Catch and handle all libglycin errors gracefully.</li>
    <li>Avoid resizing images in-place on the main thread without bounds checks.</li>
    <li>Test thumbnail code under stress — large images, corrupt files, zero-byte files, symlink loops.</li>
  </ol>
</blockquote>

<p>We added <strong>validation layers</strong> before any image data reaches libglycin: dimension checks, format verification, and buffer size validation. The thumbnail generation runs in a separate thread with error boundaries that catch and log failures without propagating them.</p>

<h2 id="recent-development-post-fork-commits">Recent Development: Post-Fork Commits</h2>

<p>Here’s what’s been shipping since the initial fork:</p>

<table>
  <thead>
    <tr>
      <th>Version</th>
      <th>Key Changes</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><strong>6.7.6</strong></td>
      <td>Wayland monitor removal crash fix, DnD search result protection, interactive label cleanup</td>
    </tr>
    <tr>
      <td><strong>6.7.5</strong></td>
      <td>Robust initial/last directory resolution, non-directory save prevention</td>
    </tr>
    <tr>
      <td><strong>6.7.4</strong></td>
      <td>Action layout editor renamed from nemo to dory, focus force fix, multiselect rebuild</td>
    </tr>
  </tbody>
</table>

<p>The commit history tells the story of iterative hardening:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>7c76df75 nemo-desktop: Don't crash/quit in Wayland when the monitor is removed
2e7fe76d dnd: Don't allow drops into a search result view
77f49f79 chooser: robustly resolve initial/last directory and prevent saving non-directories
5fcebdde refactor: rename action layout editor from nemo to dory
9eecb1c8 fix: force focus on file chooser dialog with gdk_window_raise + gdk_window_focus
67fee9c6 fix: rebuild selected_uris from all selected paths for proper multiselect support
66302aa3 fix: raise file chooser dialog to foreground with gtk_window_present
0ccffa54 fix: save-mode folder selection + add SaveFiles D-Bus method
539b8a9e Properties: Add Stop button for folder disk usage scanning
</code></pre></div></div>

<h2 id="current-status-stable-and-shipping">Current Status: Stable and Shipping</h2>

<p>Dory is now at <strong>v6.7.6</strong> and ships as the default file chooser portal backend in AliveOS. It’s available in the AUR as <code class="language-plaintext highlighter-rouge">dory-git</code> and declared as providing/conflicting with <code class="language-plaintext highlighter-rouge">nemo</code> to satisfy Cinnamon’s dependencies.</p>

<p>The extensions ecosystem is also growing:</p>
<ul>
  <li><code class="language-plaintext highlighter-rouge">dory-terminal</code> — embedded terminal in file manager</li>
  <li><code class="language-plaintext highlighter-rouge">dory-share</code> — Samba/network sharing integration</li>
  <li><code class="language-plaintext highlighter-rouge">dory-preview</code> — enhanced file previews</li>
  <li><code class="language-plaintext highlighter-rouge">dory-python</code> — Python scripting support</li>
  <li><code class="language-plaintext highlighter-rouge">dory-compare</code> — file comparison tools</li>
</ul>

<h2 id="what-dory-taught-me">What Dory Taught Me</h2>

<p>Building Dory taught me three things about file managers:</p>

<ol>
  <li>
    <p><strong>Portal dialogs are first-class citizens.</strong> In a world of Flatpaks and sandboxed apps, the file picker isn’t just a UI convenience — it’s a system service.</p>
  </li>
  <li>
    <p><strong>Namespace isolation matters.</strong> If you want your fork to coexist with the original, you need to rename everything. Every binary, every D-Bus name, every schema path.</p>
  </li>
  <li>
    <p><strong>Thumbnail loading is a trust boundary.</strong> When your file manager loads arbitrary images for previews, you’re one malformed JPEG away from crashing the entire desktop.</p>
  </li>
</ol>

<p>Dory is the piece that made me realize: if I wanted a file manager that did exactly what I needed, I’d have to build it myself. And if I was building a file manager, I might as well build a distribution around it.</p>

<hr />

<h2 id="acknowledgments">Acknowledgments</h2>

<p>Dory wouldn’t exist without the incredible work of the <strong>Cinnamon and Linux Mint development team</strong>. Nemo is a polished, well-engineered file manager — forking it gave us a solid foundation that would have taken years to build from scratch.</p>

<p>Special thanks to:</p>
<ul>
  <li><strong>Clement Lefebvre</strong> and the Linux Mint team for maintaining Nemo and the broader Cinnamon ecosystem</li>
  <li><strong>Michael Webster</strong> and other Nemo contributors for the extension framework and D-Bus interfaces that Dory builds upon</li>
  <li>The <strong>XApp</strong> team for the toolkit components that make GTK-based desktop apps feel native across Cinnamon, MATE, and XFCE</li>
</ul>

<p>We stand on the shoulders of giants. Dory is our attempt to give back — a specialized tool for a specific use case, built on the excellent foundation the Mint team created.</p>

<hr />

<p><em>Dory is available at <a href="https://github.com/Twilight0/dory">github.com/Twilight0/dory</a>. Extensions are at <a href="https://github.com/Twilight0/dory-extensions">github.com/Twilight0/dory-extensions</a>. Join the discussion on the <a href="https://aliveos.org/forum">AliveOS Forum</a>.</em></p>]]></content><author><name>The AliveOS Project</name></author><summary type="html"><![CDATA[The Spark That Started AliveOS]]></summary></entry><entry><title type="html">xconnect: A Deep Dive into Building a KDE Connect Alternative from Scratch</title><link href="https://aliveos.org/news/xconnect-deep-dive/" rel="alternate" type="text/html" title="xconnect: A Deep Dive into Building a KDE Connect Alternative from Scratch" /><published>2026-07-31T14:00:00+00:00</published><updated>2026-07-31T14:00:00+00:00</updated><id>https://aliveos.org/news/xconnect-deep-dive</id><content type="html" xml:base="https://aliveos.org/news/xconnect-deep-dive/"><![CDATA[<h2 id="why-we-built-xconnect">Why We Built xconnect</h2>

<p>Let’s cut to the chase: KDE Connect is a fantastic project, but it comes with a dependency chain that makes it unsuitable for lightweight, GTK-based desktop environments. If you’re running Cinnamon, MATE, or XFCE on Arch, you shouldn’t need to pull in half of KDE’s infrastructure just to get clipboard sync and notification mirroring working.</p>

<p>So we built <strong>xconnect</strong> — a fork of <a href="https://github.com/bboozzoo/mconnect">mconnect</a>, Maciej Borzecki’s excellent KDE Connect protocol implementation in Vala/C. We kept the solid protocol foundation and added a GTK3/XApp GUI, expanded the CLI, and implemented features that the original project never prioritized. No KDE dependencies. Just pure functionality.</p>

<h2 id="technical-architecture">Technical Architecture</h2>

<p>Built on top of mconnect’s Vala/C foundation, xconnect extends the architecture with three components:</p>

<ol>
  <li>
    <p><strong>xconnect daemon</strong> — The core service handling protocol negotiation, device discovery, TLS channel management, and packet routing via D-Bus (<code class="language-plaintext highlighter-rouge">org.xconnect</code>).</p>
  </li>
  <li>
    <p><strong>xconnectctl</strong> — A CLI client that exposes every daemon capability as a command-line interface. This isn’t just a toy wrapper; it’s a fully-featured automation tool.</p>
  </li>
  <li>
    <p><strong>xconnect-app</strong> — A GTK3 system tray application with device management, notification history, MPRIS media controls, and inline configuration editing.</p>
  </li>
</ol>

<p>The daemon runs as a systemd user unit, listening on UDP 1716 for incoming device discovery and broadcasting identity packets to UDP 1714 every 5 seconds. Device connections are established over TCP 1714, with TLS negotiation handled via GnuTLS.</p>

<h2 id="features-implemented">Features Implemented</h2>

<p>Here’s what’s working as of v2.3.0:</p>

<table>
  <thead>
    <tr>
      <th>Category</th>
      <th>Capabilities</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><strong>Device Management</strong></td>
      <td>Discovery, pairing (with SHA-256 verification keys), unpairing, persistent short IDs</td>
    </tr>
    <tr>
      <td><strong>Notifications</strong></td>
      <td>Full mirroring, action buttons, inline reply (Cinnamon native), dismissal</td>
    </tr>
    <tr>
      <td><strong>File Sharing</strong></td>
      <td>File, URL, and text snippet transfer via <code class="language-plaintext highlighter-rouge">kdeconnect.share.request</code></td>
    </tr>
    <tr>
      <td><strong>Clipboard</strong></td>
      <td>Bidirectional sync via xclip watcher</td>
    </tr>
    <tr>
      <td><strong>Remote Input</strong></td>
      <td>Touchpad/mouse control (libxtst), presentation pointer</td>
    </tr>
    <tr>
      <td><strong>Media Control</strong></td>
      <td>MPRIS integration, system volume control</td>
    </tr>
    <tr>
      <td><strong>Telephony</strong></td>
      <td>SMS sending, call mute, find my phone</td>
    </tr>
    <tr>
      <td><strong>System</strong></td>
      <td>Battery telemetry, cellular connectivity reports, screensaver inhibit, device lock</td>
    </tr>
  </tbody>
</table>

<h2 id="the-nasty-bits-roadblocks-and-fixes">The Nasty Bits: Roadblocks and Fixes</h2>

<h3 id="dual-bus-d-bus-nightmare">Dual-Bus D-Bus Nightmare</h3>

<p>The most insidious bug we encountered was the <strong>dual-bus problem</strong>. Here’s what happened:</p>

<ul>
  <li>The xconnect daemon registers on dbus-broker (<code class="language-plaintext highlighter-rouge">/run/user/1000/bus</code>) — the modern, high-performance D-Bus implementation used by systemd.</li>
  <li>Terminals and the GUI were connecting to the legacy dbus-daemon.</li>
  <li>Result: <code class="language-plaintext highlighter-rouge">xconnectctl list-devices</code> would show nothing, while the GUI worked fine.</li>
</ul>

<p>The fix required probing the systemd user bus first, then falling back to the session bus:</p>

<div class="language-vala highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// In xconnectctl — try systemd user bus first</span>
<span class="kt">string</span> <span class="n">bus_address</span> <span class="p">=</span> <span class="n">Environment</span><span class="p">.</span><span class="nf">get_variable</span><span class="p">(</span><span class="s">"DBUS_SESSION_BUS_ADDRESS"</span><span class="p">);</span>
<span class="k">if</span> <span class="p">(</span><span class="n">bus_address</span> <span class="p">==</span> <span class="k">null</span> <span class="p">||</span> <span class="p">!</span><span class="n">bus_address</span><span class="p">.</span><span class="nf">contains</span><span class="p">(</span><span class="s">"/run/user/"</span><span class="p">))</span> <span class="p">{</span>
    <span class="n">bus_address</span> <span class="p">=</span> <span class="s">"unix:path=/run/user/"</span> <span class="p">+</span> <span class="n">UserId</span><span class="p">.</span><span class="nf">to_string</span><span class="p">()</span> <span class="p">+</span> <span class="s">"/bus"</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>We also removed the D-Bus activation file (<code class="language-plaintext highlighter-rouge">extra/org.xconnect.service</code>) from installation — it was causing the legacy dbus-daemon to auto-spawn a second daemon instance with no TCP listener. Classic.</p>

<h3 id="packet-queuing-during-tls-handshake">Packet Queuing During TLS Handshake</h3>

<p>Devices would occasionally fail to receive packets during the initial connection phase. Root cause: the daemon was trying to send packets before the TLS handshake completed.</p>

<p>The solution was a <strong>packet queue</strong> in <code class="language-plaintext highlighter-rouge">Device.send()</code>:</p>

<div class="language-vala highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">public</span> <span class="k">void</span> <span class="nf">send</span><span class="p">(</span><span class="n">Json</span><span class="p">.</span><span class="n">Object</span> <span class="n">pkt</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">if</span> <span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="n">_channel</span> <span class="p">==</span> <span class="k">null</span> <span class="p">||</span> <span class="p">!</span><span class="k">this</span><span class="p">.</span><span class="n">_is_active</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">this</span><span class="p">.</span><span class="n">_pending_packets</span><span class="p">.</span><span class="nf">add</span><span class="p">(</span><span class="n">pkt</span><span class="p">);</span>  <span class="c1">// Queue silently</span>
        <span class="k">return</span><span class="p">;</span>
    <span class="p">}</span>
    <span class="c1">// ... send immediately</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Packets queue silently when the channel isn’t ready, then flush automatically after <code class="language-plaintext highlighter-rouge">secure_incoming_channel()</code> completes. No more lost packets.</p>

<h3 id="messenger-reaction-emoji-fallback">Messenger Reaction Emoji Fallback</h3>

<p>Here’s a fun one. Android’s background activity launch restrictions prevent <code class="language-plaintext highlighter-rouge">PendingIntent.getActivity()</code> from working when the phone screen is off. This means Messenger’s “Like” reaction button fails silently on the phone.</p>

<p>Our workaround: a <strong>Smart Emoji Sniffer</strong> that intercepts blocked action buttons and routes reaction emojis (❤️, 🔥, 👍, 💞) via <code class="language-plaintext highlighter-rouge">RemoteInput</code> reply instead:</p>

<div class="language-vala highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// notification.vala — intercept blocked actions</span>
<span class="k">if</span> <span class="p">(</span><span class="n">pkg</span> <span class="p">==</span> <span class="s">"com.facebook.orca"</span> <span class="p">&amp;&amp;</span> <span class="n">key</span> <span class="p">==</span> <span class="s">"Like"</span><span class="p">)</span> <span class="p">{</span>
    <span class="c1">// Route via RemoteInput instead of PendingIntent</span>
    <span class="nf">send_emoji_fallback</span><span class="p">(</span><span class="n">device</span><span class="p">,</span> <span class="n">id</span><span class="p">,</span> <span class="n">emoji</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>

<p>It’s a hack, but it works. And it’s configurable per-package.</p>

<h3 id="cinnamon-inline-reply-integration">Cinnamon Inline Reply Integration</h3>

<p>Cinnamon’s notification applet supports inline reply via <code class="language-plaintext highlighter-rouge">org.freedesktop.Notifications.NotificationReplied</code> D-Bus signal. We integrated this natively:</p>

<ol>
  <li>Daemon emits <code class="language-plaintext highlighter-rouge">notification_received</code> signal with <code class="language-plaintext highlighter-rouge">has_reply: true</code> and <code class="language-plaintext highlighter-rouge">reply_label</code> metadata.</li>
  <li>GUI shows an inline reply entry at the bottom of the device detail page.</li>
  <li>User types reply → <code class="language-plaintext highlighter-rouge">SendReply()</code> D-Bus call → daemon sends <code class="language-plaintext highlighter-rouge">kdeconnect.notification.reply</code> packet with <code class="language-plaintext highlighter-rouge">requestReplyId</code>.</li>
</ol>

<p>No zenity popups. No separate dialogs. Just native desktop integration.</p>

<h2 id="the-cli-power-in-simplicity">The CLI: Power in Simplicity</h2>

<p>Here’s where xconnect really shines for automation. Every D-Bus method is exposed as a CLI command with <strong>smart device targeting</strong>:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Target by short ID</span>
xconnectctl share-file 80eeceab /path/to/photo.jpg

<span class="c"># Target by name (partial match)</span>
xconnectctl send-sms Galaxy <span class="s2">"+1234567890"</span> <span class="s2">"Meeting at 5 PM"</span>

<span class="c"># Target by index</span>
xconnectctl notifications 0

<span class="c"># Target by full D-Bus path</span>
xconnectctl ping /org/xconnect/device/80eeceab <span class="s2">"Hello from terminal"</span>
</code></pre></div></div>

<p>This means you can script workflows:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c">#!/bin/bash</span>
<span class="c"># Daily morning routine</span>
xconnectctl show-battery Galaxy
xconnectctl show-connectivity Galaxy
xconnectctl share-url Galaxy <span class="s2">"https://calendar.example.com/today"</span>
</code></pre></div></div>

<p>Or integrate with other tools:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Share clipboard content with phone</span>
xconnectctl share-text 0 <span class="s2">"</span><span class="si">$(</span>xclip <span class="nt">-selection</span> clipboard <span class="nt">-o</span><span class="si">)</span><span class="s2">"</span>

<span class="c"># Forward notification to Telegram bot</span>
xconnectctl notifications 0 | <span class="nb">grep</span> <span class="nt">-i</span> <span class="s2">"urgent"</span> | curl <span class="nt">-s</span> <span class="nt">-X</span> POST <span class="s2">"https://api.telegram.org/bot</span><span class="nv">$TOKEN</span><span class="s2">/sendMessage"</span> <span class="nt">-d</span> <span class="nv">chat_id</span><span class="o">=</span><span class="nv">$CHAT_ID</span> <span class="nt">-d</span> <span class="nv">text</span><span class="o">=</span><span class="s2">"</span><span class="si">$(</span><span class="nb">cat</span><span class="si">)</span><span class="s2">"</span>
</code></pre></div></div>

<p>The CLI isn’t an afterthought — it’s a first-class citizen designed for power users and automation engineers.</p>

<h2 id="whats-next">What’s Next</h2>

<p>The roadmap (see <a href="https://github.com/Twilight0/xconnect/blob/master/FEATURES.md">FEATURES.md</a>) includes:</p>

<ul>
  <li><strong>Priority 1</strong>: SFTP remote filesystem access — mount phone storage via <code class="language-plaintext highlighter-rouge">sshfs</code>/<code class="language-plaintext highlighter-rouge">gio mount</code></li>
  <li><strong>Priority 2</strong>: SMS conversation threads, MMS support, configurable app reaction fallback engine</li>
  <li><strong>Priority 3</strong>: Contacts sync, digitizer/stylus support, share input devices</li>
</ul>

<h2 id="try-it-out">Try It Out</h2>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Arch Linux</span>
git clone https://github.com/Twilight0/xconnect
<span class="nb">cd </span>xconnect
makepkg <span class="nt">-si</span>

<span class="c"># Enable and start</span>
systemctl <span class="nt">--user</span> <span class="nb">enable</span> <span class="nt">--now</span> xconnect

<span class="c"># List devices</span>
xconnectctl list-devices
</code></pre></div></div>

<p>No KDE dependencies. Just Vala, GTK3, and a clean D-Bus interface.</p>

<hr />

<p><em>xconnect is a fork of <a href="https://github.com/bboozzoo/mconnect">mconnect</a> by Maciej Borzecki. We’re grateful for the solid protocol foundation that made this project possible.</em></p>

<hr />

<p><em>Got feedback? Found a bug? Open an issue on <a href="https://github.com/Twilight0/xconnect/issues">GitHub</a> or join the discussion on the <a href="https://aliveos.org/forum">AliveOS Forum</a>.</em></p>]]></content><author><name>The AliveOS Project</name></author><summary type="html"><![CDATA[Why We Built xconnect]]></summary></entry><entry><title type="html">Call for Help: Building a Cinnamon Fork to Preserve X11/Xlibre Compatibility</title><link href="https://aliveos.org/news/call-for-cinnamon-fork/" rel="alternate" type="text/html" title="Call for Help: Building a Cinnamon Fork to Preserve X11/Xlibre Compatibility" /><published>2026-07-25T09:00:00+00:00</published><updated>2026-07-25T09:00:00+00:00</updated><id>https://aliveos.org/news/call-for-cinnamon-fork</id><content type="html" xml:base="https://aliveos.org/news/call-for-cinnamon-fork/"><![CDATA[<p>We are reaching out to the community for collaboration on an important initiative: the creation and maintenance of a <strong>Cinnamon desktop fork</strong> whose primary goal is to preserve long-term X11/Xlibre compatibility, ensure fast integration of critical fixes and new features, and provide a stable, performant desktop environment for users who rely on or prefer the X11 display server.</p>

<h2 id="background">Background</h2>

<p>Recent developments in major desktop environments have signaled a shift away from X11 toward Wayland. Notably, the KDE project has announced plans to drop X11 support in favor of Wayland-only builds in upcoming releases. While Wayland offers certain advantages, many users and organizations continue to rely on X11 for reasons including hardware compatibility, legacy software support, remote display protocols, and proven stability.</p>

<p>For users with older hardware, specialized workflows, or strict stability requirements, an abrupt transition away from X11 can be disruptive. Moreover, the XLibre project represents a promising effort to provide a modern, maintained X11 server with improved performance and security features, making it a viable foundation for the future of X11-based desktops.</p>

<h2 id="the-need-for-a-cinnamon-fork">The Need for a Cinnamon Fork</h2>

<p>Cinnamon, as a desktop environment, offers a polished, traditional user interface that balances functionality, aesthetics, and resource usage. It has been a cornerstone of the AliveOS experience due to its coherence and suitability for both general and development workloads.</p>

<p>However, as the broader GNOME ecosystem (which underlies many of Cinnamon’s dependencies) continues to prioritize Wayland, there is a growing risk that future versions of Cinnamon will increasingly depend on Wayland-specific features, libraries, or assumptions that complicate or prevent clean operation on pure X11/Xlibre setups.</p>

<p>To safeguard the ability to run a modern, well-maintained Cinnamon desktop on X11/Xlibre systems, we propose establishing a dedicated fork of Cinnamon with the following goals:</p>

<ul>
  <li><strong>Preserve X11/Xlibre Compatibility:</strong> Ensure that all core components, applets, applets, and applets remain functional and well-tested on X11/Xlibre without reliance on Wayland-only dependencies.</li>
  <li><strong>Fast Tracking of Fixes and Features:</strong> Rapidly integrate critical bug fixes, security patches, and meaningful new features from the upstream Cinnamon repository while filtering out changes that introduce hard Wayland dependencies or degrade X11 compatibility.</li>
  <li><strong>Community-Driven Maintenance:</strong> Leverage the collective expertise of developers, testers, and users who value X11 stability to review, test, and contribute to the fork.</li>
  <li><strong>Compatibility with AliveOS Goals:</strong> Align with the AliveOS philosophy of providing a lightweight, coherent, and bloat-free desktop environment that works well on a wide range of hardware, including older systems.</li>
</ul>

<h2 id="how-you-can-help">How You Can Help</h2>

<p>We invite developers, testers, packagers, and enthusiastic users to join this effort. Contributions can take many forms:</p>

<h3 id="development">Development</h3>
<ul>
  <li>Review and adapt upstream Cinnamon commits for X11/Xlibre compatibility.</li>
  <li>Implement fixes for issues discovered during testing.</li>
  <li>Assist in maintaining the fork’s build system and CI/CD pipeline.</li>
  <li>Help port or maintain Cinnamon applets, extensions, and settings that may require X11-specific adjustments.</li>
</ul>

<h3 id="testing">Testing</h3>
<ul>
  <li>Run the fork on diverse hardware configurations, including legacy systems.</li>
  <li>Test compositing, window management, file operations, desktop effects, and integration with AliveOS-specific tools (e.g., Dory file manager, Respite media player).</li>
  <li>Report regressions, conflicts, or missing functionality via the project’s issue tracker.</li>
</ul>

<h3 id="documentation-and-support">Documentation and Support</h3>
<ul>
  <li>Help maintain documentation regarding installation, configuration, and known issues.</li>
  <li>Assist in triaging user reports and guiding newcomers.</li>
  <li>Contribute to translation efforts if desired.</li>
</ul>

<h3 id="packaging-and-distribution">Packaging and Distribution</h3>
<ul>
  <li>Assist in building and testing packages for various distributions (including AliveOS, Arch, Debian, Ubuntu, etc.).</li>
  <li>Ensure that the fork integrates cleanly with AliveOS’s custom repository and package management workflow.</li>
</ul>

<h2 id="getting-started">Getting Started</h2>

<p>If you are interested in contributing, please:</p>

<ol>
  <li><strong>Fork the repository</strong> (to be announced) on GitHub.</li>
  <li>Clone your fork and review the contributing guidelines (to be provided).</li>
  <li>Join the discussion in the <strong>AliveOS Forum</strong> or open an issue on the repository to introduce yourself and share your interests.</li>
  <li>Look for issues tagged <code class="language-plaintext highlighter-rouge">help-wanted</code> or <code class="language-plaintext highlighter-rouge">good-first-issue</code> to begin contributing.</li>
</ol>

<p>We especially welcome those with experience in Cinnamon development, GTK/GNOME libraries, X11/Xlibre programming, desktop compositing, or packaging for Linux distributions.</p>

<h2 id="why-this-matters">Why This Matters</h2>

<p>A stable, modern X11-capable desktop environment is essential for:</p>
<ul>
  <li>Users with older GPUs or drivers that lack full Wayland support.</li>
  <li>Environments requiring remote display solutions (e.g., VNC, RDP, X11 forwarding) that are mature and well-understood under X11.</li>
  <li>Workflows dependent on specific X11 extensions or proprietary software that assumes an X11 server.</li>
  <li>Users who value the stability, predictability, and long-term support of a well-established display stack.</li>
</ul>

<p>By maintaining a compatible Cinnamon fork, we aim to provide a sustainable path forward for those who wish to continue using X11 without sacrificing access to a modern, polished desktop experience.</p>

<h2 id="conclusion">Conclusion</h2>

<p>The future of the Linux desktop need not be a binary choice between abandoning X11 or stagnating. With community effort, we can preserve a viable, high-performance X11-based desktop that evolves alongside the broader ecosystem. If you believe in the importance of choice, stability, and user autonomy, we invite you to join us in building this future together.</p>

<p>Thank you for your consideration and potential support.</p>

<p>After me.</p>]]></content><author><name>The AliveOS Project</name></author><summary type="html"><![CDATA[We are reaching out to the community for collaboration on an important initiative: the creation and maintenance of a Cinnamon desktop fork whose primary goal is to preserve long-term X11/Xlibre compatibility, ensure fast integration of critical fixes and new features, and provide a stable, performant desktop environment for users who rely on or prefer the X11 display server.]]></summary></entry><entry><title type="html">You Can Now Comment on Posts</title><link href="https://aliveos.org/news/comments-now-available/" rel="alternate" type="text/html" title="You Can Now Comment on Posts" /><published>2026-07-25T08:00:00+00:00</published><updated>2026-07-25T08:00:00+00:00</updated><id>https://aliveos.org/news/comments-now-available</id><content type="html" xml:base="https://aliveos.org/news/comments-now-available/"><![CDATA[<p>Small but nice update: you can now leave comments on blog posts.</p>

<p>Scroll to the bottom of any post and you will find a comment section powered by
<strong>Giscus</strong>. It uses GitHub Discussions as the backing store, which means a
couple of things:</p>

<ul>
  <li><strong>To comment, you need a GitHub account.</strong> If you have one, great — sign
in and post away. If you do not, signing up is free and takes about a minute.</li>
  <li><strong>No tracking, no ads, no third-party databases.</strong> Your comment lives in the
website’s Discussions section, fully visible and under your control.</li>
  <li><strong>You get notified of replies</strong> through GitHub, the same as any discussion
thread.</li>
</ul>

<p>The system maps each post to a discussion thread automatically, so comments stay
organised per article. First-time commenters on a given post will trigger the
creation of a fresh thread — after that, it is just a conversation.</p>

<p>If you have spotted a typo, want to disagree with something I wrote, or just
feel like saying hello — go ahead. The comment box is waiting at the
bottom of this very page.</p>

<blockquote>
  <p>Forum is also available at <a href="/forum">/forum</a> — it redirects to the
project’s Discussions hub, where you can start broader topics.</p>
</blockquote>]]></content><author><name>The AliveOS Project</name></author><summary type="html"><![CDATA[Small but nice update: you can now leave comments on blog posts.]]></summary></entry><entry><title type="html">Summer, Bugs, and a Slight Change of Direction</title><link href="https://aliveos.org/news/summer-focus-shift/" rel="alternate" type="text/html" title="Summer, Bugs, and a Slight Change of Direction" /><published>2026-07-24T08:00:00+00:00</published><updated>2026-07-24T08:00:00+00:00</updated><id>https://aliveos.org/news/summer-focus-shift</id><content type="html" xml:base="https://aliveos.org/news/summer-focus-shift/"><![CDATA[<p>It has been a while since the last update. Not because the project is dead.
Far from it. But because life happened, as it tends to do, especially in
summer. Let me explain.</p>

<h2 id="what-i-was-actually-doing">What I was actually doing</h2>

<p>Bug fixing and planning. The unglamorous stuff that does not make for a
thrilling blog post but is absolutely necessary if you want a distribution that
does not fall apart on first boot.</p>

<p>I have been working on AliveOS’s main applications — <strong>xconnect</strong>, <strong>Dory</strong>,
and the rest of the gang. Polishing. Refactoring. Asking myself hard questions
about whether each piece actually earns its place. The usual.</p>

<p>This is the part of open source that nobody talks about in their README: the
long, boring slog between releases where you stare at a log file for an hour,
change three lines of code, and call it progress. Glamour.</p>

<h2 id="the-summer-problem">The summer problem</h2>

<p>Here is the thing about balancing a project like this with real life: it is
hard. Summer makes it harder. There is family, there is work, there is the
endless tug-of-war between “I should fix that bug” and “I should go outside
before I turn into a pale hermit with excellent git hygiene.”</p>

<p>I am trying to catch up with the existing work-life-family balance, and it is,
shall we say, a work in progress. The project moves forward, but not at the
breakneck pace one might hope for. Steady is the word. Like a glacier, if
glaciers wrote code and occasionally forgot to eat lunch.</p>

<h2 id="the-focus-shift">The focus shift</h2>

<p>Now, the part that actually matters.</p>

<p>When I first started AliveOS, I talked a lot about a <strong>developer-optimized</strong>
environment. That was the framing, and it was honest as far as it went. But the
more I worked on it, the more I realized the label was too narrow, and frankly,
a bit misleading.</p>

<p>The real goal of AliveOS was never about catering exclusively to developers.
The real goal is something broader and, I think, more interesting: <strong>a
fast-paced workflow that targets general (and development) desktop usage,
fusing keyboard and mouse driven paradigms.</strong> Essentially, what Cinnamon
can already do — but refined, tuned, and integrated so it stops being a
collection of features and starts being a <em>flow</em>.</p>

<p>A desktop where you never have to lift your hands from the keyboard unless you
want to. But also a desktop where the mouse is not an afterthought, and where
every action has a path — keyboard, mouse, or a combination of both, and
you pick whichever is faster for the task at hand.</p>

<p>This is not about being a “developer distribution.” This is about being a
<strong>fast desktop</strong> for anyone who cares about speed, regardless of whether they
write code, edit video, or just manage five hundred open browser tabs like a
civilized lunatic.</p>

<h2 id="design-dna-borrowing-from-cosmic-and-unity">Design DNA: borrowing from COSMIC and Unity</h2>

<p>You might look at the direction and wonder where the visual and interaction
ideas come from. I will be honest about that, too.</p>

<p>The design of AliveOS intentionally fuses concepts from two sources that, on
paper, should not have much to do with each other: <strong>System76’s COSMIC</strong> and
<strong>Ubuntu’s Unity</strong>.</p>

<p>From COSMIC, I take primarily the look — its clean, focused, no-nonsense
visual language. The attention to consistent spacing and typography, the
feeling that somebody actually thought about where every pixel goes —
that is the kind of polish I want, without importing the whole COSMIC shell.</p>

<p>From Unity, I take the layout and window manager tricks — the
keyboard-and-mouse fusion that was ahead of its time and still, in my opinion,
unmatched for workflow density. The global menu, the way Unity let you drive
the entire desktop from the keyboard without forcing you into a tiling window
manager straight out of a 1990s hacker movie. Unity understood something that
many modern desktops forgot: you do not need to choose between keyboard and
mouse. You use both, fluidly, and the desktop should keep up.</p>

<p>AliveOS is not a clone of either. It is an attempt to take the best lessons from
both — COSMIC’s visual language and Unity’s layout philosophy —
and fuse them into something that runs on Cinnamon’s solid, resource-conscious
foundation. Borrowing good ideas is not cheating. It is standing on the
shoulders of giants who got it mostly right.</p>

<h2 id="why-developer-focused-was-the-initial-frame">Why “developer-focused” was the initial frame</h2>

<p>Good question. The answer is boring and honest: because that is the lens I was
looking through at the time.</p>

<p>I am a developer. I was building what I knew I needed. The developer focus was
a natural starting point — it reflected the person building it, not the
audience it was meant for. The mistake was assuming that “what I need” and
“what the distro should be about” were the same thing. They are not quite the
same.</p>

<p>The truth is that a fast, keyboard-driven workflow with sensible defaults and
no bloat is useful for <em>everyone</em>, not just people who run <code class="language-plaintext highlighter-rouge">gcc</code> for a living.
The developer angle was a useful initial sketch. But the real painting is
broader. It is a general-purpose desktop that happens to be excellent for
development — rather than a development desktop that happens to function
for other things. The order matters.</p>

<h2 id="where-we-are-heading">Where we are heading</h2>

<p>So, the direction is not changing drastically. It is clarifying. Fewer “for
developers” labels, more “this is fast and you will feel it” reality. The same
core philosophy (zero bloat, sensible defaults, Cinnamon’s sweet spot) just
with a more honest description of what we are actually trying to achieve.</p>

<p>More news as things land. After me.</p>]]></content><author><name>The AliveOS Project</name></author><summary type="html"><![CDATA[It has been a while since the last update. Not because the project is dead. Far from it. But because life happened, as it tends to do, especially in summer. Let me explain.]]></summary></entry><entry><title type="html">Progress Update: Gathering the Pieces</title><link href="https://aliveos.org/news/progress-gathering-the-pieces/" rel="alternate" type="text/html" title="Progress Update: Gathering the Pieces" /><published>2026-07-08T10:00:00+00:00</published><updated>2026-07-08T10:00:00+00:00</updated><id>https://aliveos.org/news/progress-gathering-the-pieces</id><content type="html" xml:base="https://aliveos.org/news/progress-gathering-the-pieces/"><![CDATA[<p>There is a particular stage in any project where you are not quite building the
thing yet, but you are definitely <em>doing things</em>. The pieces are scattered
across the table, some of them work, some of them are held together with duct
tape and optimism, and you are fairly certain that last commit was a mistake but
it is 2 a.m. and you are not undoing it now. That is where AliveOS is at the
moment, and honestly, it is a rather good place to be.</p>

<p>Here is what has been happening.</p>

<hr />

<h2 id="dory-file-manager-still-getting-sharper">Dory File Manager: Still Getting Sharper</h2>

<p class="float-right"><img src="/assets/icons/dory.svg" alt="Dory" /></p>

<p>Dory, the file manager, continues to mature. It was one of the first pieces
built specifically for this project, and it remains the one I reach for most
often. The core is solid, the companion extensions are filling in nicely, and
the occasional bug fix lands when something behaves in a way that is
<em>technically correct</em> but <em>practically annoying</em>.</p>

<p>The philosophy behind Dory has not changed: do the file management things well,
skip the things nobody actually uses, and do not ship a 400-megabyte dependency
tree to open a folder. If it sounds simple, that is because it is. Getting it
right, however, is a different conversation entirely.</p>

<hr />

<h2 id="valuate-because-numbers-need-a-home-too">Valuate: Because Numbers Need a Home Too</h2>

<p class="float-right"><img src="/assets/icons/valuate.svg" alt="Valuate" /></p>

<p>Meet <strong>Valuate</strong> — the new calculator app for AliveOS. It started as a
“wouldn’t it be nice” and ended up as a “why does this not exist yet.”</p>

<p>Most Linux calculator apps fall into one of two categories: the one that comes
with your desktop environment and does barely enough, or the one that tries to
be a full-blown computer algebra system and weighs about as much. Valuate sits
squarely in the middle: a clean, fast, GTK3-native calculator that does the
math you actually need without making you feel like you need a PhD to use it.</p>

<p>It is early days, but it works, and it does not pull in half of GNOME to do it.
More on this one soon.</p>

<hr />

<h2 id="a-custom-cinnamon-session">A Custom Cinnamon Session</h2>

<p class="float-right"><img src="/assets/icons/cinnamon.svg" alt="Cinnamon" /></p>

<p>The desktop is getting its own session. Not a full fork of Cinnamon —
let us not be dramatic — but a custom session that wraps the pieces
AliveOS cares about into a coherent, predictable experience.</p>

<p>This means a tailored default configuration, sensible keybindings that do not
require a cheat sheet, and a panel layout that stays out of your way while
remaining exactly where you expect it. Think of it as Cinnamon with the rough
edges sanded off and the bits you never use quietly removed. The kind of desktop
that disappears while you work, which is the highest compliment a desktop can
receive.</p>

<hr />

<h2 id="the-website">The Website</h2>

<p class="float-right"><img src="/assets/icons/developer.svg" alt="Developer" /></p>

<p>You are reading this, so clearly the website works. <code class="language-plaintext highlighter-rouge">aliveos.org</code> is live,
served over HTTPS, with a landing page that lays out the manifesto and a news
section where these updates go. It is built with Jekyll, deployed via GitHub
Pages, and costs exactly nothing to run. Which is how a website should be.</p>

<p>The RSS feed is there for the three people who still use RSS feeds (you have
excellent taste, by the way). The contact address for sponsorship and business
inquiries is in the footer. The whole thing is clean, fast, and does not phone
home to seventeen analytics trackers. Because it is a website, not a
surveillance apparatus.</p>

<hr />

<h2 id="bug-fixes-and-testing-the-glamorous-part">Bug Fixes and Testing: The Glamorous Part</h2>

<p>Let us be honest about something: most of the work that happens at this stage
is not the kind that makes for exciting blog posts. It is the kind where you
spend three hours tracking down why a particular font renders strangely on
one specific monitor, or why the file picker opens two pixels to the left of
where it should, or why a certain package conflicts with another package in a
way that only manifests on Tuesdays.</p>

<p>This is the unglamorous grind that separates a distribution that <em>works</em> from a
distribution that <em>feels right</em>. AliveOS is firmly in the “feels right” camp,
and that means a lot of small, invisible fixes that nobody will ever notice
because they will just work. Which is the point.</p>

<hr />

<h2 id="xconnect-your-phone-actually-connected">XConnect: Your Phone, Actually Connected</h2>

<p class="float-right"><img src="/assets/icons/xconnect.svg" alt="XConnect" /></p>

<p>This is the big one. <strong>XConnect</strong> is AliveOS’s answer to Android desktop
connectivity — a full-featured suite that covers almost everything
<a href="https://kdeconnect.kde.org/">KDE Connect</a> does, but built on <strong>XApp/GTK3</strong>
to fit naturally into the AliveOS desktop.</p>

<p>What does it do? The usual useful things:</p>

<ul>
  <li><strong>Notification syncing</strong> — your phone’s notifications, on your desktop,
where you can actually read them without picking up the device.</li>
  <li><strong>File transfer</strong> — drag, drop, done. No cloud services, no email
yourself the file like it is 2009.</li>
  <li><strong>Clipboard sharing</strong> — copy on the phone, paste on the desktop. Or the
other way around. The future is bidirectional.</li>
  <li><strong>Media control</strong> — pause, play, skip from your desktop while your
phone streams music. Because reaching for your phone to skip a track is a
civilisation-level inconvenience.</li>
  <li><strong>SMS messaging</strong> — read and reply to texts from the desktop. Yes, it
still works, and no, it does not require sending your messages through a
third-party server.</li>
  <li><strong>Remote input</strong> — use your phone as a touchpad or keyboard. Handy
for presentations, couch computing, or when the cat is sitting on your
keyboard and you cannot be bothered to move her.</li>
</ul>

<p>The key difference from KDE Connect is the toolkit dependency. XConnect depends
on <strong>XApp and GTK3</strong>, which means it integrates cleanly with the Cinnamon
desktop and the broader XApp ecosystem without dragging in Qt libraries or
additional framework dependencies. It is native, it is light, and it belongs
here.</p>

<p>This one is still under active development, but it is far enough along to talk
about. Expect a dedicated post when the feature set stabilises.</p>

<hr />

<h2 id="the-custom-repository">The Custom Repository</h2>

<p class="float-right"><img src="/assets/icons/repos.svg" alt="Repos" /></p>

<p>None of this matters if you cannot actually install it. The <strong>aliveos-repo</strong>
custom pacman repository is the plumbing that ties everything together. It
compiles and hosts stable builds of AUR and local packages, and it does so
automatically — a GitHub Actions pipeline pulls, normalises, compiles,
assembles, and deploys on a weekly schedule.</p>

<p>The repository already covers Dory and its extensions, the Cinnamon
repackaging, the XLibre display server stack, AliveOS core packages, themes,
and a growing collection of utilities. If you are running Arch, you can point
pacman at it right now. If you are running AliveOS, it is already there.</p>

<hr />

<h2 id="where-things-stand">Where Things Stand</h2>

<p>The pieces are gathering. Some are polished, some are rough, some are still
being hammered into shape on a Friday evening with questionable coffee. The
target for <code class="language-plaintext highlighter-rouge">v0.1</code> remains <strong>Q3 2026</strong>, and the path to get there is clearer
every week.</p>

<p>The important thing is that every piece here exists for a reason. Not because
it was popular, not because someone else shipped it, but because it solves a
specific problem in a way that fits the rest of the system. That is what a
curated distribution looks like. Not a bigger pile of packages — a
<em>coherent</em> one.</p>

<p>More updates as pieces land.</p>]]></content><author><name>The AliveOS Project</name></author><summary type="html"><![CDATA[There is a particular stage in any project where you are not quite building the thing yet, but you are definitely doing things. The pieces are scattered across the table, some of them work, some of them are held together with duct tape and optimism, and you are fairly certain that last commit was a mistake but it is 2 a.m. and you are not undoing it now. That is where AliveOS is at the moment, and honestly, it is a rather good place to be.]]></summary></entry><entry><title type="html">How It All Started: One File Picker, a Rejected PR, and a Detour Through KDE</title><link href="https://aliveos.org/news/how-it-all-started/" rel="alternate" type="text/html" title="How It All Started: One File Picker, a Rejected PR, and a Detour Through KDE" /><published>2026-07-06T19:00:00+00:00</published><updated>2026-07-06T19:00:00+00:00</updated><id>https://aliveos.org/news/how-it-all-started</id><content type="html" xml:base="https://aliveos.org/news/how-it-all-started/"><![CDATA[<p>Every distribution has an origin story. Most are boring. “We wanted a simpler
Linux” they say, and then ship forty gigabytes of snaps. AliveOS’s story is
not that. AliveOS begins not with a grand vision, but with a single annoying dialog box.
Follow me.</p>

<h2 id="the-something-that-was-missing">The something that was missing</h2>

<p>So, there I was, on Cinnamon, doing my thing. Happy-ish. And then I needed to
pick a file. The dialog that popped up was, to put it kindly, <em>not on par</em> with
Dolphin’s. Dolphin gives you a rich picker: zoom in, zoom out, switch view
modes, a whole bag of options at your fingertips. The XApp desktop portal that
Cinnamon relied on for this duty was, by comparison, spartan. Functional, sure.
Pleasant to use, absolutely not. A relic. A thing that felt like it time-traveled
here from 2008 and was mildly proud of it.</p>

<p>And when you spend your day opening and saving files, that gap is not cosmetic.
It is a real, daily, morale-eroding annoyance. The kind you ignore for a year
and then one day you snap.</p>

<h2 id="a-pr-with-help-from-an-unlikely-collaborator">A PR, with help from an unlikely collaborator</h2>

<p>I wanted the functionality badly enough to do something about it. Stubbornness
is an underrated engineering virtue. So, with the help of AI — yes, the
very thing everyone is either worshipping or panicking about this year —
I put together a pull request against Nemo’s upstream source repository. The
changes were real: zoomable, configurable, closer to the picker I
actually wanted to use. Written. Shipped. Not just a rant on an issue tracker.</p>

<p>And then it got rejected.</p>

<h2 id="we-cant-push-this-to-other-distributions">“We can’t push this to other distributions”</h2>

<p>The reasons given were, shall we say, vague. The gist: they couldn’t push Nemo
changes onto other distributions that currently depend on XApp. Which is the sort
of rejection that sounds reasonable until you think about it for roughly thirty
seconds — because for file <em>picking</em>, you can comfortably use the XApp
desktop portal independently from the file manager itself. The two are not
coupled the way the objection implied. Not even close.</p>

<p>That rejection sat with me. I had the change. I had the use case. I had nowhere
to put it upstream. Ipso facto, I was grumpy.</p>

<h2 id="the-detour-through-kde">The detour through KDE</h2>

<p>So I did what any stubborn person does: I went somewhere I <em>could</em> have it. I
migrated to KDE and worked on it for a month, moving away from Cinnamon — a
desktop I had been using for the better part of a decade. Now, KDE is genuinely
good. I like KDE. I will get to that. But then came the small matter of KDE
dropping X11 for Wayland.</p>

<p>And there was the catch. I have a really old laptop. I am not changing to Wayland
anytime soon. “Modern” does not impress me when it stops working on my hardware.
And for me, <strong>XLibre</strong> looks like the more promising path forward on this
venerable old box.</p>

<p>So I came back. And this time, rather than asking permission from anyone, I
decided to put together a few pieces I find useful and straightforward. A
desktop that finally has the picker I want, on a base I trust.</p>

<h2 id="why-not-just-bolt-on-a-few-apps">Why not just bolt on a few apps?</h2>

<p>Ah, the obvious question. It would be easy, in theory, to just layer a few
programs from other projects on top. Grab <code class="language-plaintext highlighter-rouge">gnome-calculator</code> here, something
else there. Job done, innit.</p>

<p>No. The problem is twofold. One, these bring external dependencies that add
bloat. Two, they look inconsistent with the rest of the system — like you
parked a Fiat in the middle of a BMW lot and pretended nobody would notice. Two
small things that, together, defeat the point of running a coherent desktop in
the first place.</p>

<h2 id="the-sweet-spot">The sweet spot</h2>

<p>Now, here is a thing I have learned over many years. I value the balance between
three things: aesthetics, functionality, and resource usage. Most desktops pick
one and sacrifice the other two. For me, <strong>Cinnamon sits exactly on top of that
sweet spot.</strong> That is why I have been using it for almost ten years. Which, in
Linux desktop years, is roughly three geological epochs.</p>

<p>Before that, I was a GNOME user. I have also used KDE. And the honest truth is: I
like all of them. Every desktop environment and window manager has its pros and
cons, and I genuinely appreciate each one for different reasons. Heresy, I know.
A grumpy dinosaur is supposed to pick a side and hate the rest. Sorry to
disappoint.</p>

<p>AliveOS is not a rejection of anything. It is a curation — the specific
pieces, tuned to work together, on a base I trust, built around a picker that
finally does what I want it to. After me.</p>]]></content><author><name>The AliveOS Project</name></author><summary type="html"><![CDATA[Every distribution has an origin story. Most are boring. “We wanted a simpler Linux” they say, and then ship forty gigabytes of snaps. AliveOS’s story is not that. AliveOS begins not with a grand vision, but with a single annoying dialog box. Follow me.]]></summary></entry><entry><title type="html">Why a Developer-Focused Distro, When Power Users Can Tweak Their Own?</title><link href="https://aliveos.org/news/why-developer-focused-distro/" rel="alternate" type="text/html" title="Why a Developer-Focused Distro, When Power Users Can Tweak Their Own?" /><published>2026-07-06T18:00:00+00:00</published><updated>2026-07-06T18:00:00+00:00</updated><id>https://aliveos.org/news/why-developer-focused-distro</id><content type="html" xml:base="https://aliveos.org/news/why-developer-focused-distro/"><![CDATA[<p>A fair question we hear often: <em>if a power user already knows how to customize
an Arch install, why build a developer-focused distro at all?</em> It is a good
challenge. Let us have a go at it.</p>

<h2 id="because-you-can-is-not-the-same-as-you-should-have-to">Because “you can” is not the same as “you should have to”</h2>

<p>Sure, an experienced user <em>can</em> set everything up themselves. They can also
build their own desk, but most people just want somewhere to put a laptop and
get to work. The point is not whether the setup is survivable — it is
whether it should eat your evening before you write a single line of code.</p>

<p>AliveOS lands you in a coherent, working environment from the first boot. Built
on Arch’s rolling base, you get the bleeding edge the way nature intended:
delivered fast, without the wiki-archaeology and the “why is my audio sideways
now” tax.</p>

<h2 id="tools-that-actually-know-each-other">Tools that actually know each other</h2>

<p>Customization is not the same as integration. Any desktop can be themed; far
fewer ship tools that were designed to work <em>together</em> out of the box.</p>

<p>Take Dory’s file picker dialog. It sounds small. It is not. When an application
asks you to pick a file, the dialog it shows is part of the desktop — and
when that dialog is fast, native, and does not feel like it time-traveled here
from 2008, finding files stops being a friction point. Multiply that kind of
decision across the desktop, the media player, the developer toolchain, the
defaults — and you stop fighting the setup and start working inside it.</p>

<p>The small daily annoyances compound. We are trying to remove them.</p>

<h2 id="made-by-a-developer-who-got-tired-of-waiting">Made by a developer who got tired of waiting</h2>

<p>AliveOS is not assembled from generic upstream packages and shipped. It is built
by a developer who works with current tools, watches where the ecosystem is
heading, and got tired of “good enough” defaults that were never good enough.
The goal: something that stands out — not by piling on more, but by
sweating the details the rest leave to the user.</p>

<p>There is a legacy forming around the project that is worth naming plainly:
<strong>consistency, and actual care for the user experience.</strong> Defaults that agree
with each other. A coherent desktop, not a loose collection of components that
met once at a packaging step. An environment that feels like one thing, not
twelve — because somebody stayed up late making it so.</p>

<h2 id="so-who-is-it-for">So, who is it for?</h2>

<p>For the developer who <em>could</em> hand-tune everything, and would rather spend that
energy on something that is not their operating system. For anyone who wants
the currency of Arch without the configuration hangover. And for the sort of
user who has noticed that most distributions optimize for breadth of options,
when what you actually wanted was a polished, opinionated default that is ready
the moment you sit down.</p>]]></content><author><name>The AliveOS Project</name></author><summary type="html"><![CDATA[A fair question we hear often: if a power user already knows how to customize an Arch install, why build a developer-focused distro at all? It is a good challenge. Let us have a go at it.]]></summary></entry><entry><title type="html">Why Vivaldi Is the Default Browser in AliveOS</title><link href="https://aliveos.org/news/why-vivaldi-default-browser/" rel="alternate" type="text/html" title="Why Vivaldi Is the Default Browser in AliveOS" /><published>2026-07-06T05:00:00+00:00</published><updated>2026-07-06T05:00:00+00:00</updated><id>https://aliveos.org/news/why-vivaldi-default-browser</id><content type="html" xml:base="https://aliveos.org/news/why-vivaldi-default-browser/"><![CDATA[<p>Choosing a default browser for AliveOS was not a decision we took lightly. Developers spend a significant portion of their day in the browser, and our goal was to ship something that respects both your productivity and your privacy. After careful evaluation, <strong>Vivaldi</strong> emerged as the clear choice.</p>

<p>Here is why.</p>

<hr />

<h2 id="built-in-ad-and-tracker-blocking">Built-in Ad and Tracker Blocking</h2>

<p>Vivaldi ships with a native ad blocker and tracker blocker enabled out of the box. No extensions needed, no configuration required. This means pages load faster, less bandwidth is consumed, and your browsing habits are not sold to the highest bidder. For a developer-focused distribution that values system efficiency, this aligns perfectly with our zero-bloat philosophy.</p>

<h2 id="chrome-extension-compatible">Chrome Extension Compatible</h2>

<p>Vivaldi is built on Chromium and supports the full Chrome Web Store extension ecosystem. Every extension you rely on for development, security, or productivity works as expected. There is no walled garden and no compatibility gap to work around.</p>

<h2 id="built-in-mail-client">Built-in Mail Client</h2>

<p>Vivaldi includes a full-featured mail client that supports multiple accounts, IMAP and POP3, search across folders, and a unified inbox. For developers who manage several email identities, this eliminates the need for a separate email application and keeps everything in one place.</p>

<h2 id="built-in-calendar-and-feed-reader">Built-in Calendar and Feed Reader</h2>

<p>Alongside mail, Vivaldi provides a private calendar for managing events and an algorithm-free feed reader for building a custom news feed based on your actual interests, not your behavioral profile.</p>

<h2 id="privacy-by-design-not-by-feature">Privacy by Design, Not by Feature</h2>

<p>Vivaldi does not track you. There is no telemetry, no profiling, no data mining. Sync data is encrypted end-to-end, meaning even Vivaldi cannot read your bookmarks, passwords, or open tabs. The company is independent, European, and answerable only to its users, not to advertisers or investors.</p>

<h2 id="unmatched-customization">Unmatched Customization</h2>

<p>Vivaldi is the most customizable browser on the market. Developers can tailor every aspect of the interface to match their workflow:</p>

<ul>
  <li><strong>Workspaces</strong> to separate projects, research, and personal browsing</li>
  <li><strong>Tab Stacking</strong> and <strong>Tab Tiling</strong> for side-by-side page views</li>
  <li><strong>Web Panels</strong> to keep chat apps, documentation, or dev tools in the sidebar</li>
  <li><strong>Quick Commands</strong> for keyboard-driven navigation</li>
  <li><strong>Custom keyboard shortcuts</strong> and <strong>mouse gestures</strong> for efficiency</li>
</ul>

<h2 id="built-in-productivity-tools">Built-in Productivity Tools</h2>

<p>Vivaldi ships with tools that replace entire categories of extensions:</p>

<ul>
  <li><strong>Notes</strong> for jotting down ideas while browsing, synced across devices</li>
  <li><strong>Capture</strong> for full-page screenshots without third-party tools</li>
  <li><strong>Pop-out Video</strong> to watch tutorials or streams in a floating window while you code</li>
  <li><strong>Translate</strong> for one-click page translation, processed locally for privacy</li>
</ul>

<h2 id="cross-platform-sync">Cross-Platform Sync</h2>

<p>Vivaldi Sync works across desktop and mobile with end-to-end encryption. Your browsing data moves with you securely, whether you are on your AliveOS workstation, a laptop, or a phone.</p>

<hr />

<p>At the end of the day, Vivaldi respects the same principles AliveOS was built on: give the user control, avoid bloat, prioritize privacy, and never compromise on the tools that matter. It is not the default because it is popular. It is the default because it is the right tool for the job.</p>]]></content><author><name>The AliveOS Project</name></author><summary type="html"><![CDATA[Choosing a default browser for AliveOS was not a decision we took lightly. Developers spend a significant portion of their day in the browser, and our goal was to ship something that respects both your productivity and your privacy. After careful evaluation, Vivaldi emerged as the clear choice.]]></summary></entry><entry><title type="html">AI in AliveOS: Local, Private, and Opt-In</title><link href="https://aliveos.org/news/ai-local-private-opt-in/" rel="alternate" type="text/html" title="AI in AliveOS: Local, Private, and Opt-In" /><published>2026-07-05T05:00:00+00:00</published><updated>2026-07-05T05:00:00+00:00</updated><id>https://aliveos.org/news/ai-local-private-opt-in</id><content type="html" xml:base="https://aliveos.org/news/ai-local-private-opt-in/"><![CDATA[<p>We have been quiet on one question that comes up a lot: where does AliveOS stand
on AI? The short version is simple.</p>

<p><strong>AI is coming to AliveOS — but strictly on your terms.</strong></p>

<h2 id="opt-in-never-default">Opt-in, never default</h2>

<p>AI features will be entirely opt-in. A fresh AliveOS install does not run any
model, phone home, or reserve resources for AI workloads. If you want the
capabilities, you turn them on; if you do not, they are simply not there. This
keeps the base system clean and predictable, in line with our zero-bloat
philosophy.</p>

<h2 id="local-models-only">Local models only</h2>

<p>Everything runs on your own hardware. AliveOS ships integrations for running
models locally — no cloud backend, no managed endpoint, no third-party
inference server. The model, the prompt, and the response all live and stay on
your machine.</p>

<h2 id="no-calls-leave-the-system">No calls leave the system</h2>

<p>This is the part we want to be explicit about, because it is where most
privacy-minded users get (rightly) nervous:</p>

<ul>
  <li><strong>Zero outbound AI traffic.</strong> No API keys, no telemetry, no “send prompt to
provider” requests — ever.</li>
  <li><strong>Your data never leaves the machine.</strong> Documents you summarize, code you ask
for help with, conversations you have: none of it is transmitted anywhere.</li>
  <li><strong>Verifiable by design.</strong> Because inference is local, you can confirm this
yourself with standard network tooling; there is no hidden remote dependency
to audit around.</li>
</ul>

<p>If you are offline, the features keep working. If you are air-gapped, they keep
working. Privacy and security are not a setting you have to trust us on —
they are a consequence of the architecture.</p>

<h2 id="what-to-expect">What to expect</h2>

<p>We are still shaping the exact surface area — which local runtime, which
default models, and how it integrates with the desktop and the developer
toolchain. The goal is a useful, no-compromises on-device AI experience that fits
the rest of AliveOS: lightweight, developer-friendly, and out of the way unless
you ask for it.</p>

<p>More details as the pieces come together.</p>]]></content><author><name>The AliveOS Project</name></author><summary type="html"><![CDATA[We have been quiet on one question that comes up a lot: where does AliveOS stand on AI? The short version is simple.]]></summary></entry></feed>