<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Glimpr on Howar31 Blog</title><link>https://blog.howar31.com/tags/glimpr/</link><description>Recent content in Glimpr on Howar31 Blog</description><generator>Hugo</generator><language>zh-tw</language><lastBuildDate>Sun, 12 Jul 2026 20:32:04 +0800</lastBuildDate><atom:link href="https://blog.howar31.com/tags/glimpr/index.xml" rel="self" type="application/rss+xml"/><item><title>Glimpr：macOS/Windows 雙平台截圖工具從開工到上線的六週紀錄</title><link>https://blog.howar31.com/posts/glimpr-dev-retrospective/</link><pubDate>Sun, 12 Jul 2026 00:00:00 +0000</pubDate><guid>https://blog.howar31.com/posts/glimpr-dev-retrospective/</guid><description>&lt;style&gt;
.vp-image-modal-card { max-width: 96vw; }
.vp-image-modal-img { max-height: 92vh; }
&lt;/style&gt;
&lt;p&gt;&lt;a href="https://glimpr.howar31.com"&gt;Glimpr&lt;/a&gt; 是一個 macOS 與 Windows 的截圖、標註、螢幕錄影工具。2026 年 5 月 31 日開工，7 月 12 日以 v1.0.0 公開上線，開發期約六週，全程由我與 AI coding agent（Claude Code）協作完成，repo 在 &lt;a href="https://github.com/howar31/glimpr"&gt;github.com/howar31/glimpr&lt;/a&gt;，Apache-2.0。&lt;/p&gt;
&lt;p&gt;本文記錄整條路：為什麼做、技術選型、多引擎架構、開發與驗證流程、撞牆紀錄、公開前的工程紀律、上線工程，以及與 AI 協作六週後的觀察。&lt;/p&gt;
&lt;figure class="post-figure"&gt;
 &lt;img src="./images/phase-timeline.svg" alt="Glimpr 六週開發時間軸：從 capture pipeline 到 v1.0.0 公開上線的十一個里程碑" loading="lazy"&gt;
 &lt;figcaption&gt;Glimpr 六週開發時間軸：從 capture pipeline 到 v1.0.0 公開上線的十一個里程碑&lt;/figcaption&gt;
&lt;/figure&gt;&lt;h2 id="1-為什麼做-glimpr"&gt;1. 為什麼做 Glimpr&lt;/h2&gt;
&lt;p&gt;起點是一個具體的症狀：原本日常使用的截圖工具，在系統開機一段時間後，按下快捷鍵要等 2 到 3 秒畫面才凍結。設計階段的分析判斷，成因是它在快捷鍵路徑上呼叫 &lt;code&gt;SCShareableContent.current&lt;/code&gt; 這類昂貴的枚舉 API。Glimpr 的第一需求因此收得非常窄：&lt;strong&gt;按下快捷鍵到全螢幕凍結要在 100 ms 以內，而且不隨開機時間退化&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;這條需求貫穿整個架構：凍結用的 overlay 引擎預先建好、per-display 的 capture filter 事先快取（只在顯示器變動通知時更新，永不在截圖路徑上重查）、PNG encode 移出凍結路徑。曾評估更激進的 p50 &amp;lt; 50 ms 目標，但那需要常駐一條 SCStream、會讓系統的錄影指示燈長亮，於是否決，最後落在冷捕約 90 ms。&lt;/p&gt;</description></item></channel></rss>