quiCkLI
quiCkLI is a minimal, educational Python framework for building command-line interfaces.
The package and import name is quickli. It supports Python 3.12, 3.13, and 3.14.
The project is in alpha. Select and test a released version before depending on its APIs. The online documentation follows the source checkout and may describe unreleased additions.
Installation
Install the published package in a virtual environment:
python -m venv .venv
source .venv/bin/activate
python -m pip install quickli
On Windows, activate the environment with .venv\Scripts\activate.
Your first command-line application
Save this example as hello.py:
from quickli import Application, Argument, Option
app = Application("hello", description="Greet a person.")
@app.entrypoint(
arguments=[Argument("name", help_text="Person to greet.")],
options=[Option("uppercase", short_name="u", is_flag=True)],
)
def greet(name: str, uppercase: bool = False) -> str:
message = f"Hello, {name}!"
return message.upper() if uppercase else message
if __name__ == "__main__":
raise SystemExit(app.main())
Run the application:
python hello.py Ada
python hello.py Ada -u
python hello.py --help
The first two calls print Hello, Ada! and HELLO, ADA!. The help request prints usage
without calling the handler. Application.main() prints results, reports errors to stderr,
and returns a process exit code. For library use and tests, app.run(["Ada"]) returns
the handler result without printing it.
Named commands
Use @app.command() for a CLI with several operations:
from quickli import Application, Argument, Option
app = Application("tasks")
@app.command(
arguments=[Argument("target")],
options=[Option("retries", converter=int, default=3)],
)
def deploy(target: str, retries: int = 3) -> str:
"""Deploy a target with a configurable retry count."""
return f"Deploying {target} with {retries} retries"
if __name__ == "__main__":
raise SystemExit(app.main())
Save it as tasks.py, then run python tasks.py deploy staging --retries 5.
Use python tasks.py deploy -h for command help. Nested subcommands support help too.
Explicit options claiming a help alias retain their behavior; set auto_help=False on
the application to disable automatic help.
Configuration
Define your own schema and choose YAML, JSON, or TOML:
from quickli import Application, Config, ConfigField, ConfigSchema
schema = ConfigSchema(fields=[
ConfigField("host", default="localhost"),
ConfigField("port", value_type=int, default=8080),
])
config = Config("settings.json", schema=schema)
app = Application("service", config=config, auto_init_config=True)
data = app.run(["init"])
print(data["host"])
The opt-in init command creates a missing configuration from schema defaults. If a file
already exists, initialization loads and validates it rather than resetting it.
Construction does not write files. When the automatic command is disabled, use
app.init_config() explicitly.
Loading does not merge missing defaults into existing files. Required fields without
defaults are left out of new templates and must be filled in before loading. JSON/YAML
configuration roots must be mappings with string keys. YAML files use PyYAML safe loading
and serialization; the separate quickli.parsers YAML string helpers support a smaller subset.
Features
- Single-action entrypoints, named commands, and nested subcommands.
- Positional arguments, local/global options, boolean flags, and repeatable options.
- Explicit converters and validators for checked input.
- Automatic
--helpand-hwith generated usage and docstring descriptions. - JSON/YAML/TOML configuration, validation, initialization, and JSON Schema export.
- Explicit plugin loading and Bash, Zsh, and PowerShell completion generation.
- Structured errors, exit codes, and optional JSON output through
Application.main().
Documentation and examples
- Getting started
- Application concepts
- Configuration
- Logging integration
- Packaging, executable binaries, and containers
- Source and runnable examples
- Issues
- Releases
License
MIT License. The distribution includes the full license text in LICENSE.
Metadata
Release files for quickli 0.6.1
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 | Actions |
|---|---|---|---|---|
| quickli-0.6.1.tar.gz | 46.6 kB | With provenance | Details for quickli-0.6.1.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| quickli-0.6.1-py3-none-any.whl | Python 3 | none | any | Details for quickli-0.6.1-py3-none-any.whl |
Total release size: 78.5 kB
Release files / quickli-0.6.1.tar.gz
| Download URL | quickli-0.6.1.tar.gz |
|---|---|
| Size | 46.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
e5bd000cfea500ff007109a58cc1c6be23a6237ecfdc77e1b4a825a112b7e557
|
|
BLAKE2b-256 checksum How to use checksums |
b84db3f60695a249ae05555aa7e2895cd70108c65e9710758dc258f76abc33fc
|
| 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 Nov 2, 2026.
Transparency logRelease files / quickli-0.6.1-py3-none-any.whl
| Download URL | quickli-0.6.1-py3-none-any.whl |
|---|---|
| Size | 31.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
1ebf19cf14319f0275959d9c99190947b5db87c2bcd932471428a3d44d5f8c86
|
|
BLAKE2b-256 checksum How to use checksums |
80a9a2ef4d84c855bf4a9c4927f2241f4a991742572fc34f707748e51af6426f
|
| 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 Nov 2, 2026.
Transparency logSecurity for quickli 0.6.1
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
Both files in this release have been uploaded with provenance metadata.
Attestation for quickli-0.6.1.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 Nov 2, 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.