Skip to content
6 verified examples

See what Forge can build

Real apps generated from plain English prompts.Every example below was built in under a minute.

SaaS Analytics Dashboard

SaaS

Prompt

Build a SaaS analytics dashboard with user management, real-time charts, subscription tracking, and a dark mode toggle. Include a sidebar navigation with overview, users, revenue, and settings pages.

Next.js 15TypeScriptTailwind CSSRechartsClerkStripe

~52s · 18 files · ✓ Verified

components/dashboard-overview.tsx

interface StatCard {
  label: string;
  value: string;
  delta: string;
  positive: boolean;
}

const STATS: StatCard[] = [
  { label: "Monthly Revenue", value: "$24,500", delta: "+12%", positive: true },
  { label: "Active Users",    value: "1,842",   delta: "+8%",  positive: true },
  { label: "Churn Rate",      value: "2.4%",    delta: "-0.3%", positive: true },
  { label: "Open MRR",        value: "$3,120",  delta: "-4%",  positive: false },
];

export function DashboardOverview() {
  return (
    <div className="space-y-6">
      <h1 className="text-2xl font-bold">Overview</h1>
      <div className="grid gap-4 sm:grid-cols-2 lg:grid-cols-4">
        {STATS.map((s) => (
          <div key={s.label} className="rounded-xl border bg-card p-5 shadow-sm">
            <p className="text-sm text-muted-foreground">{s.label}</p>
            <p className="mt-1 text-3xl font-bold">{s.value}</p>
            <p className={`mt-1 text-xs ${s.positive ? "text-emerald-500" : "text-rose-500"}`}>
              {s.delta} vs last month
            </p>
          </div>
        ))}
      </div>
      <RevenueChart />
    </div>
  );
}

E-commerce Product Page

E-commerce

Prompt

Create a modern e-commerce product page with image gallery, size/color selectors, add to cart, reviews section, and related products. Make it mobile-first with smooth animations.

Next.js 15TypeScriptTailwind CSSZustand

~38s · 12 files · ✓ Verified

components/product-card.tsx

"use client";

import { useState } from "react";
import { useCartStore } from "~/store/cart";

interface ProductCardProps {
  id: string;
  name: string;
  price: number;
  image: string;
  sizes: string[];
}

export function ProductCard({ id, name, price, image, sizes }: ProductCardProps) {
  const [selectedSize, setSelectedSize] = useState<string | null>(null);
  const [added, setAdded]               = useState(false);
  const addItem                         = useCartStore((s) => s.addItem);

  function handleAddToCart() {
    if (!selectedSize) return;
    addItem({ id, name, price, size: selectedSize, quantity: 1 });
    setAdded(true);
    setTimeout(() => setAdded(false), 1500);
  }

  return (
    <div className="group rounded-2xl border bg-card p-4 shadow-sm transition hover:shadow-md">
      <img src={image} alt={name} className="h-56 w-full rounded-xl object-cover" />
      <h3 className="mt-3 font-semibold">{name}</h3>
      <p className="text-lg font-bold">${price.toFixed(2)}</p>
      <div className="mt-2 flex gap-2">
        {sizes.map((s) => (
          <button
            key={s}
            onClick={() => setSelectedSize(s)}
            className={`rounded border px-2 py-0.5 text-xs ${selectedSize === s ? "border-primary bg-primary/10" : ""}`}
          >{s}</button>
        ))}
      </div>
      <button onClick={handleAddToCart} disabled={!selectedSize}
        className="mt-3 w-full rounded-lg bg-primary py-2 text-sm font-medium text-primary-foreground disabled:opacity-40">
        {added ? "Added ✓" : "Add to Cart"}
      </button>
    </div>
  );
}

AI Chat Interface

AI

Prompt

Build a ChatGPT-style interface with streaming responses, conversation history, model selector (GPT-4, Claude), markdown rendering, and code syntax highlighting.

Next.js 15TypeScriptTailwind CSSAnthropic SDKReact Markdown

~41s · 10 files · ✓ Verified

components/chat-message.tsx

import ReactMarkdown from "react-markdown";
import { Prism as SyntaxHighlighter } from "react-syntax-highlighter";
import { oneDark } from "react-syntax-highlighter/dist/cjs/styles/prism";

interface ChatMessageProps {
  role: "user" | "assistant";
  content: string;
  streaming?: boolean;
}

export function ChatMessage({ role, content, streaming }: ChatMessageProps) {
  const isUser = role === "user";
  return (
    <div className={`flex gap-3 ${isUser ? "flex-row-reverse" : ""}`}>
      <div className="flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-muted text-sm">
        {isUser ? "You" : "AI"}
      </div>
      <div className={`max-w-[80%] rounded-2xl px-4 py-3 text-sm ${isUser ? "bg-primary text-primary-foreground" : "bg-muted"}`}>
        <ReactMarkdown
          components={{
            code({ className, children }) {
              const lang = /language-(\w+)/.exec(className ?? "")?.[1];
              return lang ? (
                <SyntaxHighlighter style={oneDark} language={lang} PreTag="div">
                  {String(children)}
                </SyntaxHighlighter>
              ) : (
                <code className="rounded bg-zinc-800 px-1 text-xs">{children}</code>
              );
            },
          }}
        >{content}</ReactMarkdown>
        {streaming && <span className="mt-1 inline-block h-4 w-0.5 animate-pulse bg-current" />}
      </div>
    </div>
  );
}

Project Management App

Productivity

Prompt

Create a Trello-style kanban board with drag-and-drop cards, board members, due dates, priority labels, and card detail modal. Include a project overview page with burn-down chart.

Next.js 15TypeScriptTailwind CSSdnd-kitDrizzlePostgres

~58s · 22 files · ✓ Verified

components/kanban-column.tsx

"use client";

import { useDroppable } from "@dnd-kit/core";
import { SortableContext, verticalListSortingStrategy } from "@dnd-kit/sortable";
import { KanbanCard } from "./kanban-card";

interface Column {
  id: string;
  title: string;
  color: string;
  cards: Card[];
}

interface Card {
  id: string;
  title: string;
  priority: "low" | "medium" | "high";
  dueDate?: string;
  assignee?: string;
}

export function KanbanColumn({ id, title, color, cards }: Column) {
  const { setNodeRef, isOver } = useDroppable({ id });

  return (
    <div
      ref={setNodeRef}
      className={`flex w-72 shrink-0 flex-col rounded-xl bg-muted/50 p-3 ${isOver ? "ring-2 ring-primary/50" : ""}`}
    >
      <div className="mb-3 flex items-center gap-2">
        <span className={`h-2.5 w-2.5 rounded-full ${color}`} />
        <h3 className="font-semibold text-sm">{title}</h3>
        <span className="ml-auto rounded-full bg-muted px-2 py-0.5 text-xs">{cards.length}</span>
      </div>
      <SortableContext items={cards.map((c) => c.id)} strategy={verticalListSortingStrategy}>
        <div className="flex flex-col gap-2">
          {cards.map((card) => <KanbanCard key={card.id} {...card} />)}
        </div>
      </SortableContext>
    </div>
  );
}

Developer Portfolio

Developer Tool

Prompt

Generate a developer portfolio website with animated hero, skills section, project showcase cards with GitHub/demo links, a blog, contact form with Resend, and dark/light mode.

Next.js 15TypeScriptTailwind CSSResendFramer Motion

~35s · 11 files · ✓ Verified

components/project-card.tsx

"use client";

import { motion } from "framer-motion";
import Link from "next/link";

interface ProjectCardProps {
  title: string;
  description: string;
  tags: string[];
  githubUrl?: string;
  demoUrl?: string;
  gradient: string;
}

export function ProjectCard({ title, description, tags, githubUrl, demoUrl, gradient }: ProjectCardProps) {
  return (
    <motion.div
      whileHover={{ y: -4, scale: 1.01 }}
      transition={{ type: "spring", stiffness: 300, damping: 20 }}
      className="group relative overflow-hidden rounded-2xl border bg-card p-6 shadow-sm"
    >
      <div className={`absolute inset-0 opacity-0 transition-opacity group-hover:opacity-100 ${gradient}`} />
      <div className="relative">
        <h3 className="font-bold text-lg">{title}</h3>
        <p className="mt-1.5 text-sm text-muted-foreground">{description}</p>
        <div className="mt-3 flex flex-wrap gap-1.5">
          {tags.map((tag) => (
            <span key={tag} className="rounded-full bg-muted px-2 py-0.5 text-xs font-medium">{tag}</span>
          ))}
        </div>
        <div className="mt-4 flex gap-3 text-sm font-medium">
          {githubUrl && <Link href={githubUrl} className="text-muted-foreground hover:text-foreground">GitHub ↗</Link>}
          {demoUrl   && <Link href={demoUrl}   className="text-primary hover:underline">Live demo ↗</Link>}
        </div>
      </div>
    </motion.div>
  );
}

Blog Platform

Blog

Prompt

Build a blog platform with MDX posts, category filtering, search, author profiles, newsletter signup, reading time estimates, and an RSS feed. SEO-optimized with dynamic OG images.

Next.js 15TypeScriptTailwind CSSMDXResend

~44s · 15 files · ✓ Verified

components/blog-post-card.tsx

import Link from "next/link";

interface BlogPostCardProps {
  slug: string;
  title: string;
  excerpt: string;
  author: { name: string; avatar: string };
  publishedAt: string;
  readingTime: number;
  category: string;
  coverGradient: string;
}

export function BlogPostCard({
  slug, title, excerpt, author, publishedAt, readingTime, category, coverGradient,
}: BlogPostCardProps) {
  return (
    <article className="group flex flex-col overflow-hidden rounded-2xl border bg-card shadow-sm transition hover:shadow-md">
      <div className={`h-40 w-full ${coverGradient}`} />
      <div className="flex flex-1 flex-col p-5">
        <span className="text-xs font-semibold uppercase tracking-wide text-primary">{category}</span>
        <Link href={`/blog/${slug}`}>
          <h2 className="mt-1 text-lg font-bold leading-snug group-hover:text-primary">{title}</h2>
        </Link>
        <p className="mt-2 flex-1 text-sm text-muted-foreground line-clamp-2">{excerpt}</p>
        <div className="mt-4 flex items-center gap-3 text-xs text-muted-foreground">
          <img src={author.avatar} alt={author.name} className="h-6 w-6 rounded-full object-cover" />
          <span>{author.name}</span>
          <span>·</span>
          <time dateTime={publishedAt}>{new Date(publishedAt).toLocaleDateString()}</time>
          <span>·</span>
          <span>{readingTime} min read</span>
        </div>
      </div>
    </article>
  );
}

Ready to build your own?

10 free credits. No credit card required. Generate your first app in under a minute.

Showcase | Forge