Overview
This is Drybench's technical documentation: how the suite is built, how every app and its science work, and how to run, verify and change it safely. It is for the team and for anyone taking the product over, and is read in a browser at /technical (D-0052). Since 13 October 2026 it asks for no name or password (D-0081); it remains outside the sitemap and is not indexed. The homepage local-MCP setup link is the sole public-link exception, authorized with the CEO’s MCP promotion request on 18 October 2026.
What this documentation covers
The pages describe the whole system as the code implements it today: the architecture, every app and the science behind it, the engines, the independent oracles the numbers are checked against, the data sources and licences, and how the suite is built, tested and deployed. They are written so that a team taking over Drybench, for example after a sale, can understand, verify, run and extend it without the founder. Each claim names the files it comes from, so a reader can check it and a writer can update it when the code changes. Where the code and a design document disagree, the pages say what the code does and note the difference.
Start here
| Page | What it covers |
|---|---|
| Handover guide | What the asset consists of, the external accounts and services, standing the product up from scratch, and the first 30 days for a new owner |
| Known issues and risks | A verified register of open defects, risks and gaps, by severity |
System
| Page | What it covers |
|---|---|
| Architecture | The stack, the directory layout, the route groups and how a request is served |
| Registry and content | The app registry, product names, copy, the route map and how to add an app |
| Public reference workflows | The 30 static, populated reference entry points (/<module>/<slug>) added on 16 October 2026, on the native workspaces and engines |
| Shared shell and components | The workspace shell, primitives, Objects and Workspace UI, theme, tokens and export writers |
| Independent analysis batches | Separate Assay plates and Sequence records, recovery and child recording |
| Storage and state | How work is held in the browser: the store, Objects, Studies, handoff and shared links |
| Security and network | The Content Security Policy, the network layer, server-side lookups and indexing rules |
| Server, accounts and billing | The API routes, the Workspace access modes, Supabase and Stripe |
| Local MCP server | The development-preview MCP server over four engines, run with node scripts/mcp-server.mjs (Q-17 open) |
Apps
Each app page covers the app's purpose, addresses, files, interface and state, data flow and external services, the science in full (methods, equations, parameters, references and limits), its engines, its integration with Objects and Studies, its exports, its verification, and its known gaps.
| Page | App |
|---|---|
| Protein | Protein structures and annotations |
| Molecule | Small-molecule properties and search |
| Pipeline | Drug development pipelines, clinical trials and FDA precedent |
| Patent | Listed patents and exclusivities for US products, from the FDA's files |
| Cell | The guided tour inside a cell |
| Calc | Laboratory calculators |
| Sequence | DNA and protein sequence tools |
| Assay | Plate and dose-response analysis |
| Plasmid | Plasmid maps and cloning design |
| Bioreactor | Bioprocess simulation |
| Education tools | The education workspaces |
| Literature workspace | Literature search, full text and extraction |
Science
| Page | What it covers |
|---|---|
| Science overview | The scientific principles the code enforces, the shared scientific libraries, the audits and an index of every app's methods |
| Engines | Third-party engines (Mol*, RDKit.js, 3Dmol.js, OpenChemLib) and a catalogue of the in-house computational kernels |
| Oracles and verification | The independent numerical references, fixtures and published verification sets, and what each test compares |
Data and licences
| Page | What it covers |
|---|---|
| Data sources | Every external source and service, its licence, read date, attribution and what user input it receives |
| Data pipeline | The pipeline/ snapshots, their verification and their expiry |
| Dependencies and licences | Every dependency, vendored build and asset, with its licence and the licence checks |
Operations
| Page | What it covers |
|---|---|
| Build, test and CI | The npm scripts, unit and browser tests, the checks and the GitHub workflows |
| Deployment and environment | Vercel, build identity, every environment variable, redirects and the landing export |
How it relates to the other documents
The repository already holds several kinds of documentation. This set does not replace them.
| Where | What it is | Audience |
|---|---|---|
/docs on the site |
Product documentation for each app | The public |
docs/ in the repository |
Decisions, design specifications, research, reviews and hand-over notes | The founder, the board and contributors |
docs/technical/, read at /technical |
How the code works | Engineers working on the suite |
Decisions in the register (docs/board/decisions/) and the design specifications in docs/design/ take precedence over anything written here. When a page here disagrees with them, the page is wrong and should be corrected. Status and open work belong in docs/HANDOVER.md and docs/NEXT.md, not here.
Reading it in a browser
The pages are served by the suite itself at /technical (this overview) and /technical/<page>. Only the homepage local-MCP setup action links into this area, at /technical/mcp-server (CEO’s MCP promotion request, 18 October 2026). The pages are never listed in the sitemap, and every response is marked noindex. No name or password is asked for: D-0081 (13 October 2026) removed the HTTP Basic authentication D-0052 had put in front of the area. Anyone with the address can read the pages, as anyone with access to the repository can read the Markdown.
Locally, run npm run dev; the pages are then at http://localhost:3000/technical. No environment variable is needed.
How the area is served
| Layer | File | What it does |
|---|---|---|
| Proxy | src/proxy.ts |
Runs before every request to /technical and /technical/... and sets the area's response headers. It is the suite's only proxy; every other address passes through untouched. |
| Headers | src/lib/technical-docs/headers.ts |
Cache-Control: private, no-store, so no shared cache keeps a copy; X-Robots-Tag: noindex, nofollow, whether or not the suite has launched; a Content Security Policy with no third-party hosts; Referrer-Policy: no-referrer. |
| Page | src/app/(technical)/technical/[[...slug]]/page.tsx, src/lib/technical-docs/load.ts |
Rendered on each request (dynamic = "force-dynamic"), never prerendered. Only a file listed in content/technical-docs.ts is read; any other address under /technical answers 404. |
| Rendering | src/lib/technical-docs/render.ts |
Renders the Markdown on the server. Raw HTML in a page is shown as text, and links that a browser could not follow (repository files, unknown schemes) are shown as plain text. |
The Markdown files are read at request time and traced into the route's server function (outputFileTracingIncludes in next.config.ts). They are never copied to public/ and never enter a client bundle, so the static files the site serves do not contain them.
Limits to keep in mind:
- The area is open to anyone who has its address. Never put secrets, credentials or customer data in these pages; the writing rules below say the same.
- Being unlinked and noindex is not a protection. If the area ever needs one again, that is a new decision; D-0052 recorded the options (the host's deployment protection, or the Workspace accounts).
Adding or changing a page
- Write the page as Markdown in
docs/technical/. Start with a single# Titleline (the title shown in the navigation and the browser tab), then a one or two sentence summary, then##sections. The##headings form the page's contents list. - List it in
content/technical-docs.ts, in reading order, with its address and group. A file that is not listed is not served, andnpm testfails on an unlisted file. - Link to other pages by file name, for example
[Storage and state](storage-and-state.md#shared-links). The links work on GitHub and are rewritten to/technical/...in the browser.npm testfails on a link to a page that is not listed. - Name repository files in backticks (
content/apps.ts) rather than linking to them: the browser cannot open repository paths. - Run
npm test, then check the page at/technical/<page>withnpm run dev.
Writing conventions follow the rest of the repository: British English, plain statements of what the code does, the file and function each statement comes from, and no claims the code does not support. The compliance rules in CLAUDE.md apply here too: no positive claims about 21 CFR Part 11, FDA validation, GxP or audit trails. Never put secrets, credentials or customer data in these pages.
Keeping it accurate
A page is useful only while it matches the code, and these pages are what a new owner will rely on. The rule, recorded in CLAUDE.md for every contributor and agent: a change that alters something a page describes updates that page in the same commit. Review the affected pages before finishing any change, and treat an out-of-date page as a defect.
Which pages a change touches:
| When you change | Update |
|---|---|
An app's code (src/apps/<slug>/, src/components/tools/<slug>/) or its registry entry |
That app's page (app-<name>.md, or literature.md) |
| A scientific method, equation, parameter, constant, threshold or reporting rule | The app's page; science-overview.md if it is in a shared library under src/lib/ |
| A third-party engine or an in-house computational kernel | engines.md and the app pages that use it |
An oracle, fixture, tolerance or published verification set (pipeline/, public/verification/) |
oracles-and-verification.md and the app's page |
| A data snapshot or pipeline script | data-pipeline.md |
| A data source, endpoint, licence record or consent behaviour | data-sources.md and the app's page |
| A dependency, vendored build, font or the licence checks | dependencies-and-licences.md |
| The registry's shape, copy rules or the route map | registry-and-content.md |
Route groups, request handling, next.config.ts or the proxy |
architecture.md |
The shared shell, primitives, theme, tokens or export writers (src/components/suite/) |
shared-shell.md |
| Stored shapes, storage keys, handoff or shared-link formats | storage-and-state.md |
The Study run comparison (contract 07A: src/lib/workspace/run-comparison.ts, run-comparison-read.ts, src/components/suite/workspace/run-comparison.tsx, run-comparison-selection.ts) |
storage-and-state.md ("Contract 07A comparison read model"); its fixture, oracles-and-verification.md |
| Security headers, the network layer or server-side lookups | security-and-network.md |
| API routes, access modes, accounts, billing or backups | server-and-accounts.md |
The local MCP server (src/lib/mcp/, scripts/mcp-server.mjs) |
mcp-server.md |
| npm scripts, tests, CI workflows or budgets | build-test-and-ci.md |
| Environment variables, deployment, redirects or the landing export | deployment-and-environment.md |
| External accounts or services, or anything a new owner must transfer | handover.md |
| A defect or risk found, fixed or accepted | known-issues.md (add, close with the commit, or record the decision) |
When reviewing a page, check its claims against the files it names; remove a statement that can no longer be verified rather than leaving it to mislead.