git-paid 2.1.3 → 2.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/pseo.js CHANGED
@@ -33,32 +33,164 @@ function humanizeSlug(routePath, cleanName = "postbuild") {
33
33
 
34
34
  const categoryLabel =
35
35
  {
36
- "use-cases": "Use Case Architecture",
36
+ "use-cases": "Use Case Guide",
37
37
  compare: "Technical Comparison",
38
38
  templates: "Starter Kit & Boilerplate",
39
39
  alternatives: "Ecosystem Evaluation",
40
- calculators: "Interactive ROI Model",
40
+ calculators: "Launch Time Model",
41
41
  guides: "Implementation Guide",
42
- checklists: "Launch Verification Checklist"
42
+ checklists: "Launch Checklist"
43
43
  }[category] || "Developer Guide";
44
44
 
45
- return { category, categoryLabel, title: words };
45
+ return { category, categoryLabel, title: words, pageSlug };
46
+ }
47
+
48
+ function renderTopicSpecificSection(pageSlug, cleanName, domain) {
49
+ if (pageSlug.includes("pricing-breakdown")) {
50
+ return `
51
+ <section class="card" style="margin-bottom:28px;">
52
+ <h2>${escapeHtml(cleanName)} Pricing &amp; Plan Comparison (14-Day Refund Guarantee)</h2>
53
+ <p style="font-size:14px;color:var(--muted);margin-top:4px;">
54
+ Every paid plan includes a 14-day refund policy. Start with a free readiness audit on any live URL before purchasing.
55
+ </p>
56
+ <div class="table-wrap" role="region" aria-label="Pricing comparison" tabindex="0">
57
+ <table>
58
+ <thead>
59
+ <tr>
60
+ <th>Plan</th>
61
+ <th>Price</th>
62
+ <th>Domain Scope</th>
63
+ <th>Included Deliverables</th>
64
+ </tr>
65
+ </thead>
66
+ <tbody>
67
+ <tr>
68
+ <td><strong>Free Audit &amp; Preview</strong></td>
69
+ <td><strong>$0</strong></td>
70
+ <td>Any public URL</td>
71
+ <td>8-point SEO &amp; AI crawler readiness scan, copy-paste <code>robots.txt</code> / <code>llms.txt</code> / JSON-LD snippets, and 5-directory preview.</td>
72
+ </tr>
73
+ <tr>
74
+ <td><strong>Launch Pass</strong> <span class="pill emerald" style="margin-left:6px;">Recommended</span></td>
75
+ <td><strong>$29</strong> (one-time)</td>
76
+ <td>1 project domain</td>
77
+ <td>All 85 prefilled directory launch links + CSV export, 25 static HTML SEO route generators (<code>npx git-paid fix</code>), dedicated <code>&lt;domain&gt;-bot@postbuild.dev</code> verification inbox (30-day retention), and CLI/MCP key.</td>
78
+ </tr>
79
+ <tr>
80
+ <td><strong>Studio</strong></td>
81
+ <td><strong>$49 / month</strong></td>
82
+ <td>Multi-project</td>
83
+ <td>Everything in Launch Pass across multiple domains, IndexNow &amp; WebSub batch pinging, and Stripe Customer Portal billing management.</td>
84
+ </tr>
85
+ </tbody>
86
+ </table>
87
+ </div>
88
+ </section>`;
89
+ }
90
+
91
+ if (pageSlug.includes("roi-case-study")) {
92
+ return `
93
+ <section class="card" style="margin-bottom:28px;">
94
+ <h2>Dogfooding Case Study: Launching <code>www.postbuild.dev</code> with <code>npx git-paid</code></h2>
95
+ <p style="font-size:14px;color:var(--muted);margin-top:4px;">
96
+ We built and launched <code>www.postbuild.dev</code> using our own CLI and MCP server. Here is the exact baseline vs. post-build output measured on our own repository:
97
+ </p>
98
+ <div class="table-wrap" role="region" aria-label="Dogfooding launch metrics" tabindex="0">
99
+ <table>
100
+ <thead>
101
+ <tr>
102
+ <th>Deliverable</th>
103
+ <th>Before <code>npx git-paid fix</code></th>
104
+ <th>After <code>npx git-paid fix</code></th>
105
+ </tr>
106
+ </thead>
107
+ <tbody>
108
+ <tr>
109
+ <td><strong>Technical Readiness Score</strong></td>
110
+ <td>38 / 100 (missing <code>llms.txt</code>, <code>sitemap.xml</code>, and AI crawler rules)</td>
111
+ <td>100 / 100 (all 8 SEO, JSON-LD, OpenGraph, and telemetry checks passing)</td>
112
+ </tr>
113
+ <tr>
114
+ <td><strong>Static SEO Landing Pages</strong></td>
115
+ <td>1 route (<code>/</code> only)</td>
116
+ <td>26 routes indexed in <code>sitemap.xml</code> (<code>/</code> + 25 pre-rendered guides &amp; comparisons)</td>
117
+ </tr>
118
+ <tr>
119
+ <td><strong>Directory Submission Prep</strong></td>
120
+ <td>Manual spreadsheet tracking</td>
121
+ <td>85 prefilled submission URLs with UTM parameters + dedicated <code>postbuild-bot@postbuild.dev</code> inbox</td>
122
+ </tr>
123
+ <tr>
124
+ <td><strong>Setup Time</strong></td>
125
+ <td>~28 hours estimated manual work</td>
126
+ <td>Under 5 minutes via CLI + Vercel deploy</td>
127
+ </tr>
128
+ </tbody>
129
+ </table>
130
+ </div>
131
+ </section>`;
132
+ }
133
+
134
+ if (pageSlug.includes("alternatives")) {
135
+ return `
136
+ <section class="card" style="margin-bottom:28px;">
137
+ <h2>Comparing SaaS Launch &amp; Directory Submission Approaches in 2026</h2>
138
+ <p style="font-size:14px;color:var(--muted);margin-top:4px;">
139
+ Founders typically choose between manual spreadsheet submissions, high-ticket submission agencies ($99–$299+), or CLI-driven preparation with <code>npx git-paid</code>.
140
+ </p>
141
+ <div class="table-wrap" role="region" aria-label="Alternatives comparison" tabindex="0">
142
+ <table>
143
+ <thead>
144
+ <tr>
145
+ <th>Approach</th>
146
+ <th>Typical Cost</th>
147
+ <th>Verification Inbox</th>
148
+ <th>Technical SEO &amp; <code>llms.txt</code></th>
149
+ </tr>
150
+ </thead>
151
+ <tbody>
152
+ <tr>
153
+ <td><strong>Manual Spreadsheets</strong></td>
154
+ <td>$0 (14–28 hrs founder time)</td>
155
+ <td>Clutters personal email</td>
156
+ <td>Manual authoring required</td>
157
+ </tr>
158
+ <tr>
159
+ <td><strong>Directory Submission Agencies</strong></td>
160
+ <td>$99 – $299 per site</td>
161
+ <td>Opaque third-party Gmail</td>
162
+ <td>Not included (links only)</td>
163
+ </tr>
164
+ <tr>
165
+ <td><strong>${escapeHtml(cleanName)} (<code>npx git-paid</code>)</strong></td>
166
+ <td><strong>$29 one-time</strong> (Launch Pass)</td>
167
+ <td>Dedicated <code>&lt;domain&gt;-bot@postbuild.dev</code></td>
168
+ <td>Generates <code>robots.txt</code>, <code>sitemap.xml</code>, <code>llms.txt</code>, JSON-LD &amp; 25 HTML routes</td>
169
+ </tr>
170
+ </tbody>
171
+ </table>
172
+ </div>
173
+ </section>`;
174
+ }
175
+
176
+ return "";
46
177
  }
47
178
 
48
179
  /**
49
- * Generates a complete, indexable, light-mode HTML landing page for a Programmatic SEO route.
180
+ * Generates a complete, indexable HTML landing page for a Programmatic SEO route.
50
181
  */
51
182
  export function renderSinglePseoPage(page, allPages = [], options = {}) {
52
- const origin = (options.origin || "https://postbuild.dev").replace(/\/$/, "");
183
+ const origin = (options.origin || "https://www.postbuild.dev").replace(/\/$/, "");
53
184
  const cleanName = options.cleanName || "postbuild";
54
185
  const domain = options.domain || "postbuild.dev";
55
- const { category, categoryLabel, title } = humanizeSlug(page.path, cleanName);
186
+ const { categoryLabel, title, pageSlug } = humanizeSlug(page.path, cleanName);
56
187
 
57
188
  const fullTitle = `${title} — ${categoryLabel} | ${cleanName}`;
58
189
  const canonicalUrl = `${origin}${page.path}`;
59
- const metaDescription = `Complete ${new Date().getFullYear()} ${categoryLabel.toLowerCase()} for ${page.keyword}. Automate 25 programmatic SEO routes, provision a @postbuild.dev verification inbox, and dispatch to 85 directories with git paid.`;
190
+ const metaDescription = `${categoryLabel} for ${page.keyword}. Audit your live URL, generate robots.txt, sitemap.xml, llms.txt, and prepare 85 prefilled directory submissions with npx git-paid.`;
60
191
 
61
192
  const relatedPages = allPages.filter((p) => p.path !== page.path).slice(0, 8);
193
+ const topicSection = renderTopicSpecificSection(pageSlug, cleanName, domain);
62
194
 
63
195
  const jsonLd = {
64
196
  "@context": "https://schema.org",
@@ -88,18 +220,18 @@ export function renderSinglePseoPage(page, allPages = [], options = {}) {
88
220
  mainEntity: [
89
221
  {
90
222
  "@type": "Question",
91
- name: `How does ${cleanName} automate ${page.keyword}?`,
223
+ name: `How does ${cleanName} help with ${page.keyword}?`,
92
224
  acceptedAnswer: {
93
225
  "@type": "Answer",
94
- text: `By running npx git-paid (or connecting the Postbuild MCP server to Claude Code, Cursor, or Gemini), ${cleanName} audits your live domain, synthesizes 25 programmatic SEO routes, provisions a dedicated @postbuild.dev verification inbox, and dispatches your launch kit across 85 curated directories.`
226
+ text: `By running npx git-paid on your live URL, ${cleanName} audits 8 technical SEO and AI crawler signals, writes missing robots.txt, sitemap.xml, llms.txt, and 25 static HTML routes to your repo, and prepares 85 prefilled directory submission links with a dedicated @postbuild.dev verification inbox.`
95
227
  }
96
228
  },
97
229
  {
98
230
  "@type": "Question",
99
- name: `Why use a Stateful MCP server for post-build SEO and directory dispatch?`,
231
+ name: `What is included in the $29 Launch Pass vs. the free audit?`,
100
232
  acceptedAnswer: {
101
233
  "@type": "Answer",
102
- text: `Postbuild MCP uses watermark context residuals (unchanged@vN) and an in-memory superset cache to reduce multi-turn agent token consumption by over 75% while enforcing Two-Phase Cryptographic Optimistic Concurrency Control (OCC) before dispatching live directory submissions.`
234
+ text: `The free audit checks your live URL and provides copy-paste snippets plus a 5-directory preview. The $29 one-time Launch Pass unlocks all 85 prefilled directory links, CSV/JSON exports, repo file generation via npx git-paid fix, and your dedicated @postbuild.dev verification inbox with a 14-day refund guarantee.`
103
235
  }
104
236
  }
105
237
  ]
@@ -124,8 +256,12 @@ export function renderSinglePseoPage(page, allPages = [], options = {}) {
124
256
  <meta name="twitter:card" content="summary_large_image" />
125
257
  <meta name="twitter:title" content="${escapeHtml(fullTitle)}" />
126
258
  <meta name="twitter:description" content="${escapeHtml(metaDescription)}" />
127
- <link rel="icon" type="image/svg+xml" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect width='32' height='32' rx='8' fill='%2309090B'/%3E%3Crect x='6' y='7' width='8' height='8' rx='2' stroke='%23FFFFFF' stroke-width='2.2' fill='none'/%3E%3Crect x='6' y='17' width='8' height='8' rx='2' stroke='%23FFFFFF' stroke-width='2.2' opacity='0.5' fill='none'/%3E%3Cpath d='M18 11H26M26 11L22.8 7.8M26 11L22.8 14.2' stroke='%2338BDF8' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round'/%3E%3Ccircle cx='22' cy='21' r='2.8' fill='%23FFFFFF'/%3E%3C/svg%3E" />
259
+ <link rel="icon" type="image/svg+xml" href="/brand/postbuild-icon.svg" />
128
260
  <script type="application/ld+json">${JSON.stringify(jsonLd)}</script>
261
+ <script>
262
+ window.si = window.si || function () { (window.siq = window.siq || []).push(arguments); };
263
+ </script>
264
+ <script defer src="/_vercel/speed-insights/script.js"></script>
129
265
  <style>
130
266
  :root {
131
267
  --bg: #fafafa;
@@ -136,7 +272,7 @@ export function renderSinglePseoPage(page, allPages = [], options = {}) {
136
272
  --border: #e4e4e7;
137
273
  --accent: #0284c7;
138
274
  --accent-soft: #f0f9ff;
139
- --emerald: #059669;
275
+ --emerald: #047857;
140
276
  --emerald-soft: #ecfdf5;
141
277
  }
142
278
  * { box-sizing: border-box; }
@@ -145,23 +281,24 @@ export function renderSinglePseoPage(page, allPages = [], options = {}) {
145
281
  padding: 0;
146
282
  background: var(--bg);
147
283
  color: var(--text);
148
- font-family: -apple-system, BlinkMacSystemFont, "Inter", "Segoe UI", Roboto, sans-serif;
284
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
149
285
  line-height: 1.6;
150
286
  -webkit-text-size-adjust: 100%;
151
287
  text-size-adjust: 100%;
288
+ overflow-x: clip;
152
289
  }
153
290
  .container {
154
291
  max-width: 980px;
155
292
  margin: 0 auto;
156
- padding: 24px 20px 72px;
293
+ padding: 24px 16px 56px;
157
294
  }
158
295
  .topbar {
159
296
  display: flex;
160
297
  align-items: center;
161
298
  justify-content: space-between;
162
- padding: 14px 0 28px;
299
+ padding: 12px 0 24px;
163
300
  border-bottom: 1px solid var(--border);
164
- margin-bottom: 36px;
301
+ margin-bottom: 32px;
165
302
  gap: 12px;
166
303
  flex-wrap: wrap;
167
304
  }
@@ -179,7 +316,7 @@ export function renderSinglePseoPage(page, allPages = [], options = {}) {
179
316
  font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
180
317
  font-size: 11px;
181
318
  font-weight: 600;
182
- padding: 2px 8px;
319
+ padding: 3px 8px;
183
320
  border-radius: 999px;
184
321
  background: #f4f4f5;
185
322
  color: var(--muted);
@@ -189,16 +326,16 @@ export function renderSinglePseoPage(page, allPages = [], options = {}) {
189
326
  display: inline-flex;
190
327
  align-items: center;
191
328
  gap: 8px;
192
- background: var(--text);
329
+ background: var(--emerald);
193
330
  color: #ffffff;
194
331
  text-decoration: none;
195
- padding: 9px 16px;
332
+ padding: 10px 16px;
196
333
  border-radius: 8px;
197
334
  font-size: 13px;
198
335
  font-weight: 600;
199
336
  transition: opacity 0.15s ease;
200
337
  }
201
- .cta-btn:hover { opacity: 0.9; }
338
+ .cta-btn:hover { opacity: 0.92; }
202
339
  .pill-row {
203
340
  display: flex;
204
341
  flex-wrap: wrap;
@@ -209,7 +346,7 @@ export function renderSinglePseoPage(page, allPages = [], options = {}) {
209
346
  display: inline-flex;
210
347
  align-items: center;
211
348
  gap: 6px;
212
- font-size: 11px;
349
+ font-size: 12px;
213
350
  font-weight: 600;
214
351
  padding: 4px 10px;
215
352
  border-radius: 999px;
@@ -223,8 +360,8 @@ export function renderSinglePseoPage(page, allPages = [], options = {}) {
223
360
  border-color: #a7f3d0;
224
361
  }
225
362
  h1 {
226
- font-size: clamp(26px, 4vw, 38px);
227
- line-height: 1.18;
363
+ font-size: clamp(24px, 4vw, 36px);
364
+ line-height: 1.2;
228
365
  letter-spacing: -0.03em;
229
366
  margin: 0 0 14px;
230
367
  }
@@ -236,7 +373,7 @@ export function renderSinglePseoPage(page, allPages = [], options = {}) {
236
373
  }
237
374
  .grid-2 {
238
375
  display: grid;
239
- grid-template-columns: repeat(auto-fit, minmax(290px, 1fr));
376
+ grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
240
377
  gap: 18px;
241
378
  margin-bottom: 28px;
242
379
  }
@@ -244,8 +381,9 @@ export function renderSinglePseoPage(page, allPages = [], options = {}) {
244
381
  background: var(--surface);
245
382
  border: 1px solid var(--border);
246
383
  border-radius: 12px;
247
- padding: 22px;
384
+ padding: 20px;
248
385
  box-shadow: 0 1px 2px rgba(0,0,0,0.03);
386
+ min-width: 0;
249
387
  }
250
388
  .card h2, .card h3 {
251
389
  margin-top: 0;
@@ -256,25 +394,32 @@ export function renderSinglePseoPage(page, allPages = [], options = {}) {
256
394
  color: #f4f4f5;
257
395
  font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
258
396
  font-size: 12.5px;
259
- padding: 16px;
397
+ padding: 14px;
260
398
  border-radius: 10px;
261
399
  overflow-x: auto;
262
400
  line-height: 1.65;
263
401
  margin: 14px 0;
264
402
  }
265
- .code-box .comment { color: #71717a; }
403
+ .code-box .comment { color: #a1a1aa; }
266
404
  .code-box .cmd { color: #38bdf8; }
267
405
  .code-box .ok { color: #34d399; }
406
+ .table-wrap {
407
+ width: 100%;
408
+ overflow-x: auto;
409
+ -webkit-overflow-scrolling: touch;
410
+ margin: 12px 0;
411
+ }
268
412
  table {
269
413
  width: 100%;
414
+ min-width: 520px;
270
415
  border-collapse: collapse;
271
- font-size: 13.5px;
272
- margin: 12px 0;
416
+ font-size: 14px;
273
417
  }
274
418
  th, td {
275
419
  text-align: left;
276
420
  padding: 11px 12px;
277
421
  border-bottom: 1px solid var(--border);
422
+ vertical-align: top;
278
423
  }
279
424
  th {
280
425
  font-size: 11.5px;
@@ -289,10 +434,10 @@ export function renderSinglePseoPage(page, allPages = [], options = {}) {
289
434
  justify-content: space-between;
290
435
  gap: 12px;
291
436
  margin: 12px 0;
292
- font-size: 13.5px;
437
+ font-size: 14px;
293
438
  }
294
439
  .calc-output {
295
- font-size: 24px;
440
+ font-size: 22px;
296
441
  font-weight: 700;
297
442
  color: var(--emerald);
298
443
  letter-spacing: -0.02em;
@@ -305,13 +450,13 @@ export function renderSinglePseoPage(page, allPages = [], options = {}) {
305
450
  }
306
451
  .cluster-link {
307
452
  display: block;
308
- padding: 11px 14px;
453
+ padding: 12px 14px;
309
454
  border-radius: 8px;
310
455
  border: 1px solid var(--border);
311
456
  background: var(--surface);
312
457
  color: var(--text);
313
458
  text-decoration: none;
314
- font-size: 13px;
459
+ font-size: 13.5px;
315
460
  font-weight: 500;
316
461
  transition: border-color 0.15s ease;
317
462
  }
@@ -321,30 +466,52 @@ export function renderSinglePseoPage(page, allPages = [], options = {}) {
321
466
  }
322
467
  .cluster-meta {
323
468
  display: block;
324
- font-size: 11px;
469
+ font-size: 11.5px;
325
470
  color: var(--subtle);
326
471
  margin-top: 2px;
327
472
  }
473
+ .site-footer {
474
+ margin-top: 40px;
475
+ padding-top: 20px;
476
+ border-top: 1px solid var(--border);
477
+ display: flex;
478
+ flex-wrap: wrap;
479
+ align-items: center;
480
+ justify-content: space-between;
481
+ gap: 12px;
482
+ font-size: 13px;
483
+ color: var(--muted);
484
+ }
485
+ .site-footer a {
486
+ color: var(--muted);
487
+ text-decoration: none;
488
+ padding: 6px 4px;
489
+ }
490
+ .site-footer a:hover {
491
+ color: var(--text);
492
+ text-decoration: underline;
493
+ }
328
494
  </style>
329
495
  </head>
330
496
  <body>
331
497
  <div class="container">
332
498
  <header class="topbar">
333
499
  <a href="/" class="brand">
334
- <svg width="24" height="24" viewBox="0 0 32 32" fill="none">
335
- <rect width="32" height="32" rx="8" fill="#09090B"/>
336
- <rect x="6" y="7" width="8" height="8" rx="2" stroke="#FFFFFF" stroke-width="2.2"/>
337
- <rect x="6" y="17" width="8" height="8" rx="2" stroke="#FFFFFF" stroke-width="2.2" opacity="0.5"/>
338
- <path d="M18 11H26M26 11L22.8 7.8M26 11L22.8 14.2" stroke="#38BDF8" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round"/>
339
- <circle cx="22" cy="21" r="2.8" fill="#FFFFFF"/>
500
+ <svg width="26" height="26" viewBox="0 0 64 64" fill="none">
501
+ <rect x="2" y="2" width="60" height="60" rx="14" fill="#FFFFFF" stroke="#E2E8F0" stroke-width="2" />
502
+ <rect x="11" y="11" width="18" height="18" rx="5" stroke="#0F172A" stroke-width="4.5" fill="#F8FAFC" />
503
+ <rect x="11" y="35" width="18" height="18" rx="5" stroke="#64748B" stroke-width="4.5" fill="#F8FAFC" />
504
+ <path d="M35 20H52M52 20L45 13M52 20L45 27" stroke="#0284C7" stroke-width="4.5" stroke-linecap="round" stroke-linejoin="round" fill="none" />
505
+ <rect x="34" y="34" width="20" height="20" rx="6" fill="#10B981" />
506
+ <text x="44" y="50" text-anchor="middle" fill="#FFFFFF" font-family="-apple-system, BlinkMacSystemFont, 'Segoe UI', Inter, sans-serif" font-size="16" font-weight="800">$</text>
340
507
  </svg>
341
508
  <span>${escapeHtml(cleanName)}</span>
342
509
  <span class="brand-badge">git paid</span>
343
510
  </a>
344
- <div style="display:flex;gap:10px;align-items:center;">
345
- <a href="/?tab=agent" class="brand-badge" style="text-decoration:none;padding:6px 11px;">Stateful MCP v2.1</a>
346
- <a href="/?utm_source=pseo&utm_campaign=${encodeURIComponent(page.id || "guide")}" class="cta-btn">
347
- <span>Run Live Domain Audit</span>
511
+ <div style="display:flex;gap:10px;align-items:center;flex-wrap:wrap;">
512
+ <a href="/?tab=pricing" class="brand-badge" style="text-decoration:none;padding:7px 12px;">Pricing ($29)</a>
513
+ <a href="/" class="cta-btn">
514
+ <span>Scan Your Live URL</span>
348
515
  <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2"><path d="M5 12h14M12 5l7 7-7 7"/></svg>
349
516
  </a>
350
517
  </div>
@@ -353,98 +520,101 @@ export function renderSinglePseoPage(page, allPages = [], options = {}) {
353
520
  <main>
354
521
  <div class="pill-row">
355
522
  <span class="pill">${escapeHtml(categoryLabel)}</span>
356
- <span class="pill emerald">Intent: ${escapeHtml(page.intent || "High Intent")}</span>
357
- <span class="pill">Search Volume: ${escapeHtml(page.volume || "1,400/mo")} (${escapeHtml(page.kd || "KD 11")})</span>
523
+ <span class="pill emerald">CLI &amp; Web Workspace</span>
358
524
  </div>
359
525
 
360
526
  <h1>${escapeHtml(title)}</h1>
361
527
  <p class="lead">
362
- Shipping code with <code>git push</code> is only half the battle. Here is the deterministic engineering blueprint for <strong>${escapeHtml(page.keyword)}</strong>—combining 25 programmatic SEO routes, an autonomous <code>@postbuild.dev</code> verification inbox, and 85-directory dispatch via <code>npx git-paid</code>.
528
+ Run one command on your deployed site to audit 8 SEO &amp; AI-crawler checks, generate missing <code>robots.txt</code>, <code>sitemap.xml</code>, and <code>llms.txt</code> files, and prepare 85 prefilled directory submission links with a dedicated <code>@postbuild.dev</code> verification inbox.
363
529
  </p>
364
530
 
531
+ ${topicSection}
532
+
365
533
  <div class="grid-2">
366
534
  <section class="card">
367
- <h3>1-Command CLI &amp; Stateful MCP Execution</h3>
368
- <p style="font-size:13.5px;color:var(--muted);margin-top:4px;">
369
- Run directly from your project root after deploying to Vercel, Railway, or Fly.io, or attach as an MCP server inside Claude Code, Cursor, or Gemini.
535
+ <h3>CLI &amp; MCP Quickstart</h3>
536
+ <p style="font-size:14px;color:var(--muted);margin-top:4px;">
537
+ Run from your terminal after deploying to Vercel, Railway, Render, or Fly.io, or scan any URL directly in the web workspace.
370
538
  </p>
371
539
  <div class="code-box">
372
- <div><span class="comment"># 1. Audit your live URL &amp; write 25 pSEO routes + llms.txt</span></div>
373
- <div><span class="cmd">$ npx git-paid fix https://${escapeHtml(domain)}</span></div>
374
- <div style="margin-top:8px;"><span class="comment"># 2. Dispatch across 85 curated directories with OCC safety</span></div>
375
- <div><span class="cmd">$ npx git-paid submit https://${escapeHtml(domain)} --limit 10</span></div>
376
- <div style="margin-top:8px;"><span class="comment"># 3. Auto-verify inbound @postbuild.dev OTPs &amp; links</span></div>
377
- <div><span class="ok">✔ Verified 100% of inbound directory confirmation links</span></div>
540
+ <div><span class="comment"># 1. Audit your live URL &amp; write SEO files + 25 routes</span></div>
541
+ <div><span class="cmd">$ npx git-paid fix https://your-project.com</span></div>
542
+ <div style="margin-top:8px;"><span class="comment"># 2. Prepare 85 prefilled directory links &amp; ping IndexNow</span></div>
543
+ <div><span class="cmd">$ npx git-paid submit https://your-project.com --limit 10</span></div>
544
+ <div style="margin-top:8px;"><span class="comment"># 3. Read verification OTPs from your @postbuild.dev inbox</span></div>
545
+ <div><span class="ok">✔ Extracted OTP codes &amp; confirmation links</span></div>
378
546
  </div>
379
- <a href="/?domain=${encodeURIComponent(domain)}" class="cta-btn" style="width:100%;justify-content:center;margin-top:10px;">
380
- Launch Interactive Workspace for ${escapeHtml(domain)}
547
+ <a href="/" class="cta-btn" style="width:100%;justify-content:center;margin-top:10px;">
548
+ Run Free Readiness Scan on Your URL
381
549
  </a>
382
550
  </section>
383
551
 
384
552
  <section class="card">
385
- <h3>Interactive Launch ROI &amp; Time Saved Estimator</h3>
386
- <p style="font-size:13.5px;color:var(--muted);margin-top:4px;">
387
- Adjust your monthly launch cadence to compare manual directory &amp; pSEO setup against <code>git paid</code> automation.
553
+ <h3>Launch Prep Time Estimator</h3>
554
+ <p style="font-size:14px;color:var(--muted);margin-top:4px;">
555
+ Estimates founder hours saved per launch based on ~10 mins per directory form (&times;85 directories &approx; 14 hrs) plus ~30 mins per static SEO guide (&times;25 routes &approx; 14 hrs) = <strong>28 hrs/launch</strong>.
388
556
  </p>
389
557
  <div class="calc-row">
390
- <label for="projectsRange"><strong>Projects / Features Launched per Year:</strong></label>
558
+ <label for="projectsRange"><strong>Projects Launched per Year:</strong></label>
391
559
  <span id="projectsVal" style="font-weight:700;">4 launches</span>
392
560
  </div>
393
- <input id="projectsRange" type="range" min="1" max="20" value="4" style="width:100%;accent-color:#09090b;" oninput="updateRoi(this.value)" />
561
+ <input id="projectsRange" type="range" min="1" max="20" value="4" style="width:100%;accent-color:#047857;height:28px;" oninput="updateRoi(this.value)" />
394
562
  <div class="calc-row" style="margin-top:16px;padding-top:12px;border-top:1px solid var(--border);">
395
- <span>Engineering &amp; Founder Hours Saved:</span>
563
+ <span>Estimated Prep Time Saved:</span>
396
564
  <span id="hoursSaved" class="calc-output">112 hrs</span>
397
565
  </div>
398
566
  <div class="calc-row">
399
- <span>Indexed Programmatic SEO Landing Pages:</span>
400
- <span id="pagesBuilt" style="font-weight:700;font-size:16px;">100 routes</span>
567
+ <span>Static SEO Guides Generated (25/project):</span>
568
+ <span id="pagesBuilt" style="font-weight:700;font-size:15px;">100 routes</span>
401
569
  </div>
402
570
  <div class="calc-row">
403
- <span>High-DR Backlink Submissions Dispatched:</span>
404
- <span id="dirsDispatched" style="font-weight:700;font-size:16px;">340 listings</span>
571
+ <span>Prefilled Directory Links (85/project):</span>
572
+ <span id="dirsDispatched" style="font-weight:700;font-size:15px;">340 listings</span>
405
573
  </div>
406
574
  </section>
407
575
  </div>
408
576
 
409
577
  <section class="card" style="margin-bottom:28px;">
410
- <h2>Manual Post-Build Workflow vs. ${escapeHtml(cleanName)} (<code>git paid</code>)</h2>
411
- <table>
412
- <thead>
413
- <tr>
414
- <th>Post-Build Capability</th>
415
- <th>Manual Workflow / Spreadsheets</th>
416
- <th>${escapeHtml(cleanName)} Autonomous Engine</th>
417
- </tr>
418
- </thead>
419
- <tbody>
420
- <tr>
421
- <td><strong>85-Directory Submission &amp; UTM Tagging</strong></td>
422
- <td>14+ hours of repetitive copy-pasting &amp; form filling</td>
423
- <td>Automated pre-filled &amp; API dispatch via <code>git paid submit</code></td>
424
- </tr>
425
- <tr>
426
- <td><strong>Directory Verification Emails &amp; OTPs</strong></td>
427
- <td>Clutters personal founder inbox with 85+ confirmation emails</td>
428
- <td>Dedicated <code>*@postbuild.dev</code> Resend inbox + Agent Auto-Verifier</td>
429
- </tr>
430
- <tr>
431
- <td><strong>Programmatic SEO Architecture</strong></td>
432
- <td>Manual keyword research &amp; hand-coded static pages</td>
433
- <td>25 pre-rendered routes + <code>sitemap.xml</code> + <code>llms.txt</code> in 1 command</td>
434
- </tr>
435
- <tr>
436
- <td><strong>AI Agent MCP Context Efficiency</strong></td>
437
- <td>Stateless JSON re-serialization (280 KB+ across 5 turns)</td>
438
- <td>Stateful watermark deltas (<code>unchanged@vN</code> — <strong>-84% token overhead</strong>)</td>
439
- </tr>
440
- </tbody>
441
- </table>
578
+ <h2>Manual Post-Build Setup vs. ${escapeHtml(cleanName)} (<code>git paid</code>)</h2>
579
+ <div class="table-wrap" role="region" aria-label="Feature comparison" tabindex="0">
580
+ <table>
581
+ <thead>
582
+ <tr>
583
+ <th>Post-Build Task</th>
584
+ <th>Manual Setup / Spreadsheets</th>
585
+ <th>${escapeHtml(cleanName)} (<code>npx git-paid</code>)</th>
586
+ </tr>
587
+ </thead>
588
+ <tbody>
589
+ <tr>
590
+ <td><strong>85-Directory Submission Links &amp; UTMs</strong></td>
591
+ <td>~14 hours of repetitive copy-pasting &amp; URL tagging</td>
592
+ <td>85 prefilled submission URLs + CSV export ready in seconds</td>
593
+ </tr>
594
+ <tr>
595
+ <td><strong>Directory Verification Emails &amp; OTPs</strong></td>
596
+ <td>Clutters personal inbox with 85+ signup emails</td>
597
+ <td>Dedicated <code>&lt;domain&gt;-bot@postbuild.dev</code> verification inbox</td>
598
+ </tr>
599
+ <tr>
600
+ <td><strong>Technical SEO &amp; AI Crawler Files</strong></td>
601
+ <td>Hand-written <code>robots.txt</code>, <code>sitemap.xml</code>, and <code>llms.txt</code></td>
602
+ <td>Generated and written to <code>public/</code> via <code>npx git-paid fix</code></td>
603
+ </tr>
604
+ <tr>
605
+ <td><strong>AI Agent MCP Context Efficiency</strong></td>
606
+ <td>Full JSON re-serialization on every turn</td>
607
+ <td>Stateful watermark deltas (<code>unchanged@vN</code> compact stubs)</td>
608
+ </tr>
609
+ </tbody>
610
+ </table>
611
+ </div>
442
612
  </section>
443
613
 
444
614
  <section class="card">
445
- <h3>Explore All 25 Programmatic SEO Blueprints</h3>
446
- <p style="font-size:13px;color:var(--muted);margin-top:0;">
447
- Every route below is pre-indexed in <code>sitemap.xml</code> and <code>llms.txt</code> for Google, ChatGPT Search (<code>OAI-SearchBot</code>), Perplexity, and Claude.
615
+ <h3>Related Post-Build Guides &amp; Checklists</h3>
616
+ <p style="font-size:14px;color:var(--muted);margin-top:0;">
617
+ Browse additional guides indexed in <code>sitemap.xml</code> and <code>llms.txt</code>:
448
618
  </p>
449
619
  <div class="cluster-grid">
450
620
  ${relatedPages
@@ -452,13 +622,27 @@ export function renderSinglePseoPage(page, allPages = [], options = {}) {
452
622
  const meta = humanizeSlug(rp.path, cleanName);
453
623
  return `<a class="cluster-link" href="${escapeHtml(rp.path)}">
454
624
  <span>${escapeHtml(meta.title)}</span>
455
- <span class="cluster-meta">${escapeHtml(rp.keyword)} • ${escapeHtml(rp.volume)}</span>
625
+ <span class="cluster-meta">${escapeHtml(meta.categoryLabel)}</span>
456
626
  </a>`;
457
627
  })
458
628
  .join("\n ")}
459
629
  </div>
460
630
  </section>
461
631
  </main>
632
+
633
+ <footer class="site-footer">
634
+ <div>
635
+ <strong>postbuild.dev</strong> (<code>git-paid</code> v2.1.5) — Post-build SEO, directory launch kit &amp; verification inbox.
636
+ </div>
637
+ <div style="display:flex;gap:14px;flex-wrap:wrap;">
638
+ <a href="/">Home &amp; Audit</a>
639
+ <a href="/?tab=pricing">Pricing ($29)</a>
640
+ <a href="https://www.npmjs.com/package/git-paid" target="_blank" rel="noopener">npm</a>
641
+ <a href="/terms.html">Terms &amp; 14-Day Refund</a>
642
+ <a href="/privacy.html">Privacy</a>
643
+ <a href="mailto:support@postbuild.dev">support@postbuild.dev</a>
644
+ </div>
645
+ </footer>
462
646
  </div>
463
647
  <script>
464
648
  function updateRoi(val) {