Trailframe
A self-hosted photo gallery for people who move: photos and GPS activities (Garmin Connect / GPX) live side by side, linked by time and place. One server hosts everything — a FastAPI backend that also serves its web UI.
Photo library
- Automatic ingestion of a photo folder, with EXIF capture (camera, date, GPS) on import.
- Multi-size thumbnails generated and cached per photo; sizes are configurable.
- Favorites — mark photos you love and find them instantly; favorite-only views everywhere.
- Automatic groups — related photos are clustered so bursts and series stay together.
- Filter and combine by date range, group, location, tags, and favorites.
Activities
- Import activities from Garmin Connect or GPX files.
- Every activity gets a trace map; photos taken during the activity appear alongside it.
- Interactive map with selectable traces and popups showing distance, duration, and time.
Slideshows
- Slideshow sources: an activity (photos + trace), a group, or a fully custom selection.
- Custom slideshows support date ranges, groups, locations, tags, randomization, and favorites-only.
- Thumbnail mode renders slides from cached thumbnails instead of full images — smooth playback even for large libraries, with the size chosen automatically from the available screen space.
- Standalone kiosk entry (
/slideshow.html) with deep-linkable URLs for dedicated screens. - ZIP export of an activity's photos.
Enrichment pipelines
Photos are processed by pluggable scanners:
| Scanner | What it does |
|---|---|
| File | Registers the file (name, size) |
| EXIF | Extracts camera metadata, dates, and GPS position |
| Thumbnail | Generates all configured thumbnail sizes |
| Activity | Links photos to imported activities |
| Brisque | Scores image quality |
| Location | Resolves GPS coordinates to places and countries |
| Object | Detects objects in photos (YOLO models, downloaded automatically) |
| PerceptualHash | Fingerprints images for duplicate/near-duplicate grouping |
Scanners can be force re-run individually from the Tools page — e.g. regenerate all thumbnails after changing their sizes.
Maps
- Wireframe maps of your photo coverage and per-photo location maps.
- Built-in tile cache/proxy: tiles are fetched once from the configured provider and served locally afterwards.
Statistics
- Per-scanner throughput (items processed and speed).
- Storage overview: database size plus disk usage of every data folder.
Install
A wheel is attached to every release: download the latest trailframe-…-py3-none-any.whl and install it with pip (Python 3.12 or newer):
pip install trailframe-…-py3-none-any.whl
All Python dependencies are pulled in automatically; the web UI is bundled inside the wheel.
Running
Run the trailframe command from the folder where all data (database, thumbnails, caches, trash) should live:
trailframe --config path/to/config.yaml
(python -m trailframe.main is equivalent.) The server listens on port 8000 by default; open http://localhost:8000. On first start a default config.yaml is written to the current directory.
From source
Build the web UI once (npm install && npm run build inside frontend/), then start the server from the repository root:
python supervisor.py --config path/to/config.yaml
The supervisor restarts the server whenever it exits and forwards SIGTERM/SIGBREAK to it. To build a wheel yourself, build the web UI first, then run pip wheel ..
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file trailframe-0.3.0.tar.gz.
File metadata
- Download URL: trailframe-0.3.0.tar.gz
- Upload date:
- Size: 2.1 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
edf9b80d62a8fe5c07a2e567f4c8ad7397160e46874634a0397eabe44c884695
|
|
| MD5 |
0b4aaebd6d34fa7bcd7b44e65139edd3
|
|
| BLAKE2b-256 |
591a99675963ac4206504317d9cf0f5d9727ac3230f65f382713005ac48c1b8a
|
Provenance
The following attestation bundles were made for trailframe-0.3.0.tar.gz:
Publisher:
publish.yml on Sildra/trailframe
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
trailframe-0.3.0.tar.gz -
Subject digest:
edf9b80d62a8fe5c07a2e567f4c8ad7397160e46874634a0397eabe44c884695 - Sigstore transparency entry: 2638141897
- Sigstore integration time:
-
Permalink:
Sildra/trailframe@412edfd69c3e4c279c31a8163b381c0c564b9650 -
Branch / Tag:
refs/tags/v0.3.0 - Owner: https://github.com/Sildra
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@412edfd69c3e4c279c31a8163b381c0c564b9650 -
Trigger Event:
push
-
Statement type:
File details
Details for the file trailframe-0.3.0-py3-none-any.whl.
File metadata
- Download URL: trailframe-0.3.0-py3-none-any.whl
- Upload date:
- Size: 629.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
948ee3e21c918bcb2ca9ee81d2b2b01dcd62e9f1712468c2fd01851d786c6f4c
|
|
| MD5 |
e05137f28c74c2e12c9e3dfef5bbe042
|
|
| BLAKE2b-256 |
809c59e9709a3b602caf5a39e6bb5124250de40162193e4258f0672f4b0aa16f
|
Provenance
The following attestation bundles were made for trailframe-0.3.0-py3-none-any.whl:
Publisher:
publish.yml on Sildra/trailframe
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
trailframe-0.3.0-py3-none-any.whl -
Subject digest:
948ee3e21c918bcb2ca9ee81d2b2b01dcd62e9f1712468c2fd01851d786c6f4c - Sigstore transparency entry: 2638142469
- Sigstore integration time:
-
Permalink:
Sildra/trailframe@412edfd69c3e4c279c31a8163b381c0c564b9650 -
Branch / Tag:
refs/tags/v0.3.0 - Owner: https://github.com/Sildra
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@412edfd69c3e4c279c31a8163b381c0c564b9650 -
Trigger Event:
push
-
Statement type: