🚀 MARKET CONCEPT IMPLEMENTATION
Backend:
- Added /auctions/feed unified endpoint combining Pounce Direct + external auctions
- Implemented Pounce Score v2.0 with market signals (length, TLD, bids, age)
- Added vanity filter for premium domains (non-auth users)
- Integrated DomainListing model for Pounce Direct
Frontend:
- Refactored terminal/market page with Pounce Direct hierarchy
- Updated public auctions page with Pounce Exclusive section
- Added api.getMarketFeed() to API client
- Converted /market to redirect to /auctions
Documentation:
- Created MARKET_CONCEPT.md with full unicorn roadmap
- Created ZONE_FILE_ACCESS.md with Verisign access guide
- Updated todos and progress tracking
Cleanup:
- Deleted empty legacy folders (dashboard, portfolio, settings, watchlist, careers)
64 KiB
🎯 POUNCE MARKET — Das Konzept für die Unicorn-Journey
📦 TEIL 1: BESTANDSAUFNAHME — Was haben wir?
Übersicht: Code-Inventar
✅ BEHALTEN — Funktioniert gut, Vision-konform
| Komponente | Pfad | Status | Beschreibung |
|---|---|---|---|
| Listings API | backend/app/api/listings.py |
✅ Vollständig | Pounce Direct Marketplace mit DNS-Verifizierung |
| Listing Model | backend/app/models/listing.py |
✅ Vollständig | DomainListing, ListingInquiry, ListingView |
| My Listings Page | frontend/src/app/terminal/listing/page.tsx |
✅ Vollständig | Seller Dashboard mit Verification Wizard |
| Public Marketplace | frontend/src/app/buy/page.tsx |
✅ Vollständig | Öffentliche Browse-Seite für Listings |
| Listing Detail | frontend/src/app/buy/[slug]/page.tsx |
✅ Vollständig | Öffentliche Landing Page pro Listing |
| Sniper Alerts API | backend/app/api/sniper_alerts.py |
✅ Vollständig | Alert-Matching für Auktionen |
| Sniper Alert Model | backend/app/models/sniper_alert.py |
✅ Vollständig | SniperAlert, SniperAlertMatch |
| Scheduler | backend/app/scheduler.py |
✅ Vollständig | APScheduler mit Scraping, Alerts, Checks |
| Valuation Service | backend/app/services/valuation.py |
✅ Vollständig | Pounce Score Berechnung |
| TLD Prices API | backend/app/api/tld_prices.py |
✅ Vollständig | Intel/Pricing Feature |
| TLD Scraper | backend/app/services/tld_scraper/ |
✅ Funktioniert | Porkbun + Aggregator |
| Portfolio API | backend/app/api/portfolio.py |
✅ Vollständig | Eigene Domains verwalten |
| Domain Health | backend/app/services/domain_health.py |
✅ Vollständig | 4-Layer Monitoring |
| SEO Analyzer | backend/app/services/seo_analyzer.py |
✅ Vollständig | Moz API Integration |
| Email Service | backend/app/services/email_service.py |
✅ Vollständig | Notifications |
| Stripe Service | backend/app/services/stripe_service.py |
✅ Vollständig | Subscriptions |
⚠️ ÜBERARBEITEN — Funktioniert, aber Optimierung nötig
| Komponente | Pfad | Problem | Lösung |
|---|---|---|---|
| Auction Scraper | backend/app/services/auction_scraper.py |
Scraping ist fragil, oft leer | API-First + Fallback-Logik |
| Auctions API | backend/app/api/auctions.py |
Keine Pounce Direct Integration | Unified Feed erstellen |
| Market Page | frontend/src/app/terminal/market/page.tsx |
Zeigt nur externe Auktionen | Pounce Direct integrieren |
| Pounce Score | In market/page.tsx |
Zu simpel (nur Length+TLD) | Erweitern um Markt-Signale |
| Public Auctions | frontend/src/app/auctions/page.tsx |
Kein Pounce Direct Highlight | Visuelle Hierarchie |
❌ ENTFERNEN / KONSOLIDIEREN — Redundant oder veraltet
| Komponente | Pfad | Grund | Aktion |
|---|---|---|---|
| Leere Ordner | frontend/src/app/dashboard/ |
Leer (Legacy von /command) | Löschen |
| Leere Ordner | frontend/src/app/portfolio/ |
Leer (Legacy) | Löschen |
| Leere Ordner | frontend/src/app/settings/ |
Leer (Legacy) | Löschen |
| Leere Ordner | frontend/src/app/watchlist/ |
Leer (Legacy) | Löschen |
| Leere Ordner | frontend/src/app/careers/ |
Kein Inhalt | Löschen oder TODO |
| Intelligence Redirect | frontend/src/app/intelligence/page.tsx |
Redirect zu /tld-pricing | Prüfen ob noch nötig |
| Market Public | frontend/src/app/market/page.tsx |
Duplikat? Prüfen | Ggf. konsolidieren mit /auctions |
Detaillierte Analyse pro Bereich
1. BACKEND: API Routes (backend/app/api/)
backend/app/api/
├── __init__.py ✅ Router-Registration
├── admin.py ✅ Admin Panel APIs
├── auctions.py ⚠️ Überarbeiten (Unified Feed)
├── auth.py ✅ Login/Register/JWT
├── blog.py ✅ Blog Feature
├── check.py ✅ Domain Availability Check
├── contact.py ✅ Kontaktformular
├── deps.py ✅ Dependencies
├── domains.py ✅ Watchlist
├── listings.py ✅ Pounce Direct Marketplace
├── oauth.py ✅ Google/GitHub OAuth
├── portfolio.py ✅ Portfolio Management
├── price_alerts.py ✅ TLD Price Alerts
├── seo.py ✅ SEO Juice (Tycoon)
├── sniper_alerts.py ✅ Auction Sniper Alerts
├── subscription.py ✅ Stripe Integration
├── tld_prices.py ✅ TLD Pricing Data
└── webhooks.py ✅ Stripe Webhooks
Aktion:
auctions.py: Unified Feed Endpoint hinzufügen der Pounce Direct + External kombiniert
2. BACKEND: Services (backend/app/services/)
backend/app/services/
├── auction_scraper.py ⚠️ Fallback-Logik verbessern
├── auth.py ✅ Behalten
├── domain_checker.py ✅ Behalten
├── domain_health.py ✅ Behalten
├── email_service.py ✅ Behalten
├── price_tracker.py ✅ Behalten
├── seo_analyzer.py ✅ Behalten
├── stripe_service.py ✅ Behalten
├── valuation.py ⚠️ Pounce Score v2.0 integrieren
└── tld_scraper/
├── aggregator.py ✅ Behalten
├── base.py ✅ Behalten
├── porkbun.py ✅ Behalten
└── tld_list.py ✅ Behalten
Aktionen:
auction_scraper.py: Methodescrape_with_fallback()hinzufügenvaluation.py: Pounce Score v2.0 mit Market Signals
3. BACKEND: Models (backend/app/models/)
backend/app/models/
├── admin_log.py ✅ Behalten
├── auction.py ✅ DomainAuction, AuctionScrapeLog
├── blog.py ✅ Behalten
├── domain.py ✅ Domain, DomainCheck
├── listing.py ✅ DomainListing, ListingInquiry, ListingView
├── newsletter.py ✅ Behalten
├── portfolio.py ✅ PortfolioDomain
├── price_alert.py ✅ TLDPriceAlert
├── seo_data.py ✅ DomainSEOData
├── sniper_alert.py ✅ SniperAlert, SniperAlertMatch
├── subscription.py ✅ Subscription, tier config
├── tld_price.py ✅ TLDPrice, TLDInfo
└── user.py ✅ User
Status: Alle Models sind sauber und Vision-konform. Keine Änderungen nötig.
4. FRONTEND: Terminal (Authenticated) (frontend/src/app/terminal/)
frontend/src/app/terminal/
├── page.tsx ✅ Redirect zu /radar
├── radar/page.tsx ✅ Dashboard
├── market/page.tsx ⚠️ Pounce Direct integrieren!
├── intel/page.tsx ✅ TLD Overview
├── intel/[tld]/page.tsx ✅ TLD Detail
├── watchlist/page.tsx ✅ Domain Monitoring
├── listing/page.tsx ✅ My Listings (Seller Dashboard)
├── settings/page.tsx ✅ User Settings
└── welcome/page.tsx ✅ Onboarding
Aktionen:
market/page.tsx: Pounce Direct Listings im Feed anzeigenmarket/page.tsx: Visuelle Hierarchie (💎 Pounce vs 🏢 External)
5. FRONTEND: Public Pages (frontend/src/app/)
frontend/src/app/
├── page.tsx ✅ Landing Page
├── auctions/page.tsx ⚠️ Pounce Direct hervorheben
├── buy/page.tsx ✅ Marketplace Browse
├── buy/[slug]/page.tsx ✅ Listing Detail
├── tld-pricing/ ✅ TLD Intel Public
├── pricing/page.tsx ✅ Subscription Tiers
├── blog/ ✅ Blog
├── login/page.tsx ✅ Auth
├── register/page.tsx ✅ Auth
└── ... ✅ Legal, Contact, etc.
Aktionen:
auctions/page.tsx: "💎 Pounce Direct" Listings prominent anzeigen- Konsolidieren:
/market/mit/auctions/zusammenführen?
6. FRONTEND: API Client (frontend/src/lib/api.ts)
Status: ✅ Vollständig
Enthält alle nötigen Methoden:
getAuctions()- Externe AuktionengetMarketplaceListings()- TODO: Backend anbinden (aktuell leere Liste)
Aktion:
getMarketplaceListings()→ Backend Endpoint/listingsanbinden
Zusammenfassung: Cleanup-Liste
Sofort löschen (leere Ordner):
rm -rf frontend/src/app/dashboard/
rm -rf frontend/src/app/portfolio/
rm -rf frontend/src/app/settings/
rm -rf frontend/src/app/watchlist/
rm -rf frontend/src/app/careers/
Konsolidieren:
/market/page.tsxund/auctions/page.tsx→ Eine Seite für Public Market/intelligence/page.tsxprüfen ob Redirect noch nötig
Code-Änderungen:
- Market Page (Terminal): Pounce Direct + External in einem Feed
- Auctions Page (Public): Pounce Direct prominent
- API Client:
getMarketplaceListings()Backend anbinden - Auctions API: Unified Feed Endpoint
- Pounce Score: v2.0 mit Market Signals
📊 TEIL 2: KONZEPT — Wohin entwickeln wir?
Executive Summary
Die aktuelle Market-Page funktioniert technisch, aber sie ist noch nicht "Unicorn-ready". Dieses Konzept transformiert sie von einem einfachen Auktions-Aggregator zur zentralen Domain-Intelligence-Plattform.
📊 IST-Analyse: Aktuelle Implementation
Datenquellen (Backend)
┌─────────────────────────────────────────────────────────────────┐
│ CURRENT DATA FLOW │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ExpiredDomains.net ──┐ │
│ │ │
│ GoDaddy RSS Feed ────┼──→ Web Scraper ──→ PostgreSQL/SQLite │
│ │ (hourly) (domain_auctions) │
│ Sedo Public Search ──┤ │
│ │ │
│ NameJet Public ──────┤ │
│ │ │
│ DropCatch Public ────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
Probleme mit dem aktuellen Setup
| Problem | Impact | Severity |
|---|---|---|
| Web-Scraping ist fragil | Seiten ändern Layout → Scraper bricht | 🔴 Hoch |
| Daten sind oft veraltet | End-Zeiten stimmen nicht, Preise falsch | 🔴 Hoch |
| Kein "Pounce Direct" Content | Alles nur externe Daten, kein USP | 🔴 Hoch |
| Rate-Limiting & Blocking | Plattformen blockieren Scraper | 🟡 Mittel |
| Keine echte Echtzeit-Daten | Stündliches Scraping ist zu langsam | 🟡 Mittel |
| Pounce Score ist simpel | Nur Length + TLD, keine echten Signale | 🟡 Mittel |
🚀 SOLL-Konzept: Die Unicorn-Architektur
Phase 1: Der "Clean Feed" (Jetzt – 3 Monate)
Ziel: Die beste Auktions-Übersicht mit echtem Mehrwert.
1.1 Daten-Strategie: Hybrid-Ansatz
┌─────────────────────────────────────────────────────────────────┐
│ NEW DATA ARCHITECTURE │
├─────────────────────────────────────────────────────────────────┤
│ │
│ TIER 1: OFFIZIELLE APIs (zuverlässig, real-time) │
│ ──────────────────────────────────────────────────────────── │
│ • GoDaddy Partner API (wenn Partner-Account vorhanden) │
│ • Sedo Partner API (Affiliate-Programm) │
│ • DropCatch Public API │
│ │
│ TIER 2: WEB SCRAPING (Backup, validiert) │
│ ──────────────────────────────────────────────────────────── │
│ • ExpiredDomains.net (Deleted Domains) │
│ • NameJet Public (mit Fallback-Logik) │
│ │
│ TIER 3: POUNCE EXCLUSIVE (unser USP!) │
│ ──────────────────────────────────────────────────────────── │
│ • User-Listings ("Pounce Direct" / "For Sale") │
│ • DNS-verifizierte Eigentümer │
│ • Sofort-Kauf-Option │
│ │
└─────────────────────────────────────────────────────────────────┘
1.2 Der "Clean Feed" Algorithmus
# Spam-Filter v2.0 (Vanity Filter)
def is_premium_domain(domain: str) -> bool:
name = domain.rsplit('.', 1)[0]
tld = domain.rsplit('.', 1)[1]
# REGEL 1: Nur Premium-TLDs für Public
premium_tlds = ['com', 'io', 'ai', 'co', 'de', 'ch', 'net', 'org', 'app', 'dev']
if tld not in premium_tlds:
return False
# REGEL 2: Keine Spam-Muster
if len(name) > 12: # Kurz = Premium
return False
if name.count('-') > 0: # Keine Bindestriche
return False
if sum(c.isdigit() for c in name) > 1: # Max 1 Zahl
return False
if any(word in name.lower() for word in ['xxx', 'casino', 'loan', 'cheap']):
return False
# REGEL 3: Konsonanten-Check (kein "xkqzfgh.com")
consonants = 'bcdfghjklmnpqrstvwxyz'
max_consonant_streak = max(len(list(g)) for k, g in groupby(name, key=lambda c: c.lower() in consonants) if k)
if max_consonant_streak > 4:
return False
return True
1.3 Pounce Score 2.0
Der aktuelle Score ist zu simpel. Hier ist die verbesserte Version:
def calculate_pounce_score_v2(domain: str, auction_data: dict) -> int:
score = 50 # Baseline
name = domain.rsplit('.', 1)[0]
tld = domain.rsplit('.', 1)[1]
# ══════════════════════════════════════════════════════════════
# A) INTRINSIC VALUE (Domain selbst)
# ══════════════════════════════════════════════════════════════
# Länge (kurz = wertvoll)
length_scores = {1: 50, 2: 45, 3: 40, 4: 30, 5: 20, 6: 15, 7: 10}
score += length_scores.get(len(name), max(0, 15 - len(name)))
# TLD Premium
tld_scores = {'com': 20, 'ai': 25, 'io': 18, 'co': 12, 'de': 10, 'ch': 10}
score += tld_scores.get(tld, 0)
# Dictionary Word Bonus
common_words = ['tech', 'data', 'cloud', 'app', 'dev', 'net', 'hub', 'lab', 'pro']
if name.lower() in common_words or any(word in name.lower() for word in common_words):
score += 15
# ══════════════════════════════════════════════════════════════
# B) MARKET SIGNALS (Aktivität)
# ══════════════════════════════════════════════════════════════
# Bid Activity (mehr Bids = mehr Interesse)
bids = auction_data.get('num_bids', 0)
if bids >= 20: score += 15
elif bids >= 10: score += 10
elif bids >= 5: score += 5
# Time Pressure (endet bald = Opportunity)
hours_left = auction_data.get('hours_left', 999)
if hours_left < 1: score += 10 # HOT!
elif hours_left < 4: score += 5
# Price-to-Value Ratio
current_bid = auction_data.get('current_bid', 0)
estimated_value = estimate_base_value(name, tld)
if current_bid > 0 and estimated_value > current_bid * 1.5:
score += 15 # Unterbewertet!
# ══════════════════════════════════════════════════════════════
# C) PENALTIES (Abzüge)
# ══════════════════════════════════════════════════════════════
if '-' in name: score -= 30
if any(c.isdigit() for c in name) and len(name) > 3: score -= 20
if len(name) > 15: score -= 25
return max(0, min(100, score))
Phase 2: Der "Pounce Direct" Marktplatz (3 – 6 Monate)
Ziel: Eigenes Inventar = Unique Content = USP
2.1 Das Killer-Feature: "Pounce Direct"
┌─────────────────────────────────────────────────────────────────┐
│ POUNCE DIRECT INTEGRATION │
├─────────────────────────────────────────────────────────────────┤
│ │
│ MARKET FEED (Gemischt) │
│ ═══════════════════════════════════════════════════════════ │
│ │
│ ┌───────────────────────────────────────────────────────────┐ │
│ │ 💎 POUNCE DIRECT │ │
│ │ ───────────────────────────────────────────────────────── │ │
│ │ zurich-immo.ch $950 ⚡ INSTANT [BUY] │ │
│ │ ✅ Verified Owner │ │
│ └───────────────────────────────────────────────────────────┘ │
│ │
│ ┌───────────────────────────────────────────────────────────┐ │
│ │ 🏢 EXTERNAL AUCTION │ │
│ │ ───────────────────────────────────────────────────────── │ │
│ │ techflow.io $250 ⏱️ 6h left [BID ↗] │ │
│ │ via GoDaddy │ │
│ └───────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
2.2 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 (weil 0% Provision) |
| SEO Power | Jede Listing = eigene Landing Page |
| Trust Signal | DNS-Verifizierung = Qualitätsgarantie |
2.3 Der Flow für Verkäufer (aus pounce_terminal.md)
┌─────────────────────────────────────────────────────────────────┐
│ LISTING WIZARD │
├─────────────────────────────────────────────────────────────────┤
│ │
│ STEP 1: DOMAIN EINGEBEN │
│ ─────────────────────────────────────────────────────────── │
│ [________________________] zurich-immo.ch │
│ Preis: [$950] ○ Fixpreis ○ Verhandlungsbasis │
│ │
│ STEP 2: DNS VERIFICATION │
│ ─────────────────────────────────────────────────────────── │
│ Füge diesen TXT-Record zu deiner Domain hinzu: │
│ │
│ Name: _pounce-verify │
│ Value: pounce-verify-8a3f7b9c2e1d │
│ │
│ [🔄 VERIFY DNS] │
│ │
│ STEP 3: LIVE! │
│ ─────────────────────────────────────────────────────────── │
│ ✅ Domain verifiziert! │
│ Dein Listing ist jetzt im Market Feed sichtbar. │
│ │
└─────────────────────────────────────────────────────────────────┘
Phase 3: Die Daten-Hoheit (6 – 12 Monate) 🏆
Ziel: Unabhängigkeit von externen Quellen. EIGENE DATEN = EIGENES MONOPOL.
"Pounce weiß Dinge, die GoDaddy dir verheimlicht." — pounce_strategy.md
3.1 Zone File Analysis — Der Unicorn-Treiber
Was sind Zone Files? Zone Files sind die "Master-Listen" aller registrierten Domains pro TLD. Sie werden täglich von den Registries (Verisign, PIR, etc.) aktualisiert.
Wer hat Zugang?
- Jeder kann sich bei ICANN-akkreditierten Registries bewerben
- Verisign (.com/.net): https://www.verisign.com/en_US/channel-resources/domain-registry-products/zone-file/index.xhtml
- PIR (.org): Zone File Access Program
- Donuts (.xyz, .online, etc.): TLD Zone File Access
Kosten: $0 - $10,000/Jahr je nach TLD und Nutzung
┌─────────────────────────────────────────────────────────────────┐
│ ZONE FILE PIPELINE — Die Daten-Revolution │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ TIER 1: CRITICAL TLDs (Sofort beantragen) │ │
│ ├─────────────────────────────────────────────────────────┤ │
│ │ Verisign → .com, .net ~160M + 13M Domains │ │
│ │ PIR → .org ~10M Domains │ │
│ │ Afilias → .info ~4M Domains │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ TIER 2: PREMIUM TLDs (Phase 2) │ │
│ ├─────────────────────────────────────────────────────────┤ │
│ │ CentralNIC → .io, .co Premium für Startups │ │
│ │ Google → .app, .dev Tech-Domains │ │
│ │ Donuts → .xyz, .online Volumen │ │
│ │ SWITCH → .ch Schweizer Markt │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ POUNCE INTELLIGENCE ENGINE │ │
│ ├─────────────────────────────────────────────────────────┤ │
│ │ │ │
│ │ 1. DAILY DOWNLOAD (4:00 UTC) │ │
│ │ └─→ ~500GB komprimierte Daten pro Tag │ │
│ │ │ │
│ │ 2. DIFF ANALYSIS │ │
│ │ └─→ Was ist NEU? Was ist WEG? │ │
│ │ │ │
│ │ 3. DROP PREDICTION │ │
│ │ └─→ Domains die aus Zone verschwinden = droppen │ │
│ │ │ │
│ │ 4. QUALITY SCORING (Pounce Algorithm) │ │
│ │ └─→ Nur Premium-Domains durchlassen │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ OUTPUT: EXKLUSIVE INTELLIGENCE │ │
│ ├─────────────────────────────────────────────────────────┤ │
│ │ │ │
│ │ 🔮 "Drops Tomorrow" — Domains BEVOR sie in Auktionen │ │
│ │ 📈 "Trending Registrations" — Was wird gerade gehypt │ │
│ │ ⚠️ "Expiring Premium" — Hochwertige Domains am Ende │ │
│ │ 🔍 "Pattern Detection" — Welche Keywords explodieren │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
3.2 Der Pounce Algorithm — "No-Bullshit" Filter
# backend/app/services/zone_analyzer.py (NEU ZU BAUEN)
class ZoneFileAnalyzer:
"""
Analysiert Zone Files und findet Premium-Opportunities.
Input: Raw Zone File (Millionen von Domains)
Output: Gefilterte Premium-Liste (Hunderte)
"""
async def analyze_drops(self, yesterday: set, today: set) -> list:
"""
Findet Domains die aus der Zone verschwunden sind.
Diese Domains droppen in 1-5 Tagen (Redemption Period).
"""
dropped = yesterday - today # Set-Differenz
premium_drops = []
for domain in dropped:
score = self.calculate_pounce_score(domain)
# Nur Premium durchlassen
if score >= 70:
premium_drops.append({
"domain": domain,
"score": score,
"drop_date": self.estimate_drop_date(domain),
"estimated_value": self.estimate_value(domain),
})
return sorted(premium_drops, key=lambda x: x['score'], reverse=True)
def calculate_pounce_score(self, domain: str) -> int:
"""
Der Pounce Algorithm — Qualitätsfilter für Domains.
Faktoren:
- Länge (kurz = wertvoll)
- TLD (com > io > xyz)
- Keine Zahlen/Bindestriche
- Dictionary Word Bonus
- Historische Daten (wenn verfügbar)
"""
name = domain.rsplit('.', 1)[0]
tld = domain.rsplit('.', 1)[1]
score = 50 # Baseline
# Längen-Score
length_scores = {1: 50, 2: 45, 3: 40, 4: 30, 5: 20, 6: 15, 7: 10}
score += length_scores.get(len(name), max(0, 15 - len(name)))
# TLD Premium
tld_scores = {'com': 20, 'ai': 25, 'io': 18, 'co': 12, 'ch': 15, 'de': 10}
score += tld_scores.get(tld, 0)
# Penalties
if '-' in name: score -= 30
if any(c.isdigit() for c in name): score -= 20
if len(name) > 12: score -= 15
# Dictionary Word Bonus
if self.is_dictionary_word(name):
score += 25
return max(0, min(100, score))
3.3 Der "Drops Tomorrow" Feed — Tycoon Exclusive
┌─────────────────────────────────────────────────────────────────┐
│ 🔮 DROPS TOMORROW — Tycoon Exclusive ($29/mo) │
├─────────────────────────────────────────────────────────────────┤
│ │
│ Diese Domains sind NICHT in Auktionen! │
│ Du kannst sie beim Registrar direkt registrieren. │
│ │
│ ───────────────────────────────────────────────────────────── │
│ │
│ Domain TLD Score Est. Value Drops In │
│ ───────────────────────────────────────────────────────────── │
│ pixel.com .com 95 $50,000 23h 45m │
│ swift.io .io 88 $8,000 23h 12m │
│ quantum.ai .ai 92 $25,000 22h 58m │
│ nexus.dev .dev 84 $4,500 22h 30m │
│ fusion.co .co 81 $3,200 21h 15m │
│ │
│ ───────────────────────────────────────────────────────────── │
│ │
│ 💡 Pro Tip: Setze bei deinem Registrar einen Backorder │
│ für diese Domains. Wer zuerst kommt... │
│ │
│ [🔔 Alert für "pixel.com" setzen] │
│ │
└─────────────────────────────────────────────────────────────────┘
3.4 Warum das ein MONOPOL schafft
| Wettbewerber | Datenquelle | Problem |
|---|---|---|
| ExpiredDomains.net | Zone Files | Zeigt ALLES (Spam-Hölle) |
| GoDaddy Auctions | Eigene Daten | Nur GoDaddy-Domains |
| Sedo | User-Listings | Überteuert, wenig Volumen |
| Pounce | Zone Files + Algorithmus | Premium-gefiltert, clean |
Der Unterschied:
- ExpiredDomains zeigt dir 100.000 Domains am Tag. Davon sind 99.990 Müll.
- Pounce zeigt dir 100 Premium-Domains. Alle sind es wert, angeschaut zu werden.
Das verkauft Abos:
"Ich zahle $29/Monat, weil Pounce mir 20 Stunden Recherche pro Woche spart."
3.5 Technische Umsetzung — Server-Anforderungen
┌─────────────────────────────────────────────────────────────────┐
│ ZONE FILE PROCESSING — Infrastructure │
├─────────────────────────────────────────────────────────────────┤
│ │
│ SERVER REQUIREMENTS: │
│ ──────────────────────────────────────────────────────────── │
│ • Storage: 2TB SSD (Zone Files sind ~500GB/Tag komprimiert) │
│ • RAM: 64GB+ (für effizientes Set-Diffing) │
│ • CPU: 16+ Cores (parallele Analyse) │
│ • Kosten: ~$300-500/Monat (Hetzner/OVH Dedicated) │
│ │
│ PROCESSING PIPELINE: │
│ ──────────────────────────────────────────────────────────── │
│ 04:00 UTC │ Zone File Download (FTP/HTTPS) │
│ 04:30 UTC │ Decompression & Parsing │
│ 05:00 UTC │ Diff Analysis (gestern vs heute) │
│ 05:30 UTC │ Quality Scoring (Pounce Algorithm) │
│ 06:00 UTC │ Database Update (PostgreSQL) │
│ 06:15 UTC │ Alert Matching (Sniper Alerts) │
│ 06:30 UTC │ User Notifications (Email/SMS) │
│ │
│ STORAGE STRATEGY: │
│ ──────────────────────────────────────────────────────────── │
│ • Nur Premium-Domains speichern (Score > 50) │
│ • 90 Tage History für Trend-Analyse │
│ • Ältere Daten archivieren (S3 Glacier) │
│ │
└─────────────────────────────────────────────────────────────────┘
3.6 Phase 1 vs Phase 3 — Was zuerst?
| Phase | Datenquelle | Status |
|---|---|---|
| Phase 1 (JETZT) | Web Scraping + Pounce Direct | ✅ Implementiert |
| Phase 3 (6-12 Mo) | Zone Files | 🔜 Geplant |
Warum warten?
- Zone File Access braucht Verträge mit Registries (1-3 Monate)
- Infrastruktur-Investition (~$500/Monat Server)
- Algorithmus muss getestet werden (False Positives vermeiden)
Was wir JETZT tun:
- Scraping + Pounce Direct perfektionieren
- User-Basis aufbauen (die Zone Files später monetarisiert)
- Algorithmus entwickeln (funktioniert auch ohne Zone Files)
💡 Konkrete Änderungen für die Market Page
Frontend-Änderungen
1. Visuelle Hierarchie verbessern
// VORHER: Alle Items sehen gleich aus
<div className="grid">
{items.map(item => <AuctionCard />)}
</div>
// NACHHER: Pounce Direct hervorheben
<div className="space-y-3">
{/* Featured: Pounce Direct (wenn vorhanden) */}
{pounceDirectItems.length > 0 && (
<div className="bg-gradient-to-r from-emerald-500/10 to-transparent border border-emerald-500/20 rounded-xl p-1">
<div className="px-4 py-2 flex items-center gap-2 text-xs font-bold text-emerald-400 uppercase tracking-wider">
<Diamond className="w-3.5 h-3.5" />
Pounce Direct — Verified Instant Buy
</div>
{pounceDirectItems.map(item => <PounceDirectCard />)}
</div>
)}
{/* Standard: External Auctions */}
<div className="space-y-2">
{externalItems.map(item => <AuctionCard />)}
</div>
</div>
2. Filter-Presets für User-Journeys
// Quick-Filter Buttons basierend auf User-Intent
const FILTER_PRESETS = {
'ending-soon': {
label: '⏱️ Ending Soon',
filter: { hours_left: { max: 4 } },
sort: 'time_asc'
},
'bargains': {
label: '💰 Under $100',
filter: { price: { max: 100 }, score: { min: 60 } },
sort: 'score_desc'
},
'premium': {
label: '👑 Premium Only',
filter: { score: { min: 80 }, tld: ['com', 'io', 'ai'] },
sort: 'price_desc'
},
'pounce-only': {
label: '💎 Pounce Direct',
filter: { source: 'pounce' },
sort: 'created_desc'
}
}
3. "Opportunity Score" statt nur "Pounce Score"
// Zeige WARUM ein Domain interessant ist
function OpportunityIndicators({ item }) {
const indicators = []
if (item.hoursLeft < 2) indicators.push({ icon: '🔥', label: 'Ending soon' })
if (item.numBids < 3) indicators.push({ icon: '📉', label: 'Low competition' })
if (item.valueRatio > 2) indicators.push({ icon: '💎', label: 'Undervalued' })
if (item.isPounce) indicators.push({ icon: '⚡', label: 'Instant buy' })
return (
<div className="flex gap-1">
{indicators.map(ind => (
<Tooltip content={ind.label}>
<span className="text-xs">{ind.icon}</span>
</Tooltip>
))}
</div>
)
}
Backend-Änderungen
1. Unified Feed API
# NEUER ENDPOINT: /api/v1/market/feed
@router.get("/feed")
async def get_market_feed(
# Filter
source: Optional[str] = Query(None, enum=['all', 'pounce', 'external']),
score_min: int = Query(0, ge=0, le=100),
price_max: Optional[float] = None,
tld: Optional[List[str]] = Query(None),
ending_within: Optional[int] = Query(None, description="Hours"),
# Sort
sort_by: str = Query('score', enum=['score', 'price', 'time', 'bids']),
# Pagination
limit: int = Query(30, le=100),
offset: int = Query(0),
# Auth
current_user: Optional[User] = Depends(get_current_user_optional),
):
"""
Unified market feed combining:
- Pounce Direct listings (user-listed domains)
- External auctions (scraped from platforms)
For non-authenticated users:
- Apply vanity filter (premium domains only)
- Blur "Deal Score" (tease upgrade)
"""
items = []
# 1. Get Pounce Direct listings
pounce_listings = await get_published_listings(db)
for listing in pounce_listings:
items.append({
'type': 'pounce_direct',
'domain': listing.domain,
'price': listing.asking_price,
'source': 'Pounce',
'status': 'instant',
'verified': listing.verification_status == 'verified',
'url': f'/buy/{listing.slug}', # Internal!
})
# 2. Get external auctions
auctions = await get_active_auctions(db)
for auction in auctions:
# Apply vanity filter for non-auth users
if not current_user and not is_premium_domain(auction.domain):
continue
items.append({
'type': 'auction',
'domain': auction.domain,
'price': auction.current_bid,
'source': auction.platform,
'status': 'auction',
'time_left': format_time_remaining(auction.end_time),
'url': auction.affiliate_url, # External
})
# 3. Calculate scores
for item in items:
item['pounce_score'] = calculate_pounce_score_v2(
item['domain'],
item
)
# 4. Sort and paginate
items = sorted(items, key=lambda x: x['pounce_score'], reverse=True)
return {
'items': items[offset:offset+limit],
'total': len(items),
'filters_applied': {...},
}
2. Scraper Verbesserungen
class AuctionScraperService:
"""
IMPROVED: Resilient scraping with fallbacks
"""
async def scrape_with_fallback(self, platform: str, db: AsyncSession):
"""Try multiple methods to get data"""
methods = [
(f'_scrape_{platform.lower()}_api', 'API'), # Best: Official API
(f'_scrape_{platform.lower()}_rss', 'RSS'), # Good: RSS Feed
(f'_scrape_{platform.lower()}_html', 'HTML'), # Fallback: HTML Scrape
]
for method_name, method_type in methods:
method = getattr(self, method_name, None)
if not method:
continue
try:
result = await method(db)
if result['found'] > 0:
logger.info(f"{platform}: Got {result['found']} via {method_type}")
return result
except Exception as e:
logger.warning(f"{platform} {method_type} failed: {e}")
continue
# All methods failed
logger.error(f"{platform}: All scrape methods failed")
return {'found': 0, 'new': 0, 'updated': 0, 'error': 'All methods failed'}
📈 Metriken für den Erfolg
KPIs für Phase 1
| Metrik | Ziel (3 Monate) | Messung |
|---|---|---|
| Daily Active Users (DAU) | 500 | PostHog |
| Conversion Rate (Free → Trader) | 5% | Stripe |
| Domains in Feed | 1000+ | DB Query |
| Avg. Session Duration | > 3 min | PostHog |
| Scrape Success Rate | > 95% | Logs |
KPIs für Phase 2
| Metrik | Ziel (6 Monate) | Messung |
|---|---|---|
| Pounce Direct Listings | 100+ | DB Query |
| First Sale via Pounce | ✅ | Manual |
| GMV (Gross Merchandise Value) | $50,000 | Tracked |
| Repeat Sellers | 20% | DB Query |
🛠️ Technische Schulden abbauen
Priorität 1: Scraper Stabilität
# Problem: Scraper bricht bei HTML-Änderungen
# Lösung: Defensive Parsing mit Fallbacks
def parse_domain_from_row(row) -> Optional[str]:
"""Try multiple selectors to find domain"""
selectors = [
'a.domain-name',
'td.domain a',
'span[data-domain]',
'a[href*="domain"]',
]
for selector in selectors:
elem = row.select_one(selector)
if elem:
text = elem.get_text(strip=True)
if '.' in text and len(text) < 100:
return text.lower()
return None
Priorität 2: Caching Layer
# Problem: Jeder Request macht DB-Abfragen
# Lösung: Redis Cache für Feed-Daten
from redis import asyncio as aioredis
async def get_market_feed_cached(filters: dict) -> list:
cache_key = f"market:feed:{hash(str(filters))}"
# Try cache first
cached = await redis.get(cache_key)
if cached:
return json.loads(cached)
# Generate fresh data
data = await generate_market_feed(filters)
# Cache for 5 minutes
await redis.setex(cache_key, 300, json.dumps(data))
return data
Priorität 3: Rate Limiting pro User
# Problem: Power User könnten API überlasten
# Lösung: Tiered Rate Limits
RATE_LIMITS = {
'scout': '50/hour',
'trader': '200/hour',
'tycoon': '1000/hour',
}
🎯 Nächste Schritte
✅ ERLEDIGT (11. Dezember 2025)
- Pounce Score v2.0 implementieren →
_calculate_pounce_score_v2()inauctions.py - Unified
/auctions/feedAPI deployen → Live und funktional - Pounce Direct Listings im Feed integrieren → Kombiniert mit externen Auktionen
- "💎 Pounce Direct" Badge und Highlighting → Visuelle Hierarchie implementiert
- Filter-Presets im Frontend → "Pounce Only", "Verified", Preis-Filter
- Zone File Access Anleitung →
ZONE_FILE_ACCESS.mderstellt
Nächste Woche
- Erste Pounce Direct Listings erstellen (Testdaten)
- Scraper-Fallbacks implementieren
- Verisign Zone File Access beantragen
Nächster Monat
- Opportunity Indicators im UI
- Redis Caching Layer
- PIR (.org) Zone File Access
💎 Fazit
Die Market Page ist das Herzstück von Pounce. Mit diesen Änderungen wird sie:
- Zuverlässiger (Scraper-Fallbacks, Caching)
- Wertvoller (Pounce Direct = Unique Content)
- Stickier (bessere UX, personalisierte Filter)
- Skalierbarer (Unicorn-ready Architektur)
Der Weg zum Unicorn führt über Datenhoheit und einzigartigen Content. Pounce Direct ist der erste Schritt.
🔧 TEIL 3: AKTIONSPLAN — Was tun wir konkret?
Phase A: Cleanup (Heute)
1. Leere Ordner löschen
# Diese Ordner sind leer und Legacy vom alten /command Routing
rm -rf frontend/src/app/dashboard/
rm -rf frontend/src/app/portfolio/
rm -rf frontend/src/app/settings/
rm -rf frontend/src/app/watchlist/
rm -rf frontend/src/app/careers/
2. Redundante Seiten prüfen
| Seite | Entscheidung |
|---|---|
/market/page.tsx |
❌ Entfernen → Redirect zu /auctions |
/intelligence/page.tsx |
⚠️ Prüfen → Redirect zu /tld-pricing |
Phase B: Pounce Direct Integration (Diese Woche)
1. Backend: Unified Market Feed API
Datei: backend/app/api/auctions.py
Neuer Endpoint hinzufügen:
@router.get("/feed")
async def get_unified_market_feed(
source: str = Query("all", enum=["all", "pounce", "external"]),
# ... Filter
):
"""
Unified feed combining:
- Pounce Direct (user listings)
- External auctions (scraped)
"""
items = []
# 1. Pounce Direct Listings
if source in ["all", "pounce"]:
listings = await db.execute(
select(DomainListing)
.where(DomainListing.status == "active")
)
for listing in listings.scalars():
items.append({
"type": "pounce_direct",
"domain": listing.domain,
"price": listing.asking_price,
"source": "Pounce",
"status": "instant",
"verified": listing.is_verified,
"url": f"/buy/{listing.slug}",
})
# 2. External Auctions
if source in ["all", "external"]:
auctions = await db.execute(
select(DomainAuction)
.where(DomainAuction.is_active == True)
)
for auction in auctions.scalars():
items.append({
"type": "auction",
"domain": auction.domain,
"price": auction.current_bid,
"source": auction.platform,
"status": "auction",
"time_left": _format_time_remaining(auction.end_time),
"url": auction.affiliate_url,
})
return {"items": items, "total": len(items)}
2. Frontend: API Client erweitern
Datei: frontend/src/lib/api.ts
async getMarketFeed(
source: 'all' | 'pounce' | 'external' = 'all',
filters?: {
keyword?: string
tld?: string
minPrice?: number
maxPrice?: number
}
) {
const params = new URLSearchParams({ source })
if (filters?.keyword) params.append('keyword', filters.keyword)
if (filters?.tld) params.append('tld', filters.tld)
if (filters?.minPrice) params.append('min_price', filters.minPrice.toString())
if (filters?.maxPrice) params.append('max_price', filters.maxPrice.toString())
return this.request<{
items: MarketItem[]
total: number
}>(`/auctions/feed?${params.toString()}`)
}
3. Frontend: Market Page updaten
Datei: frontend/src/app/terminal/market/page.tsx
Änderungen:
api.getMarketFeed()stattapi.getAuctions()aufrufen- Pounce Direct Items visuell hervorheben
- "Pounce Exclusive" Filter aktivieren
Phase C: Public Page Alignment (Nächste Woche)
1. /auctions/page.tsx — Pounce Direct hervorheben
// Gruppiere Items
const pounceItems = items.filter(i => i.type === 'pounce_direct')
const externalItems = items.filter(i => i.type === 'auction')
return (
<>
{/* Featured: Pounce Direct */}
{pounceItems.length > 0 && (
<section className="mb-8">
<h2 className="flex items-center gap-2 text-xl font-bold mb-4">
<Diamond className="text-emerald-400" />
Pounce Exclusive — Verified Instant Buy
</h2>
<div className="grid gap-4">
{pounceItems.map(item => (
<PounceDirectCard key={item.domain} item={item} />
))}
</div>
</section>
)}
{/* Standard: External */}
<section>
<h2 className="text-xl font-bold mb-4">Active Auctions</h2>
<MarketTable items={externalItems} />
</section>
</>
)
2. Konsolidierung
| Aktion | Details |
|---|---|
/market/page.tsx entfernen |
Redirect zu /auctions |
/auctions/page.tsx umbenennen |
→ "Market" in Navigation |
Phase D: Score & Scraper Verbesserungen (Woche 2-3)
1. Pounce Score v2.0
Datei: backend/app/services/valuation.py
Erweitern um:
- Bid Activity Score
- Time Pressure Score
- Value Ratio Score
- Platform Trust Score
2. Scraper Fallbacks
Datei: backend/app/services/auction_scraper.py
async def scrape_with_fallback(self, platform: str, db: AsyncSession):
methods = [
(f'_scrape_{platform.lower()}_api', 'API'),
(f'_scrape_{platform.lower()}_rss', 'RSS'),
(f'_scrape_{platform.lower()}_html', 'HTML'),
]
for method_name, method_type in methods:
method = getattr(self, method_name, None)
if not method:
continue
try:
result = await method(db)
if result['found'] > 0:
return result
except Exception as e:
logger.warning(f"{platform} {method_type} failed: {e}")
return {'found': 0, 'error': 'All methods failed'}
Checkliste für den Clean Start
Backend:
- Unified Feed Endpoint
/auctions/feederstellen - Pounce Score v2.0 in
valuation.pyintegrieren - Scraper Fallback-Logik hinzufügen
Frontend:
- Leere Ordner löschen
api.getMarketFeed()implementieren- Market Page: Pounce Direct Integration
- Auctions Page: Visuelle Hierarchie
/market/page.tsxzu Redirect machen
Testing:
- Listing erstellen → Erscheint im Market Feed?
- DNS Verification → Funktioniert?
- External Auctions → Werden geladen?
- Filter "Pounce Only" → Zeigt nur Listings?
Visualisierung: Datenfluss
┌─────────────────────────────────────────────────────────────────┐
│ MARKET FEED │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ LISTINGS │ │ AUCTIONS │ │ SCHEDULER │ │
│ │ (Pounce) │ │ (External) │ │ (Scrape) │ │
│ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ │
│ │ │ │ │
│ │ │ │ │
│ └───────────────────┴───────────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────────┐ │
│ │ /auctions/feed │ │
│ │ (Unified API) │ │
│ └────────┬─────────┘ │
│ │ │
│ ┌─────────────────┼─────────────────┐ │
│ ▼ ▼ ▼ │
│ ┌────────────┐ ┌────────────┐ ┌────────────┐ │
│ │ TERMINAL │ │ PUBLIC │ │ ADMIN │ │
│ │ /market │ │ /auctions │ │ /admin │ │
│ └────────────┘ └────────────┘ └────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
🚀 TEIL 4: ROADMAP ZUM UNICORN
Die 4 Phasen (aus pounce_strategy.md)
┌─────────────────────────────────────────────────────────────────┐
│ POUNCE UNICORN ROADMAP │
├─────────────────────────────────────────────────────────────────┤
│ │
│ PHASE 1: INTELLIGENCE (0-18 Monate) │
│ ═══════════════════════════════════════════════════════════ │
│ Ziel: 10.000 User, $1M ARR, Datenhoheit │
│ │
│ ✅ Pounce Terminal (Dashboard) │
│ ✅ TLD Pricing (Market Barometer) │
│ ✅ Auction Aggregator (Scraping) │
│ ✅ Watchlist/Monitoring │
│ ⏳ Pounce Direct (Marketplace) │
│ 🔜 Zone File Analyse │
│ │
│ Status: WIR SIND HIER ◄──────────────────────────────────── │
│ │
├─────────────────────────────────────────────────────────────────┤
│ │
│ PHASE 2: LIQUIDITÄT (18-36 Monate) │
│ ═══════════════════════════════════════════════════════════ │
│ Ziel: Den Transaktionsfluss übernehmen, $10M ARR │
│ │
│ 🔮 Pounce Instant Exchange (Escrow integriert) │
│ 🔮 "Buy Now" Buttons im Dashboard │
│ 🔮 5% Transaktionsgebühr (statt 15-20% bei Konkurrenz) │
│ │
├─────────────────────────────────────────────────────────────────┤
│ │
│ PHASE 3: FINANZIALISIERUNG (3-5 Jahre) │
│ ═══════════════════════════════════════════════════════════ │
│ Ziel: Domains als Asset-Klasse, $50-100M ARR │
│ │
│ 🔮 Fractional Ownership (Anteile an Premium-Domains) │
│ 🔮 Domain-Backed Lending (Kredit gegen Domain) │
│ 🔮 → Wir werden ein FINTECH │
│ │
├─────────────────────────────────────────────────────────────────┤
│ │
│ PHASE 4: IMPERIUM (5+ Jahre) │
│ ═══════════════════════════════════════════════════════════ │
│ Ziel: $1 Mrd. Bewertung, "Too big to fail" │
│ │
│ 🔮 Pounce Enterprise Sentinel (B2B Brand Protection) │
│ 🔮 Fortune 500 Kunden (Apple, Tesla, etc.) │
│ 🔮 KI-gestützte Phishing-Takedowns │
│ │
└─────────────────────────────────────────────────────────────────┘
Was WIR JETZT tun (Phase 1 perfektionieren)
Priorität 1: Pounce Direct perfektionieren
- Listing-System gebaut
- DNS-Verifizierung funktioniert
- Im Market Feed anzeigen ← NÄCHSTER SCHRITT
- Visuelle Hierarchie (💎 Pounce vs 🏢 External)
Priorität 2: Datenqualität verbessern
- Scraping läuft
- Fallback-Logik für Scraper
- Pounce Score v2.0
Priorität 3: Zone Files vorbereiten
- Verisign Zone File Access beantragen
- Algorithmus entwickeln (kann lokal getestet werden)
- Server-Infrastruktur planen
Zusammenfassung: Der Weg zum Unicorn
HEUTE 6 MONATE 18+ MONATE
│ │ │
▼ ▼ ▼
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ SCRAPING │ →→→ │ ZONE FILES │ →→→ │ FINTECH │
│ + POUNCE │ │ ANALYSIS │ │ BÖRSE │
│ DIRECT │ │ │ │ │
└─────────────┘ └─────────────┘ └─────────────┘
│ │ │
│ │ │
"Content Filler" "Daten-Monopol" "Asset-Klasse"
Seite wirkt lebendig Exklusive Intel Domains = Aktien
💎 Das Mantra
"Don't guess. Know."
Phase 1: Intelligence
"Don't just buy. Invest."
Phase 3: Asset Class
Der Weg zum Unicorn führt über Datenhoheit und einzigartigen Content.
- Heute: Pounce Direct (User-Listings) = Unique Content
- Morgen: Zone Files = Exklusive Intelligence
- Übermorgen: Fintech = Milliarden-Bewertung
Bereit zum Start? 🚀
Sag mir, womit ich beginnen soll:
- Cleanup — Leere Ordner löschen
- Backend — Unified Feed API erstellen
- Frontend — Market Page mit Pounce Direct