Busabase
Busabase is an open-source (MIT) database and workspace for AI agents — data, docs, skills, and apps in one place. Run it locally, self-host it inside your network, or use Busabase Cloud, and turn age
翻訳待ち
No updates detected yet. GitHub releases will appear here.
Semantic diff for GTFS feeds — compares two versions and reports the changes as human-recognizable events (routes discontinued, service reduced, stops renamed) | 複数世代の GTFS フィードを比較し、ダイヤ改正を人間が認識できる意味的な変化として抽出・レポートする
Loading the full README. The saved excerpt is shown below.
gtfs-semantic-diff compares two versions of a GTFS feed and reports the
differences as human-recognizable, semantic changes — a route discontinued,
evening service cut, a stop renamed or relocated, departures shifted — instead
of thousands of changed rows. Every raw field-level difference is structurally
accounted for: it either becomes evidence for a change event or is reported as
an unexplained residual, and the coverage ratio is measured on every run.Read the full README ↗日本語版: README.ja.md
gtfs-semantic-diff compares two versions of a GTFS feed and reports the differences as human-recognizable, semantic changes — a route discontinued, evening service cut, a stop renamed or relocated, departures shifted — instead of thousands of changed rows. Every raw field-level difference is structurally accounted for: it either becomes evidence for a change event or is reported as an unexplained residual, and the coverage ratio is measured on every run.
Try it: diff.gtfs.jp — upload any two GTFS zips, free, no sign-up. The site and reports are bilingual (English / Japanese, following your browser language).
explained_ratio, typically 1.0 on our verification feeds).stop_id / route_id / trip_id
are reassigned between versions, entities are re-identified from content —
names, coordinates, stop sequences, times. The resulting old↔new ID mapping
is itself an output (mapping.json), usable as a backbone for longitudinal
analysis across feed versions.config/default.toml. Same input, same output.The hosted service exposes every layer of a comparison result:
| Layer | URL pattern | Content |
|---|---|---|
| Digest | r/{pair}.digest.en.md (English) / .digest.md (Japanese) / .digest.json | Summary for LLMs and humans — numbers identical in both languages |
| Route detail | r/{pair}.routes.digest.json | Per-route changed trips (old/new trip_ids), counts by time band |
| ID mapping | r/{pair}.mapping.json | Adopted old↔new correspondences for stops / routes / trips |
| Full events | see r/{pair}/index.json | All 44 event types with evidence, plus raw diffs |
https://diff.gtfs.jp/mcp — register it as a connector in
Claude or ChatGPT (no auth) and query comparisons conversationally,
including running new comparisons.Python 3.11+ (developed on 3.14).
uv venv .venv.nosync --python 3.14 # .nosync needed if the repo is under iCloud sync (see note)
ln -s .venv.nosync .venv
uv pip install -e '.[dev]' --python .venv.nosync/bin/python
Note (macOS + iCloud): if the repository lives under an iCloud-synced directory (e.g.
~/Documents), a venv at.venvbreaks: iCloud keeps restoring a hidden flag on.pthfiles in site-packages, and Python 3.14 ignores hidden.pthfiles. Directories named*.nosyncare excluded from iCloud sync, hence the layout above.
# Compare two local GTFS zips (older one first) into a self-contained HTML report
gtfs-semantic-diff compare old.zip new.zip --html report.html
# Also emit ChangeEvent JSON / Markdown / raw diffs
gtfs-semantic-diff compare old.zip new.zip \
-o events.json --report report.md --rawdiffs rawdiffs.json
# Lightweight HTML (same "core" bundle as the web service) or app+data split output
gtfs-semantic-diff compare old.zip new.zip --html-lite lite.html --html-dir out/
# AI-oriented digest (Markdown / JSON, numbers guaranteed identical to the report)
gtfs-semantic-diff compare old.zip new.zip --digest digest.md --digest-json digest.json
# Japanese feeds: fetch generations directly from gtfs-data.jp
gtfs-semantic-diff fetch --org nagai-unyu --feed Nagaibus
gtfs-semantic-diff compare --org chitetsu --feed chitetsubus \
--old prev_2 --new prev_1 --html report.html
# Run only the L1 identity stage and inspect match confidence
gtfs-semantic-diff identity --org chitetsu --feed chitetsubus
--config swaps the threshold TOML (default: config/default.toml).infra/, AWS CDK; S3 + CloudFront + Lambda) powers
diff.gtfs.jp and can be deployed to your own AWS
account.Events fall into 6 groups (routes, stop patterns, trips/times, stops, calendars, fares/metadata), 44 types in total. The exhaustive detection specification is docs/spec/detection.md (Japanese): L0 enumeration rules, L1 identity scoring, and per-rule detection conditions, evidence consumption and thresholds.
zip ×2 | gtfs-data.jp API
→ load/ normalized loading (day_type normalization, all .txt kept as strings)
→ diff0/ L0: exhaustive RawDiff enumeration (the ledger's denominator)
→ identity/ L1: cross-version identity — stop clusters / route families /
stop patterns / route groups
→ events/ L2: rule cascade + residual accounting → ChangeEvent JSON (canonical)
→ report/ presentation model (cognitive units) → HTML / Markdown / digest
This is the beginning of the README. Read the rest at the original. Read the full README ↗