Changelog¶
All notable changes to Xitzin will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
[Unreleased]¶
Added¶
- Static File Handling: Native static file serving without adapter patterns
StaticFileshandler for mounting directoriesapp.static()convenience method for simple setup- Automatic MIME type detection with customizable mappings
- Directory index files (
index.gmi,index.gemini) - Optional directory listings with file sizes
- Custom 404 handlers via
@handler.not_founddecorator - Security controls: path traversal protection, symlink control, file size limits
-
Binary file support (images, PDFs, etc.)
-
Virtual Hosting: Host multiple applications under different hostnames on a single server
app.vhost()convenience method for configuring hostname-based routingVirtualHostMiddlewareclass for direct middleware usage- Wildcard hostname patterns (e.g.,
*.example.com) - Configurable fallback behavior: default app, status code, or custom handler
- Full sub-app support: each virtual host can have its own routes, middleware, templates, and Titan uploads
-
Sub-app lifecycle events: startup/shutdown handlers cascade to sub-apps in correct order
-
URL Reversing: Build URLs from route names instead of hardcoding paths
- Routes are auto-named after their handler function, or explicitly via
name=parameter app.reverse("route_name", **params)builds URLs from route namesapp.redirect("route_name", **params)creates redirects to named routesLinkclass for building Gemtext link linesLink.to_route(app, "route_name", **params)builds links to named routesreverse()function available in templates:{{ reverse("profile", username="alice") | link("Profile") }}
[0.1.0] - 2024¶
Added¶
- Initial release of Xitzin
- Core
Xitzinapplication class with decorator-based routing @app.gemini()decorator for defining routes@app.input()decorator for input handling (status 10/11)- Path parameter extraction with type conversion
Requestwrapper with convenient properties- Response types:
Response,Input,Redirect - Exception hierarchy mapping to Gemini status codes
- Middleware support (function-based and class-based)
- Built-in middleware:
TimingMiddleware,LoggingMiddleware,RateLimitMiddleware - Certificate authentication decorators:
@require_certificate,@require_fingerprint,@optional_certificate - Jinja2-based templating with Gemtext filters
- Testing utilities:
TestClient,TestResponse,test_app() - Lifecycle events:
@app.on_startup,@app.on_shutdown - Application state management via
app.stateandrequest.state
Dependencies¶
- Nauyaca for Gemini protocol communication
- Jinja2 for template rendering