{"id":25891652,"url":"https://github.com/lnbits/lnbits-extensions","last_synced_at":"2025-03-02T20:29:02.845Z","repository":{"id":65567831,"uuid":"563955547","full_name":"lnbits/lnbits-extensions","owner":"lnbits","description":"Registry for vetted LNbits extensions","archived":false,"fork":false,"pushed_at":"2024-04-12T18:04:22.000Z","size":6982,"stargazers_count":17,"open_issues_count":8,"forks_count":19,"subscribers_count":5,"default_branch":"main","last_synced_at":"2024-04-14T06:46:15.138Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://extensions.lnbits.com","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/lnbits.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null}},"created_at":"2022-11-09T17:27:51.000Z","updated_at":"2024-04-15T09:30:07.684Z","dependencies_parsed_at":"2024-04-15T09:40:17.585Z","dependency_job_id":null,"html_url":"https://github.com/lnbits/lnbits-extensions","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lnbits%2Flnbits-extensions","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lnbits%2Flnbits-extensions/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lnbits%2Flnbits-extensions/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lnbits%2Flnbits-extensions/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/lnbits","download_url":"https://codeload.github.com/lnbits/lnbits-extensions/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":241567353,"owners_count":19983479,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-03-02T20:29:02.272Z","updated_at":"2025-03-02T20:29:02.818Z","avatar_url":"https://github.com/lnbits.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# LNbits Vetted Extensions\n\nOfficial registry for vetted LNbits extensions\n\nTo submit an extension to this registry add your manifest into the [`extensions.json`](extensions.json) file in this repository.\n### Important\n\nOnly submit fully working extensions, the review process is not intended to improve the extension code.\n\nDo not add dependencies, LNbits has plenty of dependencies you can use.\n\nThe easier an extension is to review, the quicker the review process will be.\n\n### Manifest format\n\nThe file MUST use the `extensions` format:\n\n```json\n{\n    \"id\": \"gerty\",\n    \"repo\": \"https://github.com/lnbits/gerty\",\n    \"name\": \"Gerty\",\n    \"version\": \"0.1.2\",\n    \"short_description\": \"Your bitcoin assistant\",\n    \"icon\": \"https://raw.githubusercontent.com/lnbits/gerty/main/static/gerty.png\",\n    \"archive\": \"https://github.com/lnbits/gerty/archive/refs/tags/0.1.2.zip\",\n    \"hash\": \"baff0b6162ffb65cc0b4c721a4aa40a7d3d48acd55a3e344cba3eb1d35cf2074\"\n},\n```\n\nFor an exensions local [`manifest.json`](https://github.com/lnbits/gerty/blob/main/manifest.json) use the `repos` format:\n\n```json\n{\n    \"repos\": [\n        {\n            \"id\": \"gerty\",\n            \"organisation\": \"lnbits\",\n            \"repository\": \"gerty\"\n        }\n    ]\n}\n```\n\n### Paid extensions\nIt is possible for developers to require a payment for their extensions. In order to do so an extension release must have this field:\n```json\n   \"pay_link\": \"# payment URL\"\n```\n\n**Example**:\n```json\n{\n    \"id\": \"testext\",\n    \"repo\": \"https://github.com/lnbits/testext\",\n    \"name\": \"Test Extension\",\n    \"version\": \"0.5\",\n    \"short_description\": \"Private Test Extension\",\n    \"icon\": \"https://raw.githubusercontent.com/lnbits/example/main/static/bitcoin-extension.png\",\n    \"archive\": \"https://demo.lnbits.com/paywall/download/m2FVCFktJzMcGKXTaHbyhi\",\n    \"pay_link\": \"https://demo.lnbits.com/paywall/api/v1/paywalls/invoice/m2FVCFktJzMcGKXTaHbyhi\",\n    \"hash\": \"455527407fcfdc5e8aba93f16802d1083d36dcdfdde829f919cee07420791d61\"\n}\n```\n\nThe [Paywall LNbits Extension](https://github.com/lnbits/paywall/blob/main/README.md#file-paywall) can be used to serve the extension `zip` file.\n\nIf you do not want to use the [Paywall LNbits Extension](https://github.com/lnbits/paywall/) to server your extension, but instead you want to use your own paywall, then the `pay_link` endpoint must follow these specifications:\n\n\u003ctable\u003e\n\u003ctr\u003e\n\u003cth\u003eHTTP Request\u003c/th\u003e\n\u003cth\u003eHTTP Response\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\n\n```HTTP\nGET pay_link\n```\n\u003c/td\u003e\n\u003ctd\u003e\n\n```json\n{\n    \"amount\": 5\n}\n````\n\n\u003c/td\u003e\n\u003ctd\u003eGet the amount in `sats` required by this extension release.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\n\n```HTTP\nGET pay_link?amount=5\n```\n\n\u003c/td\u003e\n\u003ctd\u003e\n\n```json\n{\n    \"payment_hash\": \"04c33f37d01aff...fd7c407a\",\n    \"payment_request\": \"lnbc50n1pju...n7h8gucqn2cgau\"\n}\n```\n\n\u003c/td\u003e\n\u003ctd\u003eRequest an invoice for the specified amount (or higher).\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\n\n```HTTP\nWS pay_link/{payment_hash}\n\n```\n\n\u003c/td\u003e\n\u003ctd\u003e\n\n```json\n{\"paid\": true|false}\n```\n\n\u003c/td\u003e\n\u003ctd\u003eOpen a websocket to be notified when the invoice has been paid.\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/table\u003e\n\nIn order to download the file one must add the `payment_hash` and an `version` (optional) query parameters to the `archive` URL. Eg:\n\n```HTTP\nGET https://demo.lnbits.com/paywall/download/m2FVCFktJzMcGKXTaHbyhi?payment_hash=3bf...7ec\u0026version=v0.1\n```\n\n\n### Getting sha256 checksum for a release\n\n```console\n$ wget -O - https://github.com/lnbits/withdraw/archive/refs/tags/0.1.1.zip 2\u003e /dev/null | sha256sum | cut -d\" \" -f 1\nbaff0b6162ffb65cc0b4c721a4aa40a7d3d48acd55a3e344cba3eb1d35cf2074\n```\n\n### Lighter ZIP archive\n\n-   documentation, tests and other type of files should not be included in the zip archive generated when a GitHub release is created\n-   keep the `README.md` and `LICENSE` files in the zip as these are required!\n-   in order to exclude these files one must:\n    -   create a `.gitattributes` file (on the top level of the repo)\n    -   add a line for the ignored files/dirs: `tests/ export-ignore`\n\n### Checking the changes before sending a pull request\n\n-   after editing the `manifest.json` file in this repo you should run `python3 check.py` as a sanity check\n-   you can run `python3 check.py foo bar` only to run sanity checks on extensions named `foo` and `bar`\n\n### util for cloning and pulling all extensions\n\ncloning all extensions into `extensions` dir. requires `jq` to be installed.\n\n```sh\nsh util.sh clone\n```\n\npulling all extensions from `extensions` dir\n\n```sh\nsh util.sh pull\n```\n\nget LNbits env variables for all extensions\n\n```sh\nsh util.sh env\n```\n\nupdate a extension in extensions.json with id and version\n\n```sh\nsh util.sh update_extension example v0.4.2\n```\n\n### Example video on how to release a extension into this repo\n\nthis uses a github workflow like this: https://github.com/lnbits/example/blob/main/.github/workflows/release.yml\n\nhttps://github.com/lnbits/lnbits-extensions/assets/1743657/0d0a6626-655b-4528-9547-9fdc348cf9a6\n\n\n# Integration Tests\n## setup\n```sh\nmake install-jmeter\n```\n## configure\nmake sure LNbits is running and start the mirror server\n```sh\nmake start-mirror-server\n```\n## run\n```sh\nmake test\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flnbits%2Flnbits-extensions","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flnbits%2Flnbits-extensions","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flnbits%2Flnbits-extensions/lists"}