<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Caelestia on Tarragon</title><link>https://tarrragon.github.io/blog/tags/caelestia/</link><description>Recent content in Caelestia on Tarragon</description><generator>Hugo -- gohugo.io</generator><language>zh-TW</language><copyright>Tarragon (CC BY 4.0)</copyright><lastBuildDate>Wed, 01 Jul 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://tarrragon.github.io/blog/tags/caelestia/index.xml" rel="self" type="application/rss+xml"/><item><title>Caelestia 總覽：預組裝的 Hyprland 桌面 Shell</title><link>https://tarrragon.github.io/blog/linux/dotfile/06-rice-design/caelestia-overview/</link><pubDate>Mon, 29 Jun 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/linux/dotfile/06-rice-design/caelestia-overview/</guid><description>&lt;p>Caelestia 是基於 Quickshell 框架的 Hyprland 桌面 shell。它把狀態列、啟動器、通知、鎖屏、桌布管理這些在平鋪式桌面上需要各自挑選和配置的元件，整合成一套設計一致的成品。本質上是一套高品質的 dotfiles/rice，不是一個穩定的桌面環境產品。&lt;/p>
&lt;h2 id="caelestia-提供的元件">Caelestia 提供的元件&lt;/h2>
&lt;p>手動拼裝的桌面需要 6-8 個獨立工具各自配置。Caelestia 把這些元件用 Quickshell 統一實作：&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>元件&lt;/th>
 &lt;th>手動拼裝的對應物&lt;/th>
 &lt;th>Caelestia 的實作&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>狀態列（Bar）&lt;/td>
 &lt;td>Waybar&lt;/td>
 &lt;td>工作區指示器、視窗標題、系統匣、時鐘&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>啟動器（Launcher）&lt;/td>
 &lt;td>Wofi / Rofi&lt;/td>
 &lt;td>模糊搜尋應用程式 + 桌布選擇介面&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>通知&lt;/td>
 &lt;td>Mako / Dunst&lt;/td>
 &lt;td>分組通知、過期控制&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>鎖屏&lt;/td>
 &lt;td>Hyprlock&lt;/td>
 &lt;td>模糊背景、可選指紋認證&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>OSD&lt;/td>
 &lt;td>自己用 script 拼&lt;/td>
 &lt;td>音量 / 亮度變更的螢幕顯示&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>桌布管理&lt;/td>
 &lt;td>Hyprpaper / Swww&lt;/td>
 &lt;td>每螢幕桌布、從桌布動態取色（Material Design 3）&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Dashboard&lt;/td>
 &lt;td>無對應（自己拼 widget）&lt;/td>
 &lt;td>媒體播放器（MPRIS）、CPU/GPU/RAM、天氣&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Sidebar&lt;/td>
 &lt;td>無對應&lt;/td>
 &lt;td>WiFi / 藍牙 / 暗色模式快速開關&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Session menu&lt;/td>
 &lt;td>自己用 script 拼&lt;/td>
 &lt;td>登出 / 關機 / 重啟&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Audio visualizer&lt;/td>
 &lt;td>Cava（終端機）&lt;/td>
 &lt;td>桌面上的音訊視覺化&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h2 id="quickshell-框架">Quickshell 框架&lt;/h2>
&lt;p>Quickshell 是一個 Qt6/QML 的 shell framework，用來在 Wayland compositor 上渲染 UI 元件。它的角色是 Caelestia 跟 Hyprland 之間的中介層：&lt;/p>
&lt;ul>
&lt;li>用 QML（Qt 的宣告式 UI 語言）描述介面元件&lt;/li>
&lt;li>透過 &lt;code>wlr-layer-shell&lt;/code> 協議把元件渲染成 Wayland layer surface（這是狀態列、啟動器能「黏在」螢幕邊緣的原因）&lt;/li>
&lt;li>直接存取 Hyprland IPC，可以即時讀取工作區狀態、視窗資訊&lt;/li>
&lt;li>配置檔修改後自動 reload，不需要重啟&lt;/li>
&lt;/ul>
&lt;p>跟其他桌面 shell 框架的差異主要在底層渲染引擎和配置語言。&lt;/p>
&lt;h2 id="跟-ags--eww-的比較">跟 AGS / Eww 的比較&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>框架&lt;/th>
 &lt;th>語言&lt;/th>
 &lt;th>渲染引擎&lt;/th>
 &lt;th>優勢&lt;/th>
 &lt;th>劣勢&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>Quickshell（Caelestia 用）&lt;/td>
 &lt;td>QML（Qt6）&lt;/td>
 &lt;td>Qt&lt;/td>
 &lt;td>即時視窗預覽、Hyprland IPC、auto-reload、豐富動畫&lt;/td>
 &lt;td>Qt theming 複雜、positioning 不直覺、部分服務不完整&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>AGS / Astal&lt;/td>
 &lt;td>TypeScript / JS&lt;/td>
 &lt;td>GTK&lt;/td>
 &lt;td>完整的系統服務庫（Network、Bluetooth）、GObject、前端友善&lt;/td>
 &lt;td>GTK 在 Wayland layer surface 上的限制&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Eww&lt;/td>
 &lt;td>Yuck（自定義）&lt;/td>
 &lt;td>GTK/Rust&lt;/td>
 &lt;td>輕量、配置語法簡單、生態成熟&lt;/td>
 &lt;td>功能不如前兩者豐富、Yuck 是自定義 DSL 要額外學&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>選型判讀：想要開箱即用的華麗桌面 → Caelestia（Quickshell）。想要自己一個個拼、有前端經驗 → AGS。想要最簡單輕量 → Eww。想要完全控制每個細節 → 手動拼裝 waybar + wofi + mako。&lt;/p>
&lt;h2 id="跟手動拼裝的-trade-off">跟手動拼裝的 Trade-off&lt;/h2>
&lt;p>&lt;strong>Caelestia 的優勢&lt;/strong>是省去「挑工具 + 各自配置 + 統一視覺風格」的大量前期功夫。Material Design 3 的動態取色（從桌布自動提取配色方案套用到所有元件）是手動拼裝很難做到的。&lt;/p>
&lt;p>&lt;strong>代價&lt;/strong>是兩個：&lt;/p>
&lt;p>第一，鎖定在 Caelestia 的設計決策裡。你可以調配色、改模組顯示、換桌布，但桌面的整體結構和行為邏輯是 Caelestia 決定的。想要「狀態列放底部 + 用不同的 launcher」這種結構性改動，比手動拼裝困難得多。&lt;/p>
&lt;p>第二，穩定性風險。Caelestia 的 README 明確寫：「Configs, and internal tokens used in them, may be changed or removed without notice」。這表示一次更新可能靜默破壞你的自訂設定。這跟 Hyprland 本身的 breaking changes 疊加，等於你的桌面有兩層快速移動的依賴。&lt;/p></description><content:encoded><![CDATA[<p>Caelestia 是基於 Quickshell 框架的 Hyprland 桌面 shell。它把狀態列、啟動器、通知、鎖屏、桌布管理這些在平鋪式桌面上需要各自挑選和配置的元件，整合成一套設計一致的成品。本質上是一套高品質的 dotfiles/rice，不是一個穩定的桌面環境產品。</p>
<h2 id="caelestia-提供的元件">Caelestia 提供的元件</h2>
<p>手動拼裝的桌面需要 6-8 個獨立工具各自配置。Caelestia 把這些元件用 Quickshell 統一實作：</p>
<table>
  <thead>
      <tr>
          <th>元件</th>
          <th>手動拼裝的對應物</th>
          <th>Caelestia 的實作</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>狀態列（Bar）</td>
          <td>Waybar</td>
          <td>工作區指示器、視窗標題、系統匣、時鐘</td>
      </tr>
      <tr>
          <td>啟動器（Launcher）</td>
          <td>Wofi / Rofi</td>
          <td>模糊搜尋應用程式 + 桌布選擇介面</td>
      </tr>
      <tr>
          <td>通知</td>
          <td>Mako / Dunst</td>
          <td>分組通知、過期控制</td>
      </tr>
      <tr>
          <td>鎖屏</td>
          <td>Hyprlock</td>
          <td>模糊背景、可選指紋認證</td>
      </tr>
      <tr>
          <td>OSD</td>
          <td>自己用 script 拼</td>
          <td>音量 / 亮度變更的螢幕顯示</td>
      </tr>
      <tr>
          <td>桌布管理</td>
          <td>Hyprpaper / Swww</td>
          <td>每螢幕桌布、從桌布動態取色（Material Design 3）</td>
      </tr>
      <tr>
          <td>Dashboard</td>
          <td>無對應（自己拼 widget）</td>
          <td>媒體播放器（MPRIS）、CPU/GPU/RAM、天氣</td>
      </tr>
      <tr>
          <td>Sidebar</td>
          <td>無對應</td>
          <td>WiFi / 藍牙 / 暗色模式快速開關</td>
      </tr>
      <tr>
          <td>Session menu</td>
          <td>自己用 script 拼</td>
          <td>登出 / 關機 / 重啟</td>
      </tr>
      <tr>
          <td>Audio visualizer</td>
          <td>Cava（終端機）</td>
          <td>桌面上的音訊視覺化</td>
      </tr>
  </tbody>
</table>
<h2 id="quickshell-框架">Quickshell 框架</h2>
<p>Quickshell 是一個 Qt6/QML 的 shell framework，用來在 Wayland compositor 上渲染 UI 元件。它的角色是 Caelestia 跟 Hyprland 之間的中介層：</p>
<ul>
<li>用 QML（Qt 的宣告式 UI 語言）描述介面元件</li>
<li>透過 <code>wlr-layer-shell</code> 協議把元件渲染成 Wayland layer surface（這是狀態列、啟動器能「黏在」螢幕邊緣的原因）</li>
<li>直接存取 Hyprland IPC，可以即時讀取工作區狀態、視窗資訊</li>
<li>配置檔修改後自動 reload，不需要重啟</li>
</ul>
<p>跟其他桌面 shell 框架的差異主要在底層渲染引擎和配置語言。</p>
<h2 id="跟-ags--eww-的比較">跟 AGS / Eww 的比較</h2>
<table>
  <thead>
      <tr>
          <th>框架</th>
          <th>語言</th>
          <th>渲染引擎</th>
          <th>優勢</th>
          <th>劣勢</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Quickshell（Caelestia 用）</td>
          <td>QML（Qt6）</td>
          <td>Qt</td>
          <td>即時視窗預覽、Hyprland IPC、auto-reload、豐富動畫</td>
          <td>Qt theming 複雜、positioning 不直覺、部分服務不完整</td>
      </tr>
      <tr>
          <td>AGS / Astal</td>
          <td>TypeScript / JS</td>
          <td>GTK</td>
          <td>完整的系統服務庫（Network、Bluetooth）、GObject、前端友善</td>
          <td>GTK 在 Wayland layer surface 上的限制</td>
      </tr>
      <tr>
          <td>Eww</td>
          <td>Yuck（自定義）</td>
          <td>GTK/Rust</td>
          <td>輕量、配置語法簡單、生態成熟</td>
          <td>功能不如前兩者豐富、Yuck 是自定義 DSL 要額外學</td>
      </tr>
  </tbody>
</table>
<p>選型判讀：想要開箱即用的華麗桌面 → Caelestia（Quickshell）。想要自己一個個拼、有前端經驗 → AGS。想要最簡單輕量 → Eww。想要完全控制每個細節 → 手動拼裝 waybar + wofi + mako。</p>
<h2 id="跟手動拼裝的-trade-off">跟手動拼裝的 Trade-off</h2>
<p><strong>Caelestia 的優勢</strong>是省去「挑工具 + 各自配置 + 統一視覺風格」的大量前期功夫。Material Design 3 的動態取色（從桌布自動提取配色方案套用到所有元件）是手動拼裝很難做到的。</p>
<p><strong>代價</strong>是兩個：</p>
<p>第一，鎖定在 Caelestia 的設計決策裡。你可以調配色、改模組顯示、換桌布，但桌面的整體結構和行為邏輯是 Caelestia 決定的。想要「狀態列放底部 + 用不同的 launcher」這種結構性改動，比手動拼裝困難得多。</p>
<p>第二，穩定性風險。Caelestia 的 README 明確寫：「Configs, and internal tokens used in them, may be changed or removed without notice」。這表示一次更新可能靜默破壞你的自訂設定。這跟 Hyprland 本身的 breaking changes 疊加，等於你的桌面有兩層快速移動的依賴。</p>
<h2 id="三個-github-repo-的分工">三個 GitHub Repo 的分工</h2>
<table>
  <thead>
      <tr>
          <th>Repo</th>
          <th>角色</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>caelestia-dots/caelestia</code></td>
          <td>主 dotfiles — Hyprland config、應用程式配置</td>
      </tr>
      <tr>
          <td><code>caelestia-dots/shell</code></td>
          <td>UI 層 — Quickshell/QML 實作的所有桌面元件</td>
      </tr>
      <tr>
          <td><code>caelestia-dots/cli</code></td>
          <td>CLI 工具 — 安裝、主題切換、截圖、錄影等指令</td>
      </tr>
  </tbody>
</table>
<p>完整安裝（<code>caelestia install</code>）會同時部署三者。也可以只裝 shell（<code>caelestia-shell</code> AUR package），保留自己的 Hyprland config 和應用程式設定。</p>
<h2 id="定位認知">定位認知</h2>
<p>Caelestia 的本質是一套社群維護的 rice dotfiles，不是有 release cycle 和 backward compatibility 承諾的軟體產品。用它的心態應該接近「fork 別人的 dotfiles 來改」而不是「安裝一個桌面環境」。這個定位決定了它適合什麼人：享受折騰和客製化的人會從中得到很好的起點，想要穩定日用的人應該考慮 GNOME 或 KDE Plasma。</p>
]]></content:encoded></item><item><title>Caelestia 安裝</title><link>https://tarrragon.github.io/blog/linux/dotfile/06-rice-design/caelestia-installation/</link><pubDate>Mon, 29 Jun 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/linux/dotfile/06-rice-design/caelestia-installation/</guid><description>&lt;p>Caelestia 的安裝有兩條路：用 CLI 工具一鍵部署完整 dotfiles，或只安裝 shell 元件保留自己的 Hyprland 配置。兩者的前提都是 Hyprland 已經安裝且能正常啟動。&lt;/p>
&lt;h2 id="前提條件">前提條件&lt;/h2>
&lt;ul>
&lt;li>Arch Linux（或 Arch 系發行版如 CachyOS、EndeavourOS）&lt;/li>
&lt;li>Hyprland 已安裝且能從 TTY 啟動（見 &lt;a href="https://tarrragon.github.io/blog/linux/dotfile/05-hyprland-config/hyprland-installation/" data-link-title="Hyprland 安裝與環境建置" data-link-desc="要在 Arch Linux 上從零安裝 Hyprland 桌面環境時回來讀">Hyprland 安裝指南&lt;/a>）&lt;/li>
&lt;li>AUR helper 已安裝（yay 或 paru）&lt;/li>
&lt;li>網路連線（安裝過程需要拉 AUR 套件和 Git repo）&lt;/li>
&lt;/ul>
&lt;h2 id="推薦方式cli-完整安裝">推薦方式：CLI 完整安裝&lt;/h2>





&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="ln">1&lt;/span>&lt;span class="cl">paru -S caelestia-cli
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">2&lt;/span>&lt;span class="cl">caelestia install&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;code>caelestia install&lt;/code> 做的事：&lt;/p>
&lt;ol>
&lt;li>從 GitHub clone Caelestia dotfiles repo&lt;/li>
&lt;li>安裝所有 runtime 依賴（透過 AUR helper）&lt;/li>
&lt;li>部署配置檔到 &lt;code>~/.config/&lt;/code> 對應位置&lt;/li>
&lt;li>設定 Hyprland 載入 Caelestia shell&lt;/li>
&lt;/ol>
&lt;p>安裝完成後重新啟動 Hyprland，Caelestia 會自動載入。&lt;/p>
&lt;p>&lt;strong>注意&lt;/strong>：&lt;code>caelestia install&lt;/code> 會覆寫你現有的 Hyprland 配置。如果你已經有自己的 hyprland.conf / hyprland.lua，先備份。安裝後可以透過 &lt;code>~/.config/caelestia/hypr-user.lua&lt;/code> 加入自訂設定。&lt;/p>
&lt;h2 id="shell-only-安裝">Shell-only 安裝&lt;/h2>
&lt;p>只裝 UI 元件，不動 Hyprland config 和其他應用程式設定：&lt;/p>





&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="ln">1&lt;/span>&lt;span class="cl">yay -S caelestia-shell&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>啟動方式：&lt;/p>





&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="ln">1&lt;/span>&lt;span class="cl">caelestia shell -d &lt;span class="c1"># daemonized，背景執行&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">2&lt;/span>&lt;span class="cl">&lt;span class="c1"># 或&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">3&lt;/span>&lt;span class="cl">qs -c caelestia &lt;span class="c1"># 透過 quickshell 直接啟動&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Shell 不會因為裝了就自動啟動——Hyprland 開機只執行 config 裡 &lt;code>exec-once&lt;/code> 列出的程式，漏列的結果是登入後桌面沒有 bar 也沒有通知（實測：手動啟動用了幾天、直到主機重開才暴露從沒進 autostart）。把啟動指令加進 &lt;code>hyprland.conf&lt;/code>：&lt;/p>





&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-ini" data-lang="ini">&lt;span class="line">&lt;span class="ln">1&lt;/span>&lt;span class="cl">&lt;span class="na">exec-once&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">caelestia shell -d&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Caelestia 自帶 bar、通知、鎖屏與 launcher，跟獨立的 waybar / mako 互斥：通知的 D-Bus name（&lt;code>org.freedesktop.Notifications&lt;/code>）同一時間只有一個擁有者、bar 會疊兩條。設 Caelestia 為主 shell 時，把 waybar / mako 從 &lt;code>exec-once&lt;/code> 移除（註解掉可留作停用 Caelestia 時的 fallback）。&lt;/p>
&lt;h2 id="aur-套件一覽">AUR 套件一覽&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>套件&lt;/th>
 &lt;th>說明&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>caelestia-shell&lt;/code>&lt;/td>
 &lt;td>穩定版 shell（UI 元件）&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>caelestia-shell-git&lt;/code>&lt;/td>
 &lt;td>開發版 shell（最新功能，可能不穩定）&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>caelestia-cli&lt;/code>&lt;/td>
 &lt;td>CLI 工具（安裝、主題切換、截圖、錄影等）&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>&lt;code>caelestia-shell&lt;/code> 是 &lt;code>caelestia-cli&lt;/code> 的 &lt;strong>optional dependency&lt;/strong>（提供 shell 控制與截圖功能）——只裝 CLI 不會自動拉 shell，兩個都要就各自明講：&lt;code>yay -S caelestia-cli caelestia-shell&lt;/code>（實測 caelestia-cli 1.1.1 的 PKGBUILD，shell 列在 optdepends）。&lt;/p>
&lt;h2 id="手動-build">手動 Build&lt;/h2>
&lt;p>從原始碼 build shell（不使用 AUR）：&lt;/p>





&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="ln">1&lt;/span>&lt;span class="cl">&lt;span class="nb">cd&lt;/span> &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="nv">$XDG_CONFIG_HOME&lt;/span>&lt;span class="s2">/quickshell&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">2&lt;/span>&lt;span class="cl">git clone https://github.com/caelestia-dots/shell.git caelestia
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">3&lt;/span>&lt;span class="cl">&lt;span class="nb">cd&lt;/span> caelestia
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">4&lt;/span>&lt;span class="cl">cmake -B build -G Ninja -DCMAKE_BUILD_TYPE&lt;span class="o">=&lt;/span>Release -DCMAKE_INSTALL_PREFIX&lt;span class="o">=&lt;/span>/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">5&lt;/span>&lt;span class="cl">cmake --build build
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">6&lt;/span>&lt;span class="cl">sudo cmake --install build&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="runtime-依賴">Runtime 依賴&lt;/h2>
&lt;h3 id="shell-依賴">Shell 依賴&lt;/h3>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>套件&lt;/th>
 &lt;th>用途&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>quickshell-git&lt;/td>
 &lt;td>Quickshell 框架（穩定版不夠用）&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>ddcutil&lt;/td>
 &lt;td>外接螢幕亮度控制&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>brightnessctl&lt;/td>
 &lt;td>筆電螢幕亮度&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>libcava&lt;/td>
 &lt;td>音訊視覺化&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>networkmanager&lt;/td>
 &lt;td>網路管理&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>lm-sensors&lt;/td>
 &lt;td>硬體溫度感測&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>fish&lt;/td>
 &lt;td>Fish shell（部分功能依賴）&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>aubio&lt;/td>
 &lt;td>音訊分析&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>libpipewire&lt;/td>
 &lt;td>PipeWire 音訊整合&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>qt6-declarative&lt;/td>
 &lt;td>QML runtime&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>material-symbols (font)&lt;/td>
 &lt;td>Material Design icon 字型&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>caskaydia-cove-nerd&lt;/td>
 &lt;td>Nerd Font&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>&lt;strong>quickshell-git 是硬性需求&lt;/strong>。穩定版的 quickshell 缺少 Caelestia 需要的 API，安裝穩定版會導致 shell 無法啟動。&lt;/p></description><content:encoded><![CDATA[<p>Caelestia 的安裝有兩條路：用 CLI 工具一鍵部署完整 dotfiles，或只安裝 shell 元件保留自己的 Hyprland 配置。兩者的前提都是 Hyprland 已經安裝且能正常啟動。</p>
<h2 id="前提條件">前提條件</h2>
<ul>
<li>Arch Linux（或 Arch 系發行版如 CachyOS、EndeavourOS）</li>
<li>Hyprland 已安裝且能從 TTY 啟動（見 <a href="/blog/linux/dotfile/05-hyprland-config/hyprland-installation/" data-link-title="Hyprland 安裝與環境建置" data-link-desc="要在 Arch Linux 上從零安裝 Hyprland 桌面環境時回來讀">Hyprland 安裝指南</a>）</li>
<li>AUR helper 已安裝（yay 或 paru）</li>
<li>網路連線（安裝過程需要拉 AUR 套件和 Git repo）</li>
</ul>
<h2 id="推薦方式cli-完整安裝">推薦方式：CLI 完整安裝</h2>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">paru -S caelestia-cli
</span></span><span class="line"><span class="ln">2</span><span class="cl">caelestia install</span></span></code></pre></div><p><code>caelestia install</code> 做的事：</p>
<ol>
<li>從 GitHub clone Caelestia dotfiles repo</li>
<li>安裝所有 runtime 依賴（透過 AUR helper）</li>
<li>部署配置檔到 <code>~/.config/</code> 對應位置</li>
<li>設定 Hyprland 載入 Caelestia shell</li>
</ol>
<p>安裝完成後重新啟動 Hyprland，Caelestia 會自動載入。</p>
<p><strong>注意</strong>：<code>caelestia install</code> 會覆寫你現有的 Hyprland 配置。如果你已經有自己的 hyprland.conf / hyprland.lua，先備份。安裝後可以透過 <code>~/.config/caelestia/hypr-user.lua</code> 加入自訂設定。</p>
<h2 id="shell-only-安裝">Shell-only 安裝</h2>
<p>只裝 UI 元件，不動 Hyprland config 和其他應用程式設定：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">yay -S caelestia-shell</span></span></code></pre></div><p>啟動方式：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">caelestia shell -d    <span class="c1"># daemonized，背景執行</span>
</span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="c1"># 或</span>
</span></span><span class="line"><span class="ln">3</span><span class="cl">qs -c caelestia       <span class="c1"># 透過 quickshell 直接啟動</span></span></span></code></pre></div><p>Shell 不會因為裝了就自動啟動——Hyprland 開機只執行 config 裡 <code>exec-once</code> 列出的程式，漏列的結果是登入後桌面沒有 bar 也沒有通知（實測：手動啟動用了幾天、直到主機重開才暴露從沒進 autostart）。把啟動指令加進 <code>hyprland.conf</code>：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ini" data-lang="ini"><span class="line"><span class="ln">1</span><span class="cl"><span class="na">exec-once</span> <span class="o">=</span> <span class="s">caelestia shell -d</span></span></span></code></pre></div><p>Caelestia 自帶 bar、通知、鎖屏與 launcher，跟獨立的 waybar / mako 互斥：通知的 D-Bus name（<code>org.freedesktop.Notifications</code>）同一時間只有一個擁有者、bar 會疊兩條。設 Caelestia 為主 shell 時，把 waybar / mako 從 <code>exec-once</code> 移除（註解掉可留作停用 Caelestia 時的 fallback）。</p>
<h2 id="aur-套件一覽">AUR 套件一覽</h2>
<table>
  <thead>
      <tr>
          <th>套件</th>
          <th>說明</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>caelestia-shell</code></td>
          <td>穩定版 shell（UI 元件）</td>
      </tr>
      <tr>
          <td><code>caelestia-shell-git</code></td>
          <td>開發版 shell（最新功能，可能不穩定）</td>
      </tr>
      <tr>
          <td><code>caelestia-cli</code></td>
          <td>CLI 工具（安裝、主題切換、截圖、錄影等）</td>
      </tr>
  </tbody>
</table>
<p><code>caelestia-shell</code> 是 <code>caelestia-cli</code> 的 <strong>optional dependency</strong>（提供 shell 控制與截圖功能）——只裝 CLI 不會自動拉 shell，兩個都要就各自明講：<code>yay -S caelestia-cli caelestia-shell</code>（實測 caelestia-cli 1.1.1 的 PKGBUILD，shell 列在 optdepends）。</p>
<h2 id="手動-build">手動 Build</h2>
<p>從原始碼 build shell（不使用 AUR）：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl"><span class="nb">cd</span> <span class="s2">&#34;</span><span class="nv">$XDG_CONFIG_HOME</span><span class="s2">/quickshell&#34;</span>
</span></span><span class="line"><span class="ln">2</span><span class="cl">git clone https://github.com/caelestia-dots/shell.git caelestia
</span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="nb">cd</span> caelestia
</span></span><span class="line"><span class="ln">4</span><span class="cl">cmake -B build -G Ninja -DCMAKE_BUILD_TYPE<span class="o">=</span>Release -DCMAKE_INSTALL_PREFIX<span class="o">=</span>/
</span></span><span class="line"><span class="ln">5</span><span class="cl">cmake --build build
</span></span><span class="line"><span class="ln">6</span><span class="cl">sudo cmake --install build</span></span></code></pre></div><h2 id="runtime-依賴">Runtime 依賴</h2>
<h3 id="shell-依賴">Shell 依賴</h3>
<table>
  <thead>
      <tr>
          <th>套件</th>
          <th>用途</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>quickshell-git</td>
          <td>Quickshell 框架（穩定版不夠用）</td>
      </tr>
      <tr>
          <td>ddcutil</td>
          <td>外接螢幕亮度控制</td>
      </tr>
      <tr>
          <td>brightnessctl</td>
          <td>筆電螢幕亮度</td>
      </tr>
      <tr>
          <td>libcava</td>
          <td>音訊視覺化</td>
      </tr>
      <tr>
          <td>networkmanager</td>
          <td>網路管理</td>
      </tr>
      <tr>
          <td>lm-sensors</td>
          <td>硬體溫度感測</td>
      </tr>
      <tr>
          <td>fish</td>
          <td>Fish shell（部分功能依賴）</td>
      </tr>
      <tr>
          <td>aubio</td>
          <td>音訊分析</td>
      </tr>
      <tr>
          <td>libpipewire</td>
          <td>PipeWire 音訊整合</td>
      </tr>
      <tr>
          <td>qt6-declarative</td>
          <td>QML runtime</td>
      </tr>
      <tr>
          <td>material-symbols (font)</td>
          <td>Material Design icon 字型</td>
      </tr>
      <tr>
          <td>caskaydia-cove-nerd</td>
          <td>Nerd Font</td>
      </tr>
  </tbody>
</table>
<p><strong>quickshell-git 是硬性需求</strong>。穩定版的 quickshell 缺少 Caelestia 需要的 API，安裝穩定版會導致 shell 無法啟動。</p>
<h3 id="cli-依賴">CLI 依賴</h3>
<table>
  <thead>
      <tr>
          <th>套件</th>
          <th>用途</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>libnotify</td>
          <td>通知發送</td>
      </tr>
      <tr>
          <td>swappy</td>
          <td>截圖標註</td>
      </tr>
      <tr>
          <td>grim</td>
          <td>Wayland 截圖</td>
      </tr>
      <tr>
          <td>dart-sass</td>
          <td>SCSS 編譯</td>
      </tr>
      <tr>
          <td>wl-clipboard</td>
          <td>剪貼簿</td>
      </tr>
      <tr>
          <td>slurp</td>
          <td>區域選取</td>
      </tr>
      <tr>
          <td>gpu-screen-recorder</td>
          <td>螢幕錄影</td>
      </tr>
      <tr>
          <td>glib2</td>
          <td>GLib 工具</td>
      </tr>
      <tr>
          <td>cliphist</td>
          <td>剪貼簿歷史</td>
      </tr>
      <tr>
          <td>fuzzel</td>
          <td>模糊搜尋選單</td>
      </tr>
  </tbody>
</table>
<h2 id="登入管理器">登入管理器</h2>
<p>Caelestia 不含登入管理器。推薦用 greetd + tuigreet：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">sudo pacman -S greetd greetd-tuigreet</span></span></code></pre></div><p><code>/etc/greetd/config.toml</code>：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-toml" data-lang="toml"><span class="line"><span class="ln">1</span><span class="cl"><span class="p">[</span><span class="nx">terminal</span><span class="p">]</span>
</span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="nx">vt</span> <span class="p">=</span> <span class="mi">1</span>
</span></span><span class="line"><span class="ln">3</span><span class="cl">
</span></span><span class="line"><span class="ln">4</span><span class="cl"><span class="p">[</span><span class="nx">default_session</span><span class="p">]</span>
</span></span><span class="line"><span class="ln">5</span><span class="cl"><span class="nx">command</span> <span class="p">=</span> <span class="s2">&#34;tuigreet --cmd Hyprland&#34;</span>
</span></span><span class="line"><span class="ln">6</span><span class="cl"><span class="nx">user</span> <span class="p">=</span> <span class="s2">&#34;greeter&#34;</span></span></span></code></pre></div>




<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">sudo systemctl <span class="nb">enable</span> greetd</span></span></code></pre></div><p>也可以不裝登入管理器，直接從 TTY 啟動：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl"><span class="c1"># 登入 TTY 後</span>
</span></span><span class="line"><span class="ln">2</span><span class="cl">Hyprland</span></span></code></pre></div><h2 id="full-dotfiles-管理範圍">Full Dotfiles 管理範圍</h2>
<p><code>caelestia install</code> 部署的完整 dotfiles 不只是 shell，還包括：</p>
<ul>
<li>Hyprland config（Lua 格式）</li>
<li>Firefox / Zen Browser 設定</li>
<li>VSCode / Zed 設定</li>
<li>Fish shell config</li>
<li>Foot terminal config</li>
<li>Starship prompt</li>
<li>Btop</li>
<li>Fastfetch</li>
<li>Thunar 檔案管理器</li>
</ul>
<p>這是 Caelestia 「一套 rice」的完整範圍。如果你只想用 shell 元件、保留自己的應用程式配置，用 shell-only 安裝。</p>
<h2 id="cli-常用指令">CLI 常用指令</h2>
<table>
  <thead>
      <tr>
          <th>指令</th>
          <th>功能</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>caelestia shell -d</code></td>
          <td>啟動 shell（背景）</td>
      </tr>
      <tr>
          <td><code>caelestia shell -s</code></td>
          <td>列出所有 IPC 指令</td>
      </tr>
      <tr>
          <td><code>caelestia install</code></td>
          <td>完整安裝 dotfiles</td>
      </tr>
      <tr>
          <td><code>caelestia update</code></td>
          <td>系統 + dotfiles 更新</td>
      </tr>
      <tr>
          <td><code>caelestia scheme set -n dynamic</code></td>
          <td>設定動態配色方案</td>
      </tr>
      <tr>
          <td><code>caelestia wallpaper -f &lt;path&gt;</code></td>
          <td>設定桌布</td>
      </tr>
      <tr>
          <td><code>caelestia screenshot</code></td>
          <td>截圖</td>
      </tr>
      <tr>
          <td><code>caelestia record</code></td>
          <td>螢幕錄影</td>
      </tr>
      <tr>
          <td><code>caelestia clipboard</code></td>
          <td>剪貼簿歷史</td>
      </tr>
      <tr>
          <td><code>caelestia emoji</code></td>
          <td>Emoji / glyph 選取器</td>
      </tr>
      <tr>
          <td><code>caelestia toggle</code></td>
          <td>切換特殊工作區</td>
      </tr>
      <tr>
          <td><code>caelestia resizer</code></td>
          <td>視窗 resize daemon</td>
      </tr>
  </tbody>
</table>
<h2 id="首次啟動常見問題">首次啟動常見問題</h2>
<p><strong>黑屏</strong>：通常是缺少 <code>xdg-desktop-portal-hyprland</code>。確認已安裝：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">pacman -Q xdg-desktop-portal-hyprland</span></span></code></pre></div><p><strong>Shell 沒有載入</strong>：確認 quickshell-git（不是 quickshell 穩定版）已安裝，且 Hyprland 的 exec-once 有啟動 Caelestia。</p>
<p><strong>字型 icon 顯示為方塊</strong>：缺少 Material Symbols 和 Nerd Font。安裝：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">yay -S material-symbols ttf-caskaydia-cove-nerd</span></span></code></pre></div><h2 id="vm-測試-vs-實機測試">VM 測試 vs 實機測試</h2>
<p><strong>VM 可測試</strong>：安裝流程完整性、CLI 指令是否正常、配置檔結構和語法、啟動器功能、通知系統行為、配置 reload。</p>
<p><strong>需實機測試</strong>：動畫流暢度和幀率、blur 品質和效能影響、Material Design 3 動態取色品質、多螢幕佈局、daily-use 的回應速度和穩定性。</p>
<p>VM 中 Caelestia 的 blur、動畫、動態取色會極度降級或無法運作（軟體渲染沒有足夠的 GPU 加速）。VM 適合驗證「裝得起來、config 能讀」，不適合評估視覺效果和日常使用體驗。</p>
]]></content:encoded></item><item><title>Caelestia 配置</title><link>https://tarrragon.github.io/blog/linux/dotfile/06-rice-design/caelestia-configuration/</link><pubDate>Mon, 29 Jun 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/linux/dotfile/06-rice-design/caelestia-configuration/</guid><description>&lt;p>&lt;code>~/.config/caelestia/&lt;/code> 下有兩類檔案：使用者層的 JSON 配置（&lt;code>shell.json&lt;/code>、&lt;code>cli.json&lt;/code>）控制功能和外觀，token 層（&lt;code>shell-tokens.json&lt;/code>）控制細部視覺數值——間距、圓角、字型大小、動畫曲線。&lt;code>shell.json&lt;/code> 修改後 Quickshell 自動 reload、不需要重啟（VM 實測：跑著的實例會即時吃到檔案變更、驗證後重新序列化回檔案）。配色（scheme）的熱套用是另一個獨立的 watcher、有啟動時序前提，見下方配色段。&lt;/p>
&lt;h2 id="配置檔路徑">配置檔路徑&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>路徑&lt;/th>
 &lt;th>用途&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>~/.config/caelestia/shell.json&lt;/code>&lt;/td>
 &lt;td>主配置（使用者自建，不會自動產生）&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>~/.config/caelestia/shell-tokens.json&lt;/code>&lt;/td>
 &lt;td>進階視覺 token（rounding、spacing、padding、字型、動畫）&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>~/.config/caelestia/monitors/&amp;lt;name&amp;gt;/shell.json&lt;/code>&lt;/td>
 &lt;td>每螢幕覆寫（螢幕名稱用 &lt;code>hyprctl monitors&lt;/code> 查）&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>~/.config/caelestia/monitors/&amp;lt;name&amp;gt;/shell-tokens.json&lt;/code>&lt;/td>
 &lt;td>每螢幕 token 覆寫&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>~/.config/caelestia/hypr-user.lua&lt;/code>&lt;/td>
 &lt;td>自定義 Hyprland 設定（Lua 格式）&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>~/.config/caelestia/hypr-vars.lua&lt;/code>&lt;/td>
 &lt;td>Hyprland 變數覆寫&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>~/.config/caelestia/cli.json&lt;/code>&lt;/td>
 &lt;td>CLI 工具配置（主題目標、icon theme、workspace toggle）&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>~/.config/caelestia/templates/&lt;/code>&lt;/td>
 &lt;td>自定義色彩模板，語法 &lt;code>{{ primary.hex }}&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>~/.face&lt;/code>&lt;/td>
 &lt;td>個人頭像（Dashboard 用）&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>~/Pictures/Wallpapers&lt;/code>&lt;/td>
 &lt;td>預設桌布目錄（可在 paths section 改）&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>&lt;code>shell.json&lt;/code> 不會在安裝時自動產生——預設行為由 Caelestia 內建值決定。你只需要建立這個檔案、寫入你想覆寫的 section。未寫的 section 使用預設值。&lt;/p>
&lt;h2 id="shelljson-結構">shell.json 結構&lt;/h2>
&lt;p>shell.json 的 top-level section 對應桌面 shell 的各個元件和全域設定：&lt;/p>
&lt;h3 id="全域設定">全域設定&lt;/h3>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Section&lt;/th>
 &lt;th>控制什麼&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>enabled&lt;/code>&lt;/td>
 &lt;td>各元件的啟用 / 停用主開關&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>appearance&lt;/code>&lt;/td>
 &lt;td>全域視覺：deformScale、rounding、spacing、padding、字型、動畫、透明度&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>general&lt;/code>&lt;/td>
 &lt;td>Logo 圖片路徑、app 路徑、閒置逾時秒數、低電量警告門檻&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>services&lt;/code>&lt;/td>
 &lt;td>天氣服務、時間格式、GPU 類型（AMD/NVIDIA/Intel）、音訊後端&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>paths&lt;/code>&lt;/td>
 &lt;td>桌布目錄、歌詞目錄、assets 目錄的自定義路徑&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h3 id="元件設定">元件設定&lt;/h3>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Section&lt;/th>
 &lt;th>控制什麼&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>bar&lt;/code>&lt;/td>
 &lt;td>狀態列：persistent toggle、工作區顯示、active window、tray、時鐘&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>background&lt;/code>&lt;/td>
 &lt;td>桌布設定、桌面時鐘、音訊視覺化&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>dashboard&lt;/code>&lt;/td>
 &lt;td>媒體播放器、效能指標（CPU/GPU/RAM）、天氣&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>launcher&lt;/code>&lt;/td>
 &lt;td>應用程式搜尋、動作列表、桌布選擇&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>lock&lt;/code>&lt;/td>
 &lt;td>鎖屏：指紋認證開關、logo 重新配色&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>notifs&lt;/code>&lt;/td>
 &lt;td>通知：過期時間、分組邏輯&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>osd&lt;/code>&lt;/td>
 &lt;td>音量 / 亮度變更的螢幕顯示&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>session&lt;/code>&lt;/td>
 &lt;td>登出 / 關機 / 重啟選單&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>sidebar&lt;/code>&lt;/td>
 &lt;td>hover 行為、快速開關（WiFi、藍牙、暗色模式）&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>nexus&lt;/code>&lt;/td>
 &lt;td>設定介面&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>utilities&lt;/code>&lt;/td>
 &lt;td>Toast 通知、VPN 開關、其他快速操作&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>border&lt;/code>&lt;/td>
 &lt;td>視窗邊框：thickness、rounding、smoothing&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h3 id="範例常見客製化">範例：常見客製化&lt;/h3>





&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-json" data-lang="json">&lt;span class="line">&lt;span class="ln"> 1&lt;/span>&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 2&lt;/span>&lt;span class="cl"> &lt;span class="nt">&amp;#34;bar&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 3&lt;/span>&lt;span class="cl"> &lt;span class="nt">&amp;#34;persistent&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">true&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 4&lt;/span>&lt;span class="cl"> &lt;span class="nt">&amp;#34;workspaces&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 5&lt;/span>&lt;span class="cl"> &lt;span class="nt">&amp;#34;shown&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">9&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 6&lt;/span>&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 7&lt;/span>&lt;span class="cl"> &lt;span class="nt">&amp;#34;clock&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 8&lt;/span>&lt;span class="cl"> &lt;span class="nt">&amp;#34;format&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;%H:%M&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 9&lt;/span>&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">10&lt;/span>&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">11&lt;/span>&lt;span class="cl"> &lt;span class="nt">&amp;#34;notifs&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">12&lt;/span>&lt;span class="cl"> &lt;span class="nt">&amp;#34;expiration&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">8000&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">13&lt;/span>&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">14&lt;/span>&lt;span class="cl"> &lt;span class="nt">&amp;#34;paths&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">15&lt;/span>&lt;span class="cl"> &lt;span class="nt">&amp;#34;wallpapers&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;~/Pictures/MyWallpapers&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">16&lt;/span>&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">17&lt;/span>&lt;span class="cl"> &lt;span class="nt">&amp;#34;services&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">18&lt;/span>&lt;span class="cl"> &lt;span class="nt">&amp;#34;gpu&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;amd&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">19&lt;/span>&lt;span class="cl"> &lt;span class="nt">&amp;#34;time&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">20&lt;/span>&lt;span class="cl"> &lt;span class="nt">&amp;#34;format24h&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">true&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">21&lt;/span>&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">22&lt;/span>&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">23&lt;/span>&lt;span class="cl">&lt;span class="p">}&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>Key 要對著實際版本驗&lt;/strong>：caelestia-shell 啟動時會改寫 shell.json、丟掉 schema 不認得的 key、只留有效子集（VM 實測 2.1.0：&lt;code>bar.clock.format&lt;/code>、&lt;code>notifs.expiration&lt;/code>、&lt;code>services.*&lt;/code> 都被丟掉、只有 &lt;code>bar.persistent&lt;/code> 與 &lt;code>workspaces.shown&lt;/code> 留下）。寫覆寫檔後啟動 shell、再回頭看檔案剩什麼，就是這個版本的有效 schema——被丟掉的 key 代表該功能在這版不存在或搬了位置，去 token 或別的 section 找。schema 的權威來源是安裝進來的 &lt;code>/usr/lib/qt6/qml/Caelestia/Config/caelestia-config.qmltypes&lt;/code>（config 編在 C++ plugin 裡、QML 原始碼查不到）。&lt;/p>
&lt;p>一個經 2.1.0 驗證的實用例——idle 鎖屏時間（預設 3 分鐘鎖、10 分鐘關螢幕）延長到 2 小時：&lt;/p>





&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-json" data-lang="json">&lt;span class="line">&lt;span class="ln"> 1&lt;/span>&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 2&lt;/span>&lt;span class="cl"> &lt;span class="nt">&amp;#34;general&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 3&lt;/span>&lt;span class="cl"> &lt;span class="nt">&amp;#34;idle&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 4&lt;/span>&lt;span class="cl"> &lt;span class="nt">&amp;#34;timeouts&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 5&lt;/span>&lt;span class="cl"> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 6&lt;/span>&lt;span class="cl"> &lt;span class="nt">&amp;#34;timeout&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">7200&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 7&lt;/span>&lt;span class="cl"> &lt;span class="nt">&amp;#34;idleAction&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;lock&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 8&lt;/span>&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 9&lt;/span>&lt;span class="cl"> &lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">10&lt;/span>&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">11&lt;/span>&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">12&lt;/span>&lt;span class="cl">&lt;span class="p">}&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="token-系統">Token 系統&lt;/h2>
&lt;p>&lt;code>shell-tokens.json&lt;/code> 控制的是比 &lt;code>shell.json&lt;/code> 更細粒度的視覺數值：&lt;/p></description><content:encoded><![CDATA[<p><code>~/.config/caelestia/</code> 下有兩類檔案：使用者層的 JSON 配置（<code>shell.json</code>、<code>cli.json</code>）控制功能和外觀，token 層（<code>shell-tokens.json</code>）控制細部視覺數值——間距、圓角、字型大小、動畫曲線。<code>shell.json</code> 修改後 Quickshell 自動 reload、不需要重啟（VM 實測：跑著的實例會即時吃到檔案變更、驗證後重新序列化回檔案）。配色（scheme）的熱套用是另一個獨立的 watcher、有啟動時序前提，見下方配色段。</p>
<h2 id="配置檔路徑">配置檔路徑</h2>
<table>
  <thead>
      <tr>
          <th>路徑</th>
          <th>用途</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>~/.config/caelestia/shell.json</code></td>
          <td>主配置（使用者自建，不會自動產生）</td>
      </tr>
      <tr>
          <td><code>~/.config/caelestia/shell-tokens.json</code></td>
          <td>進階視覺 token（rounding、spacing、padding、字型、動畫）</td>
      </tr>
      <tr>
          <td><code>~/.config/caelestia/monitors/&lt;name&gt;/shell.json</code></td>
          <td>每螢幕覆寫（螢幕名稱用 <code>hyprctl monitors</code> 查）</td>
      </tr>
      <tr>
          <td><code>~/.config/caelestia/monitors/&lt;name&gt;/shell-tokens.json</code></td>
          <td>每螢幕 token 覆寫</td>
      </tr>
      <tr>
          <td><code>~/.config/caelestia/hypr-user.lua</code></td>
          <td>自定義 Hyprland 設定（Lua 格式）</td>
      </tr>
      <tr>
          <td><code>~/.config/caelestia/hypr-vars.lua</code></td>
          <td>Hyprland 變數覆寫</td>
      </tr>
      <tr>
          <td><code>~/.config/caelestia/cli.json</code></td>
          <td>CLI 工具配置（主題目標、icon theme、workspace toggle）</td>
      </tr>
      <tr>
          <td><code>~/.config/caelestia/templates/</code></td>
          <td>自定義色彩模板，語法 <code>{{ primary.hex }}</code></td>
      </tr>
      <tr>
          <td><code>~/.face</code></td>
          <td>個人頭像（Dashboard 用）</td>
      </tr>
      <tr>
          <td><code>~/Pictures/Wallpapers</code></td>
          <td>預設桌布目錄（可在 paths section 改）</td>
      </tr>
  </tbody>
</table>
<p><code>shell.json</code> 不會在安裝時自動產生——預設行為由 Caelestia 內建值決定。你只需要建立這個檔案、寫入你想覆寫的 section。未寫的 section 使用預設值。</p>
<h2 id="shelljson-結構">shell.json 結構</h2>
<p>shell.json 的 top-level section 對應桌面 shell 的各個元件和全域設定：</p>
<h3 id="全域設定">全域設定</h3>
<table>
  <thead>
      <tr>
          <th>Section</th>
          <th>控制什麼</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>enabled</code></td>
          <td>各元件的啟用 / 停用主開關</td>
      </tr>
      <tr>
          <td><code>appearance</code></td>
          <td>全域視覺：deformScale、rounding、spacing、padding、字型、動畫、透明度</td>
      </tr>
      <tr>
          <td><code>general</code></td>
          <td>Logo 圖片路徑、app 路徑、閒置逾時秒數、低電量警告門檻</td>
      </tr>
      <tr>
          <td><code>services</code></td>
          <td>天氣服務、時間格式、GPU 類型（AMD/NVIDIA/Intel）、音訊後端</td>
      </tr>
      <tr>
          <td><code>paths</code></td>
          <td>桌布目錄、歌詞目錄、assets 目錄的自定義路徑</td>
      </tr>
  </tbody>
</table>
<h3 id="元件設定">元件設定</h3>
<table>
  <thead>
      <tr>
          <th>Section</th>
          <th>控制什麼</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>bar</code></td>
          <td>狀態列：persistent toggle、工作區顯示、active window、tray、時鐘</td>
      </tr>
      <tr>
          <td><code>background</code></td>
          <td>桌布設定、桌面時鐘、音訊視覺化</td>
      </tr>
      <tr>
          <td><code>dashboard</code></td>
          <td>媒體播放器、效能指標（CPU/GPU/RAM）、天氣</td>
      </tr>
      <tr>
          <td><code>launcher</code></td>
          <td>應用程式搜尋、動作列表、桌布選擇</td>
      </tr>
      <tr>
          <td><code>lock</code></td>
          <td>鎖屏：指紋認證開關、logo 重新配色</td>
      </tr>
      <tr>
          <td><code>notifs</code></td>
          <td>通知：過期時間、分組邏輯</td>
      </tr>
      <tr>
          <td><code>osd</code></td>
          <td>音量 / 亮度變更的螢幕顯示</td>
      </tr>
      <tr>
          <td><code>session</code></td>
          <td>登出 / 關機 / 重啟選單</td>
      </tr>
      <tr>
          <td><code>sidebar</code></td>
          <td>hover 行為、快速開關（WiFi、藍牙、暗色模式）</td>
      </tr>
      <tr>
          <td><code>nexus</code></td>
          <td>設定介面</td>
      </tr>
      <tr>
          <td><code>utilities</code></td>
          <td>Toast 通知、VPN 開關、其他快速操作</td>
      </tr>
      <tr>
          <td><code>border</code></td>
          <td>視窗邊框：thickness、rounding、smoothing</td>
      </tr>
  </tbody>
</table>
<h3 id="範例常見客製化">範例：常見客製化</h3>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="ln"> 2</span><span class="cl">    <span class="nt">&#34;bar&#34;</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln"> 3</span><span class="cl">        <span class="nt">&#34;persistent&#34;</span><span class="p">:</span> <span class="kc">true</span><span class="p">,</span>
</span></span><span class="line"><span class="ln"> 4</span><span class="cl">        <span class="nt">&#34;workspaces&#34;</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln"> 5</span><span class="cl">            <span class="nt">&#34;shown&#34;</span><span class="p">:</span> <span class="mi">9</span>
</span></span><span class="line"><span class="ln"> 6</span><span class="cl">        <span class="p">},</span>
</span></span><span class="line"><span class="ln"> 7</span><span class="cl">        <span class="nt">&#34;clock&#34;</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln"> 8</span><span class="cl">            <span class="nt">&#34;format&#34;</span><span class="p">:</span> <span class="s2">&#34;%H:%M&#34;</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="ln">10</span><span class="cl">    <span class="p">},</span>
</span></span><span class="line"><span class="ln">11</span><span class="cl">    <span class="nt">&#34;notifs&#34;</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln">12</span><span class="cl">        <span class="nt">&#34;expiration&#34;</span><span class="p">:</span> <span class="mi">8000</span>
</span></span><span class="line"><span class="ln">13</span><span class="cl">    <span class="p">},</span>
</span></span><span class="line"><span class="ln">14</span><span class="cl">    <span class="nt">&#34;paths&#34;</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln">15</span><span class="cl">        <span class="nt">&#34;wallpapers&#34;</span><span class="p">:</span> <span class="s2">&#34;~/Pictures/MyWallpapers&#34;</span>
</span></span><span class="line"><span class="ln">16</span><span class="cl">    <span class="p">},</span>
</span></span><span class="line"><span class="ln">17</span><span class="cl">    <span class="nt">&#34;services&#34;</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln">18</span><span class="cl">        <span class="nt">&#34;gpu&#34;</span><span class="p">:</span> <span class="s2">&#34;amd&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="ln">19</span><span class="cl">        <span class="nt">&#34;time&#34;</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln">20</span><span class="cl">            <span class="nt">&#34;format24h&#34;</span><span class="p">:</span> <span class="kc">true</span>
</span></span><span class="line"><span class="ln">21</span><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="ln">22</span><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="ln">23</span><span class="cl"><span class="p">}</span></span></span></code></pre></div><p><strong>Key 要對著實際版本驗</strong>：caelestia-shell 啟動時會改寫 shell.json、丟掉 schema 不認得的 key、只留有效子集（VM 實測 2.1.0：<code>bar.clock.format</code>、<code>notifs.expiration</code>、<code>services.*</code> 都被丟掉、只有 <code>bar.persistent</code> 與 <code>workspaces.shown</code> 留下）。寫覆寫檔後啟動 shell、再回頭看檔案剩什麼，就是這個版本的有效 schema——被丟掉的 key 代表該功能在這版不存在或搬了位置，去 token 或別的 section 找。schema 的權威來源是安裝進來的 <code>/usr/lib/qt6/qml/Caelestia/Config/caelestia-config.qmltypes</code>（config 編在 C++ plugin 裡、QML 原始碼查不到）。</p>
<p>一個經 2.1.0 驗證的實用例——idle 鎖屏時間（預設 3 分鐘鎖、10 分鐘關螢幕）延長到 2 小時：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="ln"> 2</span><span class="cl">    <span class="nt">&#34;general&#34;</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln"> 3</span><span class="cl">        <span class="nt">&#34;idle&#34;</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln"> 4</span><span class="cl">            <span class="nt">&#34;timeouts&#34;</span><span class="p">:</span> <span class="p">[</span>
</span></span><span class="line"><span class="ln"> 5</span><span class="cl">                <span class="p">{</span>
</span></span><span class="line"><span class="ln"> 6</span><span class="cl">                    <span class="nt">&#34;timeout&#34;</span><span class="p">:</span> <span class="mi">7200</span><span class="p">,</span>
</span></span><span class="line"><span class="ln"> 7</span><span class="cl">                    <span class="nt">&#34;idleAction&#34;</span><span class="p">:</span> <span class="s2">&#34;lock&#34;</span>
</span></span><span class="line"><span class="ln"> 8</span><span class="cl">                <span class="p">}</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl">            <span class="p">]</span>
</span></span><span class="line"><span class="ln">10</span><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="ln">11</span><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="ln">12</span><span class="cl"><span class="p">}</span></span></span></code></pre></div><h2 id="token-系統">Token 系統</h2>
<p><code>shell-tokens.json</code> 控制的是比 <code>shell.json</code> 更細粒度的視覺數值：</p>
<ul>
<li>每個元件的 rounding（圓角半徑）</li>
<li>各區域的 spacing 和 padding</li>
<li>各類別文字的 font size</li>
<li>動畫的 duration 和 easing curve</li>
<li>元件的固定尺寸</li>
</ul>
<p>官方的說法是：「Do NOT change any of these options if you do not know what you are doing.」這個警告的實際意義是——token 之間有隱含的依賴關係（某個 padding 值跟某個 rounding 值配合才好看），隨意改一個可能讓整體視覺走樣。而且 token 的名稱和結構可能在版本更新時變動，沒有向後相容承諾。</p>
<p>務實的做法是先不動 token，用 <code>shell.json</code> 做功能層面的客製化。等到你有明確的視覺需求（例如想把所有圓角改更大），再查 token 文件做精確調整。</p>
<h2 id="自定義-hyprland-設定">自定義 Hyprland 設定</h2>
<p>Caelestia 管理自己的 Hyprland 配置。你的自訂設定放在 <code>hypr-user.lua</code>（不是直接改 hyprland.lua）：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-lua" data-lang="lua"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="c1">-- ~/.config/caelestia/hypr-user.lua</span>
</span></span><span class="line"><span class="ln"> 2</span><span class="cl">
</span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="c1">-- 額外的 keybind</span>
</span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="n">hl.bind</span><span class="p">(</span><span class="s2">&#34;SUPER&#34;</span><span class="p">,</span> <span class="s2">&#34;Return&#34;</span><span class="p">,</span> <span class="s2">&#34;exec&#34;</span><span class="p">,</span> <span class="s2">&#34;foot&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln"> 5</span><span class="cl">
</span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="c1">-- monitor 配置</span>
</span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="n">hl.config</span><span class="p">({</span>
</span></span><span class="line"><span class="ln"> 8</span><span class="cl">    <span class="n">monitor</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl">        <span class="s2">&#34;DP-1, 2560x1440@144, 0x0, 1&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="ln">10</span><span class="cl">        <span class="s2">&#34;HDMI-A-1, 1920x1080@60, 2560x0, 1&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="ln">11</span><span class="cl">    <span class="p">},</span>
</span></span><span class="line"><span class="ln">12</span><span class="cl"><span class="p">})</span>
</span></span><span class="line"><span class="ln">13</span><span class="cl">
</span></span><span class="line"><span class="ln">14</span><span class="cl"><span class="c1">-- 額外的 window rules</span>
</span></span><span class="line"><span class="ln">15</span><span class="cl"><span class="n">hl.config</span><span class="p">({</span>
</span></span><span class="line"><span class="ln">16</span><span class="cl">    <span class="n">windowrule</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln">17</span><span class="cl">        <span class="s2">&#34;workspace 8, class:^(firefox)$&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="ln">18</span><span class="cl">    <span class="p">},</span>
</span></span><span class="line"><span class="ln">19</span><span class="cl"><span class="p">})</span></span></span></code></pre></div><p><strong>Hyprland Lua 格式</strong>：Caelestia 已經遷移到 Lua 配置（對應 Hyprland v0.55+ 的格式變更）。如果你手上有舊的 <code>hypr-user.conf</code>，需要轉換成 Lua。轉換工具：<code>hyprlang2lua</code>（Go）或 <code>hyprconf2lua</code>（Python pip）。</p>
<h2 id="配色與主題">配色與主題</h2>
<p>Caelestia 的配色系統用 Material Design 3 的動態取色——從桌布圖片自動提取色彩，產生一套 primary / secondary / surface / error 色系，套用到所有元件。</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl"><span class="c1"># 設定桌布並觸發動態取色</span>
</span></span><span class="line"><span class="ln">2</span><span class="cl">caelestia wallpaper -f ~/Pictures/Wallpapers/mountain.jpg
</span></span><span class="line"><span class="ln">3</span><span class="cl">
</span></span><span class="line"><span class="ln">4</span><span class="cl"><span class="c1"># 手動切換配色方案</span>
</span></span><span class="line"><span class="ln">5</span><span class="cl">caelestia scheme <span class="nb">set</span> -n dynamic    <span class="c1"># 動態（從桌布取）</span>
</span></span><span class="line"><span class="ln">6</span><span class="cl">caelestia scheme <span class="nb">set</span> -n catppuccin <span class="c1"># 如果有對應 template</span></span></span></code></pre></div><p>自定義配色模板放在 <code>~/.config/caelestia/templates/</code>，用 <code>{{ primary.hex }}</code>、<code>{{ surface.hex }}</code> 等變數。Caelestia 會在切換桌布時用新的色系填入這些變數，產生對應的配置檔。</p>
<p><strong>Scheme 熱套用的啟動時序前提</strong>（兩台 VM 各實測一次、行為一致）：shell 對 <code>~/.local/state/caelestia/scheme.json</code> 的 file watcher 只在<strong>啟動當下檔案已存在</strong>時建立。首次安裝、從未 <code>scheme set</code> 過的機器上，第一個 shell 實例啟動時 state 檔還不存在——之後下 <code>scheme set</code> 會寫入 state、CLI 回報也正確，但跑著的 UI 不變色。修法：<code>scheme set</code> 建好 state 檔後重啟一次 shell；那之後同一實例的配色切換都即時生效、不用再重啟。</p>
<p><strong>重啟 shell 用 <code>pkill -x qs</code></strong>：<code>caelestia shell -k</code> 可能靜默失敗（實測 CLI 1.1.1：指令回傳正常但 process 沒死、新起的實例偵測到舊實例就自行退出——看起來重啟了、實際同一個實例一直活著）。驗證重啟是否真的發生，比對 <code>ps -o pid,lstart -p $(pgrep -x qs)</code> 的 pid 與起始時間，別只看指令沒報錯。process 名是 <code>qs</code>（<code>/usr/bin/qs</code> 是 quickshell 的 symlink）、<code>pgrep caelestia</code> 找不到它。</p>
<h2 id="不要改-aur-安裝的檔案">不要改 AUR 安裝的檔案</h2>
<p>AUR package（<code>caelestia-shell</code>）安裝的檔案在系統路徑下，更新時會被覆蓋。所有客製化都應該放在 <code>~/.config/caelestia/</code>，Caelestia 會優先讀取使用者路徑的配置，沒有的才 fallback 到系統預設。</p>
<h2 id="已知問題">已知問題</h2>
<p><strong>Config 靜默破壞</strong>：Caelestia 的 token 名稱和配置結構可能在版本更新時變動，不會事先通知。更新後如果 shell 行為異常，先檢查 <code>shell-tokens.json</code> 裡的 key 是否還存在。</p>
<p><strong>Notification backlog</strong>：Shell 可能因為積累大量通知而變卡。清除：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">caelestia shell notifs clear</span></span></code></pre></div><p><strong>quickshell-git 必須</strong>：穩定版的 quickshell 缺少 Caelestia 需要的 API。如果裝了穩定版，shell 會啟動失敗或功能不完整。確認用的是 <code>quickshell-git</code>：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">pacman -Q quickshell-git</span></span></code></pre></div><p><strong>工作區切換卡頓</strong>：在某些 GPU / 驅動組合下報告過隨機卡頓。排查方向：關閉 VRR（<code>vrr = 0</code>）、減少 blur passes、檢查 GPU 驅動版本。</p>
<h2 id="dotfile-repo-結構對應">Dotfile Repo 結構對應</h2>
<p>Caelestia 的配置只追蹤覆寫用的檔案（<code>shell.json</code>、<code>cli.json</code>、<code>hypr-user.lua</code>），AUR package 安裝的原始檔案不進 repo：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="ln"> 1</span><span class="cl">~/dotfiles/
</span></span><span class="line"><span class="ln"> 2</span><span class="cl">└── caelestia/
</span></span><span class="line"><span class="ln"> 3</span><span class="cl">    └── .config/
</span></span><span class="line"><span class="ln"> 4</span><span class="cl">        └── caelestia/
</span></span><span class="line"><span class="ln"> 5</span><span class="cl">            ├── shell.json
</span></span><span class="line"><span class="ln"> 6</span><span class="cl">            ├── shell-tokens.json   # 如果有自訂
</span></span><span class="line"><span class="ln"> 7</span><span class="cl">            ├── cli.json
</span></span><span class="line"><span class="ln"> 8</span><span class="cl">            ├── hypr-user.lua
</span></span><span class="line"><span class="ln"> 9</span><span class="cl">            ├── hypr-vars.lua       # 如果有自訂
</span></span><span class="line"><span class="ln">10</span><span class="cl">            └── templates/          # 如果有自訂配色模板</span></span></code></pre></div><p>monitor 專屬的覆寫（<code>monitors/&lt;name&gt;/</code>）是硬體相關的，跟 <a href="/blog/linux/dotfile/05-hyprland-config/hyprland-core-config/" data-link-title="Hyprland 核心配置" data-link-desc="Hyprland 的配置檔該怎麼組織、monitor 怎麼設定、keybind 怎麼設計、輸入裝置和環境變數怎麼配時回來讀">Hyprland 的 monitor 設定</a>一樣，可能需要排除在 Git 外或用 template/local 機制處理。</p>
<p><strong>Runtime 寫入會穿透 stow 的目錄 symlink 弄髒 repo</strong>：用 stow 部署時 <code>~/.config/caelestia</code> 常是折疊的目錄 symlink、指向 repo 裡的 package 目錄，而 caelestia-shell 會在執行期往自己的 config 目錄寫（啟動時建 <code>monitors/</code>、改寫 <code>shell.json</code>）——這些寫入直接落進 dotfiles repo、<code>git status</code> 變髒（btop 往 <code>themes/</code> 寫也是同一型）。配套：repo 的 <code>.gitignore</code> 把「app 會自己寫的路徑」列入（<code>caelestia/.config/caelestia/monitors/</code> 等），shell.json 被改寫後 diff 一下、把有效 schema 的版本 commit 回去。</p>
<h2 id="vm-測試-vs-實機測試">VM 測試 vs 實機測試</h2>
<blockquote>
<p><strong>[VM 可測試]</strong> shell.json 配置語法、各 section 的效果（bar 模組顯示、launcher 搜尋行為、通知過期邏輯）、CLI 指令執行、hypr-user.lua 載入、配色方案切換指令。</p></blockquote>
<blockquote>
<p><strong>[需實機測試]</strong> token 微調的視覺效果（間距和圓角的差異在軟體渲染下難以判讀）。動畫流暢度、blur 效能、動態取色品質、多螢幕佈局、日常穩定性等視覺與效能項目見 <a href="/blog/linux/dotfile/06-rice-design/caelestia-installation/" data-link-title="Caelestia 安裝" data-link-desc="要在 Arch Linux 上安裝 Caelestia 桌面 shell 時回來讀">Caelestia 安裝</a>的對應段落。</p></blockquote>
]]></content:encoded></item><item><title>整合式 Shell vs 手動拼裝：實測足跡、失敗半徑與選型判準</title><link>https://tarrragon.github.io/blog/linux/dotfile/06-rice-design/integrated-shell-vs-manual-assembly/</link><pubDate>Wed, 01 Jul 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/linux/dotfile/06-rice-design/integrated-shell-vs-manual-assembly/</guid><description>&lt;p>整合式桌面 shell 與手動拼裝，是「一個大程式包辦整個桌面」與「多個小程式各司其職、由 compositor 黏起來」兩種架構。&lt;a href="https://tarrragon.github.io/blog/linux/dotfile/06-rice-design/caelestia-overview/" data-link-title="Caelestia 總覽：預組裝的 Hyprland 桌面 Shell" data-link-desc="考慮用 Caelestia 取代手動拼裝 waybar&amp;#43;wofi&amp;#43;mako、或評估預組裝桌面 shell 的 trade-off 時回來讀">Caelestia 總覽&lt;/a> 從概念層談過它的取捨（設計鎖定、穩定性風險）；這篇補上在同一台機器上實際跑過兩種之後量到的數據——資源足跡、失敗半徑、配色一致性——把「感覺整合比較方便」變成可以拿數字判斷的選型。&lt;/p>
&lt;p>這裡的數據來自一次 VM 實測：先手動拼裝一套 waybar + wofi + mako + hyprlock，再換成 Caelestia，量兩者的安裝大小、記憶體、config 結構與失敗行為。&lt;/p>
&lt;h2 id="資源足跡差約一個數量級">資源足跡：差約一個數量級&lt;/h2>
&lt;p>整合式 shell 把整個桌面畫在一個程式裡，這個程式通常是重量級的 UI runtime。Caelestia 建在 Quickshell（Qt6/QML）上，實測安裝足跡如下：&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>項目&lt;/th>
 &lt;th>整合式（Caelestia）&lt;/th>
 &lt;th>手動拼裝（waybar+wofi+mako+hyprlock）&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>安裝大小&lt;/td>
 &lt;td>約 230 MB（Quickshell 佔 213 MB）&lt;/td>
 &lt;td>約 4.5 MB（waybar 3 MB，其餘 KB 級）&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>執行記憶體 RSS&lt;/td>
 &lt;td>單一 &lt;code>qs&lt;/code> 程式約 400 MB&lt;/td>
 &lt;td>waybar 約 53 MB + 通知/啟動器（小）&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>差距的來源是 Quickshell 這個 UI 框架——那 213 MB 是 &lt;code>quickshell&lt;/code> 套件本身的安裝大小（一個建在 Qt6 上的 QML shell runtime），不是 Caelestia 的功能程式碼；而且 Qt6 的函式庫（&lt;code>qt6-declarative&lt;/code>、&lt;code>qt6-base&lt;/code> 等）還是它之上的額外相依，沒算進這 213 MB。手動拼裝的 waybar、wofi、mako 都是輕量的 wlroots/GTK 程式，加起來還不到 5 MB。&lt;/p>
&lt;p>這一軸在資源受限的機器上才會咬人：舊筆電、記憶體小的 VPS、或你本來就想把桌面壓到最輕。在一台記憶體充裕的桌機上，400 MB 對 60 MB 的差別多半感覺不到；在一台 2 GB RAM 的機器上，這就是「桌面吃掉五分之一記憶體」跟「幾乎不佔」的差別。&lt;/p>
&lt;h2 id="失敗半徑單點-vs-各自獨立">失敗半徑：單點 vs 各自獨立&lt;/h2>
&lt;p>整合式 shell 把狀態列、通知、鎖屏、啟動器畫在&lt;strong>同一個程式&lt;/strong>裡，所以這個程式崩潰時，這些東西會&lt;strong>一起消失&lt;/strong>。手動拼裝的每個元件是獨立行程，一個崩掉不影響其他——mako（通知）崩了，waybar（狀態列）還在。&lt;/p>
&lt;p>這不只是理論。這次 VM 實測就撞到一個具體案例：Caelestia 的鎖屏是由 Quickshell 主程式畫的，當這個持鎖的程式被中止時，Hyprland 依 &lt;code>ext-session-lock&lt;/code> 協議保持鎖定並顯示「lockscreen app died」的死局——狀態列、通知、鎖屏因為同源，一個環節出事就連帶整個桌面 UI。手動拼裝的 hyprlock 是獨立的鎖屏程式，它崩潰同樣會觸發那個死局，但你的狀態列與通知不會跟著沒。&lt;/p>
&lt;p>這一軸在穩定性敏感或無人值守的場景最關鍵。跑長時間無人盯著的任務時，「一個元件崩掉只損失那個元件」的隔離性，比「全部整合在一起」的一致性更值錢——因為沒人在旁邊立刻重啟。&lt;/p>
&lt;h2 id="配色一致性最容易被低估的一軸">配色一致性：最容易被低估的一軸&lt;/h2>
&lt;p>讓整個桌面配色一致，是整合式與手動拼裝差別最大、卻最常被忽略的地方。整合式 shell 因為所有元件在同一個程式裡，天生共用一套配色——Caelestia 的 dynamic scheme 從桌布抽一組 Material-3 palette，狀態列、通知、鎖屏、dashboard 全部同時套用，換張桌布整套 UI 跟著變。&lt;/p>
&lt;p>手動拼裝要達到同樣的一致，得自己解決一個跨程式的問題：每個元件用不同的設定格式與主題引擎，它們之間不會自動共享顏色。這次手動拼裝那套時就撞到這點——waybar 的 GTK CSS 引擎讀不到 Hyprland 的 &lt;code>$&lt;/code> 顏色變數，結果 waybar 的 &lt;code>style.css&lt;/code> 裡得&lt;strong>手抄一份跟 Hyprland &lt;code>colors.conf&lt;/code> 相同的 hex 色碼&lt;/strong>。換一次配色，就要在 waybar CSS、wofi CSS、mako config、hyprland colors 好幾個地方各改一遍。&lt;/p>
&lt;p>解這個手工問題的標準做法，是加一層&lt;strong>模板工具&lt;/strong>（matugen、pywal、wallust 之類）：從一張桌布或一套色票，自動生成每個元件的設定檔（例如 &lt;code>matugen/templates/rofi-colors.rasi&lt;/code> 就是給 rofi 用的顏色模板）。這等於是手動重建 Caelestia 內建的那套 dynamic theming pipeline。所以配色一致這件事的真正取捨是：Caelestia 開箱就有「換桌布全套跟著變」，手動拼裝要嘛手抄 hex、要嘛自己搭一條 templating pipeline。&lt;/p>
&lt;h2 id="config-結構">config 結構&lt;/h2>
&lt;p>配色一致的差別，也反映在 config 的形狀上。Caelestia 的使用者設定集中在一個 &lt;code>shell.json&lt;/code>（實測約 24 行就涵蓋狀態列、通知、idle 行為）。手動拼裝的設定散在各元件目錄、各用各的格式：waybar 的 &lt;code>config.jsonc&lt;/code> + &lt;code>style.css&lt;/code>、wofi 的 &lt;code>config&lt;/code> + &lt;code>style.css&lt;/code>、mako 的 &lt;code>config&lt;/code>、hypr 的數個 &lt;code>.conf&lt;/code>。集中的好處是好懂好改；散開的好處是每個元件可以獨立替換（把 waybar 換成 ironbar 不影響其他），代價是你要管更多檔案、更多格式。&lt;/p></description><content:encoded><![CDATA[<p>整合式桌面 shell 與手動拼裝，是「一個大程式包辦整個桌面」與「多個小程式各司其職、由 compositor 黏起來」兩種架構。<a href="/blog/linux/dotfile/06-rice-design/caelestia-overview/" data-link-title="Caelestia 總覽：預組裝的 Hyprland 桌面 Shell" data-link-desc="考慮用 Caelestia 取代手動拼裝 waybar&#43;wofi&#43;mako、或評估預組裝桌面 shell 的 trade-off 時回來讀">Caelestia 總覽</a> 從概念層談過它的取捨（設計鎖定、穩定性風險）；這篇補上在同一台機器上實際跑過兩種之後量到的數據——資源足跡、失敗半徑、配色一致性——把「感覺整合比較方便」變成可以拿數字判斷的選型。</p>
<p>這裡的數據來自一次 VM 實測：先手動拼裝一套 waybar + wofi + mako + hyprlock，再換成 Caelestia，量兩者的安裝大小、記憶體、config 結構與失敗行為。</p>
<h2 id="資源足跡差約一個數量級">資源足跡：差約一個數量級</h2>
<p>整合式 shell 把整個桌面畫在一個程式裡，這個程式通常是重量級的 UI runtime。Caelestia 建在 Quickshell（Qt6/QML）上，實測安裝足跡如下：</p>
<table>
  <thead>
      <tr>
          <th>項目</th>
          <th>整合式（Caelestia）</th>
          <th>手動拼裝（waybar+wofi+mako+hyprlock）</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>安裝大小</td>
          <td>約 230 MB（Quickshell 佔 213 MB）</td>
          <td>約 4.5 MB（waybar 3 MB，其餘 KB 級）</td>
      </tr>
      <tr>
          <td>執行記憶體 RSS</td>
          <td>單一 <code>qs</code> 程式約 400 MB</td>
          <td>waybar 約 53 MB + 通知/啟動器（小）</td>
      </tr>
  </tbody>
</table>
<p>差距的來源是 Quickshell 這個 UI 框架——那 213 MB 是 <code>quickshell</code> 套件本身的安裝大小（一個建在 Qt6 上的 QML shell runtime），不是 Caelestia 的功能程式碼；而且 Qt6 的函式庫（<code>qt6-declarative</code>、<code>qt6-base</code> 等）還是它之上的額外相依，沒算進這 213 MB。手動拼裝的 waybar、wofi、mako 都是輕量的 wlroots/GTK 程式，加起來還不到 5 MB。</p>
<p>這一軸在資源受限的機器上才會咬人：舊筆電、記憶體小的 VPS、或你本來就想把桌面壓到最輕。在一台記憶體充裕的桌機上，400 MB 對 60 MB 的差別多半感覺不到；在一台 2 GB RAM 的機器上，這就是「桌面吃掉五分之一記憶體」跟「幾乎不佔」的差別。</p>
<h2 id="失敗半徑單點-vs-各自獨立">失敗半徑：單點 vs 各自獨立</h2>
<p>整合式 shell 把狀態列、通知、鎖屏、啟動器畫在<strong>同一個程式</strong>裡，所以這個程式崩潰時，這些東西會<strong>一起消失</strong>。手動拼裝的每個元件是獨立行程，一個崩掉不影響其他——mako（通知）崩了，waybar（狀態列）還在。</p>
<p>這不只是理論。這次 VM 實測就撞到一個具體案例：Caelestia 的鎖屏是由 Quickshell 主程式畫的，當這個持鎖的程式被中止時，Hyprland 依 <code>ext-session-lock</code> 協議保持鎖定並顯示「lockscreen app died」的死局——狀態列、通知、鎖屏因為同源，一個環節出事就連帶整個桌面 UI。手動拼裝的 hyprlock 是獨立的鎖屏程式，它崩潰同樣會觸發那個死局，但你的狀態列與通知不會跟著沒。</p>
<p>這一軸在穩定性敏感或無人值守的場景最關鍵。跑長時間無人盯著的任務時，「一個元件崩掉只損失那個元件」的隔離性，比「全部整合在一起」的一致性更值錢——因為沒人在旁邊立刻重啟。</p>
<h2 id="配色一致性最容易被低估的一軸">配色一致性：最容易被低估的一軸</h2>
<p>讓整個桌面配色一致，是整合式與手動拼裝差別最大、卻最常被忽略的地方。整合式 shell 因為所有元件在同一個程式裡，天生共用一套配色——Caelestia 的 dynamic scheme 從桌布抽一組 Material-3 palette，狀態列、通知、鎖屏、dashboard 全部同時套用，換張桌布整套 UI 跟著變。</p>
<p>手動拼裝要達到同樣的一致，得自己解決一個跨程式的問題：每個元件用不同的設定格式與主題引擎，它們之間不會自動共享顏色。這次手動拼裝那套時就撞到這點——waybar 的 GTK CSS 引擎讀不到 Hyprland 的 <code>$</code> 顏色變數，結果 waybar 的 <code>style.css</code> 裡得<strong>手抄一份跟 Hyprland <code>colors.conf</code> 相同的 hex 色碼</strong>。換一次配色，就要在 waybar CSS、wofi CSS、mako config、hyprland colors 好幾個地方各改一遍。</p>
<p>解這個手工問題的標準做法，是加一層<strong>模板工具</strong>（matugen、pywal、wallust 之類）：從一張桌布或一套色票，自動生成每個元件的設定檔（例如 <code>matugen/templates/rofi-colors.rasi</code> 就是給 rofi 用的顏色模板）。這等於是手動重建 Caelestia 內建的那套 dynamic theming pipeline。所以配色一致這件事的真正取捨是：Caelestia 開箱就有「換桌布全套跟著變」，手動拼裝要嘛手抄 hex、要嘛自己搭一條 templating pipeline。</p>
<h2 id="config-結構">config 結構</h2>
<p>配色一致的差別，也反映在 config 的形狀上。Caelestia 的使用者設定集中在一個 <code>shell.json</code>（實測約 24 行就涵蓋狀態列、通知、idle 行為）。手動拼裝的設定散在各元件目錄、各用各的格式：waybar 的 <code>config.jsonc</code> + <code>style.css</code>、wofi 的 <code>config</code> + <code>style.css</code>、mako 的 <code>config</code>、hypr 的數個 <code>.conf</code>。集中的好處是好懂好改；散開的好處是每個元件可以獨立替換（把 waybar 換成 ironbar 不影響其他），代價是你要管更多檔案、更多格式。</p>
<h2 id="選型判準">選型判準</h2>
<p>沒有一種在所有軸上都贏。依你的情境對照：</p>
<table>
  <thead>
      <tr>
          <th>你的情境</th>
          <th>偏向</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>資源受限（舊機、小 RAM VPS）</td>
          <td>手動拼裝（省下那 ~340 MB 記憶體）</td>
      </tr>
      <tr>
          <td>想要開箱即用、換桌布全套變色</td>
          <td>整合式（Caelestia 的 dynamic 原生就有）</td>
      </tr>
      <tr>
          <td>穩定性敏感、無人值守</td>
          <td>手動拼裝（元件獨立、失敗半徑小）</td>
      </tr>
      <tr>
          <td>想要結構性客製（狀態列位置、換 launcher）</td>
          <td>手動拼裝（整合式的結構是 shell 決定的）</td>
      </tr>
      <tr>
          <td>想少管檔案、快速有一套設計一致的成品</td>
          <td>整合式（一個 config、一套配色）</td>
      </tr>
      <tr>
          <td>已經在跑 templating 工具（matugen/pywal）</td>
          <td>手動拼裝（你已經有一致配色的機制、少了整合式的理由）</td>
      </tr>
  </tbody>
</table>
<h3 id="重新評估的訊號tripwire">重新評估的訊號（tripwire）</h3>
<p>選了之後，出現這些訊號時值得回頭重新評估：</p>
<ul>
<li>選了整合式，卻發現一直在跟它的設計決策對抗（想改的結構它不讓你改）——你要的其實是手動拼裝的自由度。</li>
<li>選了手動拼裝，卻發現配色維護（每次改色手抄多個檔案）吃掉大量時間——該加 templating 工具，或重新考慮整合式。</li>
<li>記憶體壓力浮現（整合式的 Qt runtime 在小機器上排擠其他程式）——往手動拼裝退。</li>
<li>整合式的一次更新靜默破壞了你的自訂設定（<a href="/blog/linux/dotfile/06-rice-design/caelestia-overview/" data-link-title="Caelestia 總覽：預組裝的 Hyprland 桌面 Shell" data-link-desc="考慮用 Caelestia 取代手動拼裝 waybar&#43;wofi&#43;mako、或評估預組裝桌面 shell 的 trade-off 時回來讀">Caelestia README 明言 config 可能無預警變動</a>）——評估這層快速移動的依賴值不值得。</li>
</ul>
<h2 id="下一步">下一步</h2>
<ul>
<li>整合式 shell 的概念定位、跟 AGS/Eww 的比較、三個 repo 的分工，見 <a href="/blog/linux/dotfile/06-rice-design/caelestia-overview/" data-link-title="Caelestia 總覽：預組裝的 Hyprland 桌面 Shell" data-link-desc="考慮用 Caelestia 取代手動拼裝 waybar&#43;wofi&#43;mako、或評估預組裝桌面 shell 的 trade-off 時回來讀">Caelestia 總覽</a>。</li>
<li>手動拼裝那幾個元件（狀態列、啟動器、通知）各自怎麼配置，見 <a href="/blog/linux/dotfile/06-rice-design/desktop-shell-components/" data-link-title="桌面 Shell 元件：狀態列、啟動器與通知" data-link-desc="Hyprland 桌面要拼哪些元件、各元件的配置檔怎麼寫時回來讀">桌面 Shell 元件</a>。</li>
<li>配色系統本身（不管哪條路線）怎麼設計，見 <a href="/blog/linux/dotfile/06-rice-design/color-system-theming/" data-link-title="配色系統、鎖屏與 GTK 主題" data-link-desc="桌面配色散亂看起來雜、或要換主題不知道該改哪些檔案時回來讀">配色系統、鎖屏與 GTK 主題</a>。</li>
</ul>
<p>這篇的足跡數字（安裝 230 MB vs 4.5 MB、RSS ~400 MB vs ~60 MB）與 lock-died 失敗案例，來自一次在 Apple Silicon UTM VM 上實際跑過兩種桌面棧的量測。</p>
]]></content:encoded></item></channel></rss>