<?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>Quickshell on Tarragon</title><link>https://tarrragon.github.io/blog/tags/quickshell/</link><description>Recent content in Quickshell on Tarragon</description><generator>Hugo -- gohugo.io</generator><language>zh-TW</language><copyright>Tarragon (CC BY 4.0)</copyright><lastBuildDate>Mon, 29 Jun 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://tarrragon.github.io/blog/tags/quickshell/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-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></channel></rss>