SAYA
Keyboard-First Zen Browser
キーボード中心の静かなブラウザ





Overview
概要Browsers are heavy, noisy and full of trackers. Saya (Urdu for 'shadow') is a minimal, keyboard-first browser that treats privacy as the default: ad and tracker blocking lives in the native navigation layer — filtered in Rust before the page ever loads — not bolted on as an extension you have to find, trust and keep updated. It now ships as a signed, Apple-notarized download for Apple Silicon: drag it in and it just opens.
ブラウザは重く、騒がしく、トラッカーだらけです。Saya(ウルドゥー語で「影」の意)は、プライバシーを標準とする、キーボード中心のミニマルなブラウザです。広告とトラッカーのブロックは、探して信頼し更新し続けなければならない拡張機能ではなく、ネイティブのナビゲーション層に組み込まれており、ページが読み込まれる前にRustで遮断します。Apple Silicon向けに署名・Apple公証済みのダウンロードとして配布しており、ドラッグして入れればそのまま開けます。
I wanted a calm browser where blocking was part of the engine, not a plugin I had to remember to install and keep updated. Every mainstream browser makes privacy your job — add this extension, tick those boxes, keep the lists current. Saya inverts that: the block is the browser's default behaviour, running below the page where a site can't negotiate with it. It began as a sibling to Cinder — the same quiet palette, the same respect for attention — and grew into a browser I actually live in.
ブロックがプラグインではなくエンジンの一部になっている、落ち着いたブラウザが欲しかったのです。主要なブラウザはどれも、プライバシーを利用者の仕事にしています。拡張機能を入れ、設定を選び、リストを最新に保つ必要があります。Sayaはそれを逆にしました。ブロックはブラウザの標準の動作であり、ページの下の層で動くため、サイト側から回避できません。Cinderの姉妹プロジェクトとして、同じ落ち着いた配色と、集中を大切にする考え方から始まり、今では毎日使うブラウザになりました。
How it was built
開発The interesting part is native adblocking: Brave's adblock-rust runs inside the Rust navigation handler, so requests are filtered before the WebView ever sees them — engine-level, not page-level. On top of that sits cosmetic filtering that hides the ad's leftover scaffolding, reader mode that rebuilds an article locally, and private and Tor tabs for when a page shouldn't touch your history at all. The UI is a thin React 19 surface over a single shared native webview, so the whole thing stays small and fast.
特徴はネイティブの広告ブロックです。Braveのadblock-rustをRustのナビゲーションハンドラー内で動かしているため、リクエストはWebViewに届く前に遮断されます。ページ単位ではなく、エンジン単位のブロックです。その上に、広告が消えた後の残骸を隠す要素の非表示、記事をローカルで再構成するリーダーモード、履歴に一切残さないためのプライベートタブとTorタブを備えています。UIは1つの共有ネイティブWebViewの上に載った薄いReact 19の層で、全体を小さく速く保っています。
What it does
機能Brave's adblock-rust filters requests inside the Rust navigation handler — before the page loads, with EasyList and EasyPrivacy — so trackers never leave your machine. No extension to install, trust or keep updated.
Braveのadblock-rustがRustのナビゲーションハンドラー内で、EasyListとEasyPrivacyを使い、ページが読み込まれる前にリクエストを遮断します。トラッカーへの通信は端末の外に出ません。インストールや更新が必要な拡張機能はありません。
Beyond network blocking, Saya hides the leftover ad scaffolding with EasyList's element-hiding rules, and lets you add your own filters in the same syntax.
通信の遮断に加え、EasyListの要素非表示ルールで広告の残骸を隠します。同じ書式で独自のフィルターも追加できます。
One key rebuilds any article into a clean, readable page using Mozilla Readability — extracted locally, with nothing sent anywhere.
キー一つで、Mozilla Readabilityを使って記事を読みやすいページに再構成します。処理はローカルで行い、どこにも送信しません。
Ephemeral private tabs that never touch your history, plus optional Tor tabs routed through an embedded Arti client for .onion access.
履歴に一切残らない一時的なプライベートタブと、組み込みのArtiクライアントを経由して.onionにもアクセスできるTorタブ。
Toggle JavaScript per site, clear a single site's cookies and storage, or wipe browsing data across a time window — the privacy controls are always one click away.
サイトごとにJavaScriptを切り替えたり、そのサイトのCookieとストレージを消去したり、期間を指定して閲覧データを消去したりできます。プライバシーの操作はいつでもワンクリックです。
Capture an entire scrolling page and export it as a PNG, JPEG or multi-page PDF, saved wherever you choose.
スクロールするページ全体を撮影し、PNG、JPEG、複数ページのPDFとして好きな場所に保存できます。
A ⌘K fuzzy palette over tabs, history and bookmarks, plus find-in-page — the whole browser is reachable from the home row.
タブ、履歴、ブックマークをあいまい検索できる⌘Kのパレットと、ページ内検索。ブラウザのすべての操作にホームポジションから届きます。
Bookmarks with folders, in-place editing and one-click Chrome import, and a frecency-ranked address bar that learns what you actually open.
フォルダー、その場での編集、ワンクリックでのChromeからの取り込みに対応したブックマークと、よく開くページを学習するアドレスバー。
Tauri 2 over WebKit (macOS) / WebView2 (Windows) keeps it small and fast, with native macOS chrome and fullscreen — shipped as a signed, Apple-notarized DMG.
WebKit(macOS)/WebView2(Windows)上のTauri 2で小さく速く動作し、macOSネイティブのタイトルバーとフルスクリーンに対応します。署名・Apple公証済みのDMGで配布しています。
Under the hood
技術の詳細Adblock in the engine, not an extension拡張機能ではなくエンジンで広告をブロック
Brave's adblock-rust runs inside the Rust navigation handler, so trackers and ads are filtered before the WebView ever sees the request — EasyList and EasyPrivacy loaded at the engine level. Blocking is the browser's default here, not a plugin you have to remember to install and keep current.
Braveのadblock-rustをRustのナビゲーションハンドラー内で動かしているため、トラッカーや広告はWebViewがリクエストを受け取る前に遮断されます。EasyListとEasyPrivacyはエンジン単位で読み込まれます。ここではブロックがブラウザの標準の動作であり、覚えておいて入れ、更新し続けなければならないプラグインではありません。
Cosmetic filtering, driven by the pageページに合わせた要素の非表示
Network blocking kills the request; cosmetic filtering hides what's left. Saya injects EasyList's element-hiding rules per site, then the page reports back its own classes and ids so the engine returns only the generic selectors that actually match — the bulk of element-hiding, computed lazily instead of shipping the whole list to every page.
通信の遮断でリクエストは止まり、要素の非表示で残ったものを隠します。SayaはサイトごとにEasyListの要素非表示ルールを挿入し、ページが自分のクラスとIDを報告すると、エンジンは実際に一致する汎用セレクターだけを返します。リスト全体をすべてのページに送るのではなく、必要な分だけをその場で計算します。
One shared webview, by design1つのWebViewを共有する設計
Every tab is a URL in React state over a single native webview that's repositioned on switch. It's a deliberate trade — it sidesteps a WebView2 re-entrancy deadlock when creating webviews from a command handler, and keeps memory flat — at the cost of per-tab scroll state, which a zen browser with no background tabs can live without.
各タブはReactの状態に保持したURLで、1つのネイティブWebViewの位置を切り替えて表示します。これは意図的な選択で、コマンドハンドラーからWebViewを作成する際のWebView2の再入によるデッドロックを避け、メモリ使用量を一定に保てます。代わりにタブごとのスクロール位置は失われますが、バックグラウンドタブを持たない静かなブラウザでは問題になりません。
Private and Tor, properly separatedプライベートとTorを確実に分離
Private tabs use an ephemeral data store that never persists cookies or history. Tor tabs go further: traffic routes through an embedded Arti client — Tor implemented in Rust, running locally — with a per-tab SOCKS proxy and .onion resolution, so the developer never sees it and it never touches your normal connection.
プライベートタブは、Cookieも履歴も保存しない一時的なデータストアを使います。Torタブはさらに、組み込みのArtiクライアント(Rustで実装されたTor)をローカルで動かして通信を経由させ、タブごとのSOCKSプロキシと.onionの名前解決に対応します。開発者が通信を見ることはなく、通常の接続にも影響しません。
Signed, notarized, cross-platform core署名・公証済みで、コアはクロスプラットフォーム
The Rust core and adblock-rust integration are platform-agnostic; only the shell differs (WKWebView on macOS, WebView2 on Windows). The macOS build ships as a hardened-runtime, Developer-ID-signed and Apple-notarized DMG, so it opens with no Gatekeeper warnings — verified end-to-end with spctl and stapler.
Rustのコアとadblock-rustの統合はプラットフォームに依存せず、異なるのはシェル(macOSはWKWebView、WindowsはWebView2)だけです。macOS版はHardened Runtime・Developer ID署名・Apple公証済みのDMGとして配布しており、Gatekeeperの警告なしに開けます。spctlとstaplerで一通り検証しています。
Stack
技術構成Saya is Tauri 2 + Rust over wry — WKWebView on macOS, WebView2 on Windows — with a React 19 + Tailwind UI. Ad and tracker filtering runs in the navigation handler through Brave's adblock-rust with EasyList and EasyPrivacy, so it is engine-level; cosmetic rules and user custom filters hide whatever's left in the page. Tabs share one native webview that's repositioned on switch — a deliberate trade to sidestep a WebView2 re-entrancy deadlock and keep memory flat. Private tabs are ephemeral; Tor tabs route through an embedded Arti client (Tor in Rust) with a per-tab SOCKS proxy and .onion resolution. Full-page capture reads monitor pixels via xcap and exports PNG/JPEG or PDF (printpdf). It ships as a hardened-runtime, Developer-ID-signed and Apple-notarized DMG for Apple Silicon.
SayaはTauri 2+Rustで、wryの上に構築しています(macOSではWKWebView、WindowsではWebView2)。UIはReact 19とTailwindです。広告とトラッカーの遮断は、ナビゲーションハンドラー内でBraveのadblock-rustとEasyList、EasyPrivacyにより行うため、エンジン単位で動作します。要素非表示のルールと独自のフィルターで、ページ内に残ったものも隠します。タブは1つのネイティブWebViewを共有し、切り替え時に位置を変えています。これはWebView2の再入によるデッドロックを避け、メモリ使用量を一定に保つための意図的な選択です。プライベートタブは一時的なデータストアを使い、Torタブは組み込みのArtiクライアント(Rust製のTor)を経由し、タブごとのSOCKSプロキシと.onionの名前解決に対応します。ページ全体のキャプチャはxcapで画面のピクセルを読み取り、PNG/JPEGまたはPDF(printpdf)で書き出します。Apple Silicon向けに、Hardened Runtime・Developer ID署名・Apple公証済みのDMGとして配布しています。
Where it is now
現状と今後Saya now ships as a signed, Apple-notarized DMG for Apple Silicon — engine-level adblock, reader mode, private and Tor tabs, and a keyboard-first surface, all on a small Tauri/Rust core that also targets Windows via WebView2. The natural next steps are a universal (Intel + Apple Silicon) build and Microsoft Store packaging, since the Rust core and adblock-rust integration are platform-agnostic.
Sayaは現在、Apple Silicon向けの署名・Apple公証済みDMGとして配布しています。エンジン単位の広告ブロック、リーダーモード、プライベートタブとTorタブ、キーボード中心の操作を、WebView2経由でWindowsにも対応できる小さなTauri/Rustのコアで実現しています。Rustのコアとadblock-rustの統合はプラットフォームに依存しないため、次はユニバーサル(IntelとApple Silicon)ビルドとMicrosoft Store向けのパッケージです。
Changelog
更新履歴- Blocking — Engine-level ad & tracker filtering via Brave's adblock-rust in the Rust navigation handler (EasyList + EasyPrivacy), plus cosmetic element-hiding and user-supplied custom filter rules.ブロック — Braveのadblock-rustをRustのナビゲーションハンドラー内で使い、エンジン単位で広告とトラッカーを遮断(EasyListとEasyPrivacy)。要素の非表示と独自のフィルタールールにも対応。
- Reader — One-key reader mode rebuilds any article locally with Mozilla Readability; nothing is sent anywhere.リーダー — キー一つのリーダーモードで、Mozilla Readabilityにより記事をローカルで再構成。どこにも送信しません。
- Private browsing — Ephemeral private tabs that never touch history, plus optional Tor tabs routed through an embedded Arti client for .onion access.プライベートブラウジング — 履歴に残らない一時的なプライベートタブと、組み込みのArtiクライアントを経由して.onionにアクセスできるTorタブ(任意)。
- Controls — Per-site JavaScript toggle, clear-site-cookies, and clear-browsing-data across time windows.設定 — サイトごとのJavaScriptの切り替え、サイトのCookieの消去、期間を指定した閲覧データの消去。
- Capture — Full-page screenshots exported as PNG, JPEG or multi-page PDF.キャプチャ — ページ全体のスクリーンショットをPNG、JPEG、複数ページのPDFで書き出し。
- Navigation — Command palette (⌘K), find-in-page, a frecency-ranked address bar, bookmarks with folders + in-place editing + Chrome import, and session restore.ナビゲーション — コマンドパレット(⌘K)、ページ内検索、利用頻度と新しさで並べるアドレスバー、フォルダー・その場での編集・Chromeからの取り込みに対応したブックマーク、セッションの復元。
- Window — Native macOS title-bar chrome and fullscreen, with YouTube/element fullscreen working both in and out of the app's own fullscreen.ウィンドウ — macOSネイティブのタイトルバーとフルスクリーン。YouTubeなどの要素のフルスクリーンは、アプリ自体がフルスクリーンかどうかにかかわらず動作。
- Distribution — Shipped as a hardened-runtime, Developer-ID-signed and Apple-notarized DMG for Apple Silicon.配布 — Apple Silicon向けに、Hardened Runtime・Developer ID署名・Apple公証済みのDMGとして配布。
Saya is a statement that privacy belongs in the engine, not in a plugin you have to remember to install — the block should be the browser's job, not yours.
Sayaは、プライバシーは覚えておいて入れるプラグインではなく、エンジンにあるべきだという主張です。ブロックは利用者ではなく、ブラウザの仕事であるべきです。