# create-waybetter ```sh npm create waybetter ``` Scaffolds something for [wayBetter](https://waybetter.fyi), the framework behind wayBetter for X: a **plugin**, a **theme**, or a whole new **wayBetter app** for another site. It asks what it needs when run in a terminal; every answer is also a flag. No dependencies, Node 18.3+. Source: [git.crt.fyi/CRT/waybetter](https://git.crt.fyi/CRT/waybetter) (`packages/create-waybetter`); its tests scaffold each kind into a temporary folder and check the result against the framework's real contracts. ## Plugin ```sh npm create waybetter plugin -- --name "Hide Trends" npm create waybetter plugin -- --name "Word Badges" --ts # TypeScript project ``` One `*.plugin.js` file with the header the plugin store reads (`@name`, `@description`, `@version`, `@author`) and a class with `start()` / `stop()`. The example uses the real plugin API: `api.scope()` for cleanup, `api.storage()`, `scope.observe()`, `scope.onKey()`, the UI kit (`scope.ui.toast` with an action, a settings `ui.dialog` built with `ui.h`) and the theme API (`api.theme.current()`, `--wb-*` CSS variables). `--ts` makes a small TypeScript project typed by the `waybetter` package; `npm run build` writes the loadable `dist/.plugin.js` with the header first. `--app any` targets another wayBetter app (core API only; wayBetter for X adds `api.tweet`, `api.account`, `api.users`). Install: **wayBetter → Plugins → Open folder**, copy the file in, **Rescan**, turn it on. ## Theme ```sh npm create waybetter theme -- --name "Midnight Mint" --accent "#3ddc97" --font "Geist, system-ui" ``` A theme JSON with `"$schema": "https://unpkg.com/waybetter/theme.schema.json"` (editor completion and checks), a full palette derived from `--bg`, `--text` and `--accent` the way the runtime derives missing roles, and the font roles (`font.family` for the interface, `font.tweet` for post text). Presets: `midnight`, `paper`, `dusk`. Import it in **wayBetter → Appearance → Import**. ## App ```sh npm create waybetter app kickapp -- --site kick.com --name "wayBetter for Kick" --yes npm create waybetter app ytapp -- --site youtube.com --name "wayBetter for YouTube" ``` The first argument after `app` is the folder to create. The tool then prints its next steps: `git init && git submodule add https://git.crt.fyi/CRT/waybetter.git waybetter`, `npm install`, `npm run build`, `npm run tauri dev`, and replacing the placeholder selectors. A wayBetter app skeleton, the same system as wayBetter for X: a Tauri 2 window with a trusted local shell and one native child webview per site tab (`waybetter-host`), the page runtime and shell models from the `waybetter` package, and the site adapter in its three parts: - `src-tauri/src/site.rs`: the native `SiteSpec` (hosts, runtime global, account rules); - `src/site.ts`: the page `SiteAdapter` (plugin API settings, account reader, link rules); - `src-tauri/capabilities/`: `shell`, `tab-chrome` and `site-tab`, keyed by webview label. Presets for `youtube.com`, `kick.com` and `twitch.tv` (any host works); every selector and handle rule is a marked PLACEHOLDER to check against the live site. The host crate comes from a git submodule at `waybetter/` (default), a local path (`--host-source path --host-path `) or git (`--host-source git`). ## Options `npm create waybetter -- --help` lists every flag. `--yes` takes defaults for anything not given, `--dry-run` prints the files, `--force` writes into a non-empty directory. ## License GPL-3.0-or-later. See [LICENSE](./LICENSE).