The diagrams explained
The homepage gives visitors several ways to explore the work, with the CV and contact details close at hand.
The live homepage introduces Peter McCann Strain and his work. Navigation leads to projects, research and articles. Profile AI offers a conversation about the same work. The cosmic background gives the page its visual identity, while CV and contact controls remain directly accessible. The screenshot is a production capture from 17 September 2026.
Open full-size diagramPublished content supplies the knowledge index. A visitor's question searches it without becoming part of it.
Published documents have stable IDs, routes, text and metadata. Indexing preserves original passages with their citation locations. It also records entities and relationships. Each relationship identifies its supporting passages and whether it is explicit or inferred. Passages and graph descriptions receive vectors. These records form a server-only knowledge bundle. A visitor supplies a question, page context and any attachment to the server. The server validates the request, searches the bundle and returns an answer with source links. Visitor conversations and uploads are not added to the persistent content index.
Open full-size diagramI operate one portfolio; external services supply generation, semantic processing and shared controls.
Visitors read the portfolio, explore projects and ask questions. Peter authors the material, builds the application and releases changes. The personal website uses Anthropic for Sonnet 5.5 generation, Voyage for embeddings and reranking, Upstash Redis for rate, capacity and spending controls, and PostHog and Vercel for product and operational signals. Generation and semantic processing are called by the application server.
Open full-size diagramPage delivery and conversation share an application while reading different representations of the content.
The browser sends page requests and chat questions to one Vercel-hosted Next.js application. Page delivery reads local published content or an activated publication release. By default the hybrid assistant reads a bundled index built from local published passages, vectors and graph records. A verified page receipt can select its source edition; an incompatible index falls back to lexical retrieval against that edition. It uses Sonnet 5.5 for generation and tool decisions, Voyage for query embeddings and reranking, and Upstash Redis for shared admission and accounting. Publishing activates content releases; the incremental indexing command prepares the separate hybrid bundle for an application deployment.
Open full-size diagramThe assistant can answer from its first retrieval or gather more evidence through searches and successive relationship expansions.
The server combines up to 40 BM25 keyword candidates and 40 semantic candidates using reciprocal-rank fusion, reranks the best 40 with Voyage and the initial search retrieves up to 12 passages with page context. Follow-up questions can also restore up to 12 previously cited passages before the first model call, within the shared evidence limits. Sonnet 5.5 at high effort can answer immediately or request targeted searches and one-hop relationship expansions. Each expansion can return several directly connected relationships. Each retrieval call returns up to eight new passages. Successive expansions can follow further relationships. The turn allows at most five additional retrieval rounds, two retrieval calls per round and eight model calls overall, including the final answer. It accumulates at most 40 unique passages and 80,000 characters of evidence. Exact repeated searches and visited edges are suppressed. An empty search can lead to a different query or an answer from the available material. Resource limits stop further retrieval. The server registers selected source passages before answer text begins and refreshes the registry after retrieval, so inline evidence identifiers resolve without a model citation-tool call. Signed prior references are restored for follow-up questions. The answer includes source links and an activity record. Initial retrieval completes before the answer stream opens, and its completed stages are then reported. Later retrieval updates stream live. Graph descriptions guide discovery; original passages support citations.
Open full-size diagramDocument-level change detection keeps routine updates small while preserving contextual embeddings.
The indexing command compares stable document identities, searchable-content hashes and embedding and extraction versions. Unchanged documents reuse their vectors and extracted graph. New or edited documents receive whole-document contextual embeddings, while extraction is cached independently. Deleted documents lose their vectors and relationships. Shared entities remain while other sources reference them; descriptions and embeddings update when contributing information changes. Only a successful indexing run replaces the usable bundle. An ordinary application build consumes the generated bundle without paid indexing calls.
Open full-size diagramThe controller keeps the scene's composition while adjusting the cost of drawing it.
Pointer, scroll and local-time inputs update shared mutable references; scene uniforms and objects read them without React rerenders for each input change. The schematic groups the nine scene elements by role. The nebula and 4,000 seeded particles form the atmosphere. Responsive geometry includes up to 24 constellation links, a signal lens, asteroids, comet and satellite. Camera drift moves through the scene, and bloom composes light after drawing. DPR means device pixel ratio; FPS means frames per second. The quality controller starts at native DPR with a floor of 1, or a saved per-orientation session setting. Native DPR is initialised as max(1, window.devicePixelRatio || 1). Resolution and frame pacing determine drawing cost. The controller watches sustained frame delivery before changing either. Two consecutive poor windows permit one reduction step: decrease DPR by 0.25 to a floor of 1, then lower pacing from 60 to 45 to 30 FPS. Four consecutive stable windows permit recovery in reverse priority: raise pacing from 30 to 45 to 60 within the configured maximum, then increase DPR by 0.25 toward native. A five-second cooldown limits adjustments. The controller holds its settings when the sampling windows do not justify a change, during cooldown or at the applicable limit. All nine scene elements remain. Hidden tabs stop scheduled drawing. Reduced motion slows the scene and caps pacing at 30 FPS, so recovery respects that cap. Article focus unmounts the renderer. Renderer failure is isolated from readable content.
Open full-size diagramAn outdated signing limit cut off a long answer. The corrected release completed the answer and its follow-up.
A long graph answer was truncated during completion and the next turn lacked signed history. The provenance receipt still allowed only 20 source identifiers while retrieval allowed 40 passages. The receipt limit was raised to 40. Route checks verified complete output and signatures. A live retest completed an answer using 33 passages, three graph calls and seven citations, followed by a completed signed follow-up. This example concerns answer delivery and source accounting.
Open full-size diagram