Skip to main content

Convert GPX routes into glanceable, map-centric motorcycle navigation PDFs for tank-bag use.

Project description

GPXSheet

Motorcycle sport-touring route awareness generator.

PyPI Python versions CI Docs License

GPXSheet is a Python command-line application and reusable library that converts GPX routes into highly glanceable, map-centric motorcycle navigation aids optimized for tank-bag use.

It is not a rally roadbook and not a GPS replacement. The goal is route awareness: a rider should be able to glance at the printed sheet for less than one second and immediately understand what road they're on, what the next navigation decision is, how far away it is, what comes after, and where they are within the overall route.

Documentation: gpxsheet.readthedocs.io — library API, web API guide + interactive reference, and deployment notes.

Example tank-bag PDF roadbook    Example route table

Features

  • Route analysis — GPX (track/route/waypoints) → decision points, fuel, reassurance markers, and road segments. Route structure comes from OpenStreetMap road topology rather than raw geometry, so twisty roads don't flood with false turns. analyze text output.
  • Schematic map strip — a stylized (or faithful) map ribbon showing the road-name segments, decisions, fuel, and waypoints.
  • Tank-bag PDF — route-aware pagination; a portrait roadbook (stacked strip lanes, the default) or landscape (one strip per page).
  • Route table — a markdown/HTML trip plan (waypoints, distances, fuel/lunch markers, ETAs, sunrise/sunset; per-day sections for multi-day GPX); table CLI.
  • Packaged for pip install gpxsheet; PEP 561 typed.
  • Web service — a FastAPI app exposing the engine over REST (async jobs); see Web service below.

How it works internally — the two-tier decision detection, schematic layout engine, pagination, and OSM enrichment — is documented in docs/product.md.

Installation

pip install gpxsheet

Development

git clone <repo-url> gpxsheet && cd gpxsheet
git submodule update --init          # populate gpxsamples/
python3 -m venv .venv && source .venv/bin/activate
pip install -e ".[dev,service]"      # service required for mypy (pydantic plugin)
python -m build && twine check dist/*    # build + check the distribution
# publish (maintainer only): twine upload dist/*

Dev server modes — see docs/dev-workflow.md for the full breakdown. Short version:

# Simple (no Docker needed — EagerRunner, synchronous):
make dev-api && make dev-ui

# Full stack (real async queue, requires Docker):
make infra && make dev-api-full && make dev-worker && make dev-ui

Usage

CLI

gpxsheet generate route.gpx -o route.pdf            # portrait roadbook (default)
gpxsheet generate route.gpx --landscape -o route.pdf
#   layout knobs: --lane-decisions M (decisions per page; default auto-fit); --lanes N (portrait lanes/page)

gpxsheet table   route.gpx --departure 9am -o route.md   # route table (html|md)
gpxsheet table   route.gpx --no-osm -o route.md          # fast, fully offline
gpxsheet analyze route.gpx                           # text analysis
gpxsheet strip   route.gpx -o route_strip.png        # single schematic strip PNG

Library

render, analyze, and validate run synchronously, mirroring the web API; the route table lives in gpxsheet.routetable. Full reference and examples: the Library API.

Web service

A FastAPI service exposes the engine over REST and ships a built-in browser UI.

Web UI — drop a GPX onto the page, see a live strip preview and route stats, adjust options, and download the PDF/PNG or route table. Build it once (make frontend), then run uvicorn gpxsheet.service.asgi:app (UI at /, Swagger at /docs); the hot-reload dev modes are covered under Development above.

REST API — every operation is an async job (submit → poll → fetch) over /v1/render, /v1/table, /v1/analyze, and /v1/validate. The full reference — every endpoint, parameter, auth, and browser fetch/curl examples — is the Web API guide (live OpenAPI at /docs). Config is env-driven (GPXSHEET_REDIS_URL switches the prod path; see gpxsheet/service/settings.py).

Self-hosting & hardening — run the single Docker image or the full Redis/MinIO stack; see docs/deploy.md before exposing the service to the public internet.

License

GNU Affero General Public License v3.0 or later (AGPL-3.0-or-later) — see LICENSE. Copyright © 2026 Paul Traina. Because the AGPL covers use over a network, anyone who runs a modified version of the web service must offer its users the corresponding source.

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

gpxsheet-1.1.1.tar.gz (428.7 kB view details)

Uploaded Source

Built Distribution

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

gpxsheet-1.1.1-py3-none-any.whl (399.4 kB view details)

Uploaded Python 3

File details

Details for the file gpxsheet-1.1.1.tar.gz.

File metadata

  • Download URL: gpxsheet-1.1.1.tar.gz
  • Upload date:
  • Size: 428.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for gpxsheet-1.1.1.tar.gz
Algorithm Hash digest
SHA256 7a22611aec17b962ac536cc1ef6155292619752111f8cf886b2bda2afd2cc98f
MD5 4c3c173d28dadb422214a527cf54cc38
BLAKE2b-256 e07b1761d832bb9f72b5670bc749d15648190a60183135476311eb60286d16ff

See more details on using hashes here.

Provenance

The following attestation bundles were made for gpxsheet-1.1.1.tar.gz:

Publisher: publish.yml on pleasantone/gpxsheet

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

File details

Details for the file gpxsheet-1.1.1-py3-none-any.whl.

File metadata

  • Download URL: gpxsheet-1.1.1-py3-none-any.whl
  • Upload date:
  • Size: 399.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for gpxsheet-1.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 62e22dc13c563585a1118238c70e7544d321c5ffe2f1811b4225bb32811952bd
MD5 c988148df787bae925f92ff2a14f6642
BLAKE2b-256 83e59508f174807952bde6f2bbe03c4b0a48d06cbc1303cd55c1caf29eaa3c67

See more details on using hashes here.

Provenance

The following attestation bundles were made for gpxsheet-1.1.1-py3-none-any.whl:

Publisher: publish.yml on pleasantone/gpxsheet

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