01 · 外殼
輕巧的原生視窗。
Tauri 2,執行在系統 WebView 上。你希望每個應用程式都有的外框:
- 分頁、釘選分頁和分割窗格:把分頁或連結拖到邊緣即可
- 每個帳號都有自己的設定檔,並排登入
- 連結導向:在同一分頁、並排、新分頁或你的瀏覽器中開啟
- 網址列與命令面板 Ctrl K
- 經過簽署、靜默安裝的更新
(FOSS) 現在,什麼都是應用程式。
wayBetter 把你已經在用的應用程式放進輕巧的原生視窗,並且就地擴充它們,就像 BetterDiscord 擴充 Discord 一樣。分頁、分割窗格、所有帳號並排、主題、外掛程式,還有針對應用程式本身錯誤的修正。任何人都能製作主題或外掛程式,任何人都能打造下一個應用程式。
下載 Windows 版 wayBetter for X · 免費 · GPL-3.0-or-later · 不會遙測你閱讀或發佈的內容
waybetter 中有 0 個相依套件01 問題所在
另一半你拿不到:能用幾個帳號、長什麼樣子、錯誤什麼時候修,都由應用程式決定。wayBetter 保留原本的應用程式,再補上另一半。
一個視窗一個帳號。登出、登入,周而復始。
所有帳號並排,同時保持登入。
應用程式有錯誤?等他們修吧。
在你的電腦上就地修好,今天就修。
外觀由他們挑。功能由他們給。
任何人都能寫的主題和外掛程式。
每個桌面用戶端都塞進一整個瀏覽器。
一個輕巧的原生視窗,執行在系統 WebView 上。
天生輕巧
在系統本來就有的 WebView 上執行的原生視窗,而不是又一個塞進每個應用程式的瀏覽器。
在 Windows 11 上以 wayBetter for X 1.0 測得:已發佈下載檔的安裝程式大小;3 次啟動的中位數;執行階段評估時間與長時間工作(>50 ms)分別在有無 wayBetter 的情況下測量。
02 一套系統
每個 wayBetter 應用程式都是同一套系統:原生的外殼、頁面中的執行階段,以及一個了解該應用程式的小型轉接器。應用程式本身照常運作。沒有任何內容經過代理或重新託管;一切變更只發生在你的電腦上。
01 · 外殼
Tauri 2,執行在系統 WebView 上。你希望每個應用程式都有的外框:
02 · 執行階段
注入應用程式自己的頁面,所有 wayBetter 應用程式共用:
03 · 轉接器
唯一了解應用程式的部分:它的主機、版面配置、帳號按鈕,以及它本來就會載入的資料。
SiteSpec 和一個頁面中的 SiteAdapter03 第一個應用程式
在分頁和分割窗格中使用真正的 x.com,所有帳號並排,十四款主題、八個區域外掛,以及 X 自帶錯誤的修正:互相搶先的喜歡與追蹤、消失的草稿、亂跳的時間軸。現已支援 Windows、macOS 和 Linux。
在真正的 x.com 上使用分頁和分割窗格,每個帳號在各自的設定檔中同時登入。
喜歡和追蹤確實生效、返回時保留位置、時間軸不亂跳、上傳失敗自動重試。
每份草稿都連同修訂記錄保存在本機,X 弄丟時再幫你放回去。
完整重新設計,不只是換顏色。Reader+、Chat+、Media+ 和另外五個區域外掛,每項功能都有開關。
一個命令面板,涵蓋分頁、帳號、設定,以及帶有運算子標籤的 X 搜尋。
TweetDeck 風格的面板:X 的欄位並排顯示,每一欄使用你選的帳號,還有篩選條件和未讀數。
04 打造成你的
主題就是一個 JSON 檔案,外掛程式就是一個 JavaScript 檔案。不必排隊審查,使用時也不需要帳號:寫好、放進去、分享檔案,或發佈到商店。會寫 CSS,就能替應用程式換上新造型。會寫一點 JavaScript,就能加上它從未推出的功能。
在「外觀」面板中匯入和匯出 JSON。對比度會替你檢查:文字在任何表面上都保持清晰易讀。
{
"name": "Deep Sea",
"author": "@you",
"mode": "dark",
"colors": { "bg": "#06141b", "text": "#e6f4f1", "accent": "#2ee6c5" },
"font": { "family": ["Geist"], "scale": 1.02 },
"shape": { "radius": 14, "button": 9999, "avatar": "rounded" },
"layout": { "density": "compact", "cards": true },
"background": { "kind": "pattern", "pattern": "grid",
"ink": "#2ee6c5", "opacity": 0.08, "size": 28 },
"effects": { "hover": "glow" }
}
start() 和 stop()。BetterDiscord 風格的 *.plugin.js,放進外掛程式資料夾,再到「設定」中開啟。繁瑣的部分交給輔助 API。
/**
* @name Copy Quote
* @description y on a focused post copies "@handle: text".
* @version 1.0.0
* @author @you
*/
module.exports = class CopyQuote {
start() {
const api = window.wayBetter.api;
this.scope = api.scope();
this.scope.onKey((event, post) => {
if (event.key !== 'y' || !post) return;
const t = api.tweet(post);
if (t) api.copyText(`@${t.handle}: ${t.text}`)
.then(() => api.toast('Copied'));
});
}
stop() { this.scope.dispose(); }
};
輔助 API
storage(ns)observe(sel, fn)onRouteChange(fn)onKey(fn)tweet(el)copyText(s)toast(msg)injectCSS(id, css)waitFor(sel)scope()wayBetter for X 隨附十四個
05 以它為基礎開發
wayBetter for X 背後的頁面執行階段和外殼模型,已經以 waybetter 發佈在 npm 上:純 ESM 並附帶型別,每個模組都有自己的子路徑,零相依套件。只拿你需要的部分,或打造一整個應用程式。
npm i waybetter
import { configureRuntime, type SiteAdapter }
from 'waybetter/runtime/site';
export const KICK: SiteAdapter = {
product: 'wayBetter for Kick',
hosts: ['kick.com'],
runtimeGlobal: 'WayBetterKick',
apiMarks: ['/api/'],
// plugins, rail, account, links, themeSources …
};
configureRuntime(KICK);
waybetter/runtime/*
site轉接器的組合根domHub一個 MutationObserver,一個影格netHub所有功能共用一個 fetch/XHR 掛鉤pluginApi給使用者外掛程式用的輔助函式themeTokensOKLab 色彩模型paneNav分割檢視中只保留一個導覽linkRouting並排、分頁或瀏覽器accountReport目前登入的是哪個帳號waybetter/shell/*
addressModel網址列標籤paneModel分割窗格、並排開啟連結linkDrop放下一個連結,多一個窗格palette命令面板的排序profileModel帳號設定檔updateModel更新標籤windowControls標題列和視窗按鈕chrome標題列和工具列的尺寸06 下一步
任何有網頁版的應用程式,都能擁有同樣的視窗、主題和外掛程式。以下這些可能是下一個。它們都尚未公布,也沒有日期:就等有人來寫轉接器。README 裡的轉接器範例就是 Kick。
這些是可能的下一批應用程式,並非已公布的產品。YouTube、Kick、Twitch 和 Discord 是其各自擁有者的商標;顯示其標誌僅為指稱這些服務。wayBetter 與它們沒有任何關聯,也未獲其認可或贊助。
07 免費且開放原始碼
沒有付費方案、沒有廣告、不推銷升級。現在沒有,「測試版結束後」也不會有。
GPL-3.0-or-later。框架和各個應用程式的原始碼都公開在 git.crt.fyi。
沒有分析,不會遙測你閱讀或發佈的內容。草稿、設定和外掛程式都留在你的電腦上。
Fork 它、做主題、寫外掛程式、打造下一個應用程式。授權條款讓它對後來的人同樣保持開放。
08 原則
你登入的就是應用程式本身。沒有任何內容經過代理或重新託管;它只在你的電腦上被改變。
執行在系統 WebView 上的 Tauri 視窗,每個應用程式一個,所有帳號都在裡面。
修正是為了讓你自己的點擊確實生效。wayBetter 絕不會自行發文、追蹤或刪除任何東西。
更新經過簽署並靜默安裝,修正自然到位,不必再跑一次安裝程式。