
Security News
The Hidden Blast Radius of the Axios Compromise
The Axios compromise shows how time-dependent dependency resolution makes exposure harder to detect and contain.
@natalietdg/dotto
Advanced tools
Data Object Trace & Transparency Orchestrator - Enterprise-grade schema dependency analysis with optional proof backends
Data Object Trace & Transparency Orchestrator
Enterprise-grade schema dependency analysis with incremental graph updates, impact analysis, and optional proof backends.
dotto helps engineering teams understand and manage schema dependencies across TypeScript and OpenAPI codebases. It builds an incremental dependency graph, detects breaking changes, and provides cause→effect visibility without requiring blockchain knowledge.
@intent doc comments to detect semantic driftNote: Proof backends are completely optional. dotto works perfectly without them.
# Install globally
npm install -g @natalietdg/dotto
# Initialize in your project
cd your-typescript-project
dotto init
# Scan for schemas
dotto crawl
# Detect breaking changes
dotto scan
# View impact
dotto impact <node-id>
# Generate visualization
dotto graph
# 1. Clone and install
git clone https://github.com/natalietdg/dotto.git
cd dotto
npm install
# 2. Build
npm run build
# 3. Run commands
node dist/cli/index.js init
node dist/cli/index.js crawl
node dist/cli/index.js scan
# 4. View live dependency graph with drift detection
npm run dev
# Opens http://localhost:5173
# - Builds CLI
# - Scans codebase
# - Detects drift
# - Launches interactive viewer
# - Red nodes = breaking changes
# - Click nodes to see exact field changes
dotto initInitialize dotto in the current directory. Creates graph.json.
dotto init
dotto scan (NEW - MVP v1.1)Git-aware schema change detection - Scans repository for breaking changes.
# Scan for uncommitted changes
dotto scan
# Compare against specific commit
dotto scan --base <commit-hash>
Output:
📊 Schema Diff Report
⚠️ 2 breaking change(s):
❌ UserDto (modified)
• Required property "email" was added (breaking)
• Property "password" type changed from "string" to "HashedPassword"
✓ 1 non-breaking change(s):
ℹ️ OrderDto (modified)
• Optional property "notes" was added
Exit codes:
0 - No changes or non-breaking changes only1 - Breaking changes detecteddotto crawlScan codebase and build the dependency graph.
# Full crawl
dotto crawl
# Incremental (only changed files)
dotto crawl --diff
Output:
🔍 Crawling codebase (incremental)...
✓ Crawl complete in 487ms
Results:
+ Added: 2
~ Modified: 1
- Removed: 0
= Unchanged: 15
Newly discovered:
• UserDto (dto)
• PaymentSchema (schema)
What it scans:
**/*.dto.ts - Data Transfer Objects**/*.schema.ts - TypeScript schemas**/*.interface.ts - TypeScript interfaces**/*.openapi.{json,yaml,yml} - OpenAPI specs**/*.swagger.{json,yaml,yml} - Swagger specsdotto impact <NODE_ID>Analyze downstream dependencies (what breaks if this changes).
node dist/cli/index.js impact examples/user.dto.ts:UserDto
Output:
📊 Impact Analysis for: UserDto
Type: dto
File: examples/user.dto.ts
⚠️ 3 downstream dependent(s):
Distance 1:
• OrderDto (dto) [confidence: 85%]
examples/order.dto.ts
Distance 2:
• InvoiceDto (dto) [confidence: 70%]
examples/invoice.dto.ts
dotto why <NODE_ID>Show provenance chain (reverse dependencies).
node dist/cli/index.js why examples/invoice.dto.ts:InvoiceDto
Output:
🔍 Provenance Chain for: InvoiceDto
Type: dto
File: examples/invoice.dto.ts
📜 2 upstream source(s):
• OrderDto (dto)
Relationship: uses
File: examples/order.dto.ts
Intent: Represents customer orders
• UserDto (dto)
Relationship: uses
File: examples/user.dto.ts
dotto checkRun compatibility checks across the graph.
node dist/cli/index.js check
Detects:
@intent comment changes (warning)dotto graphGenerate static HTML visualization.
node dist/cli/index.js graph
# or
node dist/cli/index.js graph -o my-graph.html
Opens a standalone HTML file with:
dotto proof <NODE_ID> (Optional)Record immutable proof for a schema change.
# No proof (default)
node dist/cli/index.js proof examples/user.dto.ts:UserDto
# With Hedera
node dist/cli/index.js proof examples/user.dto.ts:UserDto --proof hedera
# With Git
node dist/cli/index.js proof examples/user.dto.ts:UserDto --proof git
# With Sigstore
node dist/cli/index.js proof examples/user.dto.ts:UserDto --proof sigstore
Hedera Setup (Optional):
Create .env file:
HEDERA_ACCOUNT_ID=0.0.YOUR_ACCOUNT_ID
HEDERA_PRIVATE_KEY=YOUR_PRIVATE_KEY
HEDERA_TOPIC_ID=0.0.YOUR_TOPIC_ID
HEDERA_NETWORK=testnet
Output:
🔐 Recording proof (backend: hedera)...
✓ Proof recorded
Backend: hedera
ID: 0.0.21598@12345
Link: https://hashscan.io/testnet/transaction/0.0.21598@12345
Add @intent comments to your schemas to track semantic meaning:
/**
* @intent Represents a user in the system with authentication details
*/
export interface UserDto {
id: string;
email: string;
/**
* @intent Must be hashed with bcrypt before storage
*/
password: string;
}
dotto will flag changes to @intent comments even if types haven't changed, helping catch semantic drift.
graph.json - Incremental dependency graph with file hashesgraph.html - Static visualization (when using dotto graph)dotto/
├── src/
│ ├── core/
│ │ └── types.ts # Core type definitions
│ ├── cli/
│ │ ├── index.ts # CLI entry point
│ │ └── commands.ts # Command implementations
│ ├── graph/
│ │ └── GraphEngine.ts # Incremental graph with diff detection
│ ├── scanner/
│ │ ├── Crawler.ts # Orchestrates scanning
│ │ ├── TypeScriptScanner.ts
│ │ └── OpenAPIScanner.ts
│ ├── analysis/
│ │ ├── ImpactAnalyzer.ts # BFS downstream analysis
│ │ ├── ProvenanceAnalyzer.ts
│ │ └── CompatibilityChecker.ts
│ ├── proof/ # Pluggable proof backends
│ │ ├── ProofBackend.ts # Interface
│ │ ├── NoneBackend.ts # Default (no-op)
│ │ ├── GitBackend.ts # Git commits/tags
│ │ ├── HederaBackend.ts # HCS testnet
│ │ └── SigstoreBackend.ts # Cryptographic signing
│ └── ui/
│ └── GraphGenerator.ts # Static HTML generator
└── examples/ # Sample schemas
The architecture is designed for enterprise extension:
ProofBackend implementationsdotto check in CI to catch breaking changesdotto impact to understand change scope# Developer makes a change to UserDto
git checkout -b feature/add-user-field
# Check impact before committing
dotto crawl --diff
dotto impact examples/user.dto.ts:UserDto
# See 15 downstream services affected
# Coordinate with those teams
# Record proof of change (optional)
dotto proof examples/user.dto.ts:UserDto --proof hedera
# Generate report for stakeholders
dotto graph -o user-dto-impact.html
Tested on MacBook Pro M1, Node 20:
| Operation | Files | Time | Notes |
|---|---|---|---|
| Full crawl | 100 | 180ms | TypeScript + OpenAPI |
| Full crawl | 1000 | 1.8s | Meets <2s target |
| Incremental | 20 changed | 420ms | Meets <500ms target |
| Impact analysis | depth=3 | 15ms | BFS traversal |
| Graph generation | 500 nodes | 95ms | Static HTML |
npm install -g @natalietdg/dotto
Then use globally:
dotto init
dotto crawl
dotto impact <NODE_ID>
Or use locally in your project:
npm install --save-dev @natalietdg/dotto
npx dotto init
dotto v1.1 is production-ready for core workflows. Future enhancements:
MIT
FAQs
Data Object Trace & Transparency Orchestrator - Enterprise-grade schema dependency analysis with optional proof backends
We found that @natalietdg/dotto demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
The Axios compromise shows how time-dependent dependency resolution makes exposure harder to detect and contain.

Research
A supply chain attack on Axios introduced a malicious dependency, plain-crypto-js@4.2.1, published minutes earlier and absent from the project’s GitHub releases.

Research
Malicious versions of the Telnyx Python SDK on PyPI delivered credential-stealing malware via a multi-stage supply chain attack.