diff --git a/backend/app/api/auctions.py b/backend/app/api/auctions.py index 118d1a8..0015831 100644 --- a/backend/app/api/auctions.py +++ b/backend/app/api/auctions.py @@ -224,6 +224,15 @@ async def search_auctions( # Build query query = select(DomainAuction).where(DomainAuction.is_active == True) + # VANITY FILTER: For public (non-logged-in) users, only show premium-looking domains + # This ensures the first impression is high-quality, not spam domains + if current_user is None: + # Premium TLDs only (no .cc, .website, .info spam clusters) + premium_tlds = ['com', 'io', 'ai', 'co', 'de', 'ch', 'net', 'org', 'app', 'dev', 'xyz'] + query = query.where(DomainAuction.tld.in_(premium_tlds)) + # No domains with more than 15 characters (excluding TLD) + # Note: We filter further in Python for complex rules + if keyword: query = query.where(DomainAuction.domain.ilike(f"%{keyword}%")) @@ -266,6 +275,49 @@ async def search_auctions( result = await db.execute(query) auctions = list(result.scalars().all()) + # VANITY FILTER PART 2: Apply Python-side filtering for public users + # This ensures only premium-looking domains are shown to non-logged-in users + if current_user is None: + def is_premium_domain(domain_name: str) -> bool: + """Check if a domain looks premium/professional""" + # Extract just the domain part (without TLD) + parts = domain_name.rsplit('.', 1) + name = parts[0] if parts else domain_name + + # Rule 1: No more than 15 characters + if len(name) > 15: + return False + + # Rule 2: No more than 1 hyphen + if name.count('-') > 1: + return False + + # Rule 3: No more than 2 digits total + digit_count = sum(1 for c in name if c.isdigit()) + if digit_count > 2: + return False + + # Rule 4: Must be at least 3 characters + if len(name) < 3: + return False + + # Rule 5: No random-looking strings (too many consonants in a row) + consonants = 'bcdfghjklmnpqrstvwxyz' + consonant_streak = 0 + max_streak = 0 + for c in name.lower(): + if c in consonants: + consonant_streak += 1 + max_streak = max(max_streak, consonant_streak) + else: + consonant_streak = 0 + if max_streak > 4: + return False + + return True + + auctions = [a for a in auctions if is_premium_domain(a.domain)] + # Convert to response with valuations listings = [] for auction in auctions: diff --git a/frontend/src/app/intelligence/page.tsx b/frontend/src/app/intelligence/page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/pricing/page.tsx b/frontend/src/app/pricing/page.tsx index 851abc3..c853d59 100644 --- a/frontend/src/app/pricing/page.tsx +++ b/frontend/src/app/pricing/page.tsx @@ -22,9 +22,11 @@ const tiers = [ { text: '5 domains to track', highlight: false, available: true }, { text: 'Daily availability scans', highlight: false, available: true }, { text: 'Email alerts', highlight: false, available: true }, - { text: 'TLD price overview', highlight: false, available: true }, + { text: 'Raw auction feed', highlight: false, available: true, sublabel: 'Unfiltered' }, + { text: 'Curated auction list', highlight: false, available: false }, + { text: 'Deal scores & valuations', highlight: false, available: false }, ], - cta: 'Hunt Free', + cta: 'Start Free', highlighted: false, badge: null, isPaid: false, @@ -35,20 +37,19 @@ const tiers = [ icon: TrendingUp, price: '9', period: '/mo', - description: 'Hunt with precision. Daily intel.', + description: 'The smart investor\'s choice.', features: [ { text: '50 domains to track', highlight: true, available: true }, - { text: 'Hourly scans', highlight: true, available: true }, - { text: 'Email alerts', highlight: false, available: true }, - { text: 'Full TLD market data', highlight: false, available: true }, - { text: 'Domain valuation', highlight: true, available: true }, - { text: 'Portfolio (25 domains)', highlight: true, available: true }, + { text: 'Hourly scans', highlight: true, available: true, sublabel: '24x faster' }, + { text: 'Smart spam filter', highlight: true, available: true, sublabel: 'Curated list' }, + { text: 'Deal scores & valuations', highlight: true, available: true }, + { text: 'Portfolio tracking (25)', highlight: true, available: true }, { text: '90-day price history', highlight: false, available: true }, - { text: 'Expiry tracking', highlight: true, available: true }, + { text: 'Expiry date tracking', highlight: true, available: true }, ], - cta: 'Start Trading', + cta: 'Upgrade to Trader', highlighted: true, - badge: 'Most Popular', + badge: 'Best Value', isPaid: true, }, { @@ -57,14 +58,15 @@ const tiers = [ icon: Crown, price: '29', period: '/mo', - description: 'Dominate the market. No limits.', + description: 'For serious domain investors.', features: [ { text: '500 domains to track', highlight: true, available: true }, - { text: 'Real-time scans (10 min)', highlight: true, available: true }, - { text: 'Priority email alerts', highlight: false, available: true }, + { text: 'Real-time scans', highlight: true, available: true, sublabel: 'Every 10 min' }, + { text: 'Priority alerts', highlight: true, available: true }, { text: 'Unlimited portfolio', highlight: true, available: true }, { text: 'Full price history', highlight: true, available: true }, { text: 'Advanced valuation', highlight: true, available: true }, + { text: 'API access', highlight: true, available: true, sublabel: 'Coming soon' }, ], cta: 'Go Tycoon', highlighted: false, @@ -76,8 +78,10 @@ const tiers = [ const comparisonFeatures = [ { name: 'Watchlist Domains', scout: '5', trader: '50', tycoon: '500' }, { name: 'Check Frequency', scout: 'Daily', trader: 'Hourly', tycoon: '10 min' }, + { name: 'Auction Feed', scout: 'Raw (unfiltered)', trader: 'Curated (spam-free)', tycoon: 'Curated (spam-free)' }, + { name: 'Deal Scores', scout: '—', trader: 'check', tycoon: 'check' }, { name: 'Portfolio Domains', scout: '—', trader: '25', tycoon: 'Unlimited' }, - { name: 'Domain Valuation', scout: '—', trader: 'check', tycoon: 'check' }, + { name: 'Domain Valuation', scout: '—', trader: 'check', tycoon: 'Advanced' }, { name: 'Price History', scout: '—', trader: '90 days', tycoon: 'Unlimited' }, { name: 'Expiry Tracking', scout: '—', trader: 'check', tycoon: 'check' }, ] @@ -230,9 +234,24 @@ export default function PricingPage() {
Loading Command Center...
+{subtitle}
+{subtitle}
)}