What it reads
Languages, frameworks and formats
Support is per-signal rather than per-language: a repository in an unlisted language still gets containers, deployment topology and evidence from its manifests and Dockerfiles — it just gets no API contracts or flows.
Languages
Parsed with tree-sitter for symbols, calls, imports and types.
| Language | Module layout read from |
|---|---|
| Rust | Cargo workspaces and crates |
| TypeScript / JavaScript | npm and workspace packages |
| Go | Go modules and package directories |
| Python | Packages, uv and Poetry workspaces |
| Java | Maven and Gradle modules |
| Kotlin | Gradle modules |
| C# | .csproj projects, named by AssemblyName or the file |
HTTP and RPC
Where operations, parameters, request and response models and callers come from.
| Go | chi, Echo, Gin, Fiber, gorilla/mux, net/http |
|---|---|
| TypeScript | Express, Fastify, Koa, Hono, NestJS |
| Python | FastAPI, Flask, Django, Starlette, aiohttp |
| Rust | Axum, Actix Web, Rocket, warp, Poem |
| JVM | Spring MVC, Spring WebFlux, JAX-RS, Quarkus, Micronaut, Dropwizard, Jersey, Helidon, Javalin, Vert.x, Ktor |
| C# | ASP.NET Core attribute-routed controllers and minimal-API Map* routes |
| Service-to-service | Feign, MicroProfile Rest Client, Micronaut clients, gRPC stubs, and HTTP client calls matched to the operation they hit |
| Gateways | Spring Cloud Gateway and Zuul routes read from configuration, including routes declared in a config server |
Data
| ORMs and mappers | JPA/Hibernate, Spring Data, jOOQ, MyBatis, JDBI, Micronaut Data, Panache, Exposed, EF Core, GORM, sqlx, database/sql, Diesel, SeaORM, Prisma, TypeORM, Sequelize, Drizzle, Kysely, Knex, SQLAlchemy, SQLModel, Django ORM, Peewee, Tortoise |
|---|---|
| Migrations | Liquibase, Flyway, Alembic, raw SQL |
| Stores | PostgreSQL, MySQL, SQLite, MongoDB, Redis, Elasticsearch, S3, Firestore, DynamoDB |
| Read from them | Entities, columns, keys, cardinality, which service reads and which writes, and lifecycles inferred from status fields plus the code that changes them |
Messaging and background work
| Brokers | Kafka, RabbitMQ, NATS, SQS, Google Pub/Sub |
|---|---|
| In-process events | Spring publishEvent, @EventListener, Spring Modulith @ApplicationModuleListener, Micronaut events |
| Schedules | @Scheduled and cron expressions, resolved through configuration placeholders |
| Traced | A published event is followed into the handlers that consume it, across services |
Deployment
| Docker Compose | Services, builds, images, ports, volumes, profiles, health checks, depends_on, .env substitution, and overlay files layered with -f |
|---|---|
| Kubernetes | Deployment, StatefulSet, DaemonSet, Job, CronJob, Service and Ingress, found by content anywhere in the repository |
| Helm | Value-only templates rendered; a template needing control flow is reported as not read rather than guessed at |
| Third-party services | Stripe, SendGrid, Twilio, OpenAI, Anthropic, Slack and SMTP, from the client libraries that call them |
Known gaps
- Authentication applied by middleware, rather than per route, is not attributed to the operations it protects.
- A port with several implementations is left unresolved rather than guessed. Which one a service uses is often decided by dependency-injection wiring at startup, which is not in the source — so a request flow through such a port stops at the port.
- A call into a library the service links is not followed, so work a shared package does on the service's behalf does not appear as a step in its flows.
- ASP.NET Core routes are read from attributes. A controller routed by convention through
MapControllerRoutedeclares its paths in a pattern string rather than on the action, so those operations are not found — the pattern says where a class of routes lives, not which ones exist.
The rules behind each of these — how units, compose services, calls, datastores and events are recognised, and where each stops — are written out in HEURISTICS.md.
Something missing or wrong for your stack is worth an issue — the templates are built around exactly those two cases.