mirror of
https://github.com/YGGverse/Yoda.git
synced 2026-03-31 16:45:27 +00:00
Browser for Gemini Protocol
https://crates.io/crates/Yoda
19001965browserclientflatpakgeminigemini-protocolggeminiggemtextgtklibadwaitamarkdownmaxmindnexnex-protocolrustsourceviewsqlitesyntecttitan
| src | ||
| .gitignore | ||
| Cargo.toml | ||
| LICENSE | ||
| README.md | ||
| rustfmt.toml | ||
Yoda - Browser for Gemini protocol
GTK 4 / Libadwaita client written in Rust
Important
Project in development!
Features
Interface
- Multi-tab
- Hotkeys
- Bookmarks
- Build-in multimedia support
- Certificates management
- Downloads
- History
- Proxy
- Session
- Tabs
- Page
- Navigation
- Request
- History
- Navigation
- User settings
Protocols
- Gemini
- Status codes
- Success
20
- Input
10Input11Sensitive input
- Redirection
30Redirection31(partial)
- Temporary failure
- Permanent failure
- Client certificates
- Success
- Gemfeeds
- Status codes
- Nex
Media types
Text
text/geminitext/plain
Images
image/gifimage/jpegimage/pngimage/webp
Audio
audio/mpegaudio/ogg
Video
Build
Requirements
Make sure your system support:
- Glib 2.56+
- GTK 4.10+
- Libadwaita 1.6+
Use rustup installer to setup latest Rust compiler and Cargo package manager:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
Debian
todo
Fedora
sudo dnf install git gcc\
cairo-devel glib2-devel gtk4-devel libadwaita-devel pango-devel\
sqlite-devel
Install
Stable
cargo install Yoda
Repository
git clone https://github.com/YGGverse/Yoda.git
cd Yoda
cargo build
Development
Quick start guide and maintenance protocol
browser
Filesystem
- Use modern path pattern
- One module implements one GTK widget, it may include additional helper files in same location (like template, CSS or DB API)
- For children widget - create children module, located according to hierarchy
Codebase
- Every module should be as minimal as possible, separate:
- different tasks
- massive structures
- structures with implementation
- Every module must:
- encapsulate it members: compose childs and stay composable for parents
- access 1 level of childs, never parents (e.g. through
super) - implement only one public API
structper file (same as one file for one class)- implementable
structis public, where it members - private
- implementable
- contain main
structimplementation:- at least one constructor that must:
- have common for application names:
from,newor/andnew_arc,new_mutex, etc - on return object in container - grant ownership for new
Selfobject created
- have common for application names:
- public
activateaction if the new object can not be activated on construct - public
linkgetter for GTKwidget(parental composition)
- at least one constructor that must:
- Public API oriented to simple (
integer,boolean), standard (std::*) or system-wide (gio,glib, etc) data types usage to reduce internal dependencies from app implementation
Database
- SQLite used to operate with user profile: for example, restore and save widget sessions, manage auth, history, bookmarks, etc
- Database stored in system config directory (could be detected simply using browser tools menu)
- Structure of table should not be modified on
CARGO_PKG_VERSION_PATCHchange - Every
browsermod may have own table, where table must:- contain same name as mod location, for example
app_browser_widgetforsrc/app/browser/widget.rs - every table include autoincrement
idcolumn and parental primary ID if exist- column name for parental ID must have absolute namespace prefix, for example
app_browser_idcolumn forapp_browser_widgettable. For example, if the table has few parental keys, column set could beid,parent_one_id,parent_two_id,some_data
- column name for parental ID must have absolute namespace prefix, for example
- contain same name as mod location, for example
- todo
- version control for auto-migrations
- transactions support for update operations
GTK
- Operate with action objects instead of names like
win.action. This allows to follow encapsulation, by the our goal, module must know nothing about parent presets. For example, define some action in parent, then delegate object created as construction argument - Started refactory on separate widgets implementation to separated mods, because widgets may contain own tables in database and require additional mods dependencies like ORM API todo
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
- new branch created for every new PR
Releases
- Package version in repository should be increased immediately after stable release on crates.io and before apply new changes
- Currently, profile data stored in separated sub-directories, auto-created on every
CARGO_PKG_VERSION_MAJORor/andCARGO_PKG_VERSION_MINORchange