TypeScript library for finding fair meeting points for N people using isochrone intersection, venue search, and fairness scoring.
npm run build-- compile TypeScript todist/npm test-- run all tests (vitest, 161 tests across 9 files)npm run typecheck-- type-check without emittingnpm run bench-- performance benchmarksnpm install-- install dependencies
Runtime dependencies only (zero third-party):
| Package | Description |
|---|---|
geohash-kit |
Ours -- provides pointInPolygon, GeoJSON types, distance utilities |
src/
types.ts -- All shared interfaces and types
geo.ts -- Polygon geometry (intersection, area, bbox, centroid, circle)
hull.ts -- Convex hull fast-path strategy
engines/
valhalla.ts -- Valhalla adapter (isochrone + matrix)
openrouteservice.ts -- ORS adapter (isochrone + matrix)
graphhopper.ts -- GraphHopper adapter (isochrone + matrix)
osrm.ts -- OSRM adapter (matrix only, no isochrone)
venues.ts -- Overpass API venue search
rendezvous.ts -- Main pipeline function (findRendezvous)
validate.ts -- Input validation helpers
index.ts -- Barrel re-export
examples/ -- Runnable TypeScript examples
docs/ -- Guides and interactive demo page (GitHub Pages)
dist/ -- Compiled output (generated)
| Import path | Module |
|---|---|
rendezvous-kit |
Main barrel -- all public exports |
rendezvous-kit/geo |
Polygon geometry utilities |
rendezvous-kit/venues |
Overpass venue search |
rendezvous-kit/rendezvous |
findRendezvous pipeline function |
rendezvous-kit/engines/valhalla |
ValhallaEngine |
rendezvous-kit/engines/openrouteservice |
OpenRouteServiceEngine |
rendezvous-kit/engines/graphhopper |
GraphHopperEngine |
rendezvous-kit/engines/osrm |
OsrmEngine |
All engines are configured programmatically -- no env vars. Pass URLs and keys to constructors:
| Engine | Required | Notes |
|---|---|---|
ValhallaEngine |
baseUrl |
Self-hosted or https://routing.trotters.cc (L402-gated) |
OpenRouteServiceEngine |
apiKey |
Free key from openrouteservice.org/dev; baseUrl optional |
GraphHopperEngine |
baseUrl |
apiKey optional (needed for hosted GraphHopper) |
OsrmEngine |
baseUrl |
Matrix only -- no isochrone support |
Overpass venue search uses public endpoints by default. Pass overpassUrl to searchVenues() to override.
RoutingEngine-- implementcomputeIsochrone,computeRouteMatrix,computeRouteto add a new engineRendezvousOptions-- input tofindRendezvous(participants, mode, time, venues, fairness)RendezvousSuggestion-- output: venue, travel times per participant, fairness score
- British English -- favour, colour, behaviour, licence, initialise, metre
- GeoJSON coordinate order:
[longitude, latitude]-- never[lat, lon]. This is the GeoJSON standard and is the most common source of bugs. - ESM-only --
.jsextensions in all imports, even for.tssource files - TypeScript strict mode -- no
any, no implicit returns - No third-party runtime dependencies -- only
geohash-kit(ours) - JSDoc on all public exports
- Coordinate order is
[lon, lat]throughout -- matches GeoJSON spec but is the opposite of what many mapping APIs expect. Check carefully at engine adapter boundaries. OsrmEnginedoes not support isochrones. Do not pass it to pipelines that require isochrone computation.- Engine tests mock
globalThis.fetch-- no real HTTP calls are made in tests. - The
rendezvous.test.tstests the full pipeline using mock engines, not real routing services. hull.tsis a convex hull fast-path strategy -- it is an optimisation, not a replacement for full isochrone intersection.
9 test files co-located with source (*.test.ts), 161 tests total.
npm test # vitest run (161 tests)
npm run test:watch # vitest watch modeAutomated via semantic-release on push to main. Work on feature branches -- merge to main only when a logical chunk is complete to avoid version spam.
| Commit type | Version bump |
|---|---|
fix: |
Patch (1.0.x) |
feat: |
Minor (1.x.0) |
BREAKING CHANGE: in commit body |
Major (x.0.0) |
chore:, docs:, refactor: |
None |
GitHub Actions uses OIDC trusted publishing -- no NPM_TOKEN needed.