Skip to main content

CHANGELOG_MD

Constant CHANGELOG_MD 

Source
const CHANGELOG_MD: &str = "# Changelog\n\nAll notable changes to this project will be documented in this file.\n\nThe format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),\nand this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).\n\n## [Unreleased]\n\n## [1.3.4] - 2026-11-12\n\n\u{4fee}\u{590d} physics \u{5b8f}\u{5305}\u{7684}\u{4e24}\u{5904}\u{516c}\u{5f0f}\u{6e32}\u{67d3}\u{9519}\u{8bef}\u{ff1a}\u{88f8} `\\dd` \u{4e0d}\u{518d}\u{8ba9}\u{6574}\u{5757}\u{516c}\u{5f0f}\u{53d8}\u{6210}\u{7ea2}\u{8272}\u{539f}\u{6587}\u{ff0c}`\\qty(...)` / `\\qty[...]` \u{7684}\u{5b9a}\u{754c}\u{7b26}\u{5f62}\u{5f0f}\u{6309}\u{81ea}\u{52a8}\u{7f29}\u{653e}\u{62ec}\u{53f7}\u{6e32}\u{67d3}\u{3002}\n\n### Fixed\n\n- **\u{88f8} `\\dd` \u{8ba9}\u{6574}\u{5757}\u{516c}\u{5f0f}\u{62a5}\u{9519}**\u{ff1a}`\\dd` \u{539f}\u{5148}\u{58f0}\u{660e}\u{4e86} `#1`\u{ff0c}`\\frac{\\dd}{\\dd{t}}` \u{91cc}\u{5206}\u{5b50}\u{4f4d}\u{7f6e}\u{7684}\u{88f8} `\\dd` \u{4f1a}\u{628a}\u{540e}\u{9762}\u{7684} `}` \u{5f53}\u{4f5c}\u{53c2}\u{6570}\u{541e}\u{6389}\u{ff0c}\u{6574}\u{5757}\u{516c}\u{5f0f}\u{ff08}\u{5982}\u{79ef}\u{5206}\u{5f62}\u{5f0f}\u{7684}\u{9ea6}\u{514b}\u{65af}\u{97e6}\u{65b9}\u{7a0b}\u{7ec4}\u{3001}\u{6b27}\u{62c9}-\u{62c9}\u{683c}\u{6717}\u{65e5}\u{65b9}\u{7a0b}\u{ff09}\u{9000}\u{5316}\u{6210}\u{7ea2}\u{8272}\u{539f}\u{6587}\u{3002}\u{73b0}\u{5728} `\\dd` \u{5c55}\u{5f00}\u{4e3a}\u{4e0d}\u{5e26}\u{53c2}\u{6570}\u{7684} `\\mathrm{d}`\u{ff0c}`\\dd{x}`\u{3001}`\\dd x` \u{4ecd}\u{6e32}\u{67d3}\u{4e3a}\u{76f4}\u{7acb}\u{7684} d \u{7d27}\u{8ddf}\u{540e}\u{9762}\u{7684}\u{5185}\u{5bb9}\u{3002}\u{670d}\u{52a1}\u{7aef} KaTeX \u{4e0e}\u{7f16}\u{8f91}\u{5668}\u{9884}\u{89c8}\u{540c}\u{6b65}\u{4fee}\u{6539}\u{3002}\n- **`\\qty(...)` / `\\qty[...]` \u{6e32}\u{67d3}\u{6210}\u{591a}\u{4f59}\u{62ec}\u{53f7}**\u{ff1a}\u{5b8f}\u{8868}\u{91cc}\u{7684} `\\qty` \u{53ea}\u{80fd}\u{5403}\u{82b1}\u{62ec}\u{53f7}\u{53c2}\u{6570}\u{ff0c}`\\qty(\\dfrac{a}{b})` \u{4f1a}\u{628a} `(` \u{5f53}\u{6210}\u{53c2}\u{6570}\u{ff0c}\u{6e32}\u{67d3}\u{51fa}\u{300c}(()a/b)\u{300d}\u{4e14}\u{4e0d}\u{62a5}\u{9519}\u{3002}\u{73b0}\u{5728}\u{6e32}\u{67d3}\u{524d}\u{6309} TeX \u{8bb0}\u{53f7}\u{9884}\u{8f6c}\u{8bd1}\u{4e3a} `\\left(...\\right)` / `\\left[...\\right]`\u{ff1a}\u{63a7}\u{5236}\u{5e8f}\u{5217}\u{6574}\u{4f53}\u{8df3}\u{8fc7}\u{ff08}`\\\\qty`\u{3001}`\\(` \u{4e0d}\u{53c2}\u{4e0e}\u{914d}\u{5bf9}\u{ff09}\u{ff0c}\u{53ea}\u{5728}\u{540c}\u{4e00}\u{82b1}\u{62ec}\u{53f7}\u{5c42}\u{7ea7}\u{5185}\u{914d}\u{5bf9}\u{540c}\u{79cd}\u{62ec}\u{53f7}\u{ff0c}\u{5d4c}\u{5957}\u{7684} `\\qty(` \u{5404}\u{81ea}\u{66ff}\u{6362}\u{ff0c}\u{62ec}\u{53f7}\u{4e0d}\u{95ed}\u{5408}\u{65f6}\u{4fdd}\u{7559}\u{539f}\u{6587}\u{ff1b}`\\qty{...}` \u{4ecd}\u{8d70}\u{5b8f}\u{8868}\u{3002}\u{670d}\u{52a1}\u{7aef}\u{4e0e}\u{7f16}\u{8f91}\u{5668}\u{9884}\u{89c8}\u{5171}\u{7528}\u{540c}\u{4e00}\u{89c4}\u{5219}\u{3002}\n- \u{5df2}\u{4fdd}\u{5b58}\u{6587}\u{7ae0}\u{7684}\u{6e32}\u{67d3}\u{7ed3}\u{679c}\u{5b58}\u{5728}\u{6570}\u{636e}\u{5e93}\u{91cc}\u{ff0c}\u{8981}\u{8ba9}\u{4e0a}\u{8ff0}\u{4fee}\u{590d}\u{5bf9}\u{65e7}\u{6587}\u{7ae0}\u{751f}\u{6548}\u{ff0c}\u{8bf7}\u{5728}\u{540e}\u{53f0}\u{300c}\u{6587}\u{7ae0} \u{2192} \u{66f4}\u{591a}\u{64cd}\u{4f5c} \u{2192} \u{91cd}\u{5efa}\u{5168}\u{90e8}\u{6e32}\u{67d3}\u{300d}\u{91cd}\u{5efa}\u{4e00}\u{6b21}\u{3002}\n\n## [1.3.3] - 2026-11-10\n\n\u{516c}\u{5f00}\u{9875} HTML \u{53ef}\u{7531} EdgeOne \u{8282}\u{70b9}\u{7f13}\u{5b58}\u{ff08}\u{540e}\u{53f0}\u{300c}\u{8fb9}\u{7f18}\u{7f13}\u{5b58}\u{65f6}\u{957f}\u{300d}\u{ff09}\u{ff0c}\u{5185}\u{5bb9}\u{53d8}\u{66f4}\u{4e0e}\u{53d1}\u{7248}\u{540e}\u{81ea}\u{52a8}\u{6e05}\u{9664}\u{ff1b}\u{67e5}\u{8be2}\u{4e32}\u{53d8}\u{4f53}\u{3001}\u{641c}\u{7d22}\u{4e0e} 404 \u{9875}\u{4e0d}\u{518d}\u{8fdb} CDN \u{7f13}\u{5b58}\u{ff1b}Feed \u{7f13}\u{5b58}\u{6e32}\u{67d3}\u{5e76}\u{538b}\u{7f29}\u{597d}\u{7684}\u{6210}\u{54c1}\u{ff1b}rustdoc \u{54c8}\u{5e0c}\u{6587}\u{4ef6}\u{957f}\u{671f}\u{7f13}\u{5b58}\u{ff1b}SSR \u{7f13}\u{5b58}\u{5355}\u{9875}\u{4e0a}\u{9650}\u{63d0}\u{5230} 2 MiB \u{5e76}\u{53ef}\u{5728}\u{540e}\u{53f0}\u{914d}\u{7f6e}\u{3002}\n\n### Added\n\n- **\u{516c}\u{5f00}\u{9875} HTML \u{53ef}\u{7531} CDN \u{7f13}\u{5b58}\u{ff0c}\u{5185}\u{5bb9}\u{53d8}\u{66f4}\u{540e}\u{81ea}\u{52a8}\u{6e05}\u{9664}**\u{ff1a}\u{7ecf} EdgeOne \u{8bbf}\u{95ee}\u{65f6} HTML \u{6bcf}\u{6b21}\u{56de}\u{6e90}\u{ff0c}TTFB \u{7ea6} 80\u{2013}130 ms\u{ff0c}\u{800c}\u{8282}\u{70b9}\u{547d}\u{4e2d}\u{53ea}\u{8981}\u{7ea6} 17 ms\u{3002}\u{540e}\u{53f0}\u{300c}\u{9875}\u{9762}\u{7f13}\u{5b58}\u{300d}\u{65b0}\u{589e}\u{300c}\u{8fb9}\u{7f18}\u{7f13}\u{5b58}\u{65f6}\u{957f}\u{300d}\u{ff08}\u{73af}\u{5883}\u{53d8}\u{91cf} `SSR_CACHE_EDGE_TTL_SECS` \u{9996}\u{6b21}\u{64ad}\u{79cd}\u{ff0c}\u{9ed8}\u{8ba4} 0 \u{4e0d}\u{542f}\u{7528}\u{ff0c}\u{9700}\u{91cd}\u{542f}\u{ff09}\u{ff1a}\u{5927}\u{4e8e} 0 \u{65f6}\u{9996}\u{9875}\u{3001}\u{5f52}\u{6863}\u{3001}\u{53cb}\u{94fe}\u{3001}\u{5173}\u{4e8e}\u{3001}\u{66f4}\u{65b0}\u{65e5}\u{5fd7}\u{4e0e}\u{6587}\u{7ae0}\u{3001}\u{5206}\u{9875}\u{3001}\u{6807}\u{7b7e}\u{9875}\u{7684}\u{533f}\u{540d}\u{54cd}\u{5e94}\u{6539}\u{4e3a} `public, max-age=0, s-maxage=<\u{79d2}>`\u{ff0c}\u{6d4f}\u{89c8}\u{5668}\u{4ecd}\u{6bcf}\u{6b21}\u{6821}\u{9a8c}\u{ff0c}CDN \u{6309}\u{8be5}\u{65f6}\u{957f}\u{7f13}\u{5b58}\u{3002}\u{914d}\u{7f6e} `EDGEONE_ZONE_ID`\u{3001}`TENCENTCLOUD_SECRET_ID`\u{3001}`TENCENTCLOUD_SECRET_KEY` \u{540e}\u{ff0c}\u{6e90}\u{7ad9} HTML \u{7f13}\u{5b58}\u{6bcf}\u{6b21}\u{5931}\u{6548}\u{ff08}\u{6587}\u{7ae0}\u{3001}\u{6807}\u{7b7e}\u{3001}\u{8bbe}\u{7f6e}\u{5199}\u{5165}\u{ff0c}\u{8de8}\u{5b9e}\u{4f8b}\u{901a}\u{77e5}\u{ff0c}\u{53d1}\u{7248}\u{542f}\u{52a8}\u{ff09}\u{90fd}\u{4f1a}\u{6e05}\u{9664} EdgeOne \u{4e0a}\u{7684}\u{8fd9}\u{4e9b}\u{76ee}\u{5f55}\u{4e0e}\u{9875}\u{9762}\u{ff1a}\u{9632}\u{6296} 2 \u{79d2}\u{5408}\u{5e76}\u{7a81}\u{53d1}\u{5199}\u{5165}\u{ff0c}30 \u{79d2}\u{540e}\u{518d}\u{6e05}\u{4e00}\u{6b21}\u{ff08}EdgeOne \u{5b8c}\u{6210}\u{4e00}\u{6b21}\u{6e05}\u{9664}\u{5b9e}\u{6d4b}\u{8981} 9\u{2013}20 \u{79d2}\u{ff09}\u{ff0c}\u{6321}\u{4f4f}\u{5199}\u{5165}\u{524d}\u{5df2}\u{5f00}\u{59cb}\u{6e32}\u{67d3}\u{3001}\u{6e05}\u{9664}\u{671f}\u{95f4}\u{624d}\u{8fd4}\u{56de}\u{7684}\u{65e7}\u{9875}\u{9762}\u{ff1b}\u{5931}\u{8d25}\u{91cd}\u{8bd5} 3 \u{6b21}\u{3002}\n\n### Changed\n\n- **\u{5176}\u{5b83} HTML \u{4e0d}\u{518d}\u{8fdb} CDN \u{7f13}\u{5b58}**\u{ff1a}\u{5e26}\u{67e5}\u{8be2}\u{4e32}\u{7684}\u{9875}\u{9762}\u{ff08}\u{5982}\u{5e26} `?utm_source=` \u{7684}\u{5206}\u{4eab}\u{94fe}\u{63a5}\u{ff09}\u{3001}\u{641c}\u{7d22}\u{7ed3}\u{679c}\u{548c} 404 \u{9875}\u{539f}\u{5148}\u{8fd4}\u{56de} `public, max-age=300, stale-while-revalidate=3600`\u{ff0c}EdgeOne \u{4f1a}\u{7f13}\u{5b58} 5 \u{5206}\u{949f}\u{ff0c}\u{6587}\u{7ae0}\u{4fee}\u{6539}\u{6216}\u{5220}\u{9664}\u{540e}\u{8fd9}\u{4e9b}\u{5730}\u{5740}\u{4ecd}\u{663e}\u{793a}\u{65e7}\u{5185}\u{5bb9}\u{ff0c}\u{6e90}\u{7ad9}\u{4e5f}\u{65e0}\u{4ece}\u{6e05}\u{9664}\u{3002}\u{73b0}\u{5728}\u{670d}\u{52a1}\u{7aef}\u{6e32}\u{67d3}\u{7684} HTML \u{53ea}\u{6709}\u{4e0a}\u{8ff0}\u{767d}\u{540d}\u{5355}\u{533f}\u{540d}\u{9875}\u{53ef}\u{88ab}\u{5171}\u{4eab}\u{7f13}\u{5b58}\u{ff0c}\u{5176}\u{4f59}\u{4e00}\u{5f8b} `public, no-cache`\u{ff1b}`/doc/` \u{4e0b}\u{7684}\u{9759}\u{6001} rustdoc \u{9875}\u{9762}\u{4e0d}\u{53d8}\u{3002}\n- **rustdoc \u{54c8}\u{5e0c}\u{6587}\u{4ef6}\u{957f}\u{671f}\u{7f13}\u{5b58}**\u{ff1a}`/doc/static.files/<\u{540d}\u{5b57}>-<8 \u{4f4d}\u{54c8}\u{5e0c}>.*`\u{ff08}\u{6837}\u{5f0f}\u{3001}\u{811a}\u{672c}\u{3001}\u{5b57}\u{4f53}\u{ff09}\u{4e0e} `/doc/search.index/<\u{5217}>/<\u{54c8}\u{5e0c}>.js` \u{6587}\u{4ef6}\u{540d}\u{5e26}\u{5185}\u{5bb9}\u{54c8}\u{5e0c}\u{ff0c}\u{5374}\u{6309}\u{56fa}\u{5b9a}\u{8def}\u{5f84}\u{5904}\u{7406}\u{ff1a}\u{6837}\u{5f0f}\u{548c}\u{811a}\u{672c}\u{662f} `no-cache`\u{ff0c}\u{6bcf}\u{6b21}\u{90fd}\u{7ecf} CDN \u{56de}\u{6e90}\u{6821}\u{9a8c}\u{ff08}70\u{2013}650 ms\u{ff09}\u{ff0c}\u{5b57}\u{4f53}\u{53ea}\u{7f13}\u{5b58} 5 \u{5206}\u{949f}\u{ff0c}\u{800c} `/doc/` \u{5360}\u{4e86} CDN \u{51fa}\u{6d41}\u{91cf}\u{7684}\u{5927}\u{5934}\u{3002}\u{73b0}\u{5728}\u{8fd9}\u{4e9b}\u{6587}\u{4ef6}\u{8fd4}\u{56de} `public, max-age=31536000, immutable`\u{ff1b}`search.index/root.js`\u{3001}`doc-shell.js`\u{3001}`theme.css` \u{7b49}\u{56fa}\u{5b9a}\u{6587}\u{4ef6}\u{540d}\u{4e0d}\u{53d8}\u{3002}\u{540c}\u{65f6} immutable \u{53ea}\u{53d1}\u{7ed9}\u{6210}\u{529f}\u{54cd}\u{5e94}\u{ff1a}\u{54c8}\u{5e0c}\u{6587}\u{4ef6}\u{540d}\u{7684} 404\u{ff08}\u{542b} `/pkg/` \u{5206}\u{5305}\u{ff09}\u{6539}\u{4e3a} `no-cache`\u{ff0c}\u{4e0d}\u{518d}\u{8ba9}\u{6d4f}\u{89c8}\u{5668}\u{548c} CDN \u{628a}\u{300c}\u{4e0d}\u{5b58}\u{5728}\u{300d}\u{8bb0}\u{4e00}\u{5e74}\u{3002}\n- **Feed \u{7f13}\u{5b58}\u{6210}\u{54c1}\u{5e76}\u{53bb}\u{6389}\u{4ee3}\u{7801}\u{9ad8}\u{4eae}\u{6807}\u{8bb0}**\u{ff1a}`/feed.xml`\u{3001}`/feed.json` \u{539f}\u{5148}\u{6bcf}\u{4e2a}\u{8bf7}\u{6c42}\u{90fd}\u{628a} 20 \u{7bc7}\u{5168}\u{6587}\u{91cd}\u{65b0}\u{6e32}\u{67d3}\u{4e00}\u{904d}\u{518d}\u{73b0}\u{538b}\u{ff0c}\u{7ebf}\u{4e0a}\u{672a}\u{538b}\u{7f29} 6.2 MB\u{ff0c}\u{6e90}\u{7ad9}\u{6bcf}\u{6b21} 225\u{2013}270 ms\u{3002}\u{73b0}\u{5728}\u{7f13}\u{5b58}\u{7684}\u{662f}\u{4e24}\u{79cd}\u{683c}\u{5f0f}\u{7684}\u{6210}\u{54c1}\u{8fde}\u{540c}\u{5404}\u{542f}\u{7528}\u{7b97}\u{6cd5}\u{7684}\u{538b}\u{7f29}\u{7ed3}\u{679c}\u{ff0c}\u{547d}\u{4e2d}\u{6309} `Accept-Encoding` \u{76f4}\u{63a5}\u{8fd4}\u{56de}\u{ff08}\u{6570}\u{5341}\u{5fae}\u{79d2}\u{ff09}\u{ff1b}\u{5e26} `ETag` \u{5e76}\u{652f}\u{6301} `If-None-Match`\u{ff0c}`lastBuildDate` \u{6539}\u{53d6}\u{6700}\u{8fd1}\u{4e00}\u{7bc7}\u{7684}\u{66f4}\u{65b0}\u{65f6}\u{95f4}\u{ff0c}\u{5185}\u{5bb9}\u{6ca1}\u{53d8}\u{65f6}\u{9605}\u{8bfb}\u{5668}\u{62ff}\u{5230} 304\u{3002}`<pre>` \u{91cc}\u{7684}\u{9ad8}\u{4eae} `<span>` \u{5728}\u{9605}\u{8bfb}\u{5668}\u{4e2d}\u{6ca1}\u{6709}\u{6837}\u{5f0f}\u{ff0c}\u{4e00}\u{5e76}\u{53bb}\u{6389}\u{ff0c}RSS \u{672a}\u{538b}\u{7f29}\u{4f53}\u{79ef}\u{5c11}\u{7ea6}\u{4e09}\u{6210}\u{ff0c}brotli \u{540e} 422 \u{2192} 367 KB\u{3002}\n- **SSR \u{7f13}\u{5b58}\u{5355}\u{9875}\u{4e0a}\u{9650}\u{63d0}\u{5230} 2 MiB\u{ff0c}\u{5e76}\u{53ef}\u{914d}\u{7f6e}**\u{ff1a}\u{56fe}\u{8868}\u{591a}\u{7684}\u{957f}\u{6587}\u{6e32}\u{67d3}\u{540e}\u{8d85}\u{8fc7} 1 MiB\u{ff08}\u{7ebf}\u{4e0a}\u{6700}\u{957f}\u{4e00}\u{7bc7} 1.14 MB\u{ff09}\u{ff0c}\u{8fdb}\u{4e0d}\u{4e86}\u{7f13}\u{5b58}\u{ff0c}\u{6bcf}\u{4e2a}\u{8bf7}\u{6c42}\u{90fd}\u{5b8c}\u{6574} SSR \u{518d}\u{73b0}\u{538b}\u{ff08}\u{7ea6} 37 ms\u{ff09}\u{3002}\u{4e0a}\u{9650}\u{6539}\u{4e3a} 2 MiB\u{ff0c}\u{603b}\u{91cf}\u{4ecd}\u{53d7} 32 MiB \u{7ea6}\u{675f}\u{3002}\u{4e0a}\u{9650}\u{4e0d}\u{518d}\u{5199}\u{6b7b}\u{ff1a}\u{540e}\u{53f0}\u{8bbe}\u{7f6e}\u{65b0}\u{589e}\u{300c}\u{9875}\u{9762}\u{7f13}\u{5b58}\u{300d}\u{5206}\u{533a}\u{ff08}64 KB\u{2013}32 MiB\u{ff09}\u{ff0c}\u{73af}\u{5883}\u{53d8}\u{91cf} `SSR_CACHE_MAX_PAGE_BYTES` \u{53ea}\u{5728}\u{9996}\u{6b21}\u{90e8}\u{7f72}\u{65f6}\u{64ad}\u{79cd}\u{ff0c}\u{4e4b}\u{540e}\u{4ee5}\u{9762}\u{677f}\u{503c}\u{4e3a}\u{51c6}\u{ff1b}\u{4fee}\u{6539}\u{540e}\u{9700}\u{91cd}\u{542f}\u{751f}\u{6548}\u{3002}\n\n## [1.3.2] - 2026-11-05\n\n\u{670d}\u{52a1}\u{7aef}\u{9996}\u{5c4f}\u{6027}\u{80fd}\u{ff1a}SSR \u{7f13}\u{5b58}\u{9875}\u{9762}\u{5199}\u{5165}\u{540e}\u{9884}\u{538b}\u{7f29}\u{4e00}\u{6b21}\u{ff0c}\u{52a8}\u{6001}\u{538b}\u{7f29}\u{6309}\u{6b63}\u{6587}\u{957f}\u{5ea6}\u{9009} brotli \u{7a97}\u{53e3}\u{ff0c}\u{6587}\u{7ae0}\u{9875}\u{6c34}\u{5408}\u{6570}\u{636e}\u{4e0d}\u{518d}\u{91cd}\u{590d}\u{6b63}\u{6587}\u{ff1b}\u{65b0}\u{589e} Markdown \u{6e32}\u{67d3}\u{4e0e} HTTP \u{57fa}\u{51c6}\u{ff1b}\u{4fee}\u{590d}\u{8bc4}\u{8bba}\u{706f}\u{7bb1}\u{6536}\u{5f55}\u{5934}\u{50cf}\u{3001}\u{8868}\u{683c}\u{7a84}\u{5217}\u{4e2d}\u{6587}\u{9010}\u{5b57}\u{6298}\u{884c}\u{ff1b}CI \u{4e0e}\u{53d1}\u{5e03}\u{6d41}\u{7a0b}\u{8c03}\u{6574}\u{3002}\n\n### Added\n\n- **\u{6027}\u{80fd}\u{57fa}\u{51c6}**\u{ff1a}`make bench-markdown` \u{7528} criterion \u{6d4b} `render_markdown_enhanced`\u{ff08}\u{8bed}\u{6599}\u{4e3a} 4 \u{7bc7}\u{7ebf}\u{4e0a}\u{6587}\u{7ae0}\u{ff0c}\u{4f4d}\u{4e8e} `benches/fixtures/`\u{ff0c}`BENCH_ARGS=\'--save-baseline base\'` / `\'--baseline base\'` \u{505a}\u{524d}\u{540e}\u{5bf9}\u{6bd4}\u{ff09}\u{ff1b}`make bench-http`\u{ff08}`scripts/bench-http.ts`\u{ff09}\u{7528}\u{4e00}\u{6b21}\u{6027} PostgreSQL \u{62c9}\u{8d77} release \u{4ea7}\u{7269}\u{ff0c}oha \u{4ee5}\u{56fa}\u{5b9a}\u{5230}\u{8fbe}\u{7387}\u{538b}\u{9996}\u{9875}\u{3001}\u{5f52}\u{6863}\u{4e0e}\u{6587}\u{7ae0}\u{9875}\u{ff0c}SSR \u{7f13}\u{5b58}\u{547d}\u{4e2d}\u{4e0e}\u{672a}\u{547d}\u{4e2d}\u{5206}\u{5f00}\u{6d4b}\u{ff0c}\u{652f}\u{6301} `BENCH_TARGETS=A,B` \u{540c}\u{673a} ABBA \u{4ea4}\u{66ff}\u{5bf9}\u{6bd4}\u{ff08}\u{6bcf}\u{8f6e}\u{91cd}\u{542f}\u{670d}\u{52a1}\u{7aef}\u{ff09}\u{5e76}\u{7ed9}\u{51fa}\u{7cbe}\u{786e}\u{7f6e}\u{6362}\u{68c0}\u{9a8c}\u{7684}\u{663e}\u{8457}\u{6027}\u{5224}\u{5b9a}\u{3002}\u{6e32}\u{67d3}\u{540e}\u{8d85}\u{8fc7} 1 MiB \u{7684}\u{6587}\u{7ae0}\u{9875}\u{4e0d}\u{8fdb} SSR \u{7f13}\u{5b58}\u{ff0c}\u{53ea}\u{6d4b}\u{672a}\u{547d}\u{4e2d}\u{573a}\u{666f}\u{3002}\n\n### Changed\n\n- **SSR \u{7f13}\u{5b58}\u{547d}\u{4e2d}\u{4e0d}\u{518d}\u{6bcf}\u{6b21}\u{73b0}\u{538b}**\u{ff1a}\u{538b}\u{7f29}\u{5c42}\u{5728} HTML \u{7f13}\u{5b58}\u{5916}\u{4fa7}\u{ff0c}\u{7f13}\u{5b58}\u{547d}\u{4e2d}\u{7684}\u{9875}\u{9762}\u{539f}\u{5148}\u{6bcf}\u{4e2a}\u{8bf7}\u{6c42}\u{90fd}\u{8981}\u{505a}\u{4e00}\u{904d} brotli 7\u{ff0c}\u{670d}\u{52a1}\u{7aef} CPU \u{6709} 98% \u{82b1}\u{5728}\u{8fd9}\u{91cc}\u{3002}\u{73b0}\u{5728}\u{9875}\u{9762}\u{5199}\u{5165}\u{7f13}\u{5b58}\u{540e}\u{ff0c}\u{5728}\u{963b}\u{585e}\u{7ebf}\u{7a0b}\u{6c60}\u{6309} `COMPRESSION_ALGORITHMS` \u{542f}\u{7528}\u{7684}\u{7b97}\u{6cd5}\u{9ad8}\u{6863}\u{538b}\u{7f29}\u{4e00}\u{6b21}\u{ff08}brotli 11\u{3001}gzip 9\u{ff09}\u{ff0c}\u{547d}\u{4e2d}\u{65f6}\u{6309} `Accept-Encoding` \u{76f4}\u{63a5}\u{8fd4}\u{56de}\u{538b}\u{7f29}\u{7ed3}\u{679c}\u{5e76}\u{5e26} `Vary: Accept-Encoding`\u{ff1b}\u{538b}\u{7f29}\u{5b8c}\u{6210}\u{524d}\u{7684}\u{547d}\u{4e2d}\u{4ecd}\u{8d70}\u{73b0}\u{538b}\u{3002}\u{534f}\u{5546}\u{89c4}\u{5219}\u{ff08}q \u{503c}\u{3001}`*`\u{3001}`identity;q=0` \u{56de} 406\u{ff09}\u{4e0e}\u{538b}\u{7f29}\u{5c42}\u{4e00}\u{81f4}\u{ff0c}\u{62bd}\u{5230}\u{65b0}\u{7684} `compression` \u{6a21}\u{5757}\u{3002}\u{5e76}\u{53d1}\u{672a}\u{547d}\u{4e2d}\u{5199}\u{5165}\u{76f8}\u{540c}\u{5185}\u{5bb9}\u{65f6}\u{53ea}\u{538b}\u{7f29}\u{4e00}\u{6b21}\u{ff1b}\u{9875}\u{9762}\u{5931}\u{6548}\u{6216}\u{88ab}\u{66ff}\u{6362}\u{540e}\u{ff0c}\u{5728}\u{9014}\u{7684}\u{538b}\u{7f29}\u{7ed3}\u{679c}\u{4e22}\u{5f03}\u{3002}\u{540c}\u{673a} A/B\u{ff08}`make bench-http`\u{ff0c}\u{56fa}\u{5b9a}\u{5230}\u{8fbe}\u{7387}\u{ff09}\u{ff1a}\u{547d}\u{4e2d} p50 \u{4ece} 1.1\u{2013}4.3 ms \u{964d}\u{5230} 0.06 ms\u{ff0c}\u{95ed}\u{73af}\u{5bb9}\u{91cf}\u{4ece} 680\u{2013}3,400 rps \u{5347}\u{5230}\u{7ea6} 16\u{2013}17 \u{4e07} rps\u{ff08}\u{538b}\u{6d4b}\u{5ba2}\u{6237}\u{7aef}\u{5df2}\u{6210}\u{4e3a}\u{74f6}\u{9888}\u{ff09}\u{ff0c}brotli \u{54cd}\u{5e94}\u{5c0f} 7\u{2013}13%\u{3002}\n- **\u{52a8}\u{6001}\u{538b}\u{7f29}\u{6309}\u{6b63}\u{6587}\u{957f}\u{5ea6}\u{9009} brotli \u{7a97}\u{53e3}**\u{ff1a}tower-http \u{7684}\u{538b}\u{7f29}\u{5c42}\u{53ea}\u{80fd}\u{8bbe}\u{8d28}\u{91cf}\u{ff0c}brotli \u{56fa}\u{5b9a}\u{7528} 4 MiB \u{7a97}\u{53e3}\u{ff0c}\u{8d85}\u{8fc7}\u{7ea6} 64 KB \u{7684}\u{9875}\u{9762}\u{6bcf}\u{4e2a}\u{8bf7}\u{6c42}\u{90fd}\u{8981}\u{5206}\u{914d}\u{5e76}\u{6e05}\u{96f6} 4 MiB \u{73af}\u{5f62}\u{7f13}\u{51b2}\u{533a}\u{3002}\u{73b0}\u{5728}\u{7531} `compression::compress` \u{4e2d}\u{95f4}\u{4ef6}\u{63a5}\u{7ba1}\u{52a8}\u{6001}\u{538b}\u{7f29}\u{ff1a}\u{534f}\u{5546}\u{4e0e}\u{8df3}\u{8fc7}\u{89c4}\u{5219}\u{ff08}\u{56fe}\u{7247}\u{9664} SVG\u{3001}gRPC\u{3001}SSE\u{3001}32 \u{5b57}\u{8282}\u{4ee5}\u{4e0b}\u{3001}\u{5df2}\u{5e26} `Content-Encoding`/`Content-Range`\u{ff0c}\u{62d2}\u{7edd} identity \u{65f6}\u{56de} 406\u{ff09}\u{4e0e}\u{539f}\u{538b}\u{7f29}\u{5c42}\u{4e00}\u{81f4}\u{ff1b}\u{957f}\u{5ea6}\u{672a}\u{77e5}\u{7684}\u{6b63}\u{6587}\u{5148}\u{7f13}\u{51b2}\u{ff0c}\u{4e0a}\u{6e38}\u{4e00}\u{53e3}\u{6c14}\u{7ed9}\u{5b8c}\u{4e14}\u{4e0d}\u{8d85}\u{8fc7} 1 MiB \u{65f6}\u{53d6}\u{521a}\u{597d}\u{5bb9}\u{7eb3}\u{5168}\u{6587}\u{7684}\u{7a97}\u{53e3}\u{ff08}\u{4e0b}\u{9650} lgwin 18\u{ff1a}q7 \u{5728} 16 \u{65f6}\u{6362}\u{7528}\u{53e6}\u{4e00}\u{79cd}\u{54c8}\u{5e0c}\u{ff0c}\u{53cd}\u{800c}\u{6162} 4 \u{500d}\u{ff09}\u{3002}\u{4e0a}\u{6e38}\u{4e2d}\u{9014}\u{6682}\u{505c}\u{ff08}\u{6d41}\u{5f0f} SSR\u{ff09}\u{65f6}\u{4e0e}\u{539f}\u{6765}\u{4e00}\u{6837}\u{5148} flush \u{5df2}\u{6536}\u{5230}\u{7684}\u{90e8}\u{5206}\u{ff0c}\u{4e4b}\u{540e}\u{6309} 4 MiB \u{7a97}\u{53e3}\u{6d41}\u{5f0f}\u{538b}\u{7f29}\u{3002}`tower-http` \u{53bb}\u{6389} `compression-full`\u{ff0c}\u{4e0d}\u{518d}\u{4f9d}\u{8d56} `async-compression`\u{3002}\u{540c}\u{673a} A/B\u{ff08}\u{7f13}\u{5b58}\u{672a}\u{547d}\u{4e2d}\u{ff09}\u{ff1a}110\u{2013}220 KB \u{7684}\u{6587}\u{7ae0}\u{9875} p50 \u{2212}12%\u{ff5e}\u{2212}16%\u{3001}p99 \u{2212}14%\u{ff5e}\u{2212}20%\u{ff0c}\u{9996}\u{9875}\u{3001}\u{5f52}\u{6863}\u{ff08}\u{6d41}\u{5f0f}\u{ff09}\u{4e0e}\u{8d85}\u{8fc7} 1 MiB \u{7684}\u{957f}\u{6587}\u{65e0}\u{663e}\u{8457}\u{53d8}\u{5316}\u{ff0c}\u{54cd}\u{5e94}\u{5927}\u{5c0f}\u{4e0d}\u{53d8}\u{3002}q7 \u{6bcf}\u{6b21}\u{8fd8}\u{8981}\u{6e05}\u{96f6}\u{7ea6} 8 MiB \u{7684}\u{5339}\u{914d}\u{54c8}\u{5e0c}\u{8868}\u{ff0c}\u{8fd9}\u{90e8}\u{5206}\u{4e0e}\u{7a97}\u{53e3}\u{65e0}\u{5173}\u{ff0c}\u{53ea}\u{80fd}\u{9760}\u{964d}\u{4f4e}\u{8d28}\u{91cf}\u{51cf}\u{5c11}\u{3002}\n- **\u{6587}\u{7ae0}\u{9875}\u{6c34}\u{5408}\u{6570}\u{636e}\u{4e0d}\u{518d}\u{91cd}\u{590d}\u{4e00}\u{904d}\u{6b63}\u{6587}**\u{ff1a}\u{8def}\u{7531}\u{6570}\u{636e}\u{539f}\u{5148}\u{628a}\u{6574}\u{4e2a} `PublicPostResponse` \u{7f16}\u{6210} JSON \u{5199}\u{8fdb} `__RESOLVED_RESOURCES`\u{ff0c}\u{6b63}\u{6587}\u{4e0e}\u{76ee}\u{5f55}\u{5728}\u{9875}\u{9762}\u{91cc}\u{51fa}\u{73b0}\u{4e24}\u{6b21}\u{ff08}\u{518d}\u{7ecf} `{:?}` \u{8f6c}\u{4e49}\u{ff0c}1.08 MB \u{7684}\u{6b63}\u{6587}\u{53d8}\u{6210} 1.31 MB \u{6c34}\u{5408}\u{6570}\u{636e}\u{ff09}\u{ff0c}\u{670d}\u{52a1}\u{7aef}\u{8fd8}\u{8981}\u{628a}\u{521a}\u{7f16}\u{7801}\u{7684} JSON \u{89e3}\u{6790}\u{56de}\u{6765}\u{624d}\u{80fd}\u{6e32}\u{67d3}\u{3002}\u{73b0}\u{5728} SSR \u{89c6}\u{56fe}\u{76f4}\u{63a5}\u{514b}\u{9686}\u{53d6}\u{6570}\u{7ed3}\u{679c}\u{ff08}`RawJson` \u{5e26}\u{7c7b}\u{578b}\u{64e6}\u{9664}\u{7684}\u{539f}\u{503c}\u{ff09}\u{ff0c}JSON \u{53ea}\u{7528}\u{4e8e}\u{6c34}\u{5408}\u{ff1b}`PageJson::with_hydration` \u{8ba9}\u{6587}\u{7ae0}\u{9875}\u{7684}\u{6c34}\u{5408}\u{6570}\u{636e}\u{53ea}\u{5e26}\u{6b63}\u{6587}\u{9aa8}\u{67b6}\u{ff1a}\u{666e}\u{901a} HTML \u{6bb5}\u{6362}\u{6210} `<!---->` \u{5360}\u{4f4d}\u{ff0c}\u{53ef}\u{8fd0}\u{884c}\u{4ee3}\u{7801}\u{5757}\u{539f}\u{6837}\u{4fdd}\u{7559}\u{ff0c}\u{76ee}\u{5f55}\u{6362}\u{6210}\u{5360}\u{4f4d}\u{ff08}`inner_html` \u{6c34}\u{5408}\u{65f6}\u{4e0d}\u{6539}\u{5199}\u{670d}\u{52a1}\u{7aef} DOM\u{ff09}\u{ff0c}\u{5ba2}\u{6237}\u{7aef}\u{636e}\u{6b64}\u{5efa}\u{51fa}\u{4e0e} SSR \u{76f8}\u{540c}\u{7684}\u{7ec4}\u{4ef6}\u{6811}\u{3002}SPA \u{5bfc}\u{822a}\u{4e0e}\u{60ac}\u{505c}\u{9884}\u{53d6}\u{7167}\u{65e7}\u{62ff}\u{5b8c}\u{6574}\u{6570}\u{636e}\u{3002}\u{540c}\u{673a} A/B\u{ff08}\u{7f13}\u{5b58}\u{672a}\u{547d}\u{4e2d}\u{ff09}\u{ff1a}\u{6587}\u{7ae0}\u{9875} p50 \u{2212}33%\u{ff5e}\u{2212}48%\u{ff0c}HTML 61 KB\u{ff5e}1.16 MB \u{7684}\u{9875}\u{9762}\u{4f53}\u{79ef}\u{7ea6}\u{51cf}\u{534a}\u{ff0c}brotli \u{4f20}\u{8f93}\u{5c0f} 13%\u{ff5e}31%\u{ff1b}math-heavy \u{4ece} 1.26 MB \u{964d}\u{5230} 0.72 MB\u{ff0c}\u{56de}\u{5230} SSR \u{7f13}\u{5b58}\u{7684} 1 MiB \u{4e0a}\u{9650}\u{4e4b}\u{5185}\u{3002}\n\n### Fixed\n\n- **\u{8bc4}\u{8bba}\u{56fe}\u{7247}\u{706f}\u{7bb1}\u{6536}\u{5f55}\u{5934}\u{50cf}**\u{ff1a}\u{8bc4}\u{8bba}\u{533a}\u{7684}\u{706f}\u{7bb1}\u{628a}\u{8bc4}\u{8bba}\u{8005}\u{5934}\u{50cf}\u{4e5f}\u{5f53}\u{4f5c}\u{53ef}\u{653e}\u{5927}\u{7684}\u{56fe}\u{7247}\u{6536}\u{8fdb}\u{56fe}\u{96c6}\u{3002}\u{73b0}\u{5728}\u{53ea}\u{6536}\u{5f55}\u{8bc4}\u{8bba}\u{6b63}\u{6587}\u{91cc}\u{7684}\u{56fe}\u{7247}\u{3002}\n- **\u{6587}\u{7ae0}\u{8868}\u{683c}\u{7a84}\u{5217}\u{91cc}\u{7684}\u{4e2d}\u{6587}\u{88ab}\u{9010}\u{5b57}\u{6298}\u{884c}**\u{ff1a}\u{8868}\u{683c}\u{5bbd}\u{4e8e}\u{6b63}\u{6587}\u{5217}\u{800c}\u{6a2a}\u{5411}\u{6eda}\u{52a8}\u{65f6}\u{ff0c}\u{5217}\u{7f29}\u{5230}\u{6700}\u{5c0f}\u{5185}\u{5bb9}\u{5bbd}\u{5ea6}\u{ff0c}`th` \u{4e3a} `nowrap` \u{4e14}\u{5b57}\u{53f7}\u{5c0f}\u{4e8e} `td`\u{ff0c}\u{5bfc}\u{81f4}\u{9996}\u{5217}\u{300c}\u{9996}\u{9875}\u{300d}\u{4e4b}\u{7c7b}\u{77ed}\u{8bcd}\u{88ab}\u{6324}\u{6210}\u{4e00}\u{5b57}\u{4e00}\u{884c}\u{3002}`.md-content td` \u{73b0}\u{5728}\u{8bbe} `min-width: 6em`\u{ff0c}\u{81f3}\u{5c11}\u{5bb9}\u{7eb3} 4 \u{4e2a}\u{5b57}\u{3002}\n- **\u{53d1}\u{5e03} CI \u{88ab} rustdoc \u{65ad}\u{94fe}\u{963b}\u{65ad}**\u{ff1a}`PostMeta` \u{6539}\u{4e3a}\u{6587}\u{7ae0}\u{6a21}\u{5757}\u{5185}\u{90e8}\u{7ec4}\u{4ef6}\u{540e}\u{ff0c}`PostHeaderData` \u{7684}\u{6587}\u{6863}\u{4ecd}\u{5c1d}\u{8bd5}\u{94fe}\u{63a5}\u{8be5}\u{7b26}\u{53f7}\u{ff0c}\u{89e6}\u{53d1}\u{53d1}\u{5e03}\u{6784}\u{5efa}\u{7684}\u{96f6}\u{544a}\u{8b66}\u{95e8}\u{7981}\u{3002}\u{73b0}\u{5728}\u{53ea}\u{94fe}\u{63a5}\u{516c}\u{5f00}\u{7684} `PostHeader`\u{ff0c}\u{5185}\u{90e8}\u{5143}\u{4fe1}\u{606f}\u{7ec4}\u{4ef6}\u{6539}\u{7528}\u{6587}\u{5b57}\u{8bf4}\u{660e}\u{ff1b}\u{95e8}\u{7981}\u{4fdd}\u{6301}\u{4e0d}\u{53d8}\u{3002}\n\n## [1.3.1] - 2026-11-02\n\n\u{7ad9}\u{70b9}\u{7a7a}\u{767d}\u{5904}\u{52a0}\u{5165}\u{5409}\u{7965}\u{7269}\u{50cf}\u{7d20}\u{8d34}\u{56fe}\u{ff1b}\u{706f}\u{7bb1}\u{6253}\u{5f00}/\u{5173}\u{95ed}\u{52a8}\u{753b}\u{6539}\u{4e3a} medium-zoom \u{98ce}\u{683c}\u{ff0c}\u{6eda}\u{52a8}\u{5173}\u{95ed}\u{9010}\u{5e27}\u{8ddf}\u{624b}\u{ff1b}\u{7ec4}\u{4ef6}\u{56fe}\u{9274}\u{9996}\u{5c4f}\u{4e0d}\u{518d}\u{6296}\u{52a8}\u{ff1b}Rust \u{4f9d}\u{8d56}\u{5347}\u{7ea7}\u{ff08}leptos 0.8.23 \u{7b49}\u{ff09}\u{3002}\n\n### Added\n\n- **\u{5409}\u{7965}\u{7269}\u{50cf}\u{7d20}\u{8d34}\u{56fe}**\u{ff1a}\u{5728}\u{7ad9}\u{70b9}\u{7a7a}\u{767d}\u{5904}\u{653e}\u{4e0a}\u{6a59}\u{53d1}\u{5973}\u{5b69}\u{7684} 11 \u{79cd}\u{8868}\u{60c5}\u{ff08}`public/images/mascot/*.webp`\u{ff0c}256\u{d7}256\u{ff09}\u{ff0c}\u{901a}\u{8fc7} `components::mascot::Mascot` \u{679a}\u{4e3e}\u{8c03}\u{7528}\u{ff0c}\u{7eaf}\u{88c5}\u{9970}\u{3001}\u{5bf9}\u{8bfb}\u{5c4f}\u{9690}\u{85cf}\u{3002}\u{9996}\u{9875}\u{5f00}\u{573a}\u{ff08}\u{6325}\u{624b}\u{ff09}\u{3001}404 \u{4e0e}\u{65e0}\u{641c}\u{7d22}\u{7ed3}\u{679c}\u{ff08}\u{614c}\u{5f20}\u{ff0c}\u{641c}\u{7d22}\u{9875}\u{4e0e}\u{547d}\u{4ee4}\u{9762}\u{677f}\u{5171}\u{7528}\u{ff09}\u{3001}\u{8bc4}\u{8bba}\u{533a}\u{65e0}\u{8bc4}\u{8bba}\u{ff08}\u{7231}\u{5fc3}\u{ff09}\u{3001}\u{53ea}\u{6709}\u{4e00}\u{4fa7}\u{76f8}\u{90bb}\u{6587}\u{7ae0}\u{65f6}\u{7a7a}\u{7740}\u{7684}\u{90a3}\u{683c}\u{ff08}\u{5750}\u{7740}\u{ff09}\u{3001}\u{767b}\u{5f55}\u{9875}\u{ff08}\u{597d}\u{5947}\u{ff0c}\u{767b}\u{5f55}\u{51fa}\u{9519}\u{65f6}\u{6362}\u{6210}\u{751f}\u{6c14}\u{ff09}\u{ff1b}`EmptyState` \u{65b0}\u{589e} `mascot` \u{53c2}\u{6570}\u{ff0c}\u{52a0}\u{8f7d}\u{5931}\u{8d25}\u{ff08}\u{54ed}\u{ff09}\u{3001}\u{7ffb}\u{5230}\u{6700}\u{540e}\u{ff08}\u{72af}\u{56f0}\u{ff09}\u{3001}\u{65e0}\u{7b14}\u{8bb0}/\u{65e0}\u{6807}\u{7b7e}\u{6587}\u{7ae0}\u{ff08}\u{6253}\u{76f9}\u{ff09}\u{3001}\u{540e}\u{53f0}\u{65e0}\u{5f85}\u{5ba1}\u{8bc4}\u{8bba}\u{ff08}\u{548c}\u{5e73}\u{ff09}\u{3001}\u{56de}\u{6536}\u{7ad9}\u{4e3a}\u{7a7a}\u{ff08}\u{6ee1}\u{8db3}\u{ff09}\u{3001}\u{7d20}\u{6750}\u{5e93}\u{4e3a}\u{7a7a}\u{ff08}\u{5750}\u{7740}\u{ff09}\u{6539}\u{7528}\u{8d34}\u{56fe}\u{66ff}\u{6362}\u{7ebf}\u{6761}\u{56fe}\u{6807}\u{3002}\n- **\u{6539}\u{5bc6}\u{65f6}\u{53ef}\u{9009}\u{540a}\u{9500}\u{5168}\u{90e8} MCP \u{4ee4}\u{724c}**\u{ff1a}\u{4e2a}\u{4eba}\u{8d44}\u{6599}\u{9875}\u{7684}\u{300c}\u{4fee}\u{6539}\u{5bc6}\u{7801}\u{300d}\u{65b0}\u{589e}\u{300c}\u{540c}\u{65f6}\u{540a}\u{9500}\u{6211}\u{7684}\u{5168}\u{90e8} MCP \u{4ee4}\u{724c}\u{300d}\u{ff0c}\u{9ed8}\u{8ba4}\u{4e0d}\u{52fe}\u{9009}\u{3002}MCP \u{4ee4}\u{724c}\u{662f}\u{6709}\u{72ec}\u{7acb}\u{8fc7}\u{671f}\u{4e0e}\u{540a}\u{9500}\u{7684}\u{957f}\u{671f}\u{51ed}\u{636e}\u{ff0c}\u{6539}\u{5bc6}\u{9ed8}\u{8ba4}\u{4e0d}\u{5f71}\u{54cd} AI \u{5ba2}\u{6237}\u{7aef}\u{ff1b}\u{6000}\u{7591}\u{5bc6}\u{7801}\u{6cc4}\u{9732}\u{ff08}\u{6cc4}\u{9732}\u{671f}\u{95f4}\u{53ef}\u{80fd}\u{88ab}\u{7b7e}\u{51fa}\u{4ee4}\u{724c}\u{ff09}\u{65f6}\u{52fe}\u{9009}\u{ff0c}\u{4e0e}\u{6539}\u{5bc6}\u{5728}\u{540c}\u{4e00}\u{4e8b}\u{52a1}\u{5185}\u{628a}\u{672c}\u{4eba}\u{5168}\u{90e8}\u{672a}\u{540a}\u{9500}\u{4ee4}\u{724c}\u{6807}\u{4e3a}\u{5df2}\u{540a}\u{9500}\u{ff0c}\u{4ee4}\u{724c}\u{5217}\u{8868}\u{5982}\u{5b9e}\u{663e}\u{793a}\u{ff0c}\u{6210}\u{529f}\u{63d0}\u{793a}\u{5e26}\u{540a}\u{9500}\u{6570}\u{91cf}\u{3002}\n\n### Changed\n\n- **\u{7ec4}\u{4ef6}\u{56fe}\u{9274}\u{300c}\u{6587}\u{7ae0}\u{300d}\u{5206}\u{7ec4}\u{7cbe}\u{7b80}**\u{ff1a}\u{9762}\u{5305}\u{5c51} `Breadcrumbs`\u{3001}\u{6587}\u{7ae0}\u{5143}\u{4fe1}\u{606f} `PostMeta`\u{3001}\u{76f8}\u{90bb}\u{6587}\u{7ae0}\u{5bfc}\u{822a} `PostNavLinks` \u{53ea}\u{662f}\u{9875}\u{7709}\u{3001}\u{9875}\u{811a}\u{7684}\u{7ec4}\u{6210}\u{90e8}\u{5206}\u{ff0c}\u{6539}\u{4e3a} `components::post` \u{6a21}\u{5757}\u{5185}\u{53ef}\u{89c1}\u{ff0c}\u{5e76}\u{4ece}\u{56fe}\u{9274}\u{4e2d}\u{79fb}\u{9664}\u{ff08}\u{5206}\u{7ec4} 8 \u{2192} 5 \u{9879}\u{ff0c}\u{300c}\u{9762}\u{5305}\u{5c51}\u{300d}\u{4e0d}\u{518d}\u{4e0e}\u{901a}\u{7528} `Breadcrumb` \u{91cd}\u{540d}\u{ff09}\u{3002}\u{300c}\u{6587}\u{7ae0}\u{9875}\u{5934}\u{300d}\u{65b0}\u{589e}\u{65e0}\u{6807}\u{7b7e}\u{6837}\u{4f8b}\u{ff08}\u{9762}\u{5305}\u{5c51}\u{53ea}\u{5269}\u{300c}\u{6587}\u{7ae0}\u{300d}\u{ff09}\u{ff0c}\u{8bf4}\u{660e}\u{5e76}\u{5165}\u{9762}\u{5305}\u{5c51}\u{4e0e}\u{5143}\u{4fe1}\u{606f}\u{89c4}\u{5219}\u{ff1b}\u{300c}\u{6587}\u{7ae0}\u{9875}\u{811a}\u{300d}\u{63a5}\u{6536}\u{5355}\u{4fa7}\u{3001}\u{65e0}\u{76f8}\u{90bb}\u{6587}\u{7ae0}\u{6837}\u{4f8b}\u{4e0e}\u{952e}\u{76d8}\u{8bf4}\u{660e}\u{ff0c}\u{4e0d}\u{518d}\u{4e0e}\u{76f8}\u{90bb}\u{6587}\u{7ae0}\u{5bfc}\u{822a}\u{663e}\u{793a}\u{4e24}\u{4efd}\u{76f8}\u{540c}\u{7684}\u{5361}\u{7247}\u{3002}`/about/components/{breadcrumbs,post-meta,post-nav-links}` \u{8fd4}\u{56de} 404\u{3002}\n- **\u{4f9d}\u{8d56}\u{5347}\u{7ea7}**\u{ff1a}`leptos` 0.8.22 \u{2192} 0.8.23\u{ff0c}`resvg` 0.48 \u{2192} 0.49\u{ff0c}`sysinfo` 0.39 \u{2192} 0.40\u{ff0c}`fancy-regex` 0.19 \u{2192} 0.20\u{ff0c}\u{53e6}\u{6709} `rmcp` 3.8\u{3001}`uuid` 1.29\u{3001}`zenwebp` 0.4.6\u{3001}`wasm-bindgen` 0.2.130 \u{7b49}\u{517c}\u{5bb9}\u{66f4}\u{65b0}\u{3002}`sysinfo` 0.40 \u{7684}\u{7cfb}\u{7edf}\u{6307}\u{6807}\u{6539}\u{8fd4}\u{56de} `Result`\u{ff1a}\u{4e0d}\u{652f}\u{6301}\u{7684}\u{7cfb}\u{7edf}\u{4e0a}\u{91c7}\u{6837}\u{4efb}\u{52a1}\u{8bb0}\u{5f55}\u{8b66}\u{544a}\u{540e}\u{9000}\u{51fa}\u{ff0c}\u{78c1}\u{76d8}\u{7a7a}\u{95f4}\u{9884}\u{68c0}\u{6309}\u{63a2}\u{6d4b}\u{5931}\u{8d25}\u{964d}\u{7ea7}\u{3002}`skrifa` \u{4ecd}\u{4fdd}\u{6301} 0.44\u{ff0c}\u{4e0e} `usvg` 0.49 \u{5185}\u{90e8}\u{4f7f}\u{7528}\u{7684}\u{7248}\u{672c}\u{4e00}\u{81f4}\u{3002}\n- **\u{706f}\u{7bb1}\u{6253}\u{5f00}/\u{5173}\u{95ed}\u{52a8}\u{753b}\u{6539}\u{4e3a} medium-zoom \u{98ce}\u{683c}**\u{ff1a}\u{56fe}\u{7247}\u{4ece}\u{9875}\u{9762}\u{539f}\u{4f4d}\u{7f6e}\u{4e0d}\u{900f}\u{660e}\u{5730}\u{98de}\u{5230}\u{89c6}\u{53e3}\u{4e2d}\u{592e}\u{ff0c}\u{5173}\u{95ed}\u{65f6}\u{539f}\u{8def}\u{98de}\u{56de}\u{ff0c}\u{539f}\u{56fe}\u{5728}\u{706f}\u{7bb1}\u{671f}\u{95f4}\u{9690}\u{85cf}\u{ff1b}\u{65f6}\u{957f} 300 ms\u{ff0c}\u{66f2}\u{7ebf} `cubic-bezier(0.2, 0, 0.2, 1)`\u{ff0c}\u{80cc}\u{666f}\u{4e0e}\u{754c}\u{9762}\u{5c42}\u{4e0e}\u{56fe}\u{7247}\u{540c}\u{66f2}\u{7ebf}\u{540c}\u{6b65}\u{6de1}\u{5165}\u{6de1}\u{51fa}\u{3002}\u{80cc}\u{666f}\u{6539}\u{4e3a}\u{8ddf}\u{968f}\u{7ad9}\u{70b9}\u{660e}\u{6697}\u{7684}\u{6bdb}\u{73bb}\u{7483}\u{ff08}\u{6d45}\u{8272} `blur(2.5rem) brightness(1.1)`\u{ff0c}\u{6df1}\u{8272} `brightness(0.85)`\u{ff09}\u{ff0c}\u{9876}\u{680f}\u{3001}\u{5de5}\u{5177}\u{6761}\u{3001}\u{7f29}\u{7565}\u{6761}\u{4e0e}\u{63d0}\u{793a}\u{6587}\u{5b57}\u{7684}\u{914d}\u{8272}\u{968f}\u{4e3b}\u{9898}\u{5207}\u{6362}\u{3002}\u{7f29}\u{7565}\u{56fe}\u{5e03}\u{5c40}\u{76d2}\u{4e0e}\u{539f}\u{56fe}\u{5bbd}\u{9ad8}\u{6bd4}\u{76f8}\u{5dee}\u{8d85}\u{8fc7} 2%\u{ff08}`object-fit` \u{88c1}\u{5207}\u{8fc7}\u{7684}\u{7f29}\u{7565}\u{56fe}\u{ff09}\u{65f6}\u{ff0c}\u{4ecd}\u{8d70}\u{900f}\u{660e}\u{5ea6}\u{6de1}\u{5165}\u{6de1}\u{51fa}\u{3002}\n\n### Fixed\n\n- **\u{540c}\u{79d2}\u{5e76}\u{53d1}\u{5907}\u{4efd}\u{4e92}\u{76f8}\u{622a}\u{65ad}\u{ff0c}\u{4e24}\u{4e2a}\u{4efb}\u{52a1}\u{90fd}\u{62a5}\u{6210}\u{529f}**\u{ff1a}\u{5907}\u{4efd}\u{6587}\u{4ef6}\u{540d}\u{53ea}\u{7cbe}\u{786e}\u{5230}\u{79d2}\u{ff0c}pg_dump \u{8def}\u{5f84}\u{5148}\u{7528} `std::fs::write` \u{622a}\u{65ad}\u{5199}\u{7b7e}\u{540d}\u{5934}\u{3001}\u{518d}\u{4ee5}\u{8ffd}\u{52a0}\u{65b9}\u{5f0f}\u{63a5} pg_dump \u{8f93}\u{51fa}\u{ff0c}\u{624b}\u{52a8}\u{5907}\u{4efd}\u{6bcf}\u{6b21}\u{8bf7}\u{6c42}\u{76f4}\u{63a5} `tokio::spawn` \u{4e00}\u{4e2a}\u{4efb}\u{52a1}\u{ff1b}\u{53cc}\u{51fb}\u{3001}\u{4e24}\u{4e2a}\u{6807}\u{7b7e}\u{9875}\u{6216}\u{811a}\u{672c}\u{91cd}\u{8bd5}\u{4f1a}\u{8ba9}\u{4e24}\u{4e2a}\u{4efb}\u{52a1}\u{5199}\u{540c}\u{4e00}\u{4e2a}\u{6587}\u{4ef6}\u{ff0c}\u{4ea7}\u{51fa}\u{7b7e}\u{540d}\u{5408}\u{6cd5}\u{4f46}\u{5185}\u{5bb9}\u{4ea4}\u{9519}\u{7684}\u{5907}\u{4efd}\u{3002}\u{73b0}\u{5728}\u{540c}\u{4e00}\u{8fdb}\u{7a0b}\u{540c}\u{4e00}\u{65f6}\u{523b}\u{53ea}\u{5141}\u{8bb8}\u{4e00}\u{4e2a}\u{5907}\u{4efd}\u{ff1a}\u{5df2}\u{6709}\u{5907}\u{4efd}\u{5728}\u{8dd1}\u{65f6}\u{624b}\u{52a8}\u{5907}\u{4efd}\u{63d0}\u{793a}\u{300c}\u{5df2}\u{6709}\u{5907}\u{4efd}\u{6b63}\u{5728}\u{8fdb}\u{884c}\u{ff0c}\u{8bf7}\u{7b49}\u{5f85}\u{5b8c}\u{6210}\u{540e}\u{518d}\u{8bd5}\u{300d}\u{ff0c}\u{81ea}\u{52a8}\u{5907}\u{4efd}\u{8df3}\u{8fc7}\u{672c}\u{6b21}\u{5e76}\u{8bb0}\u{4e3a}\u{5931}\u{8d25}\u{3002}\u{6587}\u{4ef6}\u{540d}\u{6539}\u{4e3a} `<\u{524d}\u{7f00}>_YYYYmmdd_HHMMSS_mmm_<6 \u{4f4d}\u{968f}\u{673a}>.sql`\u{ff0c}\u{5404}\u{6bb5}\u{5b9a}\u{5bbd}\u{ff0c}\u{81ea}\u{52a8}\u{8f6e}\u{8f6c}\u{4ecd}\u{6309}\u{5b57}\u{5178}\u{5e8f}\u{5224}\u{65ad}\u{65b0}\u{65e7}\u{ff1b}SQL \u{4e0e} uploads \u{5f52}\u{6863}\u{90fd}\u{4ee5} `create_new` \u{72ec}\u{5360}\u{65b0}\u{5efa}\u{ff0c}\u{540c}\u{540d}\u{6587}\u{4ef6}\u{5df2}\u{5b58}\u{5728}\u{65f6}\u{62a5}\u{9519}\u{ff0c}\u{4e0d}\u{518d}\u{622a}\u{65ad}\u{3002}\n- **MCP \u{53ea}\u{8bfb}\u{5de5}\u{5177}\u{56de}\u{4f20}\u{6570}\u{636e}\u{5e93}\u{9519}\u{8bef}\u{539f}\u{6587}**\u{ff1a}`search_posts`\u{3001}`get_post`\u{3001}`list_tags` \u{5931}\u{8d25}\u{65f6}\u{628a} tokio-postgres \u{9519}\u{8bef}\u{ff08}\u{542b} SQL \u{7247}\u{6bb5}\u{4e0e}\u{5217}\u{540d}\u{ff09}\u{539f}\u{6837}\u{653e}\u{8fdb} MCP \u{9519}\u{8bef}\u{6d88}\u{606f}\u{ff0c}\u{6301}\u{6709}\u{6700}\u{4f4e}\u{7ea7} read \u{4ee4}\u{724c}\u{5373}\u{53ef}\u{5728}\u{6570}\u{636e}\u{5e93}\u{6545}\u{969c}\u{65f6}\u{770b}\u{5230}\u{8868}\u{7ed3}\u{6784}\u{3002}\u{73b0}\u{5728}\u{4e0e}\u{5176}\u{4ed6} MCP \u{5de5}\u{5177}\u{4e00}\u{6837}\u{53ea}\u{56de}\u{300c}`<\u{5de5}\u{5177}\u{540d}> failed`\u{300d}\u{ff0c}\u{8be6}\u{60c5}\u{53ea}\u{5199}\u{670d}\u{52a1}\u{7aef}\u{65e5}\u{5fd7}\u{3002}\n- **`/mcp` \u{9884}\u{9274}\u{6743}\u{9650}\u{6d41}\u{5168}\u{7ad9}\u{5171}\u{7528}\u{4e00}\u{4e2a}\u{6876}**\u{ff1a}`/mcp` \u{9274}\u{6743}\u{4e2d}\u{95f4}\u{4ef6}\u{4e0e} `/api/mcp/upload` \u{5728}\u{89e3}\u{6790}\u{4ee4}\u{724c}\u{524d}\u{6309} IP \u{9650}\u{6d41}\u{ff0c}\u{4f46}\u{53d6} IP \u{65f6}\u{6ca1}\u{5e26} TCP \u{5bf9}\u{7aef}\u{5730}\u{5740}\u{ff0c}\u{672a}\u{914d}\u{7f6e} `TRUSTED_PROXY_COUNT` \u{65f6}\u{6240}\u{6709}\u{8bf7}\u{6c42}\u{90fd}\u{8bb0}\u{5728} `unknown` \u{4e0b}\u{ff1b}\u{4efb}\u{4f55}\u{4eba}\u{7528}\u{4f2a}\u{9020} Bearer \u{6253}\u{6ee1} 30 \u{6b21}/\u{79d2}\u{ff08}\u{7a81}\u{53d1} 100\u{ff09}\u{540e}\u{ff0c}\u{6240}\u{6709}\u{5408}\u{6cd5} AI \u{5ba2}\u{6237}\u{7aef}\u{4e00}\u{8d77}\u{6536}\u{5230} 429\u{3002}\u{73b0}\u{5728}\u{4e24}\u{5904}\u{90fd}\u{6309}\u{542f}\u{52a8}\u{65f6}\u{6ce8}\u{5165}\u{7684} `ConnectInfo` \u{5bf9}\u{7aef}\u{5730}\u{5740}\u{8ba1}\u{6570}\u{ff0c}\u{4e0e}\u{5176}\u{4ed6}\u{4e0a}\u{4f20}\u{8def}\u{7531}\u{4e00}\u{81f4}\u{3002}\n- **\u{7ec4}\u{4ef6}\u{56fe}\u{9274}\u{9996}\u{5c4f}\u{6296}\u{52a8}**\u{ff1a}\u{9875}\u{9762}\u{8fb9}\u{4e0b}\u{8f7d}\u{8fb9}\u{7ed8}\u{5236}\u{65f6}\u{ff0c}\u{6392}\u{5728}\u{5168}\u{90e8}\u{5361}\u{7247}\u{4e4b}\u{540e}\u{7684}\u{53f3}\u{4fa7}\u{8be6}\u{60c5}\u{680f}\u{665a}\u{5230}\u{7ea6} 0.5 s\u{ff0c}\u{5361}\u{7247}\u{7f51}\u{683c}\u{5148}\u{5360}\u{6ee1}\u{6574}\u{884c}\u{ff0c}\u{968f}\u{540e}\u{6536}\u{7a84}\u{6210}\u{4e24}\u{5217}\u{7a84}\u{5361}\u{ff1b}\u{6c34}\u{5408}\u{540e}\u{7011}\u{5e03}\u{6d41}\u{811a}\u{672c}\u{518d}\u{628a}\u{5361}\u{7247}\u{4ece}\u{6309}\u{884c}\u{5bf9}\u{9f50}\u{6539}\u{6210}\u{6309}\u{81ea}\u{7136}\u{9ad8}\u{5ea6}\u{6392}\u{5217}\u{ff0c}\u{540e}\u{9762}\u{7684}\u{5361}\u{7247}\u{4e0a}\u{79fb}\u{6216}\u{6362}\u{5217}\u{3002}\u{73b0}\u{5728}\u{76ee}\u{5f55}\u{7528}\u{4e24}\u{5217} grid \u{5148}\u{7ed9}\u{8be6}\u{60c5}\u{680f}\u{7559}\u{51fa} 20rem\u{ff1b}\u{7f51}\u{683c}\u{524d}\u{5185}\u{8054}\u{4e00}\u{6bb5}\u{811a}\u{672c}\u{ff0c}\u{5728}\u{89e3}\u{6790}\u{8fc7}\u{7a0b}\u{4e2d}\u{6bcf}\u{5f20}\u{5361}\u{7247}\u{4e00}\u{95ed}\u{5408}\u{5c31}\u{5199}\u{597d}\u{5b83}\u{7684} `grid-row-end`\u{ff0c}\u{6d4f}\u{89c8}\u{5668}\u{4e2d}\u{9014}\u{7ed8}\u{5236}\u{51fa}\u{6765}\u{7684}\u{5c31}\u{662f}\u{6700}\u{7ec8}\u{4f4d}\u{7f6e}\u{ff0c}`showcase-masonry.ts` \u{63a5}\u{7ba1}\u{540e}\u{7b97}\u{51fa}\u{7684}\u{8de8}\u{5ea6}\u{76f8}\u{540c}\u{ff0c}\u{4e0d}\u{518d}\u{79fb}\u{52a8}\u{3002}CPU \u{964d}\u{901f} 6 \u{500d}\u{5b9e}\u{6d4b}\u{ff0c}\u{9996}\u{5c4f}\u{5361}\u{7247}\u{79fb}\u{52a8}\u{4ece} 57 \u{6b21}\u{964d}\u{4e3a} 0\u{3002}\n- **\u{5728}\u{9014}\u{65e7}\u{5bc6}\u{7801}\u{767b}\u{5f55}\u{53ef}\u{8de8}\u{8fc7}\u{6539}\u{5bc6}**\u{ff1a}\u{767b}\u{5f55}\u{5148}\u{6821}\u{9a8c}\u{5bc6}\u{7801}\u{3001}\u{540e}\u{9501}\u{7528}\u{6237}\u{884c}\u{ff0c}\u{7b7e}\u{53d1}\u{65f6}\u{76f4}\u{63a5}\u{53d6}\u{6700}\u{65b0}\u{4f1a}\u{8bdd}\u{4e16}\u{4ee3}\u{ff1b}\u{6539}\u{5bc6}\u{82e5}\u{5728}\u{4e24}\u{8005}\u{4e4b}\u{95f4}\u{63d0}\u{4ea4}\u{ff0c}\u{5df2}\u{9a8c}\u{8bc1}\u{7684}\u{65e7}\u{5bc6}\u{7801}\u{4ecd}\u{80fd}\u{62ff}\u{5230}\u{65b0}\u{4e16}\u{4ee3}\u{4f1a}\u{8bdd}\u{3002}\u{73b0}\u{5728}\u{52a0}\u{9501}\u{65f6}\u{4e00}\u{5e76}\u{590d}\u{6838} `password_hash` \u{4e0e} `admin` \u{89d2}\u{8272}\u{672a}\u{53d8}\u{ff0c}\u{4e0d}\u{7b26}\u{6309}\u{51ed}\u{636e}\u{9519}\u{8bef}\u{5904}\u{7406}\u{3002}\u{6539}\u{5bc6}\u{7684} `UPDATE` \u{540c}\u{6837}\u{4ee5}\u{5df2}\u{9a8c}\u{8bc1}\u{7684}\u{65e7}\u{54c8}\u{5e0c}\u{4e3a}\u{6761}\u{4ef6}\u{ff0c}\u{5e76}\u{53d1}\u{6539}\u{5bc6}\u{540e}\u{65e7}\u{5bc6}\u{7801}\u{4e0d}\u{80fd}\u{518d}\u{8986}\u{76d6}\u{65b0}\u{51ed}\u{636e}\u{ff1b}\u{5f53}\u{524d}\u{4f1a}\u{8bdd}\u{884c}\u{5df2}\u{88ab}\u{5e76}\u{53d1}\u{6539}\u{5bc6}\u{5220}\u{9664}\u{65f6}\u{6574}\u{4f53}\u{56de}\u{6eda}\u{ff0c}\u{4e0d}\u{518d}\u{501f}\u{7f13}\u{5b58}\u{5237}\u{65b0}\u{590d}\u{6d3b}\u{5df2}\u{540a}\u{9500}\u{7684} token\u{3002}\n- **\u{5c01}\u{7981}\u{552f}\u{4e00}\u{7ba1}\u{7406}\u{5458}\u{540e}\u{6ce8}\u{518c}\u{91cd}\u{65b0}\u{5f00}\u{653e}**\u{ff1a}\u{6ce8}\u{518c}\u{59cb}\u{7ec8}\u{63d2}\u{5165} `role=\'admin\'`\u{ff0c}\u{53ea}\u{9760}\u{90e8}\u{5206}\u{552f}\u{4e00}\u{7d22}\u{5f15} `idx_one_admin` \u{62e6}\u{622a}\u{540e}\u{7eed}\u{6ce8}\u{518c}\u{ff1b}\u{552f}\u{4e00}\u{7684}\u{7ba1}\u{7406}\u{5458}\u{88ab}\u{6539}\u{6210} `blocked`\u{ff08}\u{4f8b}\u{5982}\u{5728} SQL \u{63a7}\u{5236}\u{53f0}\u{91cc}\u{ff09}\u{540e}\u{7d22}\u{5f15}\u{4e0d}\u{518d}\u{7ea6}\u{675f}\u{ff0c}\u{533f}\u{540d}\u{8bbf}\u{5ba2}\u{5373}\u{53ef}\u{6ce8}\u{518c}\u{6210}\u{4e3a}\u{65b0}\u{7ba1}\u{7406}\u{5458}\u{3002}\u{73b0}\u{5728}\u{6ce8}\u{518c}\u{53ea}\u{5728} `users` \u{8868}\u{4e3a}\u{7a7a}\u{65f6}\u{6210}\u{529f}\u{ff0c}\u{7ad9}\u{70b9}\u{4e00}\u{65e6}\u{6709}\u{7528}\u{6237}\u{5373}\u{89c6}\u{4e3a}\u{521d}\u{59cb}\u{5316}\u{5b8c}\u{6210}\u{ff0c}\u{4e0e}\u{7ba1}\u{7406}\u{5458}\u{89d2}\u{8272}\u{65e0}\u{5173}\u{ff1b}\u{5e76}\u{53d1}\u{9996}\u{6b21}\u{6ce8}\u{518c}\u{4ecd}\u{7531} `idx_one_admin` \u{4fdd}\u{8bc1}\u{53ea}\u{6709}\u{4e00}\u{4e2a}\u{6210}\u{529f}\u{3002}\n- **\u{7d20}\u{6750}\u{6e05}\u{7406}\u{4f1a}\u{5220}\u{6389}\u{521a}\u{5efa}\u{7acb}\u{7684}\u{6587}\u{7ae0}\u{5f15}\u{7528}**\u{ff1a}\u{6bcf}\u{65e5}\u{5b9a}\u{65f6}\u{6e05}\u{7406}\u{4e0d}\u{52a0}\u{9501}\u{9009}\u{51fa}\u{5b64}\u{513f}\u{3001}\u{5148}\u{5220}\u{6587}\u{4ef6}\u{3001}\u{6700}\u{540e}\u{5220} DB \u{884c}\u{ff0c}\u{6587}\u{7ae0}\u{4fdd}\u{5b58}\u{82e5}\u{5728}\u{6b64}\u{671f}\u{95f4}\u{5199}\u{5165} `asset_refs`\u{ff0c}\u{5220}\u{9664}\u{4f1a}\u{7ecf} `ON DELETE CASCADE` \u{628a}\u{65b0}\u{5f15}\u{7528}\u{4e00}\u{8d77}\u{5220}\u{6389}\u{ff0c}\u{78c1}\u{76d8}\u{6587}\u{4ef6}\u{4e5f}\u{5df2}\u{6ca1}\u{4e86}\u{3002}\u{7ba1}\u{7406}\u{7aef}\u{300c}\u{4e00}\u{952e}\u{6e05}\u{7406}\u{300d}\u{4e0e}\u{6279}\u{91cf}\u{5220}\u{9664}\u{867d}\u{7136} `FOR UPDATE` \u{9501}\u{884c}\u{ff0c}\u{4f46}\u{5f15}\u{7528}\u{5224}\u{5b9a}\u{5199}\u{5728}\u{52a0}\u{9501}\u{8bed}\u{53e5}\u{91cc}\u{ff1a}\u{4fdd}\u{5b58}\u{4e8b}\u{52a1}\u{5148}\u{63d2}\u{5165}\u{5f15}\u{7528}\u{3001}\u{6e05}\u{7406}\u{5728}\u{5176}\u{5916}\u{952e}\u{9501}\u{4e0a}\u{7b49}\u{5f85}\u{ff0c}\u{4fdd}\u{5b58}\u{63d0}\u{4ea4}\u{540e} Postgres \u{4e0d}\u{91cd}\u{65b0}\u{6c42}\u{503c} `WHERE`\u{ff0c}\u{4ecd}\u{4f1a}\u{5220}\u{6389}\u{5f15}\u{7528}\u{3002}\u{73b0}\u{5728}\u{4e09}\u{8005}\u{5171}\u{7528}\u{540c}\u{4e00}\u{6d41}\u{7a0b}\u{ff1a}\u{4e8b}\u{52a1}\u{5185}\u{5148}\u{9501}\u{5019}\u{9009}\u{884c}\u{ff0c}\u{518d}\u{7531} `DELETE \u{2026} AND NOT <\u{5f15}\u{7528}\u{5224}\u{5b9a}>` \u{7528}\u{65b0}\u{5feb}\u{7167}\u{590d}\u{6838}\u{ff0c}\u{63d0}\u{4ea4}\u{540e}\u{624d}\u{5220}\u{6587}\u{4ef6}\u{4e0e}\u{6d3e}\u{751f}\u{7f13}\u{5b58}\u{ff1b}\u{5b9a}\u{65f6}\u{4efb}\u{52a1}\u{53ea}\u{8d1f}\u{8d23}\u{8bfb}\u{5f00}\u{5173}\u{4e0e}\u{4fdd}\u{7559}\u{5929}\u{6570}\u{3002}\n- **\u{7d20}\u{6750}\u{76ee}\u{5f55}\u{8bfb}\u{53d6}\u{5931}\u{8d25}\u{65f6}\u{91cd}\u{5efa}\u{7d22}\u{5f15}\u{4f1a}\u{6e05}\u{7a7a}\u{7d20}\u{6750}\u{8868}**\u{ff1a}\u{300c}\u{91cd}\u{5efa}\u{7d20}\u{6750}\u{7d22}\u{5f15}\u{300d}\u{628a} `uploads/` \u{53ca}\u{5176}\u{5b50}\u{76ee}\u{5f55}\u{7684}\u{8bfb}\u{53d6}\u{5931}\u{8d25}\u{5f53}\u{6210}\u{7a7a}\u{76ee}\u{5f55}\u{ff0c}\u{968f}\u{540e}\u{5220}\u{9664}\u{6240}\u{6709}\u{672a}\u{626b}\u{63cf}\u{5230}\u{7684}\u{7d20}\u{6750}\u{884c}\u{ff0c}`asset_refs` \u{7ea7}\u{8054}\u{6e05}\u{7a7a}\u{ff1b}\u{76ee}\u{5f55}\u{672a}\u{6302}\u{8f7d}\u{6216}\u{6743}\u{9650}\u{5f02}\u{5e38}\u{65f6}\u{6574}\u{8868}\u{88ab}\u{5220}\u{3002}\u{73b0}\u{5728}\u{4efb}\u{4e00}\u{76ee}\u{5f55}\u{6216}\u{76ee}\u{5f55}\u{9879}\u{8bfb}\u{53d6}\u{5931}\u{8d25}\u{5373}\u{4e2d}\u{6b62}\u{91cd}\u{5efa}\u{5e76}\u{62a5}\u{300c}\u{7d20}\u{6750}\u{76ee}\u{5f55}\u{8bfb}\u{53d6}\u{5931}\u{8d25}\u{300d}\u{ff0c}\u{6570}\u{636e}\u{5e93}\u{4e0d}\u{505a}\u{4efb}\u{4f55}\u{6539}\u{52a8}\u{3002}\n- **\u{8bc4}\u{8bba}\u{4e0e}\u{5934}\u{50cf}\u{5f15}\u{7528}\u{7684}\u{7d20}\u{6750}\u{53ef}\u{88ab}\u{5220}\u{9664}**\u{ff1a}\u{8bc4}\u{8bba}\u{3001}\u{7528}\u{6237}\u{5934}\u{50cf}\u{3001}\u{53cb}\u{94fe}\u{5934}\u{50cf}\u{5bf9}\u{7d20}\u{6750}\u{7684}\u{5f15}\u{7528}\u{4e0d}\u{843d}\u{8868}\u{ff0c}\u{5220}\u{9664}\u{4e0e}\u{6e05}\u{7406}\u{65f6}\u{6309} URL \u{6587}\u{672c}\u{4e34}\u{65f6}\u{5339}\u{914d}\u{ff0c}`FOR UPDATE` \u{884c}\u{9501}\u{6321}\u{4e0d}\u{4f4f}\u{5e76}\u{53d1}\u{5199}\u{5165}\u{ff0c}\u{5199}\u{5165}\u{65f6}\u{4e5f}\u{4e0d}\u{68c0}\u{67e5}\u{7d20}\u{6750}\u{662f}\u{5426}\u{5b58}\u{5728}\u{ff1b}\u{56de}\u{6536}\u{7ad9}\u{8bc4}\u{8bba}\u{5f15}\u{7528}\u{7684}\u{56fe}\u{7247}\u{8fd8}\u{4f1a}\u{88ab}\u{5f53}\u{4f5c}\u{5b64}\u{513f}\u{6e05}\u{7406}\u{3002}\u{73b0}\u{5728}\u{4e09}\u{7c7b}\u{5f15}\u{7528}\u{5404}\u{6709}\u{5e26}\u{5916}\u{952e}\u{7684}\u{5f15}\u{7528}\u{8868}\u{ff08}\u{8fc1}\u{79fb} 032 \u{4ece}\u{73b0}\u{6709}\u{5185}\u{5bb9}\u{56de}\u{586b}\u{ff09}\u{ff1a}\u{5199}\u{5165}\u{65f6}\u{5148}\u{4ee5} `FOR KEY SHARE` \u{9501}\u{4f4f}\u{5f15}\u{7528}\u{7684}\u{7d20}\u{6750}\u{5e76}\u{786e}\u{8ba4}\u{5b58}\u{5728}\u{ff0c}\u{7f3a}\u{5931}\u{5219}\u{62d2}\u{7edd}\u{ff0c}\u{63d0}\u{793a}\u{300c}\u{8bc4}\u{8bba}\u{4e2d}\u{7684}\u{56fe}\u{7247}\u{4e0d}\u{5b58}\u{5728}\u{6216}\u{5df2}\u{88ab}\u{5220}\u{9664}\u{ff0c}\u{8bf7}\u{91cd}\u{65b0}\u{4e0a}\u{4f20}\u{300d}\u{6216}\u{300c}\u{5934}\u{50cf}\u{7d20}\u{6750}\u{4e0d}\u{5b58}\u{5728}\u{6216}\u{5df2}\u{88ab}\u{5220}\u{9664}\u{ff0c}\u{8bf7}\u{91cd}\u{65b0}\u{4e0a}\u{4f20}\u{300d}\u{ff1b}\u{8d44}\u{6599}\u{6216}\u{53cb}\u{94fe}\u{91cc}\u{672a}\u{6539}\u{52a8}\u{7684}\u{65e7}\u{5931}\u{6548}\u{5934}\u{50cf}\u{4e0d}\u{963b}\u{6b62}\u{4fdd}\u{5b58}\u{ff0c}\u{540e}\u{53f0}\u{6392}\u{5e8f}\u{4e0d}\u{53d7}\u{5f71}\u{54cd}\u{3002}\u{56de}\u{6536}\u{7ad9}\u{8bc4}\u{8bba}\u{7684}\u{5f15}\u{7528}\u{7ee7}\u{7eed}\u{4fdd}\u{62a4}\u{7d20}\u{6750}\u{ff0c}\u{53ea}\u{968f}\u{8bc4}\u{8bba}\u{88ab}\u{5f7b}\u{5e95}\u{5220}\u{9664}\u{800c}\u{6d88}\u{5931}\u{3002}\u{5220}\u{9664}\u{3001}\u{6e05}\u{7406}\u{3001}\u{5f15}\u{7528}\u{660e}\u{7ec6}\u{4e0e}\u{91cd}\u{5efa}\u{7d22}\u{5f15}\u{7edf}\u{4e00}\u{67e5}\u{5f15}\u{7528}\u{8868}\u{3002}\n- **\u{4e0b}\u{8c03}\u{4f1a}\u{8bdd}\u{4e0a}\u{9650}\u{540e}\u{65e7}\u{4f1a}\u{8bdd}\u{4e0d}\u{6536}\u{655b}**\u{ff1a}\u{767b}\u{5f55}\u{8d85}\u{51fa}\u{300c}\u{6bcf}\u{7528}\u{6237}\u{6700}\u{5927}\u{4f1a}\u{8bdd}\u{6570}\u{300d}\u{65f6}\u{53ea}\u{6dd8}\u{6c70}\u{6700}\u{65e9}\u{7684}\u{4e00}\u{6761}\u{518d}\u{7b7e}\u{53d1}\u{65b0}\u{4f1a}\u{8bdd}\u{ff0c}\u{4e0a}\u{9650}\u{4ece} 10 \u{8c03}\u{5230} 3 \u{540e}\u{6bcf}\u{6b21}\u{767b}\u{5f55}\u{4ecd}\u{4fdd}\u{7559} 10 \u{4e2a}\u{6709}\u{6548}\u{4f1a}\u{8bdd}\u{3002}\u{73b0}\u{5728}\u{767b}\u{5f55}\u{65f6}\u{4e00}\u{6b21}\u{5220}\u{6389}\u{9664}\u{6700}\u{65b0} `\u{4e0a}\u{9650} - 1` \u{4e2a}\u{4e4b}\u{5916}\u{7684}\u{5168}\u{90e8}\u{6709}\u{6548}\u{4f1a}\u{8bdd}\u{ff0c}\u{4e0b}\u{4e00}\u{6b21}\u{767b}\u{5f55}\u{5373}\u{6536}\u{655b}\u{5230}\u{65b0}\u{4e0a}\u{9650}\u{3002}\n- **\u{91cd}\u{590d}\u{6807}\u{9898}\u{76ee}\u{5f55}\u{8df3}\u{9519}**\u{ff1a}\u{6807}\u{9898}\u{951a}\u{70b9}\u{53ea}\u{7531}\u{6587}\u{672c}\u{8f6c} slug\u{ff0c}\u{540c}\u{540d}\u{6807}\u{9898}\u{6216}\u{53ea}\u{5dee}\u{6807}\u{70b9}\u{7684}\u{6807}\u{9898}\u{ff08}`FAQ?` \u{4e0e} `FAQ!`\u{ff09}\u{5f97}\u{5230}\u{76f8}\u{540c} `id`\u{ff0c}\u{76ee}\u{5f55}\u{91cc}\u{540e}\u{9762}\u{7684}\u{6761}\u{76ee}\u{90fd}\u{8df3}\u{5230}\u{7b2c}\u{4e00}\u{4e2a}\u{3002}\u{73b0}\u{5728}\u{540c}\u{4e00}\u{7bc7}\u{6587}\u{6863}\u{5185}\u{91cd}\u{590d}\u{7684}\u{951a}\u{70b9}\u{4f9d}\u{6b21}\u{8ffd}\u{52a0} `-1`\u{3001}`-2`\u{ff08}\u{4e0e} GitHub \u{4e00}\u{81f4}\u{ff09}\u{ff0c}\u{9996}\u{6b21}\u{51fa}\u{73b0}\u{7684}\u{951a}\u{70b9}\u{4e0d}\u{53d8}\u{ff1b}\u{5df2}\u{53d1}\u{5e03}\u{6587}\u{7ae0}\u{91cd}\u{65b0}\u{4fdd}\u{5b58}\u{540e}\u{751f}\u{6548}\u{3002}\n- **\u{706f}\u{7bb1}\u{680f}\u{4f4d}\u{6de1}\u{51fa}\u{540e} Tab \u{7126}\u{70b9}\u{6cc4}\u{6f0f}**\u{ff1a}\u{653e}\u{5927}\u{540e}\u{9876}\u{680f}\u{3001}\u{5e95}\u{680f}\u{4e0e}\u{7bad}\u{5934}\u{7a7a}\u{95f2}\u{6de1}\u{51fa}\u{ff08}`opacity: 0`\u{ff09}\u{ff0c}\u{7126}\u{70b9}\u{7ea6}\u{675f}\u{6309}\u{900f}\u{660e}\u{5ea6}\u{7b5b}\u{6389}\u{5168}\u{90e8}\u{63a7}\u{4ef6}\u{540e}\u{76f4}\u{63a5}\u{653e}\u{884c}\u{9ed8}\u{8ba4} Tab\u{ff0c}Shift+Tab \u{4f1a}\u{805a}\u{7126}\u{5230}\u{706f}\u{7bb1}\u{80cc}\u{540e}\u{7684}\u{9875}\u{9762}\u{6309}\u{94ae}\u{3002}\u{73b0}\u{5728} Tab \u{4e0e}\u{6307}\u{9488}\u{6d3b}\u{52a8}\u{4e00}\u{6837}\u{5524}\u{9192}\u{680f}\u{4f4d}\u{ff0c}\u{7126}\u{70b9}\u{7ea6}\u{675f}\u{4e0d}\u{518d}\u{6309}\u{900f}\u{660e}\u{5ea6}\u{8fc7}\u{6ee4}\u{5e76}\u{59cb}\u{7ec8}\u{63a5}\u{7ba1} Tab\u{ff0c}\u{6ca1}\u{6709}\u{53ef}\u{805a}\u{7126}\u{63a7}\u{4ef6}\u{65f6}\u{7126}\u{70b9}\u{7559}\u{5728}\u{706f}\u{7bb1}\u{672c}\u{8eab}\u{3002}\n- **SQL \u{683c}\u{5f0f}\u{6570}\u{636e}\u{5bfc}\u{51fa}\u{628a}\u{975e}\u{6807}\u{91cf}\u{5217}\u{5199}\u{6210} NULL**\u{ff1a}\u{9010}\u{884c}\u{62fc} `INSERT` \u{65f6}\u{53ea}\u{89e3}\u{7801}\u{6574}\u{6570}\u{3001}`float8` \u{4e0e}\u{5e03}\u{5c14}\u{ff0c}\u{5176}\u{4f59}\u{4e00}\u{5f8b}\u{6309} Rust `String` \u{8bfb}\u{53d6}\u{ff1b}`timestamptz`\u{3001}`uuid`\u{3001}`text[]`\u{3001}`jsonb`\u{3001}`bytea`\u{3001}`float4` \u{7b49}\u{7c7b}\u{578b}\u{8bfb}\u{53d6}\u{5931}\u{8d25}\u{540e}\u{9759}\u{9ed8}\u{5199}\u{6210} `NULL`\u{ff0c}\u{6d6e}\u{70b9} `NaN` \u{8fd8}\u{4f1a}\u{8f93}\u{51fa}\u{6210}\u{975e}\u{6cd5}\u{7684}\u{88f8}\u{5b57}\u{9762}\u{91cf}\u{ff0c}\u{5bfc}\u{51fa}\u{7684}\u{6587}\u{4ef6}\u{56de}\u{704c}\u{65f6}\u{5728} `created_at NOT NULL` \u{7b49}\u{7ea6}\u{675f}\u{5904}\u{5931}\u{8d25}\u{3002}\u{73b0}\u{5728}\u{67e5}\u{8be2}\u{5305}\u{8fdb}\u{5b50}\u{67e5}\u{8be2}\u{3001}\u{5728}\u{6570}\u{636e}\u{5e93}\u{7aef}\u{9010}\u{5217} `::text`\u{ff0c}\u{4efb}\u{610f}\u{7c7b}\u{578b}\u{90fd}\u{6309} PostgreSQL \u{6587}\u{672c}\u{8868}\u{793a}\u{5bfc}\u{51fa}\u{ff08}\u{6309}\u{4f4d}\u{7f6e}\u{53d6}\u{5217}\u{ff0c}\u{91cd}\u{540d}\u{5217}\u{4e0d}\u{51b2}\u{7a81}\u{ff0c}\u{672b}\u{5c3e}\u{5206}\u{53f7}\u{4e0e}\u{6ce8}\u{91ca}\u{5148}\u{53bb}\u{6389}\u{ff09}\u{ff1b}\u{6709}\u{9650}\u{6570}\u{503c}\u{4e0d}\u{52a0}\u{5f15}\u{53f7}\u{ff0c}`NaN`/`Infinity` \u{52a0}\u{5f15}\u{53f7}\u{3002}`EXPLAIN` \u{4e0d}\u{80fd}\u{4f5c}\u{5b50}\u{67e5}\u{8be2}\u{ff0c}\u{6587}\u{672c}\u{683c}\u{5f0f}\u{7167}\u{65e7}\u{5bfc}\u{51fa}\u{ff0c}`FORMAT JSON`/`XML` \u{6539}\u{4e3a}\u{76f4}\u{63a5}\u{62a5}\u{300c}\u{8be5}\u{8bed}\u{53e5}\u{7684}\u{7ed3}\u{679c}\u{5217}\u{65e0}\u{6cd5}\u{5bfc}\u{51fa}\u{4e3a} SQL\u{300d}\u{3002}\n- **\u{4e0a}\u{4f20}\u{4e2d}\u{5220}\u{6389}\u{5360}\u{4f4d}\u{56fe}\u{540e}\u{65e0}\u{6cd5}\u{4fdd}\u{5b58}\u{6587}\u{7ae0}**\u{ff1a}\u{7f16}\u{8f91}\u{5668}\u{7684}\u{56fe}\u{7247}\u{4e0a}\u{4f20}\u{7ed3}\u{675f}\u{540e}\u{4e0d}\u{590d}\u{67e5}\u{5360}\u{4f4d}\u{56fe}\u{662f}\u{5426}\u{8fd8}\u{5728}\u{3002}\u{4e0a}\u{4f20}\u{9014}\u{4e2d}\u{70b9}\u{79fb}\u{9664}\u{3001}\u{5173}\u{6389}\u{63d0}\u{793a}\u{6216}\u{9000}\u{683c}\u{5220}\u{9664}\u{5360}\u{4f4d}\u{56fe}\u{ff0c}\u{8ba1}\u{6570}\u{5df2}\u{7ecf}\u{51cf}\u{8fc7}\u{4e00}\u{6b21}\u{ff1a}\u{4e0a}\u{4f20}\u{6210}\u{529f}\u{4f1a}\u{518d}\u{51cf}\u{4e00}\u{6b21}\u{ff0c}\u{8ba1}\u{6570}\u{53d8}\u{6210}\u{8d1f}\u{6570}\u{ff1b}\u{4e0a}\u{4f20}\u{5931}\u{8d25}\u{5219}\u{628a}\u{5df2}\u{79fb}\u{9664}\u{7684}\u{56fe}\u{7247}\u{8bb0}\u{6210}\u{5931}\u{8d25}\u{ff0c}\u{4fdd}\u{5b58}\u{65f6}\u{68c0}\u{67e5}\u{5230}\u{300c}\u{6709}\u{4e0a}\u{4f20}\u{5931}\u{8d25}\u{7684}\u{56fe}\u{7247}\u{300d}\u{4e00}\u{76f4}\u{62d2}\u{7edd}\u{4fdd}\u{5b58}\u{ff0c}\u{4e14}\u{8be5}\u{56fe}\u{7247}\u{5df2}\u{4e0d}\u{5728}\u{5217}\u{8868}\u{91cc}\u{ff0c}\u{65e0}\u{6cd5}\u{518d}\u{79fb}\u{9664}\u{3002}\u{73b0}\u{5728}\u{4e0a}\u{4f20}\u{7ed3}\u{679c}\u{5230}\u{8fbe}\u{65f6}\u{5360}\u{4f4d}\u{56fe}\u{5df2}\u{79fb}\u{9664}\u{5c31}\u{76f4}\u{63a5}\u{4e22}\u{5f03}\u{3002}\u{53e6}\u{5916}\u{ff0c}\u{91cd}\u{8bd5}\u{65f6}\u{6ca1}\u{6709}\u{628a}\u{56fe}\u{7247}\u{72b6}\u{6001}\u{6539}\u{56de}\u{300c}\u{4e0a}\u{4f20}\u{4e2d}\u{300d}\u{ff0c}\u{91cd}\u{8bd5}\u{671f}\u{95f4}\u{79fb}\u{9664}\u{4f1a}\u{6263}\u{9519}\u{8ba1}\u{6570}\u{ff1b}\u{8fde}\u{7eed}\u{70b9}\u{91cd}\u{8bd5}\u{4f1a}\u{91cd}\u{590d}\u{4e0a}\u{4f20}\u{3002}\u{73b0}\u{5728}\u{91cd}\u{8bd5}\u{4f1a}\u{6539}\u{56de}\u{4e0a}\u{4f20}\u{4e2d}\u{ff0c}\u{4e14}\u{53ea}\u{5bf9}\u{5931}\u{8d25}\u{7684}\u{56fe}\u{7247}\u{751f}\u{6548}\u{3002}\n- **\u{91cd}\u{4f20}\u{56fe}\u{7247}\u{8865}\u{4e0d}\u{56de}\u{4e22}\u{5931}\u{7684}\u{7d20}\u{6750}\u{6587}\u{4ef6}**\u{ff1a}\u{4e0a}\u{4f20}\u{6309}\u{5185}\u{5bb9}\u{54c8}\u{5e0c}\u{53bb}\u{91cd}\u{ff0c}\u{547d}\u{4e2d}\u{5df2}\u{767b}\u{8bb0}\u{7d20}\u{6750}\u{5c31}\u{76f4}\u{63a5}\u{8fd4}\u{56de}\u{65e7} URL\u{ff0c}\u{4e0d}\u{68c0}\u{67e5}\u{78c1}\u{76d8}\u{4e0a}\u{6587}\u{4ef6}\u{662f}\u{5426}\u{8fd8}\u{5728}\u{3002}\u{7d20}\u{6750}\u{8bb0}\u{5f55}\u{8fd8}\u{5728}\u{4f46}\u{6587}\u{4ef6}\u{4e22}\u{5931}\u{ff08}\u{5982}\u{8de8}\u{673a}\u{540c}\u{6b65}\u{9057}\u{6f0f}\u{ff09}\u{65f6}\u{ff0c}\u{91cd}\u{4f20}\u{540c}\u{4e00}\u{5f20}\u{56fe}\u{53ea}\u{4f1a}\u{62ff}\u{5230}\u{4e00}\u{4e2a}\u{6c38}\u{4e45} 404 \u{7684}\u{5730}\u{5740}\u{ff0c}\u{672c}\u{6b21}\u{4e0a}\u{4f20}\u{7684}\u{5b57}\u{8282}\u{88ab}\u{4e22}\u{5f03}\u{ff0c}\u{53ea}\u{80fd}\u{5148}\u{5220}\u{8bb0}\u{5f55}\u{518d}\u{91cd}\u{4f20}\u{3002}\u{73b0}\u{5728}\u{53bb}\u{91cd}\u{547d}\u{4e2d}\u{65f6}\u{786e}\u{8ba4}\u{6587}\u{4ef6}\u{5b58}\u{5728}\u{ff1b}\u{4e0d}\u{5b58}\u{5728}\u{5c31}\u{7167}\u{5e38}\u{6821}\u{9a8c}\u{3001}\u{8f6c}\u{7801}\u{5e76}\u{5199}\u{56de}\u{539f}\u{8def}\u{5f84}\u{ff0c}\u{6587}\u{7ae0}\u{91cc}\u{5df2}\u{6709}\u{7684}\u{56fe}\u{7247}\u{5730}\u{5740}\u{968f}\u{4e4b}\u{6062}\u{590d}\u{ff1b}\u{8f6c}\u{7801}\u{540e}\u{6269}\u{5c55}\u{540d}\u{4e0e}\u{539f}\u{8def}\u{5f84}\u{4e0d}\u{540c}\u{65f6}\u{ff0c}\u{8bb0}\u{5f55}\u{6539}\u{6307}\u{5411}\u{65b0}\u{6587}\u{4ef6}\u{3002}\u{843d}\u{76d8}\u{6539}\u{4e3a}\u{5148}\u{5199}\u{4e34}\u{65f6}\u{6587}\u{4ef6}\u{518d}\u{6539}\u{540d}\u{ff0c}\u{5e76}\u{53d1}\u{8865}\u{5199}\u{540c}\u{4e00}\u{8def}\u{5f84}\u{65f6}\u{4e0d}\u{4f1a}\u{8bfb}\u{5230}\u{5199}\u{4e86}\u{4e00}\u{534a}\u{7684}\u{6587}\u{4ef6}\u{3002}\n- **MCP \u{6539}\u{72b6}\u{6001}\u{4f1a}\u{6539}\u{5199}\u{521b}\u{5efa}\u{65f6}\u{95f4}\u{3001}\u{62fc}\u{9519}\u{72b6}\u{6001}\u{4f1a}\u{4e0b}\u{7ebf}\u{6587}\u{7ae0}**\u{ff1a}`update_post` \u{53ea}\u{8981}\u{5e26} `status`\u{ff0c}\u{5c31}\u{628a}\u{63a8}\u{5bfc}\u{51fa}\u{7684} `published_at` \u{540c}\u{65f6}\u{5199}\u{8fdb} `created_at`\u{ff0c}\u{5df2}\u{53d1}\u{5e03}\u{6587}\u{7ae0}\u{518d}\u{4f20}\u{4e00}\u{6b21} `published` \u{4e5f}\u{4f1a}\u{628a}\u{521b}\u{5efa}\u{65f6}\u{95f4}\u{6539}\u{6210}\u{53d1}\u{5e03}\u{65f6}\u{95f4}\u{ff1b}\u{72b6}\u{6001}\u{503c}\u{4e0d}\u{662f} `draft`/`published`\u{ff08}\u{5982} `Published`\u{ff09}\u{65f6}\u{9759}\u{9ed8}\u{5f53}\u{6210}\u{8349}\u{7a3f}\u{ff0c}\u{5df2}\u{53d1}\u{5e03}\u{6587}\u{7ae0}\u{88ab}\u{6084}\u{6084}\u{4e0b}\u{7ebf}\u{3002}\u{73b0}\u{5728}\u{53ea}\u{6709}\u{663e}\u{5f0f}\u{4f20} `published_at` \u{65f6}\u{624d}\u{540c}\u{6b65} `created_at`\u{ff08}\u{4e0e} `create_post` \u{4e00}\u{81f4}\u{ff09}\u{ff1b}\u{521b}\u{5efa}\u{4e0e}\u{66f4}\u{65b0}\u{6587}\u{7ae0}\u{65f6}\u{72b6}\u{6001}\u{62fc}\u{5199}\u{4e0d}\u{5bf9}\u{76f4}\u{63a5}\u{62a5}\u{300c}status \u{65e0}\u{6548}\u{ff0c}\u{53ea}\u{80fd}\u{662f} draft \u{6216} published\u{300d}\u{3002}\n- **\u{672a}\u{914d}\u{7f6e}\u{53ef}\u{4fe1}\u{4ee3}\u{7406}\u{65f6}\u{4e0a}\u{4f20}\u{9650}\u{6d41}\u{5168}\u{7ad9}\u{5171}\u{4eab}**\u{ff1a}\u{670d}\u{52a1}\u{542f}\u{52a8}\u{672a}\u{6ce8}\u{5165}\u{8fde}\u{63a5}\u{4fe1}\u{606f}\u{ff0c}\u{56fe}\u{7247}\u{4e0a}\u{4f20}\u{3001}\u{8bc4}\u{8bba}\u{56fe}\u{7247}\u{4e0a}\u{4f20}\u{4e0e}\u{5907}\u{4efd}\u{5bfc}\u{5165}\u{5728} `TRUSTED_PROXY_COUNT=0`\u{ff08}\u{9ed8}\u{8ba4}\u{ff09}\u{65f6}\u{53d6}\u{4e0d}\u{5230} TCP \u{5bf9}\u{7aef}\u{5730}\u{5740}\u{ff0c}\u{6240}\u{6709}\u{4eba}\u{5171}\u{7528} `unknown` \u{9650}\u{6d41}\u{6876}\u{ff0c}\u{533f}\u{540d}\u{8bc4}\u{8bba}\u{4e0a}\u{4f20}\u{7684}\u{6bcf}\u{65e5} 30 \u{5f20}\u{53d8}\u{6210}\u{5168}\u{7ad9}\u{5171}\u{4eab}\u{989d}\u{5ea6}\u{3002}\u{73b0}\u{5728}\u{542f}\u{52a8}\u{65f6}\u{6ce8}\u{5165} `ConnectInfo`\u{ff0c}\u{8fd9}\u{4e9b}\u{63a5}\u{53e3}\u{6309}\u{5bf9}\u{7aef}\u{5730}\u{5740}\u{9650}\u{6d41}\u{3002}\n- **\u{6ce8}\u{518c}\u{5173}\u{95ed}\u{540e}\u{4ecd}\u{4e3a}\u{6bcf}\u{6b21}\u{8bf7}\u{6c42}\u{8ba1}\u{7b97}\u{5bc6}\u{7801}\u{54c8}\u{5e0c}**\u{ff1a}\u{6ce8}\u{518c}\u{5148}\u{65e0}\u{6761}\u{4ef6}\u{7b97} Argon2\u{ff08}\u{6bcf}\u{6b21}\u{7ea6} 19 MiB \u{5185}\u{5b58}\u{3001}\u{5360}\u{4e00}\u{4e2a}\u{963b}\u{585e}\u{7ebf}\u{7a0b}\u{ff09}\u{ff0c}\u{518d}\u{7531} `INSERT \u{2026} WHERE NOT EXISTS` \u{5224}\u{65ad}\u{7ad9}\u{70b9}\u{662f}\u{5426}\u{5df2}\u{6709}\u{7528}\u{6237}\u{ff1b}\u{7ad9}\u{70b9}\u{521d}\u{59cb}\u{5316}\u{540e}\u{6bcf}\u{4e2a}\u{533f}\u{540d}\u{6ce8}\u{518c}\u{8bf7}\u{6c42}\u{90fd}\u{767d}\u{7b97}\u{4e00}\u{6b21}\u{54c8}\u{5e0c}\u{ff0c}\u{9650}\u{6d41}\u{989d}\u{5ea6}\u{5185}\u{5373}\u{53ef}\u{5360}\u{6ee1}\u{5185}\u{5b58}\u{4e0e}\u{963b}\u{585e}\u{7ebf}\u{7a0b}\u{6c60}\u{3002}\u{73b0}\u{5728}\u{5148}\u{67e5} `users` \u{662f}\u{5426}\u{4e3a}\u{7a7a}\u{ff0c}\u{975e}\u{7a7a}\u{76f4}\u{63a5}\u{8fd4}\u{56de}\u{6ce8}\u{518c}\u{5df2}\u{5173}\u{95ed}\u{ff0c}\u{4e0d}\u{518d}\u{8ba1}\u{7b97}\u{54c8}\u{5e0c}\u{ff1b}\u{5e76}\u{53d1}\u{9996}\u{6b21}\u{6ce8}\u{518c}\u{4ecd}\u{7531}\u{63d2}\u{5165}\u{6761}\u{4ef6}\u{515c}\u{5e95}\u{3002}\n- **\u{641c}\u{7d22} `C++`\u{3001}`R&D` \u{7684}\u{94fe}\u{63a5}\u{4e22}\u{5b57}**\u{ff1a}\u{7ad9}\u{5185}\u{5730}\u{5740}\u{62fc}\u{67e5}\u{8be2}\u{53c2}\u{6570}\u{65f6}\u{4e0d}\u{7f16}\u{7801} `+`\u{3001}`&`\u{3001}`=`\u{3001}`%`\u{ff0c}\u{641c}\u{7d22} `C++` \u{7684}\u{94fe}\u{63a5}\u{88ab}\u{89e3}\u{6790}\u{6210} `C` \u{52a0}\u{4e24}\u{4e2a}\u{7a7a}\u{683c}\u{ff0c}`R&D` \u{88ab}\u{622a}\u{6210} `R`\u{3002}\u{73b0}\u{5728}\u{8fd9}\u{56db}\u{4e2a}\u{5b57}\u{7b26}\u{90fd}\u{6309}\u{767e}\u{5206}\u{53f7}\u{7f16}\u{7801}\u{3002}\n- **SQL \u{63a7}\u{5236}\u{53f0}\u{6267}\u{884c}\u{4e0d}\u{4e86} `SHOW` \u{548c} `EXPLAIN`**\u{ff1a}\u{53ea}\u{8bfb}\u{8bed}\u{53e5}\u{4e00}\u{5f8b}\u{5305}\u{6210} `SELECT * FROM (\u{2026}) AS q LIMIT 501` \u{53d6}\u{7ed3}\u{679c}\u{ff0c}\u{52fe}\u{9009}\u{300c}\u{6267}\u{884c}\u{8ba1}\u{5212}\u{300d}\u{65f6}\u{518d}\u{52a0} `EXPLAIN` \u{524d}\u{7f00}\u{ff0c}`SHOW search_path` \u{4e0e} `EXPLAIN SELECT \u{2026}` \u{5305}\u{88f9}\u{540e}\u{90fd}\u{662f}\u{8bed}\u{6cd5}\u{9519}\u{8bef}\u{3002}\u{73b0}\u{5728}\u{53ea}\u{6709}\u{67e5}\u{8be2}\u{8bed}\u{53e5}\u{624d}\u{52a0} `EXPLAIN` \u{524d}\u{7f00}\u{548c}\u{5b50}\u{67e5}\u{8be2}\u{5305}\u{88f9}\u{ff0c}`SHOW`/`EXPLAIN` \u{539f}\u{6837}\u{6267}\u{884c}\u{ff0c}\u{7ed3}\u{679c}\u{4ecd}\u{6309} 500 \u{884c}\u{622a}\u{65ad}\u{3002}\n- **\u{591a}\u{952e}\u{8bbe}\u{7f6e}\u{4fdd}\u{5b58}\u{4e2d}\u{9014}\u{5931}\u{8d25}\u{4f1a}\u{90e8}\u{5206}\u{751f}\u{6548}**\u{ff1a}\u{5b89}\u{5168}\u{3001}\u{9650}\u{6d41}\u{3001}\u{4ee3}\u{7801}\u{8fd0}\u{884c}\u{5668}\u{3001}\u{56fe}\u{7247}\u{7f13}\u{5b58}\u{4e0e}\u{5c3a}\u{5bf8}\u{9650}\u{5236}\u{3001}WebP\u{3001}\u{7d20}\u{6750}\u{6e05}\u{7406}\u{3001}\u{5907}\u{4efd}\u{3001}\u{56de}\u{6536}\u{7ad9}\u{8bbe}\u{7f6e}\u{9010}\u{952e}\u{5199}\u{5165}\u{ff0c}\u{7b2c}\u{4e8c}\u{4e2a}\u{952e}\u{8d77}\u{5199}\u{5165}\u{5931}\u{8d25}\u{65f6}\u{9875}\u{9762}\u{62a5}\u{9519}\u{ff0c}\u{5df2}\u{5199}\u{5165}\u{7684}\u{952e}\u{5374}\u{4f1a}\u{5728}\u{7f13}\u{5b58}\u{8fc7}\u{671f}\u{540e}\u{751f}\u{6548}\u{ff08}\u{4f8b}\u{5982}\u{7ad9}\u{70b9}\u{5730}\u{5740}\u{5df2}\u{6539}\u{6210} http\u{3001}`cookie_secure` \u{4ecd}\u{4e3a}\u{771f}\u{ff0c}http \u{4e0b}\u{65e0}\u{6cd5}\u{767b}\u{5f55}\u{ff09}\u{3002}\u{73b0}\u{5728}\u{4e00}\u{7ec4}\u{914d}\u{7f6e}\u{7528}\u{4e00}\u{6761} `INSERT \u{2026} SELECT FROM UNNEST \u{2026} ON CONFLICT` \u{5199}\u{5165}\u{ff0c}\u{8981}\u{4e48}\u{5168}\u{90e8}\u{751f}\u{6548}\u{3001}\u{8981}\u{4e48}\u{5168}\u{90e8}\u{4e0d}\u{53d8}\u{3002}\n- **\u{540e}\u{53f0}\u{4fdd}\u{5b58}\u{9014}\u{4e2d}\u{5207}\u{6362}\u{9875}\u{9762}\u{53ef}\u{81f4}\u{524d}\u{7aef}\u{5d29}\u{6e83}**\u{ff1a}\u{53cb}\u{94fe}\u{7f16}\u{8f91}\u{3001}\u{4e2a}\u{4eba}\u{8d44}\u{6599}\u{3001}\u{8bc4}\u{8bba}\u{56de}\u{590d}\u{5728}\u{8bf7}\u{6c42}\u{8fd4}\u{56de}\u{540e}\u{8c03}\u{7528}\u{7236}\u{7ec4}\u{4ef6}\u{56de}\u{8c03}\u{ff0c}\u{671f}\u{95f4}\u{82e5}\u{5df2}\u{5207}\u{6362}\u{7f16}\u{8f91}\u{5bf9}\u{8c61}\u{ff08}\u{5982}\u{53cb}\u{94fe}\u{4fdd}\u{5b58}\u{4e2d}\u{70b9}\u{4e86}\u{53e6}\u{4e00}\u{6761}\u{ff09}\u{6216}\u{79bb}\u{5f00}\u{9875}\u{9762}\u{ff0c}\u{56de}\u{8c03}\u{6240}\u{5728}\u{4f5c}\u{7528}\u{57df}\u{5df2}\u{91ca}\u{653e}\u{ff0c}`Callback::run` panic\u{ff0c}release \u{524d}\u{7aef} panic \u{5373} trap\u{ff0c}\u{9875}\u{9762}\u{5931}\u{53bb}\u{54cd}\u{5e94}\u{3002}\u{73b0}\u{5728}\u{6539}\u{7528} `try_run`\u{ff0c}\u{4f5c}\u{7528}\u{57df}\u{5df2}\u{91ca}\u{653e}\u{65f6}\u{4e22}\u{5f03}\u{8fdf}\u{5230}\u{7ed3}\u{679c}\u{3002}\n- **\u{706f}\u{7bb1}\u{952e}\u{76d8}\u{4e0e}\u{8fde}\u{6309}**\u{ff1a}\u{653e}\u{5927}\u{540e}\u{680f}\u{4f4d}\u{7a7a}\u{95f2}\u{6de1}\u{51fa}\u{4e0d}\u{770b}\u{7126}\u{70b9}\u{ff0c}Tab \u{505c}\u{5728}\u{6309}\u{94ae}\u{4e0a} 2.5 s \u{540e}\u{6309}\u{94ae}\u{53d8}\u{900f}\u{660e}\u{ff1b}\u{73b0}\u{5728}\u{7126}\u{70b9}\u{5728}\u{680f}\u{5185}\u{63a7}\u{4ef6}\u{4e0a}\u{65f6}\u{4e0d}\u{6de1}\u{51fa}\u{3002}\u{6362}\u{56fe}\u{6de1}\u{51fa}\u{7684} 150 ms \u{5185}\u{8fde}\u{6309}\u{65b9}\u{5411}\u{952e}\u{6216}\u{7bad}\u{5934}\u{6309}\u{94ae}\u{ff0c}\u{7b2c}\u{4e8c}\u{6b21}\u{4ecd}\u{4ee5}\u{65e7}\u{5e8f}\u{53f7}\u{4e3a}\u{57fa}\u{51c6}\u{ff0c}\u{4e24}\u{6b21}\u{53ea}\u{524d}\u{8fdb}\u{4e00}\u{5f20}\u{ff1b}\u{73b0}\u{5728}\u{4ee5}\u{5df2}\u{6392}\u{961f}\u{7684}\u{76ee}\u{6807}\u{4e3a}\u{57fa}\u{51c6}\u{3002}\n- **\u{4ee3}\u{7801}\u{5757}\u{9000}\u{683c}\u{5207}\u{65ad} emoji**\u{ff1a}\u{4ee3}\u{7801}\u{5757}\u{7684}\u{9000}\u{683c}\u{6309} UTF-16 \u{7801}\u{5143}\u{5220}\u{4e00}\u{4f4d}\u{ff0c}emoji \u{7559}\u{4e0b}\u{5b64}\u{7acb}\u{4ee3}\u{7406}\u{ff0c}ZWJ \u{7ec4}\u{5408}\u{8868}\u{60c5}\u{88ab}\u{62c6}\u{5f00}\u{ff1b}\u{73b0}\u{5728}\u{6309}\u{5b57}\u{5f62}\u{7c07}\u{5220}\u{9664}\u{ff08}\u{65e0} `Intl.Segmenter` \u{65f6}\u{6309}\u{7801}\u{70b9}\u{ff09}\u{3002}\u{4ee3}\u{7801}\u{5757}\u{8fd0}\u{884c}\u{4e2d}\u{88ab}\u{6539}\u{6210}\u{4e0d}\u{53ef}\u{8fd0}\u{884c}\u{6216}\u{5220}\u{9664}\u{65f6}\u{ff0c}\u{7ed3}\u{675f}\u{540e}\u{4e0d}\u{518d}\u{56e0}\u{6309}\u{94ae}\u{5df2}\u{7f6e}\u{7a7a}\u{629b}\u{51fa}\u{672a}\u{5904}\u{7406}\u{7684}\u{5f02}\u{5e38}\u{3002}\n- **\u{706f}\u{7bb1}\u{6eda}\u{52a8}\u{5173}\u{95ed}\u{9010}\u{5e27}\u{8ddf}\u{624b}**\u{ff1a}\u{9875}\u{9762}\u{6eda}\u{52a8}\u{7f29}\u{56de}\u{539f}\u{56fe}\u{65f6}\u{ff0c}\u{539f}\u{5148}\u{6bcf}\u{6b21}\u{6eda}\u{52a8}\u{4e8b}\u{4ef6}\u{90fd}\u{7ed9}\u{56fe}\u{7247}\u{8bbe} 100 ms \u{8fc7}\u{6e21}\u{ff0c}\u{8fc7}\u{6e21}\u{6bcf}\u{6b21}\u{91cd}\u{8bbe}\u{76ee}\u{6807}\u{90fd}\u{4ece}\u{5934}\u{8d77}\u{6b65}\u{ff0c}\u{56fe}\u{7247}\u{603b}\u{662f}\u{843d}\u{540e}\u{4e8e}\u{9875}\u{9762}\u{4e0a}\u{7684}\u{539f}\u{56fe}\u{3002}\u{73b0}\u{5728}\u{9010}\u{6b21}\u{76f4}\u{5199} `transform` \u{4e0e}\u{4e0d}\u{900f}\u{660e}\u{5ea6}\u{ff0c}\u{4e0d}\u{518d}\u{52a0} CSS \u{8fc7}\u{6e21}\u{ff1b}\u{505c}\u{6b62}\u{6eda}\u{52a8} 150 ms \u{540e}\u{6536}\u{5c3e}\u{ff1a}\u{7f29}\u{56de}\u{8fdb}\u{5ea6}\u{8fbe}\u{5230} 35% \u{7ee7}\u{7eed}\u{98de}\u{56de}\u{539f}\u{56fe}\u{5e76}\u{5173}\u{95ed}\u{ff08}ease-out cubic\u{ff0c}\u{6700}\u{77ed} 120 ms\u{ff0c}\u{63a5}\u{4f4f}\u{6eda}\u{52a8}\u{4e2d}\u{7684}\u{8fd0}\u{52a8}\u{ff09}\u{ff0c}\u{4e0d}\u{8db3}\u{5219} 180 ms \u{56de}\u{5f39}\u{5230}\u{5b8c}\u{5168}\u{6253}\u{5f00}\u{ff0c}\u{5e76}\u{4ee5}\u{5f53}\u{524d}\u{6eda}\u{52a8}\u{4f4d}\u{7f6e}\u{91cd}\u{65b0}\u{8d77}\u{7b97}\u{3002}\n- **\u{7ec4}\u{4ef6}\u{56fe}\u{9274}\u{82e5}\u{5e72}\u{6837}\u{5f0f}**\u{ff1a}\u{8bc4}\u{8bba}\u{5361}\u{7247}\u{6cbf}\u{7528}\u{751f}\u{4ea7}\u{6837}\u{5f0f}\u{ff0c}\u{4ee3}\u{7801}\u{8fd0}\u{884c}\u{5668}\u{5361}\u{7247}\u{5b8c}\u{6574}\u{663e}\u{793a}\u{ff1b}\u{7d20}\u{6750}\u{4e0a}\u{4f20}\u{5f39}\u{7a97}\u{5361}\u{7247}\u{9884}\u{89c8}\u{5b8c}\u{6574}\u{663e}\u{793a}\u{6587}\u{4ef6}\u{5217}\u{8868}\u{ff1b}\u{8f93}\u{5165}\u{680f}\u{805a}\u{7126}\u{65f6}\u{4e0d}\u{518d}\u{53e0}\u{52a0}\u{56fe}\u{9274}\u{7684}\u{5185}\u{5c42}\u{63cf}\u{8fb9}\u{3002}\n\n## [1.3.0] - 2026-10-31\n\nMermaid \u{6539}\u{4e3a}\u{670d}\u{52a1}\u{7aef}\u{6e32}\u{67d3}\u{5e76}\u{8865}\u{5168}\u{5404}\u{7c7b}\u{56fe}\u{8868}\u{7684}\u{660e}\u{6697}\u{914d}\u{8272}\u{ff1b}\u{524d}\u{53f0}\u{9875}\u{9762}\u{6570}\u{636e}\u{5728} HTML \u{4e2d}\u{4e0d}\u{518d}\u{91cd}\u{590d}\u{4e09}\u{4efd}\u{ff1b}\u{65b0}\u{589e}\u{672c}\u{5730}\u{53cc}\u{67b6}\u{6784}\u{955c}\u{50cf}\u{6784}\u{5efa}\u{811a}\u{672c}\u{ff0c}\u{5e76}\u{4fee}\u{590d}\u{4ee3}\u{7801}\u{8fd0}\u{884c}\u{5668}\u{4e0e}\u{6298}\u{53e0}\u{5757}\u{7684}\u{82e5}\u{5e72}\u{7248}\u{5f0f}\u{95ee}\u{9898}\u{3002}\n\n### Added\n\n- **\u{672c}\u{5730}\u{53cc}\u{67b6}\u{6784}\u{955c}\u{50cf}\u{6784}\u{5efa}\u{811a}\u{672c}**\u{ff1a}\u{65b0}\u{589e} `fish scripts/build-docker.fish`\u{ff0c}\u{5f00}\u{542f} `CN_MIRROR=true`\u{ff0c}\u{4f7f}\u{7528}\u{672c}\u{673a} Docker \u{5206}\u{522b}\u{6784}\u{5efa}\u{5e76}\u{52a0}\u{8f7d} `yggdrasil:amd64`\u{3001}`yggdrasil:arm64`\u{ff0c}\u{4e0d}\u{63a8}\u{9001}\u{3001}\u{4e0d}\u{90e8}\u{7f72}\u{3002}\u{590d}\u{7528} Makefile \u{7684} Git \u{6784}\u{5efa}\u{4fe1}\u{606f}\u{548c}\u{7248}\u{672c}\u{6807}\u{7b7e}\u{ff0c}\u{65b0}\u{589e} `make docker-arm64`\u{ff1b}\u{6784}\u{5efa}\u{524d}\u{68c0}\u{67e5}\u{5e73}\u{53f0}\u{652f}\u{6301}\u{ff0c}\u{6784}\u{5efa}\u{540e}\u{6838}\u{5bf9}\u{955c}\u{50cf}\u{67b6}\u{6784}\u{3002}\n\n### Changed\n\n- **\u{955c}\u{50cf}\u{63a8}\u{9001}\u{811a}\u{672c}\u{652f}\u{6301}\u{5f00}\u{53d1}\u{4e0e}\u{6b63}\u{5f0f}\u{6807}\u{7b7e}**\u{ff1a}`scripts/push-dev-image.fish` \u{91cd}\u{547d}\u{540d}\u{4e3a} `scripts/push-docker.fish`\u{ff0c}\u{652f}\u{6301} `[dev|release]` \u{53c2}\u{6570}\u{ff1b}\u{9ed8}\u{8ba4}\u{63a8}\u{9001} `hub.rua.plus/yggdrasil:<\u{7248}\u{672c}>-dev`\u{ff0c}`release` \u{63a8}\u{9001} `<\u{7248}\u{672c}>`\u{ff0c}\u{4e0d}\u{66f4}\u{65b0} `latest`\u{3002}\u{4fee}\u{590d} `version` \u{4e0e} Fish \u{53ea}\u{8bfb}\u{53d8}\u{91cf}\u{540c}\u{540d}\u{5bfc}\u{81f4}\u{955c}\u{50cf}\u{8bef}\u{7528} Fish \u{7248}\u{672c}\u{53f7}\u{7684}\u{95ee}\u{9898}\u{ff1b}\u{8fdc}\u{7aef}\u{67b6}\u{6784}\u{68c0}\u{67e5}\u{8ddf}\u{968f} `PLATFORMS`\u{ff0c}\u{4ec5}\u{9009}\u{62e9} amd64 \u{65f6}\u{4e0d}\u{518d}\u{5b89}\u{88c5} arm64 \u{6a21}\u{62df}\u{652f}\u{6301}\u{3002}\n- **\u{52a8}\u{6001}\u{538b}\u{7f29}\u{8d28}\u{91cf} 6 \u{2192} 7**\u{ff1a}`COMPRESSION_ALGORITHMS` \u{538b}\u{7f29}\u{5c42}\u{7684} brotli \u{518d}\u{5c0f} 1.9\u{2013}2.9%\u{ff08}`feed.xml` 232,472 \u{2192} 227,470 B\u{ff09}\u{ff0c}\u{8017}\u{65f6}\u{589e}\u{52a0}\u{51e0}\u{6beb}\u{79d2}\u{ff1b}`make precompress` \u{8865}\u{4e0a} `manifest.webmanifest` \u{7684} `.br`\u{3002}\n- **Mermaid \u{6539}\u{4e3a}\u{670d}\u{52a1}\u{7aef}\u{6e32}\u{67d3}**\u{ff1a}\u{6587}\u{7ae0}\u{4fdd}\u{5b58}\u{65f6}\u{7528} merman\u{ff08}Mermaid 12.1 \u{7684} Rust \u{5b9e}\u{73b0}\u{ff09}\u{628a}\u{6bcf}\u{4e2a} ```` ```mermaid ```` \u{5757}\u{6e32}\u{67d3}\u{6210}\u{6d45}\u{8272}\u{3001}\u{6df1}\u{8272}\u{4e24}\u{4efd}\u{5185}\u{8054} SVG\u{ff0c}\u{968f}\u{4e3b}\u{9898}\u{7531} CSS \u{5207}\u{6362}\u{ff0c}\u{8bfb}\u{8005}\u{4e0d}\u{518d}\u{4e0b}\u{8f7d} 1.33 MB \u{7684} `mermaid.js`\u{ff0c}\u{4e5f}\u{4e0d}\u{518d}\u{5728}\u{4e3b}\u{7ebf}\u{7a0b}\u{4e0a}\u{6bcf}\u{5f20}\u{56fe}\u{82b1} 160\u{2013}370 ms \u{6392}\u{7248}\u{3002}\u{6807}\u{7b7e}\u{5b57}\u{5bbd}\u{53d6} SF Pro Text\u{3001}Selawik\u{3001}Roboto\u{3001}Liberation Sans\u{3001}Noto Sans \u{4e94}\u{6b3e}\u{5b57}\u{4f53}\u{5b9e}\u{6d4b}\u{5bbd}\u{5ea6}\u{7684}\u{6700}\u{5927}\u{503c}\u{ff08}`libs/shared` \u{7684} `mermaid-font-metrics` \u{751f}\u{6210}\u{5b57}\u{5bbd}\u{8868}\u{ff09}\u{ff0c}\u{7ebf}\u{4e0a} 31 \u{5f20}\u{56fe}\u{5728}\u{8fd9}\u{51e0}\u{6b3e}\u{5b57}\u{4f53}\u{4e0b}\u{6807}\u{7b7e}\u{90fd}\u{4e0d}\u{6ea2}\u{51fa}\u{ff1b}\u{5b50}\u{56fe}\u{6846}\u{91cd}\u{53e0}\u{65f6}\u{81ea}\u{52a8}\u{52a0}\u{5927}\u{8282}\u{70b9}\u{95f4}\u{8ddd}\u{91cd}\u{6392}\u{ff0c}\u{5b50}\u{56fe}\u{6807}\u{9898}\u{7ed8}\u{5236}\u{5728}\u{6240}\u{6709}\u{5b50}\u{56fe}\u{4e4b}\u{4e0a}\u{3002}\u{6e32}\u{67d3}\u{5931}\u{8d25}\u{7684}\u{56fe}\u{663e}\u{793a}\u{6e90}\u{7801}\u{ff0c}\u{6587}\u{7ae0}\u{7167}\u{5e38}\u{4fdd}\u{5b58}\u{3002}\u{540e}\u{53f0}\u{7f16}\u{8f91}\u{5668}\u{9884}\u{89c8}\u{6539}\u{4e3a}\u{8c03}\u{7528}\u{540c}\u{4e00}\u{5957}\u{670d}\u{52a1}\u{7aef}\u{6e32}\u{67d3}\u{ff1b}RSS/JSON Feed \u{53ea}\u{8f93}\u{51fa}\u{6d45}\u{8272}\u{56fe}\u{3002}\u{5220}\u{9664} `libs/mermaid-renderer` \u{53ca}\u{524d}\u{53f0}\u{4e3b}\u{9898}\u{5207}\u{6362}\u{65f6}\u{7684}\u{5f02}\u{6b65}\u{91cd}\u{6e32}\u{67d3}\u{3002}**\u{90e8}\u{7f72}\u{540e}\u{9700}\u{5728}\u{540e}\u{53f0}\u{6587}\u{7ae0}\u{5217}\u{8868}\u{6267}\u{884c}\u{4e00}\u{6b21}\u{300c}\u{91cd}\u{5efa}\u{5168}\u{90e8}\u{6e32}\u{67d3}\u{300d}**\u{ff0c}\u{65e7}\u{6587}\u{7ae0}\u{624d}\u{4f1a}\u{4ece}\u{4ee3}\u{7801}\u{5757}\u{53d8}\u{6210}\u{56fe}\u{8868}\u{3002}\n\n### Fixed\n\n- **\u{4ee3}\u{7801}\u{8fd0}\u{884c}\u{5668}\u{9aa8}\u{67b6}\u{5c4f}\u{9519}\u{4f4d}**\u{ff1a}\u{8fd0}\u{884c}\u{65f6}\u{7684}\u{5360}\u{4f4d}\u{6761}\u{5782}\u{76f4}\u{5c45}\u{4e2d}\u{3001}\u{5de6}\u{7f18} 14 px\u{ff0c}\u{800c}\u{7ec8}\u{7aef}\u{9996}\u{884c}\u{5728}\u{9876}\u{90e8}\u{3001}\u{5de6}\u{7f18} 8 px\u{ff0c}\u{7ed3}\u{679c}\u{51fa}\u{73b0}\u{65f6}\u{6587}\u{5b57}\u{76f8}\u{5bf9}\u{5360}\u{4f4d}\u{6761}\u{4e0a}\u{79fb}\u{3001}\u{5de6}\u{79fb}\u{3002}\u{73b0}\u{5728}\u{5360}\u{4f4d}\u{6761}\u{81ea}\u{9876}\u{90e8}\u{8d77}\u{6309}\u{7ec8}\u{7aef}\u{884c}\u{9ad8}\u{ff08}1.4rem\u{ff09}\u{6392}\u{5e03}\u{3001}\u{5de6}\u{7f18}\u{540c}\u{4e3a} 0.5rem\u{ff0c}\u{4e0e} xterm \u{9996}\u{3001}\u{4e8c}\u{884c}\u{7684}\u{4e2d}\u{5fc3}\u{5bf9}\u{9f50}\u{ff1b}\u{8f93}\u{51fa}\u{533a}\u{8868}\u{5934}\u{6539}\u{4e3a}\u{56fa}\u{5b9a}\u{9ad8}\u{5ea6}\u{ff0c}\u{907f}\u{514d}\u{53f3}\u{4fa7}\u{7b49}\u{5bbd}\u{4e2d}\u{6587}\u{56de}\u{9000}\u{5b57}\u{4f53}\u{6491}\u{9ad8}\u{884c}\u{76d2}\u{ff0c}\u{7ed3}\u{679c}\u{51fa}\u{73b0}\u{65f6}\u{6574}\u{4e2a}\u{8f93}\u{51fa}\u{533a}\u{4e0b}\u{79fb}\u{3002}\n- **\u{4ee3}\u{7801}\u{8fd0}\u{884c}\u{5668}\u{52a8}\u{6548}**\u{ff1a}\u{8fd0}\u{884c}\u{65f6}\u{7684}\u{9aa8}\u{67b6}\u{6761}\u{88ab} xterm \u{76d6}\u{4f4f}\u{ff08}\u{9aa8}\u{67b6}\u{6ca1}\u{6709}\u{5c42}\u{53e0}\u{5c42}\u{7ea7}\u{ff0c}DOM \u{5728}\u{540e}\u{7684}\u{7ec8}\u{7aef}\u{753b}\u{5728}\u{5b83}\u{4e0a}\u{9762}\u{ff09}\u{ff0c}\u{300c}\u{6b63}\u{5728}\u{542f}\u{52a8}\u{5bb9}\u{5668}\u{2026}\u{300d}\u{8fd8}\u{5355}\u{72ec}\u{5360}\u{4e00}\u{884c}\u{ff0c}\u{51c6}\u{5907}\u{4e2d}\u{8fdb}\u{5165}\u{8fd0}\u{884c}\u{65f6}\u{6574}\u{4e2a}\u{8fd0}\u{884c}\u{5668}\u{5148}\u{957f}\u{9ad8} 35.5 px \u{518d}\u{6536}\u{56de}\u{ff0c}\u{4e0b}\u{65b9}\u{6b63}\u{6587}\u{8ddf}\u{7740}\u{4e0b}\u{8df3}\u{ff1b}\u{300c}\u{8fd0}\u{884c}\u{300d}\u{53d8}\u{300c}\u{518d}\u{6b21}\u{8fd0}\u{884c}\u{300d}\u{65f6}\u{6309}\u{94ae}\u{53d8}\u{5bbd}\u{ff0c}\u{6807}\u{9898}\u{680f}\u{53f3}\u{4fa7}\u{7684}\u{72b6}\u{6001}\u{3001}Vim\u{3001}\u{590d}\u{5236}\u{6309}\u{94ae}\u{4e00}\u{8d77}\u{5de6}\u{79fb}\u{3002}\u{73b0}\u{5728}\u{9aa8}\u{67b6}\u{81ea}\u{6210}\u{4e00}\u{5c42}\u{5e76}\u{627f}\u{8f7d}\u{9636}\u{6bb5}\u{63d0}\u{793a}\u{ff08}\u{6392}\u{961f}\u{63d0}\u{793a}\u{540c}\u{6837}\u{6536}\u{8fdb}\u{53bb}\u{ff09}\u{ff0c}\u{4ece}\u{70b9}\u{51fb}\u{8fd0}\u{884c}\u{5230}\u{7ed3}\u{675f}\u{9ad8}\u{5ea6}\u{4e0d}\u{53d8}\u{ff0c}\u{8fd0}\u{884c}\u{6309}\u{94ae}\u{6309}\u{6700}\u{957f}\u{6587}\u{6848}\u{9884}\u{7559}\u{5bbd}\u{5ea6}\u{3002}\n- **Mermaid \u{975e}\u{6d41}\u{7a0b}\u{56fe}\u{7c7b}\u{56fe}\u{8868}\u{914d}\u{8272}**\u{ff1a}\u{7ad9}\u{70b9}\u{914d}\u{8272}\u{539f}\u{5148}\u{53ea}\u{7ed9}\u{4e86}\u{901a}\u{7528}\u{4e3b}\u{9898}\u{53d8}\u{91cf}\u{ff0c}\u{7518}\u{7279}\u{56fe}\u{3001}ER\u{3001}\u{65f6}\u{95f4}\u{7ebf}\u{3001}\u{601d}\u{7ef4}\u{5bfc}\u{56fe}\u{3001}\u{770b}\u{677f}\u{3001}git \u{56fe}\u{3001}\u{997c}\u{56fe}\u{3001}XY \u{56fe}\u{3001}\u{96f7}\u{8fbe}\u{56fe}\u{3001}\u{77e9}\u{5f62}\u{6811}\u{56fe}\u{3001}\u{6570}\u{636e}\u{5305}\u{56fe}\u{3001}\u{67b6}\u{6784}\u{56fe}\u{3001}C4 \u{7684}\u{4e13}\u{7528}\u{989c}\u{8272}\u{90fd}\u{7531}\u{767d}\u{8272}\u{8282}\u{70b9}\u{8272}\u{63a8}\u{5bfc}\u{ff0c}\u{7ed3}\u{679c}\u{662f}\u{4e00}\u{7247}\u{7070}\u{ff0c}\u{6df1}\u{8272}\u{6a21}\u{5f0f}\u{4e0b}\u{8fd8}\u{6709}\u{6d45}\u{5e95}\u{767d}\u{5b57}\u{ff08}ER \u{5c5e}\u{6027}\u{884c}\u{3001}\u{5df2}\u{5b8c}\u{6210}\u{4efb}\u{52a1}\u{ff09}\u{3001}\u{9ed1}\u{8272}\u{5206}\u{652f}\u{4e0e}\u{6247}\u{533a}\u{3001}\u{770b}\u{4e0d}\u{89c1}\u{7684}\u{5b57}\u{8282}\u{7f16}\u{53f7}\u{4e0e}\u{5173}\u{7cfb}\u{6807}\u{7b7e}\u{3002}\u{73b0}\u{5728}\u{8fd9}\u{4e9b}\u{56fe}\u{90fd}\u{663e}\u{5f0f}\u{4f7f}\u{7528}\u{7ad9}\u{70b9}\u{7684}\u{7cfb}\u{5217}\u{8272}\u{ff08}\u{9676}\u{571f}\u{3001}\u{9f20}\u{5c3e}\u{8349}\u{3001}\u{77f3}\u{677f}\u{84dd}\u{3001}\u{8d6d}\u{9ec4}\u{3001}\u{6885}\u{7d2b}\u{3001}\u{9752}\u{2026}\u{2026}\u{ff09}\u{548c}\u{5bf9}\u{5e94}\u{7684}\u{5206}\u{533a}\u{6d45}\u{5e95}\u{3002}\u{53e6}\u{4fee}\u{ff1a}\u{65b9}\u{5757}\u{56fe}\u{7ec4}\u{5408}\u{5757}\u{53d8}\u{6210} 50% \u{9ed1}\u{6846}\u{ff08}\u{534a}\u{900f}\u{660e}\u{5b50}\u{56fe}\u{5e95}\u{8272}\u{88ab} `fade()` \u{6539}\u{4e86}\u{900f}\u{660e}\u{5ea6}\u{ff0c}\u{4e3b}\u{9898}\u{8272}\u{4e00}\u{5f8b}\u{6539}\u{4e3a}\u{4e0d}\u{900f}\u{660e}\u{ff09}\u{ff1b}\u{7518}\u{7279}\u{56fe}\u{7f51}\u{683c}\u{7ebf}\u{8ddf}\u{968f}\u{6b63}\u{6587}\u{53d8}\u{6210}\u{9ed1}\u{7ebf}\u{ff1b}ER\u{300c}\u{96f6}\u{300d}\u{57fa}\u{6570}\u{5706}\u{5708}\u{5728}\u{6df1}\u{8272}\u{4e0b}\u{662f}\u{5b9e}\u{5fc3}\u{767d}\u{70b9}\u{ff1b}\u{6851}\u{57fa}\u{56fe}\u{8fde}\u{7ebf}\u{5728}\u{6df1}\u{8272}\u{80cc}\u{666f}\u{4e0a}\u{7528}\u{6b63}\u{7247}\u{53e0}\u{5e95}\u{51e0}\u{4e4e}\u{5168}\u{9ed1}\u{ff0c}\u{6df1}\u{8272}\u{6539}\u{4e3a}\u{6ee4}\u{8272}\u{ff1b}C4 \u{6a2a}\u{5411}\u{5173}\u{7cfb}\u{6807}\u{7b7e}\u{538b}\u{5230}\u{4e24}\u{4fa7}\u{5f62}\u{72b6}\u{4e0a}\u{3002}\u{540c}\u{6837}\u{9700}\u{8981}\u{300c}\u{91cd}\u{5efa}\u{5168}\u{90e8}\u{6e32}\u{67d3}\u{300d}\u{540e}\u{751f}\u{6548}\u{3002}\n- **Mermaid \u{65f6}\u{5e8f}\u{56fe}\u{81ea}\u{8c03}\u{7528}\u{6807}\u{7b7e}**\u{ff1a}\u{81ea}\u{8c03}\u{7528}\u{6d88}\u{606f}\u{7684}\u{6807}\u{7b7e}\u{5c45}\u{4e2d}\u{538b}\u{5728}\u{751f}\u{547d}\u{7ebf}\u{4e0a}\u{ff0c}\u{5f00}\u{4e86} `autonumber` \u{65f6}\u{5e8f}\u{53f7}\u{5706}\u{70b9}\u{8fd8}\u{538b}\u{4f4f}\u{6807}\u{7b7e}\u{4e0b}\u{6cbf}\u{3002}\u{73b0}\u{5728}\u{81ea}\u{8c03}\u{7528}\u{6807}\u{7b7e}\u{4e0a}\u{79fb} 8 px \u{8ba9}\u{5f00}\u{5e8f}\u{53f7}\u{ff1b}\u{6240}\u{6709}\u{6d88}\u{606f}\u{6807}\u{7b7e}\u{63cf}\u{4e00}\u{5708}\u{80cc}\u{666f}\u{8272}\u{ff0c}\u{7a7f}\u{8fc7}\u{7684}\u{751f}\u{547d}\u{7ebf}\u{5728}\u{6587}\u{5b57}\u{5904}\u{65ad}\u{5f00}\u{3002}\n- **\u{9875}\u{9762}\u{6570}\u{636e}\u{5728} HTML \u{91cc}\u{91cd}\u{590d}\u{4e09}\u{4efd}**\u{ff1a}\u{524d}\u{53f0}\u{5e03}\u{5c40}\u{628a} `<Outlet/>` \u{5305}\u{5728} `<Suspense>` \u{91cc}\u{ff0c}\u{670d}\u{52a1}\u{7aef}\u{6e32}\u{67d3}\u{65f6} Suspense \u{4f1a}\u{904d}\u{5386}\u{5b50}\u{6811}\u{4e09}\u{6b21}\u{ff0c}\u{6bcf}\u{6b21}\u{90fd}\u{91cd}\u{65b0}\u{8c03}\u{7528}\u{61d2}\u{52a0}\u{8f7d}\u{8def}\u{7531}\u{7684} `data()`\u{ff0c}\u{540c}\u{4e00}\u{4efd}\u{9875}\u{9762}\u{6570}\u{636e}\u{88ab}\u{53d6}\u{4e09}\u{6b21}\u{3001}\u{5199}\u{8fdb}\u{5185}\u{8054}\u{6c34}\u{5408}\u{811a}\u{672c}\u{4e09}\u{6b21}\u{ff0c}\u{800c}\u{5ba2}\u{6237}\u{7aef}\u{53ea}\u{8bfb}\u{7b2c}\u{4e00}\u{4efd}\u{3002}\u{73b0}\u{5728}\u{670d}\u{52a1}\u{7aef}\u{5728}\u{540c}\u{4e00}\u{8bf7}\u{6c42}\u{5185}\u{6309}\u{ff08}\u{53d6}\u{6570}\u{51fd}\u{6570}, \u{53c2}\u{6570}\u{ff09}\u{590d}\u{7528}\u{8def}\u{7531}\u{6570}\u{636e}\u{8d44}\u{6e90}\u{3002}\u{300a}Markdown \u{5168}\u{7279}\u{6027}\u{6d4b}\u{8bd5}\u{6587}\u{7ae0}\u{300b}\u{9875}\u{9762}\u{4ece} 5,135,022 B \u{964d}\u{5230} 2,498,104 B\u{ff0c}\u{9996}\u{9875} 145,586 \u{2192} 105,310 B\u{ff0c}`/changelog` 808,181 \u{2192} 453,021 B\u{3002}\u{4e0a}\u{6e38}\u{95ee}\u{9898}\u{89c1} [leptos-rs/leptos#4985](https://github.com/leptos-rs/leptos/issues/4985)\u{3002}\n- **\u{6298}\u{53e0}\u{5757}\u{5185}\u{4ee3}\u{7801}\u{5757}\u{7f29}\u{8fdb}\u{4e0e}\u{7559}\u{767d}**\u{ff1a}`<details>` \u{5c55}\u{5f00}\u{540e}\u{ff0c}\u{5185}\u{5bb9}\u{7f29}\u{8fdb}\u{539f}\u{5148}\u{7528} `padding`\u{ff0c}\u{4ee3}\u{7801}\u{5757}\u{3001}\u{8868}\u{683c}\u{3001}\u{5f15}\u{7528}\u{7b49}\u{81ea}\u{5e26}\u{5916}\u{6846}\u{7684}\u{5b50}\u{5143}\u{7d20}\u{88ab}\u{6491}\u{6ee1}\u{6574}\u{884c}\u{ff0c}\u{53ea}\u{628a}\u{5185}\u{5bb9}\u{5f80}\u{91cc}\u{6324}\u{ff0c}\u{672b}\u{5c3e}\u{5b50}\u{5143}\u{7d20}\u{7684}\u{5e95}\u{90e8}\u{5185}\u{8fb9}\u{8ddd}\u{8fd8}\u{8ba9}\u{4ee3}\u{7801}\u{5757}\u{6846}\u{591a}\u{51fa}\u{4e00}\u{622a}\u{3002}\u{73b0}\u{5728}\u{7f29}\u{8fdb}\u{6539}\u{7528} `margin`\u{ff0c}\u{5e95}\u{90e8}\u{7559}\u{767d}\u{653e}\u{5728} `details` \u{4e0a}\u{ff1b}\u{5c55}\u{5f00}\u{540e}\u{5185}\u{5bb9}\u{5de6}\u{53f3}\u{5404}\u{7559} 1em\u{ff0c}\u{4e24}\u{4fa7}\u{5bf9}\u{79f0}\u{ff0c}\u{624b}\u{673a}\u{4e0a}\u{6298}\u{53e0}\u{5757}\u{5185}\u{7684}\u{4ee3}\u{7801}\u{5757}\u{4e5f}\u{4e0d}\u{518d}\u{8d34}\u{8fb9}\u{53bb}\u{5706}\u{89d2}\u{3002}\n- **\u{540e}\u{53f0}\u{9884}\u{89c8}\u{76ee}\u{5f55}\u{70b9}\u{51fb}\u{6eda}\u{52a8}**\u{ff1a}\u{540e}\u{53f0}\u{6587}\u{7ae0}\u{9884}\u{89c8}\u{91cc}\u{70b9}\u{51fb}\u{76ee}\u{5f55}\u{6761}\u{76ee}\u{73b0}\u{5728}\u{4f1a}\u{6eda}\u{52a8}\u{5230}\u{5bf9}\u{5e94}\u{6807}\u{9898}\u{3002}\n\n## [1.2.5] - 2026-10-30\n\n\u{4ee3}\u{7801}\u{9ad8}\u{4eae}\u{7edf}\u{4e00}\u{4e3a} Clay \u{914d}\u{8272}\u{ff0c}\u{7f29}\u{51cf}\u{516c}\u{5f00}\u{9875}\u{9996}\u{5c4f} WASM \u{4e0e}\u{963b}\u{585e}\u{6e32}\u{67d3}\u{6837}\u{5f0f}\u{ff1b}\u{670d}\u{52a1}\u{7aef}\u{8bf7}\u{6c42} panic \u{6539}\u{4e3a}\u{9694}\u{79bb}\u{5e76}\u{8fd4}\u{56de}\u{4e0d}\u{53ef}\u{7f13}\u{5b58}\u{7684} 500\u{ff0c}\u{5e38}\u{9a7b}\u{540e}\u{53f0}\u{4efb}\u{52a1}\u{4ecd}\u{5728} panic \u{540e}\u{4ea4}\u{7531}\u{5bb9}\u{5668}\u{91cd}\u{542f}\u{6062}\u{590d}\u{3002}\n\n### Changed\n\n- **\u{4ee3}\u{7801}\u{9ad8}\u{4eae}\u{6539}\u{7528} Clay \u{914d}\u{8272}**\u{ff1a}\u{6587}\u{7ae0}\u{4ee3}\u{7801}\u{5757}\u{3001}Tiptap \u{4e0e} CodeMirror \u{7f16}\u{8f91}\u{5668}\u{3001}\u{8fd0}\u{884c}\u{5668}\u{7ec8}\u{7aef}\u{548c} rustdoc \u{6587}\u{6863}\u{7684}\u{4eae}\u{8272}\u{3001}\u{6697}\u{8272}\u{4ee3}\u{7801}\u{914d}\u{8272}\u{6539}\u{4e3a}\u{79fb}\u{690d}\u{81ea} clay.nvim \u{7684} Clay \u{8bbe}\u{8ba1}\u{89c4}\u{8303}\u{ff1a}\u{5c42}\u{7ea7}\u{9760}\u{4eae}\u{5ea6}\u{800c}\u{4e0d}\u{662f}\u{8272}\u{76f8}\u{ff0c}\u{53d8}\u{91cf}\u{6700}\u{9192}\u{76ee}\u{ff0c}\u{5173}\u{952e}\u{5b57}\u{4e0e}\u{51fd}\u{6570}\u{8c03}\u{7528}\u{9000}\u{540e}\u{ff0c}\u{6807}\u{70b9}\u{548c}\u{6ce8}\u{91ca}\u{6700}\u{6de1}\u{ff1b}\u{53ea}\u{6709}\u{5b57}\u{7b26}\u{4e32}\u{5e26}\u{4e00}\u{70b9}\u{6696}\u{7070}\u{ff0c}\u{51fd}\u{6570}\u{5b9a}\u{4e49}\u{7528}\u{9676}\u{571f}\u{8272}\u{6807}\u{51fa}\u{3002}Diff \u{7684}\u{65b0}\u{589e}\u{3001}\u{5220}\u{9664}\u{6539}\u{4e3a}\u{4eae}\u{3001}\u{6697}\u{4e24}\u{6863}\u{7070}\u{ff0c}\u{7ec8}\u{7aef} ANSI \u{8272}\u{540c}\u{6837}\u{6620}\u{5c04}\u{56de}\u{7070}\u{9636}\u{3002}\u{6240}\u{6709}\u{8bed}\u{6cd5}\u{8272}\u{5728}\u{4ee3}\u{7801}\u{5757}\u{5e95}\u{8272}\u{4e0a}\u{7684}\u{5bf9}\u{6bd4}\u{5ea6}\u{4ecd}\u{4e0d}\u{4f4e}\u{4e8e} 4.5:1\u{3002}\u{51fd}\u{6570}\u{8c03}\u{7528}\u{4e0d}\u{518d}\u{628a}\u{6574}\u{4e2a}\u{53c2}\u{6570}\u{5217}\u{8868}\u{67d3}\u{6210}\u{51fd}\u{6570}\u{8272}\u{ff0c}JSON\u{3001}TOML \u{7684}\u{952e}\u{540d}\u{6309}\u{6210}\u{5458}\u{7740}\u{8272}\u{ff1b}TypeScript\u{3001}TSX\u{3001}JSX \u{8bed}\u{6cd5}\u{533a}\u{5206}\u{51fd}\u{6570}\u{5b9a}\u{4e49}\u{4e0e}\u{8c03}\u{7528}\u{ff0c}\u{6b64}\u{524d} TypeScript \u{628a}\u{6240}\u{6709} `name(` \u{90fd}\u{5f53}\u{4f5c}\u{5b9a}\u{4e49}\u{ff0c}TSX\u{3001}JSX \u{5219}\u{628a} `function name` \u{5f53}\u{4f5c}\u{8c03}\u{7528}\u{3002}\n- **\u{670d}\u{52a1}\u{7aef}\u{6539}\u{56de} panic=unwind**\u{ff1a}`panic = \"abort\"` \u{4ece} `[profile.release]` \u{79fb}\u{5230} WASM \u{4e13}\u{7528}\u{7684} `[profile.wasm-release]`\u{ff0c}\u{524d}\u{7aef}\u{4ea7}\u{7269}\u{4e0d}\u{53d8}\u{3002}\u{6b64}\u{524d}\u{670d}\u{52a1}\u{7aef}\u{4efb}\u{4f55}\u{4e00}\u{4e2a}\u{8bf7}\u{6c42}\u{91cc}\u{7684} panic \u{90fd}\u{4f1a}\u{8ba9}\u{6574}\u{4e2a}\u{8fdb}\u{7a0b}\u{9000}\u{51fa}\u{ff0c}\u{5728}\u{7ebf}\u{8bf7}\u{6c42}\u{4e00}\u{8d77}\u{4e2d}\u{65ad}\u{ff0c}\u{76f4}\u{5230}\u{5bb9}\u{5668}\u{91cd}\u{542f}\u{ff1b}\u{73b0}\u{5728}\u{53ea}\u{4e2d}\u{65ad}\u{51fa}\u{9519}\u{7684}\u{90a3}\u{4e2a}\u{8fde}\u{63a5}\u{ff0c}mhchem \u{5316}\u{5b66}\u{516c}\u{5f0f}\u{8f6c}\u{8bd1}\u{91cc}\u{7684} `catch_unwind` \u{5728} release \u{4e0b}\u{4e5f}\u{771f}\u{6b63}\u{751f}\u{6548}\u{ff0c}\u{574f}\u{516c}\u{5f0f}\u{53ea}\u{9000}\u{56de}\u{539f}\u{6587}\u{3002}\u{5e38}\u{9a7b}\u{540e}\u{53f0}\u{4efb}\u{52a1}\u{ff08}\u{6e05}\u{7406}\u{3001}\u{5907}\u{4efd}\u{3001}\u{8de8}\u{5b9e}\u{4f8b}\u{7f13}\u{5b58}\u{540c}\u{6b65}\u{3001}\u{65e5}\u{5fd7}\u{843d}\u{5e93}\u{3001}\u{9650}\u{6d41}\u{5668}\u{56de}\u{6536}\u{3001}\u{7cfb}\u{7edf}\u{91c7}\u{6837}\u{ff09}\u{6539}\u{7531} `tasks::spawn_supervised` \u{6d3e}\u{751f}\u{ff1a}panic \u{65f6}\u{8bb0}\u{5f55}\u{9519}\u{8bef}\u{5e76}\u{7ec8}\u{6b62}\u{8fdb}\u{7a0b}\u{ff0c}\u{4fdd}\u{6301}\u{539f}\u{5148}\u{300c}\u{5d29}\u{6e83}\u{540e}\u{7531}\u{5bb9}\u{5668}\u{91cd}\u{542f}\u{300d}\u{7684}\u{6062}\u{590d}\u{65b9}\u{5f0f}\u{ff0c}\u{907f}\u{514d}\u{4efb}\u{52a1}\u{9759}\u{9ed8}\u{505c}\u{6446}\u{3002}\n- **\u{524d}\u{7aef}\u{9996}\u{5c4f}\u{4f53}\u{79ef}\u{518d}\u{51cf}\u{4e00}\u{8f6e}**\u{ff1a}\u{8def}\u{7531}\u{6570}\u{636e}\u{8d44}\u{6e90}\u{6539}\u{4e3a}\u{7c7b}\u{578b}\u{64e6}\u{9664}\u{ff0c}\u{6240}\u{6709}\u{8def}\u{7531}\u{5171}\u{7528}\u{4e00}\u{4efd}\u{8d44}\u{6e90}\u{4ee3}\u{7801}\u{ff0c}\u{9875}\u{811a}\u{4e5f}\u{6539}\u{8d70}\u{540c}\u{4e00}\u{8def}\u{5f84}\u{3002}\u{5ba2}\u{6237}\u{7aef}\u{65e5}\u{671f}\u{6539}\u{7528}\u{81ea}\u{5e26}\u{7684}\u{683c}\u{5f0f}\u{5316}\u{51fd}\u{6570}\u{548c}\u{4e25}\u{683c} RFC 3339 \u{89e3}\u{6790}\u{ff0c}\u{4e0d}\u{518d}\u{5e26}\u{5165} chrono \u{7684} strftime \u{548c}\u{5bbd}\u{677e}\u{89e3}\u{6790}\u{5668}\u{3002}release \u{524d}\u{7aef}\u{5f00}\u{542f} `-Zfmt-debug=none -Zlocation-detail=none`\u{ff0c}\u{56e0}\u{6b64}\u{6d4f}\u{89c8}\u{5668}\u{7aef}\u{7684} `{:?}` \u{8f93}\u{51fa}\u{4e3a}\u{7a7a}\u{ff0c}\u{539f}\u{5148}\u{4f9d}\u{8d56}\u{5b83}\u{7684}\u{8bc4}\u{8bba}\u{5217}\u{8868} key \u{548c}\u{56fe}\u{9274}\u{9519}\u{8bef}\u{6587}\u{6848}\u{5df2}\u{6539}\u{6389}\u{3002}\u{4e3b}\u{5305} Brotli \u{4ece} 310,782 B \u{964d}\u{5230} 287,544 B\u{ff0c}\u{5404}\u{516c}\u{5f00}\u{8def}\u{7531}\u{9996}\u{5c4f} WASM \u{5c11} 17\u{2013}44 KB\u{3002}\u{540e}\u{53f0}\u{4e0e}\u{7ec4}\u{4ef6}\u{56fe}\u{9274}\u{7684}\u{6837}\u{5f0f}\u{62c6}\u{6210}\u{5355}\u{72ec}\u{7684} `admin.css`\u{ff0c}\u{53ea}\u{5728} `/admin\u{2026}` \u{548c} `/about/components\u{2026}` \u{52a0}\u{8f7d}\u{ff0c}\u{516c}\u{5f00}\u{9875}\u{963b}\u{585e}\u{6e32}\u{67d3}\u{7684}\u{6837}\u{5f0f}\u{4ece} 40,260 B \u{964d}\u{5230} 24,896 B\u{ff08}Brotli\u{ff09}\u{3002}\u{540e}\u{53f0}\u{767b}\u{5f55}\u{5b88}\u{536b}\u{6539}\u{4e3a}\u{6309}\u{8def}\u{5f84}\u{6bb5}\u{5339}\u{914d} `/admin`\u{ff0c}\u{540c}\u{524d}\u{7f00}\u{7684} `/admin.css` \u{4e0d}\u{53d7}\u{5b88}\u{536b}\u{62e6}\u{622a}\u{3002}\n\n### Fixed\n\n- **\u{8bf7}\u{6c42} panic \u{8fd4}\u{56de} 500\u{ff0c}\u{4e0d}\u{518d}\u{65ad}\u{5f00}\u{8fde}\u{63a5}**\u{ff1a}\u{6539}\u{4e3a} unwind \u{540e}\u{ff0c}\u{8bf7}\u{6c42}\u{5904}\u{7406}\u{4e2d}\u{7684} panic \u{53ea}\u{7ed3}\u{675f}\u{90a3}\u{4e00}\u{4e2a}\u{8bf7}\u{6c42}\u{ff0c}\u{4f46}\u{5ba2}\u{6237}\u{7aef}\u{770b}\u{5230}\u{7684}\u{662f}\u{8fde}\u{63a5}\u{88ab}\u{76f4}\u{63a5}\u{65ad}\u{5f00}\u{ff0c}\u{7ecf} nginx/EdgeOne \u{540e}\u{53d8}\u{6210} 502\u{3002}\u{73b0}\u{5728}\u{6574}\u{4e2a}\u{8def}\u{7531}\u{6700}\u{5916}\u{5c42}\u{6302}\u{4e86} `CatchPanicLayer`\u{ff1a}\u{54cd}\u{5e94}\u{5934}\u{53d1}\u{51fa}\u{524d}\u{53d1}\u{751f}\u{7684} panic \u{4e00}\u{5f8b}\u{8fd4}\u{56de} `500`\u{ff0c}\u{6b63}\u{6587}\u{56fa}\u{5b9a}\u{4e3a}\u{300c}\u{670d}\u{52a1}\u{5668}\u{5185}\u{90e8}\u{9519}\u{8bef}\u{300d}\u{ff0c}\u{4e0d}\u{542b} panic \u{5185}\u{5bb9}\u{ff0c}\u{5e76}\u{5e26} `Cache-Control: no-store` \u{9632}\u{6b62} CDN \u{7f13}\u{5b58}\u{ff1b}panic \u{6d88}\u{606f}\u{5199}\u{5165}\u{9519}\u{8bef}\u{65e5}\u{5fd7}\u{3002}\u{524d}\u{7aef}\u{8c03}\u{7528}\u{670d}\u{52a1}\u{7aef}\u{51fd}\u{6570}\u{9047}\u{5230}\u{8fd9}\u{4e2a}\u{54cd}\u{5e94}\u{65f6}\u{663e}\u{793a}\u{300c}\u{670d}\u{52a1}\u{6682}\u{65f6}\u{4e0d}\u{53ef}\u{7528}\u{ff0c}\u{8bf7}\u{7a0d}\u{540e}\u{518d}\u{8bd5}\u{300d}\u{3002}\u{54cd}\u{5e94}\u{4f53}\u{5df2}\u{5f00}\u{59cb}\u{8f93}\u{51fa}\u{540e}\u{ff08}\u{6d41}\u{5f0f} SSR\u{3001}SSE\u{ff09}\u{7684} panic \u{4ecd}\u{53ea}\u{80fd}\u{4e2d}\u{65ad}\u{8fde}\u{63a5}\u{3002}\n\n## [1.2.4] - 2026-10-30\n\n\u{4fee}\u{590d}\u{540e}\u{53f0}\u{7b14}\u{8bb0}\u{5217}\u{8868}\u{7684}\u{5782}\u{76f4}\u{5bf9}\u{9f50}\u{4e0e}\u{60ac}\u{505c}\u{5e95}\u{8272}\u{3001}\u{9875}\u{5934}\u{641c}\u{7d22}\u{5165}\u{53e3}\u{7684}\u{89c6}\u{89c9}\u{5bf9}\u{9f50}\u{ff0c}\u{4ee5}\u{53ca}\u{70b9}\u{51fb}\u{9875}\u{5934}\u{5bfc}\u{822a}\u{65f6}\u{7684}\u{6587}\u{5b57}\u{6697}\u{95ea}\u{3002}\n\n### Fixed\n\n- **\u{540e}\u{53f0}\u{7b14}\u{8bb0}\u{5217}\u{8868}\u{5782}\u{76f4}\u{5bf9}\u{9f50}**\u{ff1a}\u{590d}\u{9009}\u{6846}\u{3001}\u{7c7b}\u{578b}\u{56fe}\u{6807}\u{3001}\u{4e3b}\u{5185}\u{5bb9}\u{548c}\u{53f3}\u{4fa7}\u{4fe1}\u{606f}\u{7edf}\u{4e00}\u{6309}\u{6574}\u{884c}\u{5782}\u{76f4}\u{5c45}\u{4e2d}\u{ff0c}\u{4fee}\u{590d}\u{590d}\u{9009}\u{6846}\u{4f4e}\u{4e8e}\u{7c7b}\u{578b}\u{56fe}\u{6807}\u{7684}\u{9519}\u{4f4d}\u{ff1b}\u{79fb}\u{52a8}\u{7aef}\u{6807}\u{9898}\u{4e0e}\u{6807}\u{7b7e}\u{6362}\u{884c}\u{65f6}\u{4fdd}\u{6301}\u{5c45}\u{4e2d}\u{ff0c}\u{56de}\u{6536}\u{7ad9}\u{7684}\u{6062}\u{590d}\u{64cd}\u{4f5c}\u{533a}\u{57df}\u{540c}\u{6b65}\u{5bf9}\u{9f50}\u{3002}\n- **\u{540e}\u{53f0}\u{7b14}\u{8bb0}\u{5217}\u{8868}\u{60ac}\u{505c}\u{5e95}\u{8272}\u{7edf}\u{4e00}**\u{ff1a}\u{79fb}\u{9664}\u{7f16}\u{8f91}\u{94fe}\u{63a5}\u{91cd}\u{590d}\u{53e0}\u{52a0}\u{7684}\u{534a}\u{900f}\u{660e}\u{60ac}\u{505c}\u{80cc}\u{666f}\u{ff0c}\u{590d}\u{9009}\u{6846}\u{533a}\u{57df}\u{4e0e}\u{7b14}\u{8bb0}\u{5185}\u{5bb9}\u{7531}\u{6574}\u{884c}\u{7edf}\u{4e00}\u{9ad8}\u{4eae}\u{ff0c}\u{52fe}\u{9009}\u{540e}\u{518d}\u{60ac}\u{505c}\u{4e5f}\u{4e0d}\u{518d}\u{51fa}\u{73b0}\u{6df1}\u{6d45}\u{5206}\u{533a}\u{3002}\n- **\u{9875}\u{5934}\u{641c}\u{7d22}\u{5165}\u{53e3}\u{89c6}\u{89c9}\u{5bf9}\u{9f50}**\u{ff1a}\u{660e}\u{786e}\u{6587}\u{5b57}\u{4e0e}\u{5feb}\u{6377}\u{952e}\u{7684}\u{884c}\u{9ad8}\u{ff0c}\u{641c}\u{7d22}\u{6587}\u{5b57}\u{4e0b}\u{79fb} 0.5px\u{ff0c}\u{5feb}\u{6377}\u{952e}\u{952e}\u{5e3d}\u{56fa}\u{5b9a}\u{9ad8}\u{5ea6}\u{5e76}\u{8c03}\u{6574}\u{5185}\u{90e8}\u{7559}\u{767d}\u{ff0c}\u{51cf}\u{8f7b}\u{4e2d}\u{6587}\u{7b14}\u{753b}\u{4e0e} `\u{2318}K` \u{76f8}\u{5bf9}\u{653e}\u{5927}\u{955c}\u{504f}\u{4e0a}\u{7684}\u{89c2}\u{611f}\u{ff1b}\u{56fe}\u{6807}\u{4e0e}\u{952e}\u{5e3d}\u{5916}\u{6846}\u{4ecd}\u{4fdd}\u{6301}\u{5782}\u{76f4}\u{5c45}\u{4e2d}\u{3002}\n- **\u{70b9}\u{51fb}\u{9875}\u{5934}\u{5bfc}\u{822a}\u{65f6}\u{6587}\u{5b57}\u{4e0d}\u{518d}\u{6697}\u{95ea}**\u{ff1a}\u{70b9}\u{51fb}\u{680f}\u{76ee}\u{540e}\u{ff0c}\u{88ab}\u{70b9}\u{7684}\u{94fe}\u{63a5}\u{4f1a}\u{5148}\u{4ece}\u{60ac}\u{505c}\u{7684}\u{9ad8}\u{4eae}\u{8272}\u{9000}\u{56de}\u{666e}\u{901a}\u{7070}\u{8272}\u{ff0c}\u{7ea6} 2\u{2013}3 \u{5e27}\u{540e}\u{624d}\u{6062}\u{590d}\u{ff0c}\u{540c}\u{65f6}\u{6307}\u{9488}\u{53d8}\u{56de}\u{7bad}\u{5934}\u{3002}\u{539f}\u{56e0}\u{662f}\u{89c6}\u{56fe}\u{8fc7}\u{6e21}\u{4ece}\u{622a}\u{56fe}\u{5230}\u{52a8}\u{753b}\u{5c31}\u{7eea}\u{4e4b}\u{95f4}\u{ff0c}\u{6d4f}\u{89c8}\u{5668}\u{6309}\u{89c4}\u{8303}\u{628a}\u{547d}\u{4e2d}\u{6d4b}\u{8bd5}\u{5168}\u{90e8}\u{4ea4}\u{7ed9} `<html>`\u{ff0c}\u{94fe}\u{63a5}\u{5931}\u{53bb}\u{60ac}\u{505c}\u{6001}\u{ff0c}\u{800c}\u{622a}\u{56fe}\u{90a3}\u{4e00}\u{5e27}\u{4f1a}\u{4e00}\u{76f4}\u{51bb}\u{7ed3}\u{5230}\u{52a8}\u{753b}\u{5f00}\u{59cb}\u{3002}\u{73b0}\u{5728}\u{70b9}\u{51fb}\u{65f6}\u{7ed9}\u{94fe}\u{63a5}\u{52a0}\u{6807}\u{8bb0}\u{ff0c}\u{5728}\u{8fc7}\u{6e21}\u{671f}\u{95f4}\u{4fdd}\u{6301}\u{60ac}\u{505c}\u{8272}\u{ff1b}\u{6307}\u{9488}\u{53d8}\u{7bad}\u{5934}\u{5c5e}\u{6d4f}\u{89c8}\u{5668}\u{884c}\u{4e3a}\u{ff0c}\u{65e0}\u{6cd5}\u{6d88}\u{9664}\u{3002}\n\n## [1.2.3] - 2026-10-29\n\n\u{4fee}\u{590d}\u{4e0b}\u{62c9}\u{9762}\u{677f}\u{7684}\u{6c34}\u{5e73}\u{5bf9}\u{9f50}\u{4e0e}\u{7b5b}\u{9009}\u{6846}\u{53f3}\u{4fa7}\u{7559}\u{767d}\u{ff0c}\u{4ee5}\u{53ca}\u{9875}\u{5934}\u{80f6}\u{56ca}\u{6ed1}\u{52a8}\u{65f6}\u{906e}\u{4f4f}\u{5bfc}\u{822a}\u{6587}\u{5b57}\u{3002}\n\n### Fixed\n\n- **\u{4e0b}\u{62c9}\u{9762}\u{677f}\u{5bf9}\u{9f50}**\u{ff1a}\u{7d27}\u{51d1}\u{4e0b}\u{62c9}\u{ff08}\u{5982}\u{7cfb}\u{7edf}\u{76d1}\u{63a7}\u{7684}\u{81ea}\u{52a8}\u{5237}\u{65b0}\u{95f4}\u{9694}\u{ff09}\u{5c55}\u{5f00}\u{7684}\u{9009}\u{9879}\u{9762}\u{677f}\u{6bd4}\u{89e6}\u{53d1}\u{5668}\u{5bbd}\u{65f6}\u{ff0c}\u{4e0d}\u{518d}\u{5411}\u{53f3}\u{504f}\u{51fa}\u{ff0c}\u{800c}\u{662f}\u{76f8}\u{5bf9}\u{89e6}\u{53d1}\u{5668}\u{6c34}\u{5e73}\u{5c45}\u{4e2d}\u{3002}\n- **\u{5e26}\u{7b5b}\u{9009}\u{6846}\u{7684}\u{4e0b}\u{62c9}\u{4e0d}\u{518d}\u{5728}\u{8f93}\u{5165}\u{6846}\u{53f3}\u{4fa7}\u{7559}\u{767d}**\u{ff1a}\u{9009}\u{9879}\u{591a}\u{4e8e} 8 \u{4e2a}\u{65f6}\u{ff0c}\u{7b5b}\u{9009}\u{6846}\u{539f}\u{5148}\u{548c}\u{9009}\u{9879}\u{4e00}\u{8d77}\u{5728}\u{540c}\u{4e00}\u{4e2a}\u{6eda}\u{52a8}\u{533a}\u{91cc}\u{ff0c}\u{51fa}\u{73b0}\u{6eda}\u{52a8}\u{6761}\u{ff08}\u{5982}\u{63a5}\u{4e86}\u{9f20}\u{6807}\u{7684} macOS\u{3001}Windows \u{548c} Linux \u{7684}\u{7ecf}\u{5178}\u{6eda}\u{52a8}\u{6761}\u{ff0c}\u{5360} 11\u{2013}15 px\u{ff09}\u{540e}\u{ff0c}\u{7b5b}\u{9009}\u{6846}\u{53ea}\u{901a}\u{5230}\u{6eda}\u{52a8}\u{6761}\u{5de6}\u{8fb9}\u{ff0c}\u{53f3}\u{4fa7}\u{4e00}\u{6761}\u{7a7a}\u{767d}\u{3002}\u{73b0}\u{5728}\u{7b5b}\u{9009}\u{6846}\u{79fb}\u{5230}\u{6eda}\u{52a8}\u{533a}\u{5916}\u{ff0c}\u{59cb}\u{7ec8}\u{901a}\u{5230}\u{9762}\u{677f}\u{53f3}\u{7f18}\u{ff0c}\u{6eda}\u{52a8}\u{6761}\u{53ea}\u{8d34}\u{7740}\u{9009}\u{9879}\u{5217}\u{8868}\u{ff1b}\u{9009}\u{9879}\u{5217}\u{8868}\u{540c}\u{65f6}\u{53bb}\u{6389}\u{4e86}\u{7ecf}\u{5178}\u{6eda}\u{52a8}\u{6761}\u{4e0b}\u{591a}\u{51fa}\u{7684}\u{6a2a}\u{5411}\u{6eda}\u{52a8}\u{6761}\u{3002}`role=\"listbox\"` \u{4e5f}\u{53ea}\u{5305}\u{542b}\u{9009}\u{9879}\u{ff0c}\u{7b5b}\u{9009}\u{6846}\u{4e0d}\u{518d}\u{6df7}\u{5728}\u{91cc}\u{9762}\u{3002}\n- **\u{9875}\u{5934}\u{80f6}\u{56ca}\u{6ed1}\u{52a8}\u{65f6}\u{4e0d}\u{518d}\u{906e}\u{4f4f}\u{5bfc}\u{822a}\u{6587}\u{5b57}**\u{ff1a}\u{680f}\u{76ee}\u{5207}\u{6362}\u{65f6}\u{ff0c}\u{80f6}\u{56ca}\u{4ece}\u{65e7}\u{680f}\u{76ee}\u{6ed1}\u{5411}\u{65b0}\u{680f}\u{76ee}\u{ff0c}\u{539f}\u{6765}\u{4f1a}\u{76d6}\u{4f4f}\u{6392}\u{5728}\u{65b0}\u{680f}\u{76ee}\u{524d}\u{9762}\u{7684}\u{5bfc}\u{822a}\u{6587}\u{5b57}\u{ff1a}\u{4ece}\u{300c}\u{53cb}\u{94fe}\u{300d}\u{5207}\u{5230}\u{300c}\u{5173}\u{4e8e}\u{300d}\u{65f6}\u{ff0c}\u{300c}\u{53cb}\u{94fe}\u{300d}\u{6d88}\u{5931}\u{7ea6} 3 \u{5e27}\u{ff1b}\u{4ece}\u{300c}\u{7b14}\u{8bb0}\u{300d}\u{5207}\u{5230}\u{300c}\u{53cb}\u{94fe}\u{300d}\u{65f6}\u{ff0c}\u{300c}\u{7b14}\u{8bb0}\u{300d}\u{548c}\u{300c}\u{5f52}\u{6863}\u{300d}\u{88ab}\u{4f9d}\u{6b21}\u{76d6}\u{6389}\u{3002}\u{539f}\u{56e0}\u{662f}\u{6bcf}\u{4e2a}\u{5bfc}\u{822a}\u{9879}\u{5404}\u{81ea}\u{5f62}\u{6210}\u{5c42}\u{53e0}\u{4e0a}\u{4e0b}\u{6587}\u{ff0c}\u{80f6}\u{56ca}\u{53ea}\u{80fd}\u{57ab}\u{5728}\u{81ea}\u{5df1}\u{90a3}\u{4e00}\u{9879}\u{7684}\u{6587}\u{5b57}\u{4e0b}\u{9762}\u{3002}\u{73b0}\u{5728}\u{7531}\u{6574}\u{4e2a}\u{5bfc}\u{822a}\u{680f}\u{5171}\u{7528}\u{4e00}\u{4e2a}\u{5c42}\u{53e0}\u{4e0a}\u{4e0b}\u{6587}\u{ff0c}\u{80f6}\u{56ca}\u{6ed1}\u{8fc7}\u{4efb}\u{4f55}\u{4e00}\u{9879}\u{90fd}\u{57ab}\u{5728}\u{6587}\u{5b57}\u{4e0b}\u{9762}\u{3002}\n\n## [1.2.2] - 2026-10-29\n\n\u{540e}\u{53f0}\u{7b14}\u{8bb0}\u{5217}\u{8868}\u{652f}\u{6301}\u{6279}\u{91cf}\u{516c}\u{5f00}\u{4e0e} AI \u{77e5}\u{8bc6}\u{5e93}\u{6536}\u{5f55}\u{ff0c}MCP \u{65b0}\u{589e}\u{5bf9}\u{5e94}\u{7684}\u{7b14}\u{8bb0}\u{516c}\u{5f00}\u{4e0e}\u{6536}\u{5f55}\u{7ba1}\u{7406}\u{5de5}\u{5177}\u{ff1b}\u{53d1}\u{7248}\u{540e}\u{4e0d}\u{518d}\u{9884}\u{70ed} EdgeOne\u{ff0c}\u{907f}\u{514d}\u{8282}\u{70b9}\u{7f13}\u{5b58}\u{672a}\u{538b}\u{7f29}\u{7248}\u{672c}\u{540e}\u{7531} CDN \u{81ea}\u{884c}\u{538b}\u{7f29}\u{3001}\u{957f}\u{671f}\u{8fd4}\u{56de}\u{5927} 15\u{2013}25% \u{7684} br\u{ff1b}\u{4fee}\u{590d}\u{4ece}\u{6587}\u{7ae0}\u{9875}\u{70b9}\u{9875}\u{5934}\u{5bfc}\u{822a}\u{65f6}\u{9875}\u{5934}\u{900f}\u{5b57}\u{95ea}\u{70c1}\u{3002}\n\n### Added\n\n- **\u{7b14}\u{8bb0}\u{6279}\u{91cf}\u{7ba1}\u{7406}**\u{ff1a}\u{540e}\u{53f0}\u{7b14}\u{8bb0}\u{5217}\u{8868}\u{652f}\u{6301}\u{9010}\u{6761}\u{52fe}\u{9009}\u{3001}\u{5168}\u{9009}\u{5f53}\u{524d}\u{9875}\u{548c}\u{53d6}\u{6d88}\u{9009}\u{62e9}\u{ff0c}\u{53ef}\u{6279}\u{91cf}\u{8bbe}\u{4e3a}\u{516c}\u{5f00}\u{6216}\u{79c1}\u{5bc6}\u{3001}\u{6536}\u{5f55}\u{5230} AI \u{77e5}\u{8bc6}\u{5e93}\u{6216}\u{79fb}\u{51fa}\u{3002}\u{516c}\u{5f00}\u{4e0e}\u{6536}\u{5f55}\u{524d}\u{786e}\u{8ba4}\u{4f7f}\u{7528}\u{5f53}\u{524d}\u{5de5}\u{4f5c}\u{7a3f}\u{ff0c}\u{4e24}\u{4e2a}\u{72b6}\u{6001}\u{4e92}\u{4e0d}\u{5f71}\u{54cd}\u{ff1b}\u{6574}\u{6279}\u{6821}\u{9a8c}\u{6240}\u{6709}\u{6743}\u{3001}\u{7248}\u{672c}\u{548c}\u{5185}\u{5bb9}\u{540e}\u{5728}\u{540c}\u{4e00}\u{4e8b}\u{52a1}\u{4e2d}\u{63d0}\u{4ea4}\u{ff0c}\u{4efb}\u{4e00}\u{6761}\u{51b2}\u{7a81}\u{90fd}\u{4e0d}\u{4f1a}\u{90e8}\u{5206}\u{751f}\u{6548}\u{3002}\u{5207}\u{6362}\u{7b5b}\u{9009}\u{3001}\u{7ffb}\u{9875}\u{6216}\u{5237}\u{65b0}\u{4f1a}\u{6e05}\u{7a7a}\u{9009}\u{62e9}\u{ff0c}\u{7b5b}\u{9009}\u{672b}\u{9875}\u{88ab}\u{6279}\u{91cf}\u{79fb}\u{7a7a}\u{65f6}\u{81ea}\u{52a8}\u{8fd4}\u{56de}\u{6709}\u{6548}\u{9875}\u{ff1b}\u{79fb}\u{52a8}\u{7aef}\u{64cd}\u{4f5c}\u{680f}\u{81ea}\u{52a8}\u{6362}\u{884c}\u{3002}\n- **MCP \u{7b14}\u{8bb0}\u{516c}\u{5f00}\u{4e0e}\u{6536}\u{5f55}\u{7ba1}\u{7406}**\u{ff1a}\u{65b0}\u{589e} `publish_note`\u{3001}`unpublish_note`\u{3001}`include_note_in_knowledge`\u{3001}`exclude_note_from_knowledge`\u{ff0c}\u{5206}\u{522b}\u{516c}\u{5f00}\u{5f53}\u{524d}\u{5de5}\u{4f5c}\u{7a3f}\u{3001}\u{64a4}\u{56de}\u{516c}\u{5f00}\u{3001}\u{6536}\u{5f55}\u{5f53}\u{524d}\u{5de5}\u{4f5c}\u{7a3f}\u{6216}\u{79fb}\u{51fa} AI \u{77e5}\u{8bc6}\u{5e93}\u{3002}\u{590d}\u{7528}\u{72ec}\u{7acb} `notes_write` \u{6388}\u{6743}\u{ff0c}\u{5df2}\u{6709}\u{7b14}\u{8bb0}\u{5199}\u{5165}\u{4ee4}\u{724c}\u{5373}\u{53ef}\u{4f7f}\u{7528}\u{ff1b}\u{5728}\u{7b14}\u{8bb0}\u{884c}\u{9501}\u{4e0e}\u{540c}\u{4e00}\u{4e8b}\u{52a1}\u{5185}\u{68c0}\u{67e5}\u{7b14}\u{8bb0}\u{672c}\u{8303}\u{56f4}\u{548c}\u{5de5}\u{4f5c}\u{7a3f}\u{7248}\u{672c}\u{ff0c}\u{4e0d}\u{80fd}\u{64cd}\u{4f5c}\u{4ed6}\u{4eba}\u{3001}\u{8303}\u{56f4}\u{5916}\u{6216}\u{56de}\u{6536}\u{7ad9}\u{7b14}\u{8bb0}\u{3002}`get_note(draft=true)` \u{8fd4}\u{56de}\u{516c}\u{5f00}\u{4e0e}\u{6536}\u{5f55}\u{7248}\u{672c}\u{53f7}\u{ff1b}\u{521b}\u{5efa}\u{548c}\u{7f16}\u{8f91}\u{4ecd}\u{4e0d}\u{81ea}\u{52a8}\u{516c}\u{5f00}\u{6216}\u{6536}\u{5f55}\u{3002}\u{540e}\u{53f0}\u{4ee4}\u{724c}\u{6388}\u{6743}\u{8bf4}\u{660e}\u{540c}\u{6b65}\u{660e}\u{786e}\u{65b0}\u{589e}\u{80fd}\u{529b}\u{3002}\n\n### Removed\n\n- **\u{53d1}\u{7248}\u{540e}\u{4e0d}\u{518d}\u{9884}\u{70ed} EdgeOne**\u{ff1a}\u{5220}\u{9664} `scripts/edgeone-prefetch.ts`\u{3001}`deploy.fish` \u{4e2d}\u{7684}\u{8c03}\u{7528}\u{548c} CI \u{7684} `prefetch-cdn` \u{4f5c}\u{4e1a}\u{3002}EdgeOne \u{9884}\u{70ed}\u{4e0d}\u{7406}\u{4f1a}\u{8bf7}\u{6c42}\u{91cc}\u{7684} `Accept-Encoding: br`\u{ff0c}\u{56de}\u{6e90}\u{65f6}\u{7528} Range \u{8bf7}\u{6c42}\u{62ff}\u{672a}\u{538b}\u{7f29}\u{6587}\u{4ef6}\u{ff1b}\u{8282}\u{70b9}\u{7f13}\u{5b58}\u{7684}\u{662f}\u{672a}\u{538b}\u{7f29}\u{7248}\u{672c}\u{65f6}\u{ff0c}\u{6d4f}\u{89c8}\u{5668}\u{8bf7}\u{6c42} br \u{62ff}\u{5230}\u{7684}\u{662f} EdgeOne \u{81ea}\u{5df1}\u{538b}\u{7f29}\u{7684}\u{7ed3}\u{679c}\u{ff0c}\u{6bd4}\u{6e90}\u{7ad9}\u{9884}\u{538b}\u{7f29}\u{7684} `.br` \u{5927} 15\u{2013}25%\u{ff08}\u{4e3b} WASM 316 KB \u{2192} 396 KB\u{ff09}\u{ff0c}\u{6587}\u{4ef6}\u{6309} immutable \u{7f13}\u{5b58}\u{4e00}\u{5e74}\u{90fd}\u{662f}\u{8fd9}\u{4e2a}\u{5927}\u{5c0f}\u{3002}\u{90e8}\u{7f72}\u{540e}\u{9884}\u{70ed}\u{56de}\u{6e90}\u{671f}\u{95f4}\u{ff0c}\u{4e3b} WASM \u{8fd8}\u{51fa}\u{73b0}\u{8fc7} 16 \u{79d2}\u{65e0}\u{6570}\u{636e}\u{3001}\u{9875}\u{9762}\u{4e00}\u{76f4}\u{4e0d}\u{6c34}\u{5408}\u{3002}\u{4e0d}\u{9884}\u{70ed}\u{65f6}\u{7531}\u{6d4f}\u{89c8}\u{5668}\u{8bf7}\u{6c42}\u{89e6}\u{53d1}\u{56de}\u{6e90}\u{ff0c}\u{8282}\u{70b9}\u{7f13}\u{5b58}\u{7684}\u{662f}\u{6e90}\u{7ad9}\u{7684} `.br`\u{3002}\n\n### Fixed\n\n- **\u{6587}\u{7ae0}\u{9875}\u{70b9}\u{9875}\u{5934}\u{5bfc}\u{822a}\u{4e0d}\u{518d}\u{95ea}\u{70c1}**\u{ff1a}\u{6587}\u{7ae0}\u{9875}\u{4e0d}\u{5c5e}\u{4e8e}\u{4efb}\u{4f55}\u{680f}\u{76ee}\u{ff0c}\u{539f}\u{6765}\u{4ece}\u{5b83}\u{8df3}\u{5230}\u{5176}\u{4ed6}\u{9875}\u{9762}\u{8d70}\u{6574}\u{9875}\u{8fc7}\u{6e21}\u{ff1a}\u{9875}\u{5934}\u{5355}\u{72ec}\u{622a}\u{56fe}\u{3001}\u{53ea}\u{663e}\u{793a}\u{65b0}\u{9875}\u{9762}\u{7684}\u{9875}\u{5934}\u{ff0c}\u{65b0}\u{9875}\u{9762}\u{5728}\u{9876}\u{90e8}\u{65f6}\u{9875}\u{5934}\u{662f}\u{900f}\u{660e}\u{7684}\u{ff0c}\u{6eda}\u{52a8}\u{540e}\u{539f}\u{672c}\u{88ab}\u{9875}\u{5934}\u{906e}\u{4f4f}\u{7684}\u{6b63}\u{6587}\u{4f1a}\u{4ee5}\u{5168}\u{5bf9}\u{6bd4}\u{5ea6}\u{53e0}\u{5728}\u{5bfc}\u{822a}\u{6587}\u{5b57}\u{4e0a}\u{ff0c}\u{7ea6} 200ms \u{540e}\u{624d}\u{6d88}\u{5931}\u{ff1b}\u{6574}\u{9875}\u{6de1}\u{5165}\u{6de1}\u{51fa}\u{4e5f}\u{5728}\u{7ea6} 50ms \u{5185}\u{57fa}\u{672c}\u{5b8c}\u{6210}\u{ff0c}\u{770b}\u{8d77}\u{6765}\u{50cf}\u{786c}\u{5207}\u{3002}\u{73b0}\u{5728}\u{524d}\u{53f0}\u{5916}\u{58f3}\u{5185}\u{6ca1}\u{6709}\u{6587}\u{7ae0}\u{6807}\u{9898}\u{6216}\u{5c01}\u{9762}\u{5171}\u{4eab}\u{8fc7}\u{6e21}\u{7684}\u{5bfc}\u{822a}\u{ff0c}\u{90fd}\u{548c}\u{680f}\u{76ee}\u{5207}\u{6362}\u{4e00}\u{6837}\u{53ea}\u{622a}\u{53d6}\u{6b63}\u{6587}\u{3001}\u{9875}\u{5934}\u{4fdd}\u{6301}\u{5b9e}\u{65f6}\u{ff1a}\u{4e24}\u{4e2a}\u{4e0d}\u{540c}\u{680f}\u{76ee}\u{4e4b}\u{95f4}\u{4ecd}\u{6a2a}\u{5411}\u{6ed1}\u{52a8}\u{ff0c}\u{5176}\u{4f59}\u{ff08}\u{6587}\u{7ae0}\u{3001}\u{540c}\u{680f}\u{76ee}\u{5185}\u{3001}\u{5206}\u{9875}\u{3001}\u{66f4}\u{65b0}\u{65e5}\u{5fd7}\u{7b49}\u{ff09}\u{539f}\u{5730}\u{6de1}\u{5165}\u{6de1}\u{51fa}\u{ff0c}\u{4ece}\u{6587}\u{7ae0}\u{56de}\u{5230}\u{680f}\u{76ee}\u{65f6}\u{5bfc}\u{822a}\u{80f6}\u{56ca}\u{539f}\u{5730}\u{6de1}\u{5165}\u{3002}\u{65e7}\u{6b63}\u{6587}\u{5feb}\u{7167}\u{4fdd}\u{6301}\u{81ea}\u{8eab}\u{5c3a}\u{5bf8}\u{548c}\u{539f}\u{4f4d}\u{7f6e}\u{ff0c}\u{6587}\u{7ae0}\u{680f}\u{ff08}1240px\u{ff09}\u{6bd4}\u{680f}\u{76ee}\u{680f}\u{ff08}880px\u{ff09}\u{5bbd}\u{65f6}\u{4e0d}\u{4f1a}\u{88ab}\u{7b49}\u{6bd4}\u{7f29}\u{5c0f}\u{6216}\u{9519}\u{4f4d}\u{ff0c}\u{53f3}\u{4fa7}\u{76ee}\u{5f55}\u{4e5f}\u{4e0d}\u{4f1a}\u{88ab}\u{88c1}\u{6389}\u{3002}\n\n## [1.2.1] - 2026-10-29\n\n\u{7b2c}\u{4e8c}\u{8f6e}\u{9996}\u{5c4f}\u{4f18}\u{5316}\u{ff1a}\u{5206}\u{5305}\u{6570}\u{91cf}\u{518d}\u{51cf}\u{534a}\u{ff0c}\u{5f53}\u{524d}\u{8def}\u{7531}\u{7684}\u{5206}\u{5305}\u{968f}\u{4e3b}\u{5305}\u{4e00}\u{8d77}\u{9884}\u{8f7d}\u{ff0c}\u{56fa}\u{5b9a}\u{8def}\u{5f84}\u{6837}\u{5f0f}\u{4e0e}\u{811a}\u{672c}\u{6309}\u{5185}\u{5bb9}\u{7248}\u{672c}\u{957f}\u{671f}\u{7f13}\u{5b58}\u{ff0c}\u{53d1}\u{7248}\u{540e}\u{81ea}\u{52a8}\u{9884}\u{70ed} EdgeOne \u{4e2d}\u{95f4}\u{5c42}\u{3002}\u{672c}\u{5730}\u{6a21}\u{62df} EdgeOne \u{7684}\u{5bf9}\u{7167}\u{4e2d}\u{ff0c}\u{56de}\u{8bbf}\u{6c34}\u{5408}\u{5feb} 30\u{2013}40%\u{ff0c}\u{79fb}\u{52a8}\u{7aef}\u{51b7}\u{52a0}\u{8f7d}\u{6c34}\u{5408}\u{518d}\u{63d0}\u{524d} 150\u{2013}250 ms\u{3002}\u{53e6}\u{4fee}\u{590d}\u{6e90}\u{7ad9}\u{590d}\u{7528}\u{8fde}\u{63a5}\u{6bcf}\u{54cd}\u{5e94}\u{6162} 40 ms\u{3001}\u{5feb}\u{901f}\u{5207}\u{6362}\u{680f}\u{76ee}\u{95ea}\u{70c1}\u{4e0e}\u{70b9}\u{51fb}\u{65e0}\u{54cd}\u{5e94}\u{3001}\u{6b63}\u{6587}\u{56fe}\u{7247}\u{95f4}\u{8ddd}\u{9519}\u{4f4d}\u{3002}\n\n### Changed\n\n- **WASM \u{5206}\u{5305}\u{518d}\u{51cf}\u{534a}**\u{ff1a}\u{7ebf}\u{4e0a} EdgeOne \u{5bf9}\u{540c}\u{4e00}\u{5ba2}\u{6237}\u{7aef}\u{7684}\u{5e76}\u{53d1}\u{8bf7}\u{6c42}\u{5927}\u{81f4}\u{9010}\u{4e2a}\u{5904}\u{7406}\u{ff0c}\u{6bcf}\u{4e2a}\u{7ea6} 2\u{2013}3 ms\u{ff0c}\u{9996}\u{9875} 60 \u{4e2a} 1\u{2013}5 KB \u{7684}\u{5206}\u{5305}\u{6574}\u{6279}\u{8981}\u{6392} 120\u{2013}200 ms\u{ff0c}\u{5f00}\u{53d1}\u{8005}\u{5de5}\u{5177}\u{91cc}\u{6bcf}\u{4e2a}\u{5c0f}\u{6587}\u{4ef6}\u{90fd}\u{663e}\u{793a} 200 ms \u{4e0a}\u{4e0b}\u{3002}release \u{524d}\u{7aef}\u{7684}\u{5206}\u{5305}\u{5408}\u{5e76}\u{4ee3}\u{4ef7}\u{ff08}`WASM_SPLIT_CHUNK_LOAD_COST`\u{ff09}\u{7531}\u{8865}\u{4e01}\u{9ed8}\u{8ba4}\u{7684} 1024 \u{8c03}\u{5230} 8192\u{ff1a}\u{9996}\u{9875} 60 \u{2192} 21 \u{4e2a}\u{3001}\u{6587}\u{7ae0}\u{9875} 70 \u{2192} 26 \u{4e2a}\u{3001}\u{5f52}\u{6863} 32 \u{2192} 11 \u{4e2a} `.wasm`\u{ff0c}\u{5404}\u{8def}\u{7531}\u{9996}\u{5c4f} WASM \u{603b}\u{91cf}\u{53d8}\u{5316}\u{4e0d}\u{5230} \u{b1}5%\u{ff08}\u{5173}\u{4e8e}\u{9875}\u{7b49}\u{5c0f}\u{9875}\u{9762}\u{591a} 20\u{2013}40 KB\u{ff09}\u{3002}\n- **\u{5f53}\u{524d}\u{8def}\u{7531}\u{7684}\u{5206}\u{5305}\u{968f}\u{4e3b}\u{5305}\u{4e00}\u{8d77}\u{9884}\u{8f7d}**\u{ff1a}\u{6b64}\u{524d}\u{5206}\u{5305}\u{8981}\u{7b49}\u{4e3b} WASM \u{4e0b}\u{8f7d}\u{5e76}\u{5b9e}\u{4f8b}\u{5316}\u{3001}\u{6c34}\u{5408}\u{5f00}\u{59cb}\u{540e}\u{624d}\u{53d1}\u{51fa}\u{8bf7}\u{6c42}\u{ff0c}\u{6574}\u{6279}\u{591a}\u{7b49}\u{4e00}\u{8f6e}\u{3002}\u{73b0}\u{5728} HTML \u{53ea}\u{4e3a}\u{5f53}\u{524d}\u{8def}\u{7531}\u{7684}\u{89c6}\u{56fe}\u{5206}\u{5305}\u{8f93}\u{51fa} `<link rel=\"preload\" fetchpriority=\"low\">`\u{ff08}\u{4e0d}\u{518d}\u{50cf} Leptos \u{9ed8}\u{8ba4}\u{90a3}\u{6837}\u{5c55}\u{5f00}\u{5168}\u{90e8}\u{61d2}\u{52a0}\u{8f7d}\u{53d6}\u{6570}\u{51fd}\u{6570}\u{7684}\u{5206}\u{5305}\u{ff09}\u{ff0c}\u{4f4e}\u{4f18}\u{5148}\u{7ea7}\u{4fdd}\u{8bc1}\u{4e0d}\u{4e0e} CSS \u{62a2}\u{5e26}\u{5bbd}\u{3002}\u{672c}\u{5730}\u{6a21}\u{62df} EdgeOne \u{7684}\u{5bf9}\u{7167}\u{4e2d}\u{ff0c}\u{9996}\u{6b21}\u{7ed8}\u{5236}\u{4e0d}\u{53d8}\u{ff0c}\u{51b7}\u{52a0}\u{8f7d}\u{6c34}\u{5408}\u{684c}\u{9762}\u{63d0}\u{524d} 55\u{2013}135 ms\u{3001}\u{79fb}\u{52a8}\u{7aef}\u{ff08}1.6 Mbps\u{3001}CPU \u{964d}\u{901f} 4 \u{500d}\u{ff09}\u{63d0}\u{524d} 150\u{2013}250 ms\u{ff08}\u{5173}\u{4e8e}\u{9875}\u{6301}\u{5e73}\u{ff09}\u{ff0c}\u{56de}\u{8bbf}\u{6c34}\u{5408}\u{5feb} 30\u{2013}40%\u{3002}\u{5bf9}\u{7167}\u{6570}\u{636e}\u{89c1} `docs/\u{9996}\u{5c4f}\u{6027}\u{80fd}\u{5b9e}\u{6d4b}-2026-10-28.md`\u{300c}\u{7b2c}\u{4e8c}\u{8f6e}\u{300d}\u{3002}\n- **\u{5168}\u{5c40}\u{6837}\u{5f0f}\u{4e0e}\u{811a}\u{672c}\u{53ef}\u{957f}\u{671f}\u{7f13}\u{5b58}**\u{ff1a}`style.css`\u{3001}`highlight.css`\u{3001}KaTeX \u{6837}\u{5f0f}\u{3001}`yggdrasil-core` \u{4e0e}\u{706f}\u{7bb1}\u{3001}\u{7f16}\u{8f91}\u{5668}\u{3001}\u{7ec8}\u{7aef}\u{3001}Mermaid \u{7b49}\u{56fa}\u{5b9a}\u{8def}\u{5f84}\u{8d44}\u{6e90}\u{ff0c}\u{539f}\u{6765}\u{9760}\u{624b}\u{5199}\u{7684} `?v=N` \u{533a}\u{5206}\u{7248}\u{672c}\u{3001}\u{54cd}\u{5e94} `no-cache`\u{ff0c}EdgeOne \u{6bcf}\u{6b21}\u{56de}\u{6e90}\u{ff08}\u{5b9e}\u{6d4b} 65\u{2013}360 ms\u{ff0c}\u{5728}\u{9996}\u{5c4f}\u{5173}\u{952e}\u{8def}\u{5f84}\u{4e0a}\u{ff09}\u{ff0c}\u{56de}\u{8bbf}\u{4e5f}\u{8981}\u{6574}\u{4efd}\u{91cd}\u{4e0b}\u{3002}\u{73b0}\u{5728}\u{670d}\u{52a1}\u{7aef}\u{6309}\u{6587}\u{4ef6}\u{5185}\u{5bb9}\u{751f}\u{6210}\u{7248}\u{672c}\u{53f7}\u{5199}\u{8fdb}\u{5730}\u{5740}\u{ff0c}\u{9875}\u{9762}\u{5934}\u{90e8}\u{4e0b}\u{53d1}\u{7248}\u{672c}\u{8868}\u{4f9b}\u{524d}\u{7aef}\u{6309}\u{9700}\u{52a0}\u{8f7d}\u{65f6}\u{4f7f}\u{7528}\u{ff1b}\u{7248}\u{672c}\u{53f7}\u{4e0e}\u{5f53}\u{524d}\u{6587}\u{4ef6}\u{4e00}\u{81f4}\u{65f6}\u{8fd4}\u{56de} `immutable`\u{ff0c}\u{65e7}\u{7248}\u{672c}\u{53f7}\u{4ecd}\u{9700}\u{6821}\u{9a8c}\u{ff0c}\u{4e0d}\u{518d}\u{624b}\u{52a8}\u{7ef4}\u{62a4} `?v=`\u{3002}\n- **\u{53d1}\u{7248}\u{540e}\u{9884}\u{70ed} CDN**\u{ff1a}\u{65b0}\u{589e} `scripts/edgeone-prefetch.ts`\u{ff0c}\u{8bfb}\u{53d6}\u{7ebf}\u{4e0a}\u{9996}\u{9875}\u{5f15}\u{7528}\u{7684}\u{5168}\u{90e8}\u{5206}\u{5305}\u{3001}\u{5165}\u{53e3}\u{548c}\u{7248}\u{672c}\u{5316}\u{8d44}\u{6e90}\u{ff0c}\u{8c03}\u{7528} EdgeOne \u{9884}\u{70ed}\u{5230}\u{4e2d}\u{95f4}\u{5c42}\u{ff08}\u{5e26} `Accept-Encoding: br`\u{ff0c}\u{4e0e}\u{6d4f}\u{89c8}\u{5668}\u{8bf7}\u{6c42}\u{7684}\u{7f13}\u{5b58}\u{53d8}\u{4f53}\u{4e00}\u{81f4}\u{ff09}\u{3002}`scripts/deploy.fish` \u{5728} primary \u{90e8}\u{7f72}\u{6210}\u{529f}\u{540e}\u{6267}\u{884c}\u{ff1b}CI \u{65b0}\u{589e} `prefetch-cdn` \u{4f5c}\u{4e1a}\u{ff0c}\u{9700}\u{914d}\u{7f6e} `EDGEONE_ZONE_ID` \u{53d8}\u{91cf}\u{4e0e} `TENCENTCLOUD_SECRET_ID/KEY`\u{ff0c}\u{672a}\u{914d}\u{7f6e}\u{65f6}\u{8df3}\u{8fc7}\u{3002}\n\n### Fixed\n\n- **\u{6e90}\u{7ad9}\u{590d}\u{7528}\u{8fde}\u{63a5}\u{7684}\u{54cd}\u{5e94}\u{6162} 40 ms**\u{ff1a}\u{670d}\u{52a1}\u{7aef}\u{6ca1}\u{6709}\u{5173}\u{95ed} Nagle\u{ff0c}hyper \u{5206}\u{4e24}\u{6b21}\u{5199}\u{54cd}\u{5e94}\u{5934}\u{548c}\u{5305}\u{4f53}\u{ff0c}nginx \u{53cd}\u{5411}\u{4ee3}\u{7406}\u{7684} keepalive \u{8fde}\u{63a5}\u{4e0a}\u{6bcf}\u{4e2a}\u{54cd}\u{5e94}\u{90fd}\u{8981}\u{7b49}\u{5bf9}\u{7aef}\u{7ea6} 40 ms \u{7684}\u{5ef6}\u{8fdf} ACK\u{3002}\u{7ebf}\u{4e0a}\u{7ea6}\u{4e09}\u{6210}\u{56de}\u{6e90}\u{8bf7}\u{6c42}\u{56e0}\u{6b64}\u{662f} 41 ms \u{800c}\u{4e0d}\u{662f} 1 ms\u{3002}\u{73b0}\u{5728}\u{63a5}\u{5165}\u{7684}\u{8fde}\u{63a5}\u{90fd}\u{8bbe}\u{7f6e} `TCP_NODELAY`\u{ff0c}\u{540c}\u{4e00}\u{8fde}\u{63a5}\u{4e0a}\u{7684}\u{8fde}\u{7eed}\u{8bf7}\u{6c42}\u{7531} 40 ms \u{964d}\u{5230} 0.1 ms\u{3002}\n- **\u{5feb}\u{901f}\u{5207}\u{6362}\u{680f}\u{76ee}\u{4e0d}\u{518d}\u{95ea}\u{70c1}**\u{ff1a}\u{680f}\u{76ee}\u{5207}\u{6362}\u{65f6}\u{ff0c}\u{65e7}\u{6b63}\u{6587} 140ms \u{5185}\u{51e0}\u{4e4e}\u{6de1}\u{5b8c}\u{ff0c}\u{65b0}\u{6b63}\u{6587}\u{6309} 410ms \u{5f39}\u{7c27}\u{66f2}\u{7ebf}\u{624d}\u{5f00}\u{59cb}\u{6d6e}\u{73b0}\u{ff0c}\u{4e2d}\u{9014}\u{4e24}\u{8005}\u{5408}\u{8ba1}\u{53ea}\u{5269}\u{7ea6} 30% \u{4e0d}\u{900f}\u{660e}\u{ff0c}\u{6df1}\u{8272}\u{4e3b}\u{9898}\u{4e0b}\u{6b63}\u{6587}\u{533a}\u{4f1a}\u{9ed1}\u{4e00}\u{4e0b}\u{3002}\u{73b0}\u{5728}\u{65b0}\u{65e7}\u{6b63}\u{6587}\u{7528}\u{540c}\u{4e00}\u{6761} 140ms \u{66f2}\u{7ebf}\u{4e92}\u{8865}\u{6de1}\u{5165}\u{6de1}\u{51fa}\u{ff0c}\u{6ed1}\u{5165}\u{4ecd}\u{7528}\u{5f39}\u{7c27}\u{3002}\u{52a8}\u{753b}\u{64ad}\u{653e}\u{4e2d}\u{518d}\u{70b9}\u{4e0b}\u{4e00}\u{4e2a}\u{680f}\u{76ee}\u{65f6}\u{ff0c}\u{4e0d}\u{518d}\u{8df3}\u{8fc7}\u{5f53}\u{524d}\u{8fc7}\u{6e21}\u{91cd}\u{65b0}\u{622a}\u{56fe}\u{ff08}\u{521a}\u{8fdb}\u{5165}\u{7684}\u{9875}\u{9762}\u{4f1a}\u{8df3}\u{56de}\u{5168}\u{4eae}\u{3001}\u{51bb}\u{4f4f}\u{4e00}\u{4e24}\u{767e}\u{6beb}\u{79d2}\u{3001}\u{518d}\u{6de1}\u{51fa}\u{4e00}\u{6b21}\u{ff09}\u{ff0c}\u{800c}\u{662f}\u{5728}\u{64ad}\u{653e}\u{4e2d}\u{7684}\u{8fc7}\u{6e21}\u{91cc}\u{76f4}\u{63a5}\u{6362}\u{9875}\u{ff1b}\u{6d4f}\u{89c8}\u{5668}\u{6682}\u{505c}\u{7ed8}\u{5236}\u{3001}\u{7b49}\u{4e0a}\u{4e00}\u{9875}\u{6e32}\u{67d3}\u{7684}\u{90a3}\u{6bb5}\u{65f6}\u{95f4}\u{91cc}\u{7684}\u{70b9}\u{51fb}\u{5148}\u{8bb0}\u{4e0b}\u{ff0c}\u{7b49}\u{52a8}\u{753b}\u{5f00}\u{59cb}\u{540e}\u{63a5}\u{7740}\u{8df3}\u{8f6c}\u{3002}\n- **\u{8fc7}\u{6e21}\u{671f}\u{95f4}\u{70b9}\u{9875}\u{5934}\u{4e0d}\u{518d}\u{65e0}\u{53cd}\u{5e94}**\u{ff1a}\u{622a}\u{56fe}\u{5230}\u{52a8}\u{753b}\u{5f00}\u{59cb}\u{4e4b}\u{95f4}\u{ff08}\u{6bcf}\u{6b21}\u{5207}\u{9875}\u{7ea6} 80\u{2013}200ms\u{ff09}\u{ff0c}\u{4ee5}\u{53ca}\u{666e}\u{901a}\u{9875}\u{9762}\u{8fc7}\u{6e21}\u{7684}\u{6574}\u{6bb5}\u{52a8}\u{753b}\u{91cc}\u{ff0c}\u{6d4f}\u{89c8}\u{5668}\u{628a}\u{70b9}\u{51fb}\u{90fd}\u{843d}\u{5728} `<html>` \u{4e0a}\u{ff0c}\u{9875}\u{5934}\u{94fe}\u{63a5}\u{7684}\u{70b9}\u{51fb}\u{4f1a}\u{88ab}\u{541e}\u{6389}\u{3002}\u{73b0}\u{5728}\u{6309}\u{70b9}\u{51fb}\u{5750}\u{6807}\u{5728}\u{9875}\u{5934}\u{3001}\u{9875}\u{811a}\u{548c}\u{540e}\u{53f0}\u{4fa7}\u{680f}\u{91cc}\u{627e}\u{56de}\u{88ab}\u{70b9}\u{7684}\u{94fe}\u{63a5}\u{3002}\n- **\u{6b63}\u{6587}\u{56fe}\u{7247}\u{4e0a}\u{65b9}\u{7a7a}\u{9699}\u{8fc7}\u{5927}\u{3001}\u{5e95}\u{90e8}\u{88ab}\u{88c1}**\u{ff1a}\u{7ad9}\u{5185}\u{56fe}\u{7247}\u{5916}\u{6846} `.blur-img` \u{91cc}\u{4e24}\u{5c42}\u{7edd}\u{5bf9}\u{5b9a}\u{4f4d}\u{7684} `<img>` \u{88ab}\u{6b63}\u{6587}\u{901a}\u{7528}\u{56fe}\u{7247}\u{89c4}\u{5219}\u{52a0}\u{4e0a}\u{4e86} `1.6em` \u{4e0a}\u{4e0b}\u{5916}\u{8fb9}\u{8ddd}\u{ff08}\u{8be5}\u{89c4}\u{5219}\u{7279}\u{5f02}\u{6027}\u{9ad8}\u{4e8e} `images.css` \u{7684}\u{91cd}\u{7f6e}\u{ff09}\u{ff0c}\u{56fe}\u{5c42}\u{6574}\u{4f53}\u{4e0b}\u{79fb} 26px\u{ff0c}\u{56fe}\u{7247}\u{4e0a}\u{65b9}\u{7684}\u{7a7a}\u{9699}\u{6bd4}\u{4e0b}\u{65b9}\u{5927}\u{4e00}\u{500d}\u{ff0c}\u{5e95}\u{90e8}\u{540c}\u{6837}\u{9ad8}\u{5ea6}\u{7684}\u{4e00}\u{6761}\u{88ab}\u{5916}\u{6846}\u{88c1}\u{6389}\u{3002}\u{901a}\u{7528}\u{89c4}\u{5219}\u{73b0}\u{5728}\u{6392}\u{9664}\u{8fd9}\u{4e24}\u{5c42}\u{56fe}\u{ff0c}\u{95f4}\u{8ddd}\u{53ea}\u{7531}\u{5916}\u{6846}\u{8d1f}\u{8d23}\u{3002}\n\n## [1.2.0] - 2026-10-28\n\n\u{9996}\u{5c4f}\u{4e0e}\u{56de}\u{8bbf}\u{52a0}\u{8f7d}\u{4f18}\u{5316}\u{ff1a}HTML \u{4e0d}\u{518d}\u{9644}\u{5e26}\u{6570}\u{767e}\u{6761} WASM \u{5206}\u{5305}\u{9884}\u{8f7d}\u{ff0c}\u{5165}\u{53e3}\u{6309}\u{5185}\u{5bb9}\u{547d}\u{540d}\u{540e}\u{53ef}\u{4ee5}\u{957f}\u{671f}\u{7f13}\u{5b58}\u{ff0c}\u{5206}\u{5305}\u{6570}\u{91cf}\u{51cf}\u{5c11} 3\u{2013}5 \u{500d}\u{3002}\u{7ebf}\u{4e0a}\u{5b9e}\u{6d4b}\u{79fb}\u{52a8}\u{7aef}\u{ff08}1.6 Mbps\u{3001}CPU \u{964d}\u{901f} 4 \u{500d}\u{ff09}\u{9996}\u{6b21}\u{7ed8}\u{5236}\u{7531} 2.1\u{2013}4.9 \u{79d2}\u{964d}\u{5230} 1.1\u{2013}1.4 \u{79d2}\u{ff0c}\u{6bcf}\u{9875}\u{8bf7}\u{6c42}\u{7531} 300\u{2013}700 \u{4e2a}\u{964d}\u{5230} 95\u{2013}180 \u{4e2a}\u{ff1b}\u{56de}\u{8bbf}\u{4e0d}\u{518d}\u{91cd}\u{65b0}\u{4e0b}\u{8f7d}\u{4e3b} WASM\u{ff0c}\u{6c34}\u{5408}\u{7ea6} 1\u{2013}1.5 \u{79d2}\u{3002}\u{5b9e}\u{6d4b}\u{4e0e}\u{5bf9}\u{7167}\u{6570}\u{636e}\u{89c1} `docs/\u{9996}\u{5c4f}\u{6027}\u{80fd}\u{5b9e}\u{6d4b}-2026-10-28.md`\u{3002}release \u{524d}\u{7aef}\u{9700}\u{8981}\u{7528} `make install-cargo-leptos` \u{5b89}\u{88c5}\u{5206}\u{5305}\u{5408}\u{5e76}\u{8865}\u{4e01}\u{7248} cargo-leptos\u{3002}\n\n### Added\n\n- **\u{672c}\u{673a}\u{90e8}\u{7f72}\u{811a}\u{672c}**\u{ff1a}`fish scripts/deploy.fish` \u{5728}\u{672c}\u{673a}\u{7528}\u{56fd}\u{5185}\u{955c}\u{50cf}\u{6e90}\u{ff08}\u{6e05}\u{534e} Debian/Alpine\u{3001}rsproxy\u{3001}npmmirror\u{3001}gh-proxy\u{ff09}\u{6784}\u{5efa} amd64 \u{955c}\u{50cf}\u{ff0c}\u{7ecf} `docker save | ssh podman load` \u{76f4}\u{4f20} xun / rua\u{ff0c}\u{4e0d}\u{7ecf}\u{8fc7} GHCR\u{3002}\u{6d41}\u{7a0b}\u{4e0e} CI \u{90e8}\u{7f72}\u{4e00}\u{81f4}\u{ff1a}\u{6309} `ROLE` \u{5148}\u{90e8}\u{7f72} primary\u{ff08}\u{91cd}\u{5efa} app\u{ff0c}\u{68c0}\u{67e5} `/readyz` \u{4e0e} `x-yggdrasil-hash`\u{ff0c}\u{5931}\u{8d25}\u{81ea}\u{52a8}\u{56de}\u{6eda}\u{ff09}\u{ff0c}primary \u{6210}\u{529f}\u{540e}\u{518d}\u{7ed9} standby \u{9884}\u{7f6e}\u{955c}\u{50cf}\u{3002}\u{652f}\u{6301} `--skip-build`\u{3001}`--with-runners`\u{3001}`--only xun|rua`\u{3001}`--allow-dirty`\u{3002}\n\n### Changed\n\n- **HTML \u{4e0d}\u{518d}\u{9884}\u{8f7d} WASM \u{5206}\u{5305}**\u{ff1a}Leptos \u{4f1a}\u{4e3a}\u{670d}\u{52a1}\u{7aef}\u{6e32}\u{67d3}\u{65f6}\u{8c03}\u{7528}\u{8fc7}\u{7684}\u{6bcf}\u{4e2a}\u{61d2}\u{52a0}\u{8f7d}\u{53d6}\u{6570}\u{51fd}\u{6570}\u{5c55}\u{5f00}\u{5168}\u{90e8}\u{5206}\u{5305} `<link rel=\"preload\">`\u{ff0c}\u{4e14}\u{4e0d}\u{53bb}\u{91cd}\u{ff0c}\u{9996}\u{9875} `<head>` \u{91cc}\u{6709} 363 \u{6761}\u{3002}\u{5f31}\u{7f51}\u{4e0b}\u{5b83}\u{4eec}\u{4e0e} CSS \u{62a2}\u{5e26}\u{5bbd}\u{ff0c}\u{79fb}\u{52a8}\u{7aef}\u{9996}\u{6b21}\u{7ed8}\u{5236}\u{6162} 0.5\u{2013}2.5 \u{79d2}\u{ff0c}\u{6c34}\u{5408}\u{5e76}\u{4e0d}\u{66f4}\u{5feb}\u{3002}\u{73b0}\u{5728}\u{53ea}\u{9884}\u{8f7d}\u{4e3b}\u{5305}\u{548c}\u{5206}\u{5305}\u{52a0}\u{8f7d}\u{5668}\u{ff0c}\u{5176}\u{4f59}\u{5206}\u{5305}\u{7531}\u{52a0}\u{8f7d}\u{5668}\u{6309}\u{9700}\u{8bf7}\u{6c42}\u{3002}\n- **\u{5165}\u{53e3} JS / WASM \u{53ef}\u{957f}\u{671f}\u{7f13}\u{5b58}**\u{ff1a}\u{53d1}\u{5e03}\u{88c5}\u{914d}\u{6309}\u{5165}\u{53e3} JS\u{3001}\u{4e3b} WASM \u{4e0e}\u{5206}\u{5305}\u{52a0}\u{8f7d}\u{5668}\u{4e09}\u{8005}\u{7684}\u{6700}\u{7ec8}\u{5185}\u{5bb9}\u{91cd}\u{65b0}\u{547d}\u{540d}\u{5b83}\u{4eec}\u{ff0c}\u{5e76}\u{5728} `hash.txt` \u{5199}\u{5165} `entry: content-addressed`\u{ff1b}\u{5e26}\u{8be5}\u{6807}\u{8bb0}\u{65f6}\u{ff0c}\u{670d}\u{52a1}\u{7aef}\u{5bf9}\u{5165}\u{53e3}\u{8fd4}\u{56de} `immutable`\u{3002}\u{6b64}\u{524d}\u{5165}\u{53e3}\u{53ea}\u{80fd} `no-cache`\u{ff0c}\u{800c} EdgeOne \u{4e0d}\u{7f13}\u{5b58} `no-cache` \u{8d44}\u{6e90}\u{ff0c}\u{4e5f}\u{4e0d}\u{628a}\u{6761}\u{4ef6}\u{8bf7}\u{6c42}\u{8f6c}\u{7ed9}\u{6e90}\u{7ad9}\u{ff0c}\u{56de}\u{8bbf}\u{6bcf}\u{6253}\u{5f00}\u{4e00}\u{9875}\u{90fd}\u{8981}\u{6574}\u{5305}\u{91cd}\u{4e0b} 317 KB \u{7684}\u{4e3b} WASM\u{3002}\u{672a}\u{7ecf}\u{53d1}\u{5e03}\u{88c5}\u{914d}\u{7684} dev \u{4e0e}\u{56de}\u{5f52}\u{6784}\u{5efa}\u{ff0c}\u{5165}\u{53e3}\u{4ecd}\u{6bcf}\u{6b21}\u{6821}\u{9a8c}\u{3002}\n- **WASM \u{5206}\u{5305}\u{6570}\u{91cf}\u{51cf}\u{5c11} 3\u{2013}5 \u{500d}**\u{ff1a}release \u{524d}\u{7aef}\u{6539}\u{7528}\u{6253}\u{4e86}\u{5206}\u{5305}\u{5408}\u{5e76}\u{8865}\u{4e01}\u{7684} cargo-leptos 0.3.11\u{ff08}`wasm_split_cli_support` \u{6362}\u{6210} `VOD-Studio/wasm-split-prototype` \u{7684} `ygg/chunk-merge` \u{5206}\u{652f}\u{ff09}\u{3002}\u{539f}\u{7248}\u{6309}\u{300c}\u{9700}\u{8981}\u{5b83}\u{7684}\u{5206}\u{5305}\u{96c6}\u{5408}\u{300d}\u{9010}\u{4e00}\u{5207}\u{51fa}\u{5171}\u{4eab}\u{5206}\u{5305}\u{ff0c}59 \u{4e2a}\u{61d2}\u{52a0}\u{8f7d}\u{70b9}\u{5207}\u{51fa} 1121 \u{4e2a}\u{5171}\u{4eab}\u{5206}\u{5305}\u{ff0c}\u{534a}\u{6570}\u{4e0d}\u{5230} 200 \u{5b57}\u{8282}\u{ff0c}\u{6253}\u{5f00}\u{4e00}\u{7bc7}\u{6587}\u{7ae0}\u{8981}\u{8bf7}\u{6c42} 379 \u{4e2a} `.wasm`\u{3002}\u{8865}\u{4e01}\u{628a}\u{5408}\u{5e76}\u{540e}\u{6536}\u{76ca}\u{4e3a}\u{6b63}\u{7684}\u{5c0f}\u{5206}\u{5305}\u{8d2a}\u{5fc3}\u{5408}\u{5e76}\u{ff0c}\u{5171}\u{4eab}\u{5206}\u{5305}\u{964d}\u{5230} 262 \u{4e2a}\u{ff0c}\u{6587}\u{7ae0}\u{9875}\u{964d}\u{5230} 70 \u{4e2a} `.wasm`\u{ff0c}\u{5404}\u{8def}\u{7531}\u{9996}\u{5c4f} WASM \u{603b}\u{91cf}\u{57fa}\u{672c}\u{4e0d}\u{53d8}\u{ff08}\u{6587}\u{7ae0}\u{9875}\u{5c11} 31 KB\u{ff09}\u{3002}\u{5728}\u{6a21}\u{62df}\u{79fb}\u{52a8}\u{7f51}\u{7edc}\u{ff08}1.6 Mbps\u{3001}150 ms\u{3001}CPU \u{964d}\u{901f} 4 \u{500d}\u{ff09}\u{4e0b}\u{ff0c}\u{6c34}\u{5408}\u{5b8c}\u{6210}\u{63d0}\u{524d} 0.3\u{2013}2.2 \u{79d2}\u{3002}`make install-cargo-leptos` \u{5b89}\u{88c5}\u{8865}\u{4e01}\u{7248}\u{ff1b}release \u{524d}\u{7aef}\u{6784}\u{5efa}\u{4f1a}\u{68c0}\u{67e5}\u{ff0c}`test-release-split` \u{589e}\u{52a0}\u{6bcf}\u{6761}\u{8def}\u{7531}\u{4e0d}\u{8d85}\u{8fc7} 150 \u{4e2a} `.wasm` \u{7684}\u{95e8}\u{69db}\u{3002}\n\n## [1.1.1] - 2026-10-28\n\n\u{751f}\u{4ea7}\u{73af}\u{5883}\u{6539}\u{4e3a} xun \u{4e3b}\u{3001}rua \u{70ed}\u{5907}\u{7684}\u{53cc}\u{673a}\u{4e3b}\u{5907}\u{90e8}\u{7f72}\u{ff1a}CI \u{6309}\u{8282}\u{70b9}\u{89d2}\u{8272}\u{90e8}\u{7f72}\u{ff0c}\u{8865}\u{9f50}\u{8fd0}\u{7ef4}\u{6587}\u{6863}\u{4e0e}\u{7ebf}\u{4e0a}\u{811a}\u{672c}\u{3002}v1.1.0 \u{7684}\u{53d1}\u{7248}\u{6d41}\u{6c34}\u{7ebf}\u{4e2d}\u{9014}\u{53d6}\u{6d88}\u{3001}\u{672a}\u{90e8}\u{7f72}\u{ff0c}\u{672c}\u{7248}\u{672c}\u{4e00}\u{5e76}\u{4e0a}\u{7ebf} v1.1.0 \u{7684}\u{5168}\u{90e8}\u{6539}\u{52a8}\u{3002}\n\n### Added\n\n- **\u{53cc}\u{673a}\u{4e3b}\u{5907}\u{8fd0}\u{7ef4}\u{6587}\u{6863}**\u{ff1a}`docs/\u{53cc}\u{673a}\u{4e3b}\u{5907}/` \u{8bb0}\u{5f55}\u{751f}\u{4ea7} xun / rua \u{7684}\u{62d3}\u{6251}\u{3001}\u{4e3a}\u{4ec0}\u{4e48}\u{53ea}\u{80fd}\u{4e3b}\u{5907}\u{4e0d}\u{80fd}\u{53cc}\u{6d3b}\u{3001}\u{65e5}\u{5e38}\u{68c0}\u{67e5}\u{3001}\u{6545}\u{969c}\u{5207}\u{6362}\u{3001}\u{56de}\u{5207}\u{3001}\u{91cd}\u{5efa}\u{70ed}\u{5907}\u{4e0e}\u{56de}\u{6e90}\u{5bc6}\u{94a5}\u{8f6e}\u{6362}\u{ff0c}\u{5e76}\u{6536}\u{5f55}\u{4e24}\u{53f0}\u{670d}\u{52a1}\u{5668}\u{5b9e}\u{9645}\u{5b89}\u{88c5}\u{7684} compose\u{3001}systemd \u{5355}\u{5143}\u{4e0e} `ygg-failover`\u{3001}`ygg-rebuild-standby`\u{3001}`ygg-standby-sync`\u{3001}`ygg-origin-auth` \u{811a}\u{672c}\u{ff08}\u{4e0d}\u{542b} IP \u{4e0e}\u{5bc6}\u{94a5}\u{ff09}\u{3002}\n\n### Changed\n\n- **CI \u{53cc}\u{673a}\u{6539}\u{4e3a}\u{4e3b}\u{5907}\u{90e8}\u{7f72}**\u{ff1a}xun\u{3001}rua \u{6309}\u{90e8}\u{7f72}\u{76ee}\u{5f55}\u{4e0b}\u{7684} `ROLE` \u{6587}\u{4ef6}\u{ff08}`primary`/`standby`\u{ff0c}\u{7f3a}\u{7701} `primary`\u{ff09}\u{533a}\u{5206}\u{89d2}\u{8272}\u{3002}primary \u{7167}\u{65e7}\u{91cd}\u{5efa} app\u{3001}\u{5065}\u{5eb7}\u{68c0}\u{67e5}\u{4e0e}\u{5931}\u{8d25}\u{56de}\u{6eda}\u{ff1b}standby \u{53ea}\u{9884}\u{62c9} app \u{4e0e} runner \u{955c}\u{50cf}\u{ff0c}\u{4e0d}\u{542f}\u{52a8} app\u{ff08}\u{70ed}\u{5907}\u{5e93}\u{53ea}\u{8bfb}\u{ff0c}app \u{542f}\u{52a8}\u{8fc1}\u{79fb}\u{4f1a}\u{76f4}\u{63a5}\u{9000}\u{51fa}\u{ff09}\u{3002}deploy-rua \u{6539}\u{4e3a}\u{5728} deploy-xun \u{4e4b}\u{540e}\u{8fd0}\u{884c}\u{ff1a}standby \u{4ec5}\u{5728} xun \u{90e8}\u{7f72}\u{6210}\u{529f}\u{540e}\u{9884}\u{62c9}\u{ff0c}\u{4f7f}\u{6545}\u{969c}\u{5207}\u{6362}\u{65f6}\u{542f}\u{52a8}\u{7684}\u{7248}\u{672c}\u{4e0e} xun \u{4e00}\u{81f4}\u{ff1b}rua \u{5df2}\u{5207}\u{4e3a} primary \u{65f6}\u{4e0d}\u{53d7} xun \u{7ed3}\u{679c}\u{5f71}\u{54cd}\u{3002}\n\n### Fixed\n\n- **\u{505c}\u{6b62}\u{670d}\u{52a1}\u{4e0d}\u{518d}\u{88ab}\u{5f3a}\u{5236}\u{6740}\u{6389}**\u{ff1a}\u{6536}\u{5230} SIGTERM \u{540e}\u{ff0c}\u{540e}\u{53f0}\u{5b9e}\u{65f6}\u{65e5}\u{5fd7}\u{4e0e}\u{4ee3}\u{7801}\u{8fd0}\u{884c}\u{7684} SSE \u{957f}\u{8fde}\u{63a5}\u{7acb}\u{5373}\u{7ed3}\u{675f}\u{ff0c}\u{4e0d}\u{518d}\u{62d6}\u{4f4f}\u{4f18}\u{96c5}\u{5173}\u{95ed}\u{ff1b}\u{5176}\u{4f59}\u{5728}\u{9014}\u{8bf7}\u{6c42}\u{6700}\u{591a}\u{518d}\u{7b49} 5 \u{79d2}\u{3002}\u{6b64}\u{524d}\u{53ea}\u{8981}\u{8fd8}\u{6709}\u{4e00}\u{6761} SSE \u{8fde}\u{63a5}\u{6ca1}\u{65ad}\u{ff0c}\u{8fdb}\u{7a0b}\u{5c31}\u{4f1a}\u{4e00}\u{76f4}\u{7b49}\u{5230}\u{5bb9}\u{5668} 10 \u{79d2}\u{505c}\u{6b62}\u{8d85}\u{65f6}\u{88ab} SIGKILL\u{ff0c}\u{6bcf}\u{6b21}\u{90e8}\u{7f72}\u{548c}\u{4e3b}\u{5907}\u{5207}\u{6362}\u{90fd}\u{591a}\u{7b49} 10 \u{79d2}\u{3002}\n- **\u{975e}\u{6cd5}\u{9875}\u{7801}\u{7a33}\u{5b9a}\u{8fd4}\u{56de} 404**\u{ff1a}`/page/abc` \u{8fd9}\u{7c7b}\u{975e}\u{6570}\u{5b57}\u{9875}\u{7801}\u{6b64}\u{524d}\u{7ea6} 2% \u{7684}\u{8bf7}\u{6c42}\u{8fd4}\u{56de} 200\u{ff0c}\u{4e14}\u{8fd9}\u{4e2a} 200 \u{4f1a}\u{88ab} SSR \u{7f13}\u{5b58} 60 \u{79d2}\u{3002}\u{539f}\u{56e0}\u{662f}\u{524d}\u{53f0}\u{9875}\u{9762}\u{90fd}\u{5305}\u{5728}\u{5e03}\u{5c40}\u{7684} Suspense \u{91cc}\u{ff0c}\u{6d41}\u{5f0f}\u{6e32}\u{67d3}\u{65f6} 404 \u{80fd}\u{5426}\u{8d76}\u{5728}\u{9996}\u{4e2a}\u{54cd}\u{5e94}\u{5757}\u{4e4b}\u{524d}\u{5199}\u{5165}\u{53d6}\u{51b3}\u{4e8e}\u{7ebf}\u{7a0b}\u{8c03}\u{5ea6}\u{3002}`/page/:page` \u{6539}\u{4e3a}\u{7b49}\u{6e32}\u{67d3}\u{5b8c}\u{6210}\u{518d}\u{8f93}\u{51fa}\u{ff08}\u{9996}\u{9875} `/` \u{4ecd}\u{6d41}\u{5f0f}\u{8f93}\u{51fa}\u{ff09}\u{ff0c}\u{9996}\u{9875}\u{6807}\u{9898}\u{4e5f}\u{6539}\u{4e3a}\u{5728}\u{6e32}\u{67d3}\u{65f6}\u{5b9a}\u{503c}\u{ff0c}\u{907f}\u{514d}\u{6ce8}\u{5165} `<head>` \u{65f6}\u{8bfb}\u{5230}\u{5df2}\u{91ca}\u{653e}\u{7684}\u{9875}\u{7801}\u{3002}\n\n## [1.1.0] - 2026-10-28\n\n\u{524d}\u{7aef}\u{6846}\u{67b6}\u{7531} Dioxus \u{8fc1}\u{79fb}\u{5230} Leptos 0.8\u{ff0c}\u{542f}\u{7528}\u{8def}\u{7531}\u{7ea7} WASM \u{5206}\u{5305}\u{4e0e}\u{94fe}\u{63a5}\u{60ac}\u{505c}\u{9884}\u{53d6}\u{ff1b}\u{90e8}\u{7f72}\u{540e}\u{4ecd}\u{5f00}\u{7740}\u{7684}\u{65e7}\u{6807}\u{7b7e}\u{9875}\u{9700}\u{5237}\u{65b0}\u{ff08}\u{63a5}\u{53e3}\u{5730}\u{5740}\u{4e0e}\u{9519}\u{8bef}\u{8f7d}\u{8377}\u{534f}\u{8bae}\u{5df2}\u{53d8}\u{ff09}\u{3002}\n\n### Added\n\n- **\u{94fe}\u{63a5}\u{60ac}\u{505c}\u{9884}\u{53d6}**\u{ff1a}\u{9f20}\u{6807}\u{505c}\u{7559}\u{3001}\u{952e}\u{76d8}\u{805a}\u{7126}\u{6216}\u{89e6}\u{5c4f}\u{6309}\u{4e0b}\u{7ad9}\u{5185}\u{94fe}\u{63a5}\u{65f6}\u{63d0}\u{524d}\u{4e0b}\u{8f7d}\u{76ee}\u{6807}\u{9875}\u{9762}\u{7684} WASM \u{5206}\u{5305}\u{4e0e}\u{9875}\u{9762}\u{6570}\u{636e}\u{ff0c}\u{70b9}\u{51fb}\u{540e}\u{4e0d}\u{518d}\u{7b49}\u{5f85}\u{4e0b}\u{8f7d}\u{548c}\u{9996}\u{6b21}\u{8bf7}\u{6c42}\u{ff0c}\u{6587}\u{7ae0}\u{6807}\u{9898}\u{4e0e}\u{5c01}\u{9762}\u{7684}\u{5171}\u{4eab}\u{5143}\u{7d20}\u{8fc7}\u{6e21}\u{4e5f}\u{4e0d}\u{518d}\u{56e0}\u{52a0}\u{8f7d}\u{8d85}\u{65f6}\u{4e22}\u{5931}\u{ff1b}\u{89e6}\u{5c4f}\u{8bbe}\u{5907}\u{5728}\u{7a7a}\u{95f2}\u{65f6}\u{9884}\u{53d6}\u{89c6}\u{53e3}\u{5185}\u{94fe}\u{63a5}\u{7684}\u{5206}\u{5305}\u{ff1b}\u{7701}\u{6d41}\u{91cf}\u{6a21}\u{5f0f}\u{4e0e} 2G \u{7f51}\u{7edc}\u{4e0b}\u{4e0d}\u{9884}\u{53d6}\u{3002}\n\n### Changed\n\n- **\u{811a}\u{672c}\u{7edf}\u{4e00}\u{4e3a} Bun TypeScript**\u{ff1a}`scripts/` \u{7684}\u{5168}\u{90e8} 22 \u{4e2a} `.cjs` \u{5de5}\u{5177}\u{8fc1}\u{79fb}\u{4e3a} `.ts`\u{ff0c}\u{8865}\u{9f50}\u{53d1}\u{5e03}\u{88c5}\u{914d}\u{3001}\u{5b57}\u{4f53}\u{ff0f}\u{56fe}\u{6807}\u{751f}\u{6210}\u{3001}\u{6d4b}\u{8bd5}\u{7f16}\u{6392}\u{4e0e} Playwright \u{6d4f}\u{89c8}\u{5668}\u{56de}\u{5f52}\u{7684}\u{4e25}\u{683c}\u{7c7b}\u{578b}\u{ff1b}Makefile\u{3001}Docker\u{3001}CI \u{548c}\u{6587}\u{6863}\u{540c}\u{6b65}\u{5207}\u{6362}\u{8c03}\u{7528}\u{8def}\u{5f84}\u{ff0c}\u{5de5}\u{4f5c}\u{533a}\u{7c7b}\u{578b}\u{68c0}\u{67e5}\u{4e0e} CI \u{7eb3}\u{5165}\u{811a}\u{672c}\u{68c0}\u{67e5}\u{ff0c}Bash\u{ff0f}Fish \u{8fd0}\u{7ef4}\u{811a}\u{672c}\u{4fdd}\u{6301}\u{4e0d}\u{53d8}\u{3002}\n- **\u{5206}\u{4eab}\u{56fe}\u{5b57}\u{4f53}\u{5de5}\u{5177}\u{7edf}\u{4e00}\u{5230} Bun**\u{ff1a}\u{5b57}\u{4f53}\u{88c1}\u{526a}\u{6539}\u{7528} `scripts/subset-og-fonts.ts` \u{4e0e} HarfBuzz WASM\u{ff0c}\u{4e0d}\u{518d}\u{4f9d}\u{8d56} Python/fontTools\u{ff1b}\u{4fdd}\u{7559} GB 2312 \u{7684} 6763 \u{4e2a}\u{6c49}\u{5b57}\u{3001}\u{539f}\u{6709}\u{6807}\u{70b9}\u{8303}\u{56f4}\u{3001}\u{5b57}\u{4f53}\u{540d}\u{79f0}\u{4e0e}\u{6392}\u{7248}\u{7279}\u{6027}\u{ff0c}\u{5e76}\u{6392}\u{9664} GBK \u{89e3}\u{7801}\u{5668}\u{989d}\u{5916}\u{6620}\u{5c04}\u{7684}\u{4e94}\u{4e2a}\u{7a7a}\u{4f4d}\u{3002}\n- **Bun \u{6784}\u{5efa}\u{5de5}\u{5177}\u{5347}\u{7ea7}**\u{ff1a}\u{751f}\u{4ea7}\u{3001}\u{4ea4}\u{53c9}\u{7f16}\u{8bd1}\u{4e0e}\u{5f00}\u{53d1} Docker \u{955c}\u{50cf}\u{7edf}\u{4e00}\u{5347}\u{7ea7}\u{5230} Bun 1.4.4\u{ff0c}\u{5de5}\u{4f5c}\u{533a}\u{4e0e} CI \u{540c}\u{6b65}\u{4f7f}\u{7528}\u{8be5}\u{7248}\u{672c}\u{3002}\n- **\u{524d}\u{7aef}\u{6846}\u{67b6}\u{8fc1}\u{79fb}\u{5230} Leptos 0.8**\u{ff1a}Dioxus 0.7 \u{6574}\u{4f53}\u{66ff}\u{6362}\u{4e3a} Leptos 0.8.22 + cargo-leptos\u{ff08}`--split` \u{8def}\u{7531}\u{7ea7} WASM \u{5206}\u{5305}\u{ff09}\u{ff0c}\u{5220}\u{9664} reader / full \u{53cc} flavor\u{ff1a}\u{524d}\u{53f0}\u{3001}\u{540e}\u{53f0}\u{3001}\u{767b}\u{5f55}\u{4e0e}\u{7ec4}\u{4ef6}\u{56fe}\u{9274}\u{5168}\u{90e8}\u{662f}\u{61d2}\u{52a0}\u{8f7d}\u{8def}\u{7531}\u{ff0c}\u{6bcf}\u{6761}\u{516c}\u{5f00}\u{8def}\u{7531}\u{9996}\u{5c4f} Brotli WASM \u{4e0d}\u{8d85}\u{8fc7}\u{539f} reader \u{4ea7}\u{7269}\u{4f53}\u{79ef}\u{3002}\u{7ad9}\u{5185}\u{5bfc}\u{822a}\u{4ecd}\u{7531} `yggdrasil-core` \u{6301}\u{6709} history \u{4e0e}\u{89c6}\u{56fe}\u{8fc7}\u{6e21}\u{3002}\n- **\u{63a5}\u{53e3}\u{5730}\u{5740}\u{4e0d}\u{518d}\u{5e26}\u{54c8}\u{5e0c}\u{540e}\u{7f00}**\u{ff1a}server function \u{7531} `/api/<name><\u{54c8}\u{5e0c}>` \u{53d8}\u{4e3a} `/api/<name>`\u{ff0c}\u{53d1}\u{5e03}\u{5207}\u{6362}\u{77ac}\u{95f4}\u{4ecd}\u{5f00}\u{7740}\u{7684}\u{65e7}\u{6807}\u{7b7e}\u{9875}\u{9700}\u{8981}\u{5237}\u{65b0}\u{3002}\n- **\u{53d1}\u{5e03}\u{4ea7}\u{7269}**\u{ff1a}\u{524d}\u{7aef}\u{9759}\u{6001}\u{4ea7}\u{7269}\u{4f4d}\u{4e8e} `public/pkg/`\u{ff0c}\u{670d}\u{52a1}\u{7aef}\u{542f}\u{52a8}\u{65f6}\u{6821}\u{9a8c}\u{540c}\u{76ee}\u{5f55} `hash.txt` \u{4e0e} `pkg/` \u{6587}\u{4ef6}\u{914d}\u{5957}\u{ff1b}`YGG_PREVIOUS_PUBLIC_DIR` \u{56de}\u{9000} `/pkg/` \u{4e0b}\u{5df2}\u{5220}\u{9664}\u{7684}\u{5206}\u{5305}\u{3002}`DIOXUS_PUBLIC_PATH` \u{6539}\u{4e3a} `LEPTOS_SITE_ROOT`\u{3002}\u{5206}\u{5305}\u{4e0e}\u{52a0}\u{8f7d}\u{5668}\u{957f}\u{671f}\u{7f13}\u{5b58}\u{ff0c}\u{5165}\u{53e3} `yggdrasil.<\u{54c8}\u{5e0c}>.{js,wasm}` \u{6bcf}\u{6b21}\u{5411}\u{670d}\u{52a1}\u{5668}\u{6821}\u{9a8c}\u{ff1a}\u{5165}\u{53e3}\u{6587}\u{4ef6}\u{540d}\u{4e0d}\u{968f}\u{5176}\u{4e2d}\u{5f15}\u{7528}\u{7684}\u{52a0}\u{8f7d}\u{5668}\u{53d8}\u{5316}\u{ff0c}\u{957f}\u{671f}\u{7f13}\u{5b58}\u{4f1a}\u{8ba9}\u{56de}\u{8bbf}\u{6d4f}\u{89c8}\u{5668}\u{5728}\u{53d1}\u{5e03}\u{540e}\u{7528}\u{65e7}\u{5165}\u{53e3}\u{52a0}\u{8f7d}\u{5df2}\u{5220}\u{9664}\u{7684}\u{5206}\u{5305}\u{3002}\n\n### Fixed\n\n- **\u{6d4f}\u{89c8}\u{5668}\u{56de}\u{5f52}\u{5047}\u{901a}\u{8fc7}**\u{ff1a}\u{9875}\u{9762}\u{5192}\u{70df}\u{6539}\u{7528} `/about/writing`\u{ff0c}\u{68c0}\u{67e5} HTTP 200\u{3001}\u{65e0}\u{91cd}\u{5b9a}\u{5411}\u{3001}\u{5b8c}\u{6574}\u{6c34}\u{5408}\u{4e0e}\u{8def}\u{7531}\u{6807}\u{8bb0}\u{ff0c}\u{5e76}\u{6838}\u{5bf9}\u{5199}\u{4f5c}\u{6307}\u{5357}\u{6807}\u{9898}\u{ff1b}404 \u{9875}\u{6216}\u{4ec5}\u{52a0}\u{8f7d}\u{4e86}\u{5bfc}\u{822a}\u{811a}\u{672c}\u{4e0d}\u{518d}\u{89c6}\u{4e3a}\u{901a}\u{8fc7}\u{3002}\u{79fb}\u{9664}\u{5df2}\u{65e0}\u{5bf9}\u{5e94}\u{5217}\u{8868} UI \u{7684}\u{5c01}\u{9762}\u{8fc7}\u{6e21}\u{573a}\u{666f}\u{ff0c}\u{672a}\u{77e5}\u{573a}\u{666f}\u{53c2}\u{6570}\u{660e}\u{786e}\u{62a5}\u{9519}\u{ff0c}\u{540c}\u{6b65}\u{6e05}\u{7406}\u{8fc7}\u{671f}\u{7684}\u{5bfc}\u{822a}\u{4e0e} rustdoc \u{56de}\u{5f52}\u{8bf4}\u{660e}\u{3002}\n- **\u{5199}\u{4f5c}\u{6307}\u{5357}\u{76f4}\u{8fbe}\u{6807}\u{9898}\u{9519}\u{8bef}**\u{ff1a}`/about/writing` \u{7684}\u{9875}\u{9762}\u{6807}\u{9898}\u{79fb}\u{5230}\u{6570}\u{636e}\u{6302}\u{8d77}\u{8fb9}\u{754c}\u{4e4b}\u{5916}\u{ff0c}\u{6d41}\u{5f0f} SSR \u{9996}\u{4e2a}\u{54cd}\u{5e94}\u{5373}\u{5e26}\u{300c}\u{5199}\u{4f5c}\u{6307}\u{5357} \u{b7} Yggdrasil\u{300d}\u{ff0c}\u{4e0d}\u{518d}\u{4fdd}\u{7559}\u{5168}\u{7ad9}\u{9ed8}\u{8ba4}\u{6807}\u{9898}\u{3002}\n- **\u{5ba2}\u{6237}\u{7aef}\u{5207}\u{9875}\u{4e22}\u{5931}\u{5206}\u{4eab}\u{4fe1}\u{606f}**\u{ff1a}\u{7ad9}\u{70b9}\u{5206}\u{4eab}\u{4e0a}\u{4e0b}\u{6587}\u{7531}\u{5e94}\u{7528}\u{6839}\u{7ec4}\u{4ef6}\u{968f} SSR \u{9875}\u{9762}\u{4f20}\u{7ed9}\u{6d4f}\u{89c8}\u{5668}\u{ff1b}\u{4ece}\u{6587}\u{7ae0}\u{9875}\u{8fd4}\u{56de}\u{9996}\u{9875}\u{3001}\u{6216}\u{5ba2}\u{6237}\u{7aef}\u{8fdb}\u{5165}\u{6587}\u{7ae0}\u{9875}\u{540e}\u{ff0c}\u{63cf}\u{8ff0}\u{3001}Open Graph \u{5730}\u{5740}\u{4e0e}\u{5206}\u{4eab}\u{56fe}\u{4fdd}\u{6301}\u{548c}\u{76f4}\u{8fbe}\u{9875}\u{9762}\u{4e00}\u{81f4}\u{ff0c}\u{4e0d}\u{518d}\u{53d8}\u{4e3a}\u{7a7a}\u{4e32}\u{6216}\u{76f8}\u{5bf9}\u{5730}\u{5740}\u{3002}\n- **SQL \u{63a7}\u{5236}\u{53f0}\u{6267}\u{884c}\u{4e2d}\u{6309}\u{5feb}\u{6377}\u{952e}\u{91cd}\u{590d}\u{63d0}\u{4ea4}**\u{ff1a}\u{6267}\u{884c}\u{6309}\u{94ae}\u{5728}\u{8fd0}\u{884c}\u{65f6}\u{7981}\u{7528}\u{ff0c}\u{4f46} Ctrl/Cmd+Enter \u{4ecd}\u{4f1a}\u{8c03}\u{7528}\u{540c}\u{4e00}\u{4e2a}\u{6267}\u{884c}\u{5165}\u{53e3}\u{ff0c}\u{53d1}\u{51fa}\u{5e76}\u{53d1}\u{7684} `execute_sql` \u{8bf7}\u{6c42}\u{ff1a}\u{6700}\u{5148}\u{8fd4}\u{56de}\u{7684}\u{8bf7}\u{6c42}\u{628a}\u{6309}\u{94ae}\u{63d0}\u{524d}\u{590d}\u{4f4d}\u{ff0c}\u{5199}\u{64cd}\u{4f5c}\u{8fd8}\u{53ef}\u{80fd}\u{88ab}\u{91cd}\u{590d}\u{6267}\u{884c}\u{3002}\u{73b0}\u{5728}\u{5165}\u{53e3}\u{68c0}\u{67e5}\u{662f}\u{5426}\u{6b63}\u{5728}\u{6267}\u{884c}\u{ff0c}\u{6267}\u{884c}\u{4e2d}\u{6309}\u{5feb}\u{6377}\u{952e}\u{76f4}\u{63a5}\u{5ffd}\u{7565}\u{ff0c}\u{5199}\u{64cd}\u{4f5c}\u{786e}\u{8ba4}\u{5f39}\u{7a97}\u{4e5f}\u{53ea}\u{51fa}\u{73b0}\u{4e00}\u{6b21}\u{3002}\n- **Server function \u{9519}\u{8bef}\u{5931}\u{53bb}\u{7c7b}\u{578b}**\u{ff1a}\u{7edf}\u{4e00}\u{4f7f}\u{7528} JSON \u{7f16}\u{7801}\u{7684} `ApiError`\u{ff0c}\u{533a}\u{5206}\u{672a}\u{8ba4}\u{8bc1}\u{3001}\u{65e0}\u{6743}\u{9650}\u{3001}\u{8d44}\u{6e90}\u{4e0d}\u{5b58}\u{5728}\u{3001}\u{4e1a}\u{52a1}\u{62d2}\u{7edd}\u{3001}\u{670d}\u{52a1}\u{4e0d}\u{53ef}\u{7528}\u{4e0e}\u{5185}\u{90e8}\u{6545}\u{969c}\u{ff1b}\u{7f51}\u{7edc}\u{548c}\u{7f16}\u{89e3}\u{7801}\u{9519}\u{8bef}\u{4fdd}\u{7559}\u{6846}\u{67b6}\u{7c7b}\u{522b}\u{3002}\u{6570}\u{636e}\u{5e93}\u{8fde}\u{63a5}\u{3001}SQL \u{4e0e}\u{4e8b}\u{52a1}\u{7ec6}\u{8282}\u{7ee7}\u{7eed}\u{53ea}\u{8bb0}\u{670d}\u{52a1}\u{7aef}\u{65e5}\u{5fd7}\u{ff0c}SSR \u{8d44}\u{6e90}\u{5f80}\u{8fd4}\u{4e0d}\u{4e22}\u{9519}\u{8bef}\u{7c7b}\u{578b}\u{ff0c}\u{9875}\u{9762}\u{4e0e} ErrorBoundary \u{4e0d}\u{518d}\u{6309} `not_found` \u{6587}\u{672c}\u{5224}\u{65ad} 404\u{3002}\u{9519}\u{8bef}\u{8f7d}\u{8377}\u{534f}\u{8bae}\u{5df2}\u{5207}\u{6362}\u{ff0c}\u{90e8}\u{7f72}\u{540e}\u{65e7}\u{6807}\u{7b7e}\u{9875}\u{9700}\u{5237}\u{65b0}\u{ff1b}HTTP \u{72b6}\u{6001}\u{4ecd}\u{6cbf}\u{7528} Leptos server function \u{7684}\u{9519}\u{8bef}\u{54cd}\u{5e94}\u{7ea6}\u{5b9a}\u{ff0c}\u{5e94}\u{7528}\u{7c7b}\u{522b}\u{8bfb}\u{53d6} `code` \u{5b57}\u{6bb5}\u{3002}\n- **\u{540e}\u{53f0}\u{4f1a}\u{8bdd}\u{9a8c}\u{8bc1}\u{5931}\u{8d25}\u{8bef}\u{8df3}\u{767b}\u{5f55}\u{9875}**\u{ff1a}\u{7f51}\u{7edc}\u{4e2d}\u{65ad}\u{6216}\u{670d}\u{52a1}\u{9519}\u{8bef}\u{4e0d}\u{518d}\u{89c6}\u{4e3a}\u{672a}\u{767b}\u{5f55}\u{ff0c}\u{4fdd}\u{7559}\u{5f53}\u{524d}\u{540e}\u{53f0}\u{5730}\u{5740}\u{5e76}\u{663e}\u{793a}\u{53ef}\u{539f}\u{4f4d}\u{91cd}\u{8bd5}\u{7684}\u{9a8c}\u{8bc1}\u{5931}\u{8d25}\u{63d0}\u{793a}\u{ff1b}\u{9a8c}\u{8bc1}\u{6210}\u{529f}\u{524d}\u{4e0d}\u{52a0}\u{8f7d}\u{540e}\u{53f0}\u{5b50}\u{9875}\u{9762}\u{ff0c}\u{53ea}\u{6709}\u{660e}\u{786e}\u{8fd4}\u{56de}\u{672a}\u{767b}\u{5f55}\u{65f6}\u{624d}\u{8df3}\u{8f6c} `/login`\u{3002}\n- **\u{6162}\u{7f51}\u{7edc}\u{5207}\u{9875}\u{4e0d}\u{518d}\u{7a7a}\u{767d}**\u{ff1a}\u{76ee}\u{6807}\u{9875}\u{5206}\u{5305}\u{52a0}\u{8f7d}\u{8d85}\u{8fc7} 300ms \u{65f6}\u{ff0c}\u{65e7}\u{6b63}\u{6587}\u{6de1}\u{51fa}\u{540e}\u{7acb}\u{5373}\u{663e}\u{793a}\u{76ee}\u{6807}\u{9875}\u{9aa8}\u{67b6}\u{5c4f}\u{ff0c}\u{9aa8}\u{67b6}\u{7684}\u{4f4d}\u{7f6e}\u{4e0e}\u{5bbd}\u{5ea6}\u{548c}\u{76ee}\u{6807}\u{9875}\u{6b63}\u{6587}\u{4e00}\u{81f4}\u{ff08}\u{4ece}\u{6587}\u{7ae0}\u{9875}\u{5207}\u{5230}\u{7a84}\u{9875}\u{9762}\u{4e0d}\u{4f1a}\u{88ab}\u{62c9}\u{5bbd}\u{ff0c}\u{4ece}\u{7a84}\u{9875}\u{9762}\u{5207}\u{5230}\u{66f4}\u{5bbd}\u{7684}\u{7ec4}\u{4ef6}\u{56fe}\u{9274}\u{4e5f}\u{4e0d}\u{4f1a}\u{88ab}\u{538b}\u{7a84}\u{ff09}\u{ff0c}\u{9875}\u{9762}\u{6302}\u{8f7d}\u{540e}\u{9aa8}\u{67b6}\u{4e0d}\u{518d}\u{989d}\u{5916}\u{5ef6}\u{8fdf} 200ms\u{3002}\n- **`make build` \u{5168}\u{7a0b}\u{96f6}\u{8b66}\u{544a}**\u{ff1a}\u{4fee}\u{590d}\u{7ad9}\u{70b9} rustdoc \u{7684} 34 \u{6761}\u{94fe}\u{63a5}\u{544a}\u{8b66}\u{2014}\u{2014}\u{6a21}\u{5757} `//!` \u{6587}\u{6863}\u{4e0e}\u{58f0}\u{660e}\u{5904} `///` \u{5916}\u{5c42}\u{6587}\u{6863}\u{5408}\u{5e76}\u{540e}\u{6309}\u{7236}\u{4f5c}\u{7528}\u{57df}\u{89e3}\u{6790}\u{ff0c}\u{672a}\u{9650}\u{5b9a}\u{8def}\u{5f84}\u{7684}\u{94fe}\u{63a5}\u{65ad}\u{94fe}\u{6216}\u{6307}\u{5230}\u{9519}\u{8bef}\u{6761}\u{76ee}\u{ff0c}\u{73b0}\u{6539}\u{4e3a}\u{663e}\u{5f0f}\u{8def}\u{5f84}\u{94fe}\u{63a5}\u{ff1b}\u{79c1}\u{6709}\u{5b9e}\u{73b0}\u{9879}\u{7684}\u{94fe}\u{63a5}\u{5728} `--document-private-items` \u{6587}\u{6863}\u{4e2d}\u{5c5e}\u{9884}\u{671f}\u{ff0c}\u{653e}\u{884c}\u{5bf9}\u{5e94} lint\u{ff1b}\u{53e6}\u{5220}\u{9664} cargo-leptos \u{4e0d}\u{8bc6}\u{522b}\u{7684} `env = \"DEV\"` \u{5143}\u{6570}\u{636e}\u{952e}\u{3002}\n- **\u{53d1}\u{5e03}\u{6784}\u{5efa}\u{544a}\u{8b66}\u{95e8}\u{7981}**\u{ff1a}\u{4fee}\u{590d}\u{9519}\u{8bef}\u{5951}\u{7ea6}\u{4e0e}\u{9519}\u{8bef}\u{5c55}\u{793a}\u{6a21}\u{5757}\u{7684} 3 \u{5904} rustdoc \u{65ad}\u{94fe}\u{ff1b}CI \u{5bf9}\u{5b8c}\u{6574} `make build` \u{7684}\u{6807}\u{51c6}\u{8f93}\u{51fa}\u{3001}\u{9519}\u{8bef}\u{8f93}\u{51fa}\u{4e0e}\u{9000}\u{51fa}\u{7801}\u{6267}\u{884c}\u{68c0}\u{67e5}\u{ff0c}warning/error \u{4e0d}\u{518d}\u{56e0}\u{5de5}\u{5177}\u{8fd4}\u{56de}\u{6210}\u{529f}\u{800c}\u{6f0f}\u{8fc7}\u{ff0c}\u{5e76}\u{4fdd}\u{7559}\u{5b8c}\u{6574}\u{6784}\u{5efa}\u{65e5}\u{5fd7}\u{3002}\n- **\u{6162}\u{5206}\u{5305}\u{4e2d}\u{65ad}\u{56de}\u{5f52}\u{6f0f}\u{68c0}**\u{ff1a}\u{79fb}\u{9664}\u{6302}\u{8d77}\u{4e2d}\u{540e}\u{9000}\u{7684} WASM panic \u{8c41}\u{514d}\u{ff0c}\u{4f7f}\u{7528}\u{8bf7}\u{6c42}\u{5c4f}\u{969c}\u{5206}\u{522b}\u{8986}\u{76d6}\u{540e}\u{9000}\u{4e0e}\u{518d}\u{6b21}\u{5bfc}\u{822a}\u{ff1b}\u{68c0}\u{67e5}\u{8fdf}\u{5230}\u{5206}\u{5305}\u{4e0d}\u{4f1a}\u{8986}\u{76d6}\u{5f53}\u{524d}\u{9875}\u{ff0c}\u{4e14}\u{540e}\u{7eed}\u{771f}\u{5b9e} SPA \u{5bfc}\u{822a}\u{7684}\u{6b63}\u{6587}\u{3001}\u{6587}\u{6863}\u{8eab}\u{4efd}\u{4e0e}\u{8fd0}\u{884c}\u{65f6}\u{9519}\u{8bef}\u{5747}\u{7b26}\u{5408}\u{9884}\u{671f}\u{ff0c}\u{4e0d}\u{518d}\u{4ec5}\u{51ed}\u{65e7}\u{9875}\u{9762}\u{91cd}\u{65b0}\u{53ef}\u{89c1}\u{5224}\u{5b9a}\u{901a}\u{8fc7}\u{3002}\n- **\u{6784}\u{5efa}\u{5165}\u{53e3}\u{53ef}\u{9760}\u{6027}**\u{ff1a}\u{4fee}\u{590d} `make -j build` \u{5728}\u{8d44}\u{6e90}\u{6216}\u{6587}\u{6863}\u{5c1a}\u{672a}\u{751f}\u{6210}\u{65f6}\u{542f}\u{52a8}\u{524d}\u{7aef}\u{6784}\u{5efa}\u{ff0c}\u{4ee5}\u{53ca}\u{9884}\u{538b}\u{7f29}\u{67e5}\u{627e}\u{6216}\u{6267}\u{884c}\u{5931}\u{8d25}\u{5374}\u{8fd4}\u{56de}\u{6210}\u{529f}\u{7684}\u{95ee}\u{9898}\u{ff1b}\u{672c}\u{5730}\u{4e0e} Docker \u{5171}\u{7528}\u{9884}\u{538b}\u{7f29}\u{89c4}\u{5219}\u{ff0c}\u{4e24}\u{4e2a}\u{53d1}\u{5e03}\u{76ee}\u{6807}\u{5171}\u{7528}\u{88c5}\u{914d}\u{6d41}\u{7a0b}\u{ff0c}\u{524d}\u{7aef}\u{5168}\u{91cf}\u{6784}\u{5efa}\u{51bb}\u{7ed3}\u{9501}\u{6587}\u{4ef6}\u{ff0c}`make clean` \u{8865}\u{9f50}\u{751f}\u{6210}\u{7684}\u{6d4f}\u{89c8}\u{5668}\u{8d44}\u{6e90}\u{76ee}\u{5f55}\u{6e05}\u{7406}\u{3002}\n- **\u{61d2}\u{52a0}\u{8f7d}\u{9875}\u{9762}\u{5207}\u{6362}\u{5076}\u{53d1}\u{95ea}\u{767d}**\u{ff1a}\u{76ee}\u{6807}\u{9875}\u{5206}\u{5305}\u{8d85}\u{8fc7} 300ms \u{65f6}\u{ff0c}\u{65e7}\u{6b63}\u{6587}\u{5148}\u{6de1}\u{51fa}\u{518d}\u{7531}\u{65b0}\u{9875}\u{6de1}\u{5165}\u{ff0c}\u{4e0d}\u{518d}\u{4ece}\u{6ee1}\u{5c4f}\u{5185}\u{5bb9}\u{4e00}\u{5e27}\u{53d8}\u{7a7a}\u{3002}\n- **\u{9875}\u{9762}\u{52a0}\u{8f7d}\u{4e2d}\u{70b9}\u{7ad9}\u{5185}\u{94fe}\u{63a5}\u{540e}\u{6574}\u{7ad9}\u{70b9}\u{4e0d}\u{52a8}**\u{ff1a}\u{61d2}\u{52a0}\u{8f7d}\u{9875}\u{9762}\u{7684}\u{5206}\u{5305}\u{8fd8}\u{5728}\u{6c34}\u{5408}\u{65f6}\u{70b9}\u{5bfc}\u{822a}\u{ff0c}\u{8def}\u{7531}\u{5668}\u{4e2d}\u{9014}\u{6362}\u{9875}\u{ff0c}\u{6c34}\u{5408}\u{4e0d}\u{5339}\u{914d} panic \u{8ba9} WASM \u{5931}\u{6548}\u{ff0c}\u{6b64}\u{540e}\u{5730}\u{5740}\u{680f}\u{4f1a}\u{53d8}\u{3001}\u{9875}\u{9762}\u{4e0d}\u{518d}\u{5207}\u{6362}\u{3002}\u{73b0}\u{5728}\u{6574}\u{68f5}\u{6811}\u{6c34}\u{5408}\u{5b8c}\u{6bd5}\u{624d}\u{63a5}\u{7ba1}\u{7ad9}\u{5185}\u{94fe}\u{63a5}\u{ff0c}\u{4e4b}\u{524d}\u{7684}\u{70b9}\u{51fb}\u{4ea4}\u{7ed9}\u{6d4f}\u{89c8}\u{5668}\u{6574}\u{9875}\u{8df3}\u{8f6c}\u{ff08}\u{4e5f}\u{4e0d}\u{518d}\u{88ab} Leptos \u{81ea}\u{5e26}\u{7684}\u{94fe}\u{63a5}\u{62e6}\u{622a}\u{62a2}\u{8d70}\u{ff09}\u{3002}\n- **\u{540e}\u{53f0}\u{6587}\u{7ae0}\u{9884}\u{89c8}\u{76ee}\u{5f55}\u{8fdb}\u{5ea6}\u{6052}\u{4e3a} 0%**\u{ff1a}\u{9884}\u{89c8}\u{5728} `.admin-scroll` \u{5185}\u{6eda}\u{52a8}\u{ff0c}\u{76ee}\u{5f55}\u{8fdb}\u{5ea6}\u{53ea}\u{76d1}\u{542c}\u{7a97}\u{53e3}\u{6eda}\u{52a8}\u{ff0c}\u{8fdb}\u{5ea6}\u{505c}\u{5728}\u{521d}\u{59cb}\u{503c}\u{3002}\u{73b0}\u{5728}\u{672a}\u{6307}\u{5b9a}\u{6eda}\u{52a8}\u{5bb9}\u{5668}\u{65f6}\u{53d6}\u{6b63}\u{6587}\u{6700}\u{8fd1}\u{7684}\u{53ef}\u{6eda}\u{52a8}\u{7956}\u{5148}\u{ff0c}\u{7a97}\u{53e3}\u{6eda}\u{52a8}\u{7684}\u{524d}\u{53f0}\u{6587}\u{7ae0}\u{884c}\u{4e3a}\u{4e0d}\u{53d8}\u{3002}\n- **\u{61d2}\u{52a0}\u{8f7d}\u{9875}\u{9762}\u{5207}\u{6362}\u{65f6}\u{5916}\u{58f3}\u{5148}\u{53d8}**\u{ff1a}\u{70b9}\u{51fb}\u{6587}\u{7ae0}\u{540e}\u{ff0c}\u{4e3b}\u{533a}\u{5bbd}\u{5ea6}\u{3001}\u{5bfc}\u{822a}\u{6fc0}\u{6d3b}\u{9879}\u{4e0e}\u{5206}\u{4eab}\u{4fe1}\u{606f}\u{4f1a}\u{5148}\u{5207}\u{5230}\u{65b0}\u{9875}\u{9762}\u{ff0c}\u{65e7}\u{9875}\u{9762}\u{88ab}\u{653e}\u{8fdb}\u{9519}\u{8bef}\u{7248}\u{5f0f}\u{505c}\u{7559}\u{5230}\u{65b0}\u{5206}\u{5305}\u{52a0}\u{8f7d}\u{5b8c}\u{3002}\u{5916}\u{58f3}\u{6539}\u{4e3a}\u{8ddf}\u{968f}\u{5df2}\u{663e}\u{793a}\u{7684}\u{9875}\u{9762}\u{ff0c}\u{5207}\u{6362}\u{8d85}\u{8fc7} 300ms \u{65f6}\u{9875}\u{9762}\u{9876}\u{7aef}\u{663e}\u{793a}\u{8fdb}\u{5ea6}\u{6761}\u{ff1b}\u{540e}\u{53f0}\u{4fa7}\u{680f}\u{3001}\u{9762}\u{5305}\u{5c51}\u{540c}\u{6837}\u{4fee}\u{6b63}\u{3002}\n- **\u{7ad9}\u{70b9}\u{5730}\u{5740}\u{7f3a}\u{534f}\u{8bae}\u{5bfc}\u{81f4}\u{5168}\u{7ad9}\u{5199}\u{8bf7}\u{6c42} 403**\u{ff1a}\u{300c}\u{53ef}\u{4fe1}\u{6765}\u{6e90}\u{300d}\u{586b} `localhost:8080` \u{8fd9}\u{7c7b}\u{7f3a}\u{5c11} `http(s)://` \u{7684}\u{503c}\u{65f6}\u{ff0c}\u{6240}\u{6709} POST\u{ff08}\u{542b}\u{767b}\u{5f55}\u{ff09}\u{90fd}\u{88ab} CSRF \u{62d2}\u{7edd}\u{ff0c}\u{53ea}\u{80fd}\u{6539}\u{5e93}\u{6062}\u{590d}\u{3002}\u{73b0}\u{5728}\u{4fdd}\u{5b58}\u{65f6}\u{62d2}\u{7edd}\u{6b64}\u{7c7b}\u{503c}\u{ff0c}\u{5e93}\u{91cc}\u{5df2}\u{6709}\u{7684}\u{6309}\u{672a}\u{914d}\u{7f6e}\u{5904}\u{7406}\u{ff1b}\u{672a}\u{914d}\u{7f6e}\u{65f6}\u{53ea}\u{6bd4}\u{5bf9}\u{6765}\u{6e90}\u{4e3b}\u{673a}\u{4e0e}\u{8bf7}\u{6c42} Host\u{ff08}\u{534f}\u{8bae}\u{4e0d}\u{9650}\u{ff09}\u{ff0c}\u{672c}\u{5730} http \u{5f00}\u{53d1}\u{65e0}\u{9700}\u{8bbe}\u{7f6e}\u{3002}\n\n## [1.0.1] - 2026-10-23\n\n\u{5305}\u{542b} v1.0 \u{5168}\u{7ad9}\u{91cd}\u{8bbe}\u{8ba1}\u{4e0e}\u{5b89}\u{5168}\u{4fee}\u{590d}\u{ff1b}v1.0.0 \u{6807}\u{7b7e}\u{56e0}\u{6d4f}\u{89c8}\u{5668}\u{5192}\u{70df}\u{8bef}\u{5224}\u{672a}\u{751f}\u{6210}\u{6b63}\u{5f0f}\u{53d1}\u{5e03}\u{4ea7}\u{7269}\u{3002}\n\n### Fixed\n\n- **\u{624b}\u{673a}\u{540e}\u{53f0}\u{53d1}\u{5e03}\u{68c0}\u{67e5}**\u{ff1a}\u{6d4f}\u{89c8}\u{5668}\u{5192}\u{70df}\u{6539}\u{4e3a}\u{7b49}\u{5f85}\u{53ef}\u{89c1}\u{7684}\u{4e3b}\u{5185}\u{5bb9}\u{533a}\u{ff0c}\u{4e0d}\u{518d}\u{8981}\u{6c42}\u{6309}\u{54cd}\u{5e94}\u{5f0f}\u{8bbe}\u{8ba1}\u{9690}\u{85cf}\u{7684}\u{9875}\u{9762}\u{6807}\u{9898}\u{53ef}\u{89c1}\u{ff0c}\u{907f}\u{514d}\u{53d1}\u{5e03}\u{6d41}\u{6c34}\u{7ebf}\u{8d85}\u{65f6}\u{3002}\n- **\u{7b14}\u{8bb0}\u{4fdd}\u{5b58}\u{56de}\u{5f52}**\u{ff1a}\u{5220}\u{9664}\u{5bf9}\u{539f}\u{59cb} HTTP \u{9519}\u{8bef}\u{6587}\u{6848}\u{7684}\u{4f9d}\u{8d56}\u{ff0c}\u{7ee7}\u{7eed}\u{9a8c}\u{8bc1}\u{5931}\u{8d25}\u{63d0}\u{793a}\u{3001}\u{5185}\u{5bb9}\u{4fdd}\u{7559}\u{4e0e}\u{91cd}\u{8bd5}\u{6301}\u{4e45}\u{5316}\u{884c}\u{4e3a}\u{3002}\n- **\u{4ee3}\u{7801}\u{5757}\u{5f39}\u{7a97}\u{56de}\u{5f52}**\u{ff1a}\u{79bb}\u{5f00}\u{6709}\u{672a}\u{4fdd}\u{5b58}\u{4fee}\u{6539}\u{7684}\u{7f16}\u{8f91}\u{9875}\u{65f6}\u{660e}\u{786e}\u{63a5}\u{53d7}\u{79bb}\u{5f00}\u{786e}\u{8ba4}\u{ff0c}\u{518d}\u{9a8c}\u{8bc1}\u{5f39}\u{7a97}\u{4e0e}\u{7f16}\u{8f91}\u{5668}\u{6e05}\u{7406}\u{ff0c}\u{4e0d}\u{518d}\u{628a}\u{53d6}\u{6d88}\u{5bfc}\u{822a}\u{8bef}\u{5224}\u{4e3a}\u{5378}\u{8f7d}\u{5931}\u{8d25}\u{3002}\n- **\u{516c}\u{5f00}\u{9605}\u{8bfb}\u{6027}\u{80fd}\u{56de}\u{5f52}**\u{ff1a}\u{4ee5}\u{672a}\u{6fc0}\u{6d3b}\u{4ee3}\u{7801}\u{5757}\u{5b9e}\u{9645}\u{53ef}\u{8bfb}\u{7684}\u{6e90}\u{7801}\u{9a8c}\u{8bc1}\u{9759}\u{6001}\u{8f93}\u{51fa}\u{ff0c}\u{4e0d}\u{518d}\u{65ad}\u{8a00}\u{5df2}\u{9000}\u{5f79}\u{7684}\u{5360}\u{4f4d} CSS \u{7c7b}\u{ff1b}\u{7b49}\u{5f85}\u{5ba2}\u{6237}\u{7aef}\u{8def}\u{7531}\u{5c31}\u{7eea}\u{540e}\u{64cd}\u{4f5c}\u{5f52}\u{6863}\u{ff0c}\u{4fdd}\u{7559}\u{61d2}\u{52a0}\u{8f7d}\u{3001}\u{96f6}\u{81ea}\u{52a8}\u{6267}\u{884c}\u{548c}\u{5f52}\u{6863}\u{5b8c}\u{6574}\u{6027}\u{68c0}\u{67e5}\u{3002}\n\n## [1.0.0] - 2026-10-23\n\nv1.0 \u{5168}\u{7ad9}\u{91cd}\u{8bbe}\u{8ba1}\u{ff1a}\u{9676}\u{571f}\u{6a59}\u{5355}\u{4e00}\u{54c1}\u{724c}\u{8272}\u{3001}\u{7cfb}\u{7edf}\u{5b57}\u{4f53}\u{4e0e}\u{886c}\u{7ebf}\u{6807}\u{9898}\u{3001}Lucide \u{56fe}\u{6807}\u{3001}\u{5f39}\u{7c27}\u{52a8}\u{6548}\u{4e0e}\u{6696}\u{8c03}\u{4ee3}\u{7801}\u{914d}\u{8272}\u{ff0c}\u{524d}\u{53f0}\u{4e0e}\u{540e}\u{53f0}\u{5168}\u{90e8}\u{9875}\u{9762}\u{6309}\u{65b0}\u{8bbe}\u{8ba1}\u{91cd}\u{5199}\u{3002}\n\n### Security\n\n- **\u{6539}\u{5bc6} / `ADMIN_PASSWORD` \u{8f6e}\u{6362}\u{540e}\u{65e7}\u{4f1a}\u{8bdd}\u{4ecd}\u{6709}\u{6548}**\u{ff1a}\u{6b64}\u{524d}\u{53ea}\u{6709}\u{7f13}\u{5b58}\u{547d}\u{4e2d}\u{8def}\u{5f84}\u{6bd4}\u{5bf9}\u{4f1a}\u{8bdd}\u{4e16}\u{4ee3}\u{ff0c}\u{7f13}\u{5b58}\u{88ab}\u{9010}\u{51fa}\u{540e}\u{7684}\u{4e0b}\u{4e00}\u{6b21}\u{8bf7}\u{6c42}\u{4f1a}\u{91cd}\u{65b0}\u{653e}\u{884c}\u{5e76}\u{56de}\u{586b}\u{ff0c}\u{88ab}\u{76d7} cookie \u{6700}\u{957f} 30 \u{5929}\u{6709}\u{6548}\u{3002}\u{8fc1}\u{79fb} 031 \u{7ed9} `sessions` \u{52a0} `generation` \u{5feb}\u{7167}\u{5217}\u{ff08}\u{767b}\u{5f55}\u{65f6}\u{5199}\u{5165}\u{ff09}\u{ff0c}\u{4e24}\u{6761}\u{6821}\u{9a8c}\u{8def}\u{5f84}\u{90fd}\u{8981}\u{6c42}\u{5176}\u{7b49}\u{4e8e} `users.session_generation`\u{ff1b}\u{5b58}\u{91cf}\u{4f1a}\u{8bdd}\u{6309}\u{5f53}\u{524d}\u{4e16}\u{4ee3}\u{56de}\u{586b}\u{3002}\n- **\u{6570}\u{636e}\u{5bfc}\u{51fa}\u{53ea}\u{8bfb}\u{6821}\u{9a8c}**\u{ff1a}`/api/database/export` \u{7684} `query:` \u{6765}\u{6e90}\u{62d2}\u{7edd} `EXPLAIN ANALYZE`\u{ff08}\u{542b} `EXPLAIN (ANALYZE)` \u{5199}\u{6cd5}\u{ff09}\u{3001}data-modifying CTE\u{3001}`SELECT INTO` \u{4e0e}\u{884c}\u{9501}\u{5b50}\u{53e5}\u{ff1b}SQL \u{683c}\u{5f0f}\u{5bfc}\u{51fa}\u{653e}\u{8fdb}\u{53ea}\u{8bfb}\u{4e8b}\u{52a1}\u{6267}\u{884c}\u{3002}\u{6b64}\u{524d}\u{4e00}\u{6b21}\u{8de8}\u{7ad9} GET \u{5373}\u{53ef}\u{8ba9}\u{7ba1}\u{7406}\u{5458}\u{6d4f}\u{89c8}\u{5668}\u{6267}\u{884c}\u{4efb}\u{610f} DML\u{3002}SQL \u{63a7}\u{5236}\u{53f0}\u{7684}\u{8bfb}\u{5199}\u{5206}\u{7c7b}\u{6539}\u{7528}\u{540c}\u{4e00}\u{5224}\u{5b9a}\u{ff0c}\u{8fd9}\u{7c7b}\u{8bed}\u{53e5}\u{6539}\u{8d70}\u{5199}\u{8def}\u{5f84}\u{ff08}\u{53d7} WHERE \u{62a4}\u{680f}\u{7ea6}\u{675f}\u{5e76}\u{89e6}\u{53d1}\u{7f13}\u{5b58}\u{5931}\u{6548}\u{ff09}\u{3002}\n- **\u{6570}\u{636e}\u{5bfc}\u{51fa}\u{62d2}\u{7edd}\u{8de8}\u{7ad9}\u{89e6}\u{53d1}**\u{ff1a}`/api/database/export` \u{4ecd}\u{4e3a} GET \u{4e0b}\u{8f7d}\u{ff0c}\u{4f46}\u{53ea}\u{63a5}\u{53d7} `Sec-Fetch-Site: same-origin`\u{ff1b}\u{4e0d}\u{5e26}\u{8be5}\u{5934}\u{7684}\u{5ba2}\u{6237}\u{7aef}\u{56de}\u{9000}\u{5230} Origin/Referer \u{672c}\u{7ad9}\u{6821}\u{9a8c}\u{ff0c}\u{6765}\u{6e90}\u{7f3a}\u{5931}\u{8fd4}\u{56de} 403\u{3002}\n- **MCP \u{4ee4}\u{724c}\u{968f}\u{8d26}\u{53f7}\u{72b6}\u{6001}\u{5931}\u{6548}**\u{ff1a}bearer \u{9274}\u{6743}\u{6bcf}\u{6b21}\u{6821}\u{9a8c}\u{6301}\u{6709}\u{4eba}\u{5f53}\u{524d}\u{89d2}\u{8272}\u{ff0c}\u{8d26}\u{53f7}\u{88ab}\u{5c01}\u{7981}\u{540e}\u{5176}\u{540d}\u{4e0b}\u{4ee4}\u{724c}\u{ff08}\u{542b} `/api/mcp/upload`\u{ff09}\u{7acb}\u{5373}\u{5931}\u{6548}\u{ff0c}\u{65e0}\u{9700}\u{9010}\u{4e2a}\u{540a}\u{9500}\u{3002}\n- **\u{540e}\u{53f0}\u{8def}\u{7531}\u{5b88}\u{536b}**\u{ff1a}\u{4f1a}\u{8bdd}\u{5931}\u{6548}\u{3001}\u{8fc7}\u{671f}\u{6216}\u{4ee3}\u{9645}\u{4e0d}\u{5339}\u{914d}\u{7684} cookie \u{8bbf}\u{95ee} `/admin` \u{6539}\u{4e3a}\u{8df3}\u{8f6c}\u{767b}\u{5f55}\u{9875}\u{ff0c}\u{4ec5}\u{6570}\u{636e}\u{5e93}\u{9519}\u{8bef}\u{65f6}\u{653e}\u{884c}\u{3002}\n- **\u{5934}\u{50cf}\u{8def}\u{5f84}\u{6821}\u{9a8c}**\u{ff1a}\u{4e2a}\u{4eba}\u{8d44}\u{6599}\u{5934}\u{50cf}\u{4e0e}\u{53cb}\u{94fe}\u{5934}\u{50cf}\u{5171}\u{7528}\u{540c}\u{4e00}\u{5b89}\u{5168}\u{8c13}\u{8bcd}\u{ff0c}\u{62d2}\u{7edd} `..`\u{3001}\u{7a7a}\u{8def}\u{5f84}\u{3001}\u{53cc}\u{659c}\u{6760}\u{4e0e} NUL\u{3002}\n- **URL \u{6293}\u{53d6} SSRF**\u{ff1a}NAT64\u{ff08}`64:ff9b::/96`\u{3001}`64:ff9b:1::/48`\u{ff09}\u{4e0e} 6to4\u{ff08}`2002::/16`\u{ff09}\u{5185}\u{5d4c}\u{7684} IPv4 \u{6309} IPv4 \u{89c4}\u{5219}\u{6821}\u{9a8c}\u{ff0c}Teredo\u{ff08}`2001::/32`\u{ff09}\u{76f4}\u{63a5}\u{62d2}\u{7edd}\u{3002}\n\n### Added\n\n- **\u{7f16}\u{8f91}\u{5668} GFM \u{63d0}\u{793a}\u{5757}\u{4e0e}\u{5b9a}\u{4e49}\u{5217}\u{8868}**\u{ff1a}`> [!NOTE]` \u{7b49}\u{4e94}\u{79cd}\u{63d0}\u{793a}\u{5757}\u{3001}`\u{672f}\u{8bed}` + `: \u{5b9a}\u{4e49}` \u{5b9a}\u{4e49}\u{5217}\u{8868}\u{53ef}\u{5728}\u{5bcc}\u{6587}\u{672c}\u{91cc}\u{65e0}\u{635f}\u{5f80}\u{8fd4}\u{ff0c}\u{63d0}\u{793a}\u{5757}\u{3001}H5/H6 \u{4e0e}\u{4efb}\u{52a1}\u{5217}\u{8868}\u{6837}\u{5f0f}\u{4e0e}\u{524d}\u{53f0}\u{4e00}\u{81f4}\u{3002}\n- **\u{7f16}\u{8f91}\u{5668}\u{6298}\u{53e0}\u{5757}**\u{ff1a}`<details>` / `<summary>` \u{4f5c}\u{4e3a}\u{8282}\u{70b9}\u{663e}\u{793a}\u{5e76}\u{539f}\u{6837}\u{5f80}\u{8fd4}\u{ff08}\u{89c4}\u{8303}\u{5199}\u{6cd5}\u{ff1a}\u{5f00}\u{6807}\u{7b7e}\u{3001}summary \u{884c}\u{3001}\u{7a7a}\u{884c}\u{3001}\u{6b63}\u{6587}\u{3001}\u{7a7a}\u{884c}\u{3001}\u{95ed}\u{6807}\u{7b7e}\u{ff09}\u{3002}\n- **\u{5173}\u{4e8e}\u{9875}\u{63d2}\u{56fe}**\u{ff1a}\u{6807}\u{9898}\u{65c1}\u{65b0}\u{589e}\u{50cf}\u{7d20}\u{98ce}\u{63d2}\u{56fe}\u{ff0c}\u{60ac}\u{505c}\u{65f6}\u{5207}\u{6362}\u{8868}\u{60c5}\u{3002}\n- **\u{2318}K \u{9762}\u{677f}**\u{ff1a}\u{524d}\u{53f0}\u{641c}\u{7d22}\u{ff08}\u{6587}\u{7ae0}\u{5efa}\u{8bae}\u{63a5}\u{53e3}\u{3001}\u{6700}\u{8fd1}\u{641c}\u{7d22}\u{3001}\u{8303}\u{56f4}\u{6807}\u{7b7e}\u{ff09}\u{4e0e}\u{540e}\u{53f0}\u{547d}\u{4ee4}\u{9762}\u{677f}\u{3002}\n- **\u{9996}\u{9875}\u{4e66}\u{684c}**\u{ff1a}\u{6700}\u{65b0}\u{4e00}\u{7bc7}\u{76ee}\u{5f55}\u{9884}\u{89c8}\u{3001}\u{6309}\u{6708}\u{7d22}\u{5f15}\u{3001}\u{53ef}\u{914d}\u{7f6e}\u{6807}\u{8bed}\u{3002}\n- **\u{7b14}\u{8bb0}\u{9605}\u{8bfb}\u{4e0a}\u{4e0b}\u{6587}**\u{ff1a}\u{7b14}\u{8bb0}\u{672c}\u{76ee}\u{5f55}\u{3001}\u{4e0a}\u{4e00}\u{7bc7}/\u{4e0b}\u{4e00}\u{7bc7}\u{3001}`?book=`\u{ff0c}\u{4ee5}\u{53ca}\u{7b14}\u{8bb0}\u{672c}\u{76ee}\u{5f55}\u{9875}\u{3002}\n- **\u{5206}\u{4eab}\u{56fe}\u{4e0e}\u{7f51}\u{7ad9}\u{56fe}\u{6807}**\u{ff1a}`/og/site.png`\u{3001}`/og/post/{slug}.png`\u{ff0c}\u{660e}\u{6697} SVG \u{56fe}\u{6807}\u{4e0e} manifest\u{3002}\n- **\u{7ec6}\u{8282}\u{8865}\u{5168}**\u{ff1a}404 \u{63a8}\u{8350}\u{6587}\u{7ae0}\u{3001}\u{4ea4}\u{6362}\u{53cb}\u{94fe}\u{4fe1}\u{606f}\u{3001}\u{5173}\u{4e8e}\u{9875}\u{7edf}\u{8ba1}\u{3001}\u{4eea}\u{8868}\u{76d8}\u{53d1}\u{5e03}\u{8282}\u{594f}\u{3001}\u{4fa7}\u{680f}\u{6570}\u{91cf}\u{3001}\u{56de}\u{6536}\u{7ad9}\u{5269}\u{4f59}\u{5929}\u{6570}\u{3001}\u{8bbe}\u{7f6e}\u{7edf}\u{4e00}\u{4fdd}\u{5b58}\u{6761}\u{3001}\u{7b14}\u{8bb0}\u{7248}\u{672c}\u{9762}\u{677f}\u{3001}\u{5bc6}\u{7801}\u{5f3a}\u{5ea6}\u{6761}\u{3001}\u{65b0}\u{5efa}\u{6587}\u{7ae0}\u{8d77}\u{6b65}\u{6a21}\u{677f}\u{3001}\u{8349}\u{7a3f}\u{9884}\u{89c8}\u{5bbd}\u{5ea6}\u{5207}\u{6362}\u{3001}\u{706f}\u{7bb1}\u{7f29}\u{7565}\u{6761}\u{4e0e}\u{7f29}\u{653e}\u{6863}\u{4f4d}\u{3001}MCP \u{4ee4}\u{724c}\u{63a5}\u{5165}\u{914d}\u{7f6e}\u{3002}\n- **\u{7ec4}\u{4ef6}\u{539f}\u{8bed}**\u{ff1a}`SegmentedControl`\u{ff08}\u{7a84}\u{5bbd}\u{53ea}\u{7559}\u{56fe}\u{6807}\u{ff09}\u{4e0e} `Composer` \u{8f93}\u{5165}\u{680f}\u{65cf}\u{ff08}`Composer`\u{3001}`ComposerInput`\u{3001}`ComposerSend`\u{ff09}\u{ff0c}\u{7ec4}\u{4ef6}\u{56fe}\u{9274}\u{540c}\u{6b65}\u{6536}\u{5f55}\u{3002}\n\n### Changed\n\n- **\u{6587}\u{6863}\u{7ad9}\u{70b9}\u{5316}**\u{ff1a}`/doc`\u{ff08}rustdoc\u{ff09}\u{6362}\u{6210}\u{4e0e}\u{535a}\u{5ba2}\u{4e00}\u{81f4}\u{7684}\u{9876}\u{680f}\u{3001}\u{9875}\u{811a}\u{4e0e}\u{624b}\u{673a}\u{62bd}\u{5c49}\u{ff0c}\u{5bfc}\u{822a}\u{65b0}\u{589e}\u{300c}\u{6587}\u{6863}\u{300d}\u{ff1b}\u{4e3b}\u{9898}\u{53ea}\u{7531}\u{9876}\u{680f}\u{4e09}\u{6863}\u{ff08}\u{6d45}\u{8272}/\u{6df1}\u{8272}/\u{8ddf}\u{968f}\u{7cfb}\u{7edf}\u{ff09}\u{5207}\u{6362}\u{ff0c}\u{4e0d}\u{518d}\u{63d0}\u{4f9b} ayu\u{3002}\u{5de6}\u{680f}\u{53ea}\u{505a}\u{6a21}\u{5757}\u{5bfc}\u{822a}\u{5e76}\u{5e26}\u{7b5b}\u{9009}\u{6846}\u{ff0c}\u{53f3}\u{680f}\u{4e3a}\u{300c}\u{672c}\u{9875}\u{300d}\u{76ee}\u{5f55}\u{4e0e}\u{9605}\u{8bfb}\u{8fdb}\u{5ea6}\u{ff1b}\u{6807}\u{9898}\u{533a}\u{3001}\u{6761}\u{76ee}\u{8868}\u{3001}\u{5b57}\u{6bb5}\u{3001}impl \u{5361}\u{7247}\u{3001}Trait chip\u{3001}\u{6587}\u{6863}\u{6b63}\u{6587}\u{3001}\u{641c}\u{7d22}\u{7ed3}\u{679c}\u{4e0e}\u{6e90}\u{7801}\u{9875}\u{5168}\u{90e8}\u{91cd}\u{6392}\u{ff0c}\u{754c}\u{9762}\u{6587}\u{5b57}\u{6539}\u{4e3a}\u{4e2d}\u{6587}\u{3002}crate \u{9996}\u{9875}\u{6309}\u{300c}\u{754c}\u{9762} / \u{670d}\u{52a1}\u{7aef} / \u{5171}\u{4eab} / \u{5176}\u{4ed6}\u{300d}\u{5206}\u{7ec4}\u{3002}\n- **MCP \u{9650}\u{6d41}\u{8fdb}\u{540e}\u{53f0}**\u{ff1a}MCP \u{8bf7}\u{6c42}\u{4e0e} MCP \u{4f20}\u{56fe}\u{4e24}\u{7ec4}\u{6309}\u{4ee4}\u{724c}\u{8ba1}\u{7684}\u{9650}\u{6d41}\u{5e76}\u{5165}\u{300c}\u{540e}\u{53f0}\u{8bbe}\u{7f6e} \u{2192} \u{63a5}\u{53e3}\u{9650}\u{6d41}\u{300d}\u{ff0c}\u{4fee}\u{6539}\u{540e}\u{91cd}\u{542f}\u{751f}\u{6548}\u{3002}`RATE_LIMIT_MCP_PER_SEC` / `_BURST` / `RATE_LIMIT_MCP_UPLOAD_PER_SEC` / `_BURST` \u{6539}\u{4e3a}\u{4ec5}\u{5728}\u{5bf9}\u{5e94}\u{8bbe}\u{7f6e}\u{952e}\u{4e0d}\u{5b58}\u{5728}\u{65f6}\u{9996}\u{542f}\u{64ad}\u{79cd}\u{ff0c}\u{4e0e}\u{5176}\u{4ed6} `RATE_LIMIT_*` \u{4e00}\u{81f4}\u{ff1b}\u{5df2}\u{90e8}\u{7f72}\u{5b9e}\u{4f8b}\u{5347}\u{7ea7}\u{540e}\u{9996}\u{6b21}\u{542f}\u{52a8}\u{4f1a}\u{628a}\u{5f53}\u{524d}\u{73af}\u{5883}\u{53d8}\u{91cf}\u{503c}\u{5199}\u{5165}\u{6570}\u{636e}\u{5e93}\u{ff0c}\u{4e4b}\u{540e}\u{4e0d}\u{518d}\u{88ab}\u{73af}\u{5883}\u{53d8}\u{91cf}\u{8986}\u{76d6}\u{3002}\n- **\u{5168}\u{7ad9}\u{91cd}\u{8bbe}\u{8ba1}**\u{ff1a}\u{8bbe}\u{8ba1} token\u{3001}\u{7cfb}\u{7edf}\u{5b57}\u{4f53}\u{6808}\u{3001}\u{6df1}\u{8272}\u{6a21}\u{5f0f}\u{91cd}\u{65b0}\u{8c03}\u{8272}\u{3001}\u{9875}\u{9762}\u{8f6c}\u{573a}\u{6539}\u{7528} snappy \u{5f39}\u{7c27}\u{4e0e} out-expo \u{66f2}\u{7ebf}\u{3002}\n- **\u{540e}\u{53f0}\u{6539}\u{4e3a}\u{684c}\u{9762}\u{5e94}\u{7528}\u{5f0f}\u{5916}\u{58f3}**\u{ff1a}\u{53ef}\u{6298}\u{53e0}\u{3001}\u{53ef}\u{62d6}\u{5bbd}\u{7684}\u{4fa7}\u{680f}\u{ff0c}\u{9762}\u{5305}\u{5c51}\u{ff0c}\u{8868}\u{683c}\u{53d1}\u{4e1d}\u{7ebf}\u{5206}\u{9694}\u{3002}\n- **\u{53d1}\u{4e1d}\u{7ebf}**\u{ff1a}2 \u{500d}\u{53ca}\u{4ee5}\u{4e0a}\u{9ad8}\u{5206}\u{5c4f}\u{4e3a} 0.5px\u{ff0c}\u{5176}\u{4f59}\u{4e3a} 1px\u{ff08}`--hairline`\u{ff09}\u{3002}\n- **\u{641c}\u{7d22}\u{9762}\u{677f}**\u{ff1a}\u{5173}\u{95ed}\u{65f6} 120ms \u{6de1}\u{51fa}\u{ff0c}\u{624b}\u{673a}\u{5168}\u{5c4f}\u{65f6}\u{8f93}\u{5165}\u{6846}\u{65c1}\u{4e3a}\u{300c}\u{53d6}\u{6d88}\u{300d}\u{3002}\n- **\u{540e}\u{53f0}\u{5931}\u{8d25}\u{63d0}\u{793a}**\u{ff1a}\u{6539}\u{4e3a}\u{53ef}\u{8bfb}\u{6587}\u{6848}\u{ff0c}\u{4e0d}\u{518d}\u{62fc}\u{63a5} server function \u{539f}\u{59cb}\u{9519}\u{8bef}\u{3002}\n\n### Removed\n\n- Catppuccin \u{4e3b}\u{9898}\u{3001}`paper-*` \u{6837}\u{5f0f}\u{4e0e}\u{6865}\u{63a5}\u{5c42}\u{3001}\u{7ebf}\u{6761}\u{5c0f}\u{72d7}\u{63d2}\u{753b}\u{3001}Material \u{56fe}\u{6807}\u{3001}`PostCard`\u{3001}`FilterTabs`\u{ff08}\u{7531} `SegmentedControl` \u{53d6}\u{4ee3}\u{ff09}\u{3001}`SproutPlaceholder`\u{ff08}\u{66f4}\u{540d}\u{4e3a} `ImagePlaceholder`\u{ff09}\u{3002}\n\n### Fixed\n\n- **\u{5de5}\u{4f5c}\u{6d41}\u{6821}\u{9a8c}\u{5b89}\u{88c5}\u{5931}\u{8d25}**\u{ff1a}`actionlint` \u{6539}\u{4e3a}\u{4e0b}\u{8f7d}\u{5b98}\u{65b9}\u{56fa}\u{5b9a}\u{7248}\u{672c}\u{53d1}\u{884c}\u{5305}\u{5e76}\u{6821}\u{9a8c} SHA-256\u{ff0c}\u{4e0d}\u{518d}\u{7ecf}\u{4e0d}\u{652f}\u{6301}\u{8be5}\u{5de5}\u{5177}\u{7684} Rust \u{5b89}\u{88c5}\u{5668}\u{56de}\u{9000}\u{5230} Cargo\u{ff0c}\u{4fee}\u{590d} `lint-workflows` \u{5728}\u{6821}\u{9a8c}\u{524d}\u{9000}\u{51fa}\u{7684}\u{95ee}\u{9898}\u{3002}\n- **\u{540e}\u{53f0}\u{7f16}\u{8f91}\u{5668}\u{8f7d}\u{5165}\u{6587}\u{7ae0}\u{540e}\u{5185}\u{5bb9}\u{9519}\u{4f4d}**\u{ff1a}\u{5757}\u{7ea7}\u{516c}\u{5f0f} `$$` \u{53ea}\u{5728}\u{884c}\u{9996}\u{8d77}\u{7b97}\u{ff0c}\u{884c}\u{5185}\u{4ee3}\u{7801}\u{91cc}\u{7684} `$$` \u{4e0d}\u{518d}\u{628a}\u{540e}\u{9762}\u{6240}\u{6709}\u{516c}\u{5f0f}\u{914d}\u{5bf9}\u{9519}\u{4f4d}\u{3001}\u{541e}\u{6389}\u{6574}\u{8282}\u{ff1b}\u{811a}\u{6ce8}\u{5b9a}\u{4e49}\u{540c}\u{6837}\u{53ea}\u{8ba4}\u{884c}\u{9996}\u{ff0c}\u{5f15}\u{7528}\u{524d}\u{4e0d}\u{518d}\u{88ab}\u{6362}\u{884c}\u{5207}\u{65ad}\u{ff0c}\u{5e76}\u{652f}\u{6301}\u{7a7a}\u{884c}\u{540e}\u{7f29}\u{8fdb}\u{7684}\u{591a}\u{6bb5}\u{811a}\u{6ce8}\u{ff1b}H4\u{2013}H6 \u{4e0d}\u{518d}\u{663e}\u{793a}\u{6210} H1\u{3002}\n- **\u{5bcc}\u{6587}\u{672c}\u{4fdd}\u{5b58}\u{4f1a}\u{6539}\u{5199}\u{539f}\u{6587}**\u{ff1a}\u{6587}\u{7ae0}\u{5199}\u{4f5c}\u{9875}\u{8f7d}\u{5165}\u{6b63}\u{6587}\u{3001}\u{6216}\u{4ece}\u{6e90}\u{7801}\u{5207}\u{56de}\u{5bcc}\u{6587}\u{672c}\u{65f6}\u{ff0c}\u{7531}\u{670d}\u{52a1}\u{7aef}\u{6bd4}\u{8f83}\u{300c}\u{539f}\u{6587}\u{300d}\u{4e0e}\u{300c}\u{7f16}\u{8f91}\u{5668}\u{5f80}\u{8fd4}\u{540e}\u{7684} Markdown\u{300d}\u{6e32}\u{67d3}\u{51fa}\u{7684} HTML\u{ff1b}\u{4e0d}\u{4e00}\u{81f4}\u{5c31}\u{9501}\u{5b9a}\u{5728}\u{6e90}\u{7801}\u{6a21}\u{5f0f}\u{5e76}\u{7ed9}\u{51fa}\u{63d0}\u{793a}\u{ff0c}\u{539f}\u{6587}\u{4e0d}\u{4f1a}\u{88ab}\u{6539}\u{5199}\u{ff0c}\u{4e5f}\u{4e0d}\u{4f1a}\u{8bef}\u{5224}\u{4e3a}\u{672a}\u{4fdd}\u{5b58}\u{3002}\n- **\u{524d}\u{53f0}\u{4efb}\u{52a1}\u{5217}\u{8868}\u{5d4c}\u{5957}\u{9879}**\u{ff1a}\u{5d4c}\u{5957}\u{5217}\u{8868}\u{4e0d}\u{518d}\u{6392}\u{5230}\u{7236}\u{9879}\u{6587}\u{5b57}\u{53f3}\u{4fa7}\u{ff0c}\u{6539}\u{4e3a}\u{6362}\u{5230}\u{4e0b}\u{4e00}\u{884c}\u{5e76}\u{4ece}\u{7236}\u{9879}\u{6587}\u{5b57}\u{5904}\u{7f29}\u{8fdb}\u{3002}\n- **\u{8868}\u{683c}\u{884c}\u{300c}\u{22ef}\u{300d}\u{83dc}\u{5355}\u{88ab}\u{88c1}\u{5207}**\u{ff1a}\u{64cd}\u{4f5c}\u{83dc}\u{5355}\u{6539}\u{7528} `position: fixed`\u{ff0c}\u{6309}\u{89e6}\u{53d1}\u{5668}\u{77e9}\u{5f62}\u{5b9a}\u{4f4d}\u{ff0c}\u{4e0d}\u{518d}\u{88ab}\u{8868}\u{683c}\u{9762}\u{677f}\u{7684} `overflow: clip` \u{622a}\u{6389}\u{4e0b}\u{534a}\u{622a}\u{ff1b}\u{4e0b}\u{65b9}\u{653e}\u{4e0d}\u{4e0b}\u{65f6}\u{81ea}\u{52a8}\u{5411}\u{4e0a}\u{5c55}\u{5f00}\u{ff0c}\u{6eda}\u{8f6e}\u{6eda}\u{52a8}\u{65f6}\u{6536}\u{8d77}\u{3002}\n- **\u{540e}\u{53f0}\u{7f16}\u{8f91}\u{5668}\u{5f80}\u{8fd4}\u{6539}\u{5199}\u{539f}\u{6587}**\u{ff1a}`~x~` / `^x^` \u{6210}\u{4e3a}\u{771f}\u{6b63}\u{7684}\u{4e0b}\u{6807}/\u{4e0a}\u{6807}\u{ff08}\u{8bcd}\u{5185} `H~2~O`\u{3001}`x^2^` \u{4fdd}\u{6301}\u{5b57}\u{9762}\u{91cf}\u{ff09}\u{ff1b}CJK \u{6807}\u{70b9}\u{65c1}\u{7684}\u{8f6c}\u{4e49}\u{4e0d}\u{518d}\u{4e22}\u{5931}\u{ff1b}`&copy;` \u{7b49} HTML \u{5b9e}\u{4f53}\u{539f}\u{6837}\u{4fdd}\u{7559}\u{ff1b}`<kbd>` `<mark>` `<abbr>` `<sub>` `<sup>` \u{6210}\u{5bf9}\u{6807}\u{7b7e}\u{53d8}\u{4e3a}\u{53ef}\u{89c1}\u{683c}\u{5f0f}\u{ff0c}\u{5176}\u{4ed6}\u{884c}\u{5185}\u{539f}\u{59cb} HTML \u{539f}\u{6837}\u{4fdd}\u{7559}\u{ff1b}\u{53c2}\u{8003}\u{5f0f}\u{94fe}\u{63a5}\u{4e0e}\u{5b9a}\u{4e49}\u{884c}\u{3001}\u{677e}\u{6563}\u{5217}\u{8868}\u{3001}\u{7f16}\u{53f7}\u{5217}\u{8868}\u{9879}\u{5185}\u{7684}\u{4ee3}\u{7801}\u{5757}\u{3001}\u{591a}\u{884c}\u{5757}\u{7ea7}\u{516c}\u{5f0f}\u{4e0d}\u{518d}\u{88ab}\u{6539}\u{5199}\u{ff1b}\u{88f8} URL / \u{88f8}\u{90ae}\u{7bb1}\u{4e0d}\u{518d}\u{81ea}\u{52a8}\u{6210}\u{94fe}\u{3002}\n- **\u{670d}\u{52a1}\u{7aef} KaTeX \u{8f93}\u{51fa}\u{6bcf}\u{6b21}\u{4e0d}\u{540c}**\u{ff1a}`katex-rs` \u{7684} SVG \u{5c5e}\u{6027}\u{987a}\u{5e8f}\u{968f}\u{673a}\u{ff0c}\u{540c}\u{4e00}\u{516c}\u{5f0f}\u{4e24}\u{6b21}\u{6e32}\u{67d3}\u{7684} HTML \u{4e0d}\u{540c}\u{ff0c}\u{542b}\u{6839}\u{53f7}\u{7b49} SVG \u{7684}\u{6b63}\u{6587}\u{5728}\u{5f80}\u{8fd4}\u{5b88}\u{536b}\u{91cc}\u{6c38}\u{8fdc}\u{88ab}\u{5224}\u{4e3a}\u{6709}\u{635f}\u{3002}\u{73b0}\u{5728}\u{8f93}\u{51fa}\u{524d}\u{6309}\u{5c5e}\u{6027}\u{540d}\u{6392}\u{5e8f}\u{3002}\n- **\u{7f16}\u{8f91}\u{5668}\u{516c}\u{5f0f}\u{9884}\u{89c8}**\u{ff1a}\u{652f}\u{6301} `\\ce{}` / `\\pu{}`\u{ff08}mhchem\u{ff09}\u{4e0e}\u{670d}\u{52a1}\u{7aef}\u{7269}\u{7406}\u{5b8f}\u{8868}\u{ff08}`\\RR` `\\dv` `\\ket` \u{7b49}\u{ff09}\u{ff0c}\u{4e0d}\u{518d}\u{663e}\u{793a}\u{7ea2}\u{5b57}\u{3002}\n- **\u{540e}\u{53f0}\u{5206}\u{9875}\u{5217}\u{8868}\u{7ffb}\u{9875}\u{56de}\u{8df3}**\u{ff1a}\u{5feb}\u{901f}\u{7ffb}\u{9875}\u{6216}\u{5207}\u{6362}\u{7b5b}\u{9009}\u{65f6}\u{ff0c}\u{8fc7}\u{671f}\u{54cd}\u{5e94}\u{4e0d}\u{518d}\u{8986}\u{76d6}\u{6700}\u{65b0}\u{7ed3}\u{679c}\u{3002}\n- **\u{65e5}\u{5fd7}\u{9875}\u{5207}\u{6362}\u{7b5b}\u{9009}\u{6cc4}\u{6f0f}**\u{ff1a}\u{5b9e}\u{65f6}\u{65e5}\u{5fd7}\u{7684} SSE \u{56de}\u{8c03}\u{968f}\u{8fde}\u{63a5}\u{4e00}\u{540c}\u{91ca}\u{653e}\u{ff0c}\u{4e0d}\u{518d}\u{6bcf}\u{6b21}\u{5207}\u{6362}\u{90fd} `forget` \u{4e00}\u{7ec4}\u{95ed}\u{5305}\u{3002}\n- **\u{6d41}\u{5f0f}\u{4ee3}\u{7801}\u{8fd0}\u{884c}\u{5668}\u{53ef}\u{80fd}\u{6302}\u{6b7b}**\u{ff1a}`wait` \u{51fa}\u{9519}\u{65f6} kill \u{5bb9}\u{5668}\u{ff0c}\u{7ed3}\u{675f}\u{540e}\u{9650}\u{65f6}\u{6392}\u{7a7a}\u{65e5}\u{5fd7}\u{ff0c}\u{5e76}\u{53d1}\u{8bb8}\u{53ef}\u{4e0e}\u{5bb9}\u{5668}\u{5fc5}\u{7136}\u{91ca}\u{653e}\u{3002}\n- **`/mcp` \u{4e0e} MCP \u{4e0a}\u{4f20}\u{4f2a}\u{9020}\u{4ee4}\u{724c}\u{6d2a}\u{6cdb}**\u{ff1a}\u{4ee4}\u{724c}\u{89e3}\u{6790}\u{ff08}\u{8981}\u{67e5}\u{5e93}\u{ff09}\u{524d}\u{5148}\u{6309} IP \u{9650}\u{6d41}\u{ff08}\u{6bcf}\u{79d2} 30 \u{6b21}\u{3001}\u{7a81}\u{53d1} 100 \u{6b21}\u{ff09}\u{ff0c}\u{8d85}\u{9650}\u{8fd4}\u{56de} 429\u{3002}\n- **\u{6587}\u{7ae0}\u{5199}\u{5165}\u{8d8a}\u{754c}**\u{ff1a}\u{6807}\u{9898}\u{ff08}200\u{ff09}\u{3001}\u{6458}\u{8981}\u{ff08}500\u{ff09}\u{3001}\u{5c01}\u{9762}\u{5730}\u{5740}\u{ff08}500\u{ff09}\u{3001}\u{6807}\u{7b7e}\u{6570}\u{ff08}16\u{ff09}\u{4e0e}\u{5355}\u{6807}\u{7b7e}\u{ff08}50\u{ff09}\u{5728}\u{5199}\u{5e93}\u{524d}\u{6821}\u{9a8c}\u{ff0c}\u{8fd4}\u{56de}\u{660e}\u{786e}\u{63d0}\u{793a}\u{ff0c}\u{4e0d}\u{518d}\u{4ee5}\u{6570}\u{636e}\u{5e93} 22001 \u{62a5}\u{9519}\u{3002}\n- **MCP \u{8bc4}\u{8bba}\u{5de5}\u{5177}\u{4e0e}\u{540e}\u{53f0}\u{884c}\u{4e3a}\u{4e0d}\u{4e00}\u{81f4}**\u{ff1a}\u{8bc4}\u{8bba}\u{5217}\u{8868}\u{4e0e}\u{5ba1}\u{6838}\u{6539}\u{4e3a}\u{59d4}\u{6258}\u{540e}\u{53f0}\u{540c}\u{4e00}\u{5b9e}\u{73b0}\u{ff1b}`set_comment_status(approved)` \u{4e5f}\u{4f1a}\u{9012}\u{5f52}\u{901a}\u{8fc7}\u{5f85}\u{5ba1}\u{7956}\u{5148}\u{ff0c}`list_comments(trash)` \u{8fd4}\u{56de}\u{56de}\u{6536}\u{7ad9}\u{8bc4}\u{8bba}\u{3002}\n- **\u{5168}\u{91cf}\u{91cd}\u{5efa}\u{6e32}\u{67d3}\u{8d85}\u{65f6}**\u{ff1a}\u{6309} id \u{6e38}\u{6807}\u{6bcf}\u{6279} 100 \u{7bc7}\u{3001}\u{4e8b}\u{52a1}\u{5916}\u{6e32}\u{67d3}\u{3001}\u{4e50}\u{89c2}\u{5199}\u{56de}\u{ff0c}\u{524d}\u{7aef}\u{5faa}\u{73af}\u{7eed}\u{4f20}\u{3002}\n- **\u{6587}\u{7ae0} PATCH \u{66f4}\u{65b0}\u{6301}\u{884c}\u{9501}\u{6e32}\u{67d3}**\u{ff1a}\u{6b63}\u{6587}\u{6e32}\u{67d3}\u{79fb}\u{5230}\u{884c}\u{9501}\u{4e8b}\u{52a1}\u{4e4b}\u{5916}\u{3002}\n- **SQL \u{5bfc}\u{51fa}\u{6574}\u{8868}\u{5165}\u{5185}\u{5b58}**\u{ff1a}\u{6539}\u{4e3a}\u{6d41}\u{5f0f}\u{8f93}\u{51fa}\u{ff0c}\u{884c}\u{5728}\u{53ea}\u{8bfb}\u{4e8b}\u{52a1}\u{4e2d}\u{9010}\u{6279}\u{63a8}\u{9001}\u{3002}\n- **\u{63d0}\u{793a}\u{6761}\u{4e0d}\u{81ea}\u{52a8}\u{6d88}\u{5931}**\u{ff1a}\u{8ba1}\u{65f6}\u{4efb}\u{52a1}\u{6302}\u{5230}\u{63d0}\u{4f9b}\u{8005} scope\u{ff0c}\u{63d0}\u{793a}\u{540e}\u{7acb}\u{5373}\u{8df3}\u{8f6c}\u{4e5f}\u{4f1a}\u{6309}\u{65f6}\u{6d88}\u{5931}\u{3002}\n- **\u{540e}\u{53f0}\u{9875}\u{9762} SSR \u{767d}\u{53d1}\u{67e5}\u{8be2}**\u{ff1a}\u{8bbe}\u{7f6e}\u{5404}\u{5206}\u{533a}\u{3001}MCP\u{3001}\u{65e5}\u{5fd7}\u{3001}\u{4ee3}\u{7801}\u{8fd0}\u{884c}\u{5668}\u{3001}\u{7cfb}\u{7edf}\u{72b6}\u{6001}\u{9875}\u{7684}\u{9996}\u{5c4f}\u{6570}\u{636e}\u{53ea}\u{5728}\u{6d4f}\u{89c8}\u{5668}\u{7aef}\u{52a0}\u{8f7d}\u{3002}\n- **\u{4ee3}\u{7801}\u{5757}\u{7f16}\u{8f91}\u{5668}/\u{7ec8}\u{7aef}\u{521b}\u{5efa}\u{5931}\u{8d25}\u{65e0}\u{63d0}\u{793a}**\u{ff1a}\u{663e}\u{793a}\u{300c}\u{521d}\u{59cb}\u{5316}\u{5931}\u{8d25}\u{300d}\u{5e76}\u{53ef}\u{91cd}\u{8bd5}\u{ff0c}\u{8fd0}\u{884c}\u{6309}\u{94ae}\u{4e0d}\u{518d}\u{4e00}\u{76f4}\u{8f6c}\u{5708}\u{3002}\n- **\u{7b14}\u{8bb0}\u{672c}\u{9875}\u{5931}\u{8d25}\u{8bef}\u{62a5}**\u{ff1a}\u{76ee}\u{5f55}\u{8bf7}\u{6c42}\u{5931}\u{8d25}\u{65f6}\u{663e}\u{793a}\u{300c}\u{7b14}\u{8bb0}\u{672c}\u{6682}\u{65f6}\u{6ca1}\u{80fd}\u{52a0}\u{8f7d}\u{300d}\u{5e76}\u{53ef}\u{91cd}\u{8bd5}\u{ff0c}\u{4e0d}\u{518d}\u{8bef}\u{62a5}\u{300c}\u{4e0d}\u{5b58}\u{5728}\u{300d}\u{ff1b}\u{300c}\u{52a0}\u{8f7d}\u{66f4}\u{591a}\u{300d}\u{5931}\u{8d25}\u{65f6}\u{7ed9}\u{51fa}\u{63d0}\u{793a}\u{3002}\n- **\u{4ee3}\u{7801}\u{5757}\u{590d}\u{5236}\u{5931}\u{8d25}\u{4ecd}\u{663e}\u{793a}\u{5df2}\u{590d}\u{5236}**\u{ff1a}\u{6539}\u{8d70}\u{7edf}\u{4e00}\u{7684}\u{526a}\u{8d34}\u{677f}\u{5c01}\u{88c5}\u{ff0c}\u{5931}\u{8d25}\u{65f6}\u{663e}\u{793a}\u{300c}\u{590d}\u{5236}\u{5931}\u{8d25}\u{300d}\u{3002}\n- **MCP \u{4ee4}\u{724c}\u{9875}\u{63a5}\u{5165}\u{7247}\u{6bb5}\u{7ad9}\u{70b9}\u{5730}\u{5740}**\u{ff1a}\u{4f18}\u{5148}\u{4f7f}\u{7528}\u{8bbe}\u{7f6e}\u{9762}\u{677f}\u{4e2d}\u{7684}\u{7ad9}\u{70b9}\u{5730}\u{5740}\u{ff0c}\u{4e0d}\u{518d}\u{53ea}\u{8bfb}\u{73af}\u{5883}\u{53d8}\u{91cf}\u{3002}\n- **\u{5316}\u{5b66}\u{516c}\u{5f0f}\u{517c}\u{5bb9}**\u{ff1a}mhchem \u{7684}\u{7bad}\u{5934}\u{4e0e}\u{5316}\u{5b66}\u{952e}\u{6539}\u{7528} KaTeX \u{652f}\u{6301}\u{7684}\u{547d}\u{4ee4}\u{ff0c}\u{907f}\u{514d}\u{516c}\u{5f0f}\u{6e32}\u{67d3}\u{5931}\u{8d25}\u{3002}\n- **\u{5199}\u{4f5c}\u{9875}\u{5c5e}\u{6027}\u{62bd}\u{5c49}**\u{ff1a}\u{8fdb}\u{5165}\u{7f16}\u{8f91}\u{9875}\u{65f6}\u{4e0d}\u{518d}\u{91cd}\u{590d}\u{64ad}\u{653e}\u{5165}\u{573a}\u{52a8}\u{753b}\u{3002}\n- **\u{56fe}\u{7247}\u{706f}\u{7bb1}\u{62d6}\u{52a8}\u{5e73}\u{79fb}**\u{ff1a}\u{9f20}\u{6807}\u{62d6}\u{52a8}\u{5728} fit \u{500d}\u{7387}\u{4e0b}\u{4e5f}\u{80fd}\u{5e73}\u{79fb}\u{56fe}\u{7247}\u{ff0c}\u{4e0d}\u{518d}\u{89e6}\u{53d1}\u{4e0b}\u{62c9}\u{5173}\u{95ed}\u{ff1b}\u{653e}\u{5927}\u{540e}\u{4ecd}\u{5c0f}\u{4e8e}\u{89c6}\u{53e3}\u{7684}\u{65b9}\u{5411}\u{4e5f}\u{53ef}\u{5e73}\u{79fb}\u{ff08}\u{53ea}\u{9650}\u{5236}\u{4e0d}\u{79fb}\u{51fa}\u{89c6}\u{53e3}\u{ff0c}\u{4e0d}\u{518d}\u{5f3a}\u{5236}\u{5c45}\u{4e2d}\u{ff09}\u{ff1b}\u{53cc}\u{51fb}\u{56de} fit \u{65f6}\u{91cd}\u{65b0}\u{5c45}\u{4e2d}\u{3002}\u{89e6}\u{5c4f} fit \u{6001}\u{4ecd}\u{4fdd}\u{7559}\u{7ad6}\u{76f4}\u{62d6}\u{62fd}\u{5173}\u{95ed}\u{3002}\n- **\u{4ee3}\u{7801}\u{8fd0}\u{884c}\u{5668}**\u{ff1a}\u{975e}\u{6d41}\u{5f0f}\u{6267}\u{884c}\u{5728}\u{7b49}\u{5f85}\u{5bb9}\u{5668}\u{51fa}\u{9519}\u{65f6}\u{4e5f}\u{4f1a}\u{7ec8}\u{6b62}\u{5bb9}\u{5668}\u{ff0c}\u{8bfb}\u{53d6}\u{65e5}\u{5fd7}\u{6709}\u{8d85}\u{65f6}\u{4e0a}\u{9650}\u{ff0c}\u{4e0d}\u{518d}\u{6c38}\u{4e45}\u{5360}\u{7528}\u{8fd0}\u{884c}\u{4fe1}\u{53f7}\u{91cf}\u{3002}\n- **MCP \u{6807}\u{7b7e}\u{5de5}\u{5177}**\u{ff1a}`create_tag`/`rename_tag` \u{540c}\u{65f6}\u{5931}\u{6548}\u{6587}\u{7ae0}\u{5217}\u{8868}\u{3001}\u{6807}\u{7b7e}\u{9875}\u{4e0e} SSR \u{7f13}\u{5b58}\u{ff0c}\u{6539}\u{540d}\u{540e}\u{516c}\u{5f00}\u{9875}\u{9762}\u{7acb}\u{5373}\u{66f4}\u{65b0}\u{3002}\n- **\u{957f}\u{5ea6}\u{6821}\u{9a8c}\u{6309}\u{5b57}\u{7b26}\u{8ba1}**\u{ff1a}\u{7528}\u{6237}\u{540d}\u{3001}\u{8bc4}\u{8bba}\u{6635}\u{79f0}\u{4e0e}\u{8bc4}\u{8bba}\u{5185}\u{5bb9}\u{6309}\u{5b57}\u{7b26}\u{6570}\u{800c}\u{975e}\u{5b57}\u{8282}\u{6570}\u{6821}\u{9a8c}\u{ff0c}\u{4e0e}\u{63d0}\u{793a}\u{4e00}\u{81f4}\u{ff08}\u{4e2d}\u{6587}\u{6635}\u{79f0}\u{4e0d}\u{518d}\u{53ea}\u{80fd}\u{5199}\u{7ea6} 16 \u{5b57}\u{ff09}\u{3002}\n- **\u{8bbe}\u{7f6e}\u{4e0a}\u{9650}**\u{ff1a}\u{56fe}\u{7247}\u{78c1}\u{76d8}\u{7f13}\u{5b58}\u{5bb9}\u{91cf}\u{4e0e}\u{4fdd}\u{7559}\u{65f6}\u{957f}\u{3001}\u{9650}\u{6d41}\u{901f}\u{7387}\u{3001}\u{8fd0}\u{884c}\u{5668}\u{8f93}\u{51fa}\u{4e0e}\u{6e90}\u{7801}\u{5b57}\u{8282}\u{6570}\u{8865}\u{9f50}\u{4e0a}\u{9650}\u{94b3}\u{5236}\u{ff0c}\u{6781}\u{5927}\u{503c}\u{4e0d}\u{518d}\u{5173}\u{6389}\u{9650}\u{5236}\u{3002}\n- **\u{53ef}\u{4fe1}\u{4ee3}\u{7406}\u{6bb5}\u{6570}\u{8bf4}\u{660e}**\u{ff1a}README\u{3001}`.env.example` \u{4e0e}\u{300c}\u{540e}\u{53f0}\u{8bbe}\u{7f6e} \u{2192} \u{5b89}\u{5168}\u{300d}\u{9762}\u{677f}\u{6539}\u{4e3a}\u{8bf4}\u{660e} `TRUSTED_PROXY_COUNT` \u{662f} X-Forwarded-For \u{4e2d}\u{771f}\u{5b9e}\u{5ba2}\u{6237}\u{7aef} IP \u{53f3}\u{4fa7}\u{7684}\u{6bb5}\u{6570}\u{ff0c}\u{800c}\u{975e}\u{4ee3}\u{7406}\u{5c42}\u{6570}\u{ff1b}\u{9762}\u{677f}\u{8be5}\u{9879}\u{66f4}\u{540d}\u{4e3a}\u{300c}\u{53ef}\u{4fe1}\u{4ee3}\u{7406}\u{6bb5}\u{6570}\u{300d}\u{3002}CDN + \u{6e90}\u{7ad9}\u{53cd}\u{4ee3}\u{5e94}\u{586b} 1\u{ff0c}\u{6309}\u{539f}\u{8bf4}\u{660e}\u{586b} 2 \u{4f1a}\u{4fe1}\u{4efb}\u{4f2a}\u{9020}\u{7684} XFF \u{6bb5}\u{3002}\n- **\u{7d20}\u{6750}\u{5e93}\u{5217}\u{8868}\u{67e5}\u{8be2}**\u{ff1a}\u{672c}\u{9875}\u{5f15}\u{7528}\u{8ba1}\u{6570}\u{6539}\u{7531}\u{5df2}\u{53d6}\u{56de}\u{7684}\u{5f15}\u{7528}\u{660e}\u{7ec6}\u{6d3e}\u{751f}\u{ff0c}\u{4e0d}\u{518d}\u{4e3a}\u{6bcf}\u{884c}\u{8dd1} 5 \u{4e2a}\u{5173}\u{8054}\u{5b50}\u{67e5}\u{8be2}\u{ff1b}tabs \u{6c47}\u{603b}\u{6539}\u{4e3a}\u{6bcf}\u{4e2a}\u{7d20}\u{6750}\u{53ea}\u{5224}\u{5b9a}\u{4e00}\u{6b21}\u{5f15}\u{7528}\u{ff08}\u{539f}\u{5148}\u{540c}\u{4e00}\u{5224}\u{5b9a}\u{6bcf}\u{884c}\u{7b97} 4 \u{904d}\u{ff09}\u{ff1b}`note_asset_refs` \u{8865} `asset_id` \u{7d22}\u{5f15}\u{ff08}\u{8fc1}\u{79fb} 030\u{ff09}\u{3002}\n\n### Internal\n\n- \u{6d88}\u{6bd2}\u{767d}\u{540d}\u{5355}\u{9884}\u{6784}\u{5efa}\u{4e3a}\u{9759}\u{6001}\u{5b9e}\u{4f8b}\u{ff1b}\u{56de}\u{6536}\u{7ad9}\u{6279}\u{91cf}\u{6062}\u{590d}\u{4e0e}\u{5f7b}\u{5e95}\u{5220}\u{9664}\u{6539}\u{4e3a}\u{4e00}\u{6b21}\u{6279}\u{91cf}\u{67e5}\u{8be2}\u{6807}\u{7b7e}\u{ff1b}`replacement()` \u{8fd4}\u{56de}\u{5df2}\u{6821}\u{9a8c}\u{5b57}\u{6bb5}\u{ff0c}\u{53bb}\u{6389}\u{4f9d}\u{8d56}\u{975e}\u{5c40}\u{90e8}\u{4e0d}\u{53d8}\u{91cf}\u{7684} `expect()`\u{3002}\n- \u{6536}\u{655b}\u{91cd}\u{590d}\u{5b9e}\u{73b0}\u{ff1a}HTML \u{8f6c}\u{4e49}\u{3001}settings \u{5355}\u{952e} upsert\u{3001}\u{539f}\u{751f}\u{8def}\u{7531} admin \u{524d}\u{7f6e}\u{6821}\u{9a8c}\u{3001}\u{8bc4}\u{8bba}\u{5185}\u{5bb9}\u{54c8}\u{5e0c}\u{3001}`group_digits`\u{3001}\u{4e3b}\u{9898}\u{8fc7}\u{6e21}\u{63a2}\u{6d4b}\u{ff1b}\u{5220}\u{9664}\u{672a}\u{4f7f}\u{7528}\u{7684}\u{5e38}\u{91cf}\u{3001}\u{7ec4}\u{4ef6}\u{3001}CSS \u{89c4}\u{5219}\u{3001}`codemirror` \u{4f9d}\u{8d56}\u{4e0e}\u{8fc7}\u{65f6}\u{7684} `dead_code` \u{8c41}\u{514d}\u{3002}\n- \u{6d4b}\u{8bd5}\u{6539}\u{4e3a}\u{8c03}\u{7528}\u{751f}\u{4ea7}\u{51fd}\u{6570}\u{ff1a}\u{5065}\u{5eb7}\u{68c0}\u{67e5}\u{3001}\u{4e0a}\u{4f20}\u{8f6c}\u{7801}\u{ff1b}\u{5220}\u{9664}\u{6e90}\u{7801}\u{5b57}\u{7b26}\u{4e32}\u{65ad}\u{8a00}\u{6d4b}\u{8bd5}\u{ff1b}\u{4e24}\u{4e2a} TEMP \u{8868}\u{6570}\u{636e}\u{5e93}\u{56de}\u{5f52}\u{6539}\u{8bfb} `DATABASE_URL` \u{5e76}\u{5199}\u{5165}\u{6d4b}\u{8bd5}\u{6587}\u{6863}\u{ff1b}`scripts/test-dev-assets.ts` \u{4ece} `mk/assets.mk` \u{8bfb}\u{53d6}\u{8f93}\u{51fa}\u{6e05}\u{5355}\u{ff1b}\u{6e05}\u{7406} FreeBSD \u{6b8b}\u{7559}\u{5ffd}\u{7565}\u{89c4}\u{5219}\u{3002}\n- \u{4ee3}\u{7801}\u{8fd0}\u{884c}\u{5668}\u{6d41}\u{5f0f}\u{6267}\u{884c}\u{8d85}\u{65f6}\u{53ea}\u{63a8}\u{9001}\u{4e00}\u{4e2a} `done` \u{4e8b}\u{4ef6}\u{ff08}\u{6b64}\u{524d} runner \u{4e0e}\u{8c03}\u{7528}\u{65b9}\u{5404}\u{63a8}\u{4e00}\u{4e2a}\u{ff09}\u{ff1b}`run_in_container_stream` \u{53bb}\u{6389}\u{6052}\u{4e3a} `false` \u{7684} `timed_out` \u{8fd4}\u{56de}\u{503c}\u{ff0c}\u{4e0e}\u{975e}\u{6d41}\u{5f0f}\u{8def}\u{5f84}\u{7edf}\u{4e00}\u{4e3a} 4 \u{5143}\u{7ec4}\u{3002}\n- `public/` \u{4e0b}\u{7684} `libs/` \u{6784}\u{5efa}\u{4ea7}\u{7269}\u{ff08}codemirror\u{3001}lightbox\u{3001}tiptap\u{3001}xterm\u{3001}yggdrasil-core\u{ff09}\u{79fb}\u{51fa} git \u{7d22}\u{5f15}\u{ff0c}\u{4e0e} `.gitignore` \u{4e00}\u{81f4}\u{ff1b}\u{6784}\u{5efa}\u{4ea7}\u{7269}\u{4e00}\u{5f8b}\u{4e0d}\u{5165}\u{5e93}\u{ff0c}\u{7531} `make build-libs`/`make dev-assets` \u{751f}\u{6210}\u{3002}\n- \u{6536}\u{62e2}\u{7ec4}\u{4ef6}\u{ff1a}\u{65b0}\u{589e} `StatusDot`\u{ff0c}\u{540e}\u{53f0} 9 \u{5904}\u{624b}\u{5199} `.status-dot` \u{6539}\u{7528}\u{5b83}\u{ff1b}`StatusBadge` \u{589e}\u{52a0} `class` \u{9644}\u{52a0}\u{7c7b}\u{ff0c}\u{66f4}\u{65b0}\u{65e5}\u{5fd7}\u{300c}\u{6700}\u{65b0}\u{300d}\u{4e0e}\u{6587}\u{7ae0}\u{6807}\u{9898}\u{300c}\u{8349}\u{7a3f}\u{300d}\u{5fbd}\u{7ae0}\u{6539}\u{7528}\u{5b83}\u{ff1b}\u{53cb}\u{94fe}\u{3001}\u{7b14}\u{8bb0}\u{672c}\u{3001}\u{4ee3}\u{7801}\u{8fd0}\u{884c}\u{5668}\u{8868}\u{5355}\u{6807}\u{7b7e}\u{6539}\u{7528} `FormLabel` \u{5e76}\u{5220}\u{9664}\u{4e09}\u{4efd}\u{91cd}\u{590d}\u{6837}\u{5f0f}\u{ff1b}\u{5220}\u{9664}\u{4ec5}\u{5c55}\u{793a}\u{9875}\u{4f7f}\u{7528}\u{7684}\u{65e7}\u{63a5}\u{53e3} `LoadingButton` \u{4e0e}\u{5df2}\u{65e0}\u{5f15}\u{7528}\u{7684}\u{9aa8}\u{67b6}\u{5c4f}\u{6837}\u{5f0f}\u{3002}\n\n## [0.25.0] - 2026-10-23\n\n### Added\n\n- **\u{524d}\u{53f0}\u{97f3}\u{4e50}\u{64ad}\u{653e}**\u{ff1a}\u{65b0}\u{589e}\u{4ec5}\u{5728}\u{524d}\u{53f0}\u{5e03}\u{5c40}\u{6302}\u{8f7d}\u{7684}\u{5168}\u{5c40}\u{97f3}\u{4e50}\u{64ad}\u{653e}\u{5668}\u{ff0c}\u{901a}\u{8fc7}\u{516c}\u{5f00}\u{542f}\u{52a8}\u{914d}\u{7f6e}\u{4e0e}\u{6309}\u{9700}\u{52a0}\u{8f7d}\u{7684} Web Components \u{63a5}\u{5165} Kite\u{ff1b}\u{652f}\u{6301}\u{5207}\u{9875}\u{7eed}\u{64ad}\u{3001}\u{4e3b}\u{9898}\u{540c}\u{6b65}\u{3001}\u{5237}\u{65b0}\u{6062}\u{590d}\u{961f}\u{5217}\u{4e0e}\u{8fdb}\u{5ea6}\u{ff0c}\u{79bb}\u{5f00}\u{524d}\u{53f0}\u{65f6}\u{6682}\u{505c}\u{ff0c}\u{9ed8}\u{8ba4}\u{4e0d}\u{81ea}\u{52a8}\u{64ad}\u{653e}\u{3002}\n- **\u{53cc}\u{673a}\u{90e8}\u{7f72}**\u{ff1a}\u{63d0}\u{4f9b}\u{72ec}\u{7acb}\u{7684} Kite \u{516c}\u{5f00}\u{670d}\u{52a1} Quadlet\u{ff0c}\u{590d}\u{7528}\u{73b0}\u{6709} HTTPS \u{57df}\u{540d}\u{7684} `/player/v1/` \u{53cd}\u{4ee3}\u{8def}\u{5f84}\u{ff1b}\u{516c}\u{5f00}\u{670d}\u{52a1}\u{4e0e}\u{7ba1}\u{7406}\u{5b9e}\u{4f8b}\u{9694}\u{79bb}\u{ff0c}\u{4e24}\u{53f0}\u{535a}\u{5ba2}\u{4f7f}\u{7528}\u{540c}\u{4e00}\u{516c}\u{5f00}\u{5730}\u{5740}\u{4e0e}\u{6b4c}\u{5355}\u{767d}\u{540d}\u{5355}\u{3002}\n\n### Changed\n\n- **\u{5168}\u{5c40}\u{97f3}\u{4e50}\u{64ad}\u{653e}\u{5668}**\u{ff1a}\u{5c06} `@violetjs/kite-player` \u{4ece} `0.1.0` \u{5347}\u{7ea7}\u{5e76}\u{9501}\u{5b9a}\u{5230} `0.3.0`\u{ff0c}\u{6cbf}\u{7528}\u{6309}\u{9700}\u{52a0}\u{8f7d}\u{7684} Web Components \u{63a5}\u{5165}\u{ff0c}\u{83b7}\u{5f97}\u{97f3}\u{8d28}\u{5207}\u{6362}\u{3001}\u{8bd5}\u{542c}\u{6807}\u{8bb0}\u{3001}\u{65e0}\u{5c01}\u{9762}\u{5360}\u{4f4d}\u{53ca}\u{65b0}\u{7248}\u{5c55}\u{5f00}/\u{6b4c}\u{8bcd}\u{4ea4}\u{4e92}\u{ff1b}\u{65b0}\u{589e}\u{6d4f}\u{89c8}\u{5668}\u{56de}\u{5f52}\u{8986}\u{76d6}\u{97f3}\u{8d28}\u{5207}\u{6362}\u{4e0d}\u{4e2d}\u{65ad}\u{8fdb}\u{5ea6}\u{53ca}\u{5237}\u{65b0}\u{540e}\u{504f}\u{597d}\u{6062}\u{590d}\u{ff0c}\u{4fdd}\u{7559}\u{524d}\u{53f0}\u{5207}\u{9875}\u{7eed}\u{64ad}\u{3001}\u{4e3b}\u{9898}\u{540c}\u{6b65}\u{4e0e}\u{9000}\u{51fa}\u{6682}\u{505c}\u{884c}\u{4e3a}\u{3002}\n\n## [0.24.2] - 2026-10-22\n\n### Changed\n\n- **\u{7ec4}\u{4ef6}\u{56fe}\u{9274}**\u{ff1a}\u{79fb}\u{9664}\u{9aa8}\u{67b6}\u{5c4f}\u{5c55}\u{793a}\u{6761}\u{76ee}\u{3001}\u{9875}\u{9762}\u{5e03}\u{5c40}\u{5206}\u{7c7b}\u{53ca}\u{5176}\u{72ec}\u{7acb}\u{8be6}\u{60c5}\u{9884}\u{89c8}\u{ff0c}\u{6e05}\u{7406}\u{5bf9}\u{5e94}\u{9884}\u{89c8}\u{4ee3}\u{7801}\u{4e0e}\u{6837}\u{5f0f}\u{ff1b}\u{9aa8}\u{67b6}\u{5c4f}\u{548c}\u{9875}\u{9762}\u{5e03}\u{5c40}\u{7ec4}\u{4ef6}\u{4ecd}\u{4fdd}\u{7559}\u{5728}\u{6b63}\u{5f0f}\u{4e1a}\u{52a1}\u{9875}\u{9762}\u{4e2d}\u{4f7f}\u{7528}\u{3002}\u{540c}\u{6b65}\u{66f4}\u{65b0}\u{76ee}\u{5f55}\u{5b8c}\u{6574}\u{6027}\u{68c0}\u{67e5}\u{3001}\u{6d4f}\u{89c8}\u{5668}\u{56de}\u{5f52}\u{65ad}\u{8a00}\u{53ca}\u{56fe}\u{9274}\u{7ef4}\u{62a4}\u{6587}\u{6863}\u{3002}\n\n## [0.24.1] - 2026-10-22\n\n### Fixed\n\n- **Docker \u{6784}\u{5efa}**:`.dockerignore` \u{653e}\u{884c} release \u{88c5}\u{914d}\u{811a}\u{672c} `build-release.ts` \u{53ca}\u{5176}\u{5bfc}\u{5165}\u{7684} `release-bootstrap.cjs`,\u{4fee}\u{590d} P3b \u{628a} flavor \u{88c5}\u{914d}\u{79fb}\u{8fdb}\u{5bb9}\u{5668}\u{6267}\u{884c}\u{540e}\u{6784}\u{5efa}\u{4e0a}\u{4e0b}\u{6587}\u{7f3a}\u{6587}\u{4ef6}\u{62a5} Module not found \u{7684}\u{95ee}\u{9898};\u{5176}\u{4f59} `scripts/` \u{4fdd}\u{6301}\u{6392}\u{9664}\u{3002}\n- **\u{6784}\u{5efa}\u{5165}\u{53e3}**:\u{8865}\u{56de} P3b \u{8bef}\u{5220}\u{7684} `make build-client` recipe\u{3002}\u{6b64}\u{524d} `.PHONY` \u{4fdd}\u{7559}\u{4e86}\u{540c}\u{540d}\u{76ee}\u{6807},make \u{4f1a}\u{9759}\u{9ed8}\u{8df3}\u{8fc7}\u{65e0} recipe \u{7684} phony \u{76ee}\u{6807},\u{5bfc}\u{81f4} `build-linux` \u{4e0e} Dockerfile / Dockerfile.cross \u{7684}\u{9996}\u{4e2a}\u{5ba2}\u{6237}\u{7aef}\u{6784}\u{5efa}\u{53d8}\u{6210}\u{7a7a}\u{64cd}\u{4f5c},CI Docker \u{6784}\u{5efa}\u{5728} `snapshot-flavor` \u{5904}\u{5931}\u{8d25}\u{3002}\n\n## [0.24.0] - 2026-10-21\n\n### Added\n\n- **\u{8bfb}\u{8005}\u{7248}\u{53cc}\u{5ba2}\u{6237}\u{7aef}**\u{ff1a}\u{516c}\u{5f00}\u{9605}\u{8bfb}\u{8def}\u{5f84}\u{9ed8}\u{8ba4}\u{52a0}\u{8f7d}\u{7f16}\u{8bd1}\u{671f}\u{88c1}\u{526a}\u{7684} reader \u{5ba2}\u{6237}\u{7aef}\u{ff0c}\u{540e}\u{53f0}\u{3001}\u{767b}\u{5f55}\u{4e0e}\u{56fe}\u{9274}\u{8def}\u{7531}\u{88ab}\u{7f16}\u{8bd1}\u{5254}\u{9664}\u{ff0c}\u{533f}\u{540d}\u{9605}\u{8bfb}\u{4e0d}\u{518d}\u{4e0b}\u{8f7d}\u{5b8c}\u{6574}\u{5e94}\u{7528}\u{ff1b}reader WASM Brotli \u{4f53}\u{79ef}\u{8f83}\u{4f18}\u{5316}\u{524d}\u{57fa}\u{7ebf}\u{4e0b}\u{964d} 49.9%\u{ff08}989.4 \u{2192} 495.6 KiB\u{ff09}\u{3002}\u{8de8}\u{5165}\u{53e3}\u{8fdb}\u{5165}\u{540e}\u{53f0}\u{5c5e}\u{6574}\u{9875}\u{5bfc}\u{822a}\u{ff0c}\u{6309}\u{8bbe}\u{8ba1}\u{53e6}\u{8f7d} full \u{4ea7}\u{7269}\u{ff08}\u{9996}\u{6b21}\u{9605}\u{8bfb}\u{5230}\u{8fdb}\u{5165}\u{540e}\u{53f0}\u{7d2f}\u{8ba1}\u{4e0b}\u{8f7d}\u{7ea6} 2.2 MiB\u{ff0c}\u{5df2}\u{968f}\u{9a8c}\u{6536}\u{62a5}\u{544a}\u{516c}\u{5f00}\u{ff09}\u{3002}\n- **\u{53cc}\u{4ea7}\u{7269}\u{53d1}\u{5e03}\u{6d41}\u{6c34}\u{7ebf}**\u{ff1a}`make build` \u{987a}\u{5e8f}\u{4ea7}\u{51fa} full/reader \u{4e24}\u{4e2a}\u{5ba2}\u{6237}\u{7aef}\u{5e76}\u{6309}\u{53d1}\u{5e03}\u{6e05}\u{5355}\u{5408}\u{5e76}\u{ff1b}\u{88c5}\u{914d}\u{6539}\u{4e3a}\u{4e34}\u{65f6}\u{76ee}\u{5f55}\u{539f}\u{5b50}\u{6362}\u{5165}\u{ff0c}\u{4e2d}\u{65ad}\u{4e0d}\u{518d}\u{7834}\u{574f}\u{65e2}\u{6709}\u{53d1}\u{5e03}\u{76ee}\u{5f55}\u{ff1b}SSR \u{7f13}\u{5b58}\u{6309} release\u{d7}flavor \u{547d}\u{540d}\u{7a7a}\u{95f4}\u{9694}\u{79bb}\u{ff0c}\u{7ec4}\u{5408}\u{53d8}\u{5316}\u{6574}\u{8868}\u{5931}\u{6548}\u{3002}\n- **\u{65e7}\u{53d1}\u{5e03}\u{8d44}\u{6e90}\u{4fdd}\u{7559}\u{7a97}\u{53e3}**\u{ff1a}\u{65b0}\u{589e} `YGG_PREVIOUS_PUBLIC_DIR`\u{ff0c}\u{6eda}\u{52a8}\u{66f4}\u{65b0}\u{671f}\u{95f4}\u{65e7}\u{6807}\u{7b7e}\u{9875}\u{4ecd}\u{53ef}\u{52a0}\u{8f7d}\u{65b0}\u{53d1}\u{5e03}\u{5df2}\u{5220}\u{9664}\u{7684}\u{5185}\u{5bb9}\u{5bfb}\u{5740}\u{8d44}\u{6e90}\u{ff0c}\u{7a97}\u{53e3}\u{4e0e}\u{6e05}\u{7406}\u{7531}\u{90e8}\u{7f72}\u{6d41}\u{7a0b}\u{63a7}\u{5236}\u{3002}\n- **WASM preload**\u{ff1a}\u{53d1}\u{5e03}\u{88c5}\u{914d}\u{671f}\u{4ece}\u{6a21}\u{677f}\u{89e3}\u{6790} WASM \u{5165}\u{53e3}\u{5e76}\u{6ce8}\u{5165} `<link rel=\"preload\">`\u{ff0c}\u{89e3}\u{6790}\u{5931}\u{8d25}\u{6216}\u{4e24} flavor \u{5165}\u{53e3}\u{91cd}\u{5408}\u{65f6}\u{5728}\u{8986}\u{76d6}\u{65e7}\u{53d1}\u{5e03}\u{524d}\u{5931}\u{8d25}\u{ff1b}\u{9644}\u{771f}\u{5b9e}\u{8bf7}\u{6c42}\u{94fe}\u{51b7}/\u{70ed}\u{7f13}\u{5b58} A/B \u{56de}\u{5f52}\u{3002}\n- **\u{6309}\u{9700}\u{589e}\u{5f3a}\u{811a}\u{672c}**\u{ff1a}\u{5168}\u{5c40}\u{963b}\u{585e}\u{811a}\u{672c}\u{62c6}\u{5206}\u{4e3a}\u{542f}\u{52a8}\u{6838}\u{5fc3}\u{4e0e}\u{589e}\u{5f3a} IIFE\u{ff0c}\u{706f}\u{7bb1}\u{4e0e}\u{6587}\u{7ae0}\u{589e}\u{5f3a}\u{3001}Mermaid\u{3001}\u{76ee}\u{5f55}\u{3001}\u{56fe}\u{9274}\u{7011}\u{5e03}\u{6d41}\u{3001}\u{66f4}\u{65b0}\u{65e5}\u{5fd7}\u{5bfc}\u{822a}\u{6539}\u{7531}\u{7ec4}\u{4ef6}\u{6309}\u{9700}\u{58f0}\u{660e}\u{6ce8}\u{5165}\u{ff0c}\u{914d}\u{7f3a}\u{5931}\u{51fd}\u{6570}\u{8865}\u{6267}\u{884c}\u{961f}\u{5217}\u{ff1b}\u{5168}\u{5c40}\u{963b}\u{585e}\u{4f20}\u{8f93}\u{4e0b}\u{964d} 17.6%\u{ff08}69.2 \u{2192} 57.0 KiB\u{ff09}\u{ff0c}head \u{963b}\u{585e}\u{8bf7}\u{6c42} 7 \u{2192} 5\u{3002}KaTeX \u{4e0e}\u{9ad8}\u{4eae}\u{6837}\u{5f0f}\u{4fdd}\u{6301}\u{5168}\u{5c40}\u{52a0}\u{8f7d}\u{4ee5}\u{907f}\u{514d}\u{9996}\u{8df3}\u{88f8}\u{6837}\u{5f0f}\u{95ea}\u{70c1}\u{3002}\n- **\u{53d1}\u{5e03}\u{6d4b}\u{91cf}\u{4e0e}\u{56de}\u{5f52}**\u{ff1a}\u{65b0}\u{589e} release \u{4ea7}\u{7269}\u{6d4b}\u{91cf}\u{811a}\u{672c}\u{3001}\u{53cc}\u{4ea7}\u{7269}\u{6d4f}\u{89c8}\u{5668}\u{56de}\u{5f52}\u{ff08}\u{7f13}\u{5b58}\u{3001}\u{65e7}\u{8d44}\u{6e90}\u{7a97}\u{53e3}\u{3001}\u{5b8c}\u{6574}\u{5e94}\u{7528}\u{56de}\u{9000}\u{7b49} 74 \u{9879}\u{65ad}\u{8a00}\u{ff09}\u{4e0e} preload A/B \u{6d4b}\u{8bd5}\u{ff1b}\u{53d1}\u{5e03}\u{6e05}\u{5355}\u{4e0e} preload \u{4e00}\u{81f4}\u{6027}\u{68c0}\u{67e5}\u{5e76}\u{5165} `make test` \u{4e0e} CI\u{3002}\n\n### Changed\n\n- **\u{6d4f}\u{89c8}\u{5668}\u{65e5}\u{5fd7}\u{94fe}**\u{ff1a}release \u{5ba2}\u{6237}\u{7aef}\u{4e0d}\u{518d}\u{542f}\u{7528} Dioxus \u{9ed8}\u{8ba4}\u{65e5}\u{5fd7}\u{8ba2}\u{9605}\u{5668}\u{ff08}\u{5f00}\u{53d1}\u{671f}\u{7ecf} `dev-logger` feature \u{4fdd}\u{7559}\u{ff09}\u{ff0c}WASM Brotli \u{518d}\u{964d}\u{7ea6} 20 KiB\u{ff1b}\u{7ebf}\u{4e0a}\u{9519}\u{8bef}\u{8bca}\u{65ad}\u{4f9d}\u{8d56}\u{7ec4}\u{4ef6}\u{7ea7}\u{9519}\u{8bef} UI\u{3002}\n- **\u{4ee3}\u{7801}\u{8fd0}\u{884c}\u{5668}**\u{ff1a}\u{53ef}\u{8fd0}\u{884c}\u{4ee3}\u{7801}\u{5757}\u{63a5}\u{8fd1}\u{89c6}\u{53e3}\u{65f6}\u{624d}\u{52a0}\u{8f7d} CodeMirror \u{5e76}\u{521b}\u{5efa}\u{5b9e}\u{4f8b}\u{ff0c}\u{6fc0}\u{6d3b}\u{524d}\u{5c55}\u{793a}\u{670d}\u{52a1}\u{7aef}\u{9ad8}\u{4eae}\u{7684}\u{9759}\u{6001}\u{4ee3}\u{7801}\u{ff08}\u{987a}\u{5e26}\u{4fee}\u{590d} SSR \u{53ea}\u{6709}\u{9aa8}\u{67b6}\u{6761}\u{3001}\u{4ee3}\u{7801}\u{6587}\u{672c}\u{5bf9}\u{722c}\u{866b}\u{4e0d}\u{53ef}\u{89c1}\u{7684}\u{95ee}\u{9898}\u{ff09}\u{ff1b}\u{6eda}\u{51fa}\u{89c6}\u{53e3}\u{4e0d}\u{9500}\u{6bc1}\u{5b9e}\u{4f8b}\u{ff0c}\u{8fd0}\u{884c}\u{610f}\u{56fe}\u{5728}\u{7f16}\u{8f91}\u{5668}\u{5c31}\u{7eea}\u{540e}\u{6267}\u{884c}\u{4e00}\u{6b21}\u{3002}\n- **\u{516c}\u{5f00}\u{7b14}\u{8bb0}\u{6570}\u{636e}**\u{ff1a}\u{7b14}\u{8bb0}\u{8be6}\u{60c5}\u{6539}\u{7528}\u{7cbe}\u{7b80} DTO\u{ff0c}\u{4e0d}\u{518d}\u{4e0b}\u{53d1}\u{7f16}\u{8f91}\u{7528} Markdown \u{4e0e}\u{5185}\u{90e8}\u{5b57}\u{6bb5}\u{ff1b}\u{5207}\u{6362}\u{53d1}\u{5e03}\u{72b6}\u{6001}\u{524d}\u{5df2}\u{6253}\u{5f00}\u{7684}\u{65e7}\u{6807}\u{7b7e}\u{9875}\u{4ecd}\u{53ef}\u{53cd}\u{5e8f}\u{5217}\u{5316}\u{65b0}\u{54cd}\u{5e94}\u{3002}\n- **\u{6b63}\u{6587}\u{6e32}\u{67d3}\u{5f00}\u{9500}**\u{ff1a}\u{6b63}\u{6587}\u{7247}\u{6bb5}\u{89e3}\u{6790}\u{7ed3}\u{679c}\u{6309}\u{5185}\u{5bb9}\u{54c8}\u{5e0c}\u{505a}\u{8fdb}\u{7a0b}\u{5185}\u{6709}\u{754c}\u{7f13}\u{5b58}\u{ff0c}\u{4e3b}\u{9898}\u{5207}\u{6362}\u{7b49}\u{91cd}\u{6e32}\u{67d3}\u{96f6}\u{91cd}\u{65b0}\u{89e3}\u{6790}\u{ff1b}\u{9875}\u{7709}\u{3001}\u{5143}\u{4fe1}\u{606f}\u{4e0e}\u{9875}\u{811a}\u{7ec4}\u{4ef6}\u{6539}\u{6536}\u{5c0f}\u{578b}\u{5b57}\u{6bb5}\u{96c6}\u{ff0c}\u{4e0d}\u{518d}\u{590d}\u{5236}\u{6216}\u{6df1}\u{6bd4}\u{8f83}\u{5b8c}\u{6574}\u{6b63}\u{6587}\u{3002}\n\n### Fixed\n\n- **\u{6b63}\u{6587}\u{590d}\u{5236}\u{6309}\u{94ae}**\u{ff1a}\u{70b9}\u{51fb}\u{4e0d}\u{518d}\u{8bef}\u{89e6}\u{53d1}\u{7f16}\u{8f91}\u{5668}\u{6fc0}\u{6d3b}\u{ff0c}\u{52a0}\u{8f7d}\u{63d0}\u{793a}\u{533a}\u{5206}\u{5931}\u{8d25}\u{72b6}\u{6001}\u{3002}\n- **\u{8de8}\u{4ea7}\u{7269}\u{5bfc}\u{822a}**\u{ff1a}reader \u{4e0e} full \u{7684}\u{8de8}\u{5165}\u{53e3}\u{94fe}\u{63a5}\u{7edf}\u{4e00}\u{6e32}\u{67d3}\u{4e3a}\u{666e}\u{901a} `<a>` \u{6574}\u{9875}\u{5bfc}\u{822a}\u{ff0c}\u{4fee}\u{590d} reader \u{8def}\u{5f84}\u{4e0b} hydration \u{76d1}\u{542c}\u{5668}\u{6807}\u{8bb0}\u{5931}\u{914d}\u{5bfc}\u{81f4}\u{7684}\u{9875}\u{9762}\u{5d29}\u{6e83}\u{3002}\n\n## [0.23.4] - 2026-10-20\n\n### Fixed\n\n- **SSR \u{7f13}\u{5b58}\u{5d29}\u{6e83}**\u{ff1a}\u{516c}\u{5f00}\u{9875} HTML \u{7f13}\u{5b58}\u{7684}\u{54cd}\u{5e94}\u{6d41}\u{7ed3}\u{675f}\u{540e}\u{88ab}\u{538b}\u{7f29}\u{5c42}\u{518d}\u{6b21} poll \u{65f6}\u{4e0d}\u{518d} panic\u{ff1b}\u{6b64}\u{524d} release \u{7684} `panic = \"abort\"` \u{4f1a}\u{4f7f}\u{8fdb}\u{7a0b}\u{53cd}\u{590d}\u{9000}\u{51fa}\u{ff0c}\u{5bfc}\u{81f4} nginx \u{95f4}\u{6b47}\u{8fd4}\u{56de} 502\u{3002}\n\n## [0.23.3] - 2026-10-19\n\n### Changed\n\n- **\u{524d}\u{7aef}\u{4f53}\u{79ef}**\u{ff1a}\u{7ec4}\u{4ef6}\u{56fe}\u{9274}\u{6570}\u{636e}\u{4e0e}\u{5199}\u{4f5c}\u{6280}\u{80fd}\u{6e90}\u{7801}\u{53ea}\u{5d4c}\u{5165}\u{670d}\u{52a1}\u{7aef}\u{ff0c}\u{6539}\u{7531}\u{6c34}\u{5408}\u{6570}\u{636e}\u{6216} server function \u{4e0b}\u{53d1}\u{ff0c}WASM \u{51cf}\u{5c11}\u{7ea6} 110 KB\u{ff08}brotli \u{540e}\u{7ea6} 13 KB\u{ff09}\u{3002}\n- **\u{52a8}\u{6001}\u{538b}\u{7f29}**\u{ff1a}`COMPRESSION_ALGORITHMS` \u{538b}\u{7f29}\u{5c42}\u{7edf}\u{4e00}\u{4f7f}\u{7528}\u{8d28}\u{91cf} 6\u{ff0c}brotli \u{6bd4} gzip-6 \u{5c0f} 10\u{2013}17%\u{ff08}tower-http \u{9ed8}\u{8ba4} brotli 4 \u{4ec5}\u{5c0f} 2\u{2013}4%\u{ff09}\u{ff1b}\u{751f}\u{4ea7}\u{63a8}\u{8350} `br, gzip`\u{ff0c}`all` \u{4f1a}\u{8ba9} Chrome \u{534f}\u{5546}\u{5230}\u{4f53}\u{79ef}\u{66f4}\u{5927}\u{7684} zstd\u{3002}\n\n### Fixed\n\n- **\u{8ba2}\u{9605}\u{6e90}\u{538b}\u{7f29}**\u{ff1a}`/feed.xml` \u{4e0e} `/feed.json` \u{6302}\u{5230}\u{538b}\u{7f29}\u{5c42}\u{ff0c}\u{4fee}\u{590d}\u{542b}\u{5168}\u{6587}\u{7684} Feed\u{ff08}\u{7ebf}\u{4e0a}\u{7ea6} 2.5 MB / 1.9 MB\u{ff09}\u{672a}\u{7ecf}\u{4efb}\u{4f55}\u{538b}\u{7f29}\u{4f20}\u{8f93}\u{7684}\u{95ee}\u{9898}\u{3002}\n\n## [0.23.2] - 2026-10-19\n\n### Changed\n\n- **\u{516c}\u{5f00}\u{6587}\u{7ae0}\u{4f20}\u{8f93}**\u{ff1a}\u{9605}\u{8bfb}\u{9875}\u{4f7f}\u{7528}\u{72ec}\u{7acb}\u{7684}\u{8f7b}\u{91cf}\u{54cd}\u{5e94}\u{ff0c}\u{4e0d}\u{518d}\u{91cd}\u{590d}\u{643a}\u{5e26}\u{539f}\u{59cb} Markdown\u{ff1b}\u{540e}\u{53f0}\u{7f16}\u{8f91}\u{3001}\u{9884}\u{89c8}\u{53ca}\u{539f}\u{6709}\u{5b8c}\u{6574}\u{63a5}\u{53e3}\u{4fdd}\u{6301}\u{517c}\u{5bb9}\u{3002}\n- **\u{8bc4}\u{8bba}\u{7f16}\u{8f91}\u{5668}**\u{ff1a}\u{9876}\u{5c42}\u{8bc4}\u{8bba}\u{6846}\u{63a5}\u{8fd1}\u{89c6}\u{53e3}\u{6216}\u{83b7}\u{5f97}\u{64cd}\u{4f5c}\u{7126}\u{70b9}\u{540e}\u{624d}\u{52a0}\u{8f7d} Tiptap\u{ff0c}\u{51cf}\u{5c11}\u{6587}\u{7ae0}\u{9996}\u{8bbf}\u{8d44}\u{6e90}\u{ff1b}\u{56de}\u{590d}\u{8868}\u{5355}\u{4ecd}\u{5728}\u{6253}\u{5f00}\u{65f6}\u{52a0}\u{8f7d}\u{3002}\n- **\u{516c}\u{5f00}\u{9875}\u{7f13}\u{5b58}**\u{ff1a}\u{91c7}\u{7528}\u{6700}\u{591a} 32 MiB \u{7684}\u{8fdb}\u{7a0b}\u{5185} HTML \u{7f13}\u{5b58}\u{ff0c}\u{9ed8}\u{8ba4} TTL 60 \u{79d2}\u{ff0c}\u{652f}\u{6301} ETag/304\u{ff1b}\u{8ba4}\u{8bc1}\u{8bf7}\u{6c42}\u{3001}\u{7b14}\u{8bb0}\u{3001}\u{67e5}\u{8be2}\u{53c2}\u{6570}\u{548c}\u{4e0d}\u{53ef}\u{7f13}\u{5b58}\u{54cd}\u{5e94}\u{4e0d}\u{8fdb}\u{5165}\u{5171}\u{4eab}\u{7f13}\u{5b58}\u{3002}\n- **\u{53cc}\u{673a}\u{7f13}\u{5b58}\u{540c}\u{6b65}**\u{ff1a}\u{65b0}\u{589e}\u{5185}\u{5bb9}\u{7248}\u{672c}\u{4e0e}\u{4e8b}\u{52a1}\u{63d0}\u{4ea4}\u{901a}\u{77e5}\u{ff1b}\u{5404}\u{5b9e}\u{4f8b}\u{901a}\u{8fc7} PostgreSQL LISTEN/NOTIFY \u{5931}\u{6548}\u{6d3e}\u{751f}\u{6570}\u{636e}\u{ff0c}\u{6bcf} 5 \u{79d2}\u{6838}\u{5bf9}\u{6301}\u{4e45}\u{5316}\u{7248}\u{672c}\u{5e76}\u{5728}\u{65ad}\u{7ebf}\u{91cd}\u{8fde}\u{540e}\u{8865}\u{507f}\u{66f4}\u{65b0}\u{3002}\n- **\u{6027}\u{80fd}\u{56de}\u{5f52}**\u{ff1a}\u{65b0}\u{589e}\u{53cc}\u{5b9e}\u{4f8b}\u{6570}\u{636e}\u{5e93}\u{53ca}\u{6d4f}\u{89c8}\u{5668}\u{9a8c}\u{6536}\u{ff0c}\u{8986}\u{76d6}\u{4e8b}\u{52a1}\u{56de}\u{6eda}\u{3001}\u{901a}\u{77e5}\u{65ad}\u{7ebf}\u{3001}\u{7f13}\u{5b58}\u{5931}\u{6548}\u{3001}\u{5f52}\u{6863}\u{5206}\u{9875}\u{548c}\u{8bc4}\u{8bba}\u{5ef6}\u{8fdf}\u{52a0}\u{8f7d}\u{ff0c}\u{5e76}\u{63a5}\u{5165} CI\u{3002}\n\n### Fixed\n\n- **\u{5f52}\u{6863}\u{5b8c}\u{6574}\u{6027}**\u{ff1a}\u{6539}\u{7528}\u{6bcf}\u{9875} 100 \u{6761}\u{7684}\u{8f7b}\u{91cf}\u{5f52}\u{6863}\u{63a5}\u{53e3}\u{ff0c}\u{53ef}\u{7ee7}\u{7eed}\u{52a0}\u{8f7d}\u{66f4}\u{65e9}\u{6587}\u{7ae0}\u{ff0c}\u{4fee}\u{590d}\u{539f}\u{63a5}\u{53e3}\u{6700}\u{591a}\u{8fd4}\u{56de} 50 \u{6761}\u{5bfc}\u{81f4}\u{7684}\u{9057}\u{6f0f}\u{3002}\n- **SSR \u{7f13}\u{5b58}**\u{ff1a}\u{6d88}\u{9664}\u{975e} root \u{5bb9}\u{5668}\u{65e0}\u{6cd5}\u{5199}\u{5165} `/app/static` \u{5bfc}\u{81f4}\u{7f13}\u{5b58}\u{9759}\u{9ed8}\u{5931}\u{6548}\u{7684}\u{95ee}\u{9898}\u{ff1b}\u{5199}\u{5165}\u{540e}\u{771f}\u{6b63}\u{6e05}\u{9664}\u{5185}\u{5b58}\u{5feb}\u{7167}\u{ff0c}\u{5e76}\u{963b}\u{6b62}\u{65e7}\u{4e16}\u{4ee3}\u{7684}\u{5728}\u{9014}\u{54cd}\u{5e94}\u{56de}\u{586b}\u{3002}\n- **\u{540e}\u{53f0}\u{72b6}\u{6001}**\u{ff1a}\u{4fee}\u{590d}\u{5907}\u{4efd}\u{5237}\u{65b0}\u{540e}\u{65e7}\u{9519}\u{8bef}\u{6b8b}\u{7559}\u{ff0c}\u{4ee5}\u{53ca}\u{7b14}\u{8bb0}\u{7c7b}\u{578b}\u{5207}\u{6362}\u{65f6}\u{95ea}\u{56de}\u{9aa8}\u{67b6}\u{5c4f}\u{7684}\u{95ee}\u{9898}\u{3002}\n- **\u{7f16}\u{8f91}\u{5668}\u{5f39}\u{7a97}**\u{ff1a}\u{540c}\u{6b65}\u{6062}\u{590d}\u{7f16}\u{8f91}\u{5668}\u{7126}\u{70b9}\u{ff0c}\u{907f}\u{514d}\u{5feb}\u{901f}\u{91cd}\u{5f00}\u{53ef}\u{8fd0}\u{884c}\u{4ee3}\u{7801}\u{914d}\u{7f6e}\u{6846}\u{65f6}\u{88ab}\u{65e7}\u{7684}\u{5ef6}\u{8fdf}\u{7126}\u{70b9}\u{4efb}\u{52a1}\u{62a2}\u{8d70}\u{952e}\u{76d8}\u{8f93}\u{5165}\u{3002}\n- **MCP \u{5de5}\u{5177} schema**\u{ff1a}\u{96f6}\u{53c2}\u{6570}\u{5de5}\u{5177}\u{663e}\u{5f0f}\u{58f0}\u{660e} `properties`\u{ff0c}\u{4fee}\u{590d} OpenAI \u{517c}\u{5bb9}\u{4e0a}\u{6e38}\u{ff08}\u{5982} MCA\u{ff09}\u{56e0}\u{5de5}\u{5177} schema \u{975e}\u{6cd5}\u{800c}\u{62d2}\u{7edd}\u{6574}\u{4e2a}\u{8bf7}\u{6c42}\u{7684}\u{95ee}\u{9898}\u{3002}\n- **\u{6301}\u{7eed}\u{96c6}\u{6210}**\u{ff1a}\u{771f}\u{5b9e}\u{6570}\u{636e}\u{5e93}\u{56de}\u{5f52}\u{56fa}\u{5b9a}\u{5728} GitHub-hosted runner \u{8fd0}\u{884c}\u{ff0c}\u{4fee}\u{590d} self-hosted runner \u{65e0}\u{6cd5}\u{4f7f}\u{7528} sudo \u{5b89}\u{88c5} PostgreSQL \u{5ba2}\u{6237}\u{7aef}\u{800c}\u{963b}\u{65ad}\u{53d1}\u{5e03}\u{7684}\u{95ee}\u{9898}\u{3002}\n\n## [0.23.1] - 2026-10-12\n\n### Changed\n\n- **\u{6587}\u{7ae0}\u{5199}\u{5165}\u{6821}\u{9a8c}**\u{ff1a}\u{540e}\u{53f0}\u{4e0e} MCP \u{7edf}\u{4e00}\u{4f7f}\u{7528}\u{540c}\u{4e00}\u{4e8b}\u{52a1}\u{548c}\u{4e1a}\u{52a1}\u{6821}\u{9a8c}\u{ff0c}\u{4fdd}\u{6301}\u{6587}\u{7ae0}\u{521b}\u{5efa}\u{3001}\u{66f4}\u{65b0}\u{4e0e}\u{56de}\u{6536}\u{7ad9}\u{64cd}\u{4f5c}\u{89c4}\u{5219}\u{4e00}\u{81f4}\u{3002}\n- **\u{540e}\u{53f0}\u{4e0e}\u{524d}\u{7aef}\u{6a21}\u{5757}**\u{ff1a}\u{6309}\u{804c}\u{8d23}\u{62c6}\u{5206}\u{5907}\u{4efd}\u{6062}\u{590d}\u{3001}\u{540e}\u{53f0}\u{9875}\u{9762}\u{3001}\u{516c}\u{5171}\u{754c}\u{9762}\u{7ec4}\u{4ef6}\u{548c}\u{706f}\u{7bb1}\u{5e93}\u{ff0c}\u{8865}\u{5145}\u{67b6}\u{6784}\u{8fb9}\u{754c}\u{8bf4}\u{660e}\u{3002}\n- **\u{6301}\u{7eed}\u{96c6}\u{6210}**\u{ff1a}\u{4e25}\u{683c}\u{6267}\u{884c}\u{524d}\u{7aef}\u{4e0e} WASM \u{68c0}\u{67e5}\u{ff0c}\u{5e76}\u{7eb3}\u{5165}\u{6587}\u{7ae0}\u{6570}\u{636e}\u{5e93}\u{56de}\u{5f52}\u{3002}\n\n### Fixed\n\n- **\u{7f16}\u{8f91}\u{5668}\u{5e03}\u{5c40}**\u{ff1a}\u{5206}\u{79bb}\u{7f16}\u{8f91}\u{5668}\u{751f}\u{547d}\u{5468}\u{671f}\u{4e0e}\u{4fdd}\u{5b58}\u{72b6}\u{6001}\u{ff0c}\u{4fee}\u{590d}\u{7a84}\u{5c4f}\u{5e03}\u{5c40}\u{95ee}\u{9898}\u{3002}\n- **\u{56fe}\u{7247}\u{706f}\u{7bb1}**\u{ff1a}\u{4fee}\u{590d}\u{4f1a}\u{8bdd}\u{6e05}\u{7406}\u{548c}\u{5207}\u{6362}\u{56fe}\u{7247}\u{65f6}\u{7684}\u{72b6}\u{6001}\u{5904}\u{7406}\u{3002}\n\n## [0.23.0] - 2026-10-10\n\n### Changed\n\n- **\u{66f4}\u{65b0}\u{65e5}\u{5fd7}\u{5bfc}\u{822a}**\u{ff1a}\u{7248}\u{672c}\u{76ee}\u{5f55}\u{6539}\u{4e3a}\u{9ad8}\u{5ea6}\u{53d7}\u{9650}\u{7684}\u{72ec}\u{7acb}\u{6eda}\u{52a8}\u{5361}\u{7247}\u{ff0c}\u{52a0}\u{5165}\u{6ed1}\u{52a8}\u{9ad8}\u{4eae}\u{3001}\u{8fb9}\u{7f18}\u{6e10}\u{9690}\u{4e0e}\u{9605}\u{8bfb}\u{8fdb}\u{5ea6}\u{ff1b}\u{9605}\u{8bfb}\u{65f6}\u{81ea}\u{52a8}\u{4fdd}\u{6301}\u{5f53}\u{524d}\u{7248}\u{672c}\u{53ef}\u{89c1}\u{ff0c}\u{5c0f}\u{5c4f}\u{4f7f}\u{7528}\u{6a2a}\u{5411}\u{7248}\u{672c}\u{6761}\u{ff0c}\u{652f}\u{6301}\u{51cf}\u{5c11}\u{52a8}\u{6001}\u{6548}\u{679c}\u{3002}\n- **\u{5f00}\u{53d1}\u{542f}\u{52a8}**\u{ff1a}`make dev` \u{6309}\u{6e90}\u{7801}\u{3001}\u{914d}\u{7f6e}\u{53ca}\u{4f9d}\u{8d56}\u{53d8}\u{5316}\u{589e}\u{91cf}\u{6784}\u{5efa}\u{524d}\u{7aef}\u{5e93}\u{3001}\u{9ad8}\u{4eae} CSS \u{548c} KaTeX \u{8d44}\u{6e90}\u{ff0c}\u{81ea}\u{52a8}\u{8865}\u{5efa}\u{7f3a}\u{5931}\u{4ea7}\u{7269}\u{ff1b}\u{5171}\u{4eab}\u{4ee3}\u{7801}\u{53d8}\u{5316}\u{4f1a}\u{91cd}\u{5efa}\u{4f7f}\u{7528}\u{5b83}\u{7684}\u{5e93}\u{ff0c}\u{5931}\u{8d25}\u{7684}\u{6784}\u{5efa}\u{4e0d}\u{4f1a}\u{66f4}\u{65b0}\u{7f13}\u{5b58}\u{8bb0}\u{5f55}\u{3002}\u{65b0}\u{589e} `make dev-assets` \u{4e0e}\u{7f13}\u{5b58}\u{5931}\u{6548}\u{56de}\u{5f52}\u{811a}\u{672c}\u{3002}\n- **Rust \u{4f9d}\u{8d56}**\u{ff1a}\u{66f4}\u{65b0} rmcp \u{81f3} 3.5.1\u{3001}sqlparser \u{81f3} 0.63.0\u{ff0c}\u{5e76}\u{66f4}\u{65b0} Tokio\u{3001}Reqwest\u{3001}UUID\u{3001}\u{6b63}\u{5219}\u{4e0e} WASM \u{4f9d}\u{8d56}\u{ff1b}wasm-bindgen \u{5de5}\u{5177}\u{7f13}\u{5b58}\u{540c}\u{6b65}\u{81f3} 0.2.129\u{3002}\n- **\u{524d}\u{7aef}\u{4f9d}\u{8d56}**\u{ff1a}\u{66f4}\u{65b0} Tiptap \u{81f3} 3.31.4\u{3001}CodeMirror\u{3001}KaTeX 0.19.0\u{3001}Mermaid 12.1.0\u{3001}Vite\u{3001}Vitest \u{4e0e} Biome\u{ff1b}\u{6309}\u{65b0}\u{7248}\u{91cd}\u{65b0}\u{751f}\u{6210} Markdown \u{8865}\u{4e01}\u{ff0c}\u{5408}\u{5e76} CodeMirror \u{7684} state/view \u{4f9d}\u{8d56}\u{5b9e}\u{4f8b}\u{3002}Mermaid \u{663e}\u{5f0f}\u{6cbf}\u{7528} dagre \u{5e03}\u{5c40}\u{3001}classic \u{5916}\u{89c2}\u{548c}\u{73b0}\u{6709}\u{914d}\u{8272}\u{ff0c}\u{66f4}\u{65b0}\u{8d44}\u{6e90}\u{7248}\u{672c}\u{4ee5}\u{5237}\u{65b0}\u{6d4f}\u{89c8}\u{5668}\u{7f13}\u{5b58}\u{3002}\n- **\u{6784}\u{5efa}\u{5de5}\u{5177}**\u{ff1a}\u{524d}\u{7aef}\u{5305}\u{7ba1}\u{7406}\u{5728} workspace\u{3001}Makefile\u{3001}Docker \u{4e0e} CI \u{4e2d}\u{7edf}\u{4e00}\u{8fc1}\u{79fb}\u{81f3} Bun 1.4.2\u{ff0c}Docker \u{6784}\u{5efa}\u{5668}\u{4f7f}\u{7528} Rust 1.99 \u{548c} Tailwind CSS 4.3.3\u{ff1b}Makefile \u{62c6}\u{5206}\u{4e3a}\u{5165}\u{53e3}\u{4e0e}\u{8d44}\u{6e90}\u{3001}\u{5de5}\u{5177}\u{7f13}\u{5b58}\u{3001}Docker \u{6a21}\u{5757}\u{ff0c}\u{9ed8}\u{8ba4}\u{663e}\u{793a}\u{76ee}\u{6807}\u{5e2e}\u{52a9}\u{ff0c}\u{5e76}\u{7edf}\u{4e00}\u{53d1}\u{5e03}\u{8d44}\u{6e90}\u{6d41}\u{6c34}\u{7ebf}\u{4e0e}\u{5de5}\u{5177}\u{68c0}\u{67e5}\u{3002}\n\n### Fixed\n\n- **\u{9996}\u{9875}\u{5f00}\u{59cb}\u{9605}\u{8bfb}**\u{ff1a}\u{4fee}\u{590d}\u{5e73}\u{6ed1}\u{6eda}\u{52a8}\u{88ab}\u{8def}\u{7531}\u{6062}\u{590d}\u{6253}\u{65ad}\u{53ca}\u{91cd}\u{590d}\u{70b9}\u{51fb}\u{5931}\u{6548}\u{7684}\u{95ee}\u{9898}\u{ff0c}\u{540c}\u{9875}\u{951a}\u{70b9}\u{4fdd}\u{6301}\u{5f53}\u{524d}\u{6587}\u{6863}\u{4e0e}\u{5386}\u{53f2}\u{8bb0}\u{5f55}\u{ff0c}\u{9002}\u{914d}\u{952e}\u{76d8}\u{64cd}\u{4f5c}\u{3001}\u{624b}\u{673a}\u{548c}\u{51cf}\u{5c11}\u{52a8}\u{6001}\u{6548}\u{679c}\u{3002}\n- **WASM \u{53d1}\u{5e03}\u{6784}\u{5efa}**\u{ff1a}\u{663e}\u{5f0f}\u{7981}\u{6b62}\u{5728} wasm-bindgen \u{8fd0}\u{884c}\u{524d}\u{5265}\u{79bb} WASM \u{81ea}\u{5b9a}\u{4e49}\u{6bb5}\u{ff0c}\u{4fee}\u{590d} Rust 1.99\u{ff0f}LLVM 23 \u{4e0b}\u{7ee7}\u{627f} `strip = \"symbols\"` \u{5bfc}\u{81f4}\u{7ed1}\u{5b9a}\u{5143}\u{6570}\u{636e}\u{4e22}\u{5931}\u{7684}\u{95ee}\u{9898}\u{ff1b}\u{65b0}\u{589e}\u{6700}\u{5c0f}\u{5bfc}\u{51fa}\u{56de}\u{5f52}\u{811a}\u{672c}\u{3002}wasm-bindgen \u{7f13}\u{5b58}\u{4e0b}\u{8f7d}\u{5931}\u{8d25}\u{65f6}\u{7acb}\u{5373}\u{505c}\u{6b62}\u{ff0c}\u{907f}\u{514d}\u{8bef}\u{62a5}\u{5b89}\u{88c5}\u{6210}\u{529f}\u{3002}\n\n## [0.22.0] - 2026-09-28\n\n### Added\n\n- **\u{7ec4}\u{4ef6}\u{56fe}\u{9274}**\u{ff1a}\u{65b0}\u{589e} `/about/components` \u{548c}\u{7ec4}\u{4ef6}\u{72ec}\u{7acb}\u{8be6}\u{60c5}\u{9875}\u{ff0c}\u{6536}\u{5f55} 83 \u{4e2a}\u{7ec4}\u{4ef6}\u{ff1b}\u{652f}\u{6301}\u{5206}\u{7c7b}\u{4e0e}\u{641c}\u{7d22}\u{ff0c}\u{5c55}\u{793a}\u{5c5e}\u{6027}\u{3001}\u{6e90}\u{7801}\u{4f4d}\u{7f6e}\u{4e0e}\u{9ad8}\u{4eae}\u{7528}\u{6cd5}\u{ff0c}\u{4ece}\u{5173}\u{4e8e}\u{9875}\u{53ef}\u{76f4}\u{63a5}\u{8fdb}\u{5165}\u{3002}\n- **\u{771f}\u{5b9e}\u{7ec4}\u{4ef6}\u{9884}\u{89c8}**\u{ff1a}\u{56fe}\u{9274}\u{590d}\u{7528}\u{6b63}\u{5f0f}\u{9875}\u{9762}\u{7684}\u{7ec4}\u{4ef6}\u{ff0c}\u{63d0}\u{4f9b}\u{7d20}\u{6750}\u{5f39}\u{7a97}\u{3001}\u{8bc4}\u{8bba}\u{3001}\u{6587}\u{7ae0}\u{76ee}\u{5f55}\u{3001}\u{7f16}\u{8f91}\u{5668}\u{3001}\u{7ec8}\u{7aef}\u{548c}\u{706f}\u{7bb1}\u{7b49}\u{4ea4}\u{4e92}\u{6f14}\u{793a}\u{ff0c}\u{652f}\u{6301}\u{6062}\u{590d}\u{9ed8}\u{8ba4}\u{72b6}\u{6001}\u{ff1b}\u{4e1a}\u{52a1}\u{6837}\u{4f8b}\u{4f7f}\u{7528}\u{56fa}\u{5b9a}\u{8d44}\u{6599}\u{4e0e}\u{5c40}\u{90e8}\u{72b6}\u{6001}\u{3002}\n\n### Changed\n\n- **\u{56fe}\u{9274}\u{5e03}\u{5c40}\u{4e0e}\u{6d4f}\u{89c8}**\u{ff1a}\u{91c7}\u{7528}\u{81ea}\u{7136}\u{9ad8}\u{5ea6}\u{7684}\u{7011}\u{5e03}\u{6d41}\u{5361}\u{7247}\u{ff0c}\u{652f}\u{6301}\u{6574}\u{5361}\u{8fdb}\u{5165}\u{8be6}\u{60c5}\u{3001}\u{8fd4}\u{56de}\u{540e}\u{6062}\u{590d}\u{7b5b}\u{9009}\u{4e0e}\u{6eda}\u{52a8}\u{4f4d}\u{7f6e}\u{ff0c}\u{5e76}\u{5b8c}\u{5584}\u{624b}\u{673a}\u{3001}\u{660e}\u{6697}\u{4e3b}\u{9898}\u{548c}\u{51cf}\u{5c11}\u{52a8}\u{6001}\u{6548}\u{679c}\u{4e0b}\u{7684}\u{5c55}\u{793a}\u{3002}\n- **\u{6587}\u{7ae0}\u{9605}\u{8bfb}\u{754c}\u{9762}**\u{ff1a}\u{4f18}\u{5316}\u{6587}\u{7ae0}\u{9875}\u{5934}\u{3001}\u{5143}\u{4fe1}\u{606f}\u{3001}\u{6807}\u{7b7e}\u{4e0e}\u{76f8}\u{90bb}\u{6587}\u{7ae0}\u{5bfc}\u{822a}\u{7684}\u{6392}\u{7248}\u{ff0c}\u{540c}\u{6b65}\u{5b8c}\u{5584}\u{9762}\u{5305}\u{5c51}\u{3001}\u{8bc4}\u{8bba}\u{548c}\u{9875}\u{9762}\u{5e03}\u{5c40}\u{7684}\u{56fe}\u{9274}\u{6837}\u{4f8b}\u{3002}\n- **\u{7b14}\u{8bb0}\u{7ba1}\u{7406}**\u{ff1a}\u{641c}\u{7d22}\u{6846}\u{7edf}\u{4e00}\u{4f7f}\u{7528}\u{516c}\u{5171}\u{8f93}\u{5165}\u{7ec4}\u{4ef6}\u{ff0c}\u{8865}\u{5145}\u{6e05}\u{9664}\u{7b5b}\u{9009}\u{64cd}\u{4f5c}\u{ff0c}\u{6539}\u{5584}\u{5feb}\u{901f}\u{8bb0}\u{5f55}\u{7684}\u{805a}\u{7126}\u{53cd}\u{9988}\u{ff1b}\u{7b14}\u{8bb0}\u{672c}\u{76ee}\u{5f55}\u{7f16}\u{6392}\u{9762}\u{677f}\u{589e}\u{52a0}\u{6298}\u{53e0}\u{5c55}\u{5f00}\u{52a8}\u{6548}\u{3002}\n- **\u{7a7a}\u{72b6}\u{6001}\u{63d2}\u{753b}**\u{ff1a}\u{7a7a}\u{5217}\u{8868}\u{9ed8}\u{8ba4}\u{4ece} 18 \u{5f20}\u{5c0f}\u{72d7}\u{63d2}\u{753b}\u{4e2d}\u{968f}\u{673a}\u{9009}\u{62e9}\u{ff0c}\u{4fdd}\u{7559}\u{81ea}\u{5b9a}\u{4e49}\u{914d}\u{56fe}\u{4e0e}\u{884c}\u{52a8}\u{6309}\u{94ae}\u{3002}\n- **\u{6837}\u{5f0f}\u{6784}\u{5efa}**\u{ff1a}Tailwind \u{6837}\u{5f0f}\u{6539}\u{4e3a}\u{5728}\u{5f00}\u{53d1}\u{548c}\u{53d1}\u{5e03}\u{6784}\u{5efa}\u{65f6}\u{751f}\u{6210}\u{ff0c}\u{4e0d}\u{518d}\u{8ddf}\u{8e2a}\u{751f}\u{6210}\u{7684} `public/style.css`\u{3002}\n\n### Fixed\n\n- \u{4fee}\u{590d}\u{6d6e}\u{5c42}\u{952e}\u{76d8}\u{76d1}\u{542c}\u{548c}\u{5f39}\u{7a97}\u{7126}\u{70b9}\u{884c}\u{4e3a}\u{ff0c}\u{5b8c}\u{5584}\u{6d4f}\u{89c8}\u{5668}\u{7ec4}\u{4ef6}\u{5378}\u{8f7d}\u{540e}\u{7684}\u{6e05}\u{7406}\u{3002}\n- \u{4fee}\u{590d}\u{54cd}\u{5e94}\u{5f0f}\u{5206}\u{9875}\u{5e03}\u{5c40}\u{ff0c}\u{4ee5}\u{53ca}\u{7d20}\u{6750}\u{4e0a}\u{4f20}\u{72b6}\u{6001}\u{884c}\u{7684}\u{7a33}\u{5b9a}\u{952e}\u{672a}\u{751f}\u{6548}\u{95ee}\u{9898}\u{3002}\n\n## [0.21.1] - 2026-09-21\n\n### Changed\n\n- **MCP \u{4ee4}\u{724c}\u{7ba1}\u{7406}**\u{ff1a}\u{652f}\u{6301}\u{7f16}\u{8f91}\u{5df2}\u{7b7e}\u{53d1}\u{4ee4}\u{724c}\u{7684}\u{6743}\u{9650}\u{ff0c}\u{53ef}\u{8ffd}\u{52a0}\u{6216}\u{6536}\u{56de}\u{7b14}\u{8bb0}\u{8bfb}\u{5199}\u{6388}\u{6743}\u{ff0c}\u{5e76}\u{9650}\u{5236}\u{5230}\u{6307}\u{5b9a}\u{7b14}\u{8bb0}\u{672c}\u{ff1b}\u{4fee}\u{6539}\u{540e}\u{539f}\u{4ee4}\u{724c}\u{7ee7}\u{7eed}\u{6709}\u{6548}\u{3002}\n\n## [0.21.0] - 2026-09-21\n\n### Added\n\n- **\u{7b14}\u{8bb0}\u{4e0e}\u{77e5}\u{8bc6}\u{5e93}**\u{ff1a}\u{65b0}\u{589e} `/notes`\u{3001}`/admin/notes` \u{548c} `/admin/notebooks`\u{ff0c}\u{652f}\u{6301}\u{968f}\u{8bb0}\u{3001}\u{4e3b}\u{9898}\u{7b14}\u{8bb0}\u{3001}\u{7b14}\u{8bb0}\u{672c}\u{7f16}\u{6392}\u{3001}\u{6807}\u{7b7e}\u{641c}\u{7d22}\u{3001}\u{516c}\u{5f00}\u{72b6}\u{6001}\u{4e0e}\u{77e5}\u{8bc6}\u{5e93}\u{6536}\u{5f55}\u{72b6}\u{6001}\u{7b5b}\u{9009}\u{3002}\n- **\u{7b14}\u{8bb0}\u{7248}\u{672c}\u{5de5}\u{4f5c}\u{6d41}**\u{ff1a}\u{5de5}\u{4f5c}\u{7a3f}\u{3001}\u{516c}\u{5f00}\u{7248}\u{548c}\u{77e5}\u{8bc6}\u{5e93}\u{6536}\u{5f55}\u{7248}\u{4f7f}\u{7528}\u{72ec}\u{7acb}\u{5feb}\u{7167}\u{ff1b}\u{652f}\u{6301}\u{81ea}\u{52a8}\u{4fdd}\u{5b58}\u{3001}\u{5386}\u{53f2}\u{7248}\u{672c}\u{6062}\u{590d}\u{3001}\u{4e50}\u{89c2}\u{9501}\u{3001}\u{53d1}\u{5e03}/\u{64a4}\u{56de}\u{3001}\u{56de}\u{6536}\u{7ad9}\u{6062}\u{590d}\u{4ee5}\u{53ca}\u{7b14}\u{8bb0}\u{672c}\u{5f52}\u{6863}/\u{6062}\u{590d}\u{3002}\n- **MCP \u{7b14}\u{8bb0}\u{5de5}\u{5177}**\u{ff1a}\u{65b0}\u{589e} `search_knowledge`\u{3001}`get_note`\u{3001}`list_notebooks`\u{3001}`get_notebook`\u{3001}`create_note`\u{3001}`update_note`\u{ff1b}\u{7b14}\u{8bb0}\u{8bfb}\u{53d6}\u{548c}\u{5199}\u{5165}\u{4f7f}\u{7528}\u{72ec}\u{7acb}\u{6388}\u{6743}\u{ff0c}\u{53ef}\u{9650}\u{5236}\u{5230}\u{6307}\u{5b9a}\u{7b14}\u{8bb0}\u{672c}\u{ff0c}AI \u{5199}\u{5165}\u{53ea}\u{751f}\u{6210}\u{5de5}\u{4f5c}\u{7a3f}\u{ff0c}\u{4e0d}\u{4f1a}\u{81ea}\u{52a8}\u{53d1}\u{5e03}\u{6216}\u{6536}\u{5f55}\u{3002}\n- **\u{7b14}\u{8bb0}\u{79c1}\u{5bc6}\u{56fe}\u{7247}**\u{ff1a}\u{65b0}\u{589e}\u{53d7}\u{4fdd}\u{62a4}\u{7684} `/note-media/<uuid>` \u{5b58}\u{50a8}\u{4e0e}\u{9274}\u{6743}\u{ff0c}\u{5355}\u{56fe}\u{9650}\u{5236} 5 MiB\u{ff0c}\u{5e76}\u{4fdd}\u{62a4}\u{5386}\u{53f2}\u{7248}\u{672c}\u{3001}\u{56de}\u{6536}\u{7ad9}\u{548c}\u{7d20}\u{6750}\u{5f15}\u{7528}\u{4e0d}\u{88ab}\u{8bef}\u{5220}\u{3002}\n\n### Changed\n\n- **\u{7f16}\u{8f91}\u{4f53}\u{9a8c}**\u{ff1a}\u{5feb}\u{901f}\u{8bb0}\u{5f55}\u{4e0e}\u{7b14}\u{8bb0}\u{7f16}\u{8f91}\u{5668}\u{589e}\u{52a0}\u{6807}\u{7b7e}\u{9875}\u{6062}\u{590d}\u{526f}\u{672c}\u{3001}\u{672a}\u{4fdd}\u{5b58}\u{79bb}\u{5f00}\u{4fdd}\u{62a4}\u{548c}\u{4fdd}\u{5b58}\u{671f}\u{95f4}\u{8f93}\u{5165}\u{4fdd}\u{62a4}\u{3002}\n- **MCP \u{4ee4}\u{724c}\u{7ba1}\u{7406}**\u{ff1a}\u{589e}\u{52a0}\u{7b14}\u{8bb0}\u{6388}\u{6743}\u{8868}\u{5355}\u{7684}\u{5fc5}\u{586b}\u{6821}\u{9a8c}\u{3001}\u{9519}\u{8bef}\u{63d0}\u{793a}\u{548c}\u{5931}\u{8d25}\u{540e}\u{81ea}\u{52a8}\u{805a}\u{7126}\u{3002}\n\n### Fixed\n\n- \u{7edf}\u{4e00}\u{7b14}\u{8bb0}\u{7b5b}\u{9009}\u{5668}\u{3001}\u{7b14}\u{8bb0}\u{672c}\u{4e0e}\u{7f16}\u{8f91}\u{5668}\u{9009}\u{62e9}\u{63a7}\u{4ef6}\u{53ca}\u{7f16}\u{8f91}\u{9875}\u{4fa7}\u{680f}\u{6837}\u{5f0f}\u{3002}\n- \u{8865}\u{9f50} `rua` \u{90e8}\u{7f72}\u{6240}\u{9700}\u{7684}\u{4ee3}\u{7801}\u{8fd0}\u{884c}\u{5668}\u{955c}\u{50cf}\u{62c9}\u{53d6}\u{4e0e}\u{5b8c}\u{6574}\u{6027}\u{6821}\u{9a8c}\u{ff1b}\u{955c}\u{50cf}\u{7f3a}\u{5931}\u{65f6}\u{963b}\u{6b62}\u{5e94}\u{7528}\u{91cd}\u{542f}\u{3002}\n\n## [0.20.2] - 2026-09-16\n\n### Added\n\n- **MCP \u{8349}\u{7a3f}\u{4e0e}\u{56de}\u{6536}\u{7ad9}\u{5de5}\u{5177}**\u{ff1a}\u{65b0}\u{589e} `list_posts`\u{ff08}\u{6309} `status` \u{67e5}\u{8be2}\u{8349}\u{7a3f}\u{ff0c}\u{652f}\u{6301}\u{6807}\u{9898} `query`\u{ff09}\u{3001}`get_post_by_id`\u{ff08}\u{8bfb}\u{53d6}\u{5b8c}\u{6574}\u{7f16}\u{8f91}\u{5185}\u{5bb9}\u{53ca} `updated_at`\u{ff09}\u{3001}`list_trashed_posts`\u{3001}`restore_post`\u{ff08}\u{6062}\u{590d}\u{4fdd}\u{7559}\u{539f}\u{53d1}\u{5e03}\u{72b6}\u{6001}\u{ff0c}slug \u{51b2}\u{7a81}\u{81ea}\u{52a8}\u{8ffd}\u{52a0}\u{540e}\u{7f00}\u{ff09}\u{ff1b}\u{5747}\u{9700} `write`/`admin` \u{4ee4}\u{724c}\u{4e14}\u{4ec5}\u{8bbf}\u{95ee}\u{4ee4}\u{724c}\u{7528}\u{6237}\u{81ea}\u{5df1}\u{7684}\u{6587}\u{7ae0}\u{ff0c}\u{516c}\u{5f00}\u{7684} `search_posts`/`get_post` \u{884c}\u{4e3a}\u{4e0d}\u{53d8}\u{3002}\n- **MCP \u{6587}\u{7ae0}\u{66f4}\u{65b0}\u{4e50}\u{89c2}\u{9501}**\u{ff1a}`update_post` \u{652f}\u{6301}\u{643a}\u{5e26} `expected_updated_at` \u{505a}\u{7248}\u{672c}\u{51b2}\u{7a81}\u{68c0}\u{6d4b}\u{ff0c}\u{7248}\u{672c}\u{4e0d}\u{5339}\u{914d}\u{8fd4}\u{56de} `conflict` \u{53ca}\u{5f53}\u{524d}\u{7248}\u{672c}\u{4e14}\u{4e0d}\u{5199}\u{5165}\u{66f4}\u{6539}\u{ff1b}\u{4e0d}\u{4f20}\u{7248}\u{672c}\u{4fdd}\u{7559}\u{539f}\u{6709}\u{884c}\u{4e3a}\u{3002}\n- **MCP \u{7d20}\u{6750}\u{7ba1}\u{7406}\u{5de5}\u{5177}**\u{ff1a}\u{65b0}\u{589e} `list_assets`\u{3001}`update_asset_alt`\u{3001}`delete_asset`\u{3001}`batch_delete_assets`\u{3001}`purge_orphan_assets`\u{3001}`rebuild_assets_index`\u{ff08}\u{5747}\u{9700} `admin` \u{4ee4}\u{724c}\u{ff09}\u{ff0c}\u{4e0e}\u{540e}\u{53f0}\u{5171}\u{7528}\u{5f15}\u{7528}\u{4fdd}\u{62a4}\u{ff0c}\u{8349}\u{7a3f}\u{53ca}\u{56de}\u{6536}\u{7ad9}\u{6587}\u{7ae0}\u{5f15}\u{7528}\u{540c}\u{6837}\u{53d7}\u{4fdd}\u{62a4}\u{3002}\n- **MCP \u{4e0a}\u{4f20}\u{8fd4}\u{56de}\u{7d20}\u{6750} ID**\u{ff1a}`upload_media` \u{4e0e}\u{672c}\u{5730} multipart \u{4e0a}\u{4f20}\u{901a}\u{9053}\u{7edf}\u{4e00}\u{8fd4}\u{56de} `asset_id`/`alt`/`url`/\u{5c3a}\u{5bf8}/\u{6700}\u{7ec8} MIME/`reused`\u{ff1b}`alt` \u{6301}\u{4e45}\u{5316}\u{5230}\u{7d20}\u{6750}\u{5e93}\u{ff0c}\u{91cd}\u{590d}\u{4e0a}\u{4f20}\u{6309}\u{5185}\u{5bb9}\u{53bb}\u{91cd}\u{8fd4}\u{56de}\u{76f8}\u{540c}\u{7d20}\u{6750} ID\u{3002}\n- **Agent \u{5199}\u{4f5c}\u{6307}\u{5357}\u{9875}\u{9762}**\u{ff1a}\u{5173}\u{4e8e}\u{9875}\u{65b0}\u{589e}\u{5165}\u{53e3}\u{5361}\u{7247}\u{ff0c}\u{65b0}\u{589e} `/about/writing` \u{9875}\u{9762}\u{5c55}\u{793a}\u{5199}\u{4f5c} skill \u{8bf4}\u{660e}\u{3001}\u{5b89}\u{88c5}\u{6b65}\u{9aa4}\u{4e0e} MCP \u{5ba2}\u{6237}\u{7aef}\u{914d}\u{7f6e}\u{ff0c}\u{65b0}\u{589e} `public/skills/yggdrasil-writing/SKILL.md` \u{4f9b} Agent \u{76f4}\u{63a5}\u{5b89}\u{88c5}\u{3002}\n\n## [0.20.1] - 2026-09-15\n\n### Added\n\n- **Codex MCP \u{63a5}\u{5165}\u{914d}\u{7f6e}**\u{ff1a}MCP \u{4ee4}\u{724c}\u{9875}\u{9762}\u{65b0}\u{589e}\u{53ef}\u{76f4}\u{63a5}\u{590d}\u{5236}\u{7684} Codex TOML \u{914d}\u{7f6e}\u{ff0c}\u{652f}\u{6301}\u{7528}\u{6237}\u{7ea7}\u{6216}\u{9879}\u{76ee}\u{7ea7} `config.toml` \u{901a}\u{8fc7} Bearer Token \u{8fde}\u{63a5}\u{7ad9}\u{70b9} MCP \u{670d}\u{52a1}\u{3002}\n- **\u{540e}\u{53f0}\u{5355}\u{9009}\u{6846}\u{7ec4}\u{4ef6}**\u{ff1a}\u{65b0}\u{589e}\u{4e3b}\u{9898}\u{5316}\u{539f}\u{751f} Radio \u{7ec4}\u{4ef6}\u{ff0c}\u{4fdd}\u{7559}\u{952e}\u{76d8}\u{3001}\u{4e92}\u{65a5}\u{4e0e}\u{8868}\u{5355}\u{8bed}\u{4e49}\u{ff1b}\u{6570}\u{636e}\u{5bfc}\u{51fa}\u{9875}\u{7684}\u{5bfc}\u{51fa}\u{6a21}\u{5f0f}\u{5207}\u{6362}\u{6539}\u{7528}\u{8be5}\u{7ec4}\u{4ef6}\u{3002}\n\n## [0.20.0] - 2026-09-09\n\n### Added\n\n- **\u{5168}\u{7ad9}\u{89c6}\u{56fe}\u{8fc7}\u{6e21}\u{4e0e}\u{53cc}\u{5411}\u{72b6}\u{6001}\u{6062}\u{590d}**\u{ff1a}\u{5f15}\u{5165}\u{539f}\u{751f} View Transitions API\u{ff0c}\u{5b9e}\u{73b0}\u{524d}\u{53f0}\u{8de8}\u{9875}\u{9762}\u{5e73}\u{6ed1}\u{89c6}\u{56fe}\u{8fc7}\u{6e21}\u{ff1b}\u{9876}\u{680f}\u{5bfc}\u{822a}\u{652f}\u{6301}\u{680f}\u{76ee}\u{5e73}\u{79fb}\u{5207}\u{6362}\u{52a8}\u{6548}\u{4e0e}\u{4e0b}\u{5212}\u{7ebf}\u{5171}\u{4eab}\u{8fc7}\u{6e21}\u{ff1b}\u{5b9e}\u{73b0}\u{6587}\u{7ae0}\u{5217}\u{8868}\u{4e0e}\u{6587}\u{7ae0}\u{8be6}\u{60c5}\u{9875}\u{7684}\u{53cc}\u{5411}\u{6eda}\u{52a8}\u{4f4d}\u{7f6e}\u{4e0e}\u{6d4f}\u{89c8}\u{72b6}\u{6001}\u{7cbe}\u{786e}\u{6062}\u{590d}\u{ff0c}\u{9694}\u{79bb}\u{4e3b}\u{9898}\u{5207}\u{6362}\u{52a8}\u{753b}\u{5e76}\u{534f}\u{8c03}\u{8fc7}\u{6e21}\u{4e2d}\u{65ad}\u{3002}\n- **\u{524d}\u{53f0}\u{516c}\u{5171}\u{9875}\u{9762}\u{91cd}\u{6784}**\u{ff1a}\n  - **\u{6570}\u{5b57}\u{82b1}\u{56ed}\u{9996}\u{9875}**\u{ff1a}\u{5168}\u{65b0}\u{8bbe}\u{8ba1}\u{9996}\u{9875}\u{6587}\u{7ae0}\u{6d41}\u{4e0e}\u{5361}\u{7247}\u{5c42}\u{6b21}\u{3001}\u{5217}\u{8868}\u{60ac}\u{505c}\u{4e0e}\u{8fdb}\u{5165}\u{52a8}\u{6548}\u{ff0c}\u{91cd}\u{8bbe}\u{8ba1}\u{9519}\u{8bef}\u{6001}\u{4e0e}\u{91cd}\u{8bd5}\u{4ea4}\u{4e92}\u{53cd}\u{9988}\u{3002}\n  - **\u{5f52}\u{6863}\u{65f6}\u{95f4}\u{7ebf}\u{4e0e}\u{6807}\u{7b7e}\u{5408}\u{5e76}**\u{ff1a}\u{91cd}\u{8bbe}\u{8ba1}\u{5f52}\u{6863}\u{65f6}\u{95f4}\u{7ebf}\u{4e0e}\u{54cd}\u{5e94}\u{5f0f}\u{9605}\u{8bfb}\u{5c42}\u{6b21}\u{ff1b}\u{9876}\u{90e8}\u{65b0}\u{589e}\u{9ed8}\u{8ba4}\u{6298}\u{53e0}\u{7684}\u{6807}\u{7b7e}\u{7d22}\u{5f15}\u{ff0c}\u{652f}\u{6301}\u{5e73}\u{6ed1}\u{6298}\u{53e0}\u{3001}\u{6807}\u{7b7e}\u{9519}\u{5cf0}\u{663e}\u{9690}\u{4e0e}\u{60ac}\u{505c}\u{53cd}\u{9988}\u{ff1b}\u{65e7} `/tags` \u{5730}\u{5740}\u{6c38}\u{4e45}\u{91cd}\u{5b9a}\u{5411}\u{81f3} `/archives`\u{3002}\n  - **\u{641c}\u{7d22}\u{7d22}\u{5f15}\u{4e0e}\u{4ea4}\u{4e92}**\u{ff1a}\u{91cd}\u{8bbe}\u{8ba1}\u{6587}\u{5b57}\u{7d22}\u{5f15}\u{5c55}\u{793a}\u{ff0c}\u{652f}\u{6301}\u{9632}\u{6296}\u{81ea}\u{52a8}\u{641c}\u{7d22}\u{3001}\u{4e2d}\u{6587}\u{8f93}\u{5165}\u{6cd5}\u{4fdd}\u{62a4}\u{4e0e}\u{5b9e}\u{65f6}\u{9ad8}\u{4eae}\u{3002}\n  - **\u{82b1}\u{56ed}\u{520a}\u{7269}\u{4e13}\u{9898}**\u{ff1a}\u{91cd}\u{8bbe}\u{8ba1}\u{6807}\u{7b7e}\u{520a}\u{7269}\u{4e13}\u{9898}\u{9875}\u{9762}\u{ff08}`/tags/:slug`\u{ff09}\u{53ca}\u{54cd}\u{5e94}\u{5f0f}\u{6392}\u{7248}\u{4e0e}\u{4ea4}\u{4e92}\u{52a8}\u{6548}\u{3002}\n  - **\u{53cb}\u{94fe}\u{540d}\u{7247}\u{4e0e}\u{4e16}\u{754c}\u{6811}\u{5173}\u{4e8e}\u{9875}**\u{ff1a}\u{91cd}\u{8bbe}\u{8ba1}\u{53cb}\u{94fe}\u{540d}\u{7247}\u{60ac}\u{505c}\u{53cd}\u{9988}\u{4e0e}\u{5934}\u{50cf}\u{52a0}\u{8f7d}\u{52a8}\u{6548}\u{ff0c}\u{91cd}\u{6784}\u{5173}\u{4e8e}\u{9875}\u{8bbe}\u{8ba1}\u{4e0e}\u{6392}\u{7248}\u{3002}\n- **\u{524d}\u{7aef}\u{5e93}\u{6309}\u{9700}\u{52a0}\u{8f7d}**\u{ff1a}CodeMirror \u{7f16}\u{8f91}\u{5668}\u{3001}Tiptap \u{5bcc}\u{6587}\u{672c}\u{3001}Mermaid \u{6d41}\u{7a0b}\u{56fe}\u{3001}xterm \u{7ec8}\u{7aef}\u{7b49}\u{91cd}\u{91cf}\u{7ea7}\u{524d}\u{7aef}\u{5e93}\u{6309}\u{9700}\u{52a8}\u{6001}\u{52a0}\u{8f7d}\u{ff0c}\u{91cd}\u{6784} Mermaid \u{5171}\u{4eab}\u{6e32}\u{67d3}\u{5668}\u{52a0}\u{8f7d}\u{4e0e}\u{7ade}\u{6001}\u{5904}\u{7406}\u{ff0c}\u{663e}\u{8457}\u{4f18}\u{5316}\u{9996}\u{5c4f}\u{5305}\u{4f53}\u{79ef}\u{4e0e}\u{8d44}\u{6e90}\u{52a0}\u{8f7d}\u{7b56}\u{7565}\u{3002}\n- **\u{6784}\u{5efa}\u{4e0e}\u{73af}\u{5883}\u{589e}\u{5f3a}**\u{ff1a}\n  - \u{5728} `make` \u{4e0e} `make dev` \u{524d}\u{589e}\u{52a0} CLI \u{5de5}\u{5177}\u{4f9d}\u{8d56}\u{68c0}\u{67e5}\u{4e0e} `llvm-tools` \u{7ec4}\u{4ef6}\u{68c0}\u{67e5}\u{3002}\n  - Docker \u{652f}\u{6301} `build-runners` \u{955c}\u{50cf}\u{6784}\u{5efa}\u{53c2}\u{6570}\u{3002}\n\n### Changed\n\n- **\u{524d}\u{7aef}\u{4f9d}\u{8d56}\u{5347}\u{7ea7}**\u{ff1a}\u{66f4}\u{65b0} CodeMirror\u{3001}Tiptap 3.31.3\u{3001}Mermaid 11.17.2 \u{4e0e}\u{516c}\u{5171}\u{6784}\u{5efa}\u{6d4b}\u{8bd5}\u{5de5}\u{5177}\u{ff0c}\u{8fc1}\u{79fb} Markdown \u{8f6c}\u{4e49}\u{8865}\u{4e01}\u{ff1b}\u{7f16}\u{8f91}\u{5668}\u{516c}\u{5f0f}\u{6e32}\u{67d3}\u{4e0e}\u{5168}\u{5c40}\u{6837}\u{5f0f}\u{7edf}\u{4e00}\u{5230} KaTeX 0.18.7\u{3002}pnpm \u{5347}\u{7ea7}\u{81f3} 12.3.4\u{ff0c}Docker \u{4e0e} CI \u{901a}\u{8fc7} npm \u{5b89}\u{88c5}\u{5176}\u{539f}\u{751f}\u{4e8c}\u{8fdb}\u{5236}\u{ff1b}Vitest \u{5347}\u{7ea7}\u{81f3} 5.0.0\u{ff0c}\u{5f00}\u{53d1}\u{73af}\u{5883}\u{8981}\u{6c42} Node 22.12+\u{ff08}22.x / 24.x / 26+\u{ff09}\u{3002}\n- **\u{67b6}\u{6784}\u{4e0e}\u{6784}\u{5efa}\u{7cbe}\u{7b80}**\u{ff1a}\u{79fb}\u{9664} FreeBSD \u{4ea4}\u{53c9}\u{7f16}\u{8bd1}\u{914d}\u{7f6e}\u{4e0e}\u{6784}\u{5efa}\u{76ee}\u{6807}\u{ff0c}\u{7cbe}\u{7b80}\u{4ed3}\u{5e93}\u{6587}\u{6863}\u{4e0e}\u{5197}\u{4f59}\u{4e0a}\u{4e0b}\u{6587}\u{6587}\u{4ef6}\u{3002}\n- **\u{8bbe}\u{7f6e}\u{9875}\u{4e0e}\u{8fd0}\u{884c}\u{5668}\u{91cd}\u{6784}**\u{ff1a}\u{590d}\u{7528}\u{56de}\u{6536}\u{7ad9}\u{914d}\u{7f6e}\u{7684}\u{6570}\u{636e}\u{5e93}\u{8bfb}\u{5199}\u{ff0c}\u{6574}\u{7406}\u{5197}\u{4f59}\u{5e38}\u{91cf}\u{4e0e}\u{4ee3}\u{7801}\u{8fd0}\u{884c}\u{5668}\u{914d}\u{7f6e}\u{89e3}\u{6790}\u{3002}\n\n### Fixed\n\n- **UI \u{4e0e}\u{4ea4}\u{4e92}\u{4fee}\u{590d}**\u{ff1a}\n  - \u{7edf}\u{4e00}\u{5168}\u{7ad9}\u{6587}\u{5b57}\u{9009}\u{533a}\u{4e3a}\u{4e3b}\u{9898}\u{7eff}\u{8272}\u{3002}\n  - \u{4fee}\u{590d}\u{9996}\u{5c4f}\u{4e3b}\u{9898}\u{56fe}\u{6807}\u{4e0e}\u{4fdd}\u{5b58}\u{6a21}\u{5f0f}\u{7684}\u{540c}\u{6b65}\u{903b}\u{8f91}\u{ff0c}\u{4fee}\u{590d}\u{4e09}\u{6001}\u{5faa}\u{73af}\u{4e0e}\u{5237}\u{65b0}\u{540e}\u{7684}\u{4e3b}\u{9898}\u{56fe}\u{6807}\u{72b6}\u{6001}\u{3002}\n  - \u{7edf}\u{4e00}\u{5934}\u{50cf}\u{4e0e}\u{6587}\u{7ae0}\u{5c01}\u{9762}\u{5360}\u{4f4d}\u{56de}\u{9000}\u{ff0c}\u{4e3a}\u{52a0}\u{8f7d}\u{5931}\u{8d25}\u{7684}\u{5c01}\u{9762}\u{6dfb}\u{52a0}\u{5360}\u{4f4d}\u{6837}\u{5f0f}\u{ff0c}\u{4fee}\u{590d}\u{5ba2}\u{6237}\u{7aef}\u{5bfc}\u{822a}\u{540e}\u{7684}\u{5c01}\u{9762}\u{9ad8}\u{5ea6}\u{4e0e}\u{706f}\u{7bb1}\u{70b9}\u{51fb}\u{3002}\n  - \u{6062}\u{590d}\u{56fe}\u{7247}\u{706f}\u{7bb1}\u{6eda}\u{52a8}\u{7f29}\u{56de}\u{539f}\u{56fe}\u{7684}\u{8fc7}\u{6e21}\u{52a8}\u{753b}\u{3002}\n  - \u{4fee}\u{590d} SPA \u{5207}\u{6362}\u{6587}\u{7ae0}\u{540e}\u{76ee}\u{5f55}\u{9ad8}\u{4eae}\u{5931}\u{6548}\u{7684}\u{95ee}\u{9898}\u{3002}\n  - \u{4fee}\u{590d}\u{540e}\u{53f0}\u{6587}\u{7ae0}\u{72ec}\u{7acb}\u{6eda}\u{52a8}\u{533a}\u{57df}\u{5728}\u{5bfc}\u{822a}\u{540e}\u{7684}\u{4f4d}\u{7f6e}\u{6062}\u{590d}\u{ff0c}\u{7edf}\u{4e00}\u{6587}\u{7ae0}\u{9884}\u{89c8}\u{5165}\u{53e3}\u{4ee5}\u{4fdd}\u{7559}\u{8fd4}\u{56de}\u{72b6}\u{6001}\u{3002}\n- **\u{7f16}\u{8f91}\u{5668}\u{4e0e}\u{6784}\u{5efa}\u{4fee}\u{590d}**\u{ff1a}\n  - \u{4fee}\u{590d}\u{53cc}\u{51fb}\u{7f16}\u{8f91}\u{884c}\u{5185}\u{6216}\u{5757}\u{7ea7}\u{516c}\u{5f0f}\u{65f6}\u{ff0c}\u{952e}\u{76d8}\u{8f93}\u{5165}\u{88ab}\u{5916}\u{5c42}\u{7f16}\u{8f91}\u{5668}\u{63a5}\u{7ba1}\u{3001}\u{6574}\u{6761}\u{516c}\u{5f0f}\u{88ab}\u{66ff}\u{6362}\u{4e3a}\u{666e}\u{901a}\u{6587}\u{672c}\u{7684}\u{95ee}\u{9898}\u{3002}\n  - \u{6e05}\u{7406} Vite \u{914d}\u{7f6e}\u{7684} `__dirname` \u{517c}\u{5bb9}\u{8b66}\u{544a}\u{4e0e} Mermaid \u{7684}\u{91cd}\u{590d}\u{6253}\u{5305}\u{9009}\u{9879}\u{ff1b}\u{540c}\u{6b65} wasm-bindgen \u{9884}\u{7f13}\u{5b58}\u{7248}\u{672c}\u{81f3} 0.2.128\u{ff0c}\u{907f}\u{514d}\u{4e0e}\u{9501}\u{6587}\u{4ef6}\u{4e0d}\u{4e00}\u{81f4}\u{5bfc}\u{81f4}\u{91cd}\u{590d}\u{4e0b}\u{8f7d}\u{3002}\n\n## [0.12.5] - 2026-09-07\n\n### Changed\n\n- **\u{6587}\u{7ae0}\u{9605}\u{8bfb}\u{7248}\u{5f0f}**\u{ff1a}\u{6b63}\u{6587}\u{6536}\u{655b}\u{5230} 720px \u{9605}\u{8bfb}\u{5bbd}\u{5ea6}\u{ff0c}\u{964d}\u{4f4e}\u{6807}\u{9898}\u{4e0e}\u{6458}\u{8981}\u{7684}\u{89c6}\u{89c9}\u{91cd}\u{91cf}\u{ff0c}\u{4f18}\u{5316}\u{7ae0}\u{8282}\u{95f4}\u{8ddd}\u{3001}\u{5f15}\u{7528}\u{548c}\u{9875}\u{5c3e}\u{5bfc}\u{822a}\u{3002}\u{684c}\u{9762}\u{60ac}\u{6d6e}\u{76ee}\u{5f55}\u{4fdd}\u{6301}\u{539f}\u{6837}\u{ff1b}\u{79fb}\u{52a8}\u{7aef}\u{6298}\u{53e0}\u{76ee}\u{5f55}\u{6539}\u{7528}\u{8f7b}\u{8fb9}\u{6846}\u{3001}44px \u{94fe}\u{63a5}\u{70b9}\u{51fb}\u{533a}\u{4e0e}\u{9650}\u{9ad8}\u{6eda}\u{52a8}\u{ff0c}\u{4fdd}\u{7559}\u{539f}\u{751f}\u{952e}\u{76d8}\u{5c55}\u{5f00}\u{548c}\u{7ae0}\u{8282}\u{8df3}\u{8f6c}\u{3002}\n- **\u{9996}\u{9875}\u{9605}\u{8bfb}\u{7248}\u{5f0f}**\u{ff1a}\u{9996}\u{9875}\u{53ca}\u{540e}\u{7eed}\u{5206}\u{9875}\u{5171}\u{7528}\u{4fa7}\u{680f}\u{4e0e}\u{6587}\u{7ae0}\u{6d41}\u{ff0c}\u{79fb}\u{52a8}\u{7aef}\u{5206}\u{9875}\u{4f7f}\u{7528}\u{7d27}\u{51d1}\u{9875}\u{5934}\u{ff0c}\u{5206}\u{9875}\u{5bfc}\u{822a}\u{663e}\u{793a}\u{5f53}\u{524d}\u{9875}\u{4e0e}\u{603b}\u{9875}\u{6570}\u{3002}\u{79fb}\u{9664}\u{547c}\u{5438}\u{5fbd}\u{6807}\u{548c}\u{91cd}\u{590d}\u{5bfc}\u{822a}\u{80f6}\u{56ca}\u{ff1b}\u{6240}\u{6709}\u{6587}\u{7ae0}\u{7edf}\u{4e00}\u{4f7f}\u{7528}\u{8f7b}\u{91cf}\u{5217}\u{8868}\u{548c}\u{53ef}\u{9009}\u{7f29}\u{7565}\u{56fe}\u{ff0c}\u{4e0d}\u{518d}\u{5355}\u{72ec}\u{5f3a}\u{8c03}\u{6700}\u{65b0}\u{4e00}\u{7bc7}\u{3002}\u{540c}\u{6b65}\u{6df1}\u{6d45}\u{4e3b}\u{9898}\u{3001}\u{952e}\u{76d8}\u{7126}\u{70b9}\u{4e0e}\u{52a0}\u{8f7d}\u{5360}\u{4f4d}\u{ff0c}\u{4fdd}\u{7559}\u{73b0}\u{6709}\u{641c}\u{7d22}\u{3001}\u{6807}\u{7b7e}\u{548c}\u{5206}\u{9875}\u{8def}\u{7531}\u{3002}\n- **Rust \u{4f9d}\u{8d56}\u{5347}\u{7ea7}**\u{ff1a}\u{5347}\u{7ea7}\u{81f3} rmcp 3.2\u{3001}reqwest 0.13\u{3001}Argon2 0.6\u{3001}rand 0.10\u{3001}AES-GCM 0.11\u{3001}SHA-2 / MD5 0.11\u{3001}fancy-regex 0.19\u{3001}katex-rs 0.3 \u{4e0e} serial_test 4\u{ff0c}\u{5e76}\u{66f4}\u{65b0}\u{517c}\u{5bb9}\u{8303}\u{56f4}\u{5185}\u{7684}\u{9501}\u{5b9a}\u{4f9d}\u{8d56}\u{3002}rmcp \u{4e0d}\u{518d}\u{7cbe}\u{786e}\u{56fa}\u{5b9a}\u{9884}\u{53d1}\u{5e03}\u{7248}\u{672c}\u{3002}\n- **\u{5bc6}\u{7801}\u{4e0e}\u{4ee4}\u{724c}\u{517c}\u{5bb9}**\u{ff1a}\u{9002}\u{914d}\u{65b0}\u{7248}\u{5bc6}\u{7801}\u{54c8}\u{5e0c}\u{3001}\u{968f}\u{673a}\u{6570}\u{548c}\u{52a0}\u{5bc6} API\u{ff0c}\u{4fdd}\u{7559}\u{65e2}\u{6709} Argon2 PHC\u{3001}MCP token \u{5bc6}\u{6587}\u{4e0e}\u{54c8}\u{5e0c}\u{683c}\u{5f0f}\u{ff1b}\u{64cd}\u{4f5c}\u{7cfb}\u{7edf}\u{968f}\u{673a}\u{6e90}\u{5931}\u{8d25}\u{65f6}\u{8fd4}\u{56de}\u{9519}\u{8bef}\u{ff0c}\u{4e0d}\u{4e2d}\u{6b62}\u{670d}\u{52a1}\u{8fdb}\u{7a0b}\u{3002}\n- **\u{516c}\u{5f0f}\u{6e32}\u{67d3}\u{5347}\u{7ea7}**\u{ff1a}\u{540c}\u{6b65} npm KaTeX 0.18.6 \u{6837}\u{5f0f}\u{4e0e}\u{5b57}\u{4f53}\u{ff0c}\u{79fb}\u{9664}\u{4e0a}\u{6e38}\u{5df2}\u{4fee}\u{590d}\u{7684}\u{6587}\u{672c}\u{4e2d}\u{95f4}\u{70b9}\u{517c}\u{5bb9}\u{8865}\u{4e01}\u{3002}\u{8fc1}\u{79fb} 026 \u{5728}\u{4e8b}\u{52a1}\u{5185}\u{66f4}\u{65b0}\u{6587}\u{7ae0}\u{3001}\u{8bc4}\u{8bba}\u{4e2d}\u{5df2}\u{4fdd}\u{5b58}\u{7684}\u{516c}\u{5f0f}\u{5e03}\u{5c40} class\u{ff0c}\u{6db5}\u{76d6}\u{8349}\u{7a3f}\u{548c}\u{56de}\u{6536}\u{7ad9}\u{ff0c}\u{4fdd}\u{7559}\u{539f}\u{59cb}\u{6b63}\u{6587}\u{3001}\u{72b6}\u{6001}\u{53ca}\u{65f6}\u{95f4}\u{6233}\u{ff1b}\u{542f}\u{52a8}\u{65f6}\u{6e05}\u{7406}\u{516c}\u{5171}\u{9875}\u{9762}\u{548c}\u{9884}\u{89c8}\u{9875}\u{7684}\u{65e7} SSR \u{7f13}\u{5b58}\u{3002}\n- **HTTPS \u{4fe1}\u{4efb}\u{914d}\u{7f6e}**\u{ff1a}reqwest \u{5207}\u{6362}\u{5230}\u{65b0}\u{7248} Rustls / AWS-LC \u{4e0e}\u{5e73}\u{53f0}\u{8bc1}\u{4e66}\u{9a8c}\u{8bc1}\u{5668}\u{ff0c}\u{4e24}\u{79cd} Docker \u{8fd0}\u{884c}\u{65f6}\u{955c}\u{50cf}\u{663e}\u{5f0f}\u{5b89}\u{88c5} `ca-certificates`\u{3002}\n\n**\u{90e8}\u{7f72}\u{6ce8}\u{610f}**\u{ff1a}\u{9996}\u{6b21}\u{542f}\u{52a8}\u{65b0}\u{7248}\u{524d}\u{5907}\u{4efd}\u{6570}\u{636e}\u{5e93}\u{5e76}\u{505c}\u{6b62}\u{6240}\u{6709}\u{65e7}\u{7248}\u{5b9e}\u{4f8b}\u{ff0c}\u{907f}\u{514d}\u{8fc1}\u{79fb}\u{5b8c}\u{6210}\u{540e}\u{65e7}\u{6e32}\u{67d3}\u{5668}\u{7ee7}\u{7eed}\u{5199}\u{5165}\u{4e0d}\u{517c}\u{5bb9}\u{7684}\u{516c}\u{5f0f} HTML\u{3002}\u{56de}\u{6eda}\u{65f6}\u{987b}\u{540c}\u{6b65}\u{6062}\u{590d}\u{65e7}\u{7248}\u{516c}\u{5f0f} HTML \u{4e0e}\u{9759}\u{6001}\u{8d44}\u{6e90}\u{ff0c}\u{4e0d}\u{80fd}\u{4ec5}\u{56de}\u{9000}\u{4e8c}\u{8fdb}\u{5236}\u{3002}\n\n## [0.12.4] - 2026-08-26\n\n### Added\n\n- **\u{7ec8}\u{7aef}\u{5c3a}\u{5bf8}\u{81ea}\u{9002}\u{5e94}**\u{ff1a}\u{4ee3}\u{7801}\u{8fd0}\u{884c}\u{5668}\u{5bb9}\u{5668}\u{5c3a}\u{5bf8}\u{53d8}\u{5316}\u{65f6}\u{81ea}\u{52a8}\u{91cd}\u{65b0}\u{8ba1}\u{7b97}\u{7ec8}\u{7aef}\u{5217}\u{5bbd}\u{ff0c}\u{9002}\u{914d}\u{4fa7}\u{680f}\u{5207}\u{6362}\u{3001}\u{7a97}\u{53e3}\u{8c03}\u{6574}\u{548c}\u{8f93}\u{51fa}\u{9762}\u{677f}\u{5c55}\u{5f00}\u{3002}\n\n### Changed\n\n- **\u{540e}\u{53f0}\u{7ec4}\u{4ef6}\u{4e0e}\u{9aa8}\u{67b6}\u{5c4f}\u{6536}\u{655b}**\u{ff1a}\u{5bfc}\u{822a}\u{3001}\u{5206}\u{9875}\u{3001}\u{8868}\u{5355}\u{3001}\u{6587}\u{7ae0}/SQL \u{8868}\u{683c}\u{548c}\u{9aa8}\u{67b6}\u{5c4f}\u{7edf}\u{4e00}\u{590d}\u{7528}\u{5171}\u{4eab}\u{539f}\u{5b50}\u{ff0c}\u{5e76}\u{8865}\u{9f50}\u{5217}\u{8868}\u{7a33}\u{5b9a} key\u{ff0c}\u{51cf}\u{5c11}\u{91cd}\u{590d}\u{5b9e}\u{73b0}\u{3002}\n- **\u{542f}\u{52a8}\u{4e0e}\u{90e8}\u{7f72}\u{94fe}\u{8def}\u{52a0}\u{56fa}**\u{ff1a}\u{751f}\u{4ea7}\u{76d1}\u{542c}\u{6539}\u{4e3a}\u{76f4}\u{63a5}\u{7ed1}\u{5b9a}\u{ff0c}\u{5f3a}\u{5316}\u{542f}\u{52a8}\u{5f15}\u{5bfc}\u{4e0e}\u{8def}\u{7531}\u{751f}\u{547d}\u{5468}\u{671f}\u{ff1b}\u{90e8}\u{7f72}\u{65f6}\u{5f3a}\u{5236}\u{91cd}\u{5efa}\u{5e94}\u{7528}\u{955c}\u{50cf}\u{3002}\n- **WASM \u{8d28}\u{91cf}\u{95e8}\u{7981}\u{589e}\u{5f3a}**\u{ff1a}\u{4e3a} web-only \u{76ee}\u{6807}\u{8865}\u{5145} Clippy \u{68c0}\u{67e5}\u{3002}\n\n### Fixed\n\n- \u{4fee}\u{590d} CodeMirror \u{4e2d} Go \u{6ce8}\u{91ca}\u{9ad8}\u{4eae}\u{9519}\u{8bef}\u{3002}\n- \u{4fee}\u{590d}\u{53ef}\u{8fd0}\u{884c}\u{4ee3}\u{7801}\u{5757}\u{7f16}\u{8f91}\u{5f39}\u{7a97}\u{8bed}\u{8a00}\u{4e0b}\u{62c9}\u{89e6}\u{53d1}\u{5668}\u{672a}\u{6302}\u{8f7d}\u{3001}\u{63a7}\u{4ef6}\u{6837}\u{5f0f}\u{4e0e}\u{4e3b}\u{9898}\u{4e0d}\u{4e00}\u{81f4}\u{7684}\u{95ee}\u{9898}\u{3002}\n- \u{4fee}\u{590d}\u{5217}\u{8868}\u{9879}\u{5185}\u{4ee3}\u{7801}\u{5757}\u{4e0e}\u{6b63}\u{6587}\u{95f4}\u{8ddd}\u{8fc7}\u{5c0f}\u{3002}\n- \u{4fee}\u{590d}\u{540e}\u{53f0}\u{4fa7}\u{680f}\u{5b50}\u{83dc}\u{5355}\u{5728}\u{7ec4}\u{5185}\u{5206}\u{9875}\u{65f6}\u{88ab}\u{5f3a}\u{5236}\u{91cd}\u{65b0}\u{5c55}\u{5f00}\u{ff0c}\u{4ee5}\u{53ca}\u{83dc}\u{5355} effect \u{81ea}\u{89e6}\u{53d1}\u{5bfc}\u{81f4}\u{9875}\u{9762}\u{5361}\u{6b7b}\u{7684}\u{95ee}\u{9898}\u{3002}\n- \u{4fee}\u{590d}\u{8bc4}\u{8bba}\u{4f5c}\u{8005}\u{7f51}\u{7ad9}\u{94fe}\u{63a5}\u{65e0}\u{6587}\u{5b57}\u{3001}\u{56de}\u{590d}\u{8868}\u{5355}\u{5207}\u{6362}\u{65f6}\u{8349}\u{7a3f}\u{4e22}\u{5931}\u{7684}\u{95ee}\u{9898}\u{3002}\n- \u{4fee}\u{590d}\u{7d20}\u{6750}\u{5355}\u{56fe}\u{4e0a}\u{4f20}\u{7ed5}\u{8fc7}\u{6587}\u{4ef6}\u{5927}\u{5c0f}/MIME \u{6821}\u{9a8c}\u{3001}\u{5173}\u{95ed}\u{6309}\u{94ae}\u{7f3a}\u{5c11}\u{952e}\u{76d8}\u{7126}\u{70b9}\u{6837}\u{5f0f}\u{53ca}\u{5f39}\u{7a97}\u{8bed}\u{4e49}\u{4e0d}\u{5b8c}\u{6574}\u{7684}\u{95ee}\u{9898}\u{3002}\n\n### Security\n\n- \u{5199}\u{8bf7}\u{6c42}\u{5728}\u{65e0}\u{6cd5}\u{786e}\u{5b9a}\u{672c}\u{7ad9} origin \u{6216}\u{6765}\u{6e90}\u{5934}\u{7f3a}\u{5931}\u{65f6}\u{6539}\u{4e3a}\u{62d2}\u{7edd}\u{ff0c}\u{4fee}\u{590d} CSRF fail-open\u{3002}\n- \u{4fee}\u{590d} IPv4-mapped IPv6 \u{5730}\u{5740}\u{7ed5}\u{8fc7} URL \u{6293}\u{53d6}\u{5185}\u{7f51}\u{5730}\u{5740}\u{62e6}\u{622a}\u{7684}\u{95ee}\u{9898}\u{3002}\n- \u{4f1a}\u{8bdd}\u{7f13}\u{5b58}\u{547d}\u{4e2d}\u{65f6}\u{91cd}\u{65b0}\u{6821}\u{9a8c}\u{4f1a}\u{8bdd}\u{5b58}\u{5728}\u{6027}\u{3001}\u{8fc7}\u{671f}\u{65f6}\u{95f4}\u{3001}\u{7ba1}\u{7406}\u{5458}\u{89d2}\u{8272}\u{548c} session generation\u{ff1b}\u{9650}\u{5236}\u{5bc6}\u{7801}\u{6700}\u{5927}\u{957f}\u{5ea6}\u{4e3a} 256 \u{5b57}\u{8282}\u{3002}\n- \u{5907}\u{4efd}\u{5bfc}\u{5165}\u{4e0d}\u{518d}\u{628a} `DATABASE_URL` \u{4f20}\u{5165} `pg_dump`/`psql` \u{53c2}\u{6570}\u{ff0c}\u{62d2}\u{7edd}\u{975e}\u{5141}\u{8bb8}\u{7684} psql \u{5143}\u{547d}\u{4ee4}\u{ff0c}\u{5e76}\u{5728}\u{6062}\u{590d}\u{540e}\u{6e05}\u{7406}\u{5168}\u{90e8}\u{76f8}\u{5173}\u{7f13}\u{5b58}\u{3002}\n- \u{4fee}\u{590d}\u{7d20}\u{6750}\u{5220}\u{9664}\u{4e0e}\u{5b64}\u{513f}\u{6e05}\u{7406}\u{7684}\u{5e76}\u{53d1}\u{7a97}\u{53e3}\u{ff0c}\u{907f}\u{514d}\u{65b0}\u{589e}\u{5f15}\u{7528}\u{88ab}\u{8bef}\u{5220}\u{3002}\n\n## [0.12.3] - 2026-08-21\n\n### Added\n\n- **\u{540e}\u{53f0}\u{8fd0}\u{884c}\u{65e5}\u{5fd7}\u{67e5}\u{770b}\u{5668}**\u{ff1a}\u{65b0}\u{589e} `/admin/logs`\u{300c}\u{8fd0}\u{884c}\u{65e5}\u{5fd7}\u{300d}\u{9875}\u{ff0c}\u{652f}\u{6301}\u{7ea7}\u{522b}\u{4e0e}\u{6a21}\u{5757}\u{7b5b}\u{9009}\u{3001}\u{5173}\u{952e}\u{5b57}\u{641c}\u{7d22}\u{3001}SSE \u{5b9e}\u{65f6}\u{6eda}\u{52a8}\u{3001}\u{5386}\u{53f2}\u{6e38}\u{6807}\u{7ffb}\u{9875}\u{548c}\u{6309}\u{7b5b}\u{9009}\u{5bfc}\u{51fa} `.log`\u{ff1b}\u{53ef}\u{914d}\u{7f6e}\u{65e5}\u{5fd7}\u{4fdd}\u{7559}\u{7b56}\u{7565}\u{ff0c}\u{540e}\u{53f0}\u{4efb}\u{52a1}\u{6309}\u{9f84}\u{671f}\u{4e0e}\u{884c}\u{6570}\u{81ea}\u{52a8}\u{88c1}\u{526a}\u{3002}\n- **MCP \u{6587}\u{7ae0}\u{53d1}\u{5e03}\u{65f6}\u{95f4}\u{63a7}\u{5236}**\u{ff1a}\u{521b}\u{5efa}\u{6216}\u{66f4}\u{65b0}\u{6587}\u{7ae0}\u{65f6}\u{53ef}\u{901a}\u{8fc7} `published_at` \u{6307}\u{5b9a}\u{6216}\u{8c03}\u{6574}\u{53d1}\u{5e03}\u{65f6}\u{95f4}\u{3002}\n\n### Fixed\n\n- \u{4fee}\u{590d}\u{8fd0}\u{884c}\u{65e5}\u{5fd7}\u{9875}\u{9762} target \u{4e0b}\u{62c9}\u{6846}\u{4e0e}\u{641c}\u{7d22}\u{6846}\u{7684}\u{6837}\u{5f0f}\u{548c}\u{5782}\u{76f4}\u{5bf9}\u{9f50}\u{95ee}\u{9898}\u{3002}\n- \u{4fee}\u{590d}\u{6587}\u{6863}\u{4e2d}\u{7684} Rust API \u{94fe}\u{63a5}\u{3002}\n\n## [0.12.2] - 2026-08-20\n\n### Added\n\n- **\u{524d}\u{53f0}\u{9996}\u{9875}\u{4e0e}\u{6587}\u{7ae0}\u{5361}\u{7247}\u{73b0}\u{4ee3}\u{6392}\u{7248}\u{91cd}\u{6784}**\u{ff1a}\n  - **\u{9996}\u{9875} Hero \u{533a}\u{57df}**\u{ff1a}\u{65b0}\u{589e}\u{72b6}\u{6001}\u{547c}\u{5438}\u{5fbd}\u{6807}\u{3001}\u{7f16}\u{8f91}\u{98ce}\u{5927}\u{5b57}\u{4e3b}\u{6807}\u{9898}\u{4e0e}\u{63a2}\u{7d22}\u{80f6}\u{56ca}\u{ff08}\u{5feb}\u{901f}\u{76f4}\u{8fbe}\u{641c}\u{7d22}\u{3001}\u{5f52}\u{6863}\u{3001}\u{6807}\u{7b7e}\u{4e0e}\u{53cb}\u{94fe}\u{ff09}\u{3002}\n  - **\u{5206}\u{9875}\u{4e0e}\u{9762}\u{5305}\u{5c51}\u{5bfc}\u{822a}**\u{ff1a}\u{7ffb}\u{9875}\u{6a21}\u{5f0f}\u{ff08}`/page/:page`\u{ff09}\u{4e0b}\u{81ea}\u{52a8}\u{5448}\u{73b0}\u{7cbe}\u{7b80}\u{9762}\u{5305}\u{5c51}\u{ff0c}\u{63d0}\u{5347}\u{9605}\u{8bfb}\u{805a}\u{7126}\u{5ea6}\u{3002}\n  - **\u{5934}\u{6761}\u{4e0e}\u{6587}\u{7ae0}\u{5361}\u{7247}**\u{ff1a}\u{9996}\u{7bc7}\u{652f}\u{6301} Featured \u{4e13}\u{5c5e}\u{6392}\u{7248}\u{5c55}\u{793a}\u{ff1b}\u{5361}\u{7247}\u{96c6}\u{6210} Retina \u{9ad8}\u{6e05}\u{7f29}\u{7565}\u{56fe}\u{9002}\u{914d}\u{3001}\u{9605}\u{8bfb}\u{65f6}\u{957f}\u{4e0e}\u{5b57}\u{6570}\u{7edf}\u{8ba1}\u{3001}\u{60ac}\u{6d6e}\u{5e73}\u{6ed1}\u{52a8}\u{6548}\u{4e0e}\u{73b0}\u{4ee3}\u{5316}\u{89c6}\u{89c9}\u{8bbe}\u{8ba1}\u{3002}\n  - **\u{9aa8}\u{67b6}\u{5c4f}\u{5bf9}\u{9f50}**\u{ff1a}\u{91cd}\u{6784} `HomeSkeleton` \u{4e0e} `PostCardSkeleton`\u{ff0c}\u{4fdd}\u{6301}\u{5360}\u{4f4d}\u{7ed3}\u{6784}\u{4e0e}\u{771f}\u{5b9e}\u{6587}\u{7ae0}\u{5361}\u{7247}\u{7684}\u{51e0}\u{4f55}\u{6bd4}\u{4f8b}\u{4e25}\u{5bc6}\u{5951}\u{5408}\u{3002}\n\n## [0.12.1] - 2026-08-20\n\n### Added\n\n- **\u{7d20}\u{6750}\u{5f15}\u{7528}\u{660e}\u{7ec6}\u{6d6e}\u{5c42}**\u{ff1a}\u{7d20}\u{6750}\u{7ba1}\u{7406}\u{652f}\u{6301}\u{67e5}\u{770b}\u{6587}\u{7ae0}\u{3001}\u{8bc4}\u{8bba}\u{548c}\u{5934}\u{50cf}\u{7684}\u{5168}\u{90e8}\u{5f15}\u{7528}\u{6765}\u{6e90}\u{3002}\n\n### Fixed\n\n- \u{4fee}\u{590d}\u{7d20}\u{6750}\u{5f15}\u{7528}\u{7edf}\u{8ba1}\u{672a}\u{8ba1}\u{5165}\u{5934}\u{50cf}\u{56fe}\u{7247}\u{3002}\n- **CI \u{53cc}\u{673a}\u{5e76}\u{884c}\u{90e8}\u{7f72}**\u{ff1a}xun \u{4e0e} rua \u{62c6}\u{4e3a}\u{72ec}\u{7acb} job\u{ff0c}\u{5728} GHCR \u{955c}\u{50cf}\u{53d1}\u{5e03}\u{540e}\u{5e76}\u{884c}\u{62c9}\u{53d6}\u{5e76}\u{6eda}\u{52a8}\u{91cd}\u{542f}\u{ff1b}runner \u{955c}\u{50cf}\u{6539}\u{7528}\u{516c}\u{5f00}\u{6807}\u{7b7e}\u{ff0c}\u{907f}\u{514d}\u{72ec}\u{7acb}\u{79c1}\u{6709}\u{5305}\u{65e0}\u{6cd5}\u{533f}\u{540d}\u{62c9}\u{53d6}\u{3002}\n- **CI runner \u{955c}\u{50cf}\u{5b8c}\u{6574}\u{6027}\u{95e8}\u{7981}**\u{ff1a}\u{53d1}\u{5e03}\u{4efb}\u{52a1}\u{6838}\u{5bf9} GHCR \u{7684} 6 \u{4e2a} runner tag\u{ff0c}\u{90e8}\u{7f72}\u{524d}\u{6838}\u{5bf9} xun \u{672c}\u{5730}\u{6700}\u{7ec8} tag\u{ff0c}\u{7f3a}\u{5931}\u{65f6}\u{963b}\u{6b62} app \u{91cd}\u{542f}\u{ff0c}\u{907f}\u{514d}\u{4ee3}\u{7801}\u{8fd0}\u{884c}\u{5668}\u{8fd4}\u{56de} 404\u{3002}\n\n## [0.12.0] - 2026-08-19\n\n### Added\n\n- **\u{767b}\u{5f55}\u{7528}\u{6237}\u{514d}\u{8868}\u{5355}\u{76f4}\u{53d1}\u{8bc4}\u{8bba}**\u{ff1a}\u{6587}\u{7ae0}\u{8bc4}\u{8bba}\u{533a}\u{5728}\u{767b}\u{5f55}\u{6001}\u{4e0b}\u{5207}\u{6362}\u{4e3a}\u{300c}\u{8eab}\u{4efd}\u{884c}\u{ff08}\u{5934}\u{50cf} + \u{663e}\u{793a}\u{540d}\u{ff09}+ \u{5185}\u{5bb9}\u{6846}\u{300d}\u{ff0c}\u{514d}\u{53bb}\u{6635}\u{79f0}/\u{90ae}\u{7bb1}/\u{7f51}\u{7ad9}\u{5b57}\u{6bb5}\u{4e0e}\u{871c}\u{7f50}\u{ff0c}\u{8bc4}\u{8bba}\u{76f4}\u{53d1} approved \u{514d}\u{5ba1}\u{6838}\u{ff0c}\u{540d}\u{5b57}\u{65c1}\u{663e}\u{793a}\u{300c}\u{4f5c}\u{8005}\u{300d}\u{5fbd}\u{7ae0}\u{3002}`comments` \u{8868}\u{65b0}\u{589e} `user_id` \u{5916}\u{952e}\u{ff08}\u{8fc1}\u{79fb} 024\u{ff09}\u{ff0c}\u{8bfb}\u{53d6}\u{65f6} LEFT JOIN users \u{5b9e}\u{65f6}\u{89e3}\u{6790}\u{663e}\u{793a}\u{540d}\u{4e0e}\u{5934}\u{50cf}\u{ff1b}\u{6539}\u{540d}\u{6216}\u{6362}\u{5934}\u{50cf}\u{540e}\u{5386}\u{53f2}\u{8bc4}\u{8bba}\u{81ea}\u{52a8}\u{8ddf}\u{968f}\u{3002}\n- **\u{540e}\u{53f0}\u{4e2a}\u{4eba}\u{4fe1}\u{606f}\u{4e0e}\u{5934}\u{50cf}**\u{ff1a}\u{65b0}\u{589e} `/admin/profile` \u{4e2a}\u{4eba}\u{8d44}\u{6599}\u{9875}\u{ff0c}\u{652f}\u{6301}\u{663e}\u{793a}\u{540d}\u{79f0}\u{3001}\u{90ae}\u{7bb1}\u{3001}\u{5934}\u{50cf}\u{7d20}\u{6750}\u{9009}\u{62e9}\u{3001}\u{79fb}\u{9664}\u{5934}\u{50cf}\u{4e0e}\u{4fee}\u{6539}\u{5bc6}\u{7801}\u{ff1b}\u{5bc6}\u{7801}\u{4fee}\u{6539}\u{4f1a}\u{4f7f}\u{5176}\u{4ed6}\u{8bbe}\u{5907}\u{4f1a}\u{8bdd}\u{5931}\u{6548}\u{ff0c}\u{4fa7}\u{680f}\u{65b0}\u{589e}\u{7528}\u{6237}\u{8eab}\u{4efd}\u{5361}\u{7247}\u{ff0c}\u{5e76}\u{7edf}\u{4e00}\u{590d}\u{7528} `UserAvatar` \u{7ec4}\u{4ef6}\u{3002}\n- **\u{8bc4}\u{8bba}\u{5bcc}\u{6587}\u{672c}\u{4e0e}\u{56fe}\u{7247}\u{4e0a}\u{4f20}**\u{ff1a}\u{8bc4}\u{8bba}\u{8868}\u{5355}\u{63a5}\u{5165}\u{7cbe}\u{7b80}\u{7248} Tiptap \u{6240}\u{89c1}\u{5373}\u{6240}\u{5f97}\u{7f16}\u{8f91}\u{5668}\u{ff0c}\u{652f}\u{6301}\u{6309}\u{94ae}\u{4e0a}\u{4f20}\u{548c}\u{7c98}\u{8d34}\u{56fe}\u{7247}\u{ff1b}\u{65b0}\u{589e}\u{8bc4}\u{8bba}\u{56fe}\u{7247}\u{4e0a}\u{4f20}\u{7aef}\u{70b9}\u{3001}\u{533f}\u{540d}\u{53cc}\u{5c42}\u{9650}\u{6d41}\u{4e0e}\u{8bc4}\u{8bba} HTML \u{56fe}\u{7247}\u{6807}\u{7b7e}\u{653e}\u{884c}\u{3002}\n- **\u{5907}\u{4efd}\u{5bfc}\u{5165}\u{6062}\u{590d}**\u{ff1a}\u{65b0}\u{589e}\u{5907}\u{4efd}\u{5bfc}\u{5165}\u{63a5}\u{53e3}\u{ff0c}\u{652f}\u{6301} multipart \u{6d41}\u{5f0f}\u{843d}\u{76d8}\u{3001}\u{7b7e}\u{540d}\u{6821}\u{9a8c}\u{3001}\u{540c}\u{540d}\u{51b2}\u{7a81}\u{62d2}\u{7edd}\u{3001}\u{78c1}\u{76d8}\u{7a7a}\u{95f4}\u{9884}\u{68c0}\u{3001}\u{4e34}\u{65f6}\u{6587}\u{4ef6}\u{539f}\u{5b50}\u{5165}\u{5e93}\u{4e0e} `BACKUP_IMPORT_MAX_MB` \u{5355}\u{6587}\u{4ef6}\u{4e0a}\u{9650}\u{3002}\n- **\u{8bc4}\u{8bba}\u{5f15}\u{7528}\u{611f}\u{77e5}\u{7684}\u{5b64}\u{513f}\u{7d20}\u{6750}\u{6e05}\u{7406}**\u{ff1a}\u{65b0}\u{589e}\u{5b64}\u{513f}\u{7d20}\u{6750}\u{5b9a}\u{671f}\u{6e05}\u{7406}\u{4efb}\u{52a1}\u{ff0c}\u{8bc6}\u{522b}\u{8bc4}\u{8bba}\u{4e2d}\u{7684}\u{7d20}\u{6750}\u{5f15}\u{7528}\u{5e76}\u{6309}\u{4fdd}\u{7559}\u{671f}\u{56de}\u{6536}\u{672a}\u{5f15}\u{7528}\u{4e0a}\u{4f20}\u{6587}\u{4ef6}\u{3002}\n- **\u{540e}\u{53f0}\u{9875}\u{9762}\u{4f53}\u{9a8c}\u{91cd}\u{6784}**\u{ff1a}\u{91cd}\u{505a}\u{6587}\u{7ae0}\u{3001}\u{56de}\u{6536}\u{7ad9}\u{3001}\u{8bc4}\u{8bba}\u{3001}\u{5199}\u{4f5c}\u{3001}\u{7d20}\u{6750}\u{3001}\u{53cb}\u{94fe}\u{3001}MCP\u{3001}\u{4ee3}\u{7801}\u{8bd5}\u{8fd0}\u{884c}\u{3001}\u{7cfb}\u{7edf}\u{4e0e}\u{8bbe}\u{7f6e}\u{7b49}\u{7ba1}\u{7406}\u{9875}\u{9762}\u{ff0c}\u{7edf}\u{4e00}\u{5361}\u{7247}\u{5316}\u{5e03}\u{5c40}\u{3001}\u{5bfc}\u{822a}\u{3001}\u{64cd}\u{4f5c}\u{53cd}\u{9988}\u{548c}\u{8bca}\u{65ad}\u{4fe1}\u{606f}\u{5c55}\u{793a}\u{3002}\n\n### Changed\n\n- **\u{7f16}\u{8f91}\u{5668}\u{4e0e}\u{754c}\u{9762}\u{7ec4}\u{4ef6}\u{7edf}\u{4e00}**\u{ff1a}\u{589e}\u{52a0} Tiptap `full` / `comment` \u{53d8}\u{4f53}\u{673a}\u{5236}\u{ff0c}\u{7edf}\u{4e00}\u{6587}\u{7ae0}\u{7f16}\u{8f91}\u{5668}\u{4e0e}\u{540e}\u{53f0}/\u{524d}\u{53f0} Checkbox \u{6837}\u{5f0f}\u{ff0c}\u{6536}\u{655b}\u{516c}\u{5171}\u{8868}\u{5355}\u{3001}Tooltip\u{3001}Popover \u{7b49}\u{7ec4}\u{4ef6}\u{3002}\n- **\u{540e}\u{53f0}\u{4ea4}\u{4e92}\u{7ec6}\u{8282}\u{6536}\u{7d27}**\u{ff1a}\u{8bc4}\u{8bba}\u{548c}\u{7d20}\u{6750}\u{76f8}\u{5173}\u{64cd}\u{4f5c}\u{91c7}\u{7528}\u{4e00}\u{81f4}\u{7684}\u{4e0a}\u{4f20}\u{9519}\u{8bef}\u{6e05}\u{7406}\u{3001}\u{8fc7}\u{6e21}\u{52a8}\u{753b}\u{3001}\u{8868}\u{683c}\u{6eda}\u{52a8}\u{4e0e}\u{6309}\u{94ae}\u{5bf9}\u{9f50}\u{884c}\u{4e3a}\u{3002}\n\n### Fixed\n\n- \u{4fee}\u{590d}\u{56de}\u{6536}\u{7ad9}\u{548c}\u{8bc4}\u{8bba}\u{7ba1}\u{7406}\u{8868}\u{683c}\u{51fa}\u{73b0}\u{53cc}\u{6eda}\u{52a8}\u{6761}\u{7684}\u{95ee}\u{9898}\u{3002}\n- \u{4fee}\u{590d} Tiptap `full` \u{53d8}\u{4f53}\u{56e0}\u{6d45}\u{5408}\u{5e76} `editorProps` \u{8986}\u{76d6}\u{9ed8}\u{8ba4}\u{914d}\u{7f6e}\u{800c}\u{6302}\u{8f7d}\u{5d29}\u{6e83}\u{3002}\n- \u{4fee}\u{590d}\u{53d6}\u{6d88}\u{4ee3}\u{7801}\u{8fd0}\u{884c}\u{540e}\u{5bb9}\u{5668}\u{6e05}\u{7406}\u{4e0d}\u{5b8c}\u{6574}\u{7684}\u{95ee}\u{9898}\u{3002}\n- \u{4fee}\u{590d}\u{540e}\u{53f0}\u{9aa8}\u{67b6}\u{5c4f}\u{91cd}\u{590d}\u{9875}\u{5934}\u{9020}\u{6210}\u{7684}\u{9ad8}\u{5ea6}\u{6ea2}\u{51fa}\u{4e0e}\u{6eda}\u{52a8}\u{6761}\u{6296}\u{52a8}\u{ff0c}\u{4ee5}\u{53ca} Tooltip \u{7684} `group` \u{547d}\u{540d}\u{7a7a}\u{95f4}\u{51b2}\u{7a81}\u{3002}\n- \u{4fee}\u{590d}\u{4ece}\u{540e}\u{53f0}\u{5207}\u{56de}\u{524d}\u{53f0}\u{540e}\u{6587}\u{7ae0}\u{5217}\u{8868}\u{70b9}\u{51fb}\u{5931}\u{6548}\u{3001}\u{8bc4}\u{8bba}\u{63d0}\u{4ea4}\u{6309}\u{94ae}\u{5c3a}\u{5bf8}\u{5bf9}\u{9f50}\u{5f02}\u{5e38}\u{7b49}\u{95ee}\u{9898}\u{3002}\n- \u{4fee}\u{590d}\u{8de8}\u{73af}\u{5883}\u{5907}\u{4efd}\u{6062}\u{590d}\u{7684}\u{6570}\u{636e}\u{5e93}\u{5c5e}\u{4e3b}\u{517c}\u{5bb9}\u{6027}\u{4e0e}\u{5931}\u{8d25}\u{56de}\u{6eda}\u{ff0c}\u{786e}\u{4fdd}\u{4efb}\u{4e00} SQL \u{5931}\u{8d25}\u{65f6}\u{4e0d}\u{7559}\u{4e0b}\u{534a}\u{6062}\u{590d}\u{6570}\u{636e}\u{5e93}\u{3002}\n\n### Security\n\n- \u{8bc4}\u{8bba}\u{56fe}\u{7247}\u{4e0a}\u{4f20}\u{589e}\u{52a0}\u{533f}\u{540d}\u{5206}\u{5c42}\u{9650}\u{6d41}\u{ff0c}\u{964d}\u{4f4e}\u{6ee5}\u{7528}\u{98ce}\u{9669}\u{3002}\n\n## [0.11.0] - 2026-08-14\n\n### Added\n\n- **\u{7ad9}\u{70b9}\u{914d}\u{7f6e}\u{9875}\u{5206}\u{533a}\u{5316}\u{91cd}\u{6784}**\u{ff1a}\u{8bbe}\u{7f6e}\u{9875}\u{91cd}\u{5236}\u{4e3a}\u{300c}\u{5de6}\u{4fa7}\u{5bfc}\u{822a} + \u{53f3}\u{4fa7}\u{72ec}\u{7acb}\u{6eda}\u{52a8}\u{5185}\u{5bb9}\u{533a}\u{300d}\u{5206}\u{533a}\u{5316}\u{5e03}\u{5c40}\u{ff1b}\u{5b89}\u{5168}\u{914d}\u{7f6e}\u{4e0e}\u{56fe}\u{7247}\u{7f13}\u{5b58}\u{914d}\u{7f6e}\u{6539}\u{4e3a} DB \u{9a71}\u{52a8}\u{5373}\u{65f6}\u{751f}\u{6548}\u{5c42}\u{ff08}\u{6539}\u{5b8c}\u{5373}\u{751f}\u{6548}\u{ff09}\u{ff1b}\u{9650}\u{6d41} / WebP / \u{56fe}\u{7247} / \u{8fd0}\u{884c}\u{5668}\u{7b49} Tier B \u{914d}\u{7f6e}\u{63d0}\u{4f9b}\u{53ef}\u{7f16}\u{8f91} UI\u{ff08}\u{91cd}\u{542f}\u{540e}\u{751f}\u{6548}\u{ff09}\u{3002}\n- **\u{5b9a}\u{65f6}\u{81ea}\u{52a8}\u{5907}\u{4efd}**\u{ff1a}\u{65b0}\u{589e}\u{5907}\u{4efd}\u{540e}\u{7aef}\u{2014}\u{2014}\u{8bbe}\u{7f6e}\u{6a21}\u{578b} / API\u{3001}\u{5b9a}\u{65f6}\u{8c03}\u{5ea6}\u{4efb}\u{52a1}\u{3001}uploads \u{6253}\u{5305}\u{3001}\u{81ea}\u{52a8}\u{8f6e}\u{8f6c}\u{4fdd}\u{7559}\u{ff1b}\u{5907}\u{4efd}\u{6062}\u{590d} tab \u{9876}\u{90e8}\u{65b0}\u{589e}\u{81ea}\u{52a8}\u{5907}\u{4efd}\u{8bbe}\u{7f6e}\u{5361}\u{7247}\u{4e0e}\u{5907}\u{4efd}\u{5217}\u{8868}\u{914d}\u{5bf9}\u{5c55}\u{793a}\u{ff1b}\u{5c01}\u{88c5} `TimePicker` \u{66ff}\u{6362}\u{539f}\u{751f}\u{65f6}\u{95f4}\u{8f93}\u{5165}\u{3002}\u{53ef}\u{901a}\u{8fc7} `BACKUP_*` \u{73af}\u{5883}\u{53d8}\u{91cf}\u{5728}\u{9996}\u{6b21}\u{90e8}\u{7f72}\u{65f6}\u{64ad}\u{79cd}\u{3002}\n- **`ADMIN_*` \u{73af}\u{5883}\u{53d8}\u{91cf}\u{542f}\u{52a8}\u{540c}\u{6b65}\u{521d}\u{59cb}\u{7ba1}\u{7406}\u{5458}**\u{ff1a}\u{542f}\u{52a8}\u{65f6}\u{81ea}\u{52a8}\u{521b}\u{5efa}\u{6216}\u{8986}\u{76d6}\u{5bc6}\u{7801}\u{5e76}\u{786e}\u{4fdd}\u{7ba1}\u{7406}\u{5458}\u{89d2}\u{8272}\u{ff0c}\u{6bcf}\u{6b21}\u{542f}\u{52a8}\u{5747}\u{540c}\u{6b65}\u{ff08}env \u{4f18}\u{5148}\u{4e8e} DB\u{ff09}\u{ff0c}\u{514d}\u{624b}\u{52a8}\u{9996}\u{6ce8}\u{518c}\u{6d41}\u{7a0b}\u{3002}\n- **\u{540e}\u{53f0}\u{5168}\u{9875}\u{9762}\u{8fc7}\u{6e21}\u{52a8}\u{753b}**\u{ff1a}\u{4eea}\u{8868}\u{76d8}\u{3001}\u{6587}\u{7ae0}\u{5217}\u{8868}\u{3001}\u{56de}\u{6536}\u{7ad9}\u{3001}\u{8bc4}\u{8bba}\u{3001}\u{5199}\u{4f5c}\u{3001}\u{7d20}\u{6750}\u{3001}\u{53cb}\u{94fe}\u{3001}MCP\u{3001}\u{4ee3}\u{7801}\u{8bd5}\u{8fd0}\u{884c}\u{3001}\u{7cfb}\u{7edf}\u{3001}\u{8bbe}\u{7f6e}\u{7b49}\u{9875}\u{9762}\u{7edf}\u{4e00}\u{589e}\u{52a0}\u{8fdb}\u{573a}\u{52a8}\u{753b}\u{ff08}\u{9875}\u{5934} / \u{884c} / \u{5361}\u{7247} stagger\u{ff09}\u{ff0c}\u{5206}\u{533a}\u{5207}\u{6362}\u{4e0e}\u{5207}\u{8bed}\u{8a00}\u{65f6}\u{91cd}\u{64ad}\u{3002}\n- **\u{7f16}\u{8f91}\u{5668}\u{63a5}\u{5165}\u{7d20}\u{6750}\u{5e93}\u{591a}\u{9009}\u{63d2}\u{56fe}**\u{ff1a}\u{5199}\u{4f5c}\u{9875}\u{6b63}\u{6587}\u{7f16}\u{8f91}\u{5668}\u{65b0}\u{589e} slash \u{547d}\u{4ee4}\u{300c}\u{7d20}\u{6750}\u{5e93}\u{300d}\u{4e0e} `insertImagesFromLibrary` \u{5b9e}\u{4f8b}\u{65b9}\u{6cd5}\u{ff1b}`AssetPickerModal` \u{591a}\u{9009}\u{6a21}\u{5f0f}\u{ff0c}\u{4e00}\u{6b21}\u{63d2}\u{5165}\u{591a}\u{5f20}\u{7ad9}\u{5185}\u{56fe}\u{7247}\u{3002}\n- **\u{7d20}\u{6750}\u{4e0a}\u{4f20}\u{5f39}\u{7a97}\u{589e}\u{5f3a}**\u{ff1a}\u{6539}\u{4e3a} worker \u{6c60}\u{5e76}\u{53d1}\u{4e0a}\u{4f20}\u{ff0c}\u{5e76}\u{53d1}\u{6570}\u{ff08}1\u{2013}8\u{ff0c}\u{9ed8}\u{8ba4} 3\u{ff09}\u{53ef}\u{5728}\u{7ad9}\u{70b9}\u{914d}\u{7f6e}\u{6216} `UPLOAD_CONCURRENCY` \u{73af}\u{5883}\u{53d8}\u{91cf}\u{8c03}\u{6574}\u{ff1b}\u{65b0}\u{589e}\u{4e0a}\u{4f20}\u{72b6}\u{6001}\u{5c55}\u{793a}\u{4e0e}\u{5f39}\u{7a97}\u{5185}\u{5206}\u{9875}\u{3002}\n- **\u{53cb}\u{94fe}\u{5934}\u{50cf}\u{7d20}\u{6750}\u{5e93}\u{9009}\u{62e9}**\u{ff1a}\u{540e}\u{53f0}\u{53cb}\u{94fe}\u{5934}\u{50cf}\u{652f}\u{6301}\u{4ece}\u{7d20}\u{6750}\u{5e93}\u{6311}\u{9009}\u{ff0c}\u{7edf}\u{4e00}\u{7d20}\u{6750}\u{5f39}\u{7a97}\u{6837}\u{5f0f}\u{3002}\n- **\u{706f}\u{7bb1}\u{67e5}\u{770b}\u{5668}\u{64cd}\u{63a7}**\u{ff1a}\u{56fe}\u{7247}\u{706f}\u{7bb1}\u{65b0}\u{589e}\u{5e95}\u{90e8}\u{6bdb}\u{73bb}\u{7483}\u{5de5}\u{5177}\u{680f}\u{ff08}\u{7f29}\u{5c0f}/\u{653e}\u{5927}/\u{987a}\u{65f6}\u{9488}\u{65cb}\u{8f6c} 90\u{b0}/\u{91cd}\u{7f6e}/\u{4e0b}\u{8f7d}\u{539f}\u{56fe}/\u{5173}\u{95ed}\u{ff09}\u{ff0c}\u{652f}\u{6301}\u{6eda}\u{8f6e}\u{951a}\u{5b9a}\u{5149}\u{6807}\u{7f29}\u{653e}\u{3001}\u{53cc}\u{51fb}\u{5207}\u{6362} 2.5\u{d7}\u{3001}\u{653e}\u{5927}\u{540e}\u{62d6}\u{62fd}\u{5e73}\u{79fb}\u{3001}\u{79fb}\u{52a8}\u{7aef}\u{53cc}\u{6307}\u{634f}\u{5408}\u{7f29}\u{653e}\u{4e0e}\u{7ad6}\u{76f4}\u{62d6}\u{62fd}\u{5173}\u{95ed}\u{ff0c}\u{5feb}\u{6377}\u{952e} `+`/`-` \u{7f29}\u{653e}\u{3001}`R` \u{65cb}\u{8f6c}\u{3001}`0` \u{91cd}\u{7f6e}\u{ff1b}\u{6309}\u{94ae}/\u{65cb}\u{8f6c}/\u{91cd}\u{7f6e}\u{5e26} 180ms \u{8fc7}\u{6e21}\u{52a8}\u{753b}\u{ff0c}\u{7f29}\u{653e}\u{65f6}\u{6d6e}\u{73b0}\u{500d}\u{7387}\u{5fbd}\u{6807}\u{ff0c}\u{5de5}\u{5177}\u{680f}\u{7a7a}\u{95f2} 2.5s \u{81ea}\u{52a8}\u{9690}\u{85cf}\u{3002}\n- **\u{706f}\u{7bb1}\u{56fe}\u{7247}\u{52a0}\u{8f7d}\u{5931}\u{8d25}\u{9519}\u{8bef}\u{6001}**\u{ff1a}\u{56fe}\u{7247}\u{52a0}\u{8f7d}\u{5931}\u{8d25}\u{65f6}\u{9000}\u{907f}\u{91cd}\u{8bd5}\u{3001}\u{663e}\u{793a} `is-error` \u{5360}\u{4f4d}\u{3001}\u{706f}\u{7bb1}\u{5185}\u{7ed9}\u{51fa}\u{63d0}\u{793a}\u{800c}\u{975e}\u{95ea}\u{9000}\u{3002}\n- **\u{4eea}\u{8868}\u{76d8} 30 \u{65e5}\u{53d1}\u{6587} sparkline**\u{ff1a}\u{603b}\u{6587}\u{7ae0}\u{6570}\u{5361}\u{5185}\u{5d4c}\u{8fd1} 30 \u{4e2a}\u{81ea}\u{7136}\u{65e5}\u{6bcf}\u{65e5}\u{65b0}\u{5efa}\u{6587}\u{7ae0}\u{6570}\u{8ff7}\u{4f60}\u{6298}\u{7ebf}\u{ff08}\u{771f}\u{5b9e}\u{6570}\u{636e}\u{ff0c}`get_post_stats` \u{9644}\u{5e26} `activity_30d` \u{5e8f}\u{5217}\u{ff0c}\u{968f}\u{7edf}\u{8ba1}\u{7f13}\u{5b58}\u{ff09}\u{ff0c}\u{6298}\u{7ebf} + \u{6de1}\u{8272}\u{9762}\u{79ef}\u{586b}\u{5145}\u{ff0c}\u{5168}\u{96f6}\u{65f6}\u{5982}\u{5b9e}\u{5448}\u{73b0}\u{5e73}\u{7ebf}\u{3002}\n- **\u{4eea}\u{8868}\u{76d8}\u{63a5}\u{53e3}\u{5931}\u{8d25}\u{91cd}\u{8bd5}**\u{ff1a}\u{7edf}\u{8ba1}\u{3001}\u{8fd1}\u{671f}\u{6587}\u{7ae0}\u{3001}\u{5f85}\u{5ba1}\u{8bc4}\u{8bba}\u{4e09}\u{8def}\u{52a0}\u{8f7d}\u{5404}\u{81ea}\u{5e26}\u{5931}\u{8d25}\u{6001}\u{ff0c}\u{63a5}\u{53e3}\u{5931}\u{8d25}\u{663e}\u{793a}\u{300c}\u{52a0}\u{8f7d}\u{5931}\u{8d25} + \u{91cd}\u{8bd5}\u{300d}\u{ff0c}\u{4e0d}\u{518d}\u{9aa8}\u{67b6}\u{5c4f}\u{6c38}\u{8f6c}\u{ff0c}\u{4e5f}\u{4e0d}\u{56de}\u{9000}\u{6210} 0\u{3002}\n- **\u{5199}\u{4f5c}\u{9875}\u{5c01}\u{9762}\u{56fe}\u{589e}\u{5f3a}**\u{ff1a}\u{5c01}\u{9762}\u{56fe}\u{70b9}\u{51fb}\u{653e}\u{5927}\u{706f}\u{7bb1}\u{3001}\u{62d6}\u{62fd}\u{66ff}\u{6362}\u{3001}hover \u{5de5}\u{5177}\u{680f}\u{ff0c}\u{52a0}\u{8f7d}\u{671f}\u{95f4}\u{663e}\u{793a}\u{9aa8}\u{67b6}\u{5360}\u{4f4d}\u{3002}\n- **\u{9875}\u{811a}\u{53ef}\u{914d}\u{7f6e} GitHub \u{56fe}\u{6807}**\u{ff1a}\u{9875}\u{811a}\u{5bbd}\u{5ea6}\u{5bf9}\u{9f50} header\u{ff0c}\u{65b0}\u{589e}\u{53ef}\u{914d}\u{7f6e} GitHub \u{56fe}\u{6807}\u{3002}\n- **`x-yggdrasil-hash` \u{54cd}\u{5e94}\u{5934}**\u{ff1a}\u{670d}\u{52a1}\u{7aef}\u{65b0}\u{589e}\u{66b4}\u{9732} git commit hash \u{7684}\u{54cd}\u{5e94}\u{5934}\u{ff08}`EXPOSE_VERSION_HEADERS` \u{63a7}\u{5236}\u{ff09}\u{3002}\n- **\u{56fe}\u{6807}\u{7cfb}\u{7edf}\u{5316}**\u{ff1a}\u{641c}\u{7d22}\u{6846}\u{6e05}\u{9664}\u{6309}\u{94ae}\u{3001}\u{7f16}\u{8f91}\u{5668}\u{5207}\u{6362}\u{6309}\u{94ae}\u{7b49}\u{6539}\u{7528} Material Symbols \u{56fe}\u{6807}\u{ff0c}\u{5e76}\u{65b0}\u{589e}\u{56fe}\u{6807}\u{5de5}\u{4f5c}\u{6d41} skill \u{89c4}\u{8303}\u{5316}\u{5185}\u{8054} SVG \u{6d41}\u{7a0b}\u{3002}\n- **\u{53cc}\u{673a}\u{90e8}\u{7f72}\u{811a}\u{672c}**\u{ff1a}\u{65b0}\u{589e} `both.fish` \u{53cc}\u{673a}\u{90e8}\u{7f72}\u{811a}\u{672c}\u{ff08}xun Primary + rua Replica\u{ff09}\u{3002}\n\n### Changed\n\n- **WASM \u{4f53}\u{79ef}\u{4f18}\u{5316}**\u{ff1a}\u{58f0}\u{660e} `wasm-release` profile\u{ff08}`opt-level=\"z\"` / `lto=\"fat\"`\u{ff0c}\u{593a}\u{56de} dx \u{9ed8}\u{8ba4}\u{6ce8}\u{5165}\u{7684} `opt-level=\"s\"`\u{ff0c}WASM \u{4ea7}\u{7269} ~2.7MB vs \u{539f} 3.47MB\u{ff09}\u{ff1b}\u{5168}\u{90e8}\u{9759}\u{6001}\u{6587}\u{672c}\u{8d44}\u{6e90}\u{ff08}WASM / JS / CSS\u{ff09}\u{6784}\u{5efa}\u{671f}\u{9884}\u{538b}\u{7f29}\u{4e3a} `.br` \u{65c1}\u{8f66}\u{ff0c}\u{670d}\u{52a1}\u{7aef}\u{7ecf} `precompressed_br()` \u{76f4}\u{53d1}\u{ff0c}\u{96f6}\u{8fd0}\u{884c}\u{65f6} CPU\u{ff0c}wire size \u{964d}\u{81f3} ~732KB\u{3002}\n- **\u{90e8}\u{7f72}\u{6539}\u{4e3a} pull-based**\u{ff1a}xun \u{4ece} GHCR \u{62c9}\u{53d6}\u{955c}\u{50cf}\u{90e8}\u{7f72}\u{ff08}\u{66ff}\u{4ee3} scp \u{63a8}\u{9001}\u{ff09}\u{ff0c}\u{5e76}\u{63a5}\u{5165} rua DR \u{526f}\u{672c}\u{53ef}\u{9009}\u{81ea}\u{52a8}\u{90e8}\u{7f72}\u{ff08}best-effort\u{ff09}\u{ff1b}runtime \u{955c}\u{50cf}\u{7531} scratch \u{6362}\u{4e3a} alpine + postgresql16-client\u{ff0c}\u{652f}\u{6301} `pg_dump`/`psql` \u{5907}\u{4efd}\u{3002}\n- **\u{56fe}\u{7247}\u{9650}\u{6d41}\u{6309}\u{7f13}\u{5b58} miss \u{8ba1}\u{8d39}**\u{ff1a}\u{56fe}\u{7247}\u{5904}\u{7406}\u{9650}\u{6d41}\u{6539}\u{4e3a}\u{6309}\u{7f13}\u{5b58} miss \u{8ba1}\u{8d39} + \u{5e76}\u{53d1}\u{5904}\u{7406}\u{4e0a}\u{9650} + 429 \u{54cd}\u{5e94}\u{643a}\u{5e26} `Retry-After`\u{ff0c}\u{907f}\u{514d}\u{5bf9}\u{7f13}\u{5b58}\u{547d}\u{4e2d}\u{8bf7}\u{6c42}\u{8bef}\u{9650}\u{3002}\n- **\u{4eea}\u{8868}\u{76d8}\u{8d8b}\u{52bf}\u{5fbd}\u{7ae0}\u{771f}\u{5b9e}\u{5316}**\u{ff1a}\u{603b}\u{6587}\u{7ae0}\u{6570}\u{5361}\u{5199}\u{6b7b}\u{7684}\u{300c}+12%\u{300d}\u{6539}\u{4e3a}\u{771f}\u{5b9e}\u{7684}\u{8fd1} 30 \u{5929}\u{65b0}\u{589e}\u{7bc7}\u{6570}\u{ff08}`PostStats.recent_30d`\u{ff09}\u{ff0c}>0 \u{65f6}\u{7eff}\u{8272}\u{5fbd}\u{7ae0} + \u{2191} \u{7bad}\u{5934}\u{53cc}\u{7f16}\u{7801}\u{ff08}WCAG 2.2 SC 1.4.1\u{ff09}\u{ff0c}+0 \u{8d70}\u{4e2d}\u{6027}\u{63cf}\u{8fb9}\u{ff1b}\u{300c}\u{6d3b}\u{8dc3}\u{300d}\u{300c}\u{5f85}\u{5904}\u{7406}\u{300d}\u{5360}\u{4f4d}\u{5fbd}\u{7ae0}\u{79fb}\u{9664}\u{3002}\n- **\u{4eea}\u{8868}\u{76d8}\u{52a8}\u{6548}\u{9884}\u{7b97}\u{6536}\u{7d27}**\u{ff1a}\u{5361}\u{7247} hover \u{8fc7}\u{6e21} 300\u{2192}200ms\u{3001}\u{5165}\u{573a}\u{53bb}\u{6389}\u{5185}\u{8054} 600ms \u{56de}\u{9000}\u{5230} 400ms \u{7c7b}\u{9ed8}\u{8ba4}\u{3001}CountUp \u{6570}\u{5b57}\u{6eda}\u{52a8} 900\u{2192}450ms\u{ff1b}\u{6570}\u{503c}\u{8865} `tabular-nums` \u{9632}\u{6eda}\u{52a8}\u{5bbd}\u{5ea6}\u{8df3}\u{52a8}\u{ff1b}\u{5f85}\u{5ba1}\u{5361} amber \u{6587}\u{5b57}\u{63d0}\u{4eae}\u{81f3} `amber-600/dark:amber-400` \u{8fbe} AA \u{5bf9}\u{6bd4}\u{ff1b}\u{8fd1}\u{671f}\u{6587}\u{7ae0}\u{884c} hover \u{6d6e}\u{73b0} \u{2192} \u{7bad}\u{5934}\u{3002}\n- **\u{706f}\u{7bb1}\u{6eda}\u{8f6e}\u{884c}\u{4e3a}**\u{ff1a}\u{684c}\u{9762}\u{7aef}\u{6eda}\u{8f6e}\u{7531}\u{300c}\u{6eda}\u{52a8}\u{5173}\u{95ed}\u{9875}\u{9762}\u{300d}\u{6539}\u{4e3a}\u{7f29}\u{653e}\u{56fe}\u{7247}\u{ff08}2026 \u{56fe}\u{7247}\u{67e5}\u{770b}\u{5668}\u{60ef}\u{4f8b}\u{ff09}\u{ff1b}\u{5173}\u{95ed}\u{624b}\u{52bf}\u{5728}\u{79fb}\u{52a8}\u{7aef}\u{7531}\u{6eda}\u{52a8}\u{9a71}\u{52a8}\u{6539}\u{4e3a}\u{7ad6}\u{76f4}\u{62d6}\u{62fd}\u{76f4}\u{63a5}\u{9a71}\u{52a8}\u{ff0c}\u{884c}\u{7a0b}\u{9608}\u{503c}\u{4fdd}\u{6301} 120px\u{3002}\n- **Checkbox \u{7ec4}\u{4ef6}\u{7edf}\u{4e00}**\u{ff1a}\u{5c01}\u{88c5}\u{5e26}\u{63cf}\u{8fb9}\u{52fe}\u{753b}\u{52a8}\u{753b}\u{7684} `CHECKBOX_CLASS`\u{ff0c}\u{8fc1}\u{79fb}\u{5168}\u{9879}\u{76ee}\u{8c03}\u{7528}\u{65b9}\u{3002}\n- **\u{540e}\u{53f0}\u{516c}\u{5171}\u{7ec4}\u{4ef6}\u{6536}\u{655b}**\u{ff1a}\u{7edf}\u{4e00}\u{590d}\u{7528} `FormInput`/`FormSelect`/`Popover` \u{7b49}\u{516c}\u{5171}\u{7ec4}\u{4ef6}\u{ff0c}\u{6d88}\u{9664}\u{5185}\u{8054}\u{91cd}\u{590d}\u{6837}\u{5f0f}\u{4e0e}\u{4fe1}\u{606f}\u{6cc4}\u{6f0f}\u{ff1b}`components` \u{6a21}\u{5757}\u{6309}\u{53ef}\u{590d}\u{7528}\u{5c42}\u{7ea7}\u{91cd}\u{7ec4}\u{5e76}\u{52a0}\u{5bfc}\u{822a}\u{6587}\u{6863}\u{3002}\n\n### Fixed\n\n- **\u{6570}\u{636e}\u{5e93}\u{5907}\u{4efd}\u{6062}\u{590d}\u{53ef}\u{79fb}\u{690d}\u{6027}\u{4e0e}\u{539f}\u{5b50}\u{6027}**\u{ff1a}\u{65b0}\u{5907}\u{4efd}\u{4e0d}\u{518d}\u{5199}\u{5165}\u{6570}\u{636e}\u{5e93}\u{5c5e}\u{4e3b}/ACL \u{5143}\u{6570}\u{636e}\u{ff1b}\u{6062}\u{590d}\u{65e7}\u{5907}\u{4efd}\u{65f6}\u{5b89}\u{5168}\u{79fb}\u{9664} pg_dump \u{5c5e}\u{4e3b}\u{8bed}\u{53e5}\u{ff0c}\u{5e76}\u{7528}\u{5355}\u{4e8b}\u{52a1}\u{6267}\u{884c}\u{ff0c}\u{76ee}\u{6807}\u{73af}\u{5883}\u{7f3a}\u{5c11}\u{6e90}\u{5e93}\u{89d2}\u{8272}\u{6216}\u{4efb}\u{4e00} SQL \u{5931}\u{8d25}\u{65f6}\u{4e0d}\u{518d}\u{7559}\u{4e0b}\u{534a}\u{6062}\u{590d}\u{6570}\u{636e}\u{5e93}\u{3002}\n- **\u{7d20}\u{6750}\u{91cd}\u{5efa}\u{7d22}\u{5f15}\u{8bef}\u{5220}\u{5927}\u{56fe}\u{7247} (#30)**\u{ff1a}\u{91cd}\u{5efa}\u{7d22}\u{5f15}\u{6b64}\u{524d}\u{5bf9}\u{5927}\u{4f53}\u{79ef} WebP/JPEG \u{91cd}\u{65b0}\u{8f6c}\u{7801}\u{5e76}\u{8bef}\u{5220}\u{ff0c}\u{73b0}\u{4fdd}\u{7559}\u{539f}\u{56fe}\u{3001}\u{4fdd}\u{7559}\u{539f}\u{59cb}\u{6587}\u{4ef6}\u{540d}\u{ff1b}\u{52a8}\u{56fe}\u{ff08}GIF/WebP animation\u{ff09}\u{4fdd}\u{7559}\u{52a8}\u{753b}\u{7ed5}\u{8fc7}\u{5904}\u{7406}\u{6d41}\u{6c34}\u{7ebf}\u{3002}\n- **\u{706f}\u{7bb1}\u{64cd}\u{63a7}\u{52a8}\u{753b}**\u{ff1a}\u{4fee}\u{590d}\u{6253}\u{5f00}\u{706f}\u{7bb1}\u{540e}\u{9996}\u{4e0b}\u{7f29}\u{653e}/\u{65cb}\u{8f6c}\u{51fa}\u{73b0}\u{975e}\u{5747}\u{5300}\u{7f29}\u{653e}\u{56de}\u{5f39}\u{4e0e}\u{8d77}\u{59cb}\u{5e27}\u{8df3}\u{53d8}\u{ff08}\u{5f3a}\u{5236} reflow \u{63d0}\u{4ea4}\u{5f52}\u{4e00}\u{5316}\u{57fa}\u{6001}\u{77e9}\u{9635}\u{540e}\u{542f}\u{52a8}\u{8fc7}\u{6e21}\u{ff09}\u{ff1b}\u{65cb}\u{8f6c}\u{6539}\u{4e3a}\u{7ed5}\u{7167}\u{7247}\u{4e2d}\u{5fc3}\u{539f}\u{5730}\u{8fdb}\u{884c}\u{ff1b}\u{5173}\u{95ed}\u{98de}\u{884c}\u{4e0d}\u{518d}\u{53cd}\u{5411}\u{7a7a}\u{8f6c}\u{ff1b}\u{6253}\u{5f00}\u{65f6}\u{80cc}\u{666f}\u{906e}\u{7f69}\u{4e0d}\u{518d}\u{95ea}\u{70c1}\u{ff1b}\u{52a0}\u{8f7d}\u{5931}\u{8d25}\u{65f6}\u{4e0d}\u{518d}\u{9057}\u{7559}\u{4e0d}\u{53ef}\u{89c1}\u{906e}\u{7f69}\u{5c42}\u{3002}\n- **admin \u{5361}\u{7247} hover \u{65e0}\u{8fc7}\u{6e21}\u{52a8}\u{753b}**\u{ff1a}`ADMIN_CARD_CLASS`/`ADMIN_TABLE_CLASS` \u{5c3e}\u{90e8}\u{7684} `transition-colors` \u{5728} Tailwind v4 \u{7f16}\u{8bd1}\u{4ea7}\u{7269}\u{4e2d}\u{6392}\u{5728} `.transition-all` \u{4e4b}\u{540e}\u{ff0c}\u{8986}\u{76d6}\u{4e86}\u{7ec4}\u{4ef6}\u{8ffd}\u{52a0}\u{7684} `transition-all`\u{ff0c}\u{5bfc}\u{81f4} hover \u{4f4d}\u{79fb}/\u{9634}\u{5f71}\u{77ac}\u{65f6}\u{8df3}\u{53d8}\u{ff1b}\u{6539}\u{4e3a}\u{88f8} `transition`\u{3002}\n- **\u{4eea}\u{8868}\u{76d8}\u{8fd1}\u{671f}\u{6587}\u{7ae0}\u{4e0d}\u{53ef}\u{70b9}\u{51fb}**\u{ff1a}\u{884c}\u{5bb9}\u{5668}\u{7531} `div` + `cursor-pointer` \u{6539}\u{4e3a} `Link`\u{ff0c}\u{6574}\u{884c}\u{8df3}\u{8f6c} `/admin/preview/:slug` \u{53ea}\u{8bfb}\u{9884}\u{89c8}\u{ff0c}\u{8349}\u{7a3f}\u{4ea6}\u{53ef}\u{9884}\u{89c8}\u{3002}\n- **migration 005 \u{5e42}\u{7b49}**\u{ff1a}005 \u{8fc1}\u{79fb}\u{7684} comments \u{89e6}\u{53d1}\u{5668}\u{6539}\u{4e3a}\u{5e42}\u{7b49}\u{ff0c}\u{91cd}\u{590d}\u{6267}\u{884c}\u{4e0d}\u{518d}\u{62a5}\u{9519}\u{3002}\n- **\u{9650}\u{6d41}\u{65e5}\u{5fd7}\u{4e0e}\u{9519}\u{8bef}**\u{ff1a}\u{65e0}\u{6cd5}\u{83b7}\u{53d6}\u{5ba2}\u{6237}\u{7aef} IP \u{7684} WARN \u{6539}\u{4e3a}\u{8fdb}\u{7a0b}\u{7ea7} warn-once\u{ff0c}\u{907f}\u{514d}\u{65e5}\u{5fd7}\u{5237}\u{5c4f}\u{ff1b}\u{56fe}\u{7247}\u{9650}\u{6d41}\u{54cd}\u{5e94}\u{9519}\u{8bef}\u{88c5}\u{7bb1}\u{4fee}\u{590d}\u{3002}\n- **\u{6784}\u{5efa}\u{94fe}\u{4fee}\u{590d}**\u{ff1a}\u{7a7a} `RUSTC_WRAPPER` \u{89c4}\u{907f} sccache \u{4e0e} dx \u{7684} rustc \u{5305}\u{88c5}\u{94fe}\u{51b2}\u{7a81}\u{ff1b}\u{6e05}\u{7406}\u{53cc}\u{76ee}\u{6807}\u{6784}\u{5efa} warning\u{ff1b}\u{53d1}\u{5e03}\u{6784}\u{5efa}\u{524d}\u{68c0}\u{67e5} brotli \u{53ef}\u{7528}\u{6027}\u{ff1b}`make fix` / docker-fix \u{79fb}\u{9664} `dx fmt`\u{3002}\n- **\u{53cb}\u{94fe}\u{7ba1}\u{7406}**\u{ff1a}\u{4fee}\u{590d}\u{540e}\u{53f0}\u{53cb}\u{94fe}\u{5934}\u{50cf}\u{4e0d}\u{663e}\u{793a}\u{3001}\u{9ed8}\u{8ba4}\u{6392}\u{5e8f}\u{503c}\u{7f3a}\u{5931}\u{3001}\u{7d20}\u{6750}\u{5e93}\u{5934}\u{50cf}\u{8def}\u{5f84}\u{3001}\u{5220}\u{9664}\u{786e}\u{8ba4}\u{6539}\u{7528} Tooltip\u{3001}\u{7d20}\u{6750}\u{5f39}\u{7a97}\u{5b9a}\u{4f4d}\u{504f}\u{79fb}\u{7b49}\u{95ee}\u{9898}\u{3002}\n- **\u{7d20}\u{6750}\u{5f39}\u{7a97}\u{4e0e}\u{5361}\u{7247}**\u{ff1a}\u{5f39}\u{7a97}\u{5173}\u{95ed}\u{52a8}\u{753b}\u{5931}\u{6548}\u{3001}\u{63d0}\u{793a}\u{6846}\u{6d88}\u{5931}\u{7f3a}\u{9000}\u{51fa}\u{52a8}\u{753b}\u{3001}\u{5a92}\u{4f53}\u{5361}\u{7247}\u{5706}\u{89d2}\u{4e0d}\u{7edf}\u{4e00}\u{7b49}\u{7ec6}\u{8282}\u{4fee}\u{590d}\u{3002}\n\n## [0.10.1] - 2026-08-06\n\n### Added\n\n- **\u{8349}\u{7a3f}\u{9884}\u{89c8}\u{9875}**\u{ff1a}\u{767b}\u{5f55}\u{540e}\u{53ef}\u{5728} `/admin/preview/:slug` \u{9884}\u{89c8}\u{8349}\u{7a3f}\u{6587}\u{7ae0}\u{ff0c}\u{5e76}\u{914d}\u{7f6e}\u{4e13}\u{5c5e}\u{9aa8}\u{67b6}\u{5c4f}\u{3002}\n- **\u{751f}\u{4ea7}\u{955c}\u{50cf}\u{7248}\u{672c} tag**\u{ff1a}\u{751f}\u{4ea7} Docker \u{955c}\u{50cf}\u{652f}\u{6301}\u{6309}\u{7248}\u{672c}\u{53f7}\u{6253} tag\u{3002}\n\n### Changed\n\n- **\u{955c}\u{50cf}\u{6784}\u{5efa}\u{52a0}\u{901f}**\u{ff1a}\u{9884}\u{7f13}\u{5b58} wasm-bindgen-cli \u{4e0e} cargo buildx cache mount\u{ff0c}\u{7f29}\u{77ed}\u{955c}\u{50cf}\u{6784}\u{5efa}\u{65f6}\u{95f4}\u{3002}\n\n### Fixed\n\n- **\u{9884}\u{89c8}\u{9875}\u{7a7a}\u{767d}\u{95ea}\u{70c1}**\u{ff1a}\u{4fee}\u{590d}\u{9884}\u{89c8}\u{9875}\u{9aa8}\u{67b6}\u{5c4f}\u{7ed3}\u{675f}\u{540e}\u{4e3b}\u{5185}\u{5bb9}\u{533a}\u{51fa}\u{73b0}\u{7a7a}\u{767d}\u{95ea}\u{70c1}\u{7684}\u{95ee}\u{9898}\u{3002}\n- **\u{9aa8}\u{67b6}\u{5c4f}\u{5bbd}\u{5ea6}\u{574d}\u{7f29}**\u{ff1a}\u{4fee}\u{590d}\u{9884}\u{89c8}\u{9aa8}\u{67b6}\u{5c4f}\u{5728}\u{767b}\u{5f55}\u{6821}\u{9a8c}\u{671f}\u{95f4}\u{5bbd}\u{5ea6}\u{574d}\u{7f29}\u{7684}\u{95ee}\u{9898}\u{3002}\n\n## [0.10.0] - 2026-08-05\n\n### Added\n\n- **WGSL \u{4ee3}\u{7801}\u{9ad8}\u{4eae}**\u{ff1a}\u{65b0}\u{589e} WGSL \u{8bed}\u{8a00}\u{8bed}\u{6cd5}\u{9ad8}\u{4eae}\u{652f}\u{6301}\u{3002}\n- **\u{6587}\u{7ae0}\u{5916}\u{94fe}\u{56fe}\u{7247}\u{706f}\u{7bb1}\u{4e0e}\u{6df7}\u{5408}\u{56fe}\u{96c6}**\u{ff1a}Lightbox \u{652f}\u{6301}\u{76f4}\u{63a5}\u{653e}\u{5927}\u{6587}\u{7ae0}\u{5916}\u{94fe}\u{56fe}\u{7247}\u{ff0c}\u{5e76}\u{4e0e}\u{7ad9}\u{5185}\u{56fe}\u{7247}\u{65e0}\u{7f1d}\u{7ec4}\u{5408}\u{4e3a}\u{6df7}\u{5408}\u{56fe}\u{96c6}\u{3002}\n- **\u{7d20}\u{6750}\u{7ba1}\u{7406}\u{4e0e}\u{4e0a}\u{4f20}\u{5f39}\u{7a97}**\u{ff1a}\u{7d20}\u{6750}\u{7ba1}\u{7406}\u{9875}\u{65b0}\u{589e}\u{5185}\u{5d4c}\u{4e0a}\u{4f20}\u{5f39}\u{7a97}\u{ff0c}\u{652f}\u{6301}\u{5f00}\u{5408}/\u{72b6}\u{6001}\u{5207}\u{6362}\u{8fc7}\u{6e21}\u{52a8}\u{753b}\u{4e0e}\u{7d20}\u{6750}\u{7f51}\u{683c}\u{5165}\u{573a}\u{9636}\u{68af}\u{52a8}\u{753b}\u{3002}\n- **\u{540e}\u{53f0}\u{5bfc}\u{822a}\u{83dc}\u{5355}\u{5206}\u{7ec4}**\u{ff1a}\u{4fa7}\u{8fb9}\u{680f}\u{5f15}\u{5165}\u{300c}\u{5185}\u{5bb9}\u{7ba1}\u{7406}\u{300d}\u{4e0e}\u{300c}\u{5de5}\u{5177}\u{300d}\u{53ef}\u{6298}\u{53e0}\u{5b50}\u{83dc}\u{5355}\u{7ec4}\u{ff0c}\u{6574}\u{5408}\u{56de}\u{6536}\u{7ad9}\u{3001}\u{8bd5}\u{8fd0}\u{884c}\u{3001}MCP \u{4e0e}\u{7cfb}\u{7edf}\u{8bbe}\u{7f6e}\u{9875}\u{9762}\u{3002}\n- **\u{81ea}\u{5b9a}\u{4e49} Checkbox \u{4e0e}\u{64cd}\u{4f5c}\u{680f}\u{52a8}\u{753b}**\u{ff1a}\u{7edf}\u{4e00}\u{540e}\u{53f0} Checkbox \u{6837}\u{5f0f}\u{4e3a}\u{4e3b}\u{9898}\u{8272}\u{81ea}\u{5b9a}\u{4e49}\u{65b9}\u{6846}\u{ff0c}\u{589e}\u{52a0}\u{6279}\u{91cf}\u{64cd}\u{4f5c}\u{680f}\u{5c55}\u{5f00}/\u{6536}\u{8d77}\u{8fc7}\u{6e21}\u{6548}\u{679c}\u{3002}\n- **Code Runner \u{5c31}\u{7eea}\u{63a2}\u{6d4b}\u{4e0e}\u{4f18}\u{5316}**\u{ff1a}\u{589e}\u{52a0} Docker \u{542f}\u{52a8}\u{671f}\u{5c31}\u{7eea}\u{63a2}\u{6d4b}\u{4e0e}\u{8fd0}\u{884c}\u{65f6}\u{9519}\u{8bef}\u{5206}\u{7c7b}\u{ff1b}Go \u{8bed}\u{8a00}\u{4ee3}\u{7801}\u{5757}\u{5b9e}\u{73b0}\u{8de8}\u{8fd0}\u{884c}\u{5171}\u{4eab}\u{5377}\u{6784}\u{5efa}\u{7f13}\u{5b58}\u{63d0}\u{5347}\u{6267}\u{884c}\u{6548}\u{7387}\u{ff1b}\u{8de8}\u{8bed}\u{8a00}\u{5207}\u{6362}\u{65f6}\u{81ea}\u{52a8}\u{91cd}\u{8f7d}\u{7f16}\u{8f91}\u{7ec4}\u{4ef6}\u{3002}\n\n### Changed\n\n- **\u{6027}\u{80fd}\u{4e0e}\u{5185}\u{5b58}\u{4f18}\u{5316}**\u{ff1a}sanitizer \u{70ed}\u{8def}\u{5f84}\u{6d88}\u{9664}\u{6bcf}\u{5143}\u{7d20} HashSet \u{5206}\u{914d}\u{ff0c}\u{501f}\u{7528}\u{66ff}\u{4ee3} clone \u{51cf}\u{5c11}\u{5197}\u{4f59}\u{5206}\u{914d}\u{3002}\n- **Dioxus \u{4f9d}\u{8d56}\u{5347}\u{7ea7}**\u{ff1a}\u{5347}\u{7ea7} Dioxus \u{6838}\u{5fc3}\u{6846}\u{67b6}\u{4f9d}\u{8d56}\u{81f3} 0.7.10\u{3002}\n\n### Fixed\n\n- **Markdown \u{590d}\u{6742}\u{8868}\u{683c}\u{4e0e}\u{516c}\u{5f0f}**\u{ff1a}\u{4fee}\u{590d} Markdown \u{8868}\u{683c}\u{5185}\u{516c}\u{5f0f}\u{5bfc}\u{81f4}\u{5355}\u{5143}\u{683c}\u{9519}\u{6e32}\u{67d3}\u{4e3a} `<th>` \u{7684}\u{95ee}\u{9898}\u{ff0c}\u{4f18}\u{5316}\u{590d}\u{6742}\u{8868}\u{683c}\u{6837}\u{5f0f}\u{3002}\n- **KaTeX \u{b7} \u{7b26}\u{53f7}\u{6e32}\u{67d3}**\u{ff1a}\u{4fee}\u{590d} `\\text{}` \u{5185} `\u{b7}` (U+00B7) \u{6e32}\u{67d3}\u{4e3a}\u{7ea2}\u{5b57} `\\cdotp` \u{7684}\u{95ee}\u{9898} (#13)\u{3002}\n- **\u{5207}\u{9875}\u{8bc4}\u{8bba}\u{4e0e}\u{9009}\u{62e9}\u{5668}\u{6b8b}\u{7559}**\u{ff1a}\u{5207}\u{6362}\u{6587}\u{7ae0}\u{65f6}\u{5f3a}\u{5236}\u{91cd}\u{8f7d}\u{8bc4}\u{8bba}\u{7ec4}\u{4ef6}\u{9632}\u{6b62}\u{5386}\u{53f2}\u{8bc4}\u{8bba}\u{6b8b}\u{7559} (#10)\u{ff1b}\u{4fee}\u{590d}\u{6279}\u{91cf}\u{64cd}\u{4f5c}\u{680f}\u{6536}\u{8d77}\u{540e}\u{6b8b}\u{5b58}\u{95f4}\u{8ddd}\u{4e0e}\u{91cd}\u{5efa}\u{6309}\u{94ae} Tooltip \u{88c1}\u{5207}\u{95ee}\u{9898}\u{3002}\n- **\u{7d20}\u{6750}\u{7c98}\u{5e16}\u{4e0a}\u{4f20}\u{4e0e}\u{5f39}\u{7a97}\u{52a8}\u{753b}**\u{ff1a}\u{4fee}\u{590d}\u{539f}\u{751f}\u{76d1}\u{542c}\u{5668}\u{5185} spawn \u{7a7a} scope \u{6808} panic \u{4ee5}\u{53ca}\u{4e0a}\u{4f20}\u{5f39}\u{7a97}\u{5173}\u{95ed}\u{52a8}\u{753b}\u{5931}\u{6548}\u{95ee}\u{9898}\u{3002}\n- **\u{5f00}\u{53d1}\u{4e0e}\u{5bb9}\u{5668}\u{73af}\u{5883}**\u{ff1a}\u{4fee}\u{590d} Docker \u{5f00}\u{53d1}\u{5bb9}\u{5668}\u{4e0b}\u{6302}\u{8f7d} uploads \u{76ee}\u{5f55}\u{5bfc}\u{81f4}\u{7684}\u{7d20}\u{6750}\u{56fe} 404 \u{53ca} pnpm \u{65e7}\u{6a21}\u{5757}\u{6e05}\u{7406}\u{3002}\n## [0.9.0] - 2026-08-03\n\n### Added\n\n- **\u{684c}\u{9762}\u{7aef}\u{60ac}\u{6d6e}\u{76ee}\u{5f55}\u{ff08}TOC\u{ff09}**\u{ff1a}\u{6587}\u{7ae0}\u{9875}\u{65b0}\u{589e}\u{5c11}\u{6570}\u{6d3e}\u{98ce}\u{683c}\u{60ac}\u{6d6e}\u{76ee}\u{5f55}\u{ff0c}\u{652f}\u{6301}\u{6eda}\u{52a8}\u{76d1}\u{542c}\u{ff08}scroll-spy\u{ff09}\u{3001}\u{60ac}\u{6d6e}\u{5c55}\u{5f00}\u{4e0e}\u{56fa}\u{5b9a}\u{ff08}pin\u{ff09}\u{6a21}\u{5f0f}\u{3002}\n- **\u{79fb}\u{52a8}\u{7aef}\u{5bfc}\u{822a}\u{52a8}\u{753b}**\u{ff1a}\u{4e3a}\u{79fb}\u{52a8}\u{7aef}\u{9876}\u{90e8}\u{5bfc}\u{822a}\u{83dc}\u{5355}\u{6dfb}\u{52a0}\u{53cc}\u{5411}\u{5e73}\u{6ed1}\u{5c55}\u{5f00}/\u{6298}\u{53e0}\u{4e0e}\u{56fe}\u{6807}\u{5fae}\u{52a8}\u{52a8}\u{753b}\u{3002}\n- **\u{53cb}\u{94fe}\u{7ba1}\u{7406}\u{529f}\u{80fd}**\u{ff1a}\u{65b0}\u{589e}\u{540e}\u{53f0}\u{53cb}\u{94fe} CRUD \u{7ba1}\u{7406}\u{3001}\u{524d}\u{53f0} `/friends` \u{5217}\u{8868}\u{5c55}\u{793a}\u{53ca} moka \u{9ad8}\u{6548}\u{7f13}\u{5b58}\u{3002}\n- **\u{8ba2}\u{9605} Feed \u{7aef}\u{70b9}**\u{ff1a}\u{65b0}\u{589e} RSS 2.0 (`/feed.xml` / `/rss.xml`) \u{4e0e} JSON Feed 1.1 (`/feed.json`) \u{8ba2}\u{9605}\u{751f}\u{6210}\u{4e0e}\u{8f93}\u{51fa}\u{7aef}\u{70b9}\u{3002}\n- **Changelog \u{7ed3}\u{6784}\u{5316}\u{65f6}\u{95f4}\u{7ebf}**\u{ff1a}\u{7248}\u{672c}\u{53d8}\u{66f4}\u{65e5}\u{5fd7}\u{5347}\u{7ea7}\u{4e3a}\u{7ed3}\u{6784}\u{5316}\u{89e3}\u{6790} + \u{65f6}\u{95f4}\u{7ebf}\u{5361}\u{7247} UI\u{3002}\n\n### Fixed\n\n- **Changelog \u{5bfc}\u{822a}\u{9ad8}\u{4eae}**\u{ff1a}\u{4fee}\u{590d} CHANGELOG \u{4fa7}\u{680f}\u{7248}\u{672c}\u{5bfc}\u{822a}\u{9ad8}\u{4eae}\u{672a}\u{80fd}\u{7cbe}\u{51c6}\u{8ddf}\u{968f}\u{5f53}\u{524d}\u{9605}\u{8bfb}\u{4f4d}\u{7f6e}\u{7684}\u{95ee}\u{9898}\u{3002}\n- **\u{53cb}\u{94fe}\u{5220}\u{9664}\u{56de}\u{8c03}**\u{ff1a}\u{4fee}\u{590d}\u{540e}\u{53f0}\u{53cb}\u{94fe}\u{5220}\u{9664}\u{786e}\u{8ba4}\u{6846}\u{5f39}\u{7a97}\u{56de}\u{8c03}\u{8bed}\u{6cd5}\u{9519}\u{8bef}\u{3002}\n- **CI \u{591a}\u{67b6}\u{6784}\u{6784}\u{5efa}**\u{ff1a}\u{4fee}\u{590d} GHCR \u{955c}\u{50cf}\u{6784}\u{5efa}\u{811a}\u{672c}\u{4e2d} `docker image inspect` \u{83b7}\u{53d6} Architecture \u{6807}\u{8bc6}\u{7684}\u{95ee}\u{9898}\u{3002}\n\n## [0.8.3] - 2026-08-03\n\n### Added\n\n- **Mermaid \u{6d41}\u{7a0b}\u{56fe}\u{5168}\u{5c4f}\u{653e}\u{5927}\u{6d6e}\u{5c42}**\u{ff1a}\u{590d}\u{6742}/\u{5bbd}\u{6d41}\u{7a0b}\u{56fe}\u{652f}\u{6301}\u{5168}\u{5c4f}\u{70b9}\u{51fb}\u{653e}\u{5927}\u{67e5}\u{770b}\u{ff0c}\u{79bb}\u{6563}\u{7f29}\u{653e}\u{652f}\u{6301} 200ms \u{5e73}\u{6ed1}\u{8fc7}\u{6e21}\u{ff0c}\u{4ea4}\u{4e92}\u{4e0e}\u{56fe}\u{7247}\u{706f}\u{7bb1}\u{7edf}\u{4e00}\u{ff08}\u{652f}\u{6301} FLIP \u{98de}\u{884c}\u{5f00}\u{5173}\u{52a8}\u{753b}\u{3001}\u{6eda}\u{52a8}\u{9a71}\u{52a8}\u{5173}\u{95ed}\u{3001}\u{62d6}\u{62fd}\u{5e73}\u{79fb}\u{3001}\u{6eda}\u{8f6e}/\u{634f}\u{5408}/\u{53cc}\u{51fb}\u{7f29}\u{653e}\u{4e0e} Esc/\u{2715} \u{5173}\u{95ed}\u{ff09}\u{3002}\n- **CI GHCR \u{955c}\u{50cf}\u{5f52}\u{6863}**\u{ff1a}GitHub Actions \u{65b0}\u{589e}\u{4e3b}\u{5e94}\u{7528}\u{591a}\u{67b6}\u{6784}\u{ff08}amd64/arm64\u{ff09}Manifest \u{955c}\u{50cf}\u{53ca} 6 \u{4e2a} Code Runner \u{6c99}\u{7bb1}\u{955c}\u{50cf}\u{5411} GHCR (`ghcr.io`) \u{81ea}\u{52a8}\u{63a8}\u{9001}\u{4e0e}\u{5f52}\u{6863}\u{3002}\n\n### Fixed\n\n- **Mermaid \u{5f02}\u{5e38}\u{5bb9}\u{5668}\u{6e05}\u{7406}**\u{ff1a}\u{4fee}\u{590d} `mermaid.render` \u{89e3}\u{6790}\u{5931}\u{8d25}\u{65f6}\u{5728} `document.body` \u{9057}\u{7559}\u{4e34}\u{65f6} `#d${id}` \u{5bb9}\u{5668}\u{5bfc}\u{81f4}\u{9875}\u{9762}\u{5e95}\u{90e8}\u{51fa}\u{73b0}\u{9519}\u{8bef}\u{5757}\u{7684}\u{89c6}\u{89c9}\u{95ee}\u{9898}\u{3002}\n- **Mermaid \u{5bbd}\u{56fe}\u{653e}\u{5927}\u{5c45}\u{4e2d}\u{504f}\u{4f4d}**\u{ff1a}\u{4fee}\u{590d} `fitToScreen` \u{5c45}\u{4e2d}\u{8ba1}\u{7b97}\u{672a}\u{4e58}\u{4ee5} `fitScale` \u{5bfc}\u{81f4}\u{5bbd}\u{56fe}\u{653e}\u{5927}\u{6d6e}\u{5c42}\u{6574}\u{4f53}\u{5411}\u{5de6}\u{4e0a}\u{504f}\u{4f4d}\u{7684}\u{95ee}\u{9898}\u{3002}\n\n### Changed\n\n- **Mermaid \u{9884}\u{52a0}\u{8f7d}\u{4e0e}\u{6e32}\u{67d3}\u{4f53}\u{9a8c}**\u{ff1a}\u{5728}\u{6d4f}\u{89c8}\u{5668}\u{7a7a}\u{95f2}\u{671f}\u{ff08}`requestIdleCallback`\u{ff09}\u{81ea}\u{52a8}\u{9884}\u{52a0}\u{8f7d} mermaid bundle \u{6a21}\u{5757}\u{ff0c}\u{5e76}\u{5728}\u{56fe}\u{50cf}\u{6e32}\u{67d3}\u{8fc7}\u{7a0b}\u{4e2d}\u{589e}\u{52a0}\u{8f6c}\u{5708}\u{89d2}\u{6807}\u{63d0}\u{793a}\u{3002}\n- **CI \u{6784}\u{5efa}\u{6d41}\u{7a0b}\u{4f18}\u{5316}**\u{ff1a}\u{9650}\u{5b9a} `build-amd64` \u{89e6}\u{53d1}\u{6761}\u{4ef6}\u{ff08}\u{4ec5}\u{4e3b}\u{5e72}\u{5206}\u{652f}\u{3001}tag \u{53ca}\u{624b}\u{52a8}\u{89e6}\u{53d1}\u{ff09}\u{ff0c}\u{589e}\u{52a0}\u{955c}\u{50cf}\u{65e0} DB \u{542f}\u{52a8}\u{5192}\u{70df}\u{6d4b}\u{8bd5}\u{4e0e} Runner \u{76ee}\u{5f55}\u{53d8}\u{66f4}\u{68c0}\u{6d4b}\u{ff0c}\u{63d0}\u{5347} CI \u{6267}\u{884c}\u{6548}\u{7387}\u{3002}\n- **\u{540e}\u{53f0}\u{7ba1}\u{7406} UI \u{7ec6}\u{8282}\u{4f18}\u{5316}**\u{ff1a}\u{4f18}\u{5316}\u{540e}\u{53f0}\u{7ba1}\u{7406}\u{9875}\u{9762} UI \u{5e03}\u{5c40}\u{7ed3}\u{6784}\u{4e0e}\u{98ce}\u{683c}\u{6837}\u{5f0f}\u{3002}\n\n## [0.8.2] - 2026-07-31\n\n### Security\n\n- **session_generation \u{81ea}\u{52a8}\u{5931}\u{6548}\u{65e7}\u{4f1a}\u{8bdd}**\u{ff1a}`users.session_generation` \u{7248}\u{672c}\u{5316}\u{673a}\u{5236}\u{6b64}\u{524d}\u{53ea}\u{6709}\u{8bfb}\u{4fa7}\u{ff08}`get_user_by_token` \u{547d}\u{4e2d}\u{7f13}\u{5b58}\u{540e}\u{56de}\u{67e5}\u{7248}\u{672c}\u{53f7}\u{ff0c}\u{4e0d}\u{5339}\u{914d}\u{5373}\u{9010}\u{51fa}\u{ff09}\u{ff0c}\u{4f46}\u{5199}\u{4fa7}\u{65e0}\u{4efb}\u{4f55}\u{81ea}\u{52a8} bump\u{2014}\u{2014}\u{964d}\u{7ea7}/\u{5c01}\u{7981}\u{7528}\u{6237}\u{540e}\u{5df2}\u{7b7e}\u{53d1}\u{4f1a}\u{8bdd}\u{4ecd}\u{957f}\u{671f}\u{6709}\u{6548}\u{3002}\u{65b0}\u{589e} BEFORE UPDATE \u{89e6}\u{53d1}\u{5668}\u{ff08}migration 018\u{ff09}\u{ff1a}\u{4ec5}\u{5728} `role` \u{771f}\u{6b63}\u{53d8}\u{5316}\u{ff08}`IS DISTINCT FROM`\u{ff09}\u{65f6} bump \u{4e16}\u{4ee3}\u{53f7}\u{ff0c}\u{5176}\u{5b83}\u{5217}\u{66f4}\u{65b0}\u{4e0d}\u{8bef}\u{4f24}\u{ff0c}\u{89e6}\u{53d1}\u{5668}\u{5185}\u{4fee}\u{6539} `NEW` \u{4e0d}\u{9012}\u{5f52}\u{3002}\u{7aef}\u{5230}\u{7aef}\u{8bed}\u{4e49}\u{7531}\u{65e2}\u{6709}\u{8bfb}\u{4fa7}\u{9010}\u{51fa}\u{903b}\u{8f91}\u{627f}\u{63a5}\u{3002}\n\n### Fixed\n\n- **\u{8bc4}\u{8bba}\u{300c}\u{5ba1}\u{6838}\u{4e2d}\u{300d}\u{5fbd}\u{7ae0}\u{6c38}\u{4e45}\u{6b8b}\u{7559}\u{ff08}issue #9 \u{56de}\u{5f52}\u{ff09}**\u{ff1a}\u{8bc4}\u{8bba}\u{5ba1}\u{6838}\u{901a}\u{8fc7}\u{540e}\u{524d}\u{7aef}\u{8f6e}\u{8be2}\u{4ece}\u{4e00}\u{6b21}\u{6027} `use_future` \u{6539}\u{4e3a} `use_resource`\u{ff08}\u{4f9d}\u{8d56} pending \u{5217}\u{8868}\u{81ea}\u{52a8}\u{91cd}\u{542f}\u{ff09}\u{ff0c}\u{5e76}\u{52a0}\u{53bb}\u{91cd} `use_effect` \u{515c}\u{5e95}\u{ff0c}\u{6839}\u{6cbb} pending \u{5360}\u{4f4d}\u{9879}\u{6b8b}\u{7559}\u{3002}\n- **mermaid \u{591a}\u{884c}\u{8282}\u{70b9}\u{6807}\u{7b7e} descender \u{88c1}\u{5207}**\u{ff1a}`foreignObject` \u{9ed8}\u{8ba4} `overflow:hidden` \u{5728}\u{90e8}\u{5206}\u{6d4f}\u{89c8}\u{5668} sub-pixel \u{6e32}\u{67d3}\u{4e0b}\u{88c1}\u{5207}\u{591a}\u{884c}\u{8282}\u{70b9}\u{4e0b}\u{6c89}\u{7b14}\u{753b}\u{ff08}g/p/y\u{ff09}\u{3002}\u{6ce8}\u{5165} SVG `overflow=\"visible\"` presentation attribute \u{4fee}\u{590d}\u{ff08}CSS `overflow` \u{5bf9} foreignObject \u{65e0}\u{6548}\u{ff0c}\u{987b}\u{5199}\u{5c5e}\u{6027}\u{ff09}\u{3002}\n- **\u{5168}\u{6587}\u{641c}\u{7d22} trigram \u{7d22}\u{5f15}**\u{ff1a}\u{6062}\u{590d} `posts.search_text` \u{7684} trigram GIN \u{7d22}\u{5f15}\u{ff08}migration 014 \u{4ee5}\u{9519}\u{8bef}\u{7406}\u{7531}\u{5220}\u{9664}\u{2014}\u{2014}`gin_trgm_ops` \u{672c}\u{5c31}\u{662f}\u{4e3a} `%pat%` \u{5305}\u{542b}\u{5339}\u{914d}\u{8bbe}\u{8ba1}\u{7684}\u{ff1b}migration 019 \u{6309} 004 \u{539f}\u{5b9a}\u{4e49}\u{91cd}\u{5efa}\u{ff09}\u{3002}`search_posts` \u{4e0e} MCP `search_published` \u{7684} ILIKE \u{4e0d}\u{518d}\u{5168}\u{8868}\u{626b}\u{3002}\n- **\u{540e}\u{53f0}\u{8868}\u{683c}\u{5217}\u{6362}\u{884c}**\u{ff1a}\u{65e5}\u{671f}/\u{72b6}\u{6001}/\u{64cd}\u{4f5c}\u{5217}\u{52a0}\u{56fa}\u{5b9a}\u{5bbd}\u{5ea6}\u{4e0e} `whitespace-nowrap`\u{ff0c}\u{907f}\u{514d}\u{7a84}\u{5c4f}\u{6362}\u{884c}\u{3002}\n- **\u{7ebf}\u{4e0a}\u{5bb9}\u{5668}\u{65e0}\u{6cd5}\u{521b}\u{5efa}\u{5907}\u{4efd}**\u{ff1a}scratch \u{955c}\u{50cf}\u{7f3a} `backups/` \u{76ee}\u{5f55}\u{4e14}\u{5c5e}\u{4e3b}\u{4e3a} root\u{3001}\u{8fdb}\u{7a0b}\u{4ee5} nobody \u{8fd0}\u{884c}\u{4e0d}\u{53ef}\u{5199}\u{3002}\u{4fee}\u{590d} `.dockerignore` \u{653e}\u{884c} `backups/.gitkeep`\u{3001}Dockerfile \u{9884}\u{5efa}\u{76ee}\u{5f55}\u{ff1b}\u{5907}\u{4efd}\u{5199}\u{5165}\u{5931}\u{8d25}\u{6539}\u{4e3a}\u{643a}\u{5e26}\u{771f}\u{5b9e} `io::Error`\u{3002}\n- **rustdoc \u{7ebf}\u{4e0a} 404**\u{ff1a}\u{955c}\u{50cf}\u{5185}\u{751f}\u{6210} rustdoc \u{4fee}\u{590d} `/doc` \u{8def}\u{7531} 404\u{ff1b}\u{8ba2}\u{6b63} rustdoc intra-doc \u{65ad}\u{94fe}\u{4e0e}\u{65e0}\u{6548} HTML \u{6807}\u{7b7e}\u{3002}\n- **Docker \u{6784}\u{5efa}**\u{ff1a}cargo-chef tarball \u{89e3}\u{538b}\u{53bb}\u{5b50}\u{76ee}\u{5f55}\u{5c42}\u{ff1b}docker-tests \u{7f3a}\u{5c11} alpine \u{955c}\u{50cf}\u{65f6}\u{8df3}\u{8fc7}\u{800c}\u{975e} panic\u{3002}\n- **release \u{540e} changelog \u{6d4b}\u{8bd5}\u{5931}\u{8d25}**\u{ff1a}\u{4fee}\u{590d}\u{53d1}\u{5e03}\u{540e}\u{9057}\u{7559}\u{7684}\u{6d4b}\u{8bd5}\u{65ad}\u{8a00}\u{5931}\u{8d25}\u{3002}\n\n### Changed\n\n- **CI \u{8fc1}\u{79fb}\u{5230} GitHub Actions**\u{ff1a}\u{4ece} Gitea Actions \u{8fc1}\u{79fb}\u{5230} GitHub Actions\u{ff0c}\u{65b0}\u{589e} SSH \u{90e8}\u{7f72}\u{5230} xun\u{ff1b}`test` + `build-amd64` \u{6539}\u{4e3a}\u{6bcf}\u{6b21}\u{63a8}\u{9001}\u{89e6}\u{53d1}\u{ff0c}`build-arm64`/`release`/`deploy` \u{6539}\u{4e3a}\u{4ec5} tag \u{63a8}\u{9001}\u{ff08}`v*`\u{ff09}\u{6216} `workflow_dispatch` \u{89e6}\u{53d1}\u{3002}\n- **arm64 \u{539f}\u{751f}\u{6784}\u{5efa} + GitHub Release \u{81ea}\u{52a8}\u{53d1}\u{5e03}**\u{ff1a}\u{65b0}\u{589e} arm64 \u{539f}\u{751f}\u{6784}\u{5efa}\u{ff08}`ubuntu-24.04-arm` runner\u{ff09}\u{ff0c}GitHub Release \u{81ea}\u{52a8}\u{53d1}\u{5e03}\u{4e09}\u{4ef6}\u{4ea7}\u{7269}\u{ff08}amd64 \u{955c}\u{50cf} / arm64 \u{955c}\u{50cf} / x86_64 musl \u{9759}\u{6001}\u{4e8c}\u{8fdb}\u{5236} + public \u{8d44}\u{6e90}\u{ff09}\u{3002}\n- **CI \u{7f13}\u{5b58}\u{4f18}\u{5316}**\u{ff1a}cargo-chef \u{4f9d}\u{8d56}\u{5206}\u{5c42} + BuildKit GHA \u{5c42}\u{7f13}\u{5b58}\u{ff1b}\u{5347}\u{7ea7}\u{6240}\u{6709} actions \u{5230} node24 \u{517c}\u{5bb9}\u{7248}\u{672c}\u{3002}\n- **lint \u{589e}\u{5f3a}**\u{ff1a}Makefile `lint` \u{76ee}\u{6807}\u{589e}\u{52a0} `cargo fmt -- --check`\u{ff1b}\u{5168}\u{4ed3}\u{5e93} cargo fmt \u{7edf}\u{4e00}\u{683c}\u{5f0f}\u{3002}\n\n### Internal\n\n- \u{8ba2}\u{6b63} `.cargo/config.toml` \u{8fc7}\u{65f6}\u{7684} cross build \u{53d9}\u{4e8b}\u{ff1b}\u{4fee}\u{6b63} CHANGELOG \u{4ee3}\u{7801}\u{56f4}\u{680f} Markdown \u{8f6c}\u{4e49}\u{3002}\n\n## [0.8.1] - 2026-07-30\n\n### Added\n\n- **MCP `update_post` \u{90e8}\u{5206}\u{66f4}\u{65b0}**\u{ff1a}`update_post` \u{6539}\u{4e3a} PATCH \u{8bed}\u{4e49}\u{ff0c}`UpdatePostParams` \u{6240}\u{6709}\u{53ef}\u{6539}\u{5b57}\u{6bb5}\u{ff08}title / content_md / summary / slug / tags / status / cover_image\u{ff09}\u{6539}\u{4e3a} `Option`\u{ff0c}\u{4ec5} `post_id` \u{5fc5}\u{586b}\u{ff1b}\u{670d}\u{52a1}\u{7aef}\u{6309}\u{63d0}\u{4f9b}\u{7684}\u{5b57}\u{6bb5}\u{52a8}\u{6001}\u{6784}\u{5efa} `UPDATE SET` \u{5b50}\u{53e5}\u{ff0c}\u{672a}\u{63d0}\u{4f9b} `content_md` \u{65f6}\u{8df3}\u{8fc7} Markdown \u{91cd}\u{65b0}\u{6e32}\u{67d3}\u{ff0c}\u{7701}\u{53bb} `spawn_blocking` \u{5f00}\u{9500}\u{3002}\u{8bed}\u{4e49}\u{8981}\u{70b9}\u{ff1a}`summary` \u{968f}\u{6b63}\u{6587}\u{8054}\u{52a8}\u{ff08}\u{6b63}\u{6587}\u{53d8}\u{4e14}\u{672a}\u{7ed9}\u{5219}\u{81ea}\u{52a8}\u{63d0}\u{53d6}\u{ff09}\u{ff1b}`slug` \u{4ec5}\u{663e}\u{5f0f}\u{63d0}\u{4f9b}\u{624d}\u{6539}\u{52a8}\u{ff1b}`tags` \u{4e3a} `None` \u{4e0d}\u{6539}\u{3001}`Some` \u{66ff}\u{6362}\u{ff08}\u{7a7a}\u{5217}\u{8868}\u{6e05}\u{7a7a}\u{ff09}\u{ff1b}`cover_image` \u{4e3a} `None` \u{4e0d}\u{6539}\u{3001}\u{7a7a}\u{4e32}\u{6e05}\u{7a7a}\u{3001}URL \u{8bbe}\u{7f6e}\u{ff1b}`status` \u{53d8}\u{5316}\u{65f6}\u{9996}\u{53d1}\u{81ea}\u{52a8}\u{586b} `published_at`\u{3002}\u{65e7}\u{7684}\u{5168}\u{91cf}\u{8c03}\u{7528}\u{ff08}\u{540c}\u{65f6}\u{4f20} title+content_md\u{ff09}\u{884c}\u{4e3a}\u{4e0d}\u{53d8}\u{ff0c}\u{5411}\u{540e}\u{517c}\u{5bb9}\u{3002}\n\n## [0.8.0] - 2026-07-30\n\n### Added\n\n- **TOML \u{8bed}\u{6cd5}\u{9ad8}\u{4eae}**\u{ff1a}`toml` \u{4ee3}\u{7801}\u{5757}\u{6b64}\u{524d}\u{56de}\u{9000}\u{4e3a}\u{7eaf}\u{6587}\u{672c}\u{ff08}syntect \u{9ed8}\u{8ba4}\u{7cbe}\u{9009}\u{96c6}\u{4e0d}\u{542b} TOML\u{ff09}\u{ff1b}\u{73b0}\u{5df2}\u{5f15}\u{5165}\u{5b98}\u{65b9} sublimehq TOML v2 \u{8bed}\u{6cd5}\u{ff0c}\u{652f}\u{6301}\u{65e5}\u{671f}\u{65f6}\u{95f4}\u{3001}\u{6570}\u{7ec4}\u{8868}\u{3001}\u{5185}\u{8054}\u{8868}\u{4e0e}\u{591a}\u{884c}\u{5b57}\u{7b26}\u{4e32}\u{3002}\n- **Docker \u{5f00}\u{53d1}\u{73af}\u{5883}**\u{ff1a}\u{65b0}\u{589e} `Dockerfile.dev` + `docker-compose.dev.yml`\u{ff0c}\u{5185}\u{7f6e} dx 0.7.9\u{3001}tailwindcss v4\u{3001}Node 22/pnpm \u{4e0e} wasm32 target\u{ff1b}\u{6e90}\u{7801} bind mount \u{5b9e}\u{73b0}\u{70ed}\u{91cd}\u{8f7d}\u{ff0c}cargo/pnpm \u{7f13}\u{5b58}\u{8de8}\u{91cd}\u{542f}\u{6301}\u{4e45}\u{5316}\u{ff0c}\u{76f4}\u{8fde}\u{5bbf}\u{4e3b}\u{539f}\u{751f} PostgreSQL\u{3002}\u{65b0}\u{589e} `make docker-dev` / `docker-dev-down` / `docker-dev-shell` \u{4fbf}\u{5229} target\u{3002}\n- **x86_64 \u{955c}\u{50cf}\u{96f6} QEMU \u{4ea4}\u{53c9}\u{7f16}\u{8bd1}**\u{ff1a}\u{6539}\u{7528} `Dockerfile.cross` \u{4e09}\u{9636}\u{6bb5}\u{6784}\u{5efa}\u{ff08}Trixie \u{7f16}\u{524d}\u{7aef} + Alpine/zig \u{4ea4}\u{53c9}\u{7f16} server + scratch \u{5408}\u{5e76}\u{4ea7}\u{7269}\u{ff09}\u{ff0c}arm64 Mac \u{4e0a}\u{4e0d}\u{518d}\u{7ecf} QEMU/Rosetta \u{7ffb}\u{8bd1}\u{ff0c}\u{544a}\u{522b} cross \u{5de5}\u{5177}\u{94fe}\u{5bb9}\u{5668}\u{5728} Rosetta \u{4e0b}\u{7684} SIGSEGV \u{5d29}\u{6e83}\u{3002}\n\n### Changed\n\n- **MCP \u{5a92}\u{4f53}\u{4e0a}\u{4f20}\u{6539}\u{4e3a}\u{5e26}\u{5916}\u{4f20}\u{8f93}\u{ff0c}\u{5f7b}\u{5e95}\u{79fb}\u{9664} base64**\u{ff1a}`upload_media` \u{5de5}\u{5177}\u{6539}\u{4e3a}\u{63a5}\u{6536} URL\u{ff0c}\u{7531}\u{670d}\u{52a1}\u{7aef}\u{7ecf} SSRF \u{9632}\u{62a4}\u{6293}\u{53d6}\u{ff08}\u{5f3a}\u{5236} https\u{3001}DNS \u{89e3}\u{6790}\u{5373}\u{9501} IP \u{675c}\u{7edd} rebinding\u{3001}\u{7981}\u{91cd}\u{5b9a}\u{5411}\u{3001}\u{6d41}\u{5f0f}\u{4f53}\u{79ef}\u{4e0a}\u{9650}\u{3001}\u{8d85}\u{65f6}\u{ff09}\u{ff1b}\u{65b0}\u{589e} `POST /api/mcp/upload` bearer multipart \u{7aef}\u{70b9}\u{ff0c}\u{4f9b} host/shell \u{76f4}\u{63a5} POST \u{4e8c}\u{8fdb}\u{5236}\u{3002}\u{4e8c}\u{8fdb}\u{5236}\u{4e0d}\u{518d}\u{8fdb} JSON-RPC\u{ff0c}\u{4e0d}\u{518d}\u{53d7} 4MiB \u{8bf7}\u{6c42}\u{4f53}\u{4e0a}\u{9650}\u{ff08}\u{539f} base64 \u{8def}\u{5f84}\u{5b9e}\u{9645}\u{4ec5}\u{7ea6} 2.8MiB \u{539f}\u{59cb}\u{56fe}\u{ff09}\u{7ea6}\u{675f}\u{3002}\u{65b0}\u{589e} server-only \u{4f9d}\u{8d56} `reqwest`\u{ff08}rustls-tls\u{ff0c}musl \u{9759}\u{6001}\u{94fe}\u{63a5}\u{53cb}\u{597d}\u{ff09}\u{ff0c}\u{79fb}\u{9664} `base64` \u{4f9d}\u{8d56}\u{3002}\n\n### Fixed\n\n- **\u{4ea4}\u{53c9}\u{7f16}\u{8bd1}\u{90e8}\u{7f72}\u{540e}\u{767b}\u{5f55} 405**\u{ff1a}Dioxus 0.7.9 \u{7684} server-fn URL \u{672b}\u{5c3e}\u{53bb}\u{51b2}\u{7a81}\u{540e}\u{7f00}\u{4e3a} `xxh64(CARGO_MANIFEST_DIR + module_path!, 0)`\u{ff1b}host \u{4ea4}\u{53c9}\u{7f16}\u{8bd1}\u{4e0e}\u{5bb9}\u{5668}\u{5185}\u{7f16}\u{8bd1}\u{7684} `CARGO_MANIFEST_DIR` \u{4e0d}\u{540c}\u{ff0c}\u{5bfc}\u{81f4}\u{524d}\u{540e}\u{7aef}\u{7b97}\u{51fa}\u{4e0d}\u{540c} URL \u{540e}\u{7f00}\u{ff0c}POST \u{843d}\u{5165} SSR \u{515c}\u{5e95} GET \u{8def}\u{7531}\u{8fd4}\u{56de} 405\u{3002}\u{6539}\u{7531} `.cargo/config.toml` \u{56fa}\u{5b9a} `SERVER_FN_OVERRIDE_KEY`\u{ff0c}\u{4e24}\u{6b21}\u{7f16}\u{8bd1}\u{8bfb}\u{5230}\u{540c}\u{4e00}\u{54c8}\u{5e0c} key\u{3002}\n- **Dockerfile \u{6f0f}\u{62f7} workspace \u{5305}**\u{ff1a}\u{4e24}\u{4e2a} Dockerfile \u{7684} pnpm manifest COPY \u{6b64}\u{524d}\u{53ea}\u{62f7}\u{4e86} 4/7 \u{4e2a}\u{5305}\u{ff0c}\u{8865}\u{9f50} `shared` / `xterm-terminal` / `mermaid-renderer`\u{3002}\n\n## [0.7.0] - 2026-07-29\n\n### Added\n\n- **MCP \u{670d}\u{52a1}\u{5668}**\u{ff1a}\u{535a}\u{5ba2}\u{73b0}\u{5728}\u{662f}\u{4e00}\u{4e2a} Model Context Protocol \u{670d}\u{52a1}\u{5668}\u{ff08}`POST /mcp`\u{ff0c}Streamable HTTP\u{ff0c}\u{65e0}\u{72b6}\u{6001}\u{ff09}\u{ff0c}\u{7ba1}\u{7406}\u{5458}\u{7684} AI \u{5ba2}\u{6237}\u{7aef}\u{ff08}Claude Code / Cursor / Cline\u{ff09}\u{53ef}\u{7ecf} bearer token \u{8fde}\u{63a5}\u{ff0c}\u{628a}\u{5df2}\u{53d1}\u{5e03}\u{6587}\u{7ae0}\u{5f53}\u{77e5}\u{8bc6}\u{5e93}\u{68c0}\u{7d22}\u{ff0c}\u{5e76}\u{6267}\u{884c}\u{51e0}\u{4e4e}\u{6240}\u{6709}\u{540e}\u{53f0}\u{64cd}\u{4f5c}\u{3002}\n  - **\u{8ba4}\u{8bc1}**\u{ff1a}\u{7ba1}\u{7406}\u{5458}\u{5728} `/admin/mcp` \u{7b7e}\u{53d1}\u{4ee4}\u{724c}\u{ff0c}\u{4e09}\u{6863}\u{4f5c}\u{7528}\u{57df}\u{ff08}read / write / admin\u{ff09}\u{ff0c}\u{53ef}\u{9009}\u{6709}\u{6548}\u{671f}\u{ff08}1/7/30/90 \u{5929} / \u{6c38}\u{4e0d}\u{8fc7}\u{671f}\u{ff09}\u{3002}\u{4ee4}\u{724c}\u{660e}\u{6587}\u{7ecf} AES-GCM-256 \u{9759}\u{6001}\u{52a0}\u{5bc6}\u{5b58}\u{50a8}\u{ff08}\u{53ef}\u{91cd}\u{67e5}\u{ff09}\u{ff0c}SHA-256 \u{54c8}\u{5e0c}\u{505a}\u{6bcf}\u{8bf7}\u{6c42}\u{67e5}\u{627e}\u{3002}\n  - **\u{77e5}\u{8bc6}\u{5e93}\u{ff08}read\u{ff09}**\u{ff1a}`search_posts` / `get_post` / `list_tags` \u{5de5}\u{5177} + \u{5df2}\u{53d1}\u{5e03}\u{6587}\u{7ae0}\u{4f5c}\u{4e3a}\u{53ef}\u{679a}\u{4e3e}\u{7684} MCP Resources\u{ff08}`post://{slug}`\u{ff0c}\u{6e38}\u{6807}\u{5206}\u{9875}\u{ff09}\u{3002}\n  - **\u{5199}\u{64cd}\u{4f5c}\u{ff08}write\u{ff09}**\u{ff1a}\u{6587}\u{7ae0} CRUD\u{ff08}\u{542b}\u{8349}\u{7a3f}\u{ff09}\u{3001}\u{8bc4}\u{8bba}\u{5ba1}\u{6838}\u{3001}\u{6807}\u{7b7e}\u{7ba1}\u{7406}\u{3001}\u{5a92}\u{4f53}\u{4e0a}\u{4f20}\u{ff08}base64 \u{2192} WebP \u{8f6c}\u{7801}\u{53bb}\u{91cd}\u{ff09}\u{3002}\n  - **\u{7ba1}\u{7406}\u{ff08}admin\u{ff09}**\u{ff1a}\u{7ad9}\u{70b9}\u{8bbe}\u{7f6e}\u{8bfb}\u{5199}\u{3001}\u{4ee3}\u{7801}\u{8fd0}\u{884c}\u{5668}\u{ff08}\u{6c99}\u{7bb1}\u{6267}\u{884c}\u{ff09}\u{3002}\n  - **\u{52a0}\u{56fa}**\u{ff1a}token-keyed \u{9650}\u{6d41}\u{ff08}\u{9ed8}\u{8ba4} 10/s burst 30\u{ff0c}\u{8d85}\u{9650} 429\u{ff09}\u{3001}`last_used_at` \u{8282}\u{6d41}\u{5237}\u{65b0}\u{3001}\u{9274}\u{6743}\u{5ba1}\u{8ba1}\u{65e5}\u{5fd7}\u{3001}Origin\u{2192}403\u{ff08}spec \u{5f3a}\u{5236}\u{ff0c}rmcp \u{5185}\u{7f6e}\u{ff09}\u{3001}\u{534f}\u{8bae}\u{7248}\u{672c}\u{5934}\u{6821}\u{9a8c}\u{3001}4MiB \u{8bf7}\u{6c42}\u{4f53}\u{4e0a}\u{9650}\u{3002}\n  - **\u{914d}\u{7f6e}\u{751f}\u{6210}**\u{ff1a}\u{540e}\u{53f0}\u{4e00}\u{952e}\u{590d}\u{5236} 4 \u{79cd}\u{5ba2}\u{6237}\u{7aef}\u{914d}\u{7f6e}\u{ff08}Claude Code / Cursor / Cline / \u{901a}\u{7528} JSON + CLI\u{ff09}\u{3002}\n  - \u{4f20}\u{8f93}\u{7528}\u{5b98}\u{65b9} `rmcp` crate\u{ff08}`=3.0.0-beta.3`\u{ff0c}3.x \u{624d}\u{6709} Origin \u{6821}\u{9a8c}\u{7b49} spec \u{5f3a}\u{5236}\u{9879}\u{ff09}\u{6302}\u{8f7d}\u{4e8e} axum\u{3002}\u{65b0}\u{589e}\u{4f9d}\u{8d56} `rmcp`\u{3001}`aes-gcm`\u{3001}`base64`\u{ff08}\u{5747} server-only\u{ff09}\u{3002}\n  - \u{65b0}\u{589e}\u{73af}\u{5883}\u{53d8}\u{91cf} `MCP_TOKEN_ENC_KEY`\u{ff08}hex \u{7f16}\u{7801} 32 \u{5b57}\u{8282} AES-256 \u{5bc6}\u{94a5}\u{ff0c}`openssl rand -hex 32` \u{751f}\u{6210}\u{ff09}\u{3001}`RATE_LIMIT_MCP_PER_SEC` / `RATE_LIMIT_MCP_BURST`\u{3002}\n- **\u{7d20}\u{6750}\u{7ba1}\u{7406}\u{ff08}\u{5a92}\u{4f53}\u{5e93}\u{ff09}**\u{ff1a}\u{65b0}\u{589e} `media_assets` \u{6ce8}\u{518c}\u{8868}\u{6570}\u{636e}\u{5c42}\u{4e0e} `/admin/assets` \u{7ba1}\u{7406}\u{9875}\u{ff0c}\u{628a}\u{4e0a}\u{4f20}\u{7684}\u{56fe}\u{7247}\u{5f53}\u{4f5c}\u{4e00}\u{7b49}\u{516c}\u{6c11}\u{7ba1}\u{7406}\u{3002}\n  - **\u{53ea}\u{8bfb}\u{5217}\u{8868}\u{9875}**\u{ff1a}\u{7d20}\u{6750}\u{7f51}\u{683c} + \u{5f15}\u{7528}/\u{672a}\u{5f15}\u{7528}\u{ff08}\u{5b64}\u{513f}\u{ff09}\u{7b5b}\u{9009}\u{ff1b}\u{5f15}\u{7528}\u{5fbd}\u{6807}\u{5c55}\u{793a}\u{88ab}\u{54ea}\u{4e9b}\u{6587}\u{7ae0}\u{5f15}\u{7528}\u{3002}\n  - **\u{5220}\u{9664}\u{4fdd}\u{62a4}\u{3001}\u{5b64}\u{513f}\u{6e05}\u{7406}\u{4e0e} alt \u{7f16}\u{8f91}**\u{ff1a}\u{88ab}\u{5f15}\u{7528}\u{7d20}\u{6750}\u{4e0d}\u{53ef}\u{5220}\u{9664}\u{ff1b}\u{53ef}\u{4e00}\u{952e}\u{6e05}\u{7406}\u{65e0}\u{5f15}\u{7528}\u{7684}\u{5b64}\u{513f}\u{7d20}\u{6750}\u{ff1b}\u{5c31}\u{5730}\u{7f16}\u{8f91} alt \u{6587}\u{672c}\u{3002}\n  - **\u{5168}\u{91cf}\u{7d22}\u{5f15}\u{91cd}\u{5efa}**\u{ff1a}\u{626b}\u{63cf} `posts.content_html` \u{91cd}\u{5efa}\u{6bcf}\u{5f20}\u{56fe}\u{7247}\u{7684}\u{5f15}\u{7528}\u{5173}\u{7cfb}\u{ff08}\u{6279}\u{91cf} 500\u{ff09}\u{3002}\n  - **\u{5c01}\u{9762}\u{300c}\u{4ece}\u{7d20}\u{6750}\u{5e93}\u{9009}\u{62e9}\u{300d}\u{8054}\u{52a8}**\u{ff1a}\u{5199}\u{6587}\u{7ae0}\u{9875}\u{5c01}\u{9762}\u{56fe}\u{6539}\u{4e3a}\u{4ece}\u{5a92}\u{4f53}\u{5e93}\u{6311}\u{9009}\u{ff0c}\u{5c01}\u{9762}\u{4e0e}\u{7d20}\u{6750}\u{5e93}\u{6253}\u{901a}\u{3002}\n  - **\u{706f}\u{7bb1}\u{9884}\u{89c8}**\u{ff1a}\u{7d20}\u{6750}\u{7f51}\u{683c}\u{63a5}\u{5165} Lightbox\u{ff0c}\u{652f}\u{6301}\u{56fe}\u{96c6}\u{5207}\u{6362}\u{6d4f}\u{89c8}\u{3002}\n  - **\u{641c}\u{7d22}\u{4e0e}\u{9632}\u{6296}**\u{ff1a}\u{7d20}\u{6750}\u{9875}\u{641c}\u{7d22}\u{6846} 300ms \u{9632}\u{6296}\u{3002}\n  - **\u{591a}\u{9009}\u{4e0e}\u{6279}\u{91cf}\u{5220}\u{9664}**\u{3002}\n  - **\u{4e0a}\u{4f20}\u{53bb}\u{91cd}**\u{ff1a}\u{4e0a}\u{4f20}\u{56fe}\u{7247}\u{6309}\u{5185}\u{5bb9} SHA-256 \u{8ba1}\u{7b97}\u{6307}\u{7eb9}\u{ff0c}\u{91cd}\u{590d}\u{4e0a}\u{4f20}\u{76f4}\u{63a5}\u{590d}\u{7528}\u{5df2}\u{767b}\u{8bb0}\u{7d20}\u{6750}\u{ff0c}\u{4e0d}\u{518d}\u{4ea7}\u{751f}\u{5197}\u{4f59}\u{6587}\u{4ef6}\u{3002}\n  - **Pagination \u{9875}\u{7801}\u{8df3}\u{8f6c}**\u{ff1a}\u{7d20}\u{6750}\u{5217}\u{8868}\u{5206}\u{9875}\u{652f}\u{6301}\u{9875}\u{7801}\u{76f4}\u{8df3}\u{ff08}`Pagination` \u{7ec4}\u{4ef6}\u{65b0}\u{589e}\u{8df3}\u{8f6c}\u{80fd}\u{529b}\u{ff09}\u{3002}\n- **\u{5173}\u{4e8e}\u{9875}\u{91cd}\u{8bbe}\u{8ba1}**\u{ff1a}\u{5173}\u{4e8e}\u{9875}\u{91cd}\u{5236}\u{4e3a}\u{300c}\u{4e16}\u{754c}\u{6811}\u{4e0e}\u{9057}\u{5fd8}\u{300d}\u{4e3b}\u{9898}\u{53d9}\u{4e8b}\u{ff0c}\u{65b0}\u{589e}\u{5e74}\u{8f6e}\u{5f0f}\u{94fe}\u{63a5}\u{533a}\u{3002}\n- **`/changelog` \u{9875}\u{9762}**\u{ff1a}\u{65b0}\u{589e}\u{66f4}\u{65b0}\u{65e5}\u{5fd7}\u{9875}\u{ff0c}\u{5185}\u{5d4c}\u{6e32}\u{67d3} `CHANGELOG.md`\u{ff0c}\u{5e76}\u{5728}\u{5e74}\u{8f6e}\u{533a}\u{63a5}\u{5165}\u{5165}\u{53e3}\u{3002}\n- **\u{540e}\u{53f0}\u{4eea}\u{8868}\u{76d8}\u{52a8}\u{753b}**\u{ff1a}\u{4eea}\u{8868}\u{76d8}\u{5206}\u{5757}\u{8fdb}\u{573a}\u{52a8}\u{753b} + \u{6570}\u{5b57}\u{6eda}\u{52a8}\u{ff0c}\u{8282}\u{594f}\u{53ef}\u{8c03}\u{3002}\n- **`FormSelect` \u{4e3b}\u{9898}\u{5316}\u{4e0b}\u{62c9}\u{7ec4}\u{4ef6}**\u{ff1a}\u{5c01}\u{88c5}\u{81ea}\u{5b9a}\u{4e49}\u{4e3b}\u{9898}\u{5316}\u{4e0b}\u{62c9}\u{5f39}\u{5c42}\u{ff0c}\u{66ff}\u{4ee3}\u{539f}\u{751f} `<select>`\u{ff08}OS \u{5f39}\u{7a97}\u{65e0}\u{6cd5}\u{8ddf}\u{968f}\u{4e3b}\u{9898}\u{ff09}\u{ff1b}\u{5168}\u{9879}\u{76ee}\u{539f}\u{751f} `<select>` \u{7edf}\u{4e00}\u{66ff}\u{6362}\u{4e3a} `FormSelect`\u{3002}\n- **\u{540e}\u{53f0}\u{6587}\u{7ae0}\u{641c}\u{7d22}**\u{ff1a}\u{6587}\u{7ae0}\u{5217}\u{8868}\u{652f}\u{6301}\u{6309}\u{6807}\u{9898}\u{641c}\u{7d22}\u{3002}\n- **MCP \u{914d}\u{7f6e}\u{751f}\u{6210} UI**\u{ff1a}\u{5ba2}\u{6237}\u{7aef}\u{914d}\u{7f6e}\u{4ee3}\u{7801}\u{5757}\u{52a0}\u{8bed}\u{6cd5}\u{9ad8}\u{4eae}\u{3001}\u{590d}\u{5236}\u{6309}\u{94ae}\u{5c31}\u{5730}\u{53cd}\u{9988}\u{ff1b}\u{4ee4}\u{724c}\u{5217}\u{8868}\u{4e0e}\u{914d}\u{7f6e}\u{751f}\u{6210} loading \u{66ff}\u{6362}\u{4e3a}\u{9aa8}\u{67b6}\u{5c4f}\u{ff1b}\u{65b0}\u{589e} OpenCode \u{5ba2}\u{6237}\u{7aef}\u{914d}\u{7f6e}\u{7247}\u{6bb5}\u{3002}\n\n### Changed\n\n- **\u{91cd}\u{6784}\u{7cfb}\u{5217} R2\u{2013}R6**\u{ff1a}\u{62bd}\u{53d6} `tools/common.rs` \u{6d88}\u{9664} MCP helper \u{56db}\u{91cd}\u{62f7}\u{8d1d}\u{ff08}R2\u{ff09}\u{ff1b}\u{653e}\u{5bbd} posts helpers \u{53ef}\u{89c1}\u{6027}\u{5e76}\u{5220}\u{9664} MCP \u{5185}\u{7684}\u{5e73}\u{884c}\u{62f7}\u{8d1d}\u{ff08}R3\u{ff09}\u{ff1b}\u{62bd}\u{53d6} `render_post_fields` \u{6d88}\u{9664}\u{6587}\u{7ae0}\u{6e32}\u{67d3} + \u{5b57}\u{6570}/\u{9605}\u{8bfb}\u{65f6}\u{95f4}\u{5ea6}\u{91cf}\u{7684}\u{91cd}\u{590d}\u{ff08}R4\u{ff09}\u{ff1b}\u{62bd}\u{53d6} `fetch_post_tags` \u{6d88}\u{9664} 9+ \u{5904}\u{6807}\u{7b7e}\u{67e5}\u{8be2}\u{91cd}\u{590d}\u{ff08}R5\u{ff09}\u{ff1b}\u{62bd}\u{53d6} `invalidate_for_post_write` \u{7edf}\u{4e00}\u{5199}\u{540e}\u{7f13}\u{5b58}\u{5931}\u{6548}\u{5e8f}\u{5217}\u{ff08}R6\u{ff09}\u{3002}\n- **utils \u{5e38}\u{91cf}\u{96c6}\u{4e2d}**\u{ff1a}\u{96c6}\u{4e2d} `hash_token` / `EMAIL_REGEX` / `MAX_FILE_SIZE` \u{7684}\u{91cd}\u{590d}\u{5b9a}\u{4e49}\u{ff1b}\u{96c6}\u{4e2d} `MIGRATE_STARTUP_TIMEOUT_SECS` \u{89e3}\u{6790}\u{ff1b}\u{63d0}\u{53d6} `formatted_date` \u{516c}\u{5171}\u{5b9e}\u{73b0}\u{ff1b}\u{7edf}\u{4e00} LIKE \u{6a21}\u{5f0f}\u{8f6c}\u{4e49}\u{ff08}`consts`\u{ff09}\u{3002}\n- **\u{8f93}\u{5165}\u{6846}\u{7edf}\u{4e00} `FormInput`**\u{ff1a}\u{540e}\u{53f0}\u{6587}\u{7ae0}\u{641c}\u{7d22}\u{6846}\u{3001}SQL \u{63a7}\u{5236}\u{53f0}\u{8f93}\u{5165}\u{6846}\u{7b49}\u{7edf}\u{4e00}\u{6539}\u{7528} `FormInput` \u{516c}\u{5171}\u{7ec4}\u{4ef6}\u{3002}\n- **\u{4ee3}\u{7801}\u{8fd0}\u{884c}\u{5668}\u{6267}\u{884c}\u{5c42}**\u{ff1a}\u{62bd}\u{53d6} `spawn_exec_task` \u{6d88}\u{9664} `start_exec` / `stream` \u{91cd}\u{590d}\u{ff08}M10\u{ff09}\u{3002}\n\n### Fixed\n\n- **KaTeX `\\pu` \u{8f6c}\u{8bd1}**\u{ff1a}\u{4fee}\u{590d} `\\pu` \u{9884}\u{8f6c}\u{8bd1}\u{7684} off-by-one \u{4e0e} UTF-8 \u{7834}\u{574f}\u{ff08}C1+C2\u{ff09}\u{3002}\n- **\u{4ee3}\u{7801}\u{8fd0}\u{884c}\u{5668}**\u{ff1a}\u{6d41}\u{5f0f}\u{6267}\u{884c}\u{8d85}\u{9650}\u{65f6}\u{56de}\u{6536}\u{6302}\u{8d77}\u{7684}\u{5bb9}\u{5668}\u{ff0c}\u{907f}\u{514d}\u{6cc4}\u{6f0f}\u{ff08}C3\u{ff09}\u{ff1b}\u{79fb}\u{9664} `source_prop_signal` \u{7684}\u{6e32}\u{67d3}\u{7eaf}\u{51c0}\u{6027}\u{8fdd}\u{89c4}\u{ff08}C4\u{ff09}\u{3002}\n- **\u{56fe}\u{7247}\u{7f13}\u{5b58}\u{6e05}\u{7406}\u{4efb}\u{52a1}**\u{ff1a}\u{9632}\u{6ea2}\u{51fa}/\u{4e0b}\u{6ea2} panic\u{ff08}C5\u{ff09}\u{3002}\n- **MCP \u{5de5}\u{5177}\u{5f52}\u{5c5e}\u{4e0e}\u{7f13}\u{5b58}**\u{ff1a}trash/delete \u{8865}\u{5f52}\u{5c5e}\u{6821}\u{9a8c} + `publish_post` \u{6807}\u{7b7e}\u{7f13}\u{5b58}\u{5931}\u{6548}\u{ff08}M1+M6\u{ff09}\u{ff1b}\u{6807}\u{7b7e}\u{6587}\u{7ae0}\u{6570}\u{8ba1}\u{6570} + \u{6279}\u{91cf}\u{5220}\u{9664} SSR \u{5931}\u{6548}\u{ff08}M2+M5\u{ff09}\u{3002}\n- **\u{5907}\u{4efd}/\u{6062}\u{590d}**\u{ff1a}`pg_dump`/`psql` \u{79fb}\u{5165} `spawn_blocking` \u{5e76}\u{6309}\u{884c}\u{8bfb}\u{53d6}\u{ff0c}\u{907f}\u{514d}\u{963b}\u{585e}\u{5f02}\u{6b65}\u{7ebf}\u{7a0b}\u{ff08}M3\u{ff09}\u{3002}\n- **\u{8bc4}\u{8bba}**\u{ff1a}\u{8bc4}\u{8bba} markdown \u{6e32}\u{67d3}\u{79fb}\u{5165} `spawn_blocking`\u{ff08}M4\u{ff09}\u{3002}\n- **\u{6807}\u{7b7e}\u{9875}\u{7f13}\u{5b58}**\u{ff1a}\u{79fb}\u{9664}\u{672a}\u{4f7f}\u{7528}\u{4e14}\u{6c38}\u{4e0d}\u{5931}\u{6548}\u{7684} `PostsByTagPage` \u{7f13}\u{5b58}\u{952e}\u{ff08}M7\u{ff09}\u{3002}\n- **\u{9650}\u{6d41}**\u{ff1a}\u{952e}\u{63a7}\u{9650}\u{6d41}\u{5668}\u{5b9a}\u{671f} GC + XFF \u{4f2a}\u{9020}\u{98ce}\u{9669}\u{6587}\u{6863}\u{5316}\u{ff08}M8\u{ff09}\u{ff0c}GC \u{4efb}\u{52a1}\u{6d3e}\u{751f}\u{5b88}\u{536b}\u{8fd0}\u{884c}\u{65f6}\u{53ef}\u{7528}\u{6027}\u{3002}\n- **\u{6570}\u{636e}\u{5bfc}\u{51fa}**\u{ff1a}\u{4e0d}\u{518d}\u{5411} HTTP \u{54cd}\u{5e94}\u{6cc4}\u{9732}\u{539f}\u{59cb} DB \u{9519}\u{8bef}\u{ff08}M9\u{ff09}\u{3002}\n- **SQL \u{63a7}\u{5236}\u{53f0}**\u{ff1a}\u{8bfb}\u{8def}\u{5f84}\u{8ffd}\u{52a0} `LIMIT` \u{907f}\u{514d}\u{5168}\u{8868}\u{7269}\u{5316}\u{ff08}M11\u{ff09}\u{ff1b}`SHOW` \u{53ea}\u{8bfb}\u{5206}\u{7c7b}\u{4fee}\u{6b63}\u{3002}\n- **\u{540e}\u{53f0}\u{6587}\u{7ae0}\u{5217}\u{8868}**\u{ff1a}\u{6e32}\u{67d3}\u{62c9}\u{53d6}\u{5931}\u{8d25}\u{7684}\u{9519}\u{8bef}\u{6001}\u{ff08}M12\u{ff09}\u{3002}\n- **\u{7d20}\u{6750}\u{7ba1}\u{7406}**\u{ff1a}uuid \u{53c2}\u{6570}\u{5e8f}\u{5217}\u{5316}\u{5931}\u{8d25}\u{5bfc}\u{81f4}\u{4e0a}\u{4f20} 500\u{ff1b}`SUM(size_bytes)` \u{663e}\u{5f0f}\u{8f6c} bigint \u{4fee}\u{590d}\u{5217}\u{8868} 500\u{ff1b}\u{5f15}\u{7528}\u{5fbd}\u{6807}\u{52a0} `z-10` \u{4fee}\u{590d}\u{88ab} blur-img \u{906e}\u{76d6}\u{ff1b}\u{706f}\u{7bb1}\u{56fe}\u{96c6}\u{5207}\u{6362}\u{4e0d}\u{91cd}\u{7b97}\u{51e0}\u{4f55}\u{5bfc}\u{81f4}\u{56fe}\u{7247}\u{538b}\u{6241}\u{ff1b}\u{5220}\u{9664}\u{8fd4}\u{56de}\u{300c}\u{7d20}\u{6750}\u{4e0d}\u{5b58}\u{5728}\u{300d}\u{65f6}\u{5237}\u{65b0}\u{7f51}\u{683c}\u{81ea}\u{6108}\u{8fc7}\u{671f}\u{6570}\u{636e}\u{ff1b}\u{5de5}\u{5177}\u{680f}\u{53f3}\u{4fa7}\u{6309}\u{94ae}\u{6c89}\u{5165} `FilterTabs` \u{533a}\u{57df}\u{7d27}\u{8d34}\u{6a2a}\u{5e45}\u{ff1b}\u{64cd}\u{4f5c}\u{6a2a}\u{5e45}\u{4e0a}\u{4e0b}\u{95f4}\u{8ddd}\u{4e0d}\u{5bf9}\u{79f0}\u{ff08}40/8 \u{2192} 24/24\u{ff09}\u{3002}\n- **MCP**\u{ff1a}reveal/revoke \u{4ee4}\u{724c}\u{65f6}\u{5c06}\u{5b57}\u{7b26}\u{4e32} id \u{89e3}\u{6790}\u{4e3a} `Uuid`\u{ff1b}`FormSelect` \u{9762}\u{677f}\u{6c34}\u{5e73}\u{5c45}\u{4e2d}\u{4fee}\u{590d}\u{53cc}\u{500d}\u{4f4d}\u{79fb}\u{ff1b}\u{5ba2}\u{6237}\u{7aef}\u{914d}\u{7f6e}\u{683c}\u{5f0f}\u{4fee}\u{6b63}\u{ff08}Claude Code / Cursor / Cline\u{ff0c}\u{8054}\u{7f51}\u{6838}\u{5b9e} 2026\u{ff09}\u{ff1b}\u{914d}\u{7f6e}\u{751f}\u{6210} `use_effect` \u{6b7b}\u{5faa}\u{73af}\u{ff1b}\u{5f00}\u{53d1}\u{671f}\u{653e}\u{884c} `0.0.0.0` Host \u{8ba9} dx \u{4ee3}\u{7406}\u{53ef}\u{7528}\u{3001}Host \u{767d}\u{540d}\u{5355}\u{52a0}\u{5165} `APP_BASE_URL` \u{57df}\u{540d}\u{3002}\n- **\u{6587}\u{6863}**\u{ff1a}\u{4fee}\u{6b63}\u{6587}\u{6863}\u{6f02}\u{79fb}\u{ff08}AGENTS.md / DEPLOYMENT / .env.example \u{7b49}\u{ff09}\u{3002}\n\n### Removed\n\n- **\u{6b7b}\u{4ee3}\u{7801}\u{6e05}\u{7406} D1\u{2013}D12**\u{ff1a}\u{5220}\u{9664}\u{6b7b}\u{6a21}\u{5757} `resources.rs`\u{3001}\u{6b7b} `User` \u{7ed3}\u{6784}\u{4f53}\u{3001}\u{672a}\u{7528}\u{53c2}\u{6570}\u{3001}mhchem \u{5197}\u{4f59}\u{5206}\u{652f}\u{3001}\u{6b7b}\u{5bfc}\u{51fa}\u{4e0e}\u{6587}\u{6863}\u{5316}\u{6b7b}\u{5206}\u{652f}\u{3001}\u{672a}\u{4f7f}\u{7528}\u{4e14}\u{6c38}\u{4e0d}\u{5931}\u{6548}\u{7684}\u{7f13}\u{5b58}\u{952e}\u{7b49}\u{ff1b}\u{6536}\u{7a84}\u{6a21}\u{5757}\u{7ea7} allow\u{3002}\n- \u{8fc1}\u{79fb}\u{540e}\u{8865}\u{56de}/\u{79fb}\u{9664}\u{6d4b}\u{8bd5}\u{4e2d}\u{5931}\u{6548}\u{7684} `sha2::Digest` \u{5bfc}\u{5165}\u{3002}\n\n## [0.6.2] - 2026-07-24\n\n### Fixed\n\n- **web-only \u{6784}\u{5efa}\u{5931}\u{8d25}**\u{ff1a}`sleep_ms` \u{539f}\u{7528} `#[cfg(not(target_arch = \"wasm32\"))]` guard tokio \u{5206}\u{652f}\u{ff0c}\u{4f46} tokio \u{662f} server-only optional \u{4f9d}\u{8d56}\u{3002}\u{8be5} guard \u{5728}\u{300c}\u{975e} wasm32 \u{4e3b}\u{673a} + \u{4ec5} web feature\u{300d}\u{7ec4}\u{5408}\u{4e0b}\u{8bef}\u{6fc0}\u{6d3b}\u{5bfc}\u{81f4}\u{7f16}\u{8bd1}\u{5931}\u{8d25}\u{ff08}\u{957f}\u{671f}\u{88ab} dev-dependencies \u{4e2d}\u{7684} tokio \u{63a9}\u{76d6}\u{ff0c}\u{53ea}\u{6709}\u{6392}\u{9664} dev-deps \u{7684}\u{751f}\u{4ea7}\u{6784}\u{5efa}\u{624d}\u{66b4}\u{9732}\u{ff09}\u{3002}\u{4fee}\u{590d}\u{4e3a} `#[cfg(all(feature = \"server\", not(target_arch = \"wasm32\")))]`\u{ff0c}\u{7b26}\u{5408} dual-target gating \u{89c4}\u{8303}\u{3002}\n- **404 \u{9875}\u{300c}\u{8fd4}\u{56de}\u{9996}\u{9875}\u{300d}\u{5361}\u{6b7b}**\u{ff1a}\u{6587}\u{7ae0}\u{8be6}\u{60c5}\u{9875}\u{5bf9}\u{4e0d}\u{5b58}\u{5728}\u{7684} slug \u{629b}\u{51fa} 404 \u{9519}\u{8bef}\u{540e}\u{ff0c}Dioxus `ErrorBoundary` \u{6355}\u{83b7}\u{9519}\u{8bef}\u{6e32}\u{67d3} fallback\u{ff0c}\u{4f46}\u{70b9}\u{51fb}\u{300c}\u{8fd4}\u{56de}\u{9996}\u{9875}\u{300d}\u{4ec5}\u{66f4}\u{65b0} URL \u{4e0d}\u{5207}\u{6362}\u{9875}\u{9762}\u{ff08}`ErrorBoundary` \u{9700}\u{663e}\u{5f0f} `clear_errors()` \u{624d}\u{80fd}\u{6062}\u{590d}\u{6e32}\u{67d3} children\u{ff09}\u{3002}\u{4fee}\u{590d}\u{ff1a}\u{8fd4}\u{56de}\u{9996}\u{9875}\u{6539}\u{7528} button\u{ff0c}onclick \u{5185}\u{5148} `clear_errors()` \u{518d}\u{5bfc}\u{822a}\u{3002}\n\n## [0.6.1] - 2026-07-23\n\n### Changed\n\n- **\u{6d88}\u{9664}\u{975e}\u{6d4b}\u{8bd5}\u{4ee3}\u{7801}\u{4e2d}\u{7684}\u{88f8} `unwrap()`**\u{ff1a}\u{5728} `panic = \"abort\"` \u{5168}\u{5c40}\u{4e0b}\u{ff0c}\u{4efb}\u{4f55}\u{88f8} `unwrap()` \u{90fd}\u{4f1a}\u{76f4}\u{63a5}\u{5d29}\u{6e83}\u{6574}\u{4e2a}\u{8fdb}\u{7a0b}\u{4e14}\u{65e0}\u{6cd5}\u{6062}\u{590d}\u{3002}\u{5c06}\u{6240}\u{6709}\u{975e}\u{6d4b}\u{8bd5}\u{4ee3}\u{7801}\u{4e2d}\u{7684} `unwrap()` \u{6539}\u{5199}\u{4e3a}\u{5e26}\u{4e0d}\u{53d8}\u{91cf}\u{8bf4}\u{660e}\u{7684} `expect()`\u{ff08}\u{6d88}\u{606f}\u{9700}\u{89e3}\u{91ca}*\u{4e3a}\u{4f55}*\u{4e0d}\u{53ef}\u{80fd}\u{5931}\u{8d25}\u{ff09}\u{ff0c}\u{5e76}\u{5728} AGENTS.md \u{89c4}\u{8303} #16 \u{4e2d}\u{56fa}\u{5316}\u{8be5}\u{7ea6}\u{675f}\u{3002}\n\n### Fixed\n\n- **mhchem \u{8f6c}\u{8bd1}\u{5668}\u{4e09}\u{5904} panic \u{4fee}\u{590d}**\u{ff1a}\u{4fee}\u{590d} `panic = \"abort\"` \u{4e0b}\u{5316}\u{5b66}\u{516c}\u{5f0f}\u{8f6c}\u{8bd1}\u{5668}\u{7684}\u{4e09}\u{5904}\u{5d29}\u{6e83}\u{ff1a}`\". __* \"` \u{6b63}\u{5219}\u{8f6c}\u{5f55}\u{9519}\u{8bef}\u{3001}`find_observe_end` \u{9010}\u{5b57}\u{8282}\u{626b}\u{63cf}\u{591a}\u{5b57}\u{8282}\u{5b57}\u{7b26}\u{8d8a}\u{754c}\u{3001}\u{4ee5}\u{53ca} `re!` \u{5b8f}\u{7f16}\u{8bd1}\u{5931}\u{8d25}\u{65f6}\u{672a}\u{964d}\u{7ea7}\u{4e3a}\u{4e0d}\u{5339}\u{914d}\u{5bfc}\u{81f4}\u{76f4}\u{63a5} panic\u{3002}\u{524d}\u{4e24}\u{5904}\u{4e3a}\u{8f93}\u{5165}\u{89e6}\u{53d1}\u{7684}\u{8fd0}\u{884c}\u{65f6} panic\u{ff0c}\u{7b2c}\u{4e09}\u{5904}\u{8865}\u{4e0a}\u{7f3a}\u{5931}\u{7684}\u{9632}\u{5fa1}\u{6027}\u{8fb9}\u{754c}\u{3002}\n- **Docker \u{6784}\u{5efa}\u{7f3a} `patches/` \u{76ee}\u{5f55}**\u{ff1a}\u{6784}\u{5efa}\u{955c}\u{50cf}\u{65f6}\u{672a}\u{590d}\u{5236} `patches/` \u{76ee}\u{5f55}\u{5bfc}\u{81f4} `pnpm install` \u{62a5} ENOENT\u{ff0c}\u{8865}\u{5145}\u{590d}\u{5236}\u{4fee}\u{590d}\u{3002}\n\n## [0.6.0] - 2026-07-23\n\n### Added\n\n- **\u{7f16}\u{8f91}\u{5668} mermaid \u{5b9e}\u{65f6}\u{9884}\u{89c8}**\u{ff1a}Tiptap \u{4ee3}\u{7801}\u{5757}\u{5728}\u{7f16}\u{8f91}\u{5668}\u{5185}\u{5b9e}\u{65f6}\u{6e32}\u{67d3} mermaid \u{6d41}\u{7a0b}\u{56fe}\u{ff0c}\u{6240}\u{89c1}\u{5373}\u{6240}\u{5f97}\u{3002}\n- **\u{7f16}\u{8f91}\u{5668}\u{811a}\u{6ce8}\u{6240}\u{89c1}\u{5373}\u{6240}\u{5f97}**\u{ff1a}Tiptap \u{5bcc}\u{6587}\u{672c}\u{7f16}\u{8f91}\u{5668}\u{5185}\u{811a}\u{6ce8}\u{76f4}\u{63a5}\u{53ef}\u{89c1}\u{ff0c}\u{4e0d}\u{518d}\u{4f9d}\u{8d56} Markdown \u{6e90}\u{7801}\u{3002}\n- **mhchem \u{5316}\u{5b66}\u{516c}\u{5f0f}**\u{ff1a}\u{79fb}\u{690d} mhchem \u{8f6c}\u{8bd1}\u{5668}\u{ff0c}\u{652f}\u{6301} `\\ce`/`\\pu` \u{5316}\u{5b66}\u{65b9}\u{7a0b}\u{5f0f}\u{8bed}\u{6cd5}\u{8f6c} LaTeX \u{6e32}\u{67d3}\u{3002}\n- **KaTeX \u{7269}\u{7406}\u{5b66}\u{5b8f}\u{8868}**\u{ff1a}\u{6ce8}\u{518c} 16 \u{4e2a}\u{7269}\u{7406}\u{5b66}\u{5b8f}\u{ff08}\u{5982} `\\d`\u{3001}`\\od`\u{3001}`\\textsubscript` \u{7b49}\u{ff09}\u{ff0c}\u{9002}\u{914d}\u{7269}\u{7406}\u{5b66}\u{516c}\u{5f0f}\u{5199}\u{4f5c}\u{4e60}\u{60ef}\u{3002}\n- **\u{65b0}\u{5efa}\u{6587}\u{7ae0}\u{9ed8}\u{8ba4}\u{76f4}\u{63a5}\u{53d1}\u{5e03}**\u{ff1a}`/admin/write` \u{65b0}\u{5efa}\u{6587}\u{7ae0}\u{7684}\u{9ed8}\u{8ba4}\u{53d1}\u{5e03}\u{72b6}\u{6001}\u{6539}\u{4e3a}\u{76f4}\u{63a5}\u{53d1}\u{5e03}\u{3002}\n\n### Changed\n\n- **mermaid \u{4e3b}\u{9898}\u{53d8}\u{91cf}\u{4e0b}\u{6c89}**\u{ff1a}\u{5c06} Catppuccin \u{4e3b}\u{9898}\u{53d8}\u{91cf}\u{4ece} tiptap-editor \u{4e0b}\u{6c89}\u{5230} `@yggdrasil/shared` \u{5171}\u{4eab}\u{5305}\u{ff0c}\u{7edf}\u{4e00}\u{7ba1}\u{7406}\u{3002}\n- **\u{4e2d}\u{95f4}\u{4ef6}\u{62bd}\u{53d6}**\u{ff1a}\u{5c06} `ssr_generation`/`version_headers` \u{4e2d}\u{95f4}\u{4ef6}\u{4ece} `main.rs` \u{62bd}\u{51fa}\u{81f3} `src/middleware.rs`\u{3002}\n\n### Fixed\n\n- **\u{7a84}\u{8868}\u{683c}\u{8fb9}\u{6846}\u{88c1}\u{5207}**\u{ff1a}\u{4fee}\u{590d}\u{7a84}\u{8868}\u{683c}\u{5728} `table-wrap` \u{5bb9}\u{5668}\u{5185}\u{8fb9}\u{6846}\u{88ab}\u{88c1}\u{5207}\u{7684}\u{95ee}\u{9898}\u{3002}\n- **\u{79fb}\u{52a8}\u{7aef}\u{8868}\u{683c}\u{6eda}\u{52a8}**\u{ff1a}\u{4fee}\u{590d}\u{79fb}\u{52a8}\u{7aef}\u{8868}\u{683c}\u{65e0}\u{6cd5}\u{6a2a}\u{5411}\u{6eda}\u{52a8}\u{7684}\u{95ee}\u{9898}\u{3002}\n- **\u{7a7a}\u{5de5}\u{5177}\u{680f}\u{9876}\u{680f}**\u{ff1a}\u{9690}\u{85cf}\u{65e0}\u{8bed}\u{8a00}\u{6807}\u{8bc6}\u{4ee3}\u{7801}\u{5757}\u{7684}\u{7a7a}\u{5de5}\u{5177}\u{680f}\u{9876}\u{680f}\u{3002}\n- **KaTeX sanitizer \u{62e6}\u{622a}**\u{ff1a}\u{5141}\u{8bb8} KaTeX \u{6e32}\u{67d3}\u{6240}\u{9700}\u{7684} `svg`\u{3001}`path` \u{6807}\u{7b7e}\u{53ca}\u{7ed8}\u{56fe}\u{5c5e}\u{6027}\u{901a}\u{8fc7} sanitizer\u{3002}\n- **tiptap-markdown \u{8fc7}\u{5ea6}\u{8f6c}\u{4e49}**\u{ff1a}\u{4fee}\u{590d} tiptap-markdown \u{8fc7}\u{5ea6}\u{8f6c}\u{4e49}\u{5bfc}\u{81f4}\u{5185}\u{5bb9}\u{663e}\u{793a}\u{635f}\u{574f}\u{3002}\n- **\u{811a}\u{6ce8}\u{5e8f}\u{5217}\u{5316}\u{8f6c}\u{4e49}\u{5931}\u{6548}**\u{ff1a}\u{4fee}\u{590d} tiptap \u{5e8f}\u{5217}\u{5316}\u{8f6c}\u{4e49}\u{811a}\u{6ce8}\u{8bed}\u{6cd5} `[^id]` \u{2192} `\\[^id\\]` \u{5bfc}\u{81f4}\u{811a}\u{6ce8}\u{5931}\u{6548}\u{3002}\n- **SQL \u{63a7}\u{5236}\u{53f0}\u{5199}\u{540e}\u{7f13}\u{5b58}\u{5931}\u{6548}**\u{ff1a}SQL \u{63a7}\u{5236}\u{53f0}\u{6267}\u{884c}\u{5199}\u{64cd}\u{4f5c}\u{540e}\u{5168}\u{91cf}\u{5931}\u{6548}\u{76f8}\u{5173}\u{7f13}\u{5b58}\u{3002}\n\n## [0.5.0] - 2026-07-22\n\n### Added\n\n- **\u{6587}\u{7ae0}\u{6570}\u{5b66}\u{516c}\u{5f0f} SSR \u{6e32}\u{67d3}(KaTeX)**\u{ff1a}\u{5f15}\u{5165} `katex-rs` \u{5728}\u{670d}\u{52a1}\u{7aef}\u{628a} `$...$`/`$$...$$` TeX \u{6e32}\u{67d3}\u{6210}\u{89c6}\u{89c9}\u{5c42} HTML span(`OutputFormat::Html`,\u{4e0d}\u{542b} MathML,XSS \u{9762}\u{6700}\u{5c0f};`throw_on_error=false` \u{574f}\u{516c}\u{5f0f}\u{6e32}\u{67d3}\u{6210}\u{7ea2}\u{8272}\u{9519}\u{8bef}\u{800c}\u{975e}\u{4e2d}\u{65ad});\u{81ea}\u{6258}\u{7ba1} KaTeX CSS + woff2 \u{5b57}\u{4f53}\u{5230} `public/katex/`(`make katex-css` \u{4ece} npm `katex` dist \u{62f7}\u{8d1d})\u{3002}\n- **\u{8bc4}\u{8bba}\u{6570}\u{5b66}\u{516c}\u{5f0f}\u{6e32}\u{67d3}**\u{ff1a}\u{8bc4}\u{8bba}\u{8def}\u{5f84}\u{540c}\u{6b65}\u{5f00}\u{542f} `ENABLE_MATH`,span \u{767d}\u{540d}\u{5355}\u{52a0} `style` \u{4fdd}\u{7559} KaTeX \u{5185}\u{8054}\u{5b9a}\u{4f4d}\u{6837}\u{5f0f}\u{3002}\n- **\u{7f16}\u{8f91}\u{5668}\u{6570}\u{5b66}\u{516c}\u{5f0f}\u{8282}\u{70b9}**\u{ff1a}Tiptap \u{6570}\u{5b66}\u{516c}\u{5f0f}\u{8282}\u{70b9}\u{5e26} KaTeX \u{9884}\u{89c8},\u{6839}\u{6cbb}\u{7f16}\u{8f91}\u{5668}\u{5e8f}\u{5217}\u{5316}\u{7834}\u{574f} LaTeX \u{7684}\u{95ee}\u{9898}\u{3002}\n- **mermaid \u{6d41}\u{7a0b}\u{56fe}\u{61d2}\u{52a0}\u{8f7d}\u{6e32}\u{67d3}**\u{ff1a}\u{6587}\u{7ae0}\u{9875} `language-mermaid` \u{4ee3}\u{7801}\u{5757}\u{7ecf} IntersectionObserver \u{89c6}\u{53e3}\u{53ef}\u{89c1}\u{65f6}\u{52a8}\u{6001} `import(\'/mermaid/mermaid.js\')`(\u{72ec}\u{7acb} IIFE bundle,~3.4MB / gzip ~900KB,\u{975e}\u{5168}\u{5c40}\u{6ce8}\u{5165}),`mermaid.render` \u{4ea7} SVG \u{6ce8}\u{5165};\u{4e3b}\u{9898}\u{7ecf} `__initMermaid` \u{4f20}\u{5165},`securityLevel: \'strict\'`,\u{5e42}\u{7b49}\u{5b88}\u{536b}\u{9632}\u{91cd}\u{590d}\u{6e32}\u{67d3};\u{6e32}\u{67d3}\u{5931}\u{8d25}\u{4fdd}\u{7559}\u{6e90}\u{7801}\u{5e76}\u{52a0} `.mermaid-error` class\u{3002}\n- **\u{6d41}\u{7a0b}\u{56fe}\u{914d}\u{8272}\u{5bf9}\u{9f50} Catppuccin**\u{ff1a}mermaid \u{914d}\u{8272}\u{5bf9}\u{9f50} Catppuccin \u{4e3b}\u{9898},\u{5bb9}\u{5668}\u{7f8e}\u{5316}\u{3002}\n- **\u{6d41}\u{7a0b}\u{56fe}\u{4e3b}\u{9898}\u{5207}\u{6362}\u{52a8}\u{753b}**\u{ff1a}\u{6d41}\u{7a0b}\u{56fe}\u{4e3b}\u{9898}\u{5207}\u{6362}\u{8ddf}\u{968f} View Transitions \u{5706}\u{5f62}\u{6269}\u{6563}\u{52a8}\u{753b},\u{4e3b}\u{9898}\u{5207}\u{6362}\u{65f6}\u{91cd}\u{6e32}\u{67d3}\u{5df2}\u{6e32}\u{67d3}\u{7684}\u{6d41}\u{7a0b}\u{56fe}\u{3002}\n- **bun \u{4ee3}\u{7801}\u{8fd0}\u{884c}\u{5668}**\u{ff1a}\u{65b0}\u{589e} `yggdrasil-runner-bun` \u{6c99}\u{7bb1}\u{955c}\u{50cf}(\u{5b98}\u{65b9} `bun.sh/install` \u{811a}\u{672c} + musl \u{53d8}\u{4f53} + `libstdc++`/`libgcc` C++ \u{8fd0}\u{884c}\u{65f6});admin \u{4ee3}\u{7801}\u{8bd5}\u{8fd0}\u{884c}\u{6c99}\u{7bb1}\u{52a0} bun \u{8bed}\u{8a00}\u{6309}\u{94ae};CodeMirror \u{52a0} TypeScript \u{6a21}\u{5f0f};\u{8bed}\u{8a00}\u{522b}\u{540d}\u{5f52}\u{4e00}\u{5316}(`ts`/`typescript`\u{2192}`bun`,\u{5728} `parse_fence_info` \u{7edf}\u{4e00},`LANGUAGES.get` \u{53ea}\u{89c1}\u{89c4}\u{8303}\u{5316} key)\u{3002}\n- **\u{6587}\u{7ae0}\u{9875}\u{811a}\u{6ce8}\u{5b8c}\u{6574}\u{652f}\u{6301}**\u{ff1a}\u{8bed}\u{4e49}\u{5316} + back-link + \u{6837}\u{5f0f}\u{3002}\n- **Vue SFC \u{8bed}\u{6cd5}\u{9ad8}\u{4eae}**\u{ff1a}\u{6587}\u{7ae0}\u{9875}\u{4ee3}\u{7801}\u{5757}\u{652f}\u{6301} Vue SFC \u{8bed}\u{6cd5}\u{9ad8}\u{4eae}\u{3002}\n- **\u{641c}\u{7d22}\u{5165}\u{53e3}\u{6539}\u{4e3a}\u{56fe}\u{6807}\u{6309}\u{94ae}**\u{ff1a}header \u{641c}\u{7d22}\u{5165}\u{53e3}\u{4ece}\u{6587}\u{5b57}\u{6539}\u{4e3a}\u{56fe}\u{6807}\u{6309}\u{94ae}\u{3002}\n- **\u{6b63}\u{6587}\u{6298}\u{53e0}\u{5757}\u{5361}\u{7247}\u{5316}**\u{ff1a}`<details>` \u{6298}\u{53e0}\u{5757}\u{5361}\u{7247}\u{5316},\u{81ea}\u{7ed8} chevron + hover/focus \u{6001}\u{3002}\n- **task-list checkbox \u{81ea}\u{7ed8}**\u{ff1a}\u{6587}\u{7ae0}\u{9875} task-list checkbox \u{6539}\u{7528} `appearance:none` \u{81ea}\u{7ed8}\u{5706}\u{89d2}\u{65b9}\u{6846}\u{3002}\n- **\u{4ee3}\u{7801}\u{5757}\u{5b57}\u{53f7}\u{8c03}\u{6574}**\u{ff1a}\u{6587}\u{7ae0}\u{9875}\u{4ee3}\u{7801}\u{5757}\u{5b57}\u{53f7}\u{4ece} 13.6px \u{8c03}\u{6574}\u{4e3a} 16px\u{3002}\n- **\u{54cd}\u{5e94}\u{5934}\u{66b4}\u{9732}\u{7248}\u{672c}\u{4fe1}\u{606f}**\u{ff1a}server \u{901a}\u{8fc7} `Server`/`X-Yggdrasil-Version`/`X-Yggdrasil-Git` \u{54cd}\u{5e94}\u{5934}\u{4e3b}\u{52a8}\u{66b4}\u{9732}\u{7248}\u{672c}\u{4e0e} git \u{63cf}\u{8ff0}\u{4fe1}\u{606f}(`EXPOSE_VERSION_HEADERS` \u{53ef}\u{5173})\u{3002}\n- **Docker multi-arch \u{6784}\u{5efa}\u{76ee}\u{6807}**\u{ff1a}`make docker-amd64` \u{4e0e} `make docker-apple` \u{6784}\u{5efa} x86_64 \u{955c}\u{50cf}\u{3002}\n- **\u{670d}\u{52a1}\u{5668}\u{7aef}\u{53e3}\u{5360}\u{7528}\u{4f18}\u{96c5}\u{9000}\u{51fa}**\u{ff1a}\u{7aef}\u{53e3}\u{88ab}\u{5360}\u{7528}\u{65f6}\u{4f18}\u{96c5}\u{9000}\u{51fa}\u{800c}\u{975e} panic\u{3002}\n- **\u{538b}\u{7f29}\u{7b97}\u{6cd5}\u{9ed8}\u{8ba4} off**\u{ff1a}`COMPRESSION_ALGORITHMS` \u{4e2d}\u{95f4}\u{4ef6}\u{9ed8}\u{8ba4}\u{503c}\u{6539}\u{4e3a} off\u{3002}\n\n### Changed\n\n- **mimalloc \u{5168}\u{5c40}\u{5206}\u{914d}\u{5668}**\u{ff1a}\u{7528} mimalloc \u{66ff}\u{6362}\u{7cfb}\u{7edf}\u{5168}\u{5c40}\u{5206}\u{914d}\u{5668}(`#[global_allocator]`,\u{53cc} cfg \u{95e8}\u{63a7}:server feature + \u{975e} wasm32;musl \u{9759}\u{6001}\u{94fe}\u{63a5}\u{53cb}\u{597d})\u{3002}\n- **\u{6027}\u{80fd}\u{4f18}\u{5316}\u{7cfb}\u{5217}**\u{ff1a}`escape_html` \u{94fe}\u{5f0f} 5 \u{6b21} replace \u{6539}\u{5355}\u{904d}\u{626b}\u{63cf};`slugify` \u{5355}\u{904d}\u{72b6}\u{6001}\u{673a}\u{91cd}\u{5199}(\u{5206}\u{914d} 4\u{2192}1);Markdown \u{6e32}\u{67d3}\u{6d88}\u{9664}\u{53cc}\u{89e3}\u{6790} + `format!` \u{6539} `write!` \u{76f4}\u{5199};upload \u{6d88}\u{9664} `data.to_vec()` \u{591a}\u{6b21}\u{5168}\u{6587}\u{4ef6}\u{6df1}\u{62f7}\u{8d1d};`cache_key` \u{5355}\u{6b21}\u{62fc}\u{63a5} + `detect_format` \u{96f6}\u{5206}\u{914d}\u{540e}\u{7f00}\u{5339}\u{914d};posts list/search \u{96f6} capacity Vec \u{6539} collect \u{9884}\u{5206}\u{914d} + helpers retain\u{3002}\n- **\u{91cd}\u{6784}\u{7cfb}\u{5217}**\u{ff1a}admin `/admin/posts` \u{4e0e} `/admin/posts/trash` \u{5408}\u{5e76}\u{4e3a}\u{5355}\u{8def}\u{7531} + tab \u{5207}\u{6362};`Pagination` \u{652f}\u{6301}\u{53ef}\u{9009} `on_prev`/`on_next` \u{56de}\u{8c03};\u{62bd}\u{53d6} `@yggdrasil/shared` \u{5185}\u{90e8}\u{6e90}\u{5171}\u{4eab}\u{5305}\u{6d88}\u{9664}\u{8de8} IIFE \u{5e93}\u{7684}\u{7c7b}\u{578b}/\u{5e38}\u{91cf}\u{91cd}\u{590d};\u{62bd} `main.rs` \u{4e2d}\u{95f4}\u{4ef6}\u{5230} `src/middleware.rs`;\u{4e3a} `Response` \u{7c7b}\u{578b}\u{6dfb}\u{52a0}\u{6784}\u{9020}\u{5668}\u{6d88}\u{9664} 51 \u{5904}\u{6837}\u{677f};\u{62bd} `invalidate_post_metadata()`/`upload_error()` \u{7b49}\u{6d88}\u{9664}\u{6837}\u{677f};\u{7edf}\u{4e00} WASM sleep \u{5230} `utils::time::sleep_ms`;\u{5220}\u{9664}\u{6b7b}\u{4ee3}\u{7801}(`delayed_loading.rs`/`ui.rs EmptyState`/`CommentActions`/\u{672a}\u{7528} re-export);\u{62c6}\u{5206} `system.rs` \u{4e3a} `system/` \u{76ee}\u{5f55}(\u{6309} tab \u{5206}\u{6587}\u{4ef6});\u{56fe}\u{7247}\u{5904}\u{7406}\u{5408}\u{5e76}\u{7ef4}\u{5ea6}\u{8bfb}\u{53d6}\u{51fd}\u{6570}\u{5171}\u{4eab} `image_reader_limits`\u{3002}\n- **\u{4f9d}\u{8d56}\u{5347}\u{7ea7}**\u{ff1a}TypeScript \u{5347}\u{7ea7}\u{81f3} 7.0.2(Go \u{539f}\u{751f}\u{7f16}\u{8bd1}\u{5668})\u{3002}\n\n### Fixed\n\n- **SSR \u{7f13}\u{5b58}\u{5931}\u{6548}\u{6839}\u{6cbb}**\u{ff1a}\u{6587}\u{7ae0}\u{5199}\u{5165}\u{540e}\u{7269}\u{7406}\u{5220}\u{9664} SSR \u{78c1}\u{76d8}\u{7f13}\u{5b58}\u{76ee}\u{5f55},\u{6839}\u{6cbb}\u{300c}\u{91cd}\u{5efa}\u{540e}\u{5185}\u{5bb9}\u{4e0d}\u{66f4}\u{65b0}\u{300d}(Dioxus 0.7 \u{589e}\u{91cf}\u{6e32}\u{67d3}\u{5668}\u{53ea}\u{66b4}\u{9732} TTL \u{5931}\u{6548}\u{624b}\u{6bb5},\u{901a}\u{8fc7}\u{5220}\u{6587}\u{4ef6}\u{7ed5}\u{8fc7}\u{9650}\u{5236});build \u{524d}\u{6e05}\u{9664} `static/` SSR \u{7f13}\u{5b58}\u{76ee}\u{5f55}\u{3002}\n- **Docker \u{6784}\u{5efa}/\u{90e8}\u{7f72}**\u{ff1a}Docker \u{6784}\u{5efa}\u{900f}\u{4f20} git \u{4fe1}\u{606f}\u{4fee}\u{590d} `x-yggdrasil-git` \u{6052}\u{4e3a} unknown;\u{9884}\u{88c5} binaryen \u{907f}\u{514d} dx \u{8fd0}\u{884c}\u{65f6}\u{4e0b}\u{8f7d} wasm-opt \u{5931}\u{8d25};\u{8865}\u{9f50} Dockerfile \u{7f3a}\u{5931}\u{7684} katex-css \u{4e0e} restore-webp \u{6b65}\u{9aa4};\u{5347}\u{7ea7} builder \u{81f3} trixie \u{6ee1}\u{8db3} dx \u{5bf9} GLIBC_2.39 \u{7684}\u{9700}\u{6c42};\u{7528} tmpfs `mode=1777` \u{66ff}\u{6362} uid/gid \u{9009}\u{9879}\u{517c}\u{5bb9} Podman;GitHub Releases \u{4e0b}\u{8f7d}\u{6700}\u{7ec8}\u{6539}\u{7528}\u{76f4}\u{8fde}(\u{79fb}\u{9664} gh-proxy)\u{3002}\n- **\u{7ebf}\u{4e0a}\u{4ee3}\u{7801}\u{9ad8}\u{4eae}\u{7f3a}\u{5931}**\u{ff1a}\u{7f16}\u{8bd1}\u{671f}\u{5185}\u{5d4c}\u{81ea}\u{5b9a}\u{4e49}\u{8bed}\u{6cd5},\u{4fee}\u{590d}\u{7ebf}\u{4e0a} Docker \u{955c}\u{50cf}\u{4ee3}\u{7801}\u{9ad8}\u{4eae}\u{7f3a}\u{5931}(\u{539f}\u{5148}\u{8fd0}\u{884c}\u{65f6}\u{52a0}\u{8f7d}\u{8bed}\u{6cd5}\u{6587}\u{4ef6}\u{5728}\u{6253}\u{5305}\u{955c}\u{50cf}\u{4e2d}\u{627e}\u{4e0d}\u{5230})\u{3002}\n- **mermaid \u{6e32}\u{67d3}**\u{ff1a}\u{6539}\u{7528} script \u{6807}\u{7b7e}\u{52a0}\u{8f7d} IIFE bundle \u{4fee}\u{6b63}\u{5168}\u{5c40}\u{53d8}\u{91cf}\u{53d6}\u{503c};\u{4fee}\u{590d} tsc \u{7c7b}\u{578b}\u{9519}\u{8bef};\u{4e3b}\u{9898}\u{5207}\u{6362}\u{65f6}\u{91cd}\u{6e32}\u{67d3}\u{5df2}\u{6e32}\u{67d3}\u{7684}\u{6d41}\u{7a0b}\u{56fe}\u{3002}\n- **\u{6587}\u{7ae0}\u{951a}\u{70b9}\u{5bfc}\u{822a}**\u{ff1a}`scrollToHash` \u{589e}\u{52a0}\u{4e00}\u{6b21}\u{6027}\u{5b88}\u{536b},\u{5207}\u{4e3b}\u{9898}\u{4e0d}\u{518d}\u{8df3}\u{56de} URL hash;\u{589e}\u{52a0} ResizeObserver \u{5e03}\u{5c40}\u{7a33}\u{5b9a}\u{671f},\u{4fee}\u{6b63} mermaid \u{5f02}\u{6b65}\u{6e32}\u{67d3}\u{5bfc}\u{81f4}\u{7684}\u{951a}\u{70b9}\u{843d}\u{70b9}\u{504f}\u{79fb}\u{3002}\n- **WASM \u{53cc}\u{7aef}\u{7f16}\u{8bd1}**\u{ff1a}hooks \u{6a21}\u{5757}\u{79fb}\u{51fa} server gate \u{53cc}\u{7aef}\u{53ef}\u{89c1}(\u{539f}\u{5148} WASM \u{7f16}\u{8bd1}\u{5931}\u{8d25})\u{3002}\n- **\u{8bc4}\u{8bba}\u{4ee3}\u{7801}\u{5757}\u{8f6c}\u{4e49}**\u{ff1a}\u{7edf}\u{4e00} `escape_html`,\u{4fee}\u{590d}\u{4ee3}\u{7801}\u{5757}\u{5355}\u{5f15}\u{53f7}\u{672a}\u{8f6c}\u{4e49}\u{3002}\n- **Docker daemon \u{5bb9}\u{9519}**\u{ff1a}Docker daemon \u{4e0d}\u{53ef}\u{7528}/\u{65ad}\u{8fde}\u{65f6}\u{4e0d}\u{518d} panic(\u{96c6}\u{6210}\u{6d4b}\u{8bd5}\u{5728}\u{65e0} daemon \u{73af}\u{5883}\u{4f18}\u{96c5}\u{8df3}\u{8fc7})\u{3002}\n- **\u{540e}\u{53f0}\u{5e03}\u{5c40}**\u{ff1a}\u{91cd}\u{5efa}\u{7ed3}\u{679c}\u{6d88}\u{606f}\u{6539}\u{7edd}\u{5bf9}\u{5b9a}\u{4f4d},\u{907f}\u{514d}\u{6491}\u{9ad8}\u{5bb9}\u{5668}\u{9876}\u{8d77}\u{6309}\u{94ae}\u{3002}\n- **\u{56fe}\u{7247} cfg \u{95e8}\u{63a7}**\u{ff1a}\u{4e3a} `ImageFmt` \u{522b}\u{540d}\u{8865}\u{4e0a} `#[cfg(feature = \"server\")]` \u{95e8}\u{63a7}\u{3002}\n- **clippy/lint**\u{ff1a}\u{4fee}\u{590d} rust-1.97 clippy `useless_borrows_in_formatting` \u{544a}\u{8b66}\u{3001}Biome \u{544a}\u{8b66}\u{3002}\n- **\u{5b89}\u{5168}\u{6d4b}\u{8bd5}**\u{ff1a}\u{8865}\u{9f50}\u{5b89}\u{5168}\u{5173}\u{952e}\u{8def}\u{5f84}\u{7684}\u{5355}\u{5143}\u{6d4b}\u{8bd5}\u{76f2}\u{533a}\u{3002}\n\n### Internal\n\n- **skills \u{4f53}\u{7cfb}**\u{ff1a}\u{65b0}\u{589e} `optimizing-rust-performance` \u{4e0e} `rust-advanced-performance` \u{6027}\u{80fd}\u{4f18}\u{5316}\u{6280}\u{80fd};\u{6e05}\u{7406}\u{5df2}\u{5378}\u{8f7d}\u{7684}\u{7b2c}\u{4e09}\u{65b9} skills \u{53ca} lock \u{6ce8}\u{518c};`deploy-to-linux` \u{6dfb}\u{52a0}\u{624b}\u{52a8}\u{90e8}\u{7f72}\u{6a21}\u{5f0f}\u{3002}\n- **\u{90e8}\u{7f72}\u{811a}\u{672c}**\u{ff1a}\u{65b0}\u{589e} xun \u{670d}\u{52a1}\u{5668}\u{5168}\u{91cf}\u{90e8}\u{7f72}\u{811a}\u{672c}\u{3002}\n- **\u{6587}\u{6863}**\u{ff1a}AGENTS.md \u{8865}\u{5145}\u{522b}\u{540d}\u{5f52}\u{4e00}\u{5316}\u{4e0e} bun \u{955c}\u{50cf}\u{8bf4}\u{660e}\u{3001}\u{6570}\u{5b66}\u{516c}\u{5f0f}\u{4e0e}\u{6d41}\u{7a0b}\u{56fe}\u{67b6}\u{6784}\u{8bf4}\u{660e}\u{3001}xterm-terminal/shared \u{5e93}\u{8bf4}\u{660e};\u{8865}\u{5168} `.env.example` \u{7f3a}\u{5931}\u{7684} 5 \u{4e2a}\u{73af}\u{5883}\u{53d8}\u{91cf}\u{3002}\n\n## [0.4.0] - 2026-07-13\n\n### Added\n\n- **\u{4ee3}\u{7801}\u{8fd0}\u{884c}\u{5668}\u{ff08}Code Runner\u{ff09}**\u{ff1a}\u{8bfb}\u{8005}\u{53ef}\u{5728}\u{6587}\u{7ae0}\u{9875}\u{76f4}\u{63a5}\u{8fd0}\u{884c} ` `lang runnable ``` \u{4ee3}\u{7801}\u{5757}\u{ff0c}\u{5728}\u{9694}\u{79bb}\u{7684} Docker \u{5bb9}\u{5668}\u{4e2d}\u{6267}\u{884c}\u{ff0c}\u{652f}\u{6301} Python / Node.js / Go / Rust \u{56db}\u{79cd}\u{8bed}\u{8a00}\u{ff1b}admin \u{4fa7} `/admin/runner` \u{8bd5}\u{9a8c}\u{6c99}\u{7bb1}\u{9875}\u{652f}\u{6301}\u{4efb}\u{610f}\u{4ee3}\u{7801}\u{8bd5}\u{8dd1}\u{ff08}\u{8df3}\u{8fc7}\u{901f}\u{7387}\u{9650}\u{5236}\u{ff09}\u{3002}\u{4e09}\u{5c42}\u{67b6}\u{6784}\u{ff1a}`src/infra/docker.rs`\u{ff08}bollard \u{6267}\u{884c}\u{5c42}\u{ff0c}\u{53ea}\u{8bfb} rootfs + tmpfs + \u{8d44}\u{6e90}/\u{80fd}\u{529b}\u{9650}\u{5236} + `ContainerGuard` Drop \u{5f3a}\u{5236}\u{6e05}\u{7406}\u{ff09}\u{3001}`src/api/code_runner/`\u{ff08}\u{4efb}\u{52a1}\u{6ce8}\u{518c}\u{8868}\u{3001}\u{8bed}\u{8a00}\u{6ce8}\u{518c}\u{8868}\u{3001}\u{53cc}\u{901f}\u{7387}\u{9650}\u{5236} + \u{767d}\u{540d}\u{5355} + \u{5927}\u{5c0f}\u{68c0}\u{67e5}\u{ff09}\u{3001}Markdown \u{6e32}\u{67d3}\u{5c42}\u{ff08}`PostContent` \u{62c6}\u{5206} `Html`/`Runnable` \u{7247}\u{6bb5}\u{ff0c}\u{6bcf}\u{5757}\u{6e32}\u{67d3}\u{4e3a}\u{771f}\u{5b9e} `<CodeRunner>` vdom \u{5143}\u{7d20}\u{ff09}\u{3002}\u{6240}\u{6709} `CODE_RUNNER_*` \u{73af}\u{5883}\u{53d8}\u{91cf}\u{53ef}\u{8c03}\u{ff0c}\u{652f}\u{6301} per-IP \u{901f}\u{7387}\u{4e0e}\u{6bcf}\u{65e5}\u{4e0a}\u{9650}\u{3002}\n- **\u{6d41}\u{5f0f}\u{4ee3}\u{7801}\u{6267}\u{884c}\u{ff08}SSE + xterm.js\u{ff09}**\u{ff1a}CodeRunner \u{5207}\u{6362}\u{4e3a} SSE + xterm.js \u{6d41}\u{5f0f}\u{8f93}\u{51fa}\u{65b9}\u{6848}\u{3002}\u{65b0}\u{589e} `xterm-terminal` IIFE \u{5b50}\u{5de5}\u{7a0b}\u{ff08}xterm.js 6.0\u{ff09}\u{3001}`xterm_bridge.rs` wasm-bindgen \u{7ed1}\u{5b9a}\u{3001}`/api/exec/stream` SSE \u{7aef}\u{70b9}\u{3001}Docker \u{6267}\u{884c}\u{5c42}\u{6d41}\u{5f0f}\u{8def}\u{5f84}\u{ff08}wait \u{4e0e} log \u{8bfb}\u{53d6}\u{5e76}\u{53d1}\u{ff09}\u{ff1b}\u{652f}\u{6301}\u{65e0}\u{7f13}\u{51b2} stdout\u{ff08}`python -u`\u{ff09}\u{3001}SSE done \u{4e8b}\u{4ef6}\u{56de}\u{4f20} `duration_ms`\u{3001}\u{8fd0}\u{884c}\u{524d}\u{9690}\u{85cf}\u{8f93}\u{51fa}\u{533a} + skeleton \u{5360}\u{4f4d}\u{3002}\n- **`/admin/system` \u{7ba1}\u{7406}\u{540e}\u{53f0}**\u{ff1a}\u{5168}\u{65b0}\u{7ba1}\u{7406}\u{533a}\u{ff0c}5 \u{4e2a} tab \u{2014}\u{2014} \u{6570}\u{636e}\u{5e93}\u{72b6}\u{6001}\u{ff08}\u{8868}\u{7edf}\u{8ba1}/\u{6d3b}\u{8dc3}\u{8fde}\u{63a5}/\u{8fc1}\u{79fb}\u{7248}\u{672c}\u{ff09}\u{3001}\u{670d}\u{52a1}\u{5668}\u{72b6}\u{6001}\u{ff08}sysinfo \u{4e3b}\u{673a}\u{6307}\u{6807} + moka \u{7f13}\u{5b58}\u{547d}\u{4e2d}\u{7387}\u{8f6e}\u{8be2}\u{ff09}\u{3001}SQL \u{63a7}\u{5236}\u{53f0}\u{ff08}\u{5168}\u{8bfb}\u{5199}\u{ff0c}4 \u{9053}\u{62a4}\u{680f}\u{ff1a}sqlparser AST \u{95e8} + WHERE \u{7f3a}\u{5931}\u{62d2}\u{7edd} + \u{67e5}\u{8be2}\u{8d85}\u{65f6} + \u{524d}\u{7aef}\u{786e}\u{8ba4}\u{ff1b}\u{5355}\u{5143}\u{683c}\u{7c7b}\u{578b}\u{5316}\u{6e32}\u{67d3} NULL/\u{5e03}\u{5c14}/\u{6570}\u{5b57}\u{3001}\u{8868}\u{5934} sticky\u{3001}\u{884c}\u{622a}\u{65ad}\u{5c55}\u{5f00}\u{ff09}\u{3001}\u{6570}\u{636e}\u{5bfc}\u{51fa}\u{ff08}Axum \u{6d41}\u{5f0f} SQL/CSV\u{ff09}\u{3001}\u{5907}\u{4efd}\u{6062}\u{590d}\u{ff08}`pg_dump` \u{4f18}\u{5148} + COPY \u{56de}\u{9000}\u{3001}DashMap \u{4efb}\u{52a1}\u{8fdb}\u{5ea6}\u{8868} + \u{8f6e}\u{8be2}\u{3001}\u{5907}\u{4efd}\u{6587}\u{4ef6}\u{7b7e}\u{540d}\u{6821}\u{9a8c} + \u{8def}\u{5f84}\u{767d}\u{540d}\u{5355}\u{ff09}\u{3002}\n- **UI \u{91cd}\u{65b0}\u{8bbe}\u{8ba1}\u{ff08}\u{5de5}\u{4e1a}\u{6781}\u{7b80} + Catppuccin\u{ff09}**\u{ff1a}\u{5168}\u{7ad9}\u{914d}\u{8272}\u{8fc1}\u{79fb}\u{5230} Catppuccin\u{ff08}Latte/Mocha\u{ff09}\u{ff0c}\u{79fb}\u{9664} Rust \u{4e2d}\u{786c}\u{7f16}\u{7801}\u{989c}\u{8272}\u{ff0c}\u{7edf}\u{4e00}\u{8bed}\u{4e49}\u{8272}\u{9636}\u{ff1b}\u{540e}\u{53f0}\u{91cd}\u{8bbe}\u{8ba1}\u{4e3a}\u{73b0}\u{4ee3}\u{6781}\u{7b80}\u{4fa7}\u{8fb9}\u{680f}\u{5e03}\u{5c40}\u{ff08}\u{5199}\u{6587}\u{7ae0}\u{9875}\u{6539}\u{4e3a}\u{5de6}\u{53f3}\u{4e24}\u{680f}\u{3001}\u{7f16}\u{8f91}\u{5668}\u{81ea}\u{9002}\u{5e94}\u{9ad8}\u{5ea6}\u{ff09}\u{ff1b}\u{5706}\u{89d2} token \u{5316}\u{4e3a}\u{4e09}\u{6863}\u{68af}\u{5ea6}\u{ff08}32/16/8\u{ff09}\u{5e76}\u{7edf}\u{4e00}\u{6240}\u{6709}\u{7ec4}\u{4ef6}\u{ff1b}Markdown \u{8868}\u{683c}\u{91cd}\u{8bbe}\u{8ba1} + \u{8868}\u{683c}\u{5355}\u{5143}\u{683c}\u{5706}\u{89d2}\u{9632}\u{80cc}\u{666f}\u{6ea2}\u{51fa}\u{ff1b}\u{5168}\u{5c40}\u{8def}\u{7531}\u{5207}\u{6362}\u{5e73}\u{6ed1}\u{6302}\u{8f7d}\u{52a8}\u{753b} + View Transitions \u{5706}\u{5f62}\u{5c55}\u{5f00}\u{4e3b}\u{9898}\u{5207}\u{6362}\u{52a8}\u{753b}\u{ff1b}\u{7f16}\u{8f91}\u{5668}\u{80cc}\u{666f}\u{56fe}\u{ff08}\u{7ebf}\u{6761}\u{5c0f}\u{72d7}\u{ff09}\u{6709}\u{5185}\u{5bb9}\u{65f6}\u{81ea}\u{52a8}\u{8c03}\u{6de1}\u{900f}\u{660e}\u{5ea6}\u{3002}\n- **\u{7f16}\u{8f91}\u{5668}\u{53ef}\u{8fd0}\u{884c}\u{4ee3}\u{7801}\u{5757} NodeView**\u{ff1a}CodeBlock \u{6539}\u{7528} `CodeBlockLowlight` + Catppuccin \u{9ad8}\u{4eae}\u{914d}\u{8272}\u{ff1b}\u{65b0}\u{589e} CodeBlockNodeView\u{ff08}\u{8bed}\u{8a00}\u{6807}\u{7b7e} + \u{8fd0}\u{884c}\u{6309}\u{94ae} + \u{7ed3}\u{679c}\u{533a}\u{ff09}\u{ff0c}\u{70b9}\u{8bed}\u{8a00}\u{6807}\u{7b7e}\u{53ef}\u{7f16}\u{8f91}\u{8bed}\u{8a00}\u{4e0e}\u{914d}\u{7f6e}\u{ff1b}\u{659c}\u{6760}\u{83dc}\u{5355}\u{65b0}\u{589e}\u{300c}\u{53ef}\u{8fd0}\u{884c}\u{4ee3}\u{7801}\u{5757}\u{300d}\u{6761}\u{76ee} + \u{6a21}\u{6001}\u{6846}\u{914d}\u{7f6e} runnable fence info\u{ff1b}`make_run_code_closure` \u{6865}\u{63a5}\u{7f16}\u{8f91}\u{5668}\u{5185}\u{8fd0}\u{884c}\u{4ee3}\u{7801}\u{3002}\n- **\u{7f16}\u{8f91}\u{5668}\u{4efb}\u{52a1}\u{5217}\u{8868}\u{624b}\u{52a8}\u{8f93}\u{5165}**\u{ff1a}\u{652f}\u{6301} `- [ ]` \u{9010}\u{5b57}\u{7b26}\u{8f93}\u{5165}\u{521b}\u{5efa}\u{4efb}\u{52a1}\u{5217}\u{8868}\u{ff08}appendTransaction\u{ff0c}\u{975e} InputRule \u{5168}\u{91cf}\u{66ff}\u{6362}\u{ff09}\u{ff1b}\u{524d}\u{53f0}\u{4e0e}\u{7f16}\u{8f91}\u{5668} checkbox \u{5782}\u{76f4}\u{4e2d}\u{7ebf}\u{5bf9}\u{9f50}\u{3002}\n- **SQL \u{63a7}\u{5236}\u{53f0} Ctrl+Enter**\u{ff1a}`/admin/system` SQL \u{63a7}\u{5236}\u{53f0}\u{63a5}\u{901a} Ctrl/Cmd+Enter \u{8fd0}\u{884c}\u{5feb}\u{6377}\u{952e}\u{3002}\n- **CodeMirror Vim \u{6a21}\u{5f0f}**\u{ff1a}admin CodeRunner \u{6c99}\u{7bb1}\u{7f16}\u{8f91}\u{5668}\u{652f}\u{6301} Vim \u{6a21}\u{5f0f}\u{5f00}\u{5173}\u{ff0c}\u{9ed8}\u{8ba4}\u{5f00}\u{542f}\u{ff1b}CodeMirror \u{7f16}\u{8f91}\u{5668}\u{9ad8}\u{5ea6}\u{81ea}\u{9002}\u{5e94}\u{4e0e}\u{6eda}\u{52a8}\u{9650}\u{5236}\u{3002}\n- **\u{6587}\u{7ae0}\u{91cd}\u{5efa}\u{5185}\u{5bb9}\u{6309}\u{94ae}**\u{ff1a}\u{6587}\u{7ae0}\u{5217}\u{8868}\u{64cd}\u{4f5c}\u{5217}\u{65b0}\u{589e}\u{300c}\u{91cd}\u{5efa}\u{5185}\u{5bb9}\u{300d}\u{6309}\u{94ae}\u{ff0c}\u{91cd}\u{5efa}\u{652f}\u{6301}\u{5e76}\u{53d1} loading\u{ff08}spinner \u{8986}\u{76d6}\u{6587}\u{5b57}\u{ff09}\u{3002}\n- **\u{4e2d}\u{6587} slug \u{81ea}\u{52a8}\u{8f6c}\u{62fc}\u{97f3}**\u{ff1a}\u{4e2d}\u{6587}\u{6807}\u{9898}\u{81ea}\u{52a8}\u{8f6c}\u{62fc}\u{97f3}\u{751f}\u{6210} URL slug\u{3002}\n- **FreeBSD x86_64 \u{4ea4}\u{53c9}\u{7f16}\u{8bd1}**\u{ff1a}`make build-freebsd` + `make freebsd-sysroot`\u{ff0c}clang + lld + sysroot\u{3002}\n- **\u{6784}\u{5efa}\u{4fe1}\u{606f}\u{6ce8}\u{5165}**\u{ff1a}\u{542f}\u{52a8}\u{65f6}\u{6253}\u{5370} git/rustc/\u{6784}\u{5efa}\u{65f6}\u{95f4}\u{4fe1}\u{606f}\u{3002}\n- **404 \u{9875}\u{9762}\u{63d0}\u{4ea4} HTTP 404 \u{72b6}\u{6001}\u{7801}**\u{ff08}SSR \u{5c42}\u{ff09}\u{ff1b}`ErrorBoundary` \u{5305}\u{88f9}\u{516c}\u{5f00}\u{8def}\u{7531}\u{ff0c}\u{6587}\u{7ae0}\u{8be6}\u{60c5}\u{9875} 404 \u{7b49}\u{9519}\u{8bef}\u{4e0a}\u{629b}\u{81f3} `ErrorLayout`\u{3002}\n- **SSR \u{5c42} admin \u{8ba4}\u{8bc1}\u{5b88}\u{536b}**\u{ff1a}\u{672a}\u{767b}\u{5f55}\u{8bbf}\u{95ee} admin \u{76f4}\u{63a5}\u{5728} SSR \u{8df3}\u{8f6c}\u{767b}\u{5f55}\u{9875}\u{ff0c}\u{907f}\u{514d}\u{95ea}\u{70c1}\u{3002}\n- **\u{767b}\u{5f55}\u{8868}\u{5355}\u{56de}\u{8f66}\u{63d0}\u{4ea4}**\u{ff1b}\u{7f51}\u{7ad9} favicon\u{ff1b}\u{8bc4}\u{8bba}\u{80cc}\u{666f}\u{56fe}\u{81ea}\u{52a8}\u{8c03}\u{6de1}\u{3002}\n\n### Changed\n\n- **pnpm workspace \u{91cd}\u{6784}**\u{ff1a}JS \u{5b50}\u{9879}\u{76ee}\u{4ece} npm \u{8fc1}\u{79fb}\u{5230} pnpm workspace\u{ff0c}\u{6839}\u{5de5}\u{4f5c}\u{533a}\u{5728} `libs/`\u{ff0c}\u{5355}\u{4e00} `libs/pnpm-lock.yaml` + \u{5171}\u{4eab} `libs/tsconfig.base.json`\u{ff1b}\u{5f15}\u{5165} Biome v2.5 monorepo \u{914d}\u{7f6e}\u{5e76}\u{5168}\u{91cf}\u{683c}\u{5f0f}\u{5316}\u{ff1b}Makefile \u{6574}\u{5408} `lint`/`fix`/`test` \u{76ee}\u{6807}\u{3002}\n- **\u{6d88}\u{9664} `js_sys::eval`**\u{ff1a}DOM \u{4e92}\u{64cd}\u{4f5c}\u{5168}\u{9762}\u{4ece}\u{5b57}\u{7b26}\u{4e32}\u{6c42}\u{503c}\u{8fc1}\u{79fb}\u{5230} wasm-bindgen \u{7ed1}\u{5b9a}\u{5c42}\u{ff08}`tiptap_bridge`\u{3001}`codemirror_bridge`\u{3001}`xterm_bridge`\u{ff09}\u{ff0c}\u{6e05}\u{7406} wasm32 target \u{6b8b}\u{7559} clippy lint\u{3002}\n- **\u{901a}\u{7528} hooks \u{62bd}\u{53d6}**\u{ff1a}\u{65b0}\u{589e} `use_paginated`\u{ff08}\u{5206}\u{9875}\u{52a0}\u{8f7d}\u{ff09}\u{3001}`use_event_listener`\u{ff08}\u{901a}\u{7528}\u{4e8b}\u{4ef6}\u{76d1}\u{542c}\u{ff0c}\u{89e3}\u{51b3} `use_hook` + `use_effect` + `use_drop` \u{8d44}\u{6e90}\u{6240}\u{6709}\u{6743}\u{9677}\u{9631}\u{ff09}\u{3002}\n- **SQL \u{63a7}\u{5236}\u{53f0}\u{7ec4}\u{4ef6}\u{5316}**\u{ff1a}`SqlConsoleTab` \u{6539}\u{7528}\u{72ec}\u{7acb} `SqlResultTable` \u{7ec4}\u{4ef6}\u{3002}\n- **\u{6309}\u{94ae} token \u{5316}**\u{ff1a}\u{65b0}\u{589e} `BTN_PRIMARY`/`BTN_OUTLINE` \u{7b49}\u{6309}\u{94ae}\u{4ee4}\u{724c}\u{4e0e} `LoadingButton` \u{7ec4}\u{4ef6}\u{ff0c}\u{6d88}\u{9664}\u{6837}\u{5f0f}\u{6563}\u{843d}\u{3002}\n- **\u{9aa8}\u{67b6}\u{5c4f}\u{7edf}\u{4e00}\u{5ef6}\u{8fdf}**\u{ff1a}\u{7edf}\u{4e00}\u{9aa8}\u{67b6}\u{5c4f}\u{5ef6}\u{8fdf}\u{673a}\u{5236}\u{ff0c}200ms \u{5185}\u{52a0}\u{8f7d}\u{5b8c}\u{6210}\u{4e0d}\u{663e}\u{793a}\u{9aa8}\u{67b6}\u{ff0c}\u{907f}\u{514d}\u{5feb}\u{7f51}\u{7edc}\u{95ea}\u{70c1}\u{3002}\n- **\u{540e}\u{53f0}\u{83dc}\u{5355}\u{8fb9}\u{8ddd}\u{6536}\u{7d27}**\u{ff1a}\u{540e}\u{53f0}\u{6240}\u{6709}\u{9875}\u{9762}\u{5de6}\u{53f3}\u{8fb9}\u{8ddd}\u{7edf}\u{4e00}\u{ff08}`px-10 \u{2192} px-6`\u{ff09}\u{ff0c}\u{5199}\u{6587}\u{7ae0}\u{9875}\u{79fb}\u{9664}\u{9875}\u{5934}\u{6761}\u{3002}\n- **\u{56de}\u{6536}\u{7ad9}\u{5408}\u{5e76}\u{5165}\u{6587}\u{7ae0}\u{5217}\u{8868}**\u{ff1a}`/admin/trash` \u{5408}\u{5e76}\u{4e3a} `/admin/posts` \u{7684} URL \u{9a71}\u{52a8} tab\u{ff0c}`PostStats` \u{65b0}\u{589e}\u{56de}\u{6536}\u{7ad9}\u{8ba1}\u{6570} badge\u{3002}\n- **\u{4f9d}\u{8d56}\u{5347}\u{7ea7}**\u{ff1a}cargo \u{4e0e} pnpm \u{4f9d}\u{8d56}\u{5168}\u{91cf}\u{5347}\u{7ea7}\u{5230}\u{6700}\u{65b0}\u{7248}\u{672c}\u{ff1b}\u{65b0}\u{589e} `tokio-stream`\u{ff08}SSE\u{ff09}\u{3001}`bollard`\u{ff08}Docker\u{ff09}\u{3002}\n- **Runner \u{914d}\u{7f6e}**\u{ff1a}`CODE_RUNNER_LANGUAGES` \u{9ed8}\u{8ba4}\u{5f00}\u{653e}\u{5168}\u{90e8}\u{8bed}\u{8a00}\u{ff1b}admin runner \u{9875}\u{5c55}\u{793a} Go/Rust\u{3002}\n- **Tooltip \u{7ec4}\u{4ef6}\u{62bd}\u{53d6}**\u{ff1a}\u{6587}\u{7ae0}\u{5217}\u{8868}\u{64cd}\u{4f5c}\u{6309}\u{94ae}\u{7528} `Tooltip` \u{5305}\u{88f9}\u{3002}\n\n### Fixed\n\n- **\u{53cd}\u{5e94}\u{5f0f} hook \u{4e0d}\u{8ffd}\u{8e2a}\u{666e}\u{901a} prop \u{7684}\u{9677}\u{9631}**\u{ff1a}\u{4fee}\u{590d}\u{540c}\u{4e00}\u{8def}\u{7531}\u{53d8}\u{4f53}\u{95f4}\u{5bfc}\u{822a}\u{ff08}\u{5982} `/post/a \u{2192} /post/b`\u{ff09}\u{540e}\u{6587}\u{7ae0}\u{6b63}\u{6587}/\u{5217}\u{8868}/\u{6807}\u{7b7e}\u{4e0d}\u{66f4}\u{65b0}\u{7684}\u{4e25}\u{91cd} bug \u{2014}\u{2014} \u{6839}\u{56e0}\u{662f} `use_server_future`/`use_memo`/`use_resource` \u{4e0d}\u{8ffd}\u{8e2a}\u{975e} signal \u{4f9d}\u{8d56}\u{3002}\u{6539}\u{4e3a}\u{5728}\u{95ed}\u{5305}\u{5185}\u{8bfb} `router.current()` signal \u{6216}\u{76f4}\u{63a5}\u{5185}\u{8054}\u{8ba1}\u{7b97}\u{3002}\u{540c}\u{7406}\u{4fee}\u{590d}\u{8bc4}\u{8bba}\u{533a} `CommentSection` \u{4f9d}\u{8d56}\u{8ffd}\u{8e2a}\u{4e0e} SSR hydration \u{4e0d}\u{5339}\u{914d}\u{3002}\n- **\u{4e3b}\u{9898}\u{5207}\u{6362}\u{52a8}\u{753b}**\u{ff1a}\u{4fee}\u{590d} VT \u{52a8}\u{753b}\u{671f}\u{95f4} CodeMirror/xterm \u{4e3b}\u{9898}\u{540c}\u{6b65}\u{ff08}\u{907f}\u{514d}\u{5706}\u{5f62}\u{5c55}\u{5f00}\u{52a8}\u{753b}\u{671f}\u{95f4}\u{76f4}\u{63a5}\u{8df3}\u{53d8}\u{ff09}\u{3001}\u{6e05}\u{7406} VT \u{671f}\u{95f4}\u{7684} `animate-page-enter` transform\u{ff08}\u{4fee}\u{590d}\u{4ee3}\u{7801}\u{5757}\u{88ab}\u{8986}\u{76d6}\u{ff09}\u{3001}\u{8ddf}\u{968f}\u{7cfb}\u{7edf}\u{6a21}\u{5f0f}\u{7cfb}\u{7edf}\u{504f}\u{597d}\u{53d8}\u{5316}\u{65f6}\u{540c}\u{6b65} dark class\u{ff08}\u{6539}\u{56de}\u{77ac}\u{5207}\u{907f}\u{514d}\u{52a8}\u{753b}\u{51b2}\u{7a81}\u{ff09}\u{3001}`prefers-reduced-motion` \u{964d}\u{7ea7}\u{3002}\n- **\u{5907}\u{4efd}\u{6062}\u{590d}\u{5047}\u{6210}\u{529f}**\u{ff1a}\u{4fee}\u{590d}\u{5907}\u{4efd}\u{6062}\u{590d}\u{5b9e}\u{9645}\u{4e0d}\u{5199}\u{5165}\u{6570}\u{636e}\u{5374}\u{8fd4}\u{56de}\u{6210}\u{529f}\u{ff08}`psql` \u{672a}\u{52a0} `ON_ERROR_STOP=1` \u{5bfc}\u{81f4}\u{8bed}\u{53e5}\u{5168}\u{9519}\u{4ecd} exit 0\u{ff09}\u{ff1b}\u{4fee}\u{590d}\u{5907}\u{4efd}/\u{6062}\u{590d}\u{4efb}\u{52a1}\u{8f6e}\u{8be2}\u{6c38}\u{4e0d}\u{542f}\u{52a8}\u{5bfc}\u{81f4}\u{6309}\u{94ae}\u{5361}\u{5728} loading\u{3002}\n- **\u{53ef}\u{8fd0}\u{884c}\u{4ee3}\u{7801}\u{5757}\u{5bb9}\u{5668}\u{6e05}\u{7406}**\u{ff1a}\u{4fee}\u{590d}\u{5bb9}\u{5668}\u{6e05}\u{7406}\u{5931}\u{8d25}\u{9759}\u{9ed8}\u{6cc4}\u{6f0f}\u{ff08}\u{91cd}\u{8bd5} + \u{65e5}\u{5fd7}\u{544a}\u{8b66}\u{ff09}\u{3001}\u{7f16}\u{8bd1}\u{578b}\u{8bed}\u{8a00}\u{9700} `/tmp` tmpfs \u{6267}\u{884c}\u{6743}\u{3001}\u{53bb}\u{6389} `nproc` ulimit \u{4fee}\u{590d}\u{5bb9}\u{5668}\u{542f}\u{52a8} EAGAIN\u{3002}\n- **\u{6587}\u{7ae0}\u{951a}\u{70b9}\u{5bfc}\u{822a}**\u{ff1a}\u{4fee}\u{590d}\u{76f4}\u{63a5}\u{8bbf}\u{95ee} `#hash` \u{65f6}\u{6807}\u{9898}\u{88ab} sticky header \u{906e}\u{4f4f}\u{3001}hydration \u{540e}\u{70b9}\u{51fb}\u{6807}\u{9898}\u{951a}\u{70b9}\u{89e6}\u{53d1}\u{6574}\u{9875}\u{5237}\u{65b0}\u{3001}hash \u{951a}\u{70b9}\u{8df3}\u{8f6c}\u{5931}\u{6548}\u{3002}\n- **Tiptap \u{7f16}\u{8f91}\u{5668}**\u{ff1a}\u{4fee}\u{590d}\u{659c}\u{6760}\u{547d}\u{4ee4}\u{521b}\u{5efa}\u{53ef}\u{8fd0}\u{884c}\u{4ee3}\u{7801}\u{5757}\u{65f6}\u{6a21}\u{6001}\u{6846}\u{88ab}\u{7acb}\u{5373}\u{5173}\u{95ed}\u{3001}\u{659c}\u{6760}\u{547d}\u{4ee4}\u{6587}\u{672c}\u{6b8b}\u{7559}\u{8fdb}\u{65b0}\u{8282}\u{70b9}\u{ff08}`/code` \u{5e26}\u{5165} codeBlock\u{ff09}\u{3001}\u{4ee3}\u{7801}\u{5757}\u{5185} Backspace \u{5220}\u{6574}\u{5757}\u{ff08}`ignoreMutation` \u{8bef}\u{5ffd}\u{7565} contentDOM \u{7f16}\u{8f91}\u{ff09}\u{3001}Backspace \u{5728} lowlight decoration \u{91cd}\u{5efa}\u{540e}\u{5931}\u{6548}\u{3001}runnable \u{5757} `classList.add` \u{629b} `InvalidCharacterError`\u{3001}\u{8bed}\u{8a00}\u{4e0b}\u{62c9}\u{5c55}\u{5f00}\u{65f6} Enter \u{8bef}\u{89e6}\u{53d1}\u{63d2}\u{5165}\u{3001}\u{7a7a}\u{9879} Enter \u{4e0d}\u{9000}\u{51fa}\u{5217}\u{8868}\u{ff08}\u{7578}\u{5f62}\u{6587}\u{6863}\u{6839}\u{56e0}\u{ff09}\u{3001}TaskInputRule \u{5347}\u{7ea7}\u{540e}\u{5149}\u{6807}\u{88ab}\u{7529}\u{5230}\u{4e0b}\u{4e00}\u{884c}\u{3001}\u{5347}\u{7ea7}\u{540e}\u{6298}\u{53e0}\u{884c}\u{88ab}\u{6491}\u{9ad8} + \u{6298}\u{53e0}\u{56fe}\u{6807}\u{5782}\u{76f4}\u{4e0d}\u{5c45}\u{4e2d}\u{3001}CodeMirror \u{6298}\u{53e0}\u{56fe}\u{6807}\u{5782}\u{76f4}\u{4e0d}\u{5c45}\u{4e2d}\u{3002}\n- **CodeMirror \u{7f16}\u{8f91}\u{5668}**\u{ff1a}\u{4fee}\u{590d}\u{7f16}\u{8f91}\u{56de}\u{9000}\u{53cd}\u{9988}\u{5faa}\u{73af}\u{ff08}editing reversion loop\u{ff09}\u{3001}\u{7f16}\u{8f91}\u{5668}\u{584c}\u{7f29}\u{5bfc}\u{81f4}\u{4e0a}\u{4e0b}\u{80cc}\u{666f}\u{5272}\u{88c2}\u{ff08}`height:100%` \u{5931}\u{6548}\u{ff09}\u{3001}\u{884c}\u{53f7}\u{533a}\u{80cc}\u{666f}\u{4e0e}\u{4ee3}\u{7801}\u{533a}\u{5272}\u{88c2}\u{3001}\u{672a}\u{6491}\u{6ee1}\u{5bb9}\u{5668}\u{3001}SQL \u{7f16}\u{8f91}\u{5668} gutter \u{4e0e} content \u{80cc}\u{666f}\u{5272}\u{88c2}\u{3002}\n- **\u{540e}\u{53f0}\u{9aa8}\u{67b6}\u{5c4f}**\u{ff1a}\u{4fee}\u{590d}\u{540e}\u{53f0}\u{9aa8}\u{67b6}\u{5c4f}\u{4e0d}\u{53ef}\u{89c1}\u{3001}\u{9aa8}\u{67b6}\u{5c4f}\u{2192}\u{8ba4}\u{8bc1}\u{2192}\u{6b63}\u{5e38}\u{9875}\u{9762}\u{5e03}\u{5c40}\u{95ea}\u{70c1}\u{3001}\u{5199}\u{6587}\u{7ae0}\u{9875}\u{9aa8}\u{67b6}\u{5c4f}\u{9ad8}\u{5ea6}\u{4e0d}\u{6491}\u{6ee1}\u{ff08}\u{591a}\u{6b21}\u{8fed}\u{4ee3}\u{ff09}\u{3002}\n- **\u{8def}\u{7531}\u{4e0e}\u{5206}\u{9875}**\u{ff1a}\u{4fee}\u{590d} SQL \u{63a7}\u{5236}\u{53f0} Ctrl+Enter \u{89e6}\u{53d1} panic\u{ff08}\u{65e0} dioxus scope\u{ff09}\u{3001}\u{4e0a}\u{4e0b}\u{7bc7}\u{5207}\u{6362}\u{540e}\u{53ef}\u{8fd0}\u{884c}\u{4ee3}\u{7801}\u{5757}\u{6d88}\u{5931}\u{3002}\n- **UI \u{7ec6}\u{8282}**\u{ff1a}\u{4fee}\u{590d} markdown \u{8868}\u{683c}\u{6c34}\u{5e73}\u{586b}\u{5145}\u{6e32}\u{67d3}\u{3001}admin \u{5e03}\u{5c40}\u{6eda}\u{52a8}\u{6761}\u{4f4d}\u{7f6e}\u{3001}\u{5199}\u{6587}\u{7ae0}\u{9875}\u{6eda}\u{52a8}\u{6027}\u{3001}`--font-sans` \u{8865}\u{9f50} CJK sans \u{5b57}\u{4f53}\u{6808}\u{3001}\u{6697}\u{8272} type \u{8272}\u{503c}\u{3002}\n- **\u{6570}\u{636e}\u{5e93}\u{9519}\u{8bef}\u{65e5}\u{5fd7}**\u{ff1a}\u{5c55}\u{5f00}\u{8fc1}\u{79fb}\u{9519}\u{8bef}\u{7684} source chain \u{5168}\u{94fe}\u{8def}\u{3002}\n- \u{5176}\u{4ed6}\u{6784}\u{5efa}\u{3001}CI\u{3001}Docker \u{955c}\u{50cf}\u{ff08}multi-arch buildx\u{3001}HTTPS Debian \u{955c}\u{50cf}\u{7ed5}\u{8fc7} HTTP \u{900f}\u{660e}\u{62e6}\u{622a}\u{3001}apk \u{6e05}\u{534e}\u{955c}\u{50cf}\u{ff09}\u{3001}\u{683c}\u{5f0f}\u{5316}\u{4e0e}\u{6d4b}\u{8bd5}\u{4fee}\u{590d}\u{3002}\n\n### Security\n\n- **SQL \u{63a7}\u{5236}\u{53f0}\u{62a4}\u{680f}\u{52a0}\u{56fa}**\u{ff1a}`DROP DATABASE`/`DROP SCHEMA`/`CREATE DATABASE` \u{7edd}\u{5bf9}\u{7981}\u{6b62}\u{ff08}\u{5b57}\u{7b26}\u{4e32}\u{9884}\u{68c0} + AST \u{95e8}\u{ff09}\u{ff1b}`DROP`/`TRUNCATE`/`ALTER` \u{9700}\u{786e}\u{8ba4}\u{ff1b}`UPDATE`/`DELETE` \u{65e0} `WHERE` \u{62d2}\u{7edd}\u{ff1b}\u{591a}\u{8bed}\u{53e5}\u{9ed8}\u{8ba4}\u{7981}\u{7528}\u{ff1b}\u{7ed3}\u{679c}\u{4e0a}\u{9650} 500 \u{884c}\u{3002}\n- **\u{5907}\u{4efd}\u{6587}\u{4ef6}\u{6821}\u{9a8c}**\u{ff1a}\u{5907}\u{4efd}\u{6587}\u{4ef6}\u{643a}\u{5e26}\u{7b7e}\u{540d}\u{5934}\u{ff0c}restore \u{62d2}\u{7edd}\u{975e}\u{7cfb}\u{7edf}\u{6587}\u{4ef6}\u{ff1b}`backup_path` \u{8def}\u{5f84}\u{7a7f}\u{8d8a}\u{6f0f}\u{6d1e}\u{4fee}\u{590d}\u{ff08}\u{8865}\u{5355}\u{6d4b}\u{ff09}\u{ff1b}`pg_dump --clean --if-exists` \u{4f7f} restore \u{5e42}\u{7b49}\u{ff08}drop+recreate \u{800c}\u{975e} relation \u{5df2}\u{5b58}\u{5728}\u{62a5}\u{9519}\u{ff09}\u{3002}\n- **\u{5907}\u{4efd}\u{6062}\u{590d}\u{8865}\u{5355}\u{6d4b}**\u{ff1a}`backup_path` \u{8def}\u{5f84}\u{7a7f}\u{8d8a}\u{6f0f}\u{6d1e}\u{8865}\u{8868}\u{9a71}\u{52a8}\u{5355}\u{6d4b}\u{3002}\n\n### Internal\n\n- **\u{65b0}\u{5b50}\u{5de5}\u{7a0b} `xterm-terminal`**\u{ff1a}xterm.js 6.0 IIFE \u{5e93} + smoke \u{6d4b}\u{8bd5}\u{3002}\n- **\u{65b0}\u{5b50}\u{5de5}\u{7a0b} `codemirror-editor`**\u{ff1a}CodeMirror \u{7f16}\u{8f91}\u{5668} + Rust bridge\u{ff0c}Ctrl/Cmd+Enter \u{8fd0}\u{884c}\u{5feb}\u{6377}\u{952e}\u{3002}\n- **Docker runner \u{955c}\u{50cf}**\u{ff1a}`docker/build-runners.sh` \u{6784}\u{5efa} base \u{2192} python \u{2192} node \u{2192} go \u{2192} rust \u{94fe}\u{ff1b}Go \u{955c}\u{50cf}\u{91cd}\u{5b9a}\u{5411} `GOCACHE`/`GOPATH` \u{5230} `/tmp`\u{ff0c}Rust \u{955c}\u{50cf}\u{5c01}\u{88c5} `run-rust.sh` \u{4e24}\u{6b65}\u{7f16}\u{8bd1}+\u{8fd0}\u{884c} wrapper\u{3002}\n- **\u{65b0}\u{589e} Rust \u{5355}\u{6d4b}**\u{ff1a}SQL \u{63a7}\u{5236}\u{53f0}\u{62a4}\u{680f}\u{8868}\u{9a71}\u{52a8}\u{5355}\u{6d4b}\u{3001}\u{5907}\u{4efd}\u{6062}\u{590d}\u{5355}\u{6d4b}\u{3001}markdown `wrap_images_with_blur` \u{89e3}\u{8026}\u{6587}\u{4ef6}\u{7cfb}\u{7edf}\u{4f9d}\u{8d56}\u{3002}\n- **codemirror-editor smoke \u{6d4b}\u{8bd5}**\u{3001}`xterm-terminal` smoke \u{6d4b}\u{8bd5}\u{3002}\n- **AGENTS.md \u{6587}\u{6863}\u{6269}\u{5145}**\u{ff1a}Code Runner \u{67b6}\u{6784}\u{8bf4}\u{660e}\u{3001}\u{53cc} target \u{9a8c}\u{8bc1}\u{9677}\u{9631}\u{3001}custom hook \u{8d44}\u{6e90}\u{6240}\u{6709}\u{6743}\u{9677}\u{9631}\u{3001}\u{53cd}\u{5e94}\u{5f0f} hook \u{4e0d}\u{8ffd}\u{8e2a}\u{666e}\u{901a} prop \u{7684}\u{8e29}\u{5751}\u{8bb0}\u{5f55}\u{3001}Tiptap \u{4ea4}\u{4e92} bug Playwright \u{8c03}\u{8bd5}\u{65b9}\u{6cd5}\u{8bba}\u{3002}\n- **matt-pocock engineering skills** \u{5f15}\u{5165}\u{3002}\n\n## [0.3.0] - 2026-06-29\n\n### Added\n\n- **\u{8bc4}\u{8bba}\u{7cfb}\u{7edf}**\u{ff1a}\u{5b8c}\u{6574}\u{7684}\u{8bbf}\u{5ba2}\u{8bc4}\u{8bba}\u{529f}\u{80fd}\u{ff0c}\u{5305}\u{542b}\u{6635}\u{79f0}/\u{90ae}\u{7bb1}/URL\u{3001}\u{5d4c}\u{5957}\u{56de}\u{590d}\u{3001}\u{7ba1}\u{7406}\u{540e}\u{53f0}\u{5ba1}\u{6838}\u{ff08}\u{901a}\u{8fc7}/\u{6807}\u{5783}\u{573e}/\u{5220}\u{9664}\u{ff09}\u{3001}\u{5f85}\u{5ba1}\u{8bc4}\u{8bba} localStorage \u{6301}\u{4e45}\u{5316}\u{4e0e} pending \u{72b6}\u{6001}\u{8f6e}\u{8be2}\u{3001}\u{76f8}\u{5bf9}\u{65f6}\u{95f4}\u{663e}\u{793a}\u{3002}\n- **\u{6587}\u{7ae0}\u{56de}\u{6536}\u{7ad9}**\u{ff1a}\u{5220}\u{9664}\u{6587}\u{7ae0}\u{8fdb}\u{5165}\u{56de}\u{6536}\u{7ad9}\u{ff0c}\u{652f}\u{6301}\u{6062}\u{590d}\u{3001}\u{5f7b}\u{5e95}\u{5220}\u{9664}\u{3001}\u{6279}\u{91cf}\u{64cd}\u{4f5c}\u{4e0e}\u{6e05}\u{7a7a}\u{ff1b}\u{65b0}\u{589e} `/admin/trash` \u{7ba1}\u{7406}\u{9875}\u{9762}\u{3001}`settings` \u{952e}\u{503c}\u{8868}\u{4e0e}\u{53ef}\u{914d}\u{7f6e}\u{7684}\u{81ea}\u{52a8}\u{6e05}\u{7406}\u{540e}\u{53f0}\u{4efb}\u{52a1}\u{ff08}\u{4fdd}\u{7559}\u{5929}\u{6570}\u{3001}\u{4e0a}\u{9650}\u{6570}\u{91cf}\u{ff09}\u{3002}\n- **\u{4e3b}\u{9898}\u{5207}\u{6362}\u{52a8}\u{753b}**\u{ff1a}\u{57fa}\u{4e8e} View Transitions API \u{7684}\u{5706}\u{5f62}\u{5c55}\u{5f00}\u{52a8}\u{753b}\u{ff08}\u{7eaf} CSS \u{5b9e}\u{73b0}\u{ff0c}\u{4ece}\u{70b9}\u{51fb}\u{70b9}\u{6269}\u{6563}\u{ff09}\u{ff0c}\u{652f}\u{6301} `prefers-reduced-motion` \u{964d}\u{7ea7}\u{3002}\n- **\u{7f16}\u{8f91}\u{5668}\u{56fe}\u{7247}\u{4e0a}\u{4f20}\u{534f}\u{8c03}\u{5668}**\u{ff1a}Tiptap \u{81ea}\u{5b9a}\u{4e49} Image \u{6269}\u{5c55}\u{ff0c}\u{5e26}\u{4e0a}\u{4f20}\u{4e2d}\u{5360}\u{4f4d}\u{56fe}\u{ff08}\u{6a21}\u{7cca} + spinner + \u{9519}\u{8bef}\u{6001}\u{ff09}\u{3001}\u{5931}\u{8d25}\u{91cd}\u{8bd5}\u{3001}\u{4fdd}\u{5b58}\u{62e6}\u{622a}\u{3001}\u{4e0a}\u{4f20}\u{8ba1}\u{6570}\u{ff1b}\u{652f}\u{6301} slash \u{547d}\u{4ee4}\u{3001}\u{7c98}\u{8d34}\u{3001}\u{62d6}\u{62fd}\u{3002}\n- **\u{5c01}\u{9762}\u{56fe}\u{4e0a}\u{4f20}**\u{ff1a}\u{6587}\u{7ae0}\u{7f16}\u{8f91}\u{5668}\u{652f}\u{6301}\u{5c01}\u{9762}\u{56fe}\u{4e0a}\u{4f20}\u{ff08}\u{62d6}\u{62fd}/\u{70b9}\u{51fb}/\u{7c98}\u{8d34}\u{ff09}\u{ff0c}\u{5c01}\u{9762}\u{533a}\u{7a7a}\u{6001}\u{77ee}\u{6a2a}\u{6761} + \u{53ef}\u{6eda}\u{52a8}\u{4e3b}\u{4f53}\u{5e03}\u{5c40}\u{3002}\n- **Blur-up \u{6e10}\u{8fdb}\u{5f0f}\u{56fe}\u{7247}\u{52a0}\u{8f7d}**\u{ff1a}Markdown \u{56fe}\u{7247}\u{5305}\u{88f9}\u{53cc}\u{5c42}\u{7ed3}\u{6784}\u{ff08}\u{4f4e}\u{6e05}\u{6a21}\u{7cca} + \u{9ad8}\u{6e05}\u{6de1}\u{5165}\u{ff09}\u{ff0c}\u{57fa}\u{4e8e}\u{56fe}\u{7247}\u{5c3a}\u{5bf8}\u{7f13}\u{5b58}\u{7684}\u{5bbd}\u{9ad8}\u{6bd4}\u{5360}\u{4f4d}\u{3002}\n- **Lightbox \u{5b50}\u{5de5}\u{7a0b}**\u{ff1a}`libs/lightbox/` TypeScript \u{9879}\u{76ee}\u{ff0c}\u{56fe}\u{5e93}\u{5bfc}\u{822a}\u{ff08}\u{6de1}\u{5165}\u{3001}\u{7bad}\u{5934}\u{3001}\u{952e}\u{76d8}\u{ff09}\u{3001}\u{539f}\u{70b9}\u{611f}\u{77e5}\u{7f29}\u{653e}\u{3001}\u{6eda}\u{52a8}\u{5173}\u{95ed}\u{3001}\u{9632}\u{6b62}\u{80cc}\u{666f}\u{6eda}\u{52a8}\u{4e0e}\u{95ea}\u{70c1}\u{3002}\n- **yggdrasil-core \u{5b50}\u{5de5}\u{7a0b}**\u{ff1a}\u{6838}\u{5fc3} JS bundle \u{5b50}\u{5de5}\u{7a0b}\u{ff0c}\u{8fc1}\u{79fb} `post-content` \u{590d}\u{5236}\u{6309}\u{94ae}\u{4e0e}\u{4e3b}\u{9898}\u{5207}\u{6362}\u{903b}\u{8f91}\u{ff0c}\u{5220}\u{9664} `public/js/`\u{3002}\n- **\u{65b0}\u{589e}\u{8bed}\u{6cd5}\u{9ad8}\u{4eae}**\u{ff1a}TypeScript\u{3001}JSX\u{3001}TSX\u{3001}Zig\u{ff1b}\u{8865}\u{5168} Swift \u{9ad8}\u{4eae}\u{ff1b}\u{5927}\u{5c0f}\u{5199}\u{4e0d}\u{654f}\u{611f}\u{7684}\u{8bed}\u{6cd5}\u{540d}\u{5339}\u{914d}\u{3002}\n- **Markdown \u{6e90}\u{7801}\u{89c6}\u{56fe}\u{5207}\u{6362}**\u{ff1a}\u{7f16}\u{8f91}\u{5668}\u{53ef}\u{5728}\u{5bcc}\u{6587}\u{672c}\u{4e0e}\u{6e90}\u{7801}\u{89c6}\u{56fe}\u{95f4}\u{5207}\u{6362}\u{ff0c}\u{6309}\u{6eda}\u{52a8}\u{6bd4}\u{4f8b}\u{540c}\u{6b65}\u{4f4d}\u{7f6e}\u{3002}\n- **\u{5065}\u{5eb7}\u{68c0}\u{67e5}\u{7aef}\u{70b9}**\u{ff1a}\u{65b0}\u{589e} `healthz` \u{4e0e} `readyz`\u{3002}\n- **\u{5185}\u{5d4c}\u{6570}\u{636e}\u{5e93}\u{8fc1}\u{79fb}**\u{ff1a}\u{542f}\u{52a8}\u{65f6}\u{81ea}\u{52a8}\u{8fd0}\u{884c}\u{8fc1}\u{79fb}\u{ff08}advisory lock + \u{9010}\u{8fc1}\u{79fb}\u{4e8b}\u{52a1}\u{ff09}\u{ff0c}\u{8fc1}\u{79fb}\u{5931}\u{8d25}\u{4ee5}\u{53cb}\u{597d}\u{9000}\u{51fa} + \u{53ef}\u{914d}\u{7f6e}\u{91cd}\u{8bd5}\u{7a97}\u{53e3}\u{ff08}`MIGRATE_STARTUP_TIMEOUT_SECS`\u{ff09}\u{66ff}\u{4ee3} panic\u{ff1b}\u{542f}\u{52a8}\u{671f}\u{81ea}\u{52a8}\u{521b}\u{5efa}\u{76ee}\u{6807}\u{6570}\u{636e}\u{5e93}\u{3002}\n- **\u{4f1a}\u{8bdd}\u{5b89}\u{5168}**\u{ff1a}Session token \u{4ee5} SHA-256 \u{54c8}\u{5e0c}\u{5b58}\u{50a8}\u{ff08}\u{4e0d}\u{518d}\u{5b58}\u{660e}\u{6587}\u{ff09}\u{ff1b}\u{53ef}\u{914d}\u{7f6e}\u{7684}\u{5355}\u{7528}\u{6237} session \u{6570}\u{91cf}\u{4e0a}\u{9650}\u{ff08}\u{884c}\u{9501}\u{4e32}\u{884c}\u{5316}\u{ff09}\u{ff1b}\u{89d2}\u{8272}/\u{72b6}\u{6001}\u{53d8}\u{66f4}\u{901a}\u{8fc7} generation \u{5931}\u{6548}\u{6240}\u{6709}\u{4f1a}\u{8bdd}\u{3002}\n- **CSRF \u{9632}\u{62a4}**\u{ff1a}\u{57fa}\u{4e8e} Origin \u{7684}\u{5199}\u{63a5}\u{53e3} CSRF \u{68c0}\u{67e5}\u{ff0c}`APP_BASE_URL` \u{672a}\u{8bbe}\u{7f6e}\u{65f6}\u{542f}\u{52a8}\u{544a}\u{8b66}\u{3002}\n- **Cookie \u{5b89}\u{5168}**\u{ff1a}`COOKIE_SECURE` \u{73af}\u{5883}\u{53d8}\u{91cf}\u{63a7}\u{5236} session cookie \u{7684} Secure \u{6807}\u{5fd7}\u{3002}\n- **\u{771f}\u{5b9e}\u{5ba2}\u{6237}\u{7aef} IP**\u{ff1a}\u{4ece} `X-Forwarded-For` \u{6309} `TRUSTED_PROXY_COUNT` \u{63d0}\u{53d6}\u{771f}\u{5b9e} IP\u{ff1b}\u{672a}\u{77e5} IP \u{65f6}\u{4f7f}\u{7528}\u{5bbd}\u{677e}\u{9650}\u{6d41}\u{6876}\u{3002}\n- **\u{56fe}\u{7247}\u{54cd}\u{5e94}\u{7f13}\u{5b58}**\u{ff1a}`Cache-Control` \u{4e0e} `ETag` \u{5934}\u{ff0c}\u{652f}\u{6301} `If-None-Match` 304\u{ff08}RFC 7232 \u{5408}\u{89c4}\u{ff09}\u{ff1b}\u{56fe}\u{7247}\u{5185}\u{5b58}\u{7f13}\u{5b58}\u{6539}\u{7528} `bytes::Bytes`\u{ff0c}\u{65b0}\u{589e}\u{6309}\u{6587}\u{4ef6}\u{5e74}\u{9f84}\u{4e0e}\u{603b}\u{5927}\u{5c0f}\u{6dd8}\u{6c70}\u{7684}\u{78c1}\u{76d8}\u{7f13}\u{5b58}\u{5b9a}\u{65f6}\u{6e05}\u{7406}\u{4efb}\u{52a1}\u{3002}\n- **\u{56fe}\u{7247}\u{4e0a}\u{9650}\u{53ef}\u{914d}\u{7f6e}**\u{ff1a}`MAX_IMAGE_DIMENSION`\u{3001}`MAX_IMAGE_PIXELS`\u{3001}`WEBP_QUALITY`\u{3001}`WEBP_METHOD` \u{7b49}\u{73af}\u{5883}\u{53d8}\u{91cf}\u{ff0c}\u{9ed8}\u{8ba4}\u{503c}\u{7ffb}\u{500d}\u{ff1b}\u{7edf}\u{4e00}\u{5404}\u{683c}\u{5f0f}\u{5927}\u{5c0f}\u{4e0a}\u{9650}\u{3002}\n- **`posts` \u{8868}\u{5b57}\u{6570}\u{4e0e}\u{9605}\u{8bfb}\u{65f6}\u{95f4}**\u{ff1a}\u{65b0}\u{589e} `word_count`/`reading_time` \u{5217}\u{5e76}\u{5728}\u{5199}\u{5165}\u{65f6}\u{7ef4}\u{62a4}\u{ff1b}\u{5217}\u{8868}/\u{641c}\u{7d22}\u{63a5}\u{53e3}\u{4e0d}\u{518d}\u{8fd4}\u{56de}\u{6b63}\u{6587}\u{ff0c}\u{8bfb}\u{53d6}\u{9884}\u{5b58}\u{7684}\u{5b57}\u{6570}\u{4e0e}\u{9605}\u{8bfb}\u{65f6}\u{95f4}\u{3002}\n- **`PostListItem` \u{8f7b}\u{91cf} DTO**\u{ff1a}\u{5217}\u{8868}/\u{6807}\u{7b7e}/\u{641c}\u{7d22}\u{63a5}\u{53e3}\u{4e0d}\u{518d}\u{8fd4}\u{56de}\u{5b8c}\u{6574}\u{6b63}\u{6587}\u{ff0c}\u{663e}\u{8457}\u{964d}\u{4f4e}\u{7f13}\u{5b58}\u{4e0e}\u{5e8f}\u{5217}\u{5316}\u{4f53}\u{79ef}\u{3002}\n- **\u{4f1a}\u{8bdd}\u{4e0e}\u{641c}\u{7d22}\u{7f13}\u{5b58}**\u{ff1a}\u{57fa}\u{4e8e} moka \u{7684}\u{4f1a}\u{8bdd}\u{5185}\u{5b58}\u{7f13}\u{5b58}\u{ff08}\u{7f13}\u{5b58}\u{5bf9}\u{8c61}\u{4e0d}\u{542b}\u{5bc6}\u{7801}\u{54c8}\u{5e0c}\u{ff09}\u{ff1b}\u{641c}\u{7d22}\u{7ed3}\u{679c}\u{77ed} TTL \u{7f13}\u{5b58}\u{ff08}10 \u{79d2}\u{ff0c}key \u{89c4}\u{8303}\u{5316}\u{ff09}\u{3002}\n- **\u{7a7a}\u{72b6}\u{6001}\u{4e0e}\u{914d}\u{56fe}**\u{ff1a}\u{9996}\u{9875}\u{3001}\u{5f52}\u{6863}\u{3001}\u{6807}\u{7b7e}\u{3001}\u{641c}\u{7d22}\u{3001}\u{540e}\u{53f0}\u{6587}\u{7ae0}/\u{8bc4}\u{8bba}/\u{56de}\u{6536}\u{7ad9}\u{5747}\u{63a5}\u{5165} `EmptyState` \u{7ec4}\u{4ef6}\u{4e0e}\u{88c5}\u{9970}\u{6027}\u{914d}\u{56fe}\u{ff08}\u{7ebf}\u{6761}\u{5c0f}\u{72d7}\u{7b49}\u{ff09}\u{ff0c}\u{914d}\u{56fe}\u{5706}\u{89d2} + \u{6697}\u{8272}\u{6a21}\u{5f0f}\u{964d}\u{4eae}\u{3002}\n- **UI \u{91cd}\u{65b0}\u{8bbe}\u{8ba1}**\u{ff1a}\u{6e29}\u{6696}\u{8272}\u{8c03} + \u{9f20}\u{5c3e}\u{8349}\u{7eff}\u{4e3b}\u{8272}\u{ff0c}\u{7edf}\u{4e00} `paper-*` \u{4e3b}\u{9898}\u{53d8}\u{91cf}\u{ff1b}\u{540e}\u{53f0}\u{5bf9}\u{9f50}\u{524d}\u{53f0}\u{4e3b}\u{9898}\u{53d8}\u{91cf}\u{ff0c}\u{65b0}\u{589e}\u{6b21}\u{8981}\u{6309}\u{94ae}\u{51b7}\u{8c03}\u{73ab}\u{7470}\u{8272}\u{3002}\n- **\u{540e}\u{53f0}\u{4ea4}\u{4e92}\u{6539}\u{8fdb}**\u{ff1a}\u{6587}\u{7ae0}\u{7ba1}\u{7406}\u{5206}\u{9875}\u{3001}\u{91cd}\u{5efa}\u{5185}\u{5bb9}\u{6309}\u{94ae}\u{ff08}\u{5e26} tooltip\u{ff09}\u{3001}\u{91cd}\u{5efa}\u{7f13}\u{5b58}\u{680f}\u{ff1b}\u{8bc4}\u{8bba}\u{72b6}\u{6001}\u{7b5b}\u{9009} `FilterTabs` \u{7ec4}\u{4ef6}\u{5e26}\u{6ed1}\u{52a8}\u{6307}\u{793a}\u{52a8}\u{753b}\u{ff1b}\u{56de}\u{6536}\u{7ad9}\u{81ea}\u{52a8}\u{6e05}\u{7406}\u{9762}\u{677f}\u{5e26}\u{6ed1}\u{5165}\u{52a8}\u{753b}\u{3002}\n- **HTTP \u{538b}\u{7f29}**\u{ff1a}\u{9ed8}\u{8ba4}\u{542f}\u{7528}\u{6240}\u{6709}\u{538b}\u{7f29}\u{7b97}\u{6cd5}\u{ff0c}\u{53ef}\u{901a}\u{8fc7} `COMPRESSION_ALGORITHMS` \u{914d}\u{7f6e}\u{ff1b}\u{516c}\u{5171}\u{9875}\u{9762}\u{4e0e}\u{9759}\u{6001}\u{8d44}\u{6e90} `Cache-Control`\u{3002}\n- **Dockerfile**\u{ff1a}\u{9759}\u{6001} musl \u{955c}\u{50cf}\u{6784}\u{5efa}\u{ff08}release \u{4e8c}\u{8fdb}\u{5236} strip \u{7b26}\u{53f7}\u{ff09}\u{3002}\n- **Gitea Actions CI**\u{ff1a}CI \u{5de5}\u{4f5c}\u{6d41}\u{3002}\n\n### Changed\n\n- \u{5199}\u{8def}\u{5f84}\u{7f13}\u{5b58}\u{5931}\u{6548}\u{4ece}\u{300c}\u{5168}\u{91cf}\u{6e05}\u{7a7a}\u{300d}\u{6539}\u{4e3a}\u{300c}\u{7cbe}\u{786e}\u{5230} slug / tag / \u{5217}\u{8868}\u{9875}\u{300d}\u{ff0c}\u{5e76}\u{5728}\u{8bfb}\u{53d6} slug/tag \u{5143}\u{6570}\u{636e}\u{65f6}\u{4f7f}\u{7528}\u{4e8b}\u{52a1} + `FOR UPDATE` \u{907f}\u{514d}\u{5e76}\u{53d1}\u{7ade}\u{6001}\u{ff1b}\u{6279}\u{91cf}\u{6062}\u{590d}\u{3001}\u{6e05}\u{7a7a}\u{3001}\u{91cd}\u{5efa}\u{7b49}\u{8def}\u{5f84}\u{5747}\u{91c7}\u{7528}\u{7cbe}\u{786e}\u{5931}\u{6548}\u{3002}\n- `get_post_stats` \u{5c06} 3 \u{6b21}\u{72ec}\u{7acb} `COUNT(*)` \u{5408}\u{5e76}\u{4e3a}\u{5355}\u{6b21}\u{6761}\u{4ef6}\u{805a}\u{5408}\u{67e5}\u{8be2}\u{3002}\n- \u{56fe}\u{7247}\u{89e3}\u{7801}\u{3001}\u{7f29}\u{653e}\u{3001}\u{7f16}\u{7801}\u{903b}\u{8f91}\u{901a}\u{8fc7} `tokio::task::spawn_blocking` \u{79fb}\u{81f3}\u{963b}\u{585e}\u{7ebf}\u{7a0b}\u{6c60}\u{ff1b}Argon2 hash/verify\u{3001}Markdown \u{6e32}\u{67d3}\u{3001}GIF/WebP \u{539f}\u{59cb}\u{6821}\u{9a8c}\u{540c}\u{6837} offload \u{5230}\u{963b}\u{585e}\u{7ebf}\u{7a0b}\u{6c60}\u{3002}\n- \u{4e3a}\u{975e}\u{56fe}\u{7247}\u{8def}\u{7531}\u{542f}\u{7528} `CompressionLayer` \u{4e0e} `TimeoutLayer`\u{ff0c}`/uploads/*` \u{56fe}\u{7247}\u{8def}\u{7531}\u{8df3}\u{8fc7}\u{538b}\u{7f29}\u{4e0e}\u{5168}\u{5c40}\u{8d85}\u{65f6}\u{3002}\n- \u{8fde}\u{63a5}\u{6c60}\u{56de}\u{6536}\u{65b9}\u{6cd5}\u{4ece} `Verified` \u{6539}\u{4e3a} `Fast`\u{ff1b}\u{91cd}\u{8bd5}\u{4ece}\u{56fa}\u{5b9a} 2s \u{6539}\u{4e3a}\u{6307}\u{6570}\u{9000}\u{907f} + \u{6296}\u{52a8}\u{ff1b}\u{65b0}\u{589e} `statement_timeout`\u{ff08}`STATEMENT_TIMEOUT_SECS`\u{ff09}\u{3002}\n- \u{4e3a} `deadpool-postgres` \u{663e}\u{5f0f}\u{6307}\u{5b9a} Tokio1 runtime\u{ff1b}\u{5220}\u{9664}\u{65e0}\u{6548}\u{7684} trgm GIN \u{7d22}\u{5f15}\u{3002}\n- Tiptap \u{7f16}\u{8f91}\u{5668}\u{5347}\u{7ea7}\u{5230} Vite 8 / Vitest 4 / TypeScript 6 / Tiptap 3.27\u{ff08}Rolldown\u{ff09}\u{ff0c}\u{5e76}\u{4ece} `js_sys::eval` \u{8fc1}\u{79fb}\u{5230} wasm-bindgen \u{7ed1}\u{5b9a}\u{5c42}\u{ff08}`tiptap_bridge`\u{ff09}\u{ff0c}EditorOptions/onReady/onUploadEvent \u{56de}\u{8c03}\u{66ff}\u{4ee3}\u{8f6e}\u{8be2}\u{3002}\n- Lightbox \u{4e0e} post-content \u{4ece} `include_str!` \u{5185}\u{8054}\u{6539}\u{4e3a}\u{914d}\u{7f6e}\u{9a71}\u{52a8}\u{521d}\u{59cb}\u{5316}\u{ff1b}\u{79fb}\u{9664}\u{65e7} `ImageViewer` \u{7ec4}\u{4ef6}\u{3002}\n- JS \u{5b50}\u{9879}\u{76ee}\u{4ece} npm \u{8fc1}\u{79fb}\u{5230} pnpm\u{3002}\n- \u{5c01}\u{9762}\u{56fe}\u{6bd4}\u{4f8b}\u{7edf}\u{4e00}\u{4e3a} 21:9\u{ff1b}\u{5361}\u{7247}\u{91cd}\u{6784}\u{4f7f}\u{7528}\u{539f}\u{751f} `blur-img` \u{7ed3}\u{6784}\u{3002}\n- \u{90ae}\u{7bb1}\u{6b63}\u{5219}\u{3001}sanitizer allowlist \u{7528} `LazyLock` \u{9759}\u{6001}\u{5316}\u{4ee5}\u{907f}\u{514d}\u{6bcf}\u{6b21}\u{8c03}\u{7528}\u{5206}\u{914d}\u{3002}\n- Markdown \u{6e32}\u{67d3}\u{8bfb}\u{53d6} DB \u{4e2d}\u{9884}\u{6e32}\u{67d3}\u{7684} `content_html`/`toc_html`\u{ff0c}\u{5199}\u{5165}\u{65f6}\u{5b58}\u{50a8} `toc_html`\u{3002}\n- \u{5927}\u{91cf}\u{300c}\u{4e0a}\u{5e1d}\u{7ec4}\u{4ef6}\u{300d}\u{62c6}\u{5206}\u{4e3a}\u{5b50}\u{7ec4}\u{4ef6}\u{ff1a}`CoverUploader`\u{3001}`FilterTabs`\u{3001}`AutoPurgeSettings`\u{3001}`RebuildCacheBar`\u{ff0c}\u{5171}\u{4eab} `EmptyState` \u{7ec4}\u{4ef6}\u{3002}\n\n### Fixed\n\n- \u{4fee}\u{590d} `/uploads/{*path}` \u{8def}\u{5f84}\u{56e0}\u{7f3a}\u{5c11} `ConnectInfo` \u{6269}\u{5c55}\u{800c}\u{8fd4}\u{56de} HTTP 500 \u{7684}\u{95ee}\u{9898}\u{3002}\n- \u{4fee}\u{590d}\u{5e76}\u{53d1}\u{91cd}\u{590d}\u{8bc4}\u{8bba}\u{63d0}\u{4ea4}\u{ff08}advisory lock\u{ff09}\u{ff1b}\u{91cd}\u{590d}\u{68c0}\u{67e5}\u{6539}\u{4e3a}\u{4e8b}\u{52a1}\u{5185}\u{539f}\u{5b50}\u{64cd}\u{4f5c}\u{5e76}\u{5bf9} `content_hash` \u{5efa}\u{7d22}\u{5f15}\u{3002}\n- \u{4fee}\u{590d}\u{8bc4}\u{8bba}\u{8868}\u{5355}\u{ff1a}\u{670d}\u{52a1}\u{7aef} honeypot\u{3001}a11y label\u{3001}\u{56de}\u{590d}\u{5e03}\u{5c40}\u{ff1b}\u{5f85}\u{5ba1}\u{8bc4}\u{8bba}\u{5d4c}\u{5957}\u{663e}\u{793a}\u{4e8e}\u{7236}\u{8bc4}\u{8bba}\u{4e0b}\u{ff1b}\u{8bc4}\u{8bba}\u{9879}\u{6dfb}\u{52a0} `md-content` \u{7c7b}\u{4fee}\u{590d}\u{9ad8}\u{4eae}\u{4e0e}\u{7a7a}\u{884c}\u{3002}\n- \u{4fee}\u{590d}\u{65f6}\u{5e8f}\u{679a}\u{4e3e}\u{653b}\u{51fb}\u{ff1a}\u{4e0d}\u{5b58}\u{5728}\u{7528}\u{6237}\u{6267}\u{884c} dummy Argon2 verify\u{ff1b}\u{5bf9} `check_pending_status` \u{9650}\u{6d41}\u{9632}\u{6b62}\u{72b6}\u{6001}\u{679a}\u{4e3e}\u{3002}\n- \u{4fee}\u{590d}\u{56fe}\u{7247}\u{78c1}\u{76d8}\u{7f13}\u{5b58}\u{6e05}\u{7406}\u{8df3}\u{8fc7}\u{7b26}\u{53f7}\u{94fe}\u{63a5}\u{ff0c}\u{9632}\u{6b62}\u{904d}\u{5386}\u{5230}\u{7f13}\u{5b58}\u{76ee}\u{5f55}\u{5916}\u{90e8}\u{ff1b}\u{8fc7}\u{671f} session \u{6e05}\u{7406}\u{540c}\u{65f6}\u{5931}\u{6548}\u{4f1a}\u{8bdd}\u{5185}\u{5b58}\u{7f13}\u{5b58}\u{3002}\n- \u{4fee}\u{590d} SSR hydration \u{4e0d}\u{5339}\u{914d}\u{3001}\u{6697}\u{8272}\u{6a21}\u{5f0f} FOUC\u{3001}ThemeToggle \u{72b6}\u{6001}\u{540c}\u{6b65}\u{3002}\n- \u{4fee}\u{590d} Tiptap \u{4e8c}\u{6b21}\u{5bfc}\u{822a}\u{7a7a}\u{767d}\u{3001}\u{94fe}\u{63a5}\u{547d}\u{4ee4}\u{987a}\u{5e8f}\u{4e0e} URL scheme \u{6821}\u{9a8c}\u{3001}blob \u{6cc4}\u{6f0f}\u{ff08}\u{8282}\u{70b9}\u{9500}\u{6bc1}\u{65f6} revoke\u{ff09}\u{3002}\n- \u{4fee}\u{590d} 404 \u{9875}\u{9762}\u{3001}\u{9996}\u{9875}\u{5361}\u{7247}\u{5d4c}\u{5957}\u{951a}\u{70b9}\u{3001}\u{5c01}\u{9762}\u{56fe}\u{9ad8}\u{5ea6}\u{584c}\u{9677}\u{3001}\u{6697}\u{8272}\u{6a21}\u{5f0f}\u{5c01}\u{9762}\u{7070}\u{80cc}\u{666f}\u{3002}\n- \u{4fee}\u{590d} WASM \u{6784}\u{5efa}\u{5047}\u{9633}\u{6027} warning\u{ff08}27 \u{5904} `cfg` gate\u{ff09}\u{3001}Tailwind v4 \u{4e0e} Tiptap \u{6784}\u{5efa}\u{95ee}\u{9898}\u{3002}\n- \u{4fee}\u{590d} dev \u{6a21}\u{5f0f} SSR \u{7f13}\u{5b58}\u{5bfc}\u{81f4}\u{6e32}\u{67d3}\u{9648}\u{65e7} HTML\u{ff1b}`/doc` \u{8def}\u{7531}\u{4e0e}\u{9759}\u{6001}\u{6258}\u{7ba1}\u{51b2}\u{7a81}\u{7684} panic\u{3002}\n- \u{4fee}\u{590d} `b7afd12` \u{8d77}\u{7684} highlight \u{5927}\u{5c0f}\u{5199}\u{5339}\u{914d}\u{5bfc}\u{81f4} Haskell \u{7b49}\u{9ad8}\u{4eae}\u{5931}\u{6548}\u{3002}\n- \u{5176}\u{4ed6}\u{6784}\u{5efa}\u{3001}CI\u{3001}\u{683c}\u{5f0f}\u{5316}\u{4e0e}\u{6d4b}\u{8bd5}\u{4fee}\u{590d}\u{3002}\n\n### Security\n\n- Session token \u{4ee5} SHA-256 \u{54c8}\u{5e0c}\u{5b58}\u{50a8}\u{ff1b}\u{53ef}\u{914d}\u{7f6e}\u{5355}\u{7528}\u{6237} session \u{4e0a}\u{9650}\u{5e76}\u{4ee5}\u{884c}\u{9501}\u{4e32}\u{884c}\u{5316}\u{3002}\n- \u{57fa}\u{4e8e} Origin \u{7684}\u{5199}\u{63a5}\u{53e3} CSRF \u{9632}\u{62a4}\u{ff1b}`COOKIE_SECURE` \u{63a7}\u{5236} Secure \u{6807}\u{5fd7}\u{3002}\n- \u{4e0d}\u{5b58}\u{5728}\u{7528}\u{6237}\u{6267}\u{884c} dummy Argon2 verify \u{9632}\u{65f6}\u{5e8f}\u{679a}\u{4e3e}\u{ff1b}`check_pending_status` \u{9650}\u{6d41}\u{3002}\n- \u{56fe}\u{7247}\u{8def}\u{5f84} `canonicalize` \u{524d}\u{7f00}\u{68c0}\u{67e5}\u{ff08}\u{7eb5}\u{6df1}\u{9632}\u{5fa1}\u{ff09}\u{ff1b}\u{62d2}\u{7edd}\u{4e0d}\u{53ef}\u{89e3}\u{7801}\u{56fe}\u{7247}\u{8fd4}\u{56de} 422\u{ff0c}\u{539f}\u{59cb}\u{6587}\u{4ef6}\u{4e0a}\u{9650} 20MB\u{ff1b}\u{6240}\u{6709}\u{56fe}\u{7247}\u{54cd}\u{5e94}\u{52a0} `X-Content-Type-Options: nosniff`\u{3002}\n- \u{5206}\u{9875}\u{53c2}\u{6570} `per_page` \u{4e0e} `page` \u{4e0a}\u{9650}\u{94b3}\u{5236}\u{ff0c}\u{6d88}\u{9664}\u{516c}\u{5f00}\u{63a5}\u{53e3} DoS \u{4e0e}\u{65e0}\u{754c} OFFSET / \u{7f13}\u{5b58}\u{952e}\u{6247}\u{51fa}\u{3002}\n- \u{78c1}\u{76d8}\u{7f13}\u{5b58}\u{5199}\u{5165}\u{6539}\u{4e3a} temp-file + rename \u{539f}\u{5b50}\u{64cd}\u{4f5c}\u{3002}\n\n### Internal\n\n- \u{65b0}\u{589e} vitest \u{6d4b}\u{8bd5}\u{5957}\u{4ef6}\u{ff1a}`tiptap-editor`\u{ff08}UploadCoordinator\u{3001}UploadImageNodeView\u{3001}isValidUrl\u{ff09}\u{3001}`lightbox`\u{ff08}geometry\u{3001}lightbox \u{751f}\u{547d}\u{5468}\u{671f}\u{ff09}\u{3001}`yggdrasil-core`\u{ff08}post-content\u{3001}theme-transition \u{964d}\u{7ea7}\u{ff09}\u{3002}\n- \u{6269}\u{5145} Rust \u{5355}\u{5143}\u{6d4b}\u{8bd5}\u{8986}\u{76d6}\u{ff1a}AppError\u{3001}sanitizer\u{3001}WebP\u{3001}theme\u{3001}cache\u{3001}db\u{ff08}\u{8fc1}\u{79fb}\u{6ce8}\u{518c}\u{6821}\u{9a8c}\u{ff09}\u{3001}PostListItem \u{7b49}\u{3002}\n- \u{8865}\u{9f50}\u{5927}\u{91cf}\u{4e2d}\u{6587}\u{6587}\u{6863}\u{6ce8}\u{91ca}\u{ff1b}\u{66f4}\u{65b0} AGENTS.md\u{3001}\u{65b0}\u{589e} DEVELOPMENT.md \u{4e0e}\u{751f}\u{4ea7}\u{90e8}\u{7f72}\u{6307}\u{5357}\u{3002}\n- Makefile \u{5b8c}\u{5584} `test`\u{ff08}cargo test + vitest\u{ff09}\u{3001}`clippy`\u{3001}`fix`\u{3001}`doc`\u{ff08}ayu \u{4e3b}\u{9898}\u{ff09}\u{3001}`build-lightbox` \u{7b49}\u{76ee}\u{6807}\u{3002}\n- \u{4ed3}\u{5e93}\u{5b89}\u{5168}\u{5ba1}\u{67e5}\u{ff08}`449a545`\u{ff09}\u{4fee}\u{590d}\u{591a}\u{9879}\u{5173}\u{952e}\u{95ee}\u{9898}\u{3002}\n\n## [0.2.0] - 2026-06-10\n\n### Added\n\n- 404 Not Found \u{9875}\u{9762}\n- \u{57fa}\u{4e8e} moka \u{7684}\u{5185}\u{5b58}\u{7f13}\u{5b58}\u{6a21}\u{5757}\u{ff08}\u{6587}\u{7ae0}\u{3001}\u{6807}\u{7b7e}\u{3001}\u{7edf}\u{8ba1}\u{67e5}\u{8be2}\u{7f13}\u{5b58}\u{ff09}\n- \u{8bfb}\u{5199}\u{64cd}\u{4f5c}\u{7f13}\u{5b58}\u{652f}\u{6301}\u{ff1a}\u{8bfb}\u{64cd}\u{4f5c}\u{547d}\u{4e2d}\u{7f13}\u{5b58}\u{ff0c}\u{5199}\u{64cd}\u{4f5c}\u{81ea}\u{52a8}\u{5931}\u{6548}\u{76f8}\u{5173}\u{7f13}\u{5b58}\n- \u{6587}\u{7ae0}\u{5217}\u{8868}\u{8fd4}\u{56de}\u{51c6}\u{786e}\u{7684}\u{603b}\u{6761}\u{76ee}\u{6570}\u{ff0c}\u{524d}\u{53f0}\u{9996}\u{9875}/\u{5f52}\u{6863}/\u{6807}\u{7b7e}\u{9875}\u{5206}\u{9875}\u{4f7f}\u{7528}\u{51c6}\u{786e}\u{603b}\u{6570}\n- WebP \u{56fe}\u{7247}\u{7f16}\u{7801}\u{652f}\u{6301}\u{ff08}zenwebp\u{ff09}\u{ff0c}\u{4e0a}\u{4f20}\u{56fe}\u{7247}\u{81ea}\u{52a8}\u{8f6c}\u{6362}\u{4e3a} WebP \u{4ee5}\u{8282}\u{7701}\u{5b58}\u{50a8}\u{7a7a}\u{95f4}\n- \u{56fe}\u{7247}\u{53d8}\u{4f53}\u{78c1}\u{76d8}\u{7ea7}\u{7f13}\u{5b58}\n\n### Changed\n\n- `posts.rs` API \u{62c6}\u{5206}\u{4e3a}\u{6a21}\u{5757}\u{76ee}\u{5f55}\u{7ed3}\u{6784}\n- \u{7edf}\u{4e00}\u{9519}\u{8bef}\u{5904}\u{7406}\u{4e3a} `AppError` \u{679a}\u{4e3e}\n- \u{7f13}\u{5b58}\u{5c42}\u{4f18}\u{5316}\u{ff1a}\u{76f4}\u{63a5}\u{8fd4}\u{56de}\u{547d}\u{4e2d}\u{7ed3}\u{679c}\u{ff0c}COUNT(*) \u{7ed3}\u{679c}\u{5355}\u{72ec}\u{7f13}\u{5b58}\n- \u{63d0}\u{53d6} WebP \u{7f16}\u{7801}\u{8f85}\u{52a9}\u{51fd}\u{6570}\u{51cf}\u{5c11}\u{91cd}\u{590d}\u{4ee3}\u{7801}\n- \u{7b80}\u{5316} TraceLayer \u{914d}\u{7f6e}\u{5e76}\u{91cd}\u{65b0}\u{683c}\u{5f0f}\u{5316}\u{8def}\u{7531}\u{5b9a}\u{4e49}\n\n### Fixed\n\n- \u{4fee}\u{590d}\u{591a}\u{5904} `#[cfg(feature = \"server\")]` \u{95e8}\u{63a7}\u{7f3a}\u{5931}\u{5bfc}\u{81f4}\u{7684}\u{7f16}\u{8bd1}\u{95ee}\u{9898}\n- \u{7f13}\u{5b58}\u{6b63}\u{786e}\u{5931}\u{6548}\u{65e7} slug \u{548c}\u{65b0} slug\n- WebP \u{89e3}\u{7801}\u{7f13}\u{51b2}\u{533a}\u{5927}\u{5c0f}\u{9650}\u{5236}\u{ff0c}\u{9632}\u{6b62}\u{6076}\u{610f}\u{5927}\u{5206}\u{914d}\n- \u{4ee3}\u{7801}\u{5757}\u{590d}\u{5236}\u{6309}\u{94ae}\u{70b9}\u{51fb}\u{5904}\u{7406}\n- \u{5176}\u{4ed6}\u{7ec6}\u{8282}\u{4fee}\u{590d}\n\n### Internal\n\n- \u{65b0}\u{589e}\u{7f13}\u{5b58}\u{3001}WebP \u{914d}\u{7f6e}\u{6d4b}\u{8bd5}\u{7528}\u{4f8b}\n- \u{6dfb}\u{52a0} release \u{81ea}\u{52a8}\u{5316}\u{6280}\u{80fd}\n\n## [0.1.0] - 2026-06-09\n\n### Added\n\n- Dioxus 0.7 \u{5168}\u{6808}\u{9879}\u{76ee}\u{811a}\u{624b}\u{67b6}\n- PostgreSQL \u{6570}\u{636e}\u{5e93}\u{5efa}\u{8868}\u{ff08}\u{7528}\u{6237}\u{3001}\u{6587}\u{7ae0}\u{3001}\u{6807}\u{7b7e}\u{3001}\u{4f1a}\u{8bdd}\u{ff09}\n- \u{7528}\u{6237}\u{8ba4}\u{8bc1}\u{7cfb}\u{7edf}\u{ff1a}\u{6ce8}\u{518c}\u{3001}\u{767b}\u{5f55}\u{3001}Session \u{7ba1}\u{7406}\n- \u{9996}\u{4e2a}\u{6ce8}\u{518c}\u{7528}\u{6237}\u{81ea}\u{52a8}\u{6210}\u{4e3a} admin\u{ff0c}\u{540e}\u{7eed}\u{6ce8}\u{518c}\u{5173}\u{95ed}\n- HttpOnly cookie \u{4f1a}\u{8bdd}\u{673a}\u{5236}\n- \u{540e}\u{53f0}\u{7ba1}\u{7406}\u{9875}\u{9762}\u{4e0e}\u{8def}\u{7531}\n- Tiptap \u{5bcc}\u{6587}\u{672c}\u{7f16}\u{8f91}\u{5668}\u{96c6}\u{6210}\u{ff08}Markdown \u{6a21}\u{5f0f}\u{ff09}\n  - Slash \u{547d}\u{4ee4}\u{3001}\u{8868}\u{683c}\u{3001}\u{4efb}\u{52a1}\u{5217}\u{8868}\u{3001}\u{56fe}\u{7247}\u{548c}\u{94fe}\u{63a5}\u{6269}\u{5c55}\n  - \u{56fe}\u{7247}\u{7c98}\u{8d34}/\u{62d6}\u{62fd}\u{4e0a}\u{4f20}\n- \u{6587}\u{7ae0} CRUD\u{ff1a}\u{521b}\u{5efa}\u{3001}\u{7f16}\u{8f91}\u{ff08}\u{542b}\u{6570}\u{636e}\u{56de}\u{586b}\u{ff09}\u{3001}\u{5217}\u{8868}\u{3001}\u{5220}\u{9664}\n- \u{6587}\u{7ae0}\u{5c01}\u{9762}\u{56fe}\u{652f}\u{6301}\n- Markdown \u{6e32}\u{67d3}\u{ff1a}TOC \u{76ee}\u{5f55}\u{3001}\u{951a}\u{70b9}\u{94fe}\u{63a5}\u{3001}\u{5b57}\u{6570}\u{7edf}\u{8ba1}\u{3001}\u{9884}\u{8ba1}\u{9605}\u{8bfb}\u{65f6}\u{95f4}\n- \u{4ee3}\u{7801}\u{9ad8}\u{4eae}\u{ff08}syntect + catppuccin \u{4e3b}\u{9898}\u{ff09}\u{ff0c}\u{652f}\u{6301} Swift/Kotlin \u{81ea}\u{5b9a}\u{4e49}\u{8bed}\u{6cd5}\n- XSS \u{9632}\u{62a4}\u{ff08}ammonia \u{6e05}\u{6d17} HTML\u{ff09}\n- \u{524d}\u{53f0}\u{535a}\u{5ba2}\u{9875}\u{9762}\u{ff08}PaperMod \u{98ce}\u{683c}\u{ff09}\n  - \u{9996}\u{9875}\u{ff08}\u{4e2a}\u{4eba}\u{7b80}\u{4ecb} + \u{6587}\u{7ae0}\u{5217}\u{8868} + \u{5206}\u{9875}\u{ff09}\n  - \u{5f52}\u{6863}\u{9875}\u{ff08}\u{6309}\u{5e74}\u{6708}\u{5206}\u{7ec4}\u{ff09}\n  - \u{6807}\u{7b7e}\u{9875}\u{ff08}\u{6807}\u{7b7e}\u{4e91} + \u{6807}\u{7b7e}\u{8be6}\u{60c5}\u{ff09}\n  - \u{6587}\u{7ae0}\u{8be6}\u{60c5}\u{9875}\u{ff08}\u{76ee}\u{5f55}\u{3001}\u{4e0a}\u{4e0b}\u{7bc7}\u{5bfc}\u{822a}\u{ff09}\n  - \u{641c}\u{7d22}\u{9875}\n  - \u{5173}\u{4e8e}\u{9875}\n- \u{6697}\u{8272}\u{6a21}\u{5f0f}\u{ff08}\u{7cfb}\u{7edf}\u{504f}\u{597d}\u{68c0}\u{6d4b} + \u{624b}\u{52a8}\u{5207}\u{6362}\u{ff0c}SSR \u{5b89}\u{5168}\u{ff09}\n- SSR \u{9884}\u{6e32}\u{67d3}\u{ff08}\u{9996}\u{9875}\u{3001}\u{6587}\u{7ae0}\u{3001}\u{5f52}\u{6863}\u{3001}\u{6807}\u{7b7e}\u{ff09}+ \u{589e}\u{91cf}\u{7f13}\u{5b58}\n- \u{9aa8}\u{67b6}\u{5c4f}\u{52a0}\u{8f7d}\u{52a8}\u{753b}\u{ff08}\u{5404}\u{9875}\u{9762}\u{72ec}\u{7acb}\u{9aa8}\u{67b6}\u{ff0c}\u{9632}\u{95ea}\u{70c1}\u{ff09}\n- \u{56fe}\u{7247}\u{5904}\u{7406}\u{ff1a}\u{7f29}\u{653e}\u{3001}\u{7f29}\u{7565}\u{56fe}\u{3001}\u{65cb}\u{8f6c}\u{3001}\u{683c}\u{5f0f}\u{8f6c}\u{6362}\u{ff08}moka \u{7f13}\u{5b58}\u{ff09}\n- \u{56fe}\u{7247}\u{706f}\u{7bb1}\u{67e5}\u{770b}\u{5668}\n- pg_trgm \u{5168}\u{6587}\u{641c}\u{7d22}\n- Rate limiting\u{ff08}\u{6ce8}\u{518c}\u{3001}\u{767b}\u{5f55}\u{3001}\u{4e0a}\u{4f20}\u{63a5}\u{53e3}\u{ff09}\n- \u{6570}\u{636e}\u{5e93}\u{8fde}\u{63a5}\u{6c60}\u{91cd}\u{8bd5}\u{903b}\u{8f91}\n- Session \u{8fc7}\u{671f}\u{81ea}\u{52a8}\u{6e05}\u{7406}\u{ff08}\u{6bcf}\u{5c0f}\u{65f6}\u{ff09}\n- \u{6570}\u{636e}\u{5e93}\u{6027}\u{80fd}\u{7d22}\u{5f15}\u{ff08}posts/tags/sessions\u{ff09}\n- \u{6570}\u{636e}\u{5e93}\u{8fc1}\u{79fb}\u{811a}\u{672c}\u{ff08}migrate.sh\u{ff09}\n- 122 \u{4e2a}\u{5355}\u{5143}\u{6d4b}\u{8bd5}\u{8986}\u{76d6} 12 \u{4e2a}\u{6a21}\u{5757}\n- \u{9879}\u{76ee}\u{5f00}\u{53d1}\u{6307}\u{5357}\u{ff08}AGENTS.md\u{ff09}\n\n### Changed\n\n- Tailwind CSS v4 + \u{72ec}\u{7acb} CLI \u{6784}\u{5efa}\n- admin \u{6a21}\u{5757}\u{91cd}\u{6784}\u{4e3a}\u{5171}\u{4eab}\u{7ec4}\u{4ef6} + card \u{5e03}\u{5c40}\n- \u{5168}\u{5c40}\u{4f7f}\u{7528} Dioxus \u{5ba2}\u{6237}\u{7aef}\u{8def}\u{7531}\u{66ff}\u{4ee3}\u{539f}\u{751f}\u{5bfc}\u{822a}\n- \u{63d0}\u{53d6}\u{516c}\u{5171}\u{7ec4}\u{4ef6}\u{ff1a}FormInput/FormLabel/AlertBox\u{3001}SkeletonLine/SkeletonBox/SkeletonCard\n- \u{63d0}\u{53d6}\u{5de5}\u{5177}\u{6a21}\u{5757}\u{ff1a}slug\u{3001}markdown\u{3001}tags\u{3001}text\u{3001}time\u{3001}session\n- API \u{5c42} DRY \u{91cd}\u{6784}\u{ff08}\u{9519}\u{8bef}\u{5904}\u{7406}\u{3001}N+1 \u{67e5}\u{8be2}\u{4fee}\u{590d} via JOIN+array_agg\u{ff09}\n- \u{6587}\u{7ae0} slug ASCII \u{5316} + \u{65f6}\u{95f4}\u{6233}\u{56de}\u{9000}\n- Tiptap \u{7f16}\u{8f91}\u{5668} Vite \u{6784}\u{5efa}\u{8f93}\u{51fa}\u{56fa}\u{5b9a}\u{6587}\u{4ef6}\u{540d}\n- \u{9996}\u{9875} HomeInfo \u{4e2a}\u{4eba}\u{7b80}\u{4ecb}\u{66ff}\u{4ee3}\u{539f}\u{59cb}\u{9996}\u{533a}\n\n### Fixed\n\n- \u{4fee}\u{590d} admin \u{8def}\u{7531}\u{5207}\u{6362}\u{95ea}\u{70c1}\n- \u{4fee}\u{590d}\u{7f16}\u{8f91}\u{5668}\u{6697}\u{8272}\u{4e3b}\u{9898}\u{548c}\u{5217}\u{8868}\u{6837}\u{5f0f}\n- \u{4fee}\u{590d} Footer \u{6eda}\u{52a8}\u{76d1}\u{542c}\u{5668}\u{672a}\u{6e05}\u{7406}\n- \u{4fee}\u{590d} CJK \u{5b57}\u{6570}\u{7edf}\u{8ba1}\n- \u{4fee}\u{590d}\u{4ee3}\u{7801}\u{5757} Tailwind `.block` \u{7c7b}\u{51b2}\u{7a81}\n- \u{4fee}\u{590d} SSR \u{6c34}\u{5408}\u{4e0d}\u{5339}\u{914d}\u{ff08}ThemeToggle\u{ff09}\n- \u{4fee}\u{590d} WASM \u{751f}\u{4ea7}\u{73af}\u{5883} 404\u{ff08}symlink \u{4fee}\u{590d}\u{ff09}\n- \u{4fee}\u{590d}\u{56fe}\u{7247}\u{4e0a}\u{4f20} 500 \u{9519}\u{8bef}\n- \u{4fee}\u{590d} Markdown \u{6e32}\u{67d3}\u{4e2d} data URI \u{4e22}\u{5931}\n- \u{4fee}\u{590d}\u{6697}\u{8272}\u{6a21}\u{5f0f} FOUC \u{548c}\u{72b6}\u{6001}\u{540c}\u{6b65}\n- \u{4fee}\u{590d}\u{767b}\u{5f55}\u{540e} UserContext \u{672a}\u{91cd}\u{7f6e}\n- \u{4fee}\u{590d}\u{6587}\u{7ae0} slug \u{552f}\u{4e00}\u{6027}\u{68c0}\u{67e5}\u{ff08}\u{542b}\u{5df2}\u{5220}\u{9664}\u{6587}\u{7ae0}\u{ff09}\n- \u{4fee}\u{590d} Tiptap \u{7f16}\u{8f91}\u{5668}\u{4e8c}\u{6b21}\u{5bfc}\u{822a}\u{7a7a}\u{767d}\u{95ee}\u{9898}\n- \u{4fee}\u{590d}\u{6a21}\u{677f} hydration \u{4e0d}\u{5339}\u{914d}\u{8b66}\u{544a}\n- \u{4fee}\u{590d} Clippy \u{548c}\u{7f16}\u{8bd1}\u{5668}\u{8b66}\u{544a}\n";
Expand description

CHANGELOG.md 原文,编译期内嵌。