A lightweight terminal launcher for interactive CLI tools.
Project description
LaunchLine
A lightweight terminal launcher for interactive CLI tools. Define your frequently used commands in a TOML config file, then pick them from a fuzzy-searchable menu instead of remembering flags and paths.
Why
Switching between CLI tools — AI assistants, shells, dev utilities — means remembering commands, flags, working directories, and environment variables. LaunchLine puts them all in one menu so you press a number or type a few letters instead.
Features
- Fuzzy search — type any substring to narrow the list instantly
- Numbered shortcuts — press a digit to launch directly
- Per-entry environment and working directory — set once, forget forever
- Auto-restart or exit — configurable behavior after a tool exits
- Zero runtime dependencies — pure Python 3.12+, nothing to install beyond itself
- Auto-generated starter config — creates
~/.config/launchline/config.tomlon first run if no config exists
| Fuzzy search | Arrow-key navigation |
|---|---|
Installation
From PyPI (recommended)
uv tool install launchline
Or with pip:
pip install launchline
From source
git clone https://github.com/mikejhill/launchline.git
cd launchline
uv tool install .
Run without installing
git clone https://github.com/mikejhill/launchline.git
cd launchline
uv sync --group dev
uv run launchline
Quick Start
- Run
launchline. If no config exists, a starter config is created at~/.config/launchline/config.toml. - Edit the config to add your tools.
- Run
launchlineagain.
Override the config path:
# CLI flag (highest priority)
launchline --config ~/my-config.toml
# Environment variable
export LAUNCHLINE_CONFIG=~/my-config.toml
launchline
Resolution order: --config flag > LAUNCHLINE_CONFIG env var > default path.
Configuration Reference
Config file format is TOML. The file has an optional
[settings] table and one or more [[entries]] tables.
[settings]
| Key | Type | Default | Description |
|---|---|---|---|
title |
string | "LaunchLine" |
Window/tab title shown while the launcher is active |
on_exit |
string | "restart" |
Behavior after a launched tool exits: restart or exit |
show_exit |
bool | true |
Show the Exit entry (shortcut 0) in the menu |
clear_on_launch |
bool | true |
Clear terminal before launching an entry |
ghost_text |
bool | true |
Show the highlighted entry name as an autocomplete hint on prompt |
numeric_trigger |
bool | true |
Pressing a digit immediately launches the matching entry |
[[entries]]
Each [[entries]] table defines one launchable tool:
| Key | Type | Required | Default | Description |
|---|---|---|---|---|
name |
string | yes | — | Display name shown in the menu |
command |
string | yes | — | Executable to run |
args |
list of strings | no | [] |
Arguments passed to the command |
description |
string | no | "" |
Short description shown next to the name |
working_directory |
string | no | — | Working directory for the subprocess |
env |
table | no | {} |
Extra environment variables (KEY = "value") |
Validation Rules
- At least one
[[entries]]table is required. - Every entry must have both
nameandcommand. on_exitmust be"restart"or"exit".argsmust be a list (not a bare string).envmust be a TOML table (not a string or list).- If
working_directorydoes not exist at load time, it is silently reset toNone(a warning is logged).
Example Config
[settings]
title = "My Tools"
on_exit = "restart"
show_exit = true
clear_on_launch = true
ghost_text = true
numeric_trigger = true
[[entries]]
name = "GitHub Copilot CLI"
command = "copilot"
[[entries]]
name = "Claude Code"
command = "claude"
description = "Anthropic coding agent"
working_directory = "~/projects"
[[entries]]
name = "PowerShell"
command = "pwsh"
args = ["-NoProfile"]
env = { TERM = "xterm-256color" }
Usage
| Key | Action |
|---|---|
1–9 |
Launch entry by number |
0 |
Exit (when show_exit is enabled) |
| Type any text | Fuzzy-filter the entry list |
Up / Down |
Move highlight |
Enter |
Launch highlighted entry |
Escape |
Clear filter (or exit if filter is empty) |
Backspace |
Delete last character from filter |
Ctrl+U |
Clear filter |
Windows Terminal Integration
Add LaunchLine as a Windows Terminal profile to use it as your default launcher.
The package bundles an icon that you can reference via launchline --icon-path:
// In your Windows Terminal settings.json → profiles.list
{
"name": "LaunchLine",
"commandline": "launchline",
"startingDirectory": "%USERPROFILE%",
// Run: launchline --icon-path
"icon": "C:/Users/you/.local/lib/.../launchline/assets/launchline.ico"
}
Set it as the default profile to see the launcher every time you open a terminal.
Development
uv sync --group dev
uv run pytest
uv run ruff check .
uv run mypy src
License
MIT
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 launchline-0.2.1.tar.gz.
File metadata
- Download URL: launchline-0.2.1.tar.gz
- Upload date:
- Size: 25.9 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ee3512162d7f48896c232a20cdbe21eb63fe032d8232302aa6604a717b7970ba
|
|
| MD5 |
f0bd40ca8ee0737f455ffe288a237141
|
|
| BLAKE2b-256 |
f1617be9845dbe733c0800bb899f0f461b50b92a171f6490017bd1468dff5494
|
Provenance
The following attestation bundles were made for launchline-0.2.1.tar.gz:
Publisher:
release.yml on mikejhill/launchline
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
launchline-0.2.1.tar.gz -
Subject digest:
ee3512162d7f48896c232a20cdbe21eb63fe032d8232302aa6604a717b7970ba - Sigstore transparency entry: 1201443518
- Sigstore integration time:
-
Permalink:
mikejhill/launchline@1954a25678afe430d16bd7257913809ff6dee336 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/mikejhill
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@1954a25678afe430d16bd7257913809ff6dee336 -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file launchline-0.2.1-py3-none-any.whl.
File metadata
- Download URL: launchline-0.2.1-py3-none-any.whl
- Upload date:
- Size: 44.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1d1545c43641b548795de3dc4157a7b2f0855a0cd279312fa023946bb8cd7fce
|
|
| MD5 |
8a3b585efbeedc67469bcf346d8c467e
|
|
| BLAKE2b-256 |
4d939b96a615a1b34e7d0cff6bf6d42a773efc0d33eea680c01444ea2d6e1668
|
Provenance
The following attestation bundles were made for launchline-0.2.1-py3-none-any.whl:
Publisher:
release.yml on mikejhill/launchline
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
launchline-0.2.1-py3-none-any.whl -
Subject digest:
1d1545c43641b548795de3dc4157a7b2f0855a0cd279312fa023946bb8cd7fce - Sigstore transparency entry: 1201443732
- Sigstore integration time:
-
Permalink:
mikejhill/launchline@1954a25678afe430d16bd7257913809ff6dee336 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/mikejhill
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@1954a25678afe430d16bd7257913809ff6dee336 -
Trigger Event:
workflow_dispatch
-
Statement type: