+
You bring a site and a small adapter that says what the site is. wayBetter gives you the rest: a
Tauri 2 window with tabs, split panes and every account signed in side by side; a page runtime with
a plugin API, a theme engine and string packs; a signed Store with a safe install screen; backups,
@@ -29,8 +35,6 @@ encrypted sync and signed updates; and the tooling to scaffold, sign, scan and r
## How it fits together
-
-
A wayBetter app is one Tauri 2 window with several webviews. The framework has one piece for each
layer and does not need to know which site you wrap.
@@ -48,7 +52,7 @@ Details of every module are in [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md).
npm create waybetter app kickapp -- --site kick.com --name "wayBetter for Kick" --yes
```
-
+
The same tool starts a plugin or a theme:
@@ -57,6 +61,8 @@ npm create waybetter plugin -- --name "Hide Trends" # add --ts for Ty
npm create waybetter theme -- --name "Midnight Mint" --accent "#3ddc97"
```
+
+
The app scaffold adds the framework as a git submodule at `waybetter/` by default (`--host-source
path` and `--host-source git` are the alternatives). After `npm run tauri dev`, replace the
placeholder selectors in `src/site.ts` and `src-tauri/src/site.rs`. All flags:
@@ -241,6 +247,9 @@ bun run test:create # scaffolds each kind into temp folders and checks them a
`test:create` also runs `cargo check` on a generated app (about a minute cold);
`WAYBETTER_SKIP_CARGO_CHECK=1` skips that step. Requires Bun 1.4.2+, Node 24+ and Rust 1.88+.
+The README's terminal images are real output: `node tools/readme-term-shots.mjs` runs the commands and
+redraws `assets/readme/term/` (Google Chrome and cwebp).
+
## Docs
- [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md): every module of the host, runtime and shell
diff --git a/assets/readme/architecture.svg b/assets/readme/architecture.svg
deleted file mode 100644
index 9d64aef..0000000
--- a/assets/readme/architecture.svg
+++ /dev/null
@@ -1,127 +0,0 @@
-
diff --git a/assets/readme/create-terminal.svg b/assets/readme/create-terminal.svg
deleted file mode 100644
index 1878c88..0000000
--- a/assets/readme/create-terminal.svg
+++ /dev/null
@@ -1,29 +0,0 @@
-
diff --git a/assets/readme/term/create-app.txt b/assets/readme/term/create-app.txt
new file mode 100644
index 0000000..6468a2d
--- /dev/null
+++ b/assets/readme/term/create-app.txt
@@ -0,0 +1,11 @@
+$ npm create waybetter app kickapp -- --site kick.com --name "wayBetter for Kick" --yes
+
+Created a wayBetter app in kickapp (32 files).
+
+Next:
+ cd kickapp
+ git init && git submodule add https://git.crt.fyi/CRT/waybetter.git waybetter
+ npm install
+ npm run build
+ npm run tauri dev
+ then replace the PLACEHOLDER selectors in src/site.ts and src-tauri/src/site.rs
diff --git a/assets/readme/term/create-app.webp b/assets/readme/term/create-app.webp
new file mode 100644
index 0000000..1d5e274
Binary files /dev/null and b/assets/readme/term/create-app.webp differ
diff --git a/assets/readme/term/create-plugin.txt b/assets/readme/term/create-plugin.txt
new file mode 100644
index 0000000..8de0d1d
--- /dev/null
+++ b/assets/readme/term/create-plugin.txt
@@ -0,0 +1,7 @@
+$ npm create waybetter plugin -- --name "Hide Trends"
+
+Created a wayBetter plugin in hide-trends (2 files).
+
+Next:
+ cd hide-trends
+ copy hide-trends.plugin.js into wayBetter → Plugins → Open folder, then Rescan
diff --git a/assets/readme/term/create-plugin.webp b/assets/readme/term/create-plugin.webp
new file mode 100644
index 0000000..bb5bacd
Binary files /dev/null and b/assets/readme/term/create-plugin.webp differ
diff --git a/tools/readme-term-shots.mjs b/tools/readme-term-shots.mjs
new file mode 100644
index 0000000..6a4ee43
--- /dev/null
+++ b/tools/readme-term-shots.mjs
@@ -0,0 +1,105 @@
+#!/usr/bin/env node
+// Terminal shots for the README: runs real `create-waybetter` commands in a throwaway folder and saves, per shot,
+// assets/readme/term/.txt the cleaned output (first line "$ ", no ANSI, temp paths made short)
+// assets/readme/term/.webp that text drawn as a terminal (dark), rendered by headless Google Chrome and
+// encoded with cwebp (the smaller of lossy q80 and lossless)
+// Fails when a command exits non-zero, its output lacks its expected marker, or Chrome / cwebp hang.
+// node tools/readme-term-shots.mjs all shots
+// node tools/readme-term-shots.mjs --text only the .txt files (no browser)
+// node tools/readme-term-shots.mjs app only these shots
+// Needs Google Chrome (or CHROME=) and cwebp on PATH for the images.
+import { spawnSync } from 'node:child_process';
+import { existsSync, mkdirSync, mkdtempSync, readFileSync, rmSync, statSync, writeFileSync } from 'node:fs';
+import { tmpdir } from 'node:os';
+import { dirname, join } from 'node:path';
+import { fileURLToPath } from 'node:url';
+
+const ROOT = join(dirname(fileURLToPath(import.meta.url)), '..');
+const CLI = join(ROOT, 'packages', 'create-waybetter', 'bin', 'create-waybetter.js');
+const OUT = join(ROOT, 'assets', 'readme', 'term');
+const CHROME = process.env.CHROME || '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome';
+const TIMEOUT_MS = 60_000;
+const log = m => console.log(`${new Date().toISOString().slice(11, 19)} [term-shots] ${m}`);
+
+const SHOTS = [
+ { name: 'create-app', title: 'npm create waybetter', marker: 'Created a wayBetter app',
+ shown: 'npm create waybetter app kickapp -- --site kick.com --name "wayBetter for Kick" --yes',
+ argv: ['app', 'kickapp', '--site', 'kick.com', '--name', 'wayBetter for Kick', '--yes'] },
+ { name: 'create-plugin', title: 'npm create waybetter', marker: 'hide-trends',
+ shown: 'npm create waybetter plugin -- --name "Hide Trends"',
+ argv: ['plugin', '--name', 'Hide Trends'] },
+];
+
+const esc = s => s.replace(/&/g, '&').replace(//g, '>');
+function lineHtml(l) {
+ if (l.startsWith('$ ')) return `$${esc(l.slice(2))}`;
+ let h = esc(l);
+ h = h.replace(/\b(error|ERROR|failed)\b/g, m => `${m}`);
+ h = h.replace(/^(\s*)(Created|Wrote)\b/, (m, a, b) => `${a}${b}`);
+ h = h.replace(/^(\s{2,})(cd |npm |git |then )/, (m, a, b) => `${a}${b}`);
+ return h;
+}
+const page = (title, lines) => `