wayBetter Store

(FOSS) Een pull request is een inzending

Publiceer je eigen.

Een thema is één JSON-bestand. Een plug-in is één JavaScript-bestand. Maak het, probeer het in de app en voeg het dan toe aan de Winkel: één map in één pull request, of het bestand in een issue als je geen git gebruikt. Voor beide heb je een gratis account op git.crt.fyi nodig, en verder niets.

1

Maak het

Begin met een werkend bestand. De scaffolder schrijft er een; het onderdeel Maken in de app zelf (wayBetter → Maken) heeft voorbeelden en de actuele themawaarden.

Een thema

Kleuren, lettertypen, hoeken, dichtheid, indeling, achtergrond, effecten. Drie kleuren zijn genoeg; de rest wordt afgeleid en tekst blijft leesbaar.

Of bouw het in de app: Weergave → Themabouwer → Exporteren. THEMES.md somt alles op wat een thema kan instellen.

Een plug-in

Een klasse met start() en stop(), en een header die zegt wie het heeft gemaakt en wat het gebruikt.

Voeg --ts toe voor een TypeScript-project. PLUGINS.md beschrijft de API, de machtigingen en live herladen.

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

De Winkel leest de naam, auteur, versie, beschrijving en machtigingen van een plug-in uit deze header, en de naam, auteur en beschrijving van een thema uit zijn JSON. Het installatiescherm toont dezelfde waarden, dus die twee kunnen nooit van elkaar afwijken.

2

Probeer het

De Winkel is optioneel. Een bestand dat werkt, is al te delen.

  • Sleep het bestand naar het wayBetter-venster. Je krijgt hetzelfde installatiescherm als bij een item uit de Winkel: naam, auteur, versie, SHA-256, machtigingen, de code.
  • Zet de ontwikkelaarsmodus aan (Instellingen → Ontwikkelaar) terwijl je werkt: een opgeslagen plug-in, themabestand of custom.css wordt in alle tabbladen tegelijk herladen.
  • Deel het zonder de Winkel. Stuur het bestand, of een waybetter://install-link naar een https-URL op waybetter.fyi, cdn1.crt.fyi of een raw-bestand op git.crt.fyi. Het wordt nooit geïnstalleerd zonder het installatiescherm.
3

Voeg één map toe

Elk item in de Winkel is een map onder store/<app>/ in de repository. De mapnaam is het id van het item en zijn adres hier: /store/plugins/<id>/.

store/x/ — de items van 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
Plug-ins: reading, writing, filters, focus of tools. Thema’s: dark of light, overgenomen uit de mode van het thema als je het weglaat.
tags
Maximaal 12 woorden waarop mensen zouden zoeken.
version
Alleen voor thema’s (die van een plug-in staat in zijn header). Verhoog hem als je het bestand wijzigt.
Beschrijving
Een of twee zinnen die zeggen wat het doet, 50 tekens of meer. De eerste 160 worden de beschrijving van zijn pagina voor zoekmachines.

Dat is de hele inzending. De pagina, de kaart, het zoekresultaat, het linkvoorbeeld, de gestructureerde gegevens en de sitemapvermelding worden gegenereerd uit de ondertekende catalogus wanneer de site wordt gebouwd. store/README.md bevat alle regels.

4

Voer de controles uit

Er is geen gehoste CI. De controles zijn opdrachten die je uitvoert voordat je verstuurt, en die een beheerder nog eens uitvoert vóór de merge.

in je kloon
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’s en namenmap-id (a-z 0-9 -, maximaal 40), name.plugin.js, geen dubbelen binnen een app
  • Grootteitembestanden tot 2 MiB, voorbeelden tot 300 KB in 16:10
  • De header@name, @version, een beschrijving en een @permissions-regel die network of network:none noemt
  • Eerlijke machtigingennetwork:none wordt geweigerd wanneer de code fetch, XMLHttpRequest, WebSocket, EventSource of sendBeacon aanroept; aanroepen van de afgeschermde API moeten worden opgegeven
  • Geen externe codegeen eval, new Function of import(); geen scripts of externe bestanden in een voorbeeld; geen @import of externe URL’s in de CSS van een thema
  • De catalogusde items bouwen tot een catalogus die de apps accepteren (de regels van het framework zelf), en de gepubliceerde catalogus klopt nog steeds met zijn handtekening en hashes
  • Zoeken en delenpaginatitel tot 60 tekens, beschrijving 50 tot 160, beide uniek
5

Verstuur het

Twee manieren om bij te dragen. Voor allebei heb je een gratis git.crt.fyi-account nodig: iedereen kan zich aanmelden, en een beheerder keurt elk nieuw account met de hand goed.

Pull request

  1. Fork de repository op git.crt.fyi.
  2. Voeg je map toe op een branch en voer de controles uit.
  3. Open de pull request. Het sjabloon vraagt wat het doet en wat het gebruikt.

Geen git? Open een issue

  1. Kies het sjabloon Thema of Plug-in.
  2. Voeg het bestand bij (en een voorbeeld, als je er een hebt).
  3. Een beheerder voegt de map voor je toe.

Daarna ondertekent een beheerder

De ondertekeningssleutel van de Winkel is bewust offline, dus mergen is nog geen publiceren. Na de merge leest een beheerder de code, voert waybetter store build en waybetter store sign uit op de computer waar de sleutel staat, en pusht. De site wordt opnieuw gebouwd, je item krijgt zijn pagina, en elke app ziet het de volgende keer dat hij de ondertekende catalogus leest.

Voor alles in de ondertekende catalogus staat die sleutel in; daarom leest een mens elke plug-in voordat hij wordt ondertekend.

{ }

De catalogusindeling

Eén bestand voor elke wayBetter-app. Je bewerkt het nooit met de hand: het wordt uit de mappen gebouwd.

catalog.json (indeling 2)Open
{ "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"] }
] }
  • Ondertekend. catalog.json.sig is een Ed25519-handtekening over de exacte bytes van catalog.json. Apps verifiëren die met de publieke sleutel die erin is gecompileerd en controleren daarna de grootte en de SHA-256 van elke download.
  • Strikt. Onbekende velden, meer dan 500 items of een bestand groter dan 1 MiB zorgen dat de hele catalogus wordt geweigerd. store-catalog.schema.json is het JSON Schema; STORE.md in het framework bevat elke regel.
  • Gedeeld. Elk item noemt zijn apps. Een app verifieert het hele bestand en houdt alleen zijn eigen items.
Aa

Talen

Geen items in de Winkel: alle 51 talen zijn in de app ingebouwd en worden geladen wanneer dat nodig is.

  • Verbeter of voltooi een vertaling in apps/desktop/locales/<tag>.json, via een pull request of via een issue met het gewijzigde bestand als bijlage.
  • Controleer hem met bun run i18n:check: sleutels, plaatshouders, meervoudsvormen, geen opmaak. De uitvoer moet 0 error(s) zijn.
  • Hij komt mee met de volgende app-update, niet via de Winkel. TRANSLATING.md beschrijft de syntaxis van de berichten en hoe je je woorden in de app ziet.

Bekijk wat er al is.

Elk item in de Winkel toont zijn code. De meegeleverde plug-ins zijn de beste voorbeelden van hoe je de API goed gebruikt.