A web client for Gemini! https://swee.codes/apps/gem2browser
  • Python 73.5%
  • HTML 11.2%
  • Jinja 8%
  • CSS 6.5%
  • Dockerfile 0.8%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
PC Kitty (FreeBSD) be02b66cb1
All checks were successful
Test web app / Check syntax (push) Successful in 16s
Create Docker image / deploy (release) Successful in 29s
Upload Python Package / deploy (release) Successful in 2m27s
add the stuff i forgot to add from the other branch
im gonna cry
2026-08-26 11:35:20 -07:00
.forgejo/workflows fix podman auth 2026-08-20 18:33:44 -07:00
gem2browser add the stuff i forgot to add from the other branch 2026-08-26 11:35:20 -07:00
.gitattributes A lot of changes for the release of 3.0 (#4) 2026-08-14 18:42:02 -07:00
.gitignore A lot of changes for the release of 3.0 (#4) 2026-08-14 18:42:02 -07:00
Dockerfile add publish job to CI 2026-08-20 18:09:21 -07:00
LICENSE Initial commit 2025-01-12 21:30:24 -08:00
pyproject.toml add the stuff i forgot to add from the other branch 2026-08-26 11:35:20 -07:00
README.md A lot of changes for the release of 3.0 (#4) 2026-08-14 18:42:02 -07:00

Gem2Browser

"Take the web by storm."

A Gemini relay for HTTP using Python flask

Features

  • Browses all of Gemini Space!
  • Includes Titan editor
  • Client certificate support
    • In versions 3.0 and newer, it does not store certificates in the server.

Requirements

  • Python 3
    • Flask
    • Gunicorn (or any other flask compatible WSGI)
    • PyOpenSSL

Installation

Docker Compose

Use this docker-compose.yml

services:
  gem2browser:
    image: git.swee.codes/swee/gem2browser:latest
    restart: unless-stopped
    ports:
      - 2009:2009/tcp

On your host

pip install gem2browser gunicorn

Run server

guicorn --bind 0.0.0.0:2009 gem2browser:app

Development server

python -m gem2browser

This listens on 127.0.0.1:2009

Service files

Systemd
[Unit]
Description=Gem2Browser
After=network.target
Wants=network-online.target

[Service]
Type=simple
# User=g2b
ExecStart=/usr/bin/gunicorn --bind 0.0.0.0:2009 gem2browser:app
Restart=on-failure

[Install]
WantedBy=multi-user.target
OpenRC
#!/sbin/openrc-run

# command_user="g2b"
command="gunicorn"
command_args="--bind=0.0.0.0:2009 gem2browser:app"
command_background="yes"
pidfile="/run/$RC_SVCNAME.pid"
depend() {
        need net
        use dns
}
FreeBSD rc
#!/bin/sh

# PROVIDE: gem2browser
# REQUIRE: NETWORKING
# KEYWORD: shutdown

. /etc/rc.subr

name="gem2browser"
rcvar="gem2browser_enable"
start_precmd="gem2browser_precmd"
procname="/usr/local/bin/python3"
pidfile="/var/run/${name}.pid"

load_rc_config $name

: ${gem2browser_enable:="NO"}
# : ${gem2browser_user:="g2b"}

command="/usr/sbin/daemon"
command_args="-f -l daemon -s info -p ${pidfile} gunicorn --bind=0.0.0.0:2009 gem2browser:app"

gem2browser_precmd() {
        if [ ! -e "${pidfile}" ]; then
                install -o "${gem2browser_user}" -g "wheel" "/dev/null" "${pidfile}"
        fi
}

run_rc_command "$1"