feat: update legal pages, add Kraken API as primary rate source, clarify listing fee

This commit is contained in:
2026-02-11 15:13:47 +01:00
parent a4d960b752
commit 2d7d22b22f
13 changed files with 178 additions and 82 deletions

View File

@@ -18,6 +18,7 @@ class PageAbout extends HTMLElement {
<h1>Über kashilo.com</h1>
<p>kashilo.com ist eine Privacy-First Kleinanzeigen-Plattform. Nutzer können Anzeigen erstellen und über Ende-zu-Ende verschlüsselte Nachrichten kommunizieren — ohne persönliche Daten preiszugeben.</p>
<p>Die Bezahlung erfolgt ausschliesslich über Monero (XMR). Kein KYC, keine E-Mail, kein Tracking.</p>
<p>Die Veröffentlichung einer Anzeige kostet 1 USD (zahlbar in Monero). Keine versteckten Gebühren, keine Abos.</p>
<h2>Prinzipien</h2>
<ul>
@@ -32,6 +33,7 @@ class PageAbout extends HTMLElement {
<h1>About kashilo.com</h1>
<p>kashilo.com is a privacy-first classifieds platform. Users can create listings and communicate via end-to-end encrypted messages — without revealing any personal data.</p>
<p>Payments are made exclusively in Monero (XMR). No KYC, no email, no tracking.</p>
<p>Publishing a listing costs $1 (payable in Monero). No hidden fees, no subscriptions.</p>
<h2>Principles</h2>
<ul>
@@ -46,6 +48,7 @@ class PageAbout extends HTMLElement {
<h1>À propos de kashilo.com</h1>
<p>kashilo.com est une plateforme de petites annonces axée sur la confidentialité. Les utilisateurs peuvent créer des annonces et communiquer via des messages chiffrés de bout en bout — sans révéler de données personnelles.</p>
<p>Les paiements s'effectuent exclusivement en Monero (XMR). Pas de KYC, pas d'e-mail, pas de tracking.</p>
<p>La publication d'une annonce coûte 1 USD (payable en Monero). Pas de frais cachés, pas d'abonnements.</p>
<h2>Principes</h2>
<ul>
@@ -60,6 +63,7 @@ class PageAbout extends HTMLElement {
<h1>Informazioni su kashilo.com</h1>
<p>kashilo.com è una piattaforma di annunci incentrata sulla privacy. Gli utenti possono creare annunci e comunicare tramite messaggi crittografati end-to-end — senza rivelare dati personali.</p>
<p>I pagamenti avvengono esclusivamente in Monero (XMR). Nessun KYC, nessuna email, nessun tracking.</p>
<p>La pubblicazione di un annuncio costa 1 USD (pagabile in Monero). Nessun costo nascosto, nessun abbonamento.</p>
<h2>Principi</h2>
<ul>
@@ -74,6 +78,7 @@ class PageAbout extends HTMLElement {
<h1>Acerca de kashilo.com</h1>
<p>kashilo.com es una plataforma de clasificados centrada en la privacidad. Los usuarios pueden crear anuncios y comunicarse mediante mensajes cifrados de extremo a extremo — sin revelar datos personales.</p>
<p>Los pagos se realizan exclusivamente en Monero (XMR). Sin KYC, sin email, sin rastreo.</p>
<p>Publicar un anuncio cuesta 1 USD (pagable en Monero). Sin costes ocultos, sin suscripciones.</p>
<h2>Principios</h2>
<ul>
@@ -88,6 +93,7 @@ class PageAbout extends HTMLElement {
<h1>Sobre o kashilo.com</h1>
<p>kashilo.com é uma plataforma de classificados focada em privacidade. Os usuários podem criar anúncios e se comunicar por mensagens criptografadas de ponta a ponta — sem revelar dados pessoais.</p>
<p>Os pagamentos são feitos exclusivamente em Monero (XMR). Sem KYC, sem email, sem rastreamento.</p>
<p>Publicar um anúncio custa 1 USD (pagável em Monero). Sem taxas ocultas, sem assinaturas.</p>
<h2>Princípios</h2>
<ul>
@@ -102,6 +108,7 @@ class PageAbout extends HTMLElement {
<h1>О kashilo.com</h1>
<p>kashilo.com — это платформа объявлений с приоритетом конфиденциальности. Пользователи могут создавать объявления и общаться через сквозное шифрование — без раскрытия личных данных.</p>
<p>Оплата осуществляется исключительно в Monero (XMR). Без KYC, без email, без отслеживания.</p>
<p>Публикация объявления стоит 1 USD (оплата в Monero). Без скрытых комиссий, без подписок.</p>
<h2>Принципы</h2>
<ul>

View File

@@ -28,6 +28,26 @@ class PageContact extends HTMLElement {
<h1>Contact</h1>
<p>Pour toute question ou problème, contactez-nous à :</p>
<p><strong>E-mail :</strong> <a href="mailto:hello@kashilo.com">hello@kashilo.com</a></p>
`,
it: /* html */`
<h1>Contatto</h1>
<p>Per domande o problemi, contattaci a:</p>
<p><strong>E-mail:</strong> <a href="mailto:hello@kashilo.com">hello@kashilo.com</a></p>
`,
es: /* html */`
<h1>Contacto</h1>
<p>Para preguntas o problemas, contáctanos en:</p>
<p><strong>Correo electrónico:</strong> <a href="mailto:hello@kashilo.com">hello@kashilo.com</a></p>
`,
pt: /* html */`
<h1>Contato</h1>
<p>Para dúvidas ou problemas, entre em contato:</p>
<p><strong>E-mail:</strong> <a href="mailto:hello@kashilo.com">hello@kashilo.com</a></p>
`,
ru: /* html */`
<h1>Контакт</h1>
<p>По вопросам или проблемам свяжитесь с нами:</p>
<p><strong>E-mail:</strong> <a href="mailto:hello@kashilo.com">hello@kashilo.com</a></p>
`
}
return content[lang] || content.de
@@ -35,7 +55,7 @@ class PageContact extends HTMLElement {
render() {
const lang = getCurrentLanguage()
const backLabel = { de: 'Zurück zur Startseite', en: 'Back to Home', fr: 'Retour à l\'accueil' }
const backLabel = { de: 'Zurück zur Startseite', en: 'Back to Home', fr: 'Retour à l\'accueil', it: 'Torna alla home', es: 'Volver al inicio', pt: 'Voltar ao Início', ru: 'На главную' }
this.innerHTML = /* html */`
<div class="legal-page">
<a href="#/" class="back-link">← ${backLabel[lang] || backLabel.en}</a>

View File

@@ -401,9 +401,12 @@ class PageCreate extends HTMLElement {
${t('create.cancel')}
</button>
<button type="submit" class="btn btn-primary btn-lg">
${this.editMode ? t('create.saveChanges') : t('create.publish')}
${this.editMode ? t('create.saveChanges') : t('create.publishPaid')}
</button>
</div>
${!this.editMode ? `
<p class="publish-fee-hint">${t('create.publishFeeHint')}</p>
` : ''}
</form>
</div>
`
@@ -690,7 +693,7 @@ class PageCreate extends HTMLElement {
console.error('Failed to save listing:', error)
console.error('Error details:', JSON.stringify(error.data, null, 2))
submitBtn.disabled = false
submitBtn.textContent = this.editMode ? t('create.saveChanges') : t('create.publish')
submitBtn.textContent = this.editMode ? t('create.saveChanges') : t('create.publishPaid')
this.submitting = false
const errorMsg = error.data?.errors?.[0]?.message || error.message || t('create.publishFailed')
@@ -1024,6 +1027,13 @@ style.textContent = /* css */`
margin-top: var(--space-xl);
}
page-create .publish-fee-hint {
text-align: right;
font-size: var(--font-size-xs);
color: var(--color-text-muted);
margin-top: var(--space-sm);
}
page-create .form-error {
padding: var(--space-md);
background: var(--color-bg-tertiary);

View File

@@ -25,20 +25,21 @@ class PagePrivacy extends HTMLElement {
<p>Die Plattform wurde nach dem Prinzip der Datensparsamkeit konzipiert.</p>
<h2>3. Welche Daten werden erhoben?</h2>
<p><strong>3.1 Daten, die wir NICHT erheben:</strong> Keine E-Mail-Adressen, keine Namen, keine Telefonnummern, keine Standortdaten der Nutzer, keine Zahlungsdaten.</p>
<p><strong>3.1 Daten, die wir NICHT erheben:</strong> Keine E-Mail-Adressen, keine Namen, keine Telefonnummern, keine Standortdaten der Nutzer. Zahlungen werden über BTCPay Server abgewickelt — dabei werden keine personenbezogenen Zahlungsdaten erhoben.</p>
<p><strong>3.2 Registrierung:</strong> Ein kryptografischer Hash (SHA-256) der UUID wird als Benutzerkennung gespeichert. Die UUID selbst wird nicht gespeichert.</p>
<p><strong>3.3 Nutzung:</strong> Anzeigen (Titel, Beschreibung, Preis, Kategorie, Standort, Bilder), Nachrichten (Ende-zu-Ende verschlüsselt, nur Ciphertext gespeichert), Favoriten (lokal im Browser).</p>
<p><strong>3.3 Nutzung:</strong> Anzeigen (Titel, Beschreibung, Preis, Kategorie, Standort, Bilder), Nachrichten (Ende-zu-Ende verschlüsselt, nur Ciphertext gespeichert), Favoriten (im Browser und serverseitig synchronisiert).</p>
<p><strong>3.4 Technische Daten:</strong> Server-Logs können temporär IP-Adressen und Zugriffszeiten enthalten.</p>
<p><strong>3.5 Proof-of-Work:</strong> Bei der Registrierung und bestimmten Aktionen wird ein Proof-of-Work-Captcha durchgeführt. Dabei werden keine personenbezogenen Daten erhoben.</p>
<h2>4. Cookies und lokale Speicherung</h2>
<p><strong>4.1</strong> Keine Cookies für Tracking oder Analyse.</p>
<p><strong>4.2</strong> localStorage: Spracheinstellung, Theme, Währung, Auth-Token, Favoriten, Kategorie-Cache.</p>
<p><strong>4.2</strong> localStorage: Spracheinstellung, Theme, Währung, Auth-Token, Kategorie-Cache.</p>
<p><strong>4.3</strong> Diese Daten verlassen den Browser nicht.</p>
<h2>5. Drittdienste</h2>
<p><strong>5.1 Directus (Backend):</strong> Selbst gehostet, keine Datenübertragung an Dritte.</p>
<p><strong>5.2 BTCPay Server (Zahlungen):</strong> Keine personenbezogenen Daten übertragen.</p>
<p><strong>5.3 CoinGecko API (Wechselkurse):</strong> Keine personenbezogenen Daten übertragen.</p>
<p><strong>5.2 BTCPay Server (Zahlungen):</strong> Selbst gehostet, keine Datenübertragung an Dritte.</p>
<p><strong>5.3 CoinGecko API / Kraken API (Wechselkurse):</strong> Öffentliche APIs für aktuelle Wechselkurse. Es werden keine personenbezogenen Daten übertragen.</p>
<h2>6. Verschlüsselung</h2>
<p><strong>6.1</strong> Kommunikation ist Ende-zu-Ende verschlüsselt (NaCl/TweetNaCl).</p>
@@ -76,20 +77,21 @@ class PagePrivacy extends HTMLElement {
<p>The platform was designed following the principle of data minimization.</p>
<h2>3. What data is collected?</h2>
<p><strong>3.1 Data we do NOT collect:</strong> No email addresses, no names, no phone numbers, no user location data, no payment data.</p>
<p><strong>3.1 Data we do NOT collect:</strong> No email addresses, no names, no phone numbers, no user location data. Payments are processed via BTCPay Server — no personal payment data is collected.</p>
<p><strong>3.2 Registration:</strong> A cryptographic hash (SHA-256) of the UUID is stored as user identifier. The UUID itself is not stored.</p>
<p><strong>3.3 Usage:</strong> Listings (title, description, price, category, location, images), Messages (end-to-end encrypted, only ciphertext stored), Favorites (stored locally in browser).</p>
<p><strong>3.3 Usage:</strong> Listings (title, description, price, category, location, images), Messages (end-to-end encrypted, only ciphertext stored), Favorites (stored in browser and synced server-side).</p>
<p><strong>3.4 Technical data:</strong> Server logs may temporarily contain IP addresses and access times.</p>
<p><strong>3.5 Proof-of-Work:</strong> A proof-of-work captcha is performed during registration and certain actions. No personal data is collected in this process.</p>
<h2>4. Cookies and local storage</h2>
<p><strong>4.1</strong> No cookies for tracking or analytics.</p>
<p><strong>4.2</strong> localStorage: Language setting, theme, currency, auth token, favorites, category cache.</p>
<p><strong>4.2</strong> localStorage: Language setting, theme, currency, auth token, category cache.</p>
<p><strong>4.3</strong> This data does not leave the browser.</p>
<h2>5. Third-party services</h2>
<p><strong>5.1 Directus (Backend):</strong> Self-hosted, no data transfer to third parties.</p>
<p><strong>5.2 BTCPay Server (Payments):</strong> No personal data transferred.</p>
<p><strong>5.3 CoinGecko API (Exchange rates):</strong> No personal data transferred.</p>
<p><strong>5.2 BTCPay Server (Payments):</strong> Self-hosted, no data transfer to third parties.</p>
<p><strong>5.3 CoinGecko API / Kraken API (Exchange rates):</strong> Public APIs for current exchange rates. No personal data is transferred.</p>
<h2>6. Encryption</h2>
<p><strong>6.1</strong> Communication is end-to-end encrypted (NaCl/TweetNaCl).</p>
@@ -127,20 +129,21 @@ class PagePrivacy extends HTMLElement {
<p>La plateforme a été conçue selon le principe de minimisation des données.</p>
<h2>3. Quelles données sont collectées ?</h2>
<p><strong>3.1 Données que nous ne collectons PAS :</strong> Aucune adresse e-mail, aucun nom, aucun numéro de téléphone, aucune donnée de localisation, aucune donnée de paiement.</p>
<p><strong>3.1 Données que nous ne collectons PAS :</strong> Aucune adresse e-mail, aucun nom, aucun numéro de téléphone, aucune donnée de localisation. Les paiements sont traités via BTCPay Server — aucune donnée de paiement personnelle n'est collectée.</p>
<p><strong>3.2 Inscription :</strong> Un hash cryptographique (SHA-256) de l'UUID est stocké comme identifiant. L'UUID lui-même n'est pas stocké.</p>
<p><strong>3.3 Utilisation :</strong> Annonces (titre, description, prix, catégorie, lieu, images), Messages (chiffrés de bout en bout, seul le texte chiffré est stocké), Favoris (stockés localement dans le navigateur).</p>
<p><strong>3.3 Utilisation :</strong> Annonces (titre, description, prix, catégorie, lieu, images), Messages (chiffrés de bout en bout, seul le texte chiffré est stocké), Favoris (stockés dans le navigateur et synchronisés côté serveur).</p>
<p><strong>3.4 Données techniques :</strong> Les journaux serveur peuvent temporairement contenir des adresses IP et des heures d'accès.</p>
<p><strong>3.5 Proof-of-Work :</strong> Un captcha proof-of-work est effectué lors de l'inscription et de certaines actions. Aucune donnée personnelle n'est collectée dans ce processus.</p>
<h2>4. Cookies et stockage local</h2>
<p><strong>4.1</strong> Aucun cookie de suivi ou d'analyse.</p>
<p><strong>4.2</strong> localStorage : Langue, thème, devise, jeton d'authentification, favoris, cache des catégories.</p>
<p><strong>4.2</strong> localStorage : Langue, thème, devise, jeton d'authentification, cache des catégories.</p>
<p><strong>4.3</strong> Ces données ne quittent pas le navigateur.</p>
<h2>5. Services tiers</h2>
<p><strong>5.1 Directus (Backend) :</strong> Auto-hébergé, aucun transfert de données à des tiers.</p>
<p><strong>5.2 BTCPay Server (Paiements) :</strong> Aucune donnée personnelle transférée.</p>
<p><strong>5.3 CoinGecko API (Taux de change) :</strong> Aucune donnée personnelle transférée.</p>
<p><strong>5.2 BTCPay Server (Paiements) :</strong> Auto-hébergé, aucun transfert de données à des tiers.</p>
<p><strong>5.3 CoinGecko API / Kraken API (Taux de change) :</strong> APIs publiques pour les taux de change actuels. Aucune donnée personnelle n'est transférée.</p>
<h2>6. Chiffrement</h2>
<p><strong>6.1</strong> La communication est chiffrée de bout en bout (NaCl/TweetNaCl).</p>
@@ -178,20 +181,21 @@ class PagePrivacy extends HTMLElement {
<p>La piattaforma è stata progettata secondo il principio della minimizzazione dei dati.</p>
<h2>3. Quali dati vengono raccolti?</h2>
<p><strong>3.1 Dati che NON raccogliamo:</strong> Nessun indirizzo e-mail, nessun nome, nessun numero di telefono, nessun dato di localizzazione degli utenti, nessun dato di pagamento.</p>
<p><strong>3.1 Dati che NON raccogliamo:</strong> Nessun indirizzo e-mail, nessun nome, nessun numero di telefono, nessun dato di localizzazione degli utenti. I pagamenti vengono elaborati tramite BTCPay Server — non vengono raccolti dati di pagamento personali.</p>
<p><strong>3.2 Registrazione:</strong> Un hash crittografico (SHA-256) dell'UUID viene memorizzato come identificativo utente. L'UUID stesso non viene memorizzato.</p>
<p><strong>3.3 Utilizzo:</strong> Annunci (titolo, descrizione, prezzo, categoria, località, immagini), Messaggi (crittografati end-to-end, solo il testo cifrato viene memorizzato), Preferiti (memorizzati localmente nel browser).</p>
<p><strong>3.3 Utilizzo:</strong> Annunci (titolo, descrizione, prezzo, categoria, località, immagini), Messaggi (crittografati end-to-end, solo il testo cifrato viene memorizzato), Preferiti (memorizzati nel browser e sincronizzati lato server).</p>
<p><strong>3.4 Dati tecnici:</strong> I log del server possono contenere temporaneamente indirizzi IP e orari di accesso.</p>
<p><strong>3.5 Proof-of-Work:</strong> Un captcha proof-of-work viene eseguito durante la registrazione e determinate azioni. Nessun dato personale viene raccolto in questo processo.</p>
<h2>4. Cookie e archiviazione locale</h2>
<p><strong>4.1</strong> Nessun cookie per tracciamento o analisi.</p>
<p><strong>4.2</strong> localStorage: Impostazione lingua, tema, valuta, token di autenticazione, preferiti, cache delle categorie.</p>
<p><strong>4.2</strong> localStorage: Impostazione lingua, tema, valuta, token di autenticazione, cache delle categorie.</p>
<p><strong>4.3</strong> Questi dati non lasciano il browser.</p>
<h2>5. Servizi di terze parti</h2>
<p><strong>5.1 Directus (Backend):</strong> Self-hosted, nessun trasferimento di dati a terzi.</p>
<p><strong>5.2 BTCPay Server (Pagamenti):</strong> Nessun dato personale trasferito.</p>
<p><strong>5.3 CoinGecko API (Tassi di cambio):</strong> Nessun dato personale trasferito.</p>
<p><strong>5.2 BTCPay Server (Pagamenti):</strong> Self-hosted, nessun trasferimento di dati a terzi.</p>
<p><strong>5.3 CoinGecko API / Kraken API (Tassi di cambio):</strong> API pubbliche per i tassi di cambio attuali. Nessun dato personale viene trasferito.</p>
<h2>6. Crittografia</h2>
<p><strong>6.1</strong> La comunicazione è crittografata end-to-end (NaCl/TweetNaCl).</p>
@@ -229,20 +233,21 @@ class PagePrivacy extends HTMLElement {
<p>La plataforma fue diseñada según el principio de minimización de datos.</p>
<h2>3. ¿Qué datos se recopilan?</h2>
<p><strong>3.1 Datos que NO recopilamos:</strong> Sin direcciones de correo electrónico, sin nombres, sin números de teléfono, sin datos de ubicación de los usuarios, sin datos de pago.</p>
<p><strong>3.1 Datos que NO recopilamos:</strong> Sin direcciones de correo electrónico, sin nombres, sin números de teléfono, sin datos de ubicación de los usuarios. Los pagos se procesan a través de BTCPay Server — no se recopilan datos de pago personales.</p>
<p><strong>3.2 Registro:</strong> Un hash criptográfico (SHA-256) del UUID se almacena como identificador de usuario. El UUID en sí no se almacena.</p>
<p><strong>3.3 Uso:</strong> Anuncios (título, descripción, precio, categoría, ubicación, imágenes), Mensajes (cifrados de extremo a extremo, solo se almacena el texto cifrado), Favoritos (almacenados localmente en el navegador).</p>
<p><strong>3.3 Uso:</strong> Anuncios (título, descripción, precio, categoría, ubicación, imágenes), Mensajes (cifrados de extremo a extremo, solo se almacena el texto cifrado), Favoritos (almacenados en el navegador y sincronizados en el servidor).</p>
<p><strong>3.4 Datos técnicos:</strong> Los registros del servidor pueden contener temporalmente direcciones IP y horarios de acceso.</p>
<p><strong>3.5 Proof-of-Work:</strong> Se realiza un captcha proof-of-work durante el registro y determinadas acciones. No se recopilan datos personales en este proceso.</p>
<h2>4. Cookies y almacenamiento local</h2>
<p><strong>4.1</strong> Sin cookies para seguimiento o análisis.</p>
<p><strong>4.2</strong> localStorage: Idioma, tema, moneda, token de autenticación, favoritos, caché de categorías.</p>
<p><strong>4.2</strong> localStorage: Idioma, tema, moneda, token de autenticación, caché de categorías.</p>
<p><strong>4.3</strong> Estos datos no salen del navegador.</p>
<h2>5. Servicios de terceros</h2>
<p><strong>5.1 Directus (Backend):</strong> Autoalojado, sin transferencia de datos a terceros.</p>
<p><strong>5.2 BTCPay Server (Pagos):</strong> Sin datos personales transferidos.</p>
<p><strong>5.3 CoinGecko API (Tipos de cambio):</strong> Sin datos personales transferidos.</p>
<p><strong>5.2 BTCPay Server (Pagos):</strong> Autoalojado, sin transferencia de datos a terceros.</p>
<p><strong>5.3 CoinGecko API / Kraken API (Tipos de cambio):</strong> APIs públicas para tipos de cambio actuales. No se transfieren datos personales.</p>
<h2>6. Cifrado</h2>
<p><strong>6.1</strong> La comunicación está cifrada de extremo a extremo (NaCl/TweetNaCl).</p>
@@ -280,20 +285,21 @@ class PagePrivacy extends HTMLElement {
<p>A plataforma foi projetada segundo o princípio da minimização de dados.</p>
<h2>3. Quais dados são coletados?</h2>
<p><strong>3.1 Dados que NÃO coletamos:</strong> Sem endereços de e-mail, sem nomes, sem números de telefone, sem dados de localização dos usuários, sem dados de pagamento.</p>
<p><strong>3.1 Dados que NÃO coletamos:</strong> Sem endereços de e-mail, sem nomes, sem números de telefone, sem dados de localização dos usuários. Os pagamentos são processados via BTCPay Server — nenhum dado de pagamento pessoal é coletado.</p>
<p><strong>3.2 Registro:</strong> Um hash criptográfico (SHA-256) do UUID é armazenado como identificador do usuário. O UUID em si não é armazenado.</p>
<p><strong>3.3 Uso:</strong> Anúncios (título, descrição, preço, categoria, localização, imagens), Mensagens (criptografadas de ponta a ponta, apenas o texto cifrado é armazenado), Favoritos (armazenados localmente no navegador).</p>
<p><strong>3.3 Uso:</strong> Anúncios (título, descrição, preço, categoria, localização, imagens), Mensagens (criptografadas de ponta a ponta, apenas o texto cifrado é armazenado), Favoritos (armazenados no navegador e sincronizados no servidor).</p>
<p><strong>3.4 Dados técnicos:</strong> Os logs do servidor podem conter temporariamente endereços IP e horários de acesso.</p>
<p><strong>3.5 Proof-of-Work:</strong> Um captcha proof-of-work é realizado durante o registro e determinadas ações. Nenhum dado pessoal é coletado neste processo.</p>
<h2>4. Cookies e armazenamento local</h2>
<p><strong>4.1</strong> Sem cookies para rastreamento ou análise.</p>
<p><strong>4.2</strong> localStorage: Idioma, tema, moeda, token de autenticação, favoritos, cache de categorias.</p>
<p><strong>4.2</strong> localStorage: Idioma, tema, moeda, token de autenticação, cache de categorias.</p>
<p><strong>4.3</strong> Estes dados não saem do navegador.</p>
<h2>5. Serviços de terceiros</h2>
<p><strong>5.1 Directus (Backend):</strong> Auto-hospedado, sem transferência de dados a terceiros.</p>
<p><strong>5.2 BTCPay Server (Pagamentos):</strong> Sem dados pessoais transferidos.</p>
<p><strong>5.3 CoinGecko API (Taxas de câmbio):</strong> Sem dados pessoais transferidos.</p>
<p><strong>5.2 BTCPay Server (Pagamentos):</strong> Auto-hospedado, sem transferência de dados a terceiros.</p>
<p><strong>5.3 CoinGecko API / Kraken API (Taxas de câmbio):</strong> APIs públicas para taxas de câmbio atuais. Nenhum dado pessoal é transferido.</p>
<h2>6. Criptografia</h2>
<p><strong>6.1</strong> A comunicação é criptografada de ponta a ponta (NaCl/TweetNaCl).</p>
@@ -331,20 +337,21 @@ class PagePrivacy extends HTMLElement {
<p>Платформа разработана по принципу минимизации данных.</p>
<h2>3. Какие данные собираются?</h2>
<p><strong>3.1 Данные, которые мы НЕ собираем:</strong> Никаких адресов электронной почты, имён, номеров телефонов, данных о местоположении пользователей, платёжных данных.</p>
<p><strong>3.1 Данные, которые мы НЕ собираем:</strong> Никаких адресов электронной почты, имён, номеров телефонов, данных о местоположении пользователей. Платежи обрабатываются через BTCPay Server — персональные платёжные данные не собираются.</p>
<p><strong>3.2 Регистрация:</strong> Криптографический хеш (SHA-256) UUID сохраняется как идентификатор пользователя. Сам UUID не сохраняется.</p>
<p><strong>3.3 Использование:</strong> Объявления (заголовок, описание, цена, категория, местоположение, изображения), Сообщения (сквозное шифрование, хранится только зашифрованный текст), Избранное (хранится локально в браузере).</p>
<p><strong>3.3 Использование:</strong> Объявления (заголовок, описание, цена, категория, местоположение, изображения), Сообщения (сквозное шифрование, хранится только зашифрованный текст), Избранное (хранится в браузере и синхронизируется на сервере).</p>
<p><strong>3.4 Технические данные:</strong> Серверные логи могут временно содержать IP-адреса и время доступа.</p>
<p><strong>3.5 Proof-of-Work:</strong> При регистрации и определённых действиях выполняется captcha proof-of-work. Персональные данные при этом не собираются.</p>
<h2>4. Файлы cookie и локальное хранилище</h2>
<p><strong>4.1</strong> Никаких cookie для отслеживания или аналитики.</p>
<p><strong>4.2</strong> localStorage: Язык, тема, валюта, токен аутентификации, избранное, кеш категорий.</p>
<p><strong>4.2</strong> localStorage: Язык, тема, валюта, токен аутентификации, кеш категорий.</p>
<p><strong>4.3</strong> Эти данные не покидают браузер.</p>
<h2>5. Сторонние сервисы</h2>
<p><strong>5.1 Directus (Бэкенд):</strong> Собственный хостинг, без передачи данных третьим лицам.</p>
<p><strong>5.2 BTCPay Server (Платежи):</strong> Персональные данные не передаются.</p>
<p><strong>5.3 CoinGecko API (Курсы валют):</strong> Персональные данные не передаются.</p>
<p><strong>5.2 BTCPay Server (Платежи):</strong> Собственный хостинг, без передачи данных третьим лицам.</p>
<p><strong>5.3 CoinGecko API / Kraken API (Курсы валют):</strong> Публичные API для актуальных курсов валют. Персональные данные не передаются.</p>
<h2>6. Шифрование</h2>
<p><strong>6.1</strong> Коммуникация защищена сквозным шифрованием (NaCl/TweetNaCl).</p>

View File

@@ -63,10 +63,10 @@ class PageTerms extends HTMLElement {
<p>4.3 Anzeigen sind zeitlich begrenzt (30 Tage) und werden danach automatisch archiviert.</p>
<h2>5. Gebühren und Zahlungen</h2>
<p>5.1 Die Veröffentlichung einer Anzeige ist gebührenpflichtig. Die aktuelle Gebühr wird vor der Veröffentlichung angezeigt.</p>
<p>5.2 Die Bezahlung erfolgt ausschliesslich in Monero (XMR).</p>
<p>5.1 Die Veröffentlichung einer Anzeige kostet 1 USD (oder Gegenwert in anderer Währung) für eine Laufzeit von 30 Tagen. Der Betreiber behält sich vor, die Gebühr anzupassen.</p>
<p>5.2 Die Bezahlung erfolgt in Monero (XMR) über den Zahlungsdienstleister BTCPay Server. Es werden keine personenbezogenen Zahlungsdaten erhoben.</p>
<p>5.3 Bezahlte Gebühren werden nicht erstattet.</p>
<p>5.4 Transaktionen zwischen Nutzer/innen erfolgen direkt und ohne Beteiligung der Plattform.</p>
<p>5.4 Transaktionen zwischen Nutzer/innen erfolgen direkt und ohne Beteiligung der Plattform. Der Betreiber ist nicht Vertragspartei und übernimmt keine Verantwortung für Zahlungen zwischen Nutzern.</p>
<h2>6. Kommunikation</h2>
<p>6.1 Die Plattform stellt einen Ende-zu-Ende verschlüsselten Chat zur Verfügung. Der Betreiber hat keinen Zugang zu den Nachrichteninhalten.</p>
@@ -137,10 +137,10 @@ class PageTerms extends HTMLElement {
<p>4.3 Listings are limited to 30 days and are automatically archived thereafter.</p>
<h2>5. Fees and Payments</h2>
<p>5.1 Publishing a listing requires a fee. The current fee is displayed before publication.</p>
<p>5.2 Payment is made exclusively in Monero (XMR).</p>
<p>5.1 Publishing a listing costs $1 (or equivalent in other currencies) for a duration of 30 days. The operator reserves the right to adjust the fee.</p>
<p>5.2 Payment is made in Monero (XMR) via the payment processor BTCPay Server. No personal payment data is collected.</p>
<p>5.3 Paid fees are non-refundable.</p>
<p>5.4 Transactions between users are direct and without platform involvement.</p>
<p>5.4 Transactions between users are direct and without platform involvement. The operator is not a contracting party and assumes no responsibility for payments between users.</p>
<h2>6. Communication</h2>
<p>6.1 The platform provides end-to-end encrypted chat. The operator has no access to message content.</p>
@@ -211,10 +211,10 @@ class PageTerms extends HTMLElement {
<p>4.3 Les annonces sont limitées à 30 jours et sont automatiquement archivées.</p>
<h2>5. Frais et paiements</h2>
<p>5.1 La publication d'une annonce est payante. Les frais sont affichés avant la publication.</p>
<p>5.2 Le paiement s'effectue exclusivement en Monero (XMR).</p>
<p>5.1 La publication d'une annonce coûte 1 USD (ou l'équivalent dans une autre devise) pour une durée de 30 jours. L'exploitant se réserve le droit d'adapter les frais.</p>
<p>5.2 Le paiement s'effectue en Monero (XMR) via le prestataire de paiement BTCPay Server. Aucune donnée de paiement personnelle n'est collectée.</p>
<p>5.3 Les frais payés ne sont pas remboursables.</p>
<p>5.4 Les transactions entre utilisateurs sont directes et sans intervention de la plateforme.</p>
<p>5.4 Les transactions entre utilisateurs sont directes et sans intervention de la plateforme. L'exploitant n'est pas partie contractante et n'assume aucune responsabilité pour les paiements entre utilisateurs.</p>
<h2>6. Communication</h2>
<p>6.1 La plateforme fournit un chat chiffré de bout en bout. L'exploitant n'a pas accès au contenu des messages.</p>
@@ -285,10 +285,10 @@ class PageTerms extends HTMLElement {
<p>4.3 Gli annunci sono limitati a 30 giorni e vengono automaticamente archiviati.</p>
<h2>5. Tariffe e pagamenti</h2>
<p>5.1 La pubblicazione di un annuncio è a pagamento. La tariffa attuale viene visualizzata prima della pubblicazione.</p>
<p>5.2 Il pagamento avviene esclusivamente in Monero (XMR).</p>
<p>5.1 La pubblicazione di un annuncio costa 1 USD (o equivalente in altra valuta) per una durata di 30 giorni. Il gestore si riserva il diritto di adeguare la tariffa.</p>
<p>5.2 Il pagamento avviene in Monero (XMR) tramite il fornitore di servizi di pagamento BTCPay Server. Non vengono raccolti dati di pagamento personali.</p>
<p>5.3 Le tariffe pagate non sono rimborsabili.</p>
<p>5.4 Le transazioni tra utenti avvengono direttamente e senza il coinvolgimento della piattaforma.</p>
<p>5.4 Le transazioni tra utenti avvengono direttamente e senza coinvolgimento della piattaforma. Il gestore non è parte contrattuale e non si assume responsabilità per i pagamenti tra utenti.</p>
<h2>6. Comunicazione</h2>
<p>6.1 La piattaforma mette a disposizione una chat crittografata end-to-end. Il gestore non ha accesso al contenuto dei messaggi.</p>
@@ -359,10 +359,10 @@ class PageTerms extends HTMLElement {
<p>4.3 Los anuncios están limitados a 30 días y se archivan automáticamente.</p>
<h2>5. Tarifas y pagos</h2>
<p>5.1 La publicación de un anuncio tiene un coste. La tarifa actual se muestra antes de la publicación.</p>
<p>5.2 El pago se realiza exclusivamente en Monero (XMR).</p>
<p>5.1 La publicación de un anuncio cuesta 1 USD (o equivalente en otra moneda) por una duración de 30 días. El operador se reserva el derecho de ajustar la tarifa.</p>
<p>5.2 El pago se realiza en Monero (XMR) a través del procesador de pagos BTCPay Server. No se recopilan datos de pago personales.</p>
<p>5.3 Las tarifas pagadas no son reembolsables.</p>
<p>5.4 Las transacciones entre usuarios son directas y sin intervención de la plataforma.</p>
<p>5.4 Las transacciones entre usuarios son directas y sin participación de la plataforma. El operador no es parte contratante y no asume responsabilidad por los pagos entre usuarios.</p>
<h2>6. Comunicación</h2>
<p>6.1 La plataforma proporciona un chat cifrado de extremo a extremo. El operador no tiene acceso al contenido de los mensajes.</p>
@@ -433,10 +433,10 @@ class PageTerms extends HTMLElement {
<p>4.3 Os anúncios são limitados a 30 dias e são automaticamente arquivados.</p>
<h2>5. Taxas e pagamentos</h2>
<p>5.1 A publicação de um anúncio é paga. A taxa atual é exibida antes da publicação.</p>
<p>5.2 O pagamento é feito exclusivamente em Monero (XMR).</p>
<p>5.1 A publicação de um anúncio custa 1 USD (ou equivalente em outra moeda) por um período de 30 dias. O operador reserva-se o direito de ajustar a taxa.</p>
<p>5.2 O pagamento é feito em Monero (XMR) através do processador de pagamentos BTCPay Server. Nenhum dado de pagamento pessoal é coletado.</p>
<p>5.3 As taxas pagas não são reembolsáveis.</p>
<p>5.4 As transações entre usuários são diretas e sem envolvimento da plataforma.</p>
<p>5.4 As transações entre usuários são diretas e sem envolvimento da plataforma. O operador não é parte contratante e não assume responsabilidade pelos pagamentos entre usuários.</p>
<h2>6. Comunicação</h2>
<p>6.1 A plataforma disponibiliza um chat criptografado de ponta a ponta. O operador não tem acesso ao conteúdo das mensagens.</p>
@@ -507,10 +507,10 @@ class PageTerms extends HTMLElement {
<p>4.3 Объявления ограничены 30 днями и автоматически архивируются.</p>
<h2>5. Тарифы и платежи</h2>
<p>5.1 Публикация объявления является платной. Текущий тариф отображается перед публикацией.</p>
<p>5.2 Оплата производится исключительно в Monero (XMR).</p>
<p>5.1 Публикация объявления стоит 1 USD (или эквивалент в другой валюте) сроком на 30 дней. Оператор оставляет за собой право изменять тариф.</p>
<p>5.2 Оплата производится в Monero (XMR) через платёжный сервис BTCPay Server. Персональные платёжные данные не собираются.</p>
<p>5.3 Оплаченные тарифы не подлежат возврату.</p>
<p>5.4 Транзакции между пользователями осуществляются напрямую и без участия платформы.</p>
<p>5.4 Транзакции между пользователями осуществляются напрямую и без участия платформы. Оператор не является стороной договора и не несёт ответственности за платежи между пользователями.</p>
<h2>6. Коммуникация</h2>
<p>6.1 Платформа предоставляет чат со сквозным шифрованием. Оператор не имеет доступа к содержимому сообщений.</p>

View File

@@ -1,10 +1,12 @@
/**
* Currency Service - XMR/Fiat Conversion
*
* Uses CoinGecko API for real-time exchange rates (CORS-friendly)
* Primary: Kraken API (no key required, reliable)
* Fallback: CoinGecko API
* Supports two modes: fiat-fix and xmr-fix
*/
const KRAKEN_API = 'https://api.kraken.com/0/public/Ticker'
const COINGECKO_API = 'https://api.coingecko.com/api/v3/simple/price'
const CURRENCY_SYMBOLS = {
@@ -91,24 +93,67 @@ export async function getXmrRates() {
async function fetchRates() {
lastRequestTime = Date.now()
// Try Kraken first, then CoinGecko as fallback
const rates = await fetchFromKraken() || await fetchFromCoinGecko()
if (rates) {
cachedRates = rates
cacheTimestamp = Date.now()
saveToStorage()
return rates
}
return cachedRates || getDefaultRates()
}
async function fetchFromKraken() {
try {
const pairs = 'XMREUR,XMRUSD,XMRGBP,XMRJPY'
const response = await fetch(`${KRAKEN_API}?pair=${pairs}`)
if (!response.ok) return null
const data = await response.json()
if (data.error?.length > 0) return null
const r = data.result
const getPrice = (key) => {
const entry = r[key]
return entry ? parseFloat(entry.c[0]) : null
}
const eur = getPrice('XXMRZEUR') || getPrice('XMREUR')
const usd = getPrice('XXMRZUSD') || getPrice('XMRUSD')
const gbp = getPrice('XXMRGBP') || getPrice('XMRGBP')
const jpy = getPrice('XXMRJPY') || getPrice('XMRJPY')
if (!eur || !usd) return null
// Kraken doesn't have CHF/RUB/BRL pairs for XMR — derive from EUR
const chf = eur * 0.97
const rub = eur * 100
const brl = usd * 5.5
return { EUR: eur, USD: usd, GBP: gbp || eur * 0.86, CHF: chf, JPY: jpy || eur * 162, RUB: rub, BRL: brl }
} catch (e) {
console.warn('Kraken API failed, trying CoinGecko:', e.message)
return null
}
}
async function fetchFromCoinGecko() {
try {
const currencies = 'eur,usd,gbp,chf,jpy,rub,brl'
const response = await fetch(`${COINGECKO_API}?ids=monero&vs_currencies=${currencies}`)
// Handle rate limit response
if (response.status === 429) {
console.warn('CoinGecko rate limit hit, using cached rates')
return cachedRates || getDefaultRates()
console.warn('CoinGecko rate limit hit')
return null
}
const data = await response.json()
if (!data.monero) return null
if (!data.monero) {
console.error('CoinGecko API Error: No data returned')
return cachedRates || getDefaultRates()
}
const rates = {
return {
EUR: data.monero.eur,
USD: data.monero.usd,
GBP: data.monero.gbp,
@@ -117,16 +162,9 @@ async function fetchRates() {
RUB: data.monero.rub,
BRL: data.monero.brl
}
// Update cache
cachedRates = rates
cacheTimestamp = Date.now()
saveToStorage()
return rates
} catch (error) {
console.error('Failed to fetch XMR rates:', error)
return cachedRates || getDefaultRates()
} catch (e) {
console.error('CoinGecko API failed:', e.message)
return null
}
}

View File

@@ -155,6 +155,8 @@
"moneroHint": "Käufer senden die Zahlung direkt an diese Adresse.",
"cancel": "Abbrechen",
"publish": "Veröffentlichen",
"publishPaid": "Kostenpflichtig veröffentlichen",
"publishFeeHint": "Für die Veröffentlichung wird eine Gebühr von 1\u00a0USD fällig, zahlbar mit Monero.",
"publishing": "Wird veröffentlicht...",
"saveChanges": "Änderungen speichern",
"saving": "Wird gespeichert...",

View File

@@ -155,6 +155,8 @@
"moneroHint": "Buyers will send payment directly to this address.",
"cancel": "Cancel",
"publish": "Publish",
"publishPaid": "Publish (paid)",
"publishFeeHint": "A listing fee of $1 applies, payable with Monero.",
"publishing": "Publishing...",
"saveChanges": "Save Changes",
"saving": "Saving...",

View File

@@ -155,6 +155,8 @@
"moneroHint": "Los compradores enviarán el pago directamente a esta dirección.",
"cancel": "Cancelar",
"publish": "Publicar",
"publishPaid": "Publicar (de pago)",
"publishFeeHint": "Se aplica una tarifa de publicación de 1\u00a0USD, pagable con Monero.",
"publishing": "Publicando...",
"saveChanges": "Guardar cambios",
"saving": "Guardando...",

View File

@@ -155,6 +155,8 @@
"moneroHint": "Les acheteurs envoient le paiement directement à cette adresse.",
"cancel": "Annuler",
"publish": "Publier",
"publishPaid": "Publier (payant)",
"publishFeeHint": "Des frais de publication de 1\u00a0USD s'appliquent, payables en Monero.",
"publishing": "Publication en cours...",
"saveChanges": "Enregistrer les modifications",
"saving": "Enregistrement...",

View File

@@ -155,6 +155,8 @@
"moneroHint": "Gli acquirenti invieranno il pagamento direttamente a questo indirizzo.",
"cancel": "Annulla",
"publish": "Pubblica",
"publishPaid": "Pubblica (a pagamento)",
"publishFeeHint": "Per la pubblicazione è previsto un costo di 1\u00a0USD, pagabile in Monero.",
"publishing": "Pubblicazione in corso...",
"saveChanges": "Salva modifiche",
"saving": "Salvataggio...",

View File

@@ -155,6 +155,8 @@
"moneroHint": "Os compradores enviarão o pagamento diretamente para este endereço.",
"cancel": "Cancelar",
"publish": "Publicar",
"publishPaid": "Publicar (pago)",
"publishFeeHint": "Aplica-se uma taxa de publicação de 1\u00a0USD, pagável com Monero.",
"publishing": "Publicando...",
"saveChanges": "Salvar Alterações",
"saving": "Salvando...",

View File

@@ -155,6 +155,8 @@
"moneroHint": "Покупатели отправят оплату напрямую на этот адрес.",
"cancel": "Отмена",
"publish": "Опубликовать",
"publishPaid": "Опубликовать (платно)",
"publishFeeHint": "За публикацию взимается плата 1\u00a0USD, оплата в Monero.",
"publishing": "Публикация...",
"saveChanges": "Сохранить изменения",
"saving": "Сохранение...",