google maps for marist.
Maristmaps pairs a MapLibre frontend with a Flask backend. Campus data flows through PostGIS and osm2pgsql into Martin for vector tiles, with a LangChain-powered agent for conversational routing on top.
Best Overall Project — Marist Hackathon, Spring 2026.
The current Marist campus map only shows you where buildings are and google maps is unable to provde specific
building to building navigation. maristmaps focuses on a campus-first experience with a dedicated tile
pipeline and structured indoor location data so users can get from point to point with clear context.
Primary users include:
- Blind or low-vision individuals who need better navigation support.
- People unfamiliar with Marist (guests, speakers, parents, new students).
- Students and staff who need fast room/building lookup and routing.
Prereqs: docker (with compose v2 plugin), Python 3.11+, and a working
pip. The stack itself runs in docker; the Flask dev server runs on
the host so you get autoreload.
git clone https://github.com/YOUR-FORK/maristmaps.git
cd maristmaps
python -m venv .venv && . .venv/bin/activate
pip install -r requirements.txt
cp .env.example .env
# edit .env: at minimum set OPENAI_API_KEY for the agent
./scripts/init.sh # db + martin up, osm2pgsql + CSVs loaded
python run.py # http://127.0.0.1:5000scripts/init.sh is idempotent: re-run it any time you add a new PBF
or edit db/buildings/*.csv. Pass --reload-osm to force an osm2pgsql
re-import.
./scripts/init.sh --prodFull walkthrough — DNS, Caddy auto-TLS, day-two ops, troubleshooting —
is in deploy/deploy.md.
app/ Flask app (routes, models, templates, static)
agent/ Langchain agent (tools, prompts, service)
db/ init-postgis.sql, buildings/*.csv, load_data.py
docker/ Dockerfiles, Caddyfile, gunicorn.conf.py
martin/ martin tile server config
pbf/ OSM PBF extracts (mounted into the init container)
scripts/ init.sh (unified bootstrap), load-osm.sh (legacy)
docker-compose.yml base stack (db + martin + init + web)
deploy/ deployment overlay compose + deployment walkthrough
run.py Flask dev server entrypoint (host-side)
wsgi.py Gunicorn entrypoint (in the web container)
Everything lives in .env. See .env.example for the full annotated
list. In short:
| var | purpose |
|---|---|
SECRET_KEY |
Flask session signing |
OPENAI_API_KEY |
langchain agent |
DATABASE_URL |
postgres conn string (SQLAlchemy form) |
MARTIN_PUBLIC_URL |
tile server URL as the BROWSER sees it |
DOMAIN |
(prod) subdomain for Caddy TLS |
ACME_EMAIL |
(prod) Let's Encrypt registration email |
| service | port (dev) | role |
|---|---|---|
| db | 5432 | postgis: osm2pgsql tables + locations |
| martin | 3000 | vector tile server over planetosm* |
| init | — | one-shot: osm2pgsql + db/load_data.py |
| web | 8000 | gunicorn + Flask (prod only; dev uses run.py) |
| caddy | 80/443 | prod only: TLS + reverse proxy |
Two internal tools for building out the indoor dataset. Not linked from the public header — reachable by direct URL only, so drop them into your browser when you need them.
| tool | route | role |
|---|---|---|
| survey (GeoLog) | /tools/survey |
mobile GPS logger for field surveying |
| edit (csv viz) | /tools/edit |
desktop CSV editor for cleanup + hallway graphs |
Typical workflow: walk a building with /tools/survey on your phone,
logging rooms / entrances / stairs / elevators against live GPS. It
exports a CSV matching db/buildings/*.csv exactly. Drop that CSV into
/tools/edit on a laptop to fix up positions, draw hallway graphs
(the hallway mode), and verify routes (route mode) before
committing. Both tools read the same map_config blob as the main
map page, so the Martin URL, campus center, and zoom stay in sync.
Once the CSV looks right, save it into db/buildings/ and re-run
./scripts/init.sh (or --prod) to reload the locations table.
- Add schedule-aware routing (for example via CalDAV or a student schedule feed).
- Add agent workflows for class-to-class route planning and timing suggestions.
Related references:
