Lightweight terminal departure board for public transport in Vilnius and other Lithuanian cities
Project description
lt-rtpi-display
A lightweight terminal departure board for public transport in Vilnius and other Lithuanian cities. Fetches real-time data from stops.lt API and renders a curses TUI — no browser, no desktop, no dependencies beyond Python 3.11+ stdlib. For a dedicated kiosk on a small screen, see Raspberry Pi kiosk setup.
MO muziejus | link centro
─────────────────────────────────────
T Rte Destination Due
─────────────────────────────────────
T 2 Saulėtekis Due
B 53 Fabijoniškės 2m
E 1g Santariškės 3m
B 10 Fabijoniškės 7m
T 2 Saulėtekis 10m
T 7 Perkūnkiemis 12m
B 88 Europos aikštė 14m
─────────────────────────────────────
22:41:08 [j] page 1/3 [n]ext [q]uit
Supported cities: Vilnius, Kaunas, Klaipėda, Panevėžys, Alytus, Druskininkai.
Quick start
# Run directly (no install needed):
uvx lt-rtpi-display --city vilnius 0103
# Or install permanently:
uv tool install lt-rtpi-display
lt-rtpi-display --city vilnius 0103
# Or from source:
git clone https://github.com/sergeykolosov/lt-rtpi-display
cd lt-rtpi-display
uv run lt-rtpi-display --city vilnius 0103
Configuration
For permanent setup, copy the example config and edit:
mkdir -p ~/.config/lt-rtpi-display
cp config.example.ini ~/.config/lt-rtpi-display/config.ini
[display]
city = vilnius # Or kaunas/klaipeda/panevezys/alytus/druskininkai
stop_ids = 0410, 0409 # Comma-separated stop IDs (at least one)
Config lookup order (first found wins):
-c /path/to/config.ini(explicit)./config.ini(current directory)$XDG_CONFIG_HOME/lt-rtpi-display/config.ini(usually~/.config/...)/etc/lt-rtpi-display/config.ini(system-wide, good for kiosk)- Built-in defaults
Find your stop ID on stops.lt — it appears in the URL when you select a stop. Use lt-rtpi-display --list to print all known stops, or lt-rtpi-display --city kaunas --list for another city.
For the full list of configurable options see config.example.ini.
CLI
lt-rtpi-display [stop_id] # Override configured stop
lt-rtpi-display -c /path/config.ini # Use a specific config file
lt-rtpi-display --list # List all stops and exit
# examples:
lt-rtpi-display "0103, 0104" # Run against multiple stops (switch with [n])
lt-rtpi-display --city klaipeda 0901 # Use a different city + specific stop
lt-rtpi-display --city kaunas --list # List stops for another city
Display
| Column | Content |
|---|---|
| T | T = trolleybus, B = bus, E = express bus, N = night bus |
| Rte | Route number (colored badge) |
| Destination | Final stop name |
| Due | Due (red) = imminent, Xm = minutes, HH:MM = scheduled |
Uses brand colors matching Vilnius public transport: red for trolleybuses, blue for buses, green for express, etc. Exact RGB when the terminal supports custom colors, nearest standard color otherwise.
Keyboard controls
| Key | Action |
|---|---|
j |
Next page |
k |
Previous page |
n |
Next stop |
q / Esc |
Quit |
Raspberry Pi kiosk setup
This is the original use case: a dedicated departure board running on a Raspberry Pi 1 with a Waveshare 3.2" RPi LCD (B) on DietPi — no desktop, just the framebuffer console on /dev/tty1.
Requirements
- Raspberry Pi (tested on Pi 1)
- Python 3.11+ (
sudo apt install python3) - Network access to
stops.lt
Autostart (systemd)
# On the Pi — install from PyPI:
python -m pip install lt-rtpi-display
# Set up config:
mkdir -p ~/.config/lt-rtpi-display
cp config.example.ini ~/.config/lt-rtpi-display/config.ini # Edit to set your stop_ids
# Or clone the repo and install from source:
# git clone https://github.com/sergeykolosov/lt-rtpi-display ~/lt-rtpi-display
# python -m pip install ~/lt-rtpi-display
# Install and enable the service:
sudo cp lt-rtpi-display.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable --now lt-rtpi-display.service
The service runs the installed lt-rtpi-display console script. It binds to /dev/tty1 with TERM=linux, matching how dietpi-cloudshell works on the framebuffer console.
Physical buttons
The Waveshare 3.2" LCD (B) has three GPIO buttons (K1/K2/K3). Configure actions in config.ini:
[gpio]
key1_pin = 18
key2_pin = 23
key3_pin = 24
key1_action = next_stop
key2_action = next_page
key3_action =
Available actions: next_stop, next_page.
The user (e.g. dietpi) must be in the gpio group: sudo usermod -aG gpio dietpi.
Development
Requires uv:
uv sync # Install dev dependencies + editable package
uv run lt-rtpi-display --help # Run via console script
uv run python -m lt_rtpi_display # Run via __main__
uv run -- ruff check # Lint
uv run -- ruff format # Format
uv run -- mypy # Type check
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file lt_rtpi_display-0.2.0.tar.gz.
File metadata
- Download URL: lt_rtpi_display-0.2.0.tar.gz
- Upload date:
- Size: 12.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b9e1d5a636c8d80cc76c1bb2eb35276e28c1de209f70f66001cf406c0e6e330d
|
|
| MD5 |
64f0518a80f05916847f86d03a59494f
|
|
| BLAKE2b-256 |
a3a301aabc40d2b1529391e8b4c54a744dcf602fcd3e61fa894a1b10fe6ce42d
|
Provenance
The following attestation bundles were made for lt_rtpi_display-0.2.0.tar.gz:
Publisher:
publish.yml on sergeykolosov/lt-rtpi-display
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
lt_rtpi_display-0.2.0.tar.gz -
Subject digest:
b9e1d5a636c8d80cc76c1bb2eb35276e28c1de209f70f66001cf406c0e6e330d - Sigstore transparency entry: 1252834071
- Sigstore integration time:
-
Permalink:
sergeykolosov/lt-rtpi-display@eb6929586e5535eda9828b069964e5d3692afc28 -
Branch / Tag:
refs/tags/0.2.0 - Owner: https://github.com/sergeykolosov
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@eb6929586e5535eda9828b069964e5d3692afc28 -
Trigger Event:
release
-
Statement type:
File details
Details for the file lt_rtpi_display-0.2.0-py3-none-any.whl.
File metadata
- Download URL: lt_rtpi_display-0.2.0-py3-none-any.whl
- Upload date:
- Size: 14.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
28b3a413f4763283e9cf065c15026f7f72d4199bcacaef66f69ab71be7c28a53
|
|
| MD5 |
cd5fdfdcf83842e4d44c75d6bcac949b
|
|
| BLAKE2b-256 |
47845a2eba9ff29150d6790a85f33489117ecb727647c603acb7ede59c4238f5
|
Provenance
The following attestation bundles were made for lt_rtpi_display-0.2.0-py3-none-any.whl:
Publisher:
publish.yml on sergeykolosov/lt-rtpi-display
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
lt_rtpi_display-0.2.0-py3-none-any.whl -
Subject digest:
28b3a413f4763283e9cf065c15026f7f72d4199bcacaef66f69ab71be7c28a53 - Sigstore transparency entry: 1252834157
- Sigstore integration time:
-
Permalink:
sergeykolosov/lt-rtpi-display@eb6929586e5535eda9828b069964e5d3692afc28 -
Branch / Tag:
refs/tags/0.2.0 - Owner: https://github.com/sergeykolosov
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@eb6929586e5535eda9828b069964e5d3692afc28 -
Trigger Event:
release
-
Statement type: