refactor: rename project from dgray.io to kashilo.com

This commit is contained in:
2026-02-10 18:43:49 +01:00
parent 4e77ce92f3
commit 9069404942
60 changed files with 260 additions and 260 deletions

View File

@@ -2,7 +2,7 @@
**Directus Version:** 11.14.1
**Database:** PostgreSQL
**API Endpoint:** https://api.dgray.io
**API Endpoint:** https://api.kashilo.com
## Collections Overview

View File

@@ -1,8 +1,8 @@
# Directus Setup für dgray.io
# Directus Setup für kashilo.com
Komplette Anleitung zur Einrichtung von Directus als Backend für die dgray Kleinanzeigen-PWA.
Komplette Anleitung zur Einrichtung von Directus als Backend für die kashilo Kleinanzeigen-PWA.
**API URL**: https://api.dgray.io/
**API URL**: https://api.kashilo.com/
---
@@ -622,8 +622,8 @@ module.exports = async function(data, { database }) {
**Settings > Project Settings**
```
Project Name: dgray.io
Project URL: https://dgray.io
Project Name: kashilo.com
Project URL: https://kashilo.com
Project Color: #555555
```
@@ -637,7 +637,7 @@ services:
image: directus/directus:latest
environment:
CORS_ENABLED: "true"
CORS_ORIGIN: "https://dgray.io,https://www.dgray.io,http://localhost:8080"
CORS_ORIGIN: "https://kashilo.com,https://www.kashilo.com,http://localhost:8080"
CORS_METHODS: "GET,POST,PATCH,DELETE"
CORS_ALLOWED_HEADERS: "Content-Type,Authorization"
CORS_CREDENTIALS: "true"
@@ -655,7 +655,7 @@ services:
```env
# .env
CORS_ENABLED=true
CORS_ORIGIN=https://dgray.io,https://www.dgray.io,http://localhost:8080
CORS_ORIGIN=https://kashilo.com,https://www.kashilo.com,http://localhost:8080
CORS_METHODS=GET,POST,PATCH,DELETE
CORS_ALLOWED_HEADERS=Content-Type,Authorization
CORS_CREDENTIALS=true
@@ -706,7 +706,7 @@ environment:
STORAGE_S3_DRIVER: "s3"
STORAGE_S3_KEY: "your-access-key"
STORAGE_S3_SECRET: "your-secret-key"
STORAGE_S3_BUCKET: "dgray-files"
STORAGE_S3_BUCKET: "kashilo-files"
STORAGE_S3_REGION: "fsn1" # oder nbg1
STORAGE_S3_ENDPOINT: "https://fsn1.your-objectstorage.com" # oder nbg1
```
@@ -720,7 +720,7 @@ environment:
STORAGE_S3_DRIVER: "s3"
STORAGE_S3_KEY: "your-access-key"
STORAGE_S3_SECRET: "your-secret-key"
STORAGE_S3_BUCKET: "dgray-files"
STORAGE_S3_BUCKET: "kashilo-files"
STORAGE_S3_REGION: "auto"
STORAGE_S3_ENDPOINT: "https://xxx.r2.cloudflarestorage.com"
```
@@ -746,7 +746,7 @@ RATE_LIMITER_POINTS=100
RATE_LIMITER_DURATION=60
```
**Hinweis:** Keine E-Mail-Konfiguration nötig - dgray.io nutzt keine E-Mails (Privacy by Design).
**Hinweis:** Keine E-Mail-Konfiguration nötig - kashilo.com nutzt keine E-Mails (Privacy by Design).
### 5.6 Währungsumrechnung & Preismodus
@@ -901,7 +901,7 @@ if (directus.isAuthenticated()) {
## 9. Anonyme Authentifizierung (UUID-basiert)
Für maximale Privatsphäre nutzt dgray.io ein UUID-basiertes Login-System ohne echte E-Mail-Adressen.
Für maximale Privatsphäre nutzt kashilo.com ein UUID-basiertes Login-System ohne echte E-Mail-Adressen.
### 9.1 Konzept
@@ -913,7 +913,7 @@ Für maximale Privatsphäre nutzt dgray.io ein UUID-basiertes Login-System ohne
│ f47ac10b-58cc-4372-a567-0e02b2c3d479 │
│ ↓ │
│ Directus erhält: │
│ • E-Mail: f47ac10b-58cc-4372-a567-0e02b2c3d479@dgray.io
│ • E-Mail: f47ac10b-58cc-4372-a567-0e02b2c3d479@kashilo.com
│ • Passwort: f47ac10b-58cc-4372-a567-0e02b2c3d479 │
│ ↓ │
│ User speichert UUID → fertig │
@@ -943,7 +943,7 @@ Für maximale Privatsphäre nutzt dgray.io ein UUID-basiertes Login-System ohne
// Account erstellen
async function createAnonymousAccount() {
const uuid = crypto.randomUUID();
const email = `${uuid}@dgray.io`;
const email = `${uuid}@kashilo.com`;
const password = uuid;
// Bei Directus registrieren
@@ -957,7 +957,7 @@ async function createAnonymousAccount() {
// Login
async function login(uuid) {
const email = `${uuid}@dgray.io`;
const email = `${uuid}@kashilo.com`;
await directus.login(email, uuid);
}
```

View File

@@ -1,4 +1,4 @@
# Killer-Features — dgray.io
# Killer-Features — kashilo.com
Differenzierung gegenüber eBay Kleinanzeigen, Tutti, XMRBazaar.
Drei Features, die kein Konkurrent hat.

View File

@@ -1,4 +1,4 @@
# Launch Plan dgray.io
# Launch Plan kashilo.com
## Release-Phasen
@@ -48,12 +48,12 @@ Die Validierung passiert **serverseitig** im PoW-Server (PHP), nicht im Frontend
Neuer Endpoint: `POST /invite/validate`
```php
// pow.dgray.io/invite/validate.php
// pow.kashilo.com/invite/validate.php
<?php
require __DIR__ . '/config.php';
header('Content-Type: application/json');
header('Access-Control-Allow-Origin: https://dgray.io');
header('Access-Control-Allow-Origin: https://kashilo.com');
header('Access-Control-Allow-Methods: POST, OPTIONS');
header('Access-Control-Allow-Headers: Content-Type');
@@ -132,7 +132,7 @@ In `js/components/auth-modal.js` — im Registrierungs-Flow ein Textfeld hinzuf
Vor `createAccount()` den Code serverseitig validieren:
```js
const res = await fetch('https://pow.dgray.io/invite/validate', {
const res = await fetch('https://pow.kashilo.com/invite/validate', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ code: inviteCode })
@@ -214,21 +214,21 @@ define('LISTING_FEE', ['EUR' => 0.01, 'USD' => 0.01, 'CHF' => 0.01, 'GBP' => 0.0
## Meta-Tags (pro Sprache)
Die statischen Meta-Tags in `index.html` sind deutsch (Fallback).
Der OG-Proxy (`pow.dgray.io/og-proxy.php`) liefert Listing-spezifische Tags.
Der OG-Proxy (`pow.kashilo.com/og-proxy.php`) liefert Listing-spezifische Tags.
### Umgesetzte Texte
**Title:** `dgray.io [Sprache]`
**Title:** `kashilo.com [Sprache]`
| Sprache | Title | Description |
|---------|-------|-------------|
| **de** | dgray.io Anonyme Kleinanzeigen | Kaufen und verkaufen ohne Konto, ohne E-Mail. Bezahlung mit Monero. Ende-zu-Ende verschlüsselter Chat. |
| **en** | dgray.io Private Classifieds | Buy and sell without an account, without email. Pay with Monero. End-to-end encrypted chat. |
| **fr** | dgray.io Petites annonces anonymes | Achetez et vendez sans compte, sans e-mail. Paiement en Monero. Chat chiffré de bout en bout. |
| **it** | dgray.io Annunci anonimi | Compra e vendi senza account, senza email. Pagamento in Monero. Chat crittografata end-to-end. |
| **es** | dgray.io Clasificados anónimos | Compra y vende sin cuenta, sin email. Pago con Monero. Chat cifrado de extremo a extremo. |
| **pt** | dgray.io Classificados anônimos | Compre e venda sem conta, sem email. Pagamento com Monero. Chat criptografado ponta a ponta. |
| **ru** | dgray.io Анонимные объявления | Покупайте и продавайте без аккаунта, без email. Оплата Monero. Сквозное шифрование чата. |
| **de** | kashilo.com Anonyme Kleinanzeigen | Kaufen und verkaufen ohne Konto, ohne E-Mail. Bezahlung mit Monero. Ende-zu-Ende verschlüsselter Chat. |
| **en** | kashilo.com Private Classifieds | Buy and sell without an account, without email. Pay with Monero. End-to-end encrypted chat. |
| **fr** | kashilo.com Petites annonces anonymes | Achetez et vendez sans compte, sans e-mail. Paiement en Monero. Chat chiffré de bout en bout. |
| **it** | kashilo.com Annunci anonimi | Compra e vendi senza account, senza email. Pagamento in Monero. Chat crittografata end-to-end. |
| **es** | kashilo.com Clasificados anónimos | Compra y vende sin cuenta, sin email. Pago con Monero. Chat cifrado de extremo a extremo. |
| **pt** | kashilo.com Classificados anônimos | Compre e venda sem conta, sem email. Pagamento com Monero. Chat criptografado ponta a ponta. |
| **ru** | kashilo.com Анонимные объявления | Покупайте и продавайте без аккаунта, без email. Оплата Monero. Сквозное шифрование чата. |
### Umsetzung
@@ -244,7 +244,7 @@ und `twitter:title/description` dynamisch bei jedem Sprachwechsel (i18n-Keys `me
## Checkliste vor Alpha-Start
- [ ] Directus: Collection `invite_codes` anlegen (Schema siehe oben)
- [ ] PHP: `invite/validate.php` deployen auf `pow.dgray.io`
- [ ] PHP: `invite/validate.php` deployen auf `pow.kashilo.com`
- [ ] PHP: `config.php``LISTING_FEE` auf 0.01 setzen
- [ ] PHP: `config.php``REQUIRE_INVITE_CODE = true`
- [ ] Frontend: Invite-Code-Feld in `auth-modal.js` einbauen

View File

@@ -1,4 +1,4 @@
# Marketing-Strategie dgray.io
# Marketing-Strategie kashilo.com
## Positionierung
@@ -43,7 +43,7 @@
### Woche 5: Name Reveal
- **Post 7:** Logo + Name + "dgray.io — Anonymous classifieds. Powered by Monero. Beta coming next week."
- **Post 7:** Logo + Name + "kashilo.com — Anonymous classifieds. Powered by Monero. Beta coming next week."
- Landing Page live schalten (optional, kann auch direkt die App sein)
- Einmalig in relevanten Subreddits posten: r/Monero, r/privacy, r/selfhosted
@@ -58,10 +58,10 @@
- **Ziel:** Echte Listings generieren, Feedback sammeln, Bugs finden
**Launch-Post auf X:**
> "dgray.io is live in beta. 🔒 Anonymous classifieds with Monero.
> "kashilo.com is live in beta. 🔒 Anonymous classifieds with Monero.
> First 100 listings for just 0.10 EUR.
> No KYC. No email. No tracking. E2E encrypted chat.
> Try it: https://dgray.io"
> Try it: https://kashilo.com"
### Weitere Launch-Kanäle
@@ -83,7 +83,7 @@
- **Weekly Update** auf X: Neue Features, Stats (wenn Schwellwert erreicht)
- **Build in Public:** Entwicklungsfortschritte teilen
- **User Stories:** Erfolgreiche Deals highlighten (anonym natürlich)
- **Vergleiche:** "Why we built dgray.io" — Vergleich mit KYC-Plattformen
- **Vergleiche:** "Why we built kashilo.com" — Vergleich mit KYC-Plattformen
### Community
@@ -123,7 +123,7 @@
| XmrBazaar | Etabliert, 7800 User | Spam, altbackenes Design, nur EN |
| Bitejo | Dezentral | Wenig Nutzer |
| MoneroMarket | Einfach | Kaum Features |
| **dgray.io** | Modern, lokal, E2E, PWA | Neu, noch keine User |
| **kashilo.com** | Modern, lokal, E2E, PWA | Neu, noch keine User |
---

View File

@@ -1,4 +1,4 @@
# Monetarisierung - dgray.io
# Monetarisierung - kashilo.com
## Preismodell
@@ -50,7 +50,7 @@
- **Provider**: BTCpay Server (self-hosted)
- **URL**: https://pay.xmr.rocks/
- **Proxy**: `pow.dgray.io` — alle API-Aufrufe laufen über den PHP-Proxy (BTCPay API-Key bleibt serverseitig)
- **Proxy**: `pow.kashilo.com` — alle API-Aufrufe laufen über den PHP-Proxy (BTCPay API-Key bleibt serverseitig)
- **Primär**: Monero (XMR)
- **Alternativ**: Andere Kryptos via Trocador-Plugin (automatischer Swap zu XMR)
- **Preisumrechnung**: Live XMR-Kurs via Kraken API
@@ -60,14 +60,14 @@
### Flow: Draft → Processing → Published
1. User erstellt Listing → wird als `draft` mit `payment_status: unpaid` gespeichert
2. BTCPay Invoice wird über `pow.dgray.io/btcpay/invoice` erstellt
2. BTCPay Invoice wird über `pow.kashilo.com/btcpay/invoice` erstellt
3. BTCPay Checkout-Modal öffnet sich im Frontend (`js/services/btcpay.js`)
4. Nach Zahlung:
- **Frontend**: Prüft Status via `pow.dgray.io/btcpay/status` nach Modal-Close
- **Webhook**: `pow.dgray.io/btcpay/webhook` empfängt BTCPay Events, setzt `status: published` + `payment_status: paid` nach 1 Confirmation
- **Frontend**: Prüft Status via `pow.kashilo.com/btcpay/status` nach Modal-Close
- **Webhook**: `pow.kashilo.com/btcpay/webhook` empfängt BTCPay Events, setzt `status: published` + `payment_status: paid` nach 1 Confirmation
5. Listing wird veröffentlicht (30 Tage Laufzeit, `expires_at` wird gesetzt)
### Endpunkte (pow.dgray.io)
### Endpunkte (pow.kashilo.com)
| Endpoint | Methode | Beschreibung |
|----------|---------|-------------|
@@ -81,5 +81,5 @@
- [x] ~~XMR-Kurs API für Umrechnung~~ → Kraken API
- [x] ~~Anzahl Deals für Power-User Status~~ → 5/15/50 Stufen
- [x] ~~Captcha-Lösung~~ → Eigenes PoW-Captcha (keine Lizenzkosten)
- [x] ~~Payment-Proxy~~`pow.dgray.io` (PHP, API-Key serverseitig)
- [x] ~~Webhook für Auto-Publish~~`btcpay-webhook.php` auf `pow.dgray.io`
- [x] ~~Payment-Proxy~~`pow.kashilo.com` (PHP, API-Key serverseitig)
- [x] ~~Webhook für Auto-Publish~~`btcpay-webhook.php` auf `pow.kashilo.com`

View File

@@ -1,13 +1,13 @@
# Datenschutzerklärung
**dgray.io — Anonymer Marktplatz**
**kashilo.com — Anonymer Marktplatz**
Stand: Februar 2026
---
## 1. Verantwortlicher
Verantwortlich für die Datenbearbeitung ist der Betreiber der Plattform dgray.io mit Sitz in der Schweiz.
Verantwortlich für die Datenbearbeitung ist der Betreiber der Plattform kashilo.com mit Sitz in der Schweiz.
---

View File

@@ -1,4 +1,4 @@
# Reputation-System — dgray.io
# Reputation-System — kashilo.com
## Ziel

View File

@@ -1,13 +1,13 @@
# Allgemeine Geschäftsbedingungen (AGB)
**dgray.io — Anonymer Marktplatz**
**kashilo.com — Anonymer Marktplatz**
Stand: Februar 2026
---
## 1. Geltungsbereich
1.1 Diese Allgemeinen Geschäftsbedingungen (nachfolgend «AGB») regeln die Nutzung der Plattform dgray.io (nachfolgend «Plattform»).
1.1 Diese Allgemeinen Geschäftsbedingungen (nachfolgend «AGB») regeln die Nutzung der Plattform kashilo.com (nachfolgend «Plattform»).
1.2 Die Plattform wird betrieben von einer natürlichen Person mit Sitz in der Schweiz (nachfolgend «Betreiber»).

View File

@@ -5,7 +5,7 @@
# This script adds it-IT, es-ES, pt-BR, ru-RU translations to all categories.
# It reads existing categories from the API and creates missing translations.
API="https://api.dgray.io"
API="https://api.kashilo.com"
TOKEN="${DIRECTUS_TOKEN:?Set DIRECTUS_TOKEN environment variable}"
add_translation() {

View File

@@ -1,8 +1,8 @@
#!/bin/bash
# Bulk-Import: All categories for dgray.io
# Bulk-Import: All categories for kashilo.com
# Usage: DIRECTUS_TOKEN=your_admin_token bash docs/import-categories.sh
API="https://api.dgray.io"
API="https://api.kashilo.com"
TOKEN="${DIRECTUS_TOKEN:?Set DIRECTUS_TOKEN environment variable}"
create_category() {

View File

@@ -1,10 +1,10 @@
# PoW Captcha & Payment Server
PHP-basierter Server für dgray.io mit Proof-of-Work Captcha und BTCPay Payment-Proxy.
PHP-basierter Server für kashilo.com mit Proof-of-Work Captcha und BTCPay Payment-Proxy.
## Setup
1. Subdomain `pow.dgray.io` auf den Server zeigen
1. Subdomain `pow.kashilo.com` auf den Server zeigen
2. Dateien in das Web-Root kopieren
3. Secrets setzen:
```bash
@@ -18,10 +18,10 @@ PHP-basierter Server für dgray.io mit Proof-of-Work Captcha und BTCPay Payment-
4. Testen:
```bash
# PoW Challenge
curl https://pow.dgray.io/challenge
curl https://pow.kashilo.com/challenge
# BTCPay Invoice erstellen
curl -X POST https://pow.dgray.io/btcpay/invoice \
curl -X POST https://pow.kashilo.com/btcpay/invoice \
-H "Content-Type: application/json" \
-d '{"listingId": "test-123", "currency": "EUR"}'
```
@@ -76,7 +76,7 @@ Response:
### POST /btcpay/webhook
Empfängt BTCPay Server Webhook-Events. Wird in BTCPay unter Store → Settings → Webhooks konfiguriert.
- **URL**: `https://pow.dgray.io/btcpay/webhook`
- **URL**: `https://pow.kashilo.com/btcpay/webhook`
- **Event**: `InvoiceSettled` (nach 1 Blockchain-Confirmation)
- **Aktion**: Setzt das zugehörige Listing in Directus auf `status: published`, `payment_status: paid`, setzt `paid_at` und `expires_at` (30 Tage)
- **Sicherheit**: Webhook-Secret wird serverseitig geprüft
@@ -95,7 +95,7 @@ Empfängt BTCPay Server Webhook-Events. Wird in BTCPay unter Store → Settings
- HMAC-SHA256 signierte Challenges (nicht fälschbar)
- TTL: 2 Minuten
- CORS: nur `https://dgray.io`
- CORS: nur `https://kashilo.com`
- `hash_equals()` gegen Timing-Attacks
- BTCPay API-Key bleibt serverseitig (nie im Frontend)
- Gebühren serverseitig erzwungen (nicht manipulierbar)

View File

@@ -9,5 +9,5 @@ define('BTCPAY_STORE_ID', getenv('BTCPAY_STORE_ID') ?: 'CHANGE_ME');
define('BTCPAY_WEBHOOK_SECRET', getenv('BTCPAY_WEBHOOK_SECRET') ?: '');
define('LISTING_FEE', ['EUR' => 1, 'USD' => 1, 'CHF' => 1, 'GBP' => 1, 'JPY' => 200]);
define('DIRECTUS_URL', getenv('DIRECTUS_URL') ?: 'https://api.dgray.io');
define('DIRECTUS_URL', getenv('DIRECTUS_URL') ?: 'https://api.kashilo.com');
define('DIRECTUS_TOKEN', getenv('DIRECTUS_TOKEN') ?: 'CHANGE_ME');

View File

@@ -1,12 +1,12 @@
<?php
header('Content-Type: application/json');
$allowedOrigins = ['https://dgray.io', 'http://localhost:5500', 'http://localhost:8080'];
$allowedOrigins = ['https://kashilo.com', 'http://localhost:5500', 'http://localhost:8080'];
$origin = $_SERVER['HTTP_ORIGIN'] ?? '';
if (in_array($origin, $allowedOrigins)) {
header('Access-Control-Allow-Origin: ' . $origin);
} else {
header('Access-Control-Allow-Origin: https://dgray.io');
header('Access-Control-Allow-Origin: https://kashilo.com');
}
header('Access-Control-Allow-Methods: GET, POST, OPTIONS');

View File

@@ -2,14 +2,14 @@
/**
* OG Meta Tag Proxy for Social Media Crawlers
*
* Setup: Nginx/Apache rewrite rule on dgray.io:
* Setup: Nginx/Apache rewrite rule on kashilo.com:
* If User-Agent matches crawler → proxy to this script
* Else → serve static index.html
*
* Example Apache config (in VHost):
* RewriteEngine On
* RewriteCond %{HTTP_USER_AGENT} Twitterbot|facebookexternalhit|TelegramBot|Discordbot|Slackbot|WhatsApp [NC]
* RewriteRule ^/listing/(.*)$ https://pow.dgray.io/og-proxy.php?listing=$1 [P,L]
* RewriteRule ^/listing/(.*)$ https://pow.kashilo.com/og-proxy.php?listing=$1 [P,L]
*
* Required modules: sudo a2enmod rewrite proxy proxy_http
*
@@ -17,7 +17,7 @@
* location /listing/ {
* if ($http_user_agent ~* "Twitterbot|facebookexternalhit|TelegramBot|Discordbot|Slackbot|WhatsApp") {
* rewrite ^/listing/(.*)$ /og-proxy.php?listing=$1 break;
* proxy_pass https://pow.dgray.io;
* proxy_pass https://pow.kashilo.com;
* }
* }
*
@@ -40,8 +40,8 @@ if (!$listingId && isset($_GET['listing'])) {
$listingId = $_GET['listing'];
}
$siteUrl = 'https://dgray.io';
$defaultTitle = 'dgray.io Anonymous Classifieds with Monero';
$siteUrl = 'https://kashilo.com';
$defaultTitle = 'kashilo.com Anonymous Classifieds with Monero';
$defaultDesc = 'Buy and sell anonymously with Monero. No KYC, no email, E2E encrypted chat.';
$defaultImage = $siteUrl . '/assets/press/og-image.png';
@@ -70,7 +70,7 @@ if ($listingId) {
$listing = $data['data'] ?? null;
if ($listing) {
$title = htmlspecialchars($listing['title'] ?? '') . ' dgray.io';
$title = htmlspecialchars($listing['title'] ?? '') . ' kashilo.com';
$description = htmlspecialchars(mb_substr($listing['description'] ?? '', 0, 160));
$url = $siteUrl . '/#/listing/' . $listing['id'];
$type = 'product';
@@ -101,7 +101,7 @@ header('Content-Type: text/html; charset=utf-8');
<!-- Open Graph -->
<meta property="og:type" content="<?= $type ?>">
<meta property="og:site_name" content="dgray.io">
<meta property="og:site_name" content="kashilo.com">
<meta property="og:title" content="<?= $title ?>">
<meta property="og:description" content="<?= $description ?>">
<meta property="og:url" content="<?= $url ?>">