Open Source Game Engine

Native games from TypeScript

Write TypeScript. Ship native games. No browser, no C++. Bloom compiles your game ahead-of-time and runs it on Metal, DirectX 12, Vulkan and WebGPU — one codebase, six targets, real PBR rendering and physics out of the box.

main.ts
import { initWindow, windowShouldClose,
         beginDrawing, endDrawing,
         clearBackground, drawText,
         Colors } from "bloom";

initWindow(800, 450, "My Game");

while (!windowShouldClose()) {
  beginDrawing();
  clearBackground(Colors.RAYWHITE);
  drawText("Hello, Bloom!",
    190, 200, 20, Colors.DARKGRAY);
  endDrawing();
}
0 Runtime overhead
6 Target platforms
9 Modular subsystems
1 Codebase to maintain

Why Bloom?

Bloom is the only game engine that lets you write TypeScript and ship truly native games. No Electron, no WebView, no browser runtime. Your code is compiled ahead-of-time by the Perry compiler and runs against a Rust core.

Simple API

The entire API fits on a cheatsheet. No classes, no inheritance, no magic. Just functions you call.

True Native

One renderer, four backends — Metal, DirectX 12, Vulkan and WebGPU. PBR materials, cascaded shadows, TAA and post-FX in the box.

Ship Everywhere

macOS, Windows, Linux, iOS, tvOS and the Web from one codebase. Steam, App Store and itch.io ready.

Everything you need

Nine modular subsystems, each independently importable. Use only what you need.

Core

Window creation, game loop, input handling, timing, and frame control.

bloom/core

Shapes

2D shape drawing — lines, rects, circles, polygons — plus collision detection.

bloom/shapes

Textures

Image loading, texture management, sprite batching, and render-to-texture.

bloom/textures

Text

TTF and OTF font loading, text rendering, and measurement.

bloom/text

Audio

Sound effects, music streaming, 3D positional audio, WAV / OGG / MP3.

bloom/audio

Models

glTF 2.0 loading, GPU skeletal animation, PBR materials, mesh primitives.

bloom/models

Math

Vectors, matrices, quaternions, easing functions, and random number generation.

bloom/math

Physics

Jolt-powered rigid & soft bodies, character controllers, vehicles, raycasts, constraints.

bloom/physics

Scene

Retained-mode scene graph — transforms, visibility, shadows, material binding.

bloom/scene

One codebase. Every platform.

Bloom maps to the native graphics API on each platform via a single wgpu-backed renderer. Your TypeScript compiles to real binaries — or to a WASM bundle for the web.

macOS
Metal
Windows
DirectX 12
Linux
Vulkan
iOS
Metal
tvOS
Metal
Web
WebGPU / WASM

What's new

Bloom is in active development — 300+ commits in the last few weeks alone. Recent highlights:

Renderer

Auto-DRS & CAS sharpen

Dynamic render scale auto-tunes to your target FPS, with an upscale + RCAS sharpen pass to stay crisp at fractional resolutions.

Materials

Planar reflections + texture arrays

Mirror-like planar reflections with oblique-clip and IBL fallback. Splat-mapped terrain via texture-array bindings with mips.

Tools

Imposter baker CLI

Octahedral atlases for distant LODs — ship dense forests and crowds without choking your draw-call budget.

Post-FX

Stackable post passes

ACES / AgX tone mapping, auto-exposure, bloom, DoF, motion blur, SSGI, SSAO, TAA — composed via ping-pong render targets.

Platform

Cross-platform HiDPI

Windows, Linux and Web now share the same HiDPI handling that macOS and iOS already had. Your UI stays sharp on every display.

DX

WGSL shader hot reload

Save a shader, see the result in under a second. Materials recompile in place during development.

Familiar patterns, native power

Plain interfaces, pure functions, zero magic. If you know TypeScript, you know Bloom.

2D Shapes & Collision

import { drawRect, drawCircle,
         checkCollisionRecs } from "bloom/shapes";

drawRect(100, 100, 200, 80, Colors.GREEN);
drawCircle(400, 300, 50, Colors.GOLD);

if (checkCollisionRecs(player, enemy)) {
  playSound(hitSound);
}

3D Camera & Models

const camera: Camera3D = {
  position: { x: 10, y: 10, z: 10 },
  target: { x: 0, y: 0, z: 0 },
  up: { x: 0, y: 1, z: 0 },
  fovy: 45, projection: 0
};

beginMode3D(camera);
drawModel(tree, { x: 0, y: 0, z: 0 });
drawGrid(10, 1);
endMode3D();

Ready to build your game?

Bloom is open source and free. Jump in, build something, and ship it everywhere.