“Decode this Modbus RTU frame: 11 03 00 6B 00 03 76 87”
Route: Frame layout
Kutup Baud is Qwen3-0.6B with a new architecture built into the model (two structure blocks, eight control tokens, a decision head and shape grammars) and every one of its weights retrained: a full fine-tune, not LoRA. It knows four industrial protocols (Modbus, OPC UA, OPC DA and MQTT), plans each answer before writing it, and runs entirely in your browser. English only.
2 structure blocks, 8 control tokens, a decision head and 5 shape grammars, all in one GGUF file.
weights, every one trained: not LoRA adapters, the model itself.
downloads once; runs 100% in the browser with WebAssembly and WebGPU.
the file your browser runs (Q4_K_M), on 713 questions. The 27-billion-parameter teacher, closed book: 38.1%; untouched Qwen3-0.6B: 10.4%.
Think of Baud as a bench engraver: it first decides which stencil the answer needs, then the stylus can only cut through that stencil’s open windows.
You type your question. Nothing leaves the browser.
The decision head answers four questions in one pass: which protocol, which shape, in scope, English?
Not English: it says it works in English only. Outside the four protocols: it says so. Otherwise: the planned shape.
The answer starts with the shape’s control token, and a grammar keeps the shape exact.
The app does the arithmetic itself: the CRC, LRC, MBAP length and header of a frame you paste, the hex-to-decimal values in Baud’s frame tables, and whether an MQTT topic filter matches a topic.
The plan, the answer and the checker’s note appear together.
Only the model files come from the server, once. The question and the answer stay in your browser.
Before Baud writes anything, it answers four typed questions about your message. This is not a separate model: it is the same file’s decision head, run through llama.cpp’s decision-model interface (System One).
“Decode this Modbus RTU frame: 11 03 00 6B 00 03 76 87”
Route: Frame layout
“Compare MQTT QoS 0, 1 and 2”
Route: Table
“What are the steps to connect an OPC UA client with Sign & Encrypt?”
Route: Steps
“What are the benefits of MQTT 5.0 over 3.1.1?”
Route: List
“Show Python that reads holding registers 0 to 9”
Route: Code
“What does an OPC DA quality byte tell me?”
Route: Explanation
“What is the weather in Istanbul?”
Route: Out of scope
“Modbus nedir?”
Route: English only
These are the probabilities the installed model gave in the browser.
Short paragraphs. For explaining an idea.
No grammar: free text.
Comparisons and lists of values.
The same number of columns on every row, a header and a |---| separator.
Things to do in order.
Numbered 1, 2, 3… in order; at most 8 steps.
Several parallel items.
Every item starts with “- ”.
The fields of a message, frame or packet.
The header is always “Field | Size | Value | Meaning”; the app draws it as a byte strip.
A hex frame, code or configuration.
One code block; the app computes and fills in [CRC].
For questions outside the four protocols it says so, and what it can help with instead.
A message in another language gets an English reply saying it works in English only.
The decision head picks the shape; a grammar (GBNF) enforces it while the answer is written. The grammars are stored inside the model file.
| Qwen3-0.6B | Kutup Baud | |
|---|---|---|
| Transformer blocks | 28 | 30: 28 retrained + 2 new structure blocks |
| Parameters | 596.0 M | 627.5 M, all trained |
| Vocabulary | 151,936 rows; 151,669 in use | The same table; 8 unused rows now hold shape control tokens |
| Decision head | None | Built in: four typed questions in one pass (protocol, shape, scope, language) |
| Answer shape | Free text | 6 shapes; 5 enforced by GBNF grammars stored in the file |
| Training | General pre-training | Every weight retrained on protocol Q&A and decisions (full fine-tune) |
| Expertise | General | Modbus, OPC UA, OPC DA, MQTT (versions and variants) |
| Language | Multilingual | English only, by design |
| Arithmetic | Guessed in text | CRC, LRC and MBAP length computed by the app |
The structure blocks start as copies of the last block with their output projections set to zero, so at first they change nothing and learn only what the base model lacked.
Why both? The new blocks and tokens carry the structure engine; the full fine-tune lets the rest of the model learn to work with that engine and to hold the protocol knowledge. Training only adapters (LoRA) would have left the base model as it was.
Every weight of Qwen3-0.6B was retrained (a full fine-tune, not LoRA). The teacher is an open 27-billion-parameter model; the student is Baud, small enough for a browser at 0.6 billion.
| Topic | Documents | Publisher | Passages |
|---|---|---|---|
| Modbus | Modbus Application Protocol V1.1b3 · Modbus over Serial Line V1.02 · Modbus Messaging on TCP/IP V1.0b · Modbus/TCP Security | Modbus Organization | 107 |
| OPC UA | OPC 10000 parts 1–14, 16–18, 20–24, 26, 80 (version 1.05) | OPC Foundation | 1,712 |
| OPC DA | Kutup’s own OPC DA notes (1.0a, 2.05a, 3.0, XML-DA), checked against the DA 3.0 text | Kutup | 8 |
| MQTT | MQTT 5.0 · 3.1.1 · 3.1 · MQTT-SN 1.2 · Sparkplug 3.0.0 | OASIS · IBM · Eclipse Foundation | 368 |
| Tables | OPC UA status codes, attributes, enumerations and node ids | OPC Foundation UA-Nodeset (MIT) | – |
The documents were read only by the teacher model, which wrote question–answer pairs from them in its own words. No document text was used as training text, published or shipped with Baud.
The exam questions were written from the documents and kept out of training. Baud, the base model and the 27-billion-parameter teacher answered the same questions without seeing any document; the teacher graded the answers without knowing who wrote them. The “Q4_K_M, the file in your browser” row is the quantized file your browser downloads, answering through the app’s own path in llama.cpp (the decision head plans, the grammar holds the shape).
Accuracy of the four decision questions on held-out messages:
Quantisation stores the weights in fewer bits: the file shrinks and perplexity moves a little. Three candidate files took the exam through the app’s path; their differences are within the noise of 713 questions (about ±1.8 points). The browser downloads the highlighted file, the balance of download size and accuracy.
The same file runs with llama.cpp. On Hugging Face: yunusemrejr/Baud-0.6B ↗
llama-server -m baud-0.6b-q4_k_m-00001-of-00005.gguf -c 2048
curl localhost:8080/v1/systemone -d '{"state": "Decode 11 03 00 6B 00 03 76 87",
"questions": {"shape": {"type": "choice", "instructions": "Which answer shape fits the message best?",
"criteria": {"prose": null, "table": null, "steps": null, "list": null, "frame": null, "code": null}}}}'