01 · 셸
가벼운 네이티브 창.
Tauri 2, 시스템 WebView 위에서 동작. 모든 앱에 있었으면 했던 창 기능이에요:
- 탭, 고정 탭, 분할 창: 탭이나 링크를 가장자리로 끌어다 놓기
- 계정마다 전용 프로필, 나란히 로그인
- 링크 여는 위치: 같은 탭, 옆, 새 탭 또는 브라우저
- 주소창과 명령 팔레트 Ctrl K
- 조용히 설치되는 서명된 업데이트
(FOSS) 이제 모든 게 앱이에요.
wayBetter는 이미 쓰고 있는 앱을 가벼운 네이티브 창에 담고, 그 자리에서 확장해요. BetterDiscord가 Discord를 확장하는 것과 같은 방식이에요. 탭, 분할 창, 나란히 놓인 모든 계정, 테마, 플러그인, 그리고 앱 자체의 버그 수정까지. 테마든 플러그인이든 누구나 만들 수 있어요. 다음 앱도 누구나 만들 수 있어요.
Windows용 wayBetter for X 다운로드 · 무료 · GPL-3.0-or-later · 읽거나 게시한 내용에 대한 원격 수집 없음
waybetter의 의존성 0개01 문제
나머지는 가질 수 없어요. 계정을 몇 개 쓸지, 어떻게 보일지, 버그를 언제 고칠지 앱이 정하니까요. wayBetter는 앱을 그대로 두고 나머지 절반을 더해요.
창 하나에 계정 하나. 로그아웃하고, 로그인하고, 또 반복.
모든 계정을 나란히, 전부 동시에 로그인한 채로.
앱에 버그가 있나요? 고쳐 줄 때까지 기다려야죠.
내 컴퓨터에서, 그 자리에서, 오늘 고쳐져요.
그들이 고른 모습. 그들이 내놓은 기능.
누구나 만들 수 있는 테마와 플러그인.
데스크톱 클라이언트마다 통째로 들어 있는 브라우저.
시스템 WebView 위의 가벼운 네이티브 창 하나.
처음부터 가볍게
앱마다 브라우저를 하나씩 더 넣는 대신, 시스템에 이미 있는 WebView 위에 띄운 네이티브 창이에요.
Windows 11에서 wayBetter for X 1.0으로 측정: 설치 파일 크기는 게시된 다운로드 기준, 실행 시간은 3회 실행의 중앙값, 런타임 평가 시간과 긴 작업(>50 ms)은 wayBetter가 있을 때와 없을 때를 각각 측정했어요.
02 하나의 시스템
모든 wayBetter 앱은 같은 시스템이에요. 네이티브 셸, 페이지 안의 런타임, 그리고 그 앱을 아는 작은 어댑터 하나. 앱은 하던 일을 그대로 해요. 프록시를 거치거나 다른 곳에 다시 호스팅되는 것은 없고, 변경은 내 컴퓨터에서만 일어나요.
01 · 셸
Tauri 2, 시스템 WebView 위에서 동작. 모든 앱에 있었으면 했던 창 기능이에요:
02 · 런타임
앱의 페이지에 주입되고, 모든 wayBetter 앱이 함께 써요:
03 · 어댑터
앱을 아는 유일한 부분이에요: 호스트, 레이아웃, 계정 버튼, 그리고 앱이 이미 불러오는 데이터.
SiteSpec과 페이지 SiteAdapter03 첫 번째 앱
진짜 x.com을 탭과 분할 창으로. 모든 계정을 나란히, 14개 테마, 8개 영역 플러그인, 그리고 X가 가진 버그 수정: 서로 엇갈리는 좋아요와 팔로우, 사라지는 초안, 튀는 타임라인. 지금 Windows, macOS, Linux에서 사용할 수 있습니다.
진짜 x.com 위의 탭과 분할 창. 각 계정은 전용 프로필에서 동시에 로그인돼 있어요.
제대로 반영되는 마음에 들어요와 팔로우, 뒤로 가도 유지되는 위치, 튀지 않는 타임라인, 다시 시도되는 업로드.
모든 임시 보관글을 수정 기록과 함께 로컬에 보관하고, X가 잃어버리면 되돌려 놓아요.
색만이 아닌 완전한 재디자인. Reader+, Chat+, Media+ 외 5개 영역 플러그인, 기능마다 스위치 하나.
탭, 계정, 설정, 그리고 연산자 칩을 갖춘 X 검색을 위한 명령 팔레트.
TweetDeck 스타일의 덱: X의 열을 나란히 놓고, 열마다 원하는 계정으로, 필터와 읽지 않은 개수까지.
04 내 것으로 만들기
테마는 JSON 파일 하나예요. 플러그인은 JavaScript 파일 하나고요. 쓰는 데 심사 대기도, 계정도 필요 없어요. 작성하고, 폴더에 넣고, 파일을 공유하거나 스토어에 게시하면 돼요. CSS를 쓸 줄 알면 앱의 모습을 바꿀 수 있어요. JavaScript를 조금 쓸 줄 알면, 끝내 나오지 않던 기능을 직접 더할 수 있어요.
화면 스타일 패널에서 JSON을 가져오고 내보내요. 대비는 자동으로 검사돼서, 어떤 표면 위에서도 글자가 잘 읽혀요.
{
"name": "Deep Sea",
"author": "@you",
"mode": "dark",
"colors": { "bg": "#06141b", "text": "#e6f4f1", "accent": "#2ee6c5" },
"font": { "family": ["Geist"], "scale": 1.02 },
"shape": { "radius": 14, "button": 9999, "avatar": "rounded" },
"layout": { "density": "compact", "cards": true },
"background": { "kind": "pattern", "pattern": "grid",
"ink": "#2ee6c5", "opacity": 0.08, "size": 28 },
"effects": { "hover": "glow" }
}
start()와 stop().BetterDiscord 스타일의 *.plugin.js를 플러그인 폴더에 넣고 설정에서 켜면 돼요. 번거로운 부분은 헬퍼 API가 처리해요.
/**
* @name Copy Quote
* @description y on a focused post copies "@handle: text".
* @version 1.0.0
* @author @you
*/
module.exports = class CopyQuote {
start() {
const api = window.wayBetter.api;
this.scope = api.scope();
this.scope.onKey((event, post) => {
if (event.key !== 'y' || !post) return;
const t = api.tweet(post);
if (t) api.copyText(`@${t.handle}: ${t.text}`)
.then(() => api.toast('Copied'));
});
}
stop() { this.scope.dispose(); }
};
헬퍼 API
storage(ns)observe(sel, fn)onRouteChange(fn)onKey(fn)tweet(el)copyText(s)toast(msg)injectCSS(id, css)waitFor(sel)scope()wayBetter for X에는 열네 개가 함께 제공돼요
05 이 위에 만들기
wayBetter for X를 받치는 페이지 런타임과 셸 모델은 npm에 waybetter로 올라와 있어요. 타입을 갖춘 순수 ESM, 모듈마다 자체 서브패스, 의존성은 0개. 필요한 조각만 가져가도 되고, 앱을 통째로 만들어도 돼요.
npm i waybetter
import { configureRuntime, type SiteAdapter }
from 'waybetter/runtime/site';
export const KICK: SiteAdapter = {
product: 'wayBetter for Kick',
hosts: ['kick.com'],
runtimeGlobal: 'WayBetterKick',
apiMarks: ['/api/'],
// plugins, rail, account, links, themeSources …
};
configureRuntime(KICK);
waybetter/runtime/*
site어댑터의 컴포지션 루트domHubMutationObserver 하나, 프레임 하나netHub모든 기능이 함께 쓰는 fetch/XHR 훅 하나pluginApi사용자 플러그인을 위한 헬퍼themeTokensOKLab 색 모델paneNav분할 보기에서 메뉴 하나만 표시linkRouting옆, 탭 또는 브라우저accountReport로그인된 계정waybetter/shell/*
addressModel주소창 칩paneModel분할 창, 옆에서 열리는 링크linkDrop링크를 놓으면 창이 생겨요palette명령 팔레트 순위profileModel계정 프로필updateModel업데이트 칩windowControls제목 표시줄과 창 조절 버튼chrome제목 표시줄과 도구 모음 크기06 다음은
웹 버전이 있는 앱이라면 같은 창, 테마, 플러그인을 가질 수 있어요. 아래는 다음 후보예요. 발표된 것도, 날짜가 정해진 것도 없어요. 누군가 어댑터를 써 주기를 기다리고 있어요. README의 어댑터 예시는 Kick이에요.
다음 후보일 뿐, 발표된 제품이 아니에요. YouTube, Kick, Twitch, Discord는 각 소유자의 상표이며, 로고는 서비스를 가리키기 위해서만 표시했어요. wayBetter는 이들 중 어느 곳과도 제휴하지 않았고, 승인이나 후원을 받지 않았어요.
07 무료 오픈 소스
유료 요금제도, 광고도, 업셀도 없어요. 지금도, “베타가 끝난 뒤”에도요.
GPL-3.0-or-later. 프레임워크와 앱의 소스는 git.crt.fyi에 공개돼 있어요.
분석도, 읽거나 게시한 내용에 대한 원격 수집도 없어요. 임시 보관글, 설정, 플러그인은 내 컴퓨터에 남아요.
포크하고, 테마를 입히고, 플러그인을 쓰고, 다음 앱을 만들어 보세요. 라이선스가 다음 사람을 위해서도 열린 상태를 지켜 줘요.
08 원칙
앱 자체에 로그인해요. 프록시를 거치거나 다른 곳에 다시 호스팅되는 것은 없고, 변경은 내 컴퓨터에서만 일어나요.
시스템 WebView 위의 Tauri 창. 앱마다 하나, 그 안에 모든 계정.
수정은 내가 한 클릭이 제대로 반영되게 할 뿐이에요. wayBetter가 스스로 게시하거나, 팔로우하거나, 삭제하는 일은 없어요.
업데이트는 서명돼 있고 조용히 설치돼서, 설치 파일을 다시 받지 않아도 수정이 도착해요.