Graphical small-internet client for windows, linux, MacOS X and BSDs. Supports gemini, http, https, gopher, finger.



A high-quality visual cross-platform gemini browser.

Preview Image



Generates Outlines

Outline Generation

Fully Customizable Site Theme

Site Theme

Build/Install Instructions

Note: master branch is the latest development status (sometimes called "nightly") whereas the tagged versions are the stable releases.

If you want to build a stable experience, check out the latest version and build that!



  • Thanks to James Tomasino for helping out with understanding gopher
  • Thanks to Vane Vander for providing the Haiku build instructions
  • Thanks to James Tomasino, styan and tiwesdaeg for improving the Makefile
  • Thanks to Alex Naskos for providing windows build instructions
  • Thanks to tiwesdaeg for improving the application icon


See src/about/updates.gemini




Kristall is released under the GPLv3 or (at your option) any later version. See LICENSE as well

  • Protocol Violation error on conforming server response

    Protocol Violation error on conforming server response

    Hey! On a non existent resource request, my Gemini server responds with the following:

    51 \r\l

    The Gemini protocol states, that


    Status codes beginning with 5 are PERMANENT FAILURE status codes, meaning:

    "The request has failed. There is no response body. The nature of the failure is permanent, i.e. identical future requests will reliably fail for the same reason. The contents of META may provide additional information on the failure, and should be displayed to human users. Automatic clients such as aggregators or indexing crawlers should not repeat this request."

    As of my understanding, the META may be empty, so "51 \r\l" is a valid response. But Kristall shows the following error message:

    Protocol Violation The server did not serve the content you requested in a well-defined manner and Kristall could not process the data sent. Line is too short for valid protocol

    opened by janicetr 8
  • Support mouse buttons 4 and 5 for back and forward

    Support mouse buttons 4 and 5 for back and forward

    Just noticed that I can't use the extra buttons on my mouse to move backwards and forwards in the history, as I usually can in browsers. It would be a nice addition :)

    opened by ryliejamesthomas 7
  • Relative links in HTTP+HTML mode seem to not originate from current directory

    Relative links in HTTP+HTML mode seem to not originate from current directory

    Current URI: "" Href attribute of clicked link: "somesite.html" URI kristall is trying to access: "" Expected URI: ""

    Update: When the current URI has either a "/" or a filename at the end, it does seem to work. The current problem seems to be the name of the folder that does not end with a "/"

    opened by waweic 7
  • Man page documents

    Man page documents

    This PR adds a man page generation script. On Linux man pages are considered the go-to help resource by many, so I feel it's a good idea to create one

    Currently, the script looks at the gemtext about:help document, and converts it to the man roff format. A 'head' and 'tail' are also added with manpage-specific things (flags, etc) in them.

    I've opened this as a draft as there is mostly likely stuff that will have to be changed before actually merging this.

    Things to consider:

    • Currently, the script strips out the first and last 7 lines of the about:help document which don't really belong in the man page. I think there is a better approach to handling this.
    • Not yet added to a make target, so it doesn't get generated automatically yet
    • We need to work out where to actually store the man page when running make install. Might be /usr/share/man/man1?

    Suggestions are appreciated!

    opened by mikejzx 6
  • Makefile: do not assume directories exist

    Makefile: do not assume directories exist

    Hi! Build is going well until it tries to install icons.

    On my system, /usr/share/icons/hicolor/ and subdirectories do not exist. The simple workaround is obviously to create

    share/icons/hicolor/scalable/apps share/icons/hicolor/16x16/apps share/icons/hicolor/32x32/apps share/icons/hicolor/64x64/apps share/icons/hicolor/128x128/apps share/applications

    But if those could be created in the makefile it would maybe help others.


    opened by nico202 6
  • Confused by MacOS installation instructions

    Confused by MacOS installation instructions

    I am trying to install Kristall on MacOS/Catalina, but the instructions are pretty cryptic:

    "Use the Makefile to build build/kristall instead of the default target. There is currently no auto-recognition of MacOS (where qmake will output a file), so you have to be a bit more manual."

    I cloned the Kristall repo and know how to edit Makefile. I also installed qt5 and qt-editor via Homebrew. But now I am stuck - apparently I need to install "widgets and network modules," which I have no idea how to do, while it isn't at all clear how I have to edit the Makefile.

    Is this app only for experienced qt users? If not, I'd be grateful for some more helpful instructions.

    help wanted 
    opened by mroberts1 6
  • Light icons for dark themes

    Light icons for dark themes

    I'm using the OS Default theme and the black icons can be hard to see depending on the area:


    An option to switch icons to a white variant for dark theme users would help.

    opened by Aicaya 6
  • Unable to build 0.3 on Ubuntu 20.04.

    Unable to build 0.3 on Ubuntu 20.04.

    Hello, I'm unable to build 0.3 on Ubuntu 20.02. I get the following error message:

    $ cat /etc/os-release                                                                                                                   2 ↵
    VERSION="20.04 LTS (Focal Fossa)"
    PRETTY_NAME="Ubuntu 20.04 LTS"
    $ make
    mkdir -p build
    cd build && qmake ../src/ && make 
    make[1]: Entering directory 'xxx/kristall-0.3/build'
    g++ -c -pipe -Wno-unused-parameter -Werror=return-type -std=c++17 -O2 -std=gnu++1z -Wall -W -D_REENTRANT -fPIC -DQT_DEPRECATED_WARNINGS -DQT_NO_DEBUG -DQT_SVG_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_WIDGETS_LIB -DQT_MULTIMEDIA_LIB -DQT_GUI_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -I../src -I. -I../lib/luis-l-gist -isystem /usr/include/x86_64-linux-gnu/qt5 -isystem /usr/include/x86_64-linux-gnu/qt5/QtSvg -isystem /usr/include/x86_64-linux-gnu/qt5/QtMultimediaWidgets -isystem /usr/include/x86_64-linux-gnu/qt5/QtWidgets -isystem /usr/include/x86_64-linux-gnu/qt5/QtMultimedia -isystem /usr/include/x86_64-linux-gnu/qt5/QtGui -isystem /usr/include/x86_64-linux-gnu/qt5/QtNetwork -isystem /usr/include/x86_64-linux-gnu/qt5/QtCore -I. -I. -I/usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++ -o abouthandler.o ../src/abouthandler.cpp
    In file included from ../src/ssltrust.hpp:9:0,
                     from ../src/kristall.hpp:9,
                     from ../src/abouthandler.cpp:2:
    ../src/trustedhostcollection.hpp:7:20: fatal error: optional: No such file or directory
    compilation terminated.
    make[1]: *** [Makefile:960: abouthandler.o] Error 1
    make[1]: Leaving directory 'xxx/kristall-0.3/build'
    make: *** [Makefile:20: build/kristall] Error 2

    Any idea what I might be missing? Thanks in advance!

    opened by lvets 5
  • Bus error (core dumped)

    Bus error (core dumped)

    Getting this same error when trying both the release and master branch (Arch linux):

    Bus error (core dumped)

    Here's some info from the core dump:

    master branch:

    Stack trace of thread 2856621:
    #0  0x00007f88d4f6774c gst_update_registry ( >
    #1  0x00007f88d4efc0af n/a ( + 0x390af)
    #2  0x00007f88d932a4c8 g_option_context_parse ( + >
    #3  0x00007f88d4ef38dd gst_init_check ( + 0x3>
    #4  0x00007f88d4ef3985 gst_init ( + 0x30985)
    #5  0x00007f88d509bec3 n/a ( + 0x8ec3)
    #6  0x00007f88db11f06f n/a ( + 0x5506f)
    #7  0x00007f88db15d84e _ZN12QMediaPlayerC2EP7QObject6QFlagsINS_4Fl>
    #8  0x0000564aa7bd9a33 n/a (/home/rjt/.local/bin/kristall/kristall>
    #9  0x0000564aa7bb375a n/a (/home/rjt/.local/bin/kristall/kristall>


    Stack trace of thread 2933655:
    #0  0x00007f810016474c gst_update_registry ( + 0xa474c)
    #1  0x00007f81000f90af n/a ( + 0x390af)
    #2  0x00007f81041574c8 g_option_context_parse ( + 0x604c8)
    #3  0x00007f81000f08dd gst_init_check ( + 0x308dd)
    #4  0x00007f81000f0985 gst_init ( + 0x30985)
    #5  0x00007f810039eec3 n/a ( + 0x8ec3)
    #6  0x00007f8105f4c06f n/a ( + 0x5506f)
    #7  0x00007f8105f8a84e _ZN12QMediaPlayerC2EP7QObject6QFlagsINS_4FlagEE (libQt5Mul
    #8  0x000055f87c82f603 n/a (/home/rjt/.local/bin/kristall-0.3/kristall + 0x4d603)
    #9  0x000055f87c80ec0f n/a (/home/rjt/.local/bin/kristall-0.3/kristall + 0x2cc0f)

    almost identical

    Let me know if there's any other info I could give you that might help.

    opened by ryliejamesthomas 5
  • Favourites not saved on exit on Windows

    Favourites not saved on exit on Windows

    I am using nightly Windows version, downloaded today (May 24th, version 0.4).

    • Run kristall.exe
    • Do some changes to favorites, like adding a link, creating/deleting a group, etc.
    • Quit Kristall
    • Run Kristall again
    • Changes to favorites are not reflected.

    But I expect Kristall to remember my favourites.

    A workaround would be saving Settings (by clicking "OK" in Settings dialog). That saves favourites as well.

    opened by shunf4 4
  • Incorrect handling of status code 30

    Incorrect handling of status code 30

    When server sends response: 30 /\r\n the browser should redirect to home page of the server but Kristall instead shows "Protocol Violation" page with error code "Line is too short for valid protocol".

    I believe this response is valid one since status code 30 allows returning relative paths. Other Gemini browsers (for example Amfora) handle this response correctly.

    bug gemini-protocol 
    opened by Sgiath 4
  • qt5-tools needed on Arch Linux

    qt5-tools needed on Arch Linux

    When you try to build Kristall on Arch with the listed dependencies, you get an error about something having something to do with lrelease.

    The Solution ?

    Installing qt5-tools !

    Please add qt5-tools as a dependency for Arch-based distros in the building document.

    opened by urgellx 0
  • Optimisation for opening large documents.

    Optimisation for opening large documents.

    One of my planned Gemini projects is to place the Berean Study Bible online both as a unified document and as each book split into different chapters where each will be a file. It takes an instant to load the entire 4Mb Berean Study Bible into NVIM and less than to seconds to load and display the same Bible in Lagrange. The timing of Kristal to load and display the Berean Study Bible is unacceptably long — see the attached screenshot.

    The file being loaded is not online but on the local file system and loaded with the file:///path/to/file.gmi URL.


    EDIT: I realise that optimisation is a process that should wait until other major goals are achieved first, but it will improve the user experience if an indicator is displayed that the file is being retrieved, perhaps a progress bar of some sort. At present nothing happens other than a garbled screen until Kristall has fully loaded the file. The first time(s) this happened, I assumed Kristall had crashed, which was not the case since the screen was restored once loaded.

    opened by casperl 0
  • Icons not visible to the left of the URL bar.

    Icons not visible to the left of the URL bar.

    I have elevate this to a new issue after replying to this mentioned in a different issue.

    @przsak can you test if the icons are now visible?

    On Ubuntu 20.04 using QT + i3 Window Manager, I cloned the current kristall repo from github today and issued a make command as a regular user which created a kristall binary. The missing or not displayed icon issue remains the same with all the icons to the left of the URL bar not being displayed while those on the right side of the URL are displayed. I feel the position of the icons might be relevant to the issue.

    This same issue persists in an appimage nightly build I found somewhere on the Internet.

    Could it also be related to a missing icon or system font on the system?

    EDIT: There also appears to be icons missing in the menu under the view option where three blank boxes appear next to Document Outline, Favourites and History.

    Interestingly, on my QT-based desktop, having the Kristall menu open inhibits screenshots being made using Flameshot though this is rectified the moment I close the drop-down menu. This affects both clicking on the Flameshot icon on the i3 toolbar or when pressing the PrtScreen key which has been mapped within the i3 conf to a Flameshot capture command. This sort of behaviour where one app influences or inhibits the operation of another should not exist on Linux systems.


    Originally posted by @casperl in

    opened by casperl 1
  • Bug:

    Bug: "Line is too short for valid protocol"

    I'm playing around with Gemini a bit and have created a small server. This redirects the user from "" to "/". However, the message "Protocol Violation: Line is too short for valid protocol" appears. I compiled Kristell myself with the code from . I have seen that there is already such a bug ( I'm a little confused because I should be using the latest version with the latest release, right?

    opened by marek22k 1
  • response header edge case

    response header edge case

    the second to last sentence in section 3.3 of the spec says

    If is an empty string, the MIME type MUST default to "text/gemini; charset=utf-8".

    currently kristall is interpreting it as "/" and giving an error.

    "20\r\n" error afaict "20 \r\n" text/gemini; charset=utf-8

    opened by kkabrams 0
  • V0.4(Sep 23, 2022)


    Long time not much activity here. I wanted to create the 0.4 release with most issues closed, all known bugs resolved and so on. But my personal time and focus these days is not on Kristall anymore, so i didn't really do anything in the last months.

    But as people say: Everything worth doing is worth doing poorly.

    So instead of pushing the task of doing a proper release further and further into the future, i'll better just tag a release version, and call it a day. This way, people using package managers can get the latest and best features as well, as Kristall had tremendous changes and advances since 0.3.

    Sadly, no release notes this version, as i just don't have the time for them. Maybe, in the future, i get a spare day where i can git diff the V0.3 and V0.4 and write a nice release notes section, update the manual and so on.

    But better make a not optimal release than doing no release. At least today.

    Have fun with all the updates and sorry for not doing this waaaaay earlier.

    Best regards

    • xq
    Source code(tar.gz)
    Source code(zip)
  • V0.3(Jun 21, 2020)

    • Adds support for transient client certificates
    • Adds support for permanent client certificates
    • Adds this changelog to Kristall itself
    • Adds configurable server timeout
    • Adds support for server certificate handling (TOFU) for gemini://
    • Adds support for server certificate handling (TOFU) for https://
    • Adds nice error pages instead of silently ignoring errors or displaying a message box
    • Adds key shortcut: Pressing Escape in the URL bar now resets URL bar to current location
    • Adds support for non-UTF8 encodings. iconv really helps here!
    • Adds configurable and improved redirection handling including warnings for potentially malicious redirects.
    • Adds improved text highlighting, now works with UTF-8. Still experimental, though 😉
    • Adds about:style-preview
    • Adds new UI theme: OS Default (uses Qt's default skin)
    • Fixed bug: Status bar label now does elide links that are too long instead of resizing the window.
    • Fixed bug: Gopher end-of-file marker is now better detected.
    • Fixed bug: Auto-URL detection works with leading/trailing spaces
    • Fixed bug: Loading stats in status bar are now switched between tabs even when no active change is happening.
    • Fixes bug: Gemini query input now checks if the URL exceeds the specified limit.
    • Fixed bug: Outline rendering is now stable
    • Fixes bug: Media player now stops playing when switching to another site.
    • Refactored internal network structure. Makes room for future improvements and increases network stability a lot.
    • Refactored mime type handling
    • Updates application icon thanks to tiwesdaeg
    • Survives conman's client torture suite
    • Survives egsam's client torture suite
    Source code(tar.gz)
    Source code(zip)
  • V0.2(Jun 10, 2020)

    • Implement Ctrl+D/Add to favourites menu item
    • Implement Ctrl+S/Save as... menu item
    • Add display for "non-recognized files"
    • Added support for gopher:// and gophermaps
    • Added "go to home" menu
    • Added support for video/* and audio/* via QMediaPlayer
    • Added support for file:// scheme
    • Added status bar with loading time, file size and mime type
    • Added support for command line arguments
    • Added option to render all text/* documents as plain text.
    • Added option to render gopher maps with icons OR text only
    • Fixed bug: Correct URL escaping for gemini requests.
    • Added progress display in status bar with loading time and already transferred bytes
    • Added support for finger:// protocol
    • Added experimental highlighting and underlining for text/gemini
    • Desktop file is provided for integrating with XDG
    • Fixed bug: Preformatted lines don't break anymore
    • text/gemini parsing updated
    • Added support for block quotes
    • Added help file
    • Added shortcut to focus URL bar
    • Added possibility to save/load/share theme presets. Make everything colorful!
    • Added a lot of context menus
      • Added possibility to open links into a new tab
      • Added possibility to open history and favourite items into new tab or same tab
    • Added option to use your default OS protocol handler instead of displaying an error message.
    • Improved image pan and zooming. Explore those graphics!
    Source code(tar.gz)
    Source code(zip)
Felix Queißner
Hacker & Demoscener from southern germany, loves lowlevel and oldschool stuff
Felix Queißner
The package manager for macOS you didn’t know you missed. Simple, functional, and fast.

Stew The package manager for macOS you didn’t know you missed. Built with simplicity, functionality, and most importantly, speed in mind. Installation

Stew 20 Mar 30, 2022
GoC2 - MacOS Post Exploitation C2 Framework

goc2 c2 client/server/paylod GoC2 - MacOS Post Exploitation C2 Framework Custom C2 for bypassing EDR and ease of use.

Brian Stegemoller 77 Dec 1, 2022
a leaderboard system that can run on any Internet enabled device.

hacktoberfest-leaderboard a leaderboard system that can run on any Internet enabled device. How it works The app updates the leaderboard on

Vasko Zdravevski 1 Nov 1, 2021
Quickly clone an entire org/users repositories into one directory - Supports GitHub, GitLab, Bitbucket, and more

ghorg ghorg allows you to quickly clone all of an orgs, or users repos into a single directory. This can be useful in many situations including Search

Jay Gabriels 1.1k Nov 30, 2022
Tidb - An open-source NewSQL database that supports Hybrid Transactional and Analytical Processing (HTAP) workloads

What is TiDB? TiDB ("Ti" stands for Titanium) is an open-source NewSQL database

null 0 Jan 5, 2022
golang script for bypass AV and work only in windows platform

antivirus bypass protection requirements golang installed usage 1 - create your payload go run create.go <ip> <port> <secret> <any url>

null 29 Nov 9, 2022
An easy-to-use Map Reduce Go parallel-computing framework inspired by 2021 6.824 lab1. It supports multiple workers on a single machine right now.

MapReduce This is an easy-to-use Map Reduce Go framework inspired by 2021 6.824 lab1. Feature Multiple workers on single machine right now. Easy to pa

Bo-Wei Chen 196 Nov 14, 2022
Windows Store Installer for VS Code

vscode-winsta11er This repo contains the code for a simple Go-based installer for the new Windows store. Releases To create a release, create and push

Microsoft 11 Aug 10, 2022
GoDumpLsass is a simple tool that can dump lsass without to get caught by Windows Defender.

GoDumpLsass GoDumpLsass is a simple tool that can dump lsass without to get caught by Windows Defender. Releases

null 8 Nov 4, 2022
DNStxt-exp - 一个提供查询 TXT 记录的 DNS 服务利用工具。例如:可配合 Windows 下的 certutil 工具传输小文件(64KB)

DNStxt-exp 一个提供查询 TXT 记录的 DNS 服务利用工具。例如:可配合 Windows 下的 certutil 工具传输小文件(64KB) HE

null 13 Nov 9, 2022
Advent of Code is an Advent calendar of small programming puzzles for a variety of skill sets and skill levels that can be solved in any programming language you like.

Advent of Code 2021 Advent of Code is an Advent calendar of small programming puzzles for a variety of skill sets and skill levels that can be solved

Kemal Ogun Isik 0 Dec 2, 2021
Zach Howell 0 Jan 4, 2022
Catfetch is a small and cute fetch program written in Go

??Catfetch is a small and cute fetch program written in Go

mellowmarshe 13 Oct 30, 2022
Record CS knowlegement with XMind, version 2.0. 使用 XMind 记录 Linux 操作系统,网络,C++,Golang 以及数据库的一些设计

Psyduck 另一个用 XMind 记录 CS 基础问题的地方,同样提供了 .xmind 源文件以及导出的 .pdf 文件,XMind 版本为「XMind 2020」。 在 2020 年时,曾花了约 2 个月的时间整理了第一份 XMind 知识库: ZeroMind。 之所以额外创建一个 Repo

SmartKeyerror 4.3k Nov 29, 2022
IBus Engine for GoVarnam. An easy way to type Indian languages on GNU/Linux systems.

IBus Engine For GoVarnam An easy way to type Indian languages on GNU/Linux systems. goibus - golang implementation of libibus Thanks to sarim and haun

Varnamproject 10 Feb 10, 2022
Nintendo Switch Joycon keyboard mapper for Linux

joygo Nintendo Switch Joycon keyboard mapper for Linux First, build with -> chmod +x build && ./build Then pair your Joycons to your computer via Blue

SM177Y 1 Nov 13, 2021
Linux namespace with golang

Linux namespace with golang

null 0 Nov 10, 2021
Testing the use of a golang wrapper around UserMode Linux for making stdin

This code is for testing the use of a golang wrapper around UserMode Linux for making stdin, stdout and stderr available to attach, detach and reattach to from the host using Unix sockets.

null 0 Dec 24, 2021
Script that sets your nzxt kraken temps based on cpu temps on linux

liquidctl-cpu-temp Script that monitors cpu temps and sets cpu cooler temps according to entered fan/pump curves. Only tested on NZXT kraken z63 requi

null 1 Nov 16, 2021