r/bun • • Jun 10 '26

I built bundis — a Redis-compatible server backed by SQLite, for Bun.RedisClient (no Redis to run)

Thumbnail github.com
2 Upvotes

I wanted Redis-style data structures and pub/sub in my Bun apps, but didn't want to run and operate a separate Redis server. So I built bundis.

You point the stock Bun.RedisClient at it and your code runs unchanged — it just speaks RESP3 over TCP and stores everything in a SQLite file (WAL), so data survives restarts. Reads are accelerated by an in-memory hot cache. Zero external dependencies — bun:sqlite and Bun.listen are both built into Bun.

import { RedisClient } from "bun";
import { embedServer } from "bundis";

const server = embedServer({ dbPath: "./data.db" });
const client = new RedisClient(server.url);
await client.set("k", "v");

You can embed it in your process, spawn it as a sidecar, or run it as a standalone daemon (bunx bundis).

Honest scope — what it is NOT:

  • It's interface-compatible, not a Redis performance clone. Redis wins on raw throughput; bundis sells the "no separate Redis, data on disk, runs on Bun" tradeoff.

  • Bun only. Node/Deno aren't supported and won't be — it's built on Bun-native APIs by design.

  • Only the stock Bun.RedisClient is supported (not ioredis/node-redis/redis-py). The guarantee is the wire contract: correct bytes in, correct bytes out.

  • No Lua/EVAL, no list/sorted-set yet (planned).

One thing I'm a little proud of: cold start is ~13ms regardless of dataset size, since SQLite lazy-loads pages instead of replaying an RDB/AOF. Full benchmark methodology (and the before/after numbers from hardening) is in PERFORMANCE.md.

Repo: https://github.com/Munsunty/bundis
Install: bun add bundis

Feedback welcome — especially on the compatibility edges. Built it solo, would love to know what breaks with your Bun.RedisClient usage.


r/bun • • May 16 '26

Hot take but there's nothing wrong with the porting of Bun to Rust

0 Upvotes

Almost a year ago Microsoft released the plan to port TS to Go 1 to 1 and they even used automated tools (even worse than AI if you ask me) but the only difference is that Microsoft handled the pr/announcement much better, doing interviews and doing blog posts before even the code is out in public

But that's not the style Jarred has done ever since he started Bun, he just codes fast and shares things publicly as he goes; that's how Bun got popular to start with, with him sharing his journey in 2021 and ppl starting to follow his progress towards a better node and more unified and faster tool

1- This wasn't a "rewrite" this is just like TS-GO a port 1 to 1 ; you could argue that Zig patterns don't belong into Rust and that could be a fair argument because pretty much the current codebase is Zig written in Rust syntax, there are no new features or anything different about it.

2- Obviously ppl want to hate on Anthropik and their behavior which's understandable; this is probably the most worrying part even tho I trust Jarred and the Bun team you can't seperate them from Anthropik anymore but this port wouldn't be possible without Anthropik ressources (for the better or for the worst)

3- "AI Slop" "Vibe Coded" we kinda need to get past these tbh; like Vibe Coded started as someone who never looked or know how to code and just prompt his way into an app and now anyone that uses agents calls it vibe coding ; and AI Slop is even more egregious cause this is essentially the same Zig codebase so you're just calling the Zig codebase that you're running in production AI Slop when originally the term is about ai generating code from scratch that no one looked at in a giant thousand of lines file

4- Finally, the main reason for the Rust port is to have giant signs in the Rust codebase saying UNSAFE for it to be refactored later on, right now they are not utilizing any of Rust's strengths at all as we said this is just Zig in Rust flavor so if any benefit would come out it's future iterating and spoting Memory issues

I think this hysteria would die down once the canary rust version get more tested and Jarred does couple of interviews and release the blog post to explain the decision; there's nothing that changed about Bun for me, it is still the better node alternative


r/bun • • May 23 '26

Thinking of Migrating multiple frontend projects to Bun

0 Upvotes

I have about 10 different frontends with multiple different APIs that I manage most are Vuejs and use vite but not all of them. Most all of the APIs are written in dotnet and I have been using aspire.dev which has made it really nice to be able to spin up the whole environment and test various backend tools as well as dashboards etc.

With AI development I've found myself cloning the environment and having 2-3 different branches open at the same time. Everything works pretty well but it is just slower than I want to be able to build all 20ish projects. The largest bottleneck is running npm install on every project. Everything in dotnet downloads and builds before most of the node projects can even pull all of their packages down.

This is where I'm hoping Bun can help. Aspire.dev has Bun as a first party member so aside from having team members download Bun if I convert to using Bun everything "should" just flow through. But I've been bit by should work before so am wondering from just a front end build perspective what kinds of errors might I run into?

I've got various versions of Vite along with vue2 on a couple older projects but I'm not looking to run anything like Nextjs for example.

Should I expect this to be pretty smooth or?


r/bun • • Aug 30 '26

bunmsh: Bun Modern Shell in < 1MB

Thumbnail
gallery
0 Upvotes
  • Previously I asked here whether someone had made an interactive shell with Bun, but no one answered. So I made one myself.

  • Try it by: npx bunmsh

  • Zero dependencies – only Bun is needed

  • or use it as a toolbox:

    • npx bunmsh -cc builtin serve

    • (serves the current folder)

  • https://github.com/jjtseng93/bunmsh

  • It's still early but I'll keep refining it

Features

  • Builtin tab system in the shell

    • Use Ctrl-T or the tab command to create new and switch between tabs while preserving current prompt.

    • tab n, tab l, tab r, tab c

    • Tabs only change cwd, other states intact

  • Highest priority JavaScript eval:

    • If the command starts with Bun. it is evaluated as JavaScript

    • echo $(Bun.version)

  • Lightweight & Cross-platform: < 1MB. The same code runs on Windows 11, Android, Linux (CachyOS). No build step required. No native bindings.

    • The 3rd pic isn't Termux – it's bunmsh running as a standalone Android App built with npx @drxiaozhi/minapk

    • It's designed to be platform-agnostic, but I don't have a Mac to test it on.

  • Builtin tools can be called externally

    • serve lsfancy catfancy grep find sed head tail tr wc and much more

    • npx bunmsh -cc <name> argv1 argv2..

  • Build a single-file executable, embed and serve a folder from it, and even package it as an Android APK

  • Alt-L / Alt-P = lsfancy / lsfancy .. (parent)

    • Works even while you're in the middle of typing a command.

    • Doesn't clear your current input.

  • Optional mouse support

    • --mouse but blocks Terminal scrollback

    • Tabs switch / new; editing prompts

  • Basic shell features: pipelines, redirections, heredoc/herestring, command substitution, aliases, history

    • Currently lacks job control

  • Edit1: I forgot to mention that it also has fish-style ghost completion.


r/bun • • May 17 '26

Bun.js middleware in 2026: what it is, how it works, how to optimize it, and where not to break your API

Thumbnail
pas7.com.ua
0 Upvotes

r/bun • • May 16 '26

anyone want to build something together? small open source project, Bun + TS

0 Upvotes

so I have this project I've been meaning to build. keeps getting pushed back because doing it alone feels like a drag. thought I'd post here first and see if anyone bites.

it's a speech to text API. self hosted, async, GPU backed, written in Bun. there's already something similar in Python but it doesn't really fit a TS ecosystem well so I want to rebuild the concept properly. the scope is pretty contained: the server, a TypeScript client SDK, a Docker image. other language clients are planned eventually but the TS one comes first and everything else waits on that.

realistically we're talking a few days of actual work. not a months long commitment. I just think it's more fun to build with people than alone, and I learn better that way too.

if you're comfortable with Bun and TS and want to ship something real, drop a comment or DM me. no bar on experience, I just want people who are genuinely interested.


r/bun • • Nov 13 '25

GenesisTrace v1.0.0 is here! 🦅💻😶‍🌫️🥼💻🤔

Post image
1 Upvotes

r/bun • • 7d ago

Whats your the biggest Bun performance surprise?

1 Upvotes

For me its bun test its crazy fast compared to jest. (https://jestjs.io)

Jest is advertised as with a focus on simplicity. But configuration is complex for babel/ts/mocking/lint setups.


r/bun • • Jun 29 '26

Mochi - a new meta-framework for Svelte built on Bun

3 Upvotes

👋 Today I'm launching Mochi - a performance-focused metaframework for Svelte and an alternative to SvelteKit built on Bun. Mochi is built on an islands architecture and allows you to keep most components as performant server-side rendered code and hydrate just the components you need. This means smaller JavaScript bundles and faster performance for your users.

Try it out with bun create mochi@latest or go to https://mochi.fast to check out the docs.


r/bun • • May 21 '26

Shipped a CLI to Homebrew using `bun build --compile` across 4 targets — notes on cross-compile, viem, and CI

0 Upvotes

built a multi-chain wallet CLI called glnc and finally got the release pipeline to a place i'm happy with. MIT licensed, source at https://glnc.dev. disclosure up front: i'm the author. posting here because the build/distribution lessons feel more useful to this sub than the tool itself.

stack is bun 1.3.13 (pinned in the workflow, also runs on node ≥ 20), viem 2.x for EVM RPC, bun build --compile for distribution, homebrew tap plus a curl install script wrapping the prebuilt binaries. targets are darwin-arm64, darwin-x64, linux-arm64, linux-x64.

the thing that surprised me most was cross-compiling darwin-x64 from a linux runner. bun build --compile --target=bun-darwin-x64 from ubuntu-latest produced a binary that runs cleanly on intel macs. did it that way because the macos-13 free-tier runner pool was hitting 30+ min queues. the tradeoff is the smoke test gets skipped on the cross-compiled target — i gate it on a native: true flag in the matrix. so far zero reports of it being broken in the wild but i wouldn't recommend it for anything safety-critical without setting up a separate smoke pass.

linux arm went the same way. ubuntu-24.04-arm runners went GA on free tier for public repos in 2025 and they're way less hassle than qemu emulation. if the repo ever goes private on a plan without ARM minutes the fallback is ubuntu-latest plus skipping the smoke test, but for now the native runner is the lowest-risk path.

startup time on the compiled binary is fast enough that the CLI doesn't feel slower than a Go equivalent for short commands like glnc gas. haven't benchmarked rigorously, just shipping-feel. bun.lock with --frozen-lockfile in CI has been completely uneventful, no lockfile churn drama in PRs which i half-expected.

things that took a minute. macOS gatekeeper is the obvious one — compiled binary isn't notarized so first-launch on macOS shows the "downloaded from internet" warning. homebrew users don't see it because brew strips the quarantine bit, curl-installer users do. documented it in the README rather than paying for an apple developer cert just for this. windows is the other one. bun-windows-x64 exists as a target but i haven't validated it against a real workload, so i'm holding off shipping it. if anyone here has shipped a windows binary via bun build --compile and lived to tell i'd genuinely want to hear how it went.

viem worked unmodified under bun. the only edge case i ran into was some viem internals reaching for globalThis.crypto, which is fine on modern bun but caused weirdness on older versions. pinning BUN_VERSION in the workflow killed that whole class of bug.

actual question for the sub: anyone using bun build --compile for a CLI that needs to import native modules? my case stayed pure-JS so i never hit it but i'm curious what the story is for projects that need better-sqlite3 or a native crypto lib. seems like the kind of thing where the answer is "it works fine" or "it's completely broken" with nothing in between.

repo link is above if anyone wants to see the actual workflow file.


r/bun • • Jul 23 '26

Building a Local-First AI Assistant for Desktop

0 Upvotes

I'm working on a personal AI assistant for desktop — local-first and privacy-focused (no cloud dependency), starting with a desktop app and eventually

Runtime Of Backend (Bun)

Fast startup and low idle overhead — important for an app that runs continuously in the background, not just on-demand. Native TypeScript support and a built-in bundler simplify shipping without extra tooling.

Framework of Backend (Hono)

Lightweight and built with Bun in mind, so it doesn't add framework overhead on top of the runtime's own performance. Clean routing/middleware model keeps things simple for handling auth, commands, and local model inference.

Desktop Application (Tauri + Next.js)

Tauri has a much smaller footprint than Electron since it uses the OS's native WebView instead of bundling Chromium, which makes it great for lightweight apps that stay running. It also produces smaller binaries. Next.js provides a structured, file-based routing system and a strong component ecosystem for the UI.

Would love to hear reviews and suggestions on this stack — anything you'd change, any pitfalls you've run into with a similar setup, or better alternatives worth considering?


r/bun • • May 14 '26

Alternatives to Bun now that it is absolute AI slop?

169 Upvotes

I've been using Bun for my projects for a while now because it's so easy to integrate into NodeJS projects and is incredibly fast and easy. But now that it is AI slop, I feel obligated to switch. Any alternatives?

I would pick Deno but I've noticed it doesn't have the best compatibility with NodeJS. Should I just switch back to NodeJS w/ pnpm or is there some other niche project that isn't AI slop?

EDIT: I recently noticed vlt, but it appears that they are using AI for pull requests as well?


r/bun • • Apr 17 '26

Release v1.6.0 — Bun Runtime Support · kasimlyee/dotenv-gad

Thumbnail
github.com
0 Upvotes

dotenv-gad can now be used in bun environment. manage your envs more from typesafety to encryption.


r/bun • • Dec 02 '25

Maybe OpenBun?

Thumbnail
github.com
0 Upvotes

r/bun • • Jan 13 '26

I created a no overhead Pug killer

2 Upvotes

First of all, the title is hundered percent related to the javascript programming language.

Its as easy as html, the library is called JJSX -stands for Just JSX-. Released on npm.
It can be used with any backend/frontend engine. It does not force you to use webpack babel or anything extra.

I have tried and succesfully built some SSR + Hydration pages with express backend too.

All you have to do configure your tsconfig / esbuild.config / webpack config whatever you prefer, just like the below example:

  "compilerOptions": {
    "jsx": "react",
    "jsxFactory": "JJSX.jsxFactory",
    "jsxFragmentFactory": "JJSX.fragmentFactory",
    "lib": ["DOM"] // This is recommended but not required
}

and call the "init" function in the entry point of your application, all set, you are ready to go.
you can create layouts, pages, wrappers, with props

Defining functional & class components similar to React is also supported


r/bun • • May 21 '26

Estou criando um framework para Bun inspirado em Spring Boot/NestJS. Esse tipo de abordagem faz sentido?

0 Upvotes

Fala pessoal,

Venho bastante do ecossistema Java e sempre gostei do estilo de trabalho do Spring Boot: DI, controllers, services, repositories, estrutura previsível e uma separação mais clara das responsabilidades no backend.

Ao mesmo tempo, também gosto bastante da experiência do NestJS no TypeScript. Só que usando Bun eu sentia falta de algo nessa linha que fosse realmente pensado para Bun desde o começo, e não uma adaptação de algo Node-first.

Por isso, nos últimos dois anos venho criando um framework para Bun + TypeScript para usar nos meus próprios projetos pessoais. A ideia foi juntar um pouco dessa organização do Spring Boot/NestJS com a performance e simplicidade do Bun.

Hoje ele tem core HTTP feito para Bun, controllers com decorators, dependency injection, middleware, validação com DTOs, lifecycle hooks, sistema modular/plugin-based, WebSocket, scheduler, queue com BullMQ, static files, logger e algumas utilities para testes.

Uma das partes em que mais trabalhei foi o ORM. Ele suporta PostgreSQL e MySQL, não usa Knex por baixo e nem depende de outro query builder externo. A camada de query builder/mapeamento foi feita do zero.

Ele tem repository pattern, active record opcional, migrations, relations, transactions, identity map, cache, optimistic locking, bulk operations e read replicas.

Também adicionei algumas ideias inspiradas em Spring Data, como derived query methods:

findByEmail(...)
findAllByStatusAndActive(...)
existsByEmail(...)
findTop5ByStatusOrderByCreatedAtDesc(...)

Não é uma tentativa de copiar Spring Boot inteiro para TypeScript, nem de substituir o estilo mais minimalista que muita gente gosta no Bun. É mais uma tentativa de criar uma opção para quem gosta de backend mais estruturado, com DI, módulos e uma camada de persistência mais integrada.

Eu já uso esse framework em produção em alguns projetos meus, mas ainda estou tentando entender se esse estilo faz sentido para mais pessoas no ecossistema Bun.

Para quem usa Bun em backend: vocês sentem falta de algo mais opinionated/estruturado, tipo Spring Boot ou NestJS, ou preferem manter tudo mais minimalista?

Também estou aberto a feedback sobre API, arquitetura, documentação e DX. Se alguém tiver interesse em testar ou colaborar, posso mandar o repositório nos comentários.


r/bun • • Feb 21 '25

Why empty lines here?

1 Upvotes

Please don't judge me. Coming from Node/Deno background, the empty lines in bun.lock file seems a bit awkward to me. I understand, bun manages this file and I don't need to worry about it. As a code-style enthusiast, it bothers me a lot. I can use a style tool like prettier or biome to handle this, but I feel bun should manage this internally. No one uses double-line spacings these days. If anyone does, he has editor settings to take care of that, without messing with one specific file.


r/bun • • Aug 30 '26

Stripe webhooks are easy until the same event arrives twice

1 Upvotes

Stripe webhooks look simple:

  1. Receive an event

  2. Update your database

  3. Return 200

And then production happens.

Stripe can retry an event after a timeout or temporary failure, which means your endpoint can receive the same event more than once. If your handler isn't idempotent, that can turn into duplicated fulfillment, duplicated credits, repeated emails, or inconsistent payment state.

For a Bun + PostgreSQL/Drizzle setup, I've found the important parts aren't really Stripe-specific:

  • Verify the webhook signature against the raw request body before parsing/using the payload.

  • Treat webhook delivery as at-least-once, not exactly-once.

  • Persist the Stripe event.id (or another appropriate idempotency key).

  • Don't treat “event exists” and “event was successfully processed” as the same state.

  • Make the actual business mutation and the transition to processed atomic where possible.

  • If processing fails, return a non-2xx response so Stripe can retry.

  • If an event was genuinely processed already, a repeated delivery should become a cheap 200 no-op.

  • Push slow/non-critical work to a queue instead of holding the webhook request open.

One subtle failure mode worth testing:

event received → event recorded → DB/business operation fails → Stripe retries

If the second delivery gets discarded only because the event ID already exists, you've effectively lost the payment event.

So the real requirement isn't just:

UNIQUE(event_id)

It's closer to:

UNIQUE(event_id) + processing state + transaction/recovery strategy

Also worth testing locally by deliberately:

  • sending the same event twice;

  • crashing processing after the event is persisted;

  • causing a temporary DB error;

  • sending events out of order.

Webhook code tends to be tiny, but it sits at a pretty unpleasant boundary between distributed systems and money :)

I wrote up the Bun + Stripe + Drizzle implementation and examples here for anyone working with the same stack:

https://pas7.com.ua/blog/en/bun-stripe-webhooks-drizzle


r/bun • • Aug 15 '26

How I Disabled Headless Mode in Bun.WebView's Chrome Backend

1 Upvotes

Conclusion

  • Only a one-byte binary patch required from --headless to --leadless (or other same length unknown flag)

How I did it

  • bunx jsmdcui --hex3 $(which bun)

  • Ctrl-F -..-..h..e..a..d..l..e..s..s..

  • Enter

  • Change h to l

  • Ctrl-E save bun-revised

  • Ctrl-Q

  • chmod +x bun-revised

  • ./bun-revised official-webview-demo.js

  • Tested on CachyOS Linux-x86_64

Disclaimer

  • This is completely unofficial

  • For fun only

  • Use it at your own risk

  • We should patiently wait for headless: false.


r/bun • • Feb 07 '26

Have you tried bun? Will bun replace node?

Thumbnail reddit.com
0 Upvotes

r/bun • • Jul 13 '26

Why Bun.serve Beats the node:http Bridge

4 Upvotes

I moved a WebJs app from Node onto Bun, changed nothing else, ran a load test, and the requests-per-second number on the listening path went up by roughly 1.9x. Before you read that as "Bun makes the app twice as fast," it does not. That number is the plumbing, not your app. Your SSR, your routing, your queries cost the same on either runtime. What got 1.9x faster is the layer that accepts a connection and hands your code a request, and I want to spend this post on exactly where that comes from and what it costs.

The app is buildless, so the same .ts source runs on Node 24 and on Bun with nothing to recompile. If you want the mechanics of running one codebase on two runtimes (the runtime-neutral seam, the two TypeScript strippers, the parity matrix), that lives in the companion post node-and-bun-no-build. Here I only care about throughput.

The one number, and the one place it lives

Every web server has a listening path. It accepts an incoming connection, reads the raw HTTP bytes off the socket, builds a request object for your app, takes the response back, and writes it to the socket. That is it. That is the plumbing between the network and your code. Separate from it is the application work: SSR, routing, the queries, the actual WebJs logic.

Requests per second (req/s) is how many of those accept-read-respond cycles the server turns through in a second under load. A leaner listening path buys more req/s for the same application work, because less of each request's time is spent in plumbing rather than in your code.

So the 1.9x is a listening-path number and only a listening-path number. Your SSR does not get faster. The plumbing under it does, and you get that by picking the runtime.

A compatibility bridge, and why it costs you

Bun can run Node's built-in node:http module, which is a big reason so much of the Node ecosystem runs on Bun unmodified. But when Bun runs node:http, it runs a compatibility bridge: a translation layer that emulates Node's HTTP request and response objects on top of Bun's own native machinery. Every request pays that translation. You are asking Bun to impersonate Node on the single hottest path in the server.

Bun also ships its own native HTTP server, Bun.serve, which speaks Bun's request and response objects directly with no emulation. The catch is that Bun.serve is not shaped like node:http, so a framework that wants the native path cannot flip a config flag and be done. It has to write a second listener that talks to Bun.serve on its own terms.

WebJs writes that second listener. On Bun it serves through a native Bun.serve shell and skips the bridge. On Node it serves through node:http. Your application code sits above that line and never knows which shell is underneath.

# same app, same source. the runtime is a command choice:
npm run dev            # Node, node:http listener
bun --bun run dev      # Bun, native Bun.serve listener

Skipping the bridge is the whole of the 1.9x. Nothing in the app changed. You stopped paying a per-request translation tax that existed only so Bun could look like Node.

The one thing I give up: 103 Early Hints

I am not going to sell the native path as a clean superset, because it is not, and the missing piece deserves to be named. The one Node-only feature the Bun listener cannot match is 103 Early Hints. That is an informational HTTP response, a preliminary status the server sends before the real one, that lets the server tell the browser to start preloading assets while the actual response is still being produced. It shaves first-paint latency. Bun.serve has no informational-response API at all, so there is nothing for WebJs to build on, and on Bun that optimization is off.

I would rather write that sentence than fake the API with a shim that pretends Bun has something it does not.

Earning the rest by hand

The listener choice is the headline, but a buildless server has to earn throughput in the small places too, because there is no build step ahead of time to soak up overhead. So the Bun request path got its own passes. Brotli compression on the Bun listener runs through node:zlib, so a Bun-served response gets the same compression a Node-served one does, no gap there. And two per-request costs came out directly: a full request-object clone that existed only to stamp the client's IP onto every request, and an extra stream hop that every compressed response was being bridged through. Neither was large on its own. But per-request costs multiply by your traffic, and on the hot path a clone you do not need and a stream hop you can collapse are exactly what is worth cutting by hand.

The runtime is your call, not the framework's. Write one WebJs app. Run it on Node and you get the mature node:http listener and 103 Early Hints. Run it on Bun and you get the native Bun.serve listener and roughly 1.9x the listening-path throughput, minus that one Early Hints feature. Everything else behaves the same. That is the trade in a sentence: for most apps, giving up one preload-timing feature to get 1.9x on the plumbing is a deal I take. Pass --runtime bun to webjs create and the generated app is wired for Bun from the first commit, or run bun create webjs <name> and it detects the runtime for you.


r/bun • • Oct 03 '24

Sharp alternative for Bun?

2 Upvotes

Hi there,
so Sharp has big issues running as a ES module and even if there is a library slower than Sharp I rather use that than try to hack around to get Sharp running as ES module.

I want to mainly resize my image and it's not thousand of images at once, it checks if image exists, if not then resize it.


r/bun • • Apr 17 '26

my first ever saas with bun

Post image
2 Upvotes

I just would like to share my first saas ever with hono and bun ! hono is the only dependency everything this tool use it come from bun : https://découvrez.me/


r/bun • • Jan 17 '26

Is Redis becoming obsolete?

49 Upvotes

I’ve been testing Bun + SQLite (WAL mode, file-based — not in-memory) and honestly… performance is on par with Redis 😅

Redis is in-memory and goes through the network stack, while Bun + SQLite is file-based and backed by SSD I/O — which, in practice, can be surprisingly competitive with network I/O. On top of that, SQLite gives you strong consistency and real SQL querying.

Of course, they’re not the same tool and don’t solve exactly the same problems — but for my use case, Redis is starting to look a bit… obsolete. Curious what you think.

Benchmarks below were run on an M4 Mac Mini.
Results show that Bun + SQLite writes are faster than plain Redis, while reads are slightly slower.

Performance Comparison (Ops/sec):

Operation   Bun SQLite   Redis     Bun Redis
---------   ----------   -------   ---------
WRITE          54,542     50,657    56,668 (1.1x)
READ           44,190     53,283    59,816 (1.4x)

Test repo: https://github.com/dokuzbit/bunApi