feat: Tor hidden service, PDF paid details, subaddress placeholder

- Tor onion: mc6wfeaqc7oijgdcudrr5zsotmwok3jzk3tu2uezzyjisn7nzzjjizyd.onion
- Onion link in footer and README
- PDF "BEZAHLT" block shows TX hash + date in second line
- Address placeholder 8... (encourages subaddress usage)
This commit is contained in:
Alexander Schmidt
2026-03-25 17:37:19 +01:00
parent e36ec77bcd
commit 4c93e335f3
6 changed files with 25 additions and 18 deletions

View File

@@ -2,7 +2,7 @@
> Private. Self-hosted. No accounts. No backend. No bullshit.
**[Live Demo: xmrpay.link](https://xmrpay.link)**
**[Live: xmrpay.link](https://xmrpay.link)** · **[Tor: mc6wfe...zyd.onion](http://mc6wfeaqc7oijgdcudrr5zsotmwok3jzk3tu2uezzyjisn7nzzjjizyd.onion)**
---

25
app.js
View File

@@ -620,21 +620,28 @@
}
// --- Payment Status ---
if (paymentStatus.classList.contains('paid')) {
if (lastPaidData) {
y += 4;
var paidDateStr = '';
if (lastPaidData.verified_at) {
var pd = new Date(lastPaidData.verified_at * 1000);
paidDateStr = pd.toLocaleDateString(I18n.getLang() === 'de' ? 'de-CH' : 'en-US', {
year: 'numeric', month: 'long', day: 'numeric'
});
}
var paidLine = lastPaidData.amount.toFixed(6) + ' XMR — TX ' +
lastPaidData.tx_hash.substring(0, 8) + '...' +
(paidDateStr ? ' — ' + paidDateStr : '');
doc.setFillColor(76, 175, 80);
doc.roundedRect(margin, y - 4, contentW, 16, 2, 2, 'F');
doc.setFont('helvetica', 'bold');
doc.setFontSize(12);
doc.setTextColor(255, 255, 255);
doc.text(I18n.t('status_paid').toUpperCase(), margin + contentW / 2, y + 2, { align: 'center' });
// Extract details from the paid-detail div
var paidDetail = paymentStatus.querySelector('.paid-detail');
if (paidDetail) {
doc.setFont('helvetica', 'normal');
doc.setFontSize(8);
doc.text(paidDetail.textContent, margin + contentW / 2, y + 8, { align: 'center' });
}
doc.text(I18n.t('status_paid').toUpperCase(), margin + contentW / 2, y + 1, { align: 'center' });
doc.setFont('helvetica', 'normal');
doc.setFontSize(7.5);
doc.text(paidLine, margin + contentW / 2, y + 7, { align: 'center' });
y += 22;
}

2
app.min.js vendored

File diff suppressed because one or more lines are too long

View File

@@ -10,7 +10,7 @@ var I18n = (function () {
de: {
subtitle: 'Monero-Zahlungsanforderung in Sekunden',
label_addr: 'XMR-Adresse',
placeholder_addr: '4...',
placeholder_addr: '8...',
label_amount: 'Betrag',
label_desc: 'Beschreibung (optional)',
placeholder_desc: 'z.B. Rechnung #42, Freelance-Arbeit...',
@@ -31,7 +31,7 @@ var I18n = (function () {
pdf_scan_qr: 'QR-Code scannen zum Bezahlen',
pdf_footer: 'Erstellt mit xmrpay.link — Keine Registrierung, kein KYC',
qr_hint: 'Klick auf QR zum Speichern',
footer: 'Open Source &middot; Kein Backend &middot; Kein KYC &middot; <a href="https://gitea.schmidt.eco/schmidt1024/xmrpay.link" target="_blank">Source</a>',
footer: 'Open Source &middot; Kein Backend &middot; Kein KYC &middot; <a href="https://gitea.schmidt.eco/schmidt1024/xmrpay.link" target="_blank">Source</a> &middot; <a href="http://mc6wfeaqc7oijgdcudrr5zsotmwok3jzk3tu2uezzyjisn7nzzjjizyd.onion" title="Tor Hidden Service">Onion</a>',
aria_currency: 'Währung',
label_uri_details: 'Monero-URI anzeigen',
label_share_link: 'Teilbarer Link',
@@ -57,7 +57,7 @@ var I18n = (function () {
en: {
subtitle: 'Monero payment request in seconds',
label_addr: 'XMR Address',
placeholder_addr: '4...',
placeholder_addr: '8...',
label_amount: 'Amount',
label_desc: 'Description (optional)',
placeholder_desc: 'e.g. Invoice #42, freelance work...',
@@ -78,7 +78,7 @@ var I18n = (function () {
pdf_scan_qr: 'Scan QR code to pay',
pdf_footer: 'Created with xmrpay.link — No registration, no KYC',
qr_hint: 'Click QR to save',
footer: 'Open Source &middot; No Backend &middot; No KYC &middot; <a href="https://gitea.schmidt.eco/schmidt1024/xmrpay.link" target="_blank">Source</a>',
footer: 'Open Source &middot; No Backend &middot; No KYC &middot; <a href="https://gitea.schmidt.eco/schmidt1024/xmrpay.link" target="_blank">Source</a> &middot; <a href="http://mc6wfeaqc7oijgdcudrr5zsotmwok3jzk3tu2uezzyjisn7nzzjjizyd.onion" title="Tor Hidden Service">Onion</a>',
aria_currency: 'Currency',
label_uri_details: 'Show Monero URI',
label_share_link: 'Shareable link',

2
i18n.min.js vendored

File diff suppressed because one or more lines are too long

View File

@@ -20,7 +20,7 @@
<div class="card">
<div class="field">
<label for="addr" data-i18n="label_addr">XMR Address</label>
<input type="text" id="addr" data-i18n-placeholder="placeholder_addr" placeholder="4..." spellcheck="false" autocomplete="off">
<input type="text" id="addr" data-i18n-placeholder="placeholder_addr" placeholder="8..." spellcheck="false" autocomplete="off">
</div>
<div class="field">
@@ -102,7 +102,7 @@
</main>
<footer>
<p data-i18n-html="footer">Open Source &middot; No Backend &middot; No KYC &middot; <a href="https://gitea.schmidt.eco/schmidt1024/xmrpay.link" target="_blank">Source</a></p>
<p data-i18n-html="footer">Open Source &middot; No Backend &middot; No KYC &middot; <a href="https://gitea.schmidt.eco/schmidt1024/xmrpay.link" target="_blank">Source</a> &middot; <a href="http://mc6wfeaqc7oijgdcudrr5zsotmwok3jzk3tu2uezzyjisn7nzzjjizyd.onion" title="Tor Hidden Service">Onion</a></p>
</footer>
<div class="lang-picker" id="langPicker">