Documentation
¶
Overview ¶
Package pkg provides the core libraries for Stacktower dependency visualization.
Overview ¶
Stacktower transforms dependency trees into visual tower diagrams where packages rest on what they depend on—inspired by XKCD #2347 ("Dependency"). The pkg directory is organized into four main areas:
- core - Domain logic (dependency resolution, graph structures, rendering)
- infra - Infrastructure (caching, storage, queues, sessions)
- integrations - External API clients (PyPI, npm, GitHub, etc.)
- pipeline - Orchestration (parse → layout → render)
- graph - Serialization types for graphs and layouts
Architecture ¶
The typical data flow through Stacktower:
Package Registry/Manifest
↓
[core/deps] package (resolve dependencies)
↓
[core/dag] package (graph structure + transformations)
↓
[core/render] package (layout + visualization)
↓
SVG/PDF/PNG/JSON output
Quick Start ¶
Resolve dependencies and render a tower visualization:
import (
"context"
"github.com/matzehuels/stacktower/pkg/core/deps/python"
"github.com/matzehuels/stacktower/pkg/core/dag/transform"
"github.com/matzehuels/stacktower/pkg/core/render/tower/layout"
"github.com/matzehuels/stacktower/pkg/core/render/tower/sink"
)
// 1. Resolve dependencies
resolver, _ := python.Language.Resolver()
g, _ := resolver.Resolve(context.Background(), "fastapi", deps.Options{
MaxDepth: 10,
MaxNodes: 1000,
})
// 2. Transform the graph
g = transform.Normalize(g, nil)
// 3. Compute layout
l := layout.Build(g, 1200, 800)
// 4. Render to SVG
svg := sink.RenderSVG(l, g)
Main Packages ¶
## Core Domain Logic
core/deps - Dependency resolution supporting 7 languages (Python, Rust, JavaScript, Go, Ruby, PHP, Java). Each language has its own subpackage with manifest parsers and registry resolvers.
core/dag - Directed acyclic graph optimized for row-based layered layouts. Nodes are organized into horizontal rows with edges connecting consecutive rows only. Supports regular, subdivider, and auxiliary node types.
core/render - Visualization rendering with two output formats: tower (stacked blocks) and nodelink (traditional directed graphs).
## Infrastructure
infra/storage - Unified storage backends for caching and persistence. FileBackend for CLI (filesystem), DistributedBackend for API/Worker (Redis + MongoDB), MemoryBackend for testing.
## External Integrations
integrations - HTTP clients for package registries (PyPI, npm, crates.io, RubyGems, Packagist, Maven, Go proxy) and code hosts (GitHub, GitLab).
dag/transform - Graph transformations: transitive reduction, layering, edge subdivision, and span overlap resolution. [transform.Normalize] runs the complete pipeline.
dag/perm - Permutation algorithms including PQ-trees for efficiently generating valid orderings with partial ordering constraints.
## Visualization
render/tower - Stacktower's signature tower visualization. The rendering pipeline: ordering → layout → transform → sink.
- render/tower/ordering: Minimize edge crossings (barycentric, optimal)
- render/tower/layout: Compute block positions and dimensions
- render/tower/transform: Post-layout (merge subdividers, randomize widths)
- render/tower/sink: Output formats (SVG, PDF, PNG, JSON)
- render/tower/styles: Visual styles (simple, hand-drawn)
- render/tower/feature: Analysis (Nebraska ranking, brittle detection)
render/nodelink - Traditional directed graph diagrams using Graphviz.
render - Top-level utilities for format conversion (SVG to PDF/PNG).
## Serialization
graph - Serialization types for graphs and layouts (JSON node-link format).
## Infrastructure
pipeline - Complete visualization pipeline (parse → layout → render) used by CLI, API, and worker. Ensures consistent behavior across all entry points.
storage - Unified storage backends implementing a two-tier caching strategy:
- Tier 1 (Index): Fast TTL-based lookup via Redis (hash(inputs) → document_id)
- Tier 2 (DocumentStore): Durable storage via MongoDB (documents + GridFS)
Three implementations: FileBackend (CLI), DistributedBackend (API/Worker), MemoryBackend (testing).
queue - Job queue interface with memory and Redis implementations. Supports job lifecycle (pending, running, completed, failed, cancelled).
session - Session management for authenticated users. Provides memory, Redis, and file-based backends for sessions and OAuth state tokens.
common - Shared configuration, constants (TTLs), errors, and hash utilities.
Common Workflows ¶
Parse a manifest file:
parser := python.PoetryLock{}
result, _ := parser.Parse("poetry.lock", deps.Options{})
g := result.Graph.(*dag.DAG)
Enrich with GitHub metadata:
provider, _ := metadata.NewGitHub(token, 24*time.Hour)
opts := deps.Options{MetadataProviders: []deps.MetadataProvider{provider}}
g, _ := resolver.Resolve(ctx, "fastapi", opts)
Render with custom style:
l := layout.Build(g, 1200, 800) style := handdrawn.New(42) svg := sink.RenderSVG(l, g, sink.WithStyle(style))
Analyze maintainer risk:
rankings := feature.RankNebraska(g, 10)
for _, n := range g.Nodes() {
if feature.IsBrittle(n) {
fmt.Printf("Warning: %s may be unmaintained\n", n.ID)
}
}
Testing ¶
Run tests:
go test ./pkg/... # All tests go test ./pkg/core/dag/... # Specific package go test -run Example # Examples only go test -tags integration ./pkg/... # Include integration tests
Directories
¶
| Path | Synopsis |
|---|---|
|
Package buildinfo provides build-time version information.
|
Package buildinfo provides build-time version information. |
|
Package cache provides a minimal caching interface for the pipeline.
|
Package cache provides a minimal caching interface for the pipeline. |
|
core
|
|
|
dag
Package dag provides a directed acyclic graph (DAG) optimized for row-based layered layouts used in tower visualizations.
|
Package dag provides a directed acyclic graph (DAG) optimized for row-based layered layouts used in tower visualizations. |
|
dag/perm
Package perm provides permutation generation algorithms and the PQ-tree data structure for constrained ordering problems.
|
Package perm provides permutation generation algorithms and the PQ-tree data structure for constrained ordering problems. |
|
dag/transform
Package transform provides graph transformations that prepare a DAG for tower rendering.
|
Package transform provides graph transformations that prepare a DAG for tower rendering. |
|
deps
Package deps provides dependency resolution from package registries and manifest files.
|
Package deps provides dependency resolution from package registries and manifest files. |
|
deps/golang
Package golang provides dependency resolution for Go modules.
|
Package golang provides dependency resolution for Go modules. |
|
deps/java
Package java provides dependency resolution for Maven/Java packages.
|
Package java provides dependency resolution for Maven/Java packages. |
|
deps/javascript
Package javascript provides dependency resolution for npm packages.
|
Package javascript provides dependency resolution for npm packages. |
|
deps/languages
Package languages provides the complete list of supported language ecosystems.
|
Package languages provides the complete list of supported language ecosystems. |
|
deps/metadata
Package metadata provides metadata enrichment from external sources.
|
Package metadata provides metadata enrichment from external sources. |
|
deps/php
Package php provides dependency resolution for PHP Composer packages.
|
Package php provides dependency resolution for PHP Composer packages. |
|
deps/python
Package python provides dependency resolution for Python packages.
|
Package python provides dependency resolution for Python packages. |
|
deps/ruby
Package ruby provides dependency resolution for Ruby gems.
|
Package ruby provides dependency resolution for Ruby gems. |
|
deps/rust
Package rust provides dependency resolution for Rust crates.
|
Package rust provides dependency resolution for Rust crates. |
|
render
Package render provides visualization rendering for dependency graphs.
|
Package render provides visualization rendering for dependency graphs. |
|
render/nodelink
Package nodelink provides node-and-edge graph visualization using Graphviz.
|
Package nodelink provides node-and-edge graph visualization using Graphviz. |
|
render/tower
Package tower provides the physical tower visualization engine.
|
Package tower provides the physical tower visualization engine. |
|
render/tower/feature
Package feature provides analysis features for tower visualizations.
|
Package feature provides analysis features for tower visualizations. |
|
render/tower/layout
Package layout computes block positions for tower visualizations.
|
Package layout computes block positions for tower visualizations. |
|
render/tower/ordering
Package ordering provides algorithms for determining the left-to-right arrangement of nodes within each row of a layered graph.
|
Package ordering provides algorithms for determining the left-to-right arrangement of nodes within each row of a layered graph. |
|
render/tower/sink
Package sink provides output format renderers for tower visualizations.
|
Package sink provides output format renderers for tower visualizations. |
|
render/tower/styles
Package styles defines visual styles for tower rendering.
|
Package styles defines visual styles for tower rendering. |
|
render/tower/styles/handdrawn
Package handdrawn provides an XKCD-inspired hand-drawn visual style.
|
Package handdrawn provides an XKCD-inspired hand-drawn visual style. |
|
render/tower/transform
Package transform provides post-layout transformations for tower rendering.
|
Package transform provides post-layout transformations for tower rendering. |
|
Package errors provides structured error types for the Stacktower application.
|
Package errors provides structured error types for the Stacktower application. |
|
Package graph provides serialization types for dependency graphs and layouts.
|
Package graph provides serialization types for dependency graphs and layouts. |
|
Package integrations provides HTTP clients for package registry APIs.
|
Package integrations provides HTTP clients for package registry APIs. |
|
crates
Package crates provides an HTTP client for the crates.io API.
|
Package crates provides an HTTP client for the crates.io API. |
|
github
Package github provides an HTTP client for the GitHub API.
|
Package github provides an HTTP client for the GitHub API. |
|
gitlab
Package gitlab provides an HTTP client for the GitLab API.
|
Package gitlab provides an HTTP client for the GitLab API. |
|
goproxy
Package goproxy provides an HTTP client for the Go Module Proxy.
|
Package goproxy provides an HTTP client for the Go Module Proxy. |
|
maven
Package maven provides an HTTP client for Maven Central.
|
Package maven provides an HTTP client for Maven Central. |
|
npm
Package npm provides an HTTP client for the npm registry API.
|
Package npm provides an HTTP client for the npm registry API. |
|
packagist
Package packagist provides an HTTP client for the Packagist API.
|
Package packagist provides an HTTP client for the Packagist API. |
|
pypi
Package pypi provides an HTTP client for the Python Package Index API.
|
Package pypi provides an HTTP client for the Python Package Index API. |
|
rubygems
Package rubygems provides an HTTP client for the RubyGems.org API.
|
Package rubygems provides an HTTP client for the RubyGems.org API. |
|
Package observability provides hooks for metrics, tracing, and logging.
|
Package observability provides hooks for metrics, tracing, and logging. |
|
Package pipeline provides the core visualization pipeline for Stacktower.
|
Package pipeline provides the core visualization pipeline for Stacktower. |
|
Package session provides session management for authenticated users.
|
Package session provides session management for authenticated users. |