RustyWolf/README.md
dvorakmortonxd 56f548bd1d compat: persist cookies so consent/login survive restarts, use native UA by default
- tab webviews now share a WebContext backed by the profile dir
  (~/.local/share/RustyWolf); WebKitGTK keeps cookies in memory unless a
  persistent store is set, which made youtube.com re-show the consent
  wall on every launch and made logins impossible to keep
- default user agent is WebKit's native one instead of the malformed
  fake-Chrome + RustyWolf string that pushed sites into Chromium-only
  code paths; --ua-chrome adds a clean Chrome UA as fallback
- --private keeps using an ephemeral in-memory session
- README: document --ua-chrome and the persistent profile
2026-10-11 18:51:41 +02:00

212 lines
6.8 KiB
Markdown

# RustyWolf
RustyWolf is a minimal, privacy-focused browser shell built with Rust + system webviews.
(complete honesty, this whole thing is vibecoded, however I never paid for any ai service (I got a free student plan for a year) so if you wanna avoid AI slop, just skip this but I never contributed to the AI BOOM with my money, if you wanna contribute, feel free to do so)
- macOS: native `WKWebView`
- Linux: `WebKitGTK`
- Windows: `WebView2`
No Firefox install. No extension system. Fast startup, clean UI.
<img
alt="image"
src="https://git.dvorakmortonxd.dev/dvorakmortonxd/RustyWolf/raw/branch/main/preview.png"
style="width: 100%; max-width: 1920px; aspect-ratio: 18 / 9; object-fit: contain; height: auto;"
/>
## What It Does
- Really, I mean really lightweight! the reason I even made this is because I need a lightweight browser to run on my old macbook unibody 2010 4gb ddr3
- So light in fact in my gentoo(openrc)+i3wm setup it took only 285mb ram with one tab open (dvorakmortonxd.dev) compared to firefox which took 866mb ram
- THATS 3.04 TIMES AS MUCH RAM, so yeah it is light
- tabs have a toggle for Keeping-in-ram (`K`), it basically just saves the url if its off and reloads it on reclick, if you toggle it on it keeps the whole page in ram.
- Privacy-first defaults: DuckDuckGo home + search fallback from the URL bar
- Multi-tab browsing with back, forward, reload, and keyboard shortcuts (`Ctrl/Cmd+T`, `W`, `L`)
- Built-in custom adblock with top-bar toggle (`ADS`)
- Popup permission gate: asks before a site opens a new tab
- Download support with live progress panel (`D`) and session download history
- Properties page with session browsing history + download history
- Default window size `1000x600` (still fully resizable)
- Optional `--private` mode when backend support is available
## Run
```bash
cargo run --
```
```bash
cargo run -- --url https://example.com
cargo run -- --url example.com
cargo run -- --title "RustyWolf"
cargo run -- --private
cargo run -- --dry-run
# compatibility
cargo run -- --ua-chrome # Chrome UA for sites that block WebKit
# Linux backend controls
cargo run -- --linux-backend x11
cargo run -- --linux-backend wayland
cargo run -- --linux-disable-dmabuf
cargo run -- --linux-backend x11 --linux-disable-dmabuf
```
Sessions are persistent: cookies and site data live in `~/.local/share/RustyWolf`,
so logins and consent choices survive restarts. `--private` gives an ephemeral
session instead. The default user agent is WebKit's native one (best match for
the engine); `--ua-chrome` is a last-resort fallback for sites that refuse to
run on WebKit.
## Privacy Notes
RustyWolf applies baseline hardening in page context:
- `navigator.doNotTrack = "1"`
- disables legacy `openDatabase`
- disables `RTCPeerConnection`
Adblocking is built-in and lightweight. It is not full uBlock Origin parity.
# Linux Setup (prerequisites)
Install WebKitGTK development/runtime packages before building.
## Debian
```bash
sudo apt update
sudo apt install -y libwebkit2gtk-4.1-dev libgtk-3-dev build-essential pkg-config git appmenu-gtk3-module appmenu-gtk2-module
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source "$HOME/.cargo/env"
```
## Arch
```bash
sudo pacman -Sy
sudo pacman -S --needed webkit2gtk-4.1 gtk3 base-devel pkgconf git appmenu-gtk-module
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source "$HOME/.cargo/env"
```
## Gentoo
(u can replace doas with sudo btw)
```bash
doas emerge --sync
doas emerge --ask net-libs/webkit-gtk:4.1 x11-libs/gtk+ virtual/pkgconfig dev-vcs/git x11-misc/appmenu-gtk-module
doas mkdir -p /etc/portage/package.use
echo ">=media-libs/gst-plugins-base-1.24.13-r1 gbm" | doas tee /etc/portage/package.use/rustywolf-media
doas emerge --ask 'media-libs/gst-plugins-base[gbm]' media-plugins/gst-plugins-soup media-plugins/gst-plugins-vpx media-plugins/gst-plugins-hls media-plugins/gst-plugins-dash media-plugins/gst-plugins-libav
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source "$HOME/.cargo/env"
```
For NVIDIA, make the DRM modeset setting part of the boot command line, not only
`/etc/modprobe.d`, then reboot:
```bash
doas cp /etc/default/grub /etc/default/grub.bak
doas sed -i 's/^#GRUB_CMDLINE_LINUX=""/GRUB_CMDLINE_LINUX="nvidia-drm.modeset=1 nvidia-drm.fbdev=1"/' /etc/default/grub
doas grub-mkconfig -o /boot/grub/grub.cfg
doas reboot
```
After reboot, verify the active command line:
```bash
cat /proc/cmdline
```
## Linux media playback deps (important)
If Linux logs `gstreamer element autoaudiosink not found` or YouTube/audio fails, install GStreamer audio/video plugins.
Debian/Ubuntu/Pop!_OS example:
```bash
sudo apt update
sudo apt install -y gstreamer1.0-tools
sudo apt install -y gstreamer1.0-plugins-base gstreamer1.0-plugins-good
sudo apt install -y gstreamer1.0-plugins-bad gstreamer1.0-libav
sudo apt install -y gstreamer1.0-pulseaudio gstreamer1.0-pipewire gstreamer1.0-alsa
```
Verify the sink exists:
```bash
gst-inspect-1.0 autoaudiosink
```
If your distro is not Debian-based, install the equivalent GStreamer base/good/bad/libav + audio sink plugin packages.
# Linux Troubleshooting (Wayland/X11)
RustyWolf supports both X11 and native Wayland on Linux.
Some NVIDIA + WebKitGTK stacks can fail with dmabuf/gbm allocation errors, especially on Wayland.
On NVIDIA X11, RustyWolf disables WebKitGTK's broken dmabuf renderer automatically.
This avoids the blank webview/GBM allocation failure while keeping GStreamer media
codecs available for sites such as YouTube.
Try these launch modes:
```bash
# auto backend (also applies the NVIDIA/X11 WebKitGTK fallback when needed)
cargo run
# native wayland
cargo run -- --linux-backend wayland
# X11/XWayland
cargo run -- --linux-backend x11
# last-resort compatibility fallback
cargo run -- --linux-disable-dmabuf
# force the upstream dmabuf renderer anyway
WEBKIT_FORCE_DMABUF_RENDERER=1 cargo run
```
If you still see `Failed to load module "appmenu-gtk-module"`, that is a desktop GTK setup issue (not a RustyWolf crash).
Debian/Ubuntu/Pop!_OS fix:
```bash
sudo apt update
sudo apt install -y appmenu-gtk3-module appmenu-gtk2-module
```
If you do not want global appmenu integration, remove `appmenu-gtk-module` from GTK settings files:
```bash
~/.config/gtk-3.0/settings.ini
/etc/gtk-3.0/settings.ini
/etc/xdg/gtk-3.0/settings.ini
```
# MacOS
## installing Homebrew (skip if already installed)
```bash
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```
# Windows Setup
Install the Microsoft Edge WebView2 Runtime (Evergreen), then build normally with Rust MSVC toolchain.
- WebView2 Runtime: https://developer.microsoft.com/microsoft-edge/webview2/
- Rust toolchain target: `x86_64-pc-windows-msvc`
## Dev Quick Checks
```bash
cargo fmt
cargo check
cargo test
```