opsinjs

Licence and attribution

The code is MIT and the guidance prose is separately CC BY 4.0, so a team can quote this guidance inside a clinical safety case with a clear attribution path.

Two licences, on purpose

WhatLicenceFile
Source code, which covers the components, the registry, the scripts and this siteMITLICENSE
Documentation prose, which is the health, accessibility, content and design guidanceCC BY 4.0LICENSE-DOCS

Most projects apply one software licence to the whole repository and leave the prose in an awkward position. That is a real problem for the people this system is for. Teams building regulated health software quote design guidance verbatim inside clinical safety cases, hazard logs and design-history files, and a software licence says nothing useful about copying a paragraph into a PDF that goes to a regulator.

Creative Commons Attribution 4.0 says it exactly: you may copy and adapt the guidance, including commercially, provided you attribute it. There is no share-alike obligation, so quoting a rule from this site does not place any requirement on the rest of your document.

Using the code

MIT. Copy it, modify it, ship it, sell what you build with it. Keep the copyright notice. There is no warranty. In this domain that is not boilerplate, so it is worth reading the sentence below rather than skipping it.

Using the guidance

Quote it, paraphrase it, adapt it into your own internal standard, translate it. Attribute it like this:

Adapted from the opsinjs documentation (https://opsinjs.pensievelabs.org), CC BY 4.0.

Two things make an attribution genuinely useful to whoever reads your document next, and neither is required by the licence:

Name the page and its review date. Guidance here is dated and reviewed on a cadence. See Docs freshness. "Adapted from Clinical status semantics, reviewed 2026-09-02" tells a reviewer which version of a rule you designed against. "Adapted from opsinjs" does not.

Say if you changed it. If you tightened a rule, loosened it, or applied it to a context we did not write for, mark that. A safety reviewer must be able to tell your judgement from ours, and you do not want to inherit the blame for a rule you rewrote.

What is not covered by either licence

  • Third-party material we cite. Where a page references the NHS Digital Service Manual, a journal article, WCAG, APCA or a vendor's human-interface guidelines, that material stays under its own licence. We cite and paraphrase in original wording; we do not reproduce. NHS content in particular is Crown copyright and is not redistributed here. The Plain-English A to Z is written from scratch for that reason.
  • Names and trade marks. CC BY 4.0 does not license the project's name, and attribution is not endorsement. Do not imply that a product using this system has been reviewed or approved by it.
  • Anything on this site marked as an opinion, which is licensed like the rest but is not evidence and should not be cited as though it were. Health pages declare evidence: cited, opinion or mixed in their frontmatter for exactly this reason.

No warranty, and no clinical endorsement

The documentation is provided as is. It is design guidance. It is not medical advice, not a clinical safety assessment, and not a regulatory approval. Building an interface that follows this guidance does not make that interface safe; that judgement belongs to the team shipping the product and to its clinical safety officer. Safety, scope and limitations states the full position, including the specific regulatory claims this project does not make.

What we build on

opsinjs stands on other people's work. These are the dependencies whose licences you inherit when you use what this project emits, verified against the versions installed in this repository:

ProjectLicenceWhat it does here
Base UI (@base-ui/react)MITThe unstyled primitives every interactive component is built on, a choice explained in ADR 0001
React and Next.jsMITThe framework this site runs on
Tailwind CSSMITThe utility layer the emitted components use
clsxMITHalf of the cn() helper in @/lib/utils, which every emitted component imports: it joins conditional class names
tailwind-mergeMITThe other half of cn(): it resolves conflicting Tailwind utilities so that a class you pass in wins over the one the component set
fumadocsMITThe documentation engine, a choice explained in ADR 0004
shadcn/uiMITThe registry specification we distribute through, and the chrome components on this site
LucideISCThe one icon library, used for both chrome and components
InterSIL Open Font License 1.1The typeface of this documentation site, and not of the product theme, which uses system-ui

clsx and tailwind-merge are on that list because emitted source reaches them, not because this site does. A component copied out of the registry travels with its own substrate. lib/opsinjs.ts and lib/status.ts are shipped as files beside it. It imports exactly one module it does not carry: @/lib/utils, which shadcn init writes into your project and which is those two packages and nothing else. That is why installing by hand has you write the helper before a copied component will compile. Packages this repository depends on but emitted code never reaches are deliberately absent: they are our problem to license, not something you inherit.

Edit this page

Last read through against the system on 2026-09-20. Due for review every 12 months; expiry is reported by pnpm run check:freshness.

On this page