lazyaddon
Declarative tool and extension manager. Turn any GitHub/GitLab project into an
installable, runnable addon from a single YAML file — then use it
programmatically, from the lazyaddon CLI, or through a declarative project
file. Born from the spirit of LazyOwn's lazyaddons and Estorides' source
marketplace: simplify extending a tool by adding new sources, origins or apps
as versioned, shareable YAML addons.
Features
- YAML-declared addons with params, install and execute commands.
- Safe placeholder substitution (
{name}/{{ name }}) with shell-quoting of runtime-injected values to prevent command injection. - Security policy: allows only
httpsrepo URLs, optional host allow-list, length limits, and install paths that cannot escape the install root. - Install is idempotent: clone + build only when not already present.
- Marketplace:
add/removeregister new addons as YAML files. - Declarative project runner for non-programmers.
- Fully typed, single-file-per-contract, DRY and SOLID.
Installation
pip install lazyaddon
Quick start
Programmatic
from lazyaddon import LazyAddonEngine
engine = LazyAddonEngine() # configurable via AddonConfig
engine.discover() # scan ./addons/*.yaml
result = engine.run("beacon", {"lhost": "10.0.0.1"})
print(result.stdout)
CLI
lazyaddon list
lazyaddon run beacon --param lhost=10.0.0.1
lazyaddon add mytool --repo https://github.com/user/repo.git --cmd "./build.sh"
Declarative project YAML (non-programmers)
project.yaml:
install_root: external
addons_dir: addons
addons:
- name: beacon
install: true
run: true
params:
lhost: 10.0.0.1
lazyaddon project project.yaml
Addon schema
name: beacon
description: Builds and deploys a C2 beacon.
author: Red Team
version: "1.0"
enabled: true
os: any
category: 10. Command & Control
params:
- name: lhost
type: string
required: true
description: Listener host.
tool:
name: beacon
repo_url: https://github.com/grisuno/beacon.git
install_path: c2/beacon
install_command: make windows
execute_command: ./gen_beacon.sh --lhost {lhost}
lazycommand: encode --in payload.bin
remote_command: run --payload payload.bin
upload_file: payload.bin
download_file: C:\\results\\out.txt
env:
KEY: "{aes_key}"
Runtime parameter values are shell-quoted on substitution; YAML-declared
defaults are trusted and left unquoted.
Configuration
Every tunable knob lives in AddonConfig (no magic numbers):
| Field | Default | Purpose |
|---|---|---|
addons_dir |
addons |
Directory scanned for addon YAMLs |
install_root |
external |
Root for cloned repos |
allowed_repo_hosts |
() |
Allowed repo hostnames (empty = any https) |
allowed_repo_schemes |
("https",) |
Permitted repo URL schemes |
clone_depth |
1 |
git clone --depth |
command_timeout_seconds |
600 |
Subprocess timeout |
quote_runtime_values |
True |
Shell-quote runtime param values |
Security
See SECURITY.md. Key guarantees:
https-only repository URLs, optional host allow-list.- No arbitrary code evaluation in placeholders.
- Install paths confined to the install root (no traversal).
- Null-byte and length checks on commands.
- Shell-quoting of untrusted parameter values.
Development
pip install -e ".[dev]"
pytest # TDD/BDD suite
pytest --cov=lazyaddon # coverage
ruff check lazyaddon tests # lint
mypy lazyaddon # types
bandit -r lazyaddon # security scan
mutmut run --paths-to-mutate lazyaddon # mutation testing
python -m build # build sdist + wheel for PyPI
License
GPL-3.0-or-later. See LICENSE.
Metadata
Release files for lazyaddon 1.0.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 | |
|---|---|---|---|
| lazyaddon-1.0.0.tar.gz | 36.6 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| lazyaddon-1.0.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 72.0 kB
Release files / lazyaddon-1.0.0.tar.gz
| Download URL | lazyaddon-1.0.0.tar.gz |
|---|---|
| Size | 36.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
0b2b8448c293a319e6b0fc41715af73942fc257e69d4e4cd116a62bc7ebe9d59
|
|
BLAKE2b-256 checksum How to use checksums |
3f556da414e348878f93904061422b0a4aff03687c6e851da6fe210468ad7c9e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / lazyaddon-1.0.0-py3-none-any.whl
| Download URL | lazyaddon-1.0.0-py3-none-any.whl |
|---|---|
| Size | 35.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
da627f9f8abfc038a254b2a3241187535de3c29541f67ff2385eb250acb583ee
|
|
BLAKE2b-256 checksum How to use checksums |
a35f5756305075d8e2636a8b579ed71aa5a92994016c9fd97e49a936926eebb7
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|