Nauyaca - Gemini Protocol Server & Client
A modern, high-performance implementation of the Gemini protocol in Python. Nauyaca (pronounced "now-YAH-kah", meaning "serpent" in Nahuatl) uses asyncio's low-level Protocol/Transport pattern for efficient, non-blocking network I/O with both server and client capabilities.
Key Features
- High Performance - asyncio Protocol/Transport pattern for maximum efficiency
- Security First - Mandatory TLS 1.2+, TOFU certificate validation, rate limiting, and access control
- Production Ready - TOML configuration, middleware system, and systemd integration
- Developer Friendly - Full type hints, comprehensive tests, and modern tooling with
uv
Quick Start
Installation
# As a CLI tool (recommended)
uv tool install nauyaca
# As a library
uv add nauyaca
# From source (for development)
git clone https://github.com/alanbato/nauyaca.git
cd nauyaca && uv sync
Run a Server
# Serve content from a directory
nauyaca serve ./capsule
# With configuration file
nauyaca serve --config config.toml
# With hot-reload for development
nauyaca serve ./capsule --reload
Fetch Content
# Get a Gemini resource
nauyaca get gemini://geminiprotocol.net/
# With verbose output
nauyaca get gemini://geminiprotocol.net/ --verbose
Use as a Library
import asyncio
from nauyaca.client import GeminiClient
async def main():
async with GeminiClient() as client:
response = await client.get("gemini://geminiprotocol.net/")
if response.is_success():
print(response.body)
elif response.is_redirect():
print(f"Redirect to: {response.redirect_url}")
else:
print(f"Error {response.status}: {response.meta}")
asyncio.run(main())
Advanced Features
Location-Based Routing
Nauyaca supports flexible routing with multiple handlers per server. Configure different URL paths to use different handlers (static files, proxy, etc.):
# Proxy API requests to backend server
[[locations]]
prefix = "/api/"
handler = "proxy"
upstream = "gemini://backend.example.com:1965"
strip_prefix = true # /api/resource → /resource on backend
timeout = 30
# Serve static content for everything else
[[locations]]
prefix = "/"
handler = "static"
document_root = "./capsule"
Reverse Proxy
Use Nauyaca as a reverse proxy to aggregate multiple Gemini capsules:
# Forward blog requests to blog server
[[locations]]
prefix = "/blog/"
handler = "proxy"
upstream = "gemini://blog.example.com"
strip_prefix = true
# Forward wiki requests to wiki server
[[locations]]
prefix = "/wiki/"
handler = "proxy"
upstream = "gemini://wiki.example.com"
strip_prefix = true
# Serve homepage from local files
[[locations]]
prefix = "/"
handler = "static"
document_root = "./homepage"
See config.example.toml for more configuration examples.
Documentation
| Section | Description |
|---|---|
| Installation | Setup and requirements |
| Quick Start | Get running in 5 minutes |
| Tutorials | Step-by-step guides |
| How-to Guides | Task-oriented recipes |
| Reference | CLI, configuration, API |
| Explanation | Architecture and concepts |
Contributing
# Setup
git clone https://github.com/alanbato/nauyaca.git
cd nauyaca && uv sync
# Test
uv run pytest
# Lint & Type Check
uv run ruff check src/ tests/
uv run mypy src/
See CONTRIBUTING.md for guidelines.
License
MIT License - see LICENSE for details.
Resources
- Gemini Protocol - Official protocol website
- SECURITY.md - Security documentation and vulnerability reporting
- GitHub Issues - Bug reports
- GitHub Discussions - Questions and ideas
Acknowledgments
- Solderpunk for creating the Gemini protocol
- The Gemini community for feedback and inspiration
Status: Active development (pre-1.0). Core protocol and security features are stable.
Metadata
Release files for nauyaca 0.11.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| nauyaca-0.11.0.tar.gz | 49.7 kB | With provenance | Details for nauyaca-0.11.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| nauyaca-0.11.0-py3-none-any.whl | Python 3 | none | any | Details for nauyaca-0.11.0-py3-none-any.whl |
Total release size: 112.6 kB
Release files / nauyaca-0.11.0.tar.gz
| Download URL | nauyaca-0.11.0.tar.gz |
|---|---|
| Size | 49.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
3d844bf2631dc9b5f2b959bf594262025a29b2ce1f42b8f7f9b05ac15210d719
|
|
BLAKE2b-256 checksum How to use checksums |
8cbec672ddfab03a1deeb92594fb0c429d87a0f0dbc8c0d591fe2ac902ebab28
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Feb 18, 2026.
Transparency logRelease files / nauyaca-0.11.0-py3-none-any.whl
| Download URL | nauyaca-0.11.0-py3-none-any.whl |
|---|---|
| Size | 62.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
d35d49aba9984593ecdc63c8e30750cc517f11670ba30793a7289162560b41df
|
|
BLAKE2b-256 checksum How to use checksums |
ab4587a6b73ec4f75b5c281662c048093eee20695c8f88f124da6c69c9689da8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Feb 18, 2026.
Transparency logSecurity for nauyaca 0.11.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for nauyaca-0.11.0.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Feb 18, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.