How toBuild an app with Remix and Bun

There are two ways to use Bun together with Remix, first is to use it only to install dependencies, the second is to use it as the JS runtime of the server.

Use Bun to install dependencies

The first is quite simple, after you have Bun installed you can run the following script:

bun install

This will create a bun.lockb file, you can then remove the package-lock.json or yarn.lock or whatever lock file you had before. From that point you can use bun add, bun rm and bun install to work with your dependencies.

Remember to update your deployment configuration to now use Bun too, this depends on the platform you're using.

Use Bun as JS runtime

This requires a bit more work, first we need to install Bun TS definitions.

bun add @types/bun

Now TS will know that Bun is a global object with multiple things available.

The next thing is to change the HTTP server we use, we can use the built-in HTTP server that Bun comes with:

server.ts
import type { ServerBuild } from "@remix-run/server-runtime"; import { createRequestHandler, logDevReady } from "@remix-run/server-runtime"; import { resolve } from "node:path"; import * as build from "./build/index"; import { type Serve } from "bun"; if (Bun.env.NODE_ENV === "development") { logDevReady(build as unknown as ServerBuild); } const remix = createRequestHandler( build as unknown as ServerBuild, Bun.env.NODE_ENV ); export default { port: Bun.env.PORT || 3000, async fetch(request) { // First we need to send handle static files let { pathname } = new URL(request.url); let file = Bun.file(resolve(__dirname, "../public/", `.${pathname}`)); if (await file.exists()) return new Response(file); // Only if a file doesn't exists we send the request to the Remix request handler return remix(request); }, } satisfies Serve;

Now, we have to update our package.json to run this server, for this we need these scripts.

package.json
"build": "remix build", "dev": "remix dev -c \"bun run start\"", "start": "bun run server.ts"

If we run bun run dev or bun run build && bun start we will be running our application using Bun.

Note that the build process nd remix dev will still run using Node.js, it's not yet possible to use Bun for that, but even in dev the actual process of our app will use Bun.

And since we're using Bun we can also leverage other features of Bun, like the built-in SQLite database driver.

app/db.server.ts
import { Database } from "bun:sqlite"; export const db = new Database(":memory:");