<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Hacker News: colinmcd</title><link>https://news.ycombinator.com/user?id=colinmcd</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Thu, 25 Jun 2026 01:45:09 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=colinmcd" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by colinmcd in "Show HN: Nub – A Bun-like all-in-one toolkit for Node.js"]]></title><description><![CDATA[
<p>Indeed, Nub intentionally introduces no Nub-specific APIs: no Nub global, no nub: prefixed built-in modules, no Nub-named config file / lockfile, no "nub" field in package.json, not even any NUB_ environment variables. Most of the stuff Bun added is better as a proper dependency imo.</p>
]]></description><pubDate>Wed, 24 Jun 2026 22:40:27 +0000</pubDate><link>https://news.ycombinator.com/item?id=48666446</link><dc:creator>colinmcd</dc:creator><comments>https://news.ycombinator.com/item?id=48666446</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48666446</guid></item><item><title><![CDATA[New comment by colinmcd in "Show HN: Nub – A Bun-like all-in-one toolkit for Node.js"]]></title><description><![CDATA[
<p>Certainly. We're using subtrees now instead of submodules, lets avoids some tricky worktree/submodule interactions during local dev.<p>We've already pulled changes since that PR landed.<p><a href="https://github.com/nubjs/nub/commit/b4abee87" rel="nofollow">https://github.com/nubjs/nub/commit/b4abee87</a></p>
]]></description><pubDate>Wed, 24 Jun 2026 19:31:05 +0000</pubDate><link>https://news.ycombinator.com/item?id=48664641</link><dc:creator>colinmcd</dc:creator><comments>https://news.ycombinator.com/item?id=48664641</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48664641</guid></item><item><title><![CDATA[New comment by colinmcd in "Show HN: Nub – A Bun-like all-in-one toolkit for Node.js"]]></title><description><![CDATA[
<p>EDIT: Sorry, I understand you're talking about package.json. Would be fun to try to get the Node & package mgmt teams aligned to add support for comments in the package.json. Bun tried and failed to do this (requires ecosystem coordination).<p>Nub could absolutely support a config file and use it to set NODE_OPTIONS or flags in the node child process. There's no reason to throw out the baby with the bathwater due to DX concerns like this. That's a key part of the concept Nub is trying to prove. (To be clear I'm quite content to conform to Node's no-config-file policy at the moment.)</p>
]]></description><pubDate>Wed, 24 Jun 2026 19:23:44 +0000</pubDate><link>https://news.ycombinator.com/item?id=48664558</link><dc:creator>colinmcd</dc:creator><comments>https://news.ycombinator.com/item?id=48664558</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48664558</guid></item><item><title><![CDATA[New comment by colinmcd in "Show HN: Nub – A Bun-like all-in-one toolkit for Node.js"]]></title><description><![CDATA[
<p>I almost called it "oi" but I'm not sure anyone would have gotten the joke :P</p>
]]></description><pubDate>Wed, 24 Jun 2026 18:52:31 +0000</pubDate><link>https://news.ycombinator.com/item?id=48664172</link><dc:creator>colinmcd</dc:creator><comments>https://news.ycombinator.com/item?id=48664172</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48664172</guid></item><item><title><![CDATA[New comment by colinmcd in "Show HN: Nub – A Bun-like all-in-one toolkit for Node.js"]]></title><description><![CDATA[
<p>Right now, you should use Nub on the backend if you are relying on its augmentations. If you specifically want to disable Nub's augmentations (so you have a guarantee that your app/script will "just work" with regular Node, there's a couple ways to disable it.<p><pre><code>  NODE_COMPAT=0 nub index.ts
  nub --node index.ts

</code></pre>
I'll investigate a `nub build` that would do the transpilation upfront and properly chunk/bundle a prod build. It's a good idea. But yes, Nub's overhead (both time and space) is generally negligible relative to Node itself.<p>Re: added attack surface: the most obvious one is that Nub loads .env files (same as Bun/Next/Vite) so be aware of that. All of Node's permission flags are passed through as well. I won't claim there's no additional attack surface, but it doesn't have much surface area, just a Rust wrapper that spawns `node` ultimately.</p>
]]></description><pubDate>Wed, 24 Jun 2026 18:46:52 +0000</pubDate><link>https://news.ycombinator.com/item?id=48664127</link><dc:creator>colinmcd</dc:creator><comments>https://news.ycombinator.com/item?id=48664127</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48664127</guid></item><item><title><![CDATA[New comment by colinmcd in "Show HN: Nub – A Bun-like all-in-one toolkit for Node.js"]]></title><description><![CDATA[
<p>We use this to register our preload purely for performance reasons. In this and many other cases CommonJS is still faster than ESM. Using --require is about 0.5ms overhead vs 4.6ms for --import (on my M1 Macbook Pro).<p>Relatedly Node.js recently (2025) introduced a synchronous version of its resolver hook registration API (`module.registerHooks()`) specifically to improve performance over the old async `module.register()` API. It was a big unblocker for Nub. For the interested, the async API added 19ms fixed registration overhead + about 130us additional overhead per import.<p>Which flag Nub uses here doesn't impact userland at all, TLA is supported wherever it's supported by Node.js itself.</p>
]]></description><pubDate>Wed, 24 Jun 2026 17:39:43 +0000</pubDate><link>https://news.ycombinator.com/item?id=48663218</link><dc:creator>colinmcd</dc:creator><comments>https://news.ycombinator.com/item?id=48663218</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48663218</guid></item><item><title><![CDATA[New comment by colinmcd in "Show HN: Nub – A Bun-like all-in-one toolkit for Node.js"]]></title><description><![CDATA[
<p>It entered public beta last week, but just getting on HN now.</p>
]]></description><pubDate>Wed, 24 Jun 2026 16:39:45 +0000</pubDate><link>https://news.ycombinator.com/item?id=48662444</link><dc:creator>colinmcd</dc:creator><comments>https://news.ycombinator.com/item?id=48662444</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48662444</guid></item><item><title><![CDATA[New comment by colinmcd in "Show HN: Nub – A Bun-like all-in-one toolkit for Node.js"]]></title><description><![CDATA[
<p>Coming very soon!</p>
]]></description><pubDate>Wed, 24 Jun 2026 16:38:49 +0000</pubDate><link>https://news.ycombinator.com/item?id=48662432</link><dc:creator>colinmcd</dc:creator><comments>https://news.ycombinator.com/item?id=48662432</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48662432</guid></item><item><title><![CDATA[New comment by colinmcd in "Show HN: Nub – A Bun-like all-in-one toolkit for Node.js"]]></title><description><![CDATA[
<p>Thanks :) Highly recommend clicking the link too!</p>
]]></description><pubDate>Wed, 24 Jun 2026 15:26:22 +0000</pubDate><link>https://news.ycombinator.com/item?id=48661393</link><dc:creator>colinmcd</dc:creator><comments>https://news.ycombinator.com/item?id=48661393</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48661393</guid></item><item><title><![CDATA[New comment by colinmcd in "Show HN: Nub – A Bun-like all-in-one toolkit for Node.js"]]></title><description><![CDATA[
<p>Yep, full support on macOS, Linux, Windows. No official image yet (I'll start on this now) but you can get started with something like this.<p><pre><code>  FROM node:26-slim
  RUN npm i -g @nubjs/nub
</code></pre>
Works with any Node version down to 18.19 but recommend 22.15+ for best performance (that's when synchronous registerHooks was introduced[0])<p>[0] <a href="https://nodejs.org/api/module.html#moduleregisterhooksoptions" rel="nofollow">https://nodejs.org/api/module.html#moduleregisterhooksoption...</a></p>
]]></description><pubDate>Wed, 24 Jun 2026 15:25:50 +0000</pubDate><link>https://news.ycombinator.com/item?id=48661387</link><dc:creator>colinmcd</dc:creator><comments>https://news.ycombinator.com/item?id=48661387</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48661387</guid></item><item><title><![CDATA[New comment by colinmcd in "Show HN: Nub – A Bun-like all-in-one toolkit for Node.js"]]></title><description><![CDATA[
<p>Cloudflare Workers is a different runtime and has its own toolchain around it. Nub could theoretically support it when executing files (spawn `wrangler dev` instead of `node` if wrangler.toml is detected or something) but really I'm focused on making the Node.js experience as good as possible.<p>The other pieces of the toolkit could absolutely be used: package manager, script runner, package runner. Works with anything that implements the Node module resolution algorithm (actually Yarn PnP also works out of the box...).</p>
]]></description><pubDate>Wed, 24 Jun 2026 15:17:40 +0000</pubDate><link>https://news.ycombinator.com/item?id=48661271</link><dc:creator>colinmcd</dc:creator><comments>https://news.ycombinator.com/item?id=48661271</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48661271</guid></item><item><title><![CDATA[Show HN: Nub – A Bun-like all-in-one toolkit for Node.js]]></title><description><![CDATA[
<p>Colin here, creator of Nub. I’ve had the general shape of this in mind for years. Nub runs your code with stock `node`, augmented with a `--require` preload hook[0] that adds a transpiler (oxc-powered, packaged as a Node-API add-on), registers a module resolution hook[1], and injects polyfills as needed for APIs like `Worker`, `Temporal`, etc. All purely additive, your code ultimately runs using Node’s actual engine & stdlib implementations.<p>[0] <a href="https://nodejs.org/api/cli.html#-require-module" rel="nofollow">https://nodejs.org/api/cli.html#-require-module</a><p>[1] <a href="https://nodejs.org/api/module.html#moduleregisterhooksoptions" rel="nofollow">https://nodejs.org/api/module.html#moduleregisterhooksoption...</a></p>
<hr>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=48660267">https://news.ycombinator.com/item?id=48660267</a></p>
<p>Points: 200</p>
<p># Comments: 57</p>
]]></description><pubDate>Wed, 24 Jun 2026 14:14:18 +0000</pubDate><link>https://github.com/nubjs/nub</link><dc:creator>colinmcd</dc:creator><comments>https://news.ycombinator.com/item?id=48660267</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48660267</guid></item><item><title><![CDATA[Nub – A Bun-like toolkit that extends Node.js instead of trying to replace it]]></title><description><![CDATA[
<p>Article URL: <a href="https://github.com/nubjs/nub">https://github.com/nubjs/nub</a></p>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=48644902">https://news.ycombinator.com/item?id=48644902</a></p>
<p>Points: 3</p>
<p># Comments: 0</p>
]]></description><pubDate>Tue, 23 Jun 2026 13:44:50 +0000</pubDate><link>https://github.com/nubjs/nub</link><dc:creator>colinmcd</dc:creator><comments>https://news.ycombinator.com/item?id=48644902</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48644902</guid></item><item><title><![CDATA[Bolt Cloud]]></title><description><![CDATA[
<p>Article URL: <a href="https://bolt.new/blog/bolt-cloud">https://bolt.new/blog/bolt-cloud</a></p>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=44903330">https://news.ycombinator.com/item?id=44903330</a></p>
<p>Points: 1</p>
<p># Comments: 0</p>
]]></description><pubDate>Thu, 14 Aug 2025 17:38:53 +0000</pubDate><link>https://bolt.new/blog/bolt-cloud</link><dc:creator>colinmcd</dc:creator><comments>https://news.ycombinator.com/item?id=44903330</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44903330</guid></item><item><title><![CDATA[New comment by colinmcd in "Zod 4"]]></title><description><![CDATA[
<p>As you allude to: your aliased "zod-next" dependency wouldn't be able to satisfy the requirements of any packages with a peer dep on Zod. But this approach has a more fundamental flaw. My goal is to let ecosystem libraries support Zod 3 and Zod 4 simultaneously. There's no reliable way to do that if they aren't in the same package.[0]<p>[0] <a href="https://github.com/colinhacks/zod/issues/4371">https://github.com/colinhacks/zod/issues/4371</a></p>
]]></description><pubDate>Tue, 20 May 2025 18:55:50 +0000</pubDate><link>https://news.ycombinator.com/item?id=44044693</link><dc:creator>colinmcd</dc:creator><comments>https://news.ycombinator.com/item?id=44044693</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44044693</guid></item><item><title><![CDATA[New comment by colinmcd in "Zod 4"]]></title><description><![CDATA[
<p>It won't typecheck, which is good in this case, because as you say that's a very bad idea :)</p>
]]></description><pubDate>Tue, 20 May 2025 18:45:48 +0000</pubDate><link>https://news.ycombinator.com/item?id=44044591</link><dc:creator>colinmcd</dc:creator><comments>https://news.ycombinator.com/item?id=44044591</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44044591</guid></item><item><title><![CDATA[New comment by colinmcd in "Zod 4"]]></title><description><![CDATA[
<p>I understand this as a knee-jerk reaction. I didn't do this lightly.<p>> Perhaps publish a 4.x along with the 3.x stuff<p>You have some misconceptions about how npm works. Unfortunately it's less reasonable than you think. There's a single `latest` tag, and there's only one "latest" version at a time. It's expected that successive versions here will follow semver. Once I publish zod@4 I can no longer publish additional zod@3.x.x versions.  The workaround here is to publish v3 versions to a separate dist tag (zod@three) but anyone consuming that dist-tag (e.g. "zod": "three" in their package.json) loses the ability to specify a semver range.<p>I recommend reading the writeup[0]. I don't think you're appreciating the magnitude of the disruption a simple major version bump would have caused, or the reasons why this approach is necessary to unlock continuity for Zod's ecosystem libraries. They're quite subtle.<p>[0] <a href="https://github.com/colinhacks/zod/issues/4371">https://github.com/colinhacks/zod/issues/4371</a></p>
]]></description><pubDate>Tue, 20 May 2025 18:40:14 +0000</pubDate><link>https://news.ycombinator.com/item?id=44044539</link><dc:creator>colinmcd</dc:creator><comments>https://news.ycombinator.com/item?id=44044539</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44044539</guid></item><item><title><![CDATA[New comment by colinmcd in "Zod 4"]]></title><description><![CDATA[
<p>No, that kind of interop, especially static interop (assignability), would've been totally unworkable. Despite the length of the changelog, there are very few breaking changes to the user-facing API surface. It's mostly internal/structural changes and deprecations (most of which can be fixed with a find&replace).<p>Report back about that .d.ts issue. It should be far better. That kind of type explosion usually happens when TypeScript needs to infer function/method return types. Zod 4 uses isolatedDeclarations so this kind of thing shouldn't happen.</p>
]]></description><pubDate>Tue, 20 May 2025 18:32:40 +0000</pubDate><link>https://news.ycombinator.com/item?id=44044474</link><dc:creator>colinmcd</dc:creator><comments>https://news.ycombinator.com/item?id=44044474</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44044474</guid></item><item><title><![CDATA[New comment by colinmcd in "Zod 4"]]></title><description><![CDATA[
<p>Yes! Zod now differentiates between `z.string().optional()` and `z.union([z.string(), z.undefined()])` (as in TypeScript itself). Details: <a href="https://x.com/colinhacks/status/1919291504587137496" rel="nofollow">https://x.com/colinhacks/status/1919291504587137496</a></p>
]]></description><pubDate>Tue, 20 May 2025 07:26:50 +0000</pubDate><link>https://news.ycombinator.com/item?id=44038742</link><dc:creator>colinmcd</dc:creator><comments>https://news.ycombinator.com/item?id=44038742</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44038742</guid></item><item><title><![CDATA[New comment by colinmcd in "Zod 4"]]></title><description><![CDATA[
<p>Yep, at some indeterminate point when I gauge that there's sufficient support for Zod 4 in the ecosystem, I'll publish `zod@4.0.0` to npm. This is detailed in the writeup[0]<p>[0] <a href="https://github.com/colinhacks/zod/issues/4371">https://github.com/colinhacks/zod/issues/4371</a></p>
]]></description><pubDate>Tue, 20 May 2025 07:24:38 +0000</pubDate><link>https://news.ycombinator.com/item?id=44038727</link><dc:creator>colinmcd</dc:creator><comments>https://news.ycombinator.com/item?id=44038727</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44038727</guid></item></channel></rss>