API FIX:
- quickHealthCheck now uses POST method (was GET)
- Fixes 'int_parsing' error for domain_id
PORTFOLIO UX:
1. Health Check now works correctly with POST /domains/health-check
2. Clear separation of List vs Sell:
- 'List' button → Opens listing form (marketplace)
- 'Sold?' button → Records completed sale (P&L tracking)
3. Improved Valuation Modal:
- Shows 'Pounce Score Estimate' instead of just 'Estimated Value'
- Color-coded confidence badge (high/medium/low)
- Clear disclaimer about algorithmic estimate
4. Record Sale Modal:
- Clear explanation of purpose (P&L tracking)
- Hint to use 'List' button for marketplace
LISTINGS PAGE:
- Accepts ?domain= query parameter
- Auto-opens create modal with prefilled domain
- Seamless flow from Portfolio → List on Marketplace
BACKEND CHANGES (tld_prices.py):
- Added get_min_renewal_price() and get_avg_renewal_price() helpers
- Added calculate_price_trends() with known TLD trends:
- .ai: +15%/1y, +45%/3y (AI boom)
- .com: +7%/1y, +14%/3y (registry increases)
- .xyz: -10%/1y (promo-driven)
- etc.
- Added calculate_risk_level() returning low/medium/high + reason
- Extended /overview endpoint to return:
- min_renewal_price
- avg_renewal_price
- price_change_7d, price_change_1y, price_change_3y
- risk_level, risk_reason
FRONTEND CHANGES:
- Updated api.ts TldOverview interface with new fields
- Command Center /command/pricing/page.tsx:
- Now uses api.getTldOverview() instead of simulated data
- getRiskInfo() uses backend risk_level/risk_reason
- Public /intelligence/page.tsx:
- Same updates - uses real backend data
This ensures TLD Pricing works correctly:
- Public page: Real data + blur for premium columns
- Command Center: Real data with all columns visible
- Admin: TLD Pricing tab with correct stats
- Add delete user functionality with cascade deletion of all user data
- Fix OAuth URLs to include /api/v1 path
- Fix token storage key consistency in OAuth callback
- Update user model to cascade delete price alerts
- Improve email templates with minimalist design
- Add confirmation dialog for user deletion
- Prevent deletion of admin users
Admin Panel:
- User Detail Modal with full profile info
- Bulk tier upgrade for multiple users
- User export to CSV
- Price Alerts overview tab
- Domain Health Check trigger
- Email Test functionality
- Scheduler Status with job info and last runs
- Activity Log for admin actions
- Blog management tab with CRUD
Blog System:
- BlogPost model with full content management
- Public API: list, featured, categories, single post
- Admin API: create, update, delete, publish/unpublish
- Frontend blog listing page with categories
- Frontend blog detail page with styling
- View count tracking
OAuth:
- Google OAuth integration
- GitHub OAuth integration
- OAuth callback handling
- Provider selection on login/register
Other improvements:
- Domain checker with check_all_domains function
- Admin activity logging
- Breadcrumbs component
- Toast notification component
- Various UI/UX improvements
SETTINGS FIXES:
- Profile save now calls real API (PUT /auth/me)
- Updates store after successful profile save
- Notification preferences now functional with state
- Save preferences button added
- Preferences stored in localStorage
- Proper loading/saving states
DASHBOARD FIX:
- Portfolio data loads on mount (not just when tab active)
- Tab counts now show correct numbers
- Both Watchlist and Portfolio counts visible immediately
API:
- Added updateMe() method in api.ts
- Made Auction.valuation optional (API doesn't always return it)
- Fixed domain.notify to domain.notify_on_available in dashboard
- Changed api.request from private to protected for inheritance
Dashboard Improvements:
- Portfolio: Sell Domain Modal mit Profit-Vorschau
- Portfolio: Edit Domain Modal für alle Felder
- Watchlist: Notification Toggle Button (Bell Icon)
- Neue Handler-Funktionen für alle Aktionen
New Pages:
- /settings - Profile, Notifications, Billing, Security
- /blog/[slug] - Blog Detail Page mit Share-Buttons
- /unsubscribe - Newsletter Unsubscribe Seite
Navigation Updates:
- Settings Icon im Header für eingeloggte User
- Unsubscribe Link im Footer (Legal Section)
API Additions:
- updateDomainNotify() für Watchlist-Benachrichtigungen
Backend:
- Add Stripe API endpoints (checkout, portal, webhook) in subscription.py
- Add password reset (forgot-password, reset-password) in auth.py
- Add email verification endpoints
- Add rate limiting with slowapi
- Add contact form and newsletter API (contact.py)
- Add webhook endpoint for Stripe (webhooks.py)
- Add NewsletterSubscriber model
- Extend User model with password reset and email verification tokens
- Extend email_service with new templates (password reset, verification, contact, newsletter)
- Update env.example with all new environment variables
Frontend:
- Add /forgot-password page
- Add /reset-password page with token handling
- Add /verify-email page with auto-verification
- Add forgot password link to login page
- Connect contact form to API
- Add API methods for all new endpoints
Documentation:
- Update README with new API endpoints
- Update environment variables documentation
- Update pages overview
PROBLEM:
- TLD prices in overview table differed from detail page
- Detail page was recalculating prices instead of using API data
SOLUTION:
1. Updated Frontend API types to include all backend fields:
- getTldCompare: Added type, description, registry, introduced,
cheapest_registrar, cheapest_price, price_range
- getTldHistory: Added type, description, registry, trend,
trend_reason, source
2. Fixed TLD Detail Page:
- Now uses price_range from Compare API directly
- Removed manual price recalculation
- Uses trend/trend_reason from History API
- All values now match Overview table exactly
RESULT:
- Prices are now 100% consistent:
- Overview table shows avg_registration_price from /overview API
- Detail page shows pricing.avg from /compare API (same values)
- Trending cards show current_price from /trending API (same values)
- All calculated using get_avg_price() in backend
MAJOR FEATURES:
- New pricing tiers: Scout (Free), Trader (€19/mo), Tycoon (€49/mo)
- Portfolio management: Track owned domains with purchase price, value, ROI
- Domain valuation engine: Algorithmic estimates based on length, TLD, keywords, brandability
- Dashboard tabs: Watchlist + Portfolio views
- Valuation modal: Score breakdown with confidence level
BACKEND:
- New models: PortfolioDomain, DomainValuation
- New API routes: /portfolio/* with full CRUD
- Valuation service with multi-factor algorithm
- Database migration for portfolio tables
FRONTEND:
- Updated pricing page with comparison table and billing toggle
- Dashboard with Watchlist/Portfolio tabs
- Portfolio summary stats: Total value, invested, unrealized P/L, ROI
- Add portfolio domain modal with all fields
- Domain valuation modal with score visualization
- Updated landing page with new tier pricing
- Hero section with large puma logo
DESIGN:
- Consistent minimalist dark theme
- Responsive on all devices
- Professional animations and transitions
- Add search functionality (filter TLDs by name)
- Add pagination (25 per page with page navigation)
- Sort by popularity (Top TLDs first: com, net, org, de, uk...)
- Show all info for authenticated users
- Backend: offset/limit params, search filter, popularity ranking
TLD order: com > net > org > de > uk > io > ai > app...
Major changes:
- Add TLD price scraper with Porkbun API (886+ TLDs, no API key needed)
- Fix .ch domain checker using rdap.nic.ch custom RDAP
- Integrate database for TLD price history tracking
- Add admin endpoints for manual scrape and stats
- Extend scheduler with daily TLD price scrape job (03:00 UTC)
- Update API to use DB data with static fallback
- Update README with complete documentation
New files:
- backend/app/services/tld_scraper/ (scraper package)
- TLD_TRACKING_PLAN.md (implementation plan)
API changes:
- POST /admin/scrape-tld-prices - trigger manual scrape
- GET /admin/tld-prices/stats - database statistics
- GET /tld-prices/overview now uses DB data