Stack Detection Reference

April 14, 2026 · View on GitHub

Load this file when the tech stack is ambiguous — e.g., multiple manifest files present, unfamiliar file extensions, or no obvious package.json / go.mod.


Manifest File → Ecosystem

FileEcosystemKey fields to read
package.jsonNode.js / JavaScript / TypeScriptdependencies, devDependencies, scripts, main, type, engines
go.modGoModule path, Go version, require block
requirements.txtPython (pip)Package list with pinned versions
PipfilePython (pipenv)[packages], [dev-packages], [requires] python version
pyproject.tomlPython (poetry / uv / hatch)[tool.poetry.dependencies], [project], [build-system]
setup.py / setup.cfgPython (setuptools, legacy)install_requires, python_requires
Cargo.tomlRust[dependencies], [[bin]], [lib]
pom.xmlJava / Kotlin (Maven)<dependencies>, <artifactId>, <groupId>, <java.version>
build.gradle / build.gradle.ktsJava / Kotlin (Gradle)dependencies {}, sourceCompatibility
composer.jsonPHPrequire, require-dev
GemfileRubygem declarations, ruby version constraint
mix.exsElixirdeps/0, elixir: "~> X.Y"
pubspec.yamlDart / Flutterdependencies, dev_dependencies, environment.sdk
*.csproj.NET / C#<PackageReference>, <TargetFramework>
*.sln.NET solutionReferences multiple .csproj projects
deno.json / deno.jsoncDeno (TypeScript runtime)imports, tasks
bun.lockbBun (JavaScript runtime)Binary lockfile — check package.json for deps

Language Runtime Version Detection

LanguageWhere to find the version
Node.js.nvmrc, .node-version, engines.node in package.json, Docker FROM node:X
Python.python-version, pyproject.toml [requires-python], Docker FROM python:X
GoFirst line of go.mod (go 1.21)
Java<java.version> in pom.xml, sourceCompatibility in build.gradle, Docker FROM eclipse-temurin:X
Ruby.ruby-version, Gemfile ruby 'X.Y.Z'
Rustrust-toolchain.toml, rust-toolchain file
.NET<TargetFramework> in .csproj (e.g., net8.0)

Framework Detection (Node.js / TypeScript)

Dependency in package.jsonFramework
expressExpress.js (minimal HTTP server)
fastifyFastify (high-performance HTTP server)
nextNext.js (SSR/SSG React — check for pages/ or app/ directory)
nuxtNuxt.js (SSR/SSG Vue)
@nestjs/coreNestJS (opinionated Node.js framework with DI)
koaKoa (middleware-focused, no built-in router)
@hapi/hapiHapi
@trpc/servertRPC (type-safe API without REST/GraphQL schemas)
routing-controllersrouting-controllers (decorator-based Express wrapper)
typeormTypeORM (SQL ORM with decorators)
prismaPrisma (type-safe ORM, check prisma/schema.prisma)
mongooseMongoose (MongoDB ODM)
sequelizeSequelize (SQL ORM)
drizzle-ormDrizzle (lightweight SQL ORM)
react without nextVanilla React SPA (check for react-router-dom)
vue without nuxtVanilla Vue SPA

Framework Detection (Python)

PackageFramework
fastapiFastAPI (async REST, auto OpenAPI docs)
flaskFlask (minimal WSGI web framework)
djangoDjango (batteries-included, check settings.py)
starletteStarlette (ASGI, often used as FastAPI base)
aiohttpaiohttp (async HTTP client and server)
sqlalchemySQLAlchemy (SQL ORM; check for alembic migrations)
alembicAlembic (SQLAlchemy migration tool)
pydanticPydantic (data validation; core to FastAPI)
celeryCelery (distributed task queue)

Monorepo Detection

Check these signals in order:

  1. pnpm-workspace.yaml — pnpm workspaces
  2. lerna.json — Lerna monorepo
  3. nx.json — Nx monorepo (also check workspace.json)
  4. turbo.json — Turborepo
  5. rush.json — Rush (Microsoft monorepo manager)
  6. moon.yml — Moon
  7. package.json with "workspaces": [...] — npm/yarn workspaces
  8. Presence of packages/, apps/, libs/, or services/ directories with their own package.json

If monorepo is detected: each workspace may have independent dependencies and conventions. Map each sub-package separately in STACK.md and note the monorepo structure in STRUCTURE.md.


TypeScript Path Alias Detection

If tsconfig.json has a paths key, imports with non-relative prefixes are aliases. Map them before documenting structure.

// tsconfig.json example
"paths": {
  "@/*": ["./src/*"],
  "@components/*": ["./src/components/*"],
  "@utils/*": ["./src/utils/*"]
}

Imports like import { foo } from '@/utils/bar' resolve to src/utils/bar. Document as src/utils/bar, not @/utils/bar.


Docker Base Image → Runtime

If no manifest file is present but a Dockerfile exists, the FROM line reveals the runtime:

FROM line patternRuntime
FROM node:XNode.js X
FROM python:XPython X
FROM golang:XGo X
FROM eclipse-temurin:XJava X (Eclipse Temurin JDK)
FROM mcr.microsoft.com/dotnet/aspnet:X.NET X
FROM ruby:XRuby X
FROM rust:XRust X
FROM alpine (alone)Check what's installed via RUN apk add