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 |
refresh_on_return |
boolean | false |
Regenerate a dynamic root after returning from a submenu |
[[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") |
id |
string | no | "" |
Stable per-menu identity for refreshed selection |
menu |
table | no | - | Submenu declaration, exclusive with command fields |
Validation Rules
- A root requires nonempty
[[entries]]or a[provider]declaration. - Every entry needs
nameand eithercommandormenu. 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
See Also
- LaunchLine (Rust) — a Rust implementation with the shared configuration and keyboard contract, ships as a single native binary.
Compatibility and validation
Use launchline --check-config to validate configuration without opening the menu.
Set NO_COLOR for a selection marker without ANSI color. See the
compatibility matrix, reproducible test and performance
results, and release readiness.
[provider]
The same table is accepted under entries.menu.provider. See the
menu lifecycle and provider contract for nesting, caching,
refresh/back behavior, limits, errors and examples.
| Field | Type | Default | Description |
|---|---|---|---|
command |
string | required | Explicit trusted provider executable |
args |
string array | [] |
Literal argv |
env |
string table | {} |
Environment overlay |
working_directory |
string | inherited | Provider working directory |
timeout_seconds |
integer | 10 |
Deadline from 1 to 300 seconds |
Metadata
Release files for launchline 0.4.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| launchline-0.4.0.tar.gz | 327.8 kB | With provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| launchline-0.4.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 382.6 kB
Release files / launchline-0.4.0.tar.gz
| Download URL | launchline-0.4.0.tar.gz |
|---|---|
| Size | 327.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
6d38d354de3d34b2bc6ce0b85322263e9f468cb746d37090e833d78f9a70ee75
|
|
BLAKE2b-256 checksum How to use checksums |
4681f427348aca9120b9d7a922dc09ceabcef91b5b653924262c83440bab0a5e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 23, 2026.
Transparency logRelease files / launchline-0.4.0-py3-none-any.whl
| Download URL | launchline-0.4.0-py3-none-any.whl |
|---|---|
| Size | 54.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
94d419694eabc0a449ddccce94f1379252f8e4b50cf5ea230698e7b7a6a8abd4
|
|
BLAKE2b-256 checksum How to use checksums |
3d1ceee0a67e72d46cbce79736a7c8a6fc1a4a0483a1512c35d347a52d9799a0
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 23, 2026.
Transparency logSecurity for launchline 0.4.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for launchline-0.4.0.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 23, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.