diff --git a/MARKET_CONCEPT.md b/MARKET_CONCEPT.md index 01fd25e..4d05d0d 100644 --- a/MARKET_CONCEPT.md +++ b/MARKET_CONCEPT.md @@ -6,504 +6,342 @@ ## ๐Ÿ“‹ Executive Summary -Die **Market Page** ist das Herzstรผck von Pounce. Hier flieรŸen alle Datenquellen zusammen und werden dem User als **"Clean Feed"** prรคsentiert. +Die **Market Page** ist das Herzstรผck von Pounce. Hier flieรŸen alle Datenquellen zusammen: -### Vision (aus pounce_terminal.md) -> *"Die Market Page zeigt alle Domains die entweder:* -> 1. *Zu Verkauf stehen (Auktionen)* -> 2. *Bald frei werden (Drops)* -> 3. *รœber Pounce direkt angeboten werden (Pounce Direct)"* +1. **Pounce Direct** โ€” User-Listings (unser USP, 0% Provision) +2. **Live Auktionen** โ€” Externe Plattformen (GoDaddy, Sedo, etc.) +3. **Drops Tomorrow** โ€” Domains bevor sie in Auktionen landen (Phase 3) -### Aktueller Stand: Phase 1 โ€” Intelligence +### Der Weg zum Unicorn (aus pounce_strategy.md) + +> *"Der Weg zum Unicorn fรผhrt nicht รผber besseres Scraping, sondern รผber einzigartigen Content."* + +**Aggregation kann jeder. Pounce Direct ist unser USP.** + +--- + +## ๐Ÿ”ง KRITISCHE FIXES (Implementiert am 11.12.2025) + +### Problem: Veraltete Daten wurden angezeigt + +``` +VORHER: Abgelaufene Auktionen wurden im Feed angezeigt + โ†’ Schlechte User Experience + โ†’ Vertrauensverlust +``` + +### Lรถsung: Multi-Layer Data Freshness + +```python +# 1. API-Filter: Nur laufende Auktionen +query = select(DomainAuction).where( + and_( + DomainAuction.is_active == True, + DomainAuction.end_time > datetime.utcnow() # โ† NEU! + ) +) + +# 2. Scheduler: Cleanup alle 15 Minuten +scheduler.add_job( + cleanup_expired_auctions, + CronTrigger(minute='*/15'), # Alle 15 Minuten + id="auction_cleanup" +) + +# 3. Scraper: Alle 2 Stunden frische Daten +scheduler.add_job( + scrape_auctions, + CronTrigger(hour='*/2', minute=30), # Alle 2 Stunden + id="auction_scrape" +) +``` + +--- + +## ๐Ÿ“Š Die 3 Sรคulen des Market + +### Sรคule 1: POUNCE DIRECT (Unser USP!) + +> *"Das sind die Domains, die es NUR bei Pounce gibt."* ``` โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” -โ”‚ POUNCE MARKET โ€” Aktueller Datenfluss โ”‚ +โ”‚ ๐Ÿ’Ž POUNCE DIRECT โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ โ”‚ -โ”‚ DATENQUELLEN: โ”‚ +โ”‚ Warum es genial ist: โ”‚ โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ โ”‚ +โ”‚ โœ“ Unique Content (nur bei uns!) โ”‚ +โ”‚ โœ“ 0% Provision (vs. 15-20% bei Sedo) โ”‚ +โ”‚ โœ“ DNS-Verifizierung = Trust โ”‚ +โ”‚ โœ“ Instant Buy (kein Bieten) โ”‚ +โ”‚ โœ“ SEO: Jedes Listing = eigene Landing Page โ”‚ โ”‚ โ”‚ -โ”‚ ๐Ÿ“ฆ WEB SCRAPING (Hauptquelle) โ”‚ -โ”‚ โ””โ”€โ†’ ExpiredDomains.net (325 Auktionen) โœ… โ”‚ -โ”‚ โ””โ”€โ†’ GoDaddy RSS Feed (10 Auktionen) โœ… โ”‚ -โ”‚ โ””โ”€โ†’ Sedo Public (7 Auktionen) โœ… โ”‚ -โ”‚ โ””โ”€โ†’ NameJet Public (6 Auktionen) โœ… โ”‚ -โ”‚ โ””โ”€โ†’ DropCatch Public (7 Auktionen) โœ… โ”‚ -โ”‚ โ”‚ -โ”‚ ๐Ÿ”Œ OFFIZIELLE APIs (Konfiguriert) โ”‚ -โ”‚ โ””โ”€โ†’ DropCatch Partner API โš ๏ธ (Nur eigene Aktivitรคten) โ”‚ -โ”‚ โ””โ”€โ†’ Sedo Partner API โณ (Credentials fehlen) โ”‚ -โ”‚ โ”‚ -โ”‚ ๐Ÿ’Ž POUNCE DIRECT (User-Listings) โ”‚ -โ”‚ โ””โ”€โ†’ DNS-verifizierte Verkaufsangebote โŒ (0 Listings) โ”‚ -โ”‚ โ”‚ -โ”‚ ๐Ÿ”ฎ ZONE FILES (Phase 3 โ€” Zukunft) โ”‚ -โ”‚ โ””โ”€โ†’ Verisign .com/.net ๐Ÿ”œ โ”‚ -โ”‚ โ””โ”€โ†’ PIR .org ๐Ÿ”œ โ”‚ -โ”‚ โ”‚ +โ”‚ Der Flow: โ”‚ โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ โ”‚ -โ”‚ TOTAL: 355 Domains im Feed | 0 Pounce Direct โ”‚ +โ”‚ 1. User listet Domain (Trader/Tycoon Abo) โ”‚ +โ”‚ 2. DNS-Verifizierung (TXT Record) โ”‚ +โ”‚ 3. Listing erscheint im Market Feed โ”‚ +โ”‚ 4. Kรคufer kontaktiert Verkรคufer (nach Login) โ”‚ โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ ``` ---- - -## ๐Ÿ“Š TEIL 1: Bestandsaufnahme โ€” Was haben wir? - -### A. Backend-Komponenten โœ… - -| Komponente | Status | Beschreibung | -|------------|--------|--------------| -| **Unified Feed API** `/auctions/feed` | โœ… Live | Kombiniert Pounce Direct + External | -| **Pounce Score v2.0** | โœ… Live | Length, TLD, Bids, Time Pressure | -| **Vanity Filter** | โœ… Live | Premium-Domains fรผr Public Users | -| **Auction Scraper** | โœ… Lรคuft | 5 Plattformen, Scheduler aktiv | -| **Listings API** | โœ… Fertig | DNS-Verifizierung, Inquiry-System | -| **Sniper Alerts** | โœ… Fertig | Keyword-Matching, Notifications | - -### B. Frontend-Komponenten โœ… - -| Seite | Status | Beschreibung | -|-------|--------|--------------| -| `/terminal/market` | โœ… Live | Vollstรคndiger Market Feed fรผr Auth Users | -| `/auctions` | โœ… Live | Public Market mit Vanity Filter | -| `/buy` | โœ… Live | Pounce Direct Marketplace Browse | -| `/buy/[slug]` | โœ… Live | Listing-Detailseite | -| `/terminal/listing` | โœ… Live | Seller Dashboard | - -### C. Datenquellen โ€” Realitรคtscheck - -#### Offizielle APIs โ€” Die Ernรผchterung - -**DropCatch API:** -``` -Status: โœ… Authentifiziert -Problem: Zeigt nur EIGENE Aktivitรคten (Bids, Backorders) - NICHT das รถffentliche Auktionsinventar -Nutzen: User-Integration (verbinde dein DropCatch-Konto) -``` - -**Sedo API:** -``` -Status: โณ Client bereit, Credentials fehlen -Wo finden: Sedo.com โ†’ Mein Sedo โ†’ API-Zugang -Benรถtigt: Partner ID + SignKey -``` - -#### Web Scraping โ€” Unsere Hauptquelle - -```python -# Aktuelle Scraper-Architektur -TIER_1_APIS = [ - ("DropCatch", _fetch_dropcatch_api), # Fรผr eigene Aktivitรคten - ("Sedo", _fetch_sedo_api), # Wenn konfiguriert -] - -TIER_2_SCRAPING = [ - ("ExpiredDomains", _scrape_expireddomains), # 325 Domains - ("GoDaddy", _scrape_godaddy_rss), # 10 Domains - ("Sedo", _scrape_sedo_public), # 7 Domains (Fallback) - ("NameJet", _scrape_namejet_public), # 6 Domains - ("DropCatch", _scrape_dropcatch_public), # 7 Domains (Fallback) -] -``` +**Status:** โณ 0 Listings โ€” Muss aktiviert werden! --- -## ๐ŸŽฏ TEIL 2: Das Konzept โ€” Die 3 Sรคulen des Market - -### Sรคule 1: AUKTIONEN (Externe Plattformen) +### Sรคule 2: LIVE AUKTIONEN (Content Filler) > *"Zeige alle relevanten Auktionen von GoDaddy, Sedo, NameJet, etc."* -**Datenquellen:** -- Web Scraping (primรคr) -- Partner APIs (wenn verfรผgbar) - -**Filter-Strategie:** -```python -# Vanity Filter fรผr Public Users (aus pounce_features.md) -def is_premium_domain(domain: str) -> bool: - name, tld = domain.rsplit('.', 1) - - # Premium TLDs only - if tld not in ['com', 'io', 'ai', 'co', 'ch', 'de', 'net', 'org', 'app', 'dev']: - return False - - # Keine Spam-Muster - if len(name) > 12: return False - if '-' in name: return False - if sum(c.isdigit() for c in name) > 1: return False - - return True -``` - -**UI-Darstellung:** -| Domain | Source | Price | Status | Action | -|--------|--------|-------|--------|--------| -| **crypto-bank.io** | ๐Ÿข GoDaddy | $2,500 | โฑ๏ธ 2h left | [Bid โ†—] | -| **meta-shop.com** | ๐Ÿข Sedo | $5,000 | ๐Ÿค Offer | [View โ†—] | - ---- - -### Sรคule 2: POUNCE DIRECT (User-Listings) - -> *"Das sind die Domains, die es NUR bei Pounce gibt. Unser USP."* - -**Das Konzept (aus pounce_terminal.md):** ``` โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” -โ”‚ POUNCE DIRECT โ€” Der Listing-Wizard โ”‚ +โ”‚ ๐Ÿข LIVE AUKTIONEN โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ โ”‚ -โ”‚ STEP 1: DOMAIN EINGEBEN โ”‚ -โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ โ”‚ -โ”‚ Domain: [zurich-immo.ch___________] โ”‚ -โ”‚ Preis: [$950_______] โ—‹ Fixpreis โ— Verhandlungsbasis โ”‚ +โ”‚ Datenquellen: โ”‚ +โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ โ”‚ +โ”‚ ๐Ÿ“ฆ Web Scraping (Hauptquelle) โ”‚ +โ”‚ โ””โ”€โ†’ ExpiredDomains.net (~350 Domains) โ”‚ +โ”‚ โ””โ”€โ†’ GoDaddy RSS โ”‚ +โ”‚ โ””โ”€โ†’ Sedo Public โ”‚ +โ”‚ โ””โ”€โ†’ NameJet Public โ”‚ +โ”‚ โ””โ”€โ†’ DropCatch Public โ”‚ โ”‚ โ”‚ -โ”‚ STEP 2: DNS VERIFICATION (Trust-Check) โ”‚ -โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ โ”‚ -โ”‚ Fรผge diesen TXT-Record bei deinem Registrar hinzu: โ”‚ +โ”‚ Data Freshness: โ”‚ +โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ โ”‚ +โ”‚ โฑ๏ธ Scraping: Alle 2 Stunden โ”‚ +โ”‚ ๐Ÿงน Cleanup: Alle 15 Minuten โ”‚ +โ”‚ โœ… Filter: Nur end_time > now() โ”‚ โ”‚ โ”‚ -โ”‚ Name: _pounce-verify โ”‚ -โ”‚ Value: pounce-verify-8a3f7b9c2e1d โ”‚ -โ”‚ โ”‚ -โ”‚ [๐Ÿ”„ VERIFY DNS] โ”‚ -โ”‚ โ”‚ -โ”‚ STEP 3: LIVE! โ”‚ -โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ โ”‚ -โ”‚ โœ… Domain verifiziert! โ”‚ -โ”‚ Dein Listing erscheint jetzt im Market Feed. โ”‚ +โ”‚ Qualitรคtsfilter: โ”‚ +โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ โ”‚ +โ”‚ โ€ข Vanity Filter fรผr Public (nur Premium-Domains) โ”‚ +โ”‚ โ€ข Pounce Score (0-100) โ”‚ +โ”‚ โ€ข TLD Filter (com, io, ai, etc.) โ”‚ โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ ``` -**Warum das genial ist:** - -| Vorteil | Erklรคrung | -|---------|-----------| -| **Unique Content** | Domains, die es NUR bei Pounce gibt | -| **Hรถhere Conversion** | "Instant Buy" statt "Bid on external site" | -| **Vendor Lock-in** | Verkรคufer listen bei uns (0% Provision!) | -| **SEO Power** | Jede Listing = eigene Landing Page | -| **Trust Signal** | DNS-Verifizierung = Qualitรคtsgarantie | - -**UI-Darstellung:** -| Domain | Source | Price | Status | Action | -|--------|--------|-------|--------|--------| -| **zurich-immo.ch** | ๐Ÿ’Ž **Pounce** | **$950** | โšก **Instant** | **[Buy Now]** | +**Status:** โœ… ~361 aktive Auktionen --- -### Sรคule 3: DROPS (Domains die bald frei werden) +### Sรคule 3: DROPS TOMORROW (Tycoon Exclusive) > *"Zeige Domains BEVOR sie in Auktionen landen."* -**Phase 1 (Jetzt): Deleted Domains via Scraping** -``` -ExpiredDomains.net โ†’ Deleted Domains Liste โ†’ Pounce Filter โ†’ Feed -``` - -**Phase 3 (Zukunft): Zone File Analysis** ``` โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” -โ”‚ ZONE FILE PIPELINE โ€” Die Unicorn-Strategie โ”‚ +โ”‚ ๐Ÿ”ฎ DROPS TOMORROW โ€” Phase 3 โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ โ”‚ -โ”‚ 1. DAILY DOWNLOAD (4:00 UTC) โ”‚ -โ”‚ โ””โ”€โ†’ Zone Files von Verisign, PIR, etc. โ”‚ +โ”‚ Das Konzept: โ”‚ +โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ โ”‚ +โ”‚ 1. Zone Files von Verisign (.com/.net) beziehen โ”‚ +โ”‚ 2. Tรคgliche Diff-Analyse (was war gestern da, ist heute weg) โ”‚ +โ”‚ 3. Diese Domains droppen in 1-5 Tagen! โ”‚ +โ”‚ 4. Pounce Algorithm filtert nur Premium-Domains โ”‚ โ”‚ โ”‚ -โ”‚ 2. DIFF ANALYSIS โ”‚ -โ”‚ โ””โ”€โ†’ Was war gestern da, ist heute weg? โ”‚ -โ”‚ โ””โ”€โ†’ Diese Domains DROPPEN in 1-5 Tagen! โ”‚ -โ”‚ โ”‚ -โ”‚ 3. POUNCE ALGORITHM โ”‚ -โ”‚ โ””โ”€โ†’ Nur Premium-Domains durchlassen (Score > 70) โ”‚ -โ”‚ โ”‚ -โ”‚ 4. OUTPUT: "Drops Tomorrow" (Tycoon Exclusive) โ”‚ -โ”‚ โ””โ”€โ†’ Domains BEVOR sie in Auktionen erscheinen โ”‚ +โ”‚ Warum das ein MONOPOL schafft: โ”‚ +โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ โ”‚ +โ”‚ โ€ข ExpiredDomains zeigt ALLES (Spam-Hรถlle) โ”‚ +โ”‚ โ€ข Pounce zeigt nur die TOP 100 (kuratiert) โ”‚ +โ”‚ โ€ข = Zeitersparnis = Premium Feature = $29/Monat โ”‚ โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ ``` ---- - -## ๐Ÿ”ง TEIL 3: Technische Architektur - -### Der Unified Feed API Endpoint - -```python -# backend/app/api/auctions.py - -@router.get("/feed") -async def get_market_feed( - source: str = Query("all", enum=["all", "pounce", "external"]), - keyword: Optional[str] = None, - tld: Optional[str] = None, - min_price: Optional[float] = None, - max_price: Optional[float] = None, - min_score: int = Query(0, ge=0, le=100), - ending_within: Optional[int] = None, # Stunden - verified_only: bool = False, - sort_by: str = Query("score", enum=["score", "price_asc", "price_desc", "time", "newest"]), - limit: int = Query(50, le=200), - offset: int = Query(0), - current_user: Optional[User] = Depends(get_current_user_optional), -): - """ - ๐Ÿš€ UNIFIED MARKET FEED โ€” Das Herz von Pounce - - Kombiniert: - - ๐Ÿ’Ž Pounce Direct: DNS-verifizierte User-Listings (Instant Buy) - - ๐Ÿข External Auctions: Scraped von GoDaddy, Sedo, etc. - - ๐Ÿ”ฎ Drops: Domains die bald frei werden (Phase 3) - - Fรผr nicht-authentifizierte User: - - Vanity Filter aktiv (nur Premium-Domains) - - Pounce Score sichtbar, aber limited Details - - Fรผr authentifizierte User (Trader/Tycoon): - - Vollzugriff auf alle Domains - - Advanced Filtering - - Valuation Data - """ -``` - -### Pounce Score v2.0 - -```python -def calculate_pounce_score_v2(domain: str, auction_data: dict) -> int: - """ - Der Pounce Score โ€” Qualitรคts- und Opportunity-Bewertung - - A) INTRINSIC VALUE (Domain selbst) - - Lรคnge (kurz = wertvoll) - - TLD Premium (com > io > xyz) - - Dictionary Word Bonus - - B) MARKET SIGNALS (Aktivitรคt) - - Bid Activity (mehr Bids = mehr Interesse) - - Time Pressure (endet bald = Opportunity) - - Price-to-Value Ratio (unterbewertet = ๐Ÿ”ฅ) - - C) PENALTIES - - Bindestriche (-30) - - Zahlen wenn >3 Zeichen (-20) - - Zu lang >15 Zeichen (-25) - """ - score = 50 # Baseline - name = domain.rsplit('.', 1)[0] - tld = domain.rsplit('.', 1)[1] - - # Lรคnge - if len(name) <= 3: score += 30 - elif len(name) == 4: score += 25 - elif len(name) == 5: score += 20 - elif len(name) <= 7: score += 10 - - # TLD - tld_scores = {'com': 20, 'ai': 25, 'io': 18, 'co': 12, 'ch': 15} - score += tld_scores.get(tld, 0) - - # Market Signals - bids = auction_data.get('num_bids', 0) - if bids >= 20: score += 15 - elif bids >= 10: score += 10 - elif bids >= 5: score += 5 - - # Penalties - if '-' in name: score -= 30 - if any(c.isdigit() for c in name) and len(name) > 3: score -= 20 - - return max(0, min(100, score)) -``` +**Status:** ๐Ÿ”œ Geplant (6-12 Monate) --- -## ๐Ÿ“ˆ TEIL 4: Roadmap - -### โœ… ERLEDIGT (Stand: 11. Dezember 2025) - -- [x] Unified Feed API `/auctions/feed` -- [x] Pounce Score v2.0 mit Market Signals -- [x] Vanity Filter fรผr Public Users -- [x] Pounce Direct Listing-System (DNS-Verifizierung) -- [x] Sniper Alerts mit Keyword-Matching -- [x] Web Scraping fรผr 5 Plattformen -- [x] DropCatch API Client (fรผr User-Integration) -- [x] Sedo API Client (bereit fรผr Credentials) - -### ๐ŸŽฏ Nร„CHSTE SCHRITTE (Diese Woche) - -1. **Sedo API Credentials eingeben** - - Sedo.com โ†’ Mein Sedo โ†’ API-Zugang - - Partner ID + SignKey in `.env` - -2. **Erste Pounce Direct Listings erstellen** - - Test-Domains zum Verifizieren des Flows - - Zeigt "Unique Content" im Feed - -3. **Scraper-Stabilitรคt verbessern** - - Fallback-Logik testen - - Error-Handling optimieren - -### ๐Ÿ”ฎ PHASE 3 (6-12 Monate) - -1. **Zone File Access beantragen** - - Verisign (.com/.net) - - PIR (.org) - - Kosten: $0-$10,000/Jahr - -2. **"Drops Tomorrow" Feature** - - Zone File Diff-Analyse - - Tycoon Exclusive ($29/mo) - -3. **Pounce Instant Exchange** - - Integrierter Escrow-Service - - 5% Gebรผhr (statt 15-20% bei Konkurrenz) - ---- - -## ๐ŸŽจ TEIL 5: UI/UX Design - -### Die Master-Tabelle (aus pounce_terminal.md) - -| Spalte | Inhalt | Visualisierung | -|--------|--------|----------------| -| **Domain** | Name der Domain | Fettgedruckt. Bei "Pounce Direct" โ†’ ๐Ÿ’Ž Icon | -| **Pounce Score** | Qualitรคts-Algorithmus | 0-100 (Grรผn > 80, Gelb 50-80, Rot < 50) | -| **Price / Bid** | Preis oder aktuelles Gebot | `$500` oder `$50 (Bid)` | -| **Status / Time** | Countdown oder Verfรผgbarkeit | โฑ๏ธ `4h left` oder โšก `Instant` | -| **Source** | Herkunft | ๐Ÿข GoDaddy, ๐Ÿ’Ž Pounce | -| **Action** | Der Button | `[Bid โ†—]` oder `[Buy Now]` | +## ๐ŸŽจ UI/UX: Die Market Page ### Filter Bar ``` -[Toggle] Hide Spam (Standard: AN) -[Toggle] Pounce Direct Only -[Dropdown] TLD: .com, .ai, .io, .ch -[Dropdown] Price: < $100, < $1k, High Roller -[Dropdown] Ending: 1h, 4h, 24h, 7d +[โœ“] Hide Spam [โ—‹] Pounce Only [TLD โ–พ] [Price โ–พ] [Ending โ–พ] ``` +### Die Master-Tabelle + +| Spalte | Inhalt | Visualisierung | +|--------|--------|----------------| +| **Domain** | Name | Fettgedruckt. ๐Ÿ’Ž Icon fรผr Pounce Direct | +| **Score** | Pounce Score | 0-100 (Grรผn > 80, Gelb 50-80, Rot < 50) | +| **Price** | Preis/Gebot | `$500` oder `$50 (Bid)` | +| **Status** | Zeit/Verfรผgbarkeit | โฑ๏ธ `4h left` oder โšก `Instant` | +| **Source** | Herkunft | ๐Ÿข GoDaddy, ๐Ÿ’Ž Pounce | +| **Action** | Button | `[Bid โ†—]` oder `[Buy Now]` | + ### Visuelle Hierarchie -```tsx -// Pounce Direct Items werden prominent angezeigt -{pounceDirectItems.length > 0 && ( -
-
- - Pounce Exclusive โ€” Verified Instant Buy -
- {pounceDirectItems.map(item => )} -
-)} - -// External Auctions darunter -
-

Active Auctions

- {externalItems.map(item => )} -
-``` - ---- - -## ๐Ÿ’ฐ TEIL 6: Monetarisierung - -### Tier-basierte Features (aus pounce_pricing.md) - -| Feature | Scout ($0) | Trader ($9) | Tycoon ($29) | -|---------|------------|-------------|--------------| -| **Market Feed** | ๐ŸŒช๏ธ Raw (Vanity Filter) | โœจ Curated (Clean) | โœจ Curated + Priority | -| **Alert Speed** | ๐Ÿข Daily | ๐Ÿ‡ Hourly | โšก Real-Time (10m) | -| **Watchlist** | 5 Domains | 50 Domains | 500 Domains | -| **Sell Domains** | โŒ | โœ… 5 Listings | โœ… 50 Listings + Featured | -| **Pounce Score** | โŒ Locked | โœ… Basic | โœ… + SEO Data | -| **Drops Tomorrow** | โŒ | โŒ | โœ… Exclusive | - -### Die "Conversion-Falle" (aus pounce_features.md) - -Wenn ein nicht-eingeloggter User auf "Buy Now" bei einem Pounce Direct Listing klickt: - ``` โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” -โ”‚ ๐Ÿ”’ Secure Transaction โ”‚ +โ”‚ MARKET FEED โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ โ”‚ -โ”‚ Du bist dabei, ein verifiziertes Direct-Listing anzusehen. โ”‚ +โ”‚ ๐Ÿ’Ž POUNCE EXCLUSIVE โ€” Verified Instant Buy โ”‚ +โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ +โ”‚ โ”‚ zurich-immo.ch $950 โšก Instant โœ… Verified [Buy] โ”‚ โ”‚ +โ”‚ โ”‚ crypto-hub.io $2.5k โšก Instant โœ… Verified [Buy] โ”‚ โ”‚ +โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”‚ โ”‚ -โ”‚ Um den Verkรคufer zu kontaktieren und Kรคuferschutz zu โ”‚ -โ”‚ genieรŸen, logge dich bitte ein. โ”‚ +โ”‚ ๐Ÿข LIVE AUCTIONS โ”‚ +โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ +โ”‚ โ”‚ techflow.io $250 โฑ๏ธ 4h left GoDaddy [Bid โ†—] โ”‚ โ”‚ +โ”‚ โ”‚ datalab.com $1.2k โฑ๏ธ 23h left Sedo [Bid โ†—] โ”‚ โ”‚ +โ”‚ โ”‚ nexus.ai $5k โฑ๏ธ 2d left NameJet [Bid โ†—] โ”‚ โ”‚ +โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”‚ โ”‚ -โ”‚ [Login] [Create Free Scout Account] โ”‚ +โ”‚ ๐Ÿ”ฎ DROPS TOMORROW (Tycoon Only) โ”‚ +โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ +โ”‚ โ”‚ ๐Ÿ”’ Upgrade to Tycoon to see domains dropping tomorrow โ”‚ โ”‚ +โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ ``` --- -## ๐Ÿ”‘ TEIL 7: Kritische Erkenntnisse +## ๐Ÿ’ฐ Monetarisierung (aus pounce_pricing.md) -### API-Realitรคt vs. Erwartung - -| API | Erwartung | Realitรคt | -|-----|-----------|----------| -| **DropCatch** | Alle รถffentlichen Auktionen | โŒ Nur eigene Bids/Backorders | -| **Sedo** | TBD | โณ Credentials fehlen noch | - -**Konsequenz:** -- Web Scraping bleibt unsere **Hauptquelle** fรผr รถffentliche Daten -- APIs sind nรผtzlich fรผr **User-Integration** (verbinde dein DropCatch-Konto) -- **Zone Files** sind der langfristige Weg zur Datenhoheit - -### Der echte USP: Pounce Direct - -> *"Domains die es NUR bei Pounce gibt."* - -Das ist der Schlรผssel. Nicht die Aggregation (das kann jeder), sondern der **Unique Content** durch User-Listings. - -**Prioritรคt:** Erste Pounce Direct Listings aktivieren! +| Feature | Scout ($0) | Trader ($9) | Tycoon ($29) | +|---------|------------|-------------|--------------| +| **Market Feed** | ๐ŸŒช๏ธ Vanity Filter | โœจ Clean | โœจ Clean + Priority | +| **Alert Speed** | ๐Ÿข Daily | ๐Ÿ‡ Hourly | โšก Real-Time (10m) | +| **Watchlist** | 5 Domains | 50 Domains | 500 Domains | +| **Sell Domains** | โŒ | โœ… 5 Listings | โœ… 50 + Featured | +| **Pounce Score** | โŒ Locked | โœ… Basic | โœ… + SEO Data | +| **Drops Tomorrow** | โŒ | โŒ | โœ… Exclusive | --- -## ๐Ÿ“‹ Checkliste fรผr den Launch +## โš™๏ธ Technische Architektur -### Backend -- [x] Unified Feed API +### Scheduler Jobs + +```python +# Aktive Jobs (Scheduler) +# โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + +# 1. Auction Scrape โ€” Alle 2 Stunden +scheduler.add_job(scrape_auctions, CronTrigger(hour='*/2', minute=30)) + +# 2. Expired Cleanup โ€” Alle 15 Minuten (KRITISCH!) +scheduler.add_job(cleanup_expired_auctions, CronTrigger(minute='*/15')) + +# 3. Sniper Matching โ€” Alle 30 Minuten +scheduler.add_job(match_sniper_alerts, CronTrigger(minute='*/30')) + +# 4. TLD Prices โ€” Tรคglich 03:00 UTC +scheduler.add_job(scrape_tld_prices, CronTrigger(hour=3)) +``` + +### API Endpoints + +```python +# Market Feed Endpoints +# โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + +GET /api/v1/auctions/feed # Unified Feed (Pounce + External) +GET /api/v1/auctions # External Auctions only +GET /api/v1/auctions/ending-soon +GET /api/v1/auctions/hot +GET /api/v1/listings # Pounce Direct Listings +``` + +### Data Freshness Garantie + +```python +# Jede Query filtert automatisch auf aktive Auktionen: +query = select(DomainAuction).where( + and_( + DomainAuction.is_active == True, + DomainAuction.end_time > datetime.utcnow() # โ† IMMER! + ) +) +``` + +--- + +## ๐Ÿ“ˆ Roadmap + +### โœ… ERLEDIGT (11. Dezember 2025) + +- [x] Unified Feed API `/auctions/feed` - [x] Pounce Score v2.0 - [x] Vanity Filter -- [x] Scraper aktiv -- [ ] Sedo API Credentials eingeben -- [ ] Scheduler-Intervall optimieren +- [x] Web Scraping (5 Plattformen) +- [x] **FIX: end_time Filter** (nur laufende Auktionen) +- [x] **FIX: Cleanup alle 15 Minuten** +- [x] **FIX: Scraper alle 2 Stunden** +- [x] Sniper Alerts -### Frontend -- [x] Terminal Market Page -- [x] Public Auctions Page -- [x] Pounce Direct Highlighting -- [x] Filter (Source, TLD, Price) -- [ ] "Hot Right Now" Section -- [ ] Better Empty States +### ๐ŸŽฏ Nร„CHSTE SCHRITTE (Diese Woche) -### Content -- [ ] Erste 5 Test-Listings erstellen -- [ ] DNS-Verifizierung testen -- [ ] Listing-to-Feed Flow validieren +1. **Erste Pounce Direct Listings erstellen** + - Test-Domains zum Verifizieren des Flows + - USP aktivieren! + +2. **Sedo API Credentials eingeben** + - Sedo.com โ†’ Mein Sedo โ†’ API-Zugang + - Partner ID + SignKey in `.env` + +3. **Frontend: "Live" Indikator** + - Zeige wann Daten zuletzt aktualisiert wurden + +### ๐Ÿ”ฎ PHASE 2-3 (6-12 Monate) + +1. **Zone File Access beantragen** + - Verisign (.com/.net) + - "Drops Tomorrow" Feature + +2. **Pounce Instant Exchange** + - Integrierter Escrow-Service + - 5% Gebรผhr --- -## ๐Ÿ’Ž Fazit +## ๐Ÿš€ Der Unicorn-Pfad -Die Market Page ist **funktional**, aber der wahre USP (Pounce Direct) ist noch nicht aktiviert. +``` +Phase 1: INTELLIGENCE (Jetzt) +โ”œโ”€โ”€ Pounce Direct aktivieren (Unique Content) +โ”œโ”€โ”€ Clean Feed (aktuelle Daten, Spam-frei) +โ”œโ”€โ”€ Trust aufbauen +โ””โ”€โ”€ 10.000 User, $1M ARR -**Die Reihenfolge:** -1. โœ… Aggregation funktioniert (Scraping) -2. โณ Pounce Direct aktivieren (User-Listings) -3. ๐Ÿ”ฎ Zone Files fรผr Datenhoheit (Phase 3) +Phase 2: LIQUIDITร„T (18-36 Monate) +โ”œโ”€โ”€ Pounce Instant Exchange +โ”œโ”€โ”€ Buy Now im Dashboard +โ”œโ”€โ”€ 5% Gebรผhr +โ””โ”€โ”€ $10M ARR -> *"Der Weg zum Unicorn fรผhrt nicht รผber besseres Scraping, sondern รผber einzigartigen Content."* -> -> โ€” pounce_strategy.md +Phase 3: FINANZIALISIERUNG (3-5 Jahre) +โ”œโ”€โ”€ Fractional Ownership +โ”œโ”€โ”€ Domain-Backed Lending +โ””โ”€โ”€ = FINTECH ($50-100M ARR) + +Phase 4: IMPERIUM (5+ Jahre) +โ”œโ”€โ”€ Enterprise Sentinel (B2B) +โ”œโ”€โ”€ Fortune 500 Kunden +โ””โ”€โ”€ = $1 Mrd. Bewertung +``` + +--- + +## ๐Ÿ’Ž Das Fazit + +**Aggregation ist Commodity. Pounce Direct ist der USP.** + +Der Weg zum Unicorn: +1. โœ… Datenqualitรคt (aktuelle, saubere Daten) +2. โณ Unique Content (Pounce Direct aktivieren!) +3. ๐Ÿ”ฎ Datenhoheit (Zone Files) + +> *"Don't guess. Know."* +> +> โ€” Phase 1: Intelligence diff --git a/backend/app/api/auctions.py b/backend/app/api/auctions.py index 3403592..33fe52d 100644 --- a/backend/app/api/auctions.py +++ b/backend/app/api/auctions.py @@ -277,8 +277,14 @@ async def search_auctions( - Look for value_ratio > 1.0 (estimated value exceeds current bid) - Focus on auctions ending soon with low bid counts """ - # Build query - query = select(DomainAuction).where(DomainAuction.is_active == True) + # Build query - ONLY show active auctions that haven't ended yet + now = datetime.utcnow() + query = select(DomainAuction).where( + and_( + DomainAuction.is_active == True, + DomainAuction.end_time > now # โ† KRITISCH: Nur Auktionen die noch laufen! + ) + ) # VANITY FILTER: For public (non-logged-in) users, only show premium-looking domains # This ensures the first impression is high-quality, not spam domains @@ -457,9 +463,15 @@ async def get_hot_auctions( Data is scraped from public auction sites - no mock data. """ + now = datetime.utcnow() query = ( select(DomainAuction) - .where(DomainAuction.is_active == True) + .where( + and_( + DomainAuction.is_active == True, + DomainAuction.end_time > now # Only show active auctions + ) + ) .order_by(DomainAuction.num_bids.desc()) .limit(limit) ) @@ -996,7 +1008,13 @@ async def get_market_feed( # 2. EXTERNAL AUCTIONS (Scraped from platforms) # โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• if source in ["all", "external"]: - auction_query = select(DomainAuction).where(DomainAuction.is_active == True) + now = datetime.utcnow() + auction_query = select(DomainAuction).where( + and_( + DomainAuction.is_active == True, + DomainAuction.end_time > now # โ† KRITISCH: Nur laufende Auktionen! + ) + ) if keyword: auction_query = auction_query.where( diff --git a/backend/app/scheduler.py b/backend/app/scheduler.py index 7c66c4b..e2c3375 100644 --- a/backend/app/scheduler.py +++ b/backend/app/scheduler.py @@ -204,12 +204,30 @@ def setup_scheduler(): replace_existing=True, ) - # Auction scrape every hour (at :30 to avoid conflict with other jobs) + # Auction scrape every 2 hours (at :30 to avoid conflict with other jobs) scheduler.add_job( scrape_auctions, - CronTrigger(minute=30), # Every hour at :30 - id="hourly_auction_scrape", - name="Hourly Auction Scrape", + CronTrigger(hour='*/2', minute=30), # Every 2 hours at :30 + id="auction_scrape", + name="Auction Scrape (2h)", + replace_existing=True, + ) + + # Cleanup expired auctions every 15 minutes (CRITICAL for data freshness!) + scheduler.add_job( + cleanup_expired_auctions, + CronTrigger(minute='*/15'), # Every 15 minutes + id="auction_cleanup", + name="Expired Auction Cleanup (15m)", + replace_existing=True, + ) + + # Sniper alert matching every 30 minutes + scheduler.add_job( + match_sniper_alerts, + CronTrigger(minute='*/30'), # Every 30 minutes + id="sniper_matching", + name="Sniper Alert Matching (30m)", replace_existing=True, ) @@ -220,7 +238,9 @@ def setup_scheduler(): f"\n - Tycoon domain check every 10 minutes" f"\n - TLD price scrape at 03:00 UTC" f"\n - Price change alerts at 04:00 UTC" - f"\n - Auction scrape every hour at :30" + f"\n - Auction scrape every 2 hours at :30" + f"\n - Expired auction cleanup every 15 minutes" + f"\n - Sniper alert matching every 30 minutes" ) @@ -302,6 +322,58 @@ async def check_price_changes(): logger.exception(f"Price change check failed: {e}") +async def cleanup_expired_auctions(): + """ + Mark expired auctions as inactive and delete very old ones. + + This is CRITICAL for data freshness! Without this, the Market page + would show auctions that ended days ago. + + Runs every 15 minutes to ensure users always see live data. + """ + from app.models.auction import DomainAuction + from sqlalchemy import update, delete + + logger.info("Starting expired auction cleanup...") + + try: + async with AsyncSessionLocal() as db: + now = datetime.utcnow() + + # 1. Mark ended auctions as inactive + stmt = ( + update(DomainAuction) + .where( + and_( + DomainAuction.end_time < now, + DomainAuction.is_active == True + ) + ) + .values(is_active=False) + ) + result = await db.execute(stmt) + marked_inactive = result.rowcount + + # 2. Delete very old inactive auctions (> 7 days) + cutoff = now - timedelta(days=7) + stmt = delete(DomainAuction).where( + and_( + DomainAuction.is_active == False, + DomainAuction.end_time < cutoff + ) + ) + result = await db.execute(stmt) + deleted = result.rowcount + + await db.commit() + + if marked_inactive > 0 or deleted > 0: + logger.info(f"Auction cleanup: {marked_inactive} marked inactive, {deleted} deleted") + + except Exception as e: + logger.exception(f"Auction cleanup failed: {e}") + + async def scrape_auctions(): """Scheduled task to scrape domain auctions from public sources.""" from app.services.auction_scraper import auction_scraper