Skip to main content

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

  1. -c /path/to/config.ini (explicit)
  2. ./config.ini (current directory)
  3. $XDG_CONFIG_HOME/lt-rtpi-display/config.ini (usually ~/.config/...)
  4. /etc/lt-rtpi-display/config.ini (system-wide, good for kiosk)
  5. 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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

lt_rtpi_display-0.2.0.tar.gz (12.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

lt_rtpi_display-0.2.0-py3-none-any.whl (14.0 kB view details)

Uploaded Python 3

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

Hashes for lt_rtpi_display-0.2.0.tar.gz
Algorithm Hash digest
SHA256 b9e1d5a636c8d80cc76c1bb2eb35276e28c1de209f70f66001cf406c0e6e330d
MD5 64f0518a80f05916847f86d03a59494f
BLAKE2b-256 a3a301aabc40d2b1529391e8b4c54a744dcf602fcd3e61fa894a1b10fe6ce42d

See more details on using hashes here.

Provenance

The following attestation bundles were made for lt_rtpi_display-0.2.0.tar.gz:

Publisher: publish.yml on sergeykolosov/lt-rtpi-display

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file lt_rtpi_display-0.2.0-py3-none-any.whl.

File metadata

File hashes

Hashes for lt_rtpi_display-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 28b3a413f4763283e9cf065c15026f7f72d4199bcacaef66f69ab71be7c28a53
MD5 cd5fdfdcf83842e4d44c75d6bcac949b
BLAKE2b-256 47845a2eba9ff29150d6790a85f33489117ecb727647c603acb7ede59c4238f5

See more details on using hashes here.

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

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page