Skip to content
PluginStats

@gdp-ts/core weekly downloads statistics

By gdp-ts · npm · ESLint plugins

Ghosts of Departed Proofs for TypeScript: authorization (and other checks) whose results the type checker can see.

View on npm Fresh · Oct 17, 2026

@gdp-ts/core has 71,065 recorded weekly downloads on npm.

It ranks #493 of 2,251 tracked npm listings by weekly downloads.

Over the past 7 days it changed by -36.3%.

PluginStats has 121 daily observations since Jun 19, 2026; the latest is from Oct 17, 2026.

Weekly downloads
71,065
Official API · Oct 17, 2026
7-day growth
-36.3%
-40.5K weekly downloads
30-day growth
—
Insufficient history
90-day growth
—
Insufficient history
Rank
#493
Among tracked npm listings

About @gdp-ts/core

gdp-ts

A tiny library + linter and AI skill implementation of Ghosts of Departed Proofs for TypeScript, a verification system to make API contracts more secure at compile (type check) time.

gdp-ts makes an entire category of authorization (_"can this user read this resource"_) or entitlement (_"does this user pay for this resource"_) bugs very difficult for humans and coding agents to introduce, by catching them at compile time with negligible runtime overhead.

Features

• Incrementally adoptable: works with any TS codebase and any runtime, and doesn't change how you do I/O or effects. • Ease-to-rigor slider: how much is exhaustively proven is up to the discretion / risk tolerance of each codebase, and the skill bundles advice. • ~Zero runtime overhead: no extra queries or dependencies. The only runtime cost is a tiny wrapper around the ids you check. The safety comes from type checker. • Cheap to typecheck: about 0.3 ms per authorized call site on a cold TypeScript 7 check. The cost grows with how often you use it, not with codebase size (benchmark).

Installation

Requires TypeScript 5.4 or newer.

The problem

A lot of codebases feature code like this:

Looks great, except: all it takes is • a developer to slip and miss the first await • the business rules on who gets to "change password protection" to change (say, Owners only), and one call site to keep running the old check

... for a security / business disaster to occur.

The solution

We change the signature above from something anyone can call from anywhere:

...to forcing the caller to present evidence (proof) that they can do (are admin) and can get (have the plan) the thing:

The skill takes care of guiding agents and humans towards this safer pattern, and away from the *boolean blindness* problem.

How it works

1️⃣ Name values. name(x, k) gives a runtime value a compile-time-only name N. Every call to name creates a different N, and N exists only inside the callback. For our example, wwo project ids named separately are now distinguishable to the compiler even though both are string:

2️⃣ Prove facts about names. A small *trusted module* performs a check and returns a Proof, or null. Only that module can mint that proof. At runtime a proof is a frozen { kind } object.

3️⃣ Demand proofs. Sensitive functions take a proof about their exact arguments. Calling them with the wrong proof, a proof about a different value, a raw id, or no proof is a compile error 🎉

TL;DR: • Middleware only authenticates. The check happens in the route body, right where its result is needed, and disablePasswordProtection does not compile without it. • Because the data layer *demands* a proof instead of performing the check, it is safe to export: a route, a Server Action or a job can call it, and none of them can skip the check. • The proofs are *ghosts*: they do nothing at runtime, and everything at compile time. We rely on linting to prevent "cheating" (e.g: {} as UserIsProjectAdmin).

The package

@gdp-ts/core on npm ships two things:

• The library (@gdp-ts/core): name(), defineProof(), Named and Proof, with no dependencies. • The linter (@gdp-ts/core/lint/eslint, @gdp-ts/core/lint/oxlint): presets for ESLint and Oxlint that catch what the type checker can't, such as forging a proof with as or minting one outside proofs/ (setup).

The skill

npx skills add rauchg/gdp-ts installs a skill that guides coding agents through applying the pattern in your codebase. It is plain Markdown, so it doubles as the reference manual for humans:

• Workflow: the checklist to follow when adding or changing authorization. • The recipe: from branded ids to lint rules, in six steps. 1. Brand your ids 2. One trusted module per fact, in proofs/ 3. Policies are unions 4. Sensitive functions demand proofs 5. Name and prove in the handler 6. Turn on the lint preset • Patterns: weakening for free, proofs that carry evidence, reusing proofs, facts that are not about authorization. • Reading the errors: what the compiler catches, and what each message means. • What this does not guarantee: forged proofs, stale proofs, and other limits of TypeScript. • Where to stop: the ease-to-rigor slider. • API: everything gdp-ts exports.

Examples

All three use the same domain, loosely modeled after Vercel's Password Protection: team admins set a password on a project, and visitors must enter it to open the project's protected URLs.

• basic: start here. No framework and in-memory data, covering both the team side (who may see and change the setting) and the visitor side (passwords and tokens), printed as scenarios. Includes mistakes.ts, a file of compile errors the test suite keeps honest. • express-basic: the team side over HTTP with Express 5. Middleware that only authenticates, routes that name and prove, and the gdp-ts ESLint preset that stops proofs from being forged. • express-drizzle: both sides with Drizzle on an in-process Postgres (PGlite). Proofs backed by SQL joins, a data layer that demands proofs, cookies scoped to one URL, HTTP tests, and the Oxlint preset on TypeScript 7.

Relationship to other solutions…

Description from the npm listing.

  • typescript
  • authorization
  • ghosts-of-departed-proofs
  • gdp
  • phantom-types
  • type-safety
  • eslint-plugin
  • oxlint

Where @gdp-ts/core sits in the listing

Each band is one page of 20. Weekly downloads on a log scale. Placement is projected from weekly downloads, so it can differ from the marketplace's own sort order. Hover a dot to see the listing.

All npm2,248 listings · 113 pages · page 25, #13 (overall #493)
All npm: every listing in weekly downloads order
PNG SVG
ESLint plugins252 listings · 13 pages · page 6, #13 (overall #113)
ESLint plugins: every listing in weekly downloads order
PNG SVG

Charts

Images: 30d · 1y · all time · 1600×900 dark

Adoption over time

@gdp-ts/core weekly downloads on npm, last 90 days: 71,065 weekly downloads as of Oct 17, 2026.@gdp-ts/coreWeekly downloads on npm · Last 90 days71,065downloads / week020K40K60K80K100K120K140KJul 19Aug 3Aug 18Sep 2Sep 17Oct 2Oct 17downloads / weekobservedarchived (Internet Archive)no observationsJul 20, 2026 – Oct 17, 2026 · 90 observations · Updated Oc…pluginstats.com
@gdp-ts/core weekly downloads on npm, last 90 days: 71,065 weekly downloads as of Oct 17, 2026.
PNG SVG

7/30/90-day growth

@gdp-ts/core weekly downloads growth on npm: -36.3% over 7 days, 30-day growth unavailable, 90-day growth unavailable.@gdp-ts/coreWeekly downloads growth on npm71,065downloads / week now7-day growth-40,473 weekly downloads-36.3%30-day growth+71,065 weekly downloadsInsufficient history90-day growth+71,065 weekly downloadsInsufficient historyGrowth vs. nearest observation to each baseline date · Updated Oct 17, 2026pluginstats.com
@gdp-ts/core weekly downloads growth on npm: -36.3% over 7 days, 30-day growth unavailable, 90-day growth unavailable.
PNG SVG

Ranking history

@gdp-ts/core npm ranking history: currently #493 (by weekly downloads).@gdp-ts/corenpm ranking · by weekly downloads · Last 90 days#493current rank#491#492#493#494#495Jul 20Aug 4Aug 19Sep 3Sep 18Oct 3Oct 18rankOct 18, 2026 – Oct 18, 2026 · 1 observations · Updated Oct 17, 2026pluginstats.com
@gdp-ts/core npm ranking history: currently #493 (by weekly downloads).
PNG SVG

Filled points are observed values; hollow points come from Internet Archive snapshots of the listing page. Dashed segments span periods with no observations — values between points are not interpolated.

Recent observations

Full history (121)
Recent weekly downloads observations for @gdp-ts/core
Date (UTC)Weekly downloadsChange vs. previous
71,065-20.2K
91,278+10.2K
81,064-32.9K
114,013-25.8K
139,7690
139,769+13.6K
126,126+14.6K
111,538+20.2K
91,325+30K
61,368+32.9K
28,419+25.8K
2,6630
2,663+2.7K
0—

Similar npm ESLint plugins plugins

Data source

Weekly downloads (trailing 7 complete days) come from the official npm downloads API. Downloads include CI and mirrors and are not equivalent to installs or users. npm publishes no ratings.

Listing: https://www.npmjs.com/package/@gdp-ts/core. First seen Oct 16, 2026; last successful collection Oct 18, 2026. See the methodology.