feat: Complete Tone of Voice overhaul - The Hunter's Voice
Some checks failed
CI / Frontend Lint & Type Check (push) Has been cancelled
CI / Frontend Build (push) Has been cancelled
CI / Backend Lint (push) Has been cancelled
CI / Backend Tests (push) Has been cancelled
CI / Docker Build (push) Has been cancelled
CI / Security Scan (push) Has been cancelled
Deploy / Build & Push Images (push) Has been cancelled
Deploy / Deploy to Server (push) Has been cancelled
Deploy / Notify (push) Has been cancelled

🎯 BRAND VOICE: Swift, Sharp, Strategic, Confident

LANDING PAGE:
- Hero: 'Others wait. You pounce.'
- Features: Active, punchy descriptions
- Pricing: 'Pick your weapon.'
- CTAs: 'Hunt Free', 'Start Trading', 'Go Tycoon'

PRICING PAGE:
- Scout: 'Test the waters. Zero risk.'
- Trader: 'Hunt with precision.'
- Tycoon: 'Dominate the market.'

AUTH PAGES:
- Login: 'Back to the hunt.'
- Register: 'Join the hunt.'
- Benefits: 'Your hunting gear. Ready to go.'

EMAIL TEMPLATES:
- Domain Available: 'Time to pounce. [domain] just dropped'
- Price Alert: '.tld just moved.'
- Weekly Digest: 'Your week in domains.'
- Subscription: 'You're in. [Plan] unlocked.'

DASHBOARD:
- Title: 'Command Center'
- Empty State: 'No targets yet'

TLD PAGES:
- Headline: '886+ TLDs. Live Prices.'
- Section: 'Moving Now' instead of 'Trending'

CONTACT & ABOUT:
- About: 'Built for hunters. By hunters.'
- Mission: 'Level the playing field.'
- Contact: 'Let's Talk' - direct, confident

All text now follows the hunter metaphor with:
- Active verbs (Track, Hunt, Pounce, Grab)
- Urgency without panic
- Confident statements
- Data as proof
- Short, punchy sentences
This commit is contained in:
yves.gugger
2025-12-08 16:38:41 +01:00
parent df4d87a643
commit fde4f23663
10 changed files with 184 additions and 186 deletions

View File

@ -167,39 +167,39 @@ BASE_TEMPLATE = """
# Email Templates (content only, wrapped in BASE_TEMPLATE)
TEMPLATES = {
"domain_available": """
<h1>Domain Available!</h1>
<p>Great news! A domain you're monitoring is now available for registration:</p>
<h1>Time to pounce.</h1>
<p>A domain you're tracking just dropped:</p>
<div class="highlight">{{ domain }}</div>
<p>This domain was previously registered but has now expired or been deleted. Act fast before someone else registers it!</p>
<a href="{{ register_url }}" class="cta">Register Now →</a>
<p>It's available right now. Move fast—others are watching too.</p>
<a href="{{ register_url }}" class="cta">Grab It Now →</a>
<p style="margin-top: 24px; color: #888; font-size: 14px;">
You're receiving this because you're monitoring this domain on pounce.
You're tracking this domain on POUNCE.
</p>
""",
"price_alert": """
<h1>Price Alert: <span style="color: #00d4aa;">.{{ tld }}</span></h1>
<h1>.{{ tld }} just moved.</h1>
<p style="font-size: 20px;">
{% if change_percent < 0 %}
<span class="decrease">↓ Price dropped {{ change_percent|abs }}%</span>
<span class="decrease">↓ Down {{ change_percent|abs }}%</span>
{% else %}
<span class="increase">↑ Price increased {{ change_percent }}%</span>
<span class="increase">↑ Up {{ change_percent }}%</span>
{% endif %}
</p>
<div class="info-box">
<p><strong>Old price:</strong> ${{ old_price }}</p>
<p><strong>New price:</strong> ${{ new_price }}</p>
<p><strong>Cheapest registrar:</strong> {{ registrar }}</p>
<p><strong>Was:</strong> ${{ old_price }}</p>
<p><strong>Now:</strong> ${{ new_price }}</p>
<p><strong>Cheapest at:</strong> {{ registrar }}</p>
</div>
<a href="{{ tld_url }}" class="cta">View Details →</a>
<a href="{{ tld_url }}" class="cta">See Details →</a>
<p style="margin-top: 24px; color: #888; font-size: 14px;">
You're receiving this because you set a price alert for .{{ tld }} on pounce.
You set an alert for .{{ tld }} on POUNCE.
</p>
""",
"subscription_confirmed": """
<h1>Welcome to {{ plan_name }}!</h1>
<p>Your subscription is now active. Here's what you can do:</p>
<h1>You're in. {{ plan_name }} unlocked.</h1>
<p>Your hunting arsenal just upgraded:</p>
<div class="info-box">
<ul>
{% for feature in features %}
@ -207,18 +207,18 @@ TEMPLATES = {
{% endfor %}
</ul>
</div>
<a href="{{ dashboard_url }}" class="cta">Go to Dashboard →</a>
<a href="{{ dashboard_url }}" class="cta">Start Hunting →</a>
<p style="margin-top: 24px; color: #888; font-size: 14px;">
Questions? Reply to this email or contact support@pounce.ch
Questions? Just reply to this email.
</p>
""",
"weekly_digest": """
<h1>Your Weekly Digest</h1>
<p>Here's what happened with your monitored domains this week:</p>
<h1>Your week in domains.</h1>
<p>Here's what moved while you were busy:</p>
<div class="stat">
<span>Domains Monitored</span>
<span>Domains Tracked</span>
<span class="stat-value">{{ total_domains }}</span>
</div>
<div class="stat">
@ -226,12 +226,12 @@ TEMPLATES = {
<span class="stat-value">{{ status_changes }}</span>
</div>
<div class="stat">
<span>Price Alerts</span>
<span>Price Moves</span>
<span class="stat-value">{{ price_alerts }}</span>
</div>
{% if available_domains %}
<h2>Domains Now Available</h2>
<h2>Dropped This Week</h2>
<div class="info-box">
{% for domain in available_domains %}
<p class="highlight" style="margin: 8px 0;">{{ domain }}</p>
@ -243,38 +243,37 @@ TEMPLATES = {
""",
"password_reset": """
<h1>Reset Your Password</h1>
<p>Hi {{ user_name }},</p>
<p>We received a request to reset your password. Click the button below to set a new password:</p>
<h1>Reset your password.</h1>
<p>Hey {{ user_name }},</p>
<p>Someone requested a password reset. If that was you, click below:</p>
<a href="{{ reset_url }}" class="cta">Reset Password →</a>
<p style="margin-top: 24px;">Or copy and paste this link into your browser:</p>
<p style="margin-top: 24px;">Or copy this link:</p>
<code style="word-break: break-all;">{{ reset_url }}</code>
<div class="info-box" style="margin-top: 24px;">
<p class="warning" style="margin: 0;">⚠️ This link expires in 1 hour.</p>
<p class="warning" style="margin: 0;">Link expires in 1 hour.</p>
</div>
<p style="margin-top: 24px; color: #888; font-size: 14px;">
If you didn't request a password reset, you can safely ignore this email.
Your password won't be changed.
Didn't request this? Ignore it. Nothing changes.
</p>
""",
"email_verification": """
<h1>Verify Your Email</h1>
<p>Hi {{ user_name }},</p>
<p>Welcome to pounce! Please verify your email address to activate your account:</p>
<a href="{{ verification_url }}" class="cta">Verify Email →</a>
<p style="margin-top: 24px;">Or copy and paste this link into your browser:</p>
<h1>One click to start hunting.</h1>
<p>Hey {{ user_name }},</p>
<p>Welcome to POUNCE. Verify your email to activate your account:</p>
<a href="{{ verification_url }}" class="cta">Verify & Start →</a>
<p style="margin-top: 24px;">Or copy this link:</p>
<code style="word-break: break-all;">{{ verification_url }}</code>
<div class="info-box" style="margin-top: 24px;">
<p style="margin: 0;">This link expires in 24 hours.</p>
<p style="margin: 0;">Link expires in 24 hours.</p>
</div>
<p style="margin-top: 24px; color: #888; font-size: 14px;">
If you didn't create an account on pounce, you can safely ignore this email.
Didn't sign up? Just ignore this.
</p>
""",
"contact_form": """
<h1>New Contact Form Submission</h1>
<h1>New message from the wild.</h1>
<div class="info-box">
<p><strong>From:</strong> {{ name }} &lt;{{ email }}&gt;</p>
<p><strong>Subject:</strong> {{ subject }}</p>
@ -285,39 +284,39 @@ TEMPLATES = {
<p style="white-space: pre-wrap;">{{ message }}</p>
</div>
<p style="margin-top: 24px;">
<a href="mailto:{{ email }}" class="cta">Reply to {{ name }} →</a>
<a href="mailto:{{ email }}" class="cta">Reply →</a>
</p>
""",
"contact_confirmation": """
<h1>We've Received Your Message</h1>
<p>Hi {{ name }},</p>
<p>Thank you for contacting pounce! We've received your message and will get back to you as soon as possible.</p>
<h1>Got it.</h1>
<p>Hey {{ name }},</p>
<p>Your message landed. We'll get back to you soon.</p>
<div class="info-box">
<p><strong>Subject:</strong> {{ subject }}</p>
<p><strong>Your message:</strong></p>
<p style="white-space: pre-wrap; color: #888;">{{ message }}</p>
</div>
<p>We typically respond within 24-48 hours during business days.</p>
<a href="https://pounce.ch" class="secondary-cta">Back to pounce →</a>
<p>Expect a reply within 24-48 hours.</p>
<a href="https://pounce.ch" class="secondary-cta">Back to POUNCE →</a>
""",
"newsletter_welcome": """
<h1>Welcome to pounce Insights!</h1>
<p>Hi there,</p>
<p>You're now subscribed to our newsletter. Here's what you can expect:</p>
<h1>You're on the list.</h1>
<p>Welcome to POUNCE Insights.</p>
<p>Here's what you'll get:</p>
<div class="info-box">
<ul>
<li>TLD market trends and analysis</li>
<li>Domain investing tips and strategies</li>
<li>New feature announcements</li>
<li>Exclusive deals and discounts</li>
<li>TLD market moves & analysis</li>
<li>Domain investing strategies</li>
<li>New feature drops</li>
<li>Exclusive deals</li>
</ul>
</div>
<p>We typically send 1-2 emails per month. No spam, ever.</p>
<a href="https://pounce.ch" class="cta">Explore pounce →</a>
<p>1-2 emails per month. No spam. Ever.</p>
<a href="https://pounce.ch" class="cta">Start Exploring →</a>
<p style="margin-top: 24px; color: #888; font-size: 14px;">
You can unsubscribe at any time by clicking the link at the bottom of any email.
Unsubscribe anytime with one click.
</p>
""",
}
@ -437,9 +436,9 @@ class EmailService:
return await EmailService.send_email(
to_email=to_email,
subject=f"🎉 Domain Available: {domain}",
subject=f"🐆 POUNCE NOW: {domain} just dropped",
html_content=html,
text_content=f"Great news! {domain} is now available for registration. Visit {register_url} to register.",
text_content=f"{domain} is available! Grab it now: {register_url}",
)
@staticmethod
@ -463,12 +462,12 @@ class EmailService:
tld_url=f"https://pounce.ch/tld-pricing/{tld}",
)
direction = "dropped" if change_percent < 0 else "increased"
direction = "down" if change_percent < 0 else "up"
return await EmailService.send_email(
to_email=to_email,
subject=f"📊 Price Alert: .{tld} {direction} {abs(change_percent)}%",
subject=f"💰 .{tld} moved {direction} {abs(change_percent)}%",
html_content=html,
text_content=f".{tld} price {direction} from ${old_price:.2f} to ${new_price:.2f} at {registrar}.",
text_content=f".{tld} is now ${new_price:.2f} (was ${old_price:.2f}) at {registrar}.",
)
# ============== Subscription ==============
@ -489,9 +488,9 @@ class EmailService:
return await EmailService.send_email(
to_email=to_email,
subject=f"✅ Welcome to pounce {plan_name}!",
subject=f"🎯 {plan_name} unlocked. Let's hunt.",
html_content=html,
text_content=f"Your {plan_name} subscription is now active. Visit https://pounce.ch/dashboard to get started.",
text_content=f"Your {plan_name} plan is active. Start hunting: https://pounce.ch/dashboard",
)
# ============== Digest ==============
@ -516,7 +515,7 @@ class EmailService:
return await EmailService.send_email(
to_email=to_email,
subject="📬 Your pounce Weekly Digest",
subject="📊 Your week in domains",
html_content=html,
text_content=f"This week: {total_domains} domains monitored, {status_changes} status changes, {price_alerts} price alerts.",
)
@ -538,9 +537,9 @@ class EmailService:
return await EmailService.send_email(
to_email=to_email,
subject="🔒 Reset Your pounce Password",
subject="Reset your POUNCE password",
html_content=html,
text_content=f"Hi {user_name}, reset your password by visiting: {reset_url}. This link expires in 1 hour.",
text_content=f"Reset your password: {reset_url} (expires in 1 hour)",
)
@staticmethod
@ -558,9 +557,9 @@ class EmailService:
return await EmailService.send_email(
to_email=to_email,
subject="✉️ Verify Your pounce Email",
subject="Verify your email. Start hunting.",
html_content=html,
text_content=f"Hi {user_name}, verify your email by visiting: {verification_url}. This link expires in 24 hours.",
text_content=f"Verify your POUNCE account: {verification_url}",
)
# ============== Contact Form ==============
@ -605,9 +604,9 @@ class EmailService:
confirm_sent = await EmailService.send_email(
to_email=email,
subject="We've received your message - pounce",
subject="Got your message. We'll be in touch.",
html_content=confirm_html,
text_content=f"Hi {name}, we've received your message and will get back to you soon.",
text_content=f"Hey {name}, we received your message. Expect a reply within 24-48 hours.",
)
return support_sent # Return whether support email was sent
@ -623,9 +622,9 @@ class EmailService:
return await EmailService.send_email(
to_email=to_email,
subject="🎉 Welcome to pounce Insights!",
subject="You're on the list. Welcome to POUNCE.",
html_content=html,
text_content="Welcome to pounce Insights! You'll receive TLD market trends, domain investing tips, and feature announcements.",
text_content="Welcome to POUNCE Insights. Expect market moves, strategies, and feature drops. No spam.",
)

View File

@ -9,47 +9,47 @@ const values = [
{
icon: Target,
title: 'Precision',
description: 'Every check, every alert, every data point is accurate and reliable.',
description: 'Accurate data. No guesswork. Every check counts.',
},
{
icon: Shield,
title: 'Privacy',
description: 'Your domain strategy is confidential. We never share or sell your data.',
description: 'Your strategy stays yours. We never share or sell data.',
},
{
icon: Zap,
title: 'Speed',
description: 'Real-time monitoring ensures you never miss a domain opportunity.',
description: 'Real-time intel. You see it first.',
},
{
icon: Users,
title: 'Transparency',
description: 'Clear pricing, honest communication, no hidden fees or surprises.',
description: 'Clear pricing. No surprises. Ever.',
},
]
const stats = [
{ value: '500K+', label: 'Domains Monitored' },
{ value: '500K+', label: 'Domains Tracked' },
{ value: '99.9%', label: 'Uptime' },
{ value: '50ms', label: 'Avg Response Time' },
{ value: '24/7', label: 'Monitoring' },
{ value: '50ms', label: 'Response Time' },
{ value: '24/7', label: 'Always On' },
]
const team = [
{
name: 'Domain Intelligence',
role: 'Core Feature',
description: 'Advanced WHOIS and RDAP queries for accurate availability detection.',
name: 'Domain Intel',
role: 'Core',
description: 'WHOIS + RDAP queries. Accurate. Reliable. Always.',
},
{
name: 'Price Tracking',
role: 'Market Insights',
description: 'Real-time TLD pricing from major registrars worldwide.',
role: 'Market',
description: 'Real-time TLD pricing. Know what domains cost.',
},
{
name: 'Instant Alerts',
role: 'Notifications',
description: 'Email and webhook notifications the moment domains become available.',
role: 'Notify',
description: 'Domain drops? You know first. Email or webhook.',
},
]
@ -72,13 +72,13 @@ export default function AboutPage() {
<span className="text-ui-sm text-foreground-muted">About pounce</span>
</div>
<h1 className="font-display text-[2.25rem] sm:text-[3rem] md:text-[3.75rem] leading-[1.1] tracking-[-0.035em] text-foreground mb-6">
Domain intelligence,
Built for hunters.
<br />
<span className="text-foreground-muted">simplified.</span>
<span className="text-foreground-muted">By hunters.</span>
</h1>
<p className="text-body-lg text-foreground-muted max-w-2xl mx-auto">
We built pounce to give domain investors, businesses, and individuals
the tools they need to secure high-value domains before anyone else.
POUNCE exists for one reason: to give you the edge.
Track domains. See opportunities. Move first.
</p>
</div>
@ -101,13 +101,12 @@ export default function AboutPage() {
<section className="mb-20 animate-slide-up">
<div className="p-8 sm:p-10 bg-gradient-to-br from-accent/10 via-accent/5 to-transparent border border-accent/20 rounded-2xl">
<h2 className="text-heading-sm sm:text-heading-md font-medium text-foreground mb-4">
Our Mission
The Mission
</h2>
<p className="text-body-lg text-foreground-muted leading-relaxed">
To democratize domain intelligence. We believe everyone should have access to
professional-grade domain monitoring tools, not just large corporations with
expensive enterprise solutions. pounce makes it possible to track any domain,
understand market trends, and act fast when opportunities arise.
Level the playing field. Domain intel shouldn&apos;t be locked behind enterprise
paywalls. With POUNCE, anyone can track domains, spot trends, and strike
when the iron&apos;s hot. Simple tools. Powerful results.
</p>
</div>
</section>
@ -115,7 +114,7 @@ export default function AboutPage() {
{/* Values */}
<section className="mb-20">
<h2 className="text-heading-sm sm:text-heading-md font-medium text-foreground mb-8 text-center">
What We Stand For
Our Code
</h2>
<div className="grid sm:grid-cols-2 gap-4">
{values.map((value, i) => (
@ -163,24 +162,24 @@ export default function AboutPage() {
{/* CTA */}
<section className="text-center animate-slide-up">
<h2 className="text-heading-sm sm:text-heading-md font-medium text-foreground mb-4">
Ready to get started?
Ready to hunt?
</h2>
<p className="text-body text-foreground-muted mb-8">
Join thousands of domain professionals using pounce.
Join the hunters who move first.
</p>
<div className="flex flex-col sm:flex-row items-center justify-center gap-3">
<Link
href="/register"
className="flex items-center gap-2 px-6 py-3 bg-accent text-background font-medium rounded-xl hover:bg-accent-hover transition-all"
>
Start Free
Start Hunting
<ArrowRight className="w-4 h-4" />
</Link>
<Link
href="/contact"
className="flex items-center gap-2 px-6 py-3 bg-background-secondary border border-border text-foreground font-medium rounded-xl hover:border-border-hover transition-all"
>
Contact Us
Get in Touch
</Link>
</div>
</section>

View File

@ -11,21 +11,21 @@ const contactMethods = [
{
icon: Mail,
title: 'Email',
description: 'For general inquiries and support',
value: 'support@pounce.dev',
href: 'mailto:support@pounce.dev',
description: 'Questions? Ideas? Issues?',
value: 'hello@pounce.ch',
href: 'mailto:hello@pounce.ch',
},
{
icon: MessageSquare,
title: 'Live Chat',
description: 'Available Mon-Fri, 9am-6pm CET',
description: 'Mon-Fri, 9am-6pm CET',
value: 'Start a conversation',
href: '#',
},
{
icon: Clock,
title: 'Response Time',
description: 'We typically respond within',
description: 'We reply fast.',
value: '< 24 hours',
href: null,
},
@ -33,16 +33,16 @@ const contactMethods = [
const faqs = [
{
q: 'How do I reset my password?',
a: 'Click "Forgot Password" on the login page and follow the instructions sent to your email.',
q: 'Forgot my password?',
a: 'Hit "Forgot Password" on login. Check your email. Done.',
},
{
q: 'Can I upgrade my plan mid-cycle?',
a: 'Yes, upgrades are applied immediately and you\'ll only pay the prorated difference.',
q: 'Can I upgrade mid-cycle?',
a: 'Yes. Pay the difference. New features unlock instantly.',
},
{
q: 'Do you offer refunds?',
a: 'We offer a 14-day money-back guarantee on all paid plans, no questions asked.',
q: 'Refunds?',
a: '14-day money-back. No questions. No hassle.',
},
]
@ -99,10 +99,10 @@ export default function ContactPage() {
<span className="text-ui-sm text-foreground-muted">Get in Touch</span>
</div>
<h1 className="font-display text-[2.25rem] sm:text-[3rem] md:text-[3.75rem] leading-[1.1] tracking-[-0.035em] text-foreground mb-4">
Contact Us
Let&apos;s Talk
</h1>
<p className="text-body-lg text-foreground-muted max-w-xl mx-auto">
Have a question or need help? We're here for you.
Question? Idea? Problem? We&apos;re listening.
</p>
</div>

View File

@ -438,10 +438,10 @@ export default function DashboardPage() {
<div className="flex flex-col sm:flex-row sm:items-end sm:justify-between gap-4">
<div>
<h1 className="font-display text-[2rem] sm:text-[2.5rem] leading-[1.1] tracking-[-0.03em] text-foreground mb-1.5">
Dashboard
Command Center
</h1>
<p className="text-body-sm text-foreground-muted">
Manage your domains and track investments
Your domains. Your intel. Your edge.
</p>
</div>
@ -599,9 +599,9 @@ export default function DashboardPage() {
<div className="w-12 h-12 bg-background-tertiary rounded-xl flex items-center justify-center mx-auto mb-4">
<Eye className="w-6 h-6 text-foreground-subtle" />
</div>
<p className="text-body text-foreground-muted mb-1">Your watchlist is empty</p>
<p className="text-body text-foreground-muted mb-1">No targets yet</p>
<p className="text-body-sm text-foreground-subtle">
Add your first domain above to start monitoring
Add a domain above to start hunting
</p>
</div>
) : (

View File

@ -60,9 +60,9 @@ export default function LoginPage() {
{/* Header */}
<div className="text-center mb-8 sm:mb-10">
<h1 className="font-display text-[2rem] sm:text-[2.5rem] md:text-[3rem] leading-[1.1] tracking-[-0.03em] text-foreground mb-2 sm:mb-3">Welcome back</h1>
<h1 className="font-display text-[2rem] sm:text-[2.5rem] md:text-[3rem] leading-[1.1] tracking-[-0.03em] text-foreground mb-2 sm:mb-3">Back to the hunt.</h1>
<p className="text-body-sm sm:text-body text-foreground-muted">
Sign in to access your watchlist
Sign in to your account
</p>
</div>

View File

@ -14,23 +14,23 @@ import clsx from 'clsx'
const features = [
{
icon: Eye,
title: 'Continuous Monitoring',
description: 'Automated WHOIS and DNS queries check your domains daily.',
title: 'Always Watching',
description: 'Daily scans. 886+ TLDs. You sleep, we hunt.',
},
{
icon: Bell,
title: 'Instant Notifications',
description: 'Get notified the moment a domain becomes available.',
title: 'Instant Alerts',
description: 'Domain drops? You know first. Always.',
},
{
icon: Clock,
title: 'Expiration Tracking',
description: 'Track expiration dates and plan ahead for domain drops.',
title: 'Expiry Intel',
description: 'See when domains expire. Plan your move.',
},
{
icon: Shield,
title: 'Private & Secure',
description: 'Self-hosted infrastructure. Your strategy stays confidential.',
title: 'Your Strategy, Private',
description: 'No one sees your watchlist. Ever.',
},
]
@ -39,16 +39,16 @@ const tiers = [
name: 'Scout',
price: '0',
period: '',
description: 'Explore the domain market',
description: 'Test the waters. Zero risk.',
features: ['5 domains', 'Daily checks', 'Email alerts', 'Basic search'],
cta: 'Start Free',
cta: 'Hunt Free',
highlighted: false,
},
{
name: 'Trader',
price: '19',
period: '/mo',
description: 'For serious domain investors',
description: 'Hunt with precision.',
features: ['50 domains', 'Hourly checks', 'SMS alerts', 'Domain valuation', 'Portfolio tracking'],
cta: 'Start Trading',
highlighted: true,
@ -57,7 +57,7 @@ const tiers = [
name: 'Tycoon',
price: '49',
period: '/mo',
description: 'For professionals & agencies',
description: 'Dominate the market.',
features: ['500 domains', 'Real-time checks', 'API access', 'SEO metrics', 'Bulk tools'],
cta: 'Go Tycoon',
highlighted: false,
@ -165,14 +165,14 @@ export default function HomePage() {
{/* Main Headline - RESPONSIVE */}
<h1 className="font-display text-[2.25rem] leading-[1.1] sm:text-[3rem] md:text-[3.75rem] lg:text-[4.5rem] xl:text-[5.25rem] tracking-[-0.035em] mb-6 sm:mb-8 md:mb-10 animate-slide-up">
<span className="block text-foreground">The domains you want.</span>
<span className="block text-foreground-muted">The moment they&apos;re free.</span>
<span className="block text-foreground">Others wait.</span>
<span className="block text-foreground-muted">You pounce.</span>
</h1>
{/* Subheadline - RESPONSIVE */}
<p className="text-body-md sm:text-body-lg md:text-body-xl text-foreground-muted max-w-xl sm:max-w-2xl mx-auto mb-10 sm:mb-12 md:mb-16 animate-slide-up delay-100 px-4 sm:px-0">
Monitor any domain. Track expiration dates. Get notified instantly
when your target domains become available for registration.
Domain intelligence for the decisive. Track any domain.
Know the moment it drops. Move before anyone else.
</p>
{/* Domain Checker */}
@ -189,13 +189,13 @@ export default function HomePage() {
<div className="text-center mb-10 sm:mb-12">
<div className="inline-flex items-center gap-2 px-3 py-1.5 bg-accent-muted border border-accent/20 rounded-full mb-5">
<TrendingUp className="w-4 h-4 text-accent" />
<span className="text-ui-sm text-accent">Market Insights</span>
<span className="text-ui-sm text-accent">Market Intel</span>
</div>
<h2 className="font-display text-[1.75rem] sm:text-[2.5rem] md:text-[3.25rem] lg:text-[4rem] leading-[1.1] tracking-[-0.03em] text-foreground mb-4 sm:mb-5 md:mb-6">
TLD Price Intelligence
886 TLDs. Tracked Daily.
</h2>
<p className="text-body-sm sm:text-body text-foreground-muted max-w-lg mx-auto">
Track how domain extension prices evolve. Compare registrars.
See price movements. Spot opportunities. Act fast.
</p>
</div>
@ -299,10 +299,10 @@ export default function HomePage() {
<div className="text-center mb-12 sm:mb-16 md:mb-20">
<p className="label sm:label-md text-accent mb-3 sm:mb-4 md:mb-5">How It Works</p>
<h2 className="font-display text-[1.75rem] sm:text-[2.5rem] md:text-[3.25rem] lg:text-[4rem] leading-[1.1] tracking-[-0.03em] text-foreground mb-4 sm:mb-5 md:mb-6">
Professional domain intelligence
Built for hunters.
</h2>
<p className="text-body-sm sm:text-body md:text-body-lg text-foreground-muted max-w-md sm:max-w-lg mx-auto px-4 sm:px-0">
Everything you need to secure high-value domains before anyone else.
The tools that give you the edge. Simple. Powerful. Decisive.
</p>
</div>
@ -336,10 +336,10 @@ export default function HomePage() {
<div className="text-center mb-12 sm:mb-16 md:mb-20">
<p className="label sm:label-md text-accent mb-3 sm:mb-4 md:mb-5">Pricing</p>
<h2 className="font-display text-[1.75rem] sm:text-[2.5rem] md:text-[3.25rem] lg:text-[4rem] leading-[1.1] tracking-[-0.03em] text-foreground mb-4 sm:mb-5 md:mb-6">
Simple, transparent plans
Pick your weapon.
</h2>
<p className="text-body-sm sm:text-body md:text-body-lg text-foreground-muted">
Start free. Upgrade as your portfolio grows.
Start free. Scale when you&apos;re ready.
</p>
</div>

View File

@ -17,15 +17,15 @@ const tiers = [
icon: Zap,
price: '0',
period: '',
description: 'Explore the domain market',
description: 'Test the waters. Zero risk.',
features: [
{ text: '5 domains in watchlist', highlight: false },
{ text: 'Daily availability checks', highlight: false },
{ text: 'Email notifications', highlight: false },
{ text: 'Basic domain search', highlight: false },
{ text: '5 domains to track', highlight: false },
{ text: 'Daily availability scans', highlight: false },
{ text: 'Email alerts', highlight: false },
{ text: 'Basic search', highlight: false },
{ text: 'TLD price overview', highlight: false },
],
cta: 'Start Free',
cta: 'Hunt Free',
highlighted: false,
badge: null,
isPaid: false,
@ -36,14 +36,14 @@ const tiers = [
icon: TrendingUp,
price: '19',
period: '/mo',
description: 'For serious domain investors',
description: 'Hunt with precision. Daily intel.',
features: [
{ text: '50 domains in watchlist', highlight: true },
{ text: 'Hourly availability checks', highlight: true },
{ text: '50 domains to track', highlight: true },
{ text: 'Hourly scans', highlight: true },
{ text: 'SMS & Telegram alerts', highlight: true },
{ text: 'Full TLD market data', highlight: false },
{ text: 'Full market data', highlight: false },
{ text: 'Domain valuation', highlight: true },
{ text: 'Portfolio tracking (25 domains)', highlight: true },
{ text: 'Portfolio (25 domains)', highlight: true },
{ text: '90-day price history', highlight: false },
],
cta: 'Start Trading',
@ -57,12 +57,12 @@ const tiers = [
icon: Crown,
price: '49',
period: '/mo',
description: 'For professionals & agencies',
description: 'Dominate the market. No limits.',
features: [
{ text: '500 domains in watchlist', highlight: true },
{ text: 'Real-time checks (10 min)', highlight: true },
{ text: '500 domains to track', highlight: true },
{ text: 'Real-time scans (10 min)', highlight: true },
{ text: 'Priority alerts + Webhooks', highlight: true },
{ text: 'Full REST API access', highlight: true },
{ text: 'Full REST API', highlight: true },
{ text: 'SEO metrics (DA/PA)', highlight: true },
{ text: 'Unlimited portfolio', highlight: true },
{ text: 'Bulk import/export', highlight: true },
@ -70,7 +70,7 @@ const tiers = [
],
cta: 'Go Tycoon',
highlighted: false,
badge: 'Best Value',
badge: 'Full Power',
isPaid: true,
},
]
@ -88,16 +88,16 @@ const comparisonFeatures = [
const faqs = [
{
q: 'How does domain monitoring work?',
a: 'We perform automated WHOIS, RDAP and DNS queries on your watchlist domains. When a domain becomes available or its status changes, you\'ll receive an instant notification via your preferred channel.',
q: 'How fast will I know when a domain drops?',
a: 'Depends on your plan. Scout: daily. Trader: hourly. Tycoon: every 10 minutes. When it drops, you\'ll know.',
},
{
q: 'What is domain valuation?',
a: 'Our valuation algorithm analyzes factors like domain length, TLD popularity, keyword value, brandability, and comparable sales to estimate a domain\'s market value.',
q: 'What\'s domain valuation?',
a: 'Our algorithm scores domains on length, TLD value, keywords, and brandability. Know what a domain is worth before you buy.',
},
{
q: 'Can I track domains I already own?',
a: 'Yes! With Trader and Tycoon plans, you can add domains to your portfolio to track their value, renewal dates, and overall ROI.',
a: 'Absolutely. Trader and Tycoon plans include portfolio tracking. See value changes, renewal dates, and ROI at a glance.',
},
{
q: 'How accurate is the SEO data?',
@ -199,10 +199,10 @@ export default function PricingPage() {
<span className="text-ui-sm text-foreground-muted">Pricing</span>
</div>
<h1 className="font-display text-[2.25rem] sm:text-[3rem] md:text-[3.75rem] leading-[1.1] tracking-[-0.035em] text-foreground mb-4 animate-slide-up">
Invest in your domain strategy
Pick your weapon.
</h1>
<p className="text-body-lg text-foreground-muted max-w-2xl mx-auto mb-8 animate-slide-up">
From hobbyist to professional domainer. Choose the plan that matches your ambition.
Casual observer or full-time hunter? We&apos;ve got you covered.
</p>
{/* Error Message */}

View File

@ -21,10 +21,10 @@ function Logo() {
}
const benefits = [
'Monitor up to 3 domains free',
'Daily availability checks',
'Instant email notifications',
'Track expiration dates',
'Track up to 5 domains. Free.',
'Daily scans. You never miss a drop.',
'Instant alerts. Know first.',
'Expiry intel. Plan your move.',
]
export default function RegisterPage() {
@ -69,9 +69,9 @@ export default function RegisterPage() {
{/* Header */}
<div className="mb-8 sm:mb-10">
<h1 className="font-display text-[2rem] sm:text-[2.5rem] md:text-[3rem] leading-[1.1] tracking-[-0.03em] text-foreground mb-2 sm:mb-3">Create your account</h1>
<h1 className="font-display text-[2rem] sm:text-[2.5rem] md:text-[3rem] leading-[1.1] tracking-[-0.03em] text-foreground mb-2 sm:mb-3">Join the hunt.</h1>
<p className="text-body-sm sm:text-body text-foreground-muted">
Start monitoring domains in under a minute
Start tracking domains in under a minute
</p>
</div>
@ -128,7 +128,7 @@ export default function RegisterPage() {
<Loader2 className="w-4 h-4 animate-spin" />
) : (
<>
Get Started
Start Hunting
<ArrowRight className="w-3.5 sm:w-4 h-3.5 sm:h-4" />
</>
)}
@ -150,11 +150,11 @@ export default function RegisterPage() {
<div className="max-w-sm animate-slide-up delay-200">
<div className="inline-flex items-center gap-2 sm:gap-2.5 px-3 sm:px-4 py-1.5 sm:py-2 bg-background-tertiary border border-border rounded-full mb-8 sm:mb-10">
<div className="w-1.5 h-1.5 rounded-full bg-accent" />
<span className="text-ui-sm sm:text-ui text-foreground-muted">Free Plan Included</span>
<span className="text-ui-sm sm:text-ui text-foreground-muted">Free Forever</span>
</div>
<h2 className="font-display text-[1.75rem] sm:text-[2.25rem] md:text-[2.75rem] leading-[1.15] tracking-[-0.025em] text-foreground mb-8 sm:mb-10">
Everything you need to get started
Your hunting gear. Ready to go.
</h2>
<ul className="space-y-4 sm:space-y-5">

View File

@ -272,13 +272,13 @@ export default function TldPricingPage() {
<div className="text-center mb-12 sm:mb-16 animate-fade-in">
<div className="inline-flex items-center gap-2 px-3 py-1.5 bg-background-secondary/80 backdrop-blur-sm border border-border rounded-full mb-6">
<BarChart3 className="w-4 h-4 text-accent" />
<span className="text-ui-sm text-foreground-muted">TLD Price Intelligence</span>
<span className="text-ui-sm text-foreground-muted">Market Intel</span>
</div>
<h1 className="font-display text-[2rem] sm:text-[2.75rem] md:text-[3.5rem] lg:text-[4rem] leading-[1.1] tracking-[-0.03em] text-foreground mb-4">
Domain Extension Pricing
{pagination.total}+ TLDs. Live Prices.
</h1>
<p className="text-body sm:text-body-lg text-foreground-muted max-w-2xl mx-auto">
Track price trends across {pagination.total}+ TLDs. Compare prices and monitor trends over time.
See what domains cost. Spot trends. Find opportunities.
</p>
</div>
@ -290,9 +290,9 @@ export default function TldPricingPage() {
<Lock className="w-5 h-5 text-accent" />
</div>
<div>
<p className="text-body-sm font-medium text-foreground">Unlock Full TLD Data</p>
<p className="text-body-sm font-medium text-foreground">See the full picture</p>
<p className="text-ui-sm text-foreground-muted">
Sign in to see detailed pricing, charts, and trends.
Sign in for detailed pricing, charts, and trends.
</p>
</div>
</div>
@ -301,7 +301,7 @@ export default function TldPricingPage() {
className="shrink-0 px-5 py-2.5 bg-accent text-background text-ui font-medium rounded-lg
hover:bg-accent-hover transition-all duration-300"
>
Get Started Free
Hunt Free
</Link>
</div>
)}
@ -311,7 +311,7 @@ export default function TldPricingPage() {
<div className="mb-12 sm:mb-16 animate-slide-up">
<h2 className="text-body-lg sm:text-heading-sm font-medium text-foreground mb-4 sm:mb-6 flex items-center gap-2">
<TrendingUp className="w-5 h-5 text-accent" />
Trending Now
Moving Now
</h2>
<div className="grid sm:grid-cols-2 lg:grid-cols-4 gap-3 sm:gap-4">
{trending.map((item) => (

View File

@ -84,7 +84,7 @@ export function DomainChecker() {
onChange={(e) => setDomain(e.target.value)}
onFocus={() => setIsFocused(true)}
onBlur={() => setIsFocused(false)}
placeholder="Enter any domain name..."
placeholder="Hunt any domain..."
className="w-full px-4 sm:px-6 py-4 sm:py-5 pr-28 sm:pr-36 bg-transparent rounded-xl sm:rounded-2xl
text-body-sm sm:text-body-lg text-foreground placeholder:text-foreground-subtle
focus:outline-none transition-colors"
@ -108,7 +108,7 @@ export function DomainChecker() {
</div>
<p className="mt-4 sm:mt-5 text-center text-ui-sm sm:text-ui text-foreground-subtle">
Try <span className="text-foreground-muted">example.com</span>, <span className="text-foreground-muted">startup.io</span>, or <span className="text-foreground-muted">brand.co</span>
Try <span className="text-foreground-muted">dream.com</span>, <span className="text-foreground-muted">startup.io</span>, or <span className="text-foreground-muted">next.co</span>
</p>
</form>
@ -136,7 +136,7 @@ export function DomainChecker() {
{result.domain}
</p>
<p className="text-body-sm text-accent text-left">
Available for registration
It&apos;s yours for the taking.
</p>
</div>
<span className="px-3 py-1.5 bg-accent text-background text-ui-sm font-medium rounded-lg shrink-0">
@ -149,7 +149,7 @@ export function DomainChecker() {
<div className="p-4 sm:p-5 bg-background-secondary border-t border-accent/20">
<div className="flex flex-col sm:flex-row sm:items-center sm:justify-between gap-3 sm:gap-4">
<p className="text-body-sm text-foreground-muted text-left">
Secure this domain or add it to your watchlist.
Grab it now or track it in your watchlist.
</p>
<Link
href={isAuthenticated ? '/dashboard' : '/register'}
@ -158,7 +158,7 @@ export function DomainChecker() {
hover:bg-accent-hover transition-all duration-300"
>
<Plus className="w-4 h-4" />
<span>Add to Watchlist</span>
<span>Track This</span>
</Link>
</div>
</div>
@ -177,7 +177,7 @@ export function DomainChecker() {
{result.domain}
</p>
<p className="text-body-sm text-foreground-muted text-left">
Currently registered
Someone got there first. For now.
</p>
</div>
<span className="px-3 py-1.5 bg-background-tertiary text-foreground-muted text-ui-sm font-medium rounded-lg border border-border shrink-0">
@ -265,7 +265,7 @@ export function DomainChecker() {
<div className="flex flex-col sm:flex-row sm:items-center sm:justify-between gap-3 sm:gap-4">
<div className="flex items-center gap-2 text-body-sm text-foreground-muted text-left">
<Clock className="w-4 h-4 text-foreground-subtle shrink-0" />
<span className="text-left">Get notified when this domain becomes available.</span>
<span className="text-left">We&apos;ll alert you the moment it drops.</span>
</div>
<Link
href={isAuthenticated ? '/dashboard' : '/register'}
@ -274,7 +274,7 @@ export function DomainChecker() {
border border-border hover:border-border-hover transition-all duration-300"
>
<Plus className="w-4 h-4" />
<span>Add to Watchlist</span>
<span>Track This</span>
</Link>
</div>
</div>