A GraphQL API that provides nearby Japanese train stations and bus stops, running on Cloudflare Workers.
- For automation agent and contributor workflows, see AGENTS.md.
- For contribution guidelines, see CONTRIBUTING.md.
- For system architecture and design decisions, see docs/architecture.md.
- For the design of the transfer route search (
connectedRoutes, RAPTOR), see docs/route-search.md. - For technical debt analysis and architectural concerns, see docs/technical_debt.md.
- For the record of the Cloudflare Workers migration, see docs/cloudflare-workers-migration.md.
- For the published GraphQL schema, see schema/public.graphql.
This project includes a comprehensive dataset of Japanese railway information in the data/ directory. The data is maintained in CSV format and contributions are primarily targeted at Japanese speakers. For detailed information about data structure and contribution guidelines, please refer to data/README.md.
- Track lengths between adjacent stations (
Station.trackDistanceFromPrevious) are derived from the MLIT National Land Numerical Information railway data (N02), licensed under CC BY 4.0: γε½εζ°ε€ζ ε ±οΌιιγγΌγΏοΌγοΌε½εδΊ€ιηοΌ (https://nlftp.mlit.go.jp/ksj/gml/datalist/KsjTmplt-N02-2025.html) γε ε·₯γγ¦δ½ζ - Bus stops and routes are derived from the GTFS and ODPT feeds listed in
preprocessor/src/gtfs/feed.rsandpreprocessor/src/gtfs/odpt.rs. - Some of the reference travel times in
travel_times/cases.csvare derived from the Toei Subway GTFS (Bureau of Transportation, Tokyo Metropolitan Government, CC BY 4.0) and from the Tokyo Metro, Metropolitan Intercity Railway (Tsukuba Express), Tokyo Waterfront Area Rapid Transit (Rinkai Line), and Tama Toshi Monorail GTFS feeds published by the Public Transportation Open Data Center under the Public Transportation Open Data Basic License.
Thanks goes to these wonderful people (emoji key):
Kanta Demizu π£ π π» |
SAIGUSA Tomotada π€ π£ |
mittan12 π£ |
CodeRabbit π |
tahodev π» |
This project follows the all-contributors specification. Contributions of any kind welcome!
Do you like this project? Join our Discord community! https://discord.gg/tsemdME9Nz
No database is required. The data is generated into generated/*.csv and embedded
into the WASM binary at build time.
rustup target add wasm32-unknown-unknown
cargo install worker-build --locked
make data # build generated/*.csv from data/, the GTFS feeds, and the MLIT railway data
make build # build the Worker (wasm)
make dev # run it locally on http://127.0.0.1:8787make help lists every target.
make test # unit tests for every native crate
make check # type-check, including the wasm32 target
make clippy # lint, including the wasm32 target
make fmt # formatting checkTests need no external services. stationapi (domain / use case) and
preprocessor (data pipeline) are covered by unit tests; the published GraphQL
schema is verified in CI by diffing the Worker's SDL against
schema/public.graphql.
make deploy # staging -> stationapi-stg
make deploy-production # production -> stationapiThe data lives inside the WASM binary, so a data change needs a rebuild and a redeploy; it is not picked up at runtime.
