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:
2025-12-10 21:39:53 +01:00
parent 58718f6169
commit bde898e62f
36 changed files with 1074 additions and 123 deletions

View File

@ -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)

View File

@ -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() {

View File

@ -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

View File

@ -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'

View File

@ -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>
)
}

View File

@ -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')

View File

@ -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)]"

View File

@ -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&apos;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"}

View File

@ -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'

View File

@ -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>
)
}

View File

@ -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>
)
}

View File

@ -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>
)
}

View File

@ -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>
)
}

View File

@ -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>
)
}

View File

@ -7,7 +7,7 @@ export default function CommandPage() {
const router = useRouter()
useEffect(() => {
router.replace('/command/dashboard')
router.replace('/terminal/dashboard')
}, [router])
return (

View File

@ -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>
)
}

View File

@ -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>
)
}

View File

@ -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>
)
}

View File

@ -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>
)
}

View File

@ -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>
)
}

View File

@ -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>
)
}

View File

@ -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>
)
}

View File

@ -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'}

View File

@ -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"

View File

@ -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&apos;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"

View File

@ -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>

View File

@ -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"
>

View File

@ -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)
}

View File

@ -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"
>

View File

@ -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
View 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
View 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
View 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
View 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
View 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
View 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.