Repository navigation
Conversation
The Library's public copy still described a shelf kept by the team and their friends. Creation has been open to every account since the 2026-09-12 release, so the page, the search result and the shared card all described something that is no longer true. - The hub's title, description and share card now name what the place is and that a reader can open their own. A library's own description says what stands on it rather than repeating "personal" twice. - The About dialog says anyone can open one, at an address of their own. The same surface for machines was dark. Both llms files and the per-page dump are written to public/keepsimple_/, a path nothing has served since public/ was flattened: the published /llms.txt had not moved since May, carried no Library at all, and the per-page dump named staging URLs. The generators now write where the site serves from, read the live CMS, and always name production addresses; LLMS_STRAPI_URL and LLMS_BASE_URL override both. A run keeps whatever it cannot rebuild, so the cognitive-bias and UXCG lines an older generator wrote survive instead of being deleted by the next run. - llms.txt and llms-full.txt list the Library and every public library, expanded from the same anonymous read the sitemap makes. Objects stay out: they are a reader's own notes, they change daily, and this file is committed to a public repository. - The concierge widget read its page descriptions from the same missing path, so its map has been empty since the flatten and every page fell through to the hand-coded blurbs. It reads the served file now, and knows a library, an object page and a share link when it stands on one. - library-seo-check could not load src/lib/library/seo.ts at all after the @utils import landed, so the gate has been failing to start rather than passing. It runs again, with its expectations matched to the server-rendered read. Verified: yarn build, tsc --noEmit, yarn check:library, yarn check:library:seo. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
Claude finished @manager's task in 3m 2s —— View job Review complete
SummarySolid, well-scoped PR: copy updates land cleanly, and the Two inline findings on
Neither is severe (they're cosmetic/redundancy issues in a machine-readable index file, not functional breakage), but both are visible in the regenerated One thing worth a sanity check but not blocking: Everything else — SEO copy, the About dialog wording, |
| @@ -394,6 +587,11 @@ const run = async () => { | |||
| 'Browse all KeepSimple articles and categories.', | |||
| ), | |||
| }, | |||
| { | |||
| name: 'See All Libraries', | |||
| route: '/library', | |||
| description: stripHtml(DEFAULT_SEO.description), | |||
| }, | |||
| ], | |||
There was a problem hiding this comment.
/library ends up listed twice in the generated output. It's already emitted by the main routes.forEach loop (it's a real scanned route with a seoDescriptions['/library'] entry, see line 25 of public/llms.txt), and then emitted again here as the "See All Libraries" custom entry with the same URL and description.
- [Library](https://keepsimple.io/library): Libraries built by readers…
...
- [See All Libraries](https://keepsimple.io/library): Libraries built by readers…
(/articles has the same pre-existing duplication with "See All Articles" — not introduced here, but this PR adds a second instance of the same pattern rather than fixing it.) Since customEntries in buildContent doesn't dedupe against routes, either drop these two static custom entries (the routes are already covered) or filter routes to exclude /articles and /library before the main loop if you want the "See All …" wording to win.
| const carried = Object.entries(published) | ||
| .filter(([route]) => !withoutLibraryPlaceholder.includes(route)) | ||
| .filter( | ||
| ([route]) => | ||
| !route.startsWith('/library/') && !route.startsWith('/articles/'), | ||
| ) | ||
| .map(([route, entry]) => ({ route, ...entry })); |
There was a problem hiding this comment.
Carried entries with an empty description produce a malformed line: entry.description can be '' (e.g. the pre-existing /user/username line, which never had a colon-trailed description), and buildContent's customEntries loop unconditionally writes - [${entry.name}](${url}): ${entry.description} — giving - [User Profile](https://keepsimple.io/user/username): with a trailing colon and nothing after it (see line 56 of the regenerated public/llms.txt). Worth filtering carried to drop entries whose description is empty, same as routeToDescription already does for the non-carried path (if (published[route]?.description) ...).
The Library's public copy still described a shelf kept by the team and their friends. Creation has been open to every account since the release on 2026-09-12, so the page, the search result and the shared card all described something that is no longer true.
Copy
The surface for machines was dark. Both llms files and the per-page dump are written to
public/keepsimple_/, a path nothing has served sincepublic/was flattened. The published/llms.txthad not moved since May, carried no Library at all, and the per-page dump named staging URLs.LLMS_STRAPI_URLandLLMS_BASE_URLoverride both.llms.txtandllms-full.txtlist the Library and every public library, expanded from the same anonymous read the sitemap makes. Objects stay out: they are a reader's own notes, they change daily, and this file is committed to a public repository.library-seo-checkcould not loadsrc/lib/library/seo.tsafter the@utilsimport landed, so the gate has been failing to start rather than passing. It runs again, with its expectations matched to the server-rendered read.Verified locally:
yarn build,tsc --noEmit,yarn check:library,yarn check:library:seo.Still outside this PR: production
robots.txtis a host file that does not carry the library sitemap line, and/library-sitemap.xmlhas never been submitted to Google Search Console or Bing.🤖 Generated with Claude Code