BusLah - Singapore Bus Arrivals
/install buslah
ArriveLah - Singapore Bus Arrivals
Natural language bus lookup for Singapore.
Trigger Format
bus from \x3Csource location> to \x3Cdestination location>
Examples:
- "bus from Silat Road Sikh Temple to Queens condo"
- "bus from Tanjong Pagar MRT to VivoCity"
- "bus from my office to home"
Step-by-Step Workflow
Step 1: Geocode source location
Use web_fetch to resolve the source location to coordinates via OneMap API:
https://www.onemap.gov.sg/api/common/elastic/search?searchVal=\x3Csource>&returnGeom=Y&getAddrDetails=Y&pageNum=1
Extract LATITUDE and LONGITUDE from the first result.
Step 2: Find nearest bus stops to source
Fetch the full Singapore bus stop list and find stops closest to source coordinates:
https://busrouter.sg/data/2/bus-stops.json
This returns a JSON object where each key is a bus stop code, with fields: description, road, lat, lng.
Compute distance using: sqrt((lat2-lat1)^2 + (lng2-lng1)^2) (approximate is fine for short distances).
Pick the 3 nearest stops within ~300m.
Step 3: Geocode destination location
Same as Step 1 for the destination. Extract its coordinates.
Step 4: Find which buses go from source stops toward destination
For each of the 3 nearest source stops, fetch arrivals:
https://arrivelah2.busrouter.sg/?id=\x3Cstop_code>
Then for each bus service at those stops, check if it passes near the destination using:
https://busrouter.sg/data/2/routes.json
This maps bus service numbers to arrays of stop codes in order. Cross-reference with bus-stops.json to get coordinates of each stop on the route, and check if any stop is within ~400m of the destination coordinates.
Keep only buses that:
- Have the source stop before the destination stop in their route (correct direction)
- Pass within ~400m of the destination
Step 5: Fetch live arrival times
For each matching bus at the source stop, get from the arrivelah2 response:
next.duration_ms→ minutes until next bussubsequent.duration_ms→ minutes until bus after thatnext.load→ seat availability:SEA= Seats Available,SDA= Standing Available,LSD= Limited Standingnext.feature→WAB= Wheelchair accessiblenext.type→DD= Double decker,SD= Single deck,BD= Bendy
Step 6: Format and return
🚌 Buses from [Source Stop Name] → [Destination]
Bus [XX]
⏰ Next: X min | Then: Y min
💺 [Seats Available / Standing / Limited Standing]
🚌 [Double Decker / Single Deck]
Bus [YY]
⏰ Next: X min | Then: Y min
💺 [Seats Available / Standing / Limited Standing]
📍 Stop: [Stop Description], [Road Name] (Stop code: XXXXX)
If no direct bus found, say so and suggest nearest MRT or alternative.
Load Code Reference
SEA= Seats Available 🟢SDA= Standing Available 🟡LSD= Limited Standing 🔴
Bus Type Reference
DD= Double DeckerSD= Single DeckBD= Bendy BusWAB= Wheelchair Accessible Bus
API Endpoints (no auth needed)
- OneMap geocode:
https://www.onemap.gov.sg/api/common/elastic/search - Bus stops:
https://busrouter.sg/data/2/bus-stops.json - Routes:
https://busrouter.sg/data/2/routes.json - Live arrivals:
https://arrivelah2.busrouter.sg/?id=\x3Cstop_code>
- Make sure OpenClaw is installed (local or Docker)
- Run the install command in chat:
/install buslah - After installation, invoke the skill by name or use
/buslah - Provide required inputs per the skill's parameter spec and get structured output
What is BusLah - Singapore Bus Arrivals?
One-word trigger for next bus arrival to your destination. It is an AI Agent Skill for Claude Code / OpenClaw, with 378 downloads so far.
How do I install BusLah - Singapore Bus Arrivals?
Run "/install buslah" in the OpenClaw or Claude Code chat to install it in one step — no extra setup required.
Is BusLah - Singapore Bus Arrivals free?
Yes, BusLah - Singapore Bus Arrivals is completely free (open-source). You can download, install and use it at no cost.
Which platforms does BusLah - Singapore Bus Arrivals support?
BusLah - Singapore Bus Arrivals is cross-platform and runs anywhere OpenClaw / Claude Code is available (cross-platform).
Who created BusLah - Singapore Bus Arrivals?
It is built and maintained by Abhay Bhat (@abhayjb); the current version is v1.0.0.