Page builder (ask.chaipat.cc)
Component
The page builder, scripts/build-pages.mjs, runs on Node.js at every deploy and prerenders a plain HTML page for every entity in the graph, so search engines and link previews can read the wiki without running any JavaScript.
Each page gets its title and description, a canonical address, an Open Graph card (its own picture when one has been rendered), and structured data in JSON-LD describing what it is: a person, a piece of software, a scholarly article, an organisation or a defined term. The script also writes sitemap.xml, the XML sitemap listing every page with the date it last changed, and the wiki's index page. When JavaScript does run, the page becomes the full interactive site.
The wiki address is an entity's about resource, whether its page has a written article or is generated from graph facts. It is not the same as opening a product or its source code. The shared catalog in src/resources.js, also emitted under entities in data/wiki/search.json, supplies that local /wiki/<Id> resource for every typed entity except the profile. It supplies separate live and source actions only when the graph explicitly declares cj:liveUrl or cj:repository. The runtime catalog reads the loaded graph; the page builder remains responsible for HTML, metadata and discoverable wiki addresses, not for interpreting a visitor's task.
The interactive question view uses src/answer.js to compose one supported focused answer with actual-evidence sources. A related entity or an about/live/source action is not automatically a citation. Prerendering wiki HTML does not choose those answer citations.
The recommended release uses one bundled knowledge snapshot: leave the browser's kg-source empty and the API's KG_SOURCE unset so the graph, ontology and wiki passages come from the same build. Verify a preview before production; a deployment-specific empty KG_SOURCE override can keep the preview bundled without changing production settings. A separately updated remote graph is not covered by the bundled wiki's freshness checks.
Before page generation, deployment validates the committed data/knowledge-state.json and compares regenerated wiki graph, evidence, article index and complete search passages with current inputs. Stale knowledge fails the build; page generation does not overwrite the manifest to make it pass. After relevant source, schema, graph or article edits, rebuild knowledge first and review affected prose for accuracy. Digests establish freshness, not semantic correctness.
In the knowledge graph
Page builder and the 4 things it is linked to. Open any dot for its page, or explore it in the full graph.
As data
Everything on this page is read from triples in the knowledge graph. These are the 11 it states about Page builder, and 3 more its ontology implies; the console runs SPARQL over the whole graph, here in your browser.
@prefix id: <https://ask.chaipat.cc/id/> . @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . @prefix cj: <https://ask.chaipat.cc/ns#> . @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . @prefix xsd: <http://www.w3.org/2001/XMLSchema#> . id:SitePages a cj:Component ; rdfs:label "Page builder (ask.chaipat.cc)" ; cj:shortLabel "Page builder" ; cj:componentOf id:ThisSite ; cj:sourceFile "scripts/build-pages.mjs" ; cj:handles id:JSONLD , id:Sitemap ; cj:uses id:NodeJS ; cj:description "Prerenders a page for every entity in the graph, with structured data, and writes the sitemap, so search engines can read the wiki without running JavaScript." ; cj:article "https://ask.chaipat.cc/wiki/SitePages"^^xsd:anyURI ; cj:implementationDigest "sha256:6dd7722f3fde017d26cc153f438520397e93e275e3f39f9529b8d551b6fa9754" .