APIs
description: Use Bun instead of Node.js, npm, pnpm, or vite. globs: ".ts, .tsx, .html, .css, .js, .jsx, package.json" alwaysApply: false
Default to using Bun instead of Node.js.
Use
bun <file>instead ofnode <file>orts-node <file>Use
bun testinstead ofjestorvitestUse
bun build <file.html|file.ts|file.css>instead ofwebpackoresbuildUse
bun installinstead ofnpm installoryarn installorpnpm installUse
bun run <script>instead ofnpm run <script>oryarn run <script>orpnpm run <script>Use
bunx <package> <command>instead ofnpx <package> <command>Bun automatically loads .env, so don't use dotenv.
APIs
Bun.serve()supports WebSockets, HTTPS, and routes. Don't useexpress.bun:sqlitefor SQLite. Don't usebetter-sqlite3.Bun.redisfor Redis. Don't useioredis.Bun.sqlfor Postgres. Don't usepgorpostgres.js.WebSocketis built-in. Don't usews.Prefer
Bun.fileovernode:fs's readFile/writeFileBun.$
lsinstead of execa.
Testing
Use bun test to run tests.
import { test, expect } from "bun:test";
test("hello world", () => {
expect(1).toBe(1);
});Frontend
Use HTML imports with Bun.serve(). Don't use vite. HTML imports fully support React, CSS, Tailwind.
Server:
import index from "./index.html"
Bun.serve({
routes: {
"/": index,
"/api/users/:id": {
GET: (req) => {
return new Response(JSON.stringify({ id: req.params.id }));
},
},
},
// optional websocket support
websocket: {
open: (ws) => {
ws.send("Hello, world!");
},
message: (ws, message) => {
ws.send(message);
},
close: (ws) => {
// handle close
}
},
development: {
hmr: true,
console: true,
}
})HTML files can import .tsx, .jsx or .js files directly and Bun's bundler will transpile & bundle automatically. <link> tags can point to stylesheets and Bun's CSS bundler will bundle.
<html>
<body>
<h1>Hello, world!</h1>
<script type="module" src="./frontend.tsx"></script>
</body>
</html>With the following frontend.tsx:
import React from "react";
import { createRoot } from "react-dom/client";
// import .css files directly and it works
import './index.css';
const root = createRoot(document.body);
export default function Frontend() {
return <h1>Hello, world!</h1>;
}
root.render(<Frontend />);Then, run index.ts
bun --hot ./index.tsFor more information, read the Bun API docs in node_modules/bun-types/docs/**.mdx.
The core message (do not break this)
The demo exists to support this tweet. Every design or strategy change must keep all four claims true:
I built a trading bot with Jev!
Jev decides if it should "buy" or "sell", given the price feed of an asset pair, and executes real trades.
It uses Monad to place the orders on Kuru's on-chain order book in every 300ms block.
Demo link: https://jev-trader.vercel.app
Non-negotiables: Jev makes the buy/sell call (not code), from the price feed; real trades from a real wallet; an order placed on Kuru's on-chain book every 300 ms block; the demo is the live dashboard. Never decide every N blocks. No middle dots, em dashes or en dashes in any rendered text. No blinking or pulsing indicators.