Vgmi

July 1, 2025 ยท View on GitHub

Gemini client written in C with vim-like keybindings.

pic0

Keybindings

StandardVimAction
Up ArrowkScroll up
Down Arrowj, EnterScroll down
Ctrl+t-Open a new tab
Ctrl+w-Close the current tab
Ctrl+PgUpgTSwitch to the previous tab
Ctrl+PgDngtSwitch to the next tab
Alt+LefthGo back to the previous page
Alt+RightlGo forward to the next page
HomeggScroll to the top of the page
EndGScroll to the bottom of the page
Ctrl+f/Open search mode
-:Open input mode
-uOpen input mode with the current URL
Ctrl+b-Open about:bookmarks in a new tab
Ctrl+h-Open about:history in a new tab
Ctrl+r, F5-Reload the page
Ctrl+gnJump to next search occurrence
-NJump to previous search occurrence
-[number]TabSelect link
Left mouseTabOpen link
Middle mouseShift+TabOpen link in a new tab

You can prefix a movement key with a number to repeat it.

Commands

CommandDescription
:qClose the current tab
:qaClose all tabs, exit the program
:eRefresh the page
:o [URL]Open an URL
:s [search]Search the Geminispace using the default search engine
:nt [URL]Open a new tab, the URL is optional
:add [name]Add the current URL to the bookmarks, the name is optional
:[number]Scroll to the line number
:gencertGenerate a client-certificate for the current capsule
:forget [host]Forget the certificate for the host
:download [name]Download the current page, the name is optional
:execOpen the current page in an external program
:helpOpen about:help in a new tab

Sandboxing

FreeBSD

On FreeBSD, Vgmi uses capsicum(4) to limit the filesystem and to enter capability mode, it also uses cap_net(3) for networking while in capability mode.

OpenBSD

On OpenBSD, Vgmi uses unveil(2) to limit access to the filesystem and pledge(2) to restrict the capabilities of the program.

Linux

On Linux, Vgmi uses seccomp(2) to restrict system calls and landlock(7) to restrict the filesystem.

Illumos and Solaris

On Illumos and Solaris, Vgmi uses privileges(7) to isolate the parser processes.

In addition to sandboxing the main process, Vgmi forks itself to parse foreign data in completely isolated and sandboxed processes.

Dependencies

  • LibreSSL - fork of OpenSSL developed by the OpenBSD project
  • termbox2 - terminal rendering library

Optional dependency

Building

Executing the build.sh script will download all dependencies and build Vgmi.