主題
色彩、字型、圓角、密度、版面配置、背景、效果。三個顏色就夠了;其餘會自動推導,文字也會保持清晰易讀。
或者在應用程式中建立:「外觀」→「主題建立工具」→「匯出」。THEMES.md 列出了主題可以設定的所有項目。
(FOSS) 一個 pull request 就是一次投稿
主題就是一個 JSON 檔案,外掛程式就是一個 JavaScript 檔案。做出來,在應用程式中試用,然後加進商店:一個 pull request 裡放一個資料夾;如果你不用 git,就開一個 issue 附上檔案。兩種方式都需要一個免費的 git.crt.fyi 帳號,此外什麼都不需要。
從一個能運作的檔案開始。鷹架工具會替你寫好一個;應用程式自己的「製作」區段(wayBetter →「製作」)有範例和即時的主題數值。
色彩、字型、圓角、密度、版面配置、背景、效果。三個顏色就夠了;其餘會自動推導,文字也會保持清晰易讀。
或者在應用程式中建立:「外觀」→「主題建立工具」→「匯出」。THEMES.md 列出了主題可以設定的所有項目。
一個帶有 start() 和 stop() 的類別,加上一段標頭,說明是誰做的、用了什麼。
加上 --ts 就能得到 TypeScript 專案。PLUGINS.md 裡有 API、權限和即時重新載入的說明。
/**
* @name Hide Trends
* @description Hides the trends box in the right column, so the timeline is the only thing moving.
* @version 1.0.0
* @author you
* @permissions network:none
*/
module.exports = class HideTrends {
start() { wayBetter.api.injectCSS('hide-trends', '[data-testid="sidebarColumn"] section { display: none }'); }
stop() { wayBetter.api.clearCSS('hide-trends'); }
};
商店會從這段標頭讀取外掛程式的名稱、作者、版本、說明和權限,並從主題的 JSON 讀取它的名稱、作者和說明。安裝畫面顯示的是同一組值,所以兩者永遠不會不一致。
商店並非必要。能運作的檔案本身就已經可以分享了。
custom.css 會立刻在所有分頁中重新載入。waybetter://install 連結,指向 waybetter.fyi、cdn1.crt.fyi 上的 https URL 或 git.crt.fyi 上的原始檔案。沒有經過安裝畫面,它絕不會被安裝。商店的每個項目都是存放庫中 store/<app>/ 底下的一個資料夾。資料夾名稱就是項目的 id,也是它在這裡的位址:/store/plugins/<id>/。
store/x/plugins/hide-trends/
hide-trends.plugin.js the plugin, exactly as it installs
item.json { "category": "focus", "tags": ["trends", "sidebar"] }
preview.svg optional, 640×400 (.svg or .png); drawn for you without one
store/x/themes/midnight-mint/
theme.json the theme, as Appearance → Export writes it
item.json { "version": "1.0.0" }
preview.svg optional; drawn from the theme without one
categoryreading、writing、filters、focus 或 tools。主題:dark 或 light,省略時取自主題的 mode。tagsversion投稿內容就這麼多。頁面、卡片、搜尋項目、連結預覽、結構化資料和 sitemap 項目,都會在網站建置時從簽署的目錄產生。完整規則請見 store/README.md。
這裡沒有託管的 CI。檢查就是你在送出前執行的指令,維護者在合併前會再執行一次。
git submodule update --init
bun install --frozen-lockfile
bun run check:store # your folder, against the Store's rules
bun run test # everything else, including the site's SEO test
a-z 0-9 -,最多 40 個字元)、name.plugin.js,同一個應用程式中不得重複@name、@version、一段說明,以及一行寫明 network 或 network:none 的 @permissionsfetch、XMLHttpRequest、WebSocket、EventSource 或 sendBeacon 時,network:none 會被拒絕;受管制的 API 呼叫必須宣告eval、new Function 或 import();預覽中不得有指令碼或外部檔案;主題的 CSS 中不得有 @import 或外部 URL兩種參與方式。兩者都需要免費的 git.crt.fyi 帳號:任何人都能註冊,每個新帳號由維護者人工核准。
商店的簽署金鑰刻意保持離線,所以合併並不等於發佈。合併之後,維護者會閱讀程式碼,在保管金鑰的電腦上執行 waybetter store build 和 waybetter store sign,然後推送。網站重新建置,你的項目有了自己的頁面,每個應用程式下次讀取簽署的目錄時就會看到它。
簽署的目錄中的一切都由那把金鑰擔保,這就是為什麼每個外掛程式在簽署之前都會有真人讀過。
所有 wayBetter 應用程式共用一個檔案。你永遠不必手動編輯它:它是從資料夾建置出來的。
{ "format": 2, "name": "wayBetter Store", "generatedAt": "2026-09-30T…Z", "items": [
{ "apps": ["x"], "kind": "plugin", "id": "thread-reader", "name": "Thread Reader",
"author": "wayBetter", "version": "1.2.0", "description": "…",
"category": "reading", "tags": ["threads"],
"url": "https://waybetter.fyi/store/plugins/bt-thread-reader.plugin.js",
"file": "bt-thread-reader.plugin.js", "sha256": "<64 hex>", "size": 10961,
"preview": "https://waybetter.fyi/store/previews/plugin-thread-reader.svg",
"permissions": ["ui", "clipboard", "commands", "network:none"] }
] }
apps。應用程式會驗證整個檔案,並只保留屬於自己的項目。不屬於商店項目:全部 51 種語言都內建在應用程式中,需要時才載入。
apps/desktop/locales/<tag>.json 中修正或補完翻譯,可以透過 pull request,或開一個 issue 並附上修改過的檔案。bun run i18n:check 檢查它:索引鍵、預留位置、複數形式、不含標記。它必須印出 0 error(s)。