Skip to main content

A Gemini Application Framework

Project description

Xitzin

Application Framework for the Geminispace

Xitzin brings a modern Python developer experience to the Gemini protocol. Build Gemini capsules with familiar patterns: decorators for routing and type-annotated path parameters.

from xitzin import Xitzin, Request

app = Xitzin()

@app.gemini("/")
def home(request: Request):
    return "# Welcome to my capsule!"

@app.gemini("/user/{username}")
def profile(request: Request, username: str):
    return f"# {username}'s Profile"

@app.input("/search", prompt="Enter query:")
def search(request: Request, query: str):
    return f"# Results for: {query}"

if __name__ == "__main__":
    app.run()

Features

  • Decorator-based routing with @app.gemini() and automatic path parameter extraction
  • User input handling via @app.input() for Gemini's status 10/11 prompts
  • Certificate authentication with @require_certificate and fingerprint whitelisting
  • Jinja2 templates with Gemtext-aware filters (links, headings, lists)
  • Middleware support for logging, rate limiting, and custom processing
  • Testing utilities with in-memory TestClient
  • Async support for both sync and async handlers

Installation

pip install xitzin

Or with uv:

uv add xitzin

Quick Start

  1. Create app.py:
from xitzin import Xitzin, Request

app = Xitzin()

@app.gemini("/")
def home(request: Request):
    return "# Hello, Geminispace!"

if __name__ == "__main__":
    app.run()
  1. Generate TLS certificates:
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes -subj "/CN=localhost"
  1. Run your capsule:
python app.py
  1. Visit gemini://localhost/ with a Gemini client like Astronomo.

Documentation

Full documentation is available at xitzin.readthedocs.io.

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

xitzin-0.6.0.tar.gz (39.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

xitzin-0.6.0-py3-none-any.whl (47.3 kB view details)

Uploaded Python 3

File details

Details for the file xitzin-0.6.0.tar.gz.

File metadata

  • Download URL: xitzin-0.6.0.tar.gz
  • Upload date:
  • Size: 39.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for xitzin-0.6.0.tar.gz
Algorithm Hash digest
SHA256 510b3cd9075275a9897de66ca24cd7760e12a79af65470066b13b2759b4fc327
MD5 e2c49c725319578ed349a8ca3f3b750e
BLAKE2b-256 a466507f0e2f0558dc80c2c2c678f63785d90016258b4521552d6d6d878fb055

See more details on using hashes here.

Provenance

The following attestation bundles were made for xitzin-0.6.0.tar.gz:

Publisher: release-pypi.yml on alanbato/xitzin

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file xitzin-0.6.0-py3-none-any.whl.

File metadata

  • Download URL: xitzin-0.6.0-py3-none-any.whl
  • Upload date:
  • Size: 47.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for xitzin-0.6.0-py3-none-any.whl
Algorithm Hash digest
SHA256 dbed9774a8b0051f342aee711b73b0e968a1510349aade491b125c62f868b8c9
MD5 c1bc3f1899a93ad00c2689824c98b6e7
BLAKE2b-256 4a60be562a73ca695120bf2d5504fd61b33b1708d87550ddec33f972a4dd178a

See more details on using hashes here.

Provenance

The following attestation bundles were made for xitzin-0.6.0-py3-none-any.whl:

Publisher: release-pypi.yml on alanbato/xitzin

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page