Terms of use
These terms apply to the KAI-Pay web app, a self-custodial Bitcoin and Lightning wallet without a user account. Please also read the risk warnings and the privacy policy.
1. Parties and scope
These terms govern use of KAI-Pay software supplied by Formsys GmbH in the version currently provided; the version is shown in the app under “Settings” → “About”. Full provider details are set out in the legal notice.
KAI-Pay is a web app (PWA) that runs in your browser. It comprises the wallet at app.kai-pay.net, the point-of-sale view at kasse.kai-pay.net and the payment-link pages at kai-pay.net/@name.
The service is intended for adults and duly represented businesses. These terms do not govern purchases from merchants or separate services supplied by an identified third party. Individual agreements and mandatory statutory rights remain unaffected.
2. No order, no payment obligation
There is no ordering process and no user account is required: the wallet is created in your browser. We charge nothing for using KAI-Pay. Opening or installing the web app alone does not create a payment obligation. Third-party fees for individual payments are described in section 5.
3. Self-custody and access
KAI-Pay operates exclusively in self-custody mode. Wallet keys are generated in your browser under your control or imported from your recovery words; for a passkey wallet they are derived from your passkey. We do not hold a copy enabling us to dispose of your BTC and do not maintain a withdrawable customer balance. We cannot replace lost keys, independently sign transactions or reverse completed network payments.
KAI-Pay uses the Breez SDK and the Spark network. Payments via Spark require the cooperation of the Spark operators; we are not a Spark operator. Without that cooperation, the Spark protocol provides for a unilateral exit to the Bitcoin blockchain. It may take time and incur network fees, requires your own on-chain bitcoin to pay those fees, and the KAI-Pay app does not currently include a dedicated function for it. The providers involved and their roles are set out in the privacy policy.
4. Authorisation and status
Before confirming, check recipient, network, amount, unit and fee limit. QR codes, pasted text and links carry payment data; detection alone is not authorisation. A payment is only initiated once you confirm it in the preview.
The app identifies prepared, authorised, pending, successful, failed or unresolved transactions. A local “sent” indicator or missing network response proves neither success nor final failure. Check the existing transaction in the activity list before retrying an unresolved payment. Statutory rights concerning faulty software remain intact.
5. Charges, conversion and external fees
We charge nothing for using KAI-Pay, so there is no price schedule. Before your binding confirmation, the app shows the amount, the known third-party network and routing fees and the total separately for every outgoing payment. The fee is shown as a maximum (“Fee (max.)”). A higher total than authorised requires renewed consent. If receiving via a Lightning invoice incurs a fee, the app shows it together with the invoice.
The EUR or USD equivalent shown next to amounts (“≈”) is for display only; no currency exchange takes place. The wallet obtains the conversion rates via the Breez SDK. In the point-of-sale view, an amount entered in EUR is converted to sat at the mempool.space rate; the invoice is denominated in sat. A EUR equivalent does not guarantee future BTC value. Commissions or commercial relationships potentially affecting provider selection are disclosed.
6. Lightning and Spark
Availability depends on connectivity, routes, liquidity and counterparties. We operate no Lightning channels of our own; Lightning payments run via the Spark infrastructure. Payments to Bitcoin addresses, deposits from the Bitcoin blockchain and a unilateral exit to the Bitcoin blockchain may take time and incur additional network fees. KAI-Pay does not offer exchanges into other crypto-assets or tokens. Statutory claims against us or the providers involved remain unaffected.
7. User responsibilities
Secure recovery information and never share recovery words (seed), private keys or approval codes such as your PIN with us or third parties. Do not use the software unlawfully or circumvent lawful access restrictions. Install required security updates following the provided instructions; the app indicates when a new version is available. A breach does not automatically remove statutory rights; causation, fault and mandatory law remain relevant. Business users must manage authority and employee permissions.
8. Updates, changes and availability
Supported systems: KAI-Pay is a web app (PWA); there are currently no native apps. The web app requires a current browser that provides, among other things, WebAssembly, IndexedDB and Web Crypto over a secure (HTTPS) connection. Some features also depend on browser, operating system and device:
- Notifications are only available where the browser supports Web Push. On Android, Firefox does not reliably show them while the app is closed.
- Passkey wallets and fingerprint unlock require device, browser and passkey provider to support the PRF passkey extension.
- Scanning QR codes requires camera access; alternatively you can paste payment data.
These statements do not shorten statutory update or defect obligations. We inform you about necessary updates and installation; the app announces new versions with “A new version is available.” Changes to continuously supplied digital products are subject to applicable law; relevant adverse changes trigger advance information on a durable medium and statutory termination rights. Silence does not agree to new paid services or material extensions. A specific availability level is promised only where expressly agreed.
9. Termination and restrictions
You can delete the wallet from your device at any time in the settings with “Remove wallet from this device”. The app then deletes the access data stored in this browser and the wallet database with payment history and contacts; without your recovery words or passkey, the balance is then no longer accessible. Statutory termination and withdrawal rights remain intact.
We may restrict our server functions, such as notifications and payment-link pages, as necessary in response to a specific security threat or legal duty. To prevent abuse, our notification server also limits the number of requests per IP address. Where permitted, we explain the reason, scope, duration and complaint route. Restriction of our service gives us no entitlement to users’ BTC.
At service end we provide agreed export and migration options and explain effects on pending payments and backups. The app already lets you display your recovery words and export up to 100 of your most recent payments as a CSV file. We do not promise technically unavailable recovery.
10. Defects and liability
Statutory remedies for defects apply. Our liability is governed by applicable law. In particular, liability for intent, gross negligence, death or personal injury and mandatory liability, including product-liability and data-protection liability, is neither excluded nor limited. General risk warnings do not replace due care or excuse our own breaches. Technical irreversibility does not eliminate legal reimbursement or damages claims.
11. Software licences
The licence permits agreed use on supported devices. Use of our branding beyond ordinary app use requires separate permission.
Included open-source components are governed by their licences. Mandatory legal rights and rights under those licences are not restricted. The included open-source components and their licences are listed below. The wallet and the point of sale ship the full licence texts with the copyright notices themselves: wallet licence notices, point-of-sale licence notices. In the wallet you also find them under “Settings” → “Legal”.
List as of 26 September 2026. Each entry states the component and version, the licence as an SPDX identifier and where the source code is available.
Wallet (app.kai-pay.net)
Libraries running in your browser:
- @breeztech/breez-sdk-spark 0.26.0 (Breez SDK Spark with WebAssembly module) – MIT – github.com/breez/spark-sdk
- react 19.3.0 – MIT – github.com/react/react
- react-dom 19.3.0 – MIT – github.com/react/react
- scheduler 0.28.0 – MIT – github.com/react/react
- @scure/bip39 2.4.0 – MIT – github.com/paulmillr/scure-bip39
- @noble/hashes 2.4.0 – MIT – github.com/paulmillr/noble-hashes
- qrcode 1.5.4 – MIT – github.com/soldair/node-qrcode
- dijkstrajs 1.0.3 – MIT – github.com/tcort/dijkstrajs
- qr-scanner 1.4.2 – MIT – github.com/nimiq/qr-scanner
- jsqr-es6 1.4.0-1 (fork of jsQR) – Apache-2.0 – github.com/danimoh/jsQR
- workbox-window 7.4.1 – MIT – github.com/GoogleChrome/workbox
- workbox-core, workbox-routing, workbox-strategies, workbox-precaching 7.4.1 – MIT – github.com/GoogleChrome/workbox
- workbox-build 7.4.1 (service worker loader template) – MIT – github.com/GoogleChrome/workbox
- vite-plugin-pwa 1.3.0 (registration helper) – MIT – github.com/vite-pwa/vite-plugin-pwa
- vite 8.3.1 (runtime helpers) – MIT – github.com/vitejs/vite
Libraries included in the Breez SDK WebAssembly module (158 entries)
- Crates of the Breez spark-sdk project 0.26.0 (breez-sdk-common, breez-sdk-spark, breez-sdk-spark-wasm, flashnet, lnurl-models, platform-utils, spark, spark-wallet, utils) – MIT – github.com/breez/spark-sdk/tree/0.26.0
- Rust standard library (core, alloc, std), rustc 1.95.0 – MIT OR Apache-2.0 – github.com/rust-lang/rust
- compiler_builtins 0.1.160 – MIT AND Apache-2.0 WITH LLVM-exception AND (MIT OR Apache-2.0) – github.com/rust-lang/compiler-builtins
- libsecp256k1 (C library, included in secp256k1-sys 0.10.1) – MIT – github.com/bitcoin-core/secp256k1
- Protocol Buffers well-known type descriptors (google/protobuf, via prost-types 0.13.5 and prost-reflect 0.14.7) – BSD-3-Clause – github.com/protocolbuffers/protobuf
- aes 0.8.4 – MIT OR Apache-2.0 – github.com/RustCrypto/block-ciphers
- aes-gcm 0.10.3 – Apache-2.0 OR MIT – github.com/RustCrypto/AEADs
- anyhow 1.0.102 – MIT OR Apache-2.0 – github.com/dtolnay/anyhow
- arrayvec 0.7.6 – MIT OR Apache-2.0 – github.com/bluss/arrayvec
- async-utility 0.3.1 – MIT – github.com/yukibtc/async-utility
- async-wsocket 0.13.2 – MIT – github.com/yukibtc/async-wsocket
- atomic-destructor 0.3.0 – MIT – github.com/yukibtc/atomic-destructor
- base16ct 0.2.0 and 0.1.1 – Apache-2.0 OR MIT – github.com/RustCrypto/formats/tree/master/base16ct
- base58ck 0.1.0 – CC0-1.0 – github.com/rust-bitcoin/rust-bitcoin
- base64 0.22.1 – MIT OR Apache-2.0 – github.com/marshallpierce/rust-base64
- bech32 0.11.1 – MIT – github.com/rust-bitcoin/rust-bech32
- bip39 2.2.2 – CC0-1.0 – github.com/rust-bitcoin/rust-bip39
- bitcoin 0.32.8 – CC0-1.0 – github.com/rust-bitcoin/rust-bitcoin
- bitcoin_hashes 0.14.1 – CC0-1.0 – github.com/rust-bitcoin/rust-bitcoin
- bitcoin-internals 0.3.0 – CC0-1.0 – github.com/rust-bitcoin/rust-bitcoin
- bitcoin-io 0.1.4 – CC0-1.0 – github.com/rust-bitcoin/rust-bitcoin
- bitcoin-units 0.1.3 – CC0-1.0 – github.com/rust-bitcoin/rust-bitcoin
- block-buffer 0.10.4 – MIT OR Apache-2.0 – github.com/RustCrypto/utils
- block-padding 0.3.3 – MIT OR Apache-2.0 – github.com/RustCrypto/utils
- byteorder 1.5.0 – Unlicense OR MIT – github.com/BurntSushi/byteorder
- bytes 1.11.1 – MIT – github.com/tokio-rs/bytes
- chrono 0.4.44 – MIT OR Apache-2.0 – github.com/chronotope/chrono
- cipher 0.4.4 – MIT OR Apache-2.0 – github.com/RustCrypto/traits
- console_error_panic_hook 0.1.7 – Apache-2.0 OR MIT – github.com/rustwasm/console_error_panic_hook
- const-oid 0.9.6 – Apache-2.0 OR MIT – github.com/RustCrypto/formats/tree/master/const-oid
- crypto-bigint 0.5.5 and 0.4.9 – Apache-2.0 OR MIT – github.com/RustCrypto/crypto-bigint
- crypto-common 0.1.7 – MIT OR Apache-2.0 – github.com/RustCrypto/traits
- ctr 0.9.2 – MIT OR Apache-2.0 – github.com/RustCrypto/block-modes
- der 0.7.10 and 0.6.1 – Apache-2.0 OR MIT – github.com/RustCrypto/formats/tree/master/der
- digest 0.10.7 – MIT OR Apache-2.0 – github.com/RustCrypto/traits
- dlmalloc 0.2.11 – MIT OR Apache-2.0 – github.com/alexcrichton/dlmalloc-rs
- dnssec-prover 0.6.8 – MIT OR Apache-2.0 – github.com/TheBlueMatt/dnssec-prover
- ecdsa 0.16.9 – Apache-2.0 OR MIT – github.com/RustCrypto/signatures/tree/master/ecdsa
- elliptic-curve 0.13.8 and 0.12.3 – Apache-2.0 OR MIT – github.com/RustCrypto/traits/tree/master/elliptic-curve
- encoding_rs 0.8.35 – (Apache-2.0 OR MIT) AND BSD-3-Clause – github.com/hsivonen/encoding_rs
- ff 0.13.1 and 0.12.1 – MIT OR Apache-2.0 – github.com/zkcrypto/ff
- form_urlencoded 1.2.2 – MIT OR Apache-2.0 – github.com/servo/rust-url
- frost-core 2.1.0 – MIT OR Apache-2.0 – github.com/lightsparkdev/frost
- frost-secp256k1-tr 2.1.0 – MIT OR Apache-2.0 – github.com/lightsparkdev/frost
- futures-channel 0.3.32 – MIT OR Apache-2.0 – github.com/rust-lang/futures-rs
- futures-core 0.3.32 – MIT OR Apache-2.0 – github.com/rust-lang/futures-rs
- futures-io 0.3.32 – MIT OR Apache-2.0 – github.com/rust-lang/futures-rs
- futures-sink 0.3.32 – MIT OR Apache-2.0 – github.com/rust-lang/futures-rs
- futures-task 0.3.32 – MIT OR Apache-2.0 – github.com/rust-lang/futures-rs
- futures-util 0.3.32 – MIT OR Apache-2.0 – github.com/rust-lang/futures-rs
- generic-array 0.14.7 – MIT – github.com/fizyk20/generic-array
- getrandom 0.2.17 – MIT OR Apache-2.0 – github.com/rust-random/getrandom
- ghash 0.5.1 – Apache-2.0 OR MIT – github.com/RustCrypto/universal-hashes
- gloo-timers 0.3.0 – MIT OR Apache-2.0 – github.com/rustwasm/gloo/tree/master/crates/timers
- graphql_client 0.16.0 – Apache-2.0 OR MIT – github.com/graphql-rust/graphql-client
- hashbrown 0.16.1 and 0.13.2 – MIT OR Apache-2.0 – github.com/rust-lang/hashbrown
- hex 0.4.3 – MIT OR Apache-2.0 – github.com/KokaKiwi/rust-hex
- hex-conservative 0.2.2 – CC0-1.0 – github.com/rust-bitcoin/hex-conservative
- hkdf 0.12.4 – MIT OR Apache-2.0 – github.com/RustCrypto/KDFs
- hmac 0.12.1 – MIT OR Apache-2.0 – github.com/RustCrypto/MACs
- hpke 0.10.0 – MIT OR Apache-2.0 – github.com/rozbb/rust-hpke
- http 1.4.0 – MIT OR Apache-2.0 – github.com/hyperium/http
- http-body 1.0.1 – MIT – github.com/hyperium/http-body
- http-body-util 0.1.3 – MIT – github.com/hyperium/http-body
- httparse 1.10.1 – MIT OR Apache-2.0 – github.com/seanmonstar/httparse
- icu_collections 2.2.0 – Unicode-3.0 – github.com/unicode-org/icu4x
- icu_normalizer 2.2.0 – Unicode-3.0 – github.com/unicode-org/icu4x
- icu_normalizer_data 2.2.0 – Unicode-3.0 – github.com/unicode-org/icu4x
- icu_properties 2.2.0 – Unicode-3.0 – github.com/unicode-org/icu4x
- icu_properties_data 2.2.0 – Unicode-3.0 – github.com/unicode-org/icu4x
- idna 1.1.0 – MIT OR Apache-2.0 – github.com/servo/rust-url
- idna_adapter 1.2.2 – Apache-2.0 OR MIT – github.com/hsivonen/idna_adapter
- instant 0.1.13 – BSD-3-Clause – github.com/sebcrozet/instant
- itoa 1.0.18 – MIT OR Apache-2.0 – github.com/dtolnay/itoa
- js-sys 0.3.97 – MIT OR Apache-2.0 – github.com/wasm-bindgen/wasm-bindgen/tree/master/crates/js-sys
- k256 0.13.4 – Apache-2.0 OR MIT – github.com/RustCrypto/elliptic-curves/tree/master/k256
- lazy_static 1.5.0 – MIT OR Apache-2.0 – github.com/rust-lang-nursery/lazy-static.rs
- lightning 0.1.8 – MIT OR Apache-2.0 – github.com/lightningdevkit/rust-lightning
- lightning-invoice 0.33.2 – MIT OR Apache-2.0 – github.com/lightningdevkit/rust-lightning
- lightning-types 0.2.0 – MIT OR Apache-2.0 – github.com/lightningdevkit/rust-lightning
- log 0.4.29 – MIT OR Apache-2.0 – github.com/rust-lang/log
- logos 0.14.4 – MIT OR Apache-2.0 – github.com/maciejhirsz/logos
- lru 0.16.4 – MIT – github.com/jeromefroe/lru-rs
- matchers 0.2.0 – MIT – github.com/hawkw/matchers
- mime 0.3.17 – MIT OR Apache-2.0 – github.com/hyperium/mime
- nostr 0.43.1 – MIT – github.com/rust-nostr/nostr
- nostr-database 0.43.0 – MIT – github.com/rust-nostr/nostr
- nostr-relay-pool 0.43.1 – MIT – github.com/rust-nostr/nostr
- nostr-sdk 0.43.0 – MIT – github.com/rust-nostr/nostr
- nu-ansi-term 0.50.3 – MIT – github.com/nushell/nu-ansi-term
- once_cell 1.21.4 – MIT OR Apache-2.0 – github.com/matklad/once_cell
- p256 0.13.2 and 0.11.1 – Apache-2.0 OR MIT – github.com/RustCrypto/elliptic-curves/tree/master/p256
- percent-encoding 2.3.2 – MIT OR Apache-2.0 – github.com/servo/rust-url
- polyval 0.6.2 – Apache-2.0 OR MIT – github.com/RustCrypto/universal-hashes
- postcard 1.1.3 – MIT OR Apache-2.0 – github.com/jamesmunns/postcard
- ppv-lite86 0.2.21 – MIT OR Apache-2.0 – github.com/cryptocorrosion/cryptocorrosion
- primeorder 0.13.6 – Apache-2.0 OR MIT – github.com/RustCrypto/elliptic-curves/tree/master/primeorder
- prost 0.13.5 – Apache-2.0 – github.com/tokio-rs/prost
- prost-reflect 0.14.7 – MIT OR Apache-2.0 – github.com/andrewhickman/prost-reflect
- prost-types 0.13.5 – Apache-2.0 – github.com/tokio-rs/prost
- rand 0.8.6 – MIT OR Apache-2.0 – github.com/rust-random/rand
- rand_chacha 0.3.1 – MIT OR Apache-2.0 – github.com/rust-random/rand
- rand_core 0.6.4 – MIT OR Apache-2.0 – github.com/rust-random/rand
- regex-automata 0.4.14 – MIT OR Apache-2.0 – github.com/rust-lang/regex
- regex-lite 0.1.9 – MIT OR Apache-2.0 – github.com/rust-lang/regex
- regex-syntax 0.8.10 – MIT OR Apache-2.0 – github.com/rust-lang/regex
- reqwest 0.12.28 – MIT OR Apache-2.0 – github.com/seanmonstar/reqwest
- rfc6979 0.4.0 – Apache-2.0 OR MIT – github.com/RustCrypto/signatures/tree/master/rfc6979
- rustc-demangle 0.1.27 – MIT OR Apache-2.0 – github.com/rust-lang/rustc-demangle
- sec1 0.7.3 and 0.3.0 – Apache-2.0 OR MIT – github.com/RustCrypto/formats/tree/master/sec1
- secp256k1 0.29.1 – CC0-1.0 – github.com/rust-bitcoin/rust-secp256k1
- secp256k1-sys 0.10.1 – CC0-1.0 – github.com/rust-bitcoin/rust-secp256k1
- serde 1.0.228 – MIT OR Apache-2.0 – github.com/serde-rs/serde
- serde_bytes 0.11.19 – MIT OR Apache-2.0 – github.com/serde-rs/bytes
- serde_core 1.0.228 – MIT OR Apache-2.0 – github.com/serde-rs/serde
- serde_json 1.0.149 – MIT OR Apache-2.0 – github.com/serde-rs/json
- serde_urlencoded 0.7.1 – MIT OR Apache-2.0 – github.com/nox/serde_urlencoded
- serde_with 3.18.0 – MIT OR Apache-2.0 – github.com/jonasbb/serde_with
- serde-wasm-bindgen 0.6.5 – MIT – github.com/RReverser/serde-wasm-bindgen
- serdect 0.2.0 – Apache-2.0 OR MIT – github.com/RustCrypto/formats/tree/master/serdect
- sha1_smol 1.0.1 – BSD-3-Clause – github.com/mitsuhiko/sha1-smol
- sha2 0.10.9 – MIT OR Apache-2.0 – github.com/RustCrypto/hashes
- sharded-slab 0.1.7 – MIT – github.com/hawkw/sharded-slab
- signature 2.2.0 – Apache-2.0 OR MIT – github.com/RustCrypto/traits/tree/master/signature
- slab 0.4.12 – MIT – github.com/tokio-rs/slab
- smallvec 1.15.1 – MIT OR Apache-2.0 – github.com/servo/rust-smallvec
- spark-primitives 0.2.0 – Apache-2.0 – crates.io/crates/spark-primitives/0.2.0
- spki 0.7.3 – Apache-2.0 OR MIT – github.com/RustCrypto/formats/tree/master/spki
- subtle 2.6.1 – BSD-3-Clause – github.com/dalek-cryptography/subtle
- thread_local 1.1.9 – MIT OR Apache-2.0 – github.com/Amanieu/thread_local-rs
- tinyvec 1.11.0 – Zlib OR Apache-2.0 OR MIT – github.com/Lokathor/tinyvec
- tokio 1.52.1 – MIT – github.com/tokio-rs/tokio
- tokio_with_wasm 0.8.7 – MIT – github.com/cunarist/tokio-with-wasm
- tokio-stream 0.1.18 – MIT – github.com/tokio-rs/tokio
- tonic 0.12.3 – MIT – github.com/hyperium/tonic
- tonic-types 0.12.3 – MIT – github.com/hyperium/tonic
- tonic-web-wasm-client 0.6.2 – MIT OR Apache-2.0 – github.com/devashishdxt/tonic-web-wasm-client
- tower-service 0.3.3 – MIT – github.com/tower-rs/tower
- tracing 0.1.44 – MIT – github.com/tokio-rs/tracing
- tracing-core 0.1.36 – MIT – github.com/tokio-rs/tracing
- tracing-log 0.2.0 – MIT – github.com/tokio-rs/tracing
- tracing-subscriber 0.3.23 – MIT – github.com/tokio-rs/tracing
- tsify-next 0.5.6 – MIT OR Apache-2.0 – github.com/siefkenj/tsify
- turnkey_enclave_encrypt 0.7.0 – Apache-2.0 – github.com/tkhq/rust-sdk
- unicode-normalization 0.1.25 – MIT OR Apache-2.0 – github.com/unicode-rs/unicode-normalization
- universal-hash 0.5.1 – MIT OR Apache-2.0 – github.com/RustCrypto/traits
- url 2.5.8 – MIT OR Apache-2.0 – github.com/servo/rust-url
- utf8_iter 1.0.4 – Apache-2.0 OR MIT – github.com/hsivonen/utf8_iter
- uuid 1.23.1 – Apache-2.0 OR MIT – github.com/uuid-rs/uuid
- wasm-bindgen 0.2.120 – MIT OR Apache-2.0 – github.com/wasm-bindgen/wasm-bindgen
- wasm-streams 0.4.2 – MIT OR Apache-2.0 – github.com/MattiasBuelens/wasm-streams
- web-sys 0.3.97 – MIT OR Apache-2.0 – github.com/wasm-bindgen/wasm-bindgen/tree/master/crates/web-sys
- web-time 1.1.0 – MIT OR Apache-2.0 – github.com/daxpedda/web-time
- x509-cert 0.2.5 – Apache-2.0 OR MIT – github.com/RustCrypto/formats/tree/master/x509-cert
- zerocopy 0.8.48 – BSD-2-Clause OR Apache-2.0 OR MIT – github.com/google/zerocopy
- zeroize 1.8.2 – Apache-2.0 OR MIT – github.com/RustCrypto/utils
- zerovec 0.11.6 – Unicode-3.0 – github.com/unicode-org/icu4x
- zmij 1.0.21 – MIT – github.com/dtolnay/zmij
Point of sale (kasse.kai-pay.net)
- vite 8.3.1 (runtime helpers) – MIT – github.com/vitejs/vite
- qrcode-generator 2.0.4 – MIT – github.com/kazuhikoarase/qrcode-generator
Payment-link pages (kai-pay.net/@name)
This component runs on our server, not in your browser, and generates the QR codes of the payment-link pages:
- qrcode-generator 2.0.4 – MIT – github.com/kazuhikoarase/qrcode-generator
12. Law, language and disputes
German law applies. Consumers retain mandatory protections of their habitual residence under applicable conflict-of-laws rules. Statutory consumer jurisdiction applies; no exclusive jurisdiction is imposed to consumers’ disadvantage. The language version selected at contract formation is provided; discrepancies cannot reduce mandatory rights. Statutory rules apply if a term is invalid; there is no automatic replacement with the commercially strongest permissible clause.