PHPackages                             yggverse/yoda - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Parsing &amp; Serialization](/categories/parsing)
4. /
5. yggverse/yoda

ActiveProject[Parsing &amp; Serialization](/categories/parsing)

yggverse/yoda
=============

PHP-GTK Client for Gemini Protocol

190[8 issues](https://github.com/YGGverse/Yoda/issues)RustCI passing

Since Sep 19Pushed 1mo ago3 watchersCompare

[ Source](https://github.com/YGGverse/Yoda)[ Packagist](https://packagist.org/packages/yggverse/yoda)[ RSS](/packages/yggverse-yoda/feed)WikiDiscussions master Synced 1mo ago

READMEChangelog (9)DependenciesVersions (1)Used By (0)

Yoda - Browser for [Gemini protocol](https://geminiprotocol.net)
================================================================

[](#yoda---browser-for-gemini-protocol)

[![Yoda browser logo](https://raw.githubusercontent.com/YGGverse/Yoda/refs/heads/master/data/io.github.yggverse.Yoda.svg)](https://raw.githubusercontent.com/YGGverse/Yoda/refs/heads/master/data/io.github.yggverse.Yoda.svg)

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

The term *Privacy-oriented* means that Yoda complies to the [Gemini protocol specification](https://geminiprotocol.net/docs/protocol-specification.gmi) and excludes third-party connections, that making it safe to use in combination with I2P. It also includes useful tools, such as connection details, optional DNS/Geo-IP features, flexible proxy configuration for use with modern IPv6 mesh networks like Yggdrasil, Mycelium, CJDNS, and others.

Yoda browser is primarily designed by and for experienced network users who care about their fingerprints and prefer to control every action manually. It does not preload tab content on app opening, does not run any background connections, does not incorporate web-like media preloading without user initiation, and does not automatically check for updates, even from 'official' servers. Additionally, it prevents auto-follow external redirection by default and requires manual confirmation, which is currently not clearly specified.

The Gemini protocol was designed as a minimalistic, tracking-resistant alternative to the Web, and Yoda embraces this philosophy by providing a straightforward graphical user interface (GUI) that is partially inspired by the Firefox UI, making it intuitively comfortable for regular users.

Important

Project in development, for stable version use checkpoint [releases](https://github.com/YGGverse/Yoda/releases)!

[![image](https://private-user-images.githubusercontent.com/108541346/375604055-cfbbc3fb-61d2-4afd-a21f-8e36ee329941.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NzM5MDc4MDUsIm5iZiI6MTc3MzkwNzUwNSwicGF0aCI6Ii8xMDg1NDEzNDYvMzc1NjA0MDU1LWNmYmJjM2ZiLTYxZDItNGFmZC1hMjFmLThlMzZlZTMyOTk0MS5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjYwMzE5JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI2MDMxOVQwODA1MDVaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT0xMTZjYmM1ODFiOTJkN2YxYjBjNWFlN2VlZmFhMTFkNDNjNDdiNjVkZDk3YjVkNWQwMmFmNTMxNTZmMTMzNTNmJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.bIkZe9ofPAASwdTU1o5aPL6ywHyufq_ZDG9ugbQUiCo)](https://private-user-images.githubusercontent.com/108541346/375604055-cfbbc3fb-61d2-4afd-a21f-8e36ee329941.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NzM5MDc4MDUsIm5iZiI6MTc3MzkwNzUwNSwicGF0aCI6Ii8xMDg1NDEzNDYvMzc1NjA0MDU1LWNmYmJjM2ZiLTYxZDItNGFmZC1hMjFmLThlMzZlZTMyOTk0MS5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjYwMzE5JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI2MDMxOVQwODA1MDVaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT0xMTZjYmM1ODFiOTJkN2YxYjBjNWFlN2VlZmFhMTFkNDNjNDdiNjVkZDk3YjVkNWQwMmFmNTMxNTZmMTMzNTNmJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.bIkZe9ofPAASwdTU1o5aPL6ywHyufq_ZDG9ugbQUiCo)

Features
--------

[](#features)

### Interface

[](#interface)

- Multi-tab
- Hotkeys
- Bookmarks
- Build-in multimedia support
    - [Images](#images)
    - [Audio](#audio)
    - [Video](#video)
- Certificates
    - Server
        - The [TOFU](https://en.wikipedia.org/wiki/Trust_on_first_use) 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](https://docs.gtk.org/gio/class.SimpleProxyResolver.html))
    - 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

[](#protocols)

- [Gemini](https://geminiprotocol.net/docs/protocol-specification.gmi)
    - [Status code](https://geminiprotocol.net/docs/protocol-specification.gmi#status-codes)
        - 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](https://geminiprotocol.net/docs/gemtext-specification.gmi) (by [ggemtext](https://crates.io/crates/ggemtext))
        - Code (inline/multiline)
            - Inline
            - Multiline
                - Alt
            - Syntax highlight\* (by [syntect](https://crates.io/crates/syntect))
            - Terminal emulation\* (by [ansi-parser](https://crates.io/crates/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](https://transjovian.org/titan/page/The%20Titan%20Specification)
        - Binary data (file uploads)
        - Text input
        - Header options
            - MIME
            - Token
- [NEX](https://nightfall.city/nex/info/specification.txt) - useful for networks with build-in encryption (e.g. [Yggdrasil](https://yggdrasil-network.github.io) or [Mycelium](https://github.com/threefoldtech/mycelium))
    - [NPS](https://nightfall.city/nps/info/specification.txt)
- System
    - `file://` - local files browser
- Request prefix
    - `download:` - save location to file
    - `source:` - source viewer (by [sourceview5](https://crates.io/crates/sourceview5))

### Media types

[](#media-types)

#### Text

[](#text)

- `text/gemini`
- `text/markdown`
- `text/nex`
- `text/plain`

#### Images

[](#images)

- `image/gif`
- `image/jpeg`
- `image/png`
- `image/webp`
- `image/svg+xml`

#### Audio

[](#audio)

- `audio/flac`
- `audio/mpeg`
- `audio/ogg`

#### Video

[](#video)

Build
-----

[](#build)

[![Linux](https://github.com/YGGverse/Yoda/actions/workflows/linux.yml/badge.svg)](https://github.com/YGGverse/Yoda/actions/workflows/linux.yml/badge.svg)[![Dependencies](https://camo.githubusercontent.com/5705f0a274ec8f9b9446ae16954a41ad2167e5a9dd00824cd1584252b8d56f57/68747470733a2f2f646570732e72732f7265706f2f6769746875622f59474776657273652f596f64612f7374617475732e737667)](https://deps.rs/repo/github/YGGverse/Yoda)[![crates.io](https://camo.githubusercontent.com/8934fbe229424a9b3fbbcd223be6cc99dbcd95b83b2e386db86b752475728eeb/68747470733a2f2f696d672e736869656c64732e696f2f6372617465732f762f596f64612e737667)](https://crates.io/crates/Yoda)

### Requirements

[](#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

[](#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

[](#fedora)

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

#### Rust

[](#rust)

Use [rustup](https://rustup.rs) installer to setup latest Rust compiler and Cargo package manager:

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

### Install

[](#install)

#### Stable

[](#stable)

```
cargo install Yoda
```

- run `Yoda`

#### Repository

[](#repository)

```
git clone https://github.com/YGGverse/Yoda.git
cd Yoda
cargo build --release
```

- run `target/release/Yoda`

#### Flatpak

[](#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
-----------

[](#development)

### Contribution

[](#contribution)

- Before commit, please make sure:
    - new branch created for every new PR `git checkout -b 'contribution-name'`
    - new code follows common [rustfmt](https://rust-lang.github.io/rustfmt/) style `cargo fmt --check`
    - run `cargo clippy` for final optimization

#### Contributors

[](#contributors)

[![StandWithUkraine](https://raw.githubusercontent.com/vshymanskyy/StandWithUkraine/main/badges/StandWithUkraine.svg)](https://raw.githubusercontent.com/vshymanskyy/StandWithUkraine/main/badges/StandWithUkraine.svg)

### Localization

[](#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

[](#geo-location)

To enable geo-location features, get official IP database from [MaxMind](https://www.maxmind.com)
then copy following files into the `config` folder (available from menu)

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

### Releases

[](#releases)

- Package version in repository increase after [crates.io](https://crates.io/crates/yoda) release
- Until DB migration not implemented, application will create new profile on every `CARGO_PKG_VERSION_MAJOR`.`CARGO_PKG_VERSION_MINOR` change

### See also

[](#see-also)

- [ggemtext](https://github.com/YGGverse/ggemtext) - Glib-oriented [Gemtext](https://geminiprotocol.net/docs/gemtext-specification.gmi) API
- [ggemini](https://github.com/YGGverse/ggemini) - Glib-oriented client for [Gemini protocol](https://geminiprotocol.net/docs/protocol-specification.gmi)

###  Health Score

22

—

LowBetter than 22% of packages

Maintenance50

Moderate activity, may be stable

Popularity8

Limited adoption so far

Community11

Small or concentrated contributor base

Maturity17

Early-stage or recently created project

 Bus Factor1

Top contributor holds 50% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

### Community

Maintainers

![](https://www.gravatar.com/avatar/67b0f652ebac064d26ca06ba5fd4271fab0ac5482d6c2d4865b8f3697721bc31?d=identicon)[d47081](/maintainers/d47081)

![](https://www.gravatar.com/avatar/d4eafa818f51a43c026ee538ac36192684eef5e128e1eac8d622b74d1bfd4de4?d=identicon)[YGGverse](/maintainers/YGGverse)

---

Top Contributors

[![d47081](https://avatars.githubusercontent.com/u/108541346?v=4)](https://github.com/d47081 "d47081 (3 commits)")[![oooo-ps](https://avatars.githubusercontent.com/u/214454192?v=4)](https://github.com/oooo-ps "oooo-ps (3 commits)")

---

Tags

19001965browserclientflatpakgeminigemini-protocolggeminiggemtextgtklibadwaitamarkdownmaxmindnexnex-protocolrustsourceviewsqlitesyntecttitan

### Embed Badge

![Health badge](/badges/yggverse-yoda/health.svg)

```
[![Health](https://phpackages.com/badges/yggverse-yoda/health.svg)](https://phpackages.com/packages/yggverse-yoda)
```

###  Alternatives

[mtdowling/jmespath.php

Declaratively specify how to extract elements from a JSON document

2.0k472.8M135](/packages/mtdowling-jmespathphp)[opis/closure

A library that can be used to serialize closures (anonymous functions) and arbitrary data.

2.6k230.0M284](/packages/opis-closure)[masterminds/html5

An HTML5 parser and serializer.

1.8k242.8M229](/packages/masterminds-html5)[sabberworm/php-css-parser

Parser for CSS Files written in PHP

1.8k191.2M65](/packages/sabberworm-php-css-parser)[michelf/php-markdown

PHP Markdown

3.5k52.4M345](/packages/michelf-php-markdown)[jms/metadata

Class/method/property metadata management in PHP

1.8k152.8M88](/packages/jms-metadata)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
