17 comments

  • pier25 11 minutes ago
    Very cool idea which makes a lot of sense. Bun provides more (eg db drivers) but the DX is certainly a big part of its appeal.

    For reference, the main author of Nub is Colin McDonnell who created Zod and even worked at Bun at some point.

  • eyelidlessness 5 hours ago
    I’m surprised to see this using a `--require` hook (rather than `--import`). Maybe something’s changed significantly since I was looking into building some similar functionality… but it makes me wonder about nuances in nub’s ESM support.

    (When I was investigating this it was very early in Node’s `--import` story, but there were several edge cases with the more common ESM-to-CJS approaches that I wanted to address. Most were probably exceedingly niche concerns, but I’d expect top-level await to affect a meaningful subset of users.)

    • colinmcd 4 hours ago
      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).

      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.

      Which flag Nub uses here doesn't impact userland at all, TLA is supported wherever it's supported by Node.js itself.

      • eyelidlessness 3 hours ago
        Thanks! From what you say here and what I see in the docs, it looks like everything is much simpler and more robust than when I was exploring the space. I’m happy to see that, and thrilled it’s mature enough now to support use cases like nub.
  • haburka 2 hours ago
    I actually really like this! Great choices all around.
  • ssalbdivad 7 hours ago
    Just merged a PR migrating our entire monorepo to nub.

    0 issues, ridiculously fast.

    • daavin 7 hours ago
      You merged a PR migrating a shared monorepo using this within an hour of it being posted?
      • colinmcd 5 hours ago
        It entered public beta last week, but just getting on HN now.
        • phpnode 58 minutes ago
          Also, ssalbdivad is your cofounder, just in case you’d forgotten!
  • ivanjermakov 6 hours ago
    Respect for embracing existing tech instead of rewriting a worse version of it. Wonder where we would be today if all alternative-building effort went to Node instead (with proper leadership).
    • johnfn 5 hours ago
      You might remember the io.js fork of Node.js back in 2014. Node was stagnating, a bunch of people forked it into io.js, which eventually got merged back into Node and got it back on track. Or, going further back, CoffeeScript, a "fork" of JS that had its best ideas adopted back into ES5.

      A small scrappy team can prove out a good idea because failure is not a catastrophic risk to them. In short, forks are part of a healthy ecosystem.

      • colinmcd 3 hours ago
        I almost called it "oi" but I'm not sure anyone would have gotten the joke :P
      • hootz 4 hours ago
        It is still happening, a lot of things are still being adopted by Node after being available on other runtimes. They aren't forks, but they still provide pressure towards progress.
      • psygn89 3 hours ago
        Beautifully stated reminder :)
    • hungryhobbit 5 hours ago
      Fundamentally you can't fix a lot of things with this approach.

      Simple example: Node is the only serious OSS software I know of that has no way to document its config (in the config file itself). It's moronic! The Node people just adopted JSON without a thought, and then refused to consider any alternatives (even "JSON with comments").

      When an organization digs into bad decisions, the only way to fix them is to start something new. The entire JS ecosystem will never have documentation on its config as long as everyone keeps building on top of Node.

      (And there are many other issues like this in the Node ecosystem; the utter absurdity of not being able to document config is just my personal pet peeve.)

      • jdxcode 5 minutes ago
        I agree that it sucks not being able to have comments in package.json, but I think it's the right call to not adopt something like jsonc. It would break so much tooling at this point I don't think it would be worth it.
      • afavour 24 minutes ago
        Isn't this a problem contained to npm more than Node itself?

        I'm imagining pnpm or others being able to adopt a package.json file that allows comments, then, when actually publishing, ensuring the published package.json is regular JSON.

      • matt_kantor 1 hour ago
        > Simple example: [package.json is JSON]

        Why can't you fix this while embracing existing tech? I can imagine monkeypatching Node & NPM to add support for JSONC or JSON5 or whatever in the same way that Nub adds various features via monkeypatching. Is there some architectural reason that can't work?

        You'd need `npm publish` to compile it down to plain JSON when publishing, but that seems like an okay compromise.

      • colinmcd 3 hours ago
        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).

        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.)

      • johnfn 5 hours ago
        > Simple example: Node is the only serious OSS software I know of that has no way to document its config (in the config file itself). It's moronic! The Node people just adopted JSON without a thought, and then refused to consider any alternatives (even "JSON with comments").

        Tangential but this also drives me absolutely nuts. If I have to see `"//": "some comment"` one more time I'm gonna lose it.

  • jpambrun 3 hours ago
    Am I expected to be able to run this in production on the backend, or do I still need to transpile and bundle? Do we expect the performance and memory overhead to be negligible. What would be the expectations on terms of added attack surface?
    • colinmcd 3 hours ago
      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.

        NODE_COMPAT=0 nub index.ts
        nub --node index.ts
      
      
      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.

      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.

  • gorjusborg 6 hours ago
    Very smart. You can't lose all your customers for vibe-coding a migration to Rust if you are already written in Rust ;)
    • pier25 9 minutes ago
      There's a difference between running your app on a vibe coded runtime or just local DX tools though.
    • coneonthefloor 41 minutes ago
      Yea, not sure what “written in rust” adds to this. I would have thought that you could get the same functionality with a few shell scripts and a package.json.
      • afavour 18 minutes ago
        I assume speed.

        But also, I know “rewrite in Rust” is a meme but if you’re doing something new, why not? I can’t see a good argument that a pile of shell scripts would be a superior way to organise things.

    • Zambyte 6 hours ago
      They'll get bought out by OpenAI and convert the project to Zig
      • airstrike 5 hours ago
        huh, is OpenAI embracing Zig specifically? TIL
        • allthetime 4 hours ago
          It’s a joke about how Anthropic bought bun and then rewrote bun from zig to rust with a giant one week vibe code. The joke hinges on the fact that this would be the opposite (OpenAI, nub, rust to zig)
          • airstrike 4 hours ago
            oh LOL I'm slow today ig
    • maxloh 1 hour ago
      This project is already highly vibe-coded. Claude is the second contributor of the repo.
    • lacoolj 5 hours ago
      It also helps if you're already vibe-coded and don't have customers to begin with
    • skrebbel 5 hours ago
      Bun had customers?
  • skybrian 5 hours ago
    > TypeScript-friendly resolution: extensionless imports, tsconfig.json#paths

    I’m wondering how that works. Deno has very complicated import resolution, so building my own import resolver to be compatible with it is a bit of a pain. (This is for a custom lint-like tool.)

  • awaseem 6 hours ago
    I saw this on twitter and loved it, such a good move on your part Colin. Hope the project picks up tons of steam!
  • kandros 6 hours ago
    Love the idea, learning a lot of interesting things about node hooks by reading docs and some code
  • sgarrity 7 hours ago
    I didn't even click on the link. I just came to give the author a hat-tip on the project name. Well played.
    • colinmcd 6 hours ago
      Thanks :) Highly recommend clicking the link too!
  • bookernath 7 hours ago
    Nice, I think this fills a niche. Does it work on cloudflare workers?
    • colinmcd 7 hours ago
      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.

      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...).

  • montroser 5 hours ago
    Nice. Can we get `nub --compile` up in there like Bun has?
    • colinmcd 5 hours ago
      Coming very soon!
      • allthetime 4 hours ago
        I will seriously consider migrating once this exists! I couldn’t imagine deploying any other way now. I can never go back from SCPing a single binary to my server and just hitting reset on the service.
  • Onavo 2 hours ago
    There's also the option of using Jiti

    https://github.com/unjs/jiti

    It would add an extra dependency though

  • esafak 3 hours ago
    Will you be able to integrate aube updates after vendoring it? https://github.com/nubjs/nub/pull/81
  • GL26 7 hours ago
    nice ! does this work on docker containers ?
    • colinmcd 6 hours ago
      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.

        FROM node:26-slim
        RUN npm i -g @nubjs/nub
      
      Works with any Node version down to 18.19 but recommend 22.15+ for best performance (that's when synchronous registerHooks was introduced[0])

      [0] https://nodejs.org/api/module.html#moduleregisterhooksoption...