Skip to content

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
  • StaticFiles handler for mounting directories
  • app.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_found decorator
  • 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 routing
  • VirtualHostMiddleware class 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 names
  • app.redirect("route_name", **params) creates redirects to named routes
  • Link class for building Gemtext link lines
  • Link.to_route(app, "route_name", **params) builds links to named routes
  • reverse() function available in templates: {{ reverse("profile", username="alice") | link("Profile") }}

[0.1.0] - 2024

Added

  • Initial release of Xitzin
  • Core Xitzin application 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
  • Request wrapper 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.state and request.state

Dependencies

  • Nauyaca for Gemini protocol communication
  • Jinja2 for template rendering