wayBetter Store

(FOSS) Bir pull request bir başvurudur

Kendininkini yayınla.

Bir tema tek bir JSON dosyasıdır. Bir eklenti tek bir JavaScript dosyasıdır. Yap, uygulamada dene, sonra Mağaza’ya ekle: tek bir pull request’te tek bir klasör ya da git kullanmıyorsan bir issue’da dosyan. İkisi için de ücretsiz bir git.crt.fyi hesabı yeter, başka bir şey gerekmez.

1

Yap

Çalışan bir dosyadan başla. İskelet aracı sana bir tane yazar; uygulamanın kendi Oluştur bölümünde (wayBetter → Oluştur) örnekler ve canlı tema değerleri var.

Bir tema

Renkler, yazı tipleri, köşeler, yoğunluk, yerleşim, arka plan, efektler. Üç renk yeter; gerisi türetilir ve metin okunaklı tutulur.

Ya da uygulamada oluştur: Görünüm → Tema Oluşturucu → Dışa aktar. Bir temanın ayarlayabileceği her şey THEMES.md dosyasında.

Bir eklenti

start() ve stop() içeren bir sınıf, bir de kimin yaptığını ve neleri kullandığını söyleyen bir başlık.

TypeScript projesi için --ts ekle. API, izinler ve canlı yeniden yükleme PLUGINS.md dosyasında.

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'); }
};

Mağaza, bir eklentinin adını, yazarını, sürümünü, açıklamasını ve izinlerini bu başlıktan; bir temanın adını, yazarını ve açıklamasını da JSON’undan okur. Kurulum ekranı aynı değerleri gösterir; yani ikisi asla çelişemez.

2

Dene

Mağaza isteğe bağlı. Çalışan bir dosya zaten paylaşılabilir.

  • Dosyayı wayBetter penceresine bırak. Bir Mağaza öğesinin gördüğü kurulum ekranının aynısı karşına çıkar: ad, yazar, sürüm, SHA-256, izinler, kod.
  • Çalışırken geliştirici modunu aç (Ayarlar → Geliştirici): kaydettiğin bir eklenti, tema dosyası ya da custom.css tüm sekmelerde aynı anda yeniden yüklenir.
  • Mağaza olmadan paylaş. Dosyayı gönder ya da waybetter.fyi, cdn1.crt.fyi üzerindeki bir https adresine veya git.crt.fyi üzerindeki ham bir dosyaya giden bir waybetter://install bağlantısı ver. Kurulum ekranı olmadan asla kurulmaz.
3

Tek bir klasör ekle

Her Mağaza öğesi, depoda store/<app>/ altında bir klasördür. Klasörün adı, öğenin kimliği ve buradaki adresidir: /store/plugins/<id>/.

store/x/ — wayBetter for X’in öğeleri
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
Eklentiler: reading, writing, filters, focus ya da tools. Temalar: dark ya da light; boş bırakırsan temanın mode değerinden alınır.
tags
İnsanların arayacağı en fazla 12 kelime.
version
Yalnızca temalar için (eklentininki başlığındadır). Dosyayı değiştirdiğinde yükselt.
Açıklama
Ne yaptığını anlatan bir iki cümle, en az 50 karakter. İlk 160 karakter, sayfasının arama motoru açıklaması olur.

Başvurunun tamamı bu. Sayfa, kart, arama kaydı, bağlantı önizlemesi, yapılandırılmış veri ve site haritası kaydı, site derlenirken imzalı katalogdan üretilir. Kuralların tamamı store/README.md dosyasında.

4

Denetimleri çalıştır

Barındırılan bir CI yok. Denetimler, göndermeden önce senin çalıştırdığın, birleştirmeden önce de bir bakımcının yeniden çalıştırdığı komutlardır.

kendi klonunda
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
  • Kimlikler ve adlarklasör kimliği (a-z 0-9 -, en fazla 40), name.plugin.js, bir uygulamada yinelenen yok
  • Boyutöğe dosyaları en fazla 2 MiB, önizlemeler 16:10 oranında en fazla 300 KB
  • Başlık@name, @version, bir açıklama ve network ya da network:none diyen bir @permissions satırı
  • Dürüst izinlerKod fetch, XMLHttpRequest, WebSocket, EventSource ya da sendBeacon çağırıyorsa network:none reddedilir; kısıtlı API çağrıları bildirilmelidir
  • Uzak kod yokeval, new Function ya da import() yok; önizlemede betik ya da dış dosya yok; tema CSS’inde @import ya da dış URL yok
  • Katalogöğeler, uygulamaların kabul ettiği bir katalog oluşturur (framework’ün kendi kuralları) ve yayımlanan katalog, imzası ve özetleriyle hâlâ örtüşür
  • Arama ve paylaşımsayfa başlığı en fazla 60 karakter, açıklama 50 ile 160 arası, ikisi de benzersiz
5

Gönder

İki yol var. İkisi de ücretsiz bir git.crt.fyi hesabı ister: herkes kaydolabilir, her yeni hesabı bir yönetici elle onaylar.

Pull request

  1. git.crt.fyi üzerinde depoyu fork’la.
  2. Klasörünü bir dala ekle ve denetimleri çalıştır.
  3. Pull request’i aç. Şablon, ne yaptığını ve neleri kullandığını sorar.

Git yok mu? Bir issue aç

  1. Tema ya da Eklenti şablonunu seç.
  2. Dosyayı ekle (varsa bir önizlemeyi de).
  3. Klasörü senin yerine bir bakımcı ekler.

Sonra bir bakımcı imzalar

Mağaza’nın imza anahtarı bilerek çevrimdışı tutulur; yani birleştirmek yayınlamak değildir. Birleştirmeden sonra bir bakımcı kodu okur, anahtarın bulunduğu makinede waybetter store build ve waybetter store sign komutlarını çalıştırır ve gönderir. Site yeniden derlenir, öğen kendi sayfasına kavuşur ve her uygulama, imzalı kataloğu bir sonraki okuyuşunda onu görür.

İmzalı katalogdaki her şeye o anahtar kefildir; bu yüzden her eklentiyi imzalanmadan önce bir insan okur.

{ }

Katalog biçimi

Tüm wayBetter uygulamaları için tek dosya. Elle asla düzenlemezsin: klasörlerden üretilir.

catalog.json (biçim 2)Açık
{ "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"] }
] }
  • İmzalı. catalog.json.sig, catalog.json dosyasının tam baytları üzerindeki bir Ed25519 imzasıdır. Uygulamalar onu içlerine gömülü açık anahtarla doğrular, ardından her indirmenin boyutunu ve SHA-256’sını denetler.
  • Katı. Bilinmeyen alanlar, 500’den fazla öğe ya da 1 MiB’ı aşan bir dosya kataloğun tamamını reddettirir. JSON Schema’sı store-catalog.schema.json; tüm kurallar framework’teki STORE.md dosyasında.
  • Ortak. Her öğe kendi apps alanını belirtir. Bir uygulama dosyanın tamamını doğrular ve yalnızca kendi öğelerini tutar.
Aa

Diller

Mağaza öğesi değiller: 51 dilin tamamı uygulamaya gömülüdür ve gerektiğinde yüklenir.

  • apps/desktop/locales/<tag>.json içinde bir çeviriyi düzelt ya da tamamla; pull request ile ya da değişen dosyayı eklediğin bir issue ile.
  • bun run i18n:check ile denetle: anahtarlar, yer tutucular, çoğul biçimler, işaretleme yok. Çıktısı 0 error(s) olmalı.
  • Bir sonraki uygulama güncellemesiyle gelir, Mağaza üzerinden değil. Mesaj sözdizimi ve sözcüklerini uygulamada nasıl göreceğin TRANSLATING.md dosyasında.

Zaten orada olanlara bak.

Mağaza’daki her öğe kodunu gösterir. Birlikte gelen eklentiler, API’nin nasıl iyi kullanılacağının en iyi örnekleridir.