
1.2k stars · Apache-2.0 · v2.0.0 (2026-03-23) · Track this in Rising ↗
Typed JSON-LD for the Schema.org vocabulary — structured data the compiler can check.
Radar check
What we found when we opened it. Every bar is one fact, with its date.
Last code pushed 2 Oct 2026, 25 days before this check.
Latest release v2.1.0 on 2 Oct 2026.
Public since November 2018, a little over 7 years.
1,252 stars and 58 forks.
9 commits and 1 new issues in the last 90 days.
11 contributors. 4 pull requests merged in 90 days.
A security policy says how to report a problem. 1 published security advisory.
How the bars are scored
- Alive. Days since the last code push: a week or less 100, a month 90, three months 70, six months 50, a year 30, eighteen months 15, older 0.
- Releases. Age of the latest GitHub release, on a similar scale; no bar when the project publishes no releases.
- Maturity. Age of the project: eight years 100, five 90, three 70, two 55, one 40, six months 25, younger 10.
- Adoption. Stars on a log scale: 100,000 stars is 100, 10,000 is 80, 1,000 is 60, 100 is 40.
- Activity. Commits in the last 90 days: 300 or more 100, 100 85, 30 65, 10 45, any 25.
- Community. People who have contributed: 100 or more 100, 30 80, 10 60, 5 40, 2 25, one 10.
- Security. A published security policy 80, none 40; published advisories are listed, not scored.
Checked by Repo Radar on 26 Oct 2026 from the repository on GitHub. Covered in Edition 12.
▶Repo detailsthe review · specs · pros & cons · install
What it does
Schema.org is an agreed vocabulary for describing what a page contains, and JSON-LD is the format used to put it on the page as a hidden block of data. This package publishes TypeScript types generated from that vocabulary, so the block is written as a typed object instead of hand-written text. A misspelled property name, a value of the wrong kind or a required field left out becomes a compilation error. The types cover the whole vocabulary, including SoftwareApplication, FAQPage, VideoObject, Article, Product and Organization. The current release is v2.1.0, from 2 October 2026, and code landed on the same day, under the Apache-2.0 licence. The types are development-only: nothing from the package reaches the browser, only the data block you wrote. It also does nothing at runtime, validates no live page, and reports nothing about whether search engines accepted the markup.
Why it matters
Who it suits. Any TypeScript site that wants to be described correctly to search engines and to AI assistants that cite sources, and whose structured data is currently a block of hand-written text nobody has checked. Also anyone who has already discovered a year-old typo in that block. Skip it if the pages are rendered by something other than TypeScript, because there is no help here for Python or PHP templates.
Verdict. One hour, and then it never rots, which is an unusual return. The limit is honest and should be said once: structured data makes a page understood, not popular. It will not create demand and it will not rescue a page nobody wants. Expect to write the occasional type cast, because the types are strict and the vocabulary itself is loose. garmeeh/next-seo is the higher-level option on Next.js, and schemaorg/schemaorg is the vocabulary itself if a definition needs checking.
Summary (Key Points)from the README
Key features
- Discriminated type unions: Each Schema.org type is exported as a union alias, which gives editor completions and stricter validation.
- Concrete leaf interfaces: Every type also has a single-`@type` leaf interface (e.g. `PersonLeaf`) that a class can implement or extend.
- MergeLeafTypes helper: Combines leaf types for Schema.org objects that legitimately carry multiple concrete `@type` values.
- WithContext wrapper: Augments a top-level type so it accepts a `@context` property.
- Graph and ID support: The `Graph` type models interconnected `@graph` nodes, and `{ '@id': ... }` stubs reference nodes from several places.
- WithActionConstraints type: Annotates action properties with `-input` and `-output` suffixes.
- Configurable generator: `schema-dts-gen` takes an `--ontology` URL, a `--context` value or list of name:URL pairs, and `--deprecated`/`--nodeprecated` switches.
- Verbose logging: `--verbose` writes extra debugging notes to stderr.
Ways to install
| Platform or method | What it needs | Effort |
|---|---|---|
| `schema-dts` npm package | npm, to add the pre-packaged typings to a project | Low: add the package and import `"schema-dts"` |
| `schema-dts-gen` command-line tool | npm, plus an HTTPS `.nt` ontology URL and optional context and deprecation flags | Medium: run the CLI to generate TypeScript for a chosen Schema.org version and layer |
| Building from the repository | A clone of the repo and `npm` to install dependencies, then the repo's `tsc` wrappers | Higher: contributor path for generating from the latest Schema.org schema or building the generator |
Important
- Unofficial project: The README states this is not an officially supported Google product.
- Limited layers: The pre-packaged `schema-dts` package covers the latest Schema.org schema without pending and other non-core layers. Generate your own package to get those.
- Leaf types for merging: `MergeLeafTypes` requires concrete leaf types such as `ProductLeaf`, not union aliases such as `Product`.
- Classes need leaf types: A class cannot implement a union alias, so use the leaf interface when you need a single concrete shape.
- Ontology requirements: `--ontology` must be an HTTPS URL to an `.nt` N-Triples file that is compatible with Schema.org, includes the Schema.org DataTypes, and specifies a top-level `Thing` type.
- Deprecated types: Including them with `--deprecated` keeps them in the output, marked only with `@deprecated` JSDoc tags.
- Escape JSON-LD before injecting: When placing JSON-LD in an HTML script tag, escape characters that could break out of the tag or enable XSS.
Written by an AI model from the project’s README; not part of the review, and it can be wrong.
- Mistakes appear at build time instead of as a quietly missing search result.
- Generated from the actual vocabulary rather than from somebody's summary of it, and published by Google.
- Types only, so nothing is added to what a reader's browser downloads.
- TypeScript only, with nothing for pages rendered by other languages.
- The types are strict and the vocabulary is loose, so some legitimate markup needs a cast.
- Being understood is not the same as being found, and this does only the first.
Your Astro site is TypeScript, so this is an hour that then never rots — a mistyped property fails the build instead of failing silently for a year, which is the normal fate of hand-written JSON-LD.
npm i -D schema-dts

