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/README.md +22 -34
- package/bin/git-paid.js +14 -14
- package/lib/auth.js +866 -282
- package/lib/directories.js +123 -123
- package/lib/engine.js +228 -112
- package/lib/fixer.js +58 -0
- package/lib/inbox.js +359 -72
- package/lib/mcp.js +139 -90
- package/lib/pseo.js +290 -106
- package/lib/safe-fetch.js +239 -0
- package/lib/stateful-mcp.js +16 -4
- package/lib/submitter.js +89 -28
- package/package.json +53 -44
- package/brand/README.md +0 -54
- package/brand/postbuild-icon.png +0 -0
- package/brand/postbuild-icon.svg +0 -14
- package/brand/postbuild-logo.png +0 -0
- package/brand/postbuild-logo.svg +0 -17
- package/lib/stripe.js +0 -554
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
|
|
36
|
+
"use-cases": "Use Case Guide",
|
|
37
37
|
compare: "Technical Comparison",
|
|
38
38
|
templates: "Starter Kit & Boilerplate",
|
|
39
39
|
alternatives: "Ecosystem Evaluation",
|
|
40
|
-
calculators: "
|
|
40
|
+
calculators: "Launch Time Model",
|
|
41
41
|
guides: "Implementation Guide",
|
|
42
|
-
checklists: "Launch
|
|
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 & 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 & Preview</strong></td>
|
|
69
|
+
<td><strong>$0</strong></td>
|
|
70
|
+
<td>Any public URL</td>
|
|
71
|
+
<td>8-point SEO & 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><domain>-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 & 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 & 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 & 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 & <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><domain>-bot@postbuild.dev</code></td>
|
|
168
|
+
<td>Generates <code>robots.txt</code>, <code>sitemap.xml</code>, <code>llms.txt</code>, JSON-LD & 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
|
|
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 {
|
|
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 =
|
|
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}
|
|
223
|
+
name: `How does ${cleanName} help with ${page.keyword}?`,
|
|
92
224
|
acceptedAnswer: {
|
|
93
225
|
"@type": "Answer",
|
|
94
|
-
text: `By running npx git-paid
|
|
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: `
|
|
231
|
+
name: `What is included in the $29 Launch Pass vs. the free audit?`,
|
|
100
232
|
acceptedAnswer: {
|
|
101
233
|
"@type": "Answer",
|
|
102
|
-
text: `
|
|
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="
|
|
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: #
|
|
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, "
|
|
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
|
|
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:
|
|
299
|
+
padding: 12px 0 24px;
|
|
163
300
|
border-bottom: 1px solid var(--border);
|
|
164
|
-
margin-bottom:
|
|
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:
|
|
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(--
|
|
329
|
+
background: var(--emerald);
|
|
193
330
|
color: #ffffff;
|
|
194
331
|
text-decoration: none;
|
|
195
|
-
padding:
|
|
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.
|
|
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:
|
|
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(
|
|
227
|
-
line-height: 1.
|
|
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(
|
|
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:
|
|
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:
|
|
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: #
|
|
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:
|
|
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:
|
|
437
|
+
font-size: 14px;
|
|
293
438
|
}
|
|
294
439
|
.calc-output {
|
|
295
|
-
font-size:
|
|
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:
|
|
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:
|
|
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:
|
|
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="
|
|
335
|
-
<rect width="
|
|
336
|
-
<rect x="
|
|
337
|
-
<rect x="
|
|
338
|
-
<path d="
|
|
339
|
-
<
|
|
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=
|
|
346
|
-
<a href="
|
|
347
|
-
<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">
|
|
357
|
-
<span class="pill">Search Volume: ${escapeHtml(page.volume || "1,400/mo")} (${escapeHtml(page.kd || "KD 11")})</span>
|
|
523
|
+
<span class="pill emerald">CLI & Web Workspace</span>
|
|
358
524
|
</div>
|
|
359
525
|
|
|
360
526
|
<h1>${escapeHtml(title)}</h1>
|
|
361
527
|
<p class="lead">
|
|
362
|
-
|
|
528
|
+
Run one command on your deployed site to audit 8 SEO & 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>
|
|
368
|
-
<p style="font-size:
|
|
369
|
-
Run
|
|
535
|
+
<h3>CLI & 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 & write
|
|
373
|
-
<div><span class="cmd">$ npx git-paid fix https
|
|
374
|
-
<div style="margin-top:8px;"><span class="comment"># 2.
|
|
375
|
-
<div><span class="cmd">$ npx git-paid submit https
|
|
376
|
-
<div style="margin-top:8px;"><span class="comment"># 3.
|
|
377
|
-
<div><span class="ok">✔
|
|
540
|
+
<div><span class="comment"># 1. Audit your live URL & 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 & 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 & confirmation links</span></div>
|
|
378
546
|
</div>
|
|
379
|
-
<a href="
|
|
380
|
-
|
|
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>
|
|
386
|
-
<p style="font-size:
|
|
387
|
-
|
|
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 (×85 directories ≈ 14 hrs) plus ~30 mins per static SEO guide (×25 routes ≈ 14 hrs) = <strong>28 hrs/launch</strong>.
|
|
388
556
|
</p>
|
|
389
557
|
<div class="calc-row">
|
|
390
|
-
<label for="projectsRange"><strong>Projects
|
|
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:#
|
|
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>
|
|
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>
|
|
400
|
-
<span id="pagesBuilt" style="font-weight:700;font-size:
|
|
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>
|
|
404
|
-
<span id="dirsDispatched" style="font-weight:700;font-size:
|
|
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
|
|
411
|
-
<table>
|
|
412
|
-
<
|
|
413
|
-
<
|
|
414
|
-
<
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
<
|
|
421
|
-
<
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
<
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
<
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
<
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
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 & UTMs</strong></td>
|
|
591
|
+
<td>~14 hours of repetitive copy-pasting & 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 & OTPs</strong></td>
|
|
596
|
+
<td>Clutters personal inbox with 85+ signup emails</td>
|
|
597
|
+
<td>Dedicated <code><domain>-bot@postbuild.dev</code> verification inbox</td>
|
|
598
|
+
</tr>
|
|
599
|
+
<tr>
|
|
600
|
+
<td><strong>Technical SEO & 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>
|
|
446
|
-
<p style="font-size:
|
|
447
|
-
|
|
615
|
+
<h3>Related Post-Build Guides & 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(
|
|
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 & verification inbox.
|
|
636
|
+
</div>
|
|
637
|
+
<div style="display:flex;gap:14px;flex-wrap:wrap;">
|
|
638
|
+
<a href="/">Home & 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 & 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) {
|