diff --git a/app/home/page.tsx b/app/home/page.tsx
deleted file mode 100644
index 52e3a80..0000000
--- a/app/home/page.tsx
+++ /dev/null
@@ -1,373 +0,0 @@
-"use client";
-
-import Link from "next/link";
-import { PoweredByCarousel } from "@/components/PoweredByCarousel";
-import { Header } from "@/components/Header";
-import { Layout } from "@/components/Layout";
-import { usePrompts } from "@/lib/hooks/usePrompts";
-import { useAuth } from "@/components/AuthProvider";
-
-const CheckIcon = () => (
-
-);
-
-const XIcon = () => (
-
-);
-
-const comparison = [
- { feature: "Version history & diff view", closedNote: true, promptBase: false, flowGPT: false, notion: false },
- { feature: "Private by default", closedNote: true, promptBase: false, flowGPT: false, notion: true },
- { feature: "AI prompt refinement", closedNote: true, promptBase: false, flowGPT: false, notion: false },
- { feature: "OCR — import from screenshots", closedNote: true, promptBase: false, flowGPT: false, notion: false },
- { feature: "Prompt chaining", closedNote: true, promptBase: false, flowGPT: true, notion: false },
- { feature: "Built specifically for prompts", closedNote: true, promptBase: true, flowGPT: true, notion: false },
-];
-
-const features = [
- {
- badge: "NEW",
- title: "Version History",
- description: "Every edit is tracked. See exactly what changed between drafts with a visual diff, and restore any previous version in one click.",
- icon: (
-
- ),
- },
- {
- badge: null,
- title: "AI Refinement",
- description: "Paste a rough idea and let AI restructure it into a clean, reusable prompt — using your own API key.",
- icon: (
-
- ),
- },
- {
- badge: null,
- title: "OCR Import",
- description: "Photograph a whiteboard, screenshot a chat, or upload any image — closedNote extracts the text and saves it as a prompt.",
- icon: (
-
- ),
- },
- {
- badge: null,
- title: "Prompt Chains",
- description: "String prompts together into multi-step workflows. Output from one step feeds directly into the next.",
- icon: (
-
- ),
- },
-];
-
-export default function MarketingHome() {
- const { prompts } = usePrompts();
- const { user } = useAuth();
-
- return (
- } sidebar={null}>
-
-
- {/* ── Hero ── */}
-
-
-
- New — Version History is live
-
-
-
-
- Prompts are living
-
-
-
- documents.
-
-
-
-
- PromptBase stores them. Notion organizes them. closedNote is the only tool that
- remembers how they evolved — every draft, every edit, every version.
-
-
-
- {user ? (
- <>
-
- Open my prompts
-
-
- New prompt
-
- >
- ) : (
- <>
-
- Get started free
-
-
- Read the docs
-
- >
- )}
-
-
-
- {/* ── Powered by ── */}
-
-
Powered by
-
-
-
- {/* ── The Problem ── */}
-
-
-
The gap
-
- Every tool stores prompts.
-
- None of them remember.
-
-
-
-
- {[
- {
- label: "PromptBase / FlowGPT",
- verdict: "Built for sharing, not crafting",
- description: "Great marketplaces for discovering prompts. But your prompts are public by default, and there's no memory of how they were built. When something stops working, you're starting from scratch.",
- tone: "neutral",
- },
- {
- label: "Notion / Notes apps",
- verdict: "Flexible but completely dumb",
- description: "Notion doesn't know a prompt from a grocery list. No AI awareness, no refinement, no version tracking. You're just storing text with extra friction.",
- tone: "neutral",
- },
- {
- label: "closedNote",
- verdict: "Private, versioned, intelligent",
- description: "Your prompts stay yours. Every edit is tracked with a visual diff. Iterate with AI refinement, import with OCR, and always know how you got to the version that works.",
- tone: "highlight",
- },
- ].map((card) => (
-
-
- {card.label}
-
-
- {card.verdict}
-
-
- {card.description}
-
-
- ))}
-
-
-
- {/* ── Comparison Table ── */}
-
-
-
How we stack up
-
Built different.
-
-
-
-
-
-
-
Feature
-
closedNote
-
PromptBase
-
FlowGPT
-
Notion
-
-
-
- {comparison.map((row, i) => (
-
-
{row.feature}
-
- {row.closedNote ? : }
-
-
- {row.promptBase ? : }
-
-
- {row.flowGPT ? : }
-
-
- {row.notion ? : }
-
-
- ))}
-
-
-
-
-
- {/* ── Version History Spotlight ── */}
-
-
-
-
- Version History
-
-
- Git for your prompts.
-
-
- Every time you save an edit, closedNote snapshots the version. Jump back to any point in time, see exactly what changed line-by-line, and restore with one click — without overwriting your history.
-
-
- {[
- "Full version timeline on every prompt",
- "Visual diff — green added, red removed",
- "Restore any version without losing history",
- "No bloat — only versions when content changes",
- ].map((point) => (
-
-
- Act as a coding assistant.
-
- {" "}
-
- You are an expert software engineer.
-
- {" "}
- Review the following code and identify bugs, security issues, or performance problems.{" "}
-
- Be specific and actionable.
-
-
- Stop losing great drafts. Start building a prompt library that actually remembers how it was built.
-
-
-
- {user ? "Go to my prompts" : "Get started — it's free"}
-
- {!user && (
-
- Sign in
-
- )}
-
-
-
-
-
- );
-}
diff --git a/app/login/page.tsx b/app/login/page.tsx
index b7fd67a..b15db82 100644
--- a/app/login/page.tsx
+++ b/app/login/page.tsx
@@ -28,7 +28,7 @@ export default function LoginPage() {
if (!res.ok) {
setError(res.error);
} else {
- router.push("/");
+ router.push("/dashboard");
}
} catch (err) {
setError("An unexpected error occurred. Please try again.");
diff --git a/app/page.tsx b/app/page.tsx
index 49b7bd2..b707038 100644
--- a/app/page.tsx
+++ b/app/page.tsx
@@ -1,135 +1,373 @@
"use client";
-import { Suspense } from "react";
-import { useState, useMemo, useEffect } from "react";
-import { groupPromptsByCollection, filterPrompts } from "@/lib/promptData";
-import { PromptModel } from "@/lib/types";
+import Link from "next/link";
+import { PoweredByCarousel } from "@/components/PoweredByCarousel";
import { Header } from "@/components/Header";
-import { Sidebar } from "@/components/Sidebar";
import { Layout } from "@/components/Layout";
-import { PromptCollection } from "@/components/PromptCollection";
-import { UseCasesShowcase } from "@/components/UseCasesShowcase";
-import { PoweredByCarousel } from "@/components/PoweredByCarousel";
import { usePrompts } from "@/lib/hooks/usePrompts";
import { useAuth } from "@/components/AuthProvider";
-function HomeContent() {
- const { prompts: allPrompts, loading, error } = usePrompts();
- const { loading: authLoading } = useAuth();
- const [searchQuery, setSearchQuery] = useState("");
- const [filters, setFilters] = useState<{
- query: string;
- model: PromptModel | "";
- }>({ query: "", model: "" });
- const [activeCollection, setActiveCollection] = useState<
- string | undefined
- >();
-
- useEffect(() => {
- if (typeof window !== "undefined") {
- const urlParams = new URLSearchParams(window.location.search);
- const collection = urlParams.get("collection");
- if (collection) setActiveCollection(collection);
- }
- }, []);
-
- useEffect(() => {
- setFilters((prev) => ({ ...prev, query: searchQuery }));
- }, [searchQuery]);
-
- const filteredPrompts = useMemo(() => {
- return filterPrompts(allPrompts, {
- query: filters.query || undefined,
- model: filters.model || undefined,
- collection: activeCollection,
- });
- }, [filters, allPrompts, activeCollection]);
-
- const promptsByCollection = useMemo(() => {
- return groupPromptsByCollection(filteredPrompts);
- }, [filteredPrompts]);
-
- const collections = Object.keys(promptsByCollection).sort();
+const CheckIcon = () => (
+
+);
+
+const XIcon = () => (
+
+);
+
+const comparison = [
+ { feature: "Version history & diff view", closedNote: true, promptBase: false, flowGPT: false, notion: false },
+ { feature: "Private by default", closedNote: true, promptBase: false, flowGPT: false, notion: true },
+ { feature: "AI prompt refinement", closedNote: true, promptBase: false, flowGPT: false, notion: false },
+ { feature: "OCR — import from screenshots", closedNote: true, promptBase: false, flowGPT: false, notion: false },
+ { feature: "Prompt chaining", closedNote: true, promptBase: false, flowGPT: true, notion: false },
+ { feature: "Built specifically for prompts", closedNote: true, promptBase: true, flowGPT: true, notion: false },
+];
+
+const features = [
+ {
+ badge: "NEW",
+ title: "Version History",
+ description: "Every edit is tracked. See exactly what changed between drafts with a visual diff, and restore any previous version in one click.",
+ icon: (
+
+ ),
+ },
+ {
+ badge: null,
+ title: "AI Refinement",
+ description: "Paste a rough idea and let AI restructure it into a clean, reusable prompt — using your own API key.",
+ icon: (
+
+ ),
+ },
+ {
+ badge: null,
+ title: "OCR Import",
+ description: "Photograph a whiteboard, screenshot a chat, or upload any image — closedNote extracts the text and saves it as a prompt.",
+ icon: (
+
+ ),
+ },
+ {
+ badge: null,
+ title: "Prompt Chains",
+ description: "String prompts together into multi-step workflows. Output from one step feeds directly into the next.",
+ icon: (
+
+ ),
+ },
+];
+
+export default function MarketingHome() {
+ const { prompts } = usePrompts();
+ const { user } = useAuth();
return (
-
- }
- sidebar={
- allPrompts.length > 0 ? (
-
- ) : null
- }
- >
- {error ? (
-
-
-
Failed to load prompts
-
{error}
+ } sidebar={null}>
+
+
+ {/* ── Hero ── */}
+
+
+
+ New — Version History is live
+
+
+
+
+ Prompts are living
+
+
+
+ documents.
+
+
+
+
+ PromptBase stores them. Notion organizes them. closedNote is the only tool that
+ remembers how they evolved — every draft, every edit, every version.
+
+
+
+ {user ? (
+ <>
+
+ Open my prompts
+
+
+ New prompt
+
+ >
+ ) : (
+ <>
+
+ Get started free
+
+
+ Read the docs
+
+ >
+ )}
- ) : (authLoading || loading) ? (
-
- {[1, 2, 3].map((i) => (
-
-
- {[1, 2, 3].map((j) => (
-
- ))}
-
- ))}
+
+ {/* ── Powered by ── */}
+
+
Powered by
+
+
+
+ {/* ── The Problem ── */}
+
+
+
The gap
+
+ Every tool stores prompts.
+
+ None of them remember.
+
+
+
+
+ {[
+ {
+ label: "PromptBase / FlowGPT",
+ verdict: "Built for sharing, not crafting",
+ description: "Great marketplaces for discovering prompts. But your prompts are public by default, and there's no memory of how they were built. When something stops working, you're starting from scratch.",
+ tone: "neutral",
+ },
+ {
+ label: "Notion / Notes apps",
+ verdict: "Flexible but completely dumb",
+ description: "Notion doesn't know a prompt from a grocery list. No AI awareness, no refinement, no version tracking. You're just storing text with extra friction.",
+ tone: "neutral",
+ },
+ {
+ label: "closedNote",
+ verdict: "Private, versioned, intelligent",
+ description: "Your prompts stay yours. Every edit is tracked with a visual diff. Iterate with AI refinement, import with OCR, and always know how you got to the version that works.",
+ tone: "highlight",
+ },
+ ].map((card) => (
+
+
+ {card.label}
+
+
+ {card.verdict}
+
+
+ {card.description}
+
+
+ ))}
+
- ) : allPrompts.length === 0 ? (
-
+
+ {/* ── Comparison Table ── */}
+
-
- closedNote
-
-
- Your personal prompt notebook. Create, organize, and refine AI
- prompts with speed and clarity.
-
+
How we stack up
+
Built different.
-
-
- Powered by
-
-
+
+
+
+
+
+
Feature
+
closedNote
+
PromptBase
+
FlowGPT
+
Notion
+
+
+
+ {comparison.map((row, i) => (
+
+
{row.feature}
+
+ {row.closedNote ? : }
+
+
+ {row.promptBase ? : }
+
+
+ {row.flowGPT ? : }
+
+
+ {row.notion ? : }
+
+
+ ))}
+
+
-
- ) : (
-
-
- {collections.length === 0 ? (
-
-
- No prompts found matching your filters.
-
-
- ) : (
-
- {collections.map((collection) => (
-
+
+ {/* ── Version History Spotlight ── */}
+
+
+
+
+ Version History
+
+
+ Git for your prompts.
+
+
+ Every time you save an edit, closedNote snapshots the version. Jump back to any point in time, see exactly what changed line-by-line, and restore with one click — without overwriting your history.
+
+
+ {[
+ "Full version timeline on every prompt",
+ "Visual diff — green added, red removed",
+ "Restore any version without losing history",
+ "No bloat — only versions when content changes",
+ ].map((point) => (
+
+
+ Act as a coding assistant.
+
+ {" "}
+
+ You are an expert software engineer.
+
+ {" "}
+ Review the following code and identify bugs, security issues, or performance problems.{" "}
+
+ Be specific and actionable.
+
+