Crust – A CLI framework for TypeScript and Bun

We've been building Crust (https://crustjs.com/), a TypeScript-first, Bun-native CLI framework with zero dependencies. It's been powering our core product internally for a while, and we're now open-sourcing it.The problem we kept running into: existing CLI frameworks in the JS ecosystem are either minimal arg parsers where you wire everything yourself, or heavyweight frameworks with large dependency trees and Node-era assumptions. We wanted something in between.What Crust does differently:- Full type inference from definitions — args and flags are inferred automatically. No manual type annotations, no generics to wrangle. You define a flag as type: "string" and it flows through to your handler.- Compile-time validation — catches flag alias collisions and variadic arg mistakes before your code runs, not at runtime.- Zero runtime dependencies — @crustjs/core is ~3.6kB gzipped (21kB install). For comparison: yargs is 509kB, oclif is 411kB.- Composable modules — core, plugins, prompts, styling, validation, and build tooling are all separate packages. Install only what you need.- Plugin system — middleware-based with lifecycle hooks (preRun/postRun). Official plugins for help, version, and shell autocompletion.- Built for Bun — no Node compatibility layers, no legacy baggage.Quick example: import { Crust } from "@crustjs/core"; import { helpPlugin, versionPlugin } from "@crustjs/plugins"; const main = new Crust("greet") .args([{ name: "name", type: "string", default: "world" }]) .flags({ shout: { type: "boolean", short: "s" } }) .use(helpPlugin()) .use(versionPlugin("1.0.0")) .run(({ args, flags }) => { const msg = `Hello, ${args.name}!`; console.log(flags.shout ? msg.toUpperCase() : msg); }); await main.execute(); Scaffold a new project: bun create crust my-cli Site: https://crustjs.com GitHub: https://github.com/chenxin-yan/crustjsHappy to answer any questions about the design decisions or internals. Comments URL: https://news.ycombinator.com/item?id=47408727 Points: 23 # Comments: 12

Crust – A CLI framework for TypeScript and Bun
Crust – A CLI framework for TypeScript and Bun Photo: Hacker News

We've been building Crust (https://crustjs.com/), a TypeScript-first, Bun-native CLI framework with zero dependencies.

It's been powering our core product internally for a while, and we're now open-sourcing it.

The problem we kept running into: existing CLI frameworks in the JS ecosystem are either minimal arg parsers where you wire everything yourself, or heavyweight frameworks with large dependency trees and Node-era assumptions.

We wanted something in between.

What Crust does differently:
- Full type inference from definitions — args and flags are inferred automatically.

No manual type annotations, no generics to wrangle.

You define a flag as type: "string" and it flows through to your handler.

- Compile-time validation — catches flag alias collisions and variadic arg mistakes before your code runs, not at runtime.

- Zero runtime dependencies — @crustjs/core is ~3.6kB gzipped (21kB install).

For comparison: yargs is 509kB, oclif is 411kB.

- Composable modules — core, plugins, prompts, styling, validation, and build tooling are all separate packages.

Install only what you need.

- Plugin system — middleware-based with lifecycle hooks (preRun/postRun).

Official plugins for help, version, and shell autocompletion.

- Built for Bun — no Node compatibility layers, no legacy baggage.

Quick example:
import { Crust } from "@crustjs/core";
import { helpPlugin, versionPlugin } from "@crustjs/plugins";
const main = new Crust("greet")
.args([{ name: "name", type: "string", default: "world" }])
.flags({ shout: { type: "boolean", short: "s" } })
.use(helpPlugin())
.use(versionPlugin("1.0.0"))
.run(({ args, flags }) => {
const msg = `Hello, ${args.name}!`;
console.log(flags.shout ?

msg.toUpperCase() : msg);
});
await main.execute();

Scaffold a new project:
bun create crust my-cli

Site: https://crustjs.com
GitHub: https://github.com/chenxin-yan/crustjs
Happy to answer any questions about the design decisions or internals.

Source: This article was originally published by Hacker News

Read Full Original Article →

Share this article

Comments (0)

No comments yet. Be the first to comment!

Leave a Comment

Maximum 2000 characters