Một chủ đề
Màu sắc, phông chữ, góc bo, mật độ, bố cục, nền, hiệu ứng. Ba màu là đủ; phần còn lại được suy ra và chữ luôn dễ đọc.
Hoặc dựng nó trong ứng dụng: Giao diện → Trình tạo chủ đề → Xuất. THEMES.md liệt kê mọi thứ một chủ đề có thể đặt.
(FOSS) Một pull request chính là một lần gửi
Một chủ đề là một tệp JSON. Một plugin là một tệp JavaScript. Tạo nó, thử trong ứng dụng, rồi thêm vào Cửa hàng: một thư mục trong một pull request, hoặc gửi tệp qua một issue nếu bạn không dùng git. Cả hai cách đều cần một tài khoản git.crt.fyi miễn phí, và không cần gì khác.
Bắt đầu từ một tệp chạy được. Công cụ tạo khung sẽ viết sẵn một tệp; mục Tạo của chính ứng dụng (wayBetter → Tạo) có các ví dụ và giá trị chủ đề trực tiếp.
Màu sắc, phông chữ, góc bo, mật độ, bố cục, nền, hiệu ứng. Ba màu là đủ; phần còn lại được suy ra và chữ luôn dễ đọc.
Hoặc dựng nó trong ứng dụng: Giao diện → Trình tạo chủ đề → Xuất. THEMES.md liệt kê mọi thứ một chủ đề có thể đặt.
Một lớp với start() và stop(), cùng một phần đầu cho biết ai tạo ra nó và nó dùng gì.
Thêm --ts để có một dự án TypeScript. PLUGINS.md có API, các quyền và tải lại trực tiếp.
/**
* @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'); }
};
Cửa hàng đọc tên, tác giả, phiên bản, mô tả và quyền của plugin từ phần đầu này, còn tên, tác giả và mô tả của chủ đề thì từ JSON của nó. Màn hình cài đặt hiện đúng những giá trị đó, nên hai bên không bao giờ lệch nhau.
Cửa hàng là tùy chọn. Một tệp chạy được thì đã có thể chia sẻ.
custom.css vừa lưu sẽ được tải lại trong mọi tab cùng lúc.waybetter://install đến một URL https trên waybetter.fyi, cdn1.crt.fyi hoặc một tệp thô trên git.crt.fyi. Nó không bao giờ được cài đặt mà không qua màn hình cài đặt.Mỗi mục của Cửa hàng là một thư mục trong store/<app>/ của kho mã. Tên thư mục là id của mục và cũng là địa chỉ của nó ở đây: /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 hoặc tools. Chủ đề: dark hoặc light, lấy từ mode của chủ đề khi bạn bỏ trống.tagsversionĐó là toàn bộ nội dung cần gửi. Trang, thẻ, mục tìm kiếm, bản xem trước liên kết, dữ liệu có cấu trúc và mục trong sitemap đều được tạo từ danh mục có chữ ký khi trang web được dựng. store/README.md có đầy đủ quy tắc.
Không có CI chạy sẵn trên máy chủ. Các bước kiểm tra là những lệnh bạn chạy trước khi gửi, và một người bảo trì sẽ chạy lại trước khi gộp.
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 -, tối đa 40), name.plugin.js, không trùng lặp trong một ứng dụng@name, @version, một mô tả và một dòng @permissions ghi network hoặc network:nonenetwork:none bị từ chối khi mã gọi fetch, XMLHttpRequest, WebSocket, EventSource hoặc sendBeacon; các lệnh gọi API có kiểm soát phải được khai báoeval, new Function hay import(); không có script hay tệp bên ngoài trong ảnh xem trước; không có @import hay URL bên ngoài trong CSS của chủ đềHai cách tham gia. Cả hai đều cần một tài khoản git.crt.fyi miễn phí: ai cũng đăng ký được, và người duy trì duyệt tay từng tài khoản mới.
Khóa ký của Cửa hàng được cố ý giữ ngoại tuyến, nên gộp chưa phải là xuất bản. Sau khi gộp, một người bảo trì đọc mã, chạy waybetter store build và waybetter store sign trên máy giữ khóa, rồi đẩy lên. Trang web được dựng lại, mục của bạn có trang riêng, và mọi ứng dụng sẽ thấy nó ở lần đọc danh mục có chữ ký tiếp theo.
Mọi thứ trong danh mục có chữ ký đều được khóa đó bảo chứng, đó là lý do một con người đọc từng plugin trước khi nó được ký.
Một tệp cho mọi ứng dụng wayBetter. Bạn không bao giờ sửa nó bằng tay: nó được dựng từ các thư mục.
{ "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 của nó. Một ứng dụng xác minh toàn bộ tệp và chỉ giữ các mục của riêng mình.Không phải mục của Cửa hàng: cả 51 ngôn ngữ đều được tích hợp trong ứng dụng và chỉ tải khi cần.
apps/desktop/locales/<tag>.json, qua pull request hoặc qua một issue có đính kèm tệp đã sửa.bun run i18n:check: khóa, phần giữ chỗ, dạng số nhiều, không có mã đánh dấu. Nó phải in ra 0 error(s).