Skip to content

Development

WoompaLoompa edited this page Aug 9, 2026 · 8 revisions

Development

Repository layout

  • clink/ — extension package (see Architecture)
  • tests/ — pytest suite
  • .github/workflows/release.yml — tag-triggered release pipeline
  • tools/update_extensions.py — registry updater for the LNbits extension market

Running tests

The repo basename lnbits-clink is not a valid Python identifier, and LNbits loads the extension from its extensions/clink folder. tests/run_tests.sh reproduces that by symlinking the repo into a temp dir named clink:

# with lnbits installed in the active environment
tests/run_tests.sh

# or pointing at a specific interpreter
PYTEST_PYTHON=/path/to/venv/bin/python tests/run_tests.sh

# run one file
tests/run_tests.sh -q clink/tests/test_subscriptions.py

The suite covers the protocol layer (NIP-44 vectors, bech32 codecs, event sign/verify), the node service, Pay Offers, and the subscriptions engine. It also contains tests/vectors/nip44.vectors.json, a curated NIP-44 test vector set.

Linting & formatting

python -m ruff check .
python -m black --check .
  • Target: Python >= 3.10, line length 88.
  • nostr/ and tests/vectors/ are excluded from mypy; ruff/black run over the whole tree.

Release pipeline

.github/workflows/release.yml is triggered by a version tag (e.g. v0.1.0):

  1. Builds a release artifact (the extension zip) and drafts a GitHub release.
  2. Runs tools/update_extensions.py, which updates the registry and opens a pull request against lnbits/lnbits-extensions so the extension shows up in the LNbits extension manager.

To cut a release:

git tag v0.1.0
git push origin v0.1.0

The auto-PR needs an EXT_GITHUB secret (a token with access to the lnbits/lnbits-extensions fork) configured in the repository settings.

Conventions

  • Commit messages follow feat: … / fix: … style (see git log).
  • All commits are authored under a dedicated extension identity (WoompaLoompa / 06bc1a977d@atomicmail.io).
  • No new Python dependencies: protocol primitives are implemented in clink/nostr on top of LNbits' bundled packages.

Clone this wiki locally