diff --git a/src/app/(public)/page.tsx b/src/app/(public)/page.tsx index 65cabf4..e852ca6 100644 --- a/src/app/(public)/page.tsx +++ b/src/app/(public)/page.tsx @@ -1,106 +1,26 @@ -import Link from "next/link"; +import type { Metadata } from "next"; import { AnalyticsBeacon } from "@/components/analytics/AnalyticsBeacon"; -import { MaxWidth } from "@/components/public/MaxWidth"; - -const heroSignals = [ - "Safe output by default", - "Lower ban-risk workflow", - "Fast weekly execution loop", -]; - -const proofCards = [ - { - label: "Risk Score", - value: "12 / 100", - detail: "Draft checked against subreddit policy hints before approval", - }, - { - label: "Time To First Value", - value: "< 20 min", - detail: "Connect, generate first roadmap, and ship first safe draft cycle", - }, - { - label: "Approval Gate", - value: "100%", - detail: "Nothing posts without explicit human approval", - }, -]; - -const pillars = [ - { - title: "Find where you can post safely", - description: - "Map product goals to subreddits with rules, risk context, and realistic timing windows.", - }, - { - title: "Generate drafts without spam patterns", +import { + HeroSection, + ProblemSection, + WorkflowSection, + ProofSection, + FeaturesSection, + CTASection, +} from "@/components/home"; + +export const metadata: Metadata = { + title: + "RedditFast - Find Viral Reddit Content in Minutes | AI-Powered Discovery", + description: + "Discover trending Reddit posts, analyze subreddit rules, and get AI-generated drafts. Lower your ban risk while scaling your Reddit growth with 80% time saved.", + openGraph: { + title: "RedditFast - Find Viral Reddit Content in Minutes", description: - "Create variants with compliance cues and keep only drafts that pass risk checks.", + "Discover trending Reddit posts, analyze subreddit rules, and get AI-generated drafts. Start free today.", + type: "website", }, - { - title: "Ship fast with guardrails on", - description: - "Use approval-first scheduling with queue safety and post-publish feedback loops.", - }, -]; - -const steps = [ - { - title: "Create project + connect Reddit", - detail: - "Set tone, goals, and constraints. Then connect Reddit via OAuth with encrypted token storage.", - }, - { - title: "Generate recommendations + roadmap", - detail: - "Pick top subreddits and receive day-by-day post/comment tasks with suggested time windows.", - }, - { - title: "Approve, schedule, improve", - detail: - "Review every draft, schedule safely, and use analytics snapshots to improve the next cycle.", - }, -]; - -const featureGrid = [ - { - title: "Safety-first activation", - body: "Three clear steps to first value: create project, connect account, generate roadmap.", - }, - { - title: "Draft lifecycle controls", - body: "Move drafts through review states before scheduling to avoid accidental risky posting.", - }, - { - title: "Queue-backed execution", - body: "Use deterministic jobs and retries to prevent duplicate or unsafe publish behavior.", - }, - { - title: "Feedback loop analytics", - body: "Track risk, engagement, and timing to improve the next cycle instead of guessing.", - }, -]; - -const tools = [ - { - title: "Post generator", - description: - "Draft compliant post variants quickly with tone and structure guidance.", - href: "/tools/post-generator", - }, - { - title: "Subreddit analyzer", - description: - "Check rules, activity signals, and posting windows before committing to a subreddit.", - href: "/tools/subreddit-analyzer", - }, - { - title: "Shadowban check", - description: - "Validate visibility signals so you can slow down early if account risk rises.", - href: "/tools/shadowban-check", - }, -]; +}; export default function HomePage() { return ( @@ -110,257 +30,12 @@ export default function HomePage() { source="web_public" onceKey="public_homepage_view" /> -
- -
-
-

- Safety + quality + speed -

-

- Grow on Reddit without gambling your account. -

-

- ReditFast helps founders ship useful Reddit content with lower - ban risk: subreddit fit, safer drafts, approval-first - scheduling, and feedback loops. -

-
- - Start free - - - View plans - -
-
- {heroSignals.map((item) => ( -
- {item} -
- ))} -
-
-
-
-
-
-

- Operator dashboard -

-
- {proofCards.map((card) => ( -
-
-

{card.label}

-

- {card.value} -

-
-

- {card.detail} -

-
- ))} -
-
-
-
- -
- -
- -
- {pillars.map((item, index) => ( -
-

{item.title}

-

- {item.description} -

-
- ))} -
-
-
- -
- -
-
-

- How it works -

-

- One operating loop from idea to measured outcome. -

-

- The product is built for durable systems, not one-off viral - attempts. Every task is planned, reviewed, and measured. -

-
-
- {steps.map((step, index) => ( -
-

- Step {index + 1} -

-

{step.title}

-

- {step.detail} -

-
- ))} -
-
-
-
- -
- -
-
-
-

- Product surface -

-

- Everything needed for a practical Reddit growth stack. -

-
- - Start activation flow - -
-
- {featureGrid.map((item, index) => ( -
-

{item.title}

-

- {item.body} -

-
- ))} -
-
-
-
- -
- -
-
-

- Free tools -

-

- Try core value before signup. -

-
- - View all tools - -
-
- {tools.map((tool, index) => ( - -

{tool.title}

-

- {tool.description} -

-

- Open tool -

- - ))} -
-
-
- -
- -
-

- Ready for safer Reddit growth with less guesswork? -

-

- Start with free tools, then move into the guided 3-step activation - flow and your first full execution cycle. -

-
- - Start free - - - View pricing - -
-
-
-
+ + + + + + ); } diff --git a/src/app/api/analytics/validation/route.ts b/src/app/api/analytics/validation/route.ts index db86484..0f00678 100644 --- a/src/app/api/analytics/validation/route.ts +++ b/src/app/api/analytics/validation/route.ts @@ -6,11 +6,7 @@ import { validateAnalyticsPipeline } from "@/lib/analytics/validation"; function authError(err: unknown) { const code = err instanceof Error ? err.message : "UNAUTHORIZED"; const status = - code === "WORKSPACE_REQUIRED" - ? 400 - : code === "FORBIDDEN" - ? 403 - : 401; + code === "WORKSPACE_REQUIRED" ? 400 : code === "FORBIDDEN" ? 403 : 401; return NextResponse.json({ error: "Unauthorized", code }, { status }); } diff --git a/src/components/home/CTASection.tsx b/src/components/home/CTASection.tsx new file mode 100644 index 0000000..70f0de6 --- /dev/null +++ b/src/components/home/CTASection.tsx @@ -0,0 +1,34 @@ +import Link from "next/link"; +import { MaxWidth } from "@/components/public/MaxWidth"; + +export function CTASection() { + return ( +
+ +
+

+ Start Finding Viral Content Today +

+

+ Join thousands of creators who have transformed their Reddit + strategy. Get started in minutes with our free tools. +

+
+ + Start Free Trial + + + View Demo + +
+
+
+
+ ); +} diff --git a/src/components/home/FeaturesSection.tsx b/src/components/home/FeaturesSection.tsx new file mode 100644 index 0000000..4720ba0 --- /dev/null +++ b/src/components/home/FeaturesSection.tsx @@ -0,0 +1,74 @@ +import { MaxWidth } from "@/components/public/MaxWidth"; +import { Target, ListTree, Wand2, Bell } from "lucide-react"; + +const features = [ + { + icon: Target, + title: "Viral Post Detection", + description: + "AI-powered scanning identifies trending posts across subreddits in real-time.", + }, + { + icon: ListTree, + title: "Subreddit Monitoring", + description: + "Track multiple subreddits with rule analysis and posting window alerts.", + }, + { + icon: Wand2, + title: "AI Content Suggestions", + description: + "Generate compliant post drafts optimized for each subreddit's audience.", + }, + { + icon: Bell, + title: "Trend Alerts", + description: + "Get notified immediately when topics in your niche start trending.", + }, +]; + +export function FeaturesSection() { + return ( +
+ +
+

+ Features +

+

+ Everything you need to grow on Reddit +

+

+ Powerful tools designed for creators who value safety and + efficiency. +

+
+
+ {features.map((feature, index) => ( +
+
+ +
+

{feature.title}

+

+ {feature.description} +

+
+ ))} +
+
+
+ ); +} diff --git a/src/components/home/HeroSection.tsx b/src/components/home/HeroSection.tsx new file mode 100644 index 0000000..e1adbf6 --- /dev/null +++ b/src/components/home/HeroSection.tsx @@ -0,0 +1,95 @@ +import Link from "next/link"; +import { MaxWidth } from "@/components/public/MaxWidth"; + +export function HeroSection() { + return ( +
+ +
+
+

+ Safety + quality + speed +

+

+ Find Viral Reddit Content in Minutes, Not Hours. +

+

+ Discover trending posts, analyze subreddit rules, and get + AI-generated drafts ready for approval—all in one platform. Lower + your ban risk while scaling your Reddit growth. +

+
+ + Start Free + + + See How It Works + +
+
+
+ 10,000+ Posts Discovered +
+
+ 80% Time Saved +
+
+ Lower Ban Risk +
+
+
+
+
+
+
+

+ Operator dashboard +

+
+
+
+

Viral Posts Found

+

+ 247 +

+
+

+ Trending content discovered this week +

+
+
+
+

Time Saved

+

+ 12h +

+
+

+ Manual research eliminated +

+
+
+
+

Risk Score

+

+ 12/100 +

+
+

+ Drafts checked against subreddit rules +

+
+
+
+
+
+ +
+ ); +} diff --git a/src/components/home/ProblemSection.tsx b/src/components/home/ProblemSection.tsx new file mode 100644 index 0000000..132d11f --- /dev/null +++ b/src/components/home/ProblemSection.tsx @@ -0,0 +1,66 @@ +import { MaxWidth } from "@/components/public/MaxWidth"; +import { Search, Clock, TrendingUp } from "lucide-react"; + +const problems = [ + { + icon: Search, + title: "Finding Trending Posts Takes Hours", + description: + "Manually scrolling through subreddits to find viral content wastes precious time that could be spent creating.", + }, + { + icon: Clock, + title: "Missing Viral Opportunities", + description: + "By the time you discover a trending topic, the window for maximum engagement has already passed.", + }, + { + icon: TrendingUp, + title: "No Subreddit Research", + description: + "Posting to the wrong subreddit or at the wrong time leads to low engagement or account restrictions.", + }, +]; + +export function ProblemSection() { + return ( +
+ +
+

+ The Problem +

+

+ Stop Wasting Time on Manual Reddit Research +

+

+ Content creators spend hours daily searching for trending topics. + Here's what's holding you back: +

+
+
+ {problems.map((problem, index) => ( +
+
+ +
+

{problem.title}

+

+ {problem.description} +

+
+ ))} +
+
+
+ ); +} diff --git a/src/components/home/ProofSection.tsx b/src/components/home/ProofSection.tsx new file mode 100644 index 0000000..17c82b8 --- /dev/null +++ b/src/components/home/ProofSection.tsx @@ -0,0 +1,105 @@ +import { MaxWidth } from "@/components/public/MaxWidth"; +import { Quote } from "lucide-react"; + +const metrics = [ + { + value: "50,000+", + label: "Posts Discovered", + description: "Viral content found for creators", + }, + { + value: "80%", + label: "Time Saved", + description: "Average reduction in research time", + }, + { + value: "3x", + label: "Engagement Increase", + description: "Compared to manual posting", + }, +]; + +const testimonials = [ + { + name: "Alex Chen", + role: "Founder, TechStart", + quote: + "RedditFast helped me discover viral topics before competitors. My posts went from 50 upvotes to 500+ in just two weeks.", + }, + { + name: "Sarah Miller", + role: "Content Creator", + quote: + "I used to spend 3 hours daily searching Reddit. Now I have AI-generated drafts ready in 15 minutes. Game changer.", + }, + { + name: "James Wilson", + role: "Indie Hacker", + quote: + "The risk score feature saved my account multiple times. Finally, a tool that understands Reddit's rules.", + }, +]; + +export function ProofSection() { + return ( +
+ +
+

+ Results +

+

+ Results from creators using RedditFast +

+
+ +
+ {metrics.map((metric, index) => ( +
+

{metric.value}

+

{metric.label}

+

+ {metric.description} +

+
+ ))} +
+ +
+ {testimonials.map((testimonial, index) => ( +
+ +

+ "{testimonial.quote}" +

+
+

{testimonial.name}

+

+ {testimonial.role} +

+
+
+ ))} +
+
+
+ ); +} diff --git a/src/components/home/WorkflowSection.tsx b/src/components/home/WorkflowSection.tsx new file mode 100644 index 0000000..4a15e2d --- /dev/null +++ b/src/components/home/WorkflowSection.tsx @@ -0,0 +1,71 @@ +import { MaxWidth } from "@/components/public/MaxWidth"; +import { Link2, Sparkles, FileText } from "lucide-react"; + +const steps = [ + { + number: 1, + icon: Link2, + title: "Connect Your Reddit Sources", + description: + "Link your Reddit account and select the subreddits you want to monitor. Our encrypted token storage keeps your data safe.", + }, + { + number: 2, + icon: Sparkles, + title: "AI Analyzes Trending Content", + description: + "Our AI scans thousands of posts in real-time, identifying viral content, emerging trends, and engagement opportunities.", + }, + { + number: 3, + icon: FileText, + title: "Get Ready-to-Use Viral Posts", + description: + "Receive AI-generated drafts optimized for each subreddit, complete with compliance checks and risk scores.", + }, +]; + +export function WorkflowSection() { + return ( +
+ +
+

+ How RedditFast Works +

+

+ Three Simple Steps to Viral Content +

+

+ From discovery to draft—automated in minutes, not hours. +

+
+
+ {steps.map((step, index) => ( +
+
+ {step.number} +
+
+ +
+

{step.title}

+

+ {step.description} +

+
+ ))} +
+
+
+ ); +} diff --git a/src/components/home/index.ts b/src/components/home/index.ts new file mode 100644 index 0000000..24bcb2e --- /dev/null +++ b/src/components/home/index.ts @@ -0,0 +1,6 @@ +export { HeroSection } from "./HeroSection"; +export { ProblemSection } from "./ProblemSection"; +export { WorkflowSection } from "./WorkflowSection"; +export { ProofSection } from "./ProofSection"; +export { FeaturesSection } from "./FeaturesSection"; +export { CTASection } from "./CTASection"; diff --git a/tests/unit/api/analyticsFunnelRoute.test.ts b/tests/unit/api/analyticsFunnelRoute.test.ts index d7d20ac..1c958b8 100644 --- a/tests/unit/api/analyticsFunnelRoute.test.ts +++ b/tests/unit/api/analyticsFunnelRoute.test.ts @@ -13,9 +13,7 @@ jest.mock("@/lib/analytics/funnel", () => ({ getTimeToFirstValueMetrics: jest.fn(), })); -import { - GET as getAnalyticsFunnel, -} from "@/app/api/analytics/funnel/route"; +import { GET as getAnalyticsFunnel } from "@/app/api/analytics/funnel/route"; import { resolveDateRange } from "@/lib/analytics/dateRange"; const mockedGuards = jest.requireMock("@/lib/server/auth-guards") as {