No description
  • Python 69.3%
  • Vue 15.8%
  • JavaScript 14.6%
  • Makefile 0.3%
Find a file
Padreug f835766935
Some checks failed
lint.yml / feat(admin): event form parity with the webapp (1.6.1-aio.13) (pull_request) Failing after 0s
lint.yml / feat(admin): event form parity with the webapp (1.6.1-aio.13) (push) Failing after 0s
feat(admin): event form parity with the webapp (1.6.1-aio.13)
The LNbits admin form lagged the webapp's CreateEventDialog:

- Payment methods never rendered. c2d9a96 wired the template to
  `paymentMethodOptions` / `acceptsFiat` but never defined them, so the
  q-option-group got `options=undefined` and the fiat-currency select
  was gated on `undefined`. Rails are now two q-checkboxes; Card is
  disabled with an explanatory tooltip when `g.user.fiat_providers` is
  empty (same rule as the webapp) and names the providers otherwise.
- Location (NIP-52 `location` tag) and Categories (NIP-52 `t` tags,
  same 25-item list as the webapp's category.ts) were missing from the
  form even though the model, CRUD and publisher already carry them.
- Datetimes are stamped with the browser's UTC offset on submit, as the
  webapp does; `_to_unix` treats naive values as UTC, so 18:00 CEST
  entered here went out on Nostr as 18:00 UTC. Table columns render
  "YYYY-MM-DD HH:MM" instead of the raw ISO string.
- Validation: title + start date required, end >= start on the folded
  date+time, fiat currency required when a sat-priced event accepts
  card. Create is enabled once wallet + title + start are set; info,
  closing date, tickets and price were all effectively required before
  because the disable check compared undefined fields to null.
- Labels follow the payment-rails vocabulary: "Unit" -> "Price
  currency", "Fiat checkout currency" -> "Fiat currency"; ticket
  closing date and end date explain their defaults.
- A fiat-priced event mirrors `fiat_currency = currency` on save so the
  payload and the `tickets_fiat_currency` tag stay coherent.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018b1bDExMX7W3a47wcgFUjb
2026-09-10 13:43:53 +02:00
.github/workflows Update to use uv (#37) 2025-08-22 16:54:51 +02:00
docs feat: attach a self-describing ticket card to the email (1.6.1-aio.10) 2026-09-08 16:40:25 +02:00
nostr chore: rebase onto upstream v1.6.1 + bump to v1.6.1-aio.1 2026-05-22 09:24:35 +02:00
static feat(admin): event form parity with the webapp (1.6.1-aio.13) 2026-09-10 13:43:53 +02:00
tests feat: attach a self-describing ticket card to the email (1.6.1-aio.10) 2026-09-08 16:40:25 +02:00
.gitignore chore: ignore the data/ dir pytest creates 2026-09-06 19:57:25 +02:00
.prettierrc feat: code quality (#34) 2024-08-29 12:18:49 +02:00
__init__.py feat: return buyers to the calling app after Stripe, branded QR endpoint 2026-09-06 19:53:05 +02:00
config.json feat(admin): event form parity with the webapp (1.6.1-aio.13) 2026-09-10 13:43:53 +02:00
crud.py feat: let a user_id ticket carry an email, accept frontend_url 2026-09-06 19:53:05 +02:00
description.md docs: changes to more pages (#42) 2026-01-28 17:22:09 +01:00
LICENSE add license 2023-02-24 18:13:39 +01:00
Makefile chore: run tests against the aio lnbits fork (PYTHONPATH), not PyPI lnbits 2026-09-06 19:56:55 +02:00
manifest.json [FEAT] add timestamp on register (#15) 2023-08-18 08:17:29 +02:00
migrations.py fix: if sats and fiat checkout conversion currency 2026-05-07 14:34:22 +01:00
migrations_fork.py feat: let a user_id ticket carry an email, accept frontend_url 2026-09-06 19:53:05 +02:00
models.py feat: let a user_id ticket carry an email, accept frontend_url 2026-09-06 19:53:05 +02:00
nostr_hooks.py feat(signer): migrate Nostr publishing off account.prvkey → resolve_for_wallet (#23) 2026-05-27 21:55:56 +02:00
nostr_publisher.py feat: per-event payment methods (extra.payment_methods) 2026-09-06 19:53:05 +02:00
nostr_sync.py chore: rebase onto upstream v1.6.1 + bump to v1.6.1-aio.1 2026-05-22 09:24:35 +02:00
nostr_timestamp.py fix: publish NIP-52 events with monotonic created_at (#26) 2026-06-18 14:13:10 +02:00
package-lock.json feat: code quality (#34) 2024-08-29 12:18:49 +02:00
package.json feat: code quality (#34) 2024-08-29 12:18:49 +02:00
pyproject.toml chore: prepare release, fix lint and uv warnings (#44) 2026-04-15 17:37:34 +02:00
qr.py feat: attach a self-describing ticket card to the email (1.6.1-aio.10) 2026-09-08 16:40:25 +02:00
README.md feat: attach a self-describing ticket card to the email (1.6.1-aio.10) 2026-09-08 16:40:25 +02:00
services.py feat: attach a self-describing ticket card to the email (1.6.1-aio.10) 2026-09-08 16:40:25 +02:00
tasks.py feat: multi-ticket purchases as N rows sharing one payment_hash 2026-05-23 22:57:00 +02:00
toc.md feat: code quality (#34) 2024-08-29 12:18:49 +02:00
transport_rpcs.py feat: events_list_event_tickets RPC for organizer ticket roster 2026-05-24 18:45:48 +02:00
uv.lock chore: prepare release, fix lint and uv warnings (#44) 2026-04-15 17:37:34 +02:00
views.py feat: make events dynamic (#43) 2026-05-04 17:01:53 +02:00
views_api.py feat: attach a self-describing ticket card to the email (1.6.1-aio.10) 2026-09-08 16:40:25 +02:00

LNbits

License: MIT Built for LNbits

Events - LNbits extension

For more about LNBits extension check this tutorial

Sell tickets for events and use the built-in scanner for registering attendees

Events allows you to create tickets for an event. Each ticket is in the form of a unique QR code. After registering and paying, the user gets a QR code to present at registration/entrance.

Events includes a shareable ticket scanner, which can be used to register attendees.

Usage

  1. Create an event
    create event

  2. Fill out the event information:

    • event name
    • wallet (normally there's only one)
    • event information
    • closing date for event registration
    • begin and end date of the event

    event info

  3. Share the event registration link
    event ticket

    • ticket example
      ticket example

    • QR code ticket, presented after invoice paid, to present at registration
      event ticket

  4. Use the built-in ticket scanner to validate registered, and paid, attendees
    ticket scanner

Guest checkout, card payments and email delivery (aio fork)

  • Identity. POST /events/api/v1/tickets/{event_id} accepts either an LNbits user_id or a guest name + email; a user_id ticket may also carry an email so logged-in buyers get their ticket mailed.
  • Payment methods. extra.payment_methods (lightning, fiat) lists the rails an event accepts; an empty list keeps the legacy rule (Lightning always, fiat when allow_fiat). The effective list is published on the NIP-52 event as tickets_payment_methods and enforced at purchase.
  • Return to the calling app. A client may send frontend_url (its app root, e.g. https://app.example/events). Its origin must be one of LNBITS_CORS_ALLOWED_ORIGINS, the LNbits base URL or LNBITS_CUSTOM_FRONTEND_URL, otherwise the request is refused. Under that root the extension builds the Stripe success_url (/events/{event_id}?checkout=success&tickets=<id,id>), cancel_url (/events/{event_id}?checkout=cancelled) and the emailed ticket link (/events/ticket/{ticket_id}). Absent, the LNbits host is used as before.
  • Stripe session. The buyer's email is passed as customer_email (prefilled and locked on the hosted page); the line item is named after the event; event_id, quantity and ticket_ids ride along as metadata.
  • Email. Multipart text + HTML (links, no images) with the ticket card attached — a self-describing PNG (site, event, when, where, QR with the instance logo, name on ticket, ticket id) also served at GET /events/api/v1/ticket-card/{ticket_id}; the bare QR stays at GET /events/api/v1/qr/{ticket_id}. Headers carry Date, Message-ID and a From display name (site title). POST /events/api/v1/tickets/{ticket_id}/resend-email returns a TicketResendResult with per-channel outcome.

Powered by LNbits

LNbits is a free and open-source lightning accounts system.

Visit LNbits Shop Try myLNbits SaaS