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.
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 lazyaddon-1.0.0.tar.gz.
File metadata
- Download URL: lazyaddon-1.0.0.tar.gz
- Upload date:
- Size: 36.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0b2b8448c293a319e6b0fc41715af73942fc257e69d4e4cd116a62bc7ebe9d59
|
|
| MD5 |
795727aa27d8db78c77213cb11d634d7
|
|
| BLAKE2b-256 |
3f556da414e348878f93904061422b0a4aff03687c6e851da6fe210468ad7c9e
|
File details
Details for the file lazyaddon-1.0.0-py3-none-any.whl.
File metadata
- Download URL: lazyaddon-1.0.0-py3-none-any.whl
- Upload date:
- Size: 35.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
da627f9f8abfc038a254b2a3241187535de3c29541f67ff2385eb250acb583ee
|
|
| MD5 |
3701103356b551a526aa31506fe3f6b0
|
|
| BLAKE2b-256 |
a35f5756305075d8e2636a8b579ed71aa5a92994016c9fd97e49a936926eebb7
|