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.

shell
$ 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:

shell
$ sha256sum --ignore-missing -c SHA256SUMS
spickme-cli-0.2.3-linux-x86_64.tar.gz: OK

Fetch the current Swiss timetable (a one-time download of a few hundred megabytes, stored under ~/.local/share/spickme/), then plan a journey:

shell
$ 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:

shell
$ spickme places

Without 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:

shell
$ spickme query --from "Basel SBB" --to "Lugano" --at 2026-08-15T06:30

Start at a front door — a hospital, a street, anywhere with a name, and the walk to the stop is part of the answer:

shell
$ 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:

shell
$ 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:

shell
$ 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:

shell
$ spickme query --from "Luzern" --to "Engelberg" --show-intermediate

Check ticket coverage — whether automatic ticketing, the GA or the Half Fare travelcard applies to each leg:

shell
$ spickme query --from "Genève" --to "Zermatt" --show-coverage

More alternatives, fewer changes — widen the answer or cap the transfers:

shell
$ spickme query --from "St. Gallen" --to "Sion" --limit 12 --max-transfers 2

The full-screen browser — an interactive terminal UI with the same searches, for when you are staying a while:

shell
$ spickme tui

Auf Deutsch — help texts and results in Swiss Standard German:

shell
$ 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:

shell
$ spickme download --year 2026

Command reference

CommandWhat it does
spickme queryPlan 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 tripPlan 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 whereShow what a place name means, and what else it could have meant. --near settles ties, --json is for scripts.
spickme placesDownload the gazetteer of Swiss addresses and place names, or remove it with --delete. Optional: stops work without it.
spickme point-to-pointThe coordinate planner named directly, carrying --strategy and --timing-json for measuring it. spickme query answers the same question.
spickme tuiThe interactive terminal UI.
spickme downloadFetch timetable data: --all for everything on offer, --year for a specific year, --url for a direct file.
spickme diffCompare two timetable files — what changed between releases.
spickme helpFull 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.