·2 min read ·Muhammet Şafak

BabelQueue 1.0 is here — polyglot queues, simplified

All six SDKs — PHP, Python, Go, Node.js, Java and .NET — are now published at 1.0.0, with a SemVer-stable API and one frozen wire envelope.

BabelQueue reaches 1.0.0 today — across the entire ecosystem, all at once. A message produced in one language is now consumed natively in another, over the broker you already run, with a public API you can build on.

What “1.0” means here

Two independent promises:

  • A SemVer-stable public API. Every SDK is 1.0.0. Breaking changes now require a MAJOR bump and follow a deprecation policy — so you can pin and upgrade with confidence.
  • A frozen wire envelope. The on-the-wire format stays at schema_version: 1. A v1 producer is readable by every v1 consumer, in any language, indefinitely.

These are deliberately separate: your package versions can move independently while the bytes on the queue stay stable.

Six SDKs, one envelope

Every language ships a framework-agnostic core plus thin framework adapters:

  • PHPbabelqueue/php-sdk, with Laravel and Symfony adapters
  • Pythonbabelqueue, with Celery and Django adapters
  • Gobabelqueue-go, with Redis and RabbitMQ transport modules
  • Node.js@babelqueue/core, with BullMQ and NestJS adapters
  • Javacom.babelqueue:babelqueue-core, with a Spring Boot adapter
  • .NETBabelQueue.Core, with a MassTransit adapter

Every one of them vendors and passes the same cross-SDK conformance suite, so two SDKs producing the same logical message emit byte-comparable envelopes.

The idea, in one line

Don’t change your broker — change only the serialization. BabelQueue replaces language-specific serialization (like PHP’s serialize()) with a strict, minimal JSON envelope and routes by a URN instead of a class name:

{
  "job": "urn:babel:orders:created",
  "trace_id": "7b3f9c2a-e41d-4f88-9b2a-1c0d5e6f7a8b",
  "data": { "order_id": 1042 },
  "meta": { "id": "…", "queue": "orders", "lang": "php", "schema_version": 1, "created_at": 1749132727000 },
  "attempts": 0
}

A built-in trace_id flows across every hop and language, so an end-to-end trace is one query away.

Get started

Producing your first polyglot message is a single call:

BabelQueue::publish('urn:babel:orders:created', ['order_id' => 1042]);

Pick your stack on the ecosystem, read the wire contract, or jump straight into a driver’s docs.

Thanks to everyone who tested the pre-1.0 builds. One envelope, every language.