Command line
The timetable in your terminal.
The same offline journey planner that powers the apps, as a single static binary for Linux. Download the Swiss timetable once, then search it from any shell — on a laptop without signal, over SSH on a server, or wired into your own scripts.
Install
Download the tarball from the downloads section, unpack it,
and put the binary somewhere on your PATH. It is self-contained —
no runtime, no packages, no root required.
$ tar -xzf spickme-cli-*-linux-x86_64.tar.gz $ install -D spickme-cli-*/spickme ~/.local/bin/spickme $ spickme --help
To verify the download, compare it against the release’s SHA256SUMS:
$ sha256sum --ignore-missing -c SHA256SUMS spickme-cli-0.2.3-linux-x86_64.tar.gz: OK
Your first search
Fetch the current Swiss timetable (a one-time download of a few hundred megabytes,
stored under ~/.local/share/spickme/), then plan a journey:
$ spickme download --all $ spickme query --from "Zürich HB" --to "Bern" Journey 1 │ 17:04 → 18:02 │ 58min │ direct -- 17:04 Zürich HB (Pl. 32) IC 8 → Brig -- 18:02 Bern (Pl. 7)
Stop names match the official Swiss naming — "Zürich HB",
"Bern, Zytglogge" — and a close-enough name resolves to its best match.
From here, every search runs entirely on your machine: no server, no account, no signal
needed.
Stops, addresses, anywhere
--from and --to take three kinds of place,
tried in that order: a coordinate written 47.4979,8.7241; the stop the timetable has,
because stations lead; and an address, where no stop answers to what you typed. Addresses come from
a separate one-time download — every official Swiss address and place name in a single file:
$ spickme placesWithout it the first two work exactly as they always have. Where a
name could mean several places, the CLI says on stderr which one it took — and
spickme where prints the whole shortlist. Every label it prints is itself a valid
--from, --to or --via, so the answer to one command is the
input to the next.
Examples
Leave at a specific time — local Swiss time, 24-hour clock:
$ spickme query --from "Basel SBB" --to "Lugano" --at 2026-08-15T06:30Start at a front door — a hospital, a street, anywhere with a name, and the walk to the stop is part of the answer:
$ spickme query --from "Kantonsspital Winterthur" --to "Bern" Reading "Kantonsspital Winterthur" as Kantonsspital Winterthur (47.505200,8.712300). Journey 1 │ 08:51 → 10:09 │ 1h18m │ direct Walk 561 m (9 min) to Winterthur -- 09:00 Winterthur (Pl. 5) IC 5 → Lausanne -- 10:09 Bern (Pl. 7)
Ask what a name means — the terminal’s
answer to a dropdown, with --json for scripts:
$ spickme where "Bahnhofstrasse" --near Winterthur → Bahnhofstrasse, Winterthur address 47.501000,8.725000 Bahnhofstrasse, Zürich address 47.372000,8.539000
Plan a day out — several places in one day, with time spent at some of them:
$ spickme trip --from Bern --via "Interlaken Ost=45" \ --via "Grindelwald=240:hiking" --to Bern Leaving 07:34, home 19:02. 4h12m of it on a train.
See every stop along the way, for picking the quiet end of the platform or knowing where you are in the tunnel:
$ spickme query --from "Luzern" --to "Engelberg" --show-intermediateCheck ticket coverage — whether automatic ticketing, the GA or the Half Fare travelcard applies to each leg:
$ spickme query --from "Genève" --to "Zermatt" --show-coverageMore alternatives, fewer changes — widen the answer or cap the transfers:
$ spickme query --from "St. Gallen" --to "Sion" --limit 12 --max-transfers 2The full-screen browser — an interactive terminal UI with the same searches, for when you are staying a while:
$ spickme tuiAuf Deutsch — help texts and results in Swiss Standard German:
$ spickme --language de-CH query --from "Chur" --to "Arosa"Keep the timetable fresh — re-run the download whenever you like; files already up to date are skipped:
$ spickme download --year 2026Command reference
| Command | What it does |
|---|---|
spickme query | Plan journeys between two places — a stop, an address or LAT,LON at either end. --from and --to are required; --at, --limit, --max-transfers, --show-intermediate and --show-coverage refine the answer. |
spickme trip | Plan a day out: --from, any number of --via places, and --to. --via "Grindelwald=240:hiking" stays four hours; --via "Zermatt=@09:00" leaves at nine, which is a night away. |
spickme where | Show what a place name means, and what else it could have meant. --near settles ties, --json is for scripts. |
spickme places | Download the gazetteer of Swiss addresses and place names, or remove it with --delete. Optional: stops work without it. |
spickme point-to-point | The coordinate planner named directly, carrying --strategy and --timing-json for measuring it. spickme query answers the same question. |
spickme tui | The interactive terminal UI. |
spickme download | Fetch timetable data: --all for everything on offer, --year for a specific year, --url for a direct file. |
spickme diff | Compare two timetable files — what changed between releases. |
spickme help | Full help for any command, e.g. spickme help query. |
Global flag: --language en or --language de-CH.
Where your data lives
Everything stays on your machine. Timetables are plain files under
~/.local/share/spickme/ (or $XDG_DATA_HOME/spickme/); searches run
locally against them, and the CLI makes no network requests except when you run
spickme download or spickme places. Deleting that directory removes
everything.