PitchVibe — The AI-Powered Startup Pitch & Founder Discovery Platform

PitchVibe — The AI-Powered Startup Pitch & Founder Discovery Platform

Next.js 15 (App Router)React 19TypeScriptSanity CMS (GROQ)Google Gemini AITailwind CSSSlash-Command EditorOptimistic UpvotingVercel Edge Network

PitchVibe is an early-stage venture discovery platform engineered to give founders a frictionless stage to pitch ideas, receive automated AI viability critiques powered by Google Gemini, and secure early community traction through upvotes and investor visibility. Architected with Next.js 15, React 19, TypeScript, and Sanity Headless CMS, the application features a 3-step progressive authoring wizard with slash-command markdown editing, category-based discovery (SaaS, FinTech, HealthTech, AI), and zero-latency optimistic upvoting.

🚀Overview & The Founder-to-Investor Discovery Pipeline

The traditional angel fundraising process is riddled with gatekeeping, sluggish pitch deck reviews, and opaque feedback loops. PitchVibe democratizes startup visibility by providing an open, high-velocity discovery ecosystem. Founders can broadcast concise problem-solution narratives, receive instant algorithmic critique on product-market viability from Google Gemini AI, and let the broader tech community validate ideas through upvotes and view metrics.

🧠Google Gemini AI Viability Analysis Engine

Every pitch submitted to PitchVibe can trigger an automated multi-vector analysis evaluated against venture criteria:

  • Structured Metric Scoring: Generates an aggregate Viability Score (0-100) combining Problem Severity, Market Size, Moat Defensibility, and Execution Clarity.
  • Constructive SWOT Critique: Identifies critical blindspots, unaddressed regulatory risks, and recommended pivot angles before founders spend capital.
  • Investor Deck Synthesis: Condenses sprawling markdown narratives into a 3-bullet elevator pitch tailored for venture capitalist skimming.
  • Determinism via Structured JSON: Strict response schemas eliminate hallucinated outputs and parse directly into interactive client UI cards.

⚡Structured Gemini AI Evaluation Server Action

Server-side integration enforces JSON schemas and evaluates startup submissions across four venture criteria:

// src/app/api/analyze-pitch/route.ts - Google Gemini AI Pitch Viability Evaluator
import { GoogleGenerativeAI } from "@google/generative-ai";
import { NextResponse } from "next/server";

const genAI = new GoogleGenerativeAI(process.env.GEMINI_API_KEY!);

interface PitchEvaluationPayload {
  title: string;
  category: "SaaS" | "FinTech" | "AI / Tech" | "Health / Wellness" | "E-Commerce";
  shortDescription: string;
  fullMarkdownPitch: string;
}

export async function POST(req: Request) {
  try {
    const payload: PitchEvaluationPayload = await req.json();

    const model = genAI.getGenerativeModel({
      model: "gemini-1.5-flash",
      generationConfig: {
        responseMimeType: "application/json",
        temperature: 0.2, // Low temperature for consistent, analytical scoring
      },
    });

    const prompt = `
You are an expert Silicon Valley seed-stage venture investor and startup advisor.
Analyze the following startup pitch and return a valid JSON object matching this schema:
{
  "viabilityScore": number (0-100),
  "executiveSummary": string,
  "strengths": string[],
  "potentialRisks": string[],
  "recommendedActionItems": string[]
}

Startup Title: ${payload.title}
Category: ${payload.category}
Elevator Pitch: ${payload.shortDescription}
Full Pitch Details:
${payload.fullMarkdownPitch}
`;

    const result = await model.generateContent(prompt);
    const evaluation = JSON.parse(result.response.text());

    return NextResponse.json({ success: true, evaluation });
  } catch (error) {
    console.error("Gemini AI Analysis Error:", error);
    return NextResponse.json(
      { success: false, error: "Failed to evaluate startup pitch." },
      { status: 500 }
    );
  }
}

📝Multi-Step Pitch Submission & Slash-Command Markdown Editor

A compelling startup pitch requires both brevity and depth. PitchVibe guides founders through an intuitive 3-step progressive authoring wizard: Step 1 collects core identity (title with 0/80 character limit, industry taxonomy, punchy 0/200 description, and cover image), Step 2 provides a Notion-style markdown editor with slash ('/') commands, and Step 3 handles instant publication to the Sanity Content Lake.

⚡Progressive Disclosure & Client-Side Media Ingestion

To minimize friction while enforcing data cleanliness before database commits:

  • Real-Time Character Ledger: Interactive counters warn founders when their elevator pitch is too verbose for investor attention spans.
  • Slash-Command Text System: Typing '/' triggers rapid scaffolding blocks for Problem, Solution, Market Size (TAM/SAM/SOM), and Traction.
  • Client-Side Image Guard: Validates MIME types and restricts uploads strictly to PNG, JPG, or WebP under 800 KB to preserve lightning-fast feed rendering.
  • Draft Auto-Persistence: Local browser storage caches form steps to prevent data loss during accidental refreshes or tab switches.

💾Idempotent Pitch Creation with Sanity Mutation

Server Action validates payload constraints via Zod before committing the new startup document to Sanity:

// src/app/actions/submitPitch.ts - Validated Sanity Startup Mutation
"use server";

import { writeClient } from "@/lib/sanity.client";
import { revalidatePath } from "next/cache";
import { z } from "zod";

const pitchSchema = z.object({
  title: z.string().min(5).max(80),
  category: z.enum(["AI / Tech", "E-Commerce", "Health / Wellness", "SaaS", "FinTech"]),
  shortDescription: z.string().min(20).max(200),
  coverImage: z.string().url(),
  pitchMarkdown: z.string().min(50),
  authorId: z.string(),
});

export async function submitStartupPitch(formData: FormData) {
  const rawData = {
    title: formData.get("title") as string,
    category: formData.get("category") as string,
    shortDescription: formData.get("shortDescription") as string,
    coverImage: formData.get("coverImage") as string,
    pitchMarkdown: formData.get("pitchMarkdown") as string,
    authorId: formData.get("authorId") as string,
  };

  const parsed = pitchSchema.parse(rawData);

  // Commit document to Sanity Content Lake
  const newPitch = await writeClient.create({
    _type: "startup",
    title: parsed.title,
    slug: {
      _type: "slug",
      current: parsed.title.toLowerCase().replace(/[^a-z0-9]+/g, "-"),
    },
    category: parsed.category,
    description: parsed.shortDescription,
    image: parsed.coverImage,
    pitch: parsed.pitchMarkdown,
    author: { _type: "reference", _ref: parsed.authorId },
    views: 0,
    upvotes: 0,
    createdAt: new Date().toISOString(),
  });

  revalidatePath("/startup");
  revalidatePath("/");
  return { success: true, slug: newPitch.slug.current };
}

🔥Community Validation, Algorithmic Ranking & Spam Defense

A platform is only as useful as its signal-to-noise ratio. PitchVibe features an algorithmic discovery feed with dynamic sorting ('Recent', 'Most Upvoted', 'Most Viewed') and real-time category filtering. Upvotes are updated optimistically in the client DOM while atomic mutations prevent voter replay attacks.

🛡️Anti-Sybil Voting & Atomic Counter Increments

Voting integrity is maintained through multi-layered edge protection:

  • Optimistic Client Feedback: React 19 useOptimistic instantly toggles the upvote arrow and increments the badge with 0ms visual latency.
  • Atomic Sanity Patch Operations: Database increments use atomic inc({ upvotes: 1 }) mutations to prevent race conditions during viral surges.
  • Fingerprint & IP Rate Limiting: Redis-backed edge rate limiters restrict rapid voting to 10 actions per minute per client fingerprint.
  • View Counter Throttling: Page visits are debounced per session to avoid artificial inflation of view metrics.

👍Atomic Upvote Mutation & Edge State Revalidation

Atomic patch execution ensures consistency across concurrent investor votes:

// src/app/actions/vote.ts - Atomic Upvote Handler with Anti-Spam Guard
"use server";

import { writeClient } from "@/lib/sanity.client";
import { revalidateTag } from "next/cache";

export async function upvoteStartup(startupId: string, voterId: string) {
  try {
    // 1. Verify voter hasn't already voted in current cycle (Stored in KV or user votes array)
    const alreadyVoted = await checkExistingVote(startupId, voterId);
    if (alreadyVoted) {
      return { success: false, message: "You have already upvoted this pitch." };
    }

    // 2. Atomic increment on Sanity Document
    await writeClient
      .patch(startupId)
      .inc({ upvotes: 1 })
      .append("voters", [voterId])
      .commit();

    // 3. Invalidate specific startup ISR cache tag
    revalidateTag(`startup-${startupId}`);

    return { success: true };
  } catch (err) {
    console.error("Upvote mutation failed:", err);
    return { success: false, error: "Failed to record upvote." };
  }
}

📦Headless Content Lake Architecture with Sanity.io & GROQ

Instead of managing complex database migrations, schema drifts, and custom asset CDNs, I architected PitchVibe's backend on Sanity.io. Using GROQ (Graph-Relational Object Queries), the frontend requests precisely the data shape needed for feed cards—eliminating payload bloat and providing instant global CDN caching.

Architectural LayerPitchVibe (Sanity + Next.js 15)Traditional Relational Architecture
Data QueryingPrecise GROQ projection filters only title, category, author avatar, and upvotesOver-fetching SQL SELECT queries requiring manual joins and DTO mappers
Asset ProcessingSanity Image Pipeline with automated WebP format negotiation & crop coordinatesSelf-managed S3 bucket, Sharp image processing workers, and CDN invalidate queues
Schema EvolutionCode-as-schema JavaScript definitions with zero migration downtimeRigid SQL schema migrations requiring maintenance windows and rollback scripts
Global Edge CachingOn-demand Next.js tag-based ISR revalidated via Sanity webhooks in <150msManual Redis cache invalidation keys prone to stale state bugs across pods

⚡Performance Profiling, Core Web Vitals & Production Metrics

A fast website converts visitors into active platform participants. PitchVibe utilizes Next.js 15 Partial Prerendering (PPR), Turbopack compilation, and modern CSS variables to achieve near-perfect Lighthouse scores across desktop and mobile devices.

Technical DimensionProduction ImplementationImpact / Benchmark
Frontend CoreNext.js 15 App Router, React 19, TypeScript, TurbopackInstant hydration and optimal client bundle splitting
Headless Content StoreSanity.io Content Lake with GROQ projection queriesZero server management and automatic global multi-region replication
Artificial IntelligenceGoogle Gemini 1.5 Flash via Server-Side Generative AI SDKCost-effective, highly deterministic startup venture evaluations
Theme & StylingTailwind CSS with CSS Variable dark/light mode toggleFlicker-free initial paint matching user OS color preference

FROM CONCEPT TOCODE</>

LET'S TURN IDEAS INTOSOLUTIONS

I'm available for full-time roles & freelance projects.

I thrive on crafting dynamic web applications and delivering seamless user experiences.