Loading report…
← nittim
[](https://nittim.com)Material risks remain. Remediate before relying on this in production.Real risks remain. Fix these before you rely on this for real users.Fix these risks before shipping to real users.
This verdict covers the 91% of your repository we read — see what we didn’t read below.This result is based on the 91% of your project’s code we actually read — see what we didn’t read below.Covers 91% of your repo — see what we didn’t read below.
This audit read 520 of your 566 eligible source files — the ones most likely to hurt you first. Maximum coverage for now — this repository is larger than one full audit can read in a single run.
The scores and findings above cover only those files. The other 46 files haven’t been audited yet. The denominator counts eligible source and configuration files only — images, generated output and build directories are excluded before counting.
.github/workflows/pullfrog.yml`on: workflow_dispatch` with `permissions: { id-token: write, contents: write, pull-requests: write, issues: write }`, running `uses: pullfrog/pullfrog@v0` (unpinned) with env exposing ANTHROPIC_API_KEY, OPENAI_API_KEY, GOOGLE_API_KEY, GEMINI_API_KEY, CURSOR_API_KEY, MISTRAL_API_KEY, GROQ_API_KEY, DEEPSEEK_API_KEY, OPENROUTER_API_KEY and CLAUDE_CODE_OAUTH_TOKEN..github/workflows/release.ymlpins `pnpm/action-setup@v6` (lines 31,52,65,91), `JS-DevTools/npm-publish@v4` (lines 102,122), and `mikepenz/release-changelog-builder-action@v6` (line 145); .github/workflows/test.yml pins `pnpm/action-setup@v6` (lines 30,53,67); .github/workflows/claude-code-review.yml:36, claude.yml:35, pullfrog.yml:31 pin third-party actions to floating tags (`@v1`, `@v0`). Reported by the IaC scanner as gha-unpinned-action; static config analysis only — the deployed CI state was not inspected.520 of 566 source files were audited. This audit's size or file-count limit was reached, so some source and configuration files were left unread. The denominator counts eligible source and configuration files only — images, generated output and build directories are excluded before counting.
100 other files aren’t code this audit reads — images, lockfiles, generated output, and similar non-source content.
This audit's size limit was reached before it read the whole repository. The verdict and every score on this report were computed from what it did read — read them as evidence about that sample, not a clean bill of health for the rest.
Dependency manifests: 8 package roots found, 8 scanned — package list truncated at the vulnerability-lookup limit.
This is `colinhacks/zod`, the widely-used TypeScript-first schema-validation library — a large, mature, exhaustively-tested monorepo (v3 legacy, v4 classic/mini/core, docs site, benchmarks, integration/treeshake harnesses). It is an OSS library, not a data-handling application, so most enterprise security/privacy/reliability dimensions apply only narrowly (to the CI/publish pipeline and the docs website). Code quality and architecture are excellent: careful prototype-pollution handling, ReDoS-aware regex work with recheck, memory/bundle-size regression guards, and broad automated tests. The material risks are concentrated in the supply-chain/CI surface: a `workflow_dispatch` agent workflow (pullfrog.yml) that grants an unpinned third-party action broad write permissions and every AI-provider secret, GitHub Actions pinned by mutable tag rather than commit SHA, and a docs website that ships Google/Vercel/Inkeep tracking with no consent gate. The scanner's dependency hits are almost entirely dev-only or scoped to the docs `next` app; the published `zod` package has zero runtime dependencies, so those advisories do not reach library consumers. The two committed JWTs are test fixtures, not live credentials. No audit-tampering content was found. The codebase is clearly long-lived human authorship.
packages/zod/src/v4/core/compile.tsuses `new F(...constantNames, factoryCode)` (compileFastpass) and packages/zod/src/v4/core/doc.ts uses `new F(...)` (Doc.compile) to build validators; packages/zod/src/v4/core/schemas.ts object JIT path is gated by `allowsEval.value` and `core.globalConfig.jitless`. util.ts `allowsEval` probes `new Function("")` and returns false under CSP/Cloudflare and when `jitless` is set.packages/docs-v3/index.htmland blog/index.html load Google Tag Manager (`gtag('config','G-FG8DDV0GBR')`) unconditionally at page load; packages/docs/app/layout.tsx renders `<Analytics />` (@vercel/analytics) and InkeepBubble/InkeepSearch which call out to inkeep.com. No cookie/consent banner precedes these.packages/zod/src/v4/core/compile.tsis a large, intricate single module (schema-type dispatch, codegen, runtime islands, async detection, fallback semantics) whose correctness rests on subtle invariants documented mostly in wiki/compile.md and wiki/compile-plan.md; AGENTS.md notes the project is effectively maintained by a small number of individuals.packages/zod/src/compile.tsand the referenced ./v4/core/compile.ts implement a global post-processor shim that JIT/AOT-compiles each schema's parse path on first use (globalConfig.postProcessor, compile()/compileFastpass, jitless fallback), plus the extensive compile-* benchmark harness in packages/bench documenting the technique.packages/zod/src/v4/core/compile.tsimplements an ahead-of-time schema compiler that emits a flat fast-path validator with a runtime-island fallback and an INVALID sentinel; packages/zod/src/v4/core/memoizer.ts implements per-parse-context memoization that terminates parsing of cyclic input by registering in-progress outputs. Both are genuinely non-obvious engineering. The repository is PUBLIC (MIT), so the implementations are fully readable and copyable.wiki/compile.mddescribes the compiler's mechanism in detail ("happy-path validator ... returns the parsed/transformed output or an INVALID sentinel", allowlist classification of string formats, runtime islands, the reasons unions do not island); wiki/optionality.md documents the three-rung optin ladder ("undefined / optional / defaulted") and the retirement of the payload.fallback flag. These read as method disclosure of non-obvious mechanisms rather than benefit-level capability description.Weighted blend of 4 dimensions → ~78/100. Dimensions are weighted by importance (Security and Privacy weigh heaviest). Published figures are approximate; nittim's exact weighting and precise scoring are proprietary, while the verdict is computed on exact internal values.4 categories combine into ~78/100. Some categories count for more than others (Security and Privacy count the most). The published numbers are approximate; nittim's exact math is kept private, while the verdict itself is worked out from the exact internal numbers.Weighted blend of 4 dimensions → ~78/100 (Security and Privacy weigh heaviest). Published figures are approximate; nittim's exact weighting is proprietary. The verdict runs on exact internal values.
IP Protection is an independent IP-defensibility lens and is excluded from this blend.IP Protection (checking whether your ideas are exposed) is judged separately and isn’t
part of this combined number.IP Protection is judged separately, excluded from this blend.
Scores are a judgement, not a measurement: a re-audit of the same commit can land a few
points either side of this figure. The evidence underneath it is deterministic — the same
commit always yields the same committed-secret and vulnerable-dependency findings.Scores are a judgment call, not an exact measurement: checking the same saved snapshot of
your code twice can land a few points either side of this number. The evidence underneath
it is not — the same snapshot always turns up the same passwords-in-code and known-security-bug
findings.Scores are a judgment, not a measurement — a re-audit can land a few points either side. The evidence underneath is deterministic: the same commit always yields the same secret and vulnerable-dependency findings.
Each score is the model's overall assessment of the dimensions it covers, across everything it reviewed — not a tally of the findings in this report. Findings are the subset worth acting on, so a score can sit above or below what the listed findings alone would suggest.Each score is the AI's overall judgment of everything it reviewed in that category — not a
count of the problems listed in this report. The listed problems are the ones worth acting
on, so a score can sit above or below what they alone would suggest.Each score is the model's overall assessment across everything it reviewed — not a tally of this report's findings. A score can sit above or below what the findings alone suggest.
nittim guardrail — nittim's safety check — nittim guardrail — The model proposed “ready_with_conditions”; nittim's deterministic layer set the final verdict to “high_risk” because of a high-severity vulnerability in an installed runtime dependency (reachability from your own code was not verified). The written rationale below reflects the model's proposal — the verdict above is the one that governs.
Verdict rationale — Why this verdict — Verdict rationale — As a library, Zod is production-grade: high-quality, heavily-tested code with careful handling of the security fundamentals relevant to a validator (prototype pollution, ReDoS) and no runtime dependencies in the published package. The conditions are operational, not in the shipped library: the pullfrog `workflow_dispatch` agent workflow grants an unpinned third-party action broad write permissions and every AI-provider secret (high), CI/publish actions are pinned by mutable tag rather than SHA (medium), and the docs site fires trackers without a consent gate (medium). None of these block the library's own release, but they should be remediated before treating the CI/publish and docs-hosting surface as hardened. The IP findings are informational — the novel compilation and memory techniques are exposed only because the project is intentionally MIT open source — and do not affect the verdict. Authorship signals point clearly to long-lived human development.