|
|
||
|---|---|---|
| .. | ||
| index.html | ||
| nginx-cors-stats.conf | ||
| nginx-landing.conf | ||
| privacy.html | ||
| qr-logo.svg | ||
| qr-payto.png | ||
| qr-product-beacon-badge.png | ||
| qr-product-blue-or-red-pill.png | ||
| qr-product-comet-cap.png | ||
| qr-product-eclipse-shades.png | ||
| qr-product-nebula-coffee.png | ||
| qr-product-orbit-sticker.png | ||
| qr-product-rainbow-pill.png | ||
| qr-product-relay-pin.png | ||
| qr-product-shuttle-pass.png | ||
| qr-product-star-chart.png | ||
| qr-product-voidwave-playlist.png | ||
| qrcode.min.js | ||
| README.md | ||
| shop-pay.css | ||
| shop-pay.js | ||
| terms.html | ||
Bank landing (bank.hacktivism.ch)
English intro for GOA exploration: put coins in a GNU Taler wallet, optionally
open your own bank account, and point merchants at taler.hacktivism.ch.
| Public URL | What |
|---|---|
https://bank.hacktivism.ch/ · /intro/ |
Landing (nginx in bank container → host 9013, Caddy) |
https://bank.hacktivism.ch/intro/stats.json |
Live stats (written inside bank container) |
https://bank.hacktivism.ch/webui/ |
libeufin-bank SPA (register · login · withdraw) when libeufin is up on 9012 |
https://exchange.hacktivism.ch/ |
Exchange (ToS /terms, keys /keys) |
https://taler.hacktivism.ch/ |
Merchant backend |
User flow (documented on the page)
Primary path (works without your own bank account)
- Install wallet — Android (Play Store / F-Droid) and iOS (App Store), plus hub
wallet.taler.net. - One QR / link — live
taler://withdraw/…from the community-shared bank pool (explorer).
Minted viaGET /intro/demo-withdraw.json(or fallbackwithdraw.uri).
Auto-confirm finishes the bank side so coins reach the wallet.
Optional paths
- Own bank account — register in
/webui/, then withdraw (private balance). taler://withdraw-exchange/…— only useful if you already have a bank balance to withdraw from.
How it works (community pool)
- Shared account
exploreris pre-funded with GOA. - Each click creates a one-shot withdrawal from that pool (not a personal login).
- Wallet accepts the URI; bank auto-confirm + exchange settle → coins in the app.
- Balance is shared; demo amounts only.
Helpers: scripts/taler-bank/demo-withdraw-api.py, refresh-demo-withdraw.sh, auto-confirm-withdrawals.sh, install-demo-withdraw-api.sh.
CLI sketch (fresh wallet DB)
# equivalent one-step in CLI terms:
taler-wallet-cli exchanges add https://exchange.hacktivism.ch/
taler-wallet-cli exchanges accept-tos https://exchange.hacktivism.ch/
# then withdraw from the exchange (amount chosen in wallet UI)
Live stats (in bank container)
Stats are not computed on the laptop or host browser. A small script runs
inside the bank container, queries libeufin for the demo funding account
(explorer), and writes a public JSON file next to the landing assets.
| Piece | Path / role |
|---|---|
| Generator (in-container) | /usr/local/bin/landing-stats.sh |
| Source in admin-log | scripts/taler-bank/landing-stats.sh |
| Host installer | scripts/taler-bank/landing-stats-install.sh |
| Output | /var/www/bank-landing/stats.json → https://bank.hacktivism.ch/intro/stats.json |
| Landing UI | index.html section GOA flow · live |
What the page shows
- Bank accounts — registered accounts (libeufin
GET /accounts, admin) - Wallets involved — unique reserve pubs from Taler withdrawal debits (≈ individual wallet withdraws)
- Withdraws / total out — customer debit withdrawals only (exchange mirror skipped)
- Last withdraws — recent list with amount, time (CEST /
Europe/Zurich), bank username - Last 24h / 7d — count · amount
- Footer: updated time (CEST), user-account count, accounts that funded withdraws — no “demo QR / pool explorer”
stats.json shape (abridged)
{
"ok": true,
"currency": "GOA",
"generated_at": "2026-07-09T18:55Z",
"account": "explorer",
"balance": "GOA:960",
"withdraws": {
"count": 4,
"total_amount": "GOA:40",
"last_amount": "GOA:10",
"last_at": "2026-07-09T08:49Z",
"last_24h": { "count": 2, "amount": "GOA:20" },
"last_7d": { "count": 4, "amount": "GOA:40" }
},
"flow": {
"debits_scanned": "GOA:40",
"credits_scanned": "GOA:1000",
"tx_scanned": 5
},
"demo": {
"uri": "taler://withdraw/…",
"amount": "GOA:10",
"status": "confirmed",
"ready": false
},
"source": "in-container landing-stats.sh"
}
Install + refresh (on koopa host)
# from laptop: copy scripts, then on koopa:
cd /path/to/koopa-admin-log/scripts/taler-bank
# copy into container + one-shot run
sudo ./landing-stats-install.sh
# every minute inside the container (* * * * *)
sudo ./landing-stats-install.sh --cron
# optional: LANDING_STATS_CRON='*/5 * * * *' ./landing-stats-install.sh --cron
# later: only re-run
sudo ./landing-stats-install.sh --run-only
Requirements inside the container:
curl,awk(mawk OK),sed,date— no python- libeufin-bank listening on loopback (script auto-detects
PORT/ 9012 / 8080) /root/bank-explorer-password.txt(orBANK_PASS=…on thepodman exec)- writable
/var/www/bank-landing/(same tree nginx uses for/intro/)
make-demo-withdraw-qr.sh also calls landing-stats.sh after refreshing the demo URI,
when the binary is already installed at /usr/local/bin/landing-stats.sh.
Manual one-liner (debug)
podman exec -e LANDING_DIR=/var/www/bank-landing taler-hacktivism-bank \
/usr/local/bin/landing-stats.sh
curl -sS https://bank.hacktivism.ch/intro/stats.json | python3 -m json.tool
Host / container files
Landing root (nginx in bank container), typically under something like
/var/www/bank-landing/ or the container path mapped for 9013:
| File | Role |
|---|---|
index.html |
landing (steps + stats panel) |
qrcode.min.js |
QR helper |
stats.json |
live stats (from in-container script) |
withdraw.uri |
current demo taler://withdraw/… (optional) |
withdraw.amount |
e.g. GOA:10 (optional) |
withdraw-watch.ids |
ids for auto-confirm helper (optional) |
Deploy landing HTML
# from laptop (example) — path depends on where nginx in the bank container reads from
scp koopa-admin-log/configs/bank-landing/index.html \
koopa-admin-log/configs/bank-landing/qrcode.min.js \
hernani@koopa:/tmp/bank-landing/
# then copy into the bank container / host path used by nginx :9013
podman cp /tmp/bank-landing/index.html taler-hacktivism-bank:/var/www/bank-landing/index.html
Demo QR refresh (in container, no python)
podman exec taler-hacktivism-bank /usr/local/bin/refresh-demo-withdraw.sh
# source: scripts/taler-bank/refresh-demo-withdraw.sh
Older host script (needs python3): scripts/taler-bank/make-demo-withdraw-qr.sh