A terminal-based TUI for browsing IVS session schedules with fast filtering and keyboard navigation
Project description
IVS Sessions Browser v4 (dev)
A terminal-based TUI for browsing IVS session schedules: master and intensives, with fast filtering, keyboard navigation, and colorized status.
It is worth noting that this script is developed on Linux, for Linux terminal and optimized for a dark background! It is not tested by me on anything else. If you have any question, comment or feedback to this script; Send email -jole 2026
- TUI: curses interface with smooth navigation
- Filters: powerful, composable query language
- Colors: quick status scanning (Released / Processing / Waiting / Cancelled / None)
- Open in browser: jump to the IVS page for a session
- Station filtering: filter active/removed/all station sets in expressions
- Jump to today: one-key shortcut to the current session row
- Inline help:
?shows a centered help box
See also:
- ๐
docs/USER_GUIDE.md - ๐
docs/FILTER_SYNTAX.md - โจ๏ธ
docs/KEY_BINDINGS.md - ๐บ๏ธ
docs/ROADMAP.md
Project layout
ivs_sessions_browser/
โโ docs/
โ โโ ARCHITECTURE.md
โ โโ FILTER_SYNTAX.md
โ โโ KEY_BINDINGS.md
โ โโ ROADMAP.md
โ โโ USER_GUIDE.md
โโ scripts/
โ โโ run_sessions_browser.py # launcher (imports package main)
โโ src/
โ โโ ivs_sessions_browser/
โ โโ __init__.py # CLI entry point (main())
โ โโ __main__.py # allows `python -m ivs_sessions_browser`
โ โโ operators.json # packaged default operator bindings
โ โโ defs.py # constants, headers, argument help text
โ โโ fetch_sessions.py # network fetch + response handling
โ โโ filter_and_sort.py # filtering and sorting logic
โ โโ ivstypes.py # type definitions and data classes
โ โโ operators.py # operator management and persistence
โ โโ sessions_browser.py # main TUI loop and orchestration
โ โโ tui.py # TUI rendering (headers, rows, help)
โ โโ tui_state.py # UI state dataclass and theme
โ โโ version.py # version info (generated by setuptools-scm)
โโ operators.json # source copy of default operator bindings
โโ operator_assignments.json # local assignment file, ignored by git
โโ pyproject.toml
โโ requirements.txt # python requirements for the project
โโ run_browser # bash wrapper script
โโ LICENSE
โโ README.md
Note: The project uses the src/ layout. For development, install it with
pip install -e .. Inside PyCharm, marksrc/as Sources Root or use the editable virtualenv interpreter. User-editable settings are read from~/.config/ivs-sessions-browser/. Missingoperators.jsonandpdf_columnsfiles are created there from defaults the first timeivs-sessions-browserruns. Edit~/.config/ivs-sessions-browser/operators.jsonto replace the defaultU1-U5operator labels with your local operator names.
Requirements
- Python 3.10+
- Linux/macOS terminal with curses support
Windows users:
pip install windows-curses - Internet access to fetch schedules from ivscc.gsfc.nasa.gov, or any of the mirror sites
Installation
git clone git@github.com:jonleithe/ivs_sessions_browser.git
cd ivs_sessions_browser
python3 -m venv .venv
source .venv/bin/activate # Windows PowerShell: .\.venv\Scripts\Activate.ps1
pip install -r requirements.txt
Editable development install
pip install -e .
You can now run:
ivs-sessions-browser
On Windows, use .\.venv\Scripts\ivs-sessions-browser.exe.
To create the editable default config files without starting the TUI:
ivs-sessions-browser --init-config
How to run (terminal)
You have multiple equivalent ways. Pick your favorite:
A) Console script (recommended after install)
ivs-sessions-browser
B) Wrapper script
run_browser is included in the project root:
./run_browser
C) Run the package as a module
python -m ivs_sessions_browser
Usage
Most usage is interactive (TUI). Command-line flags typically include:
--year 2025 # single year
--year "2022,2023" # explicit multi-year list
--year "2022-2025" # inclusive year range
--scope master|intensive|both # select scope
--filters "code:R1|R4" # initial filter expression
--output - # write text output to stdout and exit
--pretty-print OP|TYPE|STATIONS
--format pdf # write a colored PDF using the same pretty-printed lines
--verbose-fetch # show fetch/progress output even with --output
Run with -h/--help (help) to see current options.
Once inside the TUI:
- Use arrow keys / PgUp / PgDn / Home / End to navigate
- Press
Tto jump to today - Press
/to enter/edit a filter - Press
Cto clear filters - Press
0-5to assign an operator to the selected session (or clear with '0') - Press
Enterto open the selected session in your browser - Press
?for inline help - Press
q/Qto quit
Inline help (?)
Navigation:
โ โ PgUp PgDn Home End Move around the session list
T Jump to todayโs session
Enter Open session page in web browser
q or Q Quit
Filtering:
/ Enter a filter expression
C Clear current filters
Examples:
code:R1|R4 โ match sessions with code R1 or R4
stations:Nn&Ns โ sessions including both Nn and Ns
stations_removed:Ft|Ur โ removed stations include Ft or Ur
Operator Assignment:
0-5 Assign operator to selected session
(operators configured in ~/.config/ivs-sessions-browser/operators.json)
Other:
? Show this help screen
Notes:
- Station names are **case-sensitive**
- Other fields are **case-insensitive**
- Clauses separated by `;` are AND
- Tokens separated by space, `,`, `+`, or `|` are OR
Full details:
- ๐ Filtering:
docs/FILTER_SYNTAX.md - โจ๏ธ Keys:
docs/KEY_BINDINGS.md
Export formats
--format textwrites the ANSI-colored textual listing.--format pdfwrites a monospaced PDF that preserves the existing header and row colors from the textual export.--appendonly applies to text output; PDF export always writes a new file.
Example:
./run_browser --year 2025 --output sessions.pdf --format pdf
Filter basics (quick primer)
- Clauses separated by
;are AND. - Stations fields are case-sensitive.
- Other fields are case-insensitive.
- Within a non-station field, tokens split by space/comma/
+/|are OR.
Examples:
code:R1|R4โ codes matching R1 or R4stations:Nn&Nsโ requires both Nn and Ns present (active stations)stations_removed:Ag|Kkโ removed stations include Ag or Kkstations_active:Ft|Urโ active stations include Ft or Urstations_all:Ke|Oeโ any stations (active or removed) include Ke or Oe- Combine filters:
code:R1|R4; stations:Nn&Ns; status:released
Troubleshooting
ModuleNotFoundError: No module named 'ivs_sessions_browser'
Use one of:
pip install -e ., thenivs-sessions-browser./run_browserwrapper- In PyCharm, use the project virtualenv or mark
src/as Sources Root
Windows: curses import error
Install: pip install windows-curses.
No colors / weird characters
Use a modern terminal with UTF-8 and 256-color support; ensure $TERM is e.g. xterm-256color.
Versioning
This project uses setuptools-scm. Version strings are derived from Git tags. To cut a release:
git tag v3.0
git push --tags
Contributing
- Keep the TUI responsive; avoid blocking network calls on the UI thread.
- Prefer small, focused modules under
src/ivs_sessions_browser/. - Write clear commit messages; tag releases for versioning.
License
MIT โ see LICENSE.
Acknowledgments
- IVS Central Bureau & Goddard Space Flight Center for session listings
- Contributors and testers across Ny-ร lesund & Brandal observatories
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 ivs_sessions_browser-4.0.5.tar.gz.
File metadata
- Download URL: ivs_sessions_browser-4.0.5.tar.gz
- Upload date:
- Size: 163.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
cfb7c1f22dccad62fa6ec08934555a81fe33da01b968d0cb728351e322477425
|
|
| MD5 |
6b80ff6d6173d9583bbccbf73a0266b8
|
|
| BLAKE2b-256 |
24ab0af53285ad6dd09d5763bb783318963e92f2ee4d3687b04a08f58f25a797
|
Provenance
The following attestation bundles were made for ivs_sessions_browser-4.0.5.tar.gz:
Publisher:
publish.yml on jonleithe/ivs_sessions_browser
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
ivs_sessions_browser-4.0.5.tar.gz -
Subject digest:
cfb7c1f22dccad62fa6ec08934555a81fe33da01b968d0cb728351e322477425 - Sigstore transparency entry: 1397642799
- Sigstore integration time:
-
Permalink:
jonleithe/ivs_sessions_browser@ecb09ce322a19972b34f96293dc84300293463ef -
Branch / Tag:
refs/tags/v4.0.5 - Owner: https://github.com/jonleithe
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@ecb09ce322a19972b34f96293dc84300293463ef -
Trigger Event:
release
-
Statement type:
File details
Details for the file ivs_sessions_browser-4.0.5-py3-none-any.whl.
File metadata
- Download URL: ivs_sessions_browser-4.0.5-py3-none-any.whl
- Upload date:
- Size: 58.2 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 |
6677feec88f742feecc7e49b4623b24199ad7deddcdcc9897c3220d6a948d6c8
|
|
| MD5 |
a86c9932b73a0c683cbede506ca35a80
|
|
| BLAKE2b-256 |
95e8e1c03f7e68b5c524896ff12a88de517f84502496900706ce28a9bdbbed06
|
Provenance
The following attestation bundles were made for ivs_sessions_browser-4.0.5-py3-none-any.whl:
Publisher:
publish.yml on jonleithe/ivs_sessions_browser
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
ivs_sessions_browser-4.0.5-py3-none-any.whl -
Subject digest:
6677feec88f742feecc7e49b4623b24199ad7deddcdcc9897c3220d6a948d6c8 - Sigstore transparency entry: 1397642831
- Sigstore integration time:
-
Permalink:
jonleithe/ivs_sessions_browser@ecb09ce322a19972b34f96293dc84300293463ef -
Branch / Tag:
refs/tags/v4.0.5 - Owner: https://github.com/jonleithe
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@ecb09ce322a19972b34f96293dc84300293463ef -
Trigger Event:
release
-
Statement type: