Skip to content

Commit e5a58a3

Browse files
fix: sweep stale '9-step' references after Launch step added
Yesterday I added the Launch step making workflow 10 steps long, but forgot to sweep the existing '9-step' / '9 steps' references scattered across copy and metadata. Visitors hit '9-step workflow' in nav, OG cards, meta descriptions — then clicked through and saw 10 steps on /workflow. Embarrassing inconsistency. Fixed. Files updated: - src/app/about/page.tsx — FAQ answer - src/app/faq/page.tsx — description + 3 answers - src/app/layout.tsx — meta description, openGraph, twitter (3 strings) - src/app/not-found.tsx — suggestion label - src/app/opengraph-image.tsx — homepage OG image subtitle - src/app/page.tsx — schema.org + desktop hero + mobile hero (3 spots) - src/app/vs-books/page.tsx — vibeprompt strengths list - src/app/vs-tools/page.tsx — decision matrix card - src/app/workflow/page.tsx — hero description - src/app/workflow/opengraph-image.tsx — alt + headline + step chips (chips also missed 'Launch' — added it between Ship and Iterate) - src/lib/search-data.ts — workflow page title Side win on workflow OG image: step-name array got 'Launch' added so the 10-step strip now shows all 10 names. Step number padding (0i) still works for i=0..9 with no overflow.
1 parent 9cb072c commit e5a58a3

12 files changed

Lines changed: 57 additions & 24 deletions

File tree

src/app/about/page.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import type { Metadata } from "next";
22

33
const FAQ_ITEMS = [
44
{ q: "What is vibeprompt?", a: "vibeprompt is a free prompt library and vibe coding workflow for developers shipping with AI. No login required, open source." },
5-
{ q: "How does vibe coding work?", a: "Vibe coding is a workflow for shipping software with AI assistance. vibeprompt provides a 9-step playbook from idea to shipped product, plus battle-tested prompts for each stage." },
5+
{ q: "How does vibe coding work?", a: "Vibe coding is a workflow for shipping software with AI assistance. vibeprompt provides a 10-step playbook from idea to shipped product, plus battle-tested prompts for each stage." },
66
{ q: "Is vibeprompt free to use?", a: "Yes. vibeprompt is completely free, no paywalls, no login required, and fully open source on GitHub." },
77
{ q: "Which AI tools work with these prompts?", a: "The prompts work with Claude Code, Cursor, GitHub Copilot, ChatGPT, Windsurf, and any other AI coding assistant." },
88
];

src/app/faq/page.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { LIST_PROBLEMS } from "@/lib/list-problems";
77
export const metadata: Metadata = {
88
title: "FAQ — vibeprompt · AI Prompt Library for Vibe Coders",
99
description:
10-
"Frequently asked questions about vibeprompt — the free AI prompt library, 9-step vibe coding workflow, articles, and field-tested fixes for developers using Claude Code, Cursor, Windsurf, and Aider.",
10+
"Frequently asked questions about vibeprompt — the free AI prompt library, 10-step vibe coding workflow, articles, and field-tested fixes for developers using Claude Code, Cursor, Windsurf, and Aider.",
1111
alternates: { canonical: "https://vibeprompt.tech/faq" },
1212
openGraph: {
1313
title: "FAQ — vibeprompt",
@@ -22,7 +22,7 @@ function buildFaq(promptsCount: number, fixesCount: number, articlesCount: numbe
2222
return [
2323
{
2424
q: "What is vibeprompt?",
25-
a: `vibeprompt is a free, open-source resource for vibe coders. ${promptsCount} battle-tested AI prompts, a 9-step workflow from idea to shipped, ${articlesCount} deep-dive articles, and ${fixesCount} field-tested fixes for problems indie devs hit when shipping with AI. MIT licensed, no sign-up.`,
25+
a: `vibeprompt is a free, open-source resource for vibe coders. ${promptsCount} battle-tested AI prompts, a 10-step workflow from idea to shipped, ${articlesCount} deep-dive articles, and ${fixesCount} field-tested fixes for problems indie devs hit when shipping with AI. MIT licensed, no sign-up.`,
2626
},
2727
{
2828
q: "What is the best AI prompt library for developers?",
@@ -38,15 +38,15 @@ function buildFaq(promptsCount: number, fixesCount: number, articlesCount: numbe
3838
},
3939
{
4040
q: "Where should I start with prompt engineering for AI coding?",
41-
a: `Start with vibeprompt's 9-step workflow at /workflow — it walks through every stage from raw idea to shipped product. Then browse the ${promptsCount}-prompt library at /browse. If you hit a specific problem (security, conversion, burnout, etc.), articles at /articles include ${fixesCount} field-tested fixes inline with the tactical answer for each.`,
41+
a: `Start with vibeprompt's 10-step workflow at /workflow — it walks through every stage from raw idea to shipped product. Then browse the ${promptsCount}-prompt library at /browse. If you hit a specific problem (security, conversion, burnout, etc.), articles at /articles include ${fixesCount} field-tested fixes inline with the tactical answer for each.`,
4242
},
4343
{
4444
q: "Does vibeprompt work with Claude Code, Cursor, or Windsurf?",
4545
a: "Yes — every prompt is validated against at least one of these agents. Many work across multiple tools. The library notes which agent each prompt was tested with.",
4646
},
4747
{
4848
q: "What AI prompt library for developers and vibe coders should I try in 2026?",
49-
a: `vibeprompt is the most active free option, with new content shipping weekly. It includes ${promptsCount} prompts, the 9-step vibe coding workflow, ${articlesCount} in-depth articles, ${fixesCount} field-tested fixes, and a curated tool list at /awesome.`,
49+
a: `vibeprompt is the most active free option, with new content shipping weekly. It includes ${promptsCount} prompts, the 10-step vibe coding workflow, ${articlesCount} in-depth articles, ${fixesCount} field-tested fixes, and a curated tool list at /awesome.`,
5050
},
5151
{
5252
q: "Is there a curated list of the best AI coding tools?",

src/app/layout.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,9 @@ export async function generateMetadata(): Promise<Metadata> {
2424
const p = prompts.length;
2525
const f = LIST_PROBLEMS.length;
2626
const a = articles.length;
27-
const longDesc = `Recipes for shipping with AI: a 9-step workflow, ${p} battle-tested prompts, ${f} field-tested fixes, ${a} deep-dives. Free, open source, updated as you ship.`;
28-
const ogDesc = `Recipes for shipping with AI: a 9-step workflow, ${p} prompts, ${f} fixes, and ${a} deep-dives. Free, open source, web-native, updated weekly.`;
29-
const twDesc = `Recipes for shipping with AI. 9-step workflow, ${p} prompts, ${f} fixes, ${a} deep-dives. Free, open source, updated weekly.`;
27+
const longDesc = `Recipes for shipping with AI: a 10-step workflow, ${p} battle-tested prompts, ${f} field-tested fixes, ${a} deep-dives. Free, open source, updated as you ship.`;
28+
const ogDesc = `Recipes for shipping with AI: a 10-step workflow, ${p} prompts, ${f} fixes, and ${a} deep-dives. Free, open source, web-native, updated weekly.`;
29+
const twDesc = `Recipes for shipping with AI. 10-step workflow, ${p} prompts, ${f} fixes, ${a} deep-dives. Free, open source, updated weekly.`;
3030

3131
return {
3232
icons: {

src/app/not-found.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ export const metadata: Metadata = {
1010
const SUGGESTIONS = [
1111
{
1212
href: "/workflow",
13-
label: "The 9-step workflow",
13+
label: "The 10-step workflow",
1414
description: "From raw idea to shipped. Interactive checklists, save your progress.",
1515
},
1616
{

src/app/opengraph-image.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ export default function OGImage() {
5151
<span style={{ color: "#2563EB" }}>to ship with AI.</span>
5252
</div>
5353
<div style={{ color: "#71717a", fontSize: "24px", fontWeight: "400" }}>
54-
Prompts · 9-step workflow · fixes · deep-dives · free &amp; open
54+
Prompts · 10-step workflow · fixes · deep-dives · free &amp; open
5555
</div>
5656
</div>
5757

src/app/page.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ export default async function HomePage() {
1818
"@context": "https://schema.org",
1919
"@type": "WebApplication",
2020
name: "vibeprompt",
21-
description: `The vibe coding cookbook — recipes for shipping with AI. 9-step workflow, ${promptsCount} battle-tested prompts, ${fixesCount} field-tested fixes, and ${articlesCount} deep-dives. Free, open source, web-native.`,
21+
description: `The vibe coding cookbook — recipes for shipping with AI. 10-step workflow, ${promptsCount} battle-tested prompts, ${fixesCount} field-tested fixes, and ${articlesCount} deep-dives. Free, open source, web-native.`,
2222
url: "https://vibeprompt.tech",
2323
applicationCategory: "DeveloperApplication",
2424
operatingSystem: "Web",
@@ -49,7 +49,7 @@ export default async function HomePage() {
4949
</h1>
5050

5151
<p className="mt-5 max-w-sm text-sm leading-relaxed text-foreground/55">
52-
{promptsCount} prompts, {fixesCount} fixes, a 9-step workflow.
52+
{promptsCount} prompts, {fixesCount} fixes, a 10-step workflow.
5353
{" "}
5454
<Link href="/vs-books" className="underline decoration-foreground/25 hover:decoration-foreground hover:text-foreground transition-colors">
5555
Free, open source.
@@ -163,7 +163,7 @@ export default async function HomePage() {
163163
</p>
164164

165165
<p className="mt-4 max-w-xs text-sm leading-relaxed text-foreground/55">
166-
{promptsCount} prompts, {fixesCount} fixes, a 9-step workflow.
166+
{promptsCount} prompts, {fixesCount} fixes, a 10-step workflow.
167167
{" "}
168168
<Link href="/vs-books" className="underline decoration-foreground/25 hover:decoration-foreground hover:text-foreground transition-colors">
169169
Free, open source.

src/app/prompts/[slug]/page.tsx

Lines changed: 36 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,25 @@ interface PageProps {
1111
params: Promise<{ slug: string }>;
1212
}
1313

14+
function trimDescription(text: string, max = 155): string {
15+
const cleaned = text.replace(/\s+/g, " ").trim();
16+
if (cleaned.length <= max) return cleaned;
17+
const cut = cleaned.slice(0, max);
18+
const lastSpace = cut.lastIndexOf(" ");
19+
const base = lastSpace > 60 ? cut.slice(0, lastSpace) : cut;
20+
return base.replace(/[,;:.\s]+$/, "") + "...";
21+
}
22+
1423
export async function generateMetadata({ params }: PageProps): Promise<Metadata> {
1524
const { slug } = await params;
1625
const prompt = await getPromptBySlug(slug);
1726
if (!prompt) return {};
18-
const description = prompt.useCase.slice(0, 155);
27+
const description = trimDescription(prompt.useCase);
28+
const keywords = [...(prompt.tags ?? []), ...(prompt.tools ?? []), prompt.categoryName].filter(Boolean).join(", ");
1929
return {
2030
title: `${prompt.title}, vibeprompt`,
2131
description,
32+
keywords,
2233
alternates: { canonical: `/prompts/${slug}` },
2334
openGraph: {
2435
title: prompt.title,
@@ -85,8 +96,30 @@ export default async function PromptPage({ params }: PageProps) {
8596
? prompt.whenToUse
8697
: null;
8798

99+
const jsonLd = {
100+
"@context": "https://schema.org",
101+
"@type": "TechArticle",
102+
headline: prompt.title,
103+
description: trimDescription(prompt.useCase),
104+
url: `https://vibeprompt.tech/prompts/${prompt.slug}`,
105+
mainEntityOfPage: `https://vibeprompt.tech/prompts/${prompt.slug}`,
106+
articleSection: prompt.categoryName,
107+
keywords: [...(prompt.tags ?? []), ...(prompt.tools ?? [])].join(", "),
108+
proficiencyLevel: prompt.difficulty,
109+
author: { "@type": "Person", name: contributor.login || prompt.author || "vibeprompt" },
110+
publisher: { "@type": "Organization", name: "vibeprompt", url: "https://vibeprompt.tech" },
111+
datePublished: prompt.createdAt,
112+
dateModified: prompt.createdAt,
113+
inLanguage: "en",
114+
isAccessibleForFree: true,
115+
};
116+
88117
return (
89118
<div className="pt-12">
119+
<script
120+
type="application/ld+json"
121+
dangerouslySetInnerHTML={{ __html: JSON.stringify(jsonLd) }}
122+
/>
90123
<div className="mx-auto max-w-6xl pt-6">
91124
<article className="overflow-hidden border border-foreground/20">
92125

@@ -127,9 +160,9 @@ export default async function PromptPage({ params }: PageProps) {
127160
{/* Prompt section, label + copy in same row */}
128161
<div>
129162
<div className="flex items-center justify-between border-b border-foreground/20 px-4 py-3 sm:px-8">
130-
<span className="text-[10px] font-bold uppercase tracking-widest text-foreground/40">
163+
<h2 className="text-[10px] font-bold uppercase tracking-widest text-foreground/40">
131164
Prompt
132-
</span>
165+
</h2>
133166
<div className="flex items-center gap-2">
134167
<PromptActions
135168
slug={prompt.slug}

src/app/vs-books/page.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ export default async function ComparePage() {
4444
updated: "Weekly",
4545
audience: "Solo + indie builders shipping with AI",
4646
strengths: [
47-
`${promptsCount} copyable prompts mapped to a 9-step workflow`,
47+
`${promptsCount} copyable prompts mapped to a 10-step workflow`,
4848
`${fixesCount} field-tested fixes searchable by error or topic`,
4949
`${articlesCount} deep-dives with real receipts from shipped apps`,
5050
"Interactive checklists that save progress locally",

src/app/vs-tools/page.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,7 @@ export default async function VsToolsPage() {
215215
<PickCard
216216
situation="You're a dev shipping production code"
217217
pick="Claude Code or Cursor + vibeprompt"
218-
why="The CLI/IDE agents handle complex codebases best. vibeprompt's 9-step workflow + 56 prompts mean you spend less time figuring out what to ask."
218+
why="The CLI/IDE agents handle complex codebases best. vibeprompt's 10-step workflow + 56 prompts mean you spend less time figuring out what to ask."
219219
/>
220220
<PickCard
221221
situation="You're building a UI prototype only"

src/app/workflow/opengraph-image.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { ImageResponse } from "next/og";
22

33
export const runtime = "edge";
4-
export const alt = "vibeprompt workflow — 9-step interactive build loop from idea to shipped";
4+
export const alt = "vibeprompt workflow — 10-step interactive build loop from idea to shipped";
55
export const size = { width: 1200, height: 630 };
66
export const contentType = "image/png";
77

@@ -31,15 +31,15 @@ export default function OGImage() {
3131
<div style={{ color: "#ffffff", fontSize: "72px", fontWeight: "800", lineHeight: "1.0", letterSpacing: "-0.04em" }}>
3232
From idea to shipped,
3333
<br />
34-
<span style={{ color: "#2563EB" }}>in 9 steps.</span>
34+
<span style={{ color: "#2563EB" }}>in 10 steps.</span>
3535
</div>
3636
<div style={{ color: "#71717a", fontSize: "24px", fontWeight: "400" }}>
3737
Interactive checklist. Progress saves locally. Pick up where you left off.
3838
</div>
3939
</div>
4040

41-
<div style={{ display: "flex", gap: "10px" }}>
42-
{["Environment", "Research", "PRD", "Stack", "Context", "Build", "Quality", "Ship", "Iterate"].map((step, i) => (
41+
<div style={{ display: "flex", gap: "8px", flexWrap: "wrap" }}>
42+
{["Environment", "Research", "PRD", "Stack", "Context", "Build", "Quality", "Ship", "Launch", "Iterate"].map((step, i) => (
4343
<div
4444
key={step}
4545
style={{

0 commit comments

Comments
 (0)