Working proof-of-concept for the NLnet NGI TALER proposal: a reusable
taler-merchant TypeScript client, a medusa-payment-taler MedusaJS v2
payment provider, and a multi-vendor event demo — all running against the
public GNU Taler sandbox (backend.demo.taler.net, KUDOS currency).
See docs/roadmap.md for planned work, docs/changelog.md for completed
work, and docs/adr/ for the architecture decisions behind both packages.
- Storefront cart (Day Ticket + 2 Beer Tokens, €45) → Medusa payment session
→ live Taler order
KUDOS:45withtaler://pay/...URI - Paid with the real GNU Taler wallet CLI (built from
taler-typescript-coresource; withdrew KUDOS frombank.demo.taler.net) - Cart completed → Medusa order #1, payment captured via provider status
mapping (
unpaid|claimed → pending,paid → captured) GET /admin/vendor-settlement→ per-vendor gross/units with the Taler order id as reconciliation reference- Partial refund (€5) from Medusa admin → Taler order shows
refunded: true, refund_amount: KUDOS:5, reason: "Refund issued from Medusa"
Prereqs: Node ≥20, local PostgreSQL with a medusa_events database.
# (repo root — uses pnpm workspaces)
pnpm install
# build the two packages
pnpm -F taler-merchant build
pnpm -F medusa-payment-taler build
# backend (see "Fresh database setup" below for migrations + admin user)
cd apps/backend
PORT=7481 npx medusa develop # admin at http://localhost:7481/app
# storefront
cd ../storefront
npx next dev -p 7482 # http://localhost:7482Fresh database setup: npx medusa db:migrate (also runs the starter seed),
npx medusa user -e <email> -p <password>, then
npx medusa exec ./src/scripts/seed-event.ts for the event demo data.
Taler config lives in apps/backend/.env:
TALER_MERCHANT_URL, TALER_MERCHANT_TOKEN (sandbox instance uses token
sandbox), TALER_CURRENCY=KUDOS (sandbox shim — demo prices map 1:1).
In the storefront, add event products to the cart, check out, pick
GNU Taler as payment method and press Pay with GNU Taler: a QR code
with the taler://pay/ URI appears and the page polls
/store/taler/order-status until the wallet pays, then places the order
automatically. Pay with the Android/iOS Taler wallet (get KUDOS at
https://bank.demo.taler.net) or the wallet CLI.
OpenAPI-generated types, webhook-based status (POC polls), replay/idempotency test matrix, dockerized Taler backend for CI, WCAG 2.1 AA audit, marketplace module (vendors are product metadata), npm publishing.