Real open-source codebases, pinned to a commit

Code Analysis Demos (analyzed 2026-11-03)

10 open-source repositories in 10 languages, pinned to a recorded commit, plus a metrics-only analysis of the full PViz product.

Arrow

Kotlin

Functional programming toolkit for Kotlin Multiplatform

Arrow's largest production cycle has 5 files, at the heart of its error-handling types. Most entry points are generated documentation examples.

Source
arrow-kt/arrow
4c85819ff796 (2026-10-26)
default-branch HEAD on the October 2026 analysis date (same commit as the October demo)
Analyzer
PViz analyzer (the engine hosted analyses use)
revision 7d6597af01e2 · [email protected]
Analysis
Run 2026-11-03, status complete
181 s, 1,085 MB peak memory (limit 1,792 MB)
Languages and parsing
java (full), kotlin (full)
752 ok, 61 warn
813
Files analyzed
68,066
Source lines
3 / 5
Cycle groups / largest (files)
5,605
Calls resolved in repo (38% of the calls that could reach repo code)

Call resolution (28,305 call sites)

Resolved in the repository
5,605
To libraries or the standard library
13,424
Ambiguous (several possible targets)
2,552
Unresolved (could be repo code)
6,724

The rate above is resolved ÷ (resolved + ambiguous + unresolved). Calls to libraries and the standard library cannot reach this repository, so they are shown separately and left out of it. Test code is included in these counts.

What the analysis shows

FindingThe largest production cycle

Either.kt, NonEmptyList.kt, NonEmptySet.kt, Raise.kt and RaiseAccumulate.kt depend on each other. These are Arrow's core error-handling types.

FindingGenerated documentation examples and entry points

304 of the analyzed files are documentation examples generated by the Knit tool under jvmTest/kotlin/examples. The analyzer lists 225 program entry points (219 of them those examples' main functions) and 34 Ktor routes in the arrow-raise-ktor-server integration.

FindingCall graph

28,305 call sites; 20% resolve inside the repository. atomically in the STM module is called from 105 files.

LimitationMultiplatform declarations resolve to one source set

An import of arrow.atomic.Atomic can mean several platform-specific actual declarations. The analyzer links it to one of them (androidAndJvmMain), so dependencies on platform-specific code reflect that choice.

Changed since OctoberSame graph, many more calls resolved

Re-analyzed with the current analyzer, the same commit gives the same files, module dependencies and cycles as the October demo (813 files, 354 module dependencies, 3 cycle groups). More calls resolve: 5,605 inside the repository, against 1,718 in October. Kotlin calls are now resolved with the type information of the Kotlin compiler itself (without building the project): calls on inferred types, call chains, scope functions such as let and apply, and extension functions such as left() and right(). The analysis took 181.0 s with a peak of 1,085 MB (October: 53.2 s, 403 MB).

Largest cycle group

  • arrow-libs/core/arrow-core/src/commonMain/kotlin/arrow/core/Either.kt
  • arrow-libs/core/arrow-core/src/commonMain/kotlin/arrow/core/NonEmptyList.kt
  • arrow-libs/core/arrow-core/src/commonMain/kotlin/arrow/core/NonEmptySet.kt
  • arrow-libs/core/arrow-core/src/commonMain/kotlin/arrow/core/raise/Raise.kt
  • arrow-libs/core/arrow-core/src/commonMain/kotlin/arrow/core/raise/RaiseAccumulate.kt

Most widely called symbols (calling files)

  • arrow-libs/fx/arrow-fx-stm/src/commonMain/kotlin/arrow/fx/stm/STM.kt#arrow.fx.stm.atomically (105)
  • arrow-libs/core/arrow-core/src/commonMain/kotlin/arrow/core/Either.kt#arrow.core.A::left (37)
  • arrow-libs/core/arrow-core/src/commonMain/kotlin/arrow/core/Either.kt#arrow.core.A::right (33)
  • arrow-libs/core/arrow-core/src/commonMain/kotlin/arrow/core/Either.kt#arrow.core.Either.Companion.catch (30)
  • arrow-libs/fx/arrow-fx-coroutines/src/commonMain/kotlin/arrow/fx/coroutines/Resource.kt#arrow.fx.coroutines.resourceScope (27)
  • arrow-libs/core/arrow-core/src/commonMain/kotlin/arrow/core/raise/Builders.kt#arrow.core.raise.either (25)

Endpoints (first rows of the inventory)

  • DELETE /{?}/{?} -> arrow-libs/integrations/arrow-raise-ktor-server/src/commonMain/kotlin/arrow/raise/ktor/server/routing/routing.kt#arrow.raise.ktor.server.routing.Route::deleteOrRaise(Regex,HttpStatusCode?,RespondingRaiseRoutingHandler).<lambda#1>
  • DELETE /{?}/{?} -> arrow-libs/integrations/arrow-raise-ktor-server/src/commonMain/kotlin/arrow/raise/ktor/server/routing/routing.kt#arrow.raise.ktor.server.routing.Route::deleteOrRaise(String,HttpStatusCode?,RespondingRaiseRoutingHandler).<lambda#1>
  • GET /{?}/{?} -> arrow-libs/integrations/arrow-raise-ktor-server/src/commonMain/kotlin/arrow/raise/ktor/server/routing/routing.kt#arrow.raise.ktor.server.routing.Route::getOrRaise(Regex,HttpStatusCode?,RespondingRaiseRoutingHandler).<lambda#1>
  • GET /{?}/{?} -> arrow-libs/integrations/arrow-raise-ktor-server/src/commonMain/kotlin/arrow/raise/ktor/server/routing/routing.kt#arrow.raise.ktor.server.routing.Route::getOrRaise(String,HttpStatusCode?,RespondingRaiseRoutingHandler).<lambda#1>
  • HEAD /{?}/{?} -> arrow-libs/integrations/arrow-raise-ktor-server/src/commonMain/kotlin/arrow/raise/ktor/server/routing/routing.kt#arrow.raise.ktor.server.routing.Route::headOrRaise(Regex,HttpStatusCode?,RespondingRaiseRoutingHandler).<lambda#1>
  • HEAD /{?}/{?} -> arrow-libs/integrations/arrow-raise-ktor-server/src/commonMain/kotlin/arrow/raise/ktor/server/routing/routing.kt#arrow.raise.ktor.server.routing.Route::headOrRaise(String,HttpStatusCode?,RespondingRaiseRoutingHandler).<lambda#1>
  • OPTIONS /{?}/{?} -> arrow-libs/integrations/arrow-raise-ktor-server/src/commonMain/kotlin/arrow/raise/ktor/server/routing/routing.kt#arrow.raise.ktor.server.routing.Route::optionsOrRaise(Regex,HttpStatusCode?,RespondingRaiseRoutingHandler).<lambda#1>
  • OPTIONS /{?}/{?} -> arrow-libs/integrations/arrow-raise-ktor-server/src/commonMain/kotlin/arrow/raise/ktor/server/routing/routing.kt#arrow.raise.ktor.server.routing.Route::optionsOrRaise(String,HttpStatusCode?,RespondingRaiseRoutingHandler).<lambda#1>

8 of 34 shown

Compared with the October 2026 demo

The same commit, analyzed again with the current analyzer. Both columns use the same definitions; differences come from analyzer changes, explained in the findings above where they matter. The October demo recorded only the resolved-call count, so the other call-resolution rows show the current analyzer only.

MeasureOctober 2026 demoCurrent analyzer
Files analyzed
graph nodes (Go: packages)
813813
Source lines (SLOC)
non-blank, non-comment lines of analyzed files
68,06668,066
Module dependencies
distinct file-to-file links, test-only and name-match links excluded
354354
Relationship records
all edge rows of every kind, including links to external symbols
4,8064,806
Cycle groups
groups of files that depend on each other
33
Largest cycle (files)
size of the largest cycle group
55
Most-imported module
distinct production importers of the top module
35 (Either.kt)35 (Either.kt)
Call sites resolved in repo
calls resolved to a function inside the repository / all call sites
1,718 / 28,3055,605 / 28,305
Calls to libraries (external)
calls into other packages or the language's standard library
n/a13,424
Ambiguous calls
calls with several possible targets inside the repository
n/a2,552
Unresolved calls
calls that could reach repository code but were not pinned to a target
n/a6,724
Resolved of in-repo calls
resolved / (resolved + ambiguous + unresolved): external calls cannot reach the repository
n/a38%
Framework registrations
routes, handlers, hooks, entry points with resolution status
265265
Architectural zones
package-hierarchy zones
189189
Analysis time (s)
wall time of the analysis call
53.2181
Peak memory (MB)
container memory peak during the analysis
4031,085

Limitations

  • Most of Either.kt's importers are tests: 35 production files import it.
  • 24% of call sites stay unresolved, mostly calls on receivers whose type the analysis could not determine.
  • Static analysis records relationships visible in the source. It does not see dynamic loading, reflection, or behaviour at runtime; verify important conclusions in the code.

Download the analysis

A full bundle of a large repository exceeds many models' context windows; the focused slices below answer one question each in a fraction of the size.

Focused slices

All slices, readable and compressed, with the commands used (79 KB)

Ready to run this on your own codebase?

Hosted analyses use the same analyzer as this demo, within your usage limits.

Analyze your repo