<p>Here's a release note that sounds like nothing and means a lot: <strong>Elyra now builds on TypeScript 7.0.</strong> No new commands, no new models, no user-facing anything. Just the compiler underneath everything got replaced — and the story of how uneventful that was is actually the interesting part.</p><h2>Why TypeScript 7.0 matters</h2><p>For over a decade, TypeScript's compiler (<code>tsc</code>) was itself written in TypeScript, running on Node. It was correct and beloved, but on large codebases it got slow — type-checking a big monorepo could take minutes, and the editor could lag behind your keystrokes.</p><p>TypeScript 7.0 is a <strong>native port of the compiler, rewritten in Go</strong>. Same language, same type system, same behavior — but native code speed and real multithreading. Microsoft's numbers on real projects:</p><p>Codebase TS 6 TS 7 Speedup vscode 125.7s 10.6s ~12x sentry 139.8s 15.7s ~9x playwright 12.8s 1.47s ~9x</p><p>And it's not just full builds — the editor experience (find-references, autocomplete, red squiggles) drops from seconds to fractions of a second. For a project like Elyra with many packages, that's the difference between "type-check runs in CI while I get coffee" and "type-check finished before I looked up."</p><p>That's the <em>why</em>: faster feedback loops, everywhere, for free.</p><h2>How the upgrade actually went</h2><p>Here's the part I want to be honest about, because it's the most useful lesson: <strong>the upgrade was nearly a no-op, and that's not luck — it's the payoff of prior groundwork.</strong></p><h3>We were already halfway there</h3><p>Elyra had been using the native compiler in preview form (<code>tsgo</code>, via <code>@typescript/native-preview</code>) for the root type-check and all package builds. So the "scary" part — does our code even pass the native checker? — had effectively been answered for months. TypeScript 7.0 stable is just that compiler, finished.</p><h3>The migration, in one line</h3><p>The entire code change was bumping one dependency across the workspace:</p><pre><code class="language-diff">-  "typescript": "^6.0.3"
+  "typescript": "^7.0.2"
</code></pre><p>That's it. Five <code>package.json</code> files, one version string each. No source changes. No <code>tsconfig</code> changes.</p><h3>Why nothing broke: the config was already clean</h3><p>TypeScript 7.0 turns a bunch of old, deprecated settings into hard errors — <code>baseUrl</code>, <code>moduleResolution: node/classic</code>, <code>target: es5</code>, <code>module: amd/umd</code>, and so on. This is where many projects stumble. Ours didn't, because <code>tsconfig.base.json</code> was already modern:</p><pre><code class="language-jsonc">{
  "compilerOptions": {
    "target": "ES2024",
    "module": "Node16",
    "moduleResolution": "Node16",   // not the removed "node"/"classic"
    "strict": true,
    "esModuleInterop": true,        // 7.0 requires this stays true
    "types": ["node"]               // 7.0 defaults to [] — we were explicit
    // no baseUrl, no es5, no amd/umd
  }
}
</code></pre><p>Every one of 7.0's new hard errors is something we'd already avoided. The upgrade found nothing to complain about.</p><h3>The one snag (and why I'm telling you about it)</h3><p>The upgrade itself was clean, but the <em>release</em> hit a small bump that's worth sharing, because it's a great illustration of a coverage gap rather than a TypeScript problem.</p><p>Our <code>npm run check</code> type-checks the core and the UI packages — but not the SDK examples. One example still referenced a model that had been removed from the registry in an earlier data refresh:</p><pre><code class="language-ts">// examples/sdk/12-full-control.ts
const model = getModel("anthropic", "claude-sonnet-4-20250514"); // ← gone
</code></pre><p>Because <code>getModel</code>'s second argument is strictly typed to real model IDs, this is a compile error — but only the <em>publish</em> build compiles the examples, so it sailed past <code>check</code> and surfaced at release time. The fix was a one-liner:</p><pre><code class="language-ts">const model = getModel("anthropic", "claude-sonnet-5"); // current default
</code></pre><p>The lesson isn't "TypeScript 7 is risky." It's the opposite: a strict type system caught a stale reference that a looser setup would have let ship as a runtime crash. The real bug was our <code>check</code> not covering examples — now on our list to fix so it's caught before publish, not during.</p><h2>What you get</h2><p>If you use Elyra, you don't need to do anything — this is entirely under the hood. If you <em>develop</em> on Elyra or build extensions against its packages, your type-checks and editor now run on the native compiler, and you're on the same stable toolchain as everyone else. No version skew, no nightly-preview surprises.</p><pre><code class="language-bash">npm install -g @elyracode/coding-agent@0.9.13
</code></pre><h2>The takeaway</h2><p>The best infrastructure upgrades are the ones you barely feel. TypeScript 7.0 gave us an order-of-magnitude faster compiler, and because we'd kept our config clean and had been dogfooding the native preview, adopting the stable release cost us a single version bump. The only excitement was a stale model ID in an example — caught, fittingly, by the very type system we were upgrading.</p><p>Sometimes "almost boring" is exactly what a release should be.</p>