Skip to main content
Prefer Uint8Array.prototype.toBase64() and Uint8Array.fromBase64() for encoding and decoding base64 data in Bun. These APIs work directly with bytes, so they are a better fit for binary data than the older btoa() and atob() globals.
const bytes = new Uint8Array([98, 117, 110]);
const encoded = bytes.toBase64(); // => "YnVu"

const decoded = Uint8Array.fromBase64(encoded);
// => Uint8Array(3) [ 98, 117, 110 ]
For strings, convert to and from UTF-8 bytes with TextEncoder and TextDecoder.
const bytes = new TextEncoder().encode("hello world");
const encoded = bytes.toBase64(); // => "aGVsbG8gd29ybGQ="

const decoded = Uint8Array.fromBase64(encoded);
const text = new TextDecoder().decode(decoded); // => "hello world"
Node.js Buffer extends Uint8Array, so buffers can be encoded with toBase64() and passed to APIs that accept Uint8Array. Buffer also provides Node.js-compatible base64 decoding with Buffer.from(encoded, "base64").
const encoded = Buffer.from("hello world").toBase64();
// => "aGVsbG8gd29ybGQ="

const bytes = Buffer.from(encoded, "base64");
bytes instanceof Uint8Array; // => true

const text = bytes.toString("utf8");
// => "hello world"
The older btoa() and atob() APIs are still available for compatibility, but they operate on binary strings instead of byte arrays. Avoid them in new code, especially when handling arbitrary binary data or non-ASCII text.
const encoded = btoa("bun"); // => "YnVu"
const decoded = atob(encoded); // => "bun"

See Web APIs.