Bahn

v1.0.0

A comprehensive suite of commands for tracking Deutsche Bahn trains

0· 304·0 current·0 all-time
byJakub@ableitung
Security Scan
VirusTotalVirusTotal
Benign
View report →
OpenClawOpenClaw
Benign
high confidence
Purpose & Capability
Name/description match the code and declared dependencies: the skill fetches data from bahn.expert, IRIS (iris.noncd.db.de) and a Vendo client, uses fast-xml-parser and devalue as expected, and exposes station search, departures, journey, live, parse, predict and stats commands. Minor metadata inconsistency: registry metadata listed no homepage while SKILL.md references a GitHub repo — this is informational only and does not affect capability alignment.
Instruction Scope
SKILL.md instructs running the provided CLI (node scripts/bahn.mjs). The runtime instructions and code only read stdin or a user-specified file, parse connection text, and (expectedly) save parsed connections to connections/active.json. The code performs network requests only to train-data endpoints described in the README (bahn.expert, IRIS, and Vendo). No instructions ask the agent to read unrelated system files or environment secrets.
Install Mechanism
Install spec is Node packages (db-vendo-client, devalue, fast-xml-parser) — a standard package manager flow. No arbitrary URL downloads or archive extraction were used. This is a moderate-but-expected install surface for a Node CLI.
Credentials
The skill requests no environment variables or credentials. All network access is to the external data sources necessary for train data. There are no unexplained secret requests or unrelated credential requirements.
Persistence & Privilege
The skill writes a local file connections/active.json when parsing plaintext input (intended behavior for later --live/--stats usage). It does not request always:true or modify other skills. Users should be aware it will create/overwrite files in the working directory.
Assessment
This skill appears to do what it says: parse connection text, query train data from bahn.expert/IRIS/Vendo, optionally compute predictions, and write a local connections/active.json file. Before installing: (1) confirm you trust the remote endpoints (bahn.expert, iris.noncd.db.de and any Vendo API) since the skill makes network requests; (2) review the npm packages (db-vendo-client, devalue, fast-xml-parser) and their maintainers if you require higher assurance; (3) run the skill in a restricted/isolated directory if you want to avoid the connections/active.json file being written or overwritten; (4) no secrets are requested, but network traffic is part of normal operation — block or sandbox if that is a concern.

Like a lobster shell, security has layers — review code before you run it.

Runtime requirements

🚆 Clawdis
OSmacOS · Linux
Binsnode

Install

Nodenpm i -g db-vendo-client
Nodenpm i -g devalue
Nodenpm i -g fast-xml-parser
latestvk97efdzxdpyk9brqy07d0xsh9x82drpk
304downloads
0stars
1versions
Updated 1mo ago
v1.0.0
MIT-0
macOS, Linux

Bahn

A comprehensive suite of commands for Deutsche Bahn trains - live departures, delay tracking, Baustellen/disruption alerts, journey planning, connection parsing, historical delay stats, and delay predictions. No API keys needed.

Flags

FlagWhat it doesWhen to use
--predictRuns the exponential delay model (transferProb, zugbindungProb)User asks about probability of catching a transfer or Zugbindung being lifted
--statsFetches historical bahn.expert aggregate data per trainUser asks about historical delay patterns for a specific train

Examples

# Search for a train station
node scripts/bahn.mjs --search "Wuppertal" [--json]

# Find latest departures from a given station
node scripts/bahn.mjs --departures "Wuppertal Hbf" [--results N] [--json]

# Default: Parse and show live data
echo '<raw Navigator share text>' | node scripts/bahn.mjs --parse [--json]

# With prediction model (transferProb, zugbindungProb)
echo '<text>' | node scripts/bahn.mjs --parse --predict [--json]

# With historical stats from bahn.expert
node scripts/bahn.mjs --parse connections/active.json --stats [--json]

# Both
node scripts/bahn.mjs --parse connections/active.json --predict --stats [--json]

# Find a given journey in timetable
node scripts/bahn.mjs --journey "From" "To" [--date YYYY-MM-DD] [--time HH:MM] [--results N] [--days N] [--json]

# Get current delays
node scripts/bahn.mjs --live --current-leg N [--delay M] connections/active.json [--json]

# Find a specific train by number and category (example: ICE 933)
node scripts/bahn.mjs --category CAT --train NUM [--date YYYY-MM-DD] [--json]

File Layout

scripts/
├── bahn.mjs                    ← thin CLI dispatcher (~60 lines)
├── lib/
│   ├── commands/             ← one module per mode
│   │   ├── search.mjs        ← --search: station lookup
│   │   ├── departures.mjs    ← --departures: live departure board
│   │   ├── parse.mjs         ← --parse: connection parsing + enrichment
│   │   ├── journey.mjs       ← --journey: route search
│   │   ├── live.mjs          ← --live: real-time transfer check
│   │   └── track.mjs         ← --track: train tracking
│   ├── helpers.mjs           ← shared helpers (envelope, transfers, assessment)
│   ├── data.mjs              ← source router (IRIS/Vendo/bahn.expert)
│   ├── predict.mjs           ← probability model (opt-in via --predict)
│   ├── stats.mjs             ← delay profiles + historical stats (opt-in via --stats)
│   ├── parse.mjs             ← connection text parser
│   ├── format.mjs            ← output formatter
│   ├── messageLookup.mjs     ← IRIS delay code lookup
│   └── sources/
│       ├── bahn-expert.mjs   ← bahn.expert tRPC source
│       ├── iris.mjs          ← IRIS XML source
│       └── vendo.mjs         ← db-vendo-client source

JSON Envelope

All modes support --json:

{
  "mode": "string",
  "timestamp": "ISO8601",
  "connection": { "date", "from", "to", "legs", "transfers" },
  "journeyOptions": { "from", "to", "date", "options" },
  "departures": { "station", "entries" },
  "stations": { "query", "results" },
  "liveStatus": { "currentLeg", "nextTransfer", "zugbindungStatus", "recommendation", "remainingTransfers" },
  "trackStatus": { "train", "from", "to", "stops", "maxDelay", "zugbindungStatus" },
  "assessment": null,
  "errors": [],
  "warnings": []
}

The assessment field is only populated when --predict is used. Without it, assessment is null.

Prediction Model (predict.mjs) — opt-in only

Exponential delay distributions per train category. Only loaded when --predict is passed.

CategoryMean delayCancel rate
ICE5.0min5.5%
IC/EC4.0min4.0%
RE2.5min2.0%
RB2.0min1.5%
S1.5min1.0%
Bus3.0min2.0%

P(Zugbindung triggered) per leg = exp(-20/mean). Overall P(Zugbindung) = 1 - ∏(1 - P(leg_i ≥ 20min)).

Coverage

Long-distance (ICE/IC/EC), regional (RE/RB), S-Bahn, buses, and international trains to neighboring countries.

Report issues and legal information here: https://github.com/ableitung/openclaw-bahn

Comments

Loading comments...