wayBetter for X

This commit is contained in:
CRTkafa 2026-10-01 06:01:13 +07:00
commit 2f1e35ba20
720 changed files with 147465 additions and 0 deletions

177
CHANGELOG.md Normal file
View file

@ -0,0 +1,177 @@
# Changelog
## 1.0.0
The first public release. wayBetter for X is the first app on the open
[wayBetter](https://git.crt.fyi/CRT/waybetter) framework (`npm i waybetter`). Windows is the platform
offered for download; the macOS and Linux packaging in the release tooling is not offered yet.
### New: area plugins, modes and Chat+
- **Eight area plugins instead of a wall of toggles**: Compose+, Reader+, Profile+, Chat+, Media+, Search+, Notifications+ and Navigation+. Each is one card in Plugins with a switch for the whole area and a toggle for every feature. The 46 tweaks and 13 of the 14 small plugins are features of their area now, with the same names, settings and data, so an update changes nothing you had set up. The reliability fixes are their own "Fixes" list that no plugin switch turns off. See docs/AREA-PLUGINS.md.
- **New in the areas**: a "Posting as @handle" chip, a length meter and snippets (Compose+); a read marker, a language filter and quick mute (Reader+); private labels, account age and more on X's hover card (Profile+); video speed, picture-in-picture, an alt text viewer and blur-until-hover (Media+); saved searches, an advanced search form and Latest by default (Search+); filters by kind, keyword highlight and Open on Mentions (Notifications+).
- **Chat+**: star a message and find it again (open at the message, start X's own reply), find in conversation (Ctrl+Shift+F), pinned chats with your own labels, a person filter for group chats, keyword highlight and mute. Starred messages stay on this computer. Nothing is read, stored or sent on its own, and Chat+ never types or sends a message.
- **Modes**: Basic (only the fixes; X as X ships it), Advanced (recommended: every area with its calm features) and Power User (Advanced plus keyboard shortcuts on posts, snippets, private labels and more). A starting point on the first run and in Settings, never a lock; once your features differ from the preset the menu reads "Custom (based on Advanced)" and offers to re-apply it. A setup from an earlier build keeps exactly what it had until you pick a mode.
- **A feature that X breaks pauses itself**: every feature names the parts of X it depends on. When X changes one, that feature pauses with a note on its card and the rest keeps working.
- **Languages in two tiers**: 17 supported languages (English with British English, Japanese, Spanish, Arabic, Indonesian, German, Portuguese, Turkish, French, Thai, Korean, Dutch, Vietnamese, Traditional Chinese, Italian, Hindi and Russian) and 33 community translations, used only when you pick them.
### New: the app menu, zoom, find, updates, safe mode
- **The app menu** ("Settings and more": Alt+F or F10, or click the wayBetter logo in the titlebar): new tab and splits, language (and a Languages row that opens the Languages section), theme, mode, zoom, Plugins, Store, Workspaces and Drafts, check for updates and report a problem.
- **Page zoom** per tab (Ctrl+=, Ctrl+-, Ctrl+0 or the menu's zoom row): 25% to 500%, the engine's own zoom, remembered per tab.
- **Find in page** (Ctrl+F, the menu or Ctrl+K): a find bar per pane with the match count, in deck columns too. Only what the page has rendered is searched, and what you type is kept nowhere.
- **Check for updates** on demand from the menu: the same check the timer runs, once, and it says calmly what came of it.
- **Safe mode**: start with `--safe-mode` or hold Shift at launch (Windows), or switch it from the menu. X runs with none of wayBetter's layers (no page runtime, plugins, themes, custom CSS or fixes) for that run only; nothing is saved.
- **Report a problem**: a summary with no personal data (app and WebView versions, which features paused), shown exactly as it would be shared, with Copy and the repository's new-issue page. The app sends nothing.
### New: themes v2, icon packs and string packs
- **Theme engine v2** (framework): a theme document can carry component tokens, layout variants, decoration and an icon pack, on top of the colour model.
- **Icon packs**: Appearance → Icons follows the theme, keeps X's own icons, or picks one of four packs (Line, Classic, Aero, Pixel 98). You can import an icon pack too; it applies to X tabs and to the app's own chrome.
- **Share my setup**: Settings → Backup & sync can Copy link or Save file for your theme, icon pack, mode and features (nothing personal). "Use a setup" takes a pasted link or a file, shows what will change, and applies only after you confirm; a `waybetter://setup` link opened from outside shows the same preview.
- **String packs**: data that replaces X's own interface strings (a language X does not offer, a fixed translation, a rewording). Drop a `.strings.json` on the window, open a link or pick one in the Store under Languages; the install screen shows its language, its coverage of X's strings and a sample. Languages turns packs on or off and orders them. Only known string keys can change, and a pack is data, never code. The Store lists one so far (Esperanto). See docs/STRING-PACKS.md in the framework repository.
- **Builds carry no trace of the machine that made them**: `waybetter build-env` removes the build paths from the binary and every release runs a privacy scan over its files, installer and updater bundle before anything is signed.
### New: the Store, workspaces, backup and the deck
- **Store, install links and drag-and-drop**: install themes and plugins from the new Store section
(signed catalog; the app checks the signature and every file's SHA-256), from
`waybetter://install` links on waybetter.fyi/themes and /plugins, or by dropping a `.json` /
`.plugin.js` file on the window. Every install shows a screen first: name, author, version, where
it came from, SHA-256, permissions and the code; nothing installs until you confirm. Update and
remove from the Store or the Plugins list.
- **The Store is part of the wayBetter framework**: the install screen, the Store section, install
links and the signed catalog come from the framework, so every wayBetter app gets them. One signed
catalog serves every app and each shows only its own items (catalog format 2, `apps` per item);
`waybetter store build|sign|verify` builds and signs it. The Store's words are translated as before.
- **Plugin permissions**: plugins declare what they use (`@permissions storage, ui, network:none`);
the plugin API throws on anything undeclared, and the install screen, Store and Plugins list show
it. Older plugins without the line keep working and are labelled "legacy, full page access".
Permissions are a declaration and a guard rail, not a sandbox (see docs/PLUGINS.md).
- **Workspaces**: save the current tabs, splits and decks (with each tab's page, account and pane
theme) under a name and switch back in one click from the titlebar or Ctrl+K. Pick one to open on
start. Switching opens fresh tabs; the tabs you left come back with Ctrl+Shift+T.
- **Backup & sync** (Settings → Backup & sync): export everything you set up (themes incl. account
and pane themes, plugins you enabled and your own plugin files, custom CSS, X tweaks, links,
keyword alerts, decks, workspaces, your account list) into one `.waybetter` file, with drafts only
if you tick "Include drafts". Importing shows what each section would change and applies only the
ones you tick; no account is ever removed. Optional sync through a folder you already sync
(OneDrive, iCloud Drive, Dropbox, a share): encrypted snapshots (Argon2id + XChaCha20-Poly1305,
your passphrase), newer settings from another computer offered for review. No wayBetter server
or account; cookies, X logins, tokens and keys are never included.
- **Plugin commands in Ctrl+K**: plugins can add their actions to the command palette
(`api.commands.register`), listed under the plugin's name and run in the tab you are using. Focus
Mode, Thread Reader and Hide Blue Checks have some.
- **Developer mode** (Settings → Developer, off by default): saving a plugin, `custom.css` or a theme
file reloads it in every X tab at once; syntax and start errors show with file and line.
- **Deck**: a TweetDeck-style deck (Ctrl+Shift+D). Columns of X side by side (Home,
Following, Notifications, Mentions, Search, List, Profile, Bookmarks), each in the account you
pick; unread counts per column and on the deck tab, per-column filters (keywords, `/regex/`,
replies, reposts, media only), pages of whole columns with off-page columns parked in low memory,
a compose dock with X's own composer, and deck keys (`[` `]`, Alt+1–9, Alt+PageUp/PageDown,
Alt+R, Alt+U, Ctrl+Alt+N). Every column is the real x.com; wayBetter never posts, likes or
requests anything for you. Settings → Deck has widths, density, default column flags and
the memory guard. See docs/POWER-USER.md.
- **Make** in the wayBetter panel: build a plugin or a theme from inside the app. Four example
plugins (the smallest one, a scope with post shortcuts, a settings dialog with storage, a
theme-aware badge) in an editor that shows what the Plugins list will read from the header and
warns about a missing header, export or `stop()`; copy or download the file, open the plugins
folder. A gallery opens the real plugin UI kit (toasts, alert, confirm, prompt, dialog) in your
current theme, a live theme API view lists every `--wb-*` variable and the fonts, and PLUGINS.md,
THEMES.md and PLUGIN-IDEAS.md are readable offline. Install a plugin by dropping its file on the
window or copying it into the plugins folder.
- **`npm create waybetter`** (framework): scaffolds a plugin (JavaScript or TypeScript), a theme
file with the schema, or a whole wayBetter app for another site (YouTube, Kick, Twitch, …).
- **More of wayBetter is framework** (`waybetter-host`): backup and sync, workspaces, Google Fonts,
developer mode, keyword alerts and notifications, the gallery and clipboard history, updates and
the hotfix channel, plugin palette commands and the tab bridge now come from the framework, and so
do the native commands for the Store, media, Google Fonts, updates, workspaces, sync, developer
mode and the settings backup (optional command groups an app turns on), so every wayBetter app
gets them. Nothing changes in how wayBetter for X works.
- **The app itself is framework too**: the window, the shell, the tab webviews (accounts, link
routing, pop-ups, downloads, native resize follow), the tab and window commands, account
profiles and the language setting now come from `waybetter-host` (`app::run_app`); wayBetter for
X is its configuration plus the X features. Its security tests use the framework's checks
(`testkit`), `scripts/release.mjs`/`release-macos.mjs` run `waybetter release` with
`waybetter.release.json`, and the X runtime is bundled by `waybetter/build`. New apps from
`npm create waybetter app` get the same. Nothing changes in how wayBetter for X works.
- **The shell is framework too**: tabs in the titlebar, splits and link drags, the address bar, the
new-tab page, Ctrl+K, the account switcher, decks, workspaces, the developer-mode and sync chips,
the gallery/clipboard panel, pane themes and the first-frame colors come from the wayBetter shell
frame (`createShell` in `waybetter/shell/frame`); wayBetter for X describes X to it (its pages,
address chips, search operators, palette items, column kinds, the compose dock, the drafts picker,
the Twitter/X wording). Its words are the framework's, in all 51 languages. `npm create waybetter
app` now gives a new app this same shell. The browser-only workspace preview and the old
declarative plugin SDK it used are gone (the desktop app never loaded them).
### New: accounts, plugins, themes and view
- **Accounts are real logins.** Each account signs in through X in its own profile, stays signed in,
and shows as its @handle and picture in the titlebar switcher.
- **One-click accounts**: clicking an account opens its home feed in a pane beside the current one
(or jumps to its pane if one is already open); Shift-click opens a tab. Everything else (new tab,
use for new tabs, sign out, remove) is in each account's "…" menu.
- **Emoji Picker** (bundled plugin): a searchable emoji picker (Ctrl+Shift+E or the composer toolbar
button) with recent and frequent emoji and skin tones; `:fire:` shortcodes in text boxes where X has
no emoji suggestions of its own.
- **Hide Blue Checks** (now a Reader+ feature): collapses posts from paid-blue accounts into a one-line stub
you can click to show; keeps people you follow, never hides you, optional quotes and gold/grey
organizations, allowlist handles (Alt+Shift+H).
- **Split view with one navigation**: two X panes of the same account share one left rail; the other
pane parks its rail and slides it in from the edge.
- **Links open where you want**: posts and profiles from the timeline can open beside, in a new tab or
in your browser; links to other sites have their own setting.
- **Theme CSS**: every theme has its own CSS editor in Appearance → Customize; it is exported and
saved with the theme (Custom CSS still applies on top of every theme).
- **The wayBetter panel** opens on a home page with what's new and what wayBetter is.
- Plugin API is `window.wayBetter.api` (the old `window.BetterTwttr` keeps working), with new
`account()` and `users.get(handle)` helpers.
- **Plugin UI kit** (`wayBetter.api.ui`): toasts, alerts, confirmations, prompts and dialogs that
look like X's own and follow the current theme (colors, corners, font), live. Keyboard and screen
reader friendly (focus stays inside, Esc/Enter, focus returns), stackable, respects reduced
motion, and a plugin's dialogs close when it stops. `api.toast` now uses it.
- **Theme API for plugins** (`wayBetter.api.theme`): the active theme's colors, corners, font and
light/dark, with change events, and the same values as `--wb-*` CSS variables.
- **Theme JSON Schema** (`waybetter/theme.schema.json`): editors can complete and check theme
files; exported themes point to it.
- **Focus Mode** (now a Navigation+ feature): hides like/repost/view counts, trends and "Who to follow" (or
the whole right column) while you read; Alt+Shift+F.
- **Reply Guard** (now a Compose+ feature): asks before you reply to an old post (30 days by default) or,
if you want, to someone you don't follow; "Reply anyway" opens X's own reply box.
- Hide Blue Checks, Muted Regex, User Notes and Thread Reader use the new dialogs. User Notes are
written in a dialog (from the profile's ··· menu or by clicking the note under the bio).
### Changed
- **The deck is called "Deck"** (it was "Power User Mode"), so it no longer shares a name with the Power User mode.
- **A "Better Twttr" 1.0.x test install is upgraded in place**: the 1.0.0 setup treats it as older, keeps its data and replaces it.
- **Chat+'s find in conversation is Ctrl+Shift+F**; Ctrl+F is the app's own find bar.
- **My Space** (profile customization) is not in this release.
- **Running the Windows setup again opens the app instead of reinstalling it.** If the same or a
newer version is already installed, the setup installs nothing, closes nothing and opens the
installed app (the running window comes up). So a setup file left in Downloads can no longer
replace or downgrade an app that has updated itself since. A newer setup still upgrades in place
and keeps your settings, drafts and logins. To repair an install, run the setup with `/FORCE`.
The installer template now belongs to the wayBetter framework, so every wayBetter app gets this.
### Fixed
- The install screen says where a theme or plugin comes from ("A file you dropped", "Link: …",
"wayBetter Store …") in your language instead of always in English.
- The wayBetter button no longer sits over X's photo/video viewer or X's dialogs, and stays above
X's bottom bar. Thread Reader's "Read thread" button moved into the post page header, so it no
longer covers posts or the reply box in narrow panes.
- **Like/repost/bookmark counts**: X's live count updates no longer leave the count one too high after
a quick like and unlike; spam-clicking ends where your last click did.
- **Follow button stuck on "Follow back" until F5**, and likes, reposts and bookmarks reverting: a page
load X started before your click no longer puts the old state back.
- A like/follow that X rejects (e.g. rate limited) is never reported to X as a success for the clicks
queued behind it; the screen ends on the server's real state.
- **A liked heart could turn invisible** on some themes (white on white).
- Themes: one color foundation for all 14 themes; X's sign-in and sign-up pages are readable on every
theme; XChat bubbles readable.
- Tabs could not be closed (the titlebar painted over the tab strip).
- The window could come back lost, tiny or off-screen.
- Tab icons: the wayBetter bird shows in the tab strip, and a tab never keeps the previous site's icon.
- Videos in the timeline were hidden by the promoted-posts filter.
- The window bar's account switcher and minimize button were not clickable.
### Faster
- Background tabs drop to WebView2's low-memory mode (about 270–350 MB less RAM with two hidden tabs
in our measurements) and return to normal when shown.