refactor: Rename Command Center to Terminal (Sprint 1)
- Renamed /command/* routes to /terminal/* - Renamed CommandCenterLayout to TerminalLayout - Updated all internal links - Added permanent redirects from /command/* to /terminal/* - Updated Sidebar navigation - Added concept docs (pounce_*.md)
This commit is contained in:
@ -40,12 +40,12 @@
|
||||
|
||||
## ✅ Master-Checkliste
|
||||
|
||||
### Phase 1: Umbenennung & Routing
|
||||
- [ ] 1.1 Route `/command` → `/terminal` umbenennen
|
||||
- [ ] 1.2 `CommandCenterLayout` → `TerminalLayout` umbenennen
|
||||
- [ ] 1.3 Alle internen Links aktualisieren
|
||||
- [ ] 1.4 Redirect von `/command/*` → `/terminal/*` einrichten
|
||||
- [ ] 1.5 Sidebar-Navigation aktualisieren
|
||||
### Phase 1: Umbenennung & Routing ✅ ABGESCHLOSSEN
|
||||
- [x] 1.1 Route `/command` → `/terminal` umbenennen
|
||||
- [x] 1.2 `CommandCenterLayout` → `TerminalLayout` umbenennen
|
||||
- [x] 1.3 Alle internen Links aktualisieren
|
||||
- [x] 1.4 Redirect von `/command/*` → `/terminal/*` einrichten
|
||||
- [x] 1.5 Sidebar-Navigation aktualisieren
|
||||
|
||||
### Phase 2: Module neu strukturieren
|
||||
- [ ] 2.1 **RADAR** Module (Dashboard)
|
||||
|
||||
@ -3,6 +3,22 @@ const nextConfig = {
|
||||
reactStrictMode: true,
|
||||
// output: 'standalone', // Only needed for Docker deployment
|
||||
|
||||
// Redirects from old /command/* to new /terminal/*
|
||||
async redirects() {
|
||||
return [
|
||||
{
|
||||
source: '/command',
|
||||
destination: '/terminal/dashboard',
|
||||
permanent: true,
|
||||
},
|
||||
{
|
||||
source: '/command/:path*',
|
||||
destination: '/terminal/:path*',
|
||||
permanent: true,
|
||||
},
|
||||
]
|
||||
},
|
||||
|
||||
// Proxy API requests to backend
|
||||
// This ensures /api/v1/* works regardless of how the server is accessed
|
||||
async rewrites() {
|
||||
|
||||
@ -216,7 +216,7 @@ export default function BrowseListingsPage() {
|
||||
: 'Be the first to list your domain!'}
|
||||
</p>
|
||||
<Link
|
||||
href="/command/listings"
|
||||
href="/terminal/listings"
|
||||
className="inline-flex items-center gap-2 px-6 py-3 bg-accent text-background font-medium rounded-xl hover:bg-accent-hover transition-all"
|
||||
>
|
||||
<Sparkles className="w-5 h-5" />
|
||||
@ -288,7 +288,7 @@ export default function BrowseListingsPage() {
|
||||
DNS verification ensures only real owners can list.
|
||||
</p>
|
||||
<Link
|
||||
href="/command/listings"
|
||||
href="/terminal/listings"
|
||||
className="inline-flex items-center gap-2 px-6 py-3 bg-accent text-background font-medium rounded-xl hover:bg-accent-hover transition-all"
|
||||
>
|
||||
List Your Domain
|
||||
|
||||
@ -56,7 +56,7 @@ function LoginForm() {
|
||||
|
||||
// Get redirect URL from query params or localStorage (set during registration)
|
||||
const paramRedirect = searchParams.get('redirect')
|
||||
const [redirectTo, setRedirectTo] = useState(paramRedirect || '/command/dashboard')
|
||||
const [redirectTo, setRedirectTo] = useState(paramRedirect || '/terminal/dashboard')
|
||||
|
||||
// Check localStorage for redirect (set during registration before email verification)
|
||||
useEffect(() => {
|
||||
@ -125,7 +125,7 @@ function LoginForm() {
|
||||
}
|
||||
|
||||
// Generate register link with redirect preserved
|
||||
const registerLink = redirectTo !== '/command/dashboard'
|
||||
const registerLink = redirectTo !== '/terminal/dashboard'
|
||||
? `/register?redirect=${encodeURIComponent(redirectTo)}`
|
||||
: '/register'
|
||||
|
||||
|
||||
@ -4,7 +4,7 @@ import { useEffect, useState } from 'react'
|
||||
import { useRouter } from 'next/navigation'
|
||||
import { useStore } from '@/lib/store'
|
||||
import { api } from '@/lib/api'
|
||||
import { CommandCenterLayout } from '@/components/CommandCenterLayout'
|
||||
import { TerminalLayout } from '@/components/TerminalLayout'
|
||||
import {
|
||||
Search,
|
||||
Filter,
|
||||
@ -97,7 +97,7 @@ export default function MarketPage() {
|
||||
]
|
||||
|
||||
return (
|
||||
<CommandCenterLayout
|
||||
<TerminalLayout
|
||||
title="Market Scanner"
|
||||
subtitle="Live auctions from all major platforms"
|
||||
>
|
||||
@ -247,7 +247,7 @@ export default function MarketPage() {
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
</CommandCenterLayout>
|
||||
</TerminalLayout>
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
@ -12,7 +12,7 @@ function OAuthCallbackContent() {
|
||||
|
||||
useEffect(() => {
|
||||
const token = searchParams.get('token')
|
||||
const redirect = searchParams.get('redirect') || '/command/dashboard'
|
||||
const redirect = searchParams.get('redirect') || '/terminal/dashboard'
|
||||
const isNew = searchParams.get('new') === 'true'
|
||||
const error = searchParams.get('error')
|
||||
|
||||
|
||||
@ -489,7 +489,7 @@ export default function HomePage() {
|
||||
</li>
|
||||
</ul>
|
||||
<Link
|
||||
href="/command/alerts"
|
||||
href="/terminal/alerts"
|
||||
className="inline-flex items-center gap-2 px-4 py-2 border border-border text-foreground text-sm font-medium rounded-lg hover:border-accent hover:text-accent transition-all"
|
||||
>
|
||||
Set Up
|
||||
@ -536,7 +536,7 @@ export default function HomePage() {
|
||||
</li>
|
||||
</ul>
|
||||
<Link
|
||||
href="/command/portfolio"
|
||||
href="/terminal/portfolio"
|
||||
className="inline-flex items-center gap-2 px-4 py-2 border border-border text-foreground text-sm font-medium rounded-lg hover:border-accent hover:text-accent transition-all"
|
||||
>
|
||||
Manage
|
||||
@ -772,7 +772,7 @@ export default function HomePage() {
|
||||
<ArrowRight className="w-4 h-4" />
|
||||
</Link>
|
||||
<Link
|
||||
href={isAuthenticated ? "/command/dashboard" : "/register"}
|
||||
href={isAuthenticated ? "/terminal/dashboard" : "/register"}
|
||||
className="inline-flex items-center gap-2 px-8 py-4 text-foreground-muted hover:text-foreground transition-colors"
|
||||
>
|
||||
{isAuthenticated ? "Go to Dashboard" : "Start Free"}
|
||||
@ -793,7 +793,7 @@ export default function HomePage() {
|
||||
Track your first domain in under a minute. Free forever, no credit card.
|
||||
</p>
|
||||
<Link
|
||||
href={isAuthenticated ? "/command/dashboard" : "/register"}
|
||||
href={isAuthenticated ? "/terminal/dashboard" : "/register"}
|
||||
className="group inline-flex items-center gap-3 px-10 py-5 bg-accent text-background rounded-2xl
|
||||
text-lg font-semibold hover:bg-accent-hover transition-all duration-300
|
||||
shadow-[0_0_40px_rgba(16,185,129,0.2)] hover:shadow-[0_0_60px_rgba(16,185,129,0.3)]"
|
||||
|
||||
@ -142,7 +142,7 @@ export default function PricingPage() {
|
||||
}
|
||||
|
||||
if (!isPaid) {
|
||||
router.push('/command/dashboard')
|
||||
router.push('/terminal/dashboard')
|
||||
return
|
||||
}
|
||||
|
||||
@ -150,7 +150,7 @@ export default function PricingPage() {
|
||||
try {
|
||||
const response = await api.createCheckoutSession(
|
||||
planId,
|
||||
`${window.location.origin}/command/welcome?plan=${planId}`,
|
||||
`${window.location.origin}/terminal/welcome?plan=${planId}`,
|
||||
`${window.location.origin}/pricing?cancelled=true`
|
||||
)
|
||||
window.location.href = response.checkout_url
|
||||
@ -395,7 +395,7 @@ export default function PricingPage() {
|
||||
Start with Scout. It's free forever. Upgrade when you need more.
|
||||
</p>
|
||||
<Link
|
||||
href={isAuthenticated ? "/command/dashboard" : "/register"}
|
||||
href={isAuthenticated ? "/terminal/dashboard" : "/register"}
|
||||
className="btn-primary inline-flex items-center gap-2 px-6 py-3"
|
||||
>
|
||||
{isAuthenticated ? "Command Center" : "Join the Hunt"}
|
||||
|
||||
@ -62,7 +62,7 @@ function RegisterForm() {
|
||||
const [registered, setRegistered] = useState(false)
|
||||
|
||||
// Get redirect URL from query params
|
||||
const redirectTo = searchParams.get('redirect') || '/command/dashboard'
|
||||
const redirectTo = searchParams.get('redirect') || '/terminal/dashboard'
|
||||
|
||||
// Load OAuth providers
|
||||
useEffect(() => {
|
||||
@ -79,7 +79,7 @@ function RegisterForm() {
|
||||
|
||||
// Store redirect URL for after email verification
|
||||
// This will be picked up by the login page after verification
|
||||
if (redirectTo !== '/command/dashboard') {
|
||||
if (redirectTo !== '/terminal/dashboard') {
|
||||
localStorage.setItem('pounce_redirect_after_login', redirectTo)
|
||||
}
|
||||
|
||||
@ -93,7 +93,7 @@ function RegisterForm() {
|
||||
}
|
||||
|
||||
// Generate login link with redirect preserved
|
||||
const loginLink = redirectTo !== '/command/dashboard'
|
||||
const loginLink = redirectTo !== '/terminal/dashboard'
|
||||
? `/login?redirect=${encodeURIComponent(redirectTo)}`
|
||||
: '/login'
|
||||
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
import { useEffect, useState, useMemo, useCallback, memo } from 'react'
|
||||
import { useStore } from '@/lib/store'
|
||||
import { api } from '@/lib/api'
|
||||
import { CommandCenterLayout } from '@/components/CommandCenterLayout'
|
||||
import { TerminalLayout } from '@/components/TerminalLayout'
|
||||
import { PageContainer, StatCard, Badge, ActionButton } from '@/components/PremiumTable'
|
||||
import {
|
||||
Plus,
|
||||
@ -205,7 +205,7 @@ export default function SniperAlertsPage() {
|
||||
const maxAlerts = limits[tier as keyof typeof limits] || 2
|
||||
|
||||
return (
|
||||
<CommandCenterLayout
|
||||
<TerminalLayout
|
||||
title="Sniper Alerts"
|
||||
subtitle={`Hyper-personalized auction notifications (${alerts.length}/${maxAlerts})`}
|
||||
actions={
|
||||
@ -591,7 +591,7 @@ export default function SniperAlertsPage() {
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
</CommandCenterLayout>
|
||||
</TerminalLayout>
|
||||
)
|
||||
}
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
import { useEffect, useState, useMemo, useCallback, memo } from 'react'
|
||||
import { useStore } from '@/lib/store'
|
||||
import { api } from '@/lib/api'
|
||||
import { CommandCenterLayout } from '@/components/CommandCenterLayout'
|
||||
import { TerminalLayout } from '@/components/TerminalLayout'
|
||||
import {
|
||||
PremiumTable,
|
||||
Badge,
|
||||
@ -465,7 +465,7 @@ export default function AuctionsPage() {
|
||||
], [activeTab, isPaidUser, trackedDomains, trackingInProgress, handleTrackDomain, getOpportunityData])
|
||||
|
||||
return (
|
||||
<CommandCenterLayout
|
||||
<TerminalLayout
|
||||
title="Auctions"
|
||||
subtitle={subtitle}
|
||||
actions={
|
||||
@ -573,6 +573,6 @@ export default function AuctionsPage() {
|
||||
columns={columns}
|
||||
/>
|
||||
</PageContainer>
|
||||
</CommandCenterLayout>
|
||||
</TerminalLayout>
|
||||
)
|
||||
}
|
||||
@ -4,7 +4,7 @@ import { useEffect, useState, useMemo, useCallback } from 'react'
|
||||
import { useSearchParams } from 'next/navigation'
|
||||
import { useStore } from '@/lib/store'
|
||||
import { api } from '@/lib/api'
|
||||
import { CommandCenterLayout } from '@/components/CommandCenterLayout'
|
||||
import { TerminalLayout } from '@/components/TerminalLayout'
|
||||
import { PremiumTable, StatCard, PageContainer, Badge, SectionHeader, SearchInput, ActionButton } from '@/components/PremiumTable'
|
||||
import { Toast, useToast } from '@/components/Toast'
|
||||
import {
|
||||
@ -64,7 +64,7 @@ export default function DashboardPage() {
|
||||
useEffect(() => {
|
||||
if (searchParams.get('upgraded') === 'true') {
|
||||
showToast('Welcome to your upgraded plan! 🎉', 'success')
|
||||
window.history.replaceState({}, '', '/command/dashboard')
|
||||
window.history.replaceState({}, '', '/terminal/dashboard')
|
||||
}
|
||||
}, [searchParams])
|
||||
|
||||
@ -139,7 +139,7 @@ export default function DashboardPage() {
|
||||
}
|
||||
|
||||
return (
|
||||
<CommandCenterLayout
|
||||
<TerminalLayout
|
||||
title={`${greeting}${user?.name ? `, ${user.name.split(' ')[0]}` : ''}`}
|
||||
subtitle={subtitle}
|
||||
>
|
||||
@ -185,14 +185,14 @@ export default function DashboardPage() {
|
||||
|
||||
{/* Stats Overview */}
|
||||
<div className="grid grid-cols-2 lg:grid-cols-4 gap-4">
|
||||
<Link href="/command/watchlist" className="group">
|
||||
<Link href="/terminal/watchlist" className="group">
|
||||
<StatCard
|
||||
title="Domains Watched"
|
||||
value={totalDomains}
|
||||
icon={Eye}
|
||||
/>
|
||||
</Link>
|
||||
<Link href="/command/watchlist?filter=available" className="group">
|
||||
<Link href="/terminal/watchlist?filter=available" className="group">
|
||||
<StatCard
|
||||
title="Available Now"
|
||||
value={availableDomains.length}
|
||||
@ -200,7 +200,7 @@ export default function DashboardPage() {
|
||||
accent={availableDomains.length > 0}
|
||||
/>
|
||||
</Link>
|
||||
<Link href="/command/portfolio" className="group">
|
||||
<Link href="/terminal/portfolio" className="group">
|
||||
<StatCard
|
||||
title="Portfolio"
|
||||
value={0}
|
||||
@ -225,7 +225,7 @@ export default function DashboardPage() {
|
||||
icon={Activity}
|
||||
compact
|
||||
action={
|
||||
<Link href="/command/watchlist" className="text-sm text-accent hover:text-accent/80 transition-colors">
|
||||
<Link href="/terminal/watchlist" className="text-sm text-accent hover:text-accent/80 transition-colors">
|
||||
View all →
|
||||
</Link>
|
||||
}
|
||||
@ -291,7 +291,7 @@ export default function DashboardPage() {
|
||||
icon={Gavel}
|
||||
compact
|
||||
action={
|
||||
<Link href="/command/auctions" className="text-sm text-accent hover:text-accent/80 transition-colors">
|
||||
<Link href="/terminal/auctions" className="text-sm text-accent hover:text-accent/80 transition-colors">
|
||||
View all →
|
||||
</Link>
|
||||
}
|
||||
@ -349,7 +349,7 @@ export default function DashboardPage() {
|
||||
icon={TrendingUp}
|
||||
compact
|
||||
action={
|
||||
<Link href="/command/pricing" className="text-sm text-accent hover:text-accent/80 transition-colors">
|
||||
<Link href="/terminal/pricing" className="text-sm text-accent hover:text-accent/80 transition-colors">
|
||||
View all →
|
||||
</Link>
|
||||
}
|
||||
@ -398,6 +398,6 @@ export default function DashboardPage() {
|
||||
</div>
|
||||
</div>
|
||||
</PageContainer>
|
||||
</CommandCenterLayout>
|
||||
</TerminalLayout>
|
||||
)
|
||||
}
|
||||
@ -4,7 +4,7 @@ import { useEffect, useState, useMemo, useCallback } from 'react'
|
||||
import { useSearchParams } from 'next/navigation'
|
||||
import { useStore } from '@/lib/store'
|
||||
import { api } from '@/lib/api'
|
||||
import { CommandCenterLayout } from '@/components/CommandCenterLayout'
|
||||
import { TerminalLayout } from '@/components/TerminalLayout'
|
||||
import { PageContainer, StatCard, Badge, ActionButton } from '@/components/PremiumTable'
|
||||
import {
|
||||
Plus,
|
||||
@ -232,7 +232,7 @@ export default function MyListingsPage() {
|
||||
const maxListings = limits[tier as keyof typeof limits] || 2
|
||||
|
||||
return (
|
||||
<CommandCenterLayout
|
||||
<TerminalLayout
|
||||
title="My Listings"
|
||||
subtitle={`Manage your domains for sale • ${listings.length}/${maxListings} slots used`}
|
||||
actions={
|
||||
@ -577,6 +577,6 @@ export default function MyListingsPage() {
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
</CommandCenterLayout>
|
||||
</TerminalLayout>
|
||||
)
|
||||
}
|
||||
@ -2,7 +2,7 @@
|
||||
|
||||
import { useEffect, useState, useMemo, useCallback } from 'react'
|
||||
import { api } from '@/lib/api'
|
||||
import { CommandCenterLayout } from '@/components/CommandCenterLayout'
|
||||
import { TerminalLayout } from '@/components/TerminalLayout'
|
||||
import {
|
||||
PageContainer,
|
||||
StatCard,
|
||||
@ -114,11 +114,11 @@ export default function CommandMarketplacePage() {
|
||||
}, [listings])
|
||||
|
||||
return (
|
||||
<CommandCenterLayout
|
||||
<TerminalLayout
|
||||
title="Marketplace"
|
||||
subtitle={`${listings.length} premium domains for sale`}
|
||||
actions={
|
||||
<Link href="/command/listings">
|
||||
<Link href="/terminal/listings">
|
||||
<ActionButton icon={Tag} variant="secondary">My Listings</ActionButton>
|
||||
</Link>
|
||||
}
|
||||
@ -233,7 +233,7 @@ export default function CommandMarketplacePage() {
|
||||
: 'No domains are currently listed for sale'}
|
||||
</p>
|
||||
<Link
|
||||
href="/command/listings"
|
||||
href="/terminal/listings"
|
||||
className="inline-flex items-center gap-2 px-6 py-3 bg-accent text-background font-medium rounded-xl hover:bg-accent-hover transition-all"
|
||||
>
|
||||
<Tag className="w-5 h-5" />
|
||||
@ -296,7 +296,7 @@ export default function CommandMarketplacePage() {
|
||||
</div>
|
||||
)}
|
||||
</PageContainer>
|
||||
</CommandCenterLayout>
|
||||
</TerminalLayout>
|
||||
)
|
||||
}
|
||||
|
||||
@ -7,7 +7,7 @@ export default function CommandPage() {
|
||||
const router = useRouter()
|
||||
|
||||
useEffect(() => {
|
||||
router.replace('/command/dashboard')
|
||||
router.replace('/terminal/dashboard')
|
||||
}, [router])
|
||||
|
||||
return (
|
||||
@ -3,7 +3,7 @@
|
||||
import { useEffect, useState, useMemo, useCallback, memo } from 'react'
|
||||
import { useStore } from '@/lib/store'
|
||||
import { api, PortfolioDomain, PortfolioSummary, DomainValuation, DomainHealthReport, HealthStatus } from '@/lib/api'
|
||||
import { CommandCenterLayout } from '@/components/CommandCenterLayout'
|
||||
import { TerminalLayout } from '@/components/TerminalLayout'
|
||||
import { PremiumTable, StatCard, PageContainer, ActionButton } from '@/components/PremiumTable'
|
||||
import { Toast, useToast } from '@/components/Toast'
|
||||
import {
|
||||
@ -277,7 +277,7 @@ export default function PortfolioPage() {
|
||||
}, [portfolio, loading])
|
||||
|
||||
return (
|
||||
<CommandCenterLayout
|
||||
<TerminalLayout
|
||||
title="Portfolio"
|
||||
subtitle={subtitle}
|
||||
actions={
|
||||
@ -464,7 +464,7 @@ export default function PortfolioPage() {
|
||||
</button>
|
||||
<div className="my-1 border-t border-border/30" />
|
||||
<Link
|
||||
href={`/command/listings?domain=${encodeURIComponent(domain.domain)}`}
|
||||
href={`/terminal/listings?domain=${encodeURIComponent(domain.domain)}`}
|
||||
onClick={() => setOpenMenuId(null)}
|
||||
className="w-full flex items-center gap-3 px-4 py-2.5 text-sm text-accent hover:bg-accent/5 transition-colors"
|
||||
>
|
||||
@ -721,7 +721,7 @@ export default function PortfolioPage() {
|
||||
onClose={() => setSelectedHealthDomain(null)}
|
||||
/>
|
||||
)}
|
||||
</CommandCenterLayout>
|
||||
</TerminalLayout>
|
||||
)
|
||||
}
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
|
||||
import { useEffect, useState, useMemo, useRef } from 'react'
|
||||
import { useParams } from 'next/navigation'
|
||||
import { CommandCenterLayout } from '@/components/CommandCenterLayout'
|
||||
import { TerminalLayout } from '@/components/TerminalLayout'
|
||||
import { PageContainer, StatCard } from '@/components/PremiumTable'
|
||||
import { useStore } from '@/lib/store'
|
||||
import { api } from '@/lib/api'
|
||||
@ -356,19 +356,19 @@ export default function CommandTldDetailPage() {
|
||||
|
||||
if (loading) {
|
||||
return (
|
||||
<CommandCenterLayout title={`.${tld}`} subtitle="Loading...">
|
||||
<TerminalLayout title={`.${tld}`} subtitle="Loading...">
|
||||
<PageContainer>
|
||||
<div className="flex items-center justify-center py-20">
|
||||
<RefreshCw className="w-6 h-6 text-accent animate-spin" />
|
||||
</div>
|
||||
</PageContainer>
|
||||
</CommandCenterLayout>
|
||||
</TerminalLayout>
|
||||
)
|
||||
}
|
||||
|
||||
if (error || !details) {
|
||||
return (
|
||||
<CommandCenterLayout title="TLD Not Found" subtitle="Error loading data">
|
||||
<TerminalLayout title="TLD Not Found" subtitle="Error loading data">
|
||||
<PageContainer>
|
||||
<div className="text-center py-20">
|
||||
<div className="w-16 h-16 bg-background-secondary rounded-full flex items-center justify-center mx-auto mb-6">
|
||||
@ -377,7 +377,7 @@ export default function CommandTldDetailPage() {
|
||||
<h1 className="text-xl font-medium text-foreground mb-2">TLD Not Found</h1>
|
||||
<p className="text-foreground-muted mb-8">{error || `The TLD .${tld} could not be found.`}</p>
|
||||
<Link
|
||||
href="/command/pricing"
|
||||
href="/terminal/pricing"
|
||||
className="inline-flex items-center gap-2 px-6 py-3 bg-accent text-background rounded-xl font-medium hover:bg-accent-hover transition-all"
|
||||
>
|
||||
<ArrowLeft className="w-4 h-4" />
|
||||
@ -385,19 +385,19 @@ export default function CommandTldDetailPage() {
|
||||
</Link>
|
||||
</div>
|
||||
</PageContainer>
|
||||
</CommandCenterLayout>
|
||||
</TerminalLayout>
|
||||
)
|
||||
}
|
||||
|
||||
return (
|
||||
<CommandCenterLayout
|
||||
<TerminalLayout
|
||||
title={`.${details.tld}`}
|
||||
subtitle={details.description}
|
||||
>
|
||||
<PageContainer>
|
||||
{/* Breadcrumb */}
|
||||
<nav className="flex items-center gap-2 text-sm mb-6">
|
||||
<Link href="/command/pricing" className="text-foreground-subtle hover:text-foreground transition-colors">
|
||||
<Link href="/terminal/pricing" className="text-foreground-subtle hover:text-foreground transition-colors">
|
||||
TLD Pricing
|
||||
</Link>
|
||||
<ChevronRight className="w-3.5 h-3.5 text-foreground-subtle" />
|
||||
@ -716,6 +716,6 @@ export default function CommandTldDetailPage() {
|
||||
</div>
|
||||
</div>
|
||||
</PageContainer>
|
||||
</CommandCenterLayout>
|
||||
</TerminalLayout>
|
||||
)
|
||||
}
|
||||
@ -3,7 +3,7 @@
|
||||
import { useEffect, useState, useMemo, useCallback, memo } from 'react'
|
||||
import { useStore } from '@/lib/store'
|
||||
import { api } from '@/lib/api'
|
||||
import { CommandCenterLayout } from '@/components/CommandCenterLayout'
|
||||
import { TerminalLayout } from '@/components/TerminalLayout'
|
||||
import {
|
||||
PremiumTable,
|
||||
StatCard,
|
||||
@ -303,7 +303,7 @@ export default function TLDPricingPage() {
|
||||
], [])
|
||||
|
||||
return (
|
||||
<CommandCenterLayout
|
||||
<TerminalLayout
|
||||
title="TLD Pricing"
|
||||
subtitle={subtitle}
|
||||
actions={
|
||||
@ -352,7 +352,7 @@ export default function TLDPricingPage() {
|
||||
data={sortedData}
|
||||
keyExtractor={(tld) => tld.tld}
|
||||
loading={loading}
|
||||
onRowClick={(tld) => window.location.href = `/command/pricing/${tld.tld}`}
|
||||
onRowClick={(tld) => window.location.href = `/terminal/pricing/${tld.tld}`}
|
||||
emptyIcon={<Globe className="w-12 h-12 text-foreground-subtle" />}
|
||||
emptyTitle="No TLDs found"
|
||||
emptyDescription={searchQuery ? `No TLDs matching "${searchQuery}"` : "Check back later for TLD data"}
|
||||
@ -382,6 +382,6 @@ export default function TLDPricingPage() {
|
||||
</div>
|
||||
)}
|
||||
</PageContainer>
|
||||
</CommandCenterLayout>
|
||||
</TerminalLayout>
|
||||
)
|
||||
}
|
||||
@ -3,7 +3,7 @@
|
||||
import { useEffect, useState } from 'react'
|
||||
import { useStore } from '@/lib/store'
|
||||
import { api } from '@/lib/api'
|
||||
import { CommandCenterLayout } from '@/components/CommandCenterLayout'
|
||||
import { TerminalLayout } from '@/components/TerminalLayout'
|
||||
import { PageContainer, StatCard, Badge } from '@/components/PremiumTable'
|
||||
import {
|
||||
Search,
|
||||
@ -154,7 +154,7 @@ export default function SEOPage() {
|
||||
// Show upgrade prompt for non-Tycoon users
|
||||
if (!isTycoon) {
|
||||
return (
|
||||
<CommandCenterLayout
|
||||
<TerminalLayout
|
||||
title="SEO Juice Detector"
|
||||
subtitle="Backlink analysis & domain authority"
|
||||
>
|
||||
@ -197,12 +197,12 @@ export default function SEOPage() {
|
||||
</Link>
|
||||
</div>
|
||||
</PageContainer>
|
||||
</CommandCenterLayout>
|
||||
</TerminalLayout>
|
||||
)
|
||||
}
|
||||
|
||||
return (
|
||||
<CommandCenterLayout
|
||||
<TerminalLayout
|
||||
title="SEO Juice Detector"
|
||||
subtitle="Analyze backlinks, domain authority & find hidden SEO gems"
|
||||
>
|
||||
@ -502,7 +502,7 @@ export default function SEOPage() {
|
||||
</div>
|
||||
)}
|
||||
</PageContainer>
|
||||
</CommandCenterLayout>
|
||||
</TerminalLayout>
|
||||
)
|
||||
}
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
|
||||
import { useEffect, useState, useCallback, useMemo } from 'react'
|
||||
import { useRouter } from 'next/navigation'
|
||||
import { CommandCenterLayout } from '@/components/CommandCenterLayout'
|
||||
import { TerminalLayout } from '@/components/TerminalLayout'
|
||||
import { PageContainer, TabBar } from '@/components/PremiumTable'
|
||||
import { useStore } from '@/lib/store'
|
||||
import { api, PriceAlert } from '@/lib/api'
|
||||
@ -178,7 +178,7 @@ export default function SettingsPage() {
|
||||
]
|
||||
|
||||
return (
|
||||
<CommandCenterLayout
|
||||
<TerminalLayout
|
||||
title="Settings"
|
||||
subtitle="Manage your account"
|
||||
>
|
||||
@ -360,7 +360,7 @@ export default function SettingsPage() {
|
||||
<div className="py-12 text-center border border-dashed border-border/50 rounded-xl bg-foreground/5">
|
||||
<Bell className="w-10 h-10 text-foreground-subtle mx-auto mb-4" />
|
||||
<p className="text-foreground-muted mb-3">No price alerts set</p>
|
||||
<Link href="/command/pricing" className="text-accent hover:text-accent/80 text-sm font-medium">
|
||||
<Link href="/terminal/pricing" className="text-accent hover:text-accent/80 text-sm font-medium">
|
||||
Browse TLD prices →
|
||||
</Link>
|
||||
</div>
|
||||
@ -558,6 +558,6 @@ export default function SettingsPage() {
|
||||
</div>
|
||||
</div>
|
||||
</PageContainer>
|
||||
</CommandCenterLayout>
|
||||
</TerminalLayout>
|
||||
)
|
||||
}
|
||||
@ -3,7 +3,7 @@
|
||||
import { useEffect, useState, useMemo, useCallback, memo } from 'react'
|
||||
import { useStore } from '@/lib/store'
|
||||
import { api, DomainHealthReport, HealthStatus } from '@/lib/api'
|
||||
import { CommandCenterLayout } from '@/components/CommandCenterLayout'
|
||||
import { TerminalLayout } from '@/components/TerminalLayout'
|
||||
import {
|
||||
PremiumTable,
|
||||
Badge,
|
||||
@ -335,7 +335,7 @@ export default function WatchlistPage() {
|
||||
], [healthReports, togglingNotifyId, loadingHealth, refreshingId, deletingId, handleToggleNotify, handleHealthCheck, handleRefresh, handleDelete])
|
||||
|
||||
return (
|
||||
<CommandCenterLayout title="Watchlist" subtitle={subtitle}>
|
||||
<TerminalLayout title="Watchlist" subtitle={subtitle}>
|
||||
{toast && <Toast message={toast.message} type={toast.type} onClose={hideToast} />}
|
||||
|
||||
<PageContainer>
|
||||
@ -411,7 +411,7 @@ export default function WatchlistPage() {
|
||||
/>
|
||||
)}
|
||||
</PageContainer>
|
||||
</CommandCenterLayout>
|
||||
</TerminalLayout>
|
||||
)
|
||||
}
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
|
||||
import { useEffect, useState } from 'react'
|
||||
import { useRouter, useSearchParams } from 'next/navigation'
|
||||
import { CommandCenterLayout } from '@/components/CommandCenterLayout'
|
||||
import { TerminalLayout } from '@/components/TerminalLayout'
|
||||
import { PageContainer } from '@/components/PremiumTable'
|
||||
import { useStore } from '@/lib/store'
|
||||
import {
|
||||
@ -34,9 +34,9 @@ const planDetails = {
|
||||
{ icon: BarChart3, text: 'Deal scores & valuations', description: 'Know what domains are worth' },
|
||||
],
|
||||
nextSteps: [
|
||||
{ href: '/command/watchlist', label: 'Add domains to watchlist', icon: Eye },
|
||||
{ href: '/command/alerts', label: 'Set up Sniper Alerts', icon: Bell },
|
||||
{ href: '/command/portfolio', label: 'Track your portfolio', icon: BarChart3 },
|
||||
{ href: '/terminal/watchlist', label: 'Add domains to watchlist', icon: Eye },
|
||||
{ href: '/terminal/alerts', label: 'Set up Sniper Alerts', icon: Bell },
|
||||
{ href: '/terminal/portfolio', label: 'Track your portfolio', icon: BarChart3 },
|
||||
],
|
||||
},
|
||||
tycoon: {
|
||||
@ -52,9 +52,9 @@ const planDetails = {
|
||||
{ icon: Sparkles, text: 'SEO Juice Detector', description: 'Find domains with backlinks' },
|
||||
],
|
||||
nextSteps: [
|
||||
{ href: '/command/watchlist', label: 'Add domains to watchlist', icon: Eye },
|
||||
{ href: '/command/seo', label: 'Analyze SEO metrics', icon: Sparkles },
|
||||
{ href: '/command/alerts', label: 'Create Sniper Alerts', icon: Bell },
|
||||
{ href: '/terminal/watchlist', label: 'Add domains to watchlist', icon: Eye },
|
||||
{ href: '/terminal/seo', label: 'Analyze SEO metrics', icon: Sparkles },
|
||||
{ href: '/terminal/alerts', label: 'Create Sniper Alerts', icon: Bell },
|
||||
],
|
||||
},
|
||||
}
|
||||
@ -84,18 +84,18 @@ export default function WelcomePage() {
|
||||
|
||||
if (loading) {
|
||||
return (
|
||||
<CommandCenterLayout title="Welcome" subtitle="Loading your new plan...">
|
||||
<TerminalLayout title="Welcome" subtitle="Loading your new plan...">
|
||||
<PageContainer>
|
||||
<div className="flex items-center justify-center py-20">
|
||||
<div className="w-8 h-8 border-2 border-accent border-t-transparent rounded-full animate-spin" />
|
||||
</div>
|
||||
</PageContainer>
|
||||
</CommandCenterLayout>
|
||||
</TerminalLayout>
|
||||
)
|
||||
}
|
||||
|
||||
return (
|
||||
<CommandCenterLayout title="Welcome" subtitle="Your upgrade is complete">
|
||||
<TerminalLayout title="Welcome" subtitle="Your upgrade is complete">
|
||||
<PageContainer>
|
||||
{/* Confetti Effect */}
|
||||
{showConfetti && (
|
||||
@ -188,7 +188,7 @@ export default function WelcomePage() {
|
||||
{/* Go to Dashboard */}
|
||||
<div className="text-center">
|
||||
<Link
|
||||
href="/command/dashboard"
|
||||
href="/terminal/dashboard"
|
||||
className="inline-flex items-center gap-2 px-8 py-4 bg-accent text-background font-medium rounded-xl
|
||||
hover:bg-accent-hover transition-all shadow-lg shadow-accent/20"
|
||||
>
|
||||
@ -215,7 +215,7 @@ export default function WelcomePage() {
|
||||
}
|
||||
}
|
||||
`}</style>
|
||||
</CommandCenterLayout>
|
||||
</TerminalLayout>
|
||||
)
|
||||
}
|
||||
|
||||
@ -1170,7 +1170,7 @@ export default function TldDetailPage() {
|
||||
Monitor specific domains and get instant notifications when they become available.
|
||||
</p>
|
||||
<Link
|
||||
href={isAuthenticated ? '/command' : '/register'}
|
||||
href={isAuthenticated ? '/terminal' : '/register'}
|
||||
className="inline-flex items-center gap-2 px-8 py-4 bg-foreground text-background text-ui font-medium rounded-xl hover:bg-foreground/90 transition-all"
|
||||
>
|
||||
{isAuthenticated ? 'Go to Command Center' : 'Start Monitoring Free'}
|
||||
|
||||
@ -91,7 +91,7 @@ export function AdminLayout({
|
||||
<h1 className="text-xl font-semibold text-foreground mb-2">Access Denied</h1>
|
||||
<p className="text-foreground-muted mb-4">Admin privileges required</p>
|
||||
<button
|
||||
onClick={() => router.push('/command/dashboard')}
|
||||
onClick={() => router.push('/terminal/dashboard')}
|
||||
className="px-4 py-2 bg-accent text-background rounded-lg font-medium"
|
||||
>
|
||||
Go to Dashboard
|
||||
@ -286,7 +286,7 @@ function AdminSidebar({
|
||||
<div className="border-t border-border/30 py-4 px-3 space-y-2">
|
||||
{/* Back to User Dashboard */}
|
||||
<Link
|
||||
href="/command/dashboard"
|
||||
href="/terminal/dashboard"
|
||||
className={clsx(
|
||||
"flex items-center gap-3 px-3 py-3 rounded-xl transition-all duration-300",
|
||||
"text-accent hover:bg-accent/10 border border-transparent hover:border-accent/20"
|
||||
|
||||
@ -152,7 +152,7 @@ export function DomainChecker() {
|
||||
Grab it now or track it in your watchlist.
|
||||
</p>
|
||||
<Link
|
||||
href={isAuthenticated ? '/command/dashboard' : '/register'}
|
||||
href={isAuthenticated ? '/terminal/dashboard' : '/register'}
|
||||
className="shrink-0 flex items-center justify-center sm:justify-start gap-2 px-5 py-2.5
|
||||
bg-accent text-background text-ui font-medium rounded-lg
|
||||
hover:bg-accent-hover transition-all duration-300"
|
||||
@ -268,7 +268,7 @@ export function DomainChecker() {
|
||||
<span className="text-left">We'll alert you the moment it drops.</span>
|
||||
</div>
|
||||
<Link
|
||||
href={isAuthenticated ? '/command/dashboard' : '/register'}
|
||||
href={isAuthenticated ? '/terminal/dashboard' : '/register'}
|
||||
className="shrink-0 flex items-center justify-center sm:justify-start gap-2 px-4 py-2.5
|
||||
bg-background-tertiary text-foreground text-ui font-medium rounded-lg
|
||||
border border-border hover:border-border-hover transition-all duration-300"
|
||||
|
||||
@ -79,7 +79,7 @@ export function Footer() {
|
||||
</li>
|
||||
{isAuthenticated ? (
|
||||
<li>
|
||||
<Link href="/command/dashboard" className="text-body-sm text-accent hover:text-accent-hover transition-colors">
|
||||
<Link href="/terminal/dashboard" className="text-body-sm text-accent hover:text-accent-hover transition-colors">
|
||||
Command Center
|
||||
</Link>
|
||||
</li>
|
||||
|
||||
@ -23,7 +23,7 @@ import clsx from 'clsx'
|
||||
* - Public pages (pricing, about, contact, blog, etc.)
|
||||
* - Auth pages (login, register)
|
||||
*
|
||||
* For logged-in users in the Command Center, use CommandCenterLayout instead.
|
||||
* For logged-in users in the Command Center, use TerminalLayout instead.
|
||||
*/
|
||||
export function Header() {
|
||||
const pathname = usePathname()
|
||||
@ -51,7 +51,7 @@ export function Header() {
|
||||
}
|
||||
|
||||
// Check if we're on a Command Center page (should use Sidebar instead)
|
||||
const isCommandCenterPage = pathname.startsWith('/command') || pathname.startsWith('/admin')
|
||||
const isCommandCenterPage = pathname.startsWith('/terminal') || pathname.startsWith('/admin')
|
||||
|
||||
// If logged in and on Command Center page, don't render this header
|
||||
if (isAuthenticated && isCommandCenterPage) {
|
||||
@ -101,7 +101,7 @@ export function Header() {
|
||||
<>
|
||||
{/* Go to Command Center */}
|
||||
<Link
|
||||
href="/command/dashboard"
|
||||
href="/terminal/dashboard"
|
||||
className="flex items-center gap-2 h-9 px-4 text-[0.8125rem] bg-accent text-background
|
||||
rounded-lg font-medium hover:bg-accent-hover transition-all duration-200"
|
||||
>
|
||||
@ -164,7 +164,7 @@ export function Header() {
|
||||
{isAuthenticated ? (
|
||||
<>
|
||||
<Link
|
||||
href="/command/dashboard"
|
||||
href="/terminal/dashboard"
|
||||
className="flex items-center gap-3 px-4 py-3 text-body-sm text-center bg-accent text-background
|
||||
rounded-xl font-medium hover:bg-accent-hover transition-all duration-200"
|
||||
>
|
||||
|
||||
@ -77,19 +77,19 @@ export function Sidebar({ collapsed: controlledCollapsed, onCollapsedChange }: S
|
||||
// SECTION 1: Discover - External market data
|
||||
const discoverItems = [
|
||||
{
|
||||
href: '/command/auctions',
|
||||
href: '/terminal/auctions',
|
||||
label: 'Auctions',
|
||||
icon: Gavel,
|
||||
badge: null,
|
||||
},
|
||||
{
|
||||
href: '/command/marketplace',
|
||||
href: '/terminal/marketplace',
|
||||
label: 'Marketplace',
|
||||
icon: Tag,
|
||||
badge: null,
|
||||
},
|
||||
{
|
||||
href: '/command/pricing',
|
||||
href: '/terminal/pricing',
|
||||
label: 'TLD Pricing',
|
||||
icon: TrendingUp,
|
||||
badge: null,
|
||||
@ -105,37 +105,37 @@ export function Sidebar({ collapsed: controlledCollapsed, onCollapsedChange }: S
|
||||
tycoonOnly?: boolean
|
||||
}> = [
|
||||
{
|
||||
href: '/command/dashboard',
|
||||
href: '/terminal/dashboard',
|
||||
label: 'Dashboard',
|
||||
icon: LayoutDashboard,
|
||||
badge: null,
|
||||
},
|
||||
{
|
||||
href: '/command/watchlist',
|
||||
href: '/terminal/watchlist',
|
||||
label: 'Watchlist',
|
||||
icon: Eye,
|
||||
badge: availableCount || null,
|
||||
},
|
||||
{
|
||||
href: '/command/portfolio',
|
||||
href: '/terminal/portfolio',
|
||||
label: 'Portfolio',
|
||||
icon: Briefcase,
|
||||
badge: null,
|
||||
},
|
||||
{
|
||||
href: '/command/listings',
|
||||
href: '/terminal/listings',
|
||||
label: 'My Listings',
|
||||
icon: Tag,
|
||||
badge: null,
|
||||
},
|
||||
{
|
||||
href: '/command/alerts',
|
||||
href: '/terminal/alerts',
|
||||
label: 'Sniper Alerts',
|
||||
icon: Target,
|
||||
badge: null,
|
||||
},
|
||||
{
|
||||
href: '/command/seo',
|
||||
href: '/terminal/seo',
|
||||
label: 'SEO Juice',
|
||||
icon: Link2,
|
||||
badge: null,
|
||||
@ -144,11 +144,11 @@ export function Sidebar({ collapsed: controlledCollapsed, onCollapsedChange }: S
|
||||
]
|
||||
|
||||
const bottomItems = [
|
||||
{ href: '/command/settings', label: 'Settings', icon: Settings },
|
||||
{ href: '/terminal/settings', label: 'Settings', icon: Settings },
|
||||
]
|
||||
|
||||
const isActive = (href: string) => {
|
||||
if (href === '/command/dashboard') return pathname === '/command/dashboard' || pathname === '/command'
|
||||
if (href === '/terminal/dashboard') return pathname === '/terminal/dashboard' || pathname === '/terminal'
|
||||
return pathname.startsWith(href)
|
||||
}
|
||||
|
||||
|
||||
@ -9,19 +9,19 @@ import { Bell, Search, X, Command } from 'lucide-react'
|
||||
import Link from 'next/link'
|
||||
import clsx from 'clsx'
|
||||
|
||||
interface CommandCenterLayoutProps {
|
||||
interface TerminalLayoutProps {
|
||||
children: React.ReactNode
|
||||
title?: string
|
||||
subtitle?: string
|
||||
actions?: React.ReactNode
|
||||
}
|
||||
|
||||
export function CommandCenterLayout({
|
||||
export function TerminalLayout({
|
||||
children,
|
||||
title,
|
||||
subtitle,
|
||||
actions
|
||||
}: CommandCenterLayoutProps) {
|
||||
}: TerminalLayoutProps) {
|
||||
const router = useRouter()
|
||||
const { isAuthenticated, isLoading, checkAuth, domains } = useStore()
|
||||
const [sidebarCollapsed, setSidebarCollapsed] = useState(false)
|
||||
@ -70,7 +70,7 @@ export function CommandCenterLayout({
|
||||
<div className="min-h-screen flex items-center justify-center bg-background">
|
||||
<div className="flex flex-col items-center gap-4">
|
||||
<div className="w-8 h-8 border-2 border-accent border-t-transparent rounded-full animate-spin" />
|
||||
<p className="text-sm text-foreground-muted">Loading Command Center...</p>
|
||||
<p className="text-sm text-foreground-muted">Loading Terminal...</p>
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
@ -182,7 +182,7 @@ export function CommandCenterLayout({
|
||||
{availableDomains.slice(0, 5).map((domain) => (
|
||||
<Link
|
||||
key={domain.id}
|
||||
href="/command/watchlist"
|
||||
href="/terminal/watchlist"
|
||||
onClick={() => setNotificationsOpen(false)}
|
||||
className="flex items-start gap-3 p-3 hover:bg-foreground/5 rounded-lg transition-colors"
|
||||
>
|
||||
@ -239,12 +239,12 @@ export function useUserShortcuts() {
|
||||
useEffect(() => {
|
||||
const userShortcuts: Shortcut[] = [
|
||||
// Navigation
|
||||
{ key: 'g', label: 'Go to Dashboard', description: 'Navigate to dashboard', action: () => router.push('/command/dashboard'), category: 'navigation' },
|
||||
{ key: 'w', label: 'Go to Watchlist', description: 'Navigate to watchlist', action: () => router.push('/command/watchlist'), category: 'navigation' },
|
||||
{ key: 'p', label: 'Go to Portfolio', description: 'Navigate to portfolio', action: () => router.push('/command/portfolio'), category: 'navigation' },
|
||||
{ key: 'a', label: 'Go to Auctions', description: 'Navigate to auctions', action: () => router.push('/command/auctions'), category: 'navigation' },
|
||||
{ key: 't', label: 'Go to TLD Pricing', description: 'Navigate to TLD pricing', action: () => router.push('/command/pricing'), category: 'navigation' },
|
||||
{ key: 's', label: 'Go to Settings', description: 'Navigate to settings', action: () => router.push('/command/settings'), category: 'navigation' },
|
||||
{ key: 'g', label: 'Go to Dashboard', description: 'Navigate to dashboard', action: () => router.push('/terminal/dashboard'), category: 'navigation' },
|
||||
{ key: 'w', label: 'Go to Watchlist', description: 'Navigate to watchlist', action: () => router.push('/terminal/watchlist'), category: 'navigation' },
|
||||
{ key: 'p', label: 'Go to Portfolio', description: 'Navigate to portfolio', action: () => router.push('/terminal/portfolio'), category: 'navigation' },
|
||||
{ key: 'a', label: 'Go to Auctions', description: 'Navigate to auctions', action: () => router.push('/terminal/auctions'), category: 'navigation' },
|
||||
{ key: 't', label: 'Go to TLD Pricing', description: 'Navigate to TLD pricing', action: () => router.push('/terminal/pricing'), category: 'navigation' },
|
||||
{ key: 's', label: 'Go to Settings', description: 'Navigate to settings', action: () => router.push('/terminal/settings'), category: 'navigation' },
|
||||
// Actions
|
||||
{ key: 'n', label: 'Add Domain', description: 'Quick add a new domain', action: () => document.querySelector<HTMLInputElement>('input[placeholder*="domain"]')?.focus(), category: 'actions' },
|
||||
{ key: 'k', label: 'Search', description: 'Focus search input', action: () => document.querySelector<HTMLInputElement>('input[type="text"]')?.focus(), category: 'actions', requiresModifier: true },
|
||||
@ -281,7 +281,7 @@ export function useAdminShortcuts() {
|
||||
{ key: 'e', label: 'Export', description: 'Export current data', action: () => {}, category: 'actions' },
|
||||
// Global
|
||||
{ key: '?', label: 'Show Shortcuts', description: 'Display this help', action: () => setShowHelp(true), category: 'global' },
|
||||
{ key: 'd', label: 'Back to Dashboard', description: 'Return to user dashboard', action: () => router.push('/command/dashboard'), category: 'global' },
|
||||
{ key: 'd', label: 'Back to Dashboard', description: 'Return to user dashboard', action: () => router.push('/terminal/dashboard'), category: 'global' },
|
||||
]
|
||||
|
||||
adminShortcuts.forEach(registerShortcut)
|
||||
|
||||
180
pounce_features.md
Normal file
180
pounce_features.md
Normal file
@ -0,0 +1,180 @@
|
||||
Auf gar keinen Fall löschen! 🛑
|
||||
|
||||
Du hast bereits das Fundament gegossen. Das wäre Wahnsinn, das wegzuradieren.
|
||||
|
||||
Der "Milliarden-Plan" bedeutet nicht, dass deine jetzige Arbeit wertlos ist. Er bedeutet nur, dass wir deine **bestehenden Features neu ausrichten**, damit sie strategisch in Phase 1 ("Intelligence") passen.
|
||||
|
||||
Wir nehmen deine **aktuellen Bausteine** und setzen sie nur anders zusammen. Hier ist der Plan, was du behältst, was du versteckst und wie du es nutzt:
|
||||
|
||||
---
|
||||
|
||||
### 1. Feature: TLD Prices & Trends
|
||||
|
||||
*Status:* Du hast bereits die Daten und die Charts.
|
||||
|
||||
- **Behalten?** **JA, unbedingt!**
|
||||
- **Warum:** Das ist dein **Traffic-Magnet (SEO)**.
|
||||
- **Die Anpassung für Phase 1:**
|
||||
- Nutze es nicht als "Preisliste", sondern als **"Markt-Barometer"**.
|
||||
- Die Seite bleibt öffentlich (Public). Sie holt die Leute von Google ("domain preisentwicklung .ai") auf deine Seite.
|
||||
- **Action:** Bau nur die Spalte "Renewal Price" ein (wie besprochen). Das war's. Code bleibt.
|
||||
|
||||
### 2. Feature: Auction Aggregator (API Daten)
|
||||
|
||||
*Status:* Du ziehst bereits Daten von GoDaddy, Sedo etc.
|
||||
|
||||
- **Behalten?** **JA.**
|
||||
- **Warum:** Auch wenn wir später *eigene* Daten (Zone Files) wollen, sind die aktuellen Auktionen **Content**. User wollen sehen, was *jetzt gerade* handelbar ist.
|
||||
- **Die Anpassung für Phase 1:**
|
||||
- **Der Filter ist alles.** Dein Code, der die Daten holt, bleibt. Aber du baust einen "Gatekeeper" davor.
|
||||
- Zeige ausgeloggten Usern nur die "schönen" Domains (kein Spam).
|
||||
- Zeige eingeloggten Usern *alles*, aber markiere Spam.
|
||||
- **Strategie:** Das ist dein "Content Filler", bis deine eigene Zone-File-Analyse steht. Es lässt die Seite lebendig wirken.
|
||||
|
||||
### 3. Feature: Watchlist / Monitoring
|
||||
|
||||
*Status:* Du kannst Domains überwachen.
|
||||
|
||||
- **Behalten?** **JA, das ist dein Kern.**
|
||||
- **Warum:** Das ist das **Retention-Feature** (warum Leute bleiben).
|
||||
- **Die Anpassung für Phase 1:**
|
||||
- Verkaufe es nicht nur als "Kauf-Alarm", sondern als "Status-Monitor".
|
||||
- Erlaube Usern, *besetzte* Domains hinzuzufügen.
|
||||
- **Action:** Das Feature ist fertig. Du musst nur das Wording ändern. Von "Sniper Tool" zu "Portfolio Watch".
|
||||
|
||||
---
|
||||
|
||||
### Was wir ändern: Die "Verpackung" (Nicht den Code)
|
||||
|
||||
Du musst nichts löschen, du musst nur **neu sortieren**. Stell dir vor, du hast ein Schweizer Taschenmesser gebaut.
|
||||
|
||||
- Vorher hast du gesagt: "Hier ist ein Messer, eine Schere und eine Säge."
|
||||
- Jetzt sagen wir: "Das ist das ultimative Survival-Kit."
|
||||
|
||||
Hier ist, wie deine *bestehenden* Features in den **Milliarden-Plan** passen:
|
||||
|
||||
### Das MVP (Minimum Viable Product) für den Launch nächste Woche:
|
||||
|
||||
1. **Lead Magnet (Kostenlos):**
|
||||
- Deine **TLD Pricing Seite** (so wie sie ist + Renewal Spalte).
|
||||
- Zieht Besucher an.
|
||||
2. **Der Hook (Teaser):**
|
||||
- Deine **Auctions Seite** (so wie sie ist, aber *aggressiv gefiltert* für ausgeloggte User).
|
||||
- Zeigt: "Hier gibt es Qualität."
|
||||
3. **Das Produkt ($9/Monat):**
|
||||
- **Clean Feed:** Zugriff auf *alle* Auktionen (dein bestehender Aggregator), aber spam-frei sortiert.
|
||||
- **Watchlist:** Deine bestehende Monitoring-Funktion.
|
||||
|
||||
### Was du *später* dazu baust (nicht löschen, sondern ergänzen):
|
||||
|
||||
- **Zone File Analyse:** Das kommt *dazu*, um unabhängiger von den APIs zu werden. Es ersetzt den Aggregator nicht sofort, sondern ergänzt ihn um "Drops", die noch nicht in Auktionen sind.
|
||||
- **Portfolio Management:** Das ist einfach nur eine Erweiterung deiner Watchlist (User fügt *eigene* Domains hinzu).
|
||||
|
||||
### Fazit: Recycling statt Abriss
|
||||
|
||||
Alles, was du gebaut hast, ist **validiert**.
|
||||
|
||||
- **TLD Preise** = Beweis für Marktkompetenz.
|
||||
- **Auktionen** = Beweis für Marktaktivität.
|
||||
- **Login/Dashboard** = Die Infrastruktur für das Abo.
|
||||
|
||||
Deine Aufgabe jetzt:
|
||||
|
||||
Lösche nichts. Nimm den Rotstift nur für das Frontend (was der User sieht).
|
||||
|
||||
- Verstecke den "Müll" in den Auktionslisten.
|
||||
- Verstecke die komplexen Details auf der Pricing-Seite hinter dem Login.
|
||||
- Mach das Interface ruhig ("Zen Mode"), aber lass die Maschine im Hintergrund laufen.
|
||||
|
||||
Du bist viel näher am Ziel, als du denkst. Du hast die Steine, du musst nur die Bauanleitung ändern.
|
||||
|
||||
Das ist kein Ballast, das ist ein **Asset**! Dass du das schon hast, ist ein riesiger Wettbewerbsvorteil.
|
||||
|
||||
Aber: Ein offener Marktplatz ("Jeder kann alles einstellen") ist der schnellste Weg, deine Plattform zu ruinieren (Spam, Betrug, schlechte Qualität).
|
||||
|
||||
Wir müssen deinen Marktplatz also strategisch als **"Exclusive Member Exchange"** positionieren. Hier ist der Plan, wie du das Feature nutzt, um Abos zu verkaufen und den Trust hochzuhalten.
|
||||
|
||||
---
|
||||
|
||||
### 1. Die Strategie: "The Velvet Rope" (Die rote Kordel)
|
||||
|
||||
Statt eines offenen Flohmarkts (wie eBay Kleinanzeigen) machst du daraus einen **exklusiven Club**.
|
||||
|
||||
- **Wer darf kaufen/kontaktieren?** JEDER (Public). Wir wollen maximale Nachfrage.
|
||||
- **Wer darf verkaufen/listen?** NUR "Trader" & "Tycoon" Abonnenten (Paid).
|
||||
|
||||
**Warum das genial ist:**
|
||||
|
||||
1. **Qualitätssicherung:** Wer $9/$29 im Monat zahlt, spammt die Seite nicht mit Müll voll. Die Hürde filtert Betrüger automatisch.
|
||||
2. **Abo-Treiber:** Du sagst dem User: *"Verkaufe deine Domains provisionsfrei direkt an Käufer. Alles was du brauchst, ist die Trader-Mitgliedschaft."*
|
||||
3. **Trust:** Käufer wissen: "Der Verkäufer ist ein verifiziertes Mitglied."
|
||||
|
||||
---
|
||||
|
||||
### 2. Integration in die UI (Mischen, nicht trennen)
|
||||
|
||||
Mach keine separate, traurige Seite namens "User Marketplace". Integriere die Angebote direkt in deinen **Haupt-Feed (Auctions)**.
|
||||
|
||||
**So sieht die Auktions-Liste dann aus:**
|
||||
|
||||
| **Domain** | **Source** | **Price** | **Trust** | **Action** |
|
||||
| --- | --- | --- | --- | --- |
|
||||
| **crypto-bank.io** | GoDaddy | $2,500 | 🏢 Registrar | [Bid on GoDaddy] |
|
||||
| **zurich-immo.ch** | **Pounce Direct** | **$950** | ✅ **Verified Owner** | **[Contact Seller]** |
|
||||
| **meta-shop.com** | Sedo | $5,000 | 🏢 Registrar | [Bid on Sedo] |
|
||||
|
||||
**Der Vorteil:**
|
||||
|
||||
- Deine Seite wirkt sofort voller und lebendiger.
|
||||
- Die User-Angebote wirken genauso hochwertig wie die von GoDaddy.
|
||||
- Du hast "Unique Content", den es auf anderen Seiten nicht gibt.
|
||||
|
||||
---
|
||||
|
||||
### 3. Der Trust-Prozess (Anti-Betrug)
|
||||
|
||||
Da die Leute "direkt Kontakt aufnehmen", fließen Gelder an dir vorbei (vorerst). Das Risiko: Ein User überweist Geld, bekommt die Domain aber nicht.
|
||||
|
||||
**Deine Sicherheits-Maßnahmen:**
|
||||
|
||||
1. Zwingende DNS-Verifizierung:
|
||||
|
||||
Bevor ein User eine Domain listen kann, MUSS er beweisen, dass sie ihm gehört (via TXT-Record oder CNAME). Kein Listing ohne Beweis.
|
||||
|
||||
- *Badge:* **"✅ Verified Owner"** neben dem Preis.
|
||||
2. Warnhinweis im Chat/Kontaktformular:
|
||||
|
||||
Wenn jemand auf "Contact Seller" klickt, zeige ein klares Popup:
|
||||
|
||||
> ⚠️ Sicherheitshinweis:
|
||||
>
|
||||
>
|
||||
> Dies ist ein Direktverkauf. Pounce ist nicht der Treuhänder.
|
||||
>
|
||||
> Nutze für die Zahlung IMMER einen Treuhandservice wie Escrow.com oder Dan.com.
|
||||
>
|
||||
> Überweise niemals Geld direkt per Banküberweisung oder PayPal Freunde.
|
||||
>
|
||||
|
||||
---
|
||||
|
||||
### 4. Monetarisierung (Wie du damit Geld verdienst)
|
||||
|
||||
Da du keine Provision nimmst (weil du die Transaktion nicht abwickelst), ist das Listing ein **Feature deines Abos**.
|
||||
|
||||
**Das Angebot an Verkäufer:**
|
||||
|
||||
- **Scout (Free):** Darf keine Domains listen.
|
||||
- **Trader ($9):** Darf 5 Domains listen ("Sell direct, 0% Commission").
|
||||
- **Tycoon ($29):** Darf 50 Domains listen + "Featured Listing" (ganz oben).
|
||||
|
||||
Das ist ein extrem starkes Verkaufsargument für das Abo. Auf Sedo zahlen sie 15% Provision. Bei dir zahlen sie $9 pauschal und behalten 100% des Verkaufspreises.
|
||||
|
||||
### Zusammenfassung: Was du tun musst
|
||||
|
||||
1. **Nicht löschen!** Behalte den Marktplatz-Code.
|
||||
2. **Integriere ihn in den Haupt-Feed:** Mische User-Listings unter die API-Listings.
|
||||
3. **Bau die Paywall:** Nur zahlende Mitglieder dürfen den "List a Domain"-Button sehen.
|
||||
4. **Bau den Owner-Check:** Niemand darf listen, ohne die Domain via DNS zu verifizieren.
|
||||
|
||||
Damit hast du plötzlich ein **einzigartiges Inventar**, das dich von reinen Aggregatoren (die nur GoDaddy-Daten zeigen) unterscheidet. Du wirst zur echten Plattform.
|
||||
208
pounce_plan.md
Normal file
208
pounce_plan.md
Normal file
@ -0,0 +1,208 @@
|
||||
Das ist ein sehr spannender Punkt. "Vibe Coding" (also das Entwickeln mit starker KI-Unterstützung wie Cursor, Replit oder ChatGPT) ist perfekt für Geschwindigkeit und MVPs. Aber wenn echte Kunden und echtes Geld im Spiel sind, ändern sich die Spielregeln.
|
||||
|
||||
Hier ist dein **Schlachtplan für die Skalierung als "AI-Native" Solo-Founder**.
|
||||
|
||||
---
|
||||
|
||||
### Phase 1: Die "Bulletproof"-Basis (Bevor du skalierst)
|
||||
|
||||
Bevor du Marketing aufdrehst, musst du sicherstellen, dass dir das System nicht um die Ohren fliegt, wenn 100 Leute gleichzeitig klicken.
|
||||
|
||||
**1. Das Geld muss sicher sein (Stripe Isolation)**
|
||||
* **Risiko:** Dein KI-Code hat einen Bug und gibt Nutzern Premium-Features kostenlos oder berechnet sie doppelt.
|
||||
* **Lösung:** Baue keine eigene Abrechnungslogik. Nutze **Stripe Customer Portal**.
|
||||
* Lass Stripe das Upgrade, Downgrade, Kündigen und Rechnungs-Versenden übernehmen.
|
||||
* Dein Code checkt nur: `if user.subscription_status == 'active': show_feature()`.
|
||||
* *Regel:* Fasse den Payment-Code niemals "mal eben schnell" an.
|
||||
|
||||
**2. Fehler-Monitoring (Du kannst nicht überall sein)**
|
||||
* Du brauchst ein System, das dich anschreit, wenn was kaputt ist, *bevor* der Kunde es merkt.
|
||||
* **Tool:** Nutze **Sentry** (oder LogRocket). Es ist kostenlos für den Start.
|
||||
* Wenn ein User einen "Error 500" bekommt, kriegst du sofort eine E-Mail mit der genauen Zeile im Code.
|
||||
|
||||
**3. Rechtliche Absicherung (AGB)**
|
||||
* Da du als Einzelfirma haftest: Deine AGB müssen wasserdicht sein, besonders bezüglich "Datenverfügbarkeit".
|
||||
* *Klausel:* "Wir garantieren keine 100%ige Uptime und keine Richtigkeit der Auktionsdaten Dritter."
|
||||
|
||||
---
|
||||
|
||||
### Phase 2: Die Wachstumsstrategie (0 auf 1.000 User)
|
||||
|
||||
Als Solo-Founder hast du kein Marketing-Budget, aber du hast **Daten**. Nutze "Programmatic SEO" und "Community Engineering".
|
||||
|
||||
**1. Programmatic SEO (Deine TLD-Seiten)**
|
||||
Du hast 800+ TLDs. Erstelle für jede eine Landingpage: `pounce.ch/price/ai`, `pounce.ch/price/io`.
|
||||
* Der Content auf diesen Seiten ist dynamisch (deine Charts, Preise).
|
||||
* **Der Trick:** Google liebt diese Datenseiten. Wenn jemand "price trend .ai domain" sucht, landest du oben. Das ist **kostenloser, dauerhafter Traffic**.
|
||||
|
||||
**2. "Building in Public" (Die Indie-Hacker Methode)**
|
||||
Dokumentiere deinen Weg auf Twitter (X) oder LinkedIn.
|
||||
* *Post:* "Ich habe GoDaddy-Daten analysiert. Hier sind die Top 10 Domains, die heute droppen, aber niemand bietet darauf."
|
||||
* Verlinke auf deine Market-Page.
|
||||
* Domainer lieben solche "Insider-Tipps". Das baut extremen Trust auf.
|
||||
|
||||
**3. Der "Side-Project-Marketing" Hack**
|
||||
Erstelle kleine, kostenlose Tools, die auf Pounce verlinken:
|
||||
* Ein "Domain Name Generator", der *wirklich* gut ist.
|
||||
* Ein "Whois History Checker" (limitiert).
|
||||
* Stelle diese auf *ProductHunt* vor. Das bringt dir den ersten Traffic-Schub.
|
||||
|
||||
---
|
||||
|
||||
### Phase 3: Operative Skalierung (Wie du nicht durchdrehst)
|
||||
|
||||
Wenn du 500 Kunden hast, wirst du mit Support-Anfragen bombardiert. "Wie geht das?", "Ich habe einen Bug gefunden", "Kannst du mir helfen?".
|
||||
|
||||
**1. Automatischer Support (Self-Service)**
|
||||
* Baue eine **FAQ-Sektion** oder "Knowledge Base" (kannst du mit Notion machen).
|
||||
* Wenn jemand den Support kontaktiert, schicke eine Auto-Reply: "Wir sind ein kleines Team. Antwortzeit: 24-48h. Schau hier in die FAQ."
|
||||
|
||||
**2. Community Support**
|
||||
* Erstelle einen Discord-Server für "Trader" & "Tycoon" User.
|
||||
* Lass die User sich gegenseitig helfen. Oft sind die Power-User schneller als du.
|
||||
* *Bonus:* Du kriegst direktes Feedback für neue Features.
|
||||
|
||||
**3. Keine manuellen Eingriffe**
|
||||
* Wenn du merkst, dass du etwas manuell für einen User tun musst (z.B. Domain freischalten, Rechnung korrigieren), **automatisiere es sofort**.
|
||||
* Als "Vibe Coder" kannst du dir schnell ein Admin-Skript schreiben lassen: "Schreibe ein Python Script, das User X auf Status Y setzt".
|
||||
|
||||
---
|
||||
|
||||
### Phase 4: Vom "Vibe Code" zur Software-Architektur
|
||||
|
||||
KI-Code ist oft "Spaghetti-Code". Das funktioniert bis zu einem gewissen Punkt, wird dann aber unwartbar.
|
||||
|
||||
**Wann du Hilfe brauchst:**
|
||||
Sobald du **$2.000 - $3.000 MRR** (Monthly Recurring Revenue) hast:
|
||||
* Nimm Geld in die Hand und engagiere einen **Freelance Senior Developer** (z.B. für 10-20 Stunden).
|
||||
* **Auftrag:** "Bitte mach ein Code-Review, sichere die Datenbank ab und optimiere die Performance."
|
||||
* Lass ihn die kritischen teile (Datenbank-Queries, Auth) umschreiben. Den Rest (Frontend) kannst du weiter mit KI bauen.
|
||||
|
||||
---
|
||||
|
||||
### Zusammenfassung: Deine Checkliste für den Start
|
||||
|
||||
**Bevor du den ersten Euro nimmst:**
|
||||
1. [ ] **Stripe Checkout & Portal** funktioniert fehlerfrei (Testmodus).
|
||||
2. [ ] **AGB & Impressum** sind online (Haftungsausschluss!).
|
||||
3. [ ] **Error-Logging (Sentry)** ist installiert.
|
||||
4. [ ] **Datenbank-Backup:** Richte ein automatisches tägliches Backup ein (Supabase/Firebase machen das oft automatisch, prüf es nach).
|
||||
|
||||
**Wachstums-Taktik:**
|
||||
* Nicht Geld für Ads verbrennen.
|
||||
* Content produzieren: "Die 5 besten .ai Domains dieser Woche" (Blog/Newsletter).
|
||||
* SEO-Seiten für jede TLD live schalten.
|
||||
|
||||
Du hast mit "Vibe Coding" einen Superpower: Du bist schneller als jedes Entwicklungsteam. Nutze das, um Features zu testen, aber verlasse dich bei **Geld und Daten** auf bewährte Standards (Stripe, Cloud-Provider).
|
||||
|
||||
Das ist der Übergang vom "Bastler" zum "CEO".
|
||||
|
||||
Du hast das Produkt (vibe coded). Du hast das Pricing.
|
||||
Jetzt geht es um die **"Go-to-Market" Strategie**. Wie kommst du von 0 auf 10.000 CHF Monatsumsatz (MRR), ohne ein Marketing-Team einzustellen?
|
||||
|
||||
Hier ist der Schlachtplan für die Skalierung in **3 Phasen**, speziell zugeschnitten auf ein **Solo-Founder / AI-Setup**.
|
||||
|
||||
---
|
||||
|
||||
### Phase 1: "Do things that don't scale" (0 bis 100 Kunden)
|
||||
*Ziel: Die ersten 1.000 CHF MRR. Fehler finden. Trust aufbauen.*
|
||||
|
||||
In dieser Phase ist Automatisierung dein Feind. Du musst **manuell** kämpfen.
|
||||
|
||||
1. **Direct Sales in Foren (Guerilla Taktik):**
|
||||
* Geh auf **NamePros.com** (das größte Domainer-Forum) und **DNForum**.
|
||||
* Erstelle einen Thread: *"I built a cleaner alternative to ExpiredDomains.net. Looking for 10 beta testers."*
|
||||
* Biete den ersten 10 Leuten einen **Lifetime-Account** gegen Feedback an.
|
||||
* *Warum?* Diese Leute sind Influencer. Wenn sie sagen "Pounce ist gut", folgen hunderte.
|
||||
|
||||
2. **Concierge Onboarding:**
|
||||
* Wenn sich jemand anmeldet, schreib ihm eine persönliche E-Mail (kein Newsletter!).
|
||||
* *"Hey, ich bin der Gründer. Welche Domain suchst du? Ich helfe dir, den Filter einzustellen."*
|
||||
* Das schafft extremen Trust. Niemand kündigt einen Service, wo der Gründer einem persönlich geholfen hat.
|
||||
|
||||
3. **Twitter/X "Build in Public":**
|
||||
* Die Domain-Community lebt auf Twitter.
|
||||
* Poste jeden Tag **einen** interessanten Datenpunkt aus deinem Tool.
|
||||
* *Beispiel:* "Wusstet ihr, dass gestern 500 .io Domains gelöscht wurden? Hier sind 3 davon, die noch frei sind: [Link]."
|
||||
* Nutze Hashtags wie `#domaininvesting` `#solopreneur` `#indiehacker`.
|
||||
|
||||
---
|
||||
|
||||
### Phase 2: Die SEO-Maschine (100 bis 1.000 Kunden)
|
||||
*Ziel: 10.000 CHF MRR. Passiver Traffic.*
|
||||
|
||||
Jetzt nutzen wir deine Daten, um Google zu dominieren. Du kannst nicht für jede Domain bloggen, also nutzen wir **Programmatic SEO**.
|
||||
|
||||
1. **Die TLD-Landingpages (Dein Gold):**
|
||||
* Du hast Daten zu 800+ TLDs.
|
||||
* Erstelle ein Template: `pounce.ch/tld/[extension]`.
|
||||
* Titel: *"Current Price & Trends for .[AI] Domains - 2025 Report"*.
|
||||
* Inhalt: Deine Charts, Renewal-Preise, Liste der günstigsten Registrare.
|
||||
* *Effekt:* Wenn jemand "cost of .ai domain renewal" googelt, findet er deine Seite. Das sind tausende Besucher pro Monat – kostenlos.
|
||||
|
||||
2. **Der "Daily Drop" Newsletter:**
|
||||
* Sammle E-Mails (auch von Free Usern).
|
||||
* Sende 1x pro Woche (oder täglich) die **"Top 5 Pounce Picks"**.
|
||||
* Domains, die dein Algorithmus gefunden hat.
|
||||
* *Call to Action:* "Willst du alle 50 sehen? Upgrade auf Trader."
|
||||
|
||||
3. **Kostenlose Tools als Köder (Side-Project Marketing):**
|
||||
* Baue mit Vibe Coding ein simples Tool: **"Domain Availability Checker"** (ohne Login).
|
||||
* Stell es auf eine Unterseite.
|
||||
* Wenn die Domain vergeben ist -> *"Überwache sie mit Pounce"*.
|
||||
|
||||
---
|
||||
|
||||
### Phase 3: Viralität & Partnerschaften (1.000+ Kunden)
|
||||
*Ziel: Das "Flywheel" dreht sich von selbst.*
|
||||
|
||||
Jetzt nutzen wir deine Nutzer, um neue Nutzer zu werben.
|
||||
|
||||
1. **Das "Powered by Pounce" Badge:**
|
||||
* Erinnerst du dich an die Verkaufsseiten (`pounce.ch/buy/domain`)?
|
||||
* Jedes Mal, wenn ein User seine Domain auf Twitter teilt, um sie zu verkaufen, sehen potenzielle Käufer dein Logo und das "Verified by Pounce" Badge.
|
||||
* Das ist kostenlose Werbung bei genau der richtigen Zielgruppe.
|
||||
|
||||
2. **Affiliate Programm:**
|
||||
* Gib deinen Power-Usern (Influencern auf YouTube/Twitter) 20% Provision.
|
||||
* Sie machen Videos ("How I make $1000 flipping domains with Pounce") und du kriegst die Kunden.
|
||||
|
||||
3. **API Access (B2B):**
|
||||
* Verkaufe deine gefilterten Daten an Agenturen oder andere Tools.
|
||||
* Das ist der Schritt zum "Tycoon" Plan für $499/Monat.
|
||||
|
||||
---
|
||||
|
||||
### Was du technisch sicherstellen musst (Tech-Scaling)
|
||||
|
||||
Da du "Vibe Coding" nutzt, wird dein Code irgendwann an Grenzen stoßen. Hier ist der Warn-Plan:
|
||||
|
||||
1. **Datenbank-Indizes (WICHTIG!):**
|
||||
* Sobald du 1 Million Domains in der DB hast, wird die Suche langsam.
|
||||
* Frage deine KI: *"How do I add indexes to my SQL database for fast searching by TLD and Price?"*
|
||||
* Ohne Indizes stürzt deine Seite ab, wenn 50 Leute gleichzeitig suchen.
|
||||
|
||||
2. **Caching (Redis):**
|
||||
* Du musst nicht jedes Mal die Datenbank fragen, was der Preis von `.com` ist. Der ändert sich selten.
|
||||
* Speichere solche Daten im Cache (Redis). Das macht die Seite blitzschnell und spart Serverkosten.
|
||||
|
||||
3. **Der "Kill Switch":**
|
||||
* Was, wenn dein Scraper Amok läuft und GoDaddy deine IP blockiert?
|
||||
* Baue eine Funktion, um den Scraper per Klick abzuschalten, ohne dass die ganze Seite offline geht.
|
||||
* Zeige den Usern dann "Cached Data" anstatt einer Fehlermeldung.
|
||||
|
||||
### Zusammenfassung: Deine Roadmap für die nächsten 6 Monate
|
||||
|
||||
* **Monat 1 (Launch):**
|
||||
* Fokus: Stabilität & die ersten 10 Tester aus Foren.
|
||||
* Marketing: Manuell (DMs, Foren-Posts).
|
||||
* **Monat 2-3 (SEO):**
|
||||
* Fokus: Programmatic SEO Seiten live schalten (alle 800 TLDs).
|
||||
* Marketing: Twitter Content ("Daily Drops").
|
||||
* **Monat 4-6 (Optimierung):**
|
||||
* Fokus: Conversion Rate Optimierung (Landingpage verbessern).
|
||||
* Marketing: Affiliate Programm starten.
|
||||
|
||||
**Dein Mantra:**
|
||||
*"Don't scale the tech until the server smokes. Scale the content first."*
|
||||
(Skaliere die Technik erst, wenn der Server raucht. Skaliere zuerst den Inhalt.)
|
||||
88
pounce_pricing.md
Normal file
88
pounce_pricing.md
Normal file
@ -0,0 +1,88 @@
|
||||
Das aktuelle Modell (**Free / $9 / $29**) ist **sehr stark und aggressiv**. Es ist eine klassische "Disruptor"-Strategie: Du unterbietest die etablierten Tools (die oft $30-$90 kosten) massiv, um Marktanteile zu gewinnen.
|
||||
|
||||
Hier ist meine detaillierte Analyse – was daran psychologisch genial ist und wo du Geld liegen lässt.
|
||||
|
||||
---
|
||||
|
||||
### Das Starke daran (Die Psychologie)
|
||||
|
||||
**1. Der "No-Brainer" Einstieg ($9)**
|
||||
|
||||
- $9 ist ein **Impulskauf**. Das liegt unter der psychologischen Schmerzgrenze von $10 (Netflix/Spotify-Niveau).
|
||||
- Jemand, der sich hobbymäßig für Domains interessiert, denkt nicht lange nach. Er probiert es einfach aus.
|
||||
- **Vergleich:** *SpamZilla* kostet ~$37. *DomainTools* ~$99. Du bist der "Preisführer".
|
||||
|
||||
**2. Die Schmerz-Trennung (Free vs. Trader)**
|
||||
|
||||
- Das Feature **"Raw Feed (Unfiltered)"** vs. **"Curated Feed (Clean)"** ist der perfekte Upsell-Treiber.
|
||||
- Du verkaufst nicht "mehr Daten", du verkaufst **Schmerzfreiheit**. Niemand will Müll sehen. Wer Zeit sparen will, zahlt die $9 sofort.
|
||||
|
||||
**3. Das Lock-in (Watchlist)**
|
||||
|
||||
- Der Sprung von 5 Domains (Scout) auf 50 (Trader) ist logisch. Wer ernsthaft sucht, braucht mehr als 5 Slots. Sobald die 50 voll sind, bleibt der Kunde.
|
||||
|
||||
---
|
||||
|
||||
### Die Risiken & Optimierungspotenziale
|
||||
|
||||
Hier sind Punkte, wo du das Modell noch schärfer machen kannst, um den Umsatz zu maximieren:
|
||||
|
||||
### 1. Die "Tycoon"-Lücke (Lassen wir Geld liegen?)
|
||||
|
||||
Der Sprung von $9 auf $29 ist okay, aber $29 ist für einen "Profi" fast zu billig.
|
||||
|
||||
- **Das Problem:** Ein echter "Tycoon" (jemand mit 500 Domains) verdient mit Domains Geld. Für ihn sind $29 Kleingeld. Er würde auch $49 oder $79 zahlen.
|
||||
- **Das Risiko:** Wenn du 500 Domains alle 10 Minuten scannst (Real-Time), verursacht dieser User hohe Serverlast. $29 deckt das zwar, aber die Marge schmilzt.
|
||||
- **Vorschlag:** Lass es für den Launch bei $29 (Early Bird Pricing), aber behalte im Hinterkopf, dass du hier später auf **$49** erhöhen kannst. Oder führe später einen "Agency"-Plan für $99 ein (API Access, Reports).
|
||||
|
||||
### 2. Das Jährliche Abo (Cashflow-Trick)
|
||||
|
||||
Du hast aktuell nur Monats-Preise genannt. Biete unbedingt **Jahres-Pakete** an.
|
||||
|
||||
- **Warum?** Du bekommst das Geld sofort (Cashflow für Server/Entwicklung) und reduzierst den Churn (Kundenbindung für 1 Jahr).
|
||||
- **Das Angebot:**
|
||||
- Trader: $9/mo oder **$90/yr** (2 Monate geschenkt).
|
||||
- Tycoon: $29/mo oder **$290/yr**.
|
||||
- *Psychologie:* "Für unter 100 Dollar das ganze Jahr Ruhe und gute Deals." Das verkauft sich extrem gut.
|
||||
|
||||
### 3. Limitierung der Listings (Marktplatz)
|
||||
|
||||
Du erlaubst Trader ($9) und Tycoon ($29) das Listen von Domains. Das ist super. Aber setze Limits, damit dein Marktplatz nicht geflutet wird.
|
||||
|
||||
- **Trader:** Max. **5 aktive Listings** gleichzeitig. (Reicht für Hobby-Seller).
|
||||
- **Tycoon:** Max. **50 aktive Listings**. (Reicht für Profis).
|
||||
- *Upsell:* "Willst du mehr als 5 Domains verkaufen? Upgrade auf Tycoon."
|
||||
|
||||
---
|
||||
|
||||
### Feinschliff für die Pricing-Tabelle
|
||||
|
||||
Hier ist ein Vorschlag, wie du die Features in der Tabelle benennst, um den Wert maximal zu betonen:
|
||||
|
||||
| **Feature** | **Scout ($0)** | **Trader ($9)** | **Tycoon ($29)** |
|
||||
| --- | --- | --- | --- |
|
||||
| **Market Feed** | 🌪️ **Raw** (Unfiltered) | ✨ **Curated** (Spam-Free) | ✨ **Curated** + Priority |
|
||||
| **Alert Speed** | 🐢 Daily | 🐇 Hourly | ⚡ **Real-Time (10m)** |
|
||||
| **Watchlist** | 5 Domains | 50 Domains | **500 Domains** |
|
||||
| **Marketplace** | Buy Only | **Sell (0% Fee)** | **Sell + Featured** |
|
||||
| **TLD Intel** | Public Trends | **Renewal Prices** | **Full History** |
|
||||
| **Valuation** | ❌ Locked | ✅ **Pounce Score** | ✅ **Score + SEO Data** |
|
||||
|
||||
### Fazit
|
||||
|
||||
Das Modell ist startklar.
|
||||
|
||||
Es ist einfach genug, um nicht zu verwirren, und günstig genug, um die Hürde zu nehmen.
|
||||
|
||||
Mein Rat für den Launch:
|
||||
|
||||
Starte genau so ($0 / $9 / $29).
|
||||
|
||||
Das Ziel der ersten 6 Monate ist nicht maximaler Profit, sondern maximale User-Basis. Wenn du 1.000 User hast, die $9 zahlen, hast du ein stabiles Business ($9k MRR). Preiserhöhungen kannst du später immer noch machen (für Neukunden).
|
||||
|
||||
Eine Sache noch:
|
||||
|
||||
Überlege dir ein "Lifetime Deal" (LTD) Angebot für die allerersten 100 Nutzer.
|
||||
|
||||
- *"Zahle einmalig $299 und sei 'Tycoon' für immer."*
|
||||
- Das bringt dir sofort ~$30.000 Cash in die Kasse, um Entwicklungskosten zu decken, und schafft dir 100 treue Super-Fans, die Feedback geben.
|
||||
123
pounce_public.md
Normal file
123
pounce_public.md
Normal file
@ -0,0 +1,123 @@
|
||||
Das ist der letzte Schritt: Das **"Schaufenster"** (Public Site) muss genau so professionell und verlockend aussehen wie der **"Laden"** (Terminal/Login-Bereich), aber es darf **nicht alles verraten**.
|
||||
|
||||
Das Ziel der Public Pages ist Conversion.
|
||||
|
||||
Wir wenden hier das "Teaser & Gatekeeper"-Prinzip an.
|
||||
|
||||
Hier ist der Aufbau für deine öffentlichen Seiten:
|
||||
|
||||
---
|
||||
|
||||
### Globales Design (Header & Nav)
|
||||
|
||||
- **Look:** Durchgängig **Dark Mode** (schwarz/dunkelgrau), auch auf den öffentlichen Seiten. Das wirkt sofort wie "Pro-Software" und unterscheidet dich von den weißen, langweiligen Seiten der Konkurrenz.
|
||||
- Navigation (Oben rechts):
|
||||
|
||||
Market | Intel | Pricing | [Log In] | [Start Hunting] (Button in Neon-Grün)
|
||||
|
||||
|
||||
---
|
||||
|
||||
### 1. Landing Page (Home)
|
||||
|
||||
*Der Einstieg. Muss sofort Kompetenz ausstrahlen.*
|
||||
|
||||
- **Hero Section (Zentriert):**
|
||||
- **Headline:** "The market never sleeps. You should."
|
||||
- **Subline:** "Domain Intelligence for Investors. Scan, track, and trade digital assets."
|
||||
- **Main Element:** Ein **großes, animiertes Suchfeld**.
|
||||
- *Placeholder (Typing Effect):* "Search `crypto.ai`...", "Search `hotel.zurich`..."
|
||||
- **CTA:** "Launch Terminal" (Führt zum Login/Reg).
|
||||
- **The Ticker (Direkt unter Hero):**
|
||||
- Das laufende Band mit Live-Preisen (wie an der Börse). Das ist dein bester Social Proof.
|
||||
- **Value Grid (3 Spalten):**
|
||||
- **Discover:** "Real-time drops & auctions. Spam-filtered."
|
||||
- **Track:** "Monitor expiring domains & competitors."
|
||||
- **Trade:** "Buy & sell directly. 0% Commission."
|
||||
- **Live Market Teaser:**
|
||||
- Eine verkürzte Tabelle (nur 5 Zeilen) aus dem Market.
|
||||
- *Letzte Zeile:* Verschwommen. "Sign in to see 14,502 more domains."
|
||||
|
||||
---
|
||||
|
||||
### 2. Page: MARKET (Ehemals "Auctions")
|
||||
|
||||
*Der Beweis, dass hier Action ist. Aber wir zeigen nur die Spitze des Eisbergs.*
|
||||
|
||||
- **Header:**
|
||||
- **H1:** "Live Domain Market"
|
||||
- **Sub:** "Aggregated from GoDaddy, Sedo, and Pounce Direct."
|
||||
- Die "Public Safe" Tabelle:
|
||||
|
||||
Du zeigst hier den Auktions-Feed, ABER:
|
||||
|
||||
1. **Der Filter:** Dein Code muss hier **aggressiv filtern**. Zeige ausgeloggten Usern KEINE Domains mit Zahlen, Bindestrichen oder mehr als 15 Zeichen. Zeige nur "Premium-Looking" Domains.
|
||||
2. **Die Spalten:**
|
||||
- `Domain` | `Source` | `Price` | `Time Left` | `Action`
|
||||
3. **Die "Missing" Spalten (Der Hook):**
|
||||
- Die Spalten **"Pounce Score"** und **"Valuation"** sind in der Tabelle sichtbar, aber der Inhalt ist **verpixelt/geblurrt** (oder Schloss-Icon).
|
||||
- *Hover-Effekt:* "Sign in to unlock valuations."
|
||||
- **Bottom CTA:**
|
||||
- "Tired of digging through spam? Our 'Trader' plan filters 99% of junk domains automatically." `[Upgrade Filter]`
|
||||
|
||||
---
|
||||
|
||||
### 3. Page: INTEL (Ehemals "TLD Pricing")
|
||||
|
||||
*Dein SEO-Magnet. Viel Content, aber die strategischen Daten sind versteckt.*
|
||||
|
||||
- **Header:**
|
||||
- **H1:** "TLD Market Inflation Monitor" (Klingt viel wichtiger als "Pricing").
|
||||
- **Cards:** Die "Top Movers" (.ai +35%) bleiben oben.
|
||||
- **Die Tabelle:**
|
||||
- `TLD` | `Current Price` | `Trend (1y)` | `Renewal Price` | `Risk Level`
|
||||
- **Der Trick:**
|
||||
- Zeige die Daten für **.com, .net, .org** komplett an (als Beweis).
|
||||
- Für alle anderen (ab Zeile 4):
|
||||
- `Buy Price`: Sichtbar.
|
||||
- `Trend`: Sichtbar.
|
||||
- `Renewal Price`: **Geblurrt / Locked 🔒**.
|
||||
- `Risk Level`: **Geblurrt / Locked 🔒**.
|
||||
- Warum?
|
||||
|
||||
User kommen wegen dem Preis. Sie bleiben, weil sie sehen wollen: "Werde ich beim Renewal abgezockt?". Das Schloss triggert die Anmeldung.
|
||||
|
||||
|
||||
---
|
||||
|
||||
### 4. Page: PRICING
|
||||
|
||||
*Der Closer. Klar und simpel.*
|
||||
|
||||
- **Design:** 3 Karten nebeneinander.
|
||||
- **SCOUT (Free):**
|
||||
- "Market Overview"
|
||||
- "Basic Search"
|
||||
- "5 Watchlist Domains"
|
||||
- **TRADER ($9/mo) - *Highlight (Rahmen/Farbe)*:**
|
||||
- "Clean Feed (Spam Filter)"
|
||||
- "Renewal Price Intel"
|
||||
- "50 Watchlist Domains"
|
||||
- "List domains for sale (0% fee)"
|
||||
- **TYCOON ($29/mo):**
|
||||
- "Full Portfolio Monitor"
|
||||
- "Priority Alerts"
|
||||
- "500 Watchlist Domains"
|
||||
|
||||
---
|
||||
|
||||
### Zusammenfassung: Der Unterschied Public vs. Terminal
|
||||
|
||||
| **Element** | **Public Page (Ausgeloggt)** | **Terminal (Eingeloggt)** |
|
||||
| --- | --- | --- |
|
||||
| **Hintergrund** | Dark Mode (Clean) | Dark Mode (Dense/Data) |
|
||||
| **Auctions** | Stark gefiltert (nur schöne Domains) | Alles sichtbar + Spam-Filter Toggle |
|
||||
| **Daten** | Preise sichtbar, Analysen geblurrt | Alle Analysen sichtbar |
|
||||
| **Suche** | Einfaches Suchfeld | Universal Search (Whois + DB) |
|
||||
| **Ziel** | "Account erstellen" | "Daten nutzen / Upgrade" |
|
||||
|
||||
Dein Mantra für die Public Pages:
|
||||
|
||||
Zeige die Menge ("800 TLDs", "100 Auktionen"), aber verstecke die Intelligenz ("Ist das ein guter Preis?", "Ist das Spam?").
|
||||
|
||||
Die Intelligenz ist das Produkt. Die Daten sind nur das Lockmittel.
|
||||
107
pounce_strategy.md
Normal file
107
pounce_strategy.md
Normal file
@ -0,0 +1,107 @@
|
||||
Hier ist der Masterplan. Er basiert auf dem Prinzip des **"Trojanischen Pferdes"**: Du startest als nützliches kleines Tool, um die Nutzerdaten und das Vertrauen zu gewinnen, und verwandelst dich dann in die unverzichtbare Finanz-Infrastruktur des Internets.
|
||||
|
||||
Der Weg zum **Unicorn ($1 Mrd. Bewertung)** führt nicht über $9-Abos, sondern darüber, den **Handel** und den **Besitz** von digitalen Assets komplett neu zu definieren.
|
||||
|
||||
Hier ist die Roadmap. Minimalistisch. Brutal fokussiert.
|
||||
|
||||
---
|
||||
|
||||
### Phase 1: Die Intelligenz (Das trojanische Pferd)
|
||||
|
||||
Ziel: 10.000 treue User & Datenhoheit.
|
||||
|
||||
Umsatz: $1 Mio. ARR (Annual Recurring Revenue).
|
||||
|
||||
Zeitrahmen: Monate 1 - 18.
|
||||
|
||||
In dieser Phase bauen wir **kein** Milliarden-Business. Wir bauen die *Basis*. Wir locken die "Hunters" (Investoren) an, weil wir die besten Daten haben.
|
||||
|
||||
- **Core Feature:** **The Pounce Terminal.**
|
||||
- Zone File Analyse (Eigene Daten, keine APIs).
|
||||
- Der "No-Bullshit" Filter für Auktionen (Spam weg).
|
||||
- Inflation Monitor (.ai Preistrends).
|
||||
- **Minimalismus-Fokus:**
|
||||
- Kein Marktplatz, keine Transaktionen. Wir verlinken nur raus.
|
||||
- Nur 1 Ziel: **Trust.** User müssen denken: "Pounce weiß Dinge, die GoDaddy mir verheimlicht."
|
||||
- **Der strategische Wert:** Wir sammeln Daten darüber, *wer* was sucht und *welche* Domains wirklich begehrt sind (Search Intent Data).
|
||||
|
||||
---
|
||||
|
||||
### Phase 2: Die Liquidität (Der Marktplatz)
|
||||
|
||||
Ziel: Den Transaktionsfluss übernehmen.
|
||||
|
||||
Umsatz: $10 Mio. ARR.
|
||||
|
||||
Zeitrahmen: Monate 18 - 36.
|
||||
|
||||
Jetzt schließen wir die Tore. Warum User zu Sedo schicken und 15% Provision verlieren? Wir werden der Ort, an dem der Deal stattfindet.
|
||||
|
||||
- **Der Pivot:** Vom "Scanner" zum "Broker".
|
||||
- **Core Feature:** **Pounce Instant Exchange.**
|
||||
- "Buy Now" Buttons direkt im Dashboard für User-Domains.
|
||||
- **Killer-Feature:** Automatisierter Treuhand-Service (Escrow) integriert. Geld gegen Domain in Minuten, nicht Tagen.
|
||||
- Gebühren: 5% (statt 15-20% bei der Konkurrenz).
|
||||
- **Minimalismus-Fokus:**
|
||||
- Keine Auktionen (zu komplex). Nur "Festpreis" oder "Make Offer".
|
||||
- Standardisierte Verträge. Ein Klick.
|
||||
- **Der strategische Wert:** Wir kontrollieren jetzt das Geld (GMV - Gross Merchandise Value).
|
||||
|
||||
---
|
||||
|
||||
### Phase 3: Die Finanzialisierung (Das Fintech-Unicorn)
|
||||
|
||||
Ziel: Assets für die Massen (Demokratisierung).
|
||||
|
||||
Umsatz: $50 Mio. - $100 Mio. ARR.
|
||||
|
||||
Zeitrahmen: Jahre 3 - 5.
|
||||
|
||||
Hier passiert die Magie. Domains wie `insurance.com` sind Millionen wert, aber illiquide. Niemand kann sie schnell kaufen. Wir machen Domains zu Aktien.
|
||||
|
||||
- **Der Pivot:** Vom Marktplatz zur **Börse**.
|
||||
- **Core Feature:** **Fractional Ownership (Anteile).**
|
||||
- Pounce kauft Premium-Domains (z.B. `credit.ai` für $500k).
|
||||
- Wir splitten sie in 500.000 "Shares" à $1.
|
||||
- User (die "Dreamers" aus Phase 1) können $50 in Premium-Domains investieren und an der Wertsteigerung partizipieren.
|
||||
- **Zusatz-Feature:** **Domain-Backed Lending.**
|
||||
- User hinterlegen ihre Premium-Domains bei Pounce und bekommen sofort einen Kredit (Liquidität), ohne zu verkaufen.
|
||||
- **Der strategische Wert:** Wir sind jetzt keine Domain-Firma mehr. Wir sind ein **Fintech** (wie Coinbase oder Robinhood für digitale Assets). Das bringt die Milliarden-Bewertung.
|
||||
|
||||
---
|
||||
|
||||
### Phase 4: Das Imperium (Die Infrastruktur)
|
||||
|
||||
Ziel: Too big to fail.
|
||||
|
||||
Bewertung: $1 Mrd.+.
|
||||
|
||||
Zeitrahmen: Jahre 5+.
|
||||
|
||||
Wir schützen die Assets, die wir geschaffen haben. Wir gehen B2B und Enterprise.
|
||||
|
||||
- **Core Feature:** **Pounce Enterprise Sentinel.**
|
||||
- KI-gestützte Brand Protection für Fortune 500 Firmen.
|
||||
- Automatische Takedowns von Phishing-Seiten.
|
||||
- Firmen wie Apple oder Tesla zahlen uns Millionen, damit wir ihr Marken-Portfolio überwachen und schützen.
|
||||
- **Warum das das Imperium sichert:** Selbst wenn der Handel stagniert, zahlen Konzerne immer für Sicherheit.
|
||||
|
||||
---
|
||||
|
||||
### Zusammenfassung: Was du HEUTE tun musst (Minimalismus)
|
||||
|
||||
Vergiss Phase 3 und 4 für den Moment. Um dort hinzukommen, musst du Phase 1 perfektionieren.
|
||||
|
||||
**Dein Fokus für die nächsten 6 Monate:**
|
||||
|
||||
1. **Code:** Bau das Zone-File-Analysetool (Python). Mach es schnell und stabil.
|
||||
2. **UX:** Bau das Dashboard ("Command Center"). Dunkel, sexy, datengetrieben.
|
||||
3. **Growth:** Hol dir die ersten 1.000 User in den "Trader"-Plan ($9).
|
||||
- *Nicht* um reich zu werden.
|
||||
- Sondern um zu beweisen, dass du die **Datenhoheit** hast.
|
||||
|
||||
Das Milliarden-Imperium entsteht nicht durch das *Sammeln* von Domains, sondern durch das **Neudefinieren ihres Wertes**.
|
||||
|
||||
Start: "Don't guess. Know." (Intelligence)
|
||||
|
||||
Ziel: "Don't just buy. Invest." (Asset Class)
|
||||
229
pounce_terminal.md
Normal file
229
pounce_terminal.md
Normal file
@ -0,0 +1,229 @@
|
||||
Hier ist die detaillierte Struktur für das **Pounce Terminal** (deine App hinter dem Login).
|
||||
|
||||
Das Design-Prinzip ist "High Density, Low Noise".
|
||||
|
||||
Denk an ein Trading-Dashboard: Dunkler Hintergrund, präzise Daten, keine unnötigen Bilder.
|
||||
|
||||
---
|
||||
|
||||
### Globales Layout (Der Rahmen)
|
||||
|
||||
- **Design:** Dark Mode (Hex `#111111` Hintergrund, `#EAEAEA` Text).
|
||||
- **Navigation:** Linke Sidebar (Icons + Text), einklappbar auf Mobile.
|
||||
- **Top Bar:** Global Search (`CMD+K` Style), User Profil, Notifications Glocke.
|
||||
|
||||
---
|
||||
|
||||
### 1. Modul: RADAR (Das Dashboard)
|
||||
|
||||
*Startseite nach dem Login. Der "Morgenkaffee"-Überblick.*
|
||||
|
||||
**Bereiche & Funktionen:**
|
||||
|
||||
- **A. The Ticker (Top):**
|
||||
- Laufband mit den wichtigsten Marktbewegungen (z.B. ".ai steigt +2%", "3 Domains auf Watchlist offline").
|
||||
- **B. Quick Stats (Karten):**
|
||||
- `Watching`: 12 Domains (3 Alerts heute).
|
||||
- `Market`: 145 neue Opportunities (Spam-gefiltert).
|
||||
- `My Listings`: 2 Active, 1 Sold.
|
||||
- **C. Universal Search (Hero Element):**
|
||||
- Großes Eingabefeld in der Mitte.
|
||||
- *Logik:* Wenn User tippt, sucht das System *gleichzeitig*:
|
||||
- Ist sie frei? (Whois)
|
||||
- Ist sie in einer Auktion? (Dein Feed)
|
||||
- Ist sie auf dem Pounce Marktplatz?
|
||||
- **D. Recent Alerts (Liste):**
|
||||
- Chronologische Liste der letzten Ereignisse (z.B. "https://www.google.com/search?q=XY.com ist offline gegangen").
|
||||
|
||||
---
|
||||
|
||||
### 2. Modul: MARKET (Der Feed)
|
||||
|
||||
*Hier fließen deine API-Daten und User-Listings zusammen.*
|
||||
|
||||
**UI-Elemente:**
|
||||
|
||||
- **Filter Bar (Oben):**
|
||||
- `[Toggle] Hide Spam` (Standard: AN - filtert Zahlen/Bindestriche).
|
||||
- `[Toggle] Pounce Direct Only` (Zeigt nur User-Angebote).
|
||||
- `[Dropdown] TLD`: .com, .ai, .io, .ch.
|
||||
- `[Dropdown] Price`: < $100, < $1k, High Roller.
|
||||
- **Die Master-Tabelle (Columns):**
|
||||
|
||||
| **Spalte** | **Inhalt / Logik** | **Visualisierung** |
|
||||
| --- | --- | --- |
|
||||
| **Domain** | Name der Domain | Fettgedruckt. Bei "Pounce Direct" evtl. ein 💎 Icon. |
|
||||
| **Pounce Score** | Dein interner Qualitäts-Algorithmus | Zahl 0-100 (Grün > 80, Rot < 40). |
|
||||
| **Price / Bid** | Preis oder aktuelles Gebot | `$ 500` (Weiß) oder `$ 50 (Bid)` (Grau). |
|
||||
| **Status / Time** | Countdown oder Verfügbarkeit | Auktion: `⏱️ 4h left` (Orange).
|
||||
Direct: `⚡ Instant` (Neon-Grün). |
|
||||
| **Source** | Herkunft der Daten | Logos oder Text: `GoDaddy`, `Sedo`, `Pounce`. |
|
||||
| **Action** | Der Button | Auktion: `[Bid ↗]`.
|
||||
Direct: `[Buy]`. |
|
||||
|
||||
---
|
||||
|
||||
### 3. Modul: INTEL (TLD Data)
|
||||
|
||||
*Die erweiterte Version deiner Public Page.*
|
||||
|
||||
**Funktionen:**
|
||||
|
||||
- **Inflation Monitor:**
|
||||
- Tabelle aller TLDs mit `Renew Price` (Verlängerungskosten).
|
||||
- Warn-Indikator ⚠️ wenn `Renew Price` > 200% von `Buy Price`.
|
||||
- **Trend Charts:**
|
||||
- Detaillierte Charts (30 Tage, 1 Jahr) für Preisentwicklung.
|
||||
- **Best Registrar Finder:**
|
||||
- Dropdown bei jeder TLD: "Cheapest at: Namecheap ($8.99)".
|
||||
|
||||
---
|
||||
|
||||
### 4. Modul: WATCHLIST (Portfolio)
|
||||
|
||||
*Überwachung von fremden und eigenen Domains.*
|
||||
|
||||
**Tabs:**
|
||||
|
||||
- `Watching` (Fremde Domains)
|
||||
- `My Portfolio` (Eigene Domains - verifiziert)
|
||||
|
||||
**Die Tabelle:**
|
||||
|
||||
| **Spalte** | **Funktion** |
|
||||
| --- | --- |
|
||||
| **Domain** | Name |
|
||||
| **Health** | Ampel-System:
|
||||
🟢 Online
|
||||
🟡 DNS Changed
|
||||
🔴 Offline / Error |
|
||||
| **Expiry** | Datum (Tage bis Ablauf). Rot wenn < 30 Tage. |
|
||||
| **Change** | Letzte Änderung (z.B. "Nameserver updated 2h ago"). |
|
||||
| **Settings** | `[x] SMS Alert` `[x] Email Alert` |
|
||||
|
||||
---
|
||||
|
||||
### 5. Modul: LISTING (Verkaufen)
|
||||
|
||||
*Nur sichtbar für Trader ($9) und Tycoon ($29).*
|
||||
|
||||
**Der Prozess (Wizard):**
|
||||
|
||||
1. **Step 1: Input**
|
||||
- Domain eingeben.
|
||||
- Preis eingeben (Fixpreis oder "Verhandlungsbasis").
|
||||
2. **Step 2: Verification (Der Trust-Check)**
|
||||
- System zeigt einen Code: `pounce-verify-8392`.
|
||||
- User muss diesen als TXT-Record bei seinem Hoster hinterlegen.
|
||||
- Button: `[Verify DNS]`.
|
||||
- *Erst wenn grün:* Weiter zu Step 3.
|
||||
3. **Step 3: Publish**
|
||||
- Domain erscheint sofort im **MARKET** Feed mit dem Label `Pounce Direct`.
|
||||
|
||||
---
|
||||
|
||||
### 6. Modul: SETTINGS (Admin)
|
||||
|
||||
- **Subscription:** Upgrade/Downgrade (Stripe Integration).
|
||||
- **Verification:**
|
||||
- Handynummer bestätigen (SMS Code).
|
||||
- "Identity Verified" Badge beantragen.
|
||||
- **Notifications:**
|
||||
- "Sende mir Daily Digest".
|
||||
- "Sende mir Instant SMS bei Drops".
|
||||
|
||||
---
|
||||
|
||||
### Technische Logik für das MVP (Minimal Viable Product)
|
||||
|
||||
Damit du das alleine bauen kannst:
|
||||
|
||||
1. **Datenbank:** Eine Tabelle `domains`.
|
||||
- Spalte `type`: 'auction' (API) oder 'listing' (User).
|
||||
- Spalte `spam_score`: Berechnet beim Import.
|
||||
2. **Der Filter:**
|
||||
- Wenn ein User `MARKET` öffnet, läuft im Hintergrund eine Query:
|
||||
- `SELECT * FROM domains WHERE spam_score < 50`.
|
||||
- Das ist dein "Clean Feed".
|
||||
3. **Der Cronjob:**
|
||||
- Ein Skript läuft alle 6 Stunden durch die `WATCHLIST` Tabelle und macht einen HTTP-Request auf jede Domain. Wenn sich der Status Code ändert -> Email Trigger.
|
||||
|
||||
Fazit:
|
||||
|
||||
Diese Struktur wirkt nach außen wie ein mächtiges Enterprise-Tool, ist aber im Hintergrund "nur" eine schlau sortierte Datenbank mit ein paar Filtern. Das ist genau das, was du brauchst.
|
||||
|
||||
**Ja, absolut!**
|
||||
|
||||
Die "Pounce Direct" Angebote (also die Domains deiner User) sollten unbedingt auf der öffentlichen Market-Page sichtbar sein.
|
||||
|
||||
Warum?
|
||||
|
||||
1. **Reichweite für Verkäufer:** Deine zahlenden User (Trader/Tycoon) wollen ihre Domains verkaufen. Wenn du diese hinter einem Login versteckst, sehen sie 90% weniger Leute. Das macht dein Abo weniger attraktiv.
|
||||
2. **Unique Content:** Das sind die einzigen Domains, die es **exklusiv** nur bei dir gibt. Das unterscheidet deine Liste von allen anderen, die nur GoDaddy-Daten kopieren.
|
||||
|
||||
Hier ist, wie du sie strategisch auf der Public Page integrierst, ohne dass es chaotisch wirkt:
|
||||
|
||||
### 1. Die Darstellung in der Tabelle ("Highlighting")
|
||||
|
||||
Du mischst die User-Angebote unter die API-Daten (GoDaddy, Sedo), aber du hebst sie optisch hervor. Sie müssen wie "Premium-Content" wirken.
|
||||
|
||||
**So sieht die Public-Tabelle aus:**
|
||||
|
||||
| **Domain** | **Source** | **Price** | **Status** | **Action** |
|
||||
| --- | --- | --- | --- | --- |
|
||||
| **crypto-bank.io** | GoDaddy | $ 2,500 | ⏱️ 2h left | [Bid ↗] |
|
||||
| **zurich-immo.ch** | 💎 **Pounce** | **$ 950** | ⚡ **Instant** | **[View Deal]** |
|
||||
| **meta-shop.com** | Sedo | $ 5,000 | 🤝 Offer | [Bid ↗] |
|
||||
|
||||
**Die Unterschiede für Pounce-Listings:**
|
||||
|
||||
- **Source:** Statt eines Logos steht dort `💎 Pounce` oder `Direct`.
|
||||
- **Status:** Statt eines Countdowns steht dort `⚡ Instant` (sofort verfügbar).
|
||||
- **Farbe:** Hinterlege diese Zeile ganz leicht farblich (z.B. mit einem sehr dunklen Grün-Ton im Dark Mode), damit sie ins Auge springt.
|
||||
|
||||
---
|
||||
|
||||
### 2. Die "Conversion-Falle" (Der Klick-Moment)
|
||||
|
||||
Hier nutzt du die Neugier der Besucher, um sie zur Registrierung zu bringen.
|
||||
|
||||
Szenario:
|
||||
|
||||
Ein Besucher sieht zurich-immo.ch für $950 und denkt: "Wow, guter Preis, will ich haben."
|
||||
|
||||
1. **Der Klick:** Er klickt auf den Button **[View Deal]** oder **[Buy Now]**.
|
||||
2. Das Popup (The Gate):
|
||||
|
||||
Da es sich um einen Direktverkauf handelt, leitest du ihn nicht weiter (wie bei GoDaddy), sondern zeigst ein Modal-Fenster:
|
||||
|
||||
> 🔒 Secure Transaction
|
||||
>
|
||||
>
|
||||
> Du bist dabei, ein verifiziertes Direct-Listing anzusehen.
|
||||
>
|
||||
> Um den Verkäufer zu kontaktieren und Käuferschutz zu genießen, logge dich bitte ein.
|
||||
>
|
||||
> [Login] [Create Free Scout Account]
|
||||
>
|
||||
|
||||
**Warum das genial ist:**
|
||||
|
||||
- Du generierst Leads (Sign-ups) durch exklusive Angebote.
|
||||
- Du schützt den Verkäufer vor anonymem Spam.
|
||||
- Du behältst die Kontrolle über den Prozess.
|
||||
|
||||
---
|
||||
|
||||
### 3. Der Qualitäts-Filter (WICHTIG!)
|
||||
|
||||
Auch für User-Listings gilt auf der Public Page die **"Saubere Weste" Regel**.
|
||||
|
||||
- Wenn ein User eine "hässliche" Domain listet (z.B. `buy-cheap-kredit-24.info`), darf diese **NICHT** auf der Public Page erscheinen, auch wenn es ein Pounce-Listing ist.
|
||||
- **Regel:** Dein Algorithmus muss User-Listings genauso filtern wie API-Listings. Nur seriöse, gut aussehende Domains (keine Zahlen, keine Bindestrich-Wüsten) kommen auf die Startseite.
|
||||
- *Die hässlichen Listings* sind nur im eingeloggten Bereich ("Terminal") sichtbar, wo die Profis (Hunters) unterwegs sind, die wissen, was sie tun.
|
||||
|
||||
### Zusammenfassung
|
||||
|
||||
Ja, zeig sie öffentlich an. Mach sie zum Star der Tabelle.
|
||||
|
||||
Aber lass niemanden den Verkäufer kontaktieren, ohne sich vorher anzumelden. Das ist dein stärkster Hebel für neue User.
|
||||
Reference in New Issue
Block a user