This page is also available in Italiano.

Continua in italiano

Blog

Engineering notes on how TinyDI was actually designed and built — real trade-offs, real dead ends, no marketing.

July 25, 2026

What the release plan couldn't predict: publishing for real

The npm package name getting blocked at the actual publish moment, the OTP/CI standoff that followed, and a handful of docs-app bugs only production traffic (or a real browser) revealed.

July 24, 2026

Why no reflect-metadata

The "explicit over magic" call behind TinyDI: what reflection-based DI buys you, what it costs, and why we wired dependencies by hand instead.

July 24, 2026

Designing type-safe tokens without explicit generics

How createToken lets container.resolve(token) infer the exact service type, using a phantom type that never exists at runtime.

July 24, 2026

Detecting circular dependencies

How TinyDI catches A -> B -> C -> A at resolution time with a simple resolution-path stack, and why the error message format was designed the way it is.

July 24, 2026

An error hierarchy, instead of throw new Error(...)

Why TinyDI has ContainerError, RegistrationError, ResolutionError and CircularDependencyError instead of one generic error type, and what that decision actually implied.

July 24, 2026

What we haven't built yet (and why)

Scoped lifetimes, child containers, async resolution and plugins are not in TinyDI today — a deliberate minimalism, not an oversight, and what it would take to add each one.

July 24, 2026

Building a documentation site without a framework

Why this site is a hand-written Node static-site generator instead of 11ty/Astro/Next, and three real bugs that only showed up in an actual browser.

July 24, 2026

Preparing TinyDI for npm: package.json, the exports map, and tree-shaking

What actually publishing a zero-dependency ESM/CJS library involves: a dual-package build with tsup, a double-condition exports map, and a build-tool quirk that wasn’t ours to fix.

to navigate to select Esc to close