Skip to content
Watchdog
Sign inSurvey a repo — free

Languages

Which languages we model deeply — and exactly where each one stops.

Every language Watchdog surveys, and how much of the architecture survey actually resolves in each one — the domain, event-sourcing, event-driven, vertical-slice and structural lenses, per language. This is survey clarity: how clearly a language leads to a complete survey. It is not a grade of the language, not a ranking of the code written in it, and no language is privileged over another — each one is held to the same test suite before it ships. Read live from the product, so a newly signed-off language appears here the day it does.

17 languages surveyed · every row below read live from the product · a record, never a logo.

The live matrix

Every language, with its coverage on the record

Each row names the frontend we parse that language with, an applicability rating from 0 to 10 and its band, whether the survey resolves deterministically or abstains, the capability boundary — the specific patterns that language cannot resolve — and the date a human signed the record off. Read the boundary before you read the rating: it is the part that tells you what a survey of your repository will actually contain.

Language survey-clarity (FIT) matrix

How a record is earned

A rating is evidence, not a badge.

A named frontend

We say which parser or compiler service reads the language — Roslyn, the F# compiler service, Spoon, the Kotlin compiler's own binding, go/types, the TypeScript compiler API, scalameta, and a purpose-built frontend for each of the rest. If we cannot name it, we do not claim it.

Its own acceptance corpus

A language enters the catalogue only after a versioned corpus of representative real repositories completes a survey and the findings hold up. Calibration is per language — never inherited from another language, and never assumed because two languages look alike.

A declared boundary

Every record states what that language cannot resolve: a generated construct, dynamic dispatch, a field-based pattern the parser will not bind. Where a lens cannot resolve, the survey says not measured, with the reason — it never scores you on a blank.

A dated human signoff

A language is not supported because a row exists. Each record carries the accountable signoff and its date, and the same test suite gates every language before it ships.

Where the ecosystem, not the language, sets the limit

A few dimensions are bounded by an ecosystem's tooling rather than by our reading of the language. Worth knowing before you rely on them:

  • Dependency and known-vulnerability scanning covers every ecosystem you ship — npm, Maven, PyPI, Go modules, Cargo, Composer, RubyGems, Hex, pub and NuGet — and the daily security watch inherits the same reach.
  • Outdated and deprecated package reporting covers four ecosystems today — NuGet, Hex, Go modules and RubyGems — each charged at the same deduction rates, so no language is graded on a friendlier curve than another. Ruby carries no deprecation charge, and that is not an omission: rubygems.org publishes no deprecation marker, unlike Hex's retirements and Go's // Deprecated: directive. For the ecosystems we do not yet read for currency — npm, Maven, Gradle, Cargo, PyPI, Composer, pub and Swift — a report names the manifests it did not read rather than scoring them clean.
  • The test-quality collector — does a test actually assert anything — reads C#, Swift and Java today. Where a repository's tests are written in anything else, the report says so and the dimension is not scored, rather than reading an unread suite as a clean one. Kotlin is a deliberate exception rather than an oversight: Kotest's infix matchers carry no call parentheses, and recognising them needs its own calibration, so a Kotest suite is left unscored instead of being read as verifying nothing.
  • Bytecode-level code health reads .NET IL only. The engine builds the target and reads the IL the compiler actually emitted, which catches bloat that source-level complexity cannot see. There is no JVM equivalent: our Java, Kotlin and Scala frontends read source, not class files.

Those are limits, not preferences. One reads .NET only, one reads three languages, one spans four ecosystems, and one reaches every ecosystem equally — none of them makes any language a first-class or second-class citizen here. Where a dimension cannot run for your stack, you are told so and why, and it is not scored.

What we do not survey

C and C++ are not surveyed today, and neither are legacy estates like COBOL or ABAP. If that is your codebase we will tell you before you pay us — and if you would like us to cover it, tell us; that is how we pick what to build next. We also do not replace deep line-level SAST or dataflow analysis in any language: that is a specialist's craft, and where Watchdog fits explains the division of labour.

Find your language, then go and read a real survey written in it.

Sign in with GitHub · no card · Java, Kotlin, TypeScript, Python, Go and more · the first full report is €0.