wayBetter Store

(FOSS) Pull request adalah pengajuan

Terbitkan punyamu.

Tema adalah satu file JSON. Plugin adalah satu file JavaScript. Buat, coba di aplikasi, lalu tambahkan ke Toko: satu folder dalam satu pull request, atau filenya lewat issue kalau kamu tidak memakai git. Keduanya memerlukan akun git.crt.fyi gratis, dan tidak ada lagi.

1

Buat

Mulai dari file yang sudah berfungsi. Alat perancahnya menuliskan satu untukmu; bagian Buat di aplikasi (wayBetter → Buat) berisi contoh dan nilai tema langsung.

Sebuah tema

Warna, font, sudut, kerapatan, tata letak, latar, efek. Tiga warna sudah cukup; sisanya diturunkan dan teks dijaga tetap terbaca.

Atau buat di aplikasi: Tampilan → Pembuat Tema → Ekspor. THEMES.md mencantumkan semua yang bisa diatur sebuah tema.

Sebuah plugin

Sebuah kelas dengan start() dan stop(), serta header yang menyebutkan siapa pembuatnya dan apa yang dipakainya.

Tambahkan --ts untuk proyek TypeScript. PLUGINS.md memuat API, izin, dan muat ulang langsung.

hide-trends.plugin.js
/**
 * @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'); }
};

Toko membaca nama, penulis, versi, deskripsi, dan izin plugin dari header ini, serta nama, penulis, dan deskripsi tema dari JSON-nya. Layar pemasangan menampilkan nilai yang sama, jadi keduanya tidak mungkin berbeda.

2

Coba

Toko itu opsional. File yang berfungsi sudah bisa dibagikan.

  • Jatuhkan filenya ke jendela wayBetter. Kamu mendapat layar pemasangan yang sama seperti item Toko: nama, penulis, versi, SHA-256, izin, kodenya.
  • Nyalakan mode pengembang (Pengaturan → Pengembang) selagi bekerja: plugin, file tema, atau custom.css yang disimpan dimuat ulang di semua tab sekaligus.
  • Bagikan tanpa Toko. Kirim filenya, atau tautan waybetter://install ke URL https di waybetter.fyi, cdn1.crt.fyi, atau file mentah di git.crt.fyi. Ia tidak pernah terpasang tanpa layar pemasangan.
3

Tambahkan satu folder

Setiap item Toko adalah satu folder di bawah store/<app>/ dalam repositori. Nama foldernya menjadi id item dan alamatnya di sini: /store/plugins/<id>/.

store/x/ — item-item wayBetter for X
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
category
Plugin: reading, writing, filters, focus, atau tools. Tema: dark atau light, diambil dari mode tema kalau kamu mengosongkannya.
tags
Hingga 12 kata yang akan dicari orang.
version
Hanya untuk tema (versi plugin ada di header-nya). Naikkan saat kamu mengubah filenya.
Deskripsi
Satu atau dua kalimat yang menjelaskan fungsinya, 50 karakter atau lebih. 160 karakter pertama menjadi deskripsi halamannya di mesin pencari.

Itulah seluruh pengajuannya. Halaman, kartu, entri pencarian, pratinjau tautan, data terstruktur, dan entri peta situs dibuat dari katalog bertanda tangan saat situs dibangun. store/README.md memuat aturan lengkapnya.

4

Jalankan pemeriksaan

Tidak ada CI yang di-host. Pemeriksaannya berupa perintah yang kamu jalankan sebelum mengirim, dan dijalankan lagi oleh pengelola sebelum digabungkan.

di klonmu
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
  • Id dan namaid folder (a-z 0-9 -, hingga 40), name.plugin.js, tanpa duplikat dalam satu aplikasi
  • Ukuranfile item hingga 2 MiB, pratinjau hingga 300 KB dengan rasio 16:10
  • Header@name, @version, sebuah deskripsi, dan baris @permissions yang menyebut network atau network:none
  • Izin yang jujurnetwork:none ditolak bila kodenya memanggil fetch, XMLHttpRequest, WebSocket, EventSource, atau sendBeacon; pemanggilan API yang dibatasi harus dinyatakan
  • Tanpa kode jarak jauhtanpa eval, new Function, atau import(); tanpa skrip atau file luar di pratinjau; tanpa @import atau URL luar di CSS tema
  • Katalogitem-itemnya terbangun menjadi katalog yang diterima aplikasi (aturan framework sendiri), dan katalog yang dipublikasikan masih cocok dengan tanda tangan serta hash-nya
  • Pencarian dan berbagijudul halaman hingga 60 karakter, deskripsi 50 sampai 160, keduanya unik
5

Kirim

Dua jalan masuk. Keduanya butuh akun git.crt.fyi gratis: siapa pun bisa mendaftar, dan seorang pengelola menyetujui setiap akun baru secara manual.

Pull request

  1. Fork repositorinya di git.crt.fyi.
  2. Tambahkan foldermu di sebuah cabang dan jalankan pemeriksaan.
  3. Buka pull request. Templatnya menanyakan apa fungsinya dan apa yang dipakainya.

Tanpa git? Buka issue

  1. Pilih templat Tema atau Plugin.
  2. Lampirkan filenya (dan pratinjau, kalau ada).
  3. Seorang pengelola menambahkan foldernya untukmu.

Lalu seorang pengelola menandatangani

Kunci penandatanganan Toko memang sengaja offline, jadi menggabungkan bukan berarti menerbitkan. Setelah penggabungan, seorang pengelola membaca kodenya, menjalankan waybetter store build dan waybetter store sign di mesin yang menyimpan kuncinya, lalu melakukan push. Situs dibangun ulang, itemmu mendapat halamannya, dan setiap aplikasi melihatnya saat berikutnya membaca katalog bertanda tangan.

Apa pun di katalog bertanda tangan dijamin oleh kunci itu; karena itulah seseorang membaca setiap plugin sebelum ditandatangani.

{ }

Format katalog

Satu file untuk semua aplikasi wayBetter. Kamu tidak pernah mengeditnya dengan tangan: ia dibangun dari folder-folder.

catalog.json (format 2)Terbuka
{ "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"] }
] }
  • Bertanda tangan. catalog.json.sig adalah tanda tangan Ed25519 atas byte persis dari catalog.json. Aplikasi memverifikasinya dengan kunci publik yang tertanam di dalamnya, lalu memeriksa ukuran dan SHA-256 setiap unduhan.
  • Ketat. Kolom yang tidak dikenal, lebih dari 500 item, atau file di atas 1 MiB membuat seluruh katalog ditolak. store-catalog.schema.json adalah JSON Schema-nya; STORE.md di framework memuat semua aturannya.
  • Dipakai bersama. Setiap item menyebutkan apps-nya. Sebuah aplikasi memverifikasi seluruh file dan hanya menyimpan itemnya sendiri.
Aa

Bahasa

Bukan item Toko: ke-51 bahasa sudah tertanam di aplikasi dan dimuat saat diperlukan.

  • Perbaiki atau selesaikan terjemahan di apps/desktop/locales/<tag>.json, lewat pull request atau issue dengan file yang diubah terlampir.
  • Periksa dengan bun run i18n:check: kunci, placeholder, bentuk jamak, tanpa markup. Hasilnya harus 0 error(s).
  • Dikirim bersama pembaruan aplikasi berikutnya, bukan lewat Toko. TRANSLATING.md memuat sintaks pesan dan cara melihat kata-katamu di aplikasi.

Lihat apa yang sudah ada.

Setiap item di Toko menampilkan kodenya. Plugin bawaan adalah contoh terbaik cara memakai API dengan baik.