Skip to content
A Roblox builder feeding bricks into a machine that turns them into streams of data.

BlinkBlox

Describe your remotes in a schema. Get server and client modules that pack them into buffers, check everything a client sends, and hold up when a client is hostile.

You describe your events and functions, and what they carry, in a .blink file. The compiler turns that file into a server module and a client module. Both are plain Luau with no runtime dependency. Calls are batched into one buffer per frame, and each type is packed as tightly as its declaration allows.

Net.blink
option DefaultRate = 20
struct Hit {
Target: Instance(Humanoid),
Damage: u8(1..100),
Critical: boolean,
}
event Damage {
From: Client,
Type: Reliable,
Call: SingleSync,
Rate: 10,
Data: Hit
}
event Position {
From: Server,
Type: OrderedUnreliable,
Call: SingleSync,
Data: (Id: u16, Where: vector<f32>)
}
function GetInventory {
Yield: Coroutine,
Data: u32,
Return: string(0..32)[..64]
}

Safe to point at the internet

Packets are bounded before they are parsed. Each player gets a byte budget, and each event can get its own rate limit. Every length is checked before the read it pays for. One malformed event is dropped without taking the rest of the batch with it. How the server protects itself.

Small on the wire

Booleans and optional flags share a bitfield, and boolean[] packs eight elements to a byte. A length is sent relative to its range, and a rotation fits in 7 bytes. Unreliable events that cannot fit are refused at compile time. Bandwidth and sizes.

Checked at compile time

A schema that cannot work never builds. That covers map keys that can never be looked up, cyclic imports, unbounded decode loops and debug remotes left in a release build. Each gets a diagnostic with a code and a source span. Diagnostics.

Tooling included

The CLI has watch mode and build profiles. A Studio plugin gives you an editor with live diagnostics and autocomplete, and TypeScript definitions are available for roblox-ts. Studio plugin.

A thousand events a frame from client to server, run in Studio on 0.29.0. The numbers are median frame rates, with bandwidth in brackets.

Payload Roblox remotes BlinkBlox zap ByteNet
1000 booleans 15 FPS 57 FPS (3.19 Kbps) 37 FPS (8.53 Kbps) 22 FPS (8.33 Kbps)
100 entities 16 FPS 60 FPS* (41.57 Kbps) 42 FPS (41.86 Kbps) 24 FPS (41.71 Kbps)

* Studio caps the frame rate at 60. How these were measured.

BlinkBlox is a maintained fork of Blink. Upstream froze this line of the compiler in 2026 and began a rewrite, and it declared an unbounded parse of a hostile client buffer out of scope. This fork fixes that and continues from there, without giving up the TypeScript output, the Studio plugin or the documentation.

Zap is a neighbouring compiler that focuses on bandwidth. It leaves rate limiting to the game, and one malformed event discards the rest of that player’s batch.

BlinkBlox Blink 0.18 Zap
Per-player, per-event rate limits Yes No No
A malformed event drops only itself Yes No No
Shared bitfield for booleans and optionals Yes No Yes
TypeScript output Yes Yes Yes