[object Object]

← 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

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 →