This repo now contains two runnable paths:
- A lightweight GTFS viewer for fast inspection of a raw feed
- The actual Maple -> Globeflower -> Harebell ingestion and tile pipeline used to get much closer to Catenary route rendering parity
GTFS zip -> Maple local-ingest -> PostGIS
OSM PBF -> Globeflower -> graph bin
PostGIS + graph bin -> Harebell export -> vector tiles -> Harebell serve / Viewer
Yes. The real ingestion/rendering pieces are in this repo:
- Maple:
backend/src/maple/main.rs - Globeflower:
backend/src/globeflower/main.rs - Harebell:
backend/src/harebell/main.rs
The missing operational piece was a direct local GTFS ingest path. That now exists as:
maple --no-elastic local-ingest \
--input-zip /path/to/feed.zip \
--feed-id local-scotland \
--chateau-id scotlandThis is the path to use if you want Harebell-rendered tiles rather than the lightweight raw-shapes viewer.
Required inputs:
- A GTFS zip
- A rail OSM PBF for the target region
Scotland example:
GTFS_HOST_DIR=/home/youruser/gtfs \
GTFS_FILE=filtered_scotland_gtfs.zip \
GTFS_FEED_ID=filtered-scotland \
GTFS_CHATEAU_ID=scotland \
OSM_HOST_DIR=/home/youruser/osm \
GLOBEFLOWER_REGION=scotland \
docker compose -f docker-compose.harebell-pipeline.yml up --buildExpected OSM file path in ${OSM_HOST_DIR} for the Scotland region:
railonly-scotland-latest.osm.pbf
The file does not have to come from a Scotland-only Geofabrik extract. A Great Britain extract renamed to railonly-scotland-latest.osm.pbf is also valid if that is the OSM coverage you have available.
Ports:
8080: Harebell tile server8081: simple viewer proxied to Harebell tiles
The compose file for this stack is:
If your immediate goal is just "drop in a GTFS zip and see it on the map", use the lightweight viewer path instead of the old Maple/Harebell stack.
- Put a GTFS zip in
gtfs/ - Run:
docker compose -f docker-compose.gtfs-viewer.yml up --buildNotes:
- If there are multiple zip files in
gtfs/, setGTFS_FILE:
GTFS_FILE=my-feed.zip docker compose -f docker-compose.gtfs-viewer.yml up --build- If the GTFS zip already lives elsewhere on the server, mount that directory directly:
GTFS_HOST_DIR=/home/youruser/gtfs \
GTFS_FILE=filtered_scotland_gtfs.zip \
docker compose -f docker-compose.gtfs-viewer.yml up --build- This path uses the existing Catenary basemap styling and overlays routes/stops extracted from your GTFS.
- It does not depend on the unfinished Maple/Harebell viewer-only refactor.
If you only want to inspect a feed quickly and do not need the full Harebell render path yet:
docker compose -f docker-compose.gtfs-viewer.yml up --buildThat path uses the Catenary basemap but not the real Globeflower/Harebell graph pipeline.
| Service | Purpose | Command |
|---|---|---|
| Maple | GTFS ingestion | ./target/release/maple --no-elastic local-ingest --input-zip <file> --feed-id <id> --chateau-id <chateau> |
| Globeflower | Support graph builder | ./target/release/globeflower --region scotland --osm-dir <dir> --output-dir <dir> |
| Harebell | Tile exporter/server | ./target/release/harebell export ... / ./target/release/harebell serve --port 8080 |
| Birch | Search API | ./target/release/birch |
| Viewer | Web UI | docker compose -f docker-compose.harebell-pipeline.yml up viewer |
- Pan/zoom vector map with routes and stops
- Hover tooltip on routes
- Click to select route
- Shift+click for multi-select
- Filter by mode (Rail, Metro/Tram, Bus, Other)
- Filter by operator
- URL state for shareable links
- Pin routes to persist through filter changes
| Variable | Default |
|---|---|
DATABASE_URL |
postgres://catenary:catenary@localhost:5432/catenary |
RUST_LOG |
info |
| Service | Port |
|---|---|
| PostgreSQL | 5432 |
| Harebell | 8080 |
| Birch | 3000 |
| Viewer | 8081 |
- Deployment Guide - Full setup instructions
- Intent and Scope
- Architecture
- Tile Schema
- Viewer Interactions
docker-compose.ymlin the repo root is not the full Harebell pipeline.- The new direct-local GTFS ingest path bypasses Transitland/DMFR, which is what makes local Scotland feeds practical here.
- Globeflower now includes a
scotlandregion preset.