← back to build-pages
seo: SoftwareSourceCode JSON-LD on each project page + 1 smoke
734d4422a12218b0367267e3c7a6a383775be6b5 · 2026-05-13 14:17:36 -0700 · SteveStudio2
Files touched
M server.jsM test/smoke.js
Diff
commit 734d4422a12218b0367267e3c7a6a383775be6b5
Author: SteveStudio2 <stevestudio2@SteveStacStudio.lan>
Date: Wed May 13 14:17:36 2026 -0700
seo: SoftwareSourceCode JSON-LD on each project page + 1 smoke
---
server.js | 11 +++++++++++
test/smoke.js | 1 +
2 files changed, 12 insertions(+)
diff --git a/server.js b/server.js
index e27440d..4ee012e 100644
--- a/server.js
+++ b/server.js
@@ -381,7 +381,18 @@ app.get('/p/:slug', async (req, res, next) => {
<pre>${esc(i.body)}</pre>
</details>`).join('\n');
const fileLis = files.slice(0, 500).map(f => `<li><a href="/p/${esc(req.params.slug)}/file?path=${encodeURIComponent(f)}">${esc(f)}</a></li>`).join('');
+ const projectJsonld = {
+ '@context': 'https://schema.org',
+ '@type': 'SoftwareSourceCode',
+ name: p.name,
+ description: p.blurb,
+ url: `https://projects.agentabrams.com/p/${req.params.slug}`,
+ codeRepository:`https://projects.agentabrams.com/p/${req.params.slug}`,
+ programmingLanguage: 'JavaScript',
+ dateModified: commits[0] ? new Date(commits[0].dateISO).toISOString() : new Date().toISOString(),
+ };
res.send(shell(`${p.name} — build journal`, `
+ <script type="application/ld+json">${JSON.stringify(projectJsonld)}</script>
<h1>${esc(p.name)}</h1>
<p class="bp-lede">${esc(p.blurb)}</p>
<p class="bp-meta">repo: <code>${esc(p.repo.replace(HOME, '~'))}</code> · ${commits.length} commits</p>
diff --git a/test/smoke.js b/test/smoke.js
index 69dccc9..142babe 100644
--- a/test/smoke.js
+++ b/test/smoke.js
@@ -105,6 +105,7 @@ function check(name, cond, hint = '') {
// 6b. ?q= deep-link hydrates the search input on server-render
r = await fetch('/p/butlr?q=whisper');
check('butlr ?q=: hydrated', /value="whisper"/.test(r.body));
+ check('butlr: SoftwareSourceCode JSON-LD', /"@type":"SoftwareSourceCode"/.test(r.body));
// 6c. perf budget — warm render of /p/butlr (cache warmed by the calls above)
// should land well under 250ms. Cold is ~80ms, warm ~17ms. The 250ms ceiling
← 70698d8 ui: footer links to /api + /sitemap.xml (asim/sod parity) +
·
back to build-pages
·
seo: BreadcrumbList JSON-LD on commit detail page + 2 smoke a8b4a3e →