Default to using Bun instead of Node.js. - Use `bun ` instead of `node ` or `ts-node ` - Use `bun test` instead of `jest` or `vitest` - Use `bun build ` instead of `webpack` or `esbuild` - Use `bun install` instead of `npm install` or `yarn install` or `pnpm install` - Use `bun run ``` With the following `frontend.tsx`: ```tsx#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

Hello, world!

; } root.render(); ``` Then, run index.ts ```sh bun --hot ./index.ts ``` For more information, read the Bun API docs in `node_modules/bun-types/docs/**.mdx`. ## Project invariants (Budget 2.0) - `src/domain/` is pure: no React, no IndexedDB, no `Date.now()`, no `new Date()` without an explicit argument. It must be testable with no DOM. - Money is a float. Always round with `roundMoney` from `src/domain/money.ts` after any division, after any FX conversion, and before persisting. - When splitting an amount, never round the last part independently. Compute it as `total - sum(others)` so the parts sum exactly to the whole. - `MonthId` is the string `"YYYY-MM"`. Stored data never contains `Date` objects. - The envelope rollover fold has exactly one implementation, in `src/domain/fold.ts`. Year and summary views aggregate over it — they never reimplement the math. - Over-budget is always allowed. Never add validation that blocks it. - Base path comes from `BUN_PUBLIC_BASE_PATH`; never hardcode a subpath. - Read the spec at `docs/superpowers/specs/2026-09-01-budget-app-design.md`.