Alginte 0.10.0 Beta

Released 2026-09-03.

Alginte is in beta (0.x): configuration keys, the topology export format, and APIs may change between releases; breaking changes are called out in release notes with migration guidance. 0.10.0 contains no breaking changes.

The editor stops guessing

The stream builder's expression editors already knew a source record's shape — its schema fields, a real sample, what your map and filter expressions turn it into. 0.10.0 carries that knowledge through the places it used to stop.

Past an aggregate. An aggregate is now modeled as its first fold — your initializer, then your adder over the sample — with the same operators a deployed topology runs. Everything downstream of it (toStream → map → sink) previews, completes and validates against the accumulator's real shape, and #aggValue inside the adder itself is bound to what the initializer builds instead of a placeholder.

Through a join. A join has two inputs, so it gets two lanes: each branch is evaluated on its own, #leftValue and #rightValue are bound to their own branch's record, and completions after #rightValue. describe the right record — not the left one. The join drawer previews both inputs and the joined output, and nodes downstream of a join get a chain like any other.

Both inputs are real records off orders and shipments. The list after #rightValue. is the shipment's fields, not the order's; out is the joiner run over both; the node after the join inherits it. Nothing has been deployed.

Shown where the type is picked. On a path that re-types the record, the editor type hints now show the kind the sample preview observed — JSON (inferred) — instead of an inert String, following the precedence the builder always stated: declared output, then inferred, then your hint.

One serde list, everywhere. Every place you pick a serde — node overrides, declared outputs, editor type hints, the produce and consume forms, the stream properties' default.*.serde suggestions — now reads from one catalog served by the running instance. The canvas labels follow the catalog's wording (JSON Schema, Avro Schema, Protobuf Schema); stored values are unchanged.

Protobuf field access. value.get('field') now evaluates on Protobuf records, in the editor and deployed alike, with the same completions as Avro and JSON Schema. Protobuf hands you real Strings and boxed numbers, so == against a literal just works.

Validation that agrees with deployment

The editor's inline verdicts are checked against a deployed topology by a differential corpus. This release extends that corpus to every stateful expression role — aggregate adders, reduce combiners, value joiners, foreign-key extractors — and the rows it added caught and fixed real disagreements: a false alarm on #aggValue map access, a false pass on #rightValue.get(...) over a String stream, and a missed verdict on a String method against an aggregate. The rule that came out of it is simple and now enforced: the editor only claims an expression will fail when every value it touched is a real sample.

The per-record cost of SpEL evaluation was measured along the way and published as numbers rather than opinions: about 150k records per second per thread, with neither hoisting nor compilation changing the picture enough to act on. Nothing changed in the runtime.

Fixes

For operators

Get it

docker pull alginte/alginte:latest

Full install guide in the documentation — or try the playground: one command, no Kafka needed.