See what Forge can build
Real apps generated from plain English prompts.
Every example below was built in under a minute.
SaaS Analytics Dashboard
SaaSPrompt
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.
~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-commercePrompt
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.
~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
AIPrompt
Build a ChatGPT-style interface with streaming responses, conversation history, model selector (GPT-4, Claude), markdown rendering, and code syntax highlighting.
~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
ProductivityPrompt
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.
~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 ToolPrompt
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.
~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
BlogPrompt
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.
~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.