skills/sydney-commute/SKILL.md
Plan trips, check real-time departures, and find stops on Sydney's public transport network (trains, buses, ferries, light rail, metro). Use this skill when the user asks about trains, buses, ferries, light rail, metro, Opal fares, commuting, "how do I get to", next departure, timetable, platform, or any Sydney public transport question. Works without API keys (provides Google Maps/TfNSW links) but best with a free TfNSW API key for real-time data.
npx skillsauth add agairola/fuel-pricing-skill sydney-commuteInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Plan trips, check real-time departures, and find stops across Sydney's public transport network. Works without API keys — best with a free TfNSW key for real-time data.
npx skills add agairola/life-skills --skill sydney-commute
Trigger this skill when the user:
brew install uv (macOS) or pip install uv (all platforms)~/.config/sydney-commute/credentials.json for real-time data.uv run.!command -v uv > /dev/null 2>&1 && echo "uv: installed" || echo "uv: NOT INSTALLED"
!test -f ~/.config/sydney-commute/credentials.json && python3 -c "import json; d=json.load(open('$HOME/.config/sydney-commute/credentials.json')); print('TfNSW API: configured' if d.get('tfnsw_api_key') else 'TfNSW API: not configured')" 2>/dev/null || echo "TfNSW API: not configured (zero-config mode — Google Maps/TfNSW links only)"
Follow the standard location resolution steps in ../../references/location-flow.md before running the script. Skill-specific additions:
--from "Central Station" --to "Bondi Junction".--from "Central Station" --mode departures.uv run "${CLAUDE_SKILL_DIR}/scripts/commute.py" [OPTIONS]
| Flag | Values | Default | Purpose |
|------|--------|---------|---------|
| --from | station, stop, or place name | (none) | Origin location |
| --to | station, stop, or place name | (none) | Destination location |
| --mode | trip departures stops | trip | Query mode |
| --depart | HH:MM or now | now | Departure time |
| --arrive-by | HH:MM | (none) | Arrive by time |
| --transport | train bus ferry lightrail metro | (all) | Filter transport type |
| --lat / --lng | coordinates | (auto) | Explicit coordinates |
| --no-cache | (flag) | off | Force fresh data |
Only parse stdout (JSON). Stderr contains diagnostics only.
# Plan a trip
uv run "${CLAUDE_SKILL_DIR}/scripts/commute.py" --from "Central Station" --to "Bondi Junction"
# Trip at a specific time
uv run "${CLAUDE_SKILL_DIR}/scripts/commute.py" --from "Town Hall" --to "Manly" --depart 14:30
# Arrive by a certain time
uv run "${CLAUDE_SKILL_DIR}/scripts/commute.py" --from "Newtown" --to "Circular Quay" --arrive-by 09:00
# Filter by transport type
uv run "${CLAUDE_SKILL_DIR}/scripts/commute.py" --from "Central" --to "Parramatta" --transport train
# Check departures from a stop
uv run "${CLAUDE_SKILL_DIR}/scripts/commute.py" --mode departures --from "Central Station"
# Departures for trains only
uv run "${CLAUDE_SKILL_DIR}/scripts/commute.py" --mode departures --from "Central Station" --transport train
# Search for stops
uv run "${CLAUDE_SKILL_DIR}/scripts/commute.py" --mode stops --from "Central"
# Zero-config (no API key) — returns Google Maps / TfNSW links
uv run "${CLAUDE_SKILL_DIR}/scripts/commute.py" --from "Central Station" --to "Bondi Junction"
Follow the formatting rules in ../../references/platform-formatting.md. Key skill-specific formatting below.
Keep it simple — users just need to know what to catch, where from, and when.
Simplification rules:
When all results are the same route (common case):
For platforms with hyperlinks (Telegram, Discord, terminal):
Train → Ferry (~35 min)
Take any city train from Central (T1/T4, Platform 17 or 21) to Circular Quay (2 stops), then the Manly ferry (~20 min). Runs every ~20 min.
Next departures: 2:05 pm, 2:26 pm, 2:47 pm
[View on Google Maps](google_maps_url) · [TfNSW Trip Planner](transport_nsw_url)
For platforms without hyperlinks (WhatsApp, Signal, SMS):
Train → Ferry (~35 min)
Take any city train from Central (T1/T4, Platform 17 or 21) to Circular Quay (2 stops), then the Manly ferry (~20 min). Runs every ~20 min.
Next departures: 2:05 pm, 2:26 pm, 2:47 pm
Google Maps: [url]
TfNSW: [url]
When results have genuinely different routes:
Two ways to get from Central to Parramatta:
1. Direct train (~30 min)
T1 from Central (Platform 16) to Parramatta · 12 stops
Next: 2:10 pm, 2:25 pm, 2:40 pm
2. Metro (~25 min)
Train from Central to Sydenham, then Metro from Sydenham to Parramatta
Next: 2:15 pm, 2:35 pm
[View on Google Maps](google_maps_url) · [TfNSW Trip Planner](transport_nsw_url)
Show a compact departure list with delays highlighted.
Departures from Central Station:
14:30 T1 North Shore Line → Hornsby · Platform 16 · on time
14:32 T4 Eastern Suburbs → Bondi Junction · Platform 18 · 2 min late
14:35 T2 Inner West Line → Leppington · Platform 20 · on time
14:38 Bus 301 → Eastgardens · Stand B · no realtime
Highlight delays: if delay_min > 0, show "X min late" in bold or with emphasis. If delay is null and realtime is false, show "no realtime".
Show a list with transport types.
Stops matching "Central":
1. Central Station — train, bus, lightrail
2. Central Chalmers St — bus
3. Central Pitt St — bus
When no API key is configured, show the fallback URLs as clickable links.
I don't have a TfNSW API key configured, so I can't get real-time data. Here are links to plan your trip:
Google Maps: [Central Station to Bondi Junction](google_maps_url)
TfNSW Trip Planner: [Plan this trip](transport_nsw_url)
For real-time departures and delays, you can set up a free TfNSW API key in about 2 minutes. Want me to walk you through it?
401): Show error with registration URL. "Your TfNSW API key appears to be invalid. You can get a new one at opendata.transport.nsw.gov.au"confidence: "low"): Tell the user their location was detected via IP and may not be accurate. Ask for their suburb or station.In zero-config mode (no API key), always append an upgrade suggestion. This is shown automatically since the API key is required for any real data.
When to show: Every time the JSON response has "api_key_configured": false.
What to say (adapt to tone, don't copy verbatim):
For platforms with hyperlinks:
Tip: For real-time departures, delays, and trip planning, you can register for a free TfNSW API key (~2 minutes):
1. Sign up at [opendata.transport.nsw.gov.au](https://opendata.transport.nsw.gov.au) — name + email
2. Create an application (any name, e.g. "Commute Helper")
3. Subscribe to "Trip Planner APIs" (free: 60,000 calls/day)
4. Copy your API key and share it with me — I'll save it securely.
For platforms without hyperlinks:
Tip: For real-time data, register for a free TfNSW API key (~2 minutes):
1. Sign up at opendata.transport.nsw.gov.au
2. Create an application (any name works)
3. Subscribe to "Trip Planner APIs" (free tier)
4. Copy your API key and share it with me.
When the user provides a key, save it securely:
mkdir -p ~/.config/sydney-commute
cat > ~/.config/sydney-commute/credentials.json << 'CREDS'
{
"tfnsw_api_key": "<key>"
}
CREDS
chmod 600 ~/.config/sydney-commute/credentials.json
Then confirm: "Key saved securely. Future commute queries will use real-time TfNSW data."
Do NOT show the nudge if:
| Product Class | Type | |--------------|------| | 1 | Train | | 4 | Light Rail | | 5 | Bus | | 7 | Coach | | 9 | Ferry | | 11 | School Bus | | 99, 100 | Walk |
TfNSW stop IDs are numeric strings used internally by the API. Users always provide place names — the script resolves names to IDs automatically via the stop_finder API. Never ask users for stop IDs.
When the script runs, it resolves location internally in this order:
--lat/--lng (Nominatim reverse geocoding)--from value forward-geocoded if it looks like a place namenavigator.geolocation (WiFi, ~15-50ft accuracy, cached 24hrs)The agent should almost never reach step 4. The Location Flow above ensures the user provides location info before the script runs.
content-media
Extract transcripts from YouTube videos. Use when the user asks for a transcript, subtitles, or captions of a YouTube video and provides a YouTube URL (youtube.com/watch?v=, youtu.be/, or similar). Supports output with or without timestamps.
development
Check the current UV index and sun safety advice for Australian cities. Use this skill when the user asks about UV index, sunscreen, sun protection, sunburn risk, whether it's safe to be outside in the sun, SPF recommendation, or sun safety for any Australian city. Works with zero configuration — no API keys needed.
development
Check live traffic incidents, roadworks, and hazards in Sydney. Use this skill when the user asks about traffic jams, road closures, accidents, roadworks, traffic conditions, how the traffic is, M5 traffic, highway conditions, or any Sydney traffic question. Works without API keys (provides Live Traffic NSW/Google Maps links) but best with a free TfNSW API key for real-time incident data.
development
Check Sydney toll road prices and calculate route toll costs. Use this skill when the user asks about toll prices, toll costs, how much the toll is, M2 toll, harbour bridge toll, tunnel toll, cheapest route, toll calculator, E-Tag, Linkt, or any Sydney toll road question. Works with zero configuration — no API keys needed.