<?xml version="1.0" encoding="UTF-8"?>
<!-- GENERATED by scripts/build-docs.mjs from the release notes and the guides — do not edit. -->
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>BROKA — releases and guides</title>
  <subtitle>Every BROKA release and every new guide, as it is published.</subtitle>
  <id>https://broka.dev/</id>
  <link rel="self" type="application/atom+xml" href="https://broka.dev/feed.xml"/>
  <link rel="alternate" type="text/html" href="https://broka.dev/release-notes"/>
  <updated>2026-10-24T00:00:00Z</updated>
  <author><name>BROKA</name></author>
  <entry>
    <id>https://broka.dev/release-notes#v1-3-2</id>
    <title>Broka 1.3.2</title>
    <link rel="alternate" type="text/html" href="https://broka.dev/release-notes#v1-3-2"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">&lt;h3 id=&quot;v1-3-2-highlights&quot;&gt;Highlights&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Making an API token is a permission of its own.&lt;/strong&gt; &lt;em&gt;Create API tokens&lt;/em&gt; is in every built-in role, and every account
that already had a token keeps the ability. Take it away, and that person&amp;#39;s tokens are revoked.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;More at a glance.&lt;/strong&gt; A chart writes its latest reading beside its title, Kafka service accounts say when Broka last
changed their rules, the Redis configuration marks what differs from Redis&amp;#39;s default, and a saved view opens on its
screen.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;v1-3-2-changes&quot;&gt;Changes&lt;/h3&gt;
&lt;h4 id=&quot;v1-3-2-access&quot;&gt;Access&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Create API tokens&lt;/strong&gt; (&lt;code&gt;api_tokens.create&lt;/code&gt;) — making an API token now takes this permission, which every built-in
role carries; an account that held a working token when you upgrade is given it on its own, so nobody who used one
loses it. Without it, Profile ▸ API tokens shows &lt;strong&gt;New token&lt;/strong&gt; greyed out with the reason, and the list stays
readable and revocable. If the permission is taken away — a role removed or changed, a team left, a deny — the
person&amp;#39;s tokens are revoked at their next use and within the hour otherwise, each revocation recorded in the audit
trail. &lt;strong&gt;If someone other than an administrator manages users through a role of your own&lt;/strong&gt;, add &lt;em&gt;Create API tokens&lt;/em&gt;
to that role: the console does not let a person reset or sign out an account that holds a permission they do not,
and every built-in role now carries this one.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The list of people&lt;/strong&gt; — the names and e-mail addresses the console offers when you add a team&amp;#39;s members or an
application&amp;#39;s owners — is read with &lt;em&gt;Manage users&lt;/em&gt;, &lt;em&gt;Manage teams&lt;/em&gt;, &lt;em&gt;Manage applications&lt;/em&gt; or &lt;em&gt;See the applications
catalog&lt;/em&gt;. An account with none of them, such as one created at its first single sign-on and not yet given a role,
reads nobody&amp;#39;s address.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;v1-3-2-metrics&quot;&gt;Metrics&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;The latest reading beside the title.&lt;/strong&gt; A metric chart — a Metrics tab, an overview&amp;#39;s Metrics section, the alert
rule dialog — writes its latest reading beside its title, or beside each target&amp;#39;s name in the key of a chart that
draws several. It shows only while the range runs to now and the line has not stopped; hover it for when it was read.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;v1-3-2-kafka&quot;&gt;Kafka&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Service accounts: Last changed in Broka.&lt;/strong&gt; Beside each account&amp;#39;s rule count, when a rule of its was last granted
or revoked through Broka. Kafka keeps no time on an ACL, so this is read from Broka&amp;#39;s audit trail; a change made with
Kafka&amp;#39;s own tools, or older than the trail keeps, reads as a dash.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;v1-3-2-redis-commercial&quot;&gt;Redis (Commercial)&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Configuration: Changed and Only changed.&lt;/strong&gt; A parameter that is not at Redis&amp;#39;s own default for the server&amp;#39;s version
is marked &lt;strong&gt;Changed&lt;/strong&gt; — hover it for the default — and &lt;strong&gt;Only changed&lt;/strong&gt; shows just those. Redis does not report its
defaults, so Broka keeps them for every release from 6.2 to 8.10; where and how the server runs (its directory,
address and port) is never counted as a change, and a fork or a newer release has none to compare with.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;v1-3-2-saved-views&quot;&gt;Saved views&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;What a view holds, and Open.&lt;/strong&gt; Each row on Operations ▸ Saved views says on one line what the view holds — its
sort, optional columns and page size, or a saved search&amp;#39;s topics and filter — and &lt;strong&gt;Open&lt;/strong&gt; takes you to the screen it
was saved on with the view applied. Views saved before 1.3.2 have no Open.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;v1-3-2-security&quot;&gt;Security&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;The release check-in is signed.&lt;/strong&gt; Each installation signs its daily check-in with its own key and sends the key&amp;#39;s
public half with it, so what we hold for an installation — the registration its security notices go to — changes only
on that installation&amp;#39;s word. Nothing else is added to what it sends.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The console image runs nginx 1.30.6 and Brotli 1.2.1.&lt;/strong&gt; nginx 1.30.5 and Brotli 1.2.0, in the console image of
1.3.1 and earlier, carry CVE-2026-15176, CVE-2026-93479, CVE-2026-97205 and CVE-2026-111497; none is reachable in
the configuration BROKA ships — see &lt;a href=&quot;https://broka.dev/security/advisories/BROKA-SA-2026-005&quot;&gt;BROKA-SA-2026-005&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;POST /api/v1/ping/echo&lt;/code&gt; is gone.&lt;/strong&gt; An unauthenticated route that answered with whatever was posted to it, which
nothing in the product called. &lt;code&gt;GET /api/v1/ping&lt;/code&gt; stays.&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <id>https://broka.dev/guides/whats-new-in-broka-1-3</id>
    <title>What changed in BROKA from 1.2 to 1.3</title>
    <link rel="alternate" type="text/html" href="https://broka.dev/guides/whats-new-in-broka-1-3"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <summary>People sign in through your identity provider, with its groups mapped to BROKA teams; one search reads many Kafka topics at once; and consumer groups are deleted in bulk.</summary>
  </entry>
  <entry>
    <id>https://broka.dev/release-notes#v1-3-1</id>
    <title>Broka 1.3.1</title>
    <link rel="alternate" type="text/html" href="https://broka.dev/release-notes#v1-3-1"/>
    <updated>2026-10-21T00:00:00Z</updated>
    <content type="html">&lt;h3 id=&quot;v1-3-1-highlights&quot;&gt;Highlights&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;A calmer console.&lt;/strong&gt; Every list keeps one action on a row and the rest in its ⋯ menu, page headers show their main
action and one other, and the explanations sit behind a &lt;strong&gt;?&lt;/strong&gt; beside the title instead of on the page. An action you
cannot take is shown greyed out, with the reason.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Searching Kafka messages is simpler.&lt;/strong&gt; One box searches the key, the value and the headers at once; the filter
language, conditions, formats and limits are under &lt;strong&gt;More options&lt;/strong&gt;, and where to start reads as a time range.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Figures that say how far they go.&lt;/strong&gt; An Apache Artemis count the broker stopped early reads &lt;em&gt;at least&lt;/em&gt;, message
counter times are written like every other date, and offsets are written in full.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;v1-3-1-changes&quot;&gt;Changes&lt;/h3&gt;
&lt;h4 id=&quot;v1-3-1-the-whole-console&quot;&gt;The whole console&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Row actions in one menu&lt;/strong&gt; — every list shows at most one action on a row; the rest, deleting included, are in the
row&amp;#39;s ⋯ menu, and an action you cannot take is shown greyed out with the reason.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Calmer page headers&lt;/strong&gt; — a page shows its main action and one other; Delete, Purge, Reset and the like are in the
header&amp;#39;s ⋯ menu, still confirmed as before. Back buttons are gone: the breadcrumb leads back.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Explanations behind ?&lt;/strong&gt; — a page opens with one line saying what it lists; how it works and why sits behind a ?
beside the page, card, field or dialog title. Warnings that change what you are about to do stay in view.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Internal objects hidden&lt;/strong&gt; — Kafka&amp;#39;s internal topics (&lt;code&gt;_schemas&lt;/code&gt;, &lt;code&gt;_connect-*&lt;/code&gt;), Schema Registry subjects starting
with &lt;code&gt;_&lt;/code&gt;, and Apache Artemis&amp;#39;s own queues are hidden until you choose &lt;strong&gt;Show internal (n)&lt;/strong&gt;, then marked Internal.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Units in words&lt;/strong&gt; — durations and sizes you type are read back (&amp;quot;= 3 days&amp;quot;, &amp;quot;= 2 MiB/s&amp;quot;); -1 limits read Unlimited.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tables&lt;/strong&gt; — Columns and View sit at the right of the filter row on lists, and are not shown over an empty table or on
small tables in tabs, cards and dialogs; an empty list shows only its empty state, with no pager. A list with no
filters keeps View in its table header.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Confirmations&lt;/strong&gt; — a confirmation can carry a ? with its explanation, and the note under a reason field reads
&lt;em&gt;Recorded in the audit trail.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Status&lt;/strong&gt; — a normal state (running, healthy, enabled) reads quietly; only states that need attention are coloured.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sentence case&lt;/strong&gt; — titles, buttons, columns, badges, the sidebar and the breadcrumbs (&lt;em&gt;Consumer groups&lt;/em&gt;, &lt;em&gt;Client
quotas&lt;/em&gt;, &lt;em&gt;Audit logs&lt;/em&gt;).&lt;/li&gt;
&lt;li&gt;Notable moves: a consumer group&amp;#39;s &lt;strong&gt;Reset offsets&lt;/strong&gt; is a button at the top of its details; Schema Registry&amp;#39;s
compatibility and mode change from their value in the summary line; a Redis key&amp;#39;s Rename, Copy, Move, TTL, Export and
Import are in its panel&amp;#39;s ⋯ as small dialogs; &lt;strong&gt;Profile ▸ API tokens&lt;/strong&gt; lists the tokens first, with New token in a
side panel; the Audit log has Export and Verify integrity in its header.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Documentation examples&lt;/strong&gt; — the documentation&amp;#39;s examples and screenshots now follow an investment firm: market
data, orders, trades and settlement.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;v1-3-1-screens-reworked&quot;&gt;Screens reworked&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Overview&lt;/strong&gt; shows every figure in one row — one connections card, open alerts, Kafka lag, Redis, RabbitMQ,
Apache Artemis and Memcached — with connection health right under it; recent activity reads as sentences and shows
changes, with reads one click away. The panels under them are titled &lt;strong&gt;Highlights&lt;/strong&gt;; a row no longer repeats its
name on a second line, and RabbitMQ rows name their vhost.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A connection&amp;#39;s form&lt;/strong&gt; shows a stored secret as one &lt;em&gt;Stored · Change&lt;/em&gt; row, with Rotate key and Clear in its ⋯; the
test result sits above the form&amp;#39;s buttons, with its caveats apart. &lt;strong&gt;Supported features&lt;/strong&gt; lists what is unavailable
first and folds the rest.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sign-in&lt;/strong&gt; has no placeholder dots and a &lt;em&gt;Forgot password?&lt;/em&gt; hint; a one-time password has one Copy, on one line.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Settings pages save through one bar&lt;/strong&gt; — &lt;em&gt;Unsaved changes · Save / Discard&lt;/em&gt; appears when something changed;
actions that take effect at once (rotate a key, stop forwarding, send a test) keep their own buttons. MCP&amp;#39;s client
snippets are on tabs, and Feature flags is left out of the menu while no feature reads a flag.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Connections&lt;/strong&gt; can be searched by name or tag, and &lt;strong&gt;Search&lt;/strong&gt; has a full-width box, platform icons and a platform
filter.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Alerts&lt;/strong&gt; group open incidents by rule, with Acknowledge and Silence for a selection; an incident opens with
Acknowledge, Silence and a link to its resource, its condition in words and the moment it fired on the chart;
History shows when each incident was resolved and how long it lasted. In the rule dialog every condition is boxed
alike, Enabled is in its header, and the preview shows the targets that would fire; Silences&amp;#39; header action reads
&lt;em&gt;Silence alerts&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Administration&lt;/strong&gt; — API token scopes are grouped, with &lt;em&gt;View everything&lt;/em&gt; and &lt;em&gt;Manage everything&lt;/em&gt;, and token dates
read with the time since; Users hide columns that are the same on every row; Resource metadata fades the rows of
deleted connections and removes them together; Data masking lists its methods in a fixed order; About is one &lt;em&gt;About
this installation&lt;/em&gt; card with the update check. &lt;strong&gt;Applications&lt;/strong&gt; (Commercial) has no row of figures, an initial as
each application&amp;#39;s icon and a list that goes past 12, and an application opens on its Resources. Saved views are
grouped by screen, and templates are listed with their platform and kind.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kafka&lt;/strong&gt; broker and consumer group details are pages of their own; change dialogs show what would change as you
type; the Brokers page sums the cluster up in one strip; broker configuration opens on the changed properties.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kafka lists&lt;/strong&gt; — Topics drop the row of figures and gain a Messages column; Replication factor and Min ISR show only
when topics differ, and labels stay on one line with &lt;em&gt;+n&lt;/em&gt;. Consumer groups show one state badge, Type only when kinds
mix, and no rate for a group with no members. The Schema Registry list puts the name first, counts versions only
where they differ, and has a &lt;em&gt;Show soft-deleted&lt;/em&gt; toggle.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kafka details&lt;/strong&gt; — the Kafka overview is titled with the connection&amp;#39;s name and reads its activity as sentences; a
broker has a &lt;strong&gt;Log directories&lt;/strong&gt; tab with usage bars; a group&amp;#39;s protocol is in its subtitle and its epochs on the
Members and Topology tabs; a topic&amp;#39;s idle rates read &lt;em&gt;No activity&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kafka forms&lt;/strong&gt; — client quotas are named in words with their unit, Kafka&amp;#39;s key beneath; the connector wizard picks
the plugin first (Sources, Sinks, Utility) and asks for the name with the properties, and the connector form marks
defaults with a Reset and saves through the Unsaved changes bar; Produce has one &lt;em&gt;Insert…&lt;/em&gt; menu for the sample and
templates, with format, subject and version on one line; a record&amp;#39;s detail no longer repeats its partition and
offset; a service account has a Rules column, &lt;em&gt;Add access rule&lt;/em&gt; and the Unsaved changes bar; Schema Registry&amp;#39;s
Structure shows enum symbols, with a version&amp;#39;s metadata beside the schema.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RabbitMQ&lt;/strong&gt; Overview shows its key figures in one row; Routing opens on one exchange; move, binding and shovel
dialogs pick existing queues and exchanges from a list; permissions read in Configure, Write and Read columns;
Exchanges and Connections leave the broker&amp;#39;s built-in exchanges and direct connections out until asked.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RabbitMQ lists&lt;/strong&gt; — Channels lead with the client&amp;#39;s name and read prefetch 0 as Unlimited; Consumers show the queue,
client, ack mode and prefetch under one summary strip; the vhost line shows only with All vhosts; Exchanges flag only
exceptions; a queue&amp;#39;s Overview is in three groups and its Metrics three to a row; the Overview puts health checks and
deprecated features in one summary and sorts node memory; Policies, Virtual hosts, Shovels and Federation can be
searched.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Redis&lt;/strong&gt; Overview, Pending entries (a stream picker), stream ids on one line, Diagnostics (reports folded when
they found nothing) and Hot keys (one Start/Stop) are simpler.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Redis keys and tools&lt;/strong&gt; — Keys show one count and &lt;em&gt;Load more&lt;/em&gt;; the slow log is summed on one line with relative times;
configuration is edited by clicking its row; JSON documents are indented; keyspace notification flags are labelled
checkboxes; Analysis shows the sample first and key sizes as bars; cluster shards are in slot order; consumer groups
are grouped by stream and link to their pending entries; Trim asks for a reason.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Apache Artemis&lt;/strong&gt; Addresses and Consumers leave the broker&amp;#39;s own objects out until asked; a prepared transaction&amp;#39;s
time is a date; Commit and Roll back are in the transaction&amp;#39;s details; Maintenance is one list with a Danger zone;
Address settings read in words and units. &lt;strong&gt;Memcached&lt;/strong&gt;&amp;#39;s node picker is in the page header.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Apache Artemis lists and forms&lt;/strong&gt; — lists search by name as you type, with other fields under &lt;em&gt;Add filter&lt;/em&gt;; a queue&amp;#39;s
Messages have a &lt;em&gt;Bulk actions&lt;/em&gt; menu, each action confirmed with the number of messages it matches; Edit queue has an
Unlimited checkbox for each -1 limit and an Advanced section; address settings and permissions pick their match from
the broker&amp;#39;s addresses or a wildcard; Configuration lists the editable settings first; the Overview&amp;#39;s top row counts
connections and sessions. With the broker&amp;#39;s own objects left out, a page more than 10,000 rows in is refused, with a
message to filter or show them.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Memcached&lt;/strong&gt; shows four headline figures; capabilities read &lt;em&gt;All available&lt;/em&gt; or the number missing; Nodes show
state, items and memory; the slab histogram is drawn as bars; one &lt;em&gt;Look up&lt;/em&gt; with &lt;em&gt;Show value&lt;/em&gt;; Watch and Stop are in
the header; Flush asks in one sentence, with the delay in seconds.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;v1-3-1-kafka&quot;&gt;Kafka&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Searching messages is simpler&lt;/strong&gt; — on a topic&amp;#39;s Messages tab and in Message Search (Commercial), one box searches the
key, the value and the headers at once (&lt;em&gt;Search in: Anywhere&lt;/em&gt;, the default), or only one of them. The less common
options — the filter language, conditions, formats and limits — are under &lt;strong&gt;More options&lt;/strong&gt;. Where to start reads as a
time range (the last 15 minutes, hour, 24 hours or 7 days) as well as the newest, the beginning or a time.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Topics as chips&lt;/strong&gt; — Message Search lists matching topic names as you type, in the console&amp;#39;s own list, and each
chosen topic is a chip.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Name pattern help&lt;/strong&gt; — a &lt;code&gt;?&lt;/code&gt; beside Message Search&amp;#39;s name pattern explains that the whole name must match and gives
examples (Commercial).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Selecting consumer groups to delete stops at 500&lt;/strong&gt; — &lt;em&gt;Select all&lt;/em&gt; takes the first 500 groups in the list&amp;#39;s order and
the other boxes lock, since one deletion takes at most 500; it was possible to select more and have the deletion
refused.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Connectors with a failed task&lt;/strong&gt; — a connector Kafka reports as running while one of its tasks has failed now reads
&lt;strong&gt;Degraded&lt;/strong&gt;, in the list and on the connector&amp;#39;s page; it read Running.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Offsets in full&lt;/strong&gt; — offsets, epochs and sequence numbers are written in full (&lt;em&gt;785,583&lt;/em&gt;) in offset resets, Brokers ▸
Quorum, producers and a topic&amp;#39;s held range; they were shortened (&lt;em&gt;785K&lt;/em&gt;), which hid what a reset would commit.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A consumer group&amp;#39;s lag&lt;/strong&gt; — the figure at the top of a group&amp;#39;s details now agrees with the tables under it; it could
show the lag of the list&amp;#39;s last refresh.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Comparing schema versions&lt;/strong&gt; — the version pickers follow the two panels, older on the left and newer on the right.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Converter settings named apart&lt;/strong&gt; — a connector&amp;#39;s form names the key and value converters&amp;#39; settings &lt;em&gt;Key
encoding&lt;/em&gt; and &lt;em&gt;Value encoding&lt;/em&gt;; both read &lt;em&gt;Encoding&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The Topics page&lt;/strong&gt; is titled Topics and counts topics; it was titled Kafka and counted consumer groups.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;States in words&lt;/strong&gt; — transaction states, broker configuration sources and consumer, share and streams group states
read as words (&lt;em&gt;Complete commit&lt;/em&gt;, &lt;em&gt;Static broker config&lt;/em&gt;, &lt;em&gt;Preparing rebalance&lt;/em&gt;); a configuration source shows
Kafka&amp;#39;s own name on hover.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Known zeros&lt;/strong&gt; — an emptied partition counts &lt;em&gt;0&lt;/em&gt; records, and a topic with no traffic yet shows 0 on its Metrics tab;
both showed a dash.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Samples that match the schema&lt;/strong&gt; — on a topic whose key or value is produced through the Schema Registry,
Produce&amp;#39;s &lt;em&gt;Load sample&lt;/em&gt; fills a sample built from the chosen subject and version (Avro, JSON Schema or Protobuf),
with its defaults, enum symbols and timestamps, which the schema accepts; it filled the same order event on every
topic, which a schema refused. In Batch it fills two such records.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;v1-3-1-apache-artemis&quot;&gt;Apache Artemis&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Selector boxes&lt;/strong&gt; say they hold an example (&lt;em&gt;JMS selector, e.g. tenant = &amp;#39;acme&amp;#39;&lt;/em&gt;); the bare example read like a
filter already applied.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dates instead of milliseconds&lt;/strong&gt; — the broker&amp;#39;s current time on Broker ▸ Configuration, and a held message&amp;#39;s
timestamp and expiry in a transaction&amp;#39;s details, are written as dates.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Subscriptions&lt;/strong&gt; are paged by the broker service with the broker&amp;#39;s own internal queues already left out, so every
page is full and the total counts subscriptions only.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The oldest message&amp;#39;s age&lt;/strong&gt; reads in whole units (&lt;em&gt;22 d&lt;/em&gt;) on a queue&amp;#39;s Overview.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The broker&amp;#39;s own addresses&lt;/strong&gt; — the cluster&amp;#39;s store-and-forward address, the mirror address and
&lt;code&gt;$sys.mqtt.sessions&lt;/code&gt; are recognised as the broker&amp;#39;s own when every queue on them is internal: they are hidden
behind &lt;em&gt;Show internal&lt;/em&gt; and badged &lt;em&gt;Internal&lt;/em&gt; when shown.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A count the broker gets wrong&lt;/strong&gt; — when Artemis reports a negative message, consumer, delivering or scheduled
count, the console shows a dash and says what the broker reported, instead of printing the negative number; alert
rules treat it as not measured.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Anonymous connections&lt;/strong&gt; — a connection whose sessions are all anonymous carries the &lt;em&gt;Anonymous&lt;/em&gt; badge, as its
sessions do; it showed a dash.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Clearer read failures&lt;/strong&gt; — a message list that cannot be read says why in plain words; the broker&amp;#39;s Java exception
no longer reaches the screen, and an unexpected failure points to the broker service&amp;#39;s log.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Count by original address says how much it counted&lt;/strong&gt; — Artemis 2.44 stops this count after 200 messages (the
address&amp;#39;s management browse page size), so a dead-letter queue of 1,500 counted to 200 and the table read as the
whole queue. The result now says &lt;em&gt;Counted 200 of the 1,500 messages in this queue&lt;/em&gt; and why, and with a filter how many
of the messages looked at match; a broker that counts the whole queue shows no such line.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Filtered match counts say &amp;quot;at least&amp;quot;&lt;/strong&gt; — with a selector, the same limit applies to the number of matches on a
queue&amp;#39;s Messages tab, so a filtered bulk action on a large queue could state fewer matches than it would act on. When
the broker stopped counting, the pager shows the figure with a &lt;strong&gt;+&lt;/strong&gt; and the bulk action&amp;#39;s confirmation says &lt;em&gt;at
least&lt;/em&gt; that many and that the broker counted only the first 200 messages.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Message counter times as dates&lt;/strong&gt; — a queue&amp;#39;s Counters tab writes &lt;em&gt;Last sampled&lt;/em&gt;, &lt;em&gt;Last message added&lt;/em&gt; and &lt;em&gt;Last
message acknowledged&lt;/em&gt;, and the hours on its chart, like every other date in the console, in the installation&amp;#39;s time
zone; they showed the broker&amp;#39;s own format (&lt;em&gt;10/20/26, 12:14:14 PM&lt;/em&gt;). A time that cannot be read shows a dash that
says so.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;v1-3-1-redis&quot;&gt;Redis&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Testing a command as an ACL user&lt;/strong&gt; moved to the user&amp;#39;s row menu, &lt;strong&gt;Test command&lt;/strong&gt;. It tests the rules saved on the
server; inside the edit dialog it looked as if it tested the unsaved edits. Anyone who can see the list can use it,
since it is a read. The edit dialog shows every command category, wrapped.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Uptime under an hour&lt;/strong&gt; — Tools ▸ Command activity says how long ago the counters started in minutes when it is
under an hour (&lt;em&gt;25 min&lt;/em&gt;); it read &lt;em&gt;0h&lt;/em&gt;. Longer spans read like the rest of the console (&lt;em&gt;3 d 4 h&lt;/em&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Primary and replica&lt;/strong&gt; — a server&amp;#39;s role reads &lt;em&gt;primary&lt;/em&gt; or &lt;em&gt;replica&lt;/em&gt; everywhere, including the Overview and the
client-type filter when disconnecting clients; it read &lt;em&gt;master&lt;/em&gt; in places.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;JSON keys&lt;/strong&gt; — a RedisJSON key&amp;#39;s type reads &lt;em&gt;json&lt;/em&gt; in the type chip and the type filters, not &lt;em&gt;ReJSON-RL&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pending entries opened by name&lt;/strong&gt; — when a stream is opened from a link or typed in, the line under the picker says
so and how many SCAN calls have looked for others (&lt;em&gt;Opened by name · no others found in 20 SCAN calls so far&lt;/em&gt;); it
read &lt;em&gt;0 found so far&lt;/em&gt; beside the chosen stream.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Overview tables fit their cards&lt;/strong&gt; — the Keyspace and Replication tables no longer scroll sideways and cut off
their last column.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;v1-3-1-rabbitmq&quot;&gt;RabbitMQ&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Rebalance queue leaders on one node&lt;/strong&gt; — the Overview&amp;#39;s Rebalance queue leaders is disabled on a single-node
cluster, with the reason; there is nothing to rebalance there.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Units on rates&lt;/strong&gt; — the In / out column names its unit (msg/s, or B/s on Connections), and a missing value is always
the same dash.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;v1-3-1-memcached&quot;&gt;Memcached&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Why a node refuses Flush&lt;/strong&gt; — the reason on a node started with &lt;code&gt;-F&lt;/code&gt; can be reached with the keyboard as well as by
pointing at it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Item-size histogram labels&lt;/strong&gt; — each bucket is labelled in exact bytes (&lt;em&gt;2,144 B&lt;/em&gt;, &lt;em&gt;2,176 B&lt;/em&gt;), so neighbouring
buckets no longer share one rounded label such as &lt;em&gt;2.1 KB&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;v1-3-1-alerts&quot;&gt;Alerts&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;An incident&amp;#39;s reading&lt;/strong&gt; is labelled &lt;em&gt;Reading when it fired&lt;/em&gt;: it is the value at that moment, while the chart runs on
to now.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;One name for a rule nothing could measure&lt;/strong&gt; — &lt;em&gt;unevaluatable&lt;/em&gt;, in the rule list, its banner and a rule&amp;#39;s Check; the
same state was also called &lt;em&gt;unmeasurable&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;v1-3-1-console&quot;&gt;Console&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Counts read as English&lt;/strong&gt; — messages, keys, records, replicas and the rest are written as &lt;em&gt;1 message&lt;/em&gt; or &lt;em&gt;10
messages&lt;/em&gt;, with the sentence agreeing; they read &lt;em&gt;message(s)&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Live screens on an expired session&lt;/strong&gt; — Memcached &lt;em&gt;Live events&lt;/em&gt;, Kafka consume and message search, and Redis
Pub/Sub and stream following now renew an expired sign-in when they start, as every other screen does, or go to the
sign-in page when the session has ended. They said &lt;em&gt;Authentication is required&lt;/em&gt; and stayed on the console, signed
out, until the page was reloaded.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;v1-3-1-settings-and-connections&quot;&gt;Settings and connections&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Single sign-on providers fit the page&lt;/strong&gt; — the providers table no longer scrolls sideways and cuts off &lt;em&gt;View&lt;/em&gt; in
its header at a common desktop width.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Resource metadata&lt;/strong&gt; — each row has one actions menu; Edit and Delete could fall off the right edge of the table. A
row whose connection was deleted says so, instead of showing the connection&amp;#39;s identifier.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A Kafka connection that is not secure&lt;/strong&gt; is shown as a warning, and its sentence now says the environment&amp;#39;s policy
does not allow skipping the hostname check — it said the check was disabled.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Settings ▸ MCP&lt;/strong&gt; — the Claude Code command wraps inside its box, so the whole command is visible; its end was cut
off.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Settings ▸ Users&lt;/strong&gt; — the column of each user&amp;#39;s roles is titled &lt;strong&gt;Roles&lt;/strong&gt; (it said Groups) and writes them as the
Roles page does; the button that adds a user reads &lt;strong&gt;Add user&lt;/strong&gt; (it said Create members).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Connections&lt;/strong&gt; — every row keeps the same actions column, so the status labels line up across platforms.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Single sign-on&lt;/strong&gt; with no provider shows one &lt;em&gt;New provider&lt;/em&gt; button, and empty lists there show no &lt;em&gt;0–0 of 0&lt;/em&gt; pager.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Settings ▸ About&lt;/strong&gt; links the Licence page it mentions.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;v1-3-1-known-limitations&quot;&gt;Known limitations&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;The API runs as a single replica; there is no high-availability mode.&lt;/li&gt;
&lt;li&gt;TLS is not terminated in the stack: put a reverse proxy or a load balancer in front.&lt;/li&gt;
&lt;li&gt;The Compose recipe runs its own PostgreSQL; it has no setting for an external one.&lt;/li&gt;
&lt;li&gt;No multi-factor authentication of Broka&amp;#39;s own. With single sign-on, a second factor the identity provider says was
used is recorded.&lt;/li&gt;
&lt;li&gt;Single sign-on speaks OpenID Connect and LDAP, not SAML: a provider that speaks only SAML is bridged through an
identity provider that speaks both.&lt;/li&gt;
&lt;li&gt;Nothing is provisioned from an identity provider. Someone removed there keeps an open session until its maximum
length, and an account that signs in only through the provider keeps its API tokens until 30 days without a sign-in;
disable the account in Broka to stop it at once.&lt;/li&gt;
&lt;li&gt;Google sends no groups, so a Google provider maps no groups to teams and creates no accounts.&lt;/li&gt;
&lt;li&gt;A sign-in that carries no groups changes no team membership, and some identity providers, Okta, Microsoft Entra
ID and Keycloak among them, send no groups at all for someone in none of the groups they are set to send. Removing someone from
their last mapped group there changes nothing in Broka: disable the account, unlink it or remove the mapping.&lt;/li&gt;
&lt;li&gt;No self-service password reset in the console: an administrator resets a user&amp;#39;s password.&lt;/li&gt;
&lt;li&gt;The metric history starts empty. Charts, changes, comparisons and bands have nothing to draw or compare with until it
fills, and a band waits for three days of its hour.&lt;/li&gt;
&lt;li&gt;A connection keeps at most 1,000 series; a resource beyond them has no chart. A Redis stream has a chart only when an
alert rule watches it.&lt;/li&gt;
&lt;li&gt;The Brokers ▸ Graphs JMX figures are live. A JMX figure is kept in the history only when an alert rule watches it.&lt;/li&gt;
&lt;li&gt;If every broker of a Kafka cluster is replaced at once by brokers with other names, Broka finds the new ones when the
connection&amp;#39;s settings are changed or the broker service is restarted.&lt;/li&gt;
&lt;li&gt;The release check needs a route to &lt;code&gt;license.broka.dev&lt;/code&gt;; without one, Settings ▸ System cannot tell you that a newer
release exists, or that a security advisory affects the version you run.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;v1-3-1-upgrade-notes&quot;&gt;Upgrade notes&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Change the pinned version.&lt;/strong&gt; Set &lt;code&gt;BROKA_VERSION&lt;/code&gt; to &lt;code&gt;1.3.1&lt;/code&gt; in your &lt;code&gt;.env&lt;/code&gt;, take the new &lt;code&gt;compose.yml&lt;/code&gt;, pull and
start. Nothing else in the recipe changed.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No database migration.&lt;/strong&gt; This release changes no table, so 1.3.0 can be put back on the same database by setting
&lt;code&gt;BROKA_VERSION&lt;/code&gt; back.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Commercial:&lt;/strong&gt; upgrading a Commercial installation is described in the customer portal.&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <id>https://broka.dev/release-notes#v1-3-0</id>
    <title>Broka 1.3.0</title>
    <link rel="alternate" type="text/html" href="https://broka.dev/release-notes#v1-3-0"/>
    <updated>2026-10-16T00:00:00Z</updated>
    <content type="html">&lt;h3 id=&quot;v1-3-0-highlights&quot;&gt;Highlights&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Single sign-on&lt;/strong&gt; (Commercial). People sign in through your organisation&amp;#39;s identity provider — Okta, Microsoft
Entra ID, Google, Keycloak or any other OpenID Connect provider — or with their directory password over LDAP, from
Active Directory or OpenLDAP. Groups at the provider map to Broka teams, and accounts can be created at a first
sign-in, inside the limits you set. Signing in with a password stays available, always.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Message Search&lt;/strong&gt; (Commercial). One search reads many Kafka topics at once — by name, by a name pattern, by a
consumer group&amp;#39;s topics or all of them — with the message browser&amp;#39;s filter, and shows the topic of each match. Export
the results, produce one again to any topic, and save the search for yourself or a team.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Deleting consumer groups in bulk.&lt;/strong&gt; Tick several groups and delete them together, or clean up the empty groups
whose names match a pattern, such as the ones console consumers leave behind.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;v1-3-0-changes&quot;&gt;Changes&lt;/h3&gt;
&lt;h4 id=&quot;v1-3-0-single-sign-on-commercial&quot;&gt;Single sign-on (Commercial)&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Providers&lt;/strong&gt; — in Settings ▸ Security ▸ Single sign-on: OpenID Connect and LDAP providers, several at once, each
enabled only after a test has passed with its saved settings. &lt;em&gt;Test sign-in&lt;/em&gt; signs nobody in, links nothing and
creates nothing; a directory has &lt;em&gt;Test connection&lt;/em&gt; and &lt;em&gt;Look up a person&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Signing in&lt;/strong&gt; — one button per OpenID Connect provider, above the password form, which is always there. A
directory&amp;#39;s people sign in on the password form, with their e-mail address and directory password.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Which account&lt;/strong&gt; — an identity is linked to an account by the provider&amp;#39;s own identifier for the person. An existing
account can be linked by a verified e-mail address in your domains, never one that can manage anything in Broka; an
account can be created at a first sign-in, only for a verified address in your domains with a mapped group, under an
hourly ceiling. An administrator links anyone else from their refused sign-in.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Groups and teams&lt;/strong&gt; — a mapped group puts people in its team at each sign-in and takes them out when a sign-in no
longer carries the group. Memberships added by hand are never changed.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sessions&lt;/strong&gt; — a session started through a provider lasts at most the provider&amp;#39;s maximum length, 12 hours by default.
An account that signs in only through a provider stops using its API tokens after 30 days without such a sign-in.
Signing out of Broka can sign the person out of the provider too.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Disabling a provider&lt;/strong&gt; ends every session it started, at once.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The audit trail&lt;/strong&gt; records how each session was signed in, through which provider, and whether the provider said a
second factor was used.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;v1-3-0-kafka&quot;&gt;Kafka&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Message Search&lt;/strong&gt; (Commercial) — Kafka ▸ Message Search reads up to 50 topics at once: the names you type, every
topic whose whole name matches a pattern, a consumer group&amp;#39;s topics, or all of them. It starts at the newest records,
the beginning or a time, and filters with the message browser&amp;#39;s own filter, conditions and formats. Topics you may not
read are left out and counted. Each topic keeps a share of the limit while it is being read, so a busy topic cannot
crowd out a quiet one. Results can be exported as NDJSON or CSV, produced again to their own topic or another with an
&lt;code&gt;x-broka-origin&lt;/code&gt; header, and the search saved for yourself, a team or everyone. Each topic read is recorded in the
audit trail as its own read. In Community the entry is shown, marked Commercial.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Deleting consumer groups in bulk&lt;/strong&gt; — tick groups in the consumer groups list and choose &lt;strong&gt;Actions ▸ Delete
selected&lt;/strong&gt;, or &lt;strong&gt;Clean up&lt;/strong&gt; the empty groups whose names match a pattern (&lt;code&gt;console-consumer-*&lt;/code&gt;). Clean up lists the groups
it will delete first; both ask for a reason and confirm, up to 500 groups at once. Kafka deletes only a group without members, so a group that is
consuming is never offered and is refused in a selection; a card names every group that was not deleted, and why. On a
protected environment the same guard applies as to deleting one group.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;v1-3-0-users-and-teams&quot;&gt;Users and teams&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;A password administrator is always kept&lt;/strong&gt; — at least one account that can sign in with a Broka password and
holds both Manage users and Manage security settings. A change that would remove the last is refused, and unused
accounts are never disabled past it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;How each account signs in&lt;/strong&gt; (Commercial) — a &lt;em&gt;Sign-in&lt;/em&gt; column in Settings ▸ Users, and a &lt;em&gt;Sign-in&lt;/em&gt; tab in the
user&amp;#39;s panel for linking, unlinking and linking to a directory. In Community the tab is shown locked.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Memberships a group gives&lt;/strong&gt; (Commercial) are marked in a team&amp;#39;s Members, and removing someone by hand there takes
away only the membership you added.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A deleted account&amp;#39;s identities are blocked&lt;/strong&gt; (Commercial): signing in through a provider again creates no new
account until an administrator lifts the block.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;v1-3-0-console&quot;&gt;Console&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Dates in one format&lt;/strong&gt; — every date and time is written the same way whatever the browser&amp;#39;s language, day first,
24-hour, in the installation&amp;#39;s time zone (&lt;em&gt;15 Oct 2026, 14:09:50&lt;/em&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The installation&amp;#39;s time zone is set at setup&lt;/strong&gt; — the time zone chosen on the first-run screen now becomes the
installation&amp;#39;s display zone; it was kept only on the administrator&amp;#39;s profile, which left times in UTC.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A dialog stays open while you type&lt;/strong&gt; — a dialog or side panel no longer closes when you press a password manager&amp;#39;s
or a writing assistant&amp;#39;s button drawn over one of its fields. A press on the dimmed page around it still closes it.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;v1-3-0-rabbitmq&quot;&gt;RabbitMQ&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;A queue&amp;#39;s figures follow a change&lt;/strong&gt; — after a publish, a purge or another write on a queue&amp;#39;s page, its statistics
keep refreshing for a full 15 seconds from that change, so a purge shortly after a publish no longer leaves the Ready
count frozen.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;v1-3-0-security&quot;&gt;Security&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;The API&amp;#39;s .NET runtime&lt;/strong&gt; — updated to 10.0.13, which closes five CVEs in the runtime&amp;#39;s XML signature and
encryption and CMS libraries; none was reachable in the way Broka ships — see
&lt;a href=&quot;https://broka.dev/security/advisories/BROKA-SA-2026-002&quot;&gt;BROKA-SA-2026-002&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;v1-3-0-known-limitations&quot;&gt;Known limitations&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;The API runs as a single replica; there is no high-availability mode.&lt;/li&gt;
&lt;li&gt;TLS is not terminated in the stack: put a reverse proxy or a load balancer in front.&lt;/li&gt;
&lt;li&gt;The Compose recipe runs its own PostgreSQL; it has no setting for an external one.&lt;/li&gt;
&lt;li&gt;No multi-factor authentication of Broka&amp;#39;s own. With single sign-on, a second factor the identity provider says was
used is recorded.&lt;/li&gt;
&lt;li&gt;Single sign-on speaks OpenID Connect and LDAP, not SAML: a provider that speaks only SAML is bridged through an
identity provider that speaks both.&lt;/li&gt;
&lt;li&gt;Nothing is provisioned from an identity provider. Someone removed there keeps an open session until its maximum
length, and an account that signs in only through the provider keeps its API tokens until 30 days without a sign-in;
disable the account in Broka to stop it at once.&lt;/li&gt;
&lt;li&gt;Google sends no groups, so a Google provider maps no groups to teams and creates no accounts.&lt;/li&gt;
&lt;li&gt;A sign-in that carries no groups changes no team membership, and some identity providers, Okta, Microsoft Entra
ID and Keycloak among them, send no groups at all for someone in none of the groups they are set to send. Removing someone from
their last mapped group there changes nothing in Broka: disable the account, unlink it or remove the mapping.&lt;/li&gt;
&lt;li&gt;No self-service password reset in the console: an administrator resets a user&amp;#39;s password.&lt;/li&gt;
&lt;li&gt;The metric history starts empty. Charts, changes, comparisons and bands have nothing to draw or compare with until it
fills, and a band waits for three days of its hour.&lt;/li&gt;
&lt;li&gt;A connection keeps at most 1,000 series; a resource beyond them has no chart. A Redis stream has a chart only when an
alert rule watches it.&lt;/li&gt;
&lt;li&gt;The Brokers ▸ Graphs JMX figures are live. A JMX figure is kept in the history only when an alert rule watches it.&lt;/li&gt;
&lt;li&gt;If every broker of a Kafka cluster is replaced at once by brokers with other names, Broka finds the new ones when the
connection&amp;#39;s settings are changed or the broker service is restarted.&lt;/li&gt;
&lt;li&gt;The release check needs a route to &lt;code&gt;license.broka.dev&lt;/code&gt;; without one, Settings ▸ System cannot tell you that a newer
release exists, or that a security advisory affects the version you run.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;v1-3-0-upgrade-notes&quot;&gt;Upgrade notes&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Change the pinned version.&lt;/strong&gt; Set &lt;code&gt;BROKA_VERSION&lt;/code&gt; to &lt;code&gt;1.3.0&lt;/code&gt; in your &lt;code&gt;.env&lt;/code&gt;, take the new &lt;code&gt;compose.yml&lt;/code&gt;, pull and
start. The API applies its database migrations when it starts; they only add tables and columns, and every session
open at the upgrade carries on as a password session.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Back up first.&lt;/strong&gt; Back up the database, and &lt;code&gt;.env&lt;/code&gt; with it — &lt;code&gt;BROKA_KEK&lt;/code&gt; decrypts every stored credential.
Migrations go forward only: moving back to 1.2.1 on the same database is not supported.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Commercial: nothing is switched on.&lt;/strong&gt; No identity provider exists until one is added, and the sign-in page is
unchanged until one is enabled. Upgrading a Commercial installation, and what single sign-on needs from the
deployment, are described in the customer portal.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Moving from Commercial back to Community&lt;/strong&gt; removes sign-in through identity providers. Accounts with no Broka
password — created at a first sign-in, or linked to a directory — sign in again once an administrator&amp;#39;s &lt;em&gt;Reset
password&lt;/em&gt; gives them one.&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <id>https://broka.dev/guides/hardening-a-self-hosted-console</id>
    <title>Hardening a self-hosted operations console</title>
    <link rel="alternate" type="text/html" href="https://broka.dev/guides/hardening-a-self-hosted-console"/>
    <updated>2026-10-15T00:00:00Z</updated>
    <summary>The order of decisions after install — broker credentials, environment policy, roles, the brokers' own authorisation, TLS at the edge, the key you cannot lose, and the trail you can stand behind.</summary>
  </entry>
  <entry>
    <id>https://broka.dev/guides/production-deployment-checklist</id>
    <title>Production deployment checklist</title>
    <link rel="alternate" type="text/html" href="https://broka.dev/guides/production-deployment-checklist"/>
    <updated>2026-10-15T00:00:00Z</updated>
    <summary>Four containers, one port, one volume, one irreplaceable key. What to settle before the first `docker compose up -d` in production, and what restart, upgrade and restore look like afterwards.</summary>
  </entry>
  <entry>
    <id>https://broka.dev/guides/tamper-evident-audit-trail</id>
    <title>What a tamper-evident audit trail actually buys you</title>
    <link rel="alternate" type="text/html" href="https://broka.dev/guides/tamper-evident-audit-trail"/>
    <updated>2026-10-15T00:00:00Z</updated>
    <summary>A sealed trail does not stop anyone changing a record. It makes a change visible to whoever holds a copy the changer could not reach — what BROKA seals, how to check it with a tool that is not BROKA, and where the proof stops.</summary>
  </entry>
  <entry>
    <id>https://broka.dev/release-notes#v1-2-1</id>
    <title>Broka 1.2.1</title>
    <link rel="alternate" type="text/html" href="https://broka.dev/release-notes#v1-2-1"/>
    <updated>2026-10-12T00:00:00Z</updated>
    <content type="html">&lt;h3 id=&quot;v1-2-1-changes&quot;&gt;Changes&lt;/h3&gt;
&lt;h4 id=&quot;v1-2-1-settings&quot;&gt;Settings&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Security advisories on the Version card&lt;/strong&gt; — when a &lt;a href=&quot;https://broka.dev/security/advisories&quot;&gt;security advisory&lt;/a&gt; we have published
affects the version an installation runs, the release check&amp;#39;s answer names it, and Settings ▸ System lists it on the
Version card: its title, which opens the advisory on broka.dev, then its identifier, its severity and the version
that fixes it. The row is there only while an advisory applies; upgrading past the fix clears it at the next check.
The check sends the same fields as before.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;v1-2-1-security&quot;&gt;Security&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;The broker service&amp;#39;s own libraries name themselves&lt;/strong&gt; — each module of the broker service now carries its own
Maven coordinates. Image scanners took one module for Kestra&amp;#39;s &lt;code&gt;io.kestra:core&lt;/code&gt; and reported CVE-2026-73247 against
the 1.2.0 broker image, and another for a Kora library; Broka contains no Kestra or Kora code. The 1.2.1 images and
their SBOMs name the modules as what they are.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;v1-2-1-known-limitations&quot;&gt;Known limitations&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;The API runs as a single replica; there is no high-availability mode.&lt;/li&gt;
&lt;li&gt;TLS is not terminated in the stack: put a reverse proxy or a load balancer in front.&lt;/li&gt;
&lt;li&gt;The Compose recipe runs its own PostgreSQL; it has no setting for an external one.&lt;/li&gt;
&lt;li&gt;No single sign-on (SSO, LDAP) and no multi-factor authentication.&lt;/li&gt;
&lt;li&gt;No self-service password reset in the console: an administrator resets a user&amp;#39;s password.&lt;/li&gt;
&lt;li&gt;The metric history starts empty. Charts, changes, comparisons and bands have nothing to draw or compare with until it
fills, and a band waits for three days of its hour.&lt;/li&gt;
&lt;li&gt;A connection keeps at most 1,000 series; a resource beyond them has no chart. A Redis stream has a chart only when an
alert rule watches it.&lt;/li&gt;
&lt;li&gt;The Brokers ▸ Graphs JMX figures are live. A JMX figure is kept in the history only when an alert rule watches it.&lt;/li&gt;
&lt;li&gt;If every broker of a Kafka cluster is replaced at once by brokers with other names, Broka finds the new ones when the
connection&amp;#39;s settings are changed or the broker service is restarted.&lt;/li&gt;
&lt;li&gt;The release check needs a route to &lt;code&gt;license.broka.dev&lt;/code&gt;; without one, Settings ▸ System cannot tell you that a newer
release exists, or that a security advisory affects the version you run.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;v1-2-1-upgrade-notes&quot;&gt;Upgrade notes&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Change the pinned version.&lt;/strong&gt; Set &lt;code&gt;BROKA_VERSION&lt;/code&gt; to &lt;code&gt;1.2.1&lt;/code&gt; in your &lt;code&gt;.env&lt;/code&gt;, take the new &lt;code&gt;compose.yml&lt;/code&gt;, pull and
start. The API applies one database migration when it starts; it adds a column.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Back up first.&lt;/strong&gt; Back up the database, and &lt;code&gt;.env&lt;/code&gt; with it — &lt;code&gt;BROKA_KEK&lt;/code&gt; decrypts every stored credential.
Migrations go forward only: moving back to 1.2.0 on the same database is not supported. Upgrading a Commercial
installation is described in the customer portal.&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <id>https://broka.dev/guides/whats-new-in-broka-1-2</id>
    <title>What changed in BROKA from 1.1 to 1.2</title>
    <link rel="alternate" type="text/html" href="https://broka.dev/guides/whats-new-in-broka-1-2"/>
    <updated>2026-10-12T00:00:00Z</updated>
    <summary>BROKA keeps what it measures now: a metric history in your own database, charts on topics, groups, queues and nodes, alert rules of several conditions that compare a figure with its past, and a new Redis key browser.</summary>
  </entry>
  <entry>
    <id>https://broka.dev/release-notes#v1-2-0</id>
    <title>Broka 1.2.0</title>
    <link rel="alternate" type="text/html" href="https://broka.dev/release-notes#v1-2-0"/>
    <updated>2026-10-11T00:00:00Z</updated>
    <content type="html">&lt;h3 id=&quot;v1-2-0-highlights&quot;&gt;Highlights&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Metric history.&lt;/strong&gt; Broka now keeps what it measures: every figure an alert rule watches and a default set for
every connection — a reading a minute for 48 hours, then one an hour for 7, 30, 45 or 90 days, in the installation&amp;#39;s
own database.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Charts.&lt;/strong&gt; Topics, consumer groups, queues, streams and nodes have a Metrics tab. An alert rule shows the last six
hours of what it would watch, and an incident shows its figure from before it fired to when it closed.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Alert rules with conditions.&lt;/strong&gt; A rule can hold up to four conditions on the same resource — depth above 1,000 and
no consumers — and compare a figure with its own past: a change over a window, the same time yesterday or last week,
or its usual range for the hour.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A new Redis key browser.&lt;/strong&gt; Keys fold into a tree, a search matches by part of a name, a pattern or the exact name,
and a value opens in the format it was stored in.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;v1-2-0-changes&quot;&gt;Changes&lt;/h3&gt;
&lt;h4 id=&quot;v1-2-0-monitoring&quot;&gt;Monitoring&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Metric history&lt;/strong&gt; — once a minute the alert evaluator keeps the figures it read: every metric an enabled rule
watches, then a default set for the connection, at most 1,000 series a connection with a rule&amp;#39;s series kept first.
The default set: on Kafka the cluster&amp;#39;s throughput, under-replicated partitions and size, each topic&amp;#39;s produce rate,
messages and size, and each consumer group&amp;#39;s lag and consume rate; on Redis memory, operations a second, connected
clients, hit rate and keys; on RabbitMQ the publish and deliver rates and messages, and each queue&amp;#39;s messages,
unacknowledged messages and consumers; on Apache Artemis each queue&amp;#39;s messages, consumers and messages in delivery,
and each address&amp;#39;s size; on Memcached each node&amp;#39;s memory, hit rate, items and connections. A reading that could not
be taken is a gap in the history, never a zero.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;How long it is kept&lt;/strong&gt; — the minute readings for 48 hours, then the hour&amp;#39;s mean, minimum and maximum for the
retention you choose in Settings ▸ System: 7, 30, 45 or 90 days, 7 unless you change it. Shortening it asks first and
removes the history beyond the new window at once.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Metrics tabs&lt;/strong&gt; — a chart for every figure kept for the resource, over 1 hour, 6 hours, 24 hours, 7 days, or the
retention when it is longer: a Kafka topic and consumer group, a RabbitMQ queue, an Apache Artemis queue, a Redis
stream that an alert rule watches, and Memcached&amp;#39;s nodes. An Apache Artemis address and the Kafka, Redis and RabbitMQ
overviews show the same charts in a Metrics section.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A chart follows the page&amp;#39;s permissions&lt;/strong&gt; — the history of a topic, a consumer group or a connector you may not view
is not shown to you, and a platform you may not view has no charts for you.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;v1-2-0-alerts&quot;&gt;Alerts&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Conditions&lt;/strong&gt; — a rule holds one to four conditions, all of which must hold on the same resource at the same time.
&lt;em&gt;Add a condition&lt;/em&gt; offers only the metrics that describe the same kind of resource as the first.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A change&lt;/strong&gt; — how far a figure rose or fell over the last 5 minutes to 24 hours, in percent or in its own unit.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Compared with the past&lt;/strong&gt; — how far a figure is from the same minute yesterday or the same hour last week, in
percent.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Its usual band&lt;/strong&gt; — whether a figure is above, below or outside the range of the same hour over the last seven
days: its mean plus or minus 1 to 10 standard deviations, used once three days of that hour are kept.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Not enough history yet&lt;/strong&gt; — a condition whose past is not kept yet neither fires nor clears. The rule says why, and
an open incident stays open.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Check&lt;/strong&gt; — the dry run decides an unsaved rule&amp;#39;s conditions as the evaluator will, past included, and draws the
last six hours of the first five resources it measured, with the threshold when the rule is one plain threshold.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;An incident&amp;#39;s chart&lt;/strong&gt; — an incident&amp;#39;s detail draws its figure from an hour before it fired to when it closed, or
to now while it is open.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;What fired, condition by condition&lt;/strong&gt; — an incident of a rule with conditions, and its notification, name each
condition with what it read; the reason it closed follows them.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The rule list&lt;/strong&gt; — the &lt;em&gt;Condition&lt;/em&gt; column reads every condition of a rule.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;v1-2-0-kafka&quot;&gt;Kafka&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;A cluster that is down no longer fills the log&lt;/strong&gt; — while a registered Kafka cluster answered nothing, the client
Broka keeps for it went back to the cluster&amp;#39;s bootstrap servers in a loop and logged each attempt, a few lines a
second at first and hundreds a second within minutes. It now waits for the cluster at the addresses it knows, logs
one warning per reconnect attempt, and carries on within seconds of the cluster&amp;#39;s return.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A topic&amp;#39;s rates&lt;/strong&gt; — the bytes and messages in and out set their unit beside the figure, so a row of cards no
longer breaks a rate over two lines; a topic of one partition reads &lt;em&gt;1 partition&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;v1-2-0-redis&quot;&gt;Redis&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Keys as a tree&lt;/strong&gt; — the loaded keys fold into a tree on a separator you choose, kept per connection, with the count
under each folder; the table is still there as a view. &lt;em&gt;Load more&lt;/em&gt; adds to what is loaded, up to 50,000 keys.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Search&lt;/strong&gt; — by &lt;em&gt;Contains&lt;/em&gt; (the default), &lt;em&gt;Glob&lt;/em&gt; or &lt;em&gt;Exact name&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The key beside the list&lt;/strong&gt; — the open key sits beside the list instead of in a sheet, and the arrow keys move
through the keys. The first page of keys is read when the page opens.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Values in their format&lt;/strong&gt; — Text, JSON, Hex, MessagePack, Gzip, Deflate or Brotli, detected or chosen, edited and
saved back in the format they were stored in (Brotli is saved uncompressed); PHP serialize, Java serialization and
Pickle are shown and not edited. A value too large or too deeply nested to show is cut rather than left to hang the
page.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Inside a collection&lt;/strong&gt; — a hash, set or sorted set is filtered on the server; a sorted set is read in score order,
highest or lowest first; &lt;em&gt;N of M loaded&lt;/em&gt;; and &lt;em&gt;Copy as command&lt;/em&gt; writes the commands that recreate a key.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Listing keys is an ordinary read&lt;/strong&gt; — listing keys, the keyspace analysis and the hot-key ranking no longer ask for
a confirmation, and neither does listing Memcached&amp;#39;s keys.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;v1-2-0-security&quot;&gt;Security&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;The console&amp;#39;s HTML sanitiser&lt;/strong&gt; — DOMPurify is updated to 3.4.16.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The images&lt;/strong&gt; — the broker service carries lz4-java 1.11.4 and no longer ships Ubuntu&amp;#39;s unused &lt;code&gt;pebble&lt;/code&gt; service
manager; the console&amp;#39;s image takes libtiff 4.7.2. Each closes a high-severity CVE with a published fix; none was
reachable in the way Broka ships — see &lt;a href=&quot;https://broka.dev/security/advisories/BROKA-SA-2026-001&quot;&gt;BROKA-SA-2026-001&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;v1-2-0-known-limitations&quot;&gt;Known limitations&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;The API runs as a single replica; there is no high-availability mode.&lt;/li&gt;
&lt;li&gt;TLS is not terminated in the stack: put a reverse proxy or a load balancer in front.&lt;/li&gt;
&lt;li&gt;The Compose recipe runs its own PostgreSQL; it has no setting for an external one.&lt;/li&gt;
&lt;li&gt;No single sign-on (SSO, LDAP) and no multi-factor authentication.&lt;/li&gt;
&lt;li&gt;No self-service password reset in the console: an administrator resets a user&amp;#39;s password.&lt;/li&gt;
&lt;li&gt;The metric history starts empty. Charts, changes, comparisons and bands have nothing to draw or compare with until it
fills, and a band waits for three days of its hour.&lt;/li&gt;
&lt;li&gt;A connection keeps at most 1,000 series; a resource beyond them has no chart. A Redis stream has a chart only when an
alert rule watches it.&lt;/li&gt;
&lt;li&gt;The Brokers ▸ Graphs JMX figures are live. A JMX figure is kept in the history only when an alert rule watches it.&lt;/li&gt;
&lt;li&gt;If every broker of a Kafka cluster is replaced at once by brokers with other names, Broka finds the new ones when the
connection&amp;#39;s settings are changed or the broker service is restarted.&lt;/li&gt;
&lt;li&gt;The release check needs a route to &lt;code&gt;license.broka.dev&lt;/code&gt;; without one, Settings ▸ System cannot tell you that a newer
release exists.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;v1-2-0-upgrade-notes&quot;&gt;Upgrade notes&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Change the pinned version.&lt;/strong&gt; Set &lt;code&gt;BROKA_VERSION&lt;/code&gt; to &lt;code&gt;1.2.0&lt;/code&gt; in your &lt;code&gt;.env&lt;/code&gt;, take the new &lt;code&gt;compose.yml&lt;/code&gt;, pull and
start. The API applies its database migrations when it starts; they only add tables and columns.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Back up first.&lt;/strong&gt; Back up the database, and &lt;code&gt;.env&lt;/code&gt; with it — &lt;code&gt;BROKA_KEK&lt;/code&gt; decrypts every stored credential.
Migrations go forward only: moving back to 1.1.2 on the same database is not supported.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Plan for the history&amp;#39;s space.&lt;/strong&gt; A connection at its 1,000 series takes about 180 MB with 7 days kept and about
300 MB with 90 days; the 48 hours of minute readings are most of it. Fewer series take less.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Your rules are unchanged.&lt;/strong&gt; Each existing rule is a rule of one condition and works as before. Upgrading a
Commercial installation is described in the customer portal.&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <id>https://broka.dev/guides/kafka-admin-client-rebootstrap-loop</id>
    <title>When a Kafka cluster is down, its admin client can fill your log</title>
    <link rel="alternate" type="text/html" href="https://broka.dev/guides/kafka-admin-client-rebootstrap-loop"/>
    <updated>2026-10-11T00:00:00Z</updated>
    <summary>Since Kafka 4.0, a Java admin client that can reach no broker goes back to its bootstrap servers in a loop and logs every attempt — about 90 MB a minute with the client's defaults once it settles, for as long as the cluster is down. What we measured, why it happens, what does not help, and the one setting that stops it.</summary>
  </entry>
  <entry>
    <id>https://broka.dev/guides/alert-rules-you-can-trust</id>
    <title>Alert rules you can trust</title>
    <link rel="alternate" type="text/html" href="https://broka.dev/guides/alert-rules-you-can-trust"/>
    <updated>2026-10-10T00:00:00Z</updated>
    <summary>Write each alert rule from the metric catalogue, measure it against your live estate before saving, and read its state for what it is — a rule nothing could measure has not passed.</summary>
  </entry>
  <entry>
    <id>https://broka.dev/guides/consumer-lag-without-guesswork</id>
    <title>Investigating consumer lag without guesswork</title>
    <link rel="alternate" type="text/html" href="https://broka.dev/guides/consumer-lag-without-guesswork"/>
    <updated>2026-10-10T00:00:00Z</updated>
    <summary>Read offset lag for what it counts, time lag for what it measures, find the stuck member, and preview a reset before applying it.</summary>
  </entry>
  <entry>
    <id>https://broka.dev/guides/queue-backlogs</id>
    <title>Queue backlogs: drain, divert, or let it run</title>
    <link rel="alternate" type="text/html" href="https://broka.dev/guides/queue-backlogs"/>
    <updated>2026-10-10T00:00:00Z</updated>
    <summary>A backlog is two numbers, not one — waiting and in flight — and the split decides whether you let it drain, divert it, or purge it. The same read works on RabbitMQ, Kafka and Redis Streams.</summary>
  </entry>
  <entry>
    <id>https://broka.dev/guides/kafka-broker-health-over-jmx</id>
    <title>Reading Kafka broker health over JMX</title>
    <link rel="alternate" type="text/html" href="https://broka.dev/guides/kafka-broker-health-over-jmx"/>
    <updated>2026-10-10T00:00:00Z</updated>
    <summary>The Admin API says what a Kafka cluster holds, not how hard its brokers are working. Set up JMX once and BROKA reads a fixed list of health, request, saturation, disk and JVM figures from every broker and controller, shows them where you already look and lets a rule watch them.</summary>
  </entry>
  <entry>
    <id>https://broka.dev/guides/an-ai-assistant-under-the-same-rules</id>
    <title>An AI assistant, under the same rules as a person</title>
    <link rel="alternate" type="text/html" href="https://broka.dev/guides/an-ai-assistant-under-the-same-rules"/>
    <updated>2026-10-09T00:00:00Z</updated>
    <summary>Giving an assistant broker access usually means handing it a broker credential. BROKA's MCP server has it act as one person instead — that person's permissions, the environment's guards, and the same audit trail.</summary>
  </entry>
  <entry>
    <id>https://broka.dev/guides/give-broker-resources-an-owner</id>
    <title>Giving broker resources an owner</title>
    <link rel="alternate" type="text/html" href="https://broka.dev/guides/give-broker-resources-an-owner"/>
    <updated>2026-10-09T00:00:00Z</updated>
    <summary>A broker knows its topics, queues and keys, not the service behind each one or the team to call. The application catalogue records that: an owner and a team per service, bindings that say what it does with each resource, and dependencies, health and alerts that follow from them.</summary>
  </entry>
  <entry>
    <id>https://broka.dev/guides/kafka-connect-without-guesswork</id>
    <title>Kafka Connect without guesswork</title>
    <link rel="alternate" type="text/html" href="https://broka.dev/guides/kafka-connect-without-guesswork"/>
    <updated>2026-10-09T00:00:00Z</updated>
    <summary>A connector can read RUNNING while one of its tasks has failed. Read the worker, then the connector, then its tasks — and act as narrowly as the problem.</summary>
  </entry>
  <entry>
    <id>https://broka.dev/guides/kafka-acls-by-principal</id>
    <title>Reading Kafka ACLs by principal</title>
    <link rel="alternate" type="text/html" href="https://broka.dev/guides/kafka-acls-by-principal"/>
    <updated>2026-10-09T00:00:00Z</updated>
    <summary>Kafka keeps its permissions as a flat list of bindings. Read them per principal instead — one rule per row, denies first — and change them as a draft that is applied in a safe order, guarded and recorded.</summary>
  </entry>
  <entry>
    <id>https://broka.dev/guides/read-messages-without-the-secrets</id>
    <title>Reading messages without the secrets in them</title>
    <link rel="alternate" type="text/html" href="https://broka.dev/guides/read-messages-without-the-secrets"/>
    <updated>2026-10-09T00:00:00Z</updated>
    <summary>Developers need to open a topic or a queue to debug it; the messages carry fields they have no reason to see. Masking rules hide those fields on every path that shows contents, fail closed, and leave a recorded permission for the few who need them as they are.</summary>
  </entry>
  <entry>
    <id>https://broka.dev/guides/whats-new-in-broka-1-1</id>
    <title>What changed in BROKA from 1.0 to 1.1</title>
    <link rel="alternate" type="text/html" href="https://broka.dev/guides/whats-new-in-broka-1-1"/>
    <updated>2026-10-09T00:00:00Z</updated>
    <summary>Four releases in four days: Kafka's own health over JMX, alerts on Connect and the Schema Registry, an MCP server and data masking in Commercial, a release check, and unused accounts disabled by default.</summary>
  </entry>
  <entry>
    <id>https://broka.dev/release-notes#v1-1-1</id>
    <title>Broka 1.1.1</title>
    <link rel="alternate" type="text/html" href="https://broka.dev/release-notes#v1-1-1"/>
    <updated>2026-10-08T00:00:00Z</updated>
    <content type="html">&lt;h3 id=&quot;v1-1-1-changes&quot;&gt;Changes&lt;/h3&gt;
&lt;h4 id=&quot;v1-1-1-kafka&quot;&gt;Kafka&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Client metrics, chosen rather than typed&lt;/strong&gt; — the subscription dialog offers the metrics as choices (producer,
consumer, every metric) with other prefixes beside them, the push interval as a list with Kafka&amp;#39;s five minutes chosen
for a new subscription, and the clients to match as rows of a selector and a pattern. What is saved is the same
subscription as before.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Client metrics on Kafka 3.7 to 3.9&lt;/strong&gt; — a subscription with no match (every client) or no metrics is made there as
well; those versions refused an empty match as an illegal client matching pattern.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Clearing the Topics search ends a cluster search&lt;/strong&gt; — after Enter had searched the whole cluster, emptying the box
left that search applied, and the page said the cluster had no topics. The Topics card now reads &lt;em&gt;Matching topics&lt;/em&gt;
while a cluster search runs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reading from a time refuses a value that is not a time&lt;/strong&gt; — a read asked to start from a timestamp written as text,
such as a date, started from the beginning of the topic without a word; it is refused, with the reason.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;v1-1-1-redis&quot;&gt;Redis&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Times in the installation&amp;#39;s time zone&lt;/strong&gt; — stream entries, the live tail, Pub/Sub messages, latency events, the slow
log and hot-key tracking showed the browser&amp;#39;s time zone instead of the one every other screen uses.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Switching cluster ends a Pub/Sub watch&lt;/strong&gt; — a running watch kept the previous cluster&amp;#39;s messages coming under the
new cluster&amp;#39;s name.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;v1-1-1-memcached&quot;&gt;Memcached&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Switching cluster ends the live events watch&lt;/strong&gt; and starts over on the new cluster&amp;#39;s first node; the Keys and Memory
pages also choose the new cluster&amp;#39;s node instead of keeping the old one&amp;#39;s.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;v1-1-1-alerts&quot;&gt;Alerts&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;An incident&amp;#39;s reading is in its metric&amp;#39;s unit&lt;/strong&gt; — 1.2 GB read as &amp;quot;1.2B&amp;quot;, a lag in milliseconds as &amp;quot;3.6M&amp;quot; and a
ratio at full precision in the incident list and dialog.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;v1-1-1-console&quot;&gt;Console&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;A tab opened before an upgrade reloads itself&lt;/strong&gt; — it used to fail to open any screen it had not visited yet, with
&lt;em&gt;Try again&lt;/em&gt; unable to help. The sign-in and setup screens now have an error screen with &lt;em&gt;Reload&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Copy says when it could not copy&lt;/strong&gt; — on an installation served over plain HTTP the browser offers no clipboard to
the page, and every Copy button still said &lt;em&gt;Copied&lt;/em&gt;; the one-time password could be dismissed without ever being
copied. Copy now uses a fallback, and says so when the browser refuses.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A role without the dashboard lands where it may go&lt;/strong&gt; — such a role met an empty page after sign-in and after every
refused page; it now lands on the first page of the menu it may open. A platform page whose settings could not be read
says so, with &lt;em&gt;Try again&lt;/em&gt;, instead of staying empty.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enter on a control inside a table row is the control&amp;#39;s&lt;/strong&gt; — Enter or Space on a button, checkbox or menu in a
clickable row opened the row instead.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Downloads cannot come out empty&lt;/strong&gt; — the RabbitMQ definitions export and the offline activation request are saved
the way every other download is.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Templates and Saved Views say when they could not be loaded&lt;/strong&gt;, with &lt;em&gt;Try again&lt;/em&gt;, instead of &lt;em&gt;No templates yet&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;v1-1-1-users-and-the-audit-trail&quot;&gt;Users and the audit trail&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;A password reset unlocks the account&lt;/strong&gt; — after too many wrong passwords, an administrator&amp;#39;s reset left the lockout
in place, and the new temporary password was refused until it ran out.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sorting the audit log by Actor sorts by name&lt;/strong&gt; — it sorted by the account&amp;#39;s internal id. Sorting by Result groups
the results as they are shown.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;v1-1-1-licence&quot;&gt;Licence&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;The licence messages say what stops&lt;/strong&gt; — an installation without a valid licence was told reading live data
works, while every platform other than Kafka is unavailable until a licence is activated; a licence bound to another
installation was said to withhold nothing, while changes on the Commercial platforms are withheld until it is
rebound.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;v1-1-1-known-limitations&quot;&gt;Known limitations&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;The API runs as a single replica; there is no high-availability mode.&lt;/li&gt;
&lt;li&gt;TLS is not terminated in the stack: put a reverse proxy or a load balancer in front.&lt;/li&gt;
&lt;li&gt;The Compose recipe runs its own PostgreSQL; it has no setting for an external one.&lt;/li&gt;
&lt;li&gt;No single sign-on (SSO, LDAP) and no multi-factor authentication.&lt;/li&gt;
&lt;li&gt;No self-service password reset in the console: an administrator resets a user&amp;#39;s password.&lt;/li&gt;
&lt;li&gt;JMX figures are live only: there is no history of them.&lt;/li&gt;
&lt;li&gt;The release check needs a route to &lt;code&gt;license.broka.dev&lt;/code&gt;; without one, Settings ▸ System cannot tell you that a newer
release exists.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;v1-1-1-upgrade-notes&quot;&gt;Upgrade notes&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Change the pinned version.&lt;/strong&gt; Set &lt;code&gt;BROKA_VERSION&lt;/code&gt; to &lt;code&gt;1.1.1&lt;/code&gt; in your &lt;code&gt;.env&lt;/code&gt;, take the new &lt;code&gt;compose.yml&lt;/code&gt;, pull and
start. This release changes nothing in the database.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Back up first&lt;/strong&gt;, as for any upgrade: the database, and &lt;code&gt;.env&lt;/code&gt; with it — &lt;code&gt;BROKA_KEK&lt;/code&gt; decrypts every stored
credential. Upgrading a Commercial installation is described in the customer portal.&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <id>https://broka.dev/release-notes#v1-1-2</id>
    <title>Broka 1.1.2</title>
    <link rel="alternate" type="text/html" href="https://broka.dev/release-notes#v1-1-2"/>
    <updated>2026-10-08T00:00:00Z</updated>
    <content type="html">&lt;h3 id=&quot;v1-1-2-changes&quot;&gt;Changes&lt;/h3&gt;
&lt;h4 id=&quot;v1-1-2-access-review-commercial&quot;&gt;Access Review (Commercial)&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;By permission no longer freezes the browser&lt;/strong&gt; — opening the tab, before a permission was picked, locked the page
until it was closed. It now opens and waits for a permission, and lists everyone who holds the one you pick.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;v1-1-2-known-limitations&quot;&gt;Known limitations&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;The API runs as a single replica; there is no high-availability mode.&lt;/li&gt;
&lt;li&gt;TLS is not terminated in the stack: put a reverse proxy or a load balancer in front.&lt;/li&gt;
&lt;li&gt;The Compose recipe runs its own PostgreSQL; it has no setting for an external one.&lt;/li&gt;
&lt;li&gt;No single sign-on (SSO, LDAP) and no multi-factor authentication.&lt;/li&gt;
&lt;li&gt;No self-service password reset in the console: an administrator resets a user&amp;#39;s password.&lt;/li&gt;
&lt;li&gt;JMX figures are live only: there is no history of them.&lt;/li&gt;
&lt;li&gt;The release check needs a route to &lt;code&gt;license.broka.dev&lt;/code&gt;; without one, Settings ▸ System cannot tell you that a newer
release exists.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;v1-1-2-upgrade-notes&quot;&gt;Upgrade notes&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Change the pinned version.&lt;/strong&gt; Set &lt;code&gt;BROKA_VERSION&lt;/code&gt; to &lt;code&gt;1.1.2&lt;/code&gt; in your &lt;code&gt;.env&lt;/code&gt;, take the new &lt;code&gt;compose.yml&lt;/code&gt;, pull and
start. This release changes nothing in the database.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Back up first&lt;/strong&gt;, as for any upgrade: the database, and &lt;code&gt;.env&lt;/code&gt; with it — &lt;code&gt;BROKA_KEK&lt;/code&gt; decrypts every stored
credential. Upgrading a Commercial installation is described in the customer portal.&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <id>https://broka.dev/release-notes#v1-1-0</id>
    <title>Broka 1.1.0</title>
    <link rel="alternate" type="text/html" href="https://broka.dev/release-notes#v1-1-0"/>
    <updated>2026-10-07T00:00:00Z</updated>
    <content type="html">&lt;h3 id=&quot;v1-1-0-highlights&quot;&gt;Highlights&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;A check for new releases.&lt;/strong&gt; Settings ▸ System says when a newer release is out. Once at start and once a day, the
installation sends its identifier, version and edition — and nothing about your brokers or how you use Broka.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Unused accounts are disabled.&lt;/strong&gt; An account nobody has used for 90 days is disabled; the window is yours to change
or turn off, and the sign-in lockout is configurable too.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Access Review shows resource grants&lt;/strong&gt; (Commercial): the access a resource-pattern grant gives, account by account
and permission by permission.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;v1-1-0-changes&quot;&gt;Changes&lt;/h3&gt;
&lt;h4 id=&quot;v1-1-0-security&quot;&gt;Security&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Unused accounts&lt;/strong&gt; — Settings ▸ Security disables an account nobody has used for a window you set: 90 days by
default, 30 to 365, or off. Use is a sign-in, a session&amp;#39;s activity, an API token&amp;#39;s use or a re-enable. The last
account that can manage users is never disabled, and every disable is recorded with the reason.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sign-in lockout&lt;/strong&gt; — after 3 to 9 failed sign-ins (5 unless you change it), the account is locked for 5 to 1440
minutes (15 unless you change it).&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;v1-1-0-settings&quot;&gt;Settings&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Version&lt;/strong&gt; — Settings ▸ System shows &lt;em&gt;Update available&lt;/em&gt; with the newer version, &lt;em&gt;Up to date&lt;/em&gt;, or &lt;em&gt;Not checked yet&lt;/em&gt;,
and when the last check was answered.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Registration&lt;/strong&gt; — an optional e-mail address and company, entered in Settings ▸ System, sent with the release check
so that we can write to you about a security issue. Empty unless an administrator fills it in.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;v1-1-0-kafka&quot;&gt;Kafka&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Produce&lt;/strong&gt; — a JSON value is edited with syntax highlighting, keeping its validation, &lt;em&gt;Format&lt;/em&gt; and status line.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;v1-1-0-access-review-commercial&quot;&gt;Access Review (Commercial)&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Resource grants&lt;/strong&gt; — an account&amp;#39;s effective access lists the resource-pattern grants that give it, with the
operations, the cluster and whether the grant came to the account directly or through a team; the holders of a
permission include accounts that hold it only through such a grant.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;v1-1-0-rabbitmq-commercial&quot;&gt;RabbitMQ (Commercial)&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Publishing to a queue, on the record&lt;/strong&gt; — a message published to a queue through the default exchange names that
queue in the audit trail; until now the event named only the default exchange. The routing key of a publish through
any other exchange is the message&amp;#39;s own data and is still not recorded.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;v1-1-0-licence-agreement-and-privacy-policy&quot;&gt;Licence agreement and privacy policy&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Version 2026-10-07&lt;/strong&gt; — both now describe the release check: the licence agreement (§5) names it beside the
licence calls as the only bytes an installation sends us, and the privacy policy (§6) lists every field it sends and
what we keep — one record per installation with the last address only, deleted after twelve months without a
check. A Commercial subscription renewed from now on is renewed on this version.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;v1-1-0-known-limitations&quot;&gt;Known limitations&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;The API runs as a single replica; there is no high-availability mode.&lt;/li&gt;
&lt;li&gt;TLS is not terminated in the stack: put a reverse proxy or a load balancer in front.&lt;/li&gt;
&lt;li&gt;The Compose recipe runs its own PostgreSQL; it has no setting for an external one.&lt;/li&gt;
&lt;li&gt;No single sign-on (SSO, LDAP) and no multi-factor authentication.&lt;/li&gt;
&lt;li&gt;No self-service password reset in the console: an administrator resets a user&amp;#39;s password.&lt;/li&gt;
&lt;li&gt;JMX figures are live only: there is no history of them.&lt;/li&gt;
&lt;li&gt;The release check needs a route to &lt;code&gt;license.broka.dev&lt;/code&gt;; without one, Settings ▸ System cannot tell you that a newer
release exists.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;v1-1-0-upgrade-notes&quot;&gt;Upgrade notes&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Change the pinned version.&lt;/strong&gt; Set &lt;code&gt;BROKA_VERSION&lt;/code&gt; to &lt;code&gt;1.1.0&lt;/code&gt; in your &lt;code&gt;.env&lt;/code&gt;, take the new &lt;code&gt;compose.yml&lt;/code&gt;, pull and
start. The API applies its database migrations when it starts.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Back up first.&lt;/strong&gt; Back up the database, and &lt;code&gt;.env&lt;/code&gt; with it — &lt;code&gt;BROKA_KEK&lt;/code&gt; decrypts every stored credential.
Migrations go forward only: moving back to 1.0.1 on the same database is not supported.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Unused accounts are disabled after the upgrade.&lt;/strong&gt; An account nobody has used for 90 days is disabled within an
hour of the first start, and refused at once if it tries to sign in. Open Settings ▸ Security right after the
upgrade to change the window or turn it off; re-enable an account from Users. The last account that can manage
users is kept.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;BROKA_LICENCE_SERVER&lt;/code&gt; is no longer read.&lt;/strong&gt; The licence server&amp;#39;s address is built in; remove the line from
&lt;code&gt;.env&lt;/code&gt;, or leave it — it does nothing.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The release check starts at once.&lt;/strong&gt; It needs no setting and has none; an installation that cannot reach
&lt;code&gt;license.broka.dev&lt;/code&gt; simply makes no check. Upgrading a Commercial installation is described in the customer portal.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The licence agreement is version 2026-10-07.&lt;/strong&gt; Running 1.1.0 accepts it (§1); a Commercial renewal asks for
acceptance of this version (§15).&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <id>https://broka.dev/release-notes#v1-0-1</id>
    <title>Broka 1.0.1</title>
    <link rel="alternate" type="text/html" href="https://broka.dev/release-notes#v1-0-1"/>
    <updated>2026-10-06T00:00:00Z</updated>
    <content type="html">&lt;h3 id=&quot;v1-0-1-highlights&quot;&gt;Highlights&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Kafka&amp;#39;s own health, over JMX.&lt;/strong&gt; With JMX set up, every broker and controller reports what it measures about
itself — the active controller, offline partitions, partitions under their minimum in-sync replicas, request rates
and their 99th-percentile time, how idle the request handlers and network threads are, heap, garbage collection,
CPU and file descriptors. The figures are read live and never stored.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Alerts on what surrounds Kafka.&lt;/strong&gt; A rule can watch a Kafka Connect cluster and its connectors, the Schema
Registry, and every JMX figure worth acting on, with starter rules for each.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Alerting that settles.&lt;/strong&gt; An incident resolves once its figure has stayed clear for a while, an incident that
reopens soon after does not notify again, and everything that breaches on one connection at once reaches a
channel as one message.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;An MCP server for AI assistants&lt;/strong&gt; (Commercial). Claude Code, Claude Desktop, Cursor or another MCP client reads
the estate and, where an administrator allows it, changes it — as the owner of an API token, with that person&amp;#39;s
permissions, under every guard the console applies, and on the audit trail. Off until an administrator turns it on.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Data masking&lt;/strong&gt; (Commercial). Rules hide chosen fields of messages and values — a card number, an address, a
header — from people who may read the rest. Seeing them unmasked is a permission of its own, and every such read
is recorded.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;v1-0-1-changes&quot;&gt;Changes&lt;/h3&gt;
&lt;h4 id=&quot;v1-0-1-kafka&quot;&gt;Kafka&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;JMX in its own dialog&lt;/strong&gt; — an address per broker and per controller, for clusters whose brokers sit behind a
load balancer, and a test that asks every node once and names why one did not answer.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Health on the Brokers page&lt;/strong&gt; — &lt;em&gt;Active controller&lt;/em&gt;, &lt;em&gt;Offline partitions&lt;/em&gt; and &lt;em&gt;Under min ISR&lt;/em&gt; tiles, and optional
&lt;em&gt;State&lt;/em&gt; and &lt;em&gt;Offline log dirs&lt;/em&gt; columns.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Graphs&lt;/strong&gt; — requests per second and their p99 time by type, handler and network idle, the request and response
queues, and messages in per broker.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A broker&amp;#39;s Metrics tab&lt;/strong&gt; — heap, garbage collection, CPU, file descriptors, threads, log flush time, ISR changes,
failed requests and rejected bytes. A controller that is not a broker is read as a node too, from the Quorum tab.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A topic&amp;#39;s rates&lt;/strong&gt; — bytes in and out and messages in per second, read when its page is open.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;When not every node answers&lt;/strong&gt; — a figure about one node shows for each node that answered; a figure about the
whole cluster shows only when every node it depends on answered, and says why when it does not.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;v1-0-1-alerts&quot;&gt;Alerts&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;New things to watch&lt;/strong&gt; — Kafka Connect clusters and connectors (unreachable, failed, paused or stopped, failed
tasks), the Schema Registry (unreachable, slow, read-only, subject count), and the JMX figures per node. A component
that does not answer reads &lt;em&gt;reachable = 0&lt;/em&gt;, which a rule can fire on.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Resolve after and Cooldown&lt;/strong&gt; — two minutes and ten minutes unless you choose otherwise; &lt;strong&gt;Notify when resolved&lt;/strong&gt;,
on unless you turn it off.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Stale and unevaluatable, said plainly&lt;/strong&gt; — a rule nothing has evaluated for three periods reads &lt;em&gt;stale&lt;/em&gt;; a rule on
an old Kafka snapshot says how old; a rule that would watch more than 500 targets on one cluster watches the first
500 and says so.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Each connection on its own schedule&lt;/strong&gt; — a cluster that is down or slow delays only its own rules, and a
component that does not answer fails alone.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Delivery&lt;/strong&gt; — one message per channel per connection per evaluation, listing every breach; a channel that asks
to be waited for is waited for, and a slow channel holds back no other.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;History&lt;/strong&gt; — resolved incidents and the record of their notifications are kept for the audit retention window,
then removed.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Shovels, federation links, bridges and broker connections&lt;/strong&gt; (Commercial, with RabbitMQ or Apache Artemis) — a
rule can watch whether a RabbitMQ shovel or federation link runs, what a shovel has pending, whether an Artemis
bridge or broker connection is connected, and how many members a cluster connection sees.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;v1-0-1-mcp-server-commercial&quot;&gt;MCP server (Commercial)&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Settings ▸ MCP&lt;/strong&gt; — &lt;strong&gt;Off&lt;/strong&gt; by default, &lt;strong&gt;Read only&lt;/strong&gt;, or &lt;strong&gt;Read and write&lt;/strong&gt;; the endpoint&amp;#39;s address and the
configuration for Claude Code, Claude Desktop and Cursor. A token for an assistant is made under Profile ▸ API
tokens and can be limited to the permissions the work needs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The &lt;code&gt;mcp.use&lt;/code&gt; permission&lt;/strong&gt; — in the built-in Admin role only; anyone else is granted it, across the installation.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tools for Kafka, Redis, RabbitMQ, Apache Artemis and Memcached&lt;/strong&gt; — reads, including message contents where the token&amp;#39;s owner may read them;
changes the console makes, with a preview first where the console previews and a reason on every destructive tool.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Never through MCP&lt;/strong&gt; — users, roles, grants, tokens, settings, the licence, connections, environments, alerting,
broker access control and whole-cluster operations stay in the console.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;On the record&lt;/strong&gt; — every call carries the channel &lt;strong&gt;MCP&lt;/strong&gt; with the tool, the client and the token&amp;#39;s prefix, and
the audit log filters on it. Contents somebody else wrote come back marked as data, never as instructions.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;v1-0-1-data-masking-commercial&quot;&gt;Data masking (Commercial)&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Settings ▸ Data masking&lt;/strong&gt; — rules by platform, scope and resource pattern; fields by JSON path, header, record
key, whole value or Redis hash or stream field; &lt;strong&gt;Redact&lt;/strong&gt;, which keeps a JSON value&amp;#39;s type, or &lt;strong&gt;Partial&lt;/strong&gt;, which
keeps the first and last characters you choose; a live preview and who sees each rule unmasked.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Everywhere contents are shown&lt;/strong&gt; — Kafka records, RabbitMQ and Artemis messages, Redis and Memcached values, and
what the MCP server returns, masked before they leave the broker service. A value a rule cannot read is masked
whole.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Read masked contents unmasked&lt;/strong&gt; (&lt;code&gt;messages.read.unmasked&lt;/code&gt;) — in no built-in role, granted on an environment, a
connection or a resource pattern; every unmasked read is recorded, whatever the read-recording setting.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Filters, writes and copies&lt;/strong&gt; — a filter cannot reveal a masked field, a masked item cannot be written back, and
moving or copying masked contents somewhere the rule does not reach is refused.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kept when a licence lapses&lt;/strong&gt; — every rule stays applied; only changing the rules waits for a valid licence.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;v1-0-1-rabbitmq-commercial&quot;&gt;RabbitMQ (Commercial)&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Restart a shovel&lt;/strong&gt; — from its row, after the far end of a shovel that terminated is fixed. Recorded in the
audit trail.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;v1-0-1-console&quot;&gt;Console&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Resizable columns&lt;/strong&gt; — the resize handles are visible and easy to grab, and a resized name column can be made
narrower.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;v1-0-1-known-limitations&quot;&gt;Known limitations&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;linux/amd64&lt;/code&gt; only.&lt;/li&gt;
&lt;li&gt;The API runs as a single replica; there is no high-availability mode.&lt;/li&gt;
&lt;li&gt;TLS is not terminated in the stack: put a reverse proxy or a load balancer in front.&lt;/li&gt;
&lt;li&gt;The Compose recipe runs its own PostgreSQL; it has no setting for an external one.&lt;/li&gt;
&lt;li&gt;No single sign-on (SSO, LDAP) and no multi-factor authentication.&lt;/li&gt;
&lt;li&gt;No self-service password reset in the console: an administrator resets a user&amp;#39;s password.&lt;/li&gt;
&lt;li&gt;JMX figures are live only: there is no history of them. A managed Kafka service that exposes no JMX shows
&lt;em&gt;Needs JMX&lt;/em&gt; where they would be.&lt;/li&gt;
&lt;li&gt;A topic&amp;#39;s own rates are shown on its page and cannot be alerted on.&lt;/li&gt;
&lt;li&gt;Data masking changes what BROKA shows, not what the broker holds: a client reading the broker directly sees the
original, and nothing is encrypted at rest.&lt;/li&gt;
&lt;li&gt;The MCP server reaches no alert rule, incident or silence, and changes no Kafka ACL. A plan an assistant previewed
is kept in memory for ten minutes, so a restart of the API drops it and the assistant previews again.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;v1-0-1-upgrade-notes&quot;&gt;Upgrade notes&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Change the pinned version.&lt;/strong&gt; Apart from the version they pin, 1.0.1&amp;#39;s &lt;code&gt;compose.yml&lt;/code&gt; and &lt;code&gt;.env.example&lt;/code&gt; are
1.0.0&amp;#39;s, so only &lt;code&gt;BROKA_VERSION&lt;/code&gt; changes in your &lt;code&gt;.env&lt;/code&gt;: set it to &lt;code&gt;1.0.1&lt;/code&gt;, pull and start. The API applies its database migrations when it
starts.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Back up first.&lt;/strong&gt; Back up the database, and &lt;code&gt;.env&lt;/code&gt; with it — &lt;code&gt;BROKA_KEK&lt;/code&gt; decrypts every stored credential.
Migrations go forward only: moving back to 1.0.0 on the same database is not supported.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;JMX settings carry over.&lt;/strong&gt; A connection&amp;#39;s JMX port, user and password from 1.0.0 are read as they are. Open
the JMX dialog to give a broker or a controller an address of its own.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Existing alert rules take the new defaults&lt;/strong&gt; — resolve after two minutes, a ten-minute cooldown, and a notice
when an incident resolves. Change them on the rule.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Commercial: nothing new is switched on.&lt;/strong&gt; The MCP server starts Off, no masking rule exists until one is written,
and no role holds &lt;code&gt;messages.read.unmasked&lt;/code&gt;. Upgrading a Commercial installation is described in the customer
portal.&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <id>https://broka.dev/release-notes#v1-0-0</id>
    <title>Broka 1.0.0</title>
    <link rel="alternate" type="text/html" href="https://broka.dev/release-notes#v1-0-0"/>
    <updated>2026-10-05T00:00:00Z</updated>
    <content type="html">&lt;h3 id=&quot;v1-0-0-highlights&quot;&gt;Highlights&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;One operations console for Apache Kafka, on your own infrastructure.&lt;/strong&gt; Broka runs in your network and
manages Kafka in full depth — and any Kafka-protocol-compatible broker, such as Redpanda or Amazon MSK, through
the same connection.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;One operational layer around it.&lt;/strong&gt; Environments that carry a policy, production guardrails, users, teams and
scoped roles, and an audit trail that records every write and every refusal — hash-chained, verifiable and
exportable.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Installed with Docker Compose, with no account and no activation.&lt;/strong&gt; It sends nothing anywhere. The three
images are on Docker Hub and signed; &lt;code&gt;cosign verify --key https://broka.dev/keys/cosign.pub&lt;/code&gt; checks each one
before you run it.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;v1-0-0-changes&quot;&gt;Changes&lt;/h3&gt;
&lt;p&gt;This is the first release, so this section lists what it contains.&lt;/p&gt;
&lt;h4 id=&quot;v1-0-0-kafka&quot;&gt;Kafka&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Clusters and brokers&lt;/strong&gt; — the cluster overview, each broker&amp;#39;s configuration and log directories, partition
and leader skew, under-replicated partitions, and live broker graphs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Topics&lt;/strong&gt; — the topic list, topic detail with partitions, editable configuration, creation and deletion.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Messages&lt;/strong&gt; — browse a topic with filters, and produce single messages or batches.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Consumer groups&lt;/strong&gt; — lag per group and partition, group detail, and offset resets.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ACLs and service accounts&lt;/strong&gt; — describe, create and delete ACLs, per principal.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Schema Registry&lt;/strong&gt; — subjects and versions with a side-by-side diff, Avro, JSON Schema and Protobuf,
compatibility settings, and messages encoded and decoded against the registry when producing and browsing.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kafka Connect&lt;/strong&gt; — connectors and their tasks.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Transactions, client quotas and client metrics.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Supported features per connection&lt;/strong&gt; — what the connected cluster can do is probed rather than assumed from
its version, and a feature the cluster does not offer is shown disabled with the reason.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;v1-0-0-console&quot;&gt;Console&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Connections&lt;/strong&gt; — a registry of clusters per environment, with credentials encrypted at rest.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dashboard and search&lt;/strong&gt; — health across the estate, and one search over clusters and resources.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Saved views, table layouts, templates and resource metadata&lt;/strong&gt; — owners and labels on the resources you
operate.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Alerts&lt;/strong&gt; — rules on broker metrics, silences, and delivery by e-mail.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Access&lt;/strong&gt; — users, teams and roles scoped to an environment or a connection; reading message contents is a
permission of its own.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Guardrails&lt;/strong&gt; — a destructive operation asks for a reason, and a production environment can be read-only.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Audit&lt;/strong&gt; — every administrative action, write and refusal, kept for at most 180 days — which is also the
default — with integrity verification and export.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Your account&lt;/strong&gt; — sessions, password change and personal API tokens. Administrators set the session idle
timeout and the password policy.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;v1-0-0-deployment&quot;&gt;Deployment&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Docker Compose&lt;/strong&gt; — &lt;code&gt;compose.yml&lt;/code&gt; and &lt;code&gt;.env.example&lt;/code&gt; at &lt;code&gt;/download/1.0.0/&lt;/code&gt;, with their SHA-256 checksums.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Four containers&lt;/strong&gt; — the console, the API, the broker service and PostgreSQL 17, with only the console
published on one port.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Signed images&lt;/strong&gt; — &lt;code&gt;orchestalabs/broka-orchestrator&lt;/code&gt;, &lt;code&gt;broka-broker&lt;/code&gt; and &lt;code&gt;broka-ui&lt;/code&gt;, each signed and carrying
an SBOM attestation.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Migrations at startup&lt;/strong&gt; — the API applies its database migrations when it starts.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;v1-0-0-known-limitations&quot;&gt;Known limitations&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;linux/amd64&lt;/code&gt; only.&lt;/li&gt;
&lt;li&gt;The API runs as a single replica; there is no high-availability mode.&lt;/li&gt;
&lt;li&gt;TLS is not terminated in the stack: put a reverse proxy or a load balancer in front.&lt;/li&gt;
&lt;li&gt;The Compose recipe runs its own PostgreSQL; it has no setting for an external one.&lt;/li&gt;
&lt;li&gt;No single sign-on (SSO, LDAP) and no multi-factor authentication.&lt;/li&gt;
&lt;li&gt;No self-service password reset in the console: an administrator resets a user&amp;#39;s password.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;v1-0-0-upgrade-notes&quot;&gt;Upgrade notes&lt;/h3&gt;
&lt;p&gt;This is the first release, so there is nothing to upgrade from.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Pin the version.&lt;/strong&gt; &lt;code&gt;.env.example&lt;/code&gt; ships with &lt;code&gt;BROKA_VERSION=1.0.0&lt;/code&gt;; keep it pinned, so an upgrade is an edit
you make rather than something that happens on restart.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Back up &lt;code&gt;.env&lt;/code&gt; with the database.&lt;/strong&gt; &lt;code&gt;BROKA_KEK&lt;/code&gt; encrypts every stored credential: a database restored without
it cannot decrypt them.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Migrations go forward only.&lt;/strong&gt; Moving to a later version is supported; moving back to an earlier one on the
same database is not.&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <id>https://broka.dev/guides/memcached-evicts-before-it-looks-full</id>
    <title>Memcached evicts before it looks full</title>
    <link rel="alternate" type="text/html" href="https://broka.dev/guides/memcached-evicts-before-it-looks-full"/>
    <updated>2026-10-03T00:00:00Z</updated>
    <summary>A Memcached node can evict with half its memory apparently free. Memory is committed to slab classes a page at a time and stays with its class until something moves it, so the answer to &quot;why is it evicting&quot; is one node's per-class table, not the totals.</summary>
  </entry>
  <entry>
    <id>https://broka.dev/guides/rabbitmq-policies-only-one-applies</id>
    <title>Policies in RabbitMQ: only one applies</title>
    <link rel="alternate" type="text/html" href="https://broka.dev/guides/rabbitmq-policies-only-one-applies"/>
    <updated>2026-10-03T00:00:00Z</updated>
    <summary>RabbitMQ policies do not combine. One user policy governs a queue or exchange — the highest-priority match — the rest contribute nothing, and an operator policy sits on top as a separate layer. Read which one applies from the broker, not from the list.</summary>
  </entry>
  <entry>
    <id>https://broka.dev/guides/reading-a-kafka-cluster-you-did-not-build</id>
    <title>Reading a Kafka cluster you did not build</title>
    <link rel="alternate" type="text/html" href="https://broka.dev/guides/reading-a-kafka-cluster-you-did-not-build"/>
    <updated>2026-10-03T00:00:00Z</updated>
    <summary>The first hour with an inherited Kafka cluster, in the order that answers the most: is it whole, what does it really run, how are its brokers set up and loaded, what do its topics hold, who reads them, and who may do what — all read without changing anything.</summary>
  </entry>
  <entry>
    <id>https://broka.dev/guides/schema-registry-without-guesswork</id>
    <title>Schema Registry without guesswork</title>
    <link rel="alternate" type="text/html" href="https://broka.dev/guides/schema-registry-without-guesswork"/>
    <updated>2026-10-03T00:00:00Z</updated>
    <summary>Which subject a consumer looks for, which version a record was written with, which rule a new version must pass, and what delete really removes — read from the registry instead of guessed.</summary>
  </entry>
  <entry>
    <id>https://broka.dev/guides/artemis-from-the-address-down</id>
    <title>Where an Artemis message went: reading from the address down</title>
    <link rel="alternate" type="text/html" href="https://broka.dev/guides/artemis-from-the-address-down"/>
    <updated>2026-10-03T00:00:00Z</updated>
    <summary>On Apache Artemis a message is sent to an address, not to a queue. Where it went — routed nowhere, shared, copied, filtered, held for a time, held by a consumer or dead-lettered — is read from the address down, and each answer has its own safe action.</summary>
  </entry>
  <entry>
    <id>https://broka.dev/guides/one-permission-model</id>
    <title>Operating every broker with one permission model</title>
    <link rel="alternate" type="text/html" href="https://broka.dev/guides/one-permission-model"/>
    <updated>2026-09-30T00:00:00Z</updated>
    <summary>Map teams once, scope roles per environment, and let each broker keep its own native enforcement underneath.</summary>
  </entry>
  <entry>
    <id>https://broka.dev/guides/routing-from-the-bindings-out</id>
    <title>Reading a routing problem from the bindings out</title>
    <link rel="alternate" type="text/html" href="https://broka.dev/guides/routing-from-the-bindings-out"/>
    <updated>2026-09-30T00:00:00Z</updated>
    <summary>A message that did not arrive was usually discarded at the exchange, not lost from a queue. The diagnosis runs from the routing graph out, and ends with a publish the broker answers — confirmed, returned or refused.</summary>
  </entry>
  <entry>
    <id>https://broka.dev/guides/redis-pending-entries</id>
    <title>Redis Streams in production: the pending entries list</title>
    <link rel="alternate" type="text/html" href="https://broka.dev/guides/redis-pending-entries"/>
    <updated>2026-09-30T00:00:00Z</updated>
    <summary>Delivered is not acknowledged. Read owner, idle time and delivery count, then acknowledge, claim behind the interlock, or go and fix the consumer.</summary>
  </entry>
</feed>
