Yoda/README.md
2025-11-10 12:23:42 +02:00

8.4 KiB

Yoda - Browser for Gemini protocol

Privacy-oriented GTK 4 / Libadwaita client written in Rust.

The term Privacy-oriented means that Yoda complies to the Gemini protocol specification and excludes third-party connections, that making it safe to use in combination with I2P. The Yoda browser also includes useful tools, such as flexible proxy configuration, out of the box for use with mesh networks like Yggdrasil, Mycelium, CJDNS, and others. Additionally, it prevents auto-follow external redirection by default and requires manual confirmation, which is currently not clearly specified.

Yoda browser is primarily designed by and for experienced network users who care about their network fingerprints and prefer to control every action manually. It does not run background connections, does not incorporate web-like media preloading without user initiation (unlike some other clients), nor does it automatically check for updates from unexpected network-related servers.

The Gemini protocol was designed as a simple, private alternative to the Web, and Yoda follows this philosophy by providing a graphical user interface (GUI) for seamless navigation in Geminispace, partially inspired by the Firefox UI.

Important

Project in development, for stable version use checkpoint releases!

image

Features

Interface

  • Multi-tab
  • Hotkeys
  • Bookmarks
  • Build-in multimedia support
  • Certificates
    • Server
      • The TOFU validation
    • Client
      • Generate new identity
      • Select for path
      • Export to PEM
      • Import from PEM
      • Delete
  • Custom search providers
  • Downloads
    • Browser window
    • Save page as file
    • Unsupported content type downloads
  • History
    • Recently visited
    • Recently closed
  • Proxy (by SimpleProxyResolver)
    • Multiple regex rules by the priority
    • Custom ignored hosts
    • UI indication with the accent colors
  • Session
    • Window
      • Size
      • Tabs
        • Pin
        • Page
          • Content (cache)
          • Meta
            • Title
          • Navigation
            • Request
            • History
  • User settings

Protocols

  • Gemini
    • Status code
      • Success
        • 20
      • Input
        • 10 Input
        • 11 Sensitive input
      • Redirection
        • 30 Temporary
        • 31 Permanent
      • Temporary failure
        • 40 Unspecified condition
        • 41 Server unavailable
        • 42 CGI error
        • 43 Proxy error
        • 44 Slow down
      • Permanent failure
        • 50 General
        • 51 Not found
        • 52 Gone
        • 53 Proxy request refused
        • 59 Bad request
      • Client certificates
        • 60 Certificate requested
        • 61 Certificate not authorized
        • 62 Certificate not valid
    • Gemtext (by ggemtext)
      • Code (inline/multiline)
        • Inline
        • Multiline
          • Alt
        • Syntax highlight* (by syntect)
        • Terminal emulation* (by ansi-parser)
          • foreground
          • background
          • intensity
          • italic
          • underline
          • blink
          • reversed
          • strikethrough
      • Header
        • H1
        • H2
        • H3
      • Link
        • Address
        • Date
        • Alt
      • List
      • Quote
    • Gemfeed
      • by headers
      • by links
      • by content hash*
    • Titan
      • Binary data (file uploads)
      • Text input
      • Header options
        • MIME
        • Token
  • NEX - useful for networks with build-in encryption (e.g. Yggdrasil or Mycelium)
  • System
    • file:// - local files browser
  • Request prefix
    • download: - save location to file
    • source: - source viewer (by sourceview5)

Media types

Text

  • text/gemini
  • text/plain
  • text/nex

Images

  • image/gif
  • image/jpeg
  • image/png
  • image/webp
  • image/svg+xml

Audio

  • audio/flac
  • audio/mpeg
  • audio/ogg

Video

Build

Linux Dependencies crates.io

Requirements

  • Cairo 1.18+
  • GdkPixBuf 2.42+
  • Glib 2.80+
  • Gtk 4.14+
  • GtkSourceView 5.14+
  • libadwaita 1.5+ (Ubuntu 24.04+)
  • libspelling 0.1+

Debian

sudo apt install git curl build-essential\
                 libgtk-4-dev libgtksourceview-5-dev libglib2.0-dev libadwaita-1-dev libspelling-1-dev\
                 libsqlite3-dev libssl-dev

Fedora

sudo dnf install git curl gcc\
                 gtk4-devel gtksourceview5-devel glib2-devel libadwaita-devel libspelling-devel\
                 sqlite-devel openssl-devel

Rust

Use rustup installer to setup latest Rust compiler and Cargo package manager:

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

Install

Stable

cargo install Yoda
  • run Yoda

Repository

git clone https://github.com/YGGverse/Yoda.git
cd Yoda
cargo build --release
  • run target/release/Yoda

Flatpak

git clone https://github.com/YGGverse/Yoda.git
cd Yoda
flatpak-builder --force-clean build\
                --install-deps-from=flathub\
                --install --repo=repo --user\
                io.github.yggverse.Yoda.yaml
  • launch: flatpak run io.github.yggverse.Yoda
  • bundle: flatpak build-bundle repo Yoda.flatpak io.github.yggverse.Yoda

Development

Contribution

  • Before commit, please make sure:
    • new branch created for every new PR git checkout -b 'contribution-name'
    • new code follows common rustfmt style cargo fmt --check
    • run cargo clippy for final optimization

Contributors

wakatime StandWithUkraine

Localization

UI localization planed as Crowdin repository, but it is not implemented yet.

To install new spell dictionaries in Fedora, use sudo dnf install hunspell-CODE

  • just replace CODE with the locale code you want

Geo-location

To enable geo-location features, get official IP database from MaxMind
then copy following files into the config folder (available from menu)

  • GeoLite2-Country.mmdb
  • GeoLite2-City.mmdb (not implemented yet)

Releases

  • Package version in repository increase after crates.io release
  • Until DB migration not implemented, application will create new profile on every CARGO_PKG_VERSION_MAJOR.CARGO_PKG_VERSION_MINOR change

See also