> ## Documentation Index
> Fetch the complete documentation index at: https://docs.alginte.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Messages: browse and produce

> Read records from a topic — point-in-time or live — across serdes, and produce test messages from a drawer.

Open a topic from the **Topics** page and switch to its **Messages** tab.
Everything on this page is per-topic, and your serde choices are remembered
per topic — shared between browsing and producing.

## Browsing messages

The toolbar drives what you see:

* **Key / Value deserializer** — how records are decoded: String, Integer,
  Long, Float, Double, JSON, Avro, Protobuf.
* **Partitions** — all partitions by default, or a subset.
* **Max results** — the total cap for a fetch (10 up to 1000).
* **Seek type** — *where* in the topic to read:

| Seek                        | What you get                                         |
| --------------------------- | ---------------------------------------------------- |
| **Newest**                  | The latest N messages (the default).                 |
| **Oldest**                  | From the beginning of the topic.                     |
| **Offset ≥** / **Offset ≤** | From, or up to, a specific offset.                   |
| **After** / **Before**      | Around a point in time (a date-time picker appears). |
| **Live**                    | A continuous tail of new messages as they arrive.    |

**Live** mode streams into the table as records land, with **Pause /
Continue** and a clear control; the other seek types fetch a page and offer
**Reload**.

<Note>
  On a very large or slow topic a fetch can hit its polling budget before
  reaching the requested count — the table then flags the result as
  incomplete rather than stalling. Narrow the partitions or lower Max results
  and reload.
</Note>

## Producing a message

Click **Produce Message** on the topic's page. The form slides in as a
resizable drawer from the right — the page stays usable behind it, so with
the Messages tab in **Live** mode you can watch your own message arrive.

1. **Pick the Key and Value serdes** — the same list as browsing, plus
   **Void** for an intentional `null` (a compaction tombstone). Numeric and
   JSON serdes deliberately reject empty input — "I mean null" is Void,
   never a forgotten field.
2. **Enter the key and value** — a full editor with live validation for JSON
   and schema serdes, a plain input for scalars.
3. **For a schema serde, pick the Subject** — the Schema Registry subject the
   record is encoded against. The picker filters to subjects whose registered
   type matches the serde, and a scope switch (*Default* = topic-prefixed
   subjects / *All subjects*) narrows the list.
4. *(Optional)* expand the collapsed **Partition**, **Timestamp**,
   **Headers**, or **Compression** panels to override the defaults (Kafka
   picks the partition, the broker stamps the time, no headers, no
   compression).
5. **Submit** — a success toast confirms, and the Messages tab behind the
   drawer refreshes.

<Note>
  Producing is deliberately **permissive**: any serde can be produced to any
  topic, and a serde that doesn't match the topic's registered schema raises
  a non-blocking warning rather than a hard stop — the same behaviour as
  comparable Kafka UIs. Hard enforcement, where you want it, belongs to
  broker-side schema validation.
</Note>

Two power details for schema users: the **Schema ID in headers** toggle
places the Schema Registry id in a record header instead of the payload
prefix (Confluent's header format — consumers with the default deserializer
handle both), and the **Compression** choice sets the producer codec — mostly
useful for testing a topic and its consumers against a specific codec, since
a single hand-produced record gains nothing from compression.
