You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iggy.apache.org by gi...@apache.org on 2026/07/28 18:46:16 UTC
(iggy-website) 01/01: Deploy website from main branch b21c2524c90ae9e472ee9abb08926ac29f73c667
This is an automated email from the ASF dual-hosted git repository.
github-actions[bot] pushed a commit to branch asf-site
in repository https://gitbox.apache.org/repos/asf/iggy-website.git
commit d3ed0353cca8bf3b536d6a37f56c295250d9ca8e
Author: github-actions[bot] <gi...@users.noreply.github.com>
AuthorDate: Tue Jul 28 18:46:07 2026 +0000
Deploy website from main branch b21c2524c90ae9e472ee9abb08926ac29f73c667
---
.asf.yaml | 49 ++
.nojekyll | 0
404.html | 1 +
404/index.html | 1 +
__next.!KGhvbWUp.__PAGE__.txt | 25 +
__next.!KGhvbWUp.txt | 10 +
__next._full.txt | 46 ++
__next._head.txt | 6 +
__next._index.txt | 7 +
__next._tree.txt | 4 +
_next/static/chunks/00b00679782d0ffd.js | 1 +
_next/static/chunks/10b35a01dc5843a9.js | 1 +
_next/static/chunks/17ccc6a5b3ad8f66.js | 1 +
_next/static/chunks/19140f4562cae5e1.js | 1 +
_next/static/chunks/26b70f9828dd1eb5.js | 1 +
_next/static/chunks/32a0415c8ab1bd26.css | 3 +
_next/static/chunks/3562882a488c4fbb.js | 18 +
_next/static/chunks/58665f1783672c50.js | 2 +
_next/static/chunks/586c6330b1448c28.js | 1 +
_next/static/chunks/591dbaf32ed9e41c.js | 1 +
_next/static/chunks/5a37d4cb1abe17d7.js | 1 +
_next/static/chunks/78b5f2e7b839e72f.js | 3 +
_next/static/chunks/82abf2d65f5428ae.js | 4 +
_next/static/chunks/8d86be78428a601a.js | 1 +
_next/static/chunks/8d8b8f8527e33e94.js | 1 +
_next/static/chunks/9174189d45dd31fe.js | 1 +
_next/static/chunks/922b7f01aa6775a6.js | 1 +
_next/static/chunks/9830546cbac60c3f.js | 3 +
_next/static/chunks/9baf65674e2de991.js | 1 +
_next/static/chunks/9ebd3a84bf60af84.js | 1 +
_next/static/chunks/a6dad97d9634a72d.js | 1 +
_next/static/chunks/a6dad97d9634a72d.js.map | 1 +
_next/static/chunks/ad1cf32e53bc1b2c.js | 1 +
_next/static/chunks/adeed8304bab826b.js | 1 +
_next/static/chunks/aee6c7720838f8a2.js | 1 +
_next/static/chunks/b7d6d72e7c987e27.js | 53 ++
_next/static/chunks/c3f495c2a7124145.js | 1 +
_next/static/chunks/c8cdd3710da4a2c3.js | 10 +
_next/static/chunks/ce4fe957ab48a9d2.js | 1 +
_next/static/chunks/d2be314c3ece3fbe.js | 1 +
_next/static/chunks/d4326e67c3c6876d.js | 1 +
_next/static/chunks/d4bc32970b75b4f3.js | 1 +
_next/static/chunks/d9baaff5bf5f9735.js | 5 +
_next/static/chunks/da34cc6305706ac6.js | 1 +
_next/static/chunks/f58eedfa913263a9.js | 209 ++++++
_next/static/chunks/fa4e005c68a3a3de.js | 1 +
_next/static/chunks/ff1a16fafef87110.js | 1 +
_next/static/chunks/turbopack-098b96c9b1ed5066.js | 4 +
.../media/GeistMono_Variable.p.2f937313.woff2 | Bin 0 -> 71004 bytes
.../static/media/Geist_Variable-s.p.92592eb2.woff2 | Bin 0 -> 69436 bytes
_next/static/media/architecture.2230a7d0.png | Bin 0 -> 760914 bytes
_next/static/media/bench_cli.48beddad.png | Bin 0 -> 380000 bytes
_next/static/media/bench_platform.e615d356.png | Bin 0 -> 326093 bytes
_next/static/media/diagram_szpont.04a5cd4d.png | Bin 0 -> 271604 bytes
_next/static/media/ecs.d641fd8e.png | Bin 0 -> 154902 bytes
_next/static/media/gh_trending.c393fc00.jpeg | Bin 0 -> 390292 bytes
_next/static/media/iggy_0_1_0.91d4e69f.jpg | Bin 0 -> 82650 bytes
.../static/media/iggy_batch_schema_1.ca17478c.png | Bin 0 -> 525799 bytes
.../static/media/iggy_batch_schema_2.19411d93.png | Bin 0 -> 546950 bytes
_next/static/media/iggy_bench.5fe87533.png | Bin 0 -> 111659 bytes
_next/static/media/iggy_bench.d3c96948.jpeg | Bin 0 -> 615288 bytes
_next/static/media/iggy_bench_0_1_0.b7be7178.jpeg | Bin 0 -> 1386983 bytes
_next/static/media/iggy_bench_cli.31c012c6.png | Bin 0 -> 515157 bytes
.../static/media/iggy_bench_dashboard.913ad513.png | Bin 0 -> 394188 bytes
_next/static/media/iggy_ci_0_1_0.0d133771.jpeg | Bin 0 -> 538032 bytes
_next/static/media/iggy_ci_cd.51a98142.jpeg | Bin 0 -> 78169 bytes
_next/static/media/iggy_cli.22274b15.png | Bin 0 -> 231092 bytes
_next/static/media/iggy_cli.6f56bf04.png | Bin 0 -> 90242 bytes
_next/static/media/iggy_cli.ffd1cc01.jpeg | Bin 0 -> 538239 bytes
_next/static/media/iggy_cli_0_1_0.9e3b3b20.jpeg | Bin 0 -> 1049410 bytes
_next/static/media/iggy_cluster.45c5ba16.png | Bin 0 -> 872341 bytes
_next/static/media/iggy_docker.d90b2df3.png | Bin 0 -> 721661 bytes
_next/static/media/iggy_logo.f9977802.png | Bin 0 -> 105328 bytes
_next/static/media/iggy_perf.c89a7ea7.png | Bin 0 -> 68641 bytes
_next/static/media/iggy_rocket.3360a060.png | Bin 0 -> 225148 bytes
_next/static/media/iggy_sample.4c2d3682.jpeg | Bin 0 -> 874973 bytes
_next/static/media/iggy_server.4f75ea73.jpeg | Bin 0 -> 976463 bytes
_next/static/media/iggy_server.7dd1e784.png | Bin 0 -> 1176428 bytes
_next/static/media/iggy_server_0_1_0.40382e5f.jpeg | Bin 0 -> 1064181 bytes
_next/static/media/iggy_stars.5e23fec1.png | Bin 0 -> 35419 bytes
.../media/iggy_technology_radar.be5a685d.png | Bin 0 -> 406596 bytes
_next/static/media/iggy_tpc.a0bc9e74.png | Bin 0 -> 423184 bytes
_next/static/media/iggy_vsr.2ca278be.png | Bin 0 -> 3958317 bytes
_next/static/media/iggy_web.d8f09397.png | Bin 0 -> 109581 bytes
_next/static/media/iggy_web_ui.0f6c99cb.jpeg | Bin 0 -> 215638 bytes
_next/static/media/iggy_web_ui.aa98803d.png | Bin 0 -> 145001 bytes
_next/static/media/iggy_web_ui_0_1_0.0f6c99cb.jpeg | Bin 0 -> 215638 bytes
_next/static/media/iggys.d5bf7cfc.jpeg | Bin 0 -> 512046 bytes
_next/static/media/leader_elections.a60bb3b7.jpeg | Bin 0 -> 1299078 bytes
.../media/no_zero_copy_consumer.3d01cd44.png | Bin 0 -> 1490151 bytes
.../media/no_zero_copy_producer.e84a1b6a.png | Bin 0 -> 684901 bytes
_next/static/media/pc_16_0.7.5be70d64.png | Bin 0 -> 842734 bytes
_next/static/media/pc_tcp.c620c51e.png | Bin 0 -> 197964 bytes
_next/static/media/pc_ws.aa40a190.png | Bin 0 -> 184540 bytes
_next/static/media/pp_16_0.5_fsync.3e56f68a.png | Bin 0 -> 607289 bytes
_next/static/media/pp_16_0.5_rl.1703bfbe.png | Bin 0 -> 200013 bytes
_next/static/media/pp_16_0.6.83fde634.png | Bin 0 -> 210659 bytes
_next/static/media/pp_16_0.7.502bb94d.png | Bin 0 -> 236428 bytes
_next/static/media/pp_16_0.7_fsync.1cb4a924.png | Bin 0 -> 292373 bytes
_next/static/media/pp_32_0.5_fsync.fcaf99a0.png | Bin 0 -> 612916 bytes
_next/static/media/pp_32_0.5_rl.43649cf2.png | Bin 0 -> 212749 bytes
_next/static/media/pp_32_0.6.972d492a.png | Bin 0 -> 156460 bytes
_next/static/media/pp_32_0.7.ba695bf9.png | Bin 0 -> 167854 bytes
_next/static/media/pp_32_0.7_fsync.d0842be4.png | Bin 0 -> 432903 bytes
_next/static/media/pp_8_0.5_rl.646aceed.png | Bin 0 -> 156545 bytes
_next/static/media/pp_8_0.6_rl.e328a44a.png | Bin 0 -> 147937 bytes
_next/static/media/pp_8_0.7_rl.b993b1f0.png | Bin 0 -> 245574 bytes
_next/static/media/sharding.b5c5f63d.png | Bin 0 -> 535868 bytes
_next/static/media/tcp-1234.445ddcbf.png | Bin 0 -> 205593 bytes
_next/static/media/ws-1234.fbc1ea56.png | Bin 0 -> 190067 bytes
_next/static/media/zero_copy_consumer.fb4c9be5.png | Bin 0 -> 485344 bytes
_next/static/media/zero_copy_producer.61ae01ab.png | Bin 0 -> 602342 bytes
.../static/uBHgltRE2s5QA49x61S_u/_buildManifest.js | 11 +
.../_clientMiddlewareManifest.json | 1 +
_next/static/uBHgltRE2s5QA49x61S_u/_ssgManifest.js | 1 +
_not-found/__next._full.txt | 16 +
_not-found/__next._head.txt | 6 +
_not-found/__next._index.txt | 7 +
_not-found/__next._not-found.__PAGE__.txt | 5 +
_not-found/__next._not-found.txt | 4 +
_not-found/__next._tree.txt | 2 +
_not-found/index.html | 1 +
_not-found/index.txt | 16 +
apache-incubator/iggy_logo.png | Bin 0 -> 105328 bytes
api/search | 1 +
.../__next.!KHNpdGUp.blogs.$c$slug.__PAGE__.txt | 6 +
.../16/welcome/__next.!KHNpdGUp.blogs.$c$slug.txt | 4 +
.../2023/08/16/welcome/__next.!KHNpdGUp.blogs.txt | 4 +
blogs/2023/08/16/welcome/__next.!KHNpdGUp.txt | 9 +
blogs/2023/08/16/welcome/__next._full.txt | 30 +
blogs/2023/08/16/welcome/__next._head.txt | 6 +
blogs/2023/08/16/welcome/__next._index.txt | 7 +
blogs/2023/08/16/welcome/__next._tree.txt | 4 +
blogs/2023/08/16/welcome/index.html | 3 +
blogs/2023/08/16/welcome/index.txt | 30 +
.../__next.!KHNpdGUp.blogs.$c$slug.__PAGE__.txt | 161 +++++
.../__next.!KHNpdGUp.blogs.$c$slug.txt | 4 +
.../19/message-headers/__next.!KHNpdGUp.blogs.txt | 4 +
.../08/19/message-headers/__next.!KHNpdGUp.txt | 9 +
blogs/2023/08/19/message-headers/__next._full.txt | 182 ++++++
blogs/2023/08/19/message-headers/__next._head.txt | 6 +
blogs/2023/08/19/message-headers/__next._index.txt | 7 +
blogs/2023/08/19/message-headers/__next._tree.txt | 4 +
blogs/2023/08/19/message-headers/index.html | 172 +++++
blogs/2023/08/19/message-headers/index.txt | 182 ++++++
.../__next.!KHNpdGUp.blogs.$c$slug.__PAGE__.txt | 81 +++
.../__next.!KHNpdGUp.blogs.$c$slug.txt | 4 +
.../08/22/message-state/__next.!KHNpdGUp.blogs.txt | 4 +
.../2023/08/22/message-state/__next.!KHNpdGUp.txt | 9 +
blogs/2023/08/22/message-state/__next._full.txt | 102 +++
blogs/2023/08/22/message-state/__next._head.txt | 6 +
blogs/2023/08/22/message-state/__next._index.txt | 7 +
blogs/2023/08/22/message-state/__next._tree.txt | 4 +
blogs/2023/08/22/message-state/index.html | 98 +++
blogs/2023/08/22/message-state/index.txt | 102 +++
.../__next.!KHNpdGUp.blogs.$c$slug.__PAGE__.txt | 52 ++
.../__next.!KHNpdGUp.blogs.$c$slug.txt | 4 +
.../27/message-expiry/__next.!KHNpdGUp.blogs.txt | 4 +
.../2023/08/27/message-expiry/__next.!KHNpdGUp.txt | 9 +
blogs/2023/08/27/message-expiry/__next._full.txt | 73 +++
blogs/2023/08/27/message-expiry/__next._head.txt | 6 +
blogs/2023/08/27/message-expiry/__next._index.txt | 7 +
blogs/2023/08/27/message-expiry/__next._tree.txt | 4 +
blogs/2023/08/27/message-expiry/index.html | 50 ++
blogs/2023/08/27/message-expiry/index.txt | 73 +++
.../__next.!KHNpdGUp.blogs.$c$slug.__PAGE__.txt | 26 +
.../__next.!KHNpdGUp.blogs.$c$slug.txt | 4 +
.../31/updated-schemas/__next.!KHNpdGUp.blogs.txt | 4 +
.../08/31/updated-schemas/__next.!KHNpdGUp.txt | 9 +
blogs/2023/08/31/updated-schemas/__next._full.txt | 47 ++
blogs/2023/08/31/updated-schemas/__next._head.txt | 6 +
blogs/2023/08/31/updated-schemas/__next._index.txt | 7 +
blogs/2023/08/31/updated-schemas/__next._tree.txt | 4 +
blogs/2023/08/31/updated-schemas/index.html | 24 +
blogs/2023/08/31/updated-schemas/index.txt | 47 ++
.../__next.!KHNpdGUp.blogs.$c$slug.__PAGE__.txt | 196 ++++++
.../__next.!KHNpdGUp.blogs.$c$slug.txt | 4 +
.../__next.!KHNpdGUp.blogs.txt | 4 +
.../20/users-and-permissions/__next.!KHNpdGUp.txt | 9 +
.../09/20/users-and-permissions/__next._full.txt | 217 +++++++
.../09/20/users-and-permissions/__next._head.txt | 6 +
.../09/20/users-and-permissions/__next._index.txt | 7 +
.../09/20/users-and-permissions/__next._tree.txt | 4 +
blogs/2023/09/20/users-and-permissions/index.html | 278 ++++++++
blogs/2023/09/20/users-and-permissions/index.txt | 217 +++++++
.../__next.!KHNpdGUp.blogs.$c$slug.__PAGE__.txt | 43 ++
.../__next.!KHNpdGUp.blogs.$c$slug.txt | 4 +
.../consumer-identifier/__next.!KHNpdGUp.blogs.txt | 4 +
.../10/02/consumer-identifier/__next.!KHNpdGUp.txt | 9 +
.../10/02/consumer-identifier/__next._full.txt | 64 ++
.../10/02/consumer-identifier/__next._head.txt | 6 +
.../10/02/consumer-identifier/__next._index.txt | 7 +
.../10/02/consumer-identifier/__next._tree.txt | 4 +
blogs/2023/10/02/consumer-identifier/index.html | 57 ++
blogs/2023/10/02/consumer-identifier/index.txt | 64 ++
.../__next.!KHNpdGUp.blogs.$c$slug.__PAGE__.txt | 40 ++
.../__next.!KHNpdGUp.blogs.$c$slug.txt | 4 +
.../__next.!KHNpdGUp.blogs.txt | 4 +
.../12/personal-access-tokens/__next.!KHNpdGUp.txt | 9 +
.../10/12/personal-access-tokens/__next._full.txt | 60 ++
.../10/12/personal-access-tokens/__next._head.txt | 6 +
.../10/12/personal-access-tokens/__next._index.txt | 7 +
.../10/12/personal-access-tokens/__next._tree.txt | 4 +
blogs/2023/10/12/personal-access-tokens/index.html | 55 ++
blogs/2023/10/12/personal-access-tokens/index.txt | 60 ++
.../__next.!KHNpdGUp.blogs.$c$slug.__PAGE__.txt | 24 +
.../__next.!KHNpdGUp.blogs.$c$slug.txt | 4 +
.../11/26/release-0.1.0/__next.!KHNpdGUp.blogs.txt | 4 +
.../2023/11/26/release-0.1.0/__next.!KHNpdGUp.txt | 9 +
blogs/2023/11/26/release-0.1.0/__next._full.txt | 45 ++
blogs/2023/11/26/release-0.1.0/__next._head.txt | 6 +
blogs/2023/11/26/release-0.1.0/__next._index.txt | 7 +
blogs/2023/11/26/release-0.1.0/__next._tree.txt | 4 +
blogs/2023/11/26/release-0.1.0/index.html | 16 +
blogs/2023/11/26/release-0.1.0/index.txt | 45 ++
.../__next.!KHNpdGUp.blogs.$c$slug.__PAGE__.txt | 68 ++
.../__next.!KHNpdGUp.blogs.$c$slug.txt | 4 +
.../__next.!KHNpdGUp.blogs.txt | 4 +
.../__next.!KHNpdGUp.txt | 9 +
.../__next._full.txt | 89 +++
.../__next._head.txt | 6 +
.../__next._index.txt | 7 +
.../__next._tree.txt | 4 +
.../building-message-streaming-in-rust/index.html | 96 +++
.../building-message-streaming-in-rust/index.txt | 89 +++
.../__next.!KHNpdGUp.blogs.$c$slug.__PAGE__.txt | 58 ++
.../__next.!KHNpdGUp.blogs.$c$slug.txt | 4 +
.../__next.!KHNpdGUp.blogs.txt | 4 +
.../__next.!KHNpdGUp.txt | 9 +
.../__next._full.txt | 79 +++
.../__next._head.txt | 6 +
.../__next._index.txt | 7 +
.../__next._tree.txt | 4 +
.../index.html | 78 +++
.../index.txt | 79 +++
.../__next.!KHNpdGUp.blogs.$c$slug.__PAGE__.txt | 65 ++
.../__next.!KHNpdGUp.blogs.$c$slug.txt | 4 +
.../__next.!KHNpdGUp.blogs.txt | 4 +
.../__next.!KHNpdGUp.txt | 9 +
.../__next._full.txt | 86 +++
.../__next._head.txt | 6 +
.../__next._index.txt | 7 +
.../__next._tree.txt | 4 +
.../technology-radar-and-currrent-goals/index.html | 87 +++
.../technology-radar-and-currrent-goals/index.txt | 86 +++
.../__next.!KHNpdGUp.blogs.$c$slug.__PAGE__.txt | 35 +
.../__next.!KHNpdGUp.blogs.$c$slug.txt | 4 +
.../10/apache-incubator/__next.!KHNpdGUp.blogs.txt | 4 +
.../02/10/apache-incubator/__next.!KHNpdGUp.txt | 9 +
blogs/2025/02/10/apache-incubator/__next._full.txt | 55 ++
blogs/2025/02/10/apache-incubator/__next._head.txt | 6 +
.../2025/02/10/apache-incubator/__next._index.txt | 7 +
blogs/2025/02/10/apache-incubator/__next._tree.txt | 4 +
blogs/2025/02/10/apache-incubator/index.html | 44 ++
blogs/2025/02/10/apache-incubator/index.txt | 55 ++
.../__next.!KHNpdGUp.blogs.$c$slug.__PAGE__.txt | 25 +
.../__next.!KHNpdGUp.blogs.$c$slug.txt | 4 +
.../__next.!KHNpdGUp.blogs.txt | 4 +
.../17/transparent-benchmarks/__next.!KHNpdGUp.txt | 9 +
.../02/17/transparent-benchmarks/__next._full.txt | 46 ++
.../02/17/transparent-benchmarks/__next._head.txt | 6 +
.../02/17/transparent-benchmarks/__next._index.txt | 7 +
.../02/17/transparent-benchmarks/__next._tree.txt | 4 +
blogs/2025/02/17/transparent-benchmarks/index.html | 26 +
blogs/2025/02/17/transparent-benchmarks/index.txt | 46 ++
.../__next.!KHNpdGUp.blogs.$c$slug.__PAGE__.txt | 58 ++
.../__next.!KHNpdGUp.blogs.$c$slug.txt | 4 +
.../__next.!KHNpdGUp.blogs.txt | 4 +
.../zero-copy-deserialization/__next.!KHNpdGUp.txt | 9 +
.../08/zero-copy-deserialization/__next._full.txt | 79 +++
.../08/zero-copy-deserialization/__next._head.txt | 6 +
.../08/zero-copy-deserialization/__next._index.txt | 7 +
.../08/zero-copy-deserialization/__next._tree.txt | 4 +
.../05/08/zero-copy-deserialization/index.html | 73 +++
.../2025/05/08/zero-copy-deserialization/index.txt | 79 +++
.../__next.!KHNpdGUp.blogs.$c$slug.__PAGE__.txt | 70 ++
.../__next.!KHNpdGUp.blogs.$c$slug.txt | 4 +
.../connectors-runtime/__next.!KHNpdGUp.blogs.txt | 4 +
.../06/06/connectors-runtime/__next.!KHNpdGUp.txt | 9 +
.../2025/06/06/connectors-runtime/__next._full.txt | 90 +++
.../2025/06/06/connectors-runtime/__next._head.txt | 6 +
.../06/06/connectors-runtime/__next._index.txt | 7 +
.../2025/06/06/connectors-runtime/__next._tree.txt | 4 +
blogs/2025/06/06/connectors-runtime/index.html | 73 +++
blogs/2025/06/06/connectors-runtime/index.txt | 90 +++
.../__next.!KHNpdGUp.blogs.$c$slug.__PAGE__.txt | 47 ++
.../__next.!KHNpdGUp.blogs.$c$slug.txt | 4 +
.../08/10/release-0.5.0/__next.!KHNpdGUp.blogs.txt | 4 +
.../2025/08/10/release-0.5.0/__next.!KHNpdGUp.txt | 9 +
blogs/2025/08/10/release-0.5.0/__next._full.txt | 68 ++
blogs/2025/08/10/release-0.5.0/__next._head.txt | 6 +
blogs/2025/08/10/release-0.5.0/__next._index.txt | 7 +
blogs/2025/08/10/release-0.5.0/__next._tree.txt | 4 +
blogs/2025/08/10/release-0.5.0/index.html | 68 ++
blogs/2025/08/10/release-0.5.0/index.txt | 68 ++
.../__next.!KHNpdGUp.blogs.$c$slug.__PAGE__.txt | 258 ++++++++
.../__next.!KHNpdGUp.blogs.$c$slug.txt | 4 +
.../websocket-io-uring/__next.!KHNpdGUp.blogs.txt | 4 +
.../11/17/websocket-io-uring/__next.!KHNpdGUp.txt | 9 +
.../2025/11/17/websocket-io-uring/__next._full.txt | 278 ++++++++
.../2025/11/17/websocket-io-uring/__next._head.txt | 6 +
.../11/17/websocket-io-uring/__next._index.txt | 7 +
.../2025/11/17/websocket-io-uring/__next._tree.txt | 4 +
blogs/2025/11/17/websocket-io-uring/index.html | 366 +++++++++++
blogs/2025/11/17/websocket-io-uring/index.txt | 278 ++++++++
.../__next.!KHNpdGUp.blogs.$c$slug.__PAGE__.txt | 47 ++
.../__next.!KHNpdGUp.blogs.$c$slug.txt | 4 +
.../12/09/release-0.6.0/__next.!KHNpdGUp.blogs.txt | 4 +
.../2025/12/09/release-0.6.0/__next.!KHNpdGUp.txt | 9 +
blogs/2025/12/09/release-0.6.0/__next._full.txt | 68 ++
blogs/2025/12/09/release-0.6.0/__next._head.txt | 6 +
blogs/2025/12/09/release-0.6.0/__next._index.txt | 7 +
blogs/2025/12/09/release-0.6.0/__next._tree.txt | 4 +
blogs/2025/12/09/release-0.6.0/index.html | 78 +++
blogs/2025/12/09/release-0.6.0/index.txt | 68 ++
.../__next.!KHNpdGUp.blogs.$c$slug.__PAGE__.txt | 62 ++
.../__next.!KHNpdGUp.blogs.$c$slug.txt | 4 +
.../02/24/release-0.7.0/__next.!KHNpdGUp.blogs.txt | 4 +
.../2026/02/24/release-0.7.0/__next.!KHNpdGUp.txt | 9 +
blogs/2026/02/24/release-0.7.0/__next._full.txt | 83 +++
blogs/2026/02/24/release-0.7.0/__next._head.txt | 6 +
blogs/2026/02/24/release-0.7.0/__next._index.txt | 7 +
blogs/2026/02/24/release-0.7.0/__next._tree.txt | 4 +
blogs/2026/02/24/release-0.7.0/index.html | 127 ++++
blogs/2026/02/24/release-0.7.0/index.txt | 83 +++
.../__next.!KHNpdGUp.blogs.$c$slug.__PAGE__.txt | 144 ++++
.../__next.!KHNpdGUp.blogs.$c$slug.txt | 4 +
.../__next.!KHNpdGUp.blogs.txt | 4 +
.../thread-per-core-io_uring/__next.!KHNpdGUp.txt | 9 +
.../27/thread-per-core-io_uring/__next._full.txt | 165 +++++
.../27/thread-per-core-io_uring/__next._head.txt | 6 +
.../27/thread-per-core-io_uring/__next._index.txt | 7 +
.../27/thread-per-core-io_uring/__next._tree.txt | 4 +
.../2026/02/27/thread-per-core-io_uring/index.html | 184 ++++++
.../2026/02/27/thread-per-core-io_uring/index.txt | 165 +++++
.../__next.!KHNpdGUp.blogs.$c$slug.__PAGE__.txt | 84 +++
.../__next.!KHNpdGUp.blogs.$c$slug.txt | 4 +
.../04/22/release-0.8.0/__next.!KHNpdGUp.blogs.txt | 4 +
.../2026/04/22/release-0.8.0/__next.!KHNpdGUp.txt | 9 +
blogs/2026/04/22/release-0.8.0/__next._full.txt | 105 +++
blogs/2026/04/22/release-0.8.0/__next._head.txt | 6 +
blogs/2026/04/22/release-0.8.0/__next._index.txt | 7 +
blogs/2026/04/22/release-0.8.0/__next._tree.txt | 4 +
blogs/2026/04/22/release-0.8.0/index.html | 210 ++++++
blogs/2026/04/22/release-0.8.0/index.txt | 105 +++
blogs/__next.!KHNpdGUp.blogs.__PAGE__.txt | 24 +
blogs/__next.!KHNpdGUp.blogs.txt | 4 +
blogs/__next.!KHNpdGUp.txt | 9 +
blogs/__next._full.txt | 46 ++
blogs/__next._head.txt | 6 +
blogs/__next._index.txt | 7 +
blogs/__next._tree.txt | 4 +
blogs/index.html | 1 +
blogs/index.txt | 46 ++
building-message-streaming/gh_trending.jpeg | Bin 0 -> 390292 bytes
building-message-streaming/iggy_bench.jpeg | Bin 0 -> 615288 bytes
building-message-streaming/iggy_ci_cd.jpeg | Bin 0 -> 78169 bytes
building-message-streaming/iggy_cli.jpeg | Bin 0 -> 538239 bytes
building-message-streaming/iggy_sample.jpeg | Bin 0 -> 874973 bytes
building-message-streaming/iggy_server.jpeg | Bin 0 -> 976463 bytes
building-message-streaming/iggy_web_ui.jpeg | Bin 0 -> 215638 bytes
building-message-streaming/iggys.jpeg | Bin 0 -> 512046 bytes
building-message-streaming/leader_elections.jpeg | Bin 0 -> 1299078 bytes
docs/__next._full.txt | 78 +++
docs/__next._head.txt | 6 +
docs/__next._index.txt | 7 +
docs/__next._tree.txt | 4 +
docs/__next.docs.$oc$slug.__PAGE__.txt | 34 +
docs/__next.docs.$oc$slug.txt | 4 +
docs/__next.docs.txt | 22 +
docs/ai/introduction/__next._full.txt | 43 ++
docs/ai/introduction/__next._head.txt | 6 +
docs/ai/introduction/__next._index.txt | 7 +
docs/ai/introduction/__next._tree.txt | 4 +
.../introduction/__next.docs.$oc$slug.__PAGE__.txt | 8 +
docs/ai/introduction/__next.docs.$oc$slug.txt | 4 +
docs/ai/introduction/__next.docs.txt | 22 +
docs/ai/introduction/index.html | 4 +
docs/ai/introduction/index.txt | 43 ++
docs/ai/mcp/__next._full.txt | 108 +++
docs/ai/mcp/__next._head.txt | 6 +
docs/ai/mcp/__next._index.txt | 7 +
docs/ai/mcp/__next._tree.txt | 4 +
docs/ai/mcp/__next.docs.$oc$slug.__PAGE__.txt | 78 +++
docs/ai/mcp/__next.docs.$oc$slug.txt | 4 +
docs/ai/mcp/__next.docs.txt | 22 +
docs/ai/mcp/index.html | 97 +++
docs/ai/mcp/index.txt | 108 +++
docs/cli/start/__next._full.txt | 144 ++++
docs/cli/start/__next._head.txt | 6 +
docs/cli/start/__next._index.txt | 7 +
docs/cli/start/__next._tree.txt | 4 +
docs/cli/start/__next.docs.$oc$slug.__PAGE__.txt | 112 ++++
docs/cli/start/__next.docs.$oc$slug.txt | 4 +
docs/cli/start/__next.docs.txt | 22 +
docs/cli/start/index.html | 156 +++++
docs/cli/start/index.txt | 144 ++++
docs/clustering/vsr/__next._full.txt | 163 +++++
docs/clustering/vsr/__next._head.txt | 6 +
docs/clustering/vsr/__next._index.txt | 7 +
docs/clustering/vsr/__next._tree.txt | 4 +
.../vsr/__next.docs.$oc$slug.__PAGE__.txt | 113 ++++
docs/clustering/vsr/__next.docs.$oc$slug.txt | 4 +
docs/clustering/vsr/__next.docs.txt | 22 +
docs/clustering/vsr/index.html | 184 ++++++
docs/clustering/vsr/index.txt | 163 +++++
docs/connectors/introduction/__next._full.txt | 105 +++
docs/connectors/introduction/__next._head.txt | 6 +
docs/connectors/introduction/__next._index.txt | 7 +
docs/connectors/introduction/__next._tree.txt | 4 +
.../introduction/__next.docs.$oc$slug.__PAGE__.txt | 62 ++
.../introduction/__next.docs.$oc$slug.txt | 4 +
docs/connectors/introduction/__next.docs.txt | 22 +
docs/connectors/introduction/index.html | 86 +++
docs/connectors/introduction/index.txt | 105 +++
docs/connectors/runtime/__next._full.txt | 113 ++++
docs/connectors/runtime/__next._head.txt | 6 +
docs/connectors/runtime/__next._index.txt | 7 +
docs/connectors/runtime/__next._tree.txt | 4 +
.../runtime/__next.docs.$oc$slug.__PAGE__.txt | 79 +++
docs/connectors/runtime/__next.docs.$oc$slug.txt | 4 +
docs/connectors/runtime/__next.docs.txt | 22 +
docs/connectors/runtime/index.html | 134 ++++
docs/connectors/runtime/index.txt | 113 ++++
docs/connectors/sdk/__next._full.txt | 135 ++++
docs/connectors/sdk/__next._head.txt | 6 +
docs/connectors/sdk/__next._index.txt | 7 +
docs/connectors/sdk/__next._tree.txt | 4 +
.../sdk/__next.docs.$oc$slug.__PAGE__.txt | 104 +++
docs/connectors/sdk/__next.docs.$oc$slug.txt | 4 +
docs/connectors/sdk/__next.docs.txt | 22 +
docs/connectors/sdk/index.html | 158 +++++
docs/connectors/sdk/index.txt | 135 ++++
.../sinks/elasticsearch/__next._full.txt | 72 ++
.../sinks/elasticsearch/__next._head.txt | 6 +
.../sinks/elasticsearch/__next._index.txt | 7 +
.../sinks/elasticsearch/__next._tree.txt | 4 +
.../__next.docs.$oc$slug.__PAGE__.txt | 41 ++
.../sinks/elasticsearch/__next.docs.$oc$slug.txt | 4 +
.../connectors/sinks/elasticsearch/__next.docs.txt | 22 +
docs/connectors/sinks/elasticsearch/index.html | 42 ++
docs/connectors/sinks/elasticsearch/index.txt | 72 ++
docs/connectors/sinks/iceberg/__next._full.txt | 84 +++
docs/connectors/sinks/iceberg/__next._head.txt | 6 +
docs/connectors/sinks/iceberg/__next._index.txt | 7 +
docs/connectors/sinks/iceberg/__next._tree.txt | 4 +
.../iceberg/__next.docs.$oc$slug.__PAGE__.txt | 52 ++
.../sinks/iceberg/__next.docs.$oc$slug.txt | 4 +
docs/connectors/sinks/iceberg/__next.docs.txt | 22 +
docs/connectors/sinks/iceberg/index.html | 72 ++
docs/connectors/sinks/iceberg/index.txt | 84 +++
docs/connectors/sinks/mongodb/__next._full.txt | 81 +++
docs/connectors/sinks/mongodb/__next._head.txt | 6 +
docs/connectors/sinks/mongodb/__next._index.txt | 7 +
docs/connectors/sinks/mongodb/__next._tree.txt | 4 +
.../mongodb/__next.docs.$oc$slug.__PAGE__.txt | 50 ++
.../sinks/mongodb/__next.docs.$oc$slug.txt | 4 +
docs/connectors/sinks/mongodb/__next.docs.txt | 22 +
docs/connectors/sinks/mongodb/index.html | 44 ++
docs/connectors/sinks/mongodb/index.txt | 81 +++
docs/connectors/sinks/postgres/__next._full.txt | 115 ++++
docs/connectors/sinks/postgres/__next._head.txt | 6 +
docs/connectors/sinks/postgres/__next._index.txt | 7 +
docs/connectors/sinks/postgres/__next._tree.txt | 4 +
.../postgres/__next.docs.$oc$slug.__PAGE__.txt | 83 +++
.../sinks/postgres/__next.docs.$oc$slug.txt | 4 +
docs/connectors/sinks/postgres/__next.docs.txt | 22 +
docs/connectors/sinks/postgres/index.html | 135 ++++
docs/connectors/sinks/postgres/index.txt | 115 ++++
docs/connectors/sinks/quickwit/__next._full.txt | 96 +++
docs/connectors/sinks/quickwit/__next._head.txt | 6 +
docs/connectors/sinks/quickwit/__next._index.txt | 7 +
docs/connectors/sinks/quickwit/__next._tree.txt | 4 +
.../quickwit/__next.docs.$oc$slug.__PAGE__.txt | 65 ++
.../sinks/quickwit/__next.docs.$oc$slug.txt | 4 +
docs/connectors/sinks/quickwit/__next.docs.txt | 22 +
docs/connectors/sinks/quickwit/index.html | 59 ++
docs/connectors/sinks/quickwit/index.txt | 96 +++
docs/connectors/sinks/sink/__next._full.txt | 171 +++++
docs/connectors/sinks/sink/__next._head.txt | 6 +
docs/connectors/sinks/sink/__next._index.txt | 7 +
docs/connectors/sinks/sink/__next._tree.txt | 4 +
.../sinks/sink/__next.docs.$oc$slug.__PAGE__.txt | 139 ++++
.../connectors/sinks/sink/__next.docs.$oc$slug.txt | 4 +
docs/connectors/sinks/sink/__next.docs.txt | 22 +
docs/connectors/sinks/sink/index.html | 178 +++++
docs/connectors/sinks/sink/index.txt | 171 +++++
docs/connectors/sinks/stdout/__next._full.txt | 66 ++
docs/connectors/sinks/stdout/__next._head.txt | 6 +
docs/connectors/sinks/stdout/__next._index.txt | 7 +
docs/connectors/sinks/stdout/__next._tree.txt | 4 +
.../sinks/stdout/__next.docs.$oc$slug.__PAGE__.txt | 35 +
.../sinks/stdout/__next.docs.$oc$slug.txt | 4 +
docs/connectors/sinks/stdout/__next.docs.txt | 22 +
docs/connectors/sinks/stdout/index.html | 24 +
docs/connectors/sinks/stdout/index.txt | 66 ++
.../sources/elasticsearch/__next._full.txt | 151 +++++
.../sources/elasticsearch/__next._head.txt | 6 +
.../sources/elasticsearch/__next._index.txt | 7 +
.../sources/elasticsearch/__next._tree.txt | 4 +
.../__next.docs.$oc$slug.__PAGE__.txt | 120 ++++
.../sources/elasticsearch/__next.docs.$oc$slug.txt | 4 +
.../sources/elasticsearch/__next.docs.txt | 22 +
docs/connectors/sources/elasticsearch/index.html | 230 +++++++
docs/connectors/sources/elasticsearch/index.txt | 151 +++++
docs/connectors/sources/postgres/__next._full.txt | 79 +++
docs/connectors/sources/postgres/__next._head.txt | 6 +
docs/connectors/sources/postgres/__next._index.txt | 7 +
docs/connectors/sources/postgres/__next._tree.txt | 4 +
.../postgres/__next.docs.$oc$slug.__PAGE__.txt | 47 ++
.../sources/postgres/__next.docs.$oc$slug.txt | 4 +
docs/connectors/sources/postgres/__next.docs.txt | 22 +
docs/connectors/sources/postgres/index.html | 89 +++
docs/connectors/sources/postgres/index.txt | 79 +++
docs/connectors/sources/random/__next._full.txt | 67 ++
docs/connectors/sources/random/__next._head.txt | 6 +
docs/connectors/sources/random/__next._index.txt | 7 +
docs/connectors/sources/random/__next._tree.txt | 4 +
.../random/__next.docs.$oc$slug.__PAGE__.txt | 36 +
.../sources/random/__next.docs.$oc$slug.txt | 4 +
docs/connectors/sources/random/__next.docs.txt | 22 +
docs/connectors/sources/random/index.html | 26 +
docs/connectors/sources/random/index.txt | 67 ++
docs/connectors/sources/source/__next._full.txt | 208 ++++++
docs/connectors/sources/source/__next._head.txt | 6 +
docs/connectors/sources/source/__next._index.txt | 7 +
docs/connectors/sources/source/__next._tree.txt | 4 +
.../source/__next.docs.$oc$slug.__PAGE__.txt | 176 +++++
.../sources/source/__next.docs.$oc$slug.txt | 4 +
docs/connectors/sources/source/__next.docs.txt | 22 +
docs/connectors/sources/source/index.html | 197 ++++++
docs/connectors/sources/source/index.txt | 208 ++++++
docs/faq/faq/__next._full.txt | 79 +++
docs/faq/faq/__next._head.txt | 6 +
docs/faq/faq/__next._index.txt | 7 +
docs/faq/faq/__next._tree.txt | 4 +
docs/faq/faq/__next.docs.$oc$slug.__PAGE__.txt | 41 ++
docs/faq/faq/__next.docs.$oc$slug.txt | 4 +
docs/faq/faq/__next.docs.txt | 22 +
docs/faq/faq/index.html | 24 +
docs/faq/faq/index.txt | 79 +++
docs/index.html | 40 ++
docs/index.txt | 78 +++
docs/introduction/about/__next._full.txt | 139 ++++
docs/introduction/about/__next._head.txt | 6 +
docs/introduction/about/__next._index.txt | 7 +
docs/introduction/about/__next._tree.txt | 4 +
.../about/__next.docs.$oc$slug.__PAGE__.txt | 87 +++
docs/introduction/about/__next.docs.$oc$slug.txt | 4 +
docs/introduction/about/__next.docs.txt | 22 +
docs/introduction/about/index.html | 95 +++
docs/introduction/about/index.txt | 139 ++++
docs/introduction/architecture/__next._full.txt | 143 ++++
docs/introduction/architecture/__next._head.txt | 6 +
docs/introduction/architecture/__next._index.txt | 7 +
docs/introduction/architecture/__next._tree.txt | 4 +
.../architecture/__next.docs.$oc$slug.__PAGE__.txt | 111 ++++
.../architecture/__next.docs.$oc$slug.txt | 4 +
docs/introduction/architecture/__next.docs.txt | 22 +
docs/introduction/architecture/index.html | 210 ++++++
docs/introduction/architecture/index.txt | 143 ++++
docs/introduction/getting-started/__next._full.txt | 385 +++++++++++
docs/introduction/getting-started/__next._head.txt | 6 +
.../introduction/getting-started/__next._index.txt | 7 +
docs/introduction/getting-started/__next._tree.txt | 4 +
.../__next.docs.$oc$slug.__PAGE__.txt | 339 ++++++++++
.../getting-started/__next.docs.$oc$slug.txt | 4 +
docs/introduction/getting-started/__next.docs.txt | 22 +
docs/introduction/getting-started/index.html | 410 ++++++++++++
docs/introduction/getting-started/index.txt | 385 +++++++++++
docs/sdk/cpp/intro/__next._full.txt | 85 +++
docs/sdk/cpp/intro/__next._head.txt | 6 +
docs/sdk/cpp/intro/__next._index.txt | 7 +
docs/sdk/cpp/intro/__next._tree.txt | 4 +
.../cpp/intro/__next.docs.$oc$slug.__PAGE__.txt | 54 ++
docs/sdk/cpp/intro/__next.docs.$oc$slug.txt | 4 +
docs/sdk/cpp/intro/__next.docs.txt | 22 +
docs/sdk/cpp/intro/index.html | 40 ++
docs/sdk/cpp/intro/index.txt | 85 +++
docs/sdk/csharp/examples/__next._full.txt | 212 ++++++
docs/sdk/csharp/examples/__next._head.txt | 6 +
docs/sdk/csharp/examples/__next._index.txt | 7 +
docs/sdk/csharp/examples/__next._tree.txt | 4 +
.../examples/__next.docs.$oc$slug.__PAGE__.txt | 179 +++++
docs/sdk/csharp/examples/__next.docs.$oc$slug.txt | 4 +
docs/sdk/csharp/examples/__next.docs.txt | 22 +
docs/sdk/csharp/examples/index.html | 168 +++++
docs/sdk/csharp/examples/index.txt | 212 ++++++
docs/sdk/csharp/guide/__next._full.txt | 386 +++++++++++
docs/sdk/csharp/guide/__next._head.txt | 6 +
docs/sdk/csharp/guide/__next._index.txt | 7 +
docs/sdk/csharp/guide/__next._tree.txt | 4 +
.../csharp/guide/__next.docs.$oc$slug.__PAGE__.txt | 357 ++++++++++
docs/sdk/csharp/guide/__next.docs.$oc$slug.txt | 4 +
docs/sdk/csharp/guide/__next.docs.txt | 22 +
docs/sdk/csharp/guide/index.html | 434 +++++++++++++
docs/sdk/csharp/guide/index.txt | 386 +++++++++++
docs/sdk/csharp/high-level-sdk/__next._full.txt | 219 +++++++
docs/sdk/csharp/high-level-sdk/__next._head.txt | 6 +
docs/sdk/csharp/high-level-sdk/__next._index.txt | 7 +
docs/sdk/csharp/high-level-sdk/__next._tree.txt | 4 +
.../__next.docs.$oc$slug.__PAGE__.txt | 184 ++++++
.../csharp/high-level-sdk/__next.docs.$oc$slug.txt | 4 +
docs/sdk/csharp/high-level-sdk/__next.docs.txt | 22 +
docs/sdk/csharp/high-level-sdk/index.html | 205 ++++++
docs/sdk/csharp/high-level-sdk/index.txt | 219 +++++++
docs/sdk/csharp/intro/__next._full.txt | 160 +++++
docs/sdk/csharp/intro/__next._head.txt | 6 +
docs/sdk/csharp/intro/__next._index.txt | 7 +
docs/sdk/csharp/intro/__next._tree.txt | 4 +
.../csharp/intro/__next.docs.$oc$slug.__PAGE__.txt | 120 ++++
docs/sdk/csharp/intro/__next.docs.$oc$slug.txt | 4 +
docs/sdk/csharp/intro/__next.docs.txt | 22 +
docs/sdk/csharp/intro/index.html | 121 ++++
docs/sdk/csharp/intro/index.txt | 160 +++++
docs/sdk/go/examples/__next._full.txt | 172 +++++
docs/sdk/go/examples/__next._head.txt | 6 +
docs/sdk/go/examples/__next._index.txt | 7 +
docs/sdk/go/examples/__next._tree.txt | 4 +
.../go/examples/__next.docs.$oc$slug.__PAGE__.txt | 139 ++++
docs/sdk/go/examples/__next.docs.$oc$slug.txt | 4 +
docs/sdk/go/examples/__next.docs.txt | 22 +
docs/sdk/go/examples/index.html | 141 ++++
docs/sdk/go/examples/index.txt | 172 +++++
docs/sdk/go/intro/__next._full.txt | 90 +++
docs/sdk/go/intro/__next._head.txt | 6 +
docs/sdk/go/intro/__next._index.txt | 7 +
docs/sdk/go/intro/__next._tree.txt | 4 +
.../sdk/go/intro/__next.docs.$oc$slug.__PAGE__.txt | 56 ++
docs/sdk/go/intro/__next.docs.$oc$slug.txt | 4 +
docs/sdk/go/intro/__next.docs.txt | 22 +
docs/sdk/go/intro/index.html | 49 ++
docs/sdk/go/intro/index.txt | 90 +++
docs/sdk/introduction/__next._full.txt | 82 +++
docs/sdk/introduction/__next._head.txt | 6 +
docs/sdk/introduction/__next._index.txt | 7 +
docs/sdk/introduction/__next._tree.txt | 4 +
.../introduction/__next.docs.$oc$slug.__PAGE__.txt | 48 ++
docs/sdk/introduction/__next.docs.$oc$slug.txt | 4 +
docs/sdk/introduction/__next.docs.txt | 22 +
docs/sdk/introduction/index.html | 51 ++
docs/sdk/introduction/index.txt | 82 +++
docs/sdk/java/examples/__next._full.txt | 122 ++++
docs/sdk/java/examples/__next._head.txt | 6 +
docs/sdk/java/examples/__next._index.txt | 7 +
docs/sdk/java/examples/__next._tree.txt | 4 +
.../examples/__next.docs.$oc$slug.__PAGE__.txt | 89 +++
docs/sdk/java/examples/__next.docs.$oc$slug.txt | 4 +
docs/sdk/java/examples/__next.docs.txt | 22 +
docs/sdk/java/examples/index.html | 90 +++
docs/sdk/java/examples/index.txt | 122 ++++
docs/sdk/java/intro/__next._full.txt | 145 +++++
docs/sdk/java/intro/__next._head.txt | 6 +
docs/sdk/java/intro/__next._index.txt | 7 +
docs/sdk/java/intro/__next._tree.txt | 4 +
.../java/intro/__next.docs.$oc$slug.__PAGE__.txt | 114 ++++
docs/sdk/java/intro/__next.docs.$oc$slug.txt | 4 +
docs/sdk/java/intro/__next.docs.txt | 22 +
docs/sdk/java/intro/index.html | 122 ++++
docs/sdk/java/intro/index.txt | 145 +++++
docs/sdk/node/examples/__next._full.txt | 108 +++
docs/sdk/node/examples/__next._head.txt | 6 +
docs/sdk/node/examples/__next._index.txt | 7 +
docs/sdk/node/examples/__next._tree.txt | 4 +
.../examples/__next.docs.$oc$slug.__PAGE__.txt | 75 +++
docs/sdk/node/examples/__next.docs.$oc$slug.txt | 4 +
docs/sdk/node/examples/__next.docs.txt | 22 +
docs/sdk/node/examples/index.html | 79 +++
docs/sdk/node/examples/index.txt | 108 +++
docs/sdk/node/intro/__next._full.txt | 108 +++
docs/sdk/node/intro/__next._head.txt | 6 +
docs/sdk/node/intro/__next._index.txt | 7 +
docs/sdk/node/intro/__next._tree.txt | 4 +
.../node/intro/__next.docs.$oc$slug.__PAGE__.txt | 74 +++
docs/sdk/node/intro/__next.docs.$oc$slug.txt | 4 +
docs/sdk/node/intro/__next.docs.txt | 22 +
docs/sdk/node/intro/index.html | 80 +++
docs/sdk/node/intro/index.txt | 108 +++
docs/sdk/python/examples/__next._full.txt | 111 ++++
docs/sdk/python/examples/__next._head.txt | 6 +
docs/sdk/python/examples/__next._index.txt | 7 +
docs/sdk/python/examples/__next._tree.txt | 4 +
.../examples/__next.docs.$oc$slug.__PAGE__.txt | 77 +++
docs/sdk/python/examples/__next.docs.$oc$slug.txt | 4 +
docs/sdk/python/examples/__next.docs.txt | 22 +
docs/sdk/python/examples/index.html | 71 ++
docs/sdk/python/examples/index.txt | 111 ++++
docs/sdk/python/intro/__next._full.txt | 106 +++
docs/sdk/python/intro/__next._head.txt | 6 +
docs/sdk/python/intro/__next._index.txt | 7 +
docs/sdk/python/intro/__next._tree.txt | 4 +
.../python/intro/__next.docs.$oc$slug.__PAGE__.txt | 72 ++
docs/sdk/python/intro/__next.docs.$oc$slug.txt | 4 +
docs/sdk/python/intro/__next.docs.txt | 22 +
docs/sdk/python/intro/index.html | 62 ++
docs/sdk/python/intro/index.txt | 106 +++
docs/sdk/rust/examples/__next._full.txt | 46 ++
docs/sdk/rust/examples/__next._head.txt | 6 +
docs/sdk/rust/examples/__next._index.txt | 7 +
docs/sdk/rust/examples/__next._tree.txt | 4 +
.../examples/__next.docs.$oc$slug.__PAGE__.txt | 8 +
docs/sdk/rust/examples/__next.docs.$oc$slug.txt | 4 +
docs/sdk/rust/examples/__next.docs.txt | 22 +
docs/sdk/rust/examples/index.html | 14 +
docs/sdk/rust/examples/index.txt | 46 ++
docs/sdk/rust/high-level-sdk/__next._full.txt | 97 +++
docs/sdk/rust/high-level-sdk/__next._head.txt | 6 +
docs/sdk/rust/high-level-sdk/__next._index.txt | 7 +
docs/sdk/rust/high-level-sdk/__next._tree.txt | 4 +
.../__next.docs.$oc$slug.__PAGE__.txt | 64 ++
.../rust/high-level-sdk/__next.docs.$oc$slug.txt | 4 +
docs/sdk/rust/high-level-sdk/__next.docs.txt | 22 +
docs/sdk/rust/high-level-sdk/index.html | 92 +++
docs/sdk/rust/high-level-sdk/index.txt | 97 +++
docs/sdk/rust/intro/__next._full.txt | 123 ++++
docs/sdk/rust/intro/__next._head.txt | 6 +
docs/sdk/rust/intro/__next._index.txt | 7 +
docs/sdk/rust/intro/__next._tree.txt | 4 +
.../rust/intro/__next.docs.$oc$slug.__PAGE__.txt | 87 +++
docs/sdk/rust/intro/__next.docs.$oc$slug.txt | 4 +
docs/sdk/rust/intro/__next.docs.txt | 22 +
docs/sdk/rust/intro/index.html | 82 +++
docs/sdk/rust/intro/index.txt | 123 ++++
docs/sdk/rust/stream-builder/__next._full.txt | 338 ++++++++++
docs/sdk/rust/stream-builder/__next._head.txt | 6 +
docs/sdk/rust/stream-builder/__next._index.txt | 7 +
docs/sdk/rust/stream-builder/__next._tree.txt | 4 +
.../__next.docs.$oc$slug.__PAGE__.txt | 300 +++++++++
.../rust/stream-builder/__next.docs.$oc$slug.txt | 4 +
docs/sdk/rust/stream-builder/__next.docs.txt | 22 +
docs/sdk/rust/stream-builder/index.html | 342 ++++++++++
docs/sdk/rust/stream-builder/index.txt | 338 ++++++++++
docs/server/benchmarking/__next._full.txt | 61 ++
docs/server/benchmarking/__next._head.txt | 6 +
docs/server/benchmarking/__next._index.txt | 7 +
docs/server/benchmarking/__next._tree.txt | 4 +
.../benchmarking/__next.docs.$oc$slug.__PAGE__.txt | 31 +
docs/server/benchmarking/__next.docs.$oc$slug.txt | 4 +
docs/server/benchmarking/__next.docs.txt | 22 +
docs/server/benchmarking/index.html | 44 ++
docs/server/benchmarking/index.txt | 61 ++
docs/server/configuration/__next._full.txt | 667 +++++++++++++++++++
docs/server/configuration/__next._head.txt | 6 +
docs/server/configuration/__next._index.txt | 7 +
docs/server/configuration/__next._tree.txt | 4 +
.../__next.docs.$oc$slug.__PAGE__.txt | 627 ++++++++++++++++++
docs/server/configuration/__next.docs.$oc$slug.txt | 4 +
docs/server/configuration/__next.docs.txt | 22 +
docs/server/configuration/index.html | 632 ++++++++++++++++++
docs/server/configuration/index.txt | 667 +++++++++++++++++++
docs/server/docker/__next._full.txt | 119 ++++
docs/server/docker/__next._head.txt | 6 +
docs/server/docker/__next._index.txt | 7 +
docs/server/docker/__next._tree.txt | 4 +
.../docker/__next.docs.$oc$slug.__PAGE__.txt | 85 +++
docs/server/docker/__next.docs.$oc$slug.txt | 4 +
docs/server/docker/__next.docs.txt | 22 +
docs/server/docker/index.html | 98 +++
docs/server/docker/index.txt | 119 ++++
docs/server/introduction/__next._full.txt | 49 ++
docs/server/introduction/__next._head.txt | 6 +
docs/server/introduction/__next._index.txt | 7 +
docs/server/introduction/__next._tree.txt | 4 +
.../introduction/__next.docs.$oc$slug.__PAGE__.txt | 9 +
docs/server/introduction/__next.docs.$oc$slug.txt | 4 +
docs/server/introduction/__next.docs.txt | 22 +
docs/server/introduction/index.html | 10 +
docs/server/introduction/index.txt | 49 ++
docs/server/networking/__next._full.txt | 94 +++
docs/server/networking/__next._head.txt | 6 +
docs/server/networking/__next._index.txt | 7 +
docs/server/networking/__next._tree.txt | 4 +
.../networking/__next.docs.$oc$slug.__PAGE__.txt | 61 ++
docs/server/networking/__next.docs.$oc$slug.txt | 4 +
docs/server/networking/__next.docs.txt | 22 +
docs/server/networking/index.html | 100 +++
docs/server/networking/index.txt | 94 +++
docs/server/schema/__next._full.txt | 416 ++++++++++++
docs/server/schema/__next._head.txt | 6 +
docs/server/schema/__next._index.txt | 7 +
docs/server/schema/__next._tree.txt | 4 +
.../schema/__next.docs.$oc$slug.__PAGE__.txt | 385 +++++++++++
docs/server/schema/__next.docs.$oc$slug.txt | 4 +
docs/server/schema/__next.docs.txt | 22 +
docs/server/schema/index.html | 722 +++++++++++++++++++++
docs/server/schema/index.txt | 416 ++++++++++++
docs/server/security/__next._full.txt | 130 ++++
docs/server/security/__next._head.txt | 6 +
docs/server/security/__next._index.txt | 7 +
docs/server/security/__next._tree.txt | 4 +
.../security/__next.docs.$oc$slug.__PAGE__.txt | 98 +++
docs/server/security/__next.docs.$oc$slug.txt | 4 +
docs/server/security/__next.docs.txt | 22 +
docs/server/security/index.html | 129 ++++
docs/server/security/index.txt | 130 ++++
docs/server/storage-engine/__next._full.txt | 122 ++++
docs/server/storage-engine/__next._head.txt | 6 +
docs/server/storage-engine/__next._index.txt | 7 +
docs/server/storage-engine/__next._tree.txt | 4 +
.../__next.docs.$oc$slug.__PAGE__.txt | 91 +++
.../server/storage-engine/__next.docs.$oc$slug.txt | 4 +
docs/server/storage-engine/__next.docs.txt | 22 +
docs/server/storage-engine/index.html | 125 ++++
docs/server/storage-engine/index.txt | 122 ++++
docs/web_ui/start/__next._full.txt | 125 ++++
docs/web_ui/start/__next._head.txt | 6 +
docs/web_ui/start/__next._index.txt | 7 +
docs/web_ui/start/__next._tree.txt | 4 +
.../web_ui/start/__next.docs.$oc$slug.__PAGE__.txt | 91 +++
docs/web_ui/start/__next.docs.$oc$slug.txt | 4 +
docs/web_ui/start/__next.docs.txt | 22 +
docs/web_ui/start/index.html | 105 +++
docs/web_ui/start/index.txt | 125 ++++
downloads/__next.!KHNpdGUp.downloads.__PAGE__.txt | 24 +
downloads/__next.!KHNpdGUp.downloads.txt | 4 +
downloads/__next.!KHNpdGUp.txt | 9 +
downloads/__next._full.txt | 46 ++
downloads/__next._head.txt | 6 +
downloads/__next._index.txt | 7 +
downloads/__next._tree.txt | 4 +
downloads/index.html | 11 +
downloads/index.txt | 46 ++
fonts/Inter-Medium.ttf | Bin 0 -> 314712 bytes
fonts/Inter-Regular.ttf | Bin 0 -> 309828 bytes
fonts/Inter-SemiBold.ttf | Bin 0 -> 315756 bytes
img/AdvancedFeatures.svg | 30 +
img/Avatar-Placeholder.svg | 9 +
img/ExtremelyEfficient.svg | 9 +
img/FullyOpenSourced.svg | 16 +
img/Image-Placeholder-1.svg | 4 +
img/Image-Placeholder-2.svg | 4 +
img/Image-Placeholder-3.svg | 4 +
img/ManagementInterface.svg | 30 +
img/MultipleTransports.svg | 72 ++
img/Sdk.svg | 44 ++
img/Switch-Handle.svg | 3 +
img/SystemFlow-Logo-White.svg | 11 +
img/SystemFlow-Logo.svg | 11 +
img/Video-Placeholder.svg | 4 +
img/apache-iggy-color-darkbg0.5x.png | Bin 0 -> 96024 bytes
img/apache-iggy-color-lightbg0.5x.png | Bin 0 -> 97130 bytes
img/apache-iggy-light-bg0.5x.png | Bin 0 -> 97156 bytes
img/apache-iggy0.5x.png | Bin 0 -> 96018 bytes
img/architecture.png | Bin 0 -> 760914 bytes
img/asf_logo.svg | 210 ++++++
img/authors/grzegorz.png | Bin 0 -> 56998 bytes
img/authors/hubert.png | Bin 0 -> 3861 bytes
img/authors/krishna.png | Bin 0 -> 496815 bytes
img/authors/piotr.png | Bin 0 -> 16348 bytes
img/bench_cli.png | Bin 0 -> 380000 bytes
img/bench_platform.png | Bin 0 -> 326093 bytes
img/check.svg | 3 +
img/cookies-1.svg | 20 +
img/copy-icon.svg | 3 +
img/dc-icon-p-130x130q80.png | Bin 0 -> 1509 bytes
img/dc-icon.png | Bin 0 -> 10623 bytes
img/docusaurus-social-card.jpg | Bin 0 -> 55746 bytes
img/docusaurus.png | Bin 0 -> 5142 bytes
img/emetlabs-light.svg | 27 +
img/favicon.ico | Bin 0 -> 15406 bytes
img/favicon.png | Bin 0 -> 2612 bytes
img/gh-icon-orange.svg | 14 +
img/github-mark-white.svg | 1 +
img/hero-main copy.webp | Bin 0 -> 150984 bytes
img/hero-main-p-1080 copy.webp | Bin 0 -> 58010 bytes
img/hero-main-p-1080.webp | Bin 0 -> 58010 bytes
img/hero-main-p-1600 copy.webp | Bin 0 -> 103532 bytes
img/hero-main-p-1600.webp | Bin 0 -> 103532 bytes
img/hero-main-p-500 copy.webp | Bin 0 -> 18198 bytes
img/hero-main-p-500.webp | Bin 0 -> 18198 bytes
img/hero-main-p-800 copy.webp | Bin 0 -> 36490 bytes
img/hero-main-p-800.webp | Bin 0 -> 36490 bytes
img/hero-main.webp | Bin 0 -> 150984 bytes
img/hugin-light.svg | 23 +
img/iggy-apache-color-darkbg.svg | 112 ++++
img/iggy-logo-1.png | Bin 0 -> 76710 bytes
img/iggy.png | Bin 0 -> 172679 bytes
img/iggy_0_1_0.jpg | Bin 0 -> 82650 bytes
img/iggy_bench_0_1_0.jpeg | Bin 0 -> 1386983 bytes
img/iggy_ci_0_1_0.jpeg | Bin 0 -> 538032 bytes
img/iggy_cli.png | Bin 0 -> 231092 bytes
img/iggy_cli_0_1_0.jpeg | Bin 0 -> 1049410 bytes
img/iggy_server.png | Bin 0 -> 1176428 bytes
img/iggy_server_0_1_0.jpeg | Bin 0 -> 1064181 bytes
img/iggy_web_ui.png | Bin 0 -> 145001 bytes
img/iggy_web_ui_0_1_0.jpeg | Bin 0 -> 215638 bytes
img/logo.png | Bin 0 -> 5663 bytes
img/logo.svg | 1 +
img/neferdata-light.svg | 29 +
img/solidhash.png | Bin 0 -> 6571 bytes
img/undraw_docusaurus_mountain.svg | 171 +++++
img/undraw_docusaurus_react.svg | 170 +++++
img/undraw_docusaurus_tree.svg | 40 ++
img/webclip.png | Bin 0 -> 26495 bytes
index.html | 41 ++
index.txt | 46 ++
.../iggy_bench.png | Bin 0 -> 111659 bytes
.../iggy_cli.png | Bin 0 -> 90242 bytes
.../iggy_cluster.png | Bin 0 -> 872341 bytes
.../iggy_perf.png | Bin 0 -> 68641 bytes
.../iggy_rocket.png | Bin 0 -> 225148 bytes
.../iggy_stars.png | Bin 0 -> 35419 bytes
.../iggy_tpc.png | Bin 0 -> 423184 bytes
.../iggy_web.png | Bin 0 -> 109581 bytes
.../iggy_docker.png | Bin 0 -> 721661 bytes
.../iggy_technology_radar.png | Bin 0 -> 406596 bytes
technology-radar-and-currrent-goals/iggy_vsr.png | Bin 0 -> 3958317 bytes
thread-per-core-io_uring/diagram_szpont.png | Bin 0 -> 271604 bytes
thread-per-core-io_uring/ecs.png | Bin 0 -> 154902 bytes
thread-per-core-io_uring/pc_16_0.7.png | Bin 0 -> 842734 bytes
thread-per-core-io_uring/pp_16_0.5_fsync.png | Bin 0 -> 607289 bytes
thread-per-core-io_uring/pp_16_0.5_rl.png | Bin 0 -> 200013 bytes
thread-per-core-io_uring/pp_16_0.6.png | Bin 0 -> 210659 bytes
thread-per-core-io_uring/pp_16_0.6_fsync.png | Bin 0 -> 448910 bytes
thread-per-core-io_uring/pp_16_0.7.png | Bin 0 -> 236428 bytes
thread-per-core-io_uring/pp_16_0.7_fsync.png | Bin 0 -> 292373 bytes
thread-per-core-io_uring/pp_32_0.5_fsync.png | Bin 0 -> 612916 bytes
thread-per-core-io_uring/pp_32_0.5_rl.png | Bin 0 -> 212749 bytes
thread-per-core-io_uring/pp_32_0.6.png | Bin 0 -> 156460 bytes
thread-per-core-io_uring/pp_32_0.7.png | Bin 0 -> 167854 bytes
thread-per-core-io_uring/pp_32_0.7_fsync.png | Bin 0 -> 432903 bytes
thread-per-core-io_uring/pp_4_0.5_rl.png | Bin 0 -> 265914 bytes
thread-per-core-io_uring/pp_64_0.6.png | Bin 0 -> 139175 bytes
thread-per-core-io_uring/pp_8_0.5_rl.png | Bin 0 -> 156545 bytes
thread-per-core-io_uring/pp_8_0.6_rl.png | Bin 0 -> 147937 bytes
thread-per-core-io_uring/pp_8_0.7_rl.png | Bin 0 -> 245574 bytes
thread-per-core-io_uring/sharding.png | Bin 0 -> 535868 bytes
transparent-benchmarks/iggy_bench_cli.png | Bin 0 -> 515157 bytes
transparent-benchmarks/iggy_bench_dashboard.png | Bin 0 -> 394188 bytes
websocket-support-for-compio/pc_tcp.png | Bin 0 -> 197964 bytes
websocket-support-for-compio/pc_ws.png | Bin 0 -> 184540 bytes
websocket-support-for-compio/tcp-1234.png | Bin 0 -> 205593 bytes
websocket-support-for-compio/ws-1234.png | Bin 0 -> 190067 bytes
zero-copy-deserialization/iggy_batch_schema_1.png | Bin 0 -> 525799 bytes
zero-copy-deserialization/iggy_batch_schema_2.png | Bin 0 -> 546950 bytes
.../no_zero_copy_consumer.png | Bin 0 -> 1490151 bytes
.../no_zero_copy_producer.png | Bin 0 -> 684901 bytes
zero-copy-deserialization/zero_copy_consumer.png | Bin 0 -> 485344 bytes
zero-copy-deserialization/zero_copy_producer.png | Bin 0 -> 602342 bytes
939 files changed, 40185 insertions(+)
diff --git a/.asf.yaml b/.asf.yaml
new file mode 100644
index 00000000..b9e99afd
--- /dev/null
+++ b/.asf.yaml
@@ -0,0 +1,49 @@
+github:
+ description: "Apache Iggy (Incubating) Website"
+ homepage: https://iggy.apache.org/
+ features:
+ # Enable wiki for documentation
+ wiki: true
+ # Enable issue management
+ issues: true
+ # Enable discussions
+ discussions: true
+ labels:
+ - rust
+ - message-streaming
+ - iggy
+ - apache
+ enabled_merge_buttons:
+ squash: true
+ merge: false
+ rebase: false
+
+ collaborators:
+ - landingpro
+
+ rulesets:
+ - name: "Default Branch Protection"
+ type: branch
+ branches:
+ includes:
+ - "~DEFAULT_BRANCH"
+ - "release/*"
+ - "rel/*"
+ excludes: []
+ bypass_teams:
+ - root
+ restrict_deletion: true
+ restrict_force_push: true
+publish:
+ whoami: asf-site
+
+# Staging and publishing profile:
+staging:
+ profile:
+ whoami: asf-staging
+
+notifications:
+ commits: commits@iggy.apache.org
+ issues: commits@iggy.apache.org
+ pullrequests: commits@iggy.apache.org
+ discussions: dev@iggy.apache.org
diff --git a/.nojekyll b/.nojekyll
new file mode 100644
index 00000000..e69de29b
diff --git a/404.html b/404.html
new file mode 100644
index 00000000..d3d113dd
--- /dev/null
+++ b/404.html
@@ -0,0 +1 @@
+<!DOCTYPE html><!--uBHgltRE2s5QA49x61S_u--><html lang="en" class="geistsans_d5a4f12f-module__Ur3q_a__variable geistmono_157ca88a-module__iaM1Ya__variable"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/_next/static/chunks/32a0415c8ab1bd26.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/922b7f01aa6775a6.js"/><script src="/_next/static/chunks/82abf2d6 [...]
\ No newline at end of file
diff --git a/404/index.html b/404/index.html
new file mode 100644
index 00000000..d3d113dd
--- /dev/null
+++ b/404/index.html
@@ -0,0 +1 @@
+<!DOCTYPE html><!--uBHgltRE2s5QA49x61S_u--><html lang="en" class="geistsans_d5a4f12f-module__Ur3q_a__variable geistmono_157ca88a-module__iaM1Ya__variable"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/_next/static/chunks/32a0415c8ab1bd26.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/922b7f01aa6775a6.js"/><script src="/_next/static/chunks/82abf2d6 [...]
\ No newline at end of file
diff --git a/__next.!KGhvbWUp.__PAGE__.txt b/__next.!KGhvbWUp.__PAGE__.txt
new file mode 100644
index 00000000..c8ec39f1
--- /dev/null
+++ b/__next.!KGhvbWUp.__PAGE__.txt
@@ -0,0 +1,25 @@
+1:"$Sreact.fragment"
+2:I[22016,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/ce4fe957ab48a9d2.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/f58eedfa913263a9.js"],""]
+3:I[5500,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/ce4fe957ab48a9d2.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/f58eedfa913263a9.js"],"Image"]
+a:I[89626,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/ce4fe957ab48a9d2.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/f58eedfa913263a9.js"],"BenchmarkSection"]
+12:I[18870,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/ce4fe957ab48a9d2.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/f58eedfa913263a9.js"],"LandingCodeTabs"]
+16:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"OutletBoundary"]
+17:"$Sreact.suspense"
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","c",{"children":[[["$","section",null,{"className":"relative overflow-hidden px-6 pt-8 pb-20","style":{"backgroundImage":"url(/img/hero-main.webp), radial-gradient(circle closest-side at 35% 48%, #ff910314, #070c1700 60%), radial-gradient(circle closest-side at 68% 52%, #111d35, #070c1700 63%), radial-gradient(circle farthest-side at 20% 0%, #0e1f42, #070c17 21%)","backgroundPosition":"50% 29%, 0 0, 0 0, 0 0","backgroundRepeat":"no-rep [...]
+4:["$","div",null,{"className":"mx-auto max-w-6xl","children":[["$","div",null,{"className":"mx-auto mb-14 max-w-3xl text-center","children":[["$","h2",null,{"className":"mb-5 text-3xl font-bold tracking-tight text-[#fffaeb] sm:text-4xl md:text-5xl","children":["Built for ",["$","span",null,{"className":"text-[#ff9103]","children":"performance"}]]}],["$","p",null,{"className":"text-lg font-light leading-relaxed text-[#aeb5bd]","children":["Designed from the ground up with"," ",["$","span [...]
+5:["$","section",null,{"className":"px-6 py-20","style":{"backgroundImage":"radial-gradient(circle farthest-side at 30% 80%, #1a100820, #070c17 50%)"},"children":["$","div",null,{"className":"mx-auto max-w-6xl","children":[["$","div",null,{"className":"mx-auto mb-14 max-w-3xl text-center","children":[["$","h2",null,{"className":"mb-5 text-4xl font-bold tracking-tight text-[#fffaeb] md:text-5xl","children":["How it ",["$","span",null,{"className":"text-[#ff9103]","children":"works"}]]}],[ [...]
+6:["$","section",null,{"className":"px-6 py-20","style":{"backgroundImage":"radial-gradient(circle farthest-side at 50% 90%, #1a1008, #070c17 65%)"},"children":["$","div",null,{"className":"mx-auto max-w-6xl","children":[["$","div",null,{"className":"mx-auto mb-14 max-w-3xl text-center","children":[["$","h2",null,{"className":"mb-5 text-4xl font-bold tracking-tight text-[#fffaeb] md:text-5xl","children":["Complete ",["$","span",null,{"className":"text-[#ff9103]","children":"ecosystem"}]] [...]
+7:["$","footer",null,{"className":"border-t border-[#3d4450] px-6 py-14","style":{"backgroundColor":"#070c17"},"children":["$","div",null,{"className":"mx-auto max-w-6xl","children":[["$","div",null,{"className":"grid gap-10 sm:grid-cols-3","children":[["$","div",null,{"children":[["$","h4",null,{"className":"mb-4 text-sm font-semibold tracking-wide text-[#ff9103] uppercase","children":"Docs"}],["$","ul",null,{"className":"space-y-2.5 text-sm","children":["$","li",null,{"children":["$"," [...]
+8:["$","script","script-0",{"src":"/_next/static/chunks/f58eedfa913263a9.js","async":true}]
+9:["$","$L16",null,{"children":["$","$17",null,{"name":"Next.MetadataOutlet","children":"$@18"}]}]
+b:["$","div","Zero-Copy Serialization",{"className":"group rounded-2xl border border-white/[0.08] bg-white/[0.02] p-6 transition-all duration-300 hover:border-[#ff9103]/30 hover:bg-[#18213a]/50","children":[["$","h3",null,{"className":"mb-3 text-lg font-semibold text-[#d6d7d7] transition-colors group-hover:text-[#fffaeb]","children":"Zero-Copy Serialization"}],["$","p",null,{"className":"text-sm font-light leading-relaxed text-[#aeb5bd]","children":"Custom zero-copy (de)serialization for [...]
+c:["$","div","Multiple Transport Protocols",{"className":"group rounded-2xl border border-white/[0.08] bg-white/[0.02] p-6 transition-all duration-300 hover:border-[#ff9103]/30 hover:bg-[#18213a]/50","children":[["$","h3",null,{"className":"mb-3 text-lg font-semibold text-[#d6d7d7] transition-colors group-hover:text-[#fffaeb]","children":"Multiple Transport Protocols"}],["$","p",null,{"className":"text-sm font-light leading-relaxed text-[#aeb5bd]","children":"Support for QUIC, TCP, WebSo [...]
+d:["$","div","Multi-Language SDKs",{"className":"group rounded-2xl border border-white/[0.08] bg-white/[0.02] p-6 transition-all duration-300 hover:border-[#ff9103]/30 hover:bg-[#18213a]/50","children":[["$","h3",null,{"className":"mb-3 text-lg font-semibold text-[#d6d7d7] transition-colors group-hover:text-[#fffaeb]","children":"Multi-Language SDKs"}],["$","p",null,{"className":"text-sm font-light leading-relaxed text-[#aeb5bd]","children":"Client libraries available for Rust, C#, Java, [...]
+e:["$","div","Consumer Groups & Partitioning",{"className":"group rounded-2xl border border-white/[0.08] bg-white/[0.02] p-6 transition-all duration-300 hover:border-[#ff9103]/30 hover:bg-[#18213a]/50","children":[["$","h3",null,{"className":"mb-3 text-lg font-semibold text-[#d6d7d7] transition-colors group-hover:text-[#fffaeb]","children":"Consumer Groups & Partitioning"}],["$","p",null,{"className":"text-sm font-light leading-relaxed text-[#aeb5bd]","children":"Built-in support for con [...]
+f:["$","div","Security & Access Control",{"className":"group rounded-2xl border border-white/[0.08] bg-white/[0.02] p-6 transition-all duration-300 hover:border-[#ff9103]/30 hover:bg-[#18213a]/50","children":[["$","h3",null,{"className":"mb-3 text-lg font-semibold text-[#d6d7d7] transition-colors group-hover:text-[#fffaeb]","children":"Security & Access Control"}],["$","p",null,{"className":"text-sm font-light leading-relaxed text-[#aeb5bd]","children":"TLS on all transports, per-stream [...]
+10:["$","div","Built-in Monitoring",{"className":"group rounded-2xl border border-white/[0.08] bg-white/[0.02] p-6 transition-all duration-300 hover:border-[#ff9103]/30 hover:bg-[#18213a]/50","children":[["$","h3",null,{"className":"mb-3 text-lg font-semibold text-[#d6d7d7] transition-colors group-hover:text-[#fffaeb]","children":"Built-in Monitoring"}],["$","p",null,{"className":"text-sm font-light leading-relaxed text-[#aeb5bd]","children":"OpenTelemetry logs & traces, Prometheus metri [...]
+11:["$","div","Multi-Tenant Support",{"className":"group rounded-2xl border border-white/[0.08] bg-white/[0.02] p-6 transition-all duration-300 hover:border-[#ff9103]/30 hover:bg-[#18213a]/50","children":[["$","h3",null,{"className":"mb-3 text-lg font-semibold text-[#d6d7d7] transition-colors group-hover:text-[#fffaeb]","children":"Multi-Tenant Support"}],["$","p",null,{"className":"text-sm font-light leading-relaxed text-[#aeb5bd]","children":"Stream abstraction for multi-tenancy, confi [...]
+13:["$","span","HTTP",{"className":"px-2 py-0.5 rounded-full text-[10px] font-medium text-[#aaafb6] border border-white/[0.08]","children":"HTTP"}]
+14:["$","$L2","Web UI",{"href":"/docs/web_ui/start","className":"group rounded-2xl border border-white/[0.08] bg-white/[0.02] p-6 transition-all duration-300 hover:border-[#ff9103]/30 hover:bg-[#18213a]/50 no-underline","children":[["$","div",null,{"className":"flex items-center gap-3 mb-3","children":[["$","div",null,{"className":"w-3 h-3 rounded-full","style":{"backgroundColor":"#a855f7"}}],["$","h3",null,{"className":"text-xl font-semibold text-[#fffaeb] m-0","children":"Web UI"}]]}], [...]
+15:["$","$L2","CLI",{"href":"/docs/cli/start","className":"group rounded-2xl border border-white/[0.08] bg-white/[0.02] p-6 transition-all duration-300 hover:border-[#ff9103]/30 hover:bg-[#18213a]/50 no-underline","children":[["$","div",null,{"className":"flex items-center gap-3 mb-3","children":[["$","div",null,{"className":"w-3 h-3 rounded-full","style":{"backgroundColor":"#6366f1"}}],["$","h3",null,{"className":"text-xl font-semibold text-[#fffaeb] m-0","children":"CLI"}]]}],["$","p", [...]
+18:null
diff --git a/__next.!KGhvbWUp.txt b/__next.!KGhvbWUp.txt
new file mode 100644
index 00000000..aa641eed
--- /dev/null
+++ b/__next.!KGhvbWUp.txt
@@ -0,0 +1,10 @@
+1:"$Sreact.fragment"
+2:I[83571,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/ce4fe957ab48a9d2.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Header"]
+3:I[29966,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/ce4fe957ab48a9d2.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFDropdown"]
+4:I[36330,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/ce4fe957ab48a9d2.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFMobileLinks"]
+5:I[22016,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/ce4fe957ab48a9d2.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/f58eedfa913263a9.js"],""]
+6:I[5500,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/ce4fe957ab48a9d2.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/f58eedfa913263a9.js"],"Image"]
+7:I[89589,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/ce4fe957ab48a9d2.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ForceDarkTheme"]
+8:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+9:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","c",{"children":[[["$","script","script-0",{"src":"/_next/static/chunks/ce4fe957ab48a9d2.js","async":true}],["$","script","script-1",{"src":"/_next/static/chunks/da34cc6305706ac6.js","async":true}],["$","script","script-2",{"src":"/_next/static/chunks/9baf65674e2de991.js","async":true}],["$","script","script-3",{"src":"/_next/static/chunks/26b70f9828dd1eb5.js","async":true}],["$","script","script-4",{"src":"/_next/static/chunks/adeed83 [...]
diff --git a/__next._full.txt b/__next._full.txt
new file mode 100644
index 00000000..3608df74
--- /dev/null
+++ b/__next._full.txt
@@ -0,0 +1,46 @@
+1:"$Sreact.fragment"
+2:I[17751,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js"],"RootProvider"]
+3:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+4:I[58298,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/5a37d4cb1abe17d7.js"],"default"]
+5:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+6:I[83571,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/ce4fe957ab48a9d2.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Header"]
+7:I[29966,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/ce4fe957ab48a9d2.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFDropdown"]
+8:I[36330,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/ce4fe957ab48a9d2.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFMobileLinks"]
+9:I[22016,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/ce4fe957ab48a9d2.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/f58eedfa913263a9.js"],""]
+a:I[5500,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/ce4fe957ab48a9d2.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/f58eedfa913263a9.js"],"Image"]
+b:I[89589,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/ce4fe957ab48a9d2.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ForceDarkTheme"]
+10:I[68027,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+:HL["/_next/static/chunks/32a0415c8ab1bd26.css","style"]
+:HL["/_next/static/media/GeistMono_Variable.p.2f937313.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+:HL["/_next/static/media/Geist_Variable-s.p.92592eb2.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+0:{"P":null,"b":"uBHgltRE2s5QA49x61S_u","c":["",""],"q":"","i":false,"f":[[["",{"children":["(home)",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",true],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/32a0415c8ab1bd26.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0",{"src":"/_next/static/chunks/9ebd3a84bf60af84.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src" [...]
+17:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"ViewportBoundary"]
+19:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"MetadataBoundary"]
+1a:"$Sreact.suspense"
+c:["$","h1",null,{"className":"next-error-h1","style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:1:props:style","children":404}]
+d:["$","div",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:style","children":["$","h2",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style","children":"This page could not be found."}]}]
+e:["$","$1","c",{"children":[[["$","section",null,{"className":"relative overflow-hidden px-6 pt-8 pb-20","style":{"backgroundImage":"url(/img/hero-main.webp), radial-gradient(circle closest-side at 35% 48%, #ff910314, #070c1700 60%), radial-gradient(circle closest-side at 68% 52%, #111d35, #070c1700 63%), radial-gradient(circle farthest-side at 20% 0%, #0e1f42, #070c17 21%)","backgroundPosition":"50% 29%, 0 0, 0 0, 0 0","backgroundRepeat":"no-repeat, repeat, repeat, repeat","backgroundS [...]
+f:["$","$1","h",{"children":[null,["$","$L17",null,{"children":"$L18"}],["$","div",null,{"hidden":true,"children":["$","$L19",null,{"children":["$","$1a",null,{"name":"Next.Metadata","children":"$L1b"}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}]
+1c:I[89626,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/ce4fe957ab48a9d2.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/f58eedfa913263a9.js"],"BenchmarkSection"]
+24:I[18870,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/ce4fe957ab48a9d2.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/f58eedfa913263a9.js"],"LandingCodeTabs"]
+28:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"OutletBoundary"]
+11:["$","div",null,{"className":"mx-auto max-w-6xl","children":[["$","div",null,{"className":"mx-auto mb-14 max-w-3xl text-center","children":[["$","h2",null,{"className":"mb-5 text-3xl font-bold tracking-tight text-[#fffaeb] sm:text-4xl md:text-5xl","children":["Built for ",["$","span",null,{"className":"text-[#ff9103]","children":"performance"}]]}],["$","p",null,{"className":"text-lg font-light leading-relaxed text-[#aeb5bd]","children":["Designed from the ground up with"," ",["$","spa [...]
+12:["$","section",null,{"className":"px-6 py-20","style":{"backgroundImage":"radial-gradient(circle farthest-side at 30% 80%, #1a100820, #070c17 50%)"},"children":["$","div",null,{"className":"mx-auto max-w-6xl","children":[["$","div",null,{"className":"mx-auto mb-14 max-w-3xl text-center","children":[["$","h2",null,{"className":"mb-5 text-4xl font-bold tracking-tight text-[#fffaeb] md:text-5xl","children":["How it ",["$","span",null,{"className":"text-[#ff9103]","children":"works"}]]}], [...]
+13:["$","section",null,{"className":"px-6 py-20","style":{"backgroundImage":"radial-gradient(circle farthest-side at 50% 90%, #1a1008, #070c17 65%)"},"children":["$","div",null,{"className":"mx-auto max-w-6xl","children":[["$","div",null,{"className":"mx-auto mb-14 max-w-3xl text-center","children":[["$","h2",null,{"className":"mb-5 text-4xl font-bold tracking-tight text-[#fffaeb] md:text-5xl","children":["Complete ",["$","span",null,{"className":"text-[#ff9103]","children":"ecosystem"}] [...]
+14:["$","footer",null,{"className":"border-t border-[#3d4450] px-6 py-14","style":{"backgroundColor":"#070c17"},"children":["$","div",null,{"className":"mx-auto max-w-6xl","children":[["$","div",null,{"className":"grid gap-10 sm:grid-cols-3","children":[["$","div",null,{"children":[["$","h4",null,{"className":"mb-4 text-sm font-semibold tracking-wide text-[#ff9103] uppercase","children":"Docs"}],["$","ul",null,{"className":"space-y-2.5 text-sm","children":["$","li",null,{"children":["$", [...]
+15:["$","script","script-0",{"src":"/_next/static/chunks/f58eedfa913263a9.js","async":true,"nonce":"$undefined"}]
+16:["$","$L28",null,{"children":["$","$1a",null,{"name":"Next.MetadataOutlet","children":"$@29"}]}]
+1d:["$","div","Zero-Copy Serialization",{"className":"group rounded-2xl border border-white/[0.08] bg-white/[0.02] p-6 transition-all duration-300 hover:border-[#ff9103]/30 hover:bg-[#18213a]/50","children":[["$","h3",null,{"className":"mb-3 text-lg font-semibold text-[#d6d7d7] transition-colors group-hover:text-[#fffaeb]","children":"Zero-Copy Serialization"}],["$","p",null,{"className":"text-sm font-light leading-relaxed text-[#aeb5bd]","children":"Custom zero-copy (de)serialization fo [...]
+1e:["$","div","Multiple Transport Protocols",{"className":"group rounded-2xl border border-white/[0.08] bg-white/[0.02] p-6 transition-all duration-300 hover:border-[#ff9103]/30 hover:bg-[#18213a]/50","children":[["$","h3",null,{"className":"mb-3 text-lg font-semibold text-[#d6d7d7] transition-colors group-hover:text-[#fffaeb]","children":"Multiple Transport Protocols"}],["$","p",null,{"className":"text-sm font-light leading-relaxed text-[#aeb5bd]","children":"Support for QUIC, TCP, WebS [...]
+1f:["$","div","Multi-Language SDKs",{"className":"group rounded-2xl border border-white/[0.08] bg-white/[0.02] p-6 transition-all duration-300 hover:border-[#ff9103]/30 hover:bg-[#18213a]/50","children":[["$","h3",null,{"className":"mb-3 text-lg font-semibold text-[#d6d7d7] transition-colors group-hover:text-[#fffaeb]","children":"Multi-Language SDKs"}],["$","p",null,{"className":"text-sm font-light leading-relaxed text-[#aeb5bd]","children":"Client libraries available for Rust, C#, Java [...]
+20:["$","div","Consumer Groups & Partitioning",{"className":"group rounded-2xl border border-white/[0.08] bg-white/[0.02] p-6 transition-all duration-300 hover:border-[#ff9103]/30 hover:bg-[#18213a]/50","children":[["$","h3",null,{"className":"mb-3 text-lg font-semibold text-[#d6d7d7] transition-colors group-hover:text-[#fffaeb]","children":"Consumer Groups & Partitioning"}],["$","p",null,{"className":"text-sm font-light leading-relaxed text-[#aeb5bd]","children":"Built-in support for co [...]
+21:["$","div","Security & Access Control",{"className":"group rounded-2xl border border-white/[0.08] bg-white/[0.02] p-6 transition-all duration-300 hover:border-[#ff9103]/30 hover:bg-[#18213a]/50","children":[["$","h3",null,{"className":"mb-3 text-lg font-semibold text-[#d6d7d7] transition-colors group-hover:text-[#fffaeb]","children":"Security & Access Control"}],["$","p",null,{"className":"text-sm font-light leading-relaxed text-[#aeb5bd]","children":"TLS on all transports, per-stream [...]
+22:["$","div","Built-in Monitoring",{"className":"group rounded-2xl border border-white/[0.08] bg-white/[0.02] p-6 transition-all duration-300 hover:border-[#ff9103]/30 hover:bg-[#18213a]/50","children":[["$","h3",null,{"className":"mb-3 text-lg font-semibold text-[#d6d7d7] transition-colors group-hover:text-[#fffaeb]","children":"Built-in Monitoring"}],["$","p",null,{"className":"text-sm font-light leading-relaxed text-[#aeb5bd]","children":"OpenTelemetry logs & traces, Prometheus metri [...]
+23:["$","div","Multi-Tenant Support",{"className":"group rounded-2xl border border-white/[0.08] bg-white/[0.02] p-6 transition-all duration-300 hover:border-[#ff9103]/30 hover:bg-[#18213a]/50","children":[["$","h3",null,{"className":"mb-3 text-lg font-semibold text-[#d6d7d7] transition-colors group-hover:text-[#fffaeb]","children":"Multi-Tenant Support"}],["$","p",null,{"className":"text-sm font-light leading-relaxed text-[#aeb5bd]","children":"Stream abstraction for multi-tenancy, confi [...]
+25:["$","span","HTTP",{"className":"px-2 py-0.5 rounded-full text-[10px] font-medium text-[#aaafb6] border border-white/[0.08]","children":"HTTP"}]
+26:["$","$L9","Web UI",{"href":"/docs/web_ui/start","className":"group rounded-2xl border border-white/[0.08] bg-white/[0.02] p-6 transition-all duration-300 hover:border-[#ff9103]/30 hover:bg-[#18213a]/50 no-underline","children":[["$","div",null,{"className":"flex items-center gap-3 mb-3","children":[["$","div",null,{"className":"w-3 h-3 rounded-full","style":{"backgroundColor":"#a855f7"}}],["$","h3",null,{"className":"text-xl font-semibold text-[#fffaeb] m-0","children":"Web UI"}]]}], [...]
+27:["$","$L9","CLI",{"href":"/docs/cli/start","className":"group rounded-2xl border border-white/[0.08] bg-white/[0.02] p-6 transition-all duration-300 hover:border-[#ff9103]/30 hover:bg-[#18213a]/50 no-underline","children":[["$","div",null,{"className":"flex items-center gap-3 mb-3","children":[["$","div",null,{"className":"w-3 h-3 rounded-full","style":{"backgroundColor":"#6366f1"}}],["$","h3",null,{"className":"text-xl font-semibold text-[#fffaeb] m-0","children":"CLI"}]]}],["$","p", [...]
+18:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
+2a:I[27201,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"IconMark"]
+1b:[["$","title","0",{"children":"Apache Iggy (Incubating) | Hyper-Efficient Message Streaming | Apache Iggy"}],["$","meta","1",{"name":"description","content":"Apache Iggy (Incubating) is a high-performance, persistent message streaming platform written in Rust, capable of processing millions of messages per second with ultra-low latency."}],["$","link","2",{"rel":"icon","href":"/img/favicon.png"}],["$","$L2a","3",{}]]
+29:null
diff --git a/__next._head.txt b/__next._head.txt
new file mode 100644
index 00000000..ab9a3beb
--- /dev/null
+++ b/__next._head.txt
@@ -0,0 +1,6 @@
+1:"$Sreact.fragment"
+2:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"ViewportBoundary"]
+3:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"MetadataBoundary"]
+4:"$Sreact.suspense"
+5:I[27201,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"IconMark"]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","h",{"children":[null,["$","$L2",null,{"children":[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]}],["$","div",null,{"hidden":true,"children":["$","$L3",null,{"children":["$","$4",null,{"name":"Next.Metadata","children":[["$","title","0",{"children":"Apache Iggy (Incubating) | Hyper-Efficient Message Streaming | Apache Iggy"}],["$","meta","1",{"name":"descripti [...]
diff --git a/__next._index.txt b/__next._index.txt
new file mode 100644
index 00000000..fd02bd95
--- /dev/null
+++ b/__next._index.txt
@@ -0,0 +1,7 @@
+1:"$Sreact.fragment"
+2:I[17751,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js"],"RootProvider"]
+3:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+4:I[58298,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/5a37d4cb1abe17d7.js"],"default"]
+5:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+:HL["/_next/static/chunks/32a0415c8ab1bd26.css","style"]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/32a0415c8ab1bd26.css","precedence":"next"}],["$","script","script-0",{"src":"/_next/static/chunks/9ebd3a84bf60af84.js","async":true}],["$","script","script-1",{"src":"/_next/static/chunks/78b5f2e7b839e72f.js","async":true}]],["$","html",null,{"lang":"en","className":"geistsans_d5a4f12f-module__Ur3q_a__variable geistmono_157ca88a-module__iaM1Ya__variable" [...]
diff --git a/__next._tree.txt b/__next._tree.txt
new file mode 100644
index 00000000..67f53556
--- /dev/null
+++ b/__next._tree.txt
@@ -0,0 +1,4 @@
+:HL["/_next/static/chunks/32a0415c8ab1bd26.css","style"]
+:HL["/_next/static/media/GeistMono_Variable.p.2f937313.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+:HL["/_next/static/media/Geist_Variable-s.p.92592eb2.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","tree":{"name":"","paramType":null,"paramKey":"","hasRuntimePrefetch":false,"slots":{"children":{"name":"(home)","paramType":null,"paramKey":"(home)","hasRuntimePrefetch":false,"slots":{"children":{"name":"__PAGE__","paramType":null,"paramKey":"__PAGE__","hasRuntimePrefetch":false,"slots":null,"isRootLayout":false}},"isRootLayout":false}},"isRootLayout":true},"staleTime":300}
diff --git a/_next/static/chunks/00b00679782d0ffd.js b/_next/static/chunks/00b00679782d0ffd.js
new file mode 100644
index 00000000..89b55b4e
--- /dev/null
+++ b/_next/static/chunks/00b00679782d0ffd.js
@@ -0,0 +1 @@
+(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,14804,e=>{"use strict";function t(...e){return t=>{e.forEach(e=>{"function"==typeof e?e(t):e&&(e.current=t)})}}e.s(["mergeRefs",()=>t])},43531,e=>{"use strict";let t=(0,e.i(75254).default)("check",[["path",{d:"M20 6 9 17l-5-5",key:"1gmf2c"}]]);e.s(["Check",()=>t],43531)},20504,e=>{e.v(t=>Promise.all(["static/chunks/b7d6d72e7c987e27.js"].map(t=>e.l(t))).then(()=>t(48795)))}]);
\ No newline at end of file
diff --git a/_next/static/chunks/10b35a01dc5843a9.js b/_next/static/chunks/10b35a01dc5843a9.js
new file mode 100644
index 00000000..c0ab61de
--- /dev/null
+++ b/_next/static/chunks/10b35a01dc5843a9.js
@@ -0,0 +1 @@
+(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,26330,e=>{"use strict";var t,n=e.i(71645),r=e.i(81140),o=e.i(48425),a=e.i(20783),i=e.i(30207),c=e.i(43476),u="dismissableLayer.update",s=n.createContext({layers:new Set,layersWithOutsidePointerEventsDisabled:new Set,branches:new Set}),l=n.forwardRef((e,l)=>{let{disableOutsidePointerEvents:v=!1,onEscapeKeyDown:p,onPointerDownOutside:m,onFocusOutside:h,onInteractOutside:y,onDismi [...]
\ No newline at end of file
diff --git a/_next/static/chunks/17ccc6a5b3ad8f66.js b/_next/static/chunks/17ccc6a5b3ad8f66.js
new file mode 100644
index 00000000..e876389e
--- /dev/null
+++ b/_next/static/chunks/17ccc6a5b3ad8f66.js
@@ -0,0 +1 @@
+(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,57587,t=>{"use strict";function e(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function n(t){let n="string"==typeof t?function(t){let n=t.trim();if(0===n.length)return null;let r=Array.from(new Set(n.split(/\s+/).map(t=>t.trim()).filter(Boolean)));if(0===r.length)return null;let i=r.map(e).join("|");return RegExp(`(${i})`,"gi")}(t):t;return{highlight(t){if(!n)return[{type: [...]
\ No newline at end of file
diff --git a/_next/static/chunks/19140f4562cae5e1.js b/_next/static/chunks/19140f4562cae5e1.js
new file mode 100644
index 00000000..aedf4818
--- /dev/null
+++ b/_next/static/chunks/19140f4562cae5e1.js
@@ -0,0 +1 @@
+(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,74,e=>{"use strict";function t(e){return e.length>1&&e.endsWith("/")?e.slice(0,-1):e}function n(e,r,o=!0){return(e=t(e))===(r=t(r))||o&&r.startsWith(`${e}/`)}e.s(["isActive",()=>n,"normalize",()=>t])},64659,e=>{"use strict";let t=(0,e.i(75254).default)("chevron-down",[["path",{d:"m6 9 6 6 6-6",key:"qrunsl"}]]);e.s(["ChevronDown",()=>t],64659)},81878,e=>{"use strict";let t,n,r;e [...]
\ No newline at end of file
diff --git a/_next/static/chunks/26b70f9828dd1eb5.js b/_next/static/chunks/26b70f9828dd1eb5.js
new file mode 100644
index 00000000..cde364b9
--- /dev/null
+++ b/_next/static/chunks/26b70f9828dd1eb5.js
@@ -0,0 +1 @@
+(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,16374,74030,e=>{"use strict";let r=(e=new Map,r=null,t)=>({nextPart:e,validators:r,classGroupId:t}),t=[],o=(e,r,t)=>{if(0==e.length-r)return t.classGroupId;let n=e[r],l=t.nextPart.get(n);if(l){let t=o(e,r+1,l);if(t)return t}let s=t.validators;if(null===s)return;let a=0===r?e.join("-"):e.slice(r).join("-"),i=s.length;for(let e=0;e<i;e++){let r=s[e];if(r.validator(a))return r.cla [...]
\ No newline at end of file
diff --git a/_next/static/chunks/32a0415c8ab1bd26.css b/_next/static/chunks/32a0415c8ab1bd26.css
new file mode 100644
index 00000000..fbb76452
--- /dev/null
+++ b/_next/static/chunks/32a0415c8ab1bd26.css
@@ -0,0 +1,3 @@
+@font-face{font-family:GeistSans;src:url(../media/Geist_Variable-s.p.92592eb2.woff2)format("woff2");font-display:swap;font-weight:100 900}@font-face{font-family:GeistSans Fallback;src:local(Arial);ascent-override:94.56%;descent-override:27.76%;line-gap-override:0.0%;size-adjust:106.28%}.geistsans_d5a4f12f-module__Ur3q_a__className{font-family:GeistSans,GeistSans Fallback}.geistsans_d5a4f12f-module__Ur3q_a__variable{--font-geist-sans:"GeistSans","GeistSans Fallback"}
+@font-face{font-family:GeistMono;src:url(../media/GeistMono_Variable.p.2f937313.woff2)format("woff2");font-display:swap;font-weight:100 900}.geistmono_157ca88a-module__iaM1Ya__className{font-family:GeistMono,ui-monospace,SFMono-Regular,Roboto Mono,Menlo,Monaco,Liberation Mono,DejaVu Sans Mono,Courier New,monospace}.geistmono_157ca88a-module__iaM1Ya__variable{--font-geist-mono:"GeistMono",ui-monospace,SFMono-Regular,Roboto Mono,Menlo,Monaco,Liberation Mono,DejaVu Sans Mono,Courier New,monospace}
+@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style:solid;--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-divide-y-reverse:0;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000; [...]
diff --git a/_next/static/chunks/3562882a488c4fbb.js b/_next/static/chunks/3562882a488c4fbb.js
new file mode 100644
index 00000000..29c45dc6
--- /dev/null
+++ b/_next/static/chunks/3562882a488c4fbb.js
@@ -0,0 +1,18 @@
+(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,44324,e=>{"use strict";e.i(16374);var r=e.i(74030),s=e.i(71645),t=e.i(13548),a=e.i(14804),d=e.i(43476),o=e.i(81140),n=e.i(30030),l=e.i(75830),i=e.i(20783),c=e.i(10772),m=e.i(48425),f=e.i(30207),x=e.i(69340),u=e.i(86318),p="rovingFocusGroup.onEntryFocus",h={bubbles:!1,cancelable:!0},g="RovingFocusGroup",[b,j,v]=(0,l.createCollection)(g),[N,y]=(0,n.createContextScope)(g,[v]),[w,k [...]
+ relative flex items-center gap-4 rounded-lg px-4 py-3 transition-all duration-500 cursor-pointer
+ ${a<=e?"bg-fd-primary/10 border border-fd-primary/30":"bg-fd-muted/30 border border-transparent"}
+ ${a===e?"ring-2 ring-fd-primary/50 shadow-lg shadow-fd-primary/10":""}
+ `,children:[(0,r.jsxs)("div",{className:`
+ relative flex items-center justify-center w-9 h-9 rounded-lg shrink-0 transition-all duration-500
+ ${a<=e?"bg-fd-primary text-fd-primary-foreground":"bg-fd-muted text-fd-muted-foreground"}
+ `,children:[(0,r.jsx)("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"currentColor",children:(0,r.jsx)("path",{d:s.icon})}),a===e&&(0,r.jsx)("span",{className:"absolute -top-1.5 -right-1.5 w-3 h-3 rounded-full bg-fd-primary animate-ping"})]}),(0,r.jsxs)("div",{className:"flex-1 min-w-0",children:[(0,r.jsx)("div",{className:"flex items-center gap-2",children:(0,r.jsxs)("span",{className:`text-sm font-mono font-bold transition-colors duration-500 ${a<=e?"text-fd-foregro [...]
+ relative rounded-xl border-2 p-4 text-left transition-all duration-300
+ ${e===s.id?"border-fd-primary bg-fd-primary/5 shadow-lg shadow-fd-primary/10":"border-fd-border bg-fd-card hover:border-fd-muted-foreground/30"}
+ `,children:[(0,r.jsxs)("div",{className:"flex items-center gap-2 mb-3",children:[(0,r.jsx)("div",{className:"w-3 h-3 rounded-full shard-pulse",style:{backgroundColor:s.color}}),(0,r.jsx)("span",{className:"text-xs font-mono font-bold text-fd-foreground",children:s.label})]}),(0,r.jsxs)("div",{className:"rounded-md bg-fd-muted/50 p-2 mb-2",children:[(0,r.jsx)("span",{className:"text-[10px] font-mono text-fd-muted-foreground block mb-1",children:"compio runtime"}),(0,r.jsxs)("d [...]
+ w-full text-left rounded-lg border p-4 transition-all duration-300
+ ${"active"===s.status?"border-fd-primary/50 bg-fd-primary/5":"border-fd-border bg-fd-muted/20 hover:border-fd-muted-foreground/30"}
+ ${e===a?"shadow-lg":""}
+ `,children:[(0,r.jsxs)("div",{className:"flex items-center justify-between",children:[(0,r.jsxs)("div",{className:"flex items-center gap-3",children:[(0,r.jsx)("div",{className:"w-32 h-3 rounded-full bg-fd-muted/50 overflow-hidden",children:(0,r.jsx)("div",{className:`h-full rounded-full ${"active"===s.status?"bg-fd-primary segment-fill-active":"bg-fd-muted-foreground/40"}`,style:{width:"active"===s.status?"40%":"100%"}})}),(0,r.jsxs)("div",{children:[(0,r.jsx)("span",{classN [...]
+ relative flex-shrink-0 w-14 h-16 rounded-md border flex flex-col items-center justify-center transition-all duration-500
+ ${o?"border-fd-primary/60 bg-fd-primary/15 shadow-lg shadow-fd-primary/20 animate-pulse":n?"border-emerald-500/60 bg-emerald-500/10":s<a?"border-fd-border/50 bg-fd-muted/20 opacity-50":"border-fd-border bg-fd-muted/30"}
+ `,children:[(0,r.jsx)("span",{className:"text-[10px] font-mono text-fd-muted-foreground",children:"msg"}),(0,r.jsx)("span",{className:"text-sm font-mono font-bold text-fd-foreground",children:s})]},s)}),(0,r.jsxs)("div",{className:"flex-shrink-0 w-14 h-16 rounded-md border-2 border-dashed border-fd-primary/40 flex flex-col items-center justify-center",children:[(0,r.jsxs)("span",{className:"relative flex h-3 w-3",children:[(0,r.jsx)("span",{className:"animate-ping absolut [...]
\ No newline at end of file
diff --git a/_next/static/chunks/58665f1783672c50.js b/_next/static/chunks/58665f1783672c50.js
new file mode 100644
index 00000000..5ba975b9
--- /dev/null
+++ b/_next/static/chunks/58665f1783672c50.js
@@ -0,0 +1,2 @@
+(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,64893,(e,t,r)=>{"use strict";var n=e.r(74080),a={stream:!0},l=Object.prototype.hasOwnProperty;function u(t){var r=e.r(t);return"function"!=typeof r.then||"fulfilled"===r.status?null:(r.then(function(e){r.status="fulfilled",r.value=e},function(e){r.status="rejected",r.reason=e}),r)}var o=new WeakSet,i=new WeakSet;function s(){}function c(t){for(var r=t[1],n=[],a=0;a<r.length;a++ [...]
+Read more: https://nextjs.org/docs/messages/failed-to-find-server-action`),"__NEXT_ERROR_CODE",{value:"E715",enumerable:!1,configurable:!0});let A=w.headers.get("x-action-redirect"),[M,C]=A?.split(";")||[];switch(C){case"push":f=y.RedirectType.push;break;case"replace":f=y.RedirectType.replace;break;default:f=void 0}let N=!!w.headers.get(u.NEXT_IS_PRERENDER_HEADER),U=m.ActionDidNotRevalidate;try{let e=w.headers.get("x-action-revalidated");if(e){let t=JSON.parse(e);(t===m.ActionDidRevalida [...]
\ No newline at end of file
diff --git a/_next/static/chunks/586c6330b1448c28.js b/_next/static/chunks/586c6330b1448c28.js
new file mode 100644
index 00000000..3232ee3a
--- /dev/null
+++ b/_next/static/chunks/586c6330b1448c28.js
@@ -0,0 +1 @@
+(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,74164,t=>{"use strict";let e=new Map;async function a(t,{api:a="/api/search",locale:r,tag:s}){let o=new URL(a,window.location.origin);o.searchParams.set("query",t),r&&o.searchParams.set("locale",r),s&&o.searchParams.set("tag",Array.isArray(s)?s.join(","):s);let i=o.toString(),c=e.get(i);if(c)return c;let n=await fetch(o);if(!n.ok)throw Error(await n.text());let l=await n.json() [...]
\ No newline at end of file
diff --git a/_next/static/chunks/591dbaf32ed9e41c.js b/_next/static/chunks/591dbaf32ed9e41c.js
new file mode 100644
index 00000000..f22fc081
--- /dev/null
+++ b/_next/static/chunks/591dbaf32ed9e41c.js
@@ -0,0 +1 @@
+(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,27364,u=>{"use strict";let D,F,C;var E=Object.create,A=Object.defineProperty,e=Object.getOwnPropertyDescriptor,B=Object.getOwnPropertyNames,t=Object.getPrototypeOf,r=Object.prototype.hasOwnProperty;let s=/[\0-\x1F!-,\.\/:-@\[-\^`\{-\xA9\xAB-\xB4\xB6-\xB9\xBB-\xBF\xD7\xF7\u02C2-\u02C5\u02D2-\u02DF\u02E5-\u02EB\u02ED\u02EF-\u02FF\u0375\u0378\u0379\u037E\u0380-\u0385\u0387\u038B\u [...]
\ No newline at end of file
diff --git a/_next/static/chunks/5a37d4cb1abe17d7.js b/_next/static/chunks/5a37d4cb1abe17d7.js
new file mode 100644
index 00000000..05a43261
--- /dev/null
+++ b/_next/static/chunks/5a37d4cb1abe17d7.js
@@ -0,0 +1 @@
+(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,58298,e=>{"use strict";var t=e.i(43476);function n({reset:e}){return(0,t.jsxs)("div",{className:"flex min-h-[50vh] flex-col items-center justify-center gap-4 p-8",children:[(0,t.jsx)("h2",{className:"text-xl font-semibold",children:"Something went wrong"}),(0,t.jsx)("button",{onClick:e,className:"rounded-lg bg-fd-primary px-4 py-2 text-sm font-medium text-fd-primary-foreground" [...]
\ No newline at end of file
diff --git a/_next/static/chunks/78b5f2e7b839e72f.js b/_next/static/chunks/78b5f2e7b839e72f.js
new file mode 100644
index 00000000..5472c73c
--- /dev/null
+++ b/_next/static/chunks/78b5f2e7b839e72f.js
@@ -0,0 +1,3 @@
+(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,33525,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"warnOnce",{enumerable:!0,get:function(){return n}});let n=e=>{}},18581,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"useMergedRef",{enumerable:!0,get:function(){return o}});let n=e.r(71645);function o(e,t){let r=(0,n.useRef)(n [...]
+Read more: https://nextjs.org/docs/messages/next-image-missing-loader`),"__NEXT_ERROR_CODE",{value:"E252",enumerable:!1,configurable:!0})}else{let e=F;F=t=>{let{config:r,...n}=t;return e(n)}}if(S){"fill"===S&&(g=!0);let e={intrinsic:{maxWidth:"100%",height:"auto"},responsive:{width:"100%",height:"auto"}}[S];e&&(y={...y,...e});let r={responsive:"100vw",fill:"100vw"}[S];r&&!t&&(t=r)}let K="",W=u(m),q=u(h);if((k=e)&&"object"==typeof k&&(s(k)||void 0!==k.src)){let t=s(e)?e.default:e;if(!t.sr [...]
+Read more: https://nextjs.org/docs/messages/next-image-unconfigured-localpatterns`),"__NEXT_ERROR_CODE",{value:"E871",enumerable:!1,configurable:!0});let a=(0,n.findClosestQuality)(i,e),s=(0,o.getDeploymentId)();return`${e.path}?url=${encodeURIComponent(t)}&w=${r}&q=${a}${t.startsWith("/")&&s?`&dpl=${s}`:""}`}i.__next_img_default=!0;let a=i},5500,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"Image",{enumerable:!0,get:function(){return P} [...]
\ No newline at end of file
diff --git a/_next/static/chunks/82abf2d65f5428ae.js b/_next/static/chunks/82abf2d65f5428ae.js
new file mode 100644
index 00000000..1f048b59
--- /dev/null
+++ b/_next/static/chunks/82abf2d65f5428ae.js
@@ -0,0 +1,4 @@
+(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,12718,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"InvariantError",{enumerable:!0,get:function(){return n}});class n extends Error{constructor(e,t){super(`Invariant: ${e.endsWith(".")?e:e+"."} This is a bug in Next.js.`,t),this.name="InvariantError"}}},32061,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0 [...]
+${t}`))}function L(){let e=new AbortController;return e.abort(Object.defineProperty(new m.BailoutToCSRError("Render in Browser"),"__NEXT_ERROR_CODE",{value:"E721",enumerable:!1,configurable:!0})),e.signal}function $(e){switch(e.type){case"prerender":case"prerender-runtime":let t=new AbortController;if(e.cacheSignal)e.cacheSignal.inputReady().then(()=>{t.abort()});else{let r=(0,d.getRuntimeStagePromise)(e);r?r.then(()=>(0,h.scheduleOnNextTick)(()=>t.abort())):(0,h.scheduleOnNextTick)(()=> [...]
+ - Start the app in development mode by running \`next dev\`, then open "${e.route}" in your browser to investigate the error.
+ - Rerun the production build with \`next build --debug-prerender\` to generate better stack traces.`))}function ee(e,t,r,n){if(n.syncDynamicErrorWithStack)throw Q(e,n.syncDynamicErrorWithStack),new c.StaticGenBailoutError;if(0!==t){if(r.hasSuspenseAboveBody)return;let n=r.dynamicErrors;if(n.length>0){for(let t=0;t<n.length;t++)Q(e,n[t]);throw new c.StaticGenBailoutError}if(r.hasDynamicViewport)throw console.error(`Route "${e.route}" has a \`generateViewport\` that depends on Request da [...]
\ No newline at end of file
diff --git a/_next/static/chunks/8d86be78428a601a.js b/_next/static/chunks/8d86be78428a601a.js
new file mode 100644
index 00000000..f2ea8ebc
--- /dev/null
+++ b/_next/static/chunks/8d86be78428a601a.js
@@ -0,0 +1 @@
+(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,47873,e=>{"use strict";var t=e.i(24110),r=e.i(71645),i=e.i(43476);let s=(0,r.forwardRef)(({href:e="#",external:r=e.match(/^\w+:/)||e.startsWith("//"),prefetch:s,children:l,...n},o)=>r?(0,i.jsx)("a",{ref:o,href:e,rel:"noreferrer noopener",target:"_blank",...n,children:l}):(0,i.jsx)(t.Link,{ref:o,href:e,prefetch:s,...n,children:l}));s.displayName="Link",e.s(["default",()=>s])},88 [...]
\ No newline at end of file
diff --git a/_next/static/chunks/8d8b8f8527e33e94.js b/_next/static/chunks/8d8b8f8527e33e94.js
new file mode 100644
index 00000000..b5881642
--- /dev/null
+++ b/_next/static/chunks/8d8b8f8527e33e94.js
@@ -0,0 +1 @@
+(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,16374,74030,e=>{"use strict";let r=(e=new Map,r=null,t)=>({nextPart:e,validators:r,classGroupId:t}),t=[],o=(e,r,t)=>{if(0==e.length-r)return t.classGroupId;let n=e[r],l=t.nextPart.get(n);if(l){let t=o(e,r+1,l);if(t)return t}let s=t.validators;if(null===s)return;let a=0===r?e.join("-"):e.slice(r).join("-"),i=s.length;for(let e=0;e<i;e++){let r=s[e];if(r.validator(a))return r.cla [...]
\ No newline at end of file
diff --git a/_next/static/chunks/9174189d45dd31fe.js b/_next/static/chunks/9174189d45dd31fe.js
new file mode 100644
index 00000000..642e406e
--- /dev/null
+++ b/_next/static/chunks/9174189d45dd31fe.js
@@ -0,0 +1 @@
+(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,57587,t=>{"use strict";function e(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function i(t){let i="string"==typeof t?function(t){let i=t.trim();if(0===i.length)return null;let n=Array.from(new Set(i.split(/\s+/).map(t=>t.trim()).filter(Boolean)));if(0===n.length)return null;let r=n.map(e).join("|");return RegExp(`(${r})`,"gi")}(t):t;return{highlight(t){if(!i)return[{type: [...]
\ No newline at end of file
diff --git a/_next/static/chunks/922b7f01aa6775a6.js b/_next/static/chunks/922b7f01aa6775a6.js
new file mode 100644
index 00000000..f66e0cbf
--- /dev/null
+++ b/_next/static/chunks/922b7f01aa6775a6.js
@@ -0,0 +1 @@
+(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,42732,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"HeadManagerContext",{enumerable:!0,get:function(){return n}});let n=e.r(55682)._(e.r(71645)).default.createContext({})},90373,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"useUntrackedPathname",{enumerable:!0,get:function(){re [...]
\ No newline at end of file
diff --git a/_next/static/chunks/9830546cbac60c3f.js b/_next/static/chunks/9830546cbac60c3f.js
new file mode 100644
index 00000000..732a7364
--- /dev/null
+++ b/_next/static/chunks/9830546cbac60c3f.js
@@ -0,0 +1,3 @@
+(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,14072,57886,e=>{"use strict";var t=e.i(71645),r=e.i(24110),n=e.i(43476);function o(e,t,r){let{includePage:n=!1,includeSeparator:o=!1,includeRoot:a=!1}=r,i=[];for(let e=0;e<t.length;e++){let r=t[e];switch(r.type){case"page":n&&i.push({name:r.name,url:r.url});break;case"folder":if(r.root&&!a){i=[];break}(e===t.length-1||r.index!==t[e+1])&&i.push({name:r.name,url:r.index?.url});br [...]
+ "sidebar toc-popover toc"
+ "sidebar main toc" 1fr / minmax(var(--fd-sidebar-col), 1fr) minmax(0, calc(var(--fd-layout-width,97rem) - var(--fd-sidebar-width) - var(--fd-toc-width))) minmax(min-content, 1fr)`,"--fd-docs-row-1":"var(--fd-banner-height, 0px)","--fd-docs-row-2":"calc(var(--fd-docs-row-1) + var(--fd-header-height))","--fd-docs-row-3":"calc(var(--fd-docs-row-2) + var(--fd-toc-popover-height))","--fd-sidebar-col":i?"0px":"var(--fd-sidebar-width)",...n},...a,children:o})}function p({options:e,...r} [...]
\ No newline at end of file
diff --git a/_next/static/chunks/9baf65674e2de991.js b/_next/static/chunks/9baf65674e2de991.js
new file mode 100644
index 00000000..bfec0be1
--- /dev/null
+++ b/_next/static/chunks/9baf65674e2de991.js
@@ -0,0 +1 @@
+(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,11150,e=>{"use strict";var t=e.i(71645);function n({enabled:e=!0}){let[n,r]=(0,t.useState)();return(0,t.useEffect)(()=>{if(!e)return;let t=()=>{r(window.scrollY<10)};return t(),window.addEventListener("scroll",t),()=>{window.removeEventListener("scroll",t)}},[e]),n}e.s(["useIsScrollTop",()=>n])},74,e=>{"use strict";function t(e){return e.length>1&&e.endsWith("/")?e.slice(0,-1): [...]
\ No newline at end of file
diff --git a/_next/static/chunks/9ebd3a84bf60af84.js b/_next/static/chunks/9ebd3a84bf60af84.js
new file mode 100644
index 00000000..9ffc1f34
--- /dev/null
+++ b/_next/static/chunks/9ebd3a84bf60af84.js
@@ -0,0 +1 @@
+(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,18566,(e,i,r)=>{i.exports=e.r(76562)},17751,e=>{"use strict";var i=e.i(9864),r=e.i(57061),a=e.i(71645),t=e.i(43476),s=e.i(86318),n=e.i(63178);let c=(0,a.lazy)(()=>e.A(74774));function l({children:e,dir:a="ltr",theme:l={},search:o,i18n:u}){let d=e;return o?.enabled!==!1&&(d=(0,t.jsx)(r.SearchProvider,{SearchDialog:c,...o,children:d})),l?.enabled!==!1&&(d=(0,t.jsx)(n.ThemeProvide [...]
\ No newline at end of file
diff --git a/_next/static/chunks/a6dad97d9634a72d.js b/_next/static/chunks/a6dad97d9634a72d.js
new file mode 100644
index 00000000..ab422b94
--- /dev/null
+++ b/_next/static/chunks/a6dad97d9634a72d.js
@@ -0,0 +1 @@
+!function(){var t="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function e(t){var e={exports:{}};return t(e,e.exports),e.exports}var r,n,o=function(t){return t&&t.Math===Math&&t},i=o("object"==typeof globalThis&&globalThis)||o("object"==typeof window&&window)||o("object"==typeof self&&self)||o("object"==typeof t&&t)||o("object"==typeof t&&t)||function(){return this}()||Function("return this") [...]
"!=="
"[t]()||Op&&Mi[t].name!==t})},Rp=_i.start,Pp=xp("trimStart")?function(){return Rp(this)}:"".trimStart;Ce({target:"String",proto:!0,name:"trimStart",forced:"".trimLeft!==Pp},{trimLeft:Pp}),Ce({target:"String",proto:!0,name:"trimStart",forced:"".trimStart!==Pp},{trimStart:Pp}),Ze("String","trimLeft");var Ap=_i.end,jp=xp("trimEnd")?function(){return Ap(this)}:"".trimEnd;Ce({target:"String",proto:!0,name:"trimEnd",forced:"".trimRight!==jp},{trimRight:jp}),Ce({target:"String",proto:!0,name:"t [...]
diff --git a/_next/static/chunks/a6dad97d9634a72d.js.map b/_next/static/chunks/a6dad97d9634a72d.js.map
new file mode 100644
index 00000000..fc2cc96f
--- /dev/null
+++ b/_next/static/chunks/a6dad97d9634a72d.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["turbopack:///node_modules/next/dist/build/polyfills/polyfill-nomodule.js"],"sourcesContent":["!function(){var t=\"undefined\"!=typeof globalThis?globalThis:\"undefined\"!=typeof window?window:\"undefined\"!=typeof global?global:\"undefined\"!=typeof self?self:{};function e(t){var e={exports:{}};return t(e,e.exports),e.exports}var r,n,o=function(t){return t&&t.Math===Math&&t},i=o(\"object\"==typeof globalThis&&globalThis)||o(\"object\"==typeof window&&window)||o(\ [...]
\"!==\"
\"[t]()||Op&&Mi[t].name!==t})},Rp=_i.start,Pp=xp(\"trimStart\")?function(){return Rp(this)}:\"\".trimStart;Ce({target:\"String\",proto:!0,name:\"trimStart\",forced:\"\".trimLeft!==Pp},{trimLeft:Pp}),Ce({target:\"String\",proto:!0,name:\"trimStart\",forced:\"\".trimStart!==Pp},{trimStart:Pp}),Ze(\"String\",\"trimLeft\");var Ap=_i.end,jp=xp(\"trimEnd\")?function(){return Ap(this)}:\"\".trimEnd;Ce({target:\"String\",proto:!0,name:\"trimEnd\",forced:\"\".trimRight!==jp},{trimRight:jp}),Ce({t [...]
\ No newline at end of file
diff --git a/_next/static/chunks/ad1cf32e53bc1b2c.js b/_next/static/chunks/ad1cf32e53bc1b2c.js
new file mode 100644
index 00000000..99b26b21
--- /dev/null
+++ b/_next/static/chunks/ad1cf32e53bc1b2c.js
@@ -0,0 +1 @@
+(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,57587,t=>{"use strict";function e(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function n(t){let n="string"==typeof t?function(t){let n=t.trim();if(0===n.length)return null;let i=Array.from(new Set(n.split(/\s+/).map(t=>t.trim()).filter(Boolean)));if(0===i.length)return null;let r=i.map(e).join("|");return RegExp(`(${r})`,"gi")}(t):t;return{highlight(t){if(!n)return[{type: [...]
\ No newline at end of file
diff --git a/_next/static/chunks/adeed8304bab826b.js b/_next/static/chunks/adeed8304bab826b.js
new file mode 100644
index 00000000..18f55f17
--- /dev/null
+++ b/_next/static/chunks/adeed8304bab826b.js
@@ -0,0 +1 @@
+(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,55436,e=>{"use strict";let t=(0,e.i(75254).default)("search",[["path",{d:"m21 21-4.34-4.34",key:"14j7rj"}],["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}]]);e.s(["Search",()=>t],55436)},77563,e=>{"use strict";var t=e.i(74),n=e.i(24110),r=e.i(43476),a=e.i(47873);function o({ref:e,item:o,...i}){let s=(0,n.usePathname)(),l=o.active??"url",c="none"!==l&&(0,t.isActive)(o.url,s,"nest [...]
\ No newline at end of file
diff --git a/_next/static/chunks/aee6c7720838f8a2.js b/_next/static/chunks/aee6c7720838f8a2.js
new file mode 100644
index 00000000..6b34ba3c
--- /dev/null
+++ b/_next/static/chunks/aee6c7720838f8a2.js
@@ -0,0 +1 @@
+(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,74575,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0}),Object.defineProperty(n,"getAssetPrefix",{enumerable:!0,get:function(){return l}});let r=e.r(12718);function l(){let e=document.currentScript;if(!(e instanceof HTMLScriptElement))throw Object.defineProperty(new r.InvariantError(`Expected document.currentScript to be a <script> element. Received ${e} i [...]
\ No newline at end of file
diff --git a/_next/static/chunks/b7d6d72e7c987e27.js b/_next/static/chunks/b7d6d72e7c987e27.js
new file mode 100644
index 00000000..3c264535
--- /dev/null
+++ b/_next/static/chunks/b7d6d72e7c987e27.js
@@ -0,0 +1,53 @@
+(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,85473,(e,t,r)=>{t.exports=(function t(r,n,i){function o(a,s){if(!n[a]){if(!r[a]){var h=e.t;return!s&&h?h(a,!0):l(a,!0)}var d=n[a]={exports:{}};r[a][0].call(d.exports,function(e){return o(r[a][1][e]||e)},d,d.exports,t,r,n,i)}return n[a].exports}for(var l=e.t,a=0;a<i.length;a++)o(i[a]);return o})({1:[function(e,t,r){t.exports={graphlib:e("@dagrejs/graphlib"),layout:e("./lib/layou [...]
+ /* Derived from --bg and --fg (overridable via --line, --accent, etc.) */
+ --_text: var(--fg);
+ --_text-sec: var(--muted, color-mix(in srgb, var(--fg) 60%, var(--bg)));
+ --_text-muted: var(--muted, color-mix(in srgb, var(--fg) 40%, var(--bg)));
+ --_text-faint: color-mix(in srgb, var(--fg) 25%, var(--bg));
+ --_line: var(--line, color-mix(in srgb, var(--fg) 30%, var(--bg)));
+ --_arrow: var(--accent, color-mix(in srgb, var(--fg) 50%, var(--bg)));
+ --_node-fill: var(--surface, color-mix(in srgb, var(--fg) 3%, var(--bg)));
+ --_node-stroke: var(--border, color-mix(in srgb, var(--fg) 20%, var(--bg)));
+ --_group-fill: var(--bg);
+ --_group-hdr: color-mix(in srgb, var(--fg) 5%, var(--bg));
+ --_inner-stroke: color-mix(in srgb, var(--fg) 12%, var(--bg));
+ --_key-badge: color-mix(in srgb, var(--fg) 10%, var(--bg));`;return["<style>",` ${r.join("\n ")}`,` text { font-family: '${e}', system-ui, sans-serif; }`,...t?[" .mono { font-family: 'JetBrains Mono', 'SF Mono', 'Fira Code', ui-monospace, monospace; }"]:[],` svg {${n}`," }","</style>"].join("\n")}function l(e,t,r,n){let i=[`--bg:${r.bg}`,`--fg:${r.fg}`,r.line?`--line:${r.line}`:"",r.accent?`--accent:${r.accent}`:"",r.muted?`--muted:${r.muted}`:"",r.surface?`--surface:${r.su [...]
+ <polygon points="0 0, 8 ${2.4}, 0 4.8" fill="var(--_arrow)" />
+ </marker>
+ <marker id="seq-arrow-open" markerWidth="8" markerHeight="4.8" refX="8" refY="${2.4}" orient="auto-start-reverse">
+ <polyline points="0 0, 8 ${2.4}, 0 4.8" fill="none" stroke="var(--_arrow)" stroke-width="1" />
+ </marker>`),h.push("</defs>"),e.blocks))h.push(function(e){let t=[];t.push(`<rect x="${e.x}" y="${e.y}" width="${e.width}" height="${e.height}" rx="0" ry="0" fill="none" stroke="var(--_node-stroke)" stroke-width="1" />`);let r=`${e.type}${e.label?` [${e.label}]`:""}`,n=eu(r,11,600)+16;for(let i of(t.push(`<rect x="${e.x}" y="${e.y}" width="${n}" height="18" fill="var(--_group-hdr)" stroke="var(--_node-stroke)" stroke-width="1" />`),t.push(`<text x="${e.x+6}" y="${e.y+9}" dy="${ep}" fon [...]
+<polygon points="${s.x+s.width-6},${s.y} ${s.x+s.width},${s.y+6} ${s.x+s.width-6},${s.y+6}" fill="var(--_inner-stroke)" />
+<text x="${s.x+s.width/2}" y="${s.y+s.height/2}" text-anchor="middle" dy="${ep}" font-size="11" font-weight="400" fill="var(--_text-muted)">${eR(s.text)}</text>`))}for(let t of e.actors)h.push(function(e){let{x:t,y:r,width:n,height:i,label:o,type:l}=e;if("actor"===l){let e=i/24*.9,n=1/e,l="var(--_line)";return`<g transform="translate(${t-12*e},${r+(i-24*e)/2}) scale(${e})">
+ <path d="M21 12C21 16.9706 16.9706 21 12 21C7.02944 21 3 16.9706 3 12C3 7.02944 7.02944 3 12 3C16.9706 3 21 7.02944 21 12Z" fill="none" stroke="${l}" stroke-width="${n}" />
+ <path d="M15 10C15 11.6569 13.6569 13 12 13C10.3431 13 9 11.6569 9 10C9 8.34315 10.3431 7 12 7C13.6569 7 15 8.34315 15 10Z" fill="none" stroke="${l}" stroke-width="${n}" />
+ <path d="M5.62842 18.3563C7.08963 17.0398 9.39997 16 12 16C14.6 16 16.9104 17.0398 18.3716 18.3563" fill="none" stroke="${l}" stroke-width="${n}" />
+</g>
+<text x="${t}" y="${r+i+14}" text-anchor="middle" font-size="13" font-weight="500" fill="var(--_text)">${eR(o)}</text>`}return`<rect x="${t-n/2}" y="${r}" width="${n}" height="${i}" rx="4" ry="4" fill="var(--_node-fill)" stroke="var(--_node-stroke)" stroke-width="1" />
+<text x="${t}" y="${r+i/2}" text-anchor="middle" dy="${ep}" font-size="13" font-weight="500" fill="var(--_text)">${eR(o)}</text>`}(t));return h.push("</svg>"),h.join("\n")}(function(e,t={}){if(0===e.actors.length)return{width:0,height:0,actors:[],lifelines:[],messages:[],activations:[],blocks:[],notes:[]};let r=e.actors.map(e=>Math.max(eu(e.label,13,500)+32,80)),n=[],i=30+r[0]/2;for(let t=0;t<e.actors.length;t++)t>0&&(i+=Math.max(140,(r[t-1]+r[t])/2+40)),n.push(i);let o=new Map;for(let t [...]
+ <polygon points="0 0, 12 5, 0 10" fill="var(--bg)" stroke="var(--_arrow)" stroke-width="1.5" />
+ </marker>
+ <marker id="cls-composition" markerWidth="12" markerHeight="10" refX="0" refY="5" orient="auto-start-reverse">
+ <polygon points="6 0, 12 5, 6 10, 0 5" fill="var(--_arrow)" stroke="var(--_arrow)" stroke-width="1" />
+ </marker>
+ <marker id="cls-aggregation" markerWidth="12" markerHeight="10" refX="0" refY="5" orient="auto-start-reverse">
+ <polygon points="6 0, 12 5, 6 10, 0 5" fill="var(--bg)" stroke="var(--_arrow)" stroke-width="1.5" />
+ </marker>
+ <marker id="cls-arrow" markerWidth="8" markerHeight="6" refX="8" refY="3" orient="auto-start-reverse">
+ <polyline points="0 0, 8 3, 0 6" fill="none" stroke="var(--_arrow)" stroke-width="1.5" />
+ </marker>`),i.push("</defs>"),e.relationships))i.push(function(e){if(e.points.length<2)return"";let t=e.points.map(e=>`${e.x},${e.y}`).join(" "),r="dependency"===e.type||"realization"===e.type,n=function(e,t){let r=function(e){switch(e){case"inheritance":case"realization":return"cls-inherit";case"composition":return"cls-composition";case"aggregation":return"cls-aggregation";case"association":case"dependency":return"cls-arrow";default:return null}}(e);return r?"from"===t?` marker-start= [...]
+<text x="${t.x}" y="${t.y}" text-anchor="middle" dy="${ep}" font-size="11" font-weight="400" fill="var(--_text-muted)">${eB(e.label)}</text>`}(t));return i.push("</svg>"),i.join("\n")}(await eW(e,t),i,s,h)}default:{let r=a(e);return function(e,t,r="Inter",n=!1){let i=[];for(let a of(i.push(l(e.width,e.height,t,n)),i.push(o(r,!1)),i.push("<defs>"),i.push(` <marker id="arrowhead" markerWidth="8" markerHeight="4.8" refX="8" refY="${2.4}" orient="auto">
+ <polygon points="0 0, 8 ${2.4}, 0 4.8" fill="var(--_arrow)" />
+ </marker>
+ <marker id="arrowhead-start" markerWidth="8" markerHeight="4.8" refX="0" refY="${2.4}" orient="auto-start-reverse">
+ <polygon points="8 0, 0 ${2.4}, 8 4.8" fill="var(--_arrow)" />
+ </marker>`),i.push("</defs>"),e.groups))i.push(function e(t,r){let n=28,i=[];for(let r of(i.push(`<rect x="${t.x}" y="${t.y}" width="${t.width}" height="${t.height}" rx="0" ry="0" fill="var(--_group-fill)" stroke="var(--_node-stroke)" stroke-width="1" />`),i.push(`<rect x="${t.x}" y="${t.y}" width="${t.width}" height="${n}" rx="0" ry="0" fill="var(--_group-hdr)" stroke="var(--_node-stroke)" stroke-width="1" />`),i.push(`<text x="${t.x+12}" y="${t.y+n/2}" dy="${ep}" font-size="12" font- [...]
+<text x="${r.x}" y="${r.y}" text-anchor="middle" dy="${ep}" font-size="11" font-weight="400" fill="var(--_text-muted)">${eA(n)}</text>`}(t));for(let t of e.nodes)i.push(function(e){var t,r,n,i,o,l,a,s,h,d,f,c,u,g,p,m,y,x,w,b,v;let{x:$,y:k,width:M,height:_,shape:E,inlineStyle:j}=e,C=eA(j?.fill??"var(--_node-fill)"),O=eA(j?.stroke??"var(--_node-stroke)"),L=eA(j?.["stroke-width"]??String(.75));switch(E){case"diamond":return function(e,t,r,n,i,o,l){let a=e+r/2,s=t+n/2,h=r/2,d=n/2,f=`${a},${s [...]
+<line x1="${s+8}" y1="${h}" x2="${s+8}" y2="${h+f}" stroke="${u}" stroke-width="${g}" />
+<line x1="${s+d-8}" y1="${h}" x2="${s+d-8}" y2="${h+f}" stroke="${u}" stroke-width="${g}" />`;case"doublecircle":return function(e,t,r,n,i,o,l){let a=e+r/2,s=t+n/2,h=Math.min(r,n)/2;return`<circle cx="${a}" cy="${s}" r="${h}" fill="${i}" stroke="${o}" stroke-width="${l}" />
+<circle cx="${a}" cy="${s}" r="${h-5}" fill="${i}" stroke="${o}" stroke-width="${l}" />`}($,k,M,_,C,O,L);case"hexagon":return function(e,t,r,n,i,o,l){let a=n/4,s=`${e+a},${t} ${e+r-a},${t} ${e+r},${t+n/2} ${e+r-a},${t+n} ${e+a},${t+n} ${e},${t+n/2}`;return`<polygon points="${s}" fill="${i}" stroke="${o}" stroke-width="${l}" />`}($,k,M,_,C,O,L);case"cylinder":return function(e,t,r,n,i,o,l){let a=e+r/2,s=t+7,h=n-14;return`<rect x="${e}" y="${s}" width="${r}" height="${h}" fill="${i}" strok [...]
+<line x1="${e}" y1="${s}" x2="${e}" y2="${s+h}" stroke="${o}" stroke-width="${l}" />
+<line x1="${e+r}" y1="${s}" x2="${e+r}" y2="${s+h}" stroke="${o}" stroke-width="${l}" />
+<ellipse cx="${a}" cy="${t+n-7}" rx="${r/2}" ry="7" fill="${i}" stroke="${o}" stroke-width="${l}" />
+<ellipse cx="${a}" cy="${s}" rx="${r/2}" ry="7" fill="${i}" stroke="${o}" stroke-width="${l}" />`}($,k,M,_,C,O,L);case"asymmetric":return function(e,t,r,n,i,o,l){let a=`${e+12},${t} ${e+r},${t} ${e+r},${t+n} ${e+12},${t+n} ${e},${t+n/2}`;return`<polygon points="${a}" fill="${i}" stroke="${o}" stroke-width="${l}" />`}($,k,M,_,C,O,L);case"trapezoid":return function(e,t,r,n,i,o,l){let a=.15*r,s=`${e+a},${t} ${e+r-a},${t} ${e+r},${t+n} ${e},${t+n}`;return`<polygon points="${s}" fill="${i}" s [...]
+<circle cx="${i}" cy="${o}" r="${l-4}" fill="var(--_text)" stroke="none" />`}($,k,M,_);default:return p=$,m=k,y=M,x=_,w=C,b=O,v=L,`<rect x="${p}" y="${m}" width="${y}" height="${x}" rx="0" ry="0" fill="${w}" stroke="${b}" stroke-width="${v}" />`}}(t));for(let t of e.nodes)i.push(function(e,t){if(("state-start"===e.shape||"state-end"===e.shape)&&!e.label)return"";let r=e.x+e.width/2,n=e.y+e.height/2,i=eA(e.inlineStyle?.color??"var(--_text)");return`<text x="${r}" y="${n}" text-anchor="mid [...]
\ No newline at end of file
diff --git a/_next/static/chunks/c3f495c2a7124145.js b/_next/static/chunks/c3f495c2a7124145.js
new file mode 100644
index 00000000..65e0ecb9
--- /dev/null
+++ b/_next/static/chunks/c3f495c2a7124145.js
@@ -0,0 +1 @@
+(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,57587,t=>{"use strict";function e(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function i(t){let i="string"==typeof t?function(t){let i=t.trim();if(0===i.length)return null;let r=Array.from(new Set(i.split(/\s+/).map(t=>t.trim()).filter(Boolean)));if(0===r.length)return null;let n=r.map(e).join("|");return RegExp(`(${n})`,"gi")}(t):t;return{highlight(t){if(!i)return[{type: [...]
\ No newline at end of file
diff --git a/_next/static/chunks/c8cdd3710da4a2c3.js b/_next/static/chunks/c8cdd3710da4a2c3.js
new file mode 100644
index 00000000..56968c7e
--- /dev/null
+++ b/_next/static/chunks/c8cdd3710da4a2c3.js
@@ -0,0 +1,10 @@
+(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,56827,e=>{"use strict";var t=e.i(57587),r=e.i(76222);let n={arabic:"ar",armenian:"am",bulgarian:"bg",czech:"cz",danish:"dk",dutch:"nl",english:"en",finnish:"fi",french:"fr",german:"de",greek:"gr",hungarian:"hu",indian:"in",indonesian:"id",irish:"ie",italian:"it",lithuanian:"lt",nepali:"np",norwegian:"no",portuguese:"pt",romanian:"ro",russian:"ru",serbian:"rs",slovenian:"ru",spa [...]
+Supported languages are:
+ - ${E}`,INVALID_STEMMER_FUNCTION_TYPE:"config.stemmer property must be a function.",MISSING_STEMMER:'As of version 1.0.0 @orama/orama does not ship non English stemmers by default. To solve this, please explicitly import and specify the "%s" stemmer from the package @orama/stemmers. See https://docs.orama.com/docs/orama-js/text-analysis/stemming for more information.',CUSTOM_STOP_WORDS_MUST_BE_FUNCTION_OR_ARRAY:"Custom stop words array must only contain strings.",UNSUPPORTED_COMPONENT:' [...]
+Input vectors must be of the size declared in the schema, as calculating similarity between vectors of different sizes can lead to unexpected results.`,WRONG_SEARCH_PROPERTY_TYPE:'Property "%s" is not searchable. Only "string" properties are searchable.',FACET_NOT_SUPPORTED:'Facet doens\'t support the type "%s".',INVALID_DISTANCE_SUFFIX:'Invalid distance suffix "%s". Valid suffixes are: cm, m, km, mi, yd, ft.',INVALID_SEARCH_MODE:'Invalid search mode "%s". Valid modes are: "fulltext", "v [...]
+Please install it before proceeding with creating an answer session.
+Read more at https://docs.orama.com/docs/orama-js/plugins/plugin-secure-proxy#plugin-secure-proxy
+`,PLUGIN_SECURE_PROXY_MISSING_CHAT_MODEL:`Could not find a chat model defined in the secure proxy plugin configuration.
+Please provide a chat model before proceeding with creating an answer session.
+Read more at https://docs.orama.com/docs/orama-js/plugins/plugin-secure-proxy#plugin-secure-proxy
+`,ANSWER_SESSION_LAST_MESSAGE_IS_NOT_ASSISTANT:"The last message in the session is not an assistant message. Cannot regenerate non-assistant messages.",PLUGIN_COMPONENT_CONFLICT:'The component "%s" is already defined. The plugin "%s" is trying to redefine it.'};function R(e,...t){let r=Error(function(e,...t){return e.replace(/%(?:(?<position>\d+)\$)?(?<width>-?\d*\.?\d*)(?<type>[dfs])/g,function(...e){let{width:r,type:n,position:o}=e[e.length-1],i=o?t[Number.parseInt(o)-1]:t.shift(),s="" [...]
\ No newline at end of file
diff --git a/_next/static/chunks/ce4fe957ab48a9d2.js b/_next/static/chunks/ce4fe957ab48a9d2.js
new file mode 100644
index 00000000..6f9d9402
--- /dev/null
+++ b/_next/static/chunks/ce4fe957ab48a9d2.js
@@ -0,0 +1 @@
+(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,47873,e=>{"use strict";var t=e.i(24110),r=e.i(71645),i=e.i(43476);let s=(0,r.forwardRef)(({href:e="#",external:r=e.match(/^\w+:/)||e.startsWith("//"),prefetch:s,children:l,...n},o)=>r?(0,i.jsx)("a",{ref:o,href:e,rel:"noreferrer noopener",target:"_blank",...n,children:l}):(0,i.jsx)(t.Link,{ref:o,href:e,prefetch:s,...n,children:l}));s.displayName="Link",e.s(["default",()=>s])},88 [...]
\ No newline at end of file
diff --git a/_next/static/chunks/d2be314c3ece3fbe.js b/_next/static/chunks/d2be314c3ece3fbe.js
new file mode 100644
index 00000000..38264242
--- /dev/null
+++ b/_next/static/chunks/d2be314c3ece3fbe.js
@@ -0,0 +1 @@
+(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,91915,(e,t,r)=>{"use strict";function n(e,t={}){if(t.onlyHashChange)return void e();let r=document.documentElement;if("smooth"!==r.dataset.scrollBehavior)return void e();let a=r.style.scrollBehavior;r.style.scrollBehavior="auto",t.dontForceLayout||r.getClientRects(),e(),r.style.scrollBehavior=a}Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"disableSmo [...]
\ No newline at end of file
diff --git a/_next/static/chunks/d4326e67c3c6876d.js b/_next/static/chunks/d4326e67c3c6876d.js
new file mode 100644
index 00000000..825e858c
--- /dev/null
+++ b/_next/static/chunks/d4326e67c3c6876d.js
@@ -0,0 +1 @@
+(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,47873,e=>{"use strict";var t=e.i(24110),r=e.i(71645),n=e.i(43476);let a=(0,r.forwardRef)(({href:e="#",external:r=e.match(/^\w+:/)||e.startsWith("//"),prefetch:a,children:i,...o},l)=>r?(0,n.jsx)("a",{ref:l,href:e,rel:"noreferrer noopener",target:"_blank",...o,children:i}):(0,n.jsx)(t.Link,{ref:l,href:e,prefetch:a,...o,children:i}));a.displayName="Link",e.s(["default",()=>a])},88 [...]
\ No newline at end of file
diff --git a/_next/static/chunks/d4bc32970b75b4f3.js b/_next/static/chunks/d4bc32970b75b4f3.js
new file mode 100644
index 00000000..10362c29
--- /dev/null
+++ b/_next/static/chunks/d4bc32970b75b4f3.js
@@ -0,0 +1 @@
+(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,16374,74030,e=>{"use strict";let r=(e=new Map,r=null,t)=>({nextPart:e,validators:r,classGroupId:t}),t=[],o=(e,r,t)=>{if(0==e.length-r)return t.classGroupId;let n=e[r],l=t.nextPart.get(n);if(l){let t=o(e,r+1,l);if(t)return t}let s=t.validators;if(null===s)return;let a=0===r?e.join("-"):e.slice(r).join("-"),i=s.length;for(let e=0;e<i;e++){let r=s[e];if(r.validator(a))return r.cla [...]
\ No newline at end of file
diff --git a/_next/static/chunks/d9baaff5bf5f9735.js b/_next/static/chunks/d9baaff5bf5f9735.js
new file mode 100644
index 00000000..275c9dbb
--- /dev/null
+++ b/_next/static/chunks/d9baaff5bf5f9735.js
@@ -0,0 +1,5 @@
+(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,55436,e=>{"use strict";let t=(0,e.i(75254).default)("search",[["path",{d:"m21 21-4.34-4.34",key:"14j7rj"}],["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}]]);e.s(["Search",()=>t],55436)},43137,e=>{"use strict";var t=e.i(71645);function n(e,r,o=function e(t,n){return Array.isArray(t)&&Array.isArray(n)?n.length!==t.length||t.some((t,r)=>e(t,n[r])):t!==n}){let[l,i]=(0,t.useState)(e [...]
+
+If you want to hide the \`${t.titleName}\`, you can wrap it with our VisuallyHidden component.
+
+For more information, see https://radix-ui.com/primitives/docs/components/${t.docsSlug}`;return a.useEffect(()=>{e&&(document.getElementById(e)||console.error(n))},[n,e]),null},er=({contentRef:e,descriptionId:t})=>{let n=et("DialogDescriptionWarning"),r=`Warning: Missing \`Description\` or \`aria-describedby={undefined}\` for {${n.contentName}}.`;return a.useEffect(()=>{let n=e.current?.getAttribute("aria-describedby");t&&n&&(document.getElementById(t)||console.warn(r))},[r,e,t]),null};l [...]
\ No newline at end of file
diff --git a/_next/static/chunks/da34cc6305706ac6.js b/_next/static/chunks/da34cc6305706ac6.js
new file mode 100644
index 00000000..11d7a27d
--- /dev/null
+++ b/_next/static/chunks/da34cc6305706ac6.js
@@ -0,0 +1 @@
+(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,26330,e=>{"use strict";var t,n=e.i(71645),r=e.i(81140),o=e.i(48425),a=e.i(20783),i=e.i(30207),c=e.i(43476),u="dismissableLayer.update",s=n.createContext({layers:new Set,layersWithOutsidePointerEventsDisabled:new Set,branches:new Set}),l=n.forwardRef((e,l)=>{let{disableOutsidePointerEvents:v=!1,onEscapeKeyDown:p,onPointerDownOutside:m,onFocusOutside:h,onInteractOutside:y,onDismi [...]
\ No newline at end of file
diff --git a/_next/static/chunks/f58eedfa913263a9.js b/_next/static/chunks/f58eedfa913263a9.js
new file mode 100644
index 00000000..e6812042
--- /dev/null
+++ b/_next/static/chunks/f58eedfa913263a9.js
@@ -0,0 +1,209 @@
+(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,18870,e=>{"use strict";var t=e.i(43476),r=e.i(71645);let i=new Set(["<",">","{","}","[","]"]),s=new Set(["for","do","while","if","else","return","function","var","let","const","true","false","undefined","this","new","delete","typeof","in","instanceof","void","break","continue","switch","case","default","throw","try","catch","finally","debugger","with","yield","async","await","c [...]
+
+let client = IggyClient::from_connection_string(
+ "iggy://iggy:iggy@localhost:8090"
+)?;
+client.connect().await?;
+
+let producer = client
+ .producer("orders", "events")?
+ .direct(
+ DirectConfig::builder()
+ .batch_length(100)
+ .build()
+ )
+ .partitioning(Partitioning::balanced())
+ .build();
+producer.init().await?;
+
+let msg = IggyMessage::from_str("order-123")?;
+producer.send(vec![msg]).await?;`},{lang:"Python",file:"producer.py",href:"/docs/sdk/python/intro",code:`from apache_iggy import IggyClient, SendMessage
+
+client = IggyClient.from_connection_string(
+ "iggy://iggy:iggy@localhost:8090"
+)
+await client.connect()
+
+await client.create_stream(name="orders")
+await client.create_topic(
+ stream="orders",
+ name="events",
+ partitions_count=3,
+ replication_factor=1,
+)
+
+message = SendMessage("order-123")
+await client.send_messages(
+ stream="orders",
+ topic="events",
+ partitioning=1,
+ messages=[message],
+)`},{lang:"Java",file:"Producer.java",href:"/docs/sdk/java/intro",code:`var client = IggyTcpClient.builder()
+ .host("localhost")
+ .port(8090)
+ .credentials("iggy", "iggy")
+ .buildAndLogin();
+
+client.streams().createStream("orders");
+client.topics().createTopic(
+ StreamId.of("orders"), 1L,
+ CompressionAlgorithm.None,
+ BigInteger.ZERO, BigInteger.ZERO,
+ Optional.empty(), "events"
+);
+
+client.messages().sendMessages(
+ StreamId.of("orders"),
+ TopicId.of("events"),
+ Partitioning.partitionId(0L),
+ List.of(Message.of("order-123"))
+);
+
+client.close();`},{lang:"Go",file:"producer.go",href:"/docs/sdk/go/intro",code:`cli, _ := client.NewIggyClient(
+ client.WithTcp(
+ tcp.WithServerAddress(
+ "127.0.0.1:8090"),
+ ),
+)
+cli.LoginUser("iggy", "iggy")
+cli.CreateStream("orders")
+
+streamId, _ := iggcon.NewIdentifier(
+ uint32(1),
+)
+cli.CreateTopic(
+ streamId, "events", 3,
+ iggcon.CompressionAlgorithmNone,
+ iggcon.IggyExpiryNeverExpire,
+ 0, nil,
+)
+
+msg, _ := iggcon.NewIggyMessage(
+ []byte("order-123"),
+)
+topicId, _ := iggcon.NewIdentifier(
+ uint32(1),
+)
+cli.SendMessages(
+ streamId, topicId,
+ iggcon.PartitionId(0),
+ []iggcon.IggyMessage{msg},
+)`},{lang:"Node.js",file:"producer.ts",href:"/docs/sdk/node/intro",code:`import { Client, Partitioning } from 'apache-iggy';
+
+const client = new Client({
+ transport: 'TCP',
+ options: { port: 8090, host: '127.0.0.1' },
+ credentials: {
+ username: 'iggy', password: 'iggy'
+ },
+});
+
+const stream = await client.stream.create({
+ name: 'orders'
+});
+const topic = await client.topic.create({
+ streamId: stream.id,
+ name: 'events',
+ partitionCount: 3,
+ compressionAlgorithm: 1,
+ replicationFactor: 1,
+});
+
+await client.message.send({
+ streamId: stream.id,
+ topicId: topic.id,
+ partition: Partitioning.PartitionId(1),
+ messages: [{ payload: 'order-123' }],
+});
+
+await client.destroy();`},{lang:"C#",file:"Producer.cs",href:"/docs/sdk/csharp/intro",code:`var client = IggyClientFactory.CreateClient(
+ new IggyClientConfigurator() {
+ BaseAddress = "127.0.0.1:8090",
+ Protocol = Protocol.Tcp,
+ }
+);
+await client.ConnectAsync();
+await client.LoginUser("iggy", "iggy");
+
+await client.CreateStreamAsync("orders");
+await client.CreateTopicAsync(
+ Identifier.String("orders"),
+ "events", 3,
+ CompressionAlgorithm.None
+);
+
+await client.SendMessagesAsync(
+ Identifier.String("orders"),
+ Identifier.String("events"),
+ Partitioning.PartitionId(1),
+ new[] {
+ new Message(Guid.NewGuid(),
+ Encoding.UTF8.GetBytes(
+ "order-123"))
+ }
+);`},{lang:"PHP",file:"producer.php",href:"https://github.com/apache/iggy/tree/master/foreign/php",code:`<?php
+
+$client = new \\Iggy\\Client(
+ '127.0.0.1:8090'
+);
+$client->connect();
+$client->loginUser('iggy', 'iggy');
+
+$client->createStream('orders');
+$client->createTopic(
+ 'orders',
+ 'events',
+ 3,
+ null,
+ null,
+ null,
+ null
+);
+
+$client->sendMessages(
+ 'orders',
+ 'events',
+ 0,
+ [new \\Iggy\\SendMessage('order-123')]
+);`},{lang:"C++ (WIP)",file:"producer.cpp",href:"/docs/sdk/cpp/intro",code:`#include "lib.rs.h"
+
+auto* client = iggy::ffi::new_connection(
+ "iggy://iggy:iggy@localhost:8090"
+);
+client->connect();
+client->login_user("iggy", "iggy");
+
+client->create_stream("orders");
+
+auto stream_id =
+ make_string_identifier("orders");
+
+client->create_topic(
+ stream_id, "events", 3,
+ "none", 0,
+ "server_default", 0,
+ "server_default"
+);
+
+iggy::ffi::delete_connection(client);`}];function M(){let[e,s]=(0,r.useState)(0),[M,$]=(0,r.useState)(!1),S=_[e],L=P[S.lang];return(0,t.jsxs)("div",{className:"min-w-0 max-w-full",children:[(0,t.jsxs)("div",{className:"min-w-0 max-w-full overflow-hidden rounded-2xl border border-white/[0.08] bg-[#0c1220]",children:[(0,t.jsx)("div",{className:"flex max-w-full items-center overflow-x-auto border-b border-white/[0.06]",children:_.map((r,i)=>(0,t.jsx)("button",{onClick:()=>s(i),className:`px [...]
+ @keyframes iggy-chart-reveal {
+ from { width: 0; }
+ to { width: 800px; }
+ }
+ @keyframes iggy-reference-in {
+ from { opacity: 0; }
+ to { opacity: 1; }
+ }
+ .iggy-chart-clip {
+ width: 0;
+ }
+ .iggy-chart-visible .iggy-chart-clip {
+ animation: iggy-chart-reveal 2.4s cubic-bezier(0.16, 1, 0.3, 1) forwards;
+ }
+ .iggy-chart-reference {
+ opacity: 0;
+ }
+ .iggy-chart-visible .iggy-chart-reference {
+ animation: iggy-reference-in 0.5s ease 2.1s forwards;
+ }
+ `}),(0,t.jsx)("div",{className:"mb-6 grid min-w-0 grid-cols-2 gap-4 md:grid-cols-5",children:a.map(e=>(0,t.jsxs)("div",{className:"min-w-0 rounded-lg border border-white/[0.08] bg-white/[0.035] px-4 py-5 sm:px-5",children:[(0,t.jsxs)("div",{className:"mb-1 flex items-baseline gap-1.5",children:[(0,t.jsx)("span",{className:"text-2xl font-extrabold text-white sm:text-3xl",children:e.value}),(0,t.jsx)("span",{className:"text-xs font-medium text-neutral-300 sm:text-sm",children:e.unit} [...]
\ No newline at end of file
diff --git a/_next/static/chunks/fa4e005c68a3a3de.js b/_next/static/chunks/fa4e005c68a3a3de.js
new file mode 100644
index 00000000..55c6aaff
--- /dev/null
+++ b/_next/static/chunks/fa4e005c68a3a3de.js
@@ -0,0 +1 @@
+(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,75830,e=>{"use strict";var t=e.i(71645),r=e.i(30030),n=e.i(20783),s=e.i(43476);function i(e){var r;let i,l=(r=e,(i=t.forwardRef((e,r)=>{let{children:s,...i}=e;if(t.isValidElement(s)){var l;let e,o,a=(l=s,(o=(e=Object.getOwnPropertyDescriptor(l.props,"ref")?.get)&&"isReactWarning"in e&&e.isReactWarning)?l.ref:(o=(e=Object.getOwnPropertyDescriptor(l,"ref")?.get)&&"isReactWarning" [...]
\ No newline at end of file
diff --git a/_next/static/chunks/ff1a16fafef87110.js b/_next/static/chunks/ff1a16fafef87110.js
new file mode 100644
index 00000000..b1fd77ef
--- /dev/null
+++ b/_next/static/chunks/ff1a16fafef87110.js
@@ -0,0 +1 @@
+(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,33525,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"warnOnce",{enumerable:!0,get:function(){return n}});let n=e=>{}}]);
\ No newline at end of file
diff --git a/_next/static/chunks/turbopack-098b96c9b1ed5066.js b/_next/static/chunks/turbopack-098b96c9b1ed5066.js
new file mode 100644
index 00000000..40c3fbdb
--- /dev/null
+++ b/_next/static/chunks/turbopack-098b96c9b1ed5066.js
@@ -0,0 +1,4 @@
+(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,{otherChunks:["static/chunks/922b7f01aa6775a6.js","static/chunks/82abf2d65f5428ae.js","static/chunks/aee6c7720838f8a2.js","static/chunks/58665f1783672c50.js"],runtimeModuleIds:[94553]}]),(()=>{let e;if(!Array.isArray(globalThis.TURBOPACK))return;let t="/_next/",r=(self.TURBOPACK_CHUNK_SUFFIX??document?.currentScript?.getAttribute?.("src")?.replace(/^(.*(?=\?)|^.*$)/,""))||"",n= [...]
+self.TURBOPACK_CHUNK_SUFFIX = ${JSON.stringify(r)};
+self.TURBOPACK_NEXT_CHUNK_URLS = ${JSON.stringify(e.reverse().map(K),null,2)};
+importScripts(...self.TURBOPACK_NEXT_CHUNK_URLS.map(c => self.TURBOPACK_WORKER_LOCATION + c).reverse());`],{type:"text/javascript"});return URL.createObjectURL(t)};let x=/\.js(?:\?[^#]*)?(?:#.*)?$/,N=/\.css(?:\?[^#]*)?(?:#.*)?$/;function M(e){return N.test(e)}l.w=function(t,r,n){return e.loadWebAssembly(1,this.m.id,t,r,n)},l.u=function(t,r){return e.loadWebAssemblyModule(1,this.m.id,t,r)};let L={};l.c=L;let B=(e,t)=>{let r=L[e];if(r){if(r.error)throw r.error;return r}return q(e,_.Parent, [...]
\ No newline at end of file
diff --git a/_next/static/media/GeistMono_Variable.p.2f937313.woff2 b/_next/static/media/GeistMono_Variable.p.2f937313.woff2
new file mode 100644
index 00000000..dbdb8c2d
Binary files /dev/null and b/_next/static/media/GeistMono_Variable.p.2f937313.woff2 differ
diff --git a/_next/static/media/Geist_Variable-s.p.92592eb2.woff2 b/_next/static/media/Geist_Variable-s.p.92592eb2.woff2
new file mode 100644
index 00000000..b2f01210
Binary files /dev/null and b/_next/static/media/Geist_Variable-s.p.92592eb2.woff2 differ
diff --git a/_next/static/media/architecture.2230a7d0.png b/_next/static/media/architecture.2230a7d0.png
new file mode 100644
index 00000000..0d1c885f
Binary files /dev/null and b/_next/static/media/architecture.2230a7d0.png differ
diff --git a/_next/static/media/bench_cli.48beddad.png b/_next/static/media/bench_cli.48beddad.png
new file mode 100644
index 00000000..5bf0eacc
Binary files /dev/null and b/_next/static/media/bench_cli.48beddad.png differ
diff --git a/_next/static/media/bench_platform.e615d356.png b/_next/static/media/bench_platform.e615d356.png
new file mode 100644
index 00000000..8e56cd1d
Binary files /dev/null and b/_next/static/media/bench_platform.e615d356.png differ
diff --git a/_next/static/media/diagram_szpont.04a5cd4d.png b/_next/static/media/diagram_szpont.04a5cd4d.png
new file mode 100644
index 00000000..a6727e1a
Binary files /dev/null and b/_next/static/media/diagram_szpont.04a5cd4d.png differ
diff --git a/_next/static/media/ecs.d641fd8e.png b/_next/static/media/ecs.d641fd8e.png
new file mode 100644
index 00000000..cd5e7c97
Binary files /dev/null and b/_next/static/media/ecs.d641fd8e.png differ
diff --git a/_next/static/media/gh_trending.c393fc00.jpeg b/_next/static/media/gh_trending.c393fc00.jpeg
new file mode 100644
index 00000000..117b7e77
Binary files /dev/null and b/_next/static/media/gh_trending.c393fc00.jpeg differ
diff --git a/_next/static/media/iggy_0_1_0.91d4e69f.jpg b/_next/static/media/iggy_0_1_0.91d4e69f.jpg
new file mode 100644
index 00000000..8b738337
Binary files /dev/null and b/_next/static/media/iggy_0_1_0.91d4e69f.jpg differ
diff --git a/_next/static/media/iggy_batch_schema_1.ca17478c.png b/_next/static/media/iggy_batch_schema_1.ca17478c.png
new file mode 100644
index 00000000..bdba4165
Binary files /dev/null and b/_next/static/media/iggy_batch_schema_1.ca17478c.png differ
diff --git a/_next/static/media/iggy_batch_schema_2.19411d93.png b/_next/static/media/iggy_batch_schema_2.19411d93.png
new file mode 100644
index 00000000..a3ed870e
Binary files /dev/null and b/_next/static/media/iggy_batch_schema_2.19411d93.png differ
diff --git a/_next/static/media/iggy_bench.5fe87533.png b/_next/static/media/iggy_bench.5fe87533.png
new file mode 100644
index 00000000..0bc290f9
Binary files /dev/null and b/_next/static/media/iggy_bench.5fe87533.png differ
diff --git a/_next/static/media/iggy_bench.d3c96948.jpeg b/_next/static/media/iggy_bench.d3c96948.jpeg
new file mode 100644
index 00000000..a3de266b
Binary files /dev/null and b/_next/static/media/iggy_bench.d3c96948.jpeg differ
diff --git a/_next/static/media/iggy_bench_0_1_0.b7be7178.jpeg b/_next/static/media/iggy_bench_0_1_0.b7be7178.jpeg
new file mode 100644
index 00000000..36aeca37
Binary files /dev/null and b/_next/static/media/iggy_bench_0_1_0.b7be7178.jpeg differ
diff --git a/_next/static/media/iggy_bench_cli.31c012c6.png b/_next/static/media/iggy_bench_cli.31c012c6.png
new file mode 100644
index 00000000..cfd27806
Binary files /dev/null and b/_next/static/media/iggy_bench_cli.31c012c6.png differ
diff --git a/_next/static/media/iggy_bench_dashboard.913ad513.png b/_next/static/media/iggy_bench_dashboard.913ad513.png
new file mode 100644
index 00000000..67847f4c
Binary files /dev/null and b/_next/static/media/iggy_bench_dashboard.913ad513.png differ
diff --git a/_next/static/media/iggy_ci_0_1_0.0d133771.jpeg b/_next/static/media/iggy_ci_0_1_0.0d133771.jpeg
new file mode 100644
index 00000000..2a597fb3
Binary files /dev/null and b/_next/static/media/iggy_ci_0_1_0.0d133771.jpeg differ
diff --git a/_next/static/media/iggy_ci_cd.51a98142.jpeg b/_next/static/media/iggy_ci_cd.51a98142.jpeg
new file mode 100644
index 00000000..0f7caf01
Binary files /dev/null and b/_next/static/media/iggy_ci_cd.51a98142.jpeg differ
diff --git a/_next/static/media/iggy_cli.22274b15.png b/_next/static/media/iggy_cli.22274b15.png
new file mode 100644
index 00000000..43acc469
Binary files /dev/null and b/_next/static/media/iggy_cli.22274b15.png differ
diff --git a/_next/static/media/iggy_cli.6f56bf04.png b/_next/static/media/iggy_cli.6f56bf04.png
new file mode 100644
index 00000000..36488263
Binary files /dev/null and b/_next/static/media/iggy_cli.6f56bf04.png differ
diff --git a/_next/static/media/iggy_cli.ffd1cc01.jpeg b/_next/static/media/iggy_cli.ffd1cc01.jpeg
new file mode 100644
index 00000000..8520661a
Binary files /dev/null and b/_next/static/media/iggy_cli.ffd1cc01.jpeg differ
diff --git a/_next/static/media/iggy_cli_0_1_0.9e3b3b20.jpeg b/_next/static/media/iggy_cli_0_1_0.9e3b3b20.jpeg
new file mode 100644
index 00000000..1853b130
Binary files /dev/null and b/_next/static/media/iggy_cli_0_1_0.9e3b3b20.jpeg differ
diff --git a/_next/static/media/iggy_cluster.45c5ba16.png b/_next/static/media/iggy_cluster.45c5ba16.png
new file mode 100644
index 00000000..dc246210
Binary files /dev/null and b/_next/static/media/iggy_cluster.45c5ba16.png differ
diff --git a/_next/static/media/iggy_docker.d90b2df3.png b/_next/static/media/iggy_docker.d90b2df3.png
new file mode 100644
index 00000000..41e3a607
Binary files /dev/null and b/_next/static/media/iggy_docker.d90b2df3.png differ
diff --git a/_next/static/media/iggy_logo.f9977802.png b/_next/static/media/iggy_logo.f9977802.png
new file mode 100644
index 00000000..33c3e2c2
Binary files /dev/null and b/_next/static/media/iggy_logo.f9977802.png differ
diff --git a/_next/static/media/iggy_perf.c89a7ea7.png b/_next/static/media/iggy_perf.c89a7ea7.png
new file mode 100644
index 00000000..1b91cdd3
Binary files /dev/null and b/_next/static/media/iggy_perf.c89a7ea7.png differ
diff --git a/_next/static/media/iggy_rocket.3360a060.png b/_next/static/media/iggy_rocket.3360a060.png
new file mode 100644
index 00000000..ec60dffd
Binary files /dev/null and b/_next/static/media/iggy_rocket.3360a060.png differ
diff --git a/_next/static/media/iggy_sample.4c2d3682.jpeg b/_next/static/media/iggy_sample.4c2d3682.jpeg
new file mode 100644
index 00000000..67cb96a6
Binary files /dev/null and b/_next/static/media/iggy_sample.4c2d3682.jpeg differ
diff --git a/_next/static/media/iggy_server.4f75ea73.jpeg b/_next/static/media/iggy_server.4f75ea73.jpeg
new file mode 100644
index 00000000..eaa7b762
Binary files /dev/null and b/_next/static/media/iggy_server.4f75ea73.jpeg differ
diff --git a/_next/static/media/iggy_server.7dd1e784.png b/_next/static/media/iggy_server.7dd1e784.png
new file mode 100644
index 00000000..02e27e0e
Binary files /dev/null and b/_next/static/media/iggy_server.7dd1e784.png differ
diff --git a/_next/static/media/iggy_server_0_1_0.40382e5f.jpeg b/_next/static/media/iggy_server_0_1_0.40382e5f.jpeg
new file mode 100644
index 00000000..2f6b74ad
Binary files /dev/null and b/_next/static/media/iggy_server_0_1_0.40382e5f.jpeg differ
diff --git a/_next/static/media/iggy_stars.5e23fec1.png b/_next/static/media/iggy_stars.5e23fec1.png
new file mode 100644
index 00000000..4af17ca7
Binary files /dev/null and b/_next/static/media/iggy_stars.5e23fec1.png differ
diff --git a/_next/static/media/iggy_technology_radar.be5a685d.png b/_next/static/media/iggy_technology_radar.be5a685d.png
new file mode 100644
index 00000000..ed08158a
Binary files /dev/null and b/_next/static/media/iggy_technology_radar.be5a685d.png differ
diff --git a/_next/static/media/iggy_tpc.a0bc9e74.png b/_next/static/media/iggy_tpc.a0bc9e74.png
new file mode 100644
index 00000000..a8ae7b19
Binary files /dev/null and b/_next/static/media/iggy_tpc.a0bc9e74.png differ
diff --git a/_next/static/media/iggy_vsr.2ca278be.png b/_next/static/media/iggy_vsr.2ca278be.png
new file mode 100644
index 00000000..1615725e
Binary files /dev/null and b/_next/static/media/iggy_vsr.2ca278be.png differ
diff --git a/_next/static/media/iggy_web.d8f09397.png b/_next/static/media/iggy_web.d8f09397.png
new file mode 100644
index 00000000..492ad4b8
Binary files /dev/null and b/_next/static/media/iggy_web.d8f09397.png differ
diff --git a/_next/static/media/iggy_web_ui.0f6c99cb.jpeg b/_next/static/media/iggy_web_ui.0f6c99cb.jpeg
new file mode 100644
index 00000000..168eeda4
Binary files /dev/null and b/_next/static/media/iggy_web_ui.0f6c99cb.jpeg differ
diff --git a/_next/static/media/iggy_web_ui.aa98803d.png b/_next/static/media/iggy_web_ui.aa98803d.png
new file mode 100644
index 00000000..1fa0d7db
Binary files /dev/null and b/_next/static/media/iggy_web_ui.aa98803d.png differ
diff --git a/_next/static/media/iggy_web_ui_0_1_0.0f6c99cb.jpeg b/_next/static/media/iggy_web_ui_0_1_0.0f6c99cb.jpeg
new file mode 100644
index 00000000..168eeda4
Binary files /dev/null and b/_next/static/media/iggy_web_ui_0_1_0.0f6c99cb.jpeg differ
diff --git a/_next/static/media/iggys.d5bf7cfc.jpeg b/_next/static/media/iggys.d5bf7cfc.jpeg
new file mode 100644
index 00000000..cd593d6f
Binary files /dev/null and b/_next/static/media/iggys.d5bf7cfc.jpeg differ
diff --git a/_next/static/media/leader_elections.a60bb3b7.jpeg b/_next/static/media/leader_elections.a60bb3b7.jpeg
new file mode 100644
index 00000000..352e9412
Binary files /dev/null and b/_next/static/media/leader_elections.a60bb3b7.jpeg differ
diff --git a/_next/static/media/no_zero_copy_consumer.3d01cd44.png b/_next/static/media/no_zero_copy_consumer.3d01cd44.png
new file mode 100644
index 00000000..7252a706
Binary files /dev/null and b/_next/static/media/no_zero_copy_consumer.3d01cd44.png differ
diff --git a/_next/static/media/no_zero_copy_producer.e84a1b6a.png b/_next/static/media/no_zero_copy_producer.e84a1b6a.png
new file mode 100644
index 00000000..c352f690
Binary files /dev/null and b/_next/static/media/no_zero_copy_producer.e84a1b6a.png differ
diff --git a/_next/static/media/pc_16_0.7.5be70d64.png b/_next/static/media/pc_16_0.7.5be70d64.png
new file mode 100644
index 00000000..09dddb11
Binary files /dev/null and b/_next/static/media/pc_16_0.7.5be70d64.png differ
diff --git a/_next/static/media/pc_tcp.c620c51e.png b/_next/static/media/pc_tcp.c620c51e.png
new file mode 100644
index 00000000..f8f45511
Binary files /dev/null and b/_next/static/media/pc_tcp.c620c51e.png differ
diff --git a/_next/static/media/pc_ws.aa40a190.png b/_next/static/media/pc_ws.aa40a190.png
new file mode 100644
index 00000000..253699b7
Binary files /dev/null and b/_next/static/media/pc_ws.aa40a190.png differ
diff --git a/_next/static/media/pp_16_0.5_fsync.3e56f68a.png b/_next/static/media/pp_16_0.5_fsync.3e56f68a.png
new file mode 100644
index 00000000..d59d4e78
Binary files /dev/null and b/_next/static/media/pp_16_0.5_fsync.3e56f68a.png differ
diff --git a/_next/static/media/pp_16_0.5_rl.1703bfbe.png b/_next/static/media/pp_16_0.5_rl.1703bfbe.png
new file mode 100644
index 00000000..486070cf
Binary files /dev/null and b/_next/static/media/pp_16_0.5_rl.1703bfbe.png differ
diff --git a/_next/static/media/pp_16_0.6.83fde634.png b/_next/static/media/pp_16_0.6.83fde634.png
new file mode 100644
index 00000000..3de23164
Binary files /dev/null and b/_next/static/media/pp_16_0.6.83fde634.png differ
diff --git a/_next/static/media/pp_16_0.7.502bb94d.png b/_next/static/media/pp_16_0.7.502bb94d.png
new file mode 100644
index 00000000..81a19b64
Binary files /dev/null and b/_next/static/media/pp_16_0.7.502bb94d.png differ
diff --git a/_next/static/media/pp_16_0.7_fsync.1cb4a924.png b/_next/static/media/pp_16_0.7_fsync.1cb4a924.png
new file mode 100644
index 00000000..d8b285ab
Binary files /dev/null and b/_next/static/media/pp_16_0.7_fsync.1cb4a924.png differ
diff --git a/_next/static/media/pp_32_0.5_fsync.fcaf99a0.png b/_next/static/media/pp_32_0.5_fsync.fcaf99a0.png
new file mode 100644
index 00000000..d55178b5
Binary files /dev/null and b/_next/static/media/pp_32_0.5_fsync.fcaf99a0.png differ
diff --git a/_next/static/media/pp_32_0.5_rl.43649cf2.png b/_next/static/media/pp_32_0.5_rl.43649cf2.png
new file mode 100644
index 00000000..7e88774b
Binary files /dev/null and b/_next/static/media/pp_32_0.5_rl.43649cf2.png differ
diff --git a/_next/static/media/pp_32_0.6.972d492a.png b/_next/static/media/pp_32_0.6.972d492a.png
new file mode 100644
index 00000000..07852505
Binary files /dev/null and b/_next/static/media/pp_32_0.6.972d492a.png differ
diff --git a/_next/static/media/pp_32_0.7.ba695bf9.png b/_next/static/media/pp_32_0.7.ba695bf9.png
new file mode 100644
index 00000000..98bd6ed5
Binary files /dev/null and b/_next/static/media/pp_32_0.7.ba695bf9.png differ
diff --git a/_next/static/media/pp_32_0.7_fsync.d0842be4.png b/_next/static/media/pp_32_0.7_fsync.d0842be4.png
new file mode 100644
index 00000000..48123150
Binary files /dev/null and b/_next/static/media/pp_32_0.7_fsync.d0842be4.png differ
diff --git a/_next/static/media/pp_8_0.5_rl.646aceed.png b/_next/static/media/pp_8_0.5_rl.646aceed.png
new file mode 100644
index 00000000..a3406c3b
Binary files /dev/null and b/_next/static/media/pp_8_0.5_rl.646aceed.png differ
diff --git a/_next/static/media/pp_8_0.6_rl.e328a44a.png b/_next/static/media/pp_8_0.6_rl.e328a44a.png
new file mode 100644
index 00000000..527d01a9
Binary files /dev/null and b/_next/static/media/pp_8_0.6_rl.e328a44a.png differ
diff --git a/_next/static/media/pp_8_0.7_rl.b993b1f0.png b/_next/static/media/pp_8_0.7_rl.b993b1f0.png
new file mode 100644
index 00000000..351b7f24
Binary files /dev/null and b/_next/static/media/pp_8_0.7_rl.b993b1f0.png differ
diff --git a/_next/static/media/sharding.b5c5f63d.png b/_next/static/media/sharding.b5c5f63d.png
new file mode 100644
index 00000000..98db8066
Binary files /dev/null and b/_next/static/media/sharding.b5c5f63d.png differ
diff --git a/_next/static/media/tcp-1234.445ddcbf.png b/_next/static/media/tcp-1234.445ddcbf.png
new file mode 100644
index 00000000..7b97f0a1
Binary files /dev/null and b/_next/static/media/tcp-1234.445ddcbf.png differ
diff --git a/_next/static/media/ws-1234.fbc1ea56.png b/_next/static/media/ws-1234.fbc1ea56.png
new file mode 100644
index 00000000..08de72e4
Binary files /dev/null and b/_next/static/media/ws-1234.fbc1ea56.png differ
diff --git a/_next/static/media/zero_copy_consumer.fb4c9be5.png b/_next/static/media/zero_copy_consumer.fb4c9be5.png
new file mode 100644
index 00000000..cb2d3101
Binary files /dev/null and b/_next/static/media/zero_copy_consumer.fb4c9be5.png differ
diff --git a/_next/static/media/zero_copy_producer.61ae01ab.png b/_next/static/media/zero_copy_producer.61ae01ab.png
new file mode 100644
index 00000000..0239eee7
Binary files /dev/null and b/_next/static/media/zero_copy_producer.61ae01ab.png differ
diff --git a/_next/static/uBHgltRE2s5QA49x61S_u/_buildManifest.js b/_next/static/uBHgltRE2s5QA49x61S_u/_buildManifest.js
new file mode 100644
index 00000000..94ca9144
--- /dev/null
+++ b/_next/static/uBHgltRE2s5QA49x61S_u/_buildManifest.js
@@ -0,0 +1,11 @@
+self.__BUILD_MANIFEST = {
+ "__rewrites": {
+ "afterFiles": [],
+ "beforeFiles": [],
+ "fallback": []
+ },
+ "sortedPages": [
+ "/_app",
+ "/_error"
+ ]
+};self.__BUILD_MANIFEST_CB && self.__BUILD_MANIFEST_CB()
\ No newline at end of file
diff --git a/_next/static/uBHgltRE2s5QA49x61S_u/_clientMiddlewareManifest.json b/_next/static/uBHgltRE2s5QA49x61S_u/_clientMiddlewareManifest.json
new file mode 100644
index 00000000..0637a088
--- /dev/null
+++ b/_next/static/uBHgltRE2s5QA49x61S_u/_clientMiddlewareManifest.json
@@ -0,0 +1 @@
+[]
\ No newline at end of file
diff --git a/_next/static/uBHgltRE2s5QA49x61S_u/_ssgManifest.js b/_next/static/uBHgltRE2s5QA49x61S_u/_ssgManifest.js
new file mode 100644
index 00000000..78f55549
--- /dev/null
+++ b/_next/static/uBHgltRE2s5QA49x61S_u/_ssgManifest.js
@@ -0,0 +1 @@
+self.__SSG_MANIFEST=new Set(["\u002Fblogs\u002F[...slug]","\u002Fdocs\u002F[[...slug]]"]);self.__SSG_MANIFEST_CB&&self.__SSG_MANIFEST_CB()
\ No newline at end of file
diff --git a/_not-found/__next._full.txt b/_not-found/__next._full.txt
new file mode 100644
index 00000000..4c1097de
--- /dev/null
+++ b/_not-found/__next._full.txt
@@ -0,0 +1,16 @@
+1:"$Sreact.fragment"
+2:I[17751,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/d2be314c3ece3fbe.js","/_next/static/chunks/78b5f2e7b839e72f.js"],"RootProvider"]
+3:I[39756,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/d2be314c3ece3fbe.js","/_next/static/chunks/78b5f2e7b839e72f.js"],"default"]
+4:I[58298,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/d2be314c3ece3fbe.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/5a37d4cb1abe17d7.js"],"default"]
+5:I[37457,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/d2be314c3ece3fbe.js","/_next/static/chunks/78b5f2e7b839e72f.js"],"default"]
+6:I[97367,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/d2be314c3ece3fbe.js","/_next/static/chunks/78b5f2e7b839e72f.js"],"OutletBoundary"]
+7:"$Sreact.suspense"
+9:I[97367,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/d2be314c3ece3fbe.js","/_next/static/chunks/78b5f2e7b839e72f.js"],"ViewportBoundary"]
+b:I[97367,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/d2be314c3ece3fbe.js","/_next/static/chunks/78b5f2e7b839e72f.js"],"MetadataBoundary"]
+d:I[68027,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/d2be314c3ece3fbe.js","/_next/static/chunks/78b5f2e7b839e72f.js"],"default"]
+:HL["/_next/static/chunks/32a0415c8ab1bd26.css","style"]
+0:{"P":null,"b":"uBHgltRE2s5QA49x61S_u","c":["","_not-found",""],"q":"","i":false,"f":[[["",{"children":["/_not-found",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",true],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/32a0415c8ab1bd26.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0",{"src":"/_next/static/chunks/9ebd3a84bf60af84.js","async":true,"nonce":"$undefined"}],["$","script" [...]
+a:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
+e:I[27201,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/d2be314c3ece3fbe.js","/_next/static/chunks/78b5f2e7b839e72f.js"],"IconMark"]
+8:null
+c:[["$","title","0",{"children":"Apache Iggy (Incubating)"}],["$","meta","1",{"name":"description","content":"Apache Iggy (Incubating) is a persistent message streaming platform written in Rust, supporting QUIC, TCP and HTTP transport protocols, capable of processing millions of messages per second."}],["$","link","2",{"rel":"icon","href":"/img/favicon.png"}],["$","$Le","3",{}]]
diff --git a/_not-found/__next._head.txt b/_not-found/__next._head.txt
new file mode 100644
index 00000000..ca9a62c4
--- /dev/null
+++ b/_not-found/__next._head.txt
@@ -0,0 +1,6 @@
+1:"$Sreact.fragment"
+2:I[97367,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/d2be314c3ece3fbe.js","/_next/static/chunks/78b5f2e7b839e72f.js"],"ViewportBoundary"]
+3:I[97367,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/d2be314c3ece3fbe.js","/_next/static/chunks/78b5f2e7b839e72f.js"],"MetadataBoundary"]
+4:"$Sreact.suspense"
+5:I[27201,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/d2be314c3ece3fbe.js","/_next/static/chunks/78b5f2e7b839e72f.js"],"IconMark"]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","h",{"children":[["$","meta",null,{"name":"robots","content":"noindex"}],["$","$L2",null,{"children":[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]}],["$","div",null,{"hidden":true,"children":["$","$L3",null,{"children":["$","$4",null,{"name":"Next.Metadata","children":[["$","title","0",{"children":"Apache Iggy (Incubating)"}],["$","meta","1",{"name":"descript [...]
diff --git a/_not-found/__next._index.txt b/_not-found/__next._index.txt
new file mode 100644
index 00000000..647444c0
--- /dev/null
+++ b/_not-found/__next._index.txt
@@ -0,0 +1,7 @@
+1:"$Sreact.fragment"
+2:I[17751,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/d2be314c3ece3fbe.js","/_next/static/chunks/78b5f2e7b839e72f.js"],"RootProvider"]
+3:I[39756,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/d2be314c3ece3fbe.js","/_next/static/chunks/78b5f2e7b839e72f.js"],"default"]
+4:I[58298,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/d2be314c3ece3fbe.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/5a37d4cb1abe17d7.js"],"default"]
+5:I[37457,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/d2be314c3ece3fbe.js","/_next/static/chunks/78b5f2e7b839e72f.js"],"default"]
+:HL["/_next/static/chunks/32a0415c8ab1bd26.css","style"]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/32a0415c8ab1bd26.css","precedence":"next"}],["$","script","script-0",{"src":"/_next/static/chunks/9ebd3a84bf60af84.js","async":true}],["$","script","script-1",{"src":"/_next/static/chunks/d2be314c3ece3fbe.js","async":true}],["$","script","script-2",{"src":"/_next/static/chunks/78b5f2e7b839e72f.js","async":true}]],["$","html",null,{"lang":"en","className" [...]
diff --git a/_not-found/__next._not-found.__PAGE__.txt b/_not-found/__next._not-found.__PAGE__.txt
new file mode 100644
index 00000000..f7284e4c
--- /dev/null
+++ b/_not-found/__next._not-found.__PAGE__.txt
@@ -0,0 +1,5 @@
+1:"$Sreact.fragment"
+2:I[97367,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/d2be314c3ece3fbe.js","/_next/static/chunks/78b5f2e7b839e72f.js"],"OutletBoundary"]
+3:"$Sreact.suspense"
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","c",{"children":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML" [...]
+4:null
diff --git a/_not-found/__next._not-found.txt b/_not-found/__next._not-found.txt
new file mode 100644
index 00000000..3abdfbd8
--- /dev/null
+++ b/_not-found/__next._not-found.txt
@@ -0,0 +1,4 @@
+1:"$Sreact.fragment"
+2:I[39756,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/d2be314c3ece3fbe.js","/_next/static/chunks/78b5f2e7b839e72f.js"],"default"]
+3:I[37457,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/d2be314c3ece3fbe.js","/_next/static/chunks/78b5f2e7b839e72f.js"],"default"]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","template":["$","$L3",null,{}]}]]}],"loading":null,"isPartial":false}
diff --git a/_not-found/__next._tree.txt b/_not-found/__next._tree.txt
new file mode 100644
index 00000000..0c426338
--- /dev/null
+++ b/_not-found/__next._tree.txt
@@ -0,0 +1,2 @@
+:HL["/_next/static/chunks/32a0415c8ab1bd26.css","style"]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","tree":{"name":"","paramType":null,"paramKey":"","hasRuntimePrefetch":false,"slots":{"children":{"name":"/_not-found","paramType":null,"paramKey":"/_not-found","hasRuntimePrefetch":false,"slots":{"children":{"name":"__PAGE__","paramType":null,"paramKey":"__PAGE__","hasRuntimePrefetch":false,"slots":null,"isRootLayout":false}},"isRootLayout":false}},"isRootLayout":true},"staleTime":300}
diff --git a/_not-found/index.html b/_not-found/index.html
new file mode 100644
index 00000000..d3d113dd
--- /dev/null
+++ b/_not-found/index.html
@@ -0,0 +1 @@
+<!DOCTYPE html><!--uBHgltRE2s5QA49x61S_u--><html lang="en" class="geistsans_d5a4f12f-module__Ur3q_a__variable geistmono_157ca88a-module__iaM1Ya__variable"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/_next/static/chunks/32a0415c8ab1bd26.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/922b7f01aa6775a6.js"/><script src="/_next/static/chunks/82abf2d6 [...]
\ No newline at end of file
diff --git a/_not-found/index.txt b/_not-found/index.txt
new file mode 100644
index 00000000..4c1097de
--- /dev/null
+++ b/_not-found/index.txt
@@ -0,0 +1,16 @@
+1:"$Sreact.fragment"
+2:I[17751,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/d2be314c3ece3fbe.js","/_next/static/chunks/78b5f2e7b839e72f.js"],"RootProvider"]
+3:I[39756,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/d2be314c3ece3fbe.js","/_next/static/chunks/78b5f2e7b839e72f.js"],"default"]
+4:I[58298,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/d2be314c3ece3fbe.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/5a37d4cb1abe17d7.js"],"default"]
+5:I[37457,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/d2be314c3ece3fbe.js","/_next/static/chunks/78b5f2e7b839e72f.js"],"default"]
+6:I[97367,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/d2be314c3ece3fbe.js","/_next/static/chunks/78b5f2e7b839e72f.js"],"OutletBoundary"]
+7:"$Sreact.suspense"
+9:I[97367,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/d2be314c3ece3fbe.js","/_next/static/chunks/78b5f2e7b839e72f.js"],"ViewportBoundary"]
+b:I[97367,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/d2be314c3ece3fbe.js","/_next/static/chunks/78b5f2e7b839e72f.js"],"MetadataBoundary"]
+d:I[68027,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/d2be314c3ece3fbe.js","/_next/static/chunks/78b5f2e7b839e72f.js"],"default"]
+:HL["/_next/static/chunks/32a0415c8ab1bd26.css","style"]
+0:{"P":null,"b":"uBHgltRE2s5QA49x61S_u","c":["","_not-found",""],"q":"","i":false,"f":[[["",{"children":["/_not-found",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",true],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/32a0415c8ab1bd26.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0",{"src":"/_next/static/chunks/9ebd3a84bf60af84.js","async":true,"nonce":"$undefined"}],["$","script" [...]
+a:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
+e:I[27201,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/d2be314c3ece3fbe.js","/_next/static/chunks/78b5f2e7b839e72f.js"],"IconMark"]
+8:null
+c:[["$","title","0",{"children":"Apache Iggy (Incubating)"}],["$","meta","1",{"name":"description","content":"Apache Iggy (Incubating) is a persistent message streaming platform written in Rust, supporting QUIC, TCP and HTTP transport protocols, capable of processing millions of messages per second."}],["$","link","2",{"rel":"icon","href":"/img/favicon.png"}],["$","$Le","3",{}]]
diff --git a/apache-incubator/iggy_logo.png b/apache-incubator/iggy_logo.png
new file mode 100644
index 00000000..33c3e2c2
Binary files /dev/null and b/apache-incubator/iggy_logo.png differ
diff --git a/api/search b/api/search
new file mode 100644
index 00000000..cca3b200
--- /dev/null
+++ b/api/search
@@ -0,0 +1 @@
+{"type":"advanced","internalDocumentIDStore":{"internalIdToId":["/docs","/docs-0","/docs-1","/docs-2","/docs-3","/docs-4","/docs-5","/docs-6","/docs-7","/docs-8","/docs-9","/docs-10","/docs-11","/docs-12","/docs-13","/docs-14","/docs-15","/docs-16","/docs-17","/docs-18","/docs-19","/docs-20","/docs-21","/docs-22","/docs-23","/docs-24","/docs-25","/docs-26","/docs-27","/docs-28","/docs-29","/docs-30","/docs/ai/introduction","/docs/ai/introduction-0","/docs/ai/introduction-1","/docs/ai/mcp [...]
\ No newline at end of file
diff --git a/blogs/2023/08/16/welcome/__next.!KHNpdGUp.blogs.$c$slug.__PAGE__.txt b/blogs/2023/08/16/welcome/__next.!KHNpdGUp.blogs.$c$slug.__PAGE__.txt
new file mode 100644
index 00000000..3e1e6056
--- /dev/null
+++ b/blogs/2023/08/16/welcome/__next.!KHNpdGUp.blogs.$c$slug.__PAGE__.txt
@@ -0,0 +1,6 @@
+1:"$Sreact.fragment"
+2:I[22016,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],""]
+3:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"OutletBoundary"]
+4:"$Sreact.suspense"
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","c",{"children":[["$","main",null,{"className":"min-h-screen px-6 py-16 md:px-12","children":["$","article",null,{"className":"mx-auto max-w-5xl","children":[["$","header",null,{"className":"mb-10","children":[["$","time",null,{"className":"text-sm font-medium text-fd-muted-foreground","children":"August 16, 2023"}],["$","h1",null,{"className":"mt-3 text-3xl font-extrabold tracking-tight text-fd-foreground md:text-5xl","children":"Welc [...]
+5:null
diff --git a/blogs/2023/08/16/welcome/__next.!KHNpdGUp.blogs.$c$slug.txt b/blogs/2023/08/16/welcome/__next.!KHNpdGUp.blogs.$c$slug.txt
new file mode 100644
index 00000000..11b31bb0
--- /dev/null
+++ b/blogs/2023/08/16/welcome/__next.!KHNpdGUp.blogs.$c$slug.txt
@@ -0,0 +1,4 @@
+1:"$Sreact.fragment"
+2:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+3:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","template":["$","$L3",null,{}]}]]}],"loading":null,"isPartial":false}
diff --git a/blogs/2023/08/16/welcome/__next.!KHNpdGUp.blogs.txt b/blogs/2023/08/16/welcome/__next.!KHNpdGUp.blogs.txt
new file mode 100644
index 00000000..11b31bb0
--- /dev/null
+++ b/blogs/2023/08/16/welcome/__next.!KHNpdGUp.blogs.txt
@@ -0,0 +1,4 @@
+1:"$Sreact.fragment"
+2:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+3:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","template":["$","$L3",null,{}]}]]}],"loading":null,"isPartial":false}
diff --git a/blogs/2023/08/16/welcome/__next.!KHNpdGUp.txt b/blogs/2023/08/16/welcome/__next.!KHNpdGUp.txt
new file mode 100644
index 00000000..ea3bfa55
--- /dev/null
+++ b/blogs/2023/08/16/welcome/__next.!KHNpdGUp.txt
@@ -0,0 +1,9 @@
+1:"$Sreact.fragment"
+2:I[83571,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Header"]
+3:I[29966,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFDropdown"]
+4:I[36330,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFMobileLinks"]
+5:I[22016,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],""]
+6:I[88760,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Logo"]
+7:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+8:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","c",{"children":[[["$","script","script-0",{"src":"/_next/static/chunks/8d86be78428a601a.js","async":true}],["$","script","script-1",{"src":"/_next/static/chunks/da34cc6305706ac6.js","async":true}],["$","script","script-2",{"src":"/_next/static/chunks/9baf65674e2de991.js","async":true}],["$","script","script-3",{"src":"/_next/static/chunks/26b70f9828dd1eb5.js","async":true}],["$","script","script-4",{"src":"/_next/static/chunks/adeed83 [...]
diff --git a/blogs/2023/08/16/welcome/__next._full.txt b/blogs/2023/08/16/welcome/__next._full.txt
new file mode 100644
index 00000000..60f09837
--- /dev/null
+++ b/blogs/2023/08/16/welcome/__next._full.txt
@@ -0,0 +1,30 @@
+1:"$Sreact.fragment"
+2:I[17751,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js"],"RootProvider"]
+3:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+4:I[58298,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/5a37d4cb1abe17d7.js"],"default"]
+5:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+6:I[83571,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Header"]
+7:I[29966,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFDropdown"]
+8:I[36330,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFMobileLinks"]
+9:I[22016,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],""]
+a:I[88760,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Logo"]
+11:I[68027,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+:HL["/_next/static/chunks/32a0415c8ab1bd26.css","style"]
+:HL["/_next/static/media/GeistMono_Variable.p.2f937313.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+:HL["/_next/static/media/Geist_Variable-s.p.92592eb2.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+0:{"P":null,"b":"uBHgltRE2s5QA49x61S_u","c":["","blogs","2023","08","16","welcome",""],"q":"","i":false,"f":[[["",{"children":["(site)",{"children":["blogs",{"children":[["slug","2023/08/16/welcome","c"],{"children":["__PAGE__",{}]}]}]}]},"$undefined","$undefined",true],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/32a0415c8ab1bd26.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0",{"src":"/_ [...]
+13:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"OutletBoundary"]
+14:"$Sreact.suspense"
+16:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"ViewportBoundary"]
+18:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"MetadataBoundary"]
+b:["$","h1",null,{"className":"next-error-h1","style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:1:props:style","children":404}]
+c:["$","div",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:style","children":["$","h2",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style","children":"This page could not be found."}]}]
+d:["$","$1","c",{"children":[null,["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}]
+e:["$","$1","c",{"children":[null,["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}]
+f:["$","$1","c",{"children":["$L12",[["$","script","script-0",{"src":"/_next/static/chunks/00b00679782d0ffd.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/3562882a488c4fbb.js","async":true,"nonce":"$undefined"}]],["$","$L13",null,{"children":["$","$14",null,{"name":"Next.MetadataOutlet","children":"$@15"}]}]]}]
+10:["$","$1","h",{"children":[null,["$","$L16",null,{"children":"$L17"}],["$","div",null,{"hidden":true,"children":["$","$L18",null,{"children":["$","$14",null,{"name":"Next.Metadata","children":"$L19"}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}]
+12:["$","main",null,{"className":"min-h-screen px-6 py-16 md:px-12","children":["$","article",null,{"className":"mx-auto max-w-5xl","children":[["$","header",null,{"className":"mb-10","children":[["$","time",null,{"className":"text-sm font-medium text-fd-muted-foreground","children":"August 16, 2023"}],["$","h1",null,{"className":"mt-3 text-3xl font-extrabold tracking-tight text-fd-foreground md:text-5xl","children":"Welcome to the changelog"}],["$","p",null,{"className":"mt-4 text-base [...]
+17:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
+1a:I[27201,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"IconMark"]
+15:null
+19:[["$","title","0",{"children":"Welcome to the changelog | Apache Iggy"}],["$","link","1",{"rel":"icon","href":"/img/favicon.png"}],["$","$L1a","2",{}]]
diff --git a/blogs/2023/08/16/welcome/__next._head.txt b/blogs/2023/08/16/welcome/__next._head.txt
new file mode 100644
index 00000000..8d3f1249
--- /dev/null
+++ b/blogs/2023/08/16/welcome/__next._head.txt
@@ -0,0 +1,6 @@
+1:"$Sreact.fragment"
+2:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"ViewportBoundary"]
+3:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"MetadataBoundary"]
+4:"$Sreact.suspense"
+5:I[27201,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"IconMark"]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","h",{"children":[null,["$","$L2",null,{"children":[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]}],["$","div",null,{"hidden":true,"children":["$","$L3",null,{"children":["$","$4",null,{"name":"Next.Metadata","children":[["$","title","0",{"children":"Welcome to the changelog | Apache Iggy"}],["$","link","1",{"rel":"icon","href":"/img/favicon.png"}],["$","$L5"," [...]
diff --git a/blogs/2023/08/16/welcome/__next._index.txt b/blogs/2023/08/16/welcome/__next._index.txt
new file mode 100644
index 00000000..fd02bd95
--- /dev/null
+++ b/blogs/2023/08/16/welcome/__next._index.txt
@@ -0,0 +1,7 @@
+1:"$Sreact.fragment"
+2:I[17751,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js"],"RootProvider"]
+3:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+4:I[58298,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/5a37d4cb1abe17d7.js"],"default"]
+5:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+:HL["/_next/static/chunks/32a0415c8ab1bd26.css","style"]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/32a0415c8ab1bd26.css","precedence":"next"}],["$","script","script-0",{"src":"/_next/static/chunks/9ebd3a84bf60af84.js","async":true}],["$","script","script-1",{"src":"/_next/static/chunks/78b5f2e7b839e72f.js","async":true}]],["$","html",null,{"lang":"en","className":"geistsans_d5a4f12f-module__Ur3q_a__variable geistmono_157ca88a-module__iaM1Ya__variable" [...]
diff --git a/blogs/2023/08/16/welcome/__next._tree.txt b/blogs/2023/08/16/welcome/__next._tree.txt
new file mode 100644
index 00000000..a424be20
--- /dev/null
+++ b/blogs/2023/08/16/welcome/__next._tree.txt
@@ -0,0 +1,4 @@
+:HL["/_next/static/chunks/32a0415c8ab1bd26.css","style"]
+:HL["/_next/static/media/GeistMono_Variable.p.2f937313.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+:HL["/_next/static/media/Geist_Variable-s.p.92592eb2.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","tree":{"name":"","paramType":null,"paramKey":"","hasRuntimePrefetch":false,"slots":{"children":{"name":"(site)","paramType":null,"paramKey":"(site)","hasRuntimePrefetch":false,"slots":{"children":{"name":"blogs","paramType":null,"paramKey":"blogs","hasRuntimePrefetch":false,"slots":{"children":{"name":"slug","paramType":"c","paramKey":"2023/08/16/welcome","hasRuntimePrefetch":false,"slots":{"children":{"name":"__PAGE__","paramType":null,"paramKey":"_ [...]
diff --git a/blogs/2023/08/16/welcome/index.html b/blogs/2023/08/16/welcome/index.html
new file mode 100644
index 00000000..cf23fd1e
--- /dev/null
+++ b/blogs/2023/08/16/welcome/index.html
@@ -0,0 +1,3 @@
+<!DOCTYPE html><!--uBHgltRE2s5QA49x61S_u--><html lang="en" class="geistsans_d5a4f12f-module__Ur3q_a__variable geistmono_157ca88a-module__iaM1Ya__variable"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" href="/_next/static/media/GeistMono_Variable.p.2f937313.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="preload" href="/_next/static/media/Geist_Variable-s.p.92592eb2.woff2" as="font" crossorigin="" type=" [...]
+<p>For the time being, I haven't documented all the changes that I've made to the project, but since there's already a few of us working on the different parts of the project, I think it's a good idea to start documenting them, especially when there are some breaking changes or the new features being added to the server, that should be implemented in the client SDK as well :)</p>
+<p>Stay tuned for the updates and the upcoming features, such as optional message headers!</p></div><footer class="mt-16 border-t border-fd-border pt-8"><a class="inline-flex items-center gap-2 text-sm font-medium text-fd-primary transition-colors hover:opacity-80" href="/blogs/">← Back to all posts</a></footer></article></main><!--$--><!--/$--></main><script src="/_next/static/chunks/922b7f01aa6775a6.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</scr [...]
\ No newline at end of file
diff --git a/blogs/2023/08/16/welcome/index.txt b/blogs/2023/08/16/welcome/index.txt
new file mode 100644
index 00000000..60f09837
--- /dev/null
+++ b/blogs/2023/08/16/welcome/index.txt
@@ -0,0 +1,30 @@
+1:"$Sreact.fragment"
+2:I[17751,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js"],"RootProvider"]
+3:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+4:I[58298,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/5a37d4cb1abe17d7.js"],"default"]
+5:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+6:I[83571,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Header"]
+7:I[29966,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFDropdown"]
+8:I[36330,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFMobileLinks"]
+9:I[22016,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],""]
+a:I[88760,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Logo"]
+11:I[68027,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+:HL["/_next/static/chunks/32a0415c8ab1bd26.css","style"]
+:HL["/_next/static/media/GeistMono_Variable.p.2f937313.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+:HL["/_next/static/media/Geist_Variable-s.p.92592eb2.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+0:{"P":null,"b":"uBHgltRE2s5QA49x61S_u","c":["","blogs","2023","08","16","welcome",""],"q":"","i":false,"f":[[["",{"children":["(site)",{"children":["blogs",{"children":[["slug","2023/08/16/welcome","c"],{"children":["__PAGE__",{}]}]}]}]},"$undefined","$undefined",true],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/32a0415c8ab1bd26.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0",{"src":"/_ [...]
+13:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"OutletBoundary"]
+14:"$Sreact.suspense"
+16:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"ViewportBoundary"]
+18:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"MetadataBoundary"]
+b:["$","h1",null,{"className":"next-error-h1","style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:1:props:style","children":404}]
+c:["$","div",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:style","children":["$","h2",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style","children":"This page could not be found."}]}]
+d:["$","$1","c",{"children":[null,["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}]
+e:["$","$1","c",{"children":[null,["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}]
+f:["$","$1","c",{"children":["$L12",[["$","script","script-0",{"src":"/_next/static/chunks/00b00679782d0ffd.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/3562882a488c4fbb.js","async":true,"nonce":"$undefined"}]],["$","$L13",null,{"children":["$","$14",null,{"name":"Next.MetadataOutlet","children":"$@15"}]}]]}]
+10:["$","$1","h",{"children":[null,["$","$L16",null,{"children":"$L17"}],["$","div",null,{"hidden":true,"children":["$","$L18",null,{"children":["$","$14",null,{"name":"Next.Metadata","children":"$L19"}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}]
+12:["$","main",null,{"className":"min-h-screen px-6 py-16 md:px-12","children":["$","article",null,{"className":"mx-auto max-w-5xl","children":[["$","header",null,{"className":"mb-10","children":[["$","time",null,{"className":"text-sm font-medium text-fd-muted-foreground","children":"August 16, 2023"}],["$","h1",null,{"className":"mt-3 text-3xl font-extrabold tracking-tight text-fd-foreground md:text-5xl","children":"Welcome to the changelog"}],["$","p",null,{"className":"mt-4 text-base [...]
+17:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
+1a:I[27201,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"IconMark"]
+15:null
+19:[["$","title","0",{"children":"Welcome to the changelog | Apache Iggy"}],["$","link","1",{"rel":"icon","href":"/img/favicon.png"}],["$","$L1a","2",{}]]
diff --git a/blogs/2023/08/19/message-headers/__next.!KHNpdGUp.blogs.$c$slug.__PAGE__.txt b/blogs/2023/08/19/message-headers/__next.!KHNpdGUp.blogs.$c$slug.__PAGE__.txt
new file mode 100644
index 00000000..abd4fc6e
--- /dev/null
+++ b/blogs/2023/08/19/message-headers/__next.!KHNpdGUp.blogs.$c$slug.__PAGE__.txt
@@ -0,0 +1,161 @@
+1:"$Sreact.fragment"
+2:I[47873,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"default"]
+31:I[44324,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"CodeBlock"]
+36:I[44324,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"Pre"]
+4e:I[22016,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],""]
+4f:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"OutletBoundary"]
+50:"$Sreact.suspense"
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","c",{"children":[["$","main",null,{"className":"min-h-screen px-6 py-16 md:px-12","children":["$","article",null,{"className":"mx-auto max-w-5xl","children":[["$","header",null,{"className":"mb-10","children":[["$","time",null,{"className":"text-sm font-medium text-fd-muted-foreground","children":"August 19, 2023"}],["$","h1",null,{"className":"mt-3 text-3xl font-extrabold tracking-tight text-fd-foreground md:text-5xl","children":"Mess [...]
+3:["$","strong",null,{"children":"key-value pairs"}]
+4:["$","strong",null,{"children":"UTF-8 bytes"}]
+5:["$","p",null,{"children":["Since the headers are optional, you can send a message without any headers at all. There's no limit on the number of headers you can send, but the total size of the headers is currently limited to ",["$","strong",null,{"children":"100 KB"}],". The header key is ",["$","strong",null,{"children":"case-sensitive"}],", so it's best to send the ",["$","strong",null,{"children":"lowercase"}]," keys. The maximum length of the key and the value is ",["$","strong",nu [...]
+6:["$","p",null,{"children":"For now, there are no reserved headers, so you can use any key you want. However, in the future, we might introduce some reserved headers used by the streaming server for the specific purposes such as the message compression, distributed tracing and so no."}]
+7:["$","p",null,{"children":["The ",["$","strong",null,{"children":"sample applications"}]," using the message headers can be found ",["$","$L2",null,{"href":"https://github.com/apache/iggy/tree/master/examples/rust/src/message-headers","children":"here"}],"."]}]
+8:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"implementation","children":[["$","a",null,{"data-card":"","href":"#implementation","className":"peer","children":"Implementation"}],["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground [...]
+9:["$","h3",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"structures","children":[["$","a",null,{"data-card":"","href":"#structures","className":"peer","children":"Structures"}],["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 tr [...]
+a:["$","p",null,{"children":["We will start with the sample Rust implementation of the headers. The headers are defined as a ",["$","code",null,{"children":"HashMap"}]," where the key is a ",["$","code",null,{"children":"string"}]," (wrapped with a custom ",["$","code",null,{"children":"HeaderKey"}]," struct to enforce the validation) and the value is a ",["$","code",null,{"children":"HeaderValue"}]," struct. The ",["$","code",null,{"children":"HeaderValue"}]," struct consists of the ",[ [...]
+b:["$","p",null,{"children":["The primitive types are defined as the enum variants, so you can easily match on them. The ",["$","code",null,{"children":"HeaderKind"}]," enum is used to validate the value and to serialize/deserialize it. The idea is that the value will always remain a byte array, but you can use the ",["$","code",null,{"children":"HeaderKind"}]," to convert it to the desired type."]}]
+32:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+d:["$","p",null,{"children":["Next, let's take a look at the ",["$","code",null,{"children":"SendMessages"}]," command, and in particular we will see what has changed in the underlying ",["$","code",null,{"children":"Message"}]," struct (keep in mind that headers are unique per message, so they are not a part of the ",["$","code",null,{"children":"SendMessages"}]," command). The ",["$","code",null,{"children":"Message"}]," struct now has an additional ",["$","code",null,{"children":"head [...]
+34:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+f:["$","h3",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"json-transport","children":[["$","a",null,{"data-card":"","href":"#json-transport","className":"peer","children":"JSON transport"}],["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground [...]
+10:["$","p",null,{"children":["Headers are optional, so depending on the programming language, you can either use the ",["$","code",null,{"children":"option"}]," type, or the ",["$","code",null,{"children":"null"}]," value, or even instantiate an ",["$","code",null,{"children":"empty"}]," map - it's up to you. The important part is the serialization. For the JSON transport, it's very easy, as you can see in the following example:"]}]
+11:["$","$L31",null,{"className":"shiki shiki-themes github-light github-dark","style":{"--shiki-light":"#24292e","--shiki-dark":"#e1e4e8","--shiki-light-bg":"#fff","--shiki-dark-bg":"#24292e"},"tabIndex":"0","icon":"<svg viewBox=\"0 0 24 24\"><path d=\"M 6,1 C 4.354992,1 3,2.354992 3,4 v 16 c 0,1.645008 1.354992,3 3,3 h 12 c 1.645008,0 3,-1.354992 3,-3 V 8 7 A 1.0001,1.0001 0 0 0 20.707031,6.2929687 l -5,-5 A 1.0001,1.0001 0 0 0 15,1 h -1 z m 0,2 h 7 v 3 c 0,1.645008 1.354992,3 3,3 h 3 [...]
+12:["$","p",null,{"children":["Simply put, in order to include the headers in the message, you need to add the ",["$","code",null,{"children":"headers"}]," field to the message struct. The ",["$","code",null,{"children":"headers"}]," field is a map of the ",["$","code",null,{"children":"String"}]," keys and the ",["$","code",null,{"children":"HeaderValue"}]," values. The ",["$","code",null,{"children":"HeaderValue"}]," value is a JSON object which consists of the ",["$","code",null,{"chi [...]
+13:["$","h3",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"binary-transport","children":[["$","a",null,{"data-card":"","href":"#binary-transport","className":"peer","children":"Binary transport"}],["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-fore [...]
+14:["$","p",null,{"children":"Now, we can move on to the more complex part, being the binary transport (as always, it's the same schema for both, TCP and QUIC protocol)."}]
+15:["$","p",null,{"children":["We will begin with the headers serialization for the whole ",["$","code",null,{"children":"HashMap"}],":"]}]
+3e:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+17:["$","p",null,{"children":["If for some reason, there are no headers, we return an empty byte array. Otherwise, we iterate over the headers and serialize them one by one. The serialization shouldn't be too difficult as we start with the key length, then we add the key itself (",["$","strong",null,{"children":"UTF-8 bytes"}],"), then we add the value type (the ",["$","code",null,{"children":"HeaderKind"}]," enum variant), then we add the value length, and finally we add the value itsel [...]
+18:["$","p",null,{"children":["The length of the single header is the following: ",["$","code",null,{"children":"4 bytes"}]," for the key length, ",["$","code",null,{"children":"n bytes"}]," (",["$","strong",null,{"children":"1-255"}],") for the key, ",["$","code",null,{"children":"1 byte"}]," for the value kind, ",["$","code",null,{"children":"4 bytes"}]," for the value length and ",["$","code",null,{"children":"n bytes"}]," (",["$","strong",null,{"children":"1-255"}],") for the value i [...]
+19:["$","p",null,{"children":["The ",["$","code",null,{"children":"HeaderKind"}]," uses the following codes:"]}]
+40:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+1b:["$","h3",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"sending-the-messages-with-headers","children":[["$","a",null,{"data-card":"","href":"#sending-the-messages-with-headers","className":"peer","children":"Sending the messages with headers"}],["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"luci [...]
+1c:["$","p",null,{"children":"Now, let's see how we can include the headers in a message serialization:"}]
+42:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+1e:["$","p",null,{"children":["The important thing to notice, is that the ",["$","strong",null,{"children":["headers are being serialized right after the ",["$","code",null,{"children":"ID"}]," and before the actual message payload"]}],". At first, we add the total length of the headers' payload, then we add the headers themselves, and finally we include the message payload (length + value) as before. If the headers are not provided at all (e.g. ",["$","code",null,{"children":"none"}]," [...]
+1f:["$","h3",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"polling-the-messages-with-headers","children":[["$","a",null,{"data-card":"","href":"#polling-the-messages-with-headers","className":"peer","children":"Polling the messages with headers"}],["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"luci [...]
+20:["$","p",null,{"children":["Eventually, let's discuss the ",["$","code",null,{"children":"PollMessages"}]," command. Nothing has changed here, except of the extended ",["$","code",null,{"children":"Message"}]," struct, which now contains the optional headers. For the JSON transport it's the same as when sending the messages, and for the binary transport, we need to deserialize the headers in the same way as we did when sending the messages. Let's find out how it works."]}]
+44:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+22:["$","p",null,{"children":["As you can see, the headers are being serialized in the same way as when sending the messages. The only difference is that the ",["$","code",null,{"children":"Message"}]," struct also contains the ",["$","code",null,{"children":"offset"}]," and the ",["$","code",null,{"children":"timestamp"}]," fields, which are being serialized before the ",["$","code",null,{"children":"ID"}]," field. Besides that, nothing has changed, as we simply include the headers righ [...]
+23:["$","h3",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"sample-usage","children":[["$","a",null,{"data-card":"","href":"#sample-usage","className":"peer","children":"Sample usage"}],["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opaci [...]
+24:["$","p",null,{"children":["The headers usage is pretty straightforward, as we simply need to create the new ",["$","code",null,{"children":"HashMap"}],":"]}]
+46:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+26:["$","p",null,{"children":"You might also use the conversion based on the implemented traits:"}]
+48:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+28:["$","p",null,{"children":["Keep in mind, that the ",["$","code",null,{"children":"HeaderKey"}]," and the ",["$","code",null,{"children":"HeaderValue"}]," structs are being validated whenever you use one of the available methods to create them."]}]
+29:["$","p",null,{"children":["And then, we can send the messages with the headers (first ",["$","code",null,{"children":"none"}]," argument is for the optional ID):"]}]
+4a:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+2b:["$","p",null,{"children":"When you poll the messages and want to read the header value based on its kind, you can also use the existing helper methods, for example:"}]
+4c:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+2d:["$","footer",null,{"className":"mt-16 border-t border-fd-border pt-8","children":["$","$L4e",null,{"href":"/blogs","className":"inline-flex items-center gap-2 text-sm font-medium text-fd-primary transition-colors hover:opacity-80","children":"← Back to all posts"}]}]
+2e:["$","script","script-0",{"src":"/_next/static/chunks/00b00679782d0ffd.js","async":true}]
+2f:["$","script","script-1",{"src":"/_next/static/chunks/3562882a488c4fbb.js","async":true}]
+30:["$","$L4f",null,{"children":["$","$50",null,{"name":"Next.MetadataOutlet","children":"$@51"}]}]
+33:["$","$L36",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" HeaderKey"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8 [...]
+35:["$","$L36",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" SendMessages"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E [...]
+37:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"key_1\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": {"}]]}]
+38:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"kind\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": "}],["$","span",null,{"style":{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},"children":"\"string\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+39:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"value\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": "}],["$","span",null,{"style":{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},"children":"\"{{header_1_payload_base_64}}\""}]]}]
+3a:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" }"}]}]
+3b:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" }"}]}]
+3c:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" }]"}]}]
+3d:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"}"}]}]
+3f:["$","$L36",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"impl"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" BytesSerializable"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" for"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"# [...]
+41:["$","$L36",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"impl"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" HeaderKind"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" {"}]]}],"\n",["$","span",null,{"className":"line","children":[["$","span",null,{"sty [...]
+43:["$","$L36",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"fn"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" as_bytes"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"("}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"chil [...]
+45:["$","$L36",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" fn"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" map_message"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"} [...]
+47:["$","$L36",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"let"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" mut"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" headers "}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"}," [...]
+49:["$","$L36",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"headers"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"."}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"insert"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"ch [...]
+4b:["$","$L36",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"let"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" send_messages "}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"="}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0" [...]
+4d:["$","$L36",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"let"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" value1 "}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"="}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"chil [...]
+51:null
+52:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Int128"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+53:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Uint8"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+54:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Uint16"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+55:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Uint32"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+56:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Uint64"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+57:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Uint128"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+58:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Float32"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+59:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Float64"}]}]
+5a:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"}"}]}]
+5b:["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}]
+5c:["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Bytes"}]
+5d:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]
+5e:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" pub"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" headers"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Option"}],["$","span",null,{"style":{"--shiki-l [...]
+5f:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"}"}]}]
+60:["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"."}]
+61:["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":"0."}]
+62:["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"len"}]
+63:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"() "}]
+64:["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"as"}]
+65:["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" u32"}]
+66:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":");"}]
+67:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" bytes"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"."}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"extend"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"(key"}],["$","span",null,{"style":{"--sh [...]
+68:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" bytes"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"."}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"put_u8"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"(value"}],["$","span",null,{"style":{"-- [...]
+69:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" bytes"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"."}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"put_u32_le"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"(value"}],["$","span",null,{"style": [...]
+6a:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" bytes"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"."}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"extend"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"("}],["$","span",null,{"style":{"--shiki [...]
+6b:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" }"}]}]
+6c:["$","span",null,{"className":"line"}]
+6d:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" bytes"}]}]
+6e:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" }"}]}]
+6f:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"}"}]}]
+70:["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" 5"}]
+71:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]
+72:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" HeaderKind"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"::"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"Int32"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" =>"}],["$","span",null,{"style":{" [...]
+73:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" HeaderKind"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"::"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"Int64"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" =>"}],["$","span",null,{"style":{" [...]
+74:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" HeaderKind"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"::"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"Int128"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" =>"}],["$","span",null,{"style":{ [...]
+75:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" HeaderKind"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"::"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"Uint8"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" =>"}],["$","span",null,{"style":{" [...]
+76:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" HeaderKind"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"::"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"Uint16"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" =>"}],["$","span",null,{"style":{ [...]
+77:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" HeaderKind"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"::"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"Uint32"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" =>"}],["$","span",null,{"style":{ [...]
+78:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" HeaderKind"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"::"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"Uint64"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" =>"}],["$","span",null,{"style":{ [...]
+79:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" HeaderKind"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"::"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"Uint128"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" =>"}],["$","span",null,{"style": [...]
+7a:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" HeaderKind"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"::"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"Float32"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" =>"}],["$","span",null,{"style": [...]
+7b:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" HeaderKind"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"::"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"Float64"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" =>"}],["$","span",null,{"style": [...]
+7c:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" }"}]}]
+7d:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" }"}]}]
+7e:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"}"}]}]
+7f:["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"."}]
+80:["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"as_bytes"}]
+81:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"();"}]
+82:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" bytes"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"."}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"put_u32_le"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"(headers_bytes"}],["$","span",null,{"sty [...]
+83:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" bytes"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"."}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"extend"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"("}],["$","span",null,{"style":{"--shiki-lig [...]
+84:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" } "}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"else"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" {"}]]}]
+85:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" bytes"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"."}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"put_u32_le"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"("}],["$","span",null,{"style":{"--shiki [...]
+86:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" }"}]}]
+87:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" bytes"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"."}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"put_u32_le"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"("}],["$","span",null,{"style":{"--shiki-lig [...]
+88:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" bytes"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"."}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"extend"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"("}],["$","span",null,{"style":{"--shiki-light": [...]
+89:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" bytes"}]}]
+8a:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"}"}]}]
+8b:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" headers"}]
+8c:["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"."}]
+8d:["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"as_bytes"}]
+8e:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"();"}]
+8f:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" bytes"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"."}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"put_u32_le"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"(headers_bytes"}],["$","span",null,{"sty [...]
+90:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" bytes"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"."}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"extend"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"("}],["$","span",null,{"style":{"--shiki-lig [...]
+91:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" } "}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"else"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" {"}]]}]
+92:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" bytes"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"."}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"put_u32_le"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"("}],["$","span",null,{"style":{"--shiki [...]
+93:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" }"}]}]
+94:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" bytes"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"."}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"put_u32_le"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"("}],["$","span",null,{"style":{"--shiki-lig [...]
+95:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" bytes"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"."}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"extend"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"("}],["$","span",null,{"style":{"--shiki-light": [...]
+96:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"}"}]}]
+97:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"headers"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"."}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"insert"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"("}],["$","span",null,{"style":{"--shiki-light":"# [...]
+98:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":") , "}]
+99:["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"Some"}]
+9a:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"(headers))]"}]
+9b:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"};"}]}]
+9c:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"("}]
+9d:["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"&"}]
+9e:["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"HeaderKey"}]
+9f:["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"::"}]
+a0:["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"new"}]
+a1:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"("}]
+a2:["$","span",null,{"style":{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},"children":"\"key_3\""}]
+a3:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":")"}]
+a4:["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"?"}]
+a5:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":")"}]
+a6:["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"?."}]
+a7:["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"as_uint64"}]
+a8:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"()"}]
+a9:["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"?"}]
+aa:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":";"}]
diff --git a/blogs/2023/08/19/message-headers/__next.!KHNpdGUp.blogs.$c$slug.txt b/blogs/2023/08/19/message-headers/__next.!KHNpdGUp.blogs.$c$slug.txt
new file mode 100644
index 00000000..11b31bb0
--- /dev/null
+++ b/blogs/2023/08/19/message-headers/__next.!KHNpdGUp.blogs.$c$slug.txt
@@ -0,0 +1,4 @@
+1:"$Sreact.fragment"
+2:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+3:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","template":["$","$L3",null,{}]}]]}],"loading":null,"isPartial":false}
diff --git a/blogs/2023/08/19/message-headers/__next.!KHNpdGUp.blogs.txt b/blogs/2023/08/19/message-headers/__next.!KHNpdGUp.blogs.txt
new file mode 100644
index 00000000..11b31bb0
--- /dev/null
+++ b/blogs/2023/08/19/message-headers/__next.!KHNpdGUp.blogs.txt
@@ -0,0 +1,4 @@
+1:"$Sreact.fragment"
+2:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+3:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","template":["$","$L3",null,{}]}]]}],"loading":null,"isPartial":false}
diff --git a/blogs/2023/08/19/message-headers/__next.!KHNpdGUp.txt b/blogs/2023/08/19/message-headers/__next.!KHNpdGUp.txt
new file mode 100644
index 00000000..ea3bfa55
--- /dev/null
+++ b/blogs/2023/08/19/message-headers/__next.!KHNpdGUp.txt
@@ -0,0 +1,9 @@
+1:"$Sreact.fragment"
+2:I[83571,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Header"]
+3:I[29966,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFDropdown"]
+4:I[36330,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFMobileLinks"]
+5:I[22016,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],""]
+6:I[88760,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Logo"]
+7:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+8:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","c",{"children":[[["$","script","script-0",{"src":"/_next/static/chunks/8d86be78428a601a.js","async":true}],["$","script","script-1",{"src":"/_next/static/chunks/da34cc6305706ac6.js","async":true}],["$","script","script-2",{"src":"/_next/static/chunks/9baf65674e2de991.js","async":true}],["$","script","script-3",{"src":"/_next/static/chunks/26b70f9828dd1eb5.js","async":true}],["$","script","script-4",{"src":"/_next/static/chunks/adeed83 [...]
diff --git a/blogs/2023/08/19/message-headers/__next._full.txt b/blogs/2023/08/19/message-headers/__next._full.txt
new file mode 100644
index 00000000..18aa1ac1
--- /dev/null
+++ b/blogs/2023/08/19/message-headers/__next._full.txt
@@ -0,0 +1,182 @@
+1:"$Sreact.fragment"
+2:I[17751,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js"],"RootProvider"]
+3:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+4:I[58298,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/5a37d4cb1abe17d7.js"],"default"]
+5:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+6:I[83571,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Header"]
+7:I[29966,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFDropdown"]
+8:I[36330,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFMobileLinks"]
+9:I[22016,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],""]
+a:I[88760,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Logo"]
+11:I[68027,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+:HL["/_next/static/chunks/32a0415c8ab1bd26.css","style"]
+:HL["/_next/static/media/GeistMono_Variable.p.2f937313.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+:HL["/_next/static/media/Geist_Variable-s.p.92592eb2.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+0:{"P":null,"b":"uBHgltRE2s5QA49x61S_u","c":["","blogs","2023","08","19","message-headers",""],"q":"","i":false,"f":[[["",{"children":["(site)",{"children":["blogs",{"children":[["slug","2023/08/19/message-headers","c"],{"children":["__PAGE__",{}]}]}]}]},"$undefined","$undefined",true],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/32a0415c8ab1bd26.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","scri [...]
+13:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"OutletBoundary"]
+14:"$Sreact.suspense"
+16:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"ViewportBoundary"]
+18:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"MetadataBoundary"]
+b:["$","h1",null,{"className":"next-error-h1","style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:1:props:style","children":404}]
+c:["$","div",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:style","children":["$","h2",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style","children":"This page could not be found."}]}]
+d:["$","$1","c",{"children":[null,["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}]
+e:["$","$1","c",{"children":[null,["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}]
+f:["$","$1","c",{"children":["$L12",[["$","script","script-0",{"src":"/_next/static/chunks/00b00679782d0ffd.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/3562882a488c4fbb.js","async":true,"nonce":"$undefined"}]],["$","$L13",null,{"children":["$","$14",null,{"name":"Next.MetadataOutlet","children":"$@15"}]}]]}]
+10:["$","$1","h",{"children":[null,["$","$L16",null,{"children":"$L17"}],["$","div",null,{"hidden":true,"children":["$","$L18",null,{"children":["$","$14",null,{"name":"Next.Metadata","children":"$L19"}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}]
+1a:I[47873,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"default"]
+12:["$","main",null,{"className":"min-h-screen px-6 py-16 md:px-12","children":["$","article",null,{"className":"mx-auto max-w-5xl","children":[["$","header",null,{"className":"mb-10","children":[["$","time",null,{"className":"text-sm font-medium text-fd-muted-foreground","children":"August 19, 2023"}],["$","h1",null,{"className":"mt-3 text-3xl font-extrabold tracking-tight text-fd-foreground md:text-5xl","children":"Message headers"}],["$","p",null,{"className":"mt-4 text-base text-fd-m [...]
+46:I[44324,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"CodeBlock"]
+4b:I[44324,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"Pre"]
+1b:["$","strong",null,{"children":"key-value pairs"}]
+1c:["$","strong",null,{"children":"UTF-8 bytes"}]
+1d:["$","p",null,{"children":["Since the headers are optional, you can send a message without any headers at all. There's no limit on the number of headers you can send, but the total size of the headers is currently limited to ",["$","strong",null,{"children":"100 KB"}],". The header key is ",["$","strong",null,{"children":"case-sensitive"}],", so it's best to send the ",["$","strong",null,{"children":"lowercase"}]," keys. The maximum length of the key and the value is ",["$","strong",n [...]
+1e:["$","p",null,{"children":"For now, there are no reserved headers, so you can use any key you want. However, in the future, we might introduce some reserved headers used by the streaming server for the specific purposes such as the message compression, distributed tracing and so no."}]
+1f:["$","p",null,{"children":["The ",["$","strong",null,{"children":"sample applications"}]," using the message headers can be found ",["$","$L1a",null,{"href":"https://github.com/apache/iggy/tree/master/examples/rust/src/message-headers","children":"here"}],"."]}]
+20:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"implementation","children":[["$","a",null,{"data-card":"","href":"#implementation","className":"peer","children":"Implementation"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text- [...]
+21:["$","h3",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"structures","children":[["$","a",null,{"data-card":"","href":"#structures","className":"peer","children":"Structures"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-for [...]
+22:["$","p",null,{"children":["We will start with the sample Rust implementation of the headers. The headers are defined as a ",["$","code",null,{"children":"HashMap"}]," where the key is a ",["$","code",null,{"children":"string"}]," (wrapped with a custom ",["$","code",null,{"children":"HeaderKey"}]," struct to enforce the validation) and the value is a ",["$","code",null,{"children":"HeaderValue"}]," struct. The ",["$","code",null,{"children":"HeaderValue"}]," struct consists of the ", [...]
+23:["$","p",null,{"children":["The primitive types are defined as the enum variants, so you can easily match on them. The ",["$","code",null,{"children":"HeaderKind"}]," enum is used to validate the value and to serialize/deserialize it. The idea is that the value will always remain a byte array, but you can use the ",["$","code",null,{"children":"HeaderKind"}]," to convert it to the desired type."]}]
+47:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+25:["$","p",null,{"children":["Next, let's take a look at the ",["$","code",null,{"children":"SendMessages"}]," command, and in particular we will see what has changed in the underlying ",["$","code",null,{"children":"Message"}]," struct (keep in mind that headers are unique per message, so they are not a part of the ",["$","code",null,{"children":"SendMessages"}]," command). The ",["$","code",null,{"children":"Message"}]," struct now has an additional ",["$","code",null,{"children":"hea [...]
+49:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+27:["$","h3",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"json-transport","children":[["$","a",null,{"data-card":"","href":"#json-transport","className":"peer","children":"JSON transport"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text- [...]
+28:["$","p",null,{"children":["Headers are optional, so depending on the programming language, you can either use the ",["$","code",null,{"children":"option"}]," type, or the ",["$","code",null,{"children":"null"}]," value, or even instantiate an ",["$","code",null,{"children":"empty"}]," map - it's up to you. The important part is the serialization. For the JSON transport, it's very easy, as you can see in the following example:"]}]
+29:["$","$L46",null,{"className":"shiki shiki-themes github-light github-dark","style":{"--shiki-light":"#24292e","--shiki-dark":"#e1e4e8","--shiki-light-bg":"#fff","--shiki-dark-bg":"#24292e"},"tabIndex":"0","icon":"<svg viewBox=\"0 0 24 24\"><path d=\"M 6,1 C 4.354992,1 3,2.354992 3,4 v 16 c 0,1.645008 1.354992,3 3,3 h 12 c 1.645008,0 3,-1.354992 3,-3 V 8 7 A 1.0001,1.0001 0 0 0 20.707031,6.2929687 l -5,-5 A 1.0001,1.0001 0 0 0 15,1 h -1 z m 0,2 h 7 v 3 c 0,1.645008 1.354992,3 3,3 h 3 [...]
+2a:["$","p",null,{"children":["Simply put, in order to include the headers in the message, you need to add the ",["$","code",null,{"children":"headers"}]," field to the message struct. The ",["$","code",null,{"children":"headers"}]," field is a map of the ",["$","code",null,{"children":"String"}]," keys and the ",["$","code",null,{"children":"HeaderValue"}]," values. The ",["$","code",null,{"children":"HeaderValue"}]," value is a JSON object which consists of the ",["$","code",null,{"chi [...]
+2b:["$","h3",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"binary-transport","children":[["$","a",null,{"data-card":"","href":"#binary-transport","className":"peer","children":"Binary transport"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 [...]
+2c:["$","p",null,{"children":"Now, we can move on to the more complex part, being the binary transport (as always, it's the same schema for both, TCP and QUIC protocol)."}]
+2d:["$","p",null,{"children":["We will begin with the headers serialization for the whole ",["$","code",null,{"children":"HashMap"}],":"]}]
+53:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+2f:["$","p",null,{"children":["If for some reason, there are no headers, we return an empty byte array. Otherwise, we iterate over the headers and serialize them one by one. The serialization shouldn't be too difficult as we start with the key length, then we add the key itself (",["$","strong",null,{"children":"UTF-8 bytes"}],"), then we add the value type (the ",["$","code",null,{"children":"HeaderKind"}]," enum variant), then we add the value length, and finally we add the value itsel [...]
+30:["$","p",null,{"children":["The length of the single header is the following: ",["$","code",null,{"children":"4 bytes"}]," for the key length, ",["$","code",null,{"children":"n bytes"}]," (",["$","strong",null,{"children":"1-255"}],") for the key, ",["$","code",null,{"children":"1 byte"}]," for the value kind, ",["$","code",null,{"children":"4 bytes"}]," for the value length and ",["$","code",null,{"children":"n bytes"}]," (",["$","strong",null,{"children":"1-255"}],") for the value i [...]
+31:["$","p",null,{"children":["The ",["$","code",null,{"children":"HeaderKind"}]," uses the following codes:"]}]
+55:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+33:["$","h3",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"sending-the-messages-with-headers","children":[["$","a",null,{"data-card":"","href":"#sending-the-messages-with-headers","className":"peer","children":"Sending the messages with headers"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round [...]
+34:["$","p",null,{"children":"Now, let's see how we can include the headers in a message serialization:"}]
+57:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+36:["$","p",null,{"children":["The important thing to notice, is that the ",["$","strong",null,{"children":["headers are being serialized right after the ",["$","code",null,{"children":"ID"}]," and before the actual message payload"]}],". At first, we add the total length of the headers' payload, then we add the headers themselves, and finally we include the message payload (length + value) as before. If the headers are not provided at all (e.g. ",["$","code",null,{"children":"none"}]," [...]
+37:["$","h3",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"polling-the-messages-with-headers","children":[["$","a",null,{"data-card":"","href":"#polling-the-messages-with-headers","className":"peer","children":"Polling the messages with headers"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round [...]
+38:["$","p",null,{"children":["Eventually, let's discuss the ",["$","code",null,{"children":"PollMessages"}]," command. Nothing has changed here, except of the extended ",["$","code",null,{"children":"Message"}]," struct, which now contains the optional headers. For the JSON transport it's the same as when sending the messages, and for the binary transport, we need to deserialize the headers in the same way as we did when sending the messages. Let's find out how it works."]}]
+59:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+3a:["$","p",null,{"children":["As you can see, the headers are being serialized in the same way as when sending the messages. The only difference is that the ",["$","code",null,{"children":"Message"}]," struct also contains the ",["$","code",null,{"children":"offset"}]," and the ",["$","code",null,{"children":"timestamp"}]," fields, which are being serialized before the ",["$","code",null,{"children":"ID"}]," field. Besides that, nothing has changed, as we simply include the headers righ [...]
+3b:["$","h3",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"sample-usage","children":[["$","a",null,{"data-card":"","href":"#sample-usage","className":"peer","children":"Sample usage"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-mut [...]
+3c:["$","p",null,{"children":["The headers usage is pretty straightforward, as we simply need to create the new ",["$","code",null,{"children":"HashMap"}],":"]}]
+5b:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+3e:["$","p",null,{"children":"You might also use the conversion based on the implemented traits:"}]
+5d:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+40:["$","p",null,{"children":["Keep in mind, that the ",["$","code",null,{"children":"HeaderKey"}]," and the ",["$","code",null,{"children":"HeaderValue"}]," structs are being validated whenever you use one of the available methods to create them."]}]
+41:["$","p",null,{"children":["And then, we can send the messages with the headers (first ",["$","code",null,{"children":"none"}]," argument is for the optional ID):"]}]
+5f:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+43:["$","p",null,{"children":"When you poll the messages and want to read the header value based on its kind, you can also use the existing helper methods, for example:"}]
+61:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+45:["$","footer",null,{"className":"mt-16 border-t border-fd-border pt-8","children":["$","$L9",null,{"href":"/blogs","className":"inline-flex items-center gap-2 text-sm font-medium text-fd-primary transition-colors hover:opacity-80","children":"← Back to all posts"}]}]
+48:["$","$L4b",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" HeaderKey"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8 [...]
+4a:["$","$L4b",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" SendMessages"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E [...]
+4c:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"key_1\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": {"}]]}]
+4d:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"kind\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": "}],["$","span",null,{"style":{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},"children":"\"string\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+4e:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"value\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": "}],["$","span",null,{"style":{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},"children":"\"{{header_1_payload_base_64}}\""}]]}]
+4f:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" }"}]}]
+50:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" }"}]}]
+51:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" }]"}]}]
+52:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"}"}]}]
+54:["$","$L4b",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"impl"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" BytesSerializable"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" for"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"# [...]
+56:["$","$L4b",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"impl"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" HeaderKind"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" {"}]]}],"\n",["$","span",null,{"className":"line","children":[["$","span",null,{"sty [...]
+58:["$","$L4b",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"fn"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" as_bytes"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"("}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"chil [...]
+5a:["$","$L4b",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" fn"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" map_message"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"} [...]
+5c:["$","$L4b",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"let"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" mut"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" headers "}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"}," [...]
+5e:["$","$L4b",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"headers"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"."}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"insert"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"ch [...]
+60:["$","$L4b",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"let"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" send_messages "}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"="}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0" [...]
+62:["$","$L4b",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"let"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" value1 "}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"="}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"chil [...]
+63:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Int128"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+64:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Uint8"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+65:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Uint16"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+66:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Uint32"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+67:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Uint64"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+68:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Uint128"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+69:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Float32"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+6a:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Float64"}]}]
+6b:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"}"}]}]
+6c:["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}]
+6d:["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Bytes"}]
+6e:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]
+6f:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" pub"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" headers"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Option"}],["$","span",null,{"style":{"--shiki-l [...]
+70:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"}"}]}]
+71:["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"."}]
+72:["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":"0."}]
+73:["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"len"}]
+74:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"() "}]
+75:["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"as"}]
+76:["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" u32"}]
+77:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":");"}]
+78:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" bytes"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"."}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"extend"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"(key"}],["$","span",null,{"style":{"--sh [...]
+79:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" bytes"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"."}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"put_u8"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"(value"}],["$","span",null,{"style":{"-- [...]
+7a:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" bytes"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"."}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"put_u32_le"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"(value"}],["$","span",null,{"style": [...]
+7b:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" bytes"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"."}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"extend"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"("}],["$","span",null,{"style":{"--shiki [...]
+7c:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" }"}]}]
+7d:["$","span",null,{"className":"line"}]
+7e:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" bytes"}]}]
+7f:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" }"}]}]
+80:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"}"}]}]
+81:["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" 5"}]
+82:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]
+83:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" HeaderKind"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"::"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"Int32"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" =>"}],["$","span",null,{"style":{" [...]
+84:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" HeaderKind"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"::"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"Int64"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" =>"}],["$","span",null,{"style":{" [...]
+85:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" HeaderKind"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"::"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"Int128"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" =>"}],["$","span",null,{"style":{ [...]
+86:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" HeaderKind"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"::"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"Uint8"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" =>"}],["$","span",null,{"style":{" [...]
+87:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" HeaderKind"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"::"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"Uint16"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" =>"}],["$","span",null,{"style":{ [...]
+88:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" HeaderKind"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"::"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"Uint32"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" =>"}],["$","span",null,{"style":{ [...]
+89:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" HeaderKind"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"::"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"Uint64"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" =>"}],["$","span",null,{"style":{ [...]
+8a:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" HeaderKind"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"::"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"Uint128"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" =>"}],["$","span",null,{"style": [...]
+8b:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" HeaderKind"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"::"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"Float32"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" =>"}],["$","span",null,{"style": [...]
+8c:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" HeaderKind"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"::"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"Float64"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" =>"}],["$","span",null,{"style": [...]
+8d:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" }"}]}]
+8e:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" }"}]}]
+8f:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"}"}]}]
+90:["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"."}]
+91:["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"as_bytes"}]
+92:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"();"}]
+93:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" bytes"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"."}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"put_u32_le"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"(headers_bytes"}],["$","span",null,{"sty [...]
+94:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" bytes"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"."}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"extend"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"("}],["$","span",null,{"style":{"--shiki-lig [...]
+95:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" } "}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"else"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" {"}]]}]
+96:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" bytes"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"."}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"put_u32_le"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"("}],["$","span",null,{"style":{"--shiki [...]
+97:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" }"}]}]
+98:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" bytes"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"."}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"put_u32_le"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"("}],["$","span",null,{"style":{"--shiki-lig [...]
+99:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" bytes"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"."}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"extend"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"("}],["$","span",null,{"style":{"--shiki-light": [...]
+9a:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" bytes"}]}]
+9b:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"}"}]}]
+9c:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" headers"}]
+9d:["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"."}]
+9e:["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"as_bytes"}]
+9f:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"();"}]
+a0:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" bytes"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"."}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"put_u32_le"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"(headers_bytes"}],["$","span",null,{"sty [...]
+a1:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" bytes"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"."}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"extend"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"("}],["$","span",null,{"style":{"--shiki-lig [...]
+a2:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" } "}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"else"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" {"}]]}]
+a3:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" bytes"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"."}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"put_u32_le"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"("}],["$","span",null,{"style":{"--shiki [...]
+a4:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" }"}]}]
+a5:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" bytes"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"."}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"put_u32_le"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"("}],["$","span",null,{"style":{"--shiki-lig [...]
+a6:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" bytes"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"."}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"extend"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"("}],["$","span",null,{"style":{"--shiki-light": [...]
+a7:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"}"}]}]
+a8:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"headers"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"."}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"insert"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"("}],["$","span",null,{"style":{"--shiki-light":"# [...]
+a9:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":") , "}]
+aa:["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"Some"}]
+ab:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"(headers))]"}]
+ac:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"};"}]}]
+ad:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"("}]
+ae:["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"&"}]
+af:["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"HeaderKey"}]
+b0:["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"::"}]
+b1:["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"new"}]
+b2:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"("}]
+b3:["$","span",null,{"style":{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},"children":"\"key_3\""}]
+b4:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":")"}]
+b5:["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"?"}]
+b6:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":")"}]
+b7:["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"?."}]
+b8:["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"as_uint64"}]
+b9:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"()"}]
+ba:["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"?"}]
+bb:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":";"}]
+17:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
+bc:I[27201,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"IconMark"]
+15:null
+19:[["$","title","0",{"children":"Message headers | Apache Iggy"}],["$","link","1",{"rel":"icon","href":"/img/favicon.png"}],["$","$Lbc","2",{}]]
diff --git a/blogs/2023/08/19/message-headers/__next._head.txt b/blogs/2023/08/19/message-headers/__next._head.txt
new file mode 100644
index 00000000..77b6c889
--- /dev/null
+++ b/blogs/2023/08/19/message-headers/__next._head.txt
@@ -0,0 +1,6 @@
+1:"$Sreact.fragment"
+2:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"ViewportBoundary"]
+3:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"MetadataBoundary"]
+4:"$Sreact.suspense"
+5:I[27201,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"IconMark"]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","h",{"children":[null,["$","$L2",null,{"children":[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]}],["$","div",null,{"hidden":true,"children":["$","$L3",null,{"children":["$","$4",null,{"name":"Next.Metadata","children":[["$","title","0",{"children":"Message headers | Apache Iggy"}],["$","link","1",{"rel":"icon","href":"/img/favicon.png"}],["$","$L5","2",{}]]}] [...]
diff --git a/blogs/2023/08/19/message-headers/__next._index.txt b/blogs/2023/08/19/message-headers/__next._index.txt
new file mode 100644
index 00000000..fd02bd95
--- /dev/null
+++ b/blogs/2023/08/19/message-headers/__next._index.txt
@@ -0,0 +1,7 @@
+1:"$Sreact.fragment"
+2:I[17751,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js"],"RootProvider"]
+3:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+4:I[58298,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/5a37d4cb1abe17d7.js"],"default"]
+5:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+:HL["/_next/static/chunks/32a0415c8ab1bd26.css","style"]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/32a0415c8ab1bd26.css","precedence":"next"}],["$","script","script-0",{"src":"/_next/static/chunks/9ebd3a84bf60af84.js","async":true}],["$","script","script-1",{"src":"/_next/static/chunks/78b5f2e7b839e72f.js","async":true}]],["$","html",null,{"lang":"en","className":"geistsans_d5a4f12f-module__Ur3q_a__variable geistmono_157ca88a-module__iaM1Ya__variable" [...]
diff --git a/blogs/2023/08/19/message-headers/__next._tree.txt b/blogs/2023/08/19/message-headers/__next._tree.txt
new file mode 100644
index 00000000..5076a7af
--- /dev/null
+++ b/blogs/2023/08/19/message-headers/__next._tree.txt
@@ -0,0 +1,4 @@
+:HL["/_next/static/chunks/32a0415c8ab1bd26.css","style"]
+:HL["/_next/static/media/GeistMono_Variable.p.2f937313.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+:HL["/_next/static/media/Geist_Variable-s.p.92592eb2.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","tree":{"name":"","paramType":null,"paramKey":"","hasRuntimePrefetch":false,"slots":{"children":{"name":"(site)","paramType":null,"paramKey":"(site)","hasRuntimePrefetch":false,"slots":{"children":{"name":"blogs","paramType":null,"paramKey":"blogs","hasRuntimePrefetch":false,"slots":{"children":{"name":"slug","paramType":"c","paramKey":"2023/08/19/message-headers","hasRuntimePrefetch":false,"slots":{"children":{"name":"__PAGE__","paramType":null,"para [...]
diff --git a/blogs/2023/08/19/message-headers/index.html b/blogs/2023/08/19/message-headers/index.html
new file mode 100644
index 00000000..0badd060
--- /dev/null
+++ b/blogs/2023/08/19/message-headers/index.html
@@ -0,0 +1,172 @@
+<!DOCTYPE html><!--uBHgltRE2s5QA49x61S_u--><html lang="en" class="geistsans_d5a4f12f-module__Ur3q_a__variable geistmono_157ca88a-module__iaM1Ya__variable"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" href="/_next/static/media/GeistMono_Variable.p.2f937313.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="preload" href="/_next/static/media/Geist_Variable-s.p.92592eb2.woff2" as="font" crossorigin="" type=" [...]
+<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="breaking-changes"><a data-card="" href="#breaking-changes" class="peer">Breaking changes</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 [...]
+<p>The first draft of the message headers implementation starts with the initial commit <a href="https://github.com/apache/iggy/commit/bc1d0b369a268783bd329436aba3f6920aae478e" rel="noreferrer noopener" target="_blank">#bc1d0b3</a>. The breaking change to the streaming server has been introduced in the commit <a href="https://github.com/apache/iggy/commit/7c73bd3d9d59fb685cbaaca5901dec6cac43ddaf" rel="noreferrer noopener" target="_blank">#7c73bd3</a> - up until this point, the existing i [...]
+<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="introduction"><a data-card="" href="#introduction" class="peer">Introduction</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.5 [...]
+<p>Message headers are an <strong>optional</strong> part of the message which can be used to provide the additional metadata for the message (they are not a part of the message body. Similar to e.g. HTTP headers, you can think of them as a <strong>key-value pairs</strong>, or more precisely the dictionary or map. The headers consist of the key and the value, where the key is a string (<strong>UTF-8 bytes</strong>) and the value is a byte array.</p>
+<p>Since the headers are optional, you can send a message without any headers at all. There's no limit on the number of headers you can send, but the total size of the headers is currently limited to <strong>100 KB</strong>. The header key is <strong>case-sensitive</strong>, so it's best to send the <strong>lowercase</strong> keys. The maximum length of the key and the value is <strong>255 bytes</strong> (the maximum value of the <code>u8</code> type).</p>
+<p>For now, there are no reserved headers, so you can use any key you want. However, in the future, we might introduce some reserved headers used by the streaming server for the specific purposes such as the message compression, distributed tracing and so no.</p>
+<p>The <strong>sample applications</strong> using the message headers can be found <a href="https://github.com/apache/iggy/tree/master/examples/rust/src/message-headers" rel="noreferrer noopener" target="_blank">here</a>.</p>
+<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="implementation"><a data-card="" href="#implementation" class="peer">Implementation</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 [...]
+<h3 class="flex scroll-m-28 flex-row items-center gap-2" id="structures"><a data-card="" href="#structures" class="peer">Structures</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3 [...]
+<p>We will start with the sample Rust implementation of the headers. The headers are defined as a <code>HashMap</code> where the key is a <code>string</code> (wrapped with a custom <code>HeaderKey</code> struct to enforce the validation) and the value is a <code>HeaderValue</code> struct. The <code>HeaderValue</code> struct consists of the <code>HeaderKind</code> enum and the <code>Vec<u8></code> value. The <code>HeaderKind</code> enum defines the type of the value, which can be ei [...]
+<p>The primitive types are defined as the enum variants, so you can easily match on them. The <code>HeaderKind</code> enum is used to validate the value and to serialize/deserialize it. The idea is that the value will always remain a byte array, but you can use the <code>HeaderKind</code> to convert it to the desired type.</p>
+<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-3 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-c [...]
+<span class="line"></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">pub</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> struct</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> HeaderValue</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> kind</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> HeaderKind</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> value</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Vec</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"><</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">u8</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">></sp [...]
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
+<span class="line"></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">pub</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> enum</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> HeaderKind</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
+<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Raw</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> String</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Bool</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Int8</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Int16</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Int32</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Int64</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Int128</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Uint8</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Uint16</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Uint32</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Uint64</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Uint128</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Float32</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Float64</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre></div></figure>
+<p>Next, let's take a look at the <code>SendMessages</code> command, and in particular we will see what has changed in the underlying <code>Message</code> struct (keep in mind that headers are unique per message, so they are not a part of the <code>SendMessages</code> command). The <code>Message</code> struct now has an additional <code>headers</code> field, which is a <code>HashMap</code> of <code>HeaderKey</code> and <code>HeaderValue</code> structs:</p>
+<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-3 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-c [...]
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> stream_id</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Identifier</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> topic_id</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Identifier</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> partitioning</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Partitioning</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> messages</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Vec</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"><</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">Message</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> [...]
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
+<span class="line"></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">pub</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> struct</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Message</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> id</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> u128</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> length</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> u32</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> payload</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Bytes</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> headers</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Option</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"><</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">HashMap</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8 [...]
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre></div></figure>
+<h3 class="flex scroll-m-28 flex-row items-center gap-2" id="json-transport"><a data-card="" href="#json-transport" class="peer">JSON transport</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 [...]
+<p>Headers are optional, so depending on the programming language, you can either use the <code>option</code> type, or the <code>null</code> value, or even instantiate an <code>empty</code> map - it's up to you. The important part is the serialization. For the JSON transport, it's very easy, as you can see in the following example:</p>
+<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-3 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-c [...]
+<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> "partitioning"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: {</span></span>
+<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> "kind"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"partition_id"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> "value"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"{{partition_id_payload_base64}}"</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> },</span></span>
+<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> "messages"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: [{</span></span>
+<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> "id"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> "payload"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"{{message_1_payload_base64}}"</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> }, {</span></span>
+<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> "id"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> "payload"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"{{message_2_payload_base64}}"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> "headers"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: {</span></span>
+<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> "key_1"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: {</span></span>
+<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> "kind"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"string"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> "value"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"{{header_1_payload_base_64}}"</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> }</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> }</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> }]</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre></div></figure>
+<p>Simply put, in order to include the headers in the message, you need to add the <code>headers</code> field to the message struct. The <code>headers</code> field is a map of the <code>String</code> keys and the <code>HeaderValue</code> values. The <code>HeaderValue</code> value is a JSON object which consists of the <code>kind</code> and the <code>value</code> fields. The <code>kind</code> field is a string which defines the type of the value, and the <code>value</code> field is a base [...]
+<h3 class="flex scroll-m-28 flex-row items-center gap-2" id="binary-transport"><a data-card="" href="#binary-transport" class="peer">Binary transport</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 [...]
+<p>Now, we can move on to the more complex part, being the binary transport (as always, it's the same schema for both, TCP and QUIC protocol).</p>
+<p>We will begin with the headers serialization for the whole <code>HashMap</code>:</p>
+<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-3 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-c [...]
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> fn</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> as_bytes</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">self</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-> [...]
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> if</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> self</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">is_empty</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">() {</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> return</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> EMPTY_BYTES</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> }</span></span>
+<span class="line"></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> let</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> mut</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> bytes </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> vec!</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">[];</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> for</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (key, value) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">in</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> self</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> bytes</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">put_u32_le</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(key</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">.</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">0.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F [...]
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> bytes</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">extend</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(key</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">.</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">0.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">a [...]
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> bytes</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">put_u8</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(value</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">.</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">kind</span><span style="--shiki-light:#D73A49;--shiki-dark:#F9758 [...]
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> bytes</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">put_u32_le</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(value</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">.</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">value</span><span style="--shiki-light:#D73A49;--shiki-dark:# [...]
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> bytes</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">extend</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">value</span><span style="--shiki-light:#D73A49;--shiki-dark:#F9758 [...]
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> }</span></span>
+<span class="line"></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> bytes</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> }</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre></div></figure>
+<p>If for some reason, there are no headers, we return an empty byte array. Otherwise, we iterate over the headers and serialize them one by one. The serialization shouldn't be too difficult as we start with the key length, then we add the key itself (<strong>UTF-8 bytes</strong>), then we add the value type (the <code>HeaderKind</code> enum variant), then we add the value length, and finally we add the value itself (<strong>UTF-8 bytes</strong>).</p>
+<p>The length of the single header is the following: <code>4 bytes</code> for the key length, <code>n bytes</code> (<strong>1-255</strong>) for the key, <code>1 byte</code> for the value kind, <code>4 bytes</code> for the value length and <code>n bytes</code> (<strong>1-255</strong>) for the value itself.</p>
+<p>The <code>HeaderKind</code> uses the following codes:</p>
+<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-3 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-c [...]
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> fn</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> as_code</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">self</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) </ [...]
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> match</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> self</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
+<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> HeaderKind</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">::</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">Raw</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =></span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> HeaderKind</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">::</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">String</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =></span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 2</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> HeaderKind</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">::</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">Bool</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =></span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 3</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> HeaderKind</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">::</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">Int8</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =></span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 4</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> HeaderKind</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">::</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">Int16</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =></span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 5</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> HeaderKind</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">::</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">Int32</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =></span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 6</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> HeaderKind</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">::</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">Int64</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =></span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 7</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> HeaderKind</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">::</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">Int128</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =></span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 8</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> HeaderKind</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">::</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">Uint8</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =></span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 9</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> HeaderKind</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">::</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">Uint16</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =></span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 10</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> HeaderKind</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">::</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">Uint32</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =></span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 11</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> HeaderKind</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">::</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">Uint64</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =></span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 12</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> HeaderKind</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">::</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">Uint128</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =></span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 13</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> HeaderKind</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">::</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">Float32</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =></span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 14</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> HeaderKind</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">::</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">Float64</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =></span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 15</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> }</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> }</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre></div></figure>
+<h3 class="flex scroll-m-28 flex-row items-center gap-2" id="sending-the-messages-with-headers"><a data-card="" href="#sending-the-messages-with-headers" class="peer">Sending the messages with headers</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hove [...]
+<p>Now, let's see how we can include the headers in a message serialization:</p>
+<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-3 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-c [...]
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> let</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> mut</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> bytes </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Vec</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">::</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">with_ca [...]
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> bytes</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">put_u128_le</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">self</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">.</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">id);< [...]
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> if</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> let</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Some</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(headers) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> &</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> [...]
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> let</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> headers_bytes </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> headers</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">as_bytes</span><span style="--shiki-light:#24292E;--shiki-da [...]
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> bytes</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">put_u32_le</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(headers_bytes</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">len</span><span style="--shiki-light:#24292E;--shiki-dark [...]
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> bytes</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">extend</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">headers_bytes);</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">else</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> bytes</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">put_u32_le</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">);</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> }</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> bytes</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">put_u32_le</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">self</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">.</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">length [...]
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> bytes</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">extend</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">self</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">.</spa [...]
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> bytes</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre></div></figure>
+<p>The important thing to notice, is that the <strong>headers are being serialized right after the <code>ID</code> and before the actual message payload</strong>. At first, we add the total length of the headers' payload, then we add the headers themselves, and finally we include the message payload (length + value) as before. If the headers are not provided at all (e.g. <code>none</code> or <code>null</code> or an <code>empty</code> array), we add the <code>0</code> value as the he [...]
+<h3 class="flex scroll-m-28 flex-row items-center gap-2" id="polling-the-messages-with-headers"><a data-card="" href="#polling-the-messages-with-headers" class="peer">Polling the messages with headers</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hove [...]
+<p>Eventually, let's discuss the <code>PollMessages</code> command. Nothing has changed here, except of the extended <code>Message</code> struct, which now contains the optional headers. For the JSON transport it's the same as when sending the messages, and for the binary transport, we need to deserialize the headers in the same way as we did when sending the messages. Let's find out how it works.</p>
+<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-3 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-c [...]
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> bytes</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">put_u64_le</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">self</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">.</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">offset [...]
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> bytes</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">put_u64_le</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">self</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">.</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">timest [...]
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> bytes</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">put_u128_le</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">self</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">.</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">id);< [...]
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> if</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> let</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Some</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(headers) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> &</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> [...]
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> let</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> headers_bytes </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> headers</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">as_bytes</span><span style="--shiki-light:#24292E;--shiki-da [...]
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> bytes</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">put_u32_le</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(headers_bytes</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">len</span><span style="--shiki-light:#24292E;--shiki-dark [...]
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> bytes</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">extend</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">headers_bytes);</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">else</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> bytes</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">put_u32_le</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">0</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">u32</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">);< [...]
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> }</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> bytes</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">put_u32_le</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">self</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">.</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">length [...]
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> bytes</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">extend</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">self</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">.</spa [...]
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre></div></figure>
+<p>As you can see, the headers are being serialized in the same way as when sending the messages. The only difference is that the <code>Message</code> struct also contains the <code>offset</code> and the <code>timestamp</code> fields, which are being serialized before the <code>ID</code> field. Besides that, nothing has changed, as we simply include the headers right after the <code>ID</code> field and before the actual message payload.</p>
+<h3 class="flex scroll-m-28 flex-row items-center gap-2" id="sample-usage"><a data-card="" href="#sample-usage" class="peer">Sample usage</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.5 [...]
+<p>The headers usage is pretty straightforward, as we simply need to create the new <code>HashMap</code>:</p>
+<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-3 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-c [...]
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">headers</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">insert</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">HeaderKey</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">::</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">new</s [...]
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">headers</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">insert</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">HeaderKey</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">::</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">new</s [...]
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">headers</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">insert</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">HeaderKey</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">::</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">new</s [...]
+<p>You might also use the conversion based on the implemented traits:</p>
+<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-3 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-c [...]
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">let</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> value </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> headers</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">get</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span>< [...]
+<p>Keep in mind, that the <code>HeaderKey</code> and the <code>HeaderValue</code> structs are being validated whenever you use one of the available methods to create them.</p>
+<p>And then, we can send the messages with the headers (first <code>none</code> argument is for the optional ID):</p>
+<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-3 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-c [...]
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> stream_id</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Identifier</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">::</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">numeric</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8F [...]
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> topic_id</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Identifier</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">::</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">named</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> [...]
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> partitioning</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Partitioning</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">::</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">balanced</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(),</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> messages</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> vec!</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">[</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">Message</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">::</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">new< [...]
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">};</span></span></code></pre></div></figure>
+<p>When you poll the messages and want to read the header value based on its kind, you can also use the existing helper methods, for example:</p>
+<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-3 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-c [...]
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">let</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> value2 </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> headers</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">get</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span> [...]
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">let</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> value3 </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> headers</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">get</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span> [...]
\ No newline at end of file
diff --git a/blogs/2023/08/19/message-headers/index.txt b/blogs/2023/08/19/message-headers/index.txt
new file mode 100644
index 00000000..18aa1ac1
--- /dev/null
+++ b/blogs/2023/08/19/message-headers/index.txt
@@ -0,0 +1,182 @@
+1:"$Sreact.fragment"
+2:I[17751,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js"],"RootProvider"]
+3:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+4:I[58298,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/5a37d4cb1abe17d7.js"],"default"]
+5:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+6:I[83571,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Header"]
+7:I[29966,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFDropdown"]
+8:I[36330,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFMobileLinks"]
+9:I[22016,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],""]
+a:I[88760,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Logo"]
+11:I[68027,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+:HL["/_next/static/chunks/32a0415c8ab1bd26.css","style"]
+:HL["/_next/static/media/GeistMono_Variable.p.2f937313.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+:HL["/_next/static/media/Geist_Variable-s.p.92592eb2.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+0:{"P":null,"b":"uBHgltRE2s5QA49x61S_u","c":["","blogs","2023","08","19","message-headers",""],"q":"","i":false,"f":[[["",{"children":["(site)",{"children":["blogs",{"children":[["slug","2023/08/19/message-headers","c"],{"children":["__PAGE__",{}]}]}]}]},"$undefined","$undefined",true],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/32a0415c8ab1bd26.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","scri [...]
+13:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"OutletBoundary"]
+14:"$Sreact.suspense"
+16:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"ViewportBoundary"]
+18:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"MetadataBoundary"]
+b:["$","h1",null,{"className":"next-error-h1","style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:1:props:style","children":404}]
+c:["$","div",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:style","children":["$","h2",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style","children":"This page could not be found."}]}]
+d:["$","$1","c",{"children":[null,["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}]
+e:["$","$1","c",{"children":[null,["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}]
+f:["$","$1","c",{"children":["$L12",[["$","script","script-0",{"src":"/_next/static/chunks/00b00679782d0ffd.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/3562882a488c4fbb.js","async":true,"nonce":"$undefined"}]],["$","$L13",null,{"children":["$","$14",null,{"name":"Next.MetadataOutlet","children":"$@15"}]}]]}]
+10:["$","$1","h",{"children":[null,["$","$L16",null,{"children":"$L17"}],["$","div",null,{"hidden":true,"children":["$","$L18",null,{"children":["$","$14",null,{"name":"Next.Metadata","children":"$L19"}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}]
+1a:I[47873,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"default"]
+12:["$","main",null,{"className":"min-h-screen px-6 py-16 md:px-12","children":["$","article",null,{"className":"mx-auto max-w-5xl","children":[["$","header",null,{"className":"mb-10","children":[["$","time",null,{"className":"text-sm font-medium text-fd-muted-foreground","children":"August 19, 2023"}],["$","h1",null,{"className":"mt-3 text-3xl font-extrabold tracking-tight text-fd-foreground md:text-5xl","children":"Message headers"}],["$","p",null,{"className":"mt-4 text-base text-fd-m [...]
+46:I[44324,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"CodeBlock"]
+4b:I[44324,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"Pre"]
+1b:["$","strong",null,{"children":"key-value pairs"}]
+1c:["$","strong",null,{"children":"UTF-8 bytes"}]
+1d:["$","p",null,{"children":["Since the headers are optional, you can send a message without any headers at all. There's no limit on the number of headers you can send, but the total size of the headers is currently limited to ",["$","strong",null,{"children":"100 KB"}],". The header key is ",["$","strong",null,{"children":"case-sensitive"}],", so it's best to send the ",["$","strong",null,{"children":"lowercase"}]," keys. The maximum length of the key and the value is ",["$","strong",n [...]
+1e:["$","p",null,{"children":"For now, there are no reserved headers, so you can use any key you want. However, in the future, we might introduce some reserved headers used by the streaming server for the specific purposes such as the message compression, distributed tracing and so no."}]
+1f:["$","p",null,{"children":["The ",["$","strong",null,{"children":"sample applications"}]," using the message headers can be found ",["$","$L1a",null,{"href":"https://github.com/apache/iggy/tree/master/examples/rust/src/message-headers","children":"here"}],"."]}]
+20:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"implementation","children":[["$","a",null,{"data-card":"","href":"#implementation","className":"peer","children":"Implementation"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text- [...]
+21:["$","h3",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"structures","children":[["$","a",null,{"data-card":"","href":"#structures","className":"peer","children":"Structures"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-for [...]
+22:["$","p",null,{"children":["We will start with the sample Rust implementation of the headers. The headers are defined as a ",["$","code",null,{"children":"HashMap"}]," where the key is a ",["$","code",null,{"children":"string"}]," (wrapped with a custom ",["$","code",null,{"children":"HeaderKey"}]," struct to enforce the validation) and the value is a ",["$","code",null,{"children":"HeaderValue"}]," struct. The ",["$","code",null,{"children":"HeaderValue"}]," struct consists of the ", [...]
+23:["$","p",null,{"children":["The primitive types are defined as the enum variants, so you can easily match on them. The ",["$","code",null,{"children":"HeaderKind"}]," enum is used to validate the value and to serialize/deserialize it. The idea is that the value will always remain a byte array, but you can use the ",["$","code",null,{"children":"HeaderKind"}]," to convert it to the desired type."]}]
+47:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+25:["$","p",null,{"children":["Next, let's take a look at the ",["$","code",null,{"children":"SendMessages"}]," command, and in particular we will see what has changed in the underlying ",["$","code",null,{"children":"Message"}]," struct (keep in mind that headers are unique per message, so they are not a part of the ",["$","code",null,{"children":"SendMessages"}]," command). The ",["$","code",null,{"children":"Message"}]," struct now has an additional ",["$","code",null,{"children":"hea [...]
+49:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+27:["$","h3",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"json-transport","children":[["$","a",null,{"data-card":"","href":"#json-transport","className":"peer","children":"JSON transport"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text- [...]
+28:["$","p",null,{"children":["Headers are optional, so depending on the programming language, you can either use the ",["$","code",null,{"children":"option"}]," type, or the ",["$","code",null,{"children":"null"}]," value, or even instantiate an ",["$","code",null,{"children":"empty"}]," map - it's up to you. The important part is the serialization. For the JSON transport, it's very easy, as you can see in the following example:"]}]
+29:["$","$L46",null,{"className":"shiki shiki-themes github-light github-dark","style":{"--shiki-light":"#24292e","--shiki-dark":"#e1e4e8","--shiki-light-bg":"#fff","--shiki-dark-bg":"#24292e"},"tabIndex":"0","icon":"<svg viewBox=\"0 0 24 24\"><path d=\"M 6,1 C 4.354992,1 3,2.354992 3,4 v 16 c 0,1.645008 1.354992,3 3,3 h 12 c 1.645008,0 3,-1.354992 3,-3 V 8 7 A 1.0001,1.0001 0 0 0 20.707031,6.2929687 l -5,-5 A 1.0001,1.0001 0 0 0 15,1 h -1 z m 0,2 h 7 v 3 c 0,1.645008 1.354992,3 3,3 h 3 [...]
+2a:["$","p",null,{"children":["Simply put, in order to include the headers in the message, you need to add the ",["$","code",null,{"children":"headers"}]," field to the message struct. The ",["$","code",null,{"children":"headers"}]," field is a map of the ",["$","code",null,{"children":"String"}]," keys and the ",["$","code",null,{"children":"HeaderValue"}]," values. The ",["$","code",null,{"children":"HeaderValue"}]," value is a JSON object which consists of the ",["$","code",null,{"chi [...]
+2b:["$","h3",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"binary-transport","children":[["$","a",null,{"data-card":"","href":"#binary-transport","className":"peer","children":"Binary transport"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 [...]
+2c:["$","p",null,{"children":"Now, we can move on to the more complex part, being the binary transport (as always, it's the same schema for both, TCP and QUIC protocol)."}]
+2d:["$","p",null,{"children":["We will begin with the headers serialization for the whole ",["$","code",null,{"children":"HashMap"}],":"]}]
+53:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+2f:["$","p",null,{"children":["If for some reason, there are no headers, we return an empty byte array. Otherwise, we iterate over the headers and serialize them one by one. The serialization shouldn't be too difficult as we start with the key length, then we add the key itself (",["$","strong",null,{"children":"UTF-8 bytes"}],"), then we add the value type (the ",["$","code",null,{"children":"HeaderKind"}]," enum variant), then we add the value length, and finally we add the value itsel [...]
+30:["$","p",null,{"children":["The length of the single header is the following: ",["$","code",null,{"children":"4 bytes"}]," for the key length, ",["$","code",null,{"children":"n bytes"}]," (",["$","strong",null,{"children":"1-255"}],") for the key, ",["$","code",null,{"children":"1 byte"}]," for the value kind, ",["$","code",null,{"children":"4 bytes"}]," for the value length and ",["$","code",null,{"children":"n bytes"}]," (",["$","strong",null,{"children":"1-255"}],") for the value i [...]
+31:["$","p",null,{"children":["The ",["$","code",null,{"children":"HeaderKind"}]," uses the following codes:"]}]
+55:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+33:["$","h3",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"sending-the-messages-with-headers","children":[["$","a",null,{"data-card":"","href":"#sending-the-messages-with-headers","className":"peer","children":"Sending the messages with headers"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round [...]
+34:["$","p",null,{"children":"Now, let's see how we can include the headers in a message serialization:"}]
+57:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+36:["$","p",null,{"children":["The important thing to notice, is that the ",["$","strong",null,{"children":["headers are being serialized right after the ",["$","code",null,{"children":"ID"}]," and before the actual message payload"]}],". At first, we add the total length of the headers' payload, then we add the headers themselves, and finally we include the message payload (length + value) as before. If the headers are not provided at all (e.g. ",["$","code",null,{"children":"none"}]," [...]
+37:["$","h3",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"polling-the-messages-with-headers","children":[["$","a",null,{"data-card":"","href":"#polling-the-messages-with-headers","className":"peer","children":"Polling the messages with headers"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round [...]
+38:["$","p",null,{"children":["Eventually, let's discuss the ",["$","code",null,{"children":"PollMessages"}]," command. Nothing has changed here, except of the extended ",["$","code",null,{"children":"Message"}]," struct, which now contains the optional headers. For the JSON transport it's the same as when sending the messages, and for the binary transport, we need to deserialize the headers in the same way as we did when sending the messages. Let's find out how it works."]}]
+59:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+3a:["$","p",null,{"children":["As you can see, the headers are being serialized in the same way as when sending the messages. The only difference is that the ",["$","code",null,{"children":"Message"}]," struct also contains the ",["$","code",null,{"children":"offset"}]," and the ",["$","code",null,{"children":"timestamp"}]," fields, which are being serialized before the ",["$","code",null,{"children":"ID"}]," field. Besides that, nothing has changed, as we simply include the headers righ [...]
+3b:["$","h3",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"sample-usage","children":[["$","a",null,{"data-card":"","href":"#sample-usage","className":"peer","children":"Sample usage"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-mut [...]
+3c:["$","p",null,{"children":["The headers usage is pretty straightforward, as we simply need to create the new ",["$","code",null,{"children":"HashMap"}],":"]}]
+5b:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+3e:["$","p",null,{"children":"You might also use the conversion based on the implemented traits:"}]
+5d:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+40:["$","p",null,{"children":["Keep in mind, that the ",["$","code",null,{"children":"HeaderKey"}]," and the ",["$","code",null,{"children":"HeaderValue"}]," structs are being validated whenever you use one of the available methods to create them."]}]
+41:["$","p",null,{"children":["And then, we can send the messages with the headers (first ",["$","code",null,{"children":"none"}]," argument is for the optional ID):"]}]
+5f:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+43:["$","p",null,{"children":"When you poll the messages and want to read the header value based on its kind, you can also use the existing helper methods, for example:"}]
+61:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+45:["$","footer",null,{"className":"mt-16 border-t border-fd-border pt-8","children":["$","$L9",null,{"href":"/blogs","className":"inline-flex items-center gap-2 text-sm font-medium text-fd-primary transition-colors hover:opacity-80","children":"← Back to all posts"}]}]
+48:["$","$L4b",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" HeaderKey"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8 [...]
+4a:["$","$L4b",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" SendMessages"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E [...]
+4c:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"key_1\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": {"}]]}]
+4d:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"kind\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": "}],["$","span",null,{"style":{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},"children":"\"string\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+4e:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"value\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": "}],["$","span",null,{"style":{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},"children":"\"{{header_1_payload_base_64}}\""}]]}]
+4f:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" }"}]}]
+50:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" }"}]}]
+51:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" }]"}]}]
+52:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"}"}]}]
+54:["$","$L4b",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"impl"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" BytesSerializable"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" for"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"# [...]
+56:["$","$L4b",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"impl"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" HeaderKind"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" {"}]]}],"\n",["$","span",null,{"className":"line","children":[["$","span",null,{"sty [...]
+58:["$","$L4b",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"fn"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" as_bytes"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"("}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"chil [...]
+5a:["$","$L4b",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" fn"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" map_message"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"} [...]
+5c:["$","$L4b",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"let"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" mut"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" headers "}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"}," [...]
+5e:["$","$L4b",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"headers"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"."}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"insert"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"ch [...]
+60:["$","$L4b",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"let"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" send_messages "}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"="}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0" [...]
+62:["$","$L4b",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"let"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" value1 "}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"="}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"chil [...]
+63:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Int128"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+64:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Uint8"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+65:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Uint16"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+66:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Uint32"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+67:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Uint64"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+68:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Uint128"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+69:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Float32"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+6a:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Float64"}]}]
+6b:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"}"}]}]
+6c:["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}]
+6d:["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Bytes"}]
+6e:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]
+6f:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" pub"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" headers"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Option"}],["$","span",null,{"style":{"--shiki-l [...]
+70:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"}"}]}]
+71:["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"."}]
+72:["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":"0."}]
+73:["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"len"}]
+74:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"() "}]
+75:["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"as"}]
+76:["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" u32"}]
+77:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":");"}]
+78:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" bytes"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"."}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"extend"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"(key"}],["$","span",null,{"style":{"--sh [...]
+79:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" bytes"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"."}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"put_u8"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"(value"}],["$","span",null,{"style":{"-- [...]
+7a:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" bytes"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"."}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"put_u32_le"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"(value"}],["$","span",null,{"style": [...]
+7b:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" bytes"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"."}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"extend"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"("}],["$","span",null,{"style":{"--shiki [...]
+7c:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" }"}]}]
+7d:["$","span",null,{"className":"line"}]
+7e:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" bytes"}]}]
+7f:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" }"}]}]
+80:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"}"}]}]
+81:["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" 5"}]
+82:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]
+83:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" HeaderKind"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"::"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"Int32"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" =>"}],["$","span",null,{"style":{" [...]
+84:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" HeaderKind"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"::"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"Int64"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" =>"}],["$","span",null,{"style":{" [...]
+85:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" HeaderKind"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"::"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"Int128"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" =>"}],["$","span",null,{"style":{ [...]
+86:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" HeaderKind"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"::"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"Uint8"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" =>"}],["$","span",null,{"style":{" [...]
+87:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" HeaderKind"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"::"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"Uint16"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" =>"}],["$","span",null,{"style":{ [...]
+88:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" HeaderKind"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"::"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"Uint32"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" =>"}],["$","span",null,{"style":{ [...]
+89:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" HeaderKind"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"::"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"Uint64"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" =>"}],["$","span",null,{"style":{ [...]
+8a:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" HeaderKind"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"::"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"Uint128"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" =>"}],["$","span",null,{"style": [...]
+8b:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" HeaderKind"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"::"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"Float32"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" =>"}],["$","span",null,{"style": [...]
+8c:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" HeaderKind"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"::"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"Float64"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" =>"}],["$","span",null,{"style": [...]
+8d:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" }"}]}]
+8e:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" }"}]}]
+8f:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"}"}]}]
+90:["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"."}]
+91:["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"as_bytes"}]
+92:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"();"}]
+93:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" bytes"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"."}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"put_u32_le"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"(headers_bytes"}],["$","span",null,{"sty [...]
+94:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" bytes"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"."}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"extend"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"("}],["$","span",null,{"style":{"--shiki-lig [...]
+95:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" } "}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"else"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" {"}]]}]
+96:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" bytes"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"."}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"put_u32_le"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"("}],["$","span",null,{"style":{"--shiki [...]
+97:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" }"}]}]
+98:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" bytes"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"."}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"put_u32_le"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"("}],["$","span",null,{"style":{"--shiki-lig [...]
+99:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" bytes"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"."}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"extend"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"("}],["$","span",null,{"style":{"--shiki-light": [...]
+9a:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" bytes"}]}]
+9b:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"}"}]}]
+9c:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" headers"}]
+9d:["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"."}]
+9e:["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"as_bytes"}]
+9f:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"();"}]
+a0:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" bytes"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"."}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"put_u32_le"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"(headers_bytes"}],["$","span",null,{"sty [...]
+a1:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" bytes"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"."}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"extend"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"("}],["$","span",null,{"style":{"--shiki-lig [...]
+a2:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" } "}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"else"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" {"}]]}]
+a3:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" bytes"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"."}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"put_u32_le"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"("}],["$","span",null,{"style":{"--shiki [...]
+a4:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" }"}]}]
+a5:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" bytes"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"."}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"put_u32_le"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"("}],["$","span",null,{"style":{"--shiki-lig [...]
+a6:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" bytes"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"."}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"extend"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"("}],["$","span",null,{"style":{"--shiki-light": [...]
+a7:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"}"}]}]
+a8:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"headers"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"."}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"insert"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"("}],["$","span",null,{"style":{"--shiki-light":"# [...]
+a9:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":") , "}]
+aa:["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"Some"}]
+ab:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"(headers))]"}]
+ac:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"};"}]}]
+ad:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"("}]
+ae:["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"&"}]
+af:["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"HeaderKey"}]
+b0:["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"::"}]
+b1:["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"new"}]
+b2:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"("}]
+b3:["$","span",null,{"style":{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},"children":"\"key_3\""}]
+b4:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":")"}]
+b5:["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"?"}]
+b6:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":")"}]
+b7:["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"?."}]
+b8:["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"as_uint64"}]
+b9:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"()"}]
+ba:["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"?"}]
+bb:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":";"}]
+17:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
+bc:I[27201,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"IconMark"]
+15:null
+19:[["$","title","0",{"children":"Message headers | Apache Iggy"}],["$","link","1",{"rel":"icon","href":"/img/favicon.png"}],["$","$Lbc","2",{}]]
diff --git a/blogs/2023/08/22/message-state/__next.!KHNpdGUp.blogs.$c$slug.__PAGE__.txt b/blogs/2023/08/22/message-state/__next.!KHNpdGUp.blogs.$c$slug.__PAGE__.txt
new file mode 100644
index 00000000..1c65adf1
--- /dev/null
+++ b/blogs/2023/08/22/message-state/__next.!KHNpdGUp.blogs.$c$slug.__PAGE__.txt
@@ -0,0 +1,81 @@
+1:"$Sreact.fragment"
+2:I[47873,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"default"]
+1c:I[44324,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"CodeBlock"]
+1f:I[44324,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"Pre"]
+3a:I[22016,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],""]
+3b:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"OutletBoundary"]
+3c:"$Sreact.suspense"
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","c",{"children":[["$","main",null,{"className":"min-h-screen px-6 py-16 md:px-12","children":["$","article",null,{"className":"mx-auto max-w-5xl","children":[["$","header",null,{"className":"mb-10","children":[["$","time",null,{"className":"text-sm font-medium text-fd-muted-foreground","children":"August 22, 2023"}],["$","h1",null,{"className":"mt-3 text-3xl font-extrabold tracking-tight text-fd-foreground md:text-5xl","children":"Mess [...]
+3:["$","code",null,{"children":"available"}]
+4:["$","p",null,{"children":["However, the state might have a different value, for example ",["$","code",null,{"children":"marked_for_deletion"}]," (to be used by the upcoming retention policy feature), ",["$","code",null,{"children":"poisoned"}]," (to be used by the upcoming dead-letter queue feature) etc. In the future releases, the server will also provide a way to change the state of the message (for example to mark it as ",["$","code",null,{"children":"poisoned"}]," by the client), [...]
+5:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"implementation","children":[["$","a",null,{"data-card":"","href":"#implementation","className":"peer","children":"Implementation"}],["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground [...]
+6:["$","h3",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"structures","children":[["$","a",null,{"data-card":"","href":"#structures","className":"peer","children":"Structures"}],["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 tr [...]
+7:["$","p",null,{"children":["The new ",["$","code",null,{"children":"MessageState"}]," is an enum which defines the possible states of the message. The ",["$","code",null,{"children":"Message"}]," struct has been extended with the ",["$","code",null,{"children":"state"}]," field, which is an instance of the ",["$","code",null,{"children":"MessageState"}]," enum. The ",["$","code",null,{"children":"MessageState"}]," enum also provides a method to convert the enum variant to the ",["$","c [...]
+8:["$","p",null,{"children":["Additionally, the ",["$","code",null,{"children":"Message"}]," struct has been extended with the ",["$","code",null,{"children":"checksum"}]," field, which is a ",["$","code",null,{"children":"u32"}]," value calculated (",["$","strong",null,{"children":"CRC-32"}]," algorithm) from the ",["$","code",null,{"children":"payload"}]," field. The checksum is used to verify the integrity of the message, and it's calculated on the server-side when the message is bein [...]
+9:["$","p",null,{"children":["The server and the client now ",["$","strong",null,{"children":["share the same ",["$","code",null,{"children":"Message"}]," struct"]}],", meaning that the same type is being stored on the disk, as well as returned to the client when polling the messages. The motivation behind this approach, was not only to reduce the amount of code, but more importantly to make it easier to implement the extremely important feature being ",["$","strong",null,{"children":"ze [...]
+1d:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+b:["$","h3",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"json-transport","children":[["$","a",null,{"data-card":"","href":"#json-transport","className":"peer","children":"JSON transport"}],["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground [...]
+c:["$","p",null,{"children":["As usual, the JSON transport should be rather easy to implement, as it's just a matter of adding the ",["$","code",null,{"children":"state"}]," and ",["$","code",null,{"children":"checksum"}]," fields to the ",["$","code",null,{"children":"message"}]," object being returned when polling the messages. The ",["$","code",null,{"children":"state"}]," returns the underscored string value."]}]
+d:["$","$L1c",null,{"className":"shiki shiki-themes github-light github-dark","style":{"--shiki-light":"#24292e","--shiki-dark":"#e1e4e8","--shiki-light-bg":"#fff","--shiki-dark-bg":"#24292e"},"tabIndex":"0","icon":"<svg viewBox=\"0 0 24 24\"><path d=\"M 6,1 C 4.354992,1 3,2.354992 3,4 v 16 c 0,1.645008 1.354992,3 3,3 h 12 c 1.645008,0 3,-1.354992 3,-3 V 8 7 A 1.0001,1.0001 0 0 0 20.707031,6.2929687 l -5,-5 A 1.0001,1.0001 0 0 0 15,1 h -1 z m 0,2 h 7 v 3 c 0,1.645008 1.354992,3 3,3 h 3 v [...]
+e:["$","h3",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"binary-transport","children":[["$","a",null,{"data-card":"","href":"#binary-transport","className":"peer","children":"Binary transport"}],["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreg [...]
+f:["$","p",null,{"children":["Next, let's take a look at the binary transport. The ",["$","code",null,{"children":"Message"}]," struct has been extended with the ",["$","code",null,{"children":"state"}]," and ",["$","code",null,{"children":"checksum"}]," fields, which results in the updated binary schema. Previously, the ",["$","code",null,{"children":"message"}]," struct was defined as follows:"]}]
+36:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+11:["$","p",null,{"children":"And the serialization was:"}]
+12:["$","$L1c",null,{"className":"shiki shiki-themes github-light github-dark","style":{"--shiki-light":"#24292e","--shiki-dark":"#e1e4e8","--shiki-light-bg":"#fff","--shiki-dark-bg":"#24292e"},"tabIndex":"0","icon":"<svg viewBox=\"0 0 24 24\"><path d=\"M 6,1 C 4.354992,1 3,2.354992 3,4 v 16 c 0,1.645008 1.354992,3 3,3 h 12 c 1.645008,0 3,-1.354992 3,-3 V 8 7 A 1.0001,1.0001 0 0 0 20.707031,6.2929687 l -5,-5 A 1.0001,1.0001 0 0 0 15,1 h -1 z m 0,2 h 7 v 3 c 0,1.645008 1.354992,3 3,3 h 3 [...]
+13:["$","p",null,{"children":["Now, the ",["$","code",null,{"children":"message"}]," looks like this:"]}]
+38:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+15:["$","p",null,{"children":"And the serialization has changed to:"}]
+16:["$","$L1c",null,{"className":"shiki shiki-themes github-light github-dark","style":{"--shiki-light":"#24292e","--shiki-dark":"#e1e4e8","--shiki-light-bg":"#fff","--shiki-dark-bg":"#24292e"},"tabIndex":"0","icon":"<svg viewBox=\"0 0 24 24\"><path d=\"M 6,1 C 4.354992,1 3,2.354992 3,4 v 16 c 0,1.645008 1.354992,3 3,3 h 12 c 1.645008,0 3,-1.354992 3,-3 V 8 7 A 1.0001,1.0001 0 0 0 20.707031,6.2929687 l -5,-5 A 1.0001,1.0001 0 0 0 15,1 h -1 z m 0,2 h 7 v 3 c 0,1.645008 1.354992,3 3,3 h 3 [...]
+17:["$","p",null,{"children":["And that's it - simply (de)serialize the ",["$","code",null,{"children":"state"}]," field right after the ",["$","code",null,{"children":"offset"}]," field, and the ",["$","code",null,{"children":"checksum"}]," field right after the ",["$","code",null,{"children":"id"}]," field."]}]
+18:["$","footer",null,{"className":"mt-16 border-t border-fd-border pt-8","children":["$","$L3a",null,{"href":"/blogs","className":"inline-flex items-center gap-2 text-sm font-medium text-fd-primary transition-colors hover:opacity-80","children":"← Back to all posts"}]}]
+19:["$","script","script-0",{"src":"/_next/static/chunks/00b00679782d0ffd.js","async":true}]
+1a:["$","script","script-1",{"src":"/_next/static/chunks/3562882a488c4fbb.js","async":true}]
+1b:["$","$L3b",null,{"children":["$","$3c",null,{"name":"Next.MetadataOutlet","children":"$@3d"}]}]
+1e:["$","$L1f",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Message"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"} [...]
+20:["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":"1"}]
+21:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]
+22:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"state\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": "}],["$","span",null,{"style":{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},"children":"\"available\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+23:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"timestamp\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": "}],["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":"1692643862990112"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+24:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"id\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": "}],["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":"44069423551493178892268378627901876657"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+25:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"checksum\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": "}],["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":"148782482"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+26:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"headers\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": {"}]]}]
+27:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"key_3\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": {"}]]}]
+28:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"kind\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": "}],["$","span",null,{"style":{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},"children":"\"uint64\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+29:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"value\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": "}],["$","span",null,{"style":{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},"children":"\"QOIBAAAAAAA=\""}]]}]
+2a:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" },"}]}]
+2b:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"key 1\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": {"}]]}]
+2c:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"kind\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": "}],["$","span",null,{"style":{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},"children":"\"string\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+2d:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"value\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": "}],["$","span",null,{"style":{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},"children":"\"dmFsdWUx\""}]]}]
+2e:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" },"}]}]
+2f:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"key-2\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": {"}]]}]
+30:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"kind\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": "}],["$","span",null,{"style":{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},"children":"\"bool\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+31:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"value\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": "}],["$","span",null,{"style":{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},"children":"\"AQ==\""}]]}]
+32:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" }"}]}]
+33:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" },"}]}]
+34:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"payload\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": "}],["$","span",null,{"style":{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},"children":"\"b3JkZXJzX2RhdGFfMw==\""}]]}]
+35:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" }"}]}]
+37:["$","$L1f",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Message"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"} [...]
+39:["$","$L1f",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Message"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"} [...]
+3d:null
+3e:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" pub"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" payload"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Bytes"}]]}]
+3f:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"}"}]}]
+40:["$","span",null,{"className":"line"}]
+41:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" enum"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" MessageState"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" {"}]]}]
+42:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Available"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+43:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Unavailable"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+44:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Poisoned"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+45:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" MarkedForDeletion"}]}]
+46:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"}"}]}]
+47:["$","span",null,{"className":"line"}]
+48:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"impl"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" MessageState"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" {"}]]}]
+49:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" fn"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" as_code"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"("}],["$","span",null,{"style":{"--shiki-light [...]
+4a:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" match"}],["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" self"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" {"}]]}]
+4b:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" MessageState"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"::"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"Available"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" =>"}],["$","span",null,{"sty [...]
+4c:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" MessageState"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"::"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"Unavailable"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" =>"}],["$","span",null,{"s [...]
+4d:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" MessageState"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"::"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"Poisoned"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" =>"}],["$","span",null,{"styl [...]
+4e:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" MessageState"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"::"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"MarkedForDeletion"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" =>"}],["$","span",nu [...]
+4f:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" }"}]}]
+50:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" }"}]}]
+51:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"}"}]}]
+52:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" pub"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" payload"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Bytes"}]]}]
+53:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"}"}]}]
diff --git a/blogs/2023/08/22/message-state/__next.!KHNpdGUp.blogs.$c$slug.txt b/blogs/2023/08/22/message-state/__next.!KHNpdGUp.blogs.$c$slug.txt
new file mode 100644
index 00000000..11b31bb0
--- /dev/null
+++ b/blogs/2023/08/22/message-state/__next.!KHNpdGUp.blogs.$c$slug.txt
@@ -0,0 +1,4 @@
+1:"$Sreact.fragment"
+2:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+3:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","template":["$","$L3",null,{}]}]]}],"loading":null,"isPartial":false}
diff --git a/blogs/2023/08/22/message-state/__next.!KHNpdGUp.blogs.txt b/blogs/2023/08/22/message-state/__next.!KHNpdGUp.blogs.txt
new file mode 100644
index 00000000..11b31bb0
--- /dev/null
+++ b/blogs/2023/08/22/message-state/__next.!KHNpdGUp.blogs.txt
@@ -0,0 +1,4 @@
+1:"$Sreact.fragment"
+2:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+3:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","template":["$","$L3",null,{}]}]]}],"loading":null,"isPartial":false}
diff --git a/blogs/2023/08/22/message-state/__next.!KHNpdGUp.txt b/blogs/2023/08/22/message-state/__next.!KHNpdGUp.txt
new file mode 100644
index 00000000..ea3bfa55
--- /dev/null
+++ b/blogs/2023/08/22/message-state/__next.!KHNpdGUp.txt
@@ -0,0 +1,9 @@
+1:"$Sreact.fragment"
+2:I[83571,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Header"]
+3:I[29966,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFDropdown"]
+4:I[36330,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFMobileLinks"]
+5:I[22016,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],""]
+6:I[88760,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Logo"]
+7:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+8:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","c",{"children":[[["$","script","script-0",{"src":"/_next/static/chunks/8d86be78428a601a.js","async":true}],["$","script","script-1",{"src":"/_next/static/chunks/da34cc6305706ac6.js","async":true}],["$","script","script-2",{"src":"/_next/static/chunks/9baf65674e2de991.js","async":true}],["$","script","script-3",{"src":"/_next/static/chunks/26b70f9828dd1eb5.js","async":true}],["$","script","script-4",{"src":"/_next/static/chunks/adeed83 [...]
diff --git a/blogs/2023/08/22/message-state/__next._full.txt b/blogs/2023/08/22/message-state/__next._full.txt
new file mode 100644
index 00000000..91f1f39c
--- /dev/null
+++ b/blogs/2023/08/22/message-state/__next._full.txt
@@ -0,0 +1,102 @@
+1:"$Sreact.fragment"
+2:I[17751,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js"],"RootProvider"]
+3:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+4:I[58298,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/5a37d4cb1abe17d7.js"],"default"]
+5:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+6:I[83571,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Header"]
+7:I[29966,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFDropdown"]
+8:I[36330,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFMobileLinks"]
+9:I[22016,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],""]
+a:I[88760,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Logo"]
+11:I[68027,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+:HL["/_next/static/chunks/32a0415c8ab1bd26.css","style"]
+:HL["/_next/static/media/GeistMono_Variable.p.2f937313.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+:HL["/_next/static/media/Geist_Variable-s.p.92592eb2.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+0:{"P":null,"b":"uBHgltRE2s5QA49x61S_u","c":["","blogs","2023","08","22","message-state",""],"q":"","i":false,"f":[[["",{"children":["(site)",{"children":["blogs",{"children":[["slug","2023/08/22/message-state","c"],{"children":["__PAGE__",{}]}]}]}]},"$undefined","$undefined",true],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/32a0415c8ab1bd26.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0 [...]
+13:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"OutletBoundary"]
+14:"$Sreact.suspense"
+16:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"ViewportBoundary"]
+18:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"MetadataBoundary"]
+b:["$","h1",null,{"className":"next-error-h1","style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:1:props:style","children":404}]
+c:["$","div",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:style","children":["$","h2",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style","children":"This page could not be found."}]}]
+d:["$","$1","c",{"children":[null,["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}]
+e:["$","$1","c",{"children":[null,["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}]
+f:["$","$1","c",{"children":["$L12",[["$","script","script-0",{"src":"/_next/static/chunks/00b00679782d0ffd.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/3562882a488c4fbb.js","async":true,"nonce":"$undefined"}]],["$","$L13",null,{"children":["$","$14",null,{"name":"Next.MetadataOutlet","children":"$@15"}]}]]}]
+10:["$","$1","h",{"children":[null,["$","$L16",null,{"children":"$L17"}],["$","div",null,{"hidden":true,"children":["$","$L18",null,{"children":["$","$14",null,{"name":"Next.Metadata","children":"$L19"}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}]
+1a:I[47873,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"default"]
+12:["$","main",null,{"className":"min-h-screen px-6 py-16 md:px-12","children":["$","article",null,{"className":"mx-auto max-w-5xl","children":[["$","header",null,{"className":"mb-10","children":[["$","time",null,{"className":"text-sm font-medium text-fd-muted-foreground","children":"August 22, 2023"}],["$","h1",null,{"className":"mt-3 text-3xl font-extrabold tracking-tight text-fd-foreground md:text-5xl","children":"Message state"}],["$","p",null,{"className":"mt-4 text-base text-fd-mut [...]
+31:I[44324,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"CodeBlock"]
+34:I[44324,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"Pre"]
+1b:["$","code",null,{"children":"available"}]
+1c:["$","p",null,{"children":["However, the state might have a different value, for example ",["$","code",null,{"children":"marked_for_deletion"}]," (to be used by the upcoming retention policy feature), ",["$","code",null,{"children":"poisoned"}]," (to be used by the upcoming dead-letter queue feature) etc. In the future releases, the server will also provide a way to change the state of the message (for example to mark it as ",["$","code",null,{"children":"poisoned"}]," by the client), [...]
+1d:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"implementation","children":[["$","a",null,{"data-card":"","href":"#implementation","className":"peer","children":"Implementation"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text- [...]
+1e:["$","h3",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"structures","children":[["$","a",null,{"data-card":"","href":"#structures","className":"peer","children":"Structures"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-for [...]
+1f:["$","p",null,{"children":["The new ",["$","code",null,{"children":"MessageState"}]," is an enum which defines the possible states of the message. The ",["$","code",null,{"children":"Message"}]," struct has been extended with the ",["$","code",null,{"children":"state"}]," field, which is an instance of the ",["$","code",null,{"children":"MessageState"}]," enum. The ",["$","code",null,{"children":"MessageState"}]," enum also provides a method to convert the enum variant to the ",["$"," [...]
+20:["$","p",null,{"children":["Additionally, the ",["$","code",null,{"children":"Message"}]," struct has been extended with the ",["$","code",null,{"children":"checksum"}]," field, which is a ",["$","code",null,{"children":"u32"}]," value calculated (",["$","strong",null,{"children":"CRC-32"}]," algorithm) from the ",["$","code",null,{"children":"payload"}]," field. The checksum is used to verify the integrity of the message, and it's calculated on the server-side when the message is bei [...]
+21:["$","p",null,{"children":["The server and the client now ",["$","strong",null,{"children":["share the same ",["$","code",null,{"children":"Message"}]," struct"]}],", meaning that the same type is being stored on the disk, as well as returned to the client when polling the messages. The motivation behind this approach, was not only to reduce the amount of code, but more importantly to make it easier to implement the extremely important feature being ",["$","strong",null,{"children":"z [...]
+32:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+23:["$","h3",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"json-transport","children":[["$","a",null,{"data-card":"","href":"#json-transport","className":"peer","children":"JSON transport"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text- [...]
+24:["$","p",null,{"children":["As usual, the JSON transport should be rather easy to implement, as it's just a matter of adding the ",["$","code",null,{"children":"state"}]," and ",["$","code",null,{"children":"checksum"}]," fields to the ",["$","code",null,{"children":"message"}]," object being returned when polling the messages. The ",["$","code",null,{"children":"state"}]," returns the underscored string value."]}]
+25:["$","$L31",null,{"className":"shiki shiki-themes github-light github-dark","style":{"--shiki-light":"#24292e","--shiki-dark":"#e1e4e8","--shiki-light-bg":"#fff","--shiki-dark-bg":"#24292e"},"tabIndex":"0","icon":"<svg viewBox=\"0 0 24 24\"><path d=\"M 6,1 C 4.354992,1 3,2.354992 3,4 v 16 c 0,1.645008 1.354992,3 3,3 h 12 c 1.645008,0 3,-1.354992 3,-3 V 8 7 A 1.0001,1.0001 0 0 0 20.707031,6.2929687 l -5,-5 A 1.0001,1.0001 0 0 0 15,1 h -1 z m 0,2 h 7 v 3 c 0,1.645008 1.354992,3 3,3 h 3 [...]
+26:["$","h3",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"binary-transport","children":[["$","a",null,{"data-card":"","href":"#binary-transport","className":"peer","children":"Binary transport"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 [...]
+27:["$","p",null,{"children":["Next, let's take a look at the binary transport. The ",["$","code",null,{"children":"Message"}]," struct has been extended with the ",["$","code",null,{"children":"state"}]," and ",["$","code",null,{"children":"checksum"}]," fields, which results in the updated binary schema. Previously, the ",["$","code",null,{"children":"message"}]," struct was defined as follows:"]}]
+4b:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+29:["$","p",null,{"children":"And the serialization was:"}]
+2a:["$","$L31",null,{"className":"shiki shiki-themes github-light github-dark","style":{"--shiki-light":"#24292e","--shiki-dark":"#e1e4e8","--shiki-light-bg":"#fff","--shiki-dark-bg":"#24292e"},"tabIndex":"0","icon":"<svg viewBox=\"0 0 24 24\"><path d=\"M 6,1 C 4.354992,1 3,2.354992 3,4 v 16 c 0,1.645008 1.354992,3 3,3 h 12 c 1.645008,0 3,-1.354992 3,-3 V 8 7 A 1.0001,1.0001 0 0 0 20.707031,6.2929687 l -5,-5 A 1.0001,1.0001 0 0 0 15,1 h -1 z m 0,2 h 7 v 3 c 0,1.645008 1.354992,3 3,3 h 3 [...]
+2b:["$","p",null,{"children":["Now, the ",["$","code",null,{"children":"message"}]," looks like this:"]}]
+4d:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+2d:["$","p",null,{"children":"And the serialization has changed to:"}]
+2e:["$","$L31",null,{"className":"shiki shiki-themes github-light github-dark","style":{"--shiki-light":"#24292e","--shiki-dark":"#e1e4e8","--shiki-light-bg":"#fff","--shiki-dark-bg":"#24292e"},"tabIndex":"0","icon":"<svg viewBox=\"0 0 24 24\"><path d=\"M 6,1 C 4.354992,1 3,2.354992 3,4 v 16 c 0,1.645008 1.354992,3 3,3 h 12 c 1.645008,0 3,-1.354992 3,-3 V 8 7 A 1.0001,1.0001 0 0 0 20.707031,6.2929687 l -5,-5 A 1.0001,1.0001 0 0 0 15,1 h -1 z m 0,2 h 7 v 3 c 0,1.645008 1.354992,3 3,3 h 3 [...]
+2f:["$","p",null,{"children":["And that's it - simply (de)serialize the ",["$","code",null,{"children":"state"}]," field right after the ",["$","code",null,{"children":"offset"}]," field, and the ",["$","code",null,{"children":"checksum"}]," field right after the ",["$","code",null,{"children":"id"}]," field."]}]
+30:["$","footer",null,{"className":"mt-16 border-t border-fd-border pt-8","children":["$","$L9",null,{"href":"/blogs","className":"inline-flex items-center gap-2 text-sm font-medium text-fd-primary transition-colors hover:opacity-80","children":"← Back to all posts"}]}]
+33:["$","$L34",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Message"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"} [...]
+35:["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":"1"}]
+36:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]
+37:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"state\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": "}],["$","span",null,{"style":{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},"children":"\"available\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+38:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"timestamp\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": "}],["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":"1692643862990112"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+39:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"id\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": "}],["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":"44069423551493178892268378627901876657"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+3a:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"checksum\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": "}],["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":"148782482"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+3b:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"headers\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": {"}]]}]
+3c:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"key_3\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": {"}]]}]
+3d:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"kind\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": "}],["$","span",null,{"style":{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},"children":"\"uint64\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+3e:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"value\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": "}],["$","span",null,{"style":{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},"children":"\"QOIBAAAAAAA=\""}]]}]
+3f:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" },"}]}]
+40:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"key 1\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": {"}]]}]
+41:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"kind\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": "}],["$","span",null,{"style":{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},"children":"\"string\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+42:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"value\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": "}],["$","span",null,{"style":{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},"children":"\"dmFsdWUx\""}]]}]
+43:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" },"}]}]
+44:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"key-2\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": {"}]]}]
+45:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"kind\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": "}],["$","span",null,{"style":{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},"children":"\"bool\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+46:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"value\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": "}],["$","span",null,{"style":{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},"children":"\"AQ==\""}]]}]
+47:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" }"}]}]
+48:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" },"}]}]
+49:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"payload\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": "}],["$","span",null,{"style":{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},"children":"\"b3JkZXJzX2RhdGFfMw==\""}]]}]
+4a:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" }"}]}]
+4c:["$","$L34",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Message"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"} [...]
+4e:["$","$L34",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Message"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"} [...]
+4f:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" pub"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" payload"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Bytes"}]]}]
+50:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"}"}]}]
+51:["$","span",null,{"className":"line"}]
+52:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" enum"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" MessageState"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" {"}]]}]
+53:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Available"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+54:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Unavailable"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+55:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Poisoned"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+56:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" MarkedForDeletion"}]}]
+57:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"}"}]}]
+58:["$","span",null,{"className":"line"}]
+59:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"impl"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" MessageState"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" {"}]]}]
+5a:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" fn"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" as_code"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"("}],["$","span",null,{"style":{"--shiki-light [...]
+5b:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" match"}],["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" self"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" {"}]]}]
+5c:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" MessageState"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"::"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"Available"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" =>"}],["$","span",null,{"sty [...]
+5d:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" MessageState"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"::"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"Unavailable"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" =>"}],["$","span",null,{"s [...]
+5e:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" MessageState"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"::"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"Poisoned"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" =>"}],["$","span",null,{"styl [...]
+5f:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" MessageState"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"::"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"MarkedForDeletion"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" =>"}],["$","span",nu [...]
+60:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" }"}]}]
+61:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" }"}]}]
+62:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"}"}]}]
+63:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" pub"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" payload"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Bytes"}]]}]
+64:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"}"}]}]
+17:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
+65:I[27201,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"IconMark"]
+15:null
+19:[["$","title","0",{"children":"Message state | Apache Iggy"}],["$","link","1",{"rel":"icon","href":"/img/favicon.png"}],["$","$L65","2",{}]]
diff --git a/blogs/2023/08/22/message-state/__next._head.txt b/blogs/2023/08/22/message-state/__next._head.txt
new file mode 100644
index 00000000..ffc876a4
--- /dev/null
+++ b/blogs/2023/08/22/message-state/__next._head.txt
@@ -0,0 +1,6 @@
+1:"$Sreact.fragment"
+2:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"ViewportBoundary"]
+3:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"MetadataBoundary"]
+4:"$Sreact.suspense"
+5:I[27201,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"IconMark"]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","h",{"children":[null,["$","$L2",null,{"children":[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]}],["$","div",null,{"hidden":true,"children":["$","$L3",null,{"children":["$","$4",null,{"name":"Next.Metadata","children":[["$","title","0",{"children":"Message state | Apache Iggy"}],["$","link","1",{"rel":"icon","href":"/img/favicon.png"}],["$","$L5","2",{}]]}]}] [...]
diff --git a/blogs/2023/08/22/message-state/__next._index.txt b/blogs/2023/08/22/message-state/__next._index.txt
new file mode 100644
index 00000000..fd02bd95
--- /dev/null
+++ b/blogs/2023/08/22/message-state/__next._index.txt
@@ -0,0 +1,7 @@
+1:"$Sreact.fragment"
+2:I[17751,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js"],"RootProvider"]
+3:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+4:I[58298,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/5a37d4cb1abe17d7.js"],"default"]
+5:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+:HL["/_next/static/chunks/32a0415c8ab1bd26.css","style"]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/32a0415c8ab1bd26.css","precedence":"next"}],["$","script","script-0",{"src":"/_next/static/chunks/9ebd3a84bf60af84.js","async":true}],["$","script","script-1",{"src":"/_next/static/chunks/78b5f2e7b839e72f.js","async":true}]],["$","html",null,{"lang":"en","className":"geistsans_d5a4f12f-module__Ur3q_a__variable geistmono_157ca88a-module__iaM1Ya__variable" [...]
diff --git a/blogs/2023/08/22/message-state/__next._tree.txt b/blogs/2023/08/22/message-state/__next._tree.txt
new file mode 100644
index 00000000..0397905b
--- /dev/null
+++ b/blogs/2023/08/22/message-state/__next._tree.txt
@@ -0,0 +1,4 @@
+:HL["/_next/static/chunks/32a0415c8ab1bd26.css","style"]
+:HL["/_next/static/media/GeistMono_Variable.p.2f937313.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+:HL["/_next/static/media/Geist_Variable-s.p.92592eb2.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","tree":{"name":"","paramType":null,"paramKey":"","hasRuntimePrefetch":false,"slots":{"children":{"name":"(site)","paramType":null,"paramKey":"(site)","hasRuntimePrefetch":false,"slots":{"children":{"name":"blogs","paramType":null,"paramKey":"blogs","hasRuntimePrefetch":false,"slots":{"children":{"name":"slug","paramType":"c","paramKey":"2023/08/22/message-state","hasRuntimePrefetch":false,"slots":{"children":{"name":"__PAGE__","paramType":null,"paramK [...]
diff --git a/blogs/2023/08/22/message-state/index.html b/blogs/2023/08/22/message-state/index.html
new file mode 100644
index 00000000..83eee824
--- /dev/null
+++ b/blogs/2023/08/22/message-state/index.html
@@ -0,0 +1,98 @@
+<!DOCTYPE html><!--uBHgltRE2s5QA49x61S_u--><html lang="en" class="geistsans_d5a4f12f-module__Ur3q_a__variable geistmono_157ca88a-module__iaM1Ya__variable"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" href="/_next/static/media/GeistMono_Variable.p.2f937313.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="preload" href="/_next/static/media/Geist_Variable-s.p.92592eb2.woff2" as="font" crossorigin="" type=" [...]
+<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="breaking-changes"><a data-card="" href="#breaking-changes" class="peer">Breaking changes</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 [...]
+<p>Starting with the commit <a href="https://github.com/apache/iggy/commit/b07f23db798ffcda7c39650f34547f20137ff725" rel="noreferrer noopener" target="_blank">#b07f23d</a> the breaking changes related to polling the messages by the client have been introduced. The <code>Message</code> struct used when invoking <code>PollMessage</code> command has been extended with new fields, which results in updated binary schema. The available <a href="https://crates.io/crates/iggy" rel="noreferrer no [...]
+<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="introduction"><a data-card="" href="#introduction" class="peer">Introduction</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.5 [...]
+<p>The <code>state</code> is an additional field added to the <code>message</code> struct stored on the server-side, as well as polled by the client, which describes the current state of the message. By default, the message state is set to <code>available</code> (`code = 1``, see the possible codes below), meaning that the message is available to be consumed by the client.</p>
+<p>However, the state might have a different value, for example <code>marked_for_deletion</code> (to be used by the upcoming retention policy feature), <code>poisoned</code> (to be used by the upcoming dead-letter queue feature) etc. In the future releases, the server will also provide a way to change the state of the message (for example to mark it as <code>poisoned</code> by the client), as well as filtering the messages by the state.</p>
+<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="implementation"><a data-card="" href="#implementation" class="peer">Implementation</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 [...]
+<h3 class="flex scroll-m-28 flex-row items-center gap-2" id="structures"><a data-card="" href="#structures" class="peer">Structures</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3 [...]
+<p>The new <code>MessageState</code> is an enum which defines the possible states of the message. The <code>Message</code> struct has been extended with the <code>state</code> field, which is an instance of the <code>MessageState</code> enum. The <code>MessageState</code> enum also provides a method to convert the enum variant to the <code>u8</code> value, which is used by the binary schema.</p>
+<p>Additionally, the <code>Message</code> struct has been extended with the <code>checksum</code> field, which is a <code>u32</code> value calculated (<strong>CRC-32</strong> algorithm) from the <code>payload</code> field. The checksum is used to verify the integrity of the message, and it's calculated on the server-side when the message is being stored. The client can use the checksum to verify the integrity of the message, and if the checksum doesn't match, the client can req [...]
+<p>The server and the client now <strong>share the same <code>Message</code> struct</strong>, meaning that the same type is being stored on the disk, as well as returned to the client when polling the messages. The motivation behind this approach, was not only to reduce the amount of code, but more importantly to make it easier to implement the extremely important feature being <strong>zero-copy</strong> (copy data from disk directly to the network buffer with bypassing the kernel space) [...]
+<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-3 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-c [...]
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> offset</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> u64</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> state</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> MessageState</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> timestamp</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> u64</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> id</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> u128</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> checksum</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> u32</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> headers</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Option</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"><</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">HashMap</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8 [...]
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> length</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> u32</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> payload</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Bytes</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
+<span class="line"></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">pub</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> enum</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> MessageState</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
+<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Available</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Unavailable</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Poisoned</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> MarkedForDeletion</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
+<span class="line"></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">impl</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> MessageState</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> fn</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> as_code</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">self</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) </ [...]
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> match</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> self</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
+<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> MessageState</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">::</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">Available</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =></span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> MessageState</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">::</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">Unavailable</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =></span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 10</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> MessageState</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">::</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">Poisoned</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =></span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 20</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> MessageState</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">::</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">MarkedForDeletion</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =></span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 30</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> }</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> }</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre></div></figure>
+<h3 class="flex scroll-m-28 flex-row items-center gap-2" id="json-transport"><a data-card="" href="#json-transport" class="peer">JSON transport</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 [...]
+<p>As usual, the JSON transport should be rather easy to implement, as it's just a matter of adding the <code>state</code> and <code>checksum</code> fields to the <code>message</code> object being returned when polling the messages. The <code>state</code> returns the underscored string value.</p>
+<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-3 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-c [...]
+<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> "offset"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> "state"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"available"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> "timestamp"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1692643862990111</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> "id"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">232071677777564499402827199894559175028</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> "checksum"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">2144931076</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> "headers"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">null</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> "payload"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"b3JkZXJzX2RhdGFfMg=="</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> },</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
+<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> "offset"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> "state"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"available"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> "timestamp"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1692643862990112</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> "id"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">44069423551493178892268378627901876657</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> "checksum"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">148782482</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> "headers"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: {</span></span>
+<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> "key_3"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: {</span></span>
+<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> "kind"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"uint64"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> "value"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"QOIBAAAAAAA="</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> },</span></span>
+<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> "key 1"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: {</span></span>
+<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> "kind"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"string"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> "value"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"dmFsdWUx"</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> },</span></span>
+<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> "key-2"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: {</span></span>
+<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> "kind"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"bool"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> "value"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"AQ=="</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> }</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> },</span></span>
+<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> "payload"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"b3JkZXJzX2RhdGFfMw=="</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> }</span></span></code></pre></div></figure>
+<h3 class="flex scroll-m-28 flex-row items-center gap-2" id="binary-transport"><a data-card="" href="#binary-transport" class="peer">Binary transport</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 [...]
+<p>Next, let's take a look at the binary transport. The <code>Message</code> struct has been extended with the <code>state</code> and <code>checksum</code> fields, which results in the updated binary schema. Previously, the <code>message</code> struct was defined as follows:</p>
+<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-3 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-c [...]
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> offset</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> u64</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> timestamp</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> u64</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> id</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> u128</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> headers</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Option</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"><</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">HashMap</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8 [...]
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> length</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> u32</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> payload</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Bytes</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre></div></figure>
+<p>And the serialization was:</p>
+<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-3 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-c [...]
+<p>Now, the <code>message</code> looks like this:</p>
+<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-3 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-c [...]
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> offset</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> u64</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> state</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> MessageState</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> timestamp</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> u64</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> id</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> u128</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> checksum</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> u32</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> headers</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Option</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"><</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">HashMap</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8 [...]
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> length</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> u32</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> payload</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Bytes</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre></div></figure>
+<p>And the serialization has changed to:</p>
+<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-3 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-c [...]
+<p>And that's it - simply (de)serialize the <code>state</code> field right after the <code>offset</code> field, and the <code>checksum</code> field right after the <code>id</code> field.</p></div><footer class="mt-16 border-t border-fd-border pt-8"><a class="inline-flex items-center gap-2 text-sm font-medium text-fd-primary transition-colors hover:opacity-80" href="/blogs/">← Back to all posts</a></footer></article></main><!--$--><!--/$--></main><script src="/_next/static/chunks/922 [...]
\ No newline at end of file
diff --git a/blogs/2023/08/22/message-state/index.txt b/blogs/2023/08/22/message-state/index.txt
new file mode 100644
index 00000000..91f1f39c
--- /dev/null
+++ b/blogs/2023/08/22/message-state/index.txt
@@ -0,0 +1,102 @@
+1:"$Sreact.fragment"
+2:I[17751,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js"],"RootProvider"]
+3:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+4:I[58298,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/5a37d4cb1abe17d7.js"],"default"]
+5:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+6:I[83571,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Header"]
+7:I[29966,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFDropdown"]
+8:I[36330,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFMobileLinks"]
+9:I[22016,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],""]
+a:I[88760,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Logo"]
+11:I[68027,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+:HL["/_next/static/chunks/32a0415c8ab1bd26.css","style"]
+:HL["/_next/static/media/GeistMono_Variable.p.2f937313.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+:HL["/_next/static/media/Geist_Variable-s.p.92592eb2.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+0:{"P":null,"b":"uBHgltRE2s5QA49x61S_u","c":["","blogs","2023","08","22","message-state",""],"q":"","i":false,"f":[[["",{"children":["(site)",{"children":["blogs",{"children":[["slug","2023/08/22/message-state","c"],{"children":["__PAGE__",{}]}]}]}]},"$undefined","$undefined",true],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/32a0415c8ab1bd26.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0 [...]
+13:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"OutletBoundary"]
+14:"$Sreact.suspense"
+16:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"ViewportBoundary"]
+18:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"MetadataBoundary"]
+b:["$","h1",null,{"className":"next-error-h1","style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:1:props:style","children":404}]
+c:["$","div",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:style","children":["$","h2",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style","children":"This page could not be found."}]}]
+d:["$","$1","c",{"children":[null,["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}]
+e:["$","$1","c",{"children":[null,["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}]
+f:["$","$1","c",{"children":["$L12",[["$","script","script-0",{"src":"/_next/static/chunks/00b00679782d0ffd.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/3562882a488c4fbb.js","async":true,"nonce":"$undefined"}]],["$","$L13",null,{"children":["$","$14",null,{"name":"Next.MetadataOutlet","children":"$@15"}]}]]}]
+10:["$","$1","h",{"children":[null,["$","$L16",null,{"children":"$L17"}],["$","div",null,{"hidden":true,"children":["$","$L18",null,{"children":["$","$14",null,{"name":"Next.Metadata","children":"$L19"}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}]
+1a:I[47873,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"default"]
+12:["$","main",null,{"className":"min-h-screen px-6 py-16 md:px-12","children":["$","article",null,{"className":"mx-auto max-w-5xl","children":[["$","header",null,{"className":"mb-10","children":[["$","time",null,{"className":"text-sm font-medium text-fd-muted-foreground","children":"August 22, 2023"}],["$","h1",null,{"className":"mt-3 text-3xl font-extrabold tracking-tight text-fd-foreground md:text-5xl","children":"Message state"}],["$","p",null,{"className":"mt-4 text-base text-fd-mut [...]
+31:I[44324,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"CodeBlock"]
+34:I[44324,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"Pre"]
+1b:["$","code",null,{"children":"available"}]
+1c:["$","p",null,{"children":["However, the state might have a different value, for example ",["$","code",null,{"children":"marked_for_deletion"}]," (to be used by the upcoming retention policy feature), ",["$","code",null,{"children":"poisoned"}]," (to be used by the upcoming dead-letter queue feature) etc. In the future releases, the server will also provide a way to change the state of the message (for example to mark it as ",["$","code",null,{"children":"poisoned"}]," by the client), [...]
+1d:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"implementation","children":[["$","a",null,{"data-card":"","href":"#implementation","className":"peer","children":"Implementation"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text- [...]
+1e:["$","h3",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"structures","children":[["$","a",null,{"data-card":"","href":"#structures","className":"peer","children":"Structures"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-for [...]
+1f:["$","p",null,{"children":["The new ",["$","code",null,{"children":"MessageState"}]," is an enum which defines the possible states of the message. The ",["$","code",null,{"children":"Message"}]," struct has been extended with the ",["$","code",null,{"children":"state"}]," field, which is an instance of the ",["$","code",null,{"children":"MessageState"}]," enum. The ",["$","code",null,{"children":"MessageState"}]," enum also provides a method to convert the enum variant to the ",["$"," [...]
+20:["$","p",null,{"children":["Additionally, the ",["$","code",null,{"children":"Message"}]," struct has been extended with the ",["$","code",null,{"children":"checksum"}]," field, which is a ",["$","code",null,{"children":"u32"}]," value calculated (",["$","strong",null,{"children":"CRC-32"}]," algorithm) from the ",["$","code",null,{"children":"payload"}]," field. The checksum is used to verify the integrity of the message, and it's calculated on the server-side when the message is bei [...]
+21:["$","p",null,{"children":["The server and the client now ",["$","strong",null,{"children":["share the same ",["$","code",null,{"children":"Message"}]," struct"]}],", meaning that the same type is being stored on the disk, as well as returned to the client when polling the messages. The motivation behind this approach, was not only to reduce the amount of code, but more importantly to make it easier to implement the extremely important feature being ",["$","strong",null,{"children":"z [...]
+32:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+23:["$","h3",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"json-transport","children":[["$","a",null,{"data-card":"","href":"#json-transport","className":"peer","children":"JSON transport"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text- [...]
+24:["$","p",null,{"children":["As usual, the JSON transport should be rather easy to implement, as it's just a matter of adding the ",["$","code",null,{"children":"state"}]," and ",["$","code",null,{"children":"checksum"}]," fields to the ",["$","code",null,{"children":"message"}]," object being returned when polling the messages. The ",["$","code",null,{"children":"state"}]," returns the underscored string value."]}]
+25:["$","$L31",null,{"className":"shiki shiki-themes github-light github-dark","style":{"--shiki-light":"#24292e","--shiki-dark":"#e1e4e8","--shiki-light-bg":"#fff","--shiki-dark-bg":"#24292e"},"tabIndex":"0","icon":"<svg viewBox=\"0 0 24 24\"><path d=\"M 6,1 C 4.354992,1 3,2.354992 3,4 v 16 c 0,1.645008 1.354992,3 3,3 h 12 c 1.645008,0 3,-1.354992 3,-3 V 8 7 A 1.0001,1.0001 0 0 0 20.707031,6.2929687 l -5,-5 A 1.0001,1.0001 0 0 0 15,1 h -1 z m 0,2 h 7 v 3 c 0,1.645008 1.354992,3 3,3 h 3 [...]
+26:["$","h3",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"binary-transport","children":[["$","a",null,{"data-card":"","href":"#binary-transport","className":"peer","children":"Binary transport"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 [...]
+27:["$","p",null,{"children":["Next, let's take a look at the binary transport. The ",["$","code",null,{"children":"Message"}]," struct has been extended with the ",["$","code",null,{"children":"state"}]," and ",["$","code",null,{"children":"checksum"}]," fields, which results in the updated binary schema. Previously, the ",["$","code",null,{"children":"message"}]," struct was defined as follows:"]}]
+4b:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+29:["$","p",null,{"children":"And the serialization was:"}]
+2a:["$","$L31",null,{"className":"shiki shiki-themes github-light github-dark","style":{"--shiki-light":"#24292e","--shiki-dark":"#e1e4e8","--shiki-light-bg":"#fff","--shiki-dark-bg":"#24292e"},"tabIndex":"0","icon":"<svg viewBox=\"0 0 24 24\"><path d=\"M 6,1 C 4.354992,1 3,2.354992 3,4 v 16 c 0,1.645008 1.354992,3 3,3 h 12 c 1.645008,0 3,-1.354992 3,-3 V 8 7 A 1.0001,1.0001 0 0 0 20.707031,6.2929687 l -5,-5 A 1.0001,1.0001 0 0 0 15,1 h -1 z m 0,2 h 7 v 3 c 0,1.645008 1.354992,3 3,3 h 3 [...]
+2b:["$","p",null,{"children":["Now, the ",["$","code",null,{"children":"message"}]," looks like this:"]}]
+4d:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+2d:["$","p",null,{"children":"And the serialization has changed to:"}]
+2e:["$","$L31",null,{"className":"shiki shiki-themes github-light github-dark","style":{"--shiki-light":"#24292e","--shiki-dark":"#e1e4e8","--shiki-light-bg":"#fff","--shiki-dark-bg":"#24292e"},"tabIndex":"0","icon":"<svg viewBox=\"0 0 24 24\"><path d=\"M 6,1 C 4.354992,1 3,2.354992 3,4 v 16 c 0,1.645008 1.354992,3 3,3 h 12 c 1.645008,0 3,-1.354992 3,-3 V 8 7 A 1.0001,1.0001 0 0 0 20.707031,6.2929687 l -5,-5 A 1.0001,1.0001 0 0 0 15,1 h -1 z m 0,2 h 7 v 3 c 0,1.645008 1.354992,3 3,3 h 3 [...]
+2f:["$","p",null,{"children":["And that's it - simply (de)serialize the ",["$","code",null,{"children":"state"}]," field right after the ",["$","code",null,{"children":"offset"}]," field, and the ",["$","code",null,{"children":"checksum"}]," field right after the ",["$","code",null,{"children":"id"}]," field."]}]
+30:["$","footer",null,{"className":"mt-16 border-t border-fd-border pt-8","children":["$","$L9",null,{"href":"/blogs","className":"inline-flex items-center gap-2 text-sm font-medium text-fd-primary transition-colors hover:opacity-80","children":"← Back to all posts"}]}]
+33:["$","$L34",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Message"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"} [...]
+35:["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":"1"}]
+36:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]
+37:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"state\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": "}],["$","span",null,{"style":{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},"children":"\"available\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+38:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"timestamp\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": "}],["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":"1692643862990112"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+39:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"id\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": "}],["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":"44069423551493178892268378627901876657"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+3a:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"checksum\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": "}],["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":"148782482"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+3b:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"headers\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": {"}]]}]
+3c:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"key_3\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": {"}]]}]
+3d:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"kind\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": "}],["$","span",null,{"style":{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},"children":"\"uint64\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+3e:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"value\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": "}],["$","span",null,{"style":{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},"children":"\"QOIBAAAAAAA=\""}]]}]
+3f:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" },"}]}]
+40:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"key 1\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": {"}]]}]
+41:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"kind\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": "}],["$","span",null,{"style":{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},"children":"\"string\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+42:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"value\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": "}],["$","span",null,{"style":{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},"children":"\"dmFsdWUx\""}]]}]
+43:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" },"}]}]
+44:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"key-2\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": {"}]]}]
+45:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"kind\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": "}],["$","span",null,{"style":{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},"children":"\"bool\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+46:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"value\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": "}],["$","span",null,{"style":{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},"children":"\"AQ==\""}]]}]
+47:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" }"}]}]
+48:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" },"}]}]
+49:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"payload\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": "}],["$","span",null,{"style":{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},"children":"\"b3JkZXJzX2RhdGFfMw==\""}]]}]
+4a:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" }"}]}]
+4c:["$","$L34",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Message"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"} [...]
+4e:["$","$L34",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Message"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"} [...]
+4f:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" pub"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" payload"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Bytes"}]]}]
+50:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"}"}]}]
+51:["$","span",null,{"className":"line"}]
+52:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" enum"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" MessageState"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" {"}]]}]
+53:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Available"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+54:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Unavailable"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+55:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Poisoned"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+56:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" MarkedForDeletion"}]}]
+57:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"}"}]}]
+58:["$","span",null,{"className":"line"}]
+59:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"impl"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" MessageState"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" {"}]]}]
+5a:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" fn"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" as_code"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"("}],["$","span",null,{"style":{"--shiki-light [...]
+5b:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" match"}],["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" self"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" {"}]]}]
+5c:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" MessageState"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"::"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"Available"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" =>"}],["$","span",null,{"sty [...]
+5d:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" MessageState"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"::"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"Unavailable"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" =>"}],["$","span",null,{"s [...]
+5e:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" MessageState"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"::"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"Poisoned"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" =>"}],["$","span",null,{"styl [...]
+5f:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" MessageState"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"::"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"MarkedForDeletion"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" =>"}],["$","span",nu [...]
+60:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" }"}]}]
+61:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" }"}]}]
+62:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"}"}]}]
+63:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" pub"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" payload"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Bytes"}]]}]
+64:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"}"}]}]
+17:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
+65:I[27201,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"IconMark"]
+15:null
+19:[["$","title","0",{"children":"Message state | Apache Iggy"}],["$","link","1",{"rel":"icon","href":"/img/favicon.png"}],["$","$L65","2",{}]]
diff --git a/blogs/2023/08/27/message-expiry/__next.!KHNpdGUp.blogs.$c$slug.__PAGE__.txt b/blogs/2023/08/27/message-expiry/__next.!KHNpdGUp.blogs.$c$slug.__PAGE__.txt
new file mode 100644
index 00000000..cc63093a
--- /dev/null
+++ b/blogs/2023/08/27/message-expiry/__next.!KHNpdGUp.blogs.$c$slug.__PAGE__.txt
@@ -0,0 +1,52 @@
+1:"$Sreact.fragment"
+2:I[47873,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"default"]
+1d:I[44324,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"CodeBlock"]
+1e:I[44324,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"Pre"]
+23:I[22016,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],""]
+24:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"OutletBoundary"]
+25:"$Sreact.suspense"
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","c",{"children":[["$","main",null,{"className":"min-h-screen px-6 py-16 md:px-12","children":["$","article",null,{"className":"mx-auto max-w-5xl","children":[["$","header",null,{"className":"mb-10","children":[["$","time",null,{"className":"text-sm font-medium text-fd-muted-foreground","children":"August 27, 2023"}],["$","h1",null,{"className":"mt-3 text-3xl font-extrabold tracking-tight text-fd-foreground md:text-5xl","children":"Mess [...]
+3:["$","code",null,{"children":"message_expiry"}]
+4:["$","p",null,{"children":["The expiration policy is defined as ",["$","code",null,{"children":"u32"}]," value, which is the number of seconds after which the message should be marked as expired."]}]
+5:["$","p",null,{"children":"For example, the value of 604800 represents 1 week (60 * 60 * 24 * 7) - after this time, the messages will be marked as expired, and the whole segment will be deleted, as long as all the messages in this segment are expired."}]
+6:["$","p",null,{"children":["If there are still some messages which are not expired, the segment will be kept on the disk. By default, the new segment is automatically created when the previous one is full - either, it has reached the maximum size (defined by ",["$","code",null,{"children":"size_bytes"}]," property) or the currently stored messages have been expired, based on the current server timestamp and configured expiry value."]}]
+7:["$","p",null,{"children":["Setting the ",["$","code",null,{"children":"message_expiry"}]," to 0 disables the message expiry feature, meaning that the data will be kept forever, unless deleted manually."]}]
+8:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"configuration","children":[["$","a",null,{"data-card":"","href":"#configuration","className":"peer","children":"Configuration"}],["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opa [...]
+9:["$","$L1d",null,{"className":"shiki shiki-themes github-light github-dark","style":{"--shiki-light":"#24292e","--shiki-dark":"#e1e4e8","--shiki-light-bg":"#fff","--shiki-dark-bg":"#24292e"},"tabIndex":"0","icon":"<svg viewBox=\"0 0 24 24\"><path d=\"M 6,1 C 4.354992,1 3,2.354992 3,4 v 16 c 0,1.645008 1.354992,3 3,3 h 12 c 1.645008,0 3,-1.354992 3,-3 V 8 7 A 1.0001,1.0001 0 0 0 20.707031,6.2929687 l -5,-5 A 1.0001,1.0001 0 0 0 15,1 h -1 z m 0,2 h 7 v 3 c 0,1.645008 1.354992,3 3,3 h 3 v [...]
+a:["$","h3",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"message-cleaner","children":[["$","a",null,{"data-card":"","href":"#message-cleaner","className":"peer","children":"Message cleaner"}],["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-foregrou [...]
+b:["$","p",null,{"children":["The optional component, running in the background, responsible for validating and removing, the expired messages. The whole segment will be removed, when all the messages in this segment are expired. If the ",["$","code",null,{"children":"enabled"}]," is set to false, the message cleaner will be disabled, meaning that even if the ",["$","code",null,{"children":"message_expiry"}]," is set, the expired messages will not be removed."]}]
+c:["$","h3",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"segment","children":[["$","a",null,{"data-card":"","href":"#segment","className":"peer","children":"Segment"}],["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition- [...]
+d:["$","p",null,{"children":["The ",["$","code",null,{"children":"message_expiry"}]," option in the ",["$","code",null,{"children":"segment"}]," section of the configuration file specifies the number of seconds after which the message will be marked as expired - this is the default value that will be applied to all the topics, unless overridden when creating the topic via API. If the ",["$","code",null,{"children":"message_expiry"}]," is set to 0, then the message expiry is disabled."]}]
+e:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"commands","children":[["$","a",null,{"data-card":"","href":"#commands","className":"peer","children":"Commands"}],["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transiti [...]
+1f:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+10:["$","p",null,{"children":["The ",["$","code",null,{"children":"message_expiry"}]," field has been added to the ",["$","code",null,{"children":"CreateTopic"}]," command, which allows overriding the default value set in the configuration file. If the ",["$","code",null,{"children":"message_expiry"}]," is set to None (serialized as 0 value on the binary level), then the message expiry is disabled."]}]
+21:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+12:["$","p",null,{"children":["Additionally, the ",["$","code",null,{"children":"name_length"}]," field has been added to the binary serialization of the ",["$","code",null,{"children":"CreateTopic"}]," and ",["$","code",null,{"children":"CreateStream"}]," commands, which allows specifying the length of the name - it should be serialized as ",["$","code",null,{"children":"u8"}]," value, before the actual name, with a maximum length of 255 characters."]}]
+13:["$","p",null,{"children":["The following ",["$","strong",null,{"children":"regex"}]," is used to validate the topic and stream names: ",["$","code",null,{"children":"^[\\w\\.\\-\\s]+$"}],". The name will always be lowercased, and the whitespace will be trimmed and then replaced with the ",["$","code",null,{"children":"."}]," character. The following rule applies to all the resources that contain the name field."]}]
+14:["$","p",null,{"children":["Also, the ",["$","code",null,{"children":"Topic"}]," and ",["$","code",null,{"children":"TopicDetails"}]," returned when fetching the topic(s), have been extended with the ",["$","code",null,{"children":"message_expiry"}]," field, and the ",["$","code",null,{"children":"name_length"}]," has changed value from ",["$","code",null,{"children":"u32 to "}],"u8` (1 byte instead of 4 bytes)."]}]
+15:["$","p",null,{"children":"Serialization:"}]
+16:["$","$L1d",null,{"className":"shiki shiki-themes github-light github-dark","style":{"--shiki-light":"#24292e","--shiki-dark":"#e1e4e8","--shiki-light-bg":"#fff","--shiki-dark-bg":"#24292e"},"tabIndex":"0","icon":"<svg viewBox=\"0 0 24 24\"><path d=\"M 6,1 C 4.354992,1 3,2.354992 3,4 v 16 c 0,1.645008 1.354992,3 3,3 h 12 c 1.645008,0 3,-1.354992 3,-3 V 8 7 A 1.0001,1.0001 0 0 0 20.707031,6.2929687 l -5,-5 A 1.0001,1.0001 0 0 0 15,1 h -1 z m 0,2 h 7 v 3 c 0,1.645008 1.354992,3 3,3 h 3 [...]
+17:["$","p",null,{"children":["The same changes (",["$","code",null,{"children":"name_length"}],") apply to the ",["$","code",null,{"children":"Stream"}]," and ",["$","code",null,{"children":"StreamDetails"}]," structs."]}]
+18:["$","$L1d",null,{"className":"shiki shiki-themes github-light github-dark","style":{"--shiki-light":"#24292e","--shiki-dark":"#e1e4e8","--shiki-light-bg":"#fff","--shiki-dark-bg":"#24292e"},"tabIndex":"0","icon":"<svg viewBox=\"0 0 24 24\"><path d=\"M 6,1 C 4.354992,1 3,2.354992 3,4 v 16 c 0,1.645008 1.354992,3 3,3 h 12 c 1.645008,0 3,-1.354992 3,-3 V 8 7 A 1.0001,1.0001 0 0 0 20.707031,6.2929687 l -5,-5 A 1.0001,1.0001 0 0 0 15,1 h -1 z m 0,2 h 7 v 3 c 0,1.645008 1.354992,3 3,3 h 3 [...]
+19:["$","footer",null,{"className":"mt-16 border-t border-fd-border pt-8","children":["$","$L23",null,{"href":"/blogs","className":"inline-flex items-center gap-2 text-sm font-medium text-fd-primary transition-colors hover:opacity-80","children":"← Back to all posts"}]}]
+1a:["$","script","script-0",{"src":"/_next/static/chunks/00b00679782d0ffd.js","async":true}]
+1b:["$","script","script-1",{"src":"/_next/static/chunks/3562882a488c4fbb.js","async":true}]
+1c:["$","$L24",null,{"children":["$","$25",null,{"name":"Next.MetadataOutlet","children":"$@26"}]}]
+20:["$","$L1e",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" CreateTopic"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4 [...]
+22:["$","$L1e",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"fn"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" as_bytes"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"("}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"chil [...]
+26:null
+27:["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"."}]
+28:["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"put_u32_le"}]
+29:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"("}]
+2a:["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":"self"}]
+2b:["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"."}]
+2c:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"topic_id);"}]
+2d:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" bytes"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"."}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"put_u32_le"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"("}],["$","span",null,{"style":{"--shiki-lig [...]
+2e:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" match"}],["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" self"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"."}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"message_expiry {"}]]}]
+2f:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Some"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"(message_expiry) "}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"=>"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" bytes"}],["$","span",null,{"styl [...]
+30:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" None"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" =>"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" bytes"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"."}],["$","span",null,{"style":{"--shiki-li [...]
+31:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" }"}]}]
+32:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" bytes"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"."}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"put_u8"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"("}],["$","span",null,{"style":{"--shiki-light": [...]
+33:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" bytes"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"."}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"extend"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"("}],["$","span",null,{"style":{"--shiki-light": [...]
+34:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" bytes"}]}]
+35:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"}"}]}]
diff --git a/blogs/2023/08/27/message-expiry/__next.!KHNpdGUp.blogs.$c$slug.txt b/blogs/2023/08/27/message-expiry/__next.!KHNpdGUp.blogs.$c$slug.txt
new file mode 100644
index 00000000..11b31bb0
--- /dev/null
+++ b/blogs/2023/08/27/message-expiry/__next.!KHNpdGUp.blogs.$c$slug.txt
@@ -0,0 +1,4 @@
+1:"$Sreact.fragment"
+2:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+3:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","template":["$","$L3",null,{}]}]]}],"loading":null,"isPartial":false}
diff --git a/blogs/2023/08/27/message-expiry/__next.!KHNpdGUp.blogs.txt b/blogs/2023/08/27/message-expiry/__next.!KHNpdGUp.blogs.txt
new file mode 100644
index 00000000..11b31bb0
--- /dev/null
+++ b/blogs/2023/08/27/message-expiry/__next.!KHNpdGUp.blogs.txt
@@ -0,0 +1,4 @@
+1:"$Sreact.fragment"
+2:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+3:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","template":["$","$L3",null,{}]}]]}],"loading":null,"isPartial":false}
diff --git a/blogs/2023/08/27/message-expiry/__next.!KHNpdGUp.txt b/blogs/2023/08/27/message-expiry/__next.!KHNpdGUp.txt
new file mode 100644
index 00000000..ea3bfa55
--- /dev/null
+++ b/blogs/2023/08/27/message-expiry/__next.!KHNpdGUp.txt
@@ -0,0 +1,9 @@
+1:"$Sreact.fragment"
+2:I[83571,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Header"]
+3:I[29966,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFDropdown"]
+4:I[36330,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFMobileLinks"]
+5:I[22016,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],""]
+6:I[88760,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Logo"]
+7:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+8:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","c",{"children":[[["$","script","script-0",{"src":"/_next/static/chunks/8d86be78428a601a.js","async":true}],["$","script","script-1",{"src":"/_next/static/chunks/da34cc6305706ac6.js","async":true}],["$","script","script-2",{"src":"/_next/static/chunks/9baf65674e2de991.js","async":true}],["$","script","script-3",{"src":"/_next/static/chunks/26b70f9828dd1eb5.js","async":true}],["$","script","script-4",{"src":"/_next/static/chunks/adeed83 [...]
diff --git a/blogs/2023/08/27/message-expiry/__next._full.txt b/blogs/2023/08/27/message-expiry/__next._full.txt
new file mode 100644
index 00000000..919f33d7
--- /dev/null
+++ b/blogs/2023/08/27/message-expiry/__next._full.txt
@@ -0,0 +1,73 @@
+1:"$Sreact.fragment"
+2:I[17751,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js"],"RootProvider"]
+3:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+4:I[58298,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/5a37d4cb1abe17d7.js"],"default"]
+5:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+6:I[83571,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Header"]
+7:I[29966,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFDropdown"]
+8:I[36330,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFMobileLinks"]
+9:I[22016,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],""]
+a:I[88760,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Logo"]
+11:I[68027,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+:HL["/_next/static/chunks/32a0415c8ab1bd26.css","style"]
+:HL["/_next/static/media/GeistMono_Variable.p.2f937313.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+:HL["/_next/static/media/Geist_Variable-s.p.92592eb2.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+0:{"P":null,"b":"uBHgltRE2s5QA49x61S_u","c":["","blogs","2023","08","27","message-expiry",""],"q":"","i":false,"f":[[["",{"children":["(site)",{"children":["blogs",{"children":[["slug","2023/08/27/message-expiry","c"],{"children":["__PAGE__",{}]}]}]}]},"$undefined","$undefined",true],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/32a0415c8ab1bd26.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script [...]
+13:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"OutletBoundary"]
+14:"$Sreact.suspense"
+16:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"ViewportBoundary"]
+18:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"MetadataBoundary"]
+b:["$","h1",null,{"className":"next-error-h1","style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:1:props:style","children":404}]
+c:["$","div",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:style","children":["$","h2",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style","children":"This page could not be found."}]}]
+d:["$","$1","c",{"children":[null,["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}]
+e:["$","$1","c",{"children":[null,["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}]
+f:["$","$1","c",{"children":["$L12",[["$","script","script-0",{"src":"/_next/static/chunks/00b00679782d0ffd.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/3562882a488c4fbb.js","async":true,"nonce":"$undefined"}]],["$","$L13",null,{"children":["$","$14",null,{"name":"Next.MetadataOutlet","children":"$@15"}]}]]}]
+10:["$","$1","h",{"children":[null,["$","$L16",null,{"children":"$L17"}],["$","div",null,{"hidden":true,"children":["$","$L18",null,{"children":["$","$14",null,{"name":"Next.Metadata","children":"$L19"}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}]
+1a:I[47873,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"default"]
+12:["$","main",null,{"className":"min-h-screen px-6 py-16 md:px-12","children":["$","article",null,{"className":"mx-auto max-w-5xl","children":[["$","header",null,{"className":"mb-10","children":[["$","time",null,{"className":"text-sm font-medium text-fd-muted-foreground","children":"August 27, 2023"}],["$","h1",null,{"className":"mt-3 text-3xl font-extrabold tracking-tight text-fd-foreground md:text-5xl","children":"Message expiry"}],["$","p",null,{"className":"mt-4 text-base text-fd-mu [...]
+32:I[44324,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"CodeBlock"]
+33:I[44324,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"Pre"]
+1b:["$","code",null,{"children":"message_expiry"}]
+1c:["$","p",null,{"children":["The expiration policy is defined as ",["$","code",null,{"children":"u32"}]," value, which is the number of seconds after which the message should be marked as expired."]}]
+1d:["$","p",null,{"children":"For example, the value of 604800 represents 1 week (60 * 60 * 24 * 7) - after this time, the messages will be marked as expired, and the whole segment will be deleted, as long as all the messages in this segment are expired."}]
+1e:["$","p",null,{"children":["If there are still some messages which are not expired, the segment will be kept on the disk. By default, the new segment is automatically created when the previous one is full - either, it has reached the maximum size (defined by ",["$","code",null,{"children":"size_bytes"}]," property) or the currently stored messages have been expired, based on the current server timestamp and configured expiry value."]}]
+1f:["$","p",null,{"children":["Setting the ",["$","code",null,{"children":"message_expiry"}]," to 0 disables the message expiry feature, meaning that the data will be kept forever, unless deleted manually."]}]
+20:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"configuration","children":[["$","a",null,{"data-card":"","href":"#configuration","className":"peer","children":"Configuration"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd- [...]
+21:["$","$L32",null,{"className":"shiki shiki-themes github-light github-dark","style":{"--shiki-light":"#24292e","--shiki-dark":"#e1e4e8","--shiki-light-bg":"#fff","--shiki-dark-bg":"#24292e"},"tabIndex":"0","icon":"<svg viewBox=\"0 0 24 24\"><path d=\"M 6,1 C 4.354992,1 3,2.354992 3,4 v 16 c 0,1.645008 1.354992,3 3,3 h 12 c 1.645008,0 3,-1.354992 3,-3 V 8 7 A 1.0001,1.0001 0 0 0 20.707031,6.2929687 l -5,-5 A 1.0001,1.0001 0 0 0 15,1 h -1 z m 0,2 h 7 v 3 c 0,1.645008 1.354992,3 3,3 h 3 [...]
+22:["$","h3",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"message-cleaner","children":[["$","a",null,{"data-card":"","href":"#message-cleaner","className":"peer","children":"Message cleaner"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 te [...]
+23:["$","p",null,{"children":["The optional component, running in the background, responsible for validating and removing, the expired messages. The whole segment will be removed, when all the messages in this segment are expired. If the ",["$","code",null,{"children":"enabled"}]," is set to false, the message cleaner will be disabled, meaning that even if the ",["$","code",null,{"children":"message_expiry"}]," is set, the expired messages will not be removed."]}]
+24:["$","h3",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"segment","children":[["$","a",null,{"data-card":"","href":"#segment","className":"peer","children":"Segment"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground o [...]
+25:["$","p",null,{"children":["The ",["$","code",null,{"children":"message_expiry"}]," option in the ",["$","code",null,{"children":"segment"}]," section of the configuration file specifies the number of seconds after which the message will be marked as expired - this is the default value that will be applied to all the topics, unless overridden when creating the topic via API. If the ",["$","code",null,{"children":"message_expiry"}]," is set to 0, then the message expiry is disabled."]}]
+26:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"commands","children":[["$","a",null,{"data-card":"","href":"#commands","className":"peer","children":"Commands"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-foregroun [...]
+34:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+28:["$","p",null,{"children":["The ",["$","code",null,{"children":"message_expiry"}]," field has been added to the ",["$","code",null,{"children":"CreateTopic"}]," command, which allows overriding the default value set in the configuration file. If the ",["$","code",null,{"children":"message_expiry"}]," is set to None (serialized as 0 value on the binary level), then the message expiry is disabled."]}]
+36:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+2a:["$","p",null,{"children":["Additionally, the ",["$","code",null,{"children":"name_length"}]," field has been added to the binary serialization of the ",["$","code",null,{"children":"CreateTopic"}]," and ",["$","code",null,{"children":"CreateStream"}]," commands, which allows specifying the length of the name - it should be serialized as ",["$","code",null,{"children":"u8"}]," value, before the actual name, with a maximum length of 255 characters."]}]
+2b:["$","p",null,{"children":["The following ",["$","strong",null,{"children":"regex"}]," is used to validate the topic and stream names: ",["$","code",null,{"children":"^[\\w\\.\\-\\s]+$"}],". The name will always be lowercased, and the whitespace will be trimmed and then replaced with the ",["$","code",null,{"children":"."}]," character. The following rule applies to all the resources that contain the name field."]}]
+2c:["$","p",null,{"children":["Also, the ",["$","code",null,{"children":"Topic"}]," and ",["$","code",null,{"children":"TopicDetails"}]," returned when fetching the topic(s), have been extended with the ",["$","code",null,{"children":"message_expiry"}]," field, and the ",["$","code",null,{"children":"name_length"}]," has changed value from ",["$","code",null,{"children":"u32 to "}],"u8` (1 byte instead of 4 bytes)."]}]
+2d:["$","p",null,{"children":"Serialization:"}]
+2e:["$","$L32",null,{"className":"shiki shiki-themes github-light github-dark","style":{"--shiki-light":"#24292e","--shiki-dark":"#e1e4e8","--shiki-light-bg":"#fff","--shiki-dark-bg":"#24292e"},"tabIndex":"0","icon":"<svg viewBox=\"0 0 24 24\"><path d=\"M 6,1 C 4.354992,1 3,2.354992 3,4 v 16 c 0,1.645008 1.354992,3 3,3 h 12 c 1.645008,0 3,-1.354992 3,-3 V 8 7 A 1.0001,1.0001 0 0 0 20.707031,6.2929687 l -5,-5 A 1.0001,1.0001 0 0 0 15,1 h -1 z m 0,2 h 7 v 3 c 0,1.645008 1.354992,3 3,3 h 3 [...]
+2f:["$","p",null,{"children":["The same changes (",["$","code",null,{"children":"name_length"}],") apply to the ",["$","code",null,{"children":"Stream"}]," and ",["$","code",null,{"children":"StreamDetails"}]," structs."]}]
+30:["$","$L32",null,{"className":"shiki shiki-themes github-light github-dark","style":{"--shiki-light":"#24292e","--shiki-dark":"#e1e4e8","--shiki-light-bg":"#fff","--shiki-dark-bg":"#24292e"},"tabIndex":"0","icon":"<svg viewBox=\"0 0 24 24\"><path d=\"M 6,1 C 4.354992,1 3,2.354992 3,4 v 16 c 0,1.645008 1.354992,3 3,3 h 12 c 1.645008,0 3,-1.354992 3,-3 V 8 7 A 1.0001,1.0001 0 0 0 20.707031,6.2929687 l -5,-5 A 1.0001,1.0001 0 0 0 15,1 h -1 z m 0,2 h 7 v 3 c 0,1.645008 1.354992,3 3,3 h 3 [...]
+31:["$","footer",null,{"className":"mt-16 border-t border-fd-border pt-8","children":["$","$L9",null,{"href":"/blogs","className":"inline-flex items-center gap-2 text-sm font-medium text-fd-primary transition-colors hover:opacity-80","children":"← Back to all posts"}]}]
+35:["$","$L33",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" CreateTopic"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4 [...]
+37:["$","$L33",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"fn"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" as_bytes"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"("}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"chil [...]
+38:["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"."}]
+39:["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"put_u32_le"}]
+3a:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"("}]
+3b:["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":"self"}]
+3c:["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"."}]
+3d:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"topic_id);"}]
+3e:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" bytes"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"."}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"put_u32_le"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"("}],["$","span",null,{"style":{"--shiki-lig [...]
+3f:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" match"}],["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" self"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"."}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"message_expiry {"}]]}]
+40:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Some"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"(message_expiry) "}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"=>"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" bytes"}],["$","span",null,{"styl [...]
+41:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" None"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" =>"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" bytes"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"."}],["$","span",null,{"style":{"--shiki-li [...]
+42:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" }"}]}]
+43:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" bytes"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"."}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"put_u8"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"("}],["$","span",null,{"style":{"--shiki-light": [...]
+44:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" bytes"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"."}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"extend"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"("}],["$","span",null,{"style":{"--shiki-light": [...]
+45:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" bytes"}]}]
+46:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"}"}]}]
+17:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
+47:I[27201,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"IconMark"]
+15:null
+19:[["$","title","0",{"children":"Message expiry | Apache Iggy"}],["$","link","1",{"rel":"icon","href":"/img/favicon.png"}],["$","$L47","2",{}]]
diff --git a/blogs/2023/08/27/message-expiry/__next._head.txt b/blogs/2023/08/27/message-expiry/__next._head.txt
new file mode 100644
index 00000000..be6f1cc1
--- /dev/null
+++ b/blogs/2023/08/27/message-expiry/__next._head.txt
@@ -0,0 +1,6 @@
+1:"$Sreact.fragment"
+2:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"ViewportBoundary"]
+3:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"MetadataBoundary"]
+4:"$Sreact.suspense"
+5:I[27201,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"IconMark"]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","h",{"children":[null,["$","$L2",null,{"children":[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]}],["$","div",null,{"hidden":true,"children":["$","$L3",null,{"children":["$","$4",null,{"name":"Next.Metadata","children":[["$","title","0",{"children":"Message expiry | Apache Iggy"}],["$","link","1",{"rel":"icon","href":"/img/favicon.png"}],["$","$L5","2",{}]]}]} [...]
diff --git a/blogs/2023/08/27/message-expiry/__next._index.txt b/blogs/2023/08/27/message-expiry/__next._index.txt
new file mode 100644
index 00000000..fd02bd95
--- /dev/null
+++ b/blogs/2023/08/27/message-expiry/__next._index.txt
@@ -0,0 +1,7 @@
+1:"$Sreact.fragment"
+2:I[17751,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js"],"RootProvider"]
+3:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+4:I[58298,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/5a37d4cb1abe17d7.js"],"default"]
+5:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+:HL["/_next/static/chunks/32a0415c8ab1bd26.css","style"]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/32a0415c8ab1bd26.css","precedence":"next"}],["$","script","script-0",{"src":"/_next/static/chunks/9ebd3a84bf60af84.js","async":true}],["$","script","script-1",{"src":"/_next/static/chunks/78b5f2e7b839e72f.js","async":true}]],["$","html",null,{"lang":"en","className":"geistsans_d5a4f12f-module__Ur3q_a__variable geistmono_157ca88a-module__iaM1Ya__variable" [...]
diff --git a/blogs/2023/08/27/message-expiry/__next._tree.txt b/blogs/2023/08/27/message-expiry/__next._tree.txt
new file mode 100644
index 00000000..0a6b3b5c
--- /dev/null
+++ b/blogs/2023/08/27/message-expiry/__next._tree.txt
@@ -0,0 +1,4 @@
+:HL["/_next/static/chunks/32a0415c8ab1bd26.css","style"]
+:HL["/_next/static/media/GeistMono_Variable.p.2f937313.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+:HL["/_next/static/media/Geist_Variable-s.p.92592eb2.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","tree":{"name":"","paramType":null,"paramKey":"","hasRuntimePrefetch":false,"slots":{"children":{"name":"(site)","paramType":null,"paramKey":"(site)","hasRuntimePrefetch":false,"slots":{"children":{"name":"blogs","paramType":null,"paramKey":"blogs","hasRuntimePrefetch":false,"slots":{"children":{"name":"slug","paramType":"c","paramKey":"2023/08/27/message-expiry","hasRuntimePrefetch":false,"slots":{"children":{"name":"__PAGE__","paramType":null,"param [...]
diff --git a/blogs/2023/08/27/message-expiry/index.html b/blogs/2023/08/27/message-expiry/index.html
new file mode 100644
index 00000000..953cde2d
--- /dev/null
+++ b/blogs/2023/08/27/message-expiry/index.html
@@ -0,0 +1,50 @@
+<!DOCTYPE html><!--uBHgltRE2s5QA49x61S_u--><html lang="en" class="geistsans_d5a4f12f-module__Ur3q_a__variable geistmono_157ca88a-module__iaM1Ya__variable"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" href="/_next/static/media/GeistMono_Variable.p.2f937313.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="preload" href="/_next/static/media/Geist_Variable-s.p.92592eb2.woff2" as="font" crossorigin="" type=" [...]
+<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="breaking-changes"><a data-card="" href="#breaking-changes" class="peer">Breaking changes</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 [...]
+<p>No breaking changes have been introduced with this feature. The only breaking changes are related to the updated <code>CreateTopic</code>, <code>CreateStream</code> commands and <code>Stream</code> + <code>Topic</code> responses, which have been introduced in the latest commit <a href="https://github.com/apache/iggy/commit/ea3bf9c16dd5f93e1c80c140e9e1d14cfa70f570" rel="noreferrer noopener" target="_blank">#ea3bf9c</a>. The available <a href="https://crates.io/crates/iggy" rel="norefer [...]
+<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="introduction"><a data-card="" href="#introduction" class="peer">Introduction</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.5 [...]
+<p>The expiration policy is defined per topic, and it's being set when creating the topic. The value can be either provided via server configuration file, or via <code>CreateTopic</code> command. If the expiration is set in the configuration, it will be used as a default value for all the topics, unless when explicitly set when creating the topic via available <code>message_expiry</code> field.</p>
+<p>The expiration policy is defined as <code>u32</code> value, which is the number of seconds after which the message should be marked as expired.</p>
+<p>For example, the value of 604800 represents 1 week (60 * 60 * 24 * 7) - after this time, the messages will be marked as expired, and the whole segment will be deleted, as long as all the messages in this segment are expired.</p>
+<p>If there are still some messages which are not expired, the segment will be kept on the disk. By default, the new segment is automatically created when the previous one is full - either, it has reached the maximum size (defined by <code>size_bytes</code> property) or the currently stored messages have been expired, based on the current server timestamp and configured expiry value.</p>
+<p>Setting the <code>message_expiry</code> to 0 disables the message expiry feature, meaning that the data will be kept forever, unless deleted manually.</p>
+<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="configuration"><a data-card="" href="#configuration" class="peer">Configuration</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 0 [...]
+<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-3 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-c [...]
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">enabled = </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">true</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">interval = </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">60</span></span>
+<span class="line"></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">[</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">system</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">segment</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">message_expiry = </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">0</span></span></code></pre></div></figure>
+<h3 class="flex scroll-m-28 flex-row items-center gap-2" id="message-cleaner"><a data-card="" href="#message-cleaner" class="peer">Message cleaner</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 [...]
+<p>The optional component, running in the background, responsible for validating and removing, the expired messages. The whole segment will be removed, when all the messages in this segment are expired. If the <code>enabled</code> is set to false, the message cleaner will be disabled, meaning that even if the <code>message_expiry</code> is set, the expired messages will not be removed.</p>
+<h3 class="flex scroll-m-28 flex-row items-center gap-2" id="segment"><a data-card="" href="#segment" class="peer">Segment</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 [...]
+<p>The <code>message_expiry</code> option in the <code>segment</code> section of the configuration file specifies the number of seconds after which the message will be marked as expired - this is the default value that will be applied to all the topics, unless overridden when creating the topic via API. If the <code>message_expiry</code> is set to 0, then the message expiry is disabled.</p>
+<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="commands"><a data-card="" href="#commands" class="peer">Commands</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 [...]
+<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-3 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-c [...]
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> stream_id</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Identifier</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> topic_id</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> u32</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> partitions_count</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> u32</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> message_expiry</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Option</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"><</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">u32</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E [...]
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> name</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> String</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre></div></figure>
+<p>The <code>message_expiry</code> field has been added to the <code>CreateTopic</code> command, which allows overriding the default value set in the configuration file. If the <code>message_expiry</code> is set to None (serialized as 0 value on the binary level), then the message expiry is disabled.</p>
+<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-3 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-c [...]
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> let</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> stream_id_bytes </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> self</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">.</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">stream_id</span><span style="--shiki-light:#D73A49;--shiki-dark:# [...]
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> let</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> mut</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> bytes </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Vec</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">::</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">with_ca [...]
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> bytes</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">extend</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(stream_id_bytes);</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> bytes</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">put_u32_le</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">self</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">.</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">topic_ [...]
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> bytes</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">put_u32_le</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">self</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">.</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">partit [...]
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> match</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> self</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">.</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">message_expiry {</span></span>
+<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Some</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(message_expiry) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> bytes</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">put_u32_le</span><span style="--shiki-light:#24292E;--s [...]
+<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> None</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> bytes</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">put_u32_le</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8 [...]
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> }</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> bytes</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">put_u8</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">self</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">.</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">name</span [...]
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> bytes</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">extend</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">self</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">.</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">name</span [...]
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> bytes</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre></div></figure>
+<p>Additionally, the <code>name_length</code> field has been added to the binary serialization of the <code>CreateTopic</code> and <code>CreateStream</code> commands, which allows specifying the length of the name - it should be serialized as <code>u8</code> value, before the actual name, with a maximum length of 255 characters.</p>
+<p>The following <strong>regex</strong> is used to validate the topic and stream names: <code>^[\w\.\-\s]+$</code>. The name will always be lowercased, and the whitespace will be trimmed and then replaced with the <code>.</code> character. The following rule applies to all the resources that contain the name field.</p>
+<p>Also, the <code>Topic</code> and <code>TopicDetails</code> returned when fetching the topic(s), have been extended with the <code>message_expiry</code> field, and the <code>name_length</code> has changed value from <code>u32 to </code>u8` (1 byte instead of 4 bytes).</p>
+<p>Serialization:</p>
+<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-3 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-c [...]
+<p>The same changes (<code>name_length</code>) apply to the <code>Stream</code> and <code>StreamDetails</code> structs.</p>
+<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-3 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-c [...]
\ No newline at end of file
diff --git a/blogs/2023/08/27/message-expiry/index.txt b/blogs/2023/08/27/message-expiry/index.txt
new file mode 100644
index 00000000..919f33d7
--- /dev/null
+++ b/blogs/2023/08/27/message-expiry/index.txt
@@ -0,0 +1,73 @@
+1:"$Sreact.fragment"
+2:I[17751,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js"],"RootProvider"]
+3:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+4:I[58298,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/5a37d4cb1abe17d7.js"],"default"]
+5:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+6:I[83571,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Header"]
+7:I[29966,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFDropdown"]
+8:I[36330,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFMobileLinks"]
+9:I[22016,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],""]
+a:I[88760,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Logo"]
+11:I[68027,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+:HL["/_next/static/chunks/32a0415c8ab1bd26.css","style"]
+:HL["/_next/static/media/GeistMono_Variable.p.2f937313.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+:HL["/_next/static/media/Geist_Variable-s.p.92592eb2.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+0:{"P":null,"b":"uBHgltRE2s5QA49x61S_u","c":["","blogs","2023","08","27","message-expiry",""],"q":"","i":false,"f":[[["",{"children":["(site)",{"children":["blogs",{"children":[["slug","2023/08/27/message-expiry","c"],{"children":["__PAGE__",{}]}]}]}]},"$undefined","$undefined",true],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/32a0415c8ab1bd26.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script [...]
+13:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"OutletBoundary"]
+14:"$Sreact.suspense"
+16:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"ViewportBoundary"]
+18:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"MetadataBoundary"]
+b:["$","h1",null,{"className":"next-error-h1","style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:1:props:style","children":404}]
+c:["$","div",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:style","children":["$","h2",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style","children":"This page could not be found."}]}]
+d:["$","$1","c",{"children":[null,["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}]
+e:["$","$1","c",{"children":[null,["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}]
+f:["$","$1","c",{"children":["$L12",[["$","script","script-0",{"src":"/_next/static/chunks/00b00679782d0ffd.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/3562882a488c4fbb.js","async":true,"nonce":"$undefined"}]],["$","$L13",null,{"children":["$","$14",null,{"name":"Next.MetadataOutlet","children":"$@15"}]}]]}]
+10:["$","$1","h",{"children":[null,["$","$L16",null,{"children":"$L17"}],["$","div",null,{"hidden":true,"children":["$","$L18",null,{"children":["$","$14",null,{"name":"Next.Metadata","children":"$L19"}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}]
+1a:I[47873,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"default"]
+12:["$","main",null,{"className":"min-h-screen px-6 py-16 md:px-12","children":["$","article",null,{"className":"mx-auto max-w-5xl","children":[["$","header",null,{"className":"mb-10","children":[["$","time",null,{"className":"text-sm font-medium text-fd-muted-foreground","children":"August 27, 2023"}],["$","h1",null,{"className":"mt-3 text-3xl font-extrabold tracking-tight text-fd-foreground md:text-5xl","children":"Message expiry"}],["$","p",null,{"className":"mt-4 text-base text-fd-mu [...]
+32:I[44324,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"CodeBlock"]
+33:I[44324,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"Pre"]
+1b:["$","code",null,{"children":"message_expiry"}]
+1c:["$","p",null,{"children":["The expiration policy is defined as ",["$","code",null,{"children":"u32"}]," value, which is the number of seconds after which the message should be marked as expired."]}]
+1d:["$","p",null,{"children":"For example, the value of 604800 represents 1 week (60 * 60 * 24 * 7) - after this time, the messages will be marked as expired, and the whole segment will be deleted, as long as all the messages in this segment are expired."}]
+1e:["$","p",null,{"children":["If there are still some messages which are not expired, the segment will be kept on the disk. By default, the new segment is automatically created when the previous one is full - either, it has reached the maximum size (defined by ",["$","code",null,{"children":"size_bytes"}]," property) or the currently stored messages have been expired, based on the current server timestamp and configured expiry value."]}]
+1f:["$","p",null,{"children":["Setting the ",["$","code",null,{"children":"message_expiry"}]," to 0 disables the message expiry feature, meaning that the data will be kept forever, unless deleted manually."]}]
+20:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"configuration","children":[["$","a",null,{"data-card":"","href":"#configuration","className":"peer","children":"Configuration"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd- [...]
+21:["$","$L32",null,{"className":"shiki shiki-themes github-light github-dark","style":{"--shiki-light":"#24292e","--shiki-dark":"#e1e4e8","--shiki-light-bg":"#fff","--shiki-dark-bg":"#24292e"},"tabIndex":"0","icon":"<svg viewBox=\"0 0 24 24\"><path d=\"M 6,1 C 4.354992,1 3,2.354992 3,4 v 16 c 0,1.645008 1.354992,3 3,3 h 12 c 1.645008,0 3,-1.354992 3,-3 V 8 7 A 1.0001,1.0001 0 0 0 20.707031,6.2929687 l -5,-5 A 1.0001,1.0001 0 0 0 15,1 h -1 z m 0,2 h 7 v 3 c 0,1.645008 1.354992,3 3,3 h 3 [...]
+22:["$","h3",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"message-cleaner","children":[["$","a",null,{"data-card":"","href":"#message-cleaner","className":"peer","children":"Message cleaner"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 te [...]
+23:["$","p",null,{"children":["The optional component, running in the background, responsible for validating and removing, the expired messages. The whole segment will be removed, when all the messages in this segment are expired. If the ",["$","code",null,{"children":"enabled"}]," is set to false, the message cleaner will be disabled, meaning that even if the ",["$","code",null,{"children":"message_expiry"}]," is set, the expired messages will not be removed."]}]
+24:["$","h3",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"segment","children":[["$","a",null,{"data-card":"","href":"#segment","className":"peer","children":"Segment"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground o [...]
+25:["$","p",null,{"children":["The ",["$","code",null,{"children":"message_expiry"}]," option in the ",["$","code",null,{"children":"segment"}]," section of the configuration file specifies the number of seconds after which the message will be marked as expired - this is the default value that will be applied to all the topics, unless overridden when creating the topic via API. If the ",["$","code",null,{"children":"message_expiry"}]," is set to 0, then the message expiry is disabled."]}]
+26:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"commands","children":[["$","a",null,{"data-card":"","href":"#commands","className":"peer","children":"Commands"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-foregroun [...]
+34:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+28:["$","p",null,{"children":["The ",["$","code",null,{"children":"message_expiry"}]," field has been added to the ",["$","code",null,{"children":"CreateTopic"}]," command, which allows overriding the default value set in the configuration file. If the ",["$","code",null,{"children":"message_expiry"}]," is set to None (serialized as 0 value on the binary level), then the message expiry is disabled."]}]
+36:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+2a:["$","p",null,{"children":["Additionally, the ",["$","code",null,{"children":"name_length"}]," field has been added to the binary serialization of the ",["$","code",null,{"children":"CreateTopic"}]," and ",["$","code",null,{"children":"CreateStream"}]," commands, which allows specifying the length of the name - it should be serialized as ",["$","code",null,{"children":"u8"}]," value, before the actual name, with a maximum length of 255 characters."]}]
+2b:["$","p",null,{"children":["The following ",["$","strong",null,{"children":"regex"}]," is used to validate the topic and stream names: ",["$","code",null,{"children":"^[\\w\\.\\-\\s]+$"}],". The name will always be lowercased, and the whitespace will be trimmed and then replaced with the ",["$","code",null,{"children":"."}]," character. The following rule applies to all the resources that contain the name field."]}]
+2c:["$","p",null,{"children":["Also, the ",["$","code",null,{"children":"Topic"}]," and ",["$","code",null,{"children":"TopicDetails"}]," returned when fetching the topic(s), have been extended with the ",["$","code",null,{"children":"message_expiry"}]," field, and the ",["$","code",null,{"children":"name_length"}]," has changed value from ",["$","code",null,{"children":"u32 to "}],"u8` (1 byte instead of 4 bytes)."]}]
+2d:["$","p",null,{"children":"Serialization:"}]
+2e:["$","$L32",null,{"className":"shiki shiki-themes github-light github-dark","style":{"--shiki-light":"#24292e","--shiki-dark":"#e1e4e8","--shiki-light-bg":"#fff","--shiki-dark-bg":"#24292e"},"tabIndex":"0","icon":"<svg viewBox=\"0 0 24 24\"><path d=\"M 6,1 C 4.354992,1 3,2.354992 3,4 v 16 c 0,1.645008 1.354992,3 3,3 h 12 c 1.645008,0 3,-1.354992 3,-3 V 8 7 A 1.0001,1.0001 0 0 0 20.707031,6.2929687 l -5,-5 A 1.0001,1.0001 0 0 0 15,1 h -1 z m 0,2 h 7 v 3 c 0,1.645008 1.354992,3 3,3 h 3 [...]
+2f:["$","p",null,{"children":["The same changes (",["$","code",null,{"children":"name_length"}],") apply to the ",["$","code",null,{"children":"Stream"}]," and ",["$","code",null,{"children":"StreamDetails"}]," structs."]}]
+30:["$","$L32",null,{"className":"shiki shiki-themes github-light github-dark","style":{"--shiki-light":"#24292e","--shiki-dark":"#e1e4e8","--shiki-light-bg":"#fff","--shiki-dark-bg":"#24292e"},"tabIndex":"0","icon":"<svg viewBox=\"0 0 24 24\"><path d=\"M 6,1 C 4.354992,1 3,2.354992 3,4 v 16 c 0,1.645008 1.354992,3 3,3 h 12 c 1.645008,0 3,-1.354992 3,-3 V 8 7 A 1.0001,1.0001 0 0 0 20.707031,6.2929687 l -5,-5 A 1.0001,1.0001 0 0 0 15,1 h -1 z m 0,2 h 7 v 3 c 0,1.645008 1.354992,3 3,3 h 3 [...]
+31:["$","footer",null,{"className":"mt-16 border-t border-fd-border pt-8","children":["$","$L9",null,{"href":"/blogs","className":"inline-flex items-center gap-2 text-sm font-medium text-fd-primary transition-colors hover:opacity-80","children":"← Back to all posts"}]}]
+35:["$","$L33",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" CreateTopic"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4 [...]
+37:["$","$L33",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"fn"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" as_bytes"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"("}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"chil [...]
+38:["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"."}]
+39:["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"put_u32_le"}]
+3a:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"("}]
+3b:["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":"self"}]
+3c:["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"."}]
+3d:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"topic_id);"}]
+3e:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" bytes"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"."}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"put_u32_le"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"("}],["$","span",null,{"style":{"--shiki-lig [...]
+3f:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" match"}],["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" self"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"."}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"message_expiry {"}]]}]
+40:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Some"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"(message_expiry) "}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"=>"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" bytes"}],["$","span",null,{"styl [...]
+41:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" None"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" =>"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" bytes"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"."}],["$","span",null,{"style":{"--shiki-li [...]
+42:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" }"}]}]
+43:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" bytes"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"."}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"put_u8"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"("}],["$","span",null,{"style":{"--shiki-light": [...]
+44:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" bytes"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"."}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"extend"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"("}],["$","span",null,{"style":{"--shiki-light": [...]
+45:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" bytes"}]}]
+46:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"}"}]}]
+17:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
+47:I[27201,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"IconMark"]
+15:null
+19:[["$","title","0",{"children":"Message expiry | Apache Iggy"}],["$","link","1",{"rel":"icon","href":"/img/favicon.png"}],["$","$L47","2",{}]]
diff --git a/blogs/2023/08/31/updated-schemas/__next.!KHNpdGUp.blogs.$c$slug.__PAGE__.txt b/blogs/2023/08/31/updated-schemas/__next.!KHNpdGUp.blogs.$c$slug.__PAGE__.txt
new file mode 100644
index 00000000..b63f23ce
--- /dev/null
+++ b/blogs/2023/08/31/updated-schemas/__next.!KHNpdGUp.blogs.$c$slug.__PAGE__.txt
@@ -0,0 +1,26 @@
+1:"$Sreact.fragment"
+2:I[47873,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"default"]
+12:I[44324,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"CodeBlock"]
+15:I[44324,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"Pre"]
+18:I[22016,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],""]
+19:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"OutletBoundary"]
+1a:"$Sreact.suspense"
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","c",{"children":[["$","main",null,{"className":"min-h-screen px-6 py-16 md:px-12","children":["$","article",null,{"className":"mx-auto max-w-5xl","children":[["$","header",null,{"className":"mb-10","children":[["$","time",null,{"className":"text-sm font-medium text-fd-muted-foreground","children":"August 31, 2023"}],["$","h1",null,{"className":"mt-3 text-3xl font-extrabold tracking-tight text-fd-foreground md:text-5xl","children":"Upda [...]
+13:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+4:["$","p",null,{"children":"Serialization:"}]
+5:["$","$L12",null,{"className":"shiki shiki-themes github-light github-dark","style":{"--shiki-light":"#24292e","--shiki-dark":"#e1e4e8","--shiki-light-bg":"#fff","--shiki-dark-bg":"#24292e"},"tabIndex":"0","icon":"<svg viewBox=\"0 0 24 24\"><path d=\"M 6,1 C 4.354992,1 3,2.354992 3,4 v 16 c 0,1.645008 1.354992,3 3,3 h 12 c 1.645008,0 3,-1.354992 3,-3 V 8 7 A 1.0001,1.0001 0 0 0 20.707031,6.2929687 l -5,-5 A 1.0001,1.0001 0 0 0 15,1 h -1 z m 0,2 h 7 v 3 c 0,1.645008 1.354992,3 3,3 h 3 v [...]
+6:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"getconsumeroffset","children":[["$","a",null,{"data-card":"","href":"#getconsumeroffset","className":"peer","children":"GetConsumerOffset"}],["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-fo [...]
+7:["$","p",null,{"children":["Previously, the ",["$","code",null,{"children":"GetConsumerOffset"}]," command used to return ",["$","code",null,{"children":"u64"}]," as a response, which has been changed to ",["$","code",null,{"children":"ConsumerOffsetInfo"}]," struct, that contains the ",["$","code",null,{"children":"partition_id"}],", ",["$","code",null,{"children":"current_offset"}]," and ",["$","code",null,{"children":"stored_offset"}]," field. Similar to the ",["$","code",null,{"chi [...]
+16:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+9:["$","p",null,{"children":"Serialization:"}]
+a:["$","$L12",null,{"className":"shiki shiki-themes github-light github-dark","style":{"--shiki-light":"#24292e","--shiki-dark":"#e1e4e8","--shiki-light-bg":"#fff","--shiki-dark-bg":"#24292e"},"tabIndex":"0","icon":"<svg viewBox=\"0 0 24 24\"><path d=\"M 6,1 C 4.354992,1 3,2.354992 3,4 v 16 c 0,1.645008 1.354992,3 3,3 h 12 c 1.645008,0 3,-1.354992 3,-3 V 8 7 A 1.0001,1.0001 0 0 0 20.707031,6.2929687 l -5,-5 A 1.0001,1.0001 0 0 0 15,1 h -1 z m 0,2 h 7 v 3 c 0,1.645008 1.354992,3 3,3 h 3 v [...]
+b:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"stream-topic-partition","children":[["$","a",null,{"data-card":"","href":"#stream-topic-partition","className":"peer","children":"Stream, Topic, Partition"}],["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 [...]
+c:["$","p",null,{"children":["The ",["$","code",null,{"children":"Stream"}],", ",["$","code",null,{"children":"Topic"}]," and ",["$","code",null,{"children":"Partition"}]," structs (along with the additional ",["$","code",null,{"children":"Details"}]," models when fetching the single object, not a list) have been extended with the ",["$","code",null,{"children":"created_at"}]," field, which contains the timestamp of the creation time (EPOCH in microseconds)."]}]
+d:["$","p",null,{"children":["The ",["$","code",null,{"children":"created_at"}]," field which is ",["$","code",null,{"children":"u64"}]," (8 bytes) is always serialized right after the ",["$","code",null,{"children":"id"}]," field, and then the remaining fields follow."]}]
+e:["$","footer",null,{"className":"mt-16 border-t border-fd-border pt-8","children":["$","$L18",null,{"href":"/blogs","className":"inline-flex items-center gap-2 text-sm font-medium text-fd-primary transition-colors hover:opacity-80","children":"← Back to all posts"}]}]
+f:["$","script","script-0",{"src":"/_next/static/chunks/00b00679782d0ffd.js","async":true}]
+10:["$","script","script-1",{"src":"/_next/static/chunks/3562882a488c4fbb.js","async":true}]
+11:["$","$L19",null,{"children":["$","$1a",null,{"name":"Next.MetadataOutlet","children":"$@1b"}]}]
+14:["$","$L15",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" PolledMessages"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E [...]
+17:["$","$L15",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" ConsumerOffsetInfo"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark" [...]
+1b:null
diff --git a/blogs/2023/08/31/updated-schemas/__next.!KHNpdGUp.blogs.$c$slug.txt b/blogs/2023/08/31/updated-schemas/__next.!KHNpdGUp.blogs.$c$slug.txt
new file mode 100644
index 00000000..11b31bb0
--- /dev/null
+++ b/blogs/2023/08/31/updated-schemas/__next.!KHNpdGUp.blogs.$c$slug.txt
@@ -0,0 +1,4 @@
+1:"$Sreact.fragment"
+2:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+3:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","template":["$","$L3",null,{}]}]]}],"loading":null,"isPartial":false}
diff --git a/blogs/2023/08/31/updated-schemas/__next.!KHNpdGUp.blogs.txt b/blogs/2023/08/31/updated-schemas/__next.!KHNpdGUp.blogs.txt
new file mode 100644
index 00000000..11b31bb0
--- /dev/null
+++ b/blogs/2023/08/31/updated-schemas/__next.!KHNpdGUp.blogs.txt
@@ -0,0 +1,4 @@
+1:"$Sreact.fragment"
+2:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+3:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","template":["$","$L3",null,{}]}]]}],"loading":null,"isPartial":false}
diff --git a/blogs/2023/08/31/updated-schemas/__next.!KHNpdGUp.txt b/blogs/2023/08/31/updated-schemas/__next.!KHNpdGUp.txt
new file mode 100644
index 00000000..ea3bfa55
--- /dev/null
+++ b/blogs/2023/08/31/updated-schemas/__next.!KHNpdGUp.txt
@@ -0,0 +1,9 @@
+1:"$Sreact.fragment"
+2:I[83571,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Header"]
+3:I[29966,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFDropdown"]
+4:I[36330,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFMobileLinks"]
+5:I[22016,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],""]
+6:I[88760,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Logo"]
+7:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+8:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","c",{"children":[[["$","script","script-0",{"src":"/_next/static/chunks/8d86be78428a601a.js","async":true}],["$","script","script-1",{"src":"/_next/static/chunks/da34cc6305706ac6.js","async":true}],["$","script","script-2",{"src":"/_next/static/chunks/9baf65674e2de991.js","async":true}],["$","script","script-3",{"src":"/_next/static/chunks/26b70f9828dd1eb5.js","async":true}],["$","script","script-4",{"src":"/_next/static/chunks/adeed83 [...]
diff --git a/blogs/2023/08/31/updated-schemas/__next._full.txt b/blogs/2023/08/31/updated-schemas/__next._full.txt
new file mode 100644
index 00000000..0ee565db
--- /dev/null
+++ b/blogs/2023/08/31/updated-schemas/__next._full.txt
@@ -0,0 +1,47 @@
+1:"$Sreact.fragment"
+2:I[17751,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js"],"RootProvider"]
+3:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+4:I[58298,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/5a37d4cb1abe17d7.js"],"default"]
+5:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+6:I[83571,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Header"]
+7:I[29966,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFDropdown"]
+8:I[36330,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFMobileLinks"]
+9:I[22016,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],""]
+a:I[88760,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Logo"]
+11:I[68027,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+:HL["/_next/static/chunks/32a0415c8ab1bd26.css","style"]
+:HL["/_next/static/media/GeistMono_Variable.p.2f937313.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+:HL["/_next/static/media/Geist_Variable-s.p.92592eb2.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+0:{"P":null,"b":"uBHgltRE2s5QA49x61S_u","c":["","blogs","2023","08","31","updated-schemas",""],"q":"","i":false,"f":[[["",{"children":["(site)",{"children":["blogs",{"children":[["slug","2023/08/31/updated-schemas","c"],{"children":["__PAGE__",{}]}]}]}]},"$undefined","$undefined",true],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/32a0415c8ab1bd26.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","scri [...]
+13:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"OutletBoundary"]
+14:"$Sreact.suspense"
+16:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"ViewportBoundary"]
+18:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"MetadataBoundary"]
+b:["$","h1",null,{"className":"next-error-h1","style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:1:props:style","children":404}]
+c:["$","div",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:style","children":["$","h2",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style","children":"This page could not be found."}]}]
+d:["$","$1","c",{"children":[null,["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}]
+e:["$","$1","c",{"children":[null,["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}]
+f:["$","$1","c",{"children":["$L12",[["$","script","script-0",{"src":"/_next/static/chunks/00b00679782d0ffd.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/3562882a488c4fbb.js","async":true,"nonce":"$undefined"}]],["$","$L13",null,{"children":["$","$14",null,{"name":"Next.MetadataOutlet","children":"$@15"}]}]]}]
+10:["$","$1","h",{"children":[null,["$","$L16",null,{"children":"$L17"}],["$","div",null,{"hidden":true,"children":["$","$L18",null,{"children":["$","$14",null,{"name":"Next.Metadata","children":"$L19"}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}]
+1a:I[47873,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"default"]
+12:["$","main",null,{"className":"min-h-screen px-6 py-16 md:px-12","children":["$","article",null,{"className":"mx-auto max-w-5xl","children":[["$","header",null,{"className":"mb-10","children":[["$","time",null,{"className":"text-sm font-medium text-fd-muted-foreground","children":"August 31, 2023"}],["$","h1",null,{"className":"mt-3 text-3xl font-extrabold tracking-tight text-fd-foreground md:text-5xl","children":"Updated schemas"}],["$","p",null,{"className":"mt-4 text-base text-fd-m [...]
+27:I[44324,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"CodeBlock"]
+2a:I[44324,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"Pre"]
+28:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+1c:["$","p",null,{"children":"Serialization:"}]
+1d:["$","$L27",null,{"className":"shiki shiki-themes github-light github-dark","style":{"--shiki-light":"#24292e","--shiki-dark":"#e1e4e8","--shiki-light-bg":"#fff","--shiki-dark-bg":"#24292e"},"tabIndex":"0","icon":"<svg viewBox=\"0 0 24 24\"><path d=\"M 6,1 C 4.354992,1 3,2.354992 3,4 v 16 c 0,1.645008 1.354992,3 3,3 h 12 c 1.645008,0 3,-1.354992 3,-3 V 8 7 A 1.0001,1.0001 0 0 0 20.707031,6.2929687 l -5,-5 A 1.0001,1.0001 0 0 0 15,1 h -1 z m 0,2 h 7 v 3 c 0,1.645008 1.354992,3 3,3 h 3 [...]
+1e:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"getconsumeroffset","children":[["$","a",null,{"data-card":"","href":"#getconsumeroffset","className":"peer","children":"GetConsumerOffset"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrin [...]
+1f:["$","p",null,{"children":["Previously, the ",["$","code",null,{"children":"GetConsumerOffset"}]," command used to return ",["$","code",null,{"children":"u64"}]," as a response, which has been changed to ",["$","code",null,{"children":"ConsumerOffsetInfo"}]," struct, that contains the ",["$","code",null,{"children":"partition_id"}],", ",["$","code",null,{"children":"current_offset"}]," and ",["$","code",null,{"children":"stored_offset"}]," field. Similar to the ",["$","code",null,{"ch [...]
+2b:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+21:["$","p",null,{"children":"Serialization:"}]
+22:["$","$L27",null,{"className":"shiki shiki-themes github-light github-dark","style":{"--shiki-light":"#24292e","--shiki-dark":"#e1e4e8","--shiki-light-bg":"#fff","--shiki-dark-bg":"#24292e"},"tabIndex":"0","icon":"<svg viewBox=\"0 0 24 24\"><path d=\"M 6,1 C 4.354992,1 3,2.354992 3,4 v 16 c 0,1.645008 1.354992,3 3,3 h 12 c 1.645008,0 3,-1.354992 3,-3 V 8 7 A 1.0001,1.0001 0 0 0 20.707031,6.2929687 l -5,-5 A 1.0001,1.0001 0 0 0 15,1 h -1 z m 0,2 h 7 v 3 c 0,1.645008 1.354992,3 3,3 h 3 [...]
+23:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"stream-topic-partition","children":[["$","a",null,{"data-card":"","href":"#stream-topic-partition","className":"peer","children":"Stream, Topic, Partition"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-li [...]
+24:["$","p",null,{"children":["The ",["$","code",null,{"children":"Stream"}],", ",["$","code",null,{"children":"Topic"}]," and ",["$","code",null,{"children":"Partition"}]," structs (along with the additional ",["$","code",null,{"children":"Details"}]," models when fetching the single object, not a list) have been extended with the ",["$","code",null,{"children":"created_at"}]," field, which contains the timestamp of the creation time (EPOCH in microseconds)."]}]
+25:["$","p",null,{"children":["The ",["$","code",null,{"children":"created_at"}]," field which is ",["$","code",null,{"children":"u64"}]," (8 bytes) is always serialized right after the ",["$","code",null,{"children":"id"}]," field, and then the remaining fields follow."]}]
+26:["$","footer",null,{"className":"mt-16 border-t border-fd-border pt-8","children":["$","$L9",null,{"href":"/blogs","className":"inline-flex items-center gap-2 text-sm font-medium text-fd-primary transition-colors hover:opacity-80","children":"← Back to all posts"}]}]
+29:["$","$L2a",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" PolledMessages"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E [...]
+2c:["$","$L2a",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" ConsumerOffsetInfo"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark" [...]
+17:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
+2d:I[27201,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"IconMark"]
+15:null
+19:[["$","title","0",{"children":"Updated schemas | Apache Iggy"}],["$","link","1",{"rel":"icon","href":"/img/favicon.png"}],["$","$L2d","2",{}]]
diff --git a/blogs/2023/08/31/updated-schemas/__next._head.txt b/blogs/2023/08/31/updated-schemas/__next._head.txt
new file mode 100644
index 00000000..dc8e18f8
--- /dev/null
+++ b/blogs/2023/08/31/updated-schemas/__next._head.txt
@@ -0,0 +1,6 @@
+1:"$Sreact.fragment"
+2:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"ViewportBoundary"]
+3:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"MetadataBoundary"]
+4:"$Sreact.suspense"
+5:I[27201,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"IconMark"]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","h",{"children":[null,["$","$L2",null,{"children":[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]}],["$","div",null,{"hidden":true,"children":["$","$L3",null,{"children":["$","$4",null,{"name":"Next.Metadata","children":[["$","title","0",{"children":"Updated schemas | Apache Iggy"}],["$","link","1",{"rel":"icon","href":"/img/favicon.png"}],["$","$L5","2",{}]]}] [...]
diff --git a/blogs/2023/08/31/updated-schemas/__next._index.txt b/blogs/2023/08/31/updated-schemas/__next._index.txt
new file mode 100644
index 00000000..fd02bd95
--- /dev/null
+++ b/blogs/2023/08/31/updated-schemas/__next._index.txt
@@ -0,0 +1,7 @@
+1:"$Sreact.fragment"
+2:I[17751,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js"],"RootProvider"]
+3:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+4:I[58298,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/5a37d4cb1abe17d7.js"],"default"]
+5:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+:HL["/_next/static/chunks/32a0415c8ab1bd26.css","style"]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/32a0415c8ab1bd26.css","precedence":"next"}],["$","script","script-0",{"src":"/_next/static/chunks/9ebd3a84bf60af84.js","async":true}],["$","script","script-1",{"src":"/_next/static/chunks/78b5f2e7b839e72f.js","async":true}]],["$","html",null,{"lang":"en","className":"geistsans_d5a4f12f-module__Ur3q_a__variable geistmono_157ca88a-module__iaM1Ya__variable" [...]
diff --git a/blogs/2023/08/31/updated-schemas/__next._tree.txt b/blogs/2023/08/31/updated-schemas/__next._tree.txt
new file mode 100644
index 00000000..0523566c
--- /dev/null
+++ b/blogs/2023/08/31/updated-schemas/__next._tree.txt
@@ -0,0 +1,4 @@
+:HL["/_next/static/chunks/32a0415c8ab1bd26.css","style"]
+:HL["/_next/static/media/GeistMono_Variable.p.2f937313.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+:HL["/_next/static/media/Geist_Variable-s.p.92592eb2.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","tree":{"name":"","paramType":null,"paramKey":"","hasRuntimePrefetch":false,"slots":{"children":{"name":"(site)","paramType":null,"paramKey":"(site)","hasRuntimePrefetch":false,"slots":{"children":{"name":"blogs","paramType":null,"paramKey":"blogs","hasRuntimePrefetch":false,"slots":{"children":{"name":"slug","paramType":"c","paramKey":"2023/08/31/updated-schemas","hasRuntimePrefetch":false,"slots":{"children":{"name":"__PAGE__","paramType":null,"para [...]
diff --git a/blogs/2023/08/31/updated-schemas/index.html b/blogs/2023/08/31/updated-schemas/index.html
new file mode 100644
index 00000000..d09a97f0
--- /dev/null
+++ b/blogs/2023/08/31/updated-schemas/index.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html><!--uBHgltRE2s5QA49x61S_u--><html lang="en" class="geistsans_d5a4f12f-module__Ur3q_a__variable geistmono_157ca88a-module__iaM1Ya__variable"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" href="/_next/static/media/GeistMono_Variable.p.2f937313.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="preload" href="/_next/static/media/Geist_Variable-s.p.92592eb2.woff2" as="font" crossorigin="" type=" [...]
+<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="breaking-changes"><a data-card="" href="#breaking-changes" class="peer">Breaking changes</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 [...]
+<p>Breaking changes have been introduced with the commit <a href="https://github.com/apache/iggy/commit/670a8baba8617bb7e52bd51d556a621349e2e9f0" rel="noreferrer noopener" target="_blank">#670a8ba</a>. The available <a href="https://crates.io/crates/iggy" rel="noreferrer noopener" target="_blank">iggy crate</a> supports these changes since version 0.0.60.</p>
+<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="pollmessages"><a data-card="" href="#pollmessages" class="peer">PollMessages</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.5 [...]
+<p>By default, the <code>PollMessages</code> used to return <code>Vec<Message></code> as a response, which has been changed to <code>PolledMessages</code> struct, that contains the <code>partition_id</code>, <code>current_offset</code> and <code>messages</code> field. The reason for this change was to provide more information about the current offset, and the partition from which the messages have been fetched - this might be especially useful when using the consumer groups feature [...]
+<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-3 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-c [...]
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> partition_id</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> u32</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> current_offset</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> u64</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> messages</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Vec</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"><</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">Message</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> [...]
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre></div></figure>
+<p>Serialization:</p>
+<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-3 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-c [...]
+<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="getconsumeroffset"><a data-card="" href="#getconsumeroffset" class="peer">GetConsumerOffset</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 1 [...]
+<p>Previously, the <code>GetConsumerOffset</code> command used to return <code>u64</code> as a response, which has been changed to <code>ConsumerOffsetInfo</code> struct, that contains the <code>partition_id</code>, <code>current_offset</code> and <code>stored_offset</code> field. Similar to the <code>PollMessages</code> response update, the additional data might be helpful when using the consumer groups feature.</p>
+<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-3 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-c [...]
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> partition_id</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> u32</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> current_offset</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> u64</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> stored_offset</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> u64</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre></div></figure>
+<p>Serialization:</p>
+<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-3 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-c [...]
+<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="stream-topic-partition"><a data-card="" href="#stream-topic-partition" class="peer">Stream, Topic, Partition</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="tru [...]
+<p>The <code>Stream</code>, <code>Topic</code> and <code>Partition</code> structs (along with the additional <code>Details</code> models when fetching the single object, not a list) have been extended with the <code>created_at</code> field, which contains the timestamp of the creation time (EPOCH in microseconds).</p>
+<p>The <code>created_at</code> field which is <code>u64</code> (8 bytes) is always serialized right after the <code>id</code> field, and then the remaining fields follow.</p></div><footer class="mt-16 border-t border-fd-border pt-8"><a class="inline-flex items-center gap-2 text-sm font-medium text-fd-primary transition-colors hover:opacity-80" href="/blogs/">← Back to all posts</a></footer></article></main><!--$--><!--/$--></main><script src="/_next/static/chunks/922b7f01aa6775a6.js" id= [...]
\ No newline at end of file
diff --git a/blogs/2023/08/31/updated-schemas/index.txt b/blogs/2023/08/31/updated-schemas/index.txt
new file mode 100644
index 00000000..0ee565db
--- /dev/null
+++ b/blogs/2023/08/31/updated-schemas/index.txt
@@ -0,0 +1,47 @@
+1:"$Sreact.fragment"
+2:I[17751,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js"],"RootProvider"]
+3:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+4:I[58298,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/5a37d4cb1abe17d7.js"],"default"]
+5:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+6:I[83571,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Header"]
+7:I[29966,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFDropdown"]
+8:I[36330,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFMobileLinks"]
+9:I[22016,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],""]
+a:I[88760,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Logo"]
+11:I[68027,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+:HL["/_next/static/chunks/32a0415c8ab1bd26.css","style"]
+:HL["/_next/static/media/GeistMono_Variable.p.2f937313.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+:HL["/_next/static/media/Geist_Variable-s.p.92592eb2.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+0:{"P":null,"b":"uBHgltRE2s5QA49x61S_u","c":["","blogs","2023","08","31","updated-schemas",""],"q":"","i":false,"f":[[["",{"children":["(site)",{"children":["blogs",{"children":[["slug","2023/08/31/updated-schemas","c"],{"children":["__PAGE__",{}]}]}]}]},"$undefined","$undefined",true],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/32a0415c8ab1bd26.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","scri [...]
+13:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"OutletBoundary"]
+14:"$Sreact.suspense"
+16:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"ViewportBoundary"]
+18:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"MetadataBoundary"]
+b:["$","h1",null,{"className":"next-error-h1","style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:1:props:style","children":404}]
+c:["$","div",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:style","children":["$","h2",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style","children":"This page could not be found."}]}]
+d:["$","$1","c",{"children":[null,["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}]
+e:["$","$1","c",{"children":[null,["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}]
+f:["$","$1","c",{"children":["$L12",[["$","script","script-0",{"src":"/_next/static/chunks/00b00679782d0ffd.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/3562882a488c4fbb.js","async":true,"nonce":"$undefined"}]],["$","$L13",null,{"children":["$","$14",null,{"name":"Next.MetadataOutlet","children":"$@15"}]}]]}]
+10:["$","$1","h",{"children":[null,["$","$L16",null,{"children":"$L17"}],["$","div",null,{"hidden":true,"children":["$","$L18",null,{"children":["$","$14",null,{"name":"Next.Metadata","children":"$L19"}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}]
+1a:I[47873,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"default"]
+12:["$","main",null,{"className":"min-h-screen px-6 py-16 md:px-12","children":["$","article",null,{"className":"mx-auto max-w-5xl","children":[["$","header",null,{"className":"mb-10","children":[["$","time",null,{"className":"text-sm font-medium text-fd-muted-foreground","children":"August 31, 2023"}],["$","h1",null,{"className":"mt-3 text-3xl font-extrabold tracking-tight text-fd-foreground md:text-5xl","children":"Updated schemas"}],["$","p",null,{"className":"mt-4 text-base text-fd-m [...]
+27:I[44324,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"CodeBlock"]
+2a:I[44324,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"Pre"]
+28:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+1c:["$","p",null,{"children":"Serialization:"}]
+1d:["$","$L27",null,{"className":"shiki shiki-themes github-light github-dark","style":{"--shiki-light":"#24292e","--shiki-dark":"#e1e4e8","--shiki-light-bg":"#fff","--shiki-dark-bg":"#24292e"},"tabIndex":"0","icon":"<svg viewBox=\"0 0 24 24\"><path d=\"M 6,1 C 4.354992,1 3,2.354992 3,4 v 16 c 0,1.645008 1.354992,3 3,3 h 12 c 1.645008,0 3,-1.354992 3,-3 V 8 7 A 1.0001,1.0001 0 0 0 20.707031,6.2929687 l -5,-5 A 1.0001,1.0001 0 0 0 15,1 h -1 z m 0,2 h 7 v 3 c 0,1.645008 1.354992,3 3,3 h 3 [...]
+1e:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"getconsumeroffset","children":[["$","a",null,{"data-card":"","href":"#getconsumeroffset","className":"peer","children":"GetConsumerOffset"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrin [...]
+1f:["$","p",null,{"children":["Previously, the ",["$","code",null,{"children":"GetConsumerOffset"}]," command used to return ",["$","code",null,{"children":"u64"}]," as a response, which has been changed to ",["$","code",null,{"children":"ConsumerOffsetInfo"}]," struct, that contains the ",["$","code",null,{"children":"partition_id"}],", ",["$","code",null,{"children":"current_offset"}]," and ",["$","code",null,{"children":"stored_offset"}]," field. Similar to the ",["$","code",null,{"ch [...]
+2b:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+21:["$","p",null,{"children":"Serialization:"}]
+22:["$","$L27",null,{"className":"shiki shiki-themes github-light github-dark","style":{"--shiki-light":"#24292e","--shiki-dark":"#e1e4e8","--shiki-light-bg":"#fff","--shiki-dark-bg":"#24292e"},"tabIndex":"0","icon":"<svg viewBox=\"0 0 24 24\"><path d=\"M 6,1 C 4.354992,1 3,2.354992 3,4 v 16 c 0,1.645008 1.354992,3 3,3 h 12 c 1.645008,0 3,-1.354992 3,-3 V 8 7 A 1.0001,1.0001 0 0 0 20.707031,6.2929687 l -5,-5 A 1.0001,1.0001 0 0 0 15,1 h -1 z m 0,2 h 7 v 3 c 0,1.645008 1.354992,3 3,3 h 3 [...]
+23:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"stream-topic-partition","children":[["$","a",null,{"data-card":"","href":"#stream-topic-partition","className":"peer","children":"Stream, Topic, Partition"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-li [...]
+24:["$","p",null,{"children":["The ",["$","code",null,{"children":"Stream"}],", ",["$","code",null,{"children":"Topic"}]," and ",["$","code",null,{"children":"Partition"}]," structs (along with the additional ",["$","code",null,{"children":"Details"}]," models when fetching the single object, not a list) have been extended with the ",["$","code",null,{"children":"created_at"}]," field, which contains the timestamp of the creation time (EPOCH in microseconds)."]}]
+25:["$","p",null,{"children":["The ",["$","code",null,{"children":"created_at"}]," field which is ",["$","code",null,{"children":"u64"}]," (8 bytes) is always serialized right after the ",["$","code",null,{"children":"id"}]," field, and then the remaining fields follow."]}]
+26:["$","footer",null,{"className":"mt-16 border-t border-fd-border pt-8","children":["$","$L9",null,{"href":"/blogs","className":"inline-flex items-center gap-2 text-sm font-medium text-fd-primary transition-colors hover:opacity-80","children":"← Back to all posts"}]}]
+29:["$","$L2a",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" PolledMessages"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E [...]
+2c:["$","$L2a",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" ConsumerOffsetInfo"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark" [...]
+17:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
+2d:I[27201,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"IconMark"]
+15:null
+19:[["$","title","0",{"children":"Updated schemas | Apache Iggy"}],["$","link","1",{"rel":"icon","href":"/img/favicon.png"}],["$","$L2d","2",{}]]
diff --git a/blogs/2023/09/20/users-and-permissions/__next.!KHNpdGUp.blogs.$c$slug.__PAGE__.txt b/blogs/2023/09/20/users-and-permissions/__next.!KHNpdGUp.blogs.$c$slug.__PAGE__.txt
new file mode 100644
index 00000000..7061dee6
--- /dev/null
+++ b/blogs/2023/09/20/users-and-permissions/__next.!KHNpdGUp.blogs.$c$slug.__PAGE__.txt
@@ -0,0 +1,196 @@
+1:"$Sreact.fragment"
+2:I[44324,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"CodeBlock"]
+2f:I[44324,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"Pre"]
+30:I[47873,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"default"]
+9e:I[22016,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],""]
+9f:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"OutletBoundary"]
+a0:"$Sreact.suspense"
+3:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 0 [...]
+4:["$","$L2f",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" ClientInfo"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8 [...]
+5:["$","p",null,{"children":["The ",["$","code",null,{"children":"user_id"}]," field is optional, and it's only returned when the user is authenticated. Otherwise, it's set to ",["$","code",null,{"children":"None"}]," (0 value for binary transport) or ",["$","code",null,{"children":"null"}]," (HTTP transport)."]}]
+6:["$","p",null,{"children":["Keep in mind that the ",["$","code",null,{"children":"client"}]," represents the application connected to the server - since it's possible that multiple applications would share the same user credentials, thus you can think of a ",["$","code",null,{"children":"client"}]," as a single connection from the application to the server (1 user -> N clients)."]}]
+7:["$","p",null,{"children":["This breaking change has been introduced with the commit ",["$","$L30",null,{"href":"https://github.com/apache/iggy/commit/23b330928aa38463ef907c95a9f672fa7b728881","children":"#23b3309"}],". The available ",["$","$L30",null,{"href":"https://crates.io/crates/iggy","children":"iggy crate"}]," supports these changes since version 0.0.80."]}]
+8:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"configuration","children":[["$","a",null,{"data-card":"","href":"#configuration","className":"peer","children":"Configuration"}],["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opa [...]
+9:["$","p",null,{"children":["Currently, the authentication and authorization can be enabled in the ",["$","code",null,{"children":"server.toml"}]," configuration via ",["$","code",null,{"children":"[system.user]"}]," section:"]}]
+a:["$","$L2",null,{"className":"shiki shiki-themes github-light github-dark","style":{"--shiki-light":"#24292e","--shiki-dark":"#e1e4e8","--shiki-light-bg":"#fff","--shiki-dark-bg":"#24292e"},"tabIndex":"0","icon":"<svg viewBox=\"0 0 24 24\"><path d=\"M 6,1 C 4.354992,1 3,2.354992 3,4 v 16 c 0,1.645008 1.354992,3 3,3 h 12 c 1.645008,0 3,-1.354992 3,-3 V 8 7 A 1.0001,1.0001 0 0 0 20.707031,6.2929687 l -5,-5 A 1.0001,1.0001 0 0 0 15,1 h -1 z m 0,2 h 7 v 3 c 0,1.645008 1.354992,3 3,3 h 3 v [...]
+b:["$","p",null,{"children":"This might change in the future releases (e.g. authentication and authorization will always be enabled), but in order to avoid the breaking changes to the existing clients SDKs, these options are configurable for now."}]
+c:["$","p",null,{"children":["The additional settings for HTTP API which uses JWT (JSON Web Token), can be found in the ",["$","code",null,{"children":"[http.jwt]"}]," section:"]}]
+d:["$","$L2",null,{"className":"shiki shiki-themes github-light github-dark","style":{"--shiki-light":"#24292e","--shiki-dark":"#e1e4e8","--shiki-light-bg":"#fff","--shiki-dark-bg":"#24292e"},"tabIndex":"0","icon":"<svg viewBox=\"0 0 24 24\"><path d=\"M 6,1 C 4.354992,1 3,2.354992 3,4 v 16 c 0,1.645008 1.354992,3 3,3 h 12 c 1.645008,0 3,-1.354992 3,-3 V 8 7 A 1.0001,1.0001 0 0 0 20.707031,6.2929687 l -5,-5 A 1.0001,1.0001 0 0 0 15,1 h -1 z m 0,2 h 7 v 3 c 0,1.645008 1.354992,3 3,3 h 3 v [...]
+e:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"authentication-and-authorization","children":[["$","a",null,{"data-card":"","href":"#authentication-and-authorization","className":"peer","children":"Authentication and authorization"}],["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide l [...]
+f:["$","p",null,{"children":["The overall implementation of the users authentication and authorization is rather typical. All the server methods except ",["$","code",null,{"children":"ping"}]," and ",["$","code",null,{"children":"login"}]," require the user to be authenticated. The ",["$","code",null,{"children":"login"}]," method is used to authenticate the user, and it returns the optional ",["$","code",null,{"children":"token"}]," which is then used to authenticate the user in the sub [...]
+10:["$","p",null,{"children":"The authorization is based on the permissions, which are defined for each user. All the server methods have the specific authorization policies applied. For example, you can allow the user to read all the streams, or manage all the topics, while on the other hand, you could also specify only the set of particular streams or topics to which the user can send and/or poll the message to/from."}]
+11:["$","p",null,{"children":"Take a look at the following JSON example to get the overall idea:"}]
+12:["$","$L2",null,{"className":"shiki shiki-themes github-light github-dark","style":{"--shiki-light":"#24292e","--shiki-dark":"#e1e4e8","--shiki-light-bg":"#fff","--shiki-dark-bg":"#24292e"},"tabIndex":"0","icon":"<svg viewBox=\"0 0 24 24\"><path d=\"M 6,1 C 4.354992,1 3,2.354992 3,4 v 16 c 0,1.645008 1.354992,3 3,3 h 12 c 1.645008,0 3,-1.354992 3,-3 V 8 7 A 1.0001,1.0001 0 0 0 20.707031,6.2929687 l -5,-5 A 1.0001,1.0001 0 0 0 15,1 h -1 z m 0,2 h 7 v 3 c 0,1.645008 1.354992,3 3,3 h 3 v [...]
+13:["$","p",null,{"children":"Each user might have the global permissions which do apply to all the available streams and topics, as well as the granular permissions for each stream and its topics (this is a simple hashmap using the stream or topic ID as its key)."}]
+14:["$","p",null,{"children":["For example, the ",["$","code",null,{"children":"root user"}],", which has the default username and password ",["$","code",null,{"children":"iggy"}]," and cannot be updated or deleted, can do everything, simply by having the following permissions:"]}]
+15:["$","$L2",null,{"className":"shiki shiki-themes github-light github-dark","style":{"--shiki-light":"#24292e","--shiki-dark":"#e1e4e8","--shiki-light-bg":"#fff","--shiki-dark-bg":"#24292e"},"tabIndex":"0","icon":"<svg viewBox=\"0 0 24 24\"><path d=\"M 6,1 C 4.354992,1 3,2.354992 3,4 v 16 c 0,1.645008 1.354992,3 3,3 h 12 c 1.645008,0 3,-1.354992 3,-3 V 8 7 A 1.0001,1.0001 0 0 0 20.707031,6.2929687 l -5,-5 A 1.0001,1.0001 0 0 0 15,1 h -1 z m 0,2 h 7 v 3 c 0,1.645008 1.354992,3 3,3 h 3 v [...]
+16:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"sdk","children":[["$","a",null,{"data-card":"","href":"#sdk","className":"peer","children":"SDK"}],["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity pee [...]
+17:["$","p",null,{"children":["The new ",["$","code",null,{"children":"UserClient"}]," trait has been added in order to support the users and permissions feature. It is implemented for all the available transport protocols."]}]
+50:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+19:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"commands-and-models","children":[["$","a",null,{"data-card":"","href":"#commands-and-models","className":"peer","children":"Commands and models"}],["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-m [...]
+1a:["$","p",null,{"children":"The following commands and response models have been added:"}]
+52:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+54:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+56:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+58:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+5a:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+5c:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+5e:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+60:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+62:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+64:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+66:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+68:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+27:["$","p",null,{"children":["Similar to the stream and topic ID, the user will always have the unique numeric ID and the username. The username must be within the range of 3–50 chars and will always be lowercased, using the same regex as the stream and topic name ",["$","code",null,{"children":"^[\\w\\.\\-\\s]+$"}],". The password must be within the range of 3–100 chars and will be hashed using the bcrypt algorithm."]}]
+28:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"http-api","children":[["$","a",null,{"data-card":"","href":"#http-api","className":"peer","children":"HTTP API"}],["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transit [...]
+29:["$","p",null,{"children":["The following endpoints have been added, and as always, you can find them in the ",["$","code",null,{"children":"server.http"}]," file in the main repository."]}]
+2a:["$","$L2",null,{"className":"shiki shiki-themes github-light github-dark","style":{"--shiki-light":"#24292e","--shiki-dark":"#e1e4e8","--shiki-light-bg":"#fff","--shiki-dark-bg":"#24292e"},"tabIndex":"0","icon":"<svg viewBox=\"0 0 24 24\"><path d=\"M 6,1 C 4.354992,1 3,2.354992 3,4 v 16 c 0,1.645008 1.354992,3 3,3 h 12 c 1.645008,0 3,-1.354992 3,-3 V 8 7 A 1.0001,1.0001 0 0 0 20.707031,6.2929687 l -5,-5 A 1.0001,1.0001 0 0 0 15,1 h -1 z m 0,2 h 7 v 3 c 0,1.645008 1.354992,3 3,3 h 3 v [...]
+2b:["$","footer",null,{"className":"mt-16 border-t border-fd-border pt-8","children":["$","$L9e",null,{"href":"/blogs","className":"inline-flex items-center gap-2 text-sm font-medium text-fd-primary transition-colors hover:opacity-80","children":"← Back to all posts"}]}]
+2c:["$","script","script-0",{"src":"/_next/static/chunks/00b00679782d0ffd.js","async":true}]
+2d:["$","script","script-1",{"src":"/_next/static/chunks/3562882a488c4fbb.js","async":true}]
+2e:["$","$L9f",null,{"children":["$","$a0",null,{"name":"Next.MetadataOutlet","children":"$@a1"}]}]
+31:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"read_topics\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": "}],["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":"true"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+32:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"poll_messages\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": "}],["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":"true"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+33:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"send_messages\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": "}],["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":"true"}]]}]
+34:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" },"}]}]
+35:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"streams\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": {"}]]}]
+36:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"1\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": {"}]]}]
+37:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"manage_stream\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": "}],["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":"false"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+38:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"read_stream\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": "}],["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":"true"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+39:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"manage_topics\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": "}],["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":"false"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+3a:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"read_topics\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": "}],["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":"true"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+3b:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"poll_messages\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": "}],["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":"true"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+3c:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"send_messages\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": "}],["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":"true"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+3d:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"topics\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": {"}]]}]
+3e:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"1\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": {"}]]}]
+3f:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"manage_topic\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": "}],["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":"false"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+40:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"read_topic\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": "}],["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":"true"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+41:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"poll_messages\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": "}],["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":"true"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+42:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"send_messages\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": "}],["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":"true"}]]}]
+43:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" }"}]}]
+44:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" }"}]}]
+45:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" }"}]}]
+46:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" }"}]}]
+47:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" }"}]}]
+48:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"}"}]}]
+49:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"read_topics\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": "}],["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":"true"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+4a:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"poll_messages\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": "}],["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":"true"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+4b:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"send_messages\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": "}],["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":"true"}]]}]
+4c:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" },"}]}]
+4d:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"streams\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": "}],["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":"null"}]]}]
+4e:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" }"}]}]
+4f:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"}"}]}]
+51:["$","$L2f",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" trait"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" UserClient"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8 [...]
+53:["$","$L2f",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" IdentityInfo"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E [...]
+55:["$","$L2f",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" UserInfo"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8" [...]
+57:["$","$L2f",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Permissions"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4 [...]
+59:["$","$L2f",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" GetUser"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"} [...]
+5b:["$","$L2f",null,{"children":["$","code",null,{"children":["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" GetUsers"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"} [...]
+5d:["$","$L2f",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" CreateUser"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E [...]
+5f:["$","$L2f",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" DeleteUser"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E [...]
+61:["$","$L2f",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" UpdateUser"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E [...]
+63:["$","$L2f",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" UpdatePermissions"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark": [...]
+65:["$","$L2f",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" ChangePassword"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E [...]
+67:["$","$L2f",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" LoginUser"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8 [...]
+69:["$","$L2f",null,{"children":["$","code",null,{"children":["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" LogoutUser"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8 [...]
+6a:["$","span",null,{"children":"}"}]
+6b:["$","span",null,{"className":"line","children":["$","span",null,{}]}]
+6c:["$","span",null,{"className":"line","children":["$","span",null,{"children":"PUT {{url}}/users/user1/password"}]}]
+6d:["$","span",null,{"className":"line","children":["$","span",null,{"children":"Authorization: Bearer {{token}}"}]}]
+6e:["$","span",null,{"className":"line","children":["$","span",null,{"children":"Content-Type: application/json"}]}]
+6f:["$","span",null,{"className":"line","children":["$","span",null,{}]}]
+70:["$","span",null,{"className":"line","children":["$","span",null,{"children":"{"}]}]
+71:["$","span",null,{"className":"line","children":["$","span",null,{"children":" \"current_password\": \"secret\","}]}]
+72:["$","span",null,{"className":"line","children":["$","span",null,{"children":" \"new_password\": \"secret1\""}]}]
+73:["$","span",null,{"className":"line","children":["$","span",null,{"children":"}"}]}]
+74:["$","span",null,{"className":"line","children":["$","span",null,{}]}]
+75:["$","span",null,{"className":"line","children":["$","span",null,{"children":"PUT {{url}}/users/user1permissions"}]}]
+76:["$","span",null,{"className":"line","children":["$","span",null,{"children":"Authorization: Bearer {{token}}"}]}]
+77:["$","span",null,{"className":"line","children":["$","span",null,{"children":"Content-Type: application/json"}]}]
+78:["$","span",null,{"className":"line","children":["$","span",null,{}]}]
+79:["$","span",null,{"className":"line","children":["$","span",null,{"children":"{"}]}]
+7a:["$","span",null,{"className":"line","children":["$","span",null,{"children":" \"permissions\": {"}]}]
+7b:["$","span",null,{"className":"line","children":["$","span",null,{"children":" \"global\": {"}]}]
+7c:["$","span",null,{"className":"line","children":["$","span",null,{"children":" \"manage_servers\": false,"}]}]
+7d:["$","span",null,{"className":"line","children":["$","span",null,{"children":" \"read_servers\": true,"}]}]
+7e:["$","span",null,{"className":"line","children":["$","span",null,{"children":" \"manage_users\": true,"}]}]
+7f:["$","span",null,{"className":"line","children":["$","span",null,{"children":" \"read_users\": true,"}]}]
+80:["$","span",null,{"className":"line","children":["$","span",null,{"children":" \"manage_streams\": false,"}]}]
+81:["$","span",null,{"className":"line","children":["$","span",null,{"children":" \"read_streams\": true,"}]}]
+82:["$","span",null,{"className":"line","children":["$","span",null,{"children":" \"manage_topics\": false,"}]}]
+83:["$","span",null,{"className":"line","children":["$","span",null,{"children":" \"read_topics\": true,"}]}]
+84:["$","span",null,{"className":"line","children":["$","span",null,{"children":" \"poll_messages\": true,"}]}]
+85:["$","span",null,{"className":"line","children":["$","span",null,{"children":" \"send_messages\": true"}]}]
+86:["$","span",null,{"className":"line","children":["$","span",null,{"children":" },"}]}]
+87:["$","span",null,{"className":"line","children":["$","span",null,{"children":" \"streams\": {"}]}]
+88:["$","span",null,{"className":"line","children":["$","span",null,{"children":" \"1\": {"}]}]
+89:["$","span",null,{"className":"line","children":["$","span",null,{"children":" \"manage_stream\": false,"}]}]
+8a:["$","span",null,{"className":"line","children":["$","span",null,{"children":" \"read_stream\": true,"}]}]
+8b:["$","span",null,{"className":"line","children":["$","span",null,{"children":" \"manage_topics\": false,"}]}]
+8c:["$","span",null,{"className":"line","children":["$","span",null,{"children":" \"read_topics\": true,"}]}]
+8d:["$","span",null,{"className":"line","children":["$","span",null,{"children":" \"poll_messages\": true,"}]}]
+8e:["$","span",null,{"className":"line","children":["$","span",null,{"children":" \"send_messages\": true,"}]}]
+8f:["$","span",null,{"className":"line","children":["$","span",null,{"children":" \"topics\": {"}]}]
+90:["$","span",null,{"className":"line","children":["$","span",null,{"children":" \"1\": {"}]}]
+91:["$","span",null,{"className":"line","children":["$","span",null,{"children":" \"manage_topic\": false,"}]}]
+92:["$","span",null,{"className":"line","children":["$","span",null,{"children":" \"read_topic\": true,"}]}]
+93:["$","span",null,{"className":"line","children":["$","span",null,{"children":" \"poll_messages\": true,"}]}]
+94:["$","span",null,{"className":"line","children":["$","span",null,{"children":" \"send_messages\": true"}]}]
+95:["$","span",null,{"className":"line","children":["$","span",null,{"children":" }"}]}]
+96:["$","span",null,{"className":"line","children":["$","span",null,{"children":" }"}]}]
+97:["$","span",null,{"className":"line","children":["$","span",null,{"children":" }"}]}]
+98:["$","span",null,{"className":"line","children":["$","span",null,{"children":" }"}]}]
+99:["$","span",null,{"className":"line","children":["$","span",null,{"children":" }"}]}]
+9a:["$","span",null,{"className":"line","children":["$","span",null,{"children":"}"}]}]
+9b:["$","span",null,{"className":"line","children":["$","span",null,{}]}]
+9c:["$","span",null,{"className":"line","children":["$","span",null,{"children":"DELETE {{url}}/users/user1"}]}]
+9d:["$","span",null,{"className":"line","children":["$","span",null,{"children":"Authorization: Bearer {{token}}"}]}]
+a1:null
+a2:["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":"self"}]
+a3:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":", command"}]
+a4:["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}]
+a5:["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" &"}]
+a6:["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"CreateUser"}]
+a7:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":") "}]
+a8:["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"->"}]
+a9:["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Result"}]
+aa:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"<(), "}]
+ab:["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"Error"}]
+ac:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":">;"}]
+ad:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" async"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" fn"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" delete_user"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"("}],["$","span",null,{"style":{"--shiki [...]
+ae:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" async"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" fn"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" update_user"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"("}],["$","span",null,{"style":{"--shiki [...]
+af:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" async"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" fn"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" update_permissions"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"("}],["$","span",null,{"style":{" [...]
+b0:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" async"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" fn"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" change_password"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"("}],["$","span",null,{"style":{"--s [...]
+b1:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" async"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" fn"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" login_user"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"("}],["$","span",null,{"style":{"--shiki- [...]
+b2:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" async"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" fn"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" logout_user"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"("}],["$","span",null,{"style":{"--shiki [...]
+b3:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"}"}]}]
+b4:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]
+b5:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" pub"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" username"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" String"}],["$","span",null,{"style":{"--shiki- [...]
+b6:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" pub"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" permissions"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Option"}],["$","span",null,{"style":{"--shi [...]
+b7:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"}"}]}]
+b8:["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" bool"}]
+b9:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]
+ba:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" pub"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" manage_streams"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" bool"}],["$","span",null,{"style":{"--sh [...]
+bb:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" pub"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" read_streams"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" bool"}],["$","span",null,{"style":{"--shik [...]
+bc:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" pub"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" manage_topics"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" bool"}],["$","span",null,{"style":{"--shi [...]
+bd:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" pub"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" read_topics"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" bool"}],["$","span",null,{"style":{"--shiki [...]
+be:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" pub"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" poll_messages"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" bool"}],["$","span",null,{"style":{"--shi [...]
+bf:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" pub"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" send_messages"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" bool"}],["$","span",null,{"style":{"--shi [...]
+c0:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"}"}]}]
+c1:["$","span",null,{"className":"line"}]
+c2:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" StreamPermissions"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" {"}]]}]
+c3:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" pub"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" manage_stream"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" bool"}],["$","span",null,{"style":{"--shi [...]
+c4:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" pub"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" read_stream"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" bool"}],["$","span",null,{"style":{"--shiki [...]
+c5:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" pub"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" manage_topics"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" bool"}],["$","span",null,{"style":{"--shi [...]
+c6:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" pub"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" read_topics"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" bool"}],["$","span",null,{"style":{"--shiki [...]
+c7:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" pub"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" poll_messages"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" bool"}],["$","span",null,{"style":{"--shi [...]
+c8:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" pub"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" send_messages"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" bool"}],["$","span",null,{"style":{"--shi [...]
+c9:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" pub"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" topics"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Option"}],["$","span",null,{"style":{"--shiki-li [...]
+ca:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"}"}]}]
+cb:["$","span",null,{"className":"line"}]
+cc:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" TopicPermissions"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" {"}]]}]
+cd:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" pub"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" manage_topic"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" bool"}],["$","span",null,{"style":{"--shik [...]
+ce:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" pub"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" read_topic"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" bool"}],["$","span",null,{"style":{"--shiki- [...]
+cf:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" pub"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" poll_messages"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" bool"}],["$","span",null,{"style":{"--shi [...]
+d0:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" pub"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" send_messages"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" bool"}],["$","span",null,{"style":{"--shi [...]
+d1:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"}"}]}]
diff --git a/blogs/2023/09/20/users-and-permissions/__next.!KHNpdGUp.blogs.$c$slug.txt b/blogs/2023/09/20/users-and-permissions/__next.!KHNpdGUp.blogs.$c$slug.txt
new file mode 100644
index 00000000..11b31bb0
--- /dev/null
+++ b/blogs/2023/09/20/users-and-permissions/__next.!KHNpdGUp.blogs.$c$slug.txt
@@ -0,0 +1,4 @@
+1:"$Sreact.fragment"
+2:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+3:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","template":["$","$L3",null,{}]}]]}],"loading":null,"isPartial":false}
diff --git a/blogs/2023/09/20/users-and-permissions/__next.!KHNpdGUp.blogs.txt b/blogs/2023/09/20/users-and-permissions/__next.!KHNpdGUp.blogs.txt
new file mode 100644
index 00000000..11b31bb0
--- /dev/null
+++ b/blogs/2023/09/20/users-and-permissions/__next.!KHNpdGUp.blogs.txt
@@ -0,0 +1,4 @@
+1:"$Sreact.fragment"
+2:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+3:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","template":["$","$L3",null,{}]}]]}],"loading":null,"isPartial":false}
diff --git a/blogs/2023/09/20/users-and-permissions/__next.!KHNpdGUp.txt b/blogs/2023/09/20/users-and-permissions/__next.!KHNpdGUp.txt
new file mode 100644
index 00000000..ea3bfa55
--- /dev/null
+++ b/blogs/2023/09/20/users-and-permissions/__next.!KHNpdGUp.txt
@@ -0,0 +1,9 @@
+1:"$Sreact.fragment"
+2:I[83571,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Header"]
+3:I[29966,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFDropdown"]
+4:I[36330,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFMobileLinks"]
+5:I[22016,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],""]
+6:I[88760,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Logo"]
+7:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+8:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","c",{"children":[[["$","script","script-0",{"src":"/_next/static/chunks/8d86be78428a601a.js","async":true}],["$","script","script-1",{"src":"/_next/static/chunks/da34cc6305706ac6.js","async":true}],["$","script","script-2",{"src":"/_next/static/chunks/9baf65674e2de991.js","async":true}],["$","script","script-3",{"src":"/_next/static/chunks/26b70f9828dd1eb5.js","async":true}],["$","script","script-4",{"src":"/_next/static/chunks/adeed83 [...]
diff --git a/blogs/2023/09/20/users-and-permissions/__next._full.txt b/blogs/2023/09/20/users-and-permissions/__next._full.txt
new file mode 100644
index 00000000..b2a03eaa
--- /dev/null
+++ b/blogs/2023/09/20/users-and-permissions/__next._full.txt
@@ -0,0 +1,217 @@
+1:"$Sreact.fragment"
+2:I[17751,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js"],"RootProvider"]
+3:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+4:I[58298,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/5a37d4cb1abe17d7.js"],"default"]
+5:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+6:I[83571,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Header"]
+7:I[29966,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFDropdown"]
+8:I[36330,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFMobileLinks"]
+9:I[22016,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],""]
+a:I[88760,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Logo"]
+11:I[68027,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+:HL["/_next/static/chunks/32a0415c8ab1bd26.css","style"]
+:HL["/_next/static/media/GeistMono_Variable.p.2f937313.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+:HL["/_next/static/media/Geist_Variable-s.p.92592eb2.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+0:{"P":null,"b":"uBHgltRE2s5QA49x61S_u","c":["","blogs","2023","09","20","users-and-permissions",""],"q":"","i":false,"f":[[["",{"children":["(site)",{"children":["blogs",{"children":[["slug","2023/09/20/users-and-permissions","c"],{"children":["__PAGE__",{}]}]}]}]},"$undefined","$undefined",true],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/32a0415c8ab1bd26.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","s [...]
+13:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"OutletBoundary"]
+14:"$Sreact.suspense"
+16:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"ViewportBoundary"]
+18:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"MetadataBoundary"]
+b:["$","h1",null,{"className":"next-error-h1","style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:1:props:style","children":404}]
+c:["$","div",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:style","children":["$","h2",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style","children":"This page could not be found."}]}]
+d:["$","$1","c",{"children":[null,["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}]
+e:["$","$1","c",{"children":[null,["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}]
+f:["$","$1","c",{"children":["$L12",[["$","script","script-0",{"src":"/_next/static/chunks/00b00679782d0ffd.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/3562882a488c4fbb.js","async":true,"nonce":"$undefined"}]],["$","$L13",null,{"children":["$","$14",null,{"name":"Next.MetadataOutlet","children":"$@15"}]}]]}]
+10:["$","$1","h",{"children":[null,["$","$L16",null,{"children":"$L17"}],["$","div",null,{"hidden":true,"children":["$","$L18",null,{"children":["$","$14",null,{"name":"Next.Metadata","children":"$L19"}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}]
+1a:I[44324,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"CodeBlock"]
+1b:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+44:I[44324,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"Pre"]
+45:I[47873,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"default"]
+1c:["$","$L44",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" ClientInfo"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E [...]
+1d:["$","p",null,{"children":["The ",["$","code",null,{"children":"user_id"}]," field is optional, and it's only returned when the user is authenticated. Otherwise, it's set to ",["$","code",null,{"children":"None"}]," (0 value for binary transport) or ",["$","code",null,{"children":"null"}]," (HTTP transport)."]}]
+1e:["$","p",null,{"children":["Keep in mind that the ",["$","code",null,{"children":"client"}]," represents the application connected to the server - since it's possible that multiple applications would share the same user credentials, thus you can think of a ",["$","code",null,{"children":"client"}]," as a single connection from the application to the server (1 user -> N clients)."]}]
+1f:["$","p",null,{"children":["This breaking change has been introduced with the commit ",["$","$L45",null,{"href":"https://github.com/apache/iggy/commit/23b330928aa38463ef907c95a9f672fa7b728881","children":"#23b3309"}],". The available ",["$","$L45",null,{"href":"https://crates.io/crates/iggy","children":"iggy crate"}]," supports these changes since version 0.0.80."]}]
+20:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"configuration","children":[["$","a",null,{"data-card":"","href":"#configuration","className":"peer","children":"Configuration"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd- [...]
+21:["$","p",null,{"children":["Currently, the authentication and authorization can be enabled in the ",["$","code",null,{"children":"server.toml"}]," configuration via ",["$","code",null,{"children":"[system.user]"}]," section:"]}]
+22:["$","$L1a",null,{"className":"shiki shiki-themes github-light github-dark","style":{"--shiki-light":"#24292e","--shiki-dark":"#e1e4e8","--shiki-light-bg":"#fff","--shiki-dark-bg":"#24292e"},"tabIndex":"0","icon":"<svg viewBox=\"0 0 24 24\"><path d=\"M 6,1 C 4.354992,1 3,2.354992 3,4 v 16 c 0,1.645008 1.354992,3 3,3 h 12 c 1.645008,0 3,-1.354992 3,-3 V 8 7 A 1.0001,1.0001 0 0 0 20.707031,6.2929687 l -5,-5 A 1.0001,1.0001 0 0 0 15,1 h -1 z m 0,2 h 7 v 3 c 0,1.645008 1.354992,3 3,3 h 3 [...]
+23:["$","p",null,{"children":"This might change in the future releases (e.g. authentication and authorization will always be enabled), but in order to avoid the breaking changes to the existing clients SDKs, these options are configurable for now."}]
+24:["$","p",null,{"children":["The additional settings for HTTP API which uses JWT (JSON Web Token), can be found in the ",["$","code",null,{"children":"[http.jwt]"}]," section:"]}]
+25:["$","$L1a",null,{"className":"shiki shiki-themes github-light github-dark","style":{"--shiki-light":"#24292e","--shiki-dark":"#e1e4e8","--shiki-light-bg":"#fff","--shiki-dark-bg":"#24292e"},"tabIndex":"0","icon":"<svg viewBox=\"0 0 24 24\"><path d=\"M 6,1 C 4.354992,1 3,2.354992 3,4 v 16 c 0,1.645008 1.354992,3 3,3 h 12 c 1.645008,0 3,-1.354992 3,-3 V 8 7 A 1.0001,1.0001 0 0 0 20.707031,6.2929687 l -5,-5 A 1.0001,1.0001 0 0 0 15,1 h -1 z m 0,2 h 7 v 3 c 0,1.645008 1.354992,3 3,3 h 3 [...]
+26:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"authentication-and-authorization","children":[["$","a",null,{"data-card":"","href":"#authentication-and-authorization","className":"peer","children":"Authentication and authorization"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round"," [...]
+27:["$","p",null,{"children":["The overall implementation of the users authentication and authorization is rather typical. All the server methods except ",["$","code",null,{"children":"ping"}]," and ",["$","code",null,{"children":"login"}]," require the user to be authenticated. The ",["$","code",null,{"children":"login"}]," method is used to authenticate the user, and it returns the optional ",["$","code",null,{"children":"token"}]," which is then used to authenticate the user in the su [...]
+28:["$","p",null,{"children":"The authorization is based on the permissions, which are defined for each user. All the server methods have the specific authorization policies applied. For example, you can allow the user to read all the streams, or manage all the topics, while on the other hand, you could also specify only the set of particular streams or topics to which the user can send and/or poll the message to/from."}]
+29:["$","p",null,{"children":"Take a look at the following JSON example to get the overall idea:"}]
+2a:["$","$L1a",null,{"className":"shiki shiki-themes github-light github-dark","style":{"--shiki-light":"#24292e","--shiki-dark":"#e1e4e8","--shiki-light-bg":"#fff","--shiki-dark-bg":"#24292e"},"tabIndex":"0","icon":"<svg viewBox=\"0 0 24 24\"><path d=\"M 6,1 C 4.354992,1 3,2.354992 3,4 v 16 c 0,1.645008 1.354992,3 3,3 h 12 c 1.645008,0 3,-1.354992 3,-3 V 8 7 A 1.0001,1.0001 0 0 0 20.707031,6.2929687 l -5,-5 A 1.0001,1.0001 0 0 0 15,1 h -1 z m 0,2 h 7 v 3 c 0,1.645008 1.354992,3 3,3 h 3 [...]
+2b:["$","p",null,{"children":"Each user might have the global permissions which do apply to all the available streams and topics, as well as the granular permissions for each stream and its topics (this is a simple hashmap using the stream or topic ID as its key)."}]
+2c:["$","p",null,{"children":["For example, the ",["$","code",null,{"children":"root user"}],", which has the default username and password ",["$","code",null,{"children":"iggy"}]," and cannot be updated or deleted, can do everything, simply by having the following permissions:"]}]
+2d:["$","$L1a",null,{"className":"shiki shiki-themes github-light github-dark","style":{"--shiki-light":"#24292e","--shiki-dark":"#e1e4e8","--shiki-light-bg":"#fff","--shiki-dark-bg":"#24292e"},"tabIndex":"0","icon":"<svg viewBox=\"0 0 24 24\"><path d=\"M 6,1 C 4.354992,1 3,2.354992 3,4 v 16 c 0,1.645008 1.354992,3 3,3 h 12 c 1.645008,0 3,-1.354992 3,-3 V 8 7 A 1.0001,1.0001 0 0 0 20.707031,6.2929687 l -5,-5 A 1.0001,1.0001 0 0 0 15,1 h -1 z m 0,2 h 7 v 3 c 0,1.645008 1.354992,3 3,3 h 3 [...]
+2e:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"sdk","children":[["$","a",null,{"data-card":"","href":"#sdk","className":"peer","children":"SDK"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 tra [...]
+2f:["$","p",null,{"children":["The new ",["$","code",null,{"children":"UserClient"}]," trait has been added in order to support the users and permissions feature. It is implemented for all the available transport protocols."]}]
+65:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+31:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"commands-and-models","children":[["$","a",null,{"data-card":"","href":"#commands-and-models","className":"peer","children":"Commands and models"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 [...]
+32:["$","p",null,{"children":"The following commands and response models have been added:"}]
+67:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+69:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+6b:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+6d:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+6f:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+71:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+73:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+75:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+77:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+79:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+7b:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+7d:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+3f:["$","p",null,{"children":["Similar to the stream and topic ID, the user will always have the unique numeric ID and the username. The username must be within the range of 3–50 chars and will always be lowercased, using the same regex as the stream and topic name ",["$","code",null,{"children":"^[\\w\\.\\-\\s]+$"}],". The password must be within the range of 3–100 chars and will be hashed using the bcrypt algorithm."]}]
+40:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"http-api","children":[["$","a",null,{"data-card":"","href":"#http-api","className":"peer","children":"HTTP API"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-foregroun [...]
+41:["$","p",null,{"children":["The following endpoints have been added, and as always, you can find them in the ",["$","code",null,{"children":"server.http"}]," file in the main repository."]}]
+42:["$","$L1a",null,{"className":"shiki shiki-themes github-light github-dark","style":{"--shiki-light":"#24292e","--shiki-dark":"#e1e4e8","--shiki-light-bg":"#fff","--shiki-dark-bg":"#24292e"},"tabIndex":"0","icon":"<svg viewBox=\"0 0 24 24\"><path d=\"M 6,1 C 4.354992,1 3,2.354992 3,4 v 16 c 0,1.645008 1.354992,3 3,3 h 12 c 1.645008,0 3,-1.354992 3,-3 V 8 7 A 1.0001,1.0001 0 0 0 20.707031,6.2929687 l -5,-5 A 1.0001,1.0001 0 0 0 15,1 h -1 z m 0,2 h 7 v 3 c 0,1.645008 1.354992,3 3,3 h 3 [...]
+43:["$","footer",null,{"className":"mt-16 border-t border-fd-border pt-8","children":["$","$L9",null,{"href":"/blogs","className":"inline-flex items-center gap-2 text-sm font-medium text-fd-primary transition-colors hover:opacity-80","children":"← Back to all posts"}]}]
+46:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"read_topics\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": "}],["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":"true"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+47:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"poll_messages\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": "}],["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":"true"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+48:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"send_messages\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": "}],["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":"true"}]]}]
+49:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" },"}]}]
+4a:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"streams\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": {"}]]}]
+4b:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"1\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": {"}]]}]
+4c:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"manage_stream\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": "}],["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":"false"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+4d:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"read_stream\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": "}],["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":"true"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+4e:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"manage_topics\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": "}],["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":"false"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+4f:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"read_topics\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": "}],["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":"true"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+50:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"poll_messages\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": "}],["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":"true"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+51:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"send_messages\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": "}],["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":"true"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+52:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"topics\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": {"}]]}]
+53:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"1\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": {"}]]}]
+54:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"manage_topic\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": "}],["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":"false"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+55:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"read_topic\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": "}],["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":"true"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+56:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"poll_messages\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": "}],["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":"true"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+57:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"send_messages\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": "}],["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":"true"}]]}]
+58:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" }"}]}]
+59:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" }"}]}]
+5a:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" }"}]}]
+5b:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" }"}]}]
+5c:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" }"}]}]
+5d:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"}"}]}]
+5e:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"read_topics\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": "}],["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":"true"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+5f:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"poll_messages\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": "}],["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":"true"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+60:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"send_messages\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": "}],["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":"true"}]]}]
+61:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" },"}]}]
+62:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"streams\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": "}],["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":"null"}]]}]
+63:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" }"}]}]
+64:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"}"}]}]
+66:["$","$L44",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" trait"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" UserClient"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8 [...]
+68:["$","$L44",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" IdentityInfo"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E [...]
+6a:["$","$L44",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" UserInfo"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8" [...]
+6c:["$","$L44",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Permissions"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4 [...]
+6e:["$","$L44",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" GetUser"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"} [...]
+70:["$","$L44",null,{"children":["$","code",null,{"children":["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" GetUsers"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"} [...]
+72:["$","$L44",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" CreateUser"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E [...]
+74:["$","$L44",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" DeleteUser"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E [...]
+76:["$","$L44",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" UpdateUser"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E [...]
+78:["$","$L44",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" UpdatePermissions"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark": [...]
+7a:["$","$L44",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" ChangePassword"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E [...]
+7c:["$","$L44",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" LoginUser"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8 [...]
+7e:["$","$L44",null,{"children":["$","code",null,{"children":["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" LogoutUser"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8 [...]
+7f:["$","span",null,{"children":"}"}]
+80:["$","span",null,{"className":"line","children":["$","span",null,{}]}]
+81:["$","span",null,{"className":"line","children":["$","span",null,{"children":"PUT {{url}}/users/user1/password"}]}]
+82:["$","span",null,{"className":"line","children":["$","span",null,{"children":"Authorization: Bearer {{token}}"}]}]
+83:["$","span",null,{"className":"line","children":["$","span",null,{"children":"Content-Type: application/json"}]}]
+84:["$","span",null,{"className":"line","children":["$","span",null,{}]}]
+85:["$","span",null,{"className":"line","children":["$","span",null,{"children":"{"}]}]
+86:["$","span",null,{"className":"line","children":["$","span",null,{"children":" \"current_password\": \"secret\","}]}]
+87:["$","span",null,{"className":"line","children":["$","span",null,{"children":" \"new_password\": \"secret1\""}]}]
+88:["$","span",null,{"className":"line","children":["$","span",null,{"children":"}"}]}]
+89:["$","span",null,{"className":"line","children":["$","span",null,{}]}]
+8a:["$","span",null,{"className":"line","children":["$","span",null,{"children":"PUT {{url}}/users/user1permissions"}]}]
+8b:["$","span",null,{"className":"line","children":["$","span",null,{"children":"Authorization: Bearer {{token}}"}]}]
+8c:["$","span",null,{"className":"line","children":["$","span",null,{"children":"Content-Type: application/json"}]}]
+8d:["$","span",null,{"className":"line","children":["$","span",null,{}]}]
+8e:["$","span",null,{"className":"line","children":["$","span",null,{"children":"{"}]}]
+8f:["$","span",null,{"className":"line","children":["$","span",null,{"children":" \"permissions\": {"}]}]
+90:["$","span",null,{"className":"line","children":["$","span",null,{"children":" \"global\": {"}]}]
+91:["$","span",null,{"className":"line","children":["$","span",null,{"children":" \"manage_servers\": false,"}]}]
+92:["$","span",null,{"className":"line","children":["$","span",null,{"children":" \"read_servers\": true,"}]}]
+93:["$","span",null,{"className":"line","children":["$","span",null,{"children":" \"manage_users\": true,"}]}]
+94:["$","span",null,{"className":"line","children":["$","span",null,{"children":" \"read_users\": true,"}]}]
+95:["$","span",null,{"className":"line","children":["$","span",null,{"children":" \"manage_streams\": false,"}]}]
+96:["$","span",null,{"className":"line","children":["$","span",null,{"children":" \"read_streams\": true,"}]}]
+97:["$","span",null,{"className":"line","children":["$","span",null,{"children":" \"manage_topics\": false,"}]}]
+98:["$","span",null,{"className":"line","children":["$","span",null,{"children":" \"read_topics\": true,"}]}]
+99:["$","span",null,{"className":"line","children":["$","span",null,{"children":" \"poll_messages\": true,"}]}]
+9a:["$","span",null,{"className":"line","children":["$","span",null,{"children":" \"send_messages\": true"}]}]
+9b:["$","span",null,{"className":"line","children":["$","span",null,{"children":" },"}]}]
+9c:["$","span",null,{"className":"line","children":["$","span",null,{"children":" \"streams\": {"}]}]
+9d:["$","span",null,{"className":"line","children":["$","span",null,{"children":" \"1\": {"}]}]
+9e:["$","span",null,{"className":"line","children":["$","span",null,{"children":" \"manage_stream\": false,"}]}]
+9f:["$","span",null,{"className":"line","children":["$","span",null,{"children":" \"read_stream\": true,"}]}]
+a0:["$","span",null,{"className":"line","children":["$","span",null,{"children":" \"manage_topics\": false,"}]}]
+a1:["$","span",null,{"className":"line","children":["$","span",null,{"children":" \"read_topics\": true,"}]}]
+a2:["$","span",null,{"className":"line","children":["$","span",null,{"children":" \"poll_messages\": true,"}]}]
+a3:["$","span",null,{"className":"line","children":["$","span",null,{"children":" \"send_messages\": true,"}]}]
+a4:["$","span",null,{"className":"line","children":["$","span",null,{"children":" \"topics\": {"}]}]
+a5:["$","span",null,{"className":"line","children":["$","span",null,{"children":" \"1\": {"}]}]
+a6:["$","span",null,{"className":"line","children":["$","span",null,{"children":" \"manage_topic\": false,"}]}]
+a7:["$","span",null,{"className":"line","children":["$","span",null,{"children":" \"read_topic\": true,"}]}]
+a8:["$","span",null,{"className":"line","children":["$","span",null,{"children":" \"poll_messages\": true,"}]}]
+a9:["$","span",null,{"className":"line","children":["$","span",null,{"children":" \"send_messages\": true"}]}]
+aa:["$","span",null,{"className":"line","children":["$","span",null,{"children":" }"}]}]
+ab:["$","span",null,{"className":"line","children":["$","span",null,{"children":" }"}]}]
+ac:["$","span",null,{"className":"line","children":["$","span",null,{"children":" }"}]}]
+ad:["$","span",null,{"className":"line","children":["$","span",null,{"children":" }"}]}]
+ae:["$","span",null,{"className":"line","children":["$","span",null,{"children":" }"}]}]
+af:["$","span",null,{"className":"line","children":["$","span",null,{"children":"}"}]}]
+b0:["$","span",null,{"className":"line","children":["$","span",null,{}]}]
+b1:["$","span",null,{"className":"line","children":["$","span",null,{"children":"DELETE {{url}}/users/user1"}]}]
+b2:["$","span",null,{"className":"line","children":["$","span",null,{"children":"Authorization: Bearer {{token}}"}]}]
+b3:["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":"self"}]
+b4:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":", command"}]
+b5:["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}]
+b6:["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" &"}]
+b7:["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"CreateUser"}]
+b8:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":") "}]
+b9:["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"->"}]
+ba:["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Result"}]
+bb:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"<(), "}]
+bc:["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"Error"}]
+bd:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":">;"}]
+be:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" async"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" fn"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" delete_user"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"("}],["$","span",null,{"style":{"--shiki [...]
+bf:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" async"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" fn"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" update_user"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"("}],["$","span",null,{"style":{"--shiki [...]
+c0:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" async"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" fn"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" update_permissions"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"("}],["$","span",null,{"style":{" [...]
+c1:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" async"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" fn"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" change_password"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"("}],["$","span",null,{"style":{"--s [...]
+c2:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" async"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" fn"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" login_user"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"("}],["$","span",null,{"style":{"--shiki- [...]
+c3:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" async"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" fn"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" logout_user"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"("}],["$","span",null,{"style":{"--shiki [...]
+c4:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"}"}]}]
+c5:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]
+c6:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" pub"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" username"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" String"}],["$","span",null,{"style":{"--shiki- [...]
+c7:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" pub"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" permissions"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Option"}],["$","span",null,{"style":{"--shi [...]
+c8:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"}"}]}]
+c9:["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" bool"}]
+ca:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]
+cb:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" pub"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" manage_streams"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" bool"}],["$","span",null,{"style":{"--sh [...]
+cc:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" pub"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" read_streams"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" bool"}],["$","span",null,{"style":{"--shik [...]
+cd:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" pub"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" manage_topics"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" bool"}],["$","span",null,{"style":{"--shi [...]
+ce:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" pub"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" read_topics"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" bool"}],["$","span",null,{"style":{"--shiki [...]
+cf:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" pub"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" poll_messages"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" bool"}],["$","span",null,{"style":{"--shi [...]
+d0:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" pub"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" send_messages"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" bool"}],["$","span",null,{"style":{"--shi [...]
+d1:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"}"}]}]
+d2:["$","span",null,{"className":"line"}]
+d3:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" StreamPermissions"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" {"}]]}]
+d4:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" pub"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" manage_stream"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" bool"}],["$","span",null,{"style":{"--shi [...]
+d5:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" pub"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" read_stream"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" bool"}],["$","span",null,{"style":{"--shiki [...]
+d6:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" pub"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" manage_topics"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" bool"}],["$","span",null,{"style":{"--shi [...]
+d7:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" pub"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" read_topics"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" bool"}],["$","span",null,{"style":{"--shiki [...]
+d8:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" pub"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" poll_messages"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" bool"}],["$","span",null,{"style":{"--shi [...]
+d9:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" pub"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" send_messages"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" bool"}],["$","span",null,{"style":{"--shi [...]
+da:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" pub"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" topics"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Option"}],["$","span",null,{"style":{"--shiki-li [...]
+db:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"}"}]}]
+dc:["$","span",null,{"className":"line"}]
+dd:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" TopicPermissions"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" {"}]]}]
+de:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" pub"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" manage_topic"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" bool"}],["$","span",null,{"style":{"--shik [...]
+df:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" pub"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" read_topic"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" bool"}],["$","span",null,{"style":{"--shiki- [...]
+e0:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" pub"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" poll_messages"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" bool"}],["$","span",null,{"style":{"--shi [...]
+e1:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" pub"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" send_messages"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" bool"}],["$","span",null,{"style":{"--shi [...]
+e2:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"}"}]}]
+17:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
+e3:I[27201,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"IconMark"]
+15:null
+19:[["$","title","0",{"children":"Users and permissions | Apache Iggy"}],["$","link","1",{"rel":"icon","href":"/img/favicon.png"}],["$","$Le3","2",{}]]
diff --git a/blogs/2023/09/20/users-and-permissions/__next._head.txt b/blogs/2023/09/20/users-and-permissions/__next._head.txt
new file mode 100644
index 00000000..b609704c
--- /dev/null
+++ b/blogs/2023/09/20/users-and-permissions/__next._head.txt
@@ -0,0 +1,6 @@
+1:"$Sreact.fragment"
+2:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"ViewportBoundary"]
+3:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"MetadataBoundary"]
+4:"$Sreact.suspense"
+5:I[27201,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"IconMark"]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","h",{"children":[null,["$","$L2",null,{"children":[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]}],["$","div",null,{"hidden":true,"children":["$","$L3",null,{"children":["$","$4",null,{"name":"Next.Metadata","children":[["$","title","0",{"children":"Users and permissions | Apache Iggy"}],["$","link","1",{"rel":"icon","href":"/img/favicon.png"}],["$","$L5","2", [...]
diff --git a/blogs/2023/09/20/users-and-permissions/__next._index.txt b/blogs/2023/09/20/users-and-permissions/__next._index.txt
new file mode 100644
index 00000000..fd02bd95
--- /dev/null
+++ b/blogs/2023/09/20/users-and-permissions/__next._index.txt
@@ -0,0 +1,7 @@
+1:"$Sreact.fragment"
+2:I[17751,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js"],"RootProvider"]
+3:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+4:I[58298,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/5a37d4cb1abe17d7.js"],"default"]
+5:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+:HL["/_next/static/chunks/32a0415c8ab1bd26.css","style"]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/32a0415c8ab1bd26.css","precedence":"next"}],["$","script","script-0",{"src":"/_next/static/chunks/9ebd3a84bf60af84.js","async":true}],["$","script","script-1",{"src":"/_next/static/chunks/78b5f2e7b839e72f.js","async":true}]],["$","html",null,{"lang":"en","className":"geistsans_d5a4f12f-module__Ur3q_a__variable geistmono_157ca88a-module__iaM1Ya__variable" [...]
diff --git a/blogs/2023/09/20/users-and-permissions/__next._tree.txt b/blogs/2023/09/20/users-and-permissions/__next._tree.txt
new file mode 100644
index 00000000..28a32ad0
--- /dev/null
+++ b/blogs/2023/09/20/users-and-permissions/__next._tree.txt
@@ -0,0 +1,4 @@
+:HL["/_next/static/chunks/32a0415c8ab1bd26.css","style"]
+:HL["/_next/static/media/GeistMono_Variable.p.2f937313.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+:HL["/_next/static/media/Geist_Variable-s.p.92592eb2.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","tree":{"name":"","paramType":null,"paramKey":"","hasRuntimePrefetch":false,"slots":{"children":{"name":"(site)","paramType":null,"paramKey":"(site)","hasRuntimePrefetch":false,"slots":{"children":{"name":"blogs","paramType":null,"paramKey":"blogs","hasRuntimePrefetch":false,"slots":{"children":{"name":"slug","paramType":"c","paramKey":"2023/09/20/users-and-permissions","hasRuntimePrefetch":false,"slots":{"children":{"name":"__PAGE__","paramType":null [...]
diff --git a/blogs/2023/09/20/users-and-permissions/index.html b/blogs/2023/09/20/users-and-permissions/index.html
new file mode 100644
index 00000000..e9d42ed4
--- /dev/null
+++ b/blogs/2023/09/20/users-and-permissions/index.html
@@ -0,0 +1,278 @@
+<!DOCTYPE html><!--uBHgltRE2s5QA49x61S_u--><html lang="en" class="geistsans_d5a4f12f-module__Ur3q_a__variable geistmono_157ca88a-module__iaM1Ya__variable"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" href="/_next/static/media/GeistMono_Variable.p.2f937313.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="preload" href="/_next/static/media/Geist_Variable-s.p.92592eb2.woff2" as="font" crossorigin="" type=" [...]
+<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="breaking-changes"><a data-card="" href="#breaking-changes" class="peer">Breaking changes</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 [...]
+<p>In general, there are no breaking changes, except a new field added to the <code>ClientInfo</code> and <code>ClientInfoDetails</code> structs returned by <code>get_client()</code> and <code>get_clients()</code> methods.</p>
+<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-3 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-c [...]
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> client_id</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> u32</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> user_id</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Option</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"><</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">u32</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">&g [...]
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> address</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> String</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> transport</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> String</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> consumer_groups_count</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> u32</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre></div></figure>
+<p>The <code>user_id</code> field is optional, and it's only returned when the user is authenticated. Otherwise, it's set to <code>None</code> (0 value for binary transport) or <code>null</code> (HTTP transport).</p>
+<p>Keep in mind that the <code>client</code> represents the application connected to the server - since it's possible that multiple applications would share the same user credentials, thus you can think of a <code>client</code> as a single connection from the application to the server (1 user -> N clients).</p>
+<p>This breaking change has been introduced with the commit <a href="https://github.com/apache/iggy/commit/23b330928aa38463ef907c95a9f672fa7b728881" rel="noreferrer noopener" target="_blank">#23b3309</a>. The available <a href="https://crates.io/crates/iggy" rel="noreferrer noopener" target="_blank">iggy crate</a> supports these changes since version 0.0.80.</p>
+<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="configuration"><a data-card="" href="#configuration" class="peer">Configuration</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 0 [...]
+<p>Currently, the authentication and authorization can be enabled in the <code>server.toml</code> configuration via <code>[system.user]</code> section:</p>
+<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-3 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-c [...]
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">authentication_enabled = </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">true</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">authorization_enabled = </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">true</span></span></code></pre></div></figure>
+<p>This might change in the future releases (e.g. authentication and authorization will always be enabled), but in order to avoid the breaking changes to the existing clients SDKs, these options are configurable for now.</p>
+<p>The additional settings for HTTP API which uses JWT (JSON Web Token), can be found in the <code>[http.jwt]</code> section:</p>
+<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-3 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-c [...]
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">algorithm = </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"HS256"</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">audience = </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"iggy.rs"</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">expiry = </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">3600</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">encoding_secret = </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"top_secret$iggy.rs$_jwt_HS256_key#!"</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">decoding_secret = </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"top_secret$iggy.rs$_jwt_HS256_key#!"</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">use_base64_secret = </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">false</span></span></code></pre></div></figure>
+<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="authentication-and-authorization"><a data-card="" href="#authentication-and-authorization" class="peer">Authentication and authorization</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:o [...]
+<p>The overall implementation of the users authentication and authorization is rather typical. All the server methods except <code>ping</code> and <code>login</code> require the user to be authenticated. The <code>login</code> method is used to authenticate the user, and it returns the optional <code>token</code> which is then used to authenticate the user in the subsequent requests. For now, the <code>token</code> is only used by HTTP API based on JWT, for the binary transport there [...]
+<p>The authorization is based on the permissions, which are defined for each user. All the server methods have the specific authorization policies applied. For example, you can allow the user to read all the streams, or manage all the topics, while on the other hand, you could also specify only the set of particular streams or topics to which the user can send and/or poll the message to/from.</p>
+<p>Take a look at the following JSON example to get the overall idea:</p>
+<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-3 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-c [...]
+<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> "permissions"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: {</span></span>
+<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> "global"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: {</span></span>
+<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> "manage_servers"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">false</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> "read_servers"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">true</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> "manage_users"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">true</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> "read_users"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">true</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> "manage_streams"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">false</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> "read_streams"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">true</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> "manage_topics"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">false</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> "read_topics"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">true</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> "poll_messages"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">true</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> "send_messages"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">true</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> },</span></span>
+<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> "streams"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: {</span></span>
+<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> "1"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: {</span></span>
+<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> "manage_stream"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">false</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> "read_stream"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">true</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> "manage_topics"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">false</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> "read_topics"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">true</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> "poll_messages"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">true</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> "send_messages"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">true</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> "topics"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: {</span></span>
+<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> "1"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: {</span></span>
+<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> "manage_topic"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">false</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> "read_topic"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">true</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> "poll_messages"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">true</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> "send_messages"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">true</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> }</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> }</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> }</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> }</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> }</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre></div></figure>
+<p>Each user might have the global permissions which do apply to all the available streams and topics, as well as the granular permissions for each stream and its topics (this is a simple hashmap using the stream or topic ID as its key).</p>
+<p>For example, the <code>root user</code>, which has the default username and password <code>iggy</code> and cannot be updated or deleted, can do everything, simply by having the following permissions:</p>
+<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-3 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-c [...]
+<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> "permissions"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: {</span></span>
+<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> "global"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: {</span></span>
+<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> "manage_servers"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">true</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> "read_servers"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">true</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> "manage_users"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">true</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> "read_users"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">true</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> "manage_streams"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">true</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> "read_streams"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">true</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> "manage_topics"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">true</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> "read_topics"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">true</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> "poll_messages"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">true</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> "send_messages"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">true</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> },</span></span>
+<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> "streams"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">null</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> }</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre></div></figure>
+<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="sdk"><a data-card="" href="#sdk" class="peer">SDK</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.0 [...]
+<p>The new <code>UserClient</code> trait has been added in order to support the users and permissions feature. It is implemented for all the available transport protocols.</p>
+<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-3 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-c [...]
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> async</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> fn</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> get_user</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">self</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, [...]
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> async</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> fn</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> get_users</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">self</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> [...]
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> async</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> fn</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> create_user</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">self</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8 [...]
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> async</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> fn</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> delete_user</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">self</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8 [...]
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> async</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> fn</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> update_user</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">self</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8 [...]
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> async</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> fn</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> update_permissions</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">self</span><span style="--shiki-light:#24292E;--shiki-dark: [...]
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> async</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> fn</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> change_password</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">self</span><span style="--shiki-light:#24292E;--shiki-dark:#E1 [...]
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> async</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> fn</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> login_user</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">self</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8" [...]
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> async</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> fn</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> logout_user</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">self</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8 [...]
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre></div></figure>
+<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="commands-and-models"><a data-card="" href="#commands-and-models" class="peer">Commands and models</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d= [...]
+<p>The following commands and response models have been added:</p>
+<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-3 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-c [...]
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> user_id</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> u32</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> token</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Option</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"><</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">String</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">& [...]
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre></div></figure>
+<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-3 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-c [...]
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> id</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> u32</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> created_at</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> u64</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> status</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> UserStatus</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> username</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> String</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
+<span class="line"></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">pub</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> struct</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> UserInfoDetails</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> id</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> u32</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> created_at</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> u64</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> status</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> UserStatus</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> username</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> String</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> permissions</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Option</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"><</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">Permissions</span><span style="--shiki-light:#24292E;--shiki-dark [...]
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre></div></figure>
+<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-3 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-c [...]
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> global</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> GlobalPermissions</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> streams</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Option</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"><</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">HashMap</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8 [...]
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
+<span class="line"></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">pub</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> struct</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> GlobalPermissions</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> manage_servers</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> bool</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> read_servers</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> bool</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> manage_users</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> bool</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> read_users</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> bool</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> manage_streams</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> bool</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> read_streams</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> bool</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> manage_topics</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> bool</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> read_topics</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> bool</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> poll_messages</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> bool</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> send_messages</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> bool</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
+<span class="line"></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">pub</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> struct</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> StreamPermissions</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> manage_stream</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> bool</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> read_stream</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> bool</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> manage_topics</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> bool</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> read_topics</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> bool</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> poll_messages</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> bool</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> send_messages</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> bool</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> topics</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Option</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"><</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">HashMap</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8" [...]
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
+<span class="line"></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">pub</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> struct</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> TopicPermissions</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> manage_topic</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> bool</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> read_topic</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> bool</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> poll_messages</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> bool</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> send_messages</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> bool</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre></div></figure>
+<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-3 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-c [...]
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> user_id</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Identifier</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre></div></figure>
+<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-3 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-c [...]
+<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-3 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-c [...]
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> username</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> String</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> password</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> String</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> status</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> UserStatus</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> permissions</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Option</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"><</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">Permissions</span><span style="--shiki-light:#24292E;--shiki-dark [...]
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre></div></figure>
+<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-3 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-c [...]
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> user_id</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Identifier</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre></div></figure>
+<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-3 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-c [...]
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> user_id</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Identifier</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> username</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Option</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"><</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">String</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8 [...]
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> status</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Option</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"><</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">UserStatus</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4 [...]
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre></div></figure>
+<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-3 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-c [...]
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> user_id</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Identifier</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> permissions</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Option</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"><</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">Permissions</span><span style="--shiki-light:#24292E;--shiki-dark [...]
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre></div></figure>
+<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-3 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-c [...]
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> user_id</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Identifier</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> current_password</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> String</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> new_password</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> String</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre></div></figure>
+<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-3 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-c [...]
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> username</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> String</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> password</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> String</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre></div></figure>
+<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-3 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-c [...]
+<p>Similar to the stream and topic ID, the user will always have the unique numeric ID and the username. The username must be within the range of 3–50 chars and will always be lowercased, using the same regex as the stream and topic name <code>^[\w\.\-\s]+$</code>. The password must be within the range of 3–100 chars and will be hashed using the bcrypt algorithm.</p>
+<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="http-api"><a data-card="" href="#http-api" class="peer">HTTP API</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 [...]
+<p>The following endpoints have been added, and as always, you can find them in the <code>server.http</code> file in the main repository.</p>
+<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-3 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-c [...]
+<span class="line"><span>Content-Type: application/json</span></span>
+<span class="line"><span></span></span>
+<span class="line"><span>{</span></span>
+<span class="line"><span> "username": "iggy",</span></span>
+<span class="line"><span> "password": "iggy"</span></span>
+<span class="line"><span>}</span></span>
+<span class="line"><span></span></span>
+<span class="line"><span>POST {{url}}/users/logout</span></span>
+<span class="line"><span>Authorization: Bearer {{token}}</span></span>
+<span class="line"><span>Content-Type: application/json</span></span>
+<span class="line"><span></span></span>
+<span class="line"><span>{</span></span>
+<span class="line"><span>}</span></span>
+<span class="line"><span></span></span>
+<span class="line"><span>POST {{url}}/users</span></span>
+<span class="line"><span>Authorization: Bearer {{token}}</span></span>
+<span class="line"><span>Content-Type: application/json</span></span>
+<span class="line"><span></span></span>
+<span class="line"><span>{</span></span>
+<span class="line"><span> "username": "user1",</span></span>
+<span class="line"><span> "password": "secret",</span></span>
+<span class="line"><span> "status": "active",</span></span>
+<span class="line"><span> "permissions": null</span></span>
+<span class="line"><span>}</span></span>
+<span class="line"><span></span></span>
+<span class="line"><span>GET {{url}}/users</span></span>
+<span class="line"><span>Authorization: Bearer {{token}}</span></span>
+<span class="line"><span></span></span>
+<span class="line"><span>GET {{url}}/users/user1</span></span>
+<span class="line"><span>Authorization: Bearer {{token}}</span></span>
+<span class="line"><span></span></span>
+<span class="line"><span>PUT {{url}}/users/user1</span></span>
+<span class="line"><span>Authorization: Bearer {{token}}</span></span>
+<span class="line"><span>Content-Type: application/json</span></span>
+<span class="line"><span></span></span>
+<span class="line"><span>{</span></span>
+<span class="line"><span> "username": "user1,</span></span>
+<span class="line"><span> "status": "active",</span></span>
+<span class="line"><span> "permissions": null</span></span>
+<span class="line"><span>}</span></span>
+<span class="line"><span></span></span>
+<span class="line"><span>PUT {{url}}/users/user1/password</span></span>
+<span class="line"><span>Authorization: Bearer {{token}}</span></span>
+<span class="line"><span>Content-Type: application/json</span></span>
+<span class="line"><span></span></span>
+<span class="line"><span>{</span></span>
+<span class="line"><span> "current_password": "secret",</span></span>
+<span class="line"><span> "new_password": "secret1"</span></span>
+<span class="line"><span>}</span></span>
+<span class="line"><span></span></span>
+<span class="line"><span>PUT {{url}}/users/user1permissions</span></span>
+<span class="line"><span>Authorization: Bearer {{token}}</span></span>
+<span class="line"><span>Content-Type: application/json</span></span>
+<span class="line"><span></span></span>
+<span class="line"><span>{</span></span>
+<span class="line"><span> "permissions": {</span></span>
+<span class="line"><span> "global": {</span></span>
+<span class="line"><span> "manage_servers": false,</span></span>
+<span class="line"><span> "read_servers": true,</span></span>
+<span class="line"><span> "manage_users": true,</span></span>
+<span class="line"><span> "read_users": true,</span></span>
+<span class="line"><span> "manage_streams": false,</span></span>
+<span class="line"><span> "read_streams": true,</span></span>
+<span class="line"><span> "manage_topics": false,</span></span>
+<span class="line"><span> "read_topics": true,</span></span>
+<span class="line"><span> "poll_messages": true,</span></span>
+<span class="line"><span> "send_messages": true</span></span>
+<span class="line"><span> },</span></span>
+<span class="line"><span> "streams": {</span></span>
+<span class="line"><span> "1": {</span></span>
+<span class="line"><span> "manage_stream": false,</span></span>
+<span class="line"><span> "read_stream": true,</span></span>
+<span class="line"><span> "manage_topics": false,</span></span>
+<span class="line"><span> "read_topics": true,</span></span>
+<span class="line"><span> "poll_messages": true,</span></span>
+<span class="line"><span> "send_messages": true,</span></span>
+<span class="line"><span> "topics": {</span></span>
+<span class="line"><span> "1": {</span></span>
+<span class="line"><span> "manage_topic": false,</span></span>
+<span class="line"><span> "read_topic": true,</span></span>
+<span class="line"><span> "poll_messages": true,</span></span>
+<span class="line"><span> "send_messages": true</span></span>
+<span class="line"><span> }</span></span>
+<span class="line"><span> }</span></span>
+<span class="line"><span> }</span></span>
+<span class="line"><span> }</span></span>
+<span class="line"><span> }</span></span>
+<span class="line"><span>}</span></span>
+<span class="line"><span></span></span>
+<span class="line"><span>DELETE {{url}}/users/user1</span></span>
+<span class="line"><span>Authorization: Bearer {{token}}</span></span></code></pre></div></figure></div><footer class="mt-16 border-t border-fd-border pt-8"><a class="inline-flex items-center gap-2 text-sm font-medium text-fd-primary transition-colors hover:opacity-80" href="/blogs/">← Back to all posts</a></footer></article></main><!--$--><!--/$--></main><script src="/_next/static/chunks/922b7f01aa6775a6.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])< [...]
\ No newline at end of file
diff --git a/blogs/2023/09/20/users-and-permissions/index.txt b/blogs/2023/09/20/users-and-permissions/index.txt
new file mode 100644
index 00000000..b2a03eaa
--- /dev/null
+++ b/blogs/2023/09/20/users-and-permissions/index.txt
@@ -0,0 +1,217 @@
+1:"$Sreact.fragment"
+2:I[17751,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js"],"RootProvider"]
+3:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+4:I[58298,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/5a37d4cb1abe17d7.js"],"default"]
+5:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+6:I[83571,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Header"]
+7:I[29966,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFDropdown"]
+8:I[36330,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFMobileLinks"]
+9:I[22016,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],""]
+a:I[88760,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Logo"]
+11:I[68027,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+:HL["/_next/static/chunks/32a0415c8ab1bd26.css","style"]
+:HL["/_next/static/media/GeistMono_Variable.p.2f937313.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+:HL["/_next/static/media/Geist_Variable-s.p.92592eb2.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+0:{"P":null,"b":"uBHgltRE2s5QA49x61S_u","c":["","blogs","2023","09","20","users-and-permissions",""],"q":"","i":false,"f":[[["",{"children":["(site)",{"children":["blogs",{"children":[["slug","2023/09/20/users-and-permissions","c"],{"children":["__PAGE__",{}]}]}]}]},"$undefined","$undefined",true],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/32a0415c8ab1bd26.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","s [...]
+13:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"OutletBoundary"]
+14:"$Sreact.suspense"
+16:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"ViewportBoundary"]
+18:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"MetadataBoundary"]
+b:["$","h1",null,{"className":"next-error-h1","style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:1:props:style","children":404}]
+c:["$","div",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:style","children":["$","h2",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style","children":"This page could not be found."}]}]
+d:["$","$1","c",{"children":[null,["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}]
+e:["$","$1","c",{"children":[null,["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}]
+f:["$","$1","c",{"children":["$L12",[["$","script","script-0",{"src":"/_next/static/chunks/00b00679782d0ffd.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/3562882a488c4fbb.js","async":true,"nonce":"$undefined"}]],["$","$L13",null,{"children":["$","$14",null,{"name":"Next.MetadataOutlet","children":"$@15"}]}]]}]
+10:["$","$1","h",{"children":[null,["$","$L16",null,{"children":"$L17"}],["$","div",null,{"hidden":true,"children":["$","$L18",null,{"children":["$","$14",null,{"name":"Next.Metadata","children":"$L19"}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}]
+1a:I[44324,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"CodeBlock"]
+1b:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+44:I[44324,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"Pre"]
+45:I[47873,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"default"]
+1c:["$","$L44",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" ClientInfo"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E [...]
+1d:["$","p",null,{"children":["The ",["$","code",null,{"children":"user_id"}]," field is optional, and it's only returned when the user is authenticated. Otherwise, it's set to ",["$","code",null,{"children":"None"}]," (0 value for binary transport) or ",["$","code",null,{"children":"null"}]," (HTTP transport)."]}]
+1e:["$","p",null,{"children":["Keep in mind that the ",["$","code",null,{"children":"client"}]," represents the application connected to the server - since it's possible that multiple applications would share the same user credentials, thus you can think of a ",["$","code",null,{"children":"client"}]," as a single connection from the application to the server (1 user -> N clients)."]}]
+1f:["$","p",null,{"children":["This breaking change has been introduced with the commit ",["$","$L45",null,{"href":"https://github.com/apache/iggy/commit/23b330928aa38463ef907c95a9f672fa7b728881","children":"#23b3309"}],". The available ",["$","$L45",null,{"href":"https://crates.io/crates/iggy","children":"iggy crate"}]," supports these changes since version 0.0.80."]}]
+20:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"configuration","children":[["$","a",null,{"data-card":"","href":"#configuration","className":"peer","children":"Configuration"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd- [...]
+21:["$","p",null,{"children":["Currently, the authentication and authorization can be enabled in the ",["$","code",null,{"children":"server.toml"}]," configuration via ",["$","code",null,{"children":"[system.user]"}]," section:"]}]
+22:["$","$L1a",null,{"className":"shiki shiki-themes github-light github-dark","style":{"--shiki-light":"#24292e","--shiki-dark":"#e1e4e8","--shiki-light-bg":"#fff","--shiki-dark-bg":"#24292e"},"tabIndex":"0","icon":"<svg viewBox=\"0 0 24 24\"><path d=\"M 6,1 C 4.354992,1 3,2.354992 3,4 v 16 c 0,1.645008 1.354992,3 3,3 h 12 c 1.645008,0 3,-1.354992 3,-3 V 8 7 A 1.0001,1.0001 0 0 0 20.707031,6.2929687 l -5,-5 A 1.0001,1.0001 0 0 0 15,1 h -1 z m 0,2 h 7 v 3 c 0,1.645008 1.354992,3 3,3 h 3 [...]
+23:["$","p",null,{"children":"This might change in the future releases (e.g. authentication and authorization will always be enabled), but in order to avoid the breaking changes to the existing clients SDKs, these options are configurable for now."}]
+24:["$","p",null,{"children":["The additional settings for HTTP API which uses JWT (JSON Web Token), can be found in the ",["$","code",null,{"children":"[http.jwt]"}]," section:"]}]
+25:["$","$L1a",null,{"className":"shiki shiki-themes github-light github-dark","style":{"--shiki-light":"#24292e","--shiki-dark":"#e1e4e8","--shiki-light-bg":"#fff","--shiki-dark-bg":"#24292e"},"tabIndex":"0","icon":"<svg viewBox=\"0 0 24 24\"><path d=\"M 6,1 C 4.354992,1 3,2.354992 3,4 v 16 c 0,1.645008 1.354992,3 3,3 h 12 c 1.645008,0 3,-1.354992 3,-3 V 8 7 A 1.0001,1.0001 0 0 0 20.707031,6.2929687 l -5,-5 A 1.0001,1.0001 0 0 0 15,1 h -1 z m 0,2 h 7 v 3 c 0,1.645008 1.354992,3 3,3 h 3 [...]
+26:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"authentication-and-authorization","children":[["$","a",null,{"data-card":"","href":"#authentication-and-authorization","className":"peer","children":"Authentication and authorization"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round"," [...]
+27:["$","p",null,{"children":["The overall implementation of the users authentication and authorization is rather typical. All the server methods except ",["$","code",null,{"children":"ping"}]," and ",["$","code",null,{"children":"login"}]," require the user to be authenticated. The ",["$","code",null,{"children":"login"}]," method is used to authenticate the user, and it returns the optional ",["$","code",null,{"children":"token"}]," which is then used to authenticate the user in the su [...]
+28:["$","p",null,{"children":"The authorization is based on the permissions, which are defined for each user. All the server methods have the specific authorization policies applied. For example, you can allow the user to read all the streams, or manage all the topics, while on the other hand, you could also specify only the set of particular streams or topics to which the user can send and/or poll the message to/from."}]
+29:["$","p",null,{"children":"Take a look at the following JSON example to get the overall idea:"}]
+2a:["$","$L1a",null,{"className":"shiki shiki-themes github-light github-dark","style":{"--shiki-light":"#24292e","--shiki-dark":"#e1e4e8","--shiki-light-bg":"#fff","--shiki-dark-bg":"#24292e"},"tabIndex":"0","icon":"<svg viewBox=\"0 0 24 24\"><path d=\"M 6,1 C 4.354992,1 3,2.354992 3,4 v 16 c 0,1.645008 1.354992,3 3,3 h 12 c 1.645008,0 3,-1.354992 3,-3 V 8 7 A 1.0001,1.0001 0 0 0 20.707031,6.2929687 l -5,-5 A 1.0001,1.0001 0 0 0 15,1 h -1 z m 0,2 h 7 v 3 c 0,1.645008 1.354992,3 3,3 h 3 [...]
+2b:["$","p",null,{"children":"Each user might have the global permissions which do apply to all the available streams and topics, as well as the granular permissions for each stream and its topics (this is a simple hashmap using the stream or topic ID as its key)."}]
+2c:["$","p",null,{"children":["For example, the ",["$","code",null,{"children":"root user"}],", which has the default username and password ",["$","code",null,{"children":"iggy"}]," and cannot be updated or deleted, can do everything, simply by having the following permissions:"]}]
+2d:["$","$L1a",null,{"className":"shiki shiki-themes github-light github-dark","style":{"--shiki-light":"#24292e","--shiki-dark":"#e1e4e8","--shiki-light-bg":"#fff","--shiki-dark-bg":"#24292e"},"tabIndex":"0","icon":"<svg viewBox=\"0 0 24 24\"><path d=\"M 6,1 C 4.354992,1 3,2.354992 3,4 v 16 c 0,1.645008 1.354992,3 3,3 h 12 c 1.645008,0 3,-1.354992 3,-3 V 8 7 A 1.0001,1.0001 0 0 0 20.707031,6.2929687 l -5,-5 A 1.0001,1.0001 0 0 0 15,1 h -1 z m 0,2 h 7 v 3 c 0,1.645008 1.354992,3 3,3 h 3 [...]
+2e:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"sdk","children":[["$","a",null,{"data-card":"","href":"#sdk","className":"peer","children":"SDK"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 tra [...]
+2f:["$","p",null,{"children":["The new ",["$","code",null,{"children":"UserClient"}]," trait has been added in order to support the users and permissions feature. It is implemented for all the available transport protocols."]}]
+65:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+31:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"commands-and-models","children":[["$","a",null,{"data-card":"","href":"#commands-and-models","className":"peer","children":"Commands and models"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 [...]
+32:["$","p",null,{"children":"The following commands and response models have been added:"}]
+67:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+69:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+6b:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+6d:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+6f:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+71:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+73:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+75:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+77:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+79:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+7b:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+7d:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+3f:["$","p",null,{"children":["Similar to the stream and topic ID, the user will always have the unique numeric ID and the username. The username must be within the range of 3–50 chars and will always be lowercased, using the same regex as the stream and topic name ",["$","code",null,{"children":"^[\\w\\.\\-\\s]+$"}],". The password must be within the range of 3–100 chars and will be hashed using the bcrypt algorithm."]}]
+40:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"http-api","children":[["$","a",null,{"data-card":"","href":"#http-api","className":"peer","children":"HTTP API"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-foregroun [...]
+41:["$","p",null,{"children":["The following endpoints have been added, and as always, you can find them in the ",["$","code",null,{"children":"server.http"}]," file in the main repository."]}]
+42:["$","$L1a",null,{"className":"shiki shiki-themes github-light github-dark","style":{"--shiki-light":"#24292e","--shiki-dark":"#e1e4e8","--shiki-light-bg":"#fff","--shiki-dark-bg":"#24292e"},"tabIndex":"0","icon":"<svg viewBox=\"0 0 24 24\"><path d=\"M 6,1 C 4.354992,1 3,2.354992 3,4 v 16 c 0,1.645008 1.354992,3 3,3 h 12 c 1.645008,0 3,-1.354992 3,-3 V 8 7 A 1.0001,1.0001 0 0 0 20.707031,6.2929687 l -5,-5 A 1.0001,1.0001 0 0 0 15,1 h -1 z m 0,2 h 7 v 3 c 0,1.645008 1.354992,3 3,3 h 3 [...]
+43:["$","footer",null,{"className":"mt-16 border-t border-fd-border pt-8","children":["$","$L9",null,{"href":"/blogs","className":"inline-flex items-center gap-2 text-sm font-medium text-fd-primary transition-colors hover:opacity-80","children":"← Back to all posts"}]}]
+46:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"read_topics\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": "}],["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":"true"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+47:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"poll_messages\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": "}],["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":"true"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+48:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"send_messages\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": "}],["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":"true"}]]}]
+49:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" },"}]}]
+4a:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"streams\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": {"}]]}]
+4b:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"1\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": {"}]]}]
+4c:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"manage_stream\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": "}],["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":"false"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+4d:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"read_stream\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": "}],["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":"true"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+4e:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"manage_topics\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": "}],["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":"false"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+4f:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"read_topics\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": "}],["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":"true"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+50:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"poll_messages\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": "}],["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":"true"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+51:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"send_messages\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": "}],["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":"true"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+52:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"topics\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": {"}]]}]
+53:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"1\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": {"}]]}]
+54:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"manage_topic\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": "}],["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":"false"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+55:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"read_topic\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": "}],["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":"true"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+56:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"poll_messages\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": "}],["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":"true"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+57:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"send_messages\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": "}],["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":"true"}]]}]
+58:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" }"}]}]
+59:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" }"}]}]
+5a:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" }"}]}]
+5b:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" }"}]}]
+5c:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" }"}]}]
+5d:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"}"}]}]
+5e:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"read_topics\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": "}],["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":"true"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+5f:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"poll_messages\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": "}],["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":"true"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+60:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"send_messages\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": "}],["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":"true"}]]}]
+61:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" },"}]}]
+62:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" \"streams\""}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":": "}],["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":"null"}]]}]
+63:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" }"}]}]
+64:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"}"}]}]
+66:["$","$L44",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" trait"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" UserClient"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8 [...]
+68:["$","$L44",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" IdentityInfo"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E [...]
+6a:["$","$L44",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" UserInfo"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8" [...]
+6c:["$","$L44",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Permissions"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4 [...]
+6e:["$","$L44",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" GetUser"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"} [...]
+70:["$","$L44",null,{"children":["$","code",null,{"children":["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" GetUsers"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"} [...]
+72:["$","$L44",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" CreateUser"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E [...]
+74:["$","$L44",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" DeleteUser"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E [...]
+76:["$","$L44",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" UpdateUser"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E [...]
+78:["$","$L44",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" UpdatePermissions"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark": [...]
+7a:["$","$L44",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" ChangePassword"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E [...]
+7c:["$","$L44",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" LoginUser"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8 [...]
+7e:["$","$L44",null,{"children":["$","code",null,{"children":["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" LogoutUser"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8 [...]
+7f:["$","span",null,{"children":"}"}]
+80:["$","span",null,{"className":"line","children":["$","span",null,{}]}]
+81:["$","span",null,{"className":"line","children":["$","span",null,{"children":"PUT {{url}}/users/user1/password"}]}]
+82:["$","span",null,{"className":"line","children":["$","span",null,{"children":"Authorization: Bearer {{token}}"}]}]
+83:["$","span",null,{"className":"line","children":["$","span",null,{"children":"Content-Type: application/json"}]}]
+84:["$","span",null,{"className":"line","children":["$","span",null,{}]}]
+85:["$","span",null,{"className":"line","children":["$","span",null,{"children":"{"}]}]
+86:["$","span",null,{"className":"line","children":["$","span",null,{"children":" \"current_password\": \"secret\","}]}]
+87:["$","span",null,{"className":"line","children":["$","span",null,{"children":" \"new_password\": \"secret1\""}]}]
+88:["$","span",null,{"className":"line","children":["$","span",null,{"children":"}"}]}]
+89:["$","span",null,{"className":"line","children":["$","span",null,{}]}]
+8a:["$","span",null,{"className":"line","children":["$","span",null,{"children":"PUT {{url}}/users/user1permissions"}]}]
+8b:["$","span",null,{"className":"line","children":["$","span",null,{"children":"Authorization: Bearer {{token}}"}]}]
+8c:["$","span",null,{"className":"line","children":["$","span",null,{"children":"Content-Type: application/json"}]}]
+8d:["$","span",null,{"className":"line","children":["$","span",null,{}]}]
+8e:["$","span",null,{"className":"line","children":["$","span",null,{"children":"{"}]}]
+8f:["$","span",null,{"className":"line","children":["$","span",null,{"children":" \"permissions\": {"}]}]
+90:["$","span",null,{"className":"line","children":["$","span",null,{"children":" \"global\": {"}]}]
+91:["$","span",null,{"className":"line","children":["$","span",null,{"children":" \"manage_servers\": false,"}]}]
+92:["$","span",null,{"className":"line","children":["$","span",null,{"children":" \"read_servers\": true,"}]}]
+93:["$","span",null,{"className":"line","children":["$","span",null,{"children":" \"manage_users\": true,"}]}]
+94:["$","span",null,{"className":"line","children":["$","span",null,{"children":" \"read_users\": true,"}]}]
+95:["$","span",null,{"className":"line","children":["$","span",null,{"children":" \"manage_streams\": false,"}]}]
+96:["$","span",null,{"className":"line","children":["$","span",null,{"children":" \"read_streams\": true,"}]}]
+97:["$","span",null,{"className":"line","children":["$","span",null,{"children":" \"manage_topics\": false,"}]}]
+98:["$","span",null,{"className":"line","children":["$","span",null,{"children":" \"read_topics\": true,"}]}]
+99:["$","span",null,{"className":"line","children":["$","span",null,{"children":" \"poll_messages\": true,"}]}]
+9a:["$","span",null,{"className":"line","children":["$","span",null,{"children":" \"send_messages\": true"}]}]
+9b:["$","span",null,{"className":"line","children":["$","span",null,{"children":" },"}]}]
+9c:["$","span",null,{"className":"line","children":["$","span",null,{"children":" \"streams\": {"}]}]
+9d:["$","span",null,{"className":"line","children":["$","span",null,{"children":" \"1\": {"}]}]
+9e:["$","span",null,{"className":"line","children":["$","span",null,{"children":" \"manage_stream\": false,"}]}]
+9f:["$","span",null,{"className":"line","children":["$","span",null,{"children":" \"read_stream\": true,"}]}]
+a0:["$","span",null,{"className":"line","children":["$","span",null,{"children":" \"manage_topics\": false,"}]}]
+a1:["$","span",null,{"className":"line","children":["$","span",null,{"children":" \"read_topics\": true,"}]}]
+a2:["$","span",null,{"className":"line","children":["$","span",null,{"children":" \"poll_messages\": true,"}]}]
+a3:["$","span",null,{"className":"line","children":["$","span",null,{"children":" \"send_messages\": true,"}]}]
+a4:["$","span",null,{"className":"line","children":["$","span",null,{"children":" \"topics\": {"}]}]
+a5:["$","span",null,{"className":"line","children":["$","span",null,{"children":" \"1\": {"}]}]
+a6:["$","span",null,{"className":"line","children":["$","span",null,{"children":" \"manage_topic\": false,"}]}]
+a7:["$","span",null,{"className":"line","children":["$","span",null,{"children":" \"read_topic\": true,"}]}]
+a8:["$","span",null,{"className":"line","children":["$","span",null,{"children":" \"poll_messages\": true,"}]}]
+a9:["$","span",null,{"className":"line","children":["$","span",null,{"children":" \"send_messages\": true"}]}]
+aa:["$","span",null,{"className":"line","children":["$","span",null,{"children":" }"}]}]
+ab:["$","span",null,{"className":"line","children":["$","span",null,{"children":" }"}]}]
+ac:["$","span",null,{"className":"line","children":["$","span",null,{"children":" }"}]}]
+ad:["$","span",null,{"className":"line","children":["$","span",null,{"children":" }"}]}]
+ae:["$","span",null,{"className":"line","children":["$","span",null,{"children":" }"}]}]
+af:["$","span",null,{"className":"line","children":["$","span",null,{"children":"}"}]}]
+b0:["$","span",null,{"className":"line","children":["$","span",null,{}]}]
+b1:["$","span",null,{"className":"line","children":["$","span",null,{"children":"DELETE {{url}}/users/user1"}]}]
+b2:["$","span",null,{"className":"line","children":["$","span",null,{"children":"Authorization: Bearer {{token}}"}]}]
+b3:["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":"self"}]
+b4:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":", command"}]
+b5:["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}]
+b6:["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" &"}]
+b7:["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"CreateUser"}]
+b8:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":") "}]
+b9:["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"->"}]
+ba:["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Result"}]
+bb:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"<(), "}]
+bc:["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"Error"}]
+bd:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":">;"}]
+be:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" async"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" fn"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" delete_user"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"("}],["$","span",null,{"style":{"--shiki [...]
+bf:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" async"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" fn"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" update_user"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"("}],["$","span",null,{"style":{"--shiki [...]
+c0:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" async"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" fn"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" update_permissions"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"("}],["$","span",null,{"style":{" [...]
+c1:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" async"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" fn"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" change_password"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"("}],["$","span",null,{"style":{"--s [...]
+c2:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" async"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" fn"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" login_user"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"("}],["$","span",null,{"style":{"--shiki- [...]
+c3:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" async"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" fn"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" logout_user"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"("}],["$","span",null,{"style":{"--shiki [...]
+c4:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"}"}]}]
+c5:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]
+c6:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" pub"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" username"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" String"}],["$","span",null,{"style":{"--shiki- [...]
+c7:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" pub"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" permissions"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Option"}],["$","span",null,{"style":{"--shi [...]
+c8:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"}"}]}]
+c9:["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" bool"}]
+ca:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]
+cb:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" pub"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" manage_streams"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" bool"}],["$","span",null,{"style":{"--sh [...]
+cc:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" pub"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" read_streams"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" bool"}],["$","span",null,{"style":{"--shik [...]
+cd:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" pub"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" manage_topics"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" bool"}],["$","span",null,{"style":{"--shi [...]
+ce:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" pub"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" read_topics"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" bool"}],["$","span",null,{"style":{"--shiki [...]
+cf:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" pub"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" poll_messages"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" bool"}],["$","span",null,{"style":{"--shi [...]
+d0:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" pub"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" send_messages"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" bool"}],["$","span",null,{"style":{"--shi [...]
+d1:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"}"}]}]
+d2:["$","span",null,{"className":"line"}]
+d3:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" StreamPermissions"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" {"}]]}]
+d4:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" pub"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" manage_stream"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" bool"}],["$","span",null,{"style":{"--shi [...]
+d5:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" pub"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" read_stream"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" bool"}],["$","span",null,{"style":{"--shiki [...]
+d6:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" pub"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" manage_topics"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" bool"}],["$","span",null,{"style":{"--shi [...]
+d7:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" pub"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" read_topics"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" bool"}],["$","span",null,{"style":{"--shiki [...]
+d8:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" pub"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" poll_messages"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" bool"}],["$","span",null,{"style":{"--shi [...]
+d9:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" pub"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" send_messages"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" bool"}],["$","span",null,{"style":{"--shi [...]
+da:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" pub"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" topics"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Option"}],["$","span",null,{"style":{"--shiki-li [...]
+db:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"}"}]}]
+dc:["$","span",null,{"className":"line"}]
+dd:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" TopicPermissions"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" {"}]]}]
+de:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" pub"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" manage_topic"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" bool"}],["$","span",null,{"style":{"--shik [...]
+df:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" pub"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" read_topic"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" bool"}],["$","span",null,{"style":{"--shiki- [...]
+e0:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" pub"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" poll_messages"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" bool"}],["$","span",null,{"style":{"--shi [...]
+e1:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" pub"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" send_messages"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" bool"}],["$","span",null,{"style":{"--shi [...]
+e2:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"}"}]}]
+17:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
+e3:I[27201,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"IconMark"]
+15:null
+19:[["$","title","0",{"children":"Users and permissions | Apache Iggy"}],["$","link","1",{"rel":"icon","href":"/img/favicon.png"}],["$","$Le3","2",{}]]
diff --git a/blogs/2023/10/02/consumer-identifier/__next.!KHNpdGUp.blogs.$c$slug.__PAGE__.txt b/blogs/2023/10/02/consumer-identifier/__next.!KHNpdGUp.blogs.$c$slug.__PAGE__.txt
new file mode 100644
index 00000000..27c00977
--- /dev/null
+++ b/blogs/2023/10/02/consumer-identifier/__next.!KHNpdGUp.blogs.$c$slug.__PAGE__.txt
@@ -0,0 +1,43 @@
+1:"$Sreact.fragment"
+2:I[47873,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"default"]
+3:I[44324,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"CodeBlock"]
+13:I[44324,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"Pre"]
+1a:I[22016,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],""]
+1b:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"OutletBoundary"]
+1c:"$Sreact.suspense"
+4:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 0 [...]
+5:["$","$L13",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Consumer"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"} [...]
+6:["$","p",null,{"children":["All the commands, such as ",["$","code",null,{"children":"PollMessages"}],", ",["$","code",null,{"children":"StoreConsumerOffset"}]," and ",["$","code",null,{"children":"GetConsumerOffset"}]," which contain the ",["$","code",null,{"children":"consumer"}]," field, now require an update to the underlying serialization, as the ",["$","code",null,{"children":"id"}]," field is now an ",["$","code",null,{"children":"Identifier"}]," type, instead of ",["$","code",n [...]
+7:["$","p",null,{"children":["From now on, whenever working with the ",["$","code",null,{"children":"consumer"}]," or ",["$","code",null,{"children":"consumer group"}]," resource, you can use the numeric or text identifier."]}]
+8:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"consumer-groups","children":[["$","a",null,{"data-card":"","href":"#consumer-groups","className":"peer","children":"Consumer groups"}],["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-foregrou [...]
+14:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+a:["$","p",null,{"children":["When creating the consumer group, the required ",["$","code",null,{"children":"name"}]," field has been added (must be ",["$","strong",null,{"children":"unique per topic"}],"), and is serialized as usual, at the end of the payload, starting with the ",["$","code",null,{"children":"name length"}]," (4 bytes) and the ",["$","code",null,{"children":"name"}]," itself (N bytes)."]}]
+16:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+c:["$","p",null,{"children":["The ",["$","code",null,{"children":"DeleteConsumerGroup"}],", ",["$","code",null,{"children":"GetConsumerGroup"}],", ",["$","code",null,{"children":"JoinConsumerGroup"}]," and ",["$","code",null,{"children":"LeaveConsumerGroup"}]," commands have been extended with the ",["$","code",null,{"children":"consumer_group_id"}]," field, which is now an ",["$","code",null,{"children":"Identifier"}]," type, instead of ",["$","code",null,{"children":"u32"}],"."]}]
+18:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+e:["$","p",null,{"children":["When fetching the consumer group(s), the ",["$","code",null,{"children":"ConsumerGroup"}]," and ",["$","code",null,{"children":"ConsumerGroupDetails"}]," structs have been extended with the ",["$","code",null,{"children":"name"}]," field, which serialized after ",["$","code",null,{"children":"members_count"}],"."]}]
+f:["$","footer",null,{"className":"mt-16 border-t border-fd-border pt-8","children":["$","$L1a",null,{"href":"/blogs","className":"inline-flex items-center gap-2 text-sm font-medium text-fd-primary transition-colors hover:opacity-80","children":"← Back to all posts"}]}]
+10:["$","script","script-0",{"src":"/_next/static/chunks/00b00679782d0ffd.js","async":true}]
+11:["$","script","script-1",{"src":"/_next/static/chunks/3562882a488c4fbb.js","async":true}]
+12:["$","$L1b",null,{"children":["$","$1c",null,{"name":"Next.MetadataOutlet","children":"$@1d"}]}]
+15:["$","$L13",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" CreateConsumerGroup"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark [...]
+17:["$","$L13",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" DeleteConsumerGroup"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark [...]
+19:["$","$L13",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" ConsumerGroup"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1 [...]
+1d:null
+1e:["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}]
+1f:["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" JoinConsumerGroup"}]
+20:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" {"}]
+21:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" pub"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" stream_id"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Identifier"}],["$","span",null,{"style":{"--s [...]
+22:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" pub"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" topic_id"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Identifier"}],["$","span",null,{"style":{"--sh [...]
+23:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" pub"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" consumer_group_id"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Identifier"}],["$","span",null,{"styl [...]
+24:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"}"}]}]
+25:["$","span",null,{"className":"line"}]
+26:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" LeaveConsumerGroup"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" {"}]]}]
+27:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" pub"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" stream_id"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Identifier"}],["$","span",null,{"style":{"--s [...]
+28:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" pub"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" topic_id"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Identifier"}],["$","span",null,{"style":{"--sh [...]
+29:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" pub"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" consumer_group_id"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Identifier"}],["$","span",null,{"styl [...]
+2a:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"}"}]}]
+2b:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]
+2c:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" pub"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" members_count"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" u32"}],["$","span",null,{"style":{"--shik [...]
+2d:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" pub"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" members"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Vec"}],["$","span",null,{"style":{"--shiki-ligh [...]
+2e:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"}"}]}]
diff --git a/blogs/2023/10/02/consumer-identifier/__next.!KHNpdGUp.blogs.$c$slug.txt b/blogs/2023/10/02/consumer-identifier/__next.!KHNpdGUp.blogs.$c$slug.txt
new file mode 100644
index 00000000..11b31bb0
--- /dev/null
+++ b/blogs/2023/10/02/consumer-identifier/__next.!KHNpdGUp.blogs.$c$slug.txt
@@ -0,0 +1,4 @@
+1:"$Sreact.fragment"
+2:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+3:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","template":["$","$L3",null,{}]}]]}],"loading":null,"isPartial":false}
diff --git a/blogs/2023/10/02/consumer-identifier/__next.!KHNpdGUp.blogs.txt b/blogs/2023/10/02/consumer-identifier/__next.!KHNpdGUp.blogs.txt
new file mode 100644
index 00000000..11b31bb0
--- /dev/null
+++ b/blogs/2023/10/02/consumer-identifier/__next.!KHNpdGUp.blogs.txt
@@ -0,0 +1,4 @@
+1:"$Sreact.fragment"
+2:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+3:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","template":["$","$L3",null,{}]}]]}],"loading":null,"isPartial":false}
diff --git a/blogs/2023/10/02/consumer-identifier/__next.!KHNpdGUp.txt b/blogs/2023/10/02/consumer-identifier/__next.!KHNpdGUp.txt
new file mode 100644
index 00000000..ea3bfa55
--- /dev/null
+++ b/blogs/2023/10/02/consumer-identifier/__next.!KHNpdGUp.txt
@@ -0,0 +1,9 @@
+1:"$Sreact.fragment"
+2:I[83571,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Header"]
+3:I[29966,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFDropdown"]
+4:I[36330,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFMobileLinks"]
+5:I[22016,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],""]
+6:I[88760,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Logo"]
+7:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+8:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","c",{"children":[[["$","script","script-0",{"src":"/_next/static/chunks/8d86be78428a601a.js","async":true}],["$","script","script-1",{"src":"/_next/static/chunks/da34cc6305706ac6.js","async":true}],["$","script","script-2",{"src":"/_next/static/chunks/9baf65674e2de991.js","async":true}],["$","script","script-3",{"src":"/_next/static/chunks/26b70f9828dd1eb5.js","async":true}],["$","script","script-4",{"src":"/_next/static/chunks/adeed83 [...]
diff --git a/blogs/2023/10/02/consumer-identifier/__next._full.txt b/blogs/2023/10/02/consumer-identifier/__next._full.txt
new file mode 100644
index 00000000..63ac68e7
--- /dev/null
+++ b/blogs/2023/10/02/consumer-identifier/__next._full.txt
@@ -0,0 +1,64 @@
+1:"$Sreact.fragment"
+2:I[17751,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js"],"RootProvider"]
+3:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+4:I[58298,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/5a37d4cb1abe17d7.js"],"default"]
+5:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+6:I[83571,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Header"]
+7:I[29966,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFDropdown"]
+8:I[36330,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFMobileLinks"]
+9:I[22016,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],""]
+a:I[88760,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Logo"]
+11:I[68027,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+:HL["/_next/static/chunks/32a0415c8ab1bd26.css","style"]
+:HL["/_next/static/media/GeistMono_Variable.p.2f937313.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+:HL["/_next/static/media/Geist_Variable-s.p.92592eb2.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+0:{"P":null,"b":"uBHgltRE2s5QA49x61S_u","c":["","blogs","2023","10","02","consumer-identifier",""],"q":"","i":false,"f":[[["",{"children":["(site)",{"children":["blogs",{"children":[["slug","2023/10/02/consumer-identifier","c"],{"children":["__PAGE__",{}]}]}]}]},"$undefined","$undefined",true],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/32a0415c8ab1bd26.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","scrip [...]
+13:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"OutletBoundary"]
+14:"$Sreact.suspense"
+16:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"ViewportBoundary"]
+18:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"MetadataBoundary"]
+b:["$","h1",null,{"className":"next-error-h1","style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:1:props:style","children":404}]
+c:["$","div",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:style","children":["$","h2",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style","children":"This page could not be found."}]}]
+d:["$","$1","c",{"children":[null,["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}]
+e:["$","$1","c",{"children":[null,["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}]
+f:["$","$1","c",{"children":["$L12",[["$","script","script-0",{"src":"/_next/static/chunks/00b00679782d0ffd.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/3562882a488c4fbb.js","async":true,"nonce":"$undefined"}]],["$","$L13",null,{"children":["$","$14",null,{"name":"Next.MetadataOutlet","children":"$@15"}]}]]}]
+10:["$","$1","h",{"children":[null,["$","$L16",null,{"children":"$L17"}],["$","div",null,{"hidden":true,"children":["$","$L18",null,{"children":["$","$14",null,{"name":"Next.Metadata","children":"$L19"}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}]
+1a:I[47873,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"default"]
+1b:I[44324,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"CodeBlock"]
+1c:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+28:I[44324,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"Pre"]
+1d:["$","$L28",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Consumer"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8" [...]
+1e:["$","p",null,{"children":["All the commands, such as ",["$","code",null,{"children":"PollMessages"}],", ",["$","code",null,{"children":"StoreConsumerOffset"}]," and ",["$","code",null,{"children":"GetConsumerOffset"}]," which contain the ",["$","code",null,{"children":"consumer"}]," field, now require an update to the underlying serialization, as the ",["$","code",null,{"children":"id"}]," field is now an ",["$","code",null,{"children":"Identifier"}]," type, instead of ",["$","code", [...]
+1f:["$","p",null,{"children":["From now on, whenever working with the ",["$","code",null,{"children":"consumer"}]," or ",["$","code",null,{"children":"consumer group"}]," resource, you can use the numeric or text identifier."]}]
+20:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"consumer-groups","children":[["$","a",null,{"data-card":"","href":"#consumer-groups","className":"peer","children":"Consumer groups"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 te [...]
+29:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+22:["$","p",null,{"children":["When creating the consumer group, the required ",["$","code",null,{"children":"name"}]," field has been added (must be ",["$","strong",null,{"children":"unique per topic"}],"), and is serialized as usual, at the end of the payload, starting with the ",["$","code",null,{"children":"name length"}]," (4 bytes) and the ",["$","code",null,{"children":"name"}]," itself (N bytes)."]}]
+2b:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+24:["$","p",null,{"children":["The ",["$","code",null,{"children":"DeleteConsumerGroup"}],", ",["$","code",null,{"children":"GetConsumerGroup"}],", ",["$","code",null,{"children":"JoinConsumerGroup"}]," and ",["$","code",null,{"children":"LeaveConsumerGroup"}]," commands have been extended with the ",["$","code",null,{"children":"consumer_group_id"}]," field, which is now an ",["$","code",null,{"children":"Identifier"}]," type, instead of ",["$","code",null,{"children":"u32"}],"."]}]
+2d:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+26:["$","p",null,{"children":["When fetching the consumer group(s), the ",["$","code",null,{"children":"ConsumerGroup"}]," and ",["$","code",null,{"children":"ConsumerGroupDetails"}]," structs have been extended with the ",["$","code",null,{"children":"name"}]," field, which serialized after ",["$","code",null,{"children":"members_count"}],"."]}]
+27:["$","footer",null,{"className":"mt-16 border-t border-fd-border pt-8","children":["$","$L9",null,{"href":"/blogs","className":"inline-flex items-center gap-2 text-sm font-medium text-fd-primary transition-colors hover:opacity-80","children":"← Back to all posts"}]}]
+2a:["$","$L28",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" CreateConsumerGroup"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark [...]
+2c:["$","$L28",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" DeleteConsumerGroup"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark [...]
+2e:["$","$L28",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" ConsumerGroup"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1 [...]
+2f:["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}]
+30:["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" JoinConsumerGroup"}]
+31:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" {"}]
+32:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" pub"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" stream_id"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Identifier"}],["$","span",null,{"style":{"--s [...]
+33:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" pub"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" topic_id"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Identifier"}],["$","span",null,{"style":{"--sh [...]
+34:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" pub"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" consumer_group_id"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Identifier"}],["$","span",null,{"styl [...]
+35:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"}"}]}]
+36:["$","span",null,{"className":"line"}]
+37:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" LeaveConsumerGroup"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" {"}]]}]
+38:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" pub"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" stream_id"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Identifier"}],["$","span",null,{"style":{"--s [...]
+39:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" pub"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" topic_id"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Identifier"}],["$","span",null,{"style":{"--sh [...]
+3a:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" pub"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" consumer_group_id"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Identifier"}],["$","span",null,{"styl [...]
+3b:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"}"}]}]
+3c:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]
+3d:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" pub"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" members_count"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" u32"}],["$","span",null,{"style":{"--shik [...]
+3e:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" pub"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" members"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Vec"}],["$","span",null,{"style":{"--shiki-ligh [...]
+3f:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"}"}]}]
+17:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
+40:I[27201,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"IconMark"]
+15:null
+19:[["$","title","0",{"children":"Consumer identifier | Apache Iggy"}],["$","link","1",{"rel":"icon","href":"/img/favicon.png"}],["$","$L40","2",{}]]
diff --git a/blogs/2023/10/02/consumer-identifier/__next._head.txt b/blogs/2023/10/02/consumer-identifier/__next._head.txt
new file mode 100644
index 00000000..edc7223a
--- /dev/null
+++ b/blogs/2023/10/02/consumer-identifier/__next._head.txt
@@ -0,0 +1,6 @@
+1:"$Sreact.fragment"
+2:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"ViewportBoundary"]
+3:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"MetadataBoundary"]
+4:"$Sreact.suspense"
+5:I[27201,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"IconMark"]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","h",{"children":[null,["$","$L2",null,{"children":[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]}],["$","div",null,{"hidden":true,"children":["$","$L3",null,{"children":["$","$4",null,{"name":"Next.Metadata","children":[["$","title","0",{"children":"Consumer identifier | Apache Iggy"}],["$","link","1",{"rel":"icon","href":"/img/favicon.png"}],["$","$L5","2",{} [...]
diff --git a/blogs/2023/10/02/consumer-identifier/__next._index.txt b/blogs/2023/10/02/consumer-identifier/__next._index.txt
new file mode 100644
index 00000000..fd02bd95
--- /dev/null
+++ b/blogs/2023/10/02/consumer-identifier/__next._index.txt
@@ -0,0 +1,7 @@
+1:"$Sreact.fragment"
+2:I[17751,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js"],"RootProvider"]
+3:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+4:I[58298,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/5a37d4cb1abe17d7.js"],"default"]
+5:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+:HL["/_next/static/chunks/32a0415c8ab1bd26.css","style"]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/32a0415c8ab1bd26.css","precedence":"next"}],["$","script","script-0",{"src":"/_next/static/chunks/9ebd3a84bf60af84.js","async":true}],["$","script","script-1",{"src":"/_next/static/chunks/78b5f2e7b839e72f.js","async":true}]],["$","html",null,{"lang":"en","className":"geistsans_d5a4f12f-module__Ur3q_a__variable geistmono_157ca88a-module__iaM1Ya__variable" [...]
diff --git a/blogs/2023/10/02/consumer-identifier/__next._tree.txt b/blogs/2023/10/02/consumer-identifier/__next._tree.txt
new file mode 100644
index 00000000..1275f42e
--- /dev/null
+++ b/blogs/2023/10/02/consumer-identifier/__next._tree.txt
@@ -0,0 +1,4 @@
+:HL["/_next/static/chunks/32a0415c8ab1bd26.css","style"]
+:HL["/_next/static/media/GeistMono_Variable.p.2f937313.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+:HL["/_next/static/media/Geist_Variable-s.p.92592eb2.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","tree":{"name":"","paramType":null,"paramKey":"","hasRuntimePrefetch":false,"slots":{"children":{"name":"(site)","paramType":null,"paramKey":"(site)","hasRuntimePrefetch":false,"slots":{"children":{"name":"blogs","paramType":null,"paramKey":"blogs","hasRuntimePrefetch":false,"slots":{"children":{"name":"slug","paramType":"c","paramKey":"2023/10/02/consumer-identifier","hasRuntimePrefetch":false,"slots":{"children":{"name":"__PAGE__","paramType":null," [...]
diff --git a/blogs/2023/10/02/consumer-identifier/index.html b/blogs/2023/10/02/consumer-identifier/index.html
new file mode 100644
index 00000000..6b1fb0d9
--- /dev/null
+++ b/blogs/2023/10/02/consumer-identifier/index.html
@@ -0,0 +1,57 @@
+<!DOCTYPE html><!--uBHgltRE2s5QA49x61S_u--><html lang="en" class="geistsans_d5a4f12f-module__Ur3q_a__variable geistmono_157ca88a-module__iaM1Ya__variable"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" href="/_next/static/media/GeistMono_Variable.p.2f937313.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="preload" href="/_next/static/media/Geist_Variable-s.p.92592eb2.woff2" as="font" crossorigin="" type=" [...]
+<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="breaking-changes"><a data-card="" href="#breaking-changes" class="peer">Breaking changes</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 [...]
+<p>The breaking changes have been introduced in Iggy server, starting from version <code>0.0.30</code> and Iggy SDK, starting from version <code>0.0.90</code>. The final commit containing all the mentioned changes is <a href="https://github.com/apache/iggy/commit/655f9b6bccb0ae4148422f32475a9bedc09827d2" rel="noreferrer noopener" target="_blank">#655f9b6</a>.</p>
+<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="consumer-identifier"><a data-card="" href="#consumer-identifier" class="peer">Consumer identifier</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d= [...]
+<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-3 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-c [...]
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> kind</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> ConsumerKind</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> id</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Identifier</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre></div></figure>
+<p>All the commands, such as <code>PollMessages</code>, <code>StoreConsumerOffset</code> and <code>GetConsumerOffset</code> which contain the <code>consumer</code> field, now require an update to the underlying serialization, as the <code>id</code> field is now an <code>Identifier</code> type, instead of <code>u32</code>. The serialization is the same, as when working with the <code>stream</code>, <code>topic</code> or <code>user</code> resources.</p>
+<p>From now on, whenever working with the <code>consumer</code> or <code>consumer group</code> resource, you can use the numeric or text identifier.</p>
+<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="consumer-groups"><a data-card="" href="#consumer-groups" class="peer">Consumer groups</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 [...]
+<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-3 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-c [...]
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> stream_id</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Identifier</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> topic_id</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Identifier</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> consumer_group_id</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> u32</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> name</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> String</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre></div></figure>
+<p>When creating the consumer group, the required <code>name</code> field has been added (must be <strong>unique per topic</strong>), and is serialized as usual, at the end of the payload, starting with the <code>name length</code> (4 bytes) and the <code>name</code> itself (N bytes).</p>
+<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-3 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-c [...]
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> stream_id</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Identifier</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> topic_id</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Identifier</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> consumer_group_id</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Identifier</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
+<span class="line"></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">pub</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> struct</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> GetConsumerGroup</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> stream_id</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Identifier</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> topic_id</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Identifier</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> consumer_group_id</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Identifier</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
+<span class="line"></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">pub</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> struct</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> JoinConsumerGroup</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> stream_id</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Identifier</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> topic_id</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Identifier</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> consumer_group_id</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Identifier</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
+<span class="line"></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">pub</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> struct</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> LeaveConsumerGroup</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> stream_id</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Identifier</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> topic_id</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Identifier</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> consumer_group_id</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Identifier</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre></div></figure>
+<p>The <code>DeleteConsumerGroup</code>, <code>GetConsumerGroup</code>, <code>JoinConsumerGroup</code> and <code>LeaveConsumerGroup</code> commands have been extended with the <code>consumer_group_id</code> field, which is now an <code>Identifier</code> type, instead of <code>u32</code>.</p>
+<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-3 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-c [...]
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> id</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> u32</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> name</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> String</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> partitions_count</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> u32</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> members_count</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> u32</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
+<span class="line"></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">pub</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> struct</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> ConsumerGroupDetails</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> id</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> u32</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> name</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> String</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> partitions_count</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> u32</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> members_count</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> u32</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> members</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Vec</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"><</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">ConsumerGroupMember</span><span style="--shiki-light:#24292E;--shiki-dar [...]
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre></div></figure>
+<p>When fetching the consumer group(s), the <code>ConsumerGroup</code> and <code>ConsumerGroupDetails</code> structs have been extended with the <code>name</code> field, which serialized after <code>members_count</code>.</p></div><footer class="mt-16 border-t border-fd-border pt-8"><a class="inline-flex items-center gap-2 text-sm font-medium text-fd-primary transition-colors hover:opacity-80" href="/blogs/">← Back to all posts</a></footer></article></main><!--$--><!--/$--></main><script [...]
\ No newline at end of file
diff --git a/blogs/2023/10/02/consumer-identifier/index.txt b/blogs/2023/10/02/consumer-identifier/index.txt
new file mode 100644
index 00000000..63ac68e7
--- /dev/null
+++ b/blogs/2023/10/02/consumer-identifier/index.txt
@@ -0,0 +1,64 @@
+1:"$Sreact.fragment"
+2:I[17751,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js"],"RootProvider"]
+3:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+4:I[58298,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/5a37d4cb1abe17d7.js"],"default"]
+5:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+6:I[83571,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Header"]
+7:I[29966,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFDropdown"]
+8:I[36330,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFMobileLinks"]
+9:I[22016,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],""]
+a:I[88760,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Logo"]
+11:I[68027,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+:HL["/_next/static/chunks/32a0415c8ab1bd26.css","style"]
+:HL["/_next/static/media/GeistMono_Variable.p.2f937313.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+:HL["/_next/static/media/Geist_Variable-s.p.92592eb2.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+0:{"P":null,"b":"uBHgltRE2s5QA49x61S_u","c":["","blogs","2023","10","02","consumer-identifier",""],"q":"","i":false,"f":[[["",{"children":["(site)",{"children":["blogs",{"children":[["slug","2023/10/02/consumer-identifier","c"],{"children":["__PAGE__",{}]}]}]}]},"$undefined","$undefined",true],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/32a0415c8ab1bd26.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","scrip [...]
+13:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"OutletBoundary"]
+14:"$Sreact.suspense"
+16:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"ViewportBoundary"]
+18:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"MetadataBoundary"]
+b:["$","h1",null,{"className":"next-error-h1","style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:1:props:style","children":404}]
+c:["$","div",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:style","children":["$","h2",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style","children":"This page could not be found."}]}]
+d:["$","$1","c",{"children":[null,["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}]
+e:["$","$1","c",{"children":[null,["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}]
+f:["$","$1","c",{"children":["$L12",[["$","script","script-0",{"src":"/_next/static/chunks/00b00679782d0ffd.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/3562882a488c4fbb.js","async":true,"nonce":"$undefined"}]],["$","$L13",null,{"children":["$","$14",null,{"name":"Next.MetadataOutlet","children":"$@15"}]}]]}]
+10:["$","$1","h",{"children":[null,["$","$L16",null,{"children":"$L17"}],["$","div",null,{"hidden":true,"children":["$","$L18",null,{"children":["$","$14",null,{"name":"Next.Metadata","children":"$L19"}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}]
+1a:I[47873,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"default"]
+1b:I[44324,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"CodeBlock"]
+1c:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+28:I[44324,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"Pre"]
+1d:["$","$L28",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Consumer"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8" [...]
+1e:["$","p",null,{"children":["All the commands, such as ",["$","code",null,{"children":"PollMessages"}],", ",["$","code",null,{"children":"StoreConsumerOffset"}]," and ",["$","code",null,{"children":"GetConsumerOffset"}]," which contain the ",["$","code",null,{"children":"consumer"}]," field, now require an update to the underlying serialization, as the ",["$","code",null,{"children":"id"}]," field is now an ",["$","code",null,{"children":"Identifier"}]," type, instead of ",["$","code", [...]
+1f:["$","p",null,{"children":["From now on, whenever working with the ",["$","code",null,{"children":"consumer"}]," or ",["$","code",null,{"children":"consumer group"}]," resource, you can use the numeric or text identifier."]}]
+20:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"consumer-groups","children":[["$","a",null,{"data-card":"","href":"#consumer-groups","className":"peer","children":"Consumer groups"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 te [...]
+29:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+22:["$","p",null,{"children":["When creating the consumer group, the required ",["$","code",null,{"children":"name"}]," field has been added (must be ",["$","strong",null,{"children":"unique per topic"}],"), and is serialized as usual, at the end of the payload, starting with the ",["$","code",null,{"children":"name length"}]," (4 bytes) and the ",["$","code",null,{"children":"name"}]," itself (N bytes)."]}]
+2b:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+24:["$","p",null,{"children":["The ",["$","code",null,{"children":"DeleteConsumerGroup"}],", ",["$","code",null,{"children":"GetConsumerGroup"}],", ",["$","code",null,{"children":"JoinConsumerGroup"}]," and ",["$","code",null,{"children":"LeaveConsumerGroup"}]," commands have been extended with the ",["$","code",null,{"children":"consumer_group_id"}]," field, which is now an ",["$","code",null,{"children":"Identifier"}]," type, instead of ",["$","code",null,{"children":"u32"}],"."]}]
+2d:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+26:["$","p",null,{"children":["When fetching the consumer group(s), the ",["$","code",null,{"children":"ConsumerGroup"}]," and ",["$","code",null,{"children":"ConsumerGroupDetails"}]," structs have been extended with the ",["$","code",null,{"children":"name"}]," field, which serialized after ",["$","code",null,{"children":"members_count"}],"."]}]
+27:["$","footer",null,{"className":"mt-16 border-t border-fd-border pt-8","children":["$","$L9",null,{"href":"/blogs","className":"inline-flex items-center gap-2 text-sm font-medium text-fd-primary transition-colors hover:opacity-80","children":"← Back to all posts"}]}]
+2a:["$","$L28",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" CreateConsumerGroup"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark [...]
+2c:["$","$L28",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" DeleteConsumerGroup"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark [...]
+2e:["$","$L28",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" ConsumerGroup"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1 [...]
+2f:["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}]
+30:["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" JoinConsumerGroup"}]
+31:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" {"}]
+32:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" pub"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" stream_id"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Identifier"}],["$","span",null,{"style":{"--s [...]
+33:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" pub"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" topic_id"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Identifier"}],["$","span",null,{"style":{"--sh [...]
+34:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" pub"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" consumer_group_id"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Identifier"}],["$","span",null,{"styl [...]
+35:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"}"}]}]
+36:["$","span",null,{"className":"line"}]
+37:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" LeaveConsumerGroup"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" {"}]]}]
+38:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" pub"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" stream_id"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Identifier"}],["$","span",null,{"style":{"--s [...]
+39:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" pub"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" topic_id"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Identifier"}],["$","span",null,{"style":{"--sh [...]
+3a:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" pub"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" consumer_group_id"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Identifier"}],["$","span",null,{"styl [...]
+3b:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"}"}]}]
+3c:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]
+3d:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" pub"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" members_count"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" u32"}],["$","span",null,{"style":{"--shik [...]
+3e:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" pub"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" members"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Vec"}],["$","span",null,{"style":{"--shiki-ligh [...]
+3f:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"}"}]}]
+17:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
+40:I[27201,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"IconMark"]
+15:null
+19:[["$","title","0",{"children":"Consumer identifier | Apache Iggy"}],["$","link","1",{"rel":"icon","href":"/img/favicon.png"}],["$","$L40","2",{}]]
diff --git a/blogs/2023/10/12/personal-access-tokens/__next.!KHNpdGUp.blogs.$c$slug.__PAGE__.txt b/blogs/2023/10/12/personal-access-tokens/__next.!KHNpdGUp.blogs.$c$slug.__PAGE__.txt
new file mode 100644
index 00000000..dd67aea4
--- /dev/null
+++ b/blogs/2023/10/12/personal-access-tokens/__next.!KHNpdGUp.blogs.$c$slug.__PAGE__.txt
@@ -0,0 +1,40 @@
+1:"$Sreact.fragment"
+2:I[47873,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"default"]
+13:I[44324,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"CodeBlock"]
+1c:I[44324,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"Pre"]
+1d:I[22016,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],""]
+1e:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"OutletBoundary"]
+1f:"$Sreact.suspense"
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","c",{"children":[["$","main",null,{"className":"min-h-screen px-6 py-16 md:px-12","children":["$","article",null,{"className":"mx-auto max-w-5xl","children":[["$","header",null,{"className":"mb-10","children":[["$","time",null,{"className":"text-sm font-medium text-fd-muted-foreground","children":"October 12, 2023"}],["$","h1",null,{"className":"mt-3 text-3xl font-extrabold tracking-tight text-fd-foreground md:text-5xl","children":"Per [...]
+14:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+4:["$","p",null,{"children":["Each token must have a unique ",["$","code",null,{"children":"name"}],", which is used to identify the token. The ",["$","code",null,{"children":"expiry"}]," field is optional, and if set, it must be the amount of seconds since the token creation on the server side, after which the token will expire. A single user may create the maximum of 100 tokens."]}]
+16:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+6:["$","p",null,{"children":["When creating the token, the server returns the ",["$","code",null,{"children":"RawPersonalAccessToken"}]," struct, which contains the string ",["$","code",null,{"children":"token"}]," value."]}]
+18:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+8:["$","p",null,{"children":["This is returned ",["$","strong",null,{"children":"only once"}],", as it's a raw, secure token, which should be stored by the client. The server only stores the hashed version of the token, and it's not possible to retrieve the original value. The token can be used to authenticate the client using the ",["$","code",null,{"children":"LoginWithPersonalAccessToken"}]," command."]}]
+9:["$","p",null,{"children":["The following structure is returned when listing the tokens. It contains the ",["$","code",null,{"children":"name"}]," and an optional ",["$","code",null,{"children":"expiry"}]," fields. Please note that the ",["$","code",null,{"children":"expiry"}]," is the actual timestamp (Epoch in microseconds) of when the token will expire, and not the amount of seconds since the token creation (like provided in the ",["$","code",null,{"children":"CreatePersonalAccessTo [...]
+1a:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+b:["$","p",null,{"children":["Login with PAT is very similar to the regular login with user credentials, and it returns the same ",["$","code",null,{"children":"IdentityInfo"}]," structure."]}]
+c:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"configuration","children":[["$","a",null,{"data-card":"","href":"#configuration","className":"peer","children":"Configuration"}],["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opa [...]
+d:["$","p",null,{"children":"On the server side, you can enable the background task responsible for deleting the expired tokens."}]
+e:["$","$L13",null,{"className":"shiki shiki-themes github-light github-dark","style":{"--shiki-light":"#24292e","--shiki-dark":"#e1e4e8","--shiki-light-bg":"#fff","--shiki-dark-bg":"#24292e"},"tabIndex":"0","icon":"<svg viewBox=\"0 0 24 24\"><path d=\"M 6,1 C 4.354992,1 3,2.354992 3,4 v 16 c 0,1.645008 1.354992,3 3,3 h 12 c 1.645008,0 3,-1.354992 3,-3 V 8 7 A 1.0001,1.0001 0 0 0 20.707031,6.2929687 l -5,-5 A 1.0001,1.0001 0 0 0 15,1 h -1 z m 0,2 h 7 v 3 c 0,1.645008 1.354992,3 3,3 h 3 v [...]
+f:["$","footer",null,{"className":"mt-16 border-t border-fd-border pt-8","children":["$","$L1d",null,{"href":"/blogs","className":"inline-flex items-center gap-2 text-sm font-medium text-fd-primary transition-colors hover:opacity-80","children":"← Back to all posts"}]}]
+10:["$","script","script-0",{"src":"/_next/static/chunks/00b00679782d0ffd.js","async":true}]
+11:["$","script","script-1",{"src":"/_next/static/chunks/3562882a488c4fbb.js","async":true}]
+12:["$","$L1e",null,{"children":["$","$1f",null,{"name":"Next.MetadataOutlet","children":"$@20"}]}]
+15:["$","$L1c",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" CreatePersonalAccessToken"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shik [...]
+17:["$","$L1c",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"async"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" fn"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" get_personal_access_tokens"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki [...]
+19:["$","$L1c",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" RawPersonalAccessToken"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-d [...]
+1b:["$","$L1c",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" PersonalAccessTokenInfo"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki- [...]
+20:null
+21:["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" fn"}]
+22:["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" delete_personal_access_token"}]
+23:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"("}]
+24:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" &"}],["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":"self"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+25:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" command"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" &"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"DeletePersonalAccessToken"}],["$","span",null,{"st [...]
+26:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":") "}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"->"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Result"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"<(), "}],["$","span",null,{"style":{"--shiki-light":" [...]
+27:["$","span",null,{"className":"line"}]
+28:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"async"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" fn"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" login_with_personal_access_token"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"("}]]}]
+29:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" &"}],["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":"self"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+2a:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" command"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" &"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"LoginWithPersonalAccessToken"}],["$","span",null,{ [...]
+2b:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":") "}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"->"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Result"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"<"}],["$","span",null,{"style":{"--shiki-light":"#6F4 [...]
diff --git a/blogs/2023/10/12/personal-access-tokens/__next.!KHNpdGUp.blogs.$c$slug.txt b/blogs/2023/10/12/personal-access-tokens/__next.!KHNpdGUp.blogs.$c$slug.txt
new file mode 100644
index 00000000..11b31bb0
--- /dev/null
+++ b/blogs/2023/10/12/personal-access-tokens/__next.!KHNpdGUp.blogs.$c$slug.txt
@@ -0,0 +1,4 @@
+1:"$Sreact.fragment"
+2:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+3:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","template":["$","$L3",null,{}]}]]}],"loading":null,"isPartial":false}
diff --git a/blogs/2023/10/12/personal-access-tokens/__next.!KHNpdGUp.blogs.txt b/blogs/2023/10/12/personal-access-tokens/__next.!KHNpdGUp.blogs.txt
new file mode 100644
index 00000000..11b31bb0
--- /dev/null
+++ b/blogs/2023/10/12/personal-access-tokens/__next.!KHNpdGUp.blogs.txt
@@ -0,0 +1,4 @@
+1:"$Sreact.fragment"
+2:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+3:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","template":["$","$L3",null,{}]}]]}],"loading":null,"isPartial":false}
diff --git a/blogs/2023/10/12/personal-access-tokens/__next.!KHNpdGUp.txt b/blogs/2023/10/12/personal-access-tokens/__next.!KHNpdGUp.txt
new file mode 100644
index 00000000..ea3bfa55
--- /dev/null
+++ b/blogs/2023/10/12/personal-access-tokens/__next.!KHNpdGUp.txt
@@ -0,0 +1,9 @@
+1:"$Sreact.fragment"
+2:I[83571,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Header"]
+3:I[29966,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFDropdown"]
+4:I[36330,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFMobileLinks"]
+5:I[22016,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],""]
+6:I[88760,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Logo"]
+7:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+8:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","c",{"children":[[["$","script","script-0",{"src":"/_next/static/chunks/8d86be78428a601a.js","async":true}],["$","script","script-1",{"src":"/_next/static/chunks/da34cc6305706ac6.js","async":true}],["$","script","script-2",{"src":"/_next/static/chunks/9baf65674e2de991.js","async":true}],["$","script","script-3",{"src":"/_next/static/chunks/26b70f9828dd1eb5.js","async":true}],["$","script","script-4",{"src":"/_next/static/chunks/adeed83 [...]
diff --git a/blogs/2023/10/12/personal-access-tokens/__next._full.txt b/blogs/2023/10/12/personal-access-tokens/__next._full.txt
new file mode 100644
index 00000000..10124104
--- /dev/null
+++ b/blogs/2023/10/12/personal-access-tokens/__next._full.txt
@@ -0,0 +1,60 @@
+1:"$Sreact.fragment"
+2:I[17751,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js"],"RootProvider"]
+3:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+4:I[58298,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/5a37d4cb1abe17d7.js"],"default"]
+5:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+6:I[83571,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Header"]
+7:I[29966,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFDropdown"]
+8:I[36330,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFMobileLinks"]
+9:I[22016,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],""]
+a:I[88760,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Logo"]
+11:I[68027,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+:HL["/_next/static/chunks/32a0415c8ab1bd26.css","style"]
+:HL["/_next/static/media/GeistMono_Variable.p.2f937313.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+:HL["/_next/static/media/Geist_Variable-s.p.92592eb2.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+0:{"P":null,"b":"uBHgltRE2s5QA49x61S_u","c":["","blogs","2023","10","12","personal-access-tokens",""],"q":"","i":false,"f":[[["",{"children":["(site)",{"children":["blogs",{"children":[["slug","2023/10/12/personal-access-tokens","c"],{"children":["__PAGE__",{}]}]}]}]},"$undefined","$undefined",true],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/32a0415c8ab1bd26.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$", [...]
+13:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"OutletBoundary"]
+14:"$Sreact.suspense"
+16:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"ViewportBoundary"]
+18:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"MetadataBoundary"]
+b:["$","h1",null,{"className":"next-error-h1","style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:1:props:style","children":404}]
+c:["$","div",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:style","children":["$","h2",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style","children":"This page could not be found."}]}]
+d:["$","$1","c",{"children":[null,["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}]
+e:["$","$1","c",{"children":[null,["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}]
+f:["$","$1","c",{"children":["$L12",[["$","script","script-0",{"src":"/_next/static/chunks/00b00679782d0ffd.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/3562882a488c4fbb.js","async":true,"nonce":"$undefined"}]],["$","$L13",null,{"children":["$","$14",null,{"name":"Next.MetadataOutlet","children":"$@15"}]}]]}]
+10:["$","$1","h",{"children":[null,["$","$L16",null,{"children":"$L17"}],["$","div",null,{"hidden":true,"children":["$","$L18",null,{"children":["$","$14",null,{"name":"Next.Metadata","children":"$L19"}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}]
+1a:I[47873,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"default"]
+1b:I[44324,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"CodeBlock"]
+1c:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+2a:I[44324,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"Pre"]
+1d:["$","$L2a",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" CreatePersonalAccessToken"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shik [...]
+1e:["$","p",null,{"children":["Each token must have a unique ",["$","code",null,{"children":"name"}],", which is used to identify the token. The ",["$","code",null,{"children":"expiry"}]," field is optional, and if set, it must be the amount of seconds since the token creation on the server side, after which the token will expire. A single user may create the maximum of 100 tokens."]}]
+2b:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+20:["$","p",null,{"children":["When creating the token, the server returns the ",["$","code",null,{"children":"RawPersonalAccessToken"}]," struct, which contains the string ",["$","code",null,{"children":"token"}]," value."]}]
+2d:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+22:["$","p",null,{"children":["This is returned ",["$","strong",null,{"children":"only once"}],", as it's a raw, secure token, which should be stored by the client. The server only stores the hashed version of the token, and it's not possible to retrieve the original value. The token can be used to authenticate the client using the ",["$","code",null,{"children":"LoginWithPersonalAccessToken"}]," command."]}]
+23:["$","p",null,{"children":["The following structure is returned when listing the tokens. It contains the ",["$","code",null,{"children":"name"}]," and an optional ",["$","code",null,{"children":"expiry"}]," fields. Please note that the ",["$","code",null,{"children":"expiry"}]," is the actual timestamp (Epoch in microseconds) of when the token will expire, and not the amount of seconds since the token creation (like provided in the ",["$","code",null,{"children":"CreatePersonalAccessT [...]
+2f:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+25:["$","p",null,{"children":["Login with PAT is very similar to the regular login with user credentials, and it returns the same ",["$","code",null,{"children":"IdentityInfo"}]," structure."]}]
+26:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"configuration","children":[["$","a",null,{"data-card":"","href":"#configuration","className":"peer","children":"Configuration"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd- [...]
+27:["$","p",null,{"children":"On the server side, you can enable the background task responsible for deleting the expired tokens."}]
+28:["$","$L1b",null,{"className":"shiki shiki-themes github-light github-dark","style":{"--shiki-light":"#24292e","--shiki-dark":"#e1e4e8","--shiki-light-bg":"#fff","--shiki-dark-bg":"#24292e"},"tabIndex":"0","icon":"<svg viewBox=\"0 0 24 24\"><path d=\"M 6,1 C 4.354992,1 3,2.354992 3,4 v 16 c 0,1.645008 1.354992,3 3,3 h 12 c 1.645008,0 3,-1.354992 3,-3 V 8 7 A 1.0001,1.0001 0 0 0 20.707031,6.2929687 l -5,-5 A 1.0001,1.0001 0 0 0 15,1 h -1 z m 0,2 h 7 v 3 c 0,1.645008 1.354992,3 3,3 h 3 [...]
+29:["$","footer",null,{"className":"mt-16 border-t border-fd-border pt-8","children":["$","$L9",null,{"href":"/blogs","className":"inline-flex items-center gap-2 text-sm font-medium text-fd-primary transition-colors hover:opacity-80","children":"← Back to all posts"}]}]
+2c:["$","$L2a",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"async"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" fn"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" get_personal_access_tokens"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki [...]
+2e:["$","$L2a",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" RawPersonalAccessToken"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-d [...]
+30:["$","$L2a",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" PersonalAccessTokenInfo"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki- [...]
+31:["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" fn"}]
+32:["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" delete_personal_access_token"}]
+33:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"("}]
+34:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" &"}],["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":"self"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+35:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" command"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" &"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"DeletePersonalAccessToken"}],["$","span",null,{"st [...]
+36:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":") "}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"->"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Result"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"<(), "}],["$","span",null,{"style":{"--shiki-light":" [...]
+37:["$","span",null,{"className":"line"}]
+38:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"async"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" fn"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" login_with_personal_access_token"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"("}]]}]
+39:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" &"}],["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":"self"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+3a:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" command"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" &"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"LoginWithPersonalAccessToken"}],["$","span",null,{ [...]
+3b:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":") "}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"->"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Result"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"<"}],["$","span",null,{"style":{"--shiki-light":"#6F4 [...]
+17:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
+3c:I[27201,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"IconMark"]
+15:null
+19:[["$","title","0",{"children":"Personal access tokens | Apache Iggy"}],["$","link","1",{"rel":"icon","href":"/img/favicon.png"}],["$","$L3c","2",{}]]
diff --git a/blogs/2023/10/12/personal-access-tokens/__next._head.txt b/blogs/2023/10/12/personal-access-tokens/__next._head.txt
new file mode 100644
index 00000000..eb4e7c7d
--- /dev/null
+++ b/blogs/2023/10/12/personal-access-tokens/__next._head.txt
@@ -0,0 +1,6 @@
+1:"$Sreact.fragment"
+2:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"ViewportBoundary"]
+3:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"MetadataBoundary"]
+4:"$Sreact.suspense"
+5:I[27201,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"IconMark"]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","h",{"children":[null,["$","$L2",null,{"children":[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]}],["$","div",null,{"hidden":true,"children":["$","$L3",null,{"children":["$","$4",null,{"name":"Next.Metadata","children":[["$","title","0",{"children":"Personal access tokens | Apache Iggy"}],["$","link","1",{"rel":"icon","href":"/img/favicon.png"}],["$","$L5","2" [...]
diff --git a/blogs/2023/10/12/personal-access-tokens/__next._index.txt b/blogs/2023/10/12/personal-access-tokens/__next._index.txt
new file mode 100644
index 00000000..fd02bd95
--- /dev/null
+++ b/blogs/2023/10/12/personal-access-tokens/__next._index.txt
@@ -0,0 +1,7 @@
+1:"$Sreact.fragment"
+2:I[17751,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js"],"RootProvider"]
+3:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+4:I[58298,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/5a37d4cb1abe17d7.js"],"default"]
+5:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+:HL["/_next/static/chunks/32a0415c8ab1bd26.css","style"]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/32a0415c8ab1bd26.css","precedence":"next"}],["$","script","script-0",{"src":"/_next/static/chunks/9ebd3a84bf60af84.js","async":true}],["$","script","script-1",{"src":"/_next/static/chunks/78b5f2e7b839e72f.js","async":true}]],["$","html",null,{"lang":"en","className":"geistsans_d5a4f12f-module__Ur3q_a__variable geistmono_157ca88a-module__iaM1Ya__variable" [...]
diff --git a/blogs/2023/10/12/personal-access-tokens/__next._tree.txt b/blogs/2023/10/12/personal-access-tokens/__next._tree.txt
new file mode 100644
index 00000000..391cb69d
--- /dev/null
+++ b/blogs/2023/10/12/personal-access-tokens/__next._tree.txt
@@ -0,0 +1,4 @@
+:HL["/_next/static/chunks/32a0415c8ab1bd26.css","style"]
+:HL["/_next/static/media/GeistMono_Variable.p.2f937313.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+:HL["/_next/static/media/Geist_Variable-s.p.92592eb2.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","tree":{"name":"","paramType":null,"paramKey":"","hasRuntimePrefetch":false,"slots":{"children":{"name":"(site)","paramType":null,"paramKey":"(site)","hasRuntimePrefetch":false,"slots":{"children":{"name":"blogs","paramType":null,"paramKey":"blogs","hasRuntimePrefetch":false,"slots":{"children":{"name":"slug","paramType":"c","paramKey":"2023/10/12/personal-access-tokens","hasRuntimePrefetch":false,"slots":{"children":{"name":"__PAGE__","paramType":nul [...]
diff --git a/blogs/2023/10/12/personal-access-tokens/index.html b/blogs/2023/10/12/personal-access-tokens/index.html
new file mode 100644
index 00000000..1a7a2a75
--- /dev/null
+++ b/blogs/2023/10/12/personal-access-tokens/index.html
@@ -0,0 +1,55 @@
+<!DOCTYPE html><!--uBHgltRE2s5QA49x61S_u--><html lang="en" class="geistsans_d5a4f12f-module__Ur3q_a__variable geistmono_157ca88a-module__iaM1Ya__variable"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" href="/_next/static/media/GeistMono_Variable.p.2f937313.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="preload" href="/_next/static/media/Geist_Variable-s.p.92592eb2.woff2" as="font" crossorigin="" type=" [...]
+<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="breaking-changes"><a data-card="" href="#breaking-changes" class="peer">Breaking changes</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 [...]
+<p>No breaking changes have been introduced in neither Iggy server, nor Iggy SDK. The server does support the new <code>PAT</code> authentication method since version <code>0.0.40</code>, and the SDK since version <code>0.0.100</code>. The initial changes are part of the commit <a href="https://github.com/apache/iggy/commit/e74c25e058b1f39119ee89b5ada5d93f171cb221" rel="noreferrer noopener" target="_blank">#e74c25e</a>.</p>
+<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="personal-access-tokens"><a data-card="" href="#personal-access-tokens" class="peer">Personal access tokens</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true" [...]
+<p>PAT is a simple idea, which allows authenticating the clients using a token, instead of the regular credentials (username and password). This approach might feel safer for some users, as the token can be deleted at any time, and it's not tied to the user's password. The tokens can be created, listed and deleted using the available APIs. PAT has an optional expiry, which can be set when creating the token.</p>
+<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-3 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-c [...]
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> name</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> String</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> expiry</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Option</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"><</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">u32</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">> [...]
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
+<span class="line"></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">pub</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> struct</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> DeletePersonalAccessToken</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> name</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> String</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
+<span class="line"></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">pub</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> struct</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> GetPersonalAccessTokens</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {}</span></span>
+<span class="line"></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">pub</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> struct</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> LoginWithPersonalAccessToken</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> token</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> String</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre></div></figure>
+<p>Each token must have a unique <code>name</code>, which is used to identify the token. The <code>expiry</code> field is optional, and if set, it must be the amount of seconds since the token creation on the server side, after which the token will expire. A single user may create the maximum of 100 tokens.</p>
+<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-3 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-c [...]
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> &</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">self</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> command</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> &</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">GetPersonalAccessTokens</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-></span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Result</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"><</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">Vec</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"><</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">Persona [...]
+<span class="line"></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">async</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> fn</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> create_personal_access_token</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> &</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">self</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> command</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> &</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">CreatePersonalAccessToken</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-></span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Result</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"><</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">RawPersonalAccessToken</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#6F42C1;--shiki-dark [...]
+<span class="line"></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">async</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> fn</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> delete_personal_access_token</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> &</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">self</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> command</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> &</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">DeletePersonalAccessToken</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-></span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Result</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"><(), </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">Error</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">>;</span></span>
+<span class="line"></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">async</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> fn</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> login_with_personal_access_token</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> &</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">self</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> command</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> &</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">LoginWithPersonalAccessToken</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-></span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Result</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"><</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">IdentityInfo</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> [...]
+<p>When creating the token, the server returns the <code>RawPersonalAccessToken</code> struct, which contains the string <code>token</code> value.</p>
+<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-3 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-c [...]
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> token</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> String</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre></div></figure>
+<p>This is returned <strong>only once</strong>, as it's a raw, secure token, which should be stored by the client. The server only stores the hashed version of the token, and it's not possible to retrieve the original value. The token can be used to authenticate the client using the <code>LoginWithPersonalAccessToken</code> command.</p>
+<p>The following structure is returned when listing the tokens. It contains the <code>name</code> and an optional <code>expiry</code> fields. Please note that the <code>expiry</code> is the actual timestamp (Epoch in microseconds) of when the token will expire, and not the amount of seconds since the token creation (like provided in the <code>CreatePersonalAccessToken</code> command).</p>
+<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-3 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-c [...]
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> name</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> String</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> expiry</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Option</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"><</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">u64</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">> [...]
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre></div></figure>
+<p>Login with PAT is very similar to the regular login with user credentials, and it returns the same <code>IdentityInfo</code> structure.</p>
+<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="configuration"><a data-card="" href="#configuration" class="peer">Configuration</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 0 [...]
+<p>On the server side, you can enable the background task responsible for deleting the expired tokens.</p>
+<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-3 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-c [...]
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">enabled = </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">true</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">interval = </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">60</span></span></code></pre></div></figure></div><footer class="mt-16 border-t border-fd-border pt-8"><a class="inline-flex items-center gap-2 text-sm font-medium text-fd-primary transition-colors hover:opacity-80" href="/blogs/">← Back to all posts</a></footer></article></main><!--$--><!--/$--></main><script src="/_next/static/chunks/922 [...]
\ No newline at end of file
diff --git a/blogs/2023/10/12/personal-access-tokens/index.txt b/blogs/2023/10/12/personal-access-tokens/index.txt
new file mode 100644
index 00000000..10124104
--- /dev/null
+++ b/blogs/2023/10/12/personal-access-tokens/index.txt
@@ -0,0 +1,60 @@
+1:"$Sreact.fragment"
+2:I[17751,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js"],"RootProvider"]
+3:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+4:I[58298,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/5a37d4cb1abe17d7.js"],"default"]
+5:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+6:I[83571,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Header"]
+7:I[29966,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFDropdown"]
+8:I[36330,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFMobileLinks"]
+9:I[22016,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],""]
+a:I[88760,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Logo"]
+11:I[68027,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+:HL["/_next/static/chunks/32a0415c8ab1bd26.css","style"]
+:HL["/_next/static/media/GeistMono_Variable.p.2f937313.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+:HL["/_next/static/media/Geist_Variable-s.p.92592eb2.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+0:{"P":null,"b":"uBHgltRE2s5QA49x61S_u","c":["","blogs","2023","10","12","personal-access-tokens",""],"q":"","i":false,"f":[[["",{"children":["(site)",{"children":["blogs",{"children":[["slug","2023/10/12/personal-access-tokens","c"],{"children":["__PAGE__",{}]}]}]}]},"$undefined","$undefined",true],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/32a0415c8ab1bd26.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$", [...]
+13:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"OutletBoundary"]
+14:"$Sreact.suspense"
+16:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"ViewportBoundary"]
+18:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"MetadataBoundary"]
+b:["$","h1",null,{"className":"next-error-h1","style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:1:props:style","children":404}]
+c:["$","div",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:style","children":["$","h2",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style","children":"This page could not be found."}]}]
+d:["$","$1","c",{"children":[null,["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}]
+e:["$","$1","c",{"children":[null,["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}]
+f:["$","$1","c",{"children":["$L12",[["$","script","script-0",{"src":"/_next/static/chunks/00b00679782d0ffd.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/3562882a488c4fbb.js","async":true,"nonce":"$undefined"}]],["$","$L13",null,{"children":["$","$14",null,{"name":"Next.MetadataOutlet","children":"$@15"}]}]]}]
+10:["$","$1","h",{"children":[null,["$","$L16",null,{"children":"$L17"}],["$","div",null,{"hidden":true,"children":["$","$L18",null,{"children":["$","$14",null,{"name":"Next.Metadata","children":"$L19"}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}]
+1a:I[47873,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"default"]
+1b:I[44324,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"CodeBlock"]
+1c:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+2a:I[44324,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"Pre"]
+1d:["$","$L2a",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" CreatePersonalAccessToken"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shik [...]
+1e:["$","p",null,{"children":["Each token must have a unique ",["$","code",null,{"children":"name"}],", which is used to identify the token. The ",["$","code",null,{"children":"expiry"}]," field is optional, and if set, it must be the amount of seconds since the token creation on the server side, after which the token will expire. A single user may create the maximum of 100 tokens."]}]
+2b:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+20:["$","p",null,{"children":["When creating the token, the server returns the ",["$","code",null,{"children":"RawPersonalAccessToken"}]," struct, which contains the string ",["$","code",null,{"children":"token"}]," value."]}]
+2d:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+22:["$","p",null,{"children":["This is returned ",["$","strong",null,{"children":"only once"}],", as it's a raw, secure token, which should be stored by the client. The server only stores the hashed version of the token, and it's not possible to retrieve the original value. The token can be used to authenticate the client using the ",["$","code",null,{"children":"LoginWithPersonalAccessToken"}]," command."]}]
+23:["$","p",null,{"children":["The following structure is returned when listing the tokens. It contains the ",["$","code",null,{"children":"name"}]," and an optional ",["$","code",null,{"children":"expiry"}]," fields. Please note that the ",["$","code",null,{"children":"expiry"}]," is the actual timestamp (Epoch in microseconds) of when the token will expire, and not the amount of seconds since the token creation (like provided in the ",["$","code",null,{"children":"CreatePersonalAccessT [...]
+2f:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+25:["$","p",null,{"children":["Login with PAT is very similar to the regular login with user credentials, and it returns the same ",["$","code",null,{"children":"IdentityInfo"}]," structure."]}]
+26:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"configuration","children":[["$","a",null,{"data-card":"","href":"#configuration","className":"peer","children":"Configuration"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd- [...]
+27:["$","p",null,{"children":"On the server side, you can enable the background task responsible for deleting the expired tokens."}]
+28:["$","$L1b",null,{"className":"shiki shiki-themes github-light github-dark","style":{"--shiki-light":"#24292e","--shiki-dark":"#e1e4e8","--shiki-light-bg":"#fff","--shiki-dark-bg":"#24292e"},"tabIndex":"0","icon":"<svg viewBox=\"0 0 24 24\"><path d=\"M 6,1 C 4.354992,1 3,2.354992 3,4 v 16 c 0,1.645008 1.354992,3 3,3 h 12 c 1.645008,0 3,-1.354992 3,-3 V 8 7 A 1.0001,1.0001 0 0 0 20.707031,6.2929687 l -5,-5 A 1.0001,1.0001 0 0 0 15,1 h -1 z m 0,2 h 7 v 3 c 0,1.645008 1.354992,3 3,3 h 3 [...]
+29:["$","footer",null,{"className":"mt-16 border-t border-fd-border pt-8","children":["$","$L9",null,{"href":"/blogs","className":"inline-flex items-center gap-2 text-sm font-medium text-fd-primary transition-colors hover:opacity-80","children":"← Back to all posts"}]}]
+2c:["$","$L2a",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"async"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" fn"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" get_personal_access_tokens"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki [...]
+2e:["$","$L2a",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" RawPersonalAccessToken"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-d [...]
+30:["$","$L2a",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" PersonalAccessTokenInfo"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki- [...]
+31:["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" fn"}]
+32:["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" delete_personal_access_token"}]
+33:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"("}]
+34:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" &"}],["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":"self"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+35:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" command"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" &"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"DeletePersonalAccessToken"}],["$","span",null,{"st [...]
+36:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":") "}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"->"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Result"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"<(), "}],["$","span",null,{"style":{"--shiki-light":" [...]
+37:["$","span",null,{"className":"line"}]
+38:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"async"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" fn"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" login_with_personal_access_token"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"("}]]}]
+39:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" &"}],["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":"self"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+3a:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" command"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" &"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"LoginWithPersonalAccessToken"}],["$","span",null,{ [...]
+3b:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":") "}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"->"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Result"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"<"}],["$","span",null,{"style":{"--shiki-light":"#6F4 [...]
+17:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
+3c:I[27201,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"IconMark"]
+15:null
+19:[["$","title","0",{"children":"Personal access tokens | Apache Iggy"}],["$","link","1",{"rel":"icon","href":"/img/favicon.png"}],["$","$L3c","2",{}]]
diff --git a/blogs/2023/11/26/release-0.1.0/__next.!KHNpdGUp.blogs.$c$slug.__PAGE__.txt b/blogs/2023/11/26/release-0.1.0/__next.!KHNpdGUp.blogs.$c$slug.__PAGE__.txt
new file mode 100644
index 00000000..80d0c0b9
--- /dev/null
+++ b/blogs/2023/11/26/release-0.1.0/__next.!KHNpdGUp.blogs.$c$slug.__PAGE__.txt
@@ -0,0 +1,24 @@
+1:"$Sreact.fragment"
+2:I[24110,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"Image"]
+13:I[47873,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"default"]
+14:I[22016,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],""]
+15:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"OutletBoundary"]
+16:"$Sreact.suspense"
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","c",{"children":[["$","main",null,{"className":"min-h-screen px-6 py-16 md:px-12","children":["$","article",null,{"className":"mx-auto max-w-5xl","children":[["$","header",null,{"className":"mb-10","children":[["$","time",null,{"className":"text-sm font-medium text-fd-muted-foreground","children":"November 26, 2023"}],["$","h1",null,{"className":"mt-3 text-3xl font-extrabold tracking-tight text-fd-foreground md:text-5xl","children":"Ig [...]
+3:["$","p",null,{"children":["$","$L2",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"CI","src":{"src":"/_next/static/media/iggy_server_0_1_0.40382e5f.jpeg","width":4092,"height":1664,"blurWidth":8,"blurHeight":3,"blurDataURL":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAADCAYAAACuyE5IAAAATUlEQVR42iXJSw4AERBAwY4EEUQsMBr3P+ab36JWJa03+qO1X62VUgopJWKMyFrKa++NqpJzJoSAcw5rLTJ1MvXinMMYA+/9F8YYRIQbgaUcjwzr6MwAAAAASUVORK5CYII="},"placeholder":"blur","cla [...]
+4:["$","p",null,{"children":"All the core components (server + SDK + CLI + bench) have to go through a lot of automated tests on the different OS, which are run on every commit, and the code coverage is constantly increasing. We've put a lot of offert into making our CI/CD pipeline as robust as possible, and we are happy with the results."}]
+5:["$","p",null,{"children":["$","$L2",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"CI","src":{"src":"/_next/static/media/iggy_ci_0_1_0.0d133771.jpeg","width":3598,"height":1248,"blurWidth":8,"blurHeight":3,"blurDataURL":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAADCAYAAACuyE5IAAAAU0lEQVR42iXLzRJAIBhG4RZkRoX+fJWK4f6v8VUszu48LJUHPlRQOuH2jM3EL7V4CGXBPFWsJiAcF2K+0YF2EbPU4JP8hy5s054KHGWMXLYEhtYLsyIdlkSurj0AAAAASUVORK5CYII="},"placeholder":"blur", [...]
+6:["$","p",null,{"children":"On top of it, the built-in benchmarking application has been significantly improved and now has its own CLI tool, which makes it easier to use."}]
+7:["$","p",null,{"children":["$","$L2",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"Bench","src":{"src":"/_next/static/media/iggy_bench_0_1_0.b7be7178.jpeg","width":4068,"height":2138,"blurWidth":8,"blurHeight":4,"blurDataURL":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAECAYAAACzzX7wAAAATUlEQVR42lXKQQrAIAwF0YCCiC6EkEKTkPvf8hcDtXTxVjMklyCJgJmx1sIYA733RO6GLSLSnBOttYPUFGr3GWqtIKLPju/g7iil/IYHwbAlzTFUBBIAAAAASUVORK5CYII="},"placeholder":"blur","c [...]
+8:["$","p",null,{"children":["Additionally, we've also a great ",["$","strong",null,{"children":"CLI"}]," being actively developed, which purpose is to allow the users to interact with the server using the command line."]}]
+9:["$","p",null,{"children":["$","$L2",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"CLI","src":{"src":"/_next/static/media/iggy_cli_0_1_0.9e3b3b20.jpeg","width":2942,"height":2164,"blurWidth":8,"blurHeight":6,"blurDataURL":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAGCAYAAAD+Bd/7AAAAVklEQVR42m2NOQ7AIAwEzSUhQAiw/f+nbuKkIqGYbnaWSinIOSOlBO/9DxIRjDEQYzwLay0wM2qtCCGAiHasMOd8BLtxzu2CqqL3/ua+a8PyrbVz/uYCiK8y2ofM4OsAAAAASUVORK5CYII="},"placeholder":" [...]
+a:["$","p",null,{"children":["And then there's a modern, responsive, and fast ",["$","strong",null,{"children":"Web UI"}],", which provides a way to interact with the server using the browser."]}]
+b:["$","p",null,{"children":["$","$L2",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"Web UI","src":{"src":"/_next/static/media/iggy_web_ui_0_1_0.0f6c99cb.jpeg","width":4060,"height":2408,"blurWidth":8,"blurHeight":5,"blurDataURL":"data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAAQABAAD/wAARCAAFAAgDAREAAhEBAxEB/9sAQwAKBwcIBwYKCAgICwoKCw4YEA4NDQ4dFRYRGCMfJSQiHyIhJis3LyYpNCkhIjBBMTQ5Oz4+PiUuRElDPEg3PT47/9sAQwEKCwsODQ4cEBAcOygiKDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs [...]
+c:["$","p",null,{"children":["While Rust ",["$","strong",null,{"children":"SDK"}]," is the most mature one, and the C# is a close second, the remaining ones for Java, Go, Python, and NodeJS are catching up. It's not an easy task to keep all of them in sync, but we are doing our best to make sure that the SDKs are up-to-date with the latest changes in the server."]}]
+d:["$","p",null,{"children":["Last but not least, we are ",["$","strong",null,{"children":"extremely grateful to the community"}],", which is growing every day. We are getting more and more feedback, and we are doing our best to address all the issues and feature requests. We are also getting more and more contributions, which is a great sign that the project is going in the right direction."]}]
+e:["$","p",null,{"children":["Come and join our ",["$","$L13",null,{"href":"https://discord.gg/apache-iggy","children":"Discord"}]," server, and let us know what you think about the project. We are looking forward to hearing from you!"]}]
+f:["$","footer",null,{"className":"mt-16 border-t border-fd-border pt-8","children":["$","$L14",null,{"href":"/blogs","className":"inline-flex items-center gap-2 text-sm font-medium text-fd-primary transition-colors hover:opacity-80","children":"← Back to all posts"}]}]
+10:["$","script","script-0",{"src":"/_next/static/chunks/00b00679782d0ffd.js","async":true}]
+11:["$","script","script-1",{"src":"/_next/static/chunks/3562882a488c4fbb.js","async":true}]
+12:["$","$L15",null,{"children":["$","$16",null,{"name":"Next.MetadataOutlet","children":"$@17"}]}]
+17:null
diff --git a/blogs/2023/11/26/release-0.1.0/__next.!KHNpdGUp.blogs.$c$slug.txt b/blogs/2023/11/26/release-0.1.0/__next.!KHNpdGUp.blogs.$c$slug.txt
new file mode 100644
index 00000000..11b31bb0
--- /dev/null
+++ b/blogs/2023/11/26/release-0.1.0/__next.!KHNpdGUp.blogs.$c$slug.txt
@@ -0,0 +1,4 @@
+1:"$Sreact.fragment"
+2:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+3:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","template":["$","$L3",null,{}]}]]}],"loading":null,"isPartial":false}
diff --git a/blogs/2023/11/26/release-0.1.0/__next.!KHNpdGUp.blogs.txt b/blogs/2023/11/26/release-0.1.0/__next.!KHNpdGUp.blogs.txt
new file mode 100644
index 00000000..11b31bb0
--- /dev/null
+++ b/blogs/2023/11/26/release-0.1.0/__next.!KHNpdGUp.blogs.txt
@@ -0,0 +1,4 @@
+1:"$Sreact.fragment"
+2:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+3:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","template":["$","$L3",null,{}]}]]}],"loading":null,"isPartial":false}
diff --git a/blogs/2023/11/26/release-0.1.0/__next.!KHNpdGUp.txt b/blogs/2023/11/26/release-0.1.0/__next.!KHNpdGUp.txt
new file mode 100644
index 00000000..ea3bfa55
--- /dev/null
+++ b/blogs/2023/11/26/release-0.1.0/__next.!KHNpdGUp.txt
@@ -0,0 +1,9 @@
+1:"$Sreact.fragment"
+2:I[83571,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Header"]
+3:I[29966,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFDropdown"]
+4:I[36330,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFMobileLinks"]
+5:I[22016,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],""]
+6:I[88760,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Logo"]
+7:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+8:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","c",{"children":[[["$","script","script-0",{"src":"/_next/static/chunks/8d86be78428a601a.js","async":true}],["$","script","script-1",{"src":"/_next/static/chunks/da34cc6305706ac6.js","async":true}],["$","script","script-2",{"src":"/_next/static/chunks/9baf65674e2de991.js","async":true}],["$","script","script-3",{"src":"/_next/static/chunks/26b70f9828dd1eb5.js","async":true}],["$","script","script-4",{"src":"/_next/static/chunks/adeed83 [...]
diff --git a/blogs/2023/11/26/release-0.1.0/__next._full.txt b/blogs/2023/11/26/release-0.1.0/__next._full.txt
new file mode 100644
index 00000000..db4386f3
--- /dev/null
+++ b/blogs/2023/11/26/release-0.1.0/__next._full.txt
@@ -0,0 +1,45 @@
+1:"$Sreact.fragment"
+2:I[17751,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js"],"RootProvider"]
+3:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+4:I[58298,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/5a37d4cb1abe17d7.js"],"default"]
+5:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+6:I[83571,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Header"]
+7:I[29966,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFDropdown"]
+8:I[36330,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFMobileLinks"]
+9:I[22016,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],""]
+a:I[88760,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Logo"]
+11:I[68027,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+:HL["/_next/static/chunks/32a0415c8ab1bd26.css","style"]
+:HL["/_next/static/media/GeistMono_Variable.p.2f937313.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+:HL["/_next/static/media/Geist_Variable-s.p.92592eb2.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+0:{"P":null,"b":"uBHgltRE2s5QA49x61S_u","c":["","blogs","2023","11","26","release-0.1.0",""],"q":"","i":false,"f":[[["",{"children":["(site)",{"children":["blogs",{"children":[["slug","2023/11/26/release-0.1.0","c"],{"children":["__PAGE__",{}]}]}]}]},"$undefined","$undefined",true],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/32a0415c8ab1bd26.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0 [...]
+13:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"OutletBoundary"]
+14:"$Sreact.suspense"
+16:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"ViewportBoundary"]
+18:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"MetadataBoundary"]
+b:["$","h1",null,{"className":"next-error-h1","style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:1:props:style","children":404}]
+c:["$","div",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:style","children":["$","h2",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style","children":"This page could not be found."}]}]
+d:["$","$1","c",{"children":[null,["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}]
+e:["$","$1","c",{"children":[null,["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}]
+f:["$","$1","c",{"children":["$L12",[["$","script","script-0",{"src":"/_next/static/chunks/00b00679782d0ffd.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/3562882a488c4fbb.js","async":true,"nonce":"$undefined"}]],["$","$L13",null,{"children":["$","$14",null,{"name":"Next.MetadataOutlet","children":"$@15"}]}]]}]
+10:["$","$1","h",{"children":[null,["$","$L16",null,{"children":"$L17"}],["$","div",null,{"hidden":true,"children":["$","$L18",null,{"children":["$","$14",null,{"name":"Next.Metadata","children":"$L19"}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}]
+1a:I[24110,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"Image"]
+12:["$","main",null,{"className":"min-h-screen px-6 py-16 md:px-12","children":["$","article",null,{"className":"mx-auto max-w-5xl","children":[["$","header",null,{"className":"mb-10","children":[["$","time",null,{"className":"text-sm font-medium text-fd-muted-foreground","children":"November 26, 2023"}],["$","h1",null,{"className":"mt-3 text-3xl font-extrabold tracking-tight text-fd-foreground md:text-5xl","children":"Iggy 0.1.0 release"}],["$","p",null,{"className":"mt-4 text-base text [...]
+28:I[47873,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"default"]
+1b:["$","$L1a",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"CI","src":{"src":"/_next/static/media/iggy_server_0_1_0.40382e5f.jpeg","width":4092,"height":1664,"blurWidth":8,"blurHeight":3,"blurDataURL":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAADCAYAAACuyE5IAAAATUlEQVR42iXJSw4AERBAwY4EEUQsMBr3P+ab36JWJa03+qO1X62VUgopJWKMyFrKa++NqpJzJoSAcw5rLTJ1MvXinMMYA+/9F8YYRIQbgaUcjwzr6MwAAAAASUVORK5CYII="},"placeholder":"blur","className":"rounded-lg"}]
+1c:["$","p",null,{"children":"All the core components (server + SDK + CLI + bench) have to go through a lot of automated tests on the different OS, which are run on every commit, and the code coverage is constantly increasing. We've put a lot of offert into making our CI/CD pipeline as robust as possible, and we are happy with the results."}]
+1d:["$","p",null,{"children":["$","$L1a",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"CI","src":{"src":"/_next/static/media/iggy_ci_0_1_0.0d133771.jpeg","width":3598,"height":1248,"blurWidth":8,"blurHeight":3,"blurDataURL":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAADCAYAAACuyE5IAAAAU0lEQVR42iXLzRJAIBhG4RZkRoX+fJWK4f6v8VUszu48LJUHPlRQOuH2jM3EL7V4CGXBPFWsJiAcF2K+0YF2EbPU4JP8hy5s054KHGWMXLYEhtYLsyIdlkSurj0AAAAASUVORK5CYII="},"placeholder":"blur [...]
+1e:["$","p",null,{"children":"On top of it, the built-in benchmarking application has been significantly improved and now has its own CLI tool, which makes it easier to use."}]
+1f:["$","p",null,{"children":["$","$L1a",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"Bench","src":{"src":"/_next/static/media/iggy_bench_0_1_0.b7be7178.jpeg","width":4068,"height":2138,"blurWidth":8,"blurHeight":4,"blurDataURL":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAECAYAAACzzX7wAAAATUlEQVR42lXKQQrAIAwF0YCCiC6EkEKTkPvf8hcDtXTxVjMklyCJgJmx1sIYA733RO6GLSLSnBOttYPUFGr3GWqtIKLPju/g7iil/IYHwbAlzTFUBBIAAAAASUVORK5CYII="},"placeholder":"blur", [...]
+20:["$","p",null,{"children":["Additionally, we've also a great ",["$","strong",null,{"children":"CLI"}]," being actively developed, which purpose is to allow the users to interact with the server using the command line."]}]
+21:["$","p",null,{"children":["$","$L1a",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"CLI","src":{"src":"/_next/static/media/iggy_cli_0_1_0.9e3b3b20.jpeg","width":2942,"height":2164,"blurWidth":8,"blurHeight":6,"blurDataURL":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAGCAYAAAD+Bd/7AAAAVklEQVR42m2NOQ7AIAwEzSUhQAiw/f+nbuKkIqGYbnaWSinIOSOlBO/9DxIRjDEQYzwLay0wM2qtCCGAiHasMOd8BLtxzu2CqqL3/ua+a8PyrbVz/uYCiK8y2ofM4OsAAAAASUVORK5CYII="},"placeholder" [...]
+22:["$","p",null,{"children":["And then there's a modern, responsive, and fast ",["$","strong",null,{"children":"Web UI"}],", which provides a way to interact with the server using the browser."]}]
+23:["$","p",null,{"children":["$","$L1a",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"Web UI","src":{"src":"/_next/static/media/iggy_web_ui_0_1_0.0f6c99cb.jpeg","width":4060,"height":2408,"blurWidth":8,"blurHeight":5,"blurDataURL":"data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAAQABAAD/wAARCAAFAAgDAREAAhEBAxEB/9sAQwAKBwcIBwYKCAgICwoKCw4YEA4NDQ4dFRYRGCMfJSQiHyIhJis3LyYpNCkhIjBBMTQ5Oz4+PiUuRElDPEg3PT47/9sAQwEKCwsODQ4cEBAcOygiKDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O [...]
+24:["$","p",null,{"children":["While Rust ",["$","strong",null,{"children":"SDK"}]," is the most mature one, and the C# is a close second, the remaining ones for Java, Go, Python, and NodeJS are catching up. It's not an easy task to keep all of them in sync, but we are doing our best to make sure that the SDKs are up-to-date with the latest changes in the server."]}]
+25:["$","p",null,{"children":["Last but not least, we are ",["$","strong",null,{"children":"extremely grateful to the community"}],", which is growing every day. We are getting more and more feedback, and we are doing our best to address all the issues and feature requests. We are also getting more and more contributions, which is a great sign that the project is going in the right direction."]}]
+26:["$","p",null,{"children":["Come and join our ",["$","$L28",null,{"href":"https://discord.gg/apache-iggy","children":"Discord"}]," server, and let us know what you think about the project. We are looking forward to hearing from you!"]}]
+27:["$","footer",null,{"className":"mt-16 border-t border-fd-border pt-8","children":["$","$L9",null,{"href":"/blogs","className":"inline-flex items-center gap-2 text-sm font-medium text-fd-primary transition-colors hover:opacity-80","children":"← Back to all posts"}]}]
+17:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
+29:I[27201,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"IconMark"]
+15:null
+19:[["$","title","0",{"children":"Iggy 0.1.0 release | Apache Iggy"}],["$","link","1",{"rel":"icon","href":"/img/favicon.png"}],["$","$L29","2",{}]]
diff --git a/blogs/2023/11/26/release-0.1.0/__next._head.txt b/blogs/2023/11/26/release-0.1.0/__next._head.txt
new file mode 100644
index 00000000..d58f9876
--- /dev/null
+++ b/blogs/2023/11/26/release-0.1.0/__next._head.txt
@@ -0,0 +1,6 @@
+1:"$Sreact.fragment"
+2:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"ViewportBoundary"]
+3:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"MetadataBoundary"]
+4:"$Sreact.suspense"
+5:I[27201,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"IconMark"]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","h",{"children":[null,["$","$L2",null,{"children":[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]}],["$","div",null,{"hidden":true,"children":["$","$L3",null,{"children":["$","$4",null,{"name":"Next.Metadata","children":[["$","title","0",{"children":"Iggy 0.1.0 release | Apache Iggy"}],["$","link","1",{"rel":"icon","href":"/img/favicon.png"}],["$","$L5","2",{}] [...]
diff --git a/blogs/2023/11/26/release-0.1.0/__next._index.txt b/blogs/2023/11/26/release-0.1.0/__next._index.txt
new file mode 100644
index 00000000..fd02bd95
--- /dev/null
+++ b/blogs/2023/11/26/release-0.1.0/__next._index.txt
@@ -0,0 +1,7 @@
+1:"$Sreact.fragment"
+2:I[17751,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js"],"RootProvider"]
+3:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+4:I[58298,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/5a37d4cb1abe17d7.js"],"default"]
+5:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+:HL["/_next/static/chunks/32a0415c8ab1bd26.css","style"]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/32a0415c8ab1bd26.css","precedence":"next"}],["$","script","script-0",{"src":"/_next/static/chunks/9ebd3a84bf60af84.js","async":true}],["$","script","script-1",{"src":"/_next/static/chunks/78b5f2e7b839e72f.js","async":true}]],["$","html",null,{"lang":"en","className":"geistsans_d5a4f12f-module__Ur3q_a__variable geistmono_157ca88a-module__iaM1Ya__variable" [...]
diff --git a/blogs/2023/11/26/release-0.1.0/__next._tree.txt b/blogs/2023/11/26/release-0.1.0/__next._tree.txt
new file mode 100644
index 00000000..1616ed12
--- /dev/null
+++ b/blogs/2023/11/26/release-0.1.0/__next._tree.txt
@@ -0,0 +1,4 @@
+:HL["/_next/static/chunks/32a0415c8ab1bd26.css","style"]
+:HL["/_next/static/media/GeistMono_Variable.p.2f937313.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+:HL["/_next/static/media/Geist_Variable-s.p.92592eb2.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","tree":{"name":"","paramType":null,"paramKey":"","hasRuntimePrefetch":false,"slots":{"children":{"name":"(site)","paramType":null,"paramKey":"(site)","hasRuntimePrefetch":false,"slots":{"children":{"name":"blogs","paramType":null,"paramKey":"blogs","hasRuntimePrefetch":false,"slots":{"children":{"name":"slug","paramType":"c","paramKey":"2023/11/26/release-0.1.0","hasRuntimePrefetch":false,"slots":{"children":{"name":"__PAGE__","paramType":null,"paramK [...]
diff --git a/blogs/2023/11/26/release-0.1.0/index.html b/blogs/2023/11/26/release-0.1.0/index.html
new file mode 100644
index 00000000..86ee87d1
--- /dev/null
+++ b/blogs/2023/11/26/release-0.1.0/index.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html><!--uBHgltRE2s5QA49x61S_u--><html lang="en" class="geistsans_d5a4f12f-module__Ur3q_a__variable geistmono_157ca88a-module__iaM1Ya__variable"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" href="/_next/static/media/GeistMono_Variable.p.2f937313.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="preload" href="/_next/static/media/Geist_Variable-s.p.92592eb2.woff2" as="font" crossorigin="" type=" [...]
+<p><img alt="0.1.0" loading="lazy" width="1000" height="500" decoding="async" data-nimg="1" class="rounded-lg" style="color:transparent;background-size:cover;background-position:50% 50%;background-repeat:no-repeat;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 320 160'%3E%3Cfilter id='b' color-interpolation-filters='sRGB'%3E%3CfeGaussianBlur stdDeviation='20'/%3E%3CfeColo [...]
+<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="release-notes"><a data-card="" href="#release-notes" class="peer">Release notes</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 0 [...]
+<p>The <strong>streaming server</strong>, being the core of the project, has been improved in many ways. Some of the most important features and bug fixes have to do with the area of memory management, such as keeping the configurable size of the cache under control, extended security including the authentication and authorization, added personal access tokens, and the overall stability of the server.</p>
+<p><img alt="CI" loading="lazy" width="4092" height="1664" decoding="async" data-nimg="1" class="rounded-lg" style="color:transparent;background-size:cover;background-position:50% 50%;background-repeat:no-repeat;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 320 120'%3E%3Cfilter id='b' color-interpolation-filters='sRGB'%3E%3CfeGaussianBlur stdDeviation='20'/%3E%3CfeColorM [...]
+<p>All the core components (server + SDK + CLI + bench) have to go through a lot of automated tests on the different OS, which are run on every commit, and the code coverage is constantly increasing. We've put a lot of offert into making our CI/CD pipeline as robust as possible, and we are happy with the results.</p>
+<p><img alt="CI" loading="lazy" width="3598" height="1248" decoding="async" data-nimg="1" class="rounded-lg" style="color:transparent;background-size:cover;background-position:50% 50%;background-repeat:no-repeat;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 320 120'%3E%3Cfilter id='b' color-interpolation-filters='sRGB'%3E%3CfeGaussianBlur stdDeviation='20'/%3E%3CfeColorM [...]
+<p>On top of it, the built-in benchmarking application has been significantly improved and now has its own CLI tool, which makes it easier to use.</p>
+<p><img alt="Bench" loading="lazy" width="4068" height="2138" decoding="async" data-nimg="1" class="rounded-lg" style="color:transparent;background-size:cover;background-position:50% 50%;background-repeat:no-repeat;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 320 160'%3E%3Cfilter id='b' color-interpolation-filters='sRGB'%3E%3CfeGaussianBlur stdDeviation='20'/%3E%3CfeCol [...]
+<p>Additionally, we've also a great <strong>CLI</strong> being actively developed, which purpose is to allow the users to interact with the server using the command line.</p>
+<p><img alt="CLI" loading="lazy" width="2942" height="2164" decoding="async" data-nimg="1" class="rounded-lg" style="color:transparent;background-size:cover;background-position:50% 50%;background-repeat:no-repeat;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 320 240'%3E%3Cfilter id='b' color-interpolation-filters='sRGB'%3E%3CfeGaussianBlur stdDeviation='20'/%3E%3CfeColor [...]
+<p>And then there's a modern, responsive, and fast <strong>Web UI</strong>, which provides a way to interact with the server using the browser.</p>
+<p><img alt="Web UI" loading="lazy" width="4060" height="2408" decoding="async" data-nimg="1" class="rounded-lg" style="color:transparent;background-size:cover;background-position:50% 50%;background-repeat:no-repeat;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 320 200'%3E%3Cfilter id='b' color-interpolation-filters='sRGB'%3E%3CfeGaussianBlur stdDeviation='20'/%3E%3CfeCo [...]
+<p>While Rust <strong>SDK</strong> is the most mature one, and the C# is a close second, the remaining ones for Java, Go, Python, and NodeJS are catching up. It's not an easy task to keep all of them in sync, but we are doing our best to make sure that the SDKs are up-to-date with the latest changes in the server.</p>
+<p>Last but not least, we are <strong>extremely grateful to the community</strong>, which is growing every day. We are getting more and more feedback, and we are doing our best to address all the issues and feature requests. We are also getting more and more contributions, which is a great sign that the project is going in the right direction.</p>
+<p>Come and join our <a href="https://discord.gg/apache-iggy" rel="noreferrer noopener" target="_blank">Discord</a> server, and let us know what you think about the project. We are looking forward to hearing from you!</p></div><footer class="mt-16 border-t border-fd-border pt-8"><a class="inline-flex items-center gap-2 text-sm font-medium text-fd-primary transition-colors hover:opacity-80" href="/blogs/">← Back to all posts</a></footer></article></main><!--$--><!--/$--></main><script src [...]
\ No newline at end of file
diff --git a/blogs/2023/11/26/release-0.1.0/index.txt b/blogs/2023/11/26/release-0.1.0/index.txt
new file mode 100644
index 00000000..db4386f3
--- /dev/null
+++ b/blogs/2023/11/26/release-0.1.0/index.txt
@@ -0,0 +1,45 @@
+1:"$Sreact.fragment"
+2:I[17751,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js"],"RootProvider"]
+3:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+4:I[58298,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/5a37d4cb1abe17d7.js"],"default"]
+5:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+6:I[83571,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Header"]
+7:I[29966,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFDropdown"]
+8:I[36330,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFMobileLinks"]
+9:I[22016,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],""]
+a:I[88760,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Logo"]
+11:I[68027,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+:HL["/_next/static/chunks/32a0415c8ab1bd26.css","style"]
+:HL["/_next/static/media/GeistMono_Variable.p.2f937313.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+:HL["/_next/static/media/Geist_Variable-s.p.92592eb2.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+0:{"P":null,"b":"uBHgltRE2s5QA49x61S_u","c":["","blogs","2023","11","26","release-0.1.0",""],"q":"","i":false,"f":[[["",{"children":["(site)",{"children":["blogs",{"children":[["slug","2023/11/26/release-0.1.0","c"],{"children":["__PAGE__",{}]}]}]}]},"$undefined","$undefined",true],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/32a0415c8ab1bd26.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0 [...]
+13:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"OutletBoundary"]
+14:"$Sreact.suspense"
+16:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"ViewportBoundary"]
+18:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"MetadataBoundary"]
+b:["$","h1",null,{"className":"next-error-h1","style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:1:props:style","children":404}]
+c:["$","div",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:style","children":["$","h2",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style","children":"This page could not be found."}]}]
+d:["$","$1","c",{"children":[null,["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}]
+e:["$","$1","c",{"children":[null,["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}]
+f:["$","$1","c",{"children":["$L12",[["$","script","script-0",{"src":"/_next/static/chunks/00b00679782d0ffd.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/3562882a488c4fbb.js","async":true,"nonce":"$undefined"}]],["$","$L13",null,{"children":["$","$14",null,{"name":"Next.MetadataOutlet","children":"$@15"}]}]]}]
+10:["$","$1","h",{"children":[null,["$","$L16",null,{"children":"$L17"}],["$","div",null,{"hidden":true,"children":["$","$L18",null,{"children":["$","$14",null,{"name":"Next.Metadata","children":"$L19"}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}]
+1a:I[24110,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"Image"]
+12:["$","main",null,{"className":"min-h-screen px-6 py-16 md:px-12","children":["$","article",null,{"className":"mx-auto max-w-5xl","children":[["$","header",null,{"className":"mb-10","children":[["$","time",null,{"className":"text-sm font-medium text-fd-muted-foreground","children":"November 26, 2023"}],["$","h1",null,{"className":"mt-3 text-3xl font-extrabold tracking-tight text-fd-foreground md:text-5xl","children":"Iggy 0.1.0 release"}],["$","p",null,{"className":"mt-4 text-base text [...]
+28:I[47873,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"default"]
+1b:["$","$L1a",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"CI","src":{"src":"/_next/static/media/iggy_server_0_1_0.40382e5f.jpeg","width":4092,"height":1664,"blurWidth":8,"blurHeight":3,"blurDataURL":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAADCAYAAACuyE5IAAAATUlEQVR42iXJSw4AERBAwY4EEUQsMBr3P+ab36JWJa03+qO1X62VUgopJWKMyFrKa++NqpJzJoSAcw5rLTJ1MvXinMMYA+/9F8YYRIQbgaUcjwzr6MwAAAAASUVORK5CYII="},"placeholder":"blur","className":"rounded-lg"}]
+1c:["$","p",null,{"children":"All the core components (server + SDK + CLI + bench) have to go through a lot of automated tests on the different OS, which are run on every commit, and the code coverage is constantly increasing. We've put a lot of offert into making our CI/CD pipeline as robust as possible, and we are happy with the results."}]
+1d:["$","p",null,{"children":["$","$L1a",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"CI","src":{"src":"/_next/static/media/iggy_ci_0_1_0.0d133771.jpeg","width":3598,"height":1248,"blurWidth":8,"blurHeight":3,"blurDataURL":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAADCAYAAACuyE5IAAAAU0lEQVR42iXLzRJAIBhG4RZkRoX+fJWK4f6v8VUszu48LJUHPlRQOuH2jM3EL7V4CGXBPFWsJiAcF2K+0YF2EbPU4JP8hy5s054KHGWMXLYEhtYLsyIdlkSurj0AAAAASUVORK5CYII="},"placeholder":"blur [...]
+1e:["$","p",null,{"children":"On top of it, the built-in benchmarking application has been significantly improved and now has its own CLI tool, which makes it easier to use."}]
+1f:["$","p",null,{"children":["$","$L1a",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"Bench","src":{"src":"/_next/static/media/iggy_bench_0_1_0.b7be7178.jpeg","width":4068,"height":2138,"blurWidth":8,"blurHeight":4,"blurDataURL":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAECAYAAACzzX7wAAAATUlEQVR42lXKQQrAIAwF0YCCiC6EkEKTkPvf8hcDtXTxVjMklyCJgJmx1sIYA733RO6GLSLSnBOttYPUFGr3GWqtIKLPju/g7iil/IYHwbAlzTFUBBIAAAAASUVORK5CYII="},"placeholder":"blur", [...]
+20:["$","p",null,{"children":["Additionally, we've also a great ",["$","strong",null,{"children":"CLI"}]," being actively developed, which purpose is to allow the users to interact with the server using the command line."]}]
+21:["$","p",null,{"children":["$","$L1a",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"CLI","src":{"src":"/_next/static/media/iggy_cli_0_1_0.9e3b3b20.jpeg","width":2942,"height":2164,"blurWidth":8,"blurHeight":6,"blurDataURL":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAGCAYAAAD+Bd/7AAAAVklEQVR42m2NOQ7AIAwEzSUhQAiw/f+nbuKkIqGYbnaWSinIOSOlBO/9DxIRjDEQYzwLay0wM2qtCCGAiHasMOd8BLtxzu2CqqL3/ua+a8PyrbVz/uYCiK8y2ofM4OsAAAAASUVORK5CYII="},"placeholder" [...]
+22:["$","p",null,{"children":["And then there's a modern, responsive, and fast ",["$","strong",null,{"children":"Web UI"}],", which provides a way to interact with the server using the browser."]}]
+23:["$","p",null,{"children":["$","$L1a",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"Web UI","src":{"src":"/_next/static/media/iggy_web_ui_0_1_0.0f6c99cb.jpeg","width":4060,"height":2408,"blurWidth":8,"blurHeight":5,"blurDataURL":"data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAAQABAAD/wAARCAAFAAgDAREAAhEBAxEB/9sAQwAKBwcIBwYKCAgICwoKCw4YEA4NDQ4dFRYRGCMfJSQiHyIhJis3LyYpNCkhIjBBMTQ5Oz4+PiUuRElDPEg3PT47/9sAQwEKCwsODQ4cEBAcOygiKDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O [...]
+24:["$","p",null,{"children":["While Rust ",["$","strong",null,{"children":"SDK"}]," is the most mature one, and the C# is a close second, the remaining ones for Java, Go, Python, and NodeJS are catching up. It's not an easy task to keep all of them in sync, but we are doing our best to make sure that the SDKs are up-to-date with the latest changes in the server."]}]
+25:["$","p",null,{"children":["Last but not least, we are ",["$","strong",null,{"children":"extremely grateful to the community"}],", which is growing every day. We are getting more and more feedback, and we are doing our best to address all the issues and feature requests. We are also getting more and more contributions, which is a great sign that the project is going in the right direction."]}]
+26:["$","p",null,{"children":["Come and join our ",["$","$L28",null,{"href":"https://discord.gg/apache-iggy","children":"Discord"}]," server, and let us know what you think about the project. We are looking forward to hearing from you!"]}]
+27:["$","footer",null,{"className":"mt-16 border-t border-fd-border pt-8","children":["$","$L9",null,{"href":"/blogs","className":"inline-flex items-center gap-2 text-sm font-medium text-fd-primary transition-colors hover:opacity-80","children":"← Back to all posts"}]}]
+17:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
+29:I[27201,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"IconMark"]
+15:null
+19:[["$","title","0",{"children":"Iggy 0.1.0 release | Apache Iggy"}],["$","link","1",{"rel":"icon","href":"/img/favicon.png"}],["$","$L29","2",{}]]
diff --git a/blogs/2023/12/29/building-message-streaming-in-rust/__next.!KHNpdGUp.blogs.$c$slug.__PAGE__.txt b/blogs/2023/12/29/building-message-streaming-in-rust/__next.!KHNpdGUp.blogs.$c$slug.__PAGE__.txt
new file mode 100644
index 00000000..891da6fd
--- /dev/null
+++ b/blogs/2023/12/29/building-message-streaming-in-rust/__next.!KHNpdGUp.blogs.$c$slug.__PAGE__.txt
@@ -0,0 +1,68 @@
+1:"$Sreact.fragment"
+2:I[47873,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"default"]
+36:I[24110,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"Image"]
+37:I[44324,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"CodeBlock"]
+3a:I[22016,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],""]
+3b:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"OutletBoundary"]
+3c:"$Sreact.suspense"
+3e:I[44324,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"Pre"]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","c",{"children":[["$","main",null,{"className":"min-h-screen px-6 py-16 md:px-12","children":["$","article",null,{"className":"mx-auto max-w-5xl","children":[["$","header",null,{"className":"mb-10","children":[["$","time",null,{"className":"text-sm font-medium text-fd-muted-foreground","children":"December 29, 2023"}],["$","h1",null,{"className":"mt-3 text-3xl font-extrabold tracking-tight text-fd-foreground md:text-5xl","children":"Ig [...]
+3:["$","p",null,{"children":["And this is how the ",["$","$L2",null,{"href":"https://iggy.rs","children":"Iggy.rs"}]," was born. The name is an abbreviation of the Italian Greyhound (yes, I own ",["$","$L2",null,{"href":"https://www.instagram.com/fabio.and.cookie/","children":"two of them"}],"), small yet extremely fast dogs, the best in their class."]}]
+4:["$","p",null,{"children":["$","$L36",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"image","src":{"src":"/_next/static/media/iggys.d5bf7cfc.jpeg","width":1506,"height":1282,"blurWidth":8,"blurHeight":7,"blurDataURL":"data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAAQABAAD/wAARCAAHAAgDAREAAhEBAxEB/9sAQwAKBwcIBwYKCAgICwoKCw4YEA4NDQ4dFRYRGCMfJSQiHyIhJis3LyYpNCkhIjBBMTQ5Oz4+PiUuRElDPEg3PT47/9sAQwEKCwsODQ4cEBAcOygiKDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs [...]
+5:["$","p",null,{"children":["Therefore, what I want, or actually ",["$","strong",null,{"children":"what we want"}]," (since there's a few of us working on it already) for Iggy.rs to be - the best message streaming platform in its class. ",["$","strong",null,{"children":"Lightweight"}]," in terms of the resource consumption, ",["$","strong",null,{"children":"fast"}]," (and predictable) when it comes to the throughput and latency, and ",["$","strong",null,{"children":"easy to use"}]," whe [...]
+6:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"project","children":[["$","a",null,{"data-card":"","href":"#project","className":"peer","children":"Project"}],["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition- [...]
+7:["$","p",null,{"children":["At the very beginning, Iggy had rather limited functionality, and everything was handled using the ",["$","$L2",null,{"href":"https://www.chromium.org/quic/","children":"QUIC"}]," protocol based on ",["$","$L2",null,{"href":"https://github.com/quinn-rs/quinn","children":"Quinn"}]," library. You could connect multiple applications into the server, and start exchanging the messages between them, simply by appending the data to the stream (from the producer per [...]
+8:["$","p",null,{"children":["After spending a few weeks on building the initial version, and then another few weeks on rewriting its core part (yes, prototyping + validation repeated in a continuous loop worked quite well), I managed to implement the persistent streaming server being capable of parallel writes/reads to/from independent streams supporting many distinct apps connected into it. Simply put, one could easily have many applications, and even ",["$","strong",null,{"children":" [...]
+9:["$","p",null,{"children":["On top of this, the support for ",["$","strong",null,{"children":"TCP"}]," and ",["$","strong",null,{"children":"HTTP"}]," protocols have been added. Under the hood, the typical architecture of streams, consisting of the topics being split into the partitions, which eventually operate on a raw file data using so-called segments has been implemented as well."]}]
+a:["$","p",null,{"children":["$","$L36",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"image","src":{"src":"/_next/static/media/iggy_sample.4c2d3682.jpeg","width":4064,"height":2408,"blurWidth":8,"blurHeight":5,"blurDataURL":"data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAAQABAAD/wAARCAAFAAgDAREAAhEBAxEB/9sAQwAKBwcIBwYKCAgICwoKCw4YEA4NDQ4dFRYRGCMfJSQiHyIhJis3LyYpNCkhIjBBMTQ5Oz4+PiUuRElDPEg3PT47/9sAQwEKCwsODQ4cEBAcOygiKDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O [...]
+b:["$","p",null,{"children":[["$","strong",null,{"children":"It was one of the \"aha\" moments"}],", when reimplementing the parallel access to the data with the usage of underlying synchronization mechanism (",["$","em",null,{"children":"RwLock"}]," etc.), optimized data structures e.g. for dealing with ",["$","$L2",null,{"href":"https://crates.io/crates/bytes","children":"bytes"}],", along with the ",["$","$L2",null,{"href":"https://tokio.rs","children":"Tokio"}]," ",["$","strong",null [...]
+c:["$","p",null,{"children":["I do believe, that somewhere at this point I had realized, that ",["$","strong",null,{"children":"Iggy might actually become something useful"}]," - not just a toy project, to be abandoned after reaching its initial goal (which was sort of already achieved)."]}]
+38:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+e:["$","p",null,{"children":["After running some benchmarks (yes, we have a dedicated app for the ",["$","strong",null,{"children":["$","$L2",null,{"href":"https://github.com/apache/iggy/tree/master/core/bench","children":"benchmarking purposes"}]}],") and seeing the promising numbers (",["$","strong",null,{"children":"range of 2-6 GB/s for both, writes & reads when processing millions of messages"}],"), I eventually decided to give it a long-term shot. Being fully aware that there's sti [...]
+f:["$","p",null,{"children":["$","$L36",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"image","src":{"src":"/_next/static/media/iggy_bench.d3c96948.jpeg","width":3494,"height":1750,"blurWidth":8,"blurHeight":4,"blurDataURL":"data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAAQABAAD/wAARCAAEAAgDAREAAhEBAxEB/9sAQwAKBwcIBwYKCAgICwoKCw4YEA4NDQ4dFRYRGCMfJSQiHyIhJis3LyYpNCkhIjBBMTQ5Oz4+PiUuRElDPEg3PT47/9sAQwEKCwsODQ4cEBAcOygiKDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Oz [...]
+10:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"team","children":[["$","a",null,{"data-card":"","href":"#team","className":"peer","children":"Team"}],["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity [...]
+11:["$","p",null,{"children":["At the time of writing this post, ",["$","strong",null,{"children":"Iggy consists of around 10 members"}]," contributing to its different parts. Some of us do work on the core streaming server, while the other ones are focused on SDKs for the different programming languages or tooling such as Web UI or CLI - all these projects are equally important, as they add up to the overall ecosystem. But how do you actually gather a team of open source contributors, w [...]
+12:["$","p",null,{"children":["Well, I wish I had an answer to that question - honestly, in case of Iggy I wasn't actually looking for anyone, as I didn't think this could be an interesting project to work on (except for myself). Then how did that happen anyway? There were only 2 things in common - all the people that joined the project were part of the same Discord communities, yet more importantly ",["$","strong",null,{"children":"they all shared the passion for programming"}],", and I [...]
+13:["$","p",null,{"children":["$","$L36",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"image","src":{"src":"/_next/static/media/iggy_server.4f75ea73.jpeg","width":4088,"height":1610,"blurWidth":8,"blurHeight":3,"blurDataURL":"data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAAQABAAD/wAARCAADAAgDAREAAhEBAxEB/9sAQwAKBwcIBwYKCAgICwoKCw4YEA4NDQ4dFRYRGCMfJSQiHyIhJis3LyYpNCkhIjBBMTQ5Oz4+PiUuRElDPEg3PT47/9sAQwEKCwsODQ4cEBAcOygiKDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7 [...]
+14:["$","p",null,{"children":"For example, when I asked one guy what was the reason behind building an SDK in Go, the reply was the need of playing with and learning a new language. Why C# SDK? Well, the other guy wanted to dive more into the low-level concepts and decided to squeeze out great performance from the managed runtime. Why build Web UI in Svelte? At work, I mostly use React, and I wanted to learn a new framework - another member said."}]
+15:["$","p",null,{"children":["My point is - as long as you believe in what you're building, and you're consistent about it (it was one of the main reasons why I've been contributing to Iggy every day since its inception, and still doing so), there's a chance that someone out there will notice it and happily join you in your efforts. ",["$","strong",null,{"children":"Lead by example, or whatever you call it."}]]}]
+16:["$","p",null,{"children":["At the same time, we've started receiving the first, ",["$","strong",null,{"children":"external contributions from all around the world"}]," - whether talking about simpler tasks, or the more sophisticated ones, requiring significant amount of time being spent on both, the implementation and the discussions to eventually deliver the code."]}]
+17:["$","p",null,{"children":"It gave us even more confidence, that there are other people (outside our internal bubble), who find this project to be interesting and worth spending their time. And without all these amazing contributors, it'd be much harder (or even impossible) to deliver so many features."}]
+18:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"features","children":[["$","a",null,{"data-card":"","href":"#features","className":"peer","children":"Features"}],["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transit [...]
+19:["$","p",null,{"children":"At first, let me just point out some of the properties and features that are part of the core streaming server:"}]
+1a:["$","ul",null,{"children":["\n",["$","li",null,{"children":[["$","strong",null,{"children":"Highly performant"}],", persistent append-only log for the message streaming"]}],"\n",["$","li",null,{"children":[["$","strong",null,{"children":"Very high throughput"}]," for both writes and reads"]}],"\n",["$","li",null,{"children":[["$","strong",null,{"children":"Low latency and predictable resource usage"}]," thanks to the Rust compiled language (no GC)"]}],"\n",["$","li",null,{"children": [...]
+1b:["$","p",null,{"children":"And as already mentioned, we've been working on SDKs for the multiple programming languages:"}]
+1c:["$","ul",null,{"children":["\n",["$","li",null,{"children":["$","$L2",null,{"href":"https://crates.io/crates/iggy","children":"Rust"}]}],"\n",["$","li",null,{"children":["$","$L2",null,{"href":"https://github.com/iggy-rs/iggy-dotnet-client","children":"C#"}]}],"\n",["$","li",null,{"children":["$","$L2",null,{"href":"https://github.com/iggy-rs/iggy-go-client","children":"Go"}]}],"\n",["$","li",null,{"children":["$","$L2",null,{"href":"https://github.com/iggy-rs/iggy-node-client","chil [...]
+1d:["$","p",null,{"children":["Please keep in mind, though, that some of them e.g. for Rust or C# are more up to date with the recent server changes, while the other ones might still need to do some catching up with the latest features. However, given the amount of available methods on the server's API and the underlying TCP/UDP stack with custom serialization to be implemented from the scratch (except for HTTP transport, that's the easier one), I'd say we're doing quite ok, and I can't [...]
+1e:["$","p",null,{"children":["But wait, there's even more - what would be a message streaming platform without some additional tooling for managing it? We've also been developing the ",["$","strong",null,{"children":["$","$L2",null,{"href":"https://github.com/apache/iggy/tree/master/cmd","children":"CLI"}]}],"."]}]
+1f:["$","p",null,{"children":["$","$L36",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"image","src":{"src":"/_next/static/media/iggy_cli.ffd1cc01.jpeg","width":2942,"height":2162,"blurWidth":8,"blurHeight":6,"blurDataURL":"data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAAQABAAD/wAARCAAGAAgDAREAAhEBAxEB/9sAQwAKBwcIBwYKCAgICwoKCw4YEA4NDQ4dFRYRGCMfJSQiHyIhJis3LyYpNCkhIjBBMTQ5Oz4+PiUuRElDPEg3PT47/9sAQwEKCwsODQ4cEBAcOygiKDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs [...]
+20:["$","p",null,{"children":["As well as modern ",["$","strong",null,{"children":["$","$L2",null,{"href":"https://github.com/iggy-rs/iggy-web-ui","children":"Web UI"}]}]," to make it happen :)"]}]
+21:["$","p",null,{"children":["$","$L36",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"image","src":{"src":"/_next/static/media/iggy_web_ui.0f6c99cb.jpeg","width":4060,"height":2408,"blurWidth":8,"blurHeight":5,"blurDataURL":"data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAAQABAAD/wAARCAAFAAgDAREAAhEBAxEB/9sAQwAKBwcIBwYKCAgICwoKCw4YEA4NDQ4dFRYRGCMfJSQiHyIhJis3LyYpNCkhIjBBMTQ5Oz4+PiUuRElDPEg3PT47/9sAQwEKCwsODQ4cEBAcOygiKDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7 [...]
+22:["$","p",null,{"children":["Last but not least, we've got a fully-featured ",["$","$L2",null,{"href":"https://github.com/apache/iggy/actions","children":"CI/CD pipeline"}]," responsible for running all the checks and tests on multiple platforms, and finally producing the release artifacts and ",["$","$L2",null,{"href":"https://hub.docker.com/u/iggyrs","children":"Docker images"}],"."]}]
+23:["$","p",null,{"children":["$","$L36",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"image","src":{"src":"/_next/static/media/iggy_ci_cd.51a98142.jpeg","width":2000,"height":1000,"blurWidth":8,"blurHeight":4,"blurDataURL":"data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAAQABAAD/wAARCAAEAAgDAREAAhEBAxEB/9sAQwAKBwcIBwYKCAgICwoKCw4YEA4NDQ4dFRYRGCMfJSQiHyIhJis3LyYpNCkhIjBBMTQ5Oz4+PiUuRElDPEg3PT47/9sAQwEKCwsODQ4cEBAcOygiKDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O [...]
+24:["$","p",null,{"children":"At first glance, it might look like there's plenty of features already in place, but for anyone who has ever worked with the message streaming infrastructure before, that might be just a tip of an iceberg, thus let's discuss the roadmap."}]
+25:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"roadmap","children":[["$","a",null,{"data-card":"","href":"#roadmap","className":"peer","children":"Roadmap"}],["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition [...]
+26:["$","p",null,{"children":["After gaining some traction a few months ago (mostly due to landing on the GitHub trending page in July), we've talked to some users potentially interested in making Iggy part of their infrastructure (there's even one ",["$","$L2",null,{"href":"https://neferdata.com","children":"company"}]," using it already), and discussed what features would be a good addition to the current stack."]}]
+27:["$","p",null,{"children":["$","$L36",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"image","src":{"src":"/_next/static/media/gh_trending.c393fc00.jpeg","width":2234,"height":1830,"blurWidth":8,"blurHeight":7,"blurDataURL":"data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAAQABAAD/wAARCAAHAAgDAREAAhEBAxEB/9sAQwAKBwcIBwYKCAgICwoKCw4YEA4NDQ4dFRYRGCMfJSQiHyIhJis3LyYpNCkhIjBBMTQ5Oz4+PiUuRElDPEg3PT47/9sAQwEKCwsODQ4cEBAcOygiKDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7 [...]
+28:["$","p",null,{"children":"Considering what's already there, being worked on or planned for the future releases, such as interactive CLI, modern Web UI, optional data compression and archivization, plugin support or multiple SDKs, there are at least three additional challenges to overcome:"}]
+29:["$","p",null,{"children":[["$","strong",null,{"children":"Clustering"}]," - the possibility of having a ",["$","strong",null,{"children":"highly available and fault tolerant"}]," distributed message streaming platform in a production environment, is typically one of the most important aspects when considering the particular tool. While it wouldn't be too difficult to implement the extension (think of a simple proxy/load balancer), allowing to monitor and deliver the data either to th [...]
+2a:["$","p",null,{"children":["$","$L36",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"image","src":{"src":"/_next/static/media/leader_elections.a60bb3b7.jpeg","width":4058,"height":2316,"blurWidth":8,"blurHeight":5,"blurDataURL":"data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAAQABAAD/wAARCAAFAAgDAREAAhEBAxEB/9sAQwAKBwcIBwYKCAgICwoKCw4YEA4NDQ4dFRYRGCMfJSQiHyIhJis3LyYpNCkhIjBBMTQ5Oz4+PiUuRElDPEg3PT47/9sAQwEKCwsODQ4cEBAcOygiKDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs [...]
+2b:["$","p",null,{"children":[["$","strong",null,{"children":"Low-level I/O"}]," - although the current results (based on the benchmarking tool measuring the throughput etc.) are satisfying, we strongly believe that there's still (potentially a huge) room for improvement. We're planning to use ",["$","strong",null,{"children":["$","$L2",null,{"href":"https://unixism.net/loti/what_is_io_uring.html","children":"io_uring"}]}]," for all I/O operations (disk or network related). The brand new [...]
+2c:["$","p",null,{"children":[["$","strong",null,{"children":"Thread-per-core"}]," - in order to avoid the rather costly context switches due to the usage of synchronization mechanism when accessing the data from the different threads (e.g. via Tokio's work stealing mechanism), we're planning to explore (or actually, already doing it, in the previously mentioned repository for clustering sandbox) thread-per-core architecture, once again, delivered as part of ",["$","strong",null,{"childr [...]
+2d:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"future","children":[["$","a",null,{"data-card":"","href":"#future","className":"peer","children":"Future"}],["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-op [...]
+2e:["$","p",null,{"children":[["$","strong",null,{"children":"Why building another message streaming then?"}]," A few months ago, I would probably answer - strictly for fun. Yet, after exploring more in-depth the status quo, what we would like to achieve is sort of twofold - on one hand, it'd be great to deliver the general-purpose tool, such as Kafka. On the other hand, why not to try and really push hard the OS and hardware to its limits when speaking of the performance, reliability, t [...]
+2f:["$","p",null,{"children":["Only the time will tell, but ",["$","strong",null,{"children":"we're already excited enough to challenge ourselves"}],". We'd love to hear your thoughts, ideas and ",["$","strong",null,{"children":"feedback"}]," - anything that will help us in building the best message streaming platform in Rust that you will enjoy using! Feel free to join our ",["$","$L2",null,{"href":"https://discord.gg/apache-iggy","children":"Discord"}]," community and let us know what [...]
+30:["$","p",null,{"children":"P.S."}]
+31:["$","p",null,{"children":["This blog uses ",["$","$L2",null,{"href":"https://www.getzola.org/","children":"Rust"}],"."]}]
+32:["$","footer",null,{"className":"mt-16 border-t border-fd-border pt-8","children":["$","$L3a",null,{"href":"/blogs","className":"inline-flex items-center gap-2 text-sm font-medium text-fd-primary transition-colors hover:opacity-80","children":"← Back to all posts"}]}]
+33:["$","script","script-0",{"src":"/_next/static/chunks/00b00679782d0ffd.js","async":true}]
+34:["$","script","script-1",{"src":"/_next/static/chunks/3562882a488c4fbb.js","async":true}]
+35:["$","$L3b",null,{"children":["$","$3c",null,{"name":"Next.MetadataOutlet","children":"$@3d"}]}]
+39:["$","$L3e",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"let"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" polled_messages "}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"="}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E [...]
+3d:null
+3f:["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" None"}]
+40:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]
+41:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" strategy"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" PollingStrategy"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"::"}],["$","span",null,{"style":{"--s [...]
+42:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" count"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" 10"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+43:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" auto_commit"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" true"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+44:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"})"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":".await?"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":";"}]]}]
diff --git a/blogs/2023/12/29/building-message-streaming-in-rust/__next.!KHNpdGUp.blogs.$c$slug.txt b/blogs/2023/12/29/building-message-streaming-in-rust/__next.!KHNpdGUp.blogs.$c$slug.txt
new file mode 100644
index 00000000..11b31bb0
--- /dev/null
+++ b/blogs/2023/12/29/building-message-streaming-in-rust/__next.!KHNpdGUp.blogs.$c$slug.txt
@@ -0,0 +1,4 @@
+1:"$Sreact.fragment"
+2:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+3:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","template":["$","$L3",null,{}]}]]}],"loading":null,"isPartial":false}
diff --git a/blogs/2023/12/29/building-message-streaming-in-rust/__next.!KHNpdGUp.blogs.txt b/blogs/2023/12/29/building-message-streaming-in-rust/__next.!KHNpdGUp.blogs.txt
new file mode 100644
index 00000000..11b31bb0
--- /dev/null
+++ b/blogs/2023/12/29/building-message-streaming-in-rust/__next.!KHNpdGUp.blogs.txt
@@ -0,0 +1,4 @@
+1:"$Sreact.fragment"
+2:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+3:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","template":["$","$L3",null,{}]}]]}],"loading":null,"isPartial":false}
diff --git a/blogs/2023/12/29/building-message-streaming-in-rust/__next.!KHNpdGUp.txt b/blogs/2023/12/29/building-message-streaming-in-rust/__next.!KHNpdGUp.txt
new file mode 100644
index 00000000..ea3bfa55
--- /dev/null
+++ b/blogs/2023/12/29/building-message-streaming-in-rust/__next.!KHNpdGUp.txt
@@ -0,0 +1,9 @@
+1:"$Sreact.fragment"
+2:I[83571,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Header"]
+3:I[29966,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFDropdown"]
+4:I[36330,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFMobileLinks"]
+5:I[22016,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],""]
+6:I[88760,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Logo"]
+7:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+8:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","c",{"children":[[["$","script","script-0",{"src":"/_next/static/chunks/8d86be78428a601a.js","async":true}],["$","script","script-1",{"src":"/_next/static/chunks/da34cc6305706ac6.js","async":true}],["$","script","script-2",{"src":"/_next/static/chunks/9baf65674e2de991.js","async":true}],["$","script","script-3",{"src":"/_next/static/chunks/26b70f9828dd1eb5.js","async":true}],["$","script","script-4",{"src":"/_next/static/chunks/adeed83 [...]
diff --git a/blogs/2023/12/29/building-message-streaming-in-rust/__next._full.txt b/blogs/2023/12/29/building-message-streaming-in-rust/__next._full.txt
new file mode 100644
index 00000000..e0d5b9a5
--- /dev/null
+++ b/blogs/2023/12/29/building-message-streaming-in-rust/__next._full.txt
@@ -0,0 +1,89 @@
+1:"$Sreact.fragment"
+2:I[17751,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js"],"RootProvider"]
+3:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+4:I[58298,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/5a37d4cb1abe17d7.js"],"default"]
+5:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+6:I[83571,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Header"]
+7:I[29966,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFDropdown"]
+8:I[36330,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFMobileLinks"]
+9:I[22016,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],""]
+a:I[88760,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Logo"]
+11:I[68027,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+:HL["/_next/static/chunks/32a0415c8ab1bd26.css","style"]
+:HL["/_next/static/media/GeistMono_Variable.p.2f937313.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+:HL["/_next/static/media/Geist_Variable-s.p.92592eb2.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+0:{"P":null,"b":"uBHgltRE2s5QA49x61S_u","c":["","blogs","2023","12","29","building-message-streaming-in-rust",""],"q":"","i":false,"f":[[["",{"children":["(site)",{"children":["blogs",{"children":[["slug","2023/12/29/building-message-streaming-in-rust","c"],{"children":["__PAGE__",{}]}]}]}]},"$undefined","$undefined",true],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/32a0415c8ab1bd26.css","precedence":"next","crossOrigin":"$undefined","non [...]
+13:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"OutletBoundary"]
+14:"$Sreact.suspense"
+16:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"ViewportBoundary"]
+18:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"MetadataBoundary"]
+b:["$","h1",null,{"className":"next-error-h1","style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:1:props:style","children":404}]
+c:["$","div",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:style","children":["$","h2",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style","children":"This page could not be found."}]}]
+d:["$","$1","c",{"children":[null,["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}]
+e:["$","$1","c",{"children":[null,["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}]
+f:["$","$1","c",{"children":["$L12",[["$","script","script-0",{"src":"/_next/static/chunks/00b00679782d0ffd.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/3562882a488c4fbb.js","async":true,"nonce":"$undefined"}]],["$","$L13",null,{"children":["$","$14",null,{"name":"Next.MetadataOutlet","children":"$@15"}]}]]}]
+10:["$","$1","h",{"children":[null,["$","$L16",null,{"children":"$L17"}],["$","div",null,{"hidden":true,"children":["$","$L18",null,{"children":["$","$14",null,{"name":"Next.Metadata","children":"$L19"}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}]
+1a:I[47873,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"default"]
+12:["$","main",null,{"className":"min-h-screen px-6 py-16 md:px-12","children":["$","article",null,{"className":"mx-auto max-w-5xl","children":[["$","header",null,{"className":"mb-10","children":[["$","time",null,{"className":"text-sm font-medium text-fd-muted-foreground","children":"December 29, 2023"}],["$","h1",null,{"className":"mt-3 text-3xl font-extrabold tracking-tight text-fd-foreground md:text-5xl","children":"Iggy.rs - building message streaming in Rust"}],["$","p",null,{"class [...]
+4b:I[24110,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"Image"]
+4c:I[44324,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"CodeBlock"]
+1b:["$","p",null,{"children":["And this is how the ",["$","$L1a",null,{"href":"https://iggy.rs","children":"Iggy.rs"}]," was born. The name is an abbreviation of the Italian Greyhound (yes, I own ",["$","$L1a",null,{"href":"https://www.instagram.com/fabio.and.cookie/","children":"two of them"}],"), small yet extremely fast dogs, the best in their class."]}]
+1c:["$","p",null,{"children":["$","$L4b",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"image","src":{"src":"/_next/static/media/iggys.d5bf7cfc.jpeg","width":1506,"height":1282,"blurWidth":8,"blurHeight":7,"blurDataURL":"data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAAQABAAD/wAARCAAHAAgDAREAAhEBAxEB/9sAQwAKBwcIBwYKCAgICwoKCw4YEA4NDQ4dFRYRGCMfJSQiHyIhJis3LyYpNCkhIjBBMTQ5Oz4+PiUuRElDPEg3PT47/9sAQwEKCwsODQ4cEBAcOygiKDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Oz [...]
+1d:["$","p",null,{"children":["Therefore, what I want, or actually ",["$","strong",null,{"children":"what we want"}]," (since there's a few of us working on it already) for Iggy.rs to be - the best message streaming platform in its class. ",["$","strong",null,{"children":"Lightweight"}]," in terms of the resource consumption, ",["$","strong",null,{"children":"fast"}]," (and predictable) when it comes to the throughput and latency, and ",["$","strong",null,{"children":"easy to use"}]," wh [...]
+1e:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"project","children":[["$","a",null,{"data-card":"","href":"#project","className":"peer","children":"Project"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground o [...]
+1f:["$","p",null,{"children":["At the very beginning, Iggy had rather limited functionality, and everything was handled using the ",["$","$L1a",null,{"href":"https://www.chromium.org/quic/","children":"QUIC"}]," protocol based on ",["$","$L1a",null,{"href":"https://github.com/quinn-rs/quinn","children":"Quinn"}]," library. You could connect multiple applications into the server, and start exchanging the messages between them, simply by appending the data to the stream (from the producer [...]
+20:["$","p",null,{"children":["After spending a few weeks on building the initial version, and then another few weeks on rewriting its core part (yes, prototyping + validation repeated in a continuous loop worked quite well), I managed to implement the persistent streaming server being capable of parallel writes/reads to/from independent streams supporting many distinct apps connected into it. Simply put, one could easily have many applications, and even ",["$","strong",null,{"children": [...]
+21:["$","p",null,{"children":["On top of this, the support for ",["$","strong",null,{"children":"TCP"}]," and ",["$","strong",null,{"children":"HTTP"}]," protocols have been added. Under the hood, the typical architecture of streams, consisting of the topics being split into the partitions, which eventually operate on a raw file data using so-called segments has been implemented as well."]}]
+22:["$","p",null,{"children":["$","$L4b",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"image","src":{"src":"/_next/static/media/iggy_sample.4c2d3682.jpeg","width":4064,"height":2408,"blurWidth":8,"blurHeight":5,"blurDataURL":"data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAAQABAAD/wAARCAAFAAgDAREAAhEBAxEB/9sAQwAKBwcIBwYKCAgICwoKCw4YEA4NDQ4dFRYRGCMfJSQiHyIhJis3LyYpNCkhIjBBMTQ5Oz4+PiUuRElDPEg3PT47/9sAQwEKCwsODQ4cEBAcOygiKDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7 [...]
+23:["$","p",null,{"children":[["$","strong",null,{"children":"It was one of the \"aha\" moments"}],", when reimplementing the parallel access to the data with the usage of underlying synchronization mechanism (",["$","em",null,{"children":"RwLock"}]," etc.), optimized data structures e.g. for dealing with ",["$","$L1a",null,{"href":"https://crates.io/crates/bytes","children":"bytes"}],", along with the ",["$","$L1a",null,{"href":"https://tokio.rs","children":"Tokio"}]," ",["$","strong",n [...]
+24:["$","p",null,{"children":["I do believe, that somewhere at this point I had realized, that ",["$","strong",null,{"children":"Iggy might actually become something useful"}]," - not just a toy project, to be abandoned after reaching its initial goal (which was sort of already achieved)."]}]
+4d:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+26:["$","p",null,{"children":["After running some benchmarks (yes, we have a dedicated app for the ",["$","strong",null,{"children":["$","$L1a",null,{"href":"https://github.com/apache/iggy/tree/master/core/bench","children":"benchmarking purposes"}]}],") and seeing the promising numbers (",["$","strong",null,{"children":"range of 2-6 GB/s for both, writes & reads when processing millions of messages"}],"), I eventually decided to give it a long-term shot. Being fully aware that there's s [...]
+27:["$","p",null,{"children":["$","$L4b",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"image","src":{"src":"/_next/static/media/iggy_bench.d3c96948.jpeg","width":3494,"height":1750,"blurWidth":8,"blurHeight":4,"blurDataURL":"data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAAQABAAD/wAARCAAEAAgDAREAAhEBAxEB/9sAQwAKBwcIBwYKCAgICwoKCw4YEA4NDQ4dFRYRGCMfJSQiHyIhJis3LyYpNCkhIjBBMTQ5Oz4+PiUuRElDPEg3PT47/9sAQwEKCwsODQ4cEBAcOygiKDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O [...]
+28:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"team","children":[["$","a",null,{"data-card":"","href":"#team","className":"peer","children":"Team"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 [...]
+29:["$","p",null,{"children":["At the time of writing this post, ",["$","strong",null,{"children":"Iggy consists of around 10 members"}]," contributing to its different parts. Some of us do work on the core streaming server, while the other ones are focused on SDKs for the different programming languages or tooling such as Web UI or CLI - all these projects are equally important, as they add up to the overall ecosystem. But how do you actually gather a team of open source contributors, w [...]
+2a:["$","p",null,{"children":["Well, I wish I had an answer to that question - honestly, in case of Iggy I wasn't actually looking for anyone, as I didn't think this could be an interesting project to work on (except for myself). Then how did that happen anyway? There were only 2 things in common - all the people that joined the project were part of the same Discord communities, yet more importantly ",["$","strong",null,{"children":"they all shared the passion for programming"}],", and I [...]
+2b:["$","p",null,{"children":["$","$L4b",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"image","src":{"src":"/_next/static/media/iggy_server.4f75ea73.jpeg","width":4088,"height":1610,"blurWidth":8,"blurHeight":3,"blurDataURL":"data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAAQABAAD/wAARCAADAAgDAREAAhEBAxEB/9sAQwAKBwcIBwYKCAgICwoKCw4YEA4NDQ4dFRYRGCMfJSQiHyIhJis3LyYpNCkhIjBBMTQ5Oz4+PiUuRElDPEg3PT47/9sAQwEKCwsODQ4cEBAcOygiKDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7 [...]
+2c:["$","p",null,{"children":"For example, when I asked one guy what was the reason behind building an SDK in Go, the reply was the need of playing with and learning a new language. Why C# SDK? Well, the other guy wanted to dive more into the low-level concepts and decided to squeeze out great performance from the managed runtime. Why build Web UI in Svelte? At work, I mostly use React, and I wanted to learn a new framework - another member said."}]
+2d:["$","p",null,{"children":["My point is - as long as you believe in what you're building, and you're consistent about it (it was one of the main reasons why I've been contributing to Iggy every day since its inception, and still doing so), there's a chance that someone out there will notice it and happily join you in your efforts. ",["$","strong",null,{"children":"Lead by example, or whatever you call it."}]]}]
+2e:["$","p",null,{"children":["At the same time, we've started receiving the first, ",["$","strong",null,{"children":"external contributions from all around the world"}]," - whether talking about simpler tasks, or the more sophisticated ones, requiring significant amount of time being spent on both, the implementation and the discussions to eventually deliver the code."]}]
+2f:["$","p",null,{"children":"It gave us even more confidence, that there are other people (outside our internal bubble), who find this project to be interesting and worth spending their time. And without all these amazing contributors, it'd be much harder (or even impossible) to deliver so many features."}]
+30:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"features","children":[["$","a",null,{"data-card":"","href":"#features","className":"peer","children":"Features"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-foregroun [...]
+31:["$","p",null,{"children":"At first, let me just point out some of the properties and features that are part of the core streaming server:"}]
+32:["$","ul",null,{"children":["\n",["$","li",null,{"children":[["$","strong",null,{"children":"Highly performant"}],", persistent append-only log for the message streaming"]}],"\n",["$","li",null,{"children":[["$","strong",null,{"children":"Very high throughput"}]," for both writes and reads"]}],"\n",["$","li",null,{"children":[["$","strong",null,{"children":"Low latency and predictable resource usage"}]," thanks to the Rust compiled language (no GC)"]}],"\n",["$","li",null,{"children": [...]
+33:["$","p",null,{"children":"And as already mentioned, we've been working on SDKs for the multiple programming languages:"}]
+34:["$","ul",null,{"children":["\n",["$","li",null,{"children":["$","$L1a",null,{"href":"https://crates.io/crates/iggy","children":"Rust"}]}],"\n",["$","li",null,{"children":["$","$L1a",null,{"href":"https://github.com/iggy-rs/iggy-dotnet-client","children":"C#"}]}],"\n",["$","li",null,{"children":["$","$L1a",null,{"href":"https://github.com/iggy-rs/iggy-go-client","children":"Go"}]}],"\n",["$","li",null,{"children":["$","$L1a",null,{"href":"https://github.com/iggy-rs/iggy-node-client"," [...]
+35:["$","p",null,{"children":["Please keep in mind, though, that some of them e.g. for Rust or C# are more up to date with the recent server changes, while the other ones might still need to do some catching up with the latest features. However, given the amount of available methods on the server's API and the underlying TCP/UDP stack with custom serialization to be implemented from the scratch (except for HTTP transport, that's the easier one), I'd say we're doing quite ok, and I can't [...]
+36:["$","p",null,{"children":["But wait, there's even more - what would be a message streaming platform without some additional tooling for managing it? We've also been developing the ",["$","strong",null,{"children":["$","$L1a",null,{"href":"https://github.com/apache/iggy/tree/master/cmd","children":"CLI"}]}],"."]}]
+37:["$","p",null,{"children":["$","$L4b",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"image","src":{"src":"/_next/static/media/iggy_cli.ffd1cc01.jpeg","width":2942,"height":2162,"blurWidth":8,"blurHeight":6,"blurDataURL":"data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAAQABAAD/wAARCAAGAAgDAREAAhEBAxEB/9sAQwAKBwcIBwYKCAgICwoKCw4YEA4NDQ4dFRYRGCMfJSQiHyIhJis3LyYpNCkhIjBBMTQ5Oz4+PiUuRElDPEg3PT47/9sAQwEKCwsODQ4cEBAcOygiKDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs [...]
+38:["$","p",null,{"children":["As well as modern ",["$","strong",null,{"children":["$","$L1a",null,{"href":"https://github.com/iggy-rs/iggy-web-ui","children":"Web UI"}]}]," to make it happen :)"]}]
+39:["$","p",null,{"children":["$","$L4b",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"image","src":{"src":"/_next/static/media/iggy_web_ui.0f6c99cb.jpeg","width":4060,"height":2408,"blurWidth":8,"blurHeight":5,"blurDataURL":"data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAAQABAAD/wAARCAAFAAgDAREAAhEBAxEB/9sAQwAKBwcIBwYKCAgICwoKCw4YEA4NDQ4dFRYRGCMfJSQiHyIhJis3LyYpNCkhIjBBMTQ5Oz4+PiUuRElDPEg3PT47/9sAQwEKCwsODQ4cEBAcOygiKDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7 [...]
+3a:["$","p",null,{"children":["Last but not least, we've got a fully-featured ",["$","$L1a",null,{"href":"https://github.com/apache/iggy/actions","children":"CI/CD pipeline"}]," responsible for running all the checks and tests on multiple platforms, and finally producing the release artifacts and ",["$","$L1a",null,{"href":"https://hub.docker.com/u/iggyrs","children":"Docker images"}],"."]}]
+3b:["$","p",null,{"children":["$","$L4b",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"image","src":{"src":"/_next/static/media/iggy_ci_cd.51a98142.jpeg","width":2000,"height":1000,"blurWidth":8,"blurHeight":4,"blurDataURL":"data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAAQABAAD/wAARCAAEAAgDAREAAhEBAxEB/9sAQwAKBwcIBwYKCAgICwoKCw4YEA4NDQ4dFRYRGCMfJSQiHyIhJis3LyYpNCkhIjBBMTQ5Oz4+PiUuRElDPEg3PT47/9sAQwEKCwsODQ4cEBAcOygiKDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O [...]
+3c:["$","p",null,{"children":"At first glance, it might look like there's plenty of features already in place, but for anyone who has ever worked with the message streaming infrastructure before, that might be just a tip of an iceberg, thus let's discuss the roadmap."}]
+3d:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"roadmap","children":[["$","a",null,{"data-card":"","href":"#roadmap","className":"peer","children":"Roadmap"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground o [...]
+3e:["$","p",null,{"children":["After gaining some traction a few months ago (mostly due to landing on the GitHub trending page in July), we've talked to some users potentially interested in making Iggy part of their infrastructure (there's even one ",["$","$L1a",null,{"href":"https://neferdata.com","children":"company"}]," using it already), and discussed what features would be a good addition to the current stack."]}]
+3f:["$","p",null,{"children":["$","$L4b",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"image","src":{"src":"/_next/static/media/gh_trending.c393fc00.jpeg","width":2234,"height":1830,"blurWidth":8,"blurHeight":7,"blurDataURL":"data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAAQABAAD/wAARCAAHAAgDAREAAhEBAxEB/9sAQwAKBwcIBwYKCAgICwoKCw4YEA4NDQ4dFRYRGCMfJSQiHyIhJis3LyYpNCkhIjBBMTQ5Oz4+PiUuRElDPEg3PT47/9sAQwEKCwsODQ4cEBAcOygiKDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7 [...]
+40:["$","p",null,{"children":"Considering what's already there, being worked on or planned for the future releases, such as interactive CLI, modern Web UI, optional data compression and archivization, plugin support or multiple SDKs, there are at least three additional challenges to overcome:"}]
+41:["$","p",null,{"children":[["$","strong",null,{"children":"Clustering"}]," - the possibility of having a ",["$","strong",null,{"children":"highly available and fault tolerant"}]," distributed message streaming platform in a production environment, is typically one of the most important aspects when considering the particular tool. While it wouldn't be too difficult to implement the extension (think of a simple proxy/load balancer), allowing to monitor and deliver the data either to th [...]
+42:["$","p",null,{"children":["$","$L4b",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"image","src":{"src":"/_next/static/media/leader_elections.a60bb3b7.jpeg","width":4058,"height":2316,"blurWidth":8,"blurHeight":5,"blurDataURL":"data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAAQABAAD/wAARCAAFAAgDAREAAhEBAxEB/9sAQwAKBwcIBwYKCAgICwoKCw4YEA4NDQ4dFRYRGCMfJSQiHyIhJis3LyYpNCkhIjBBMTQ5Oz4+PiUuRElDPEg3PT47/9sAQwEKCwsODQ4cEBAcOygiKDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs [...]
+43:["$","p",null,{"children":[["$","strong",null,{"children":"Low-level I/O"}]," - although the current results (based on the benchmarking tool measuring the throughput etc.) are satisfying, we strongly believe that there's still (potentially a huge) room for improvement. We're planning to use ",["$","strong",null,{"children":["$","$L1a",null,{"href":"https://unixism.net/loti/what_is_io_uring.html","children":"io_uring"}]}]," for all I/O operations (disk or network related). The brand ne [...]
+44:["$","p",null,{"children":[["$","strong",null,{"children":"Thread-per-core"}]," - in order to avoid the rather costly context switches due to the usage of synchronization mechanism when accessing the data from the different threads (e.g. via Tokio's work stealing mechanism), we're planning to explore (or actually, already doing it, in the previously mentioned repository for clustering sandbox) thread-per-core architecture, once again, delivered as part of ",["$","strong",null,{"childr [...]
+45:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"future","children":[["$","a",null,{"data-card":"","href":"#future","className":"peer","children":"Future"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opac [...]
+46:["$","p",null,{"children":[["$","strong",null,{"children":"Why building another message streaming then?"}]," A few months ago, I would probably answer - strictly for fun. Yet, after exploring more in-depth the status quo, what we would like to achieve is sort of twofold - on one hand, it'd be great to deliver the general-purpose tool, such as Kafka. On the other hand, why not to try and really push hard the OS and hardware to its limits when speaking of the performance, reliability, t [...]
+47:["$","p",null,{"children":["Only the time will tell, but ",["$","strong",null,{"children":"we're already excited enough to challenge ourselves"}],". We'd love to hear your thoughts, ideas and ",["$","strong",null,{"children":"feedback"}]," - anything that will help us in building the best message streaming platform in Rust that you will enjoy using! Feel free to join our ",["$","$L1a",null,{"href":"https://discord.gg/apache-iggy","children":"Discord"}]," community and let us know what [...]
+48:["$","p",null,{"children":"P.S."}]
+49:["$","p",null,{"children":["This blog uses ",["$","$L1a",null,{"href":"https://www.getzola.org/","children":"Rust"}],"."]}]
+4a:["$","footer",null,{"className":"mt-16 border-t border-fd-border pt-8","children":["$","$L9",null,{"href":"/blogs","className":"inline-flex items-center gap-2 text-sm font-medium text-fd-primary transition-colors hover:opacity-80","children":"← Back to all posts"}]}]
+4f:I[44324,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"Pre"]
+4e:["$","$L4f",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"let"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" polled_messages "}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"="}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E [...]
+50:["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" None"}]
+51:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]
+52:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" strategy"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" PollingStrategy"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"::"}],["$","span",null,{"style":{"--s [...]
+53:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" count"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" 10"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+54:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" auto_commit"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" true"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+55:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"})"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":".await?"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":";"}]]}]
+17:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
+56:I[27201,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"IconMark"]
+15:null
+19:[["$","title","0",{"children":"Iggy.rs - building message streaming in Rust | Apache Iggy"}],["$","link","1",{"rel":"icon","href":"/img/favicon.png"}],["$","$L56","2",{}]]
diff --git a/blogs/2023/12/29/building-message-streaming-in-rust/__next._head.txt b/blogs/2023/12/29/building-message-streaming-in-rust/__next._head.txt
new file mode 100644
index 00000000..12072634
--- /dev/null
+++ b/blogs/2023/12/29/building-message-streaming-in-rust/__next._head.txt
@@ -0,0 +1,6 @@
+1:"$Sreact.fragment"
+2:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"ViewportBoundary"]
+3:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"MetadataBoundary"]
+4:"$Sreact.suspense"
+5:I[27201,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"IconMark"]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","h",{"children":[null,["$","$L2",null,{"children":[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]}],["$","div",null,{"hidden":true,"children":["$","$L3",null,{"children":["$","$4",null,{"name":"Next.Metadata","children":[["$","title","0",{"children":"Iggy.rs - building message streaming in Rust | Apache Iggy"}],["$","link","1",{"rel":"icon","href":"/img/favicon [...]
diff --git a/blogs/2023/12/29/building-message-streaming-in-rust/__next._index.txt b/blogs/2023/12/29/building-message-streaming-in-rust/__next._index.txt
new file mode 100644
index 00000000..fd02bd95
--- /dev/null
+++ b/blogs/2023/12/29/building-message-streaming-in-rust/__next._index.txt
@@ -0,0 +1,7 @@
+1:"$Sreact.fragment"
+2:I[17751,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js"],"RootProvider"]
+3:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+4:I[58298,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/5a37d4cb1abe17d7.js"],"default"]
+5:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+:HL["/_next/static/chunks/32a0415c8ab1bd26.css","style"]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/32a0415c8ab1bd26.css","precedence":"next"}],["$","script","script-0",{"src":"/_next/static/chunks/9ebd3a84bf60af84.js","async":true}],["$","script","script-1",{"src":"/_next/static/chunks/78b5f2e7b839e72f.js","async":true}]],["$","html",null,{"lang":"en","className":"geistsans_d5a4f12f-module__Ur3q_a__variable geistmono_157ca88a-module__iaM1Ya__variable" [...]
diff --git a/blogs/2023/12/29/building-message-streaming-in-rust/__next._tree.txt b/blogs/2023/12/29/building-message-streaming-in-rust/__next._tree.txt
new file mode 100644
index 00000000..e1e87caa
--- /dev/null
+++ b/blogs/2023/12/29/building-message-streaming-in-rust/__next._tree.txt
@@ -0,0 +1,4 @@
+:HL["/_next/static/chunks/32a0415c8ab1bd26.css","style"]
+:HL["/_next/static/media/GeistMono_Variable.p.2f937313.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+:HL["/_next/static/media/Geist_Variable-s.p.92592eb2.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","tree":{"name":"","paramType":null,"paramKey":"","hasRuntimePrefetch":false,"slots":{"children":{"name":"(site)","paramType":null,"paramKey":"(site)","hasRuntimePrefetch":false,"slots":{"children":{"name":"blogs","paramType":null,"paramKey":"blogs","hasRuntimePrefetch":false,"slots":{"children":{"name":"slug","paramType":"c","paramKey":"2023/12/29/building-message-streaming-in-rust","hasRuntimePrefetch":false,"slots":{"children":{"name":"__PAGE__","pa [...]
diff --git a/blogs/2023/12/29/building-message-streaming-in-rust/index.html b/blogs/2023/12/29/building-message-streaming-in-rust/index.html
new file mode 100644
index 00000000..e34b5ee8
--- /dev/null
+++ b/blogs/2023/12/29/building-message-streaming-in-rust/index.html
@@ -0,0 +1,96 @@
+<!DOCTYPE html><!--uBHgltRE2s5QA49x61S_u--><html lang="en" class="geistsans_d5a4f12f-module__Ur3q_a__variable geistmono_157ca88a-module__iaM1Ya__variable"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" href="/_next/static/media/GeistMono_Variable.p.2f937313.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="preload" href="/_next/static/media/Geist_Variable-s.p.92592eb2.woff2" as="font" crossorigin="" type=" [...]
+<p>Over half a year ago (in April, to be exact), I eventually decided to learn Rust for good. My previous attempt during the <a href="https://github.com/spetz/advent-of-code-2022" rel="noreferrer noopener" target="_blank">2022 AoC</a> had failed rather quickly, after a few days of completing the exercises - I finally realized that <strong>I needed a real project to work on</strong>. For the last few years, I've been dealing with the different kinds of distributed systems (mostly usi [...]
+<p>After a few months of trying to figure out (or just staying in the limbo I guess), what would be the best project to work on, I decided to build the <strong>message streaming platform</strong> (keep in mind that streaming is <a href="https://blog.iron.io/message-queue-vs-streaming/" rel="noreferrer noopener" target="_blank">not the same</a> as regular message broker). The other reason (besides getting to know Rust) was to <strong>truly understand the internals of the messaging systems [...]
+<p>And this is how the <a href="https://iggy.rs" rel="noreferrer noopener" target="_blank">Iggy.rs</a> was born. The name is an abbreviation of the Italian Greyhound (yes, I own <a href="https://www.instagram.com/fabio.and.cookie/" rel="noreferrer noopener" target="_blank">two of them</a>), small yet extremely fast dogs, the best in their class.</p>
+<p><img alt="image" loading="lazy" width="1506" height="1282" decoding="async" data-nimg="1" class="rounded-lg" style="color:transparent;background-size:cover;background-position:50% 50%;background-repeat:no-repeat;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 320 280'%3E%3Cfilter id='b' color-interpolation-filters='sRGB'%3E%3CfeGaussianBlur stdDeviation='20'/%3E%3CfeCol [...]
+<p>Therefore, what I want, or actually <strong>what we want</strong> (since there's a few of us working on it already) for Iggy.rs to be - the best message streaming platform in its class. <strong>Lightweight</strong> in terms of the resource consumption, <strong>fast</strong> (and predictable) when it comes to the throughput and latency, and <strong>easy to use</strong> when speaking of its API, SDK and configuration of the project.</p>
+<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="project"><a data-card="" href="#project" class="peer">Project</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 [...]
+<p>At the very beginning, Iggy had rather limited functionality, and everything was handled using the <a href="https://www.chromium.org/quic/" rel="noreferrer noopener" target="_blank">QUIC</a> protocol based on <a href="https://github.com/quinn-rs/quinn" rel="noreferrer noopener" target="_blank">Quinn</a> library. You could connect multiple applications into the server, and start exchanging the messages between them, simply by appending the data to the stream (from the producer perspect [...]
+<p>After spending a few weeks on building the initial version, and then another few weeks on rewriting its core part (yes, prototyping + validation repeated in a continuous loop worked quite well), I managed to implement the persistent streaming server being capable of parallel writes/reads to/from independent streams supporting many distinct apps connected into it. Simply put, one could easily have many applications, and even <strong>thousands of the streams</strong> (depending on how d [...]
+<p>On top of this, the support for <strong>TCP</strong> and <strong>HTTP</strong> protocols have been added. Under the hood, the typical architecture of streams, consisting of the topics being split into the partitions, which eventually operate on a raw file data using so-called segments has been implemented as well.</p>
+<p><img alt="image" loading="lazy" width="4064" height="2408" decoding="async" data-nimg="1" class="rounded-lg" style="color:transparent;background-size:cover;background-position:50% 50%;background-repeat:no-repeat;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 320 200'%3E%3Cfilter id='b' color-interpolation-filters='sRGB'%3E%3CfeGaussianBlur stdDeviation='20'/%3E%3CfeCol [...]
+<p><strong>It was one of the "aha" moments</strong>, when reimplementing the parallel access to the data with the usage of underlying synchronization mechanism (<em>RwLock</em> etc.), optimized data structures e.g. for dealing with <a href="https://crates.io/crates/bytes" rel="noreferrer noopener" target="_blank">bytes</a>, along with the <a href="https://tokio.rs" rel="noreferrer noopener" target="_blank">Tokio</a> <strong>work stealing</strong> approach, yielded the great imp [...]
+<p>I do believe, that somewhere at this point I had realized, that <strong>Iggy might actually become something useful</strong> - not just a toy project, to be abandoned after reaching its initial goal (which was sort of already achieved).</p>
+<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-3 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-c [...]
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> stream_id</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Identifier</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">::</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">numeric</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF" [...]
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> topic_id</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Identifier</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">::</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">named</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">&q [...]
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> consumer</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Consumer</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">::</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">group</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">Iden [...]
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> partition_id</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> None</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> strategy</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> PollingStrategy</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">::</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">offset</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8 [...]
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> count</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 10</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> auto_commit</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> true</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">})</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">.await?</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span></code></pre></div></figure>
+<p>After running some benchmarks (yes, we have a dedicated app for the <strong><a href="https://github.com/apache/iggy/tree/master/core/bench" rel="noreferrer noopener" target="_blank">benchmarking purposes</a></strong>) and seeing the promising numbers (<strong>range of 2-6 GB/s for both, writes & reads when processing millions of messages</strong>), I eventually decided to give it a long-term shot. Being fully aware that there's still lots to be done (speaking of many months, [...]
+<p><img alt="image" loading="lazy" width="3494" height="1750" decoding="async" data-nimg="1" class="rounded-lg" style="color:transparent;background-size:cover;background-position:50% 50%;background-repeat:no-repeat;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 320 160'%3E%3Cfilter id='b' color-interpolation-filters='sRGB'%3E%3CfeGaussianBlur stdDeviation='20'/%3E%3CfeCol [...]
+<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="team"><a data-card="" href="#team" class="peer">Team</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07- [...]
+<p>At the time of writing this post, <strong>Iggy consists of around 10 members</strong> contributing to its different parts. Some of us do work on the core streaming server, while the other ones are focused on SDKs for the different programming languages or tooling such as Web UI or CLI - all these projects are equally important, as they add up to the overall ecosystem. But how do you actually gather a team of open source contributors, who are willing to spend their free time working on [...]
+<p>Well, I wish I had an answer to that question - honestly, in case of Iggy I wasn't actually looking for anyone, as I didn't think this could be an interesting project to work on (except for myself). Then how did that happen anyway? There were only 2 things in common - all the people that joined the project were part of the same Discord communities, yet more importantly <strong>they all shared the passion for programming</strong>, and I'm not talking about Rust language [...]
+<p><img alt="image" loading="lazy" width="4088" height="1610" decoding="async" data-nimg="1" class="rounded-lg" style="color:transparent;background-size:cover;background-position:50% 50%;background-repeat:no-repeat;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 320 120'%3E%3Cfilter id='b' color-interpolation-filters='sRGB'%3E%3CfeGaussianBlur stdDeviation='20'/%3E%3CfeCol [...]
+<p>For example, when I asked one guy what was the reason behind building an SDK in Go, the reply was the need of playing with and learning a new language. Why C# SDK? Well, the other guy wanted to dive more into the low-level concepts and decided to squeeze out great performance from the managed runtime. Why build Web UI in Svelte? At work, I mostly use React, and I wanted to learn a new framework - another member said.</p>
+<p>My point is - as long as you believe in what you're building, and you're consistent about it (it was one of the main reasons why I've been contributing to Iggy every day since its inception, and still doing so), there's a chance that someone out there will notice it and happily join you in your efforts. <strong>Lead by example, or whatever you call it.</strong></p>
+<p>At the same time, we've started receiving the first, <strong>external contributions from all around the world</strong> - whether talking about simpler tasks, or the more sophisticated ones, requiring significant amount of time being spent on both, the implementation and the discussions to eventually deliver the code.</p>
+<p>It gave us even more confidence, that there are other people (outside our internal bubble), who find this project to be interesting and worth spending their time. And without all these amazing contributors, it'd be much harder (or even impossible) to deliver so many features.</p>
+<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="features"><a data-card="" href="#features" class="peer">Features</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 [...]
+<p>At first, let me just point out some of the properties and features that are part of the core streaming server:</p>
+<ul>
+<li><strong>Highly performant</strong>, persistent append-only log for the message streaming</li>
+<li><strong>Very high throughput</strong> for both writes and reads</li>
+<li><strong>Low latency and predictable resource usage</strong> thanks to the Rust compiled language (no GC)</li>
+<li><strong>Users authentication and authorization</strong> with granular permissions and PAT (Personal Access Tokens)</li>
+<li>Support for multiple streams, topics and partitions</li>
+<li>Support for <strong>multiple transport protocols</strong> (QUIC, TCP, HTTP)</li>
+<li>Fully operational RESTful API which can be optionally enabled</li>
+<li>Available client SDK in multiple languages</li>
+<li><strong>Works directly with the binary data</strong> (lack of enforced schema and serialization/deserialization)</li>
+<li>Configurable server features (e.g. caching, segment size, data flush interval, transport protocols etc.)</li>
+<li>Possibility of storing the <strong>consumer offsets</strong> on the server</li>
+<li>Multiple ways of polling the messages:<!-- -->
+<ul>
+<li>By offset (using the indexes)</li>
+<li>By timestamp (using the time indexes)</li>
+<li>First/Last N messages</li>
+<li>Next N messages for the specific consumer</li>
+</ul>
+</li>
+<li>Possibility of <strong>auto committing the offset</strong> (e.g. to achieve <em>at-most-once</em> delivery)</li>
+<li><strong>Consumer groups</strong> providing the message ordering and horizontal scaling across the connected clients</li>
+<li><strong>Message expiry</strong> with auto deletion based on the configurable <strong>retention policy</strong></li>
+<li>Additional features such as <strong>server side message deduplication</strong></li>
+<li><strong>TLS</strong> support for all transport protocols (TCP, QUIC, HTTPS)</li>
+<li>Optional server-side as well as client-side <strong>data encryption</strong> using AES-256-GCM</li>
+<li>Optional metadata support in the form of <strong>message headers</strong></li>
+<li>Built-in <strong>CLI</strong> to manage the streaming server</li>
+<li>Built-in <strong>benchmarking app</strong> to test the performance</li>
+<li><strong>Single binary deployment</strong> (no external dependencies)</li>
+<li>Running as a single node (no cluster support yet)</li>
+</ul>
+<p>And as already mentioned, we've been working on SDKs for the multiple programming languages:</p>
+<ul>
+<li><a href="https://crates.io/crates/iggy" rel="noreferrer noopener" target="_blank">Rust</a></li>
+<li><a href="https://github.com/iggy-rs/iggy-dotnet-client" rel="noreferrer noopener" target="_blank">C#</a></li>
+<li><a href="https://github.com/iggy-rs/iggy-go-client" rel="noreferrer noopener" target="_blank">Go</a></li>
+<li><a href="https://github.com/iggy-rs/iggy-node-client" rel="noreferrer noopener" target="_blank">Node</a></li>
+<li><a href="https://github.com/iggy-rs/iggy-python-client" rel="noreferrer noopener" target="_blank">Python</a></li>
+<li><a href="https://github.com/iggy-rs/iggy-java-client" rel="noreferrer noopener" target="_blank">Java</a></li>
+</ul>
+<p>Please keep in mind, though, that some of them e.g. for Rust or C# are more up to date with the recent server changes, while the other ones might still need to do some catching up with the latest features. However, given the amount of available methods on the server's API and the underlying TCP/UDP stack with custom serialization to be implemented from the scratch (except for HTTP transport, that's the easier one), I'd say we're doing quite ok, and I can't str [...]
+<p>But wait, there's even more - what would be a message streaming platform without some additional tooling for managing it? We've also been developing the <strong><a href="https://github.com/apache/iggy/tree/master/cmd" rel="noreferrer noopener" target="_blank">CLI</a></strong>.</p>
+<p><img alt="image" loading="lazy" width="2942" height="2162" decoding="async" data-nimg="1" class="rounded-lg" style="color:transparent;background-size:cover;background-position:50% 50%;background-repeat:no-repeat;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 320 240'%3E%3Cfilter id='b' color-interpolation-filters='sRGB'%3E%3CfeGaussianBlur stdDeviation='20'/%3E%3CfeCol [...]
+<p>As well as modern <strong><a href="https://github.com/iggy-rs/iggy-web-ui" rel="noreferrer noopener" target="_blank">Web UI</a></strong> to make it happen :)</p>
+<p><img alt="image" loading="lazy" width="4060" height="2408" decoding="async" data-nimg="1" class="rounded-lg" style="color:transparent;background-size:cover;background-position:50% 50%;background-repeat:no-repeat;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 320 200'%3E%3Cfilter id='b' color-interpolation-filters='sRGB'%3E%3CfeGaussianBlur stdDeviation='20'/%3E%3CfeCol [...]
+<p>Last but not least, we've got a fully-featured <a href="https://github.com/apache/iggy/actions" rel="noreferrer noopener" target="_blank">CI/CD pipeline</a> responsible for running all the checks and tests on multiple platforms, and finally producing the release artifacts and <a href="https://hub.docker.com/u/iggyrs" rel="noreferrer noopener" target="_blank">Docker images</a>.</p>
+<p><img alt="image" loading="lazy" width="2000" height="1000" decoding="async" data-nimg="1" class="rounded-lg" style="color:transparent;background-size:cover;background-position:50% 50%;background-repeat:no-repeat;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 320 160'%3E%3Cfilter id='b' color-interpolation-filters='sRGB'%3E%3CfeGaussianBlur stdDeviation='20'/%3E%3CfeCol [...]
+<p>At first glance, it might look like there's plenty of features already in place, but for anyone who has ever worked with the message streaming infrastructure before, that might be just a tip of an iceberg, thus let's discuss the roadmap.</p>
+<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="roadmap"><a data-card="" href="#roadmap" class="peer">Roadmap</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 [...]
+<p>After gaining some traction a few months ago (mostly due to landing on the GitHub trending page in July), we've talked to some users potentially interested in making Iggy part of their infrastructure (there's even one <a href="https://neferdata.com" rel="noreferrer noopener" target="_blank">company</a> using it already), and discussed what features would be a good addition to the current stack.</p>
+<p><img alt="image" loading="lazy" width="2234" height="1830" decoding="async" data-nimg="1" class="rounded-lg" style="color:transparent;background-size:cover;background-position:50% 50%;background-repeat:no-repeat;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 320 280'%3E%3Cfilter id='b' color-interpolation-filters='sRGB'%3E%3CfeGaussianBlur stdDeviation='20'/%3E%3CfeCol [...]
+<p>Considering what's already there, being worked on or planned for the future releases, such as interactive CLI, modern Web UI, optional data compression and archivization, plugin support or multiple SDKs, there are at least three additional challenges to overcome:</p>
+<p><strong>Clustering</strong> - the possibility of having a <strong>highly available and fault tolerant</strong> distributed message streaming platform in a production environment, is typically one of the most important aspects when considering the particular tool. While it wouldn't be too difficult to implement the extension (think of a simple proxy/load balancer), allowing to monitor and deliver the data either to the primary or secondary replica (treated as a fallback server) an [...]
+<p><img alt="image" loading="lazy" width="4058" height="2316" decoding="async" data-nimg="1" class="rounded-lg" style="color:transparent;background-size:cover;background-position:50% 50%;background-repeat:no-repeat;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 320 200'%3E%3Cfilter id='b' color-interpolation-filters='sRGB'%3E%3CfeGaussianBlur stdDeviation='20'/%3E%3CfeCol [...]
+<p><strong>Low-level I/O</strong> - although the current results (based on the benchmarking tool measuring the throughput etc.) are satisfying, we strongly believe that there's still (potentially a huge) room for improvement. We're planning to use <strong><a href="https://unixism.net/loti/what_is_io_uring.html" rel="noreferrer noopener" target="_blank">io_uring</a></strong> for all I/O operations (disk or network related). The brand new, completion based API (available in the r [...]
+<p><strong>Thread-per-core</strong> - in order to avoid the rather costly context switches due to the usage of synchronization mechanism when accessing the data from the different threads (e.g. via Tokio's work stealing mechanism), we're planning to explore (or actually, already doing it, in the previously mentioned repository for clustering sandbox) thread-per-core architecture, once again, delivered as part of <strong><a href="https://github.com/bytedance/monoio" rel="norefer [...]
+<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="future"><a data-card="" href="#future" class="peer">Future</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0 [...]
+<p><strong>Why building another message streaming then?</strong> A few months ago, I would probably answer - strictly for fun. Yet, after exploring more in-depth the status quo, what we would like to achieve is sort of twofold - on one hand, it'd be great to deliver the general-purpose tool, such as Kafka. On the other hand, why not to try and really push hard the OS and hardware to its limits when speaking of the performance, reliability, throughput and latency, something what e.g. [...]
+<p>Only the time will tell, but <strong>we're already excited enough to challenge ourselves</strong>. We'd love to hear your thoughts, ideas and <strong>feedback</strong> - anything that will help us in building the best message streaming platform in Rust that you will enjoy using! Feel free to join our <a href="https://discord.gg/apache-iggy" rel="noreferrer noopener" target="_blank">Discord</a> community and let us know what do you think :)</p>
+<p>P.S.</p>
+<p>This blog uses <a href="https://www.getzola.org/" rel="noreferrer noopener" target="_blank">Rust</a>.</p></div><footer class="mt-16 border-t border-fd-border pt-8"><a class="inline-flex items-center gap-2 text-sm font-medium text-fd-primary transition-colors hover:opacity-80" href="/blogs/">← Back to all posts</a></footer></article></main><!--$--><!--/$--></main><script src="/_next/static/chunks/922b7f01aa6775a6.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]). [...]
\ No newline at end of file
diff --git a/blogs/2023/12/29/building-message-streaming-in-rust/index.txt b/blogs/2023/12/29/building-message-streaming-in-rust/index.txt
new file mode 100644
index 00000000..e0d5b9a5
--- /dev/null
+++ b/blogs/2023/12/29/building-message-streaming-in-rust/index.txt
@@ -0,0 +1,89 @@
+1:"$Sreact.fragment"
+2:I[17751,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js"],"RootProvider"]
+3:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+4:I[58298,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/5a37d4cb1abe17d7.js"],"default"]
+5:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+6:I[83571,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Header"]
+7:I[29966,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFDropdown"]
+8:I[36330,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFMobileLinks"]
+9:I[22016,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],""]
+a:I[88760,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Logo"]
+11:I[68027,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+:HL["/_next/static/chunks/32a0415c8ab1bd26.css","style"]
+:HL["/_next/static/media/GeistMono_Variable.p.2f937313.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+:HL["/_next/static/media/Geist_Variable-s.p.92592eb2.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+0:{"P":null,"b":"uBHgltRE2s5QA49x61S_u","c":["","blogs","2023","12","29","building-message-streaming-in-rust",""],"q":"","i":false,"f":[[["",{"children":["(site)",{"children":["blogs",{"children":[["slug","2023/12/29/building-message-streaming-in-rust","c"],{"children":["__PAGE__",{}]}]}]}]},"$undefined","$undefined",true],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/32a0415c8ab1bd26.css","precedence":"next","crossOrigin":"$undefined","non [...]
+13:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"OutletBoundary"]
+14:"$Sreact.suspense"
+16:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"ViewportBoundary"]
+18:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"MetadataBoundary"]
+b:["$","h1",null,{"className":"next-error-h1","style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:1:props:style","children":404}]
+c:["$","div",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:style","children":["$","h2",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style","children":"This page could not be found."}]}]
+d:["$","$1","c",{"children":[null,["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}]
+e:["$","$1","c",{"children":[null,["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}]
+f:["$","$1","c",{"children":["$L12",[["$","script","script-0",{"src":"/_next/static/chunks/00b00679782d0ffd.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/3562882a488c4fbb.js","async":true,"nonce":"$undefined"}]],["$","$L13",null,{"children":["$","$14",null,{"name":"Next.MetadataOutlet","children":"$@15"}]}]]}]
+10:["$","$1","h",{"children":[null,["$","$L16",null,{"children":"$L17"}],["$","div",null,{"hidden":true,"children":["$","$L18",null,{"children":["$","$14",null,{"name":"Next.Metadata","children":"$L19"}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}]
+1a:I[47873,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"default"]
+12:["$","main",null,{"className":"min-h-screen px-6 py-16 md:px-12","children":["$","article",null,{"className":"mx-auto max-w-5xl","children":[["$","header",null,{"className":"mb-10","children":[["$","time",null,{"className":"text-sm font-medium text-fd-muted-foreground","children":"December 29, 2023"}],["$","h1",null,{"className":"mt-3 text-3xl font-extrabold tracking-tight text-fd-foreground md:text-5xl","children":"Iggy.rs - building message streaming in Rust"}],["$","p",null,{"class [...]
+4b:I[24110,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"Image"]
+4c:I[44324,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"CodeBlock"]
+1b:["$","p",null,{"children":["And this is how the ",["$","$L1a",null,{"href":"https://iggy.rs","children":"Iggy.rs"}]," was born. The name is an abbreviation of the Italian Greyhound (yes, I own ",["$","$L1a",null,{"href":"https://www.instagram.com/fabio.and.cookie/","children":"two of them"}],"), small yet extremely fast dogs, the best in their class."]}]
+1c:["$","p",null,{"children":["$","$L4b",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"image","src":{"src":"/_next/static/media/iggys.d5bf7cfc.jpeg","width":1506,"height":1282,"blurWidth":8,"blurHeight":7,"blurDataURL":"data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAAQABAAD/wAARCAAHAAgDAREAAhEBAxEB/9sAQwAKBwcIBwYKCAgICwoKCw4YEA4NDQ4dFRYRGCMfJSQiHyIhJis3LyYpNCkhIjBBMTQ5Oz4+PiUuRElDPEg3PT47/9sAQwEKCwsODQ4cEBAcOygiKDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Oz [...]
+1d:["$","p",null,{"children":["Therefore, what I want, or actually ",["$","strong",null,{"children":"what we want"}]," (since there's a few of us working on it already) for Iggy.rs to be - the best message streaming platform in its class. ",["$","strong",null,{"children":"Lightweight"}]," in terms of the resource consumption, ",["$","strong",null,{"children":"fast"}]," (and predictable) when it comes to the throughput and latency, and ",["$","strong",null,{"children":"easy to use"}]," wh [...]
+1e:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"project","children":[["$","a",null,{"data-card":"","href":"#project","className":"peer","children":"Project"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground o [...]
+1f:["$","p",null,{"children":["At the very beginning, Iggy had rather limited functionality, and everything was handled using the ",["$","$L1a",null,{"href":"https://www.chromium.org/quic/","children":"QUIC"}]," protocol based on ",["$","$L1a",null,{"href":"https://github.com/quinn-rs/quinn","children":"Quinn"}]," library. You could connect multiple applications into the server, and start exchanging the messages between them, simply by appending the data to the stream (from the producer [...]
+20:["$","p",null,{"children":["After spending a few weeks on building the initial version, and then another few weeks on rewriting its core part (yes, prototyping + validation repeated in a continuous loop worked quite well), I managed to implement the persistent streaming server being capable of parallel writes/reads to/from independent streams supporting many distinct apps connected into it. Simply put, one could easily have many applications, and even ",["$","strong",null,{"children": [...]
+21:["$","p",null,{"children":["On top of this, the support for ",["$","strong",null,{"children":"TCP"}]," and ",["$","strong",null,{"children":"HTTP"}]," protocols have been added. Under the hood, the typical architecture of streams, consisting of the topics being split into the partitions, which eventually operate on a raw file data using so-called segments has been implemented as well."]}]
+22:["$","p",null,{"children":["$","$L4b",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"image","src":{"src":"/_next/static/media/iggy_sample.4c2d3682.jpeg","width":4064,"height":2408,"blurWidth":8,"blurHeight":5,"blurDataURL":"data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAAQABAAD/wAARCAAFAAgDAREAAhEBAxEB/9sAQwAKBwcIBwYKCAgICwoKCw4YEA4NDQ4dFRYRGCMfJSQiHyIhJis3LyYpNCkhIjBBMTQ5Oz4+PiUuRElDPEg3PT47/9sAQwEKCwsODQ4cEBAcOygiKDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7 [...]
+23:["$","p",null,{"children":[["$","strong",null,{"children":"It was one of the \"aha\" moments"}],", when reimplementing the parallel access to the data with the usage of underlying synchronization mechanism (",["$","em",null,{"children":"RwLock"}]," etc.), optimized data structures e.g. for dealing with ",["$","$L1a",null,{"href":"https://crates.io/crates/bytes","children":"bytes"}],", along with the ",["$","$L1a",null,{"href":"https://tokio.rs","children":"Tokio"}]," ",["$","strong",n [...]
+24:["$","p",null,{"children":["I do believe, that somewhere at this point I had realized, that ",["$","strong",null,{"children":"Iggy might actually become something useful"}]," - not just a toy project, to be abandoned after reaching its initial goal (which was sort of already achieved)."]}]
+4d:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+26:["$","p",null,{"children":["After running some benchmarks (yes, we have a dedicated app for the ",["$","strong",null,{"children":["$","$L1a",null,{"href":"https://github.com/apache/iggy/tree/master/core/bench","children":"benchmarking purposes"}]}],") and seeing the promising numbers (",["$","strong",null,{"children":"range of 2-6 GB/s for both, writes & reads when processing millions of messages"}],"), I eventually decided to give it a long-term shot. Being fully aware that there's s [...]
+27:["$","p",null,{"children":["$","$L4b",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"image","src":{"src":"/_next/static/media/iggy_bench.d3c96948.jpeg","width":3494,"height":1750,"blurWidth":8,"blurHeight":4,"blurDataURL":"data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAAQABAAD/wAARCAAEAAgDAREAAhEBAxEB/9sAQwAKBwcIBwYKCAgICwoKCw4YEA4NDQ4dFRYRGCMfJSQiHyIhJis3LyYpNCkhIjBBMTQ5Oz4+PiUuRElDPEg3PT47/9sAQwEKCwsODQ4cEBAcOygiKDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O [...]
+28:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"team","children":[["$","a",null,{"data-card":"","href":"#team","className":"peer","children":"Team"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 [...]
+29:["$","p",null,{"children":["At the time of writing this post, ",["$","strong",null,{"children":"Iggy consists of around 10 members"}]," contributing to its different parts. Some of us do work on the core streaming server, while the other ones are focused on SDKs for the different programming languages or tooling such as Web UI or CLI - all these projects are equally important, as they add up to the overall ecosystem. But how do you actually gather a team of open source contributors, w [...]
+2a:["$","p",null,{"children":["Well, I wish I had an answer to that question - honestly, in case of Iggy I wasn't actually looking for anyone, as I didn't think this could be an interesting project to work on (except for myself). Then how did that happen anyway? There were only 2 things in common - all the people that joined the project were part of the same Discord communities, yet more importantly ",["$","strong",null,{"children":"they all shared the passion for programming"}],", and I [...]
+2b:["$","p",null,{"children":["$","$L4b",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"image","src":{"src":"/_next/static/media/iggy_server.4f75ea73.jpeg","width":4088,"height":1610,"blurWidth":8,"blurHeight":3,"blurDataURL":"data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAAQABAAD/wAARCAADAAgDAREAAhEBAxEB/9sAQwAKBwcIBwYKCAgICwoKCw4YEA4NDQ4dFRYRGCMfJSQiHyIhJis3LyYpNCkhIjBBMTQ5Oz4+PiUuRElDPEg3PT47/9sAQwEKCwsODQ4cEBAcOygiKDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7 [...]
+2c:["$","p",null,{"children":"For example, when I asked one guy what was the reason behind building an SDK in Go, the reply was the need of playing with and learning a new language. Why C# SDK? Well, the other guy wanted to dive more into the low-level concepts and decided to squeeze out great performance from the managed runtime. Why build Web UI in Svelte? At work, I mostly use React, and I wanted to learn a new framework - another member said."}]
+2d:["$","p",null,{"children":["My point is - as long as you believe in what you're building, and you're consistent about it (it was one of the main reasons why I've been contributing to Iggy every day since its inception, and still doing so), there's a chance that someone out there will notice it and happily join you in your efforts. ",["$","strong",null,{"children":"Lead by example, or whatever you call it."}]]}]
+2e:["$","p",null,{"children":["At the same time, we've started receiving the first, ",["$","strong",null,{"children":"external contributions from all around the world"}]," - whether talking about simpler tasks, or the more sophisticated ones, requiring significant amount of time being spent on both, the implementation and the discussions to eventually deliver the code."]}]
+2f:["$","p",null,{"children":"It gave us even more confidence, that there are other people (outside our internal bubble), who find this project to be interesting and worth spending their time. And without all these amazing contributors, it'd be much harder (or even impossible) to deliver so many features."}]
+30:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"features","children":[["$","a",null,{"data-card":"","href":"#features","className":"peer","children":"Features"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-foregroun [...]
+31:["$","p",null,{"children":"At first, let me just point out some of the properties and features that are part of the core streaming server:"}]
+32:["$","ul",null,{"children":["\n",["$","li",null,{"children":[["$","strong",null,{"children":"Highly performant"}],", persistent append-only log for the message streaming"]}],"\n",["$","li",null,{"children":[["$","strong",null,{"children":"Very high throughput"}]," for both writes and reads"]}],"\n",["$","li",null,{"children":[["$","strong",null,{"children":"Low latency and predictable resource usage"}]," thanks to the Rust compiled language (no GC)"]}],"\n",["$","li",null,{"children": [...]
+33:["$","p",null,{"children":"And as already mentioned, we've been working on SDKs for the multiple programming languages:"}]
+34:["$","ul",null,{"children":["\n",["$","li",null,{"children":["$","$L1a",null,{"href":"https://crates.io/crates/iggy","children":"Rust"}]}],"\n",["$","li",null,{"children":["$","$L1a",null,{"href":"https://github.com/iggy-rs/iggy-dotnet-client","children":"C#"}]}],"\n",["$","li",null,{"children":["$","$L1a",null,{"href":"https://github.com/iggy-rs/iggy-go-client","children":"Go"}]}],"\n",["$","li",null,{"children":["$","$L1a",null,{"href":"https://github.com/iggy-rs/iggy-node-client"," [...]
+35:["$","p",null,{"children":["Please keep in mind, though, that some of them e.g. for Rust or C# are more up to date with the recent server changes, while the other ones might still need to do some catching up with the latest features. However, given the amount of available methods on the server's API and the underlying TCP/UDP stack with custom serialization to be implemented from the scratch (except for HTTP transport, that's the easier one), I'd say we're doing quite ok, and I can't [...]
+36:["$","p",null,{"children":["But wait, there's even more - what would be a message streaming platform without some additional tooling for managing it? We've also been developing the ",["$","strong",null,{"children":["$","$L1a",null,{"href":"https://github.com/apache/iggy/tree/master/cmd","children":"CLI"}]}],"."]}]
+37:["$","p",null,{"children":["$","$L4b",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"image","src":{"src":"/_next/static/media/iggy_cli.ffd1cc01.jpeg","width":2942,"height":2162,"blurWidth":8,"blurHeight":6,"blurDataURL":"data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAAQABAAD/wAARCAAGAAgDAREAAhEBAxEB/9sAQwAKBwcIBwYKCAgICwoKCw4YEA4NDQ4dFRYRGCMfJSQiHyIhJis3LyYpNCkhIjBBMTQ5Oz4+PiUuRElDPEg3PT47/9sAQwEKCwsODQ4cEBAcOygiKDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs [...]
+38:["$","p",null,{"children":["As well as modern ",["$","strong",null,{"children":["$","$L1a",null,{"href":"https://github.com/iggy-rs/iggy-web-ui","children":"Web UI"}]}]," to make it happen :)"]}]
+39:["$","p",null,{"children":["$","$L4b",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"image","src":{"src":"/_next/static/media/iggy_web_ui.0f6c99cb.jpeg","width":4060,"height":2408,"blurWidth":8,"blurHeight":5,"blurDataURL":"data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAAQABAAD/wAARCAAFAAgDAREAAhEBAxEB/9sAQwAKBwcIBwYKCAgICwoKCw4YEA4NDQ4dFRYRGCMfJSQiHyIhJis3LyYpNCkhIjBBMTQ5Oz4+PiUuRElDPEg3PT47/9sAQwEKCwsODQ4cEBAcOygiKDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7 [...]
+3a:["$","p",null,{"children":["Last but not least, we've got a fully-featured ",["$","$L1a",null,{"href":"https://github.com/apache/iggy/actions","children":"CI/CD pipeline"}]," responsible for running all the checks and tests on multiple platforms, and finally producing the release artifacts and ",["$","$L1a",null,{"href":"https://hub.docker.com/u/iggyrs","children":"Docker images"}],"."]}]
+3b:["$","p",null,{"children":["$","$L4b",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"image","src":{"src":"/_next/static/media/iggy_ci_cd.51a98142.jpeg","width":2000,"height":1000,"blurWidth":8,"blurHeight":4,"blurDataURL":"data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAAQABAAD/wAARCAAEAAgDAREAAhEBAxEB/9sAQwAKBwcIBwYKCAgICwoKCw4YEA4NDQ4dFRYRGCMfJSQiHyIhJis3LyYpNCkhIjBBMTQ5Oz4+PiUuRElDPEg3PT47/9sAQwEKCwsODQ4cEBAcOygiKDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O [...]
+3c:["$","p",null,{"children":"At first glance, it might look like there's plenty of features already in place, but for anyone who has ever worked with the message streaming infrastructure before, that might be just a tip of an iceberg, thus let's discuss the roadmap."}]
+3d:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"roadmap","children":[["$","a",null,{"data-card":"","href":"#roadmap","className":"peer","children":"Roadmap"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground o [...]
+3e:["$","p",null,{"children":["After gaining some traction a few months ago (mostly due to landing on the GitHub trending page in July), we've talked to some users potentially interested in making Iggy part of their infrastructure (there's even one ",["$","$L1a",null,{"href":"https://neferdata.com","children":"company"}]," using it already), and discussed what features would be a good addition to the current stack."]}]
+3f:["$","p",null,{"children":["$","$L4b",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"image","src":{"src":"/_next/static/media/gh_trending.c393fc00.jpeg","width":2234,"height":1830,"blurWidth":8,"blurHeight":7,"blurDataURL":"data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAAQABAAD/wAARCAAHAAgDAREAAhEBAxEB/9sAQwAKBwcIBwYKCAgICwoKCw4YEA4NDQ4dFRYRGCMfJSQiHyIhJis3LyYpNCkhIjBBMTQ5Oz4+PiUuRElDPEg3PT47/9sAQwEKCwsODQ4cEBAcOygiKDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7 [...]
+40:["$","p",null,{"children":"Considering what's already there, being worked on or planned for the future releases, such as interactive CLI, modern Web UI, optional data compression and archivization, plugin support or multiple SDKs, there are at least three additional challenges to overcome:"}]
+41:["$","p",null,{"children":[["$","strong",null,{"children":"Clustering"}]," - the possibility of having a ",["$","strong",null,{"children":"highly available and fault tolerant"}]," distributed message streaming platform in a production environment, is typically one of the most important aspects when considering the particular tool. While it wouldn't be too difficult to implement the extension (think of a simple proxy/load balancer), allowing to monitor and deliver the data either to th [...]
+42:["$","p",null,{"children":["$","$L4b",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"image","src":{"src":"/_next/static/media/leader_elections.a60bb3b7.jpeg","width":4058,"height":2316,"blurWidth":8,"blurHeight":5,"blurDataURL":"data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAAQABAAD/wAARCAAFAAgDAREAAhEBAxEB/9sAQwAKBwcIBwYKCAgICwoKCw4YEA4NDQ4dFRYRGCMfJSQiHyIhJis3LyYpNCkhIjBBMTQ5Oz4+PiUuRElDPEg3PT47/9sAQwEKCwsODQ4cEBAcOygiKDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs [...]
+43:["$","p",null,{"children":[["$","strong",null,{"children":"Low-level I/O"}]," - although the current results (based on the benchmarking tool measuring the throughput etc.) are satisfying, we strongly believe that there's still (potentially a huge) room for improvement. We're planning to use ",["$","strong",null,{"children":["$","$L1a",null,{"href":"https://unixism.net/loti/what_is_io_uring.html","children":"io_uring"}]}]," for all I/O operations (disk or network related). The brand ne [...]
+44:["$","p",null,{"children":[["$","strong",null,{"children":"Thread-per-core"}]," - in order to avoid the rather costly context switches due to the usage of synchronization mechanism when accessing the data from the different threads (e.g. via Tokio's work stealing mechanism), we're planning to explore (or actually, already doing it, in the previously mentioned repository for clustering sandbox) thread-per-core architecture, once again, delivered as part of ",["$","strong",null,{"childr [...]
+45:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"future","children":[["$","a",null,{"data-card":"","href":"#future","className":"peer","children":"Future"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opac [...]
+46:["$","p",null,{"children":[["$","strong",null,{"children":"Why building another message streaming then?"}]," A few months ago, I would probably answer - strictly for fun. Yet, after exploring more in-depth the status quo, what we would like to achieve is sort of twofold - on one hand, it'd be great to deliver the general-purpose tool, such as Kafka. On the other hand, why not to try and really push hard the OS and hardware to its limits when speaking of the performance, reliability, t [...]
+47:["$","p",null,{"children":["Only the time will tell, but ",["$","strong",null,{"children":"we're already excited enough to challenge ourselves"}],". We'd love to hear your thoughts, ideas and ",["$","strong",null,{"children":"feedback"}]," - anything that will help us in building the best message streaming platform in Rust that you will enjoy using! Feel free to join our ",["$","$L1a",null,{"href":"https://discord.gg/apache-iggy","children":"Discord"}]," community and let us know what [...]
+48:["$","p",null,{"children":"P.S."}]
+49:["$","p",null,{"children":["This blog uses ",["$","$L1a",null,{"href":"https://www.getzola.org/","children":"Rust"}],"."]}]
+4a:["$","footer",null,{"className":"mt-16 border-t border-fd-border pt-8","children":["$","$L9",null,{"href":"/blogs","className":"inline-flex items-center gap-2 text-sm font-medium text-fd-primary transition-colors hover:opacity-80","children":"← Back to all posts"}]}]
+4f:I[44324,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"Pre"]
+4e:["$","$L4f",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"let"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" polled_messages "}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"="}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E [...]
+50:["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" None"}]
+51:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]
+52:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" strategy"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" PollingStrategy"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"::"}],["$","span",null,{"style":{"--s [...]
+53:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" count"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" 10"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+54:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" auto_commit"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" true"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]]}]
+55:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"})"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":".await?"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":";"}]]}]
+17:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
+56:I[27201,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"IconMark"]
+15:null
+19:[["$","title","0",{"children":"Iggy.rs - building message streaming in Rust | Apache Iggy"}],["$","link","1",{"rel":"icon","href":"/img/favicon.png"}],["$","$L56","2",{}]]
diff --git a/blogs/2024/05/29/one-year-of-building-the-message-streaming/__next.!KHNpdGUp.blogs.$c$slug.__PAGE__.txt b/blogs/2024/05/29/one-year-of-building-the-message-streaming/__next.!KHNpdGUp.blogs.$c$slug.__PAGE__.txt
new file mode 100644
index 00000000..3ff5be9c
--- /dev/null
+++ b/blogs/2024/05/29/one-year-of-building-the-message-streaming/__next.!KHNpdGUp.blogs.$c$slug.__PAGE__.txt
@@ -0,0 +1,58 @@
+1:"$Sreact.fragment"
+2:I[47873,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"default"]
+35:I[24110,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"Image"]
+36:I[22016,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],""]
+37:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"OutletBoundary"]
+38:"$Sreact.suspense"
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","c",{"children":[["$","main",null,{"className":"min-h-screen px-6 py-16 md:px-12","children":["$","article",null,{"className":"mx-auto max-w-5xl","children":[["$","header",null,{"className":"mb-10","children":[["$","time",null,{"className":"text-sm font-medium text-fd-muted-foreground","children":"May 29, 2024"}],["$","h1",null,{"className":"mt-3 text-3xl font-extrabold tracking-tight text-fd-foreground md:text-5xl","children":"Iggy.rs [...]
+3:["$","p",null,{"children":["$","$L35",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"image","src":{"src":"/_next/static/media/iggy_stars.5e23fec1.png","width":795,"height":542,"blurWidth":8,"blurHeight":5,"blurDataURL":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAFCAYAAAB4ka1VAAAAZElEQVR42k2OWQ6AIAxEuYAoIFLWCPH+VxxbxcSPl2a2pIpyR6wDq4twocL6DGMJjrVllBQMm4sJD5qRUE+tUrugeSH8l99AHenExobfE4wjrFKe4VughlIG0vwl8BWodvjYcAPpazJO7CwojgAAAABJRU5ErkJggg=="} [...]
+4:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"community","children":[["$","a",null,{"data-card":"","href":"#community","className":"peer","children":"Community"}],["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 trans [...]
+5:["$","p",null,{"children":["First and foremost, if it weren't for the community, we wouldn't have seen such an enormous growth of the Iggy's ecosystem — we've received the dozens of pull requests and there's ~250 members on our ",["$","$L2",null,{"href":"https://discord.gg/apache-iggy","children":"Discord"}],". Whether we talk about bug fixes, improvements, new features, or just sharing the experiences and discussing potential ideas — it's all equally important."]}]
+6:["$","p",null,{"children":["And it's been even more than that — we've seen our community members take on ",["$","strong",null,{"children":"building the new SDKs"}]," in their favorite programming languages, fully on their own. Today, you can find the following list of supported SDKs for Iggy.rs — some of them could be lagging behind, but it's expected, as the project is still evolving, and it's not an easy task, to come up with a great development experience from the very beginning."]}]
+7:["$","ul",null,{"children":["\n",["$","li",null,{"children":["$","$L2",null,{"href":"https://github.com/apache/iggy","children":"Rust"}]}],"\n",["$","li",null,{"children":["$","$L2",null,{"href":"https://github.com/iggy-rs/iggy-dotnet-client","children":"C#"}]}],"\n",["$","li",null,{"children":["$","$L2",null,{"href":"https://github.com/iggy-rs/iggy-cpp-client","children":"C++"}]}],"\n",["$","li",null,{"children":["$","$L2",null,{"href":"https://github.com/iggy-rs/iggy-node-client","ch [...]
+8:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"changelog","children":[["$","a",null,{"data-card":"","href":"#changelog","className":"peer","children":"Changelog"}],["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 trans [...]
+9:["$","p",null,{"children":"Adding the brand new SDKs wasn't the only great thing that has happened during last few months. We've also made quite a lot of improvements for the streaming server itself:"}]
+a:["$","ul",null,{"children":["\n",["$","li",null,{"children":"Increased the streaming server throughput by over 30% for both writes and reads"}],"\n",["$","li",null,{"children":"Added messages compression for client-side & server-side supporting the different algorithms"}],"\n",["$","li",null,{"children":"Implemented a new way of message batching with an additional tooling for data migration"}],"\n",["$","li",null,{"children":"Fixed the possible server-side deadlock that could happen fo [...]
+b:["$","p",null,{"children":"And at the same time, we've been experimenting a lot with some fancy stuff, which you can read about in the last paragraphs :)"}]
+c:["$","p",null,{"children":["$","$L35",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"image","src":{"src":"/_next/static/media/iggy_perf.c89a7ea7.png","width":2117,"height":367,"blurWidth":8,"blurHeight":1,"blurDataURL":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAABCAYAAADjAO9DAAAAGklEQVR42mPg4+f7z8rK+p+ZmRkDMzEx/QcAgSgIZsYChBAAAAAASUVORK5CYII="},"placeholder":"blur","className":"rounded-lg"}]}]
+d:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"tooling","children":[["$","a",null,{"data-card":"","href":"#tooling","className":"peer","children":"Tooling"}],["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition- [...]
+e:["$","p",null,{"children":["The core message streaming server and multiple SDKs might sound as the most important parts of the whole ecosystem, but let's not forget about the ",["$","strong",null,{"children":"management tools"}],". How to quickly connect to the server, create new topics, validate if the messages are being sent correctly, change the user permissions or check the node statistics?"]}]
+f:["$","p",null,{"children":["This is where our ",["$","strong",null,{"children":[["$","$L2",null,{"href":"https://github.com/apache/iggy/tree/master/core/cli","children":"CLI"}]," and ",["$","$L2",null,{"href":"https://github.com/iggy-rs/iggy-web-ui","children":"Web UI"}]," come in handy"]}],". If you're a fan of working with the terminal and used to the great developer experience, you'll find our CLI a joy to work with."]}]
+10:["$","p",null,{"children":["$","$L35",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"image","src":{"src":"/_next/static/media/iggy_cli.6f56bf04.png","width":1743,"height":766,"blurWidth":8,"blurHeight":4,"blurDataURL":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAECAYAAACzzX7wAAAAQ0lEQVR42mXMOQ7AIAxEUYOwbHmrfP+rTkRSBYrXjL6GRATbWgtzzguZGaoKzIwxxoUiAt2NHb4D0Z+7IzOhqt/lETx91CGCKbRFjQAAAABJRU5ErkJggg=="},"placeholder":"blur","className":"rounded-lg"}]}]
+11:["$","p",null,{"children":"On the other hand, if you prefer a graphical interface accessible via your browser, Web UI has got you covered. What's even more impressive, is that both of these tools have been developed by the single developers."}]
+12:["$","p",null,{"children":["$","$L35",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"image","src":{"src":"/_next/static/media/iggy_web.d8f09397.png","width":2559,"height":1353,"blurWidth":8,"blurHeight":4,"blurDataURL":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAECAYAAACzzX7wAAAASklEQVR42nWKQRKAIAwD+x4HRmhpAYWL//9T1I5HOewkmSyJdlibjtaBYsPz3ee8QHEXsDRw6U7+uujh0BYSEpsff1CI+RHqUrgBREMzrbnu6jMAAAAASUVORK5CYII="},"placeholder":"blur","className":" [...]
+13:["$","p",null,{"children":["Last but not least, in order to run the benchmarks, we have our own ",["$","$L2",null,{"href":"https://github.com/apache/iggy/tree/master/core/bench","children":"bench"}]," available as a part of the core repository — you can easily configure the number of producers, consumers, streams, etc. and get an overview of the possible streaming performance on your machine."]}]
+14:["$","p",null,{"children":["$","$L35",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"image","src":{"src":"/_next/static/media/iggy_bench.5fe87533.png","width":1891,"height":803,"blurWidth":8,"blurHeight":3,"blurDataURL":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAADCAYAAACuyE5IAAAAQklEQVR42l3MwQ7AEBBF0dm3tI1UjCGIRPz/Dz5ix+LuTi5VZ1F+g/BqsL7B6tqiHgVNGMl8C/kDUQ8eeR7kUasTDKCFHY3Ur3EVAAAAAElFTkSuQmCC"},"placeholder":"blur","className":"rounded-lg"}]}]
+15:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"early-adopters","children":[["$","a",null,{"data-card":"","href":"#early-adopters","className":"peer","children":"Early adopters"}],["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground [...]
+16:["$","p",null,{"children":"Overall, coding and implementing new features is one side of the story, the other is making an actual use of it. You might have the most sophisticated/performant/reliable (you name it) tooling out there, however, if no one is using it or at least experimenting with it, how could you possibly know whether it's even worth an effort to continue with the further development of the project? Well, I truly wish I had an easy answer how to find users willing to play [...]
+17:["$","p",null,{"children":"In our case, I do believe, that it was a mix of two things — a limited amount of such tooling in the Rust ecosystem (so that the language enthusiasts could to try out something fresh), as well as a much more lightweight and (hopefully) performant message streaming infrastructure than some of the well-established solutions."}]
+18:["$","p",null,{"children":["I'm fully aware that it's a bold claim, and running the synthetic benchmarks is not a viable proof (e.g. on my 7950X, I was able to hit ",["$","strong",null,{"children":"3GB/s writes and up to 10 GB/s reads"}]," with some additional caching enabled), yet, most of our early adopters were very happy with their results e.g. outnumbering Kafka while utilizing much less memory. For example, ",["$","$L2",null,{"href":"https://github.com/apache/iggy/issues/606","c [...]
+19:["$","blockquote",null,{"children":["\n",["$","p",null,{"children":"20 million msg/sec via tcp is pretty nuts and already blows several commercial systems out of the water."}],"\n"]}]
+1a:["$","p",null,{"children":["And he's not the only one who found Iggy.rs to be the right tool for his needs. For example, a few days ago, one of the users on our Discord said that thanks to Iggy he was able to ",["$","strong",null,{"children":"achieve 2ms latency when compared to 300ms"}]," with Kafka. Again, just to make it clear, I'm not saying that we're better than X or Y — I'm simply stating that for some specific usages, we might be a better choice than X or Y."]}]
+1b:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"clustering--replication","children":[["$","a",null,{"data-card":"","href":"#clustering--replication","className":"peer","children":"Clustering & replication"}],["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrin [...]
+1c:["$","p",null,{"children":"One of the most frequent questions we receive is whether we plan to incorporate some sort of data replication feature. Without any doubts, especially when considering the general system resiliency and reliability, being able to spin up a cluster of the particular piece of infrastructure (database/messaging/streaming/logging etc.) is quite often a critical feature."}]
+1d:["$","p",null,{"children":["And yes, we will certainly implement clustering in Iggy — as a matter of fact, we've already built its basic version in the ",["$","$L2",null,{"href":"https://github.com/iggy-rs/iggy-cluster-sandbox","children":"sandbox repository"}],". In order to achieve that, we've decided to (at least for now) stick to the ",["$","$L2",null,{"href":"https://raft.github.io","children":"Raft"}]," consensus algorithm. However, adding the data replication feature to the cor [...]
+1e:["$","p",null,{"children":["$","$L35",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"image","src":{"src":"/_next/static/media/iggy_cluster.45c5ba16.png","width":2552,"height":1276,"blurWidth":8,"blurHeight":4,"blurDataURL":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAECAYAAACzzX7wAAAATElEQVR42i2MSw4AIQxCXRrtD+9/V0Y6Lkhf6AvDzDjn5FqLHt43IqhePIDqQsFBP6rqJrn35siMBnenZLGEvEIvmP9TEs5bANCs/gNIviTXgcxFfAAAAABJRU5ErkJggg=="},"placeholder":"blur","clas [...]
+1f:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"io_uring--thread-per-core--share-nothing","children":[["$","a",null,{"data-card":"","href":"#io_uring--thread-per-core--share-nothing","className":"peer","children":"io_uring & thread-per-core + share-nothing"}],["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"r [...]
+20:["$","p",null,{"children":["What is a message streaming server, besides some more-or-less complicated logic regarding topics, partitioning, message ordering, consumer groups and a few more features? In its very core, ",["$","strong",null,{"children":"it's mostly I/O (disk + networking)"}]," — the more efficient you can make it, the greater it will be. Of course, there's a major difference between throughput and latency, especially when talking about the so-called tail latency (p99 and [...]
+21:["$","p",null,{"children":["However, due to the nature of tasks being shared across the different threads, ",["$","strong",null,{"children":"you can't simply avoid lots of context switches and data being shared & synchronized across these threads"}]," (therefore even more context switches will occur). While it's probably not an issue for like 90% or maybe even 99% use-cases, there might be some (financial systems and similar), where an unpredictable tail latency is a total no-go."]}]
+22:["$","p",null,{"children":["Certainly, there are already existing solutions dealing with such challenges, such as ",["$","$L2",null,{"href":"https://aeron.io","children":"Aeron"}],", but ",["$","strong",null,{"children":"we do believe, that we can make Iggy something much easier to use"}]," — one that can handle the typical workloads, as well as the very demanding ones, without the need of getting a PhD in specific tooling :)"]}]
+23:["$","p",null,{"children":["We've decided to ",["$","strong",null,{"children":["experiment with ",["$","$L2",null,{"href":"https://unixism.net/loti/what_is_io_uring.html","children":"io_uring"}]," to maximize the I/O performance"]}]," (and at the same time vastly reduce the need of context switches), and at the same time utilize ",["$","strong",null,{"children":"thread-per-core architecture"}],", where ",["$","strong",null,{"children":"each thread is pinned to the CPU core"}],", thus [...]
+24:["$","p",null,{"children":["And just recently, we've established yet another ",["$","$L2",null,{"href":"https://github.com/iggy-rs/iggy-thread-per-core-sandbox","children":"sandbox repository"}]," to tackle the different challenges before deciding on the best solution possible and merging these changes into core Iggy streaming server."]}]
+25:["$","p",null,{"children":["$","$L35",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"image","src":{"src":"/_next/static/media/iggy_tpc.a0bc9e74.png","width":2298,"height":1232,"blurWidth":8,"blurHeight":4,"blurDataURL":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAECAYAAACzzX7wAAAASElEQVR42m3MsQrAMAhFUUOiLqKDOPj/H/pKWgItdLjb4VJ3IzNhZlhrYc6JMQaI6GmDqkJEQETAzF90gLtDVW+0T7/gHN7gAgOHI1PkicaLAAAAAElFTkSuQmCC"},"placeholder":"blur","className":"roun [...]
+26:["$","p",null,{"children":"So far, we've got a very simple prototype in place, but there's still lots to be done, especially when thinking of:"}]
+27:["$","ul",null,{"children":["\n",["$","li",null,{"children":"How to evenly split partitions (the unit of data parallelism) between multiple cores?"}],"\n",["$","li",null,{"children":["How to efficiently rewrite existing server metadata heavily relying on synchronized data with ",["$","code",null,{"children":"Arc<>"}]," and ",["$","code",null,{"children":"RwLock<>"}],"?"]}],"\n",["$","li",null,{"children":"Should we load into memory the same server metadata across all the threads (sepa [...]
+28:["$","p",null,{"children":["This is just the tip of an iceberg, and we've already started ",["$","$L2",null,{"href":"https://penberg.org/papers/tpc-ancs19.pdf","children":"studying"}]," some of the existing solutions out there, including ",["$","$L2",null,{"href":"https://seastar.io","children":"Seastar"}]," framework. As you can see, this part has to be done before the clustering, as it involves lots of changes not only regarding the disk I/O, but also networking I/O."]}]
+29:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"production-readiness","children":[["$","a",null,{"data-card":"","href":"#production-readiness","className":"peer","children":"Production readiness"}],["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-f [...]
+2a:["$","p",null,{"children":"Is it ready for production deployment? When you look at the versioning, Rust SDK is at 0.4.* and the server is currently at 0.2.*, which may look like a very long way from v1.0."}]
+2b:["$","p",null,{"children":["As mentioned before, ",["$","strong",null,{"children":"some of our users already experiment with Iggy"}]," — and simply because of this, we haven't really introduced any significant breaking changes (except one regarding data compression, which was handled by the provided data migration feature)."]}]
+2c:["$","p",null,{"children":["We can't guarantee that it will always be like this, but at least for now, we do not see anything that would dramatically impact the existing solution. One of such things could be the ",["$","strong",null,{"children":"redesigned storage, I/O, and clustering feature"}]," (as described in the previous paragraph), but even then, we'll do our best to make it as seamless upgrade as possible — and once we achieve that, it means, we're getting very close to the ve [...]
+2d:["$","p",null,{"children":["For the time being, if you're fine with a ",["$","strong",null,{"children":"single-node solution that delivers a really good message streaming performance"}],", give Iggy a try, or at least run the benchmarks to see what are its possibilities and please share your results and thoughts on our ",["$","$L2",null,{"href":"https://discord.gg/apache-iggy","children":"Discord"}]," — ",["$","strong",null,{"children":"your opinion is really important to us and we re [...]
+2e:["$","p",null,{"children":"It's been a very productive year for our core team (we've been and still are doing this in our free time), and once again, huge thanks to all our supporters and contributors!"}]
+2f:["$","p",null,{"children":["$","strong",null,{"children":"We've got the fundamentals right, now it's high time to make Iggy blazingly fast!"}]}]
+30:["$","p",null,{"children":["$","$L35",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"image","src":{"src":"/_next/static/media/iggy_rocket.3360a060.png","width":1920,"height":1080,"blurWidth":8,"blurHeight":5,"blurDataURL":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAFCAYAAAB4ka1VAAAAm0lEQVR42h2Ovw7BYBxFvz/9/FoSFS3SBYNIbB3MjYStXRhIxGKTiM0LSGxMPILB7AmPttu9Nzc5RymtEb+JtRZjDEqpOvc6IWLL7qTFPNvQ7Q/R5dkzmny54Pu8kU5GKPGE/fbEutgRBkISBvzedz6vB3EUoQbic1 [...]
+31:["$","footer",null,{"className":"mt-16 border-t border-fd-border pt-8","children":["$","$L36",null,{"href":"/blogs","className":"inline-flex items-center gap-2 text-sm font-medium text-fd-primary transition-colors hover:opacity-80","children":"← Back to all posts"}]}]
+32:["$","script","script-0",{"src":"/_next/static/chunks/00b00679782d0ffd.js","async":true}]
+33:["$","script","script-1",{"src":"/_next/static/chunks/3562882a488c4fbb.js","async":true}]
+34:["$","$L37",null,{"children":["$","$38",null,{"name":"Next.MetadataOutlet","children":"$@39"}]}]
+39:null
diff --git a/blogs/2024/05/29/one-year-of-building-the-message-streaming/__next.!KHNpdGUp.blogs.$c$slug.txt b/blogs/2024/05/29/one-year-of-building-the-message-streaming/__next.!KHNpdGUp.blogs.$c$slug.txt
new file mode 100644
index 00000000..11b31bb0
--- /dev/null
+++ b/blogs/2024/05/29/one-year-of-building-the-message-streaming/__next.!KHNpdGUp.blogs.$c$slug.txt
@@ -0,0 +1,4 @@
+1:"$Sreact.fragment"
+2:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+3:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","template":["$","$L3",null,{}]}]]}],"loading":null,"isPartial":false}
diff --git a/blogs/2024/05/29/one-year-of-building-the-message-streaming/__next.!KHNpdGUp.blogs.txt b/blogs/2024/05/29/one-year-of-building-the-message-streaming/__next.!KHNpdGUp.blogs.txt
new file mode 100644
index 00000000..11b31bb0
--- /dev/null
+++ b/blogs/2024/05/29/one-year-of-building-the-message-streaming/__next.!KHNpdGUp.blogs.txt
@@ -0,0 +1,4 @@
+1:"$Sreact.fragment"
+2:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+3:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","template":["$","$L3",null,{}]}]]}],"loading":null,"isPartial":false}
diff --git a/blogs/2024/05/29/one-year-of-building-the-message-streaming/__next.!KHNpdGUp.txt b/blogs/2024/05/29/one-year-of-building-the-message-streaming/__next.!KHNpdGUp.txt
new file mode 100644
index 00000000..ea3bfa55
--- /dev/null
+++ b/blogs/2024/05/29/one-year-of-building-the-message-streaming/__next.!KHNpdGUp.txt
@@ -0,0 +1,9 @@
+1:"$Sreact.fragment"
+2:I[83571,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Header"]
+3:I[29966,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFDropdown"]
+4:I[36330,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFMobileLinks"]
+5:I[22016,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],""]
+6:I[88760,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Logo"]
+7:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+8:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","c",{"children":[[["$","script","script-0",{"src":"/_next/static/chunks/8d86be78428a601a.js","async":true}],["$","script","script-1",{"src":"/_next/static/chunks/da34cc6305706ac6.js","async":true}],["$","script","script-2",{"src":"/_next/static/chunks/9baf65674e2de991.js","async":true}],["$","script","script-3",{"src":"/_next/static/chunks/26b70f9828dd1eb5.js","async":true}],["$","script","script-4",{"src":"/_next/static/chunks/adeed83 [...]
diff --git a/blogs/2024/05/29/one-year-of-building-the-message-streaming/__next._full.txt b/blogs/2024/05/29/one-year-of-building-the-message-streaming/__next._full.txt
new file mode 100644
index 00000000..ea1f367f
--- /dev/null
+++ b/blogs/2024/05/29/one-year-of-building-the-message-streaming/__next._full.txt
@@ -0,0 +1,79 @@
+1:"$Sreact.fragment"
+2:I[17751,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js"],"RootProvider"]
+3:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+4:I[58298,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/5a37d4cb1abe17d7.js"],"default"]
+5:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+6:I[83571,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Header"]
+7:I[29966,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFDropdown"]
+8:I[36330,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFMobileLinks"]
+9:I[22016,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],""]
+a:I[88760,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Logo"]
+11:I[68027,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+:HL["/_next/static/chunks/32a0415c8ab1bd26.css","style"]
+:HL["/_next/static/media/GeistMono_Variable.p.2f937313.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+:HL["/_next/static/media/Geist_Variable-s.p.92592eb2.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+0:{"P":null,"b":"uBHgltRE2s5QA49x61S_u","c":["","blogs","2024","05","29","one-year-of-building-the-message-streaming",""],"q":"","i":false,"f":[[["",{"children":["(site)",{"children":["blogs",{"children":[["slug","2024/05/29/one-year-of-building-the-message-streaming","c"],{"children":["__PAGE__",{}]}]}]}]},"$undefined","$undefined",true],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/32a0415c8ab1bd26.css","precedence":"next","crossOrigin":" [...]
+13:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"OutletBoundary"]
+14:"$Sreact.suspense"
+16:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"ViewportBoundary"]
+18:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"MetadataBoundary"]
+b:["$","h1",null,{"className":"next-error-h1","style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:1:props:style","children":404}]
+c:["$","div",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:style","children":["$","h2",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style","children":"This page could not be found."}]}]
+d:["$","$1","c",{"children":[null,["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}]
+e:["$","$1","c",{"children":[null,["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}]
+f:["$","$1","c",{"children":["$L12",[["$","script","script-0",{"src":"/_next/static/chunks/00b00679782d0ffd.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/3562882a488c4fbb.js","async":true,"nonce":"$undefined"}]],["$","$L13",null,{"children":["$","$14",null,{"name":"Next.MetadataOutlet","children":"$@15"}]}]]}]
+10:["$","$1","h",{"children":[null,["$","$L16",null,{"children":"$L17"}],["$","div",null,{"hidden":true,"children":["$","$L18",null,{"children":["$","$14",null,{"name":"Next.Metadata","children":"$L19"}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}]
+1a:I[47873,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"default"]
+12:["$","main",null,{"className":"min-h-screen px-6 py-16 md:px-12","children":["$","article",null,{"className":"mx-auto max-w-5xl","children":[["$","header",null,{"className":"mb-10","children":[["$","time",null,{"className":"text-sm font-medium text-fd-muted-foreground","children":"May 29, 2024"}],["$","h1",null,{"className":"mt-3 text-3xl font-extrabold tracking-tight text-fd-foreground md:text-5xl","children":"Iggy.rs — one year of building the message streaming"}],["$","p",null,{"cl [...]
+4a:I[24110,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"Image"]
+1b:["$","p",null,{"children":["$","$L4a",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"image","src":{"src":"/_next/static/media/iggy_stars.5e23fec1.png","width":795,"height":542,"blurWidth":8,"blurHeight":5,"blurDataURL":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAFCAYAAAB4ka1VAAAAZElEQVR42k2OWQ6AIAxEuYAoIFLWCPH+VxxbxcSPl2a2pIpyR6wDq4twocL6DGMJjrVllBQMm4sJD5qRUE+tUrugeSH8l99AHenExobfE4wjrFKe4VughlIG0vwl8BWodvjYcAPpazJO7CwojgAAAABJRU5ErkJggg==" [...]
+1c:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"community","children":[["$","a",null,{"data-card":"","href":"#community","className":"peer","children":"Community"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-foregr [...]
+1d:["$","p",null,{"children":["First and foremost, if it weren't for the community, we wouldn't have seen such an enormous growth of the Iggy's ecosystem — we've received the dozens of pull requests and there's ~250 members on our ",["$","$L1a",null,{"href":"https://discord.gg/apache-iggy","children":"Discord"}],". Whether we talk about bug fixes, improvements, new features, or just sharing the experiences and discussing potential ideas — it's all equally important."]}]
+1e:["$","p",null,{"children":["And it's been even more than that — we've seen our community members take on ",["$","strong",null,{"children":"building the new SDKs"}]," in their favorite programming languages, fully on their own. Today, you can find the following list of supported SDKs for Iggy.rs — some of them could be lagging behind, but it's expected, as the project is still evolving, and it's not an easy task, to come up with a great development experience from the very beginning."]}]
+1f:["$","ul",null,{"children":["\n",["$","li",null,{"children":["$","$L1a",null,{"href":"https://github.com/apache/iggy","children":"Rust"}]}],"\n",["$","li",null,{"children":["$","$L1a",null,{"href":"https://github.com/iggy-rs/iggy-dotnet-client","children":"C#"}]}],"\n",["$","li",null,{"children":["$","$L1a",null,{"href":"https://github.com/iggy-rs/iggy-cpp-client","children":"C++"}]}],"\n",["$","li",null,{"children":["$","$L1a",null,{"href":"https://github.com/iggy-rs/iggy-node-client [...]
+20:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"changelog","children":[["$","a",null,{"data-card":"","href":"#changelog","className":"peer","children":"Changelog"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-foregr [...]
+21:["$","p",null,{"children":"Adding the brand new SDKs wasn't the only great thing that has happened during last few months. We've also made quite a lot of improvements for the streaming server itself:"}]
+22:["$","ul",null,{"children":["\n",["$","li",null,{"children":"Increased the streaming server throughput by over 30% for both writes and reads"}],"\n",["$","li",null,{"children":"Added messages compression for client-side & server-side supporting the different algorithms"}],"\n",["$","li",null,{"children":"Implemented a new way of message batching with an additional tooling for data migration"}],"\n",["$","li",null,{"children":"Fixed the possible server-side deadlock that could happen f [...]
+23:["$","p",null,{"children":"And at the same time, we've been experimenting a lot with some fancy stuff, which you can read about in the last paragraphs :)"}]
+24:["$","p",null,{"children":["$","$L4a",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"image","src":{"src":"/_next/static/media/iggy_perf.c89a7ea7.png","width":2117,"height":367,"blurWidth":8,"blurHeight":1,"blurDataURL":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAABCAYAAADjAO9DAAAAGklEQVR42mPg4+f7z8rK+p+ZmRkDMzEx/QcAgSgIZsYChBAAAAAASUVORK5CYII="},"placeholder":"blur","className":"rounded-lg"}]}]
+25:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"tooling","children":[["$","a",null,{"data-card":"","href":"#tooling","className":"peer","children":"Tooling"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground o [...]
+26:["$","p",null,{"children":["The core message streaming server and multiple SDKs might sound as the most important parts of the whole ecosystem, but let's not forget about the ",["$","strong",null,{"children":"management tools"}],". How to quickly connect to the server, create new topics, validate if the messages are being sent correctly, change the user permissions or check the node statistics?"]}]
+27:["$","p",null,{"children":["This is where our ",["$","strong",null,{"children":[["$","$L1a",null,{"href":"https://github.com/apache/iggy/tree/master/core/cli","children":"CLI"}]," and ",["$","$L1a",null,{"href":"https://github.com/iggy-rs/iggy-web-ui","children":"Web UI"}]," come in handy"]}],". If you're a fan of working with the terminal and used to the great developer experience, you'll find our CLI a joy to work with."]}]
+28:["$","p",null,{"children":["$","$L4a",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"image","src":{"src":"/_next/static/media/iggy_cli.6f56bf04.png","width":1743,"height":766,"blurWidth":8,"blurHeight":4,"blurDataURL":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAECAYAAACzzX7wAAAAQ0lEQVR42mXMOQ7AIAxEUYOwbHmrfP+rTkRSBYrXjL6GRATbWgtzzguZGaoKzIwxxoUiAt2NHb4D0Z+7IzOhqt/lETx91CGCKbRFjQAAAABJRU5ErkJggg=="},"placeholder":"blur","className":"rounded-lg"}]}]
+29:["$","p",null,{"children":"On the other hand, if you prefer a graphical interface accessible via your browser, Web UI has got you covered. What's even more impressive, is that both of these tools have been developed by the single developers."}]
+2a:["$","p",null,{"children":["$","$L4a",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"image","src":{"src":"/_next/static/media/iggy_web.d8f09397.png","width":2559,"height":1353,"blurWidth":8,"blurHeight":4,"blurDataURL":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAECAYAAACzzX7wAAAASklEQVR42nWKQRKAIAwD+x4HRmhpAYWL//9T1I5HOewkmSyJdlibjtaBYsPz3ee8QHEXsDRw6U7+uujh0BYSEpsff1CI+RHqUrgBREMzrbnu6jMAAAAASUVORK5CYII="},"placeholder":"blur","className":" [...]
+2b:["$","p",null,{"children":["Last but not least, in order to run the benchmarks, we have our own ",["$","$L1a",null,{"href":"https://github.com/apache/iggy/tree/master/core/bench","children":"bench"}]," available as a part of the core repository — you can easily configure the number of producers, consumers, streams, etc. and get an overview of the possible streaming performance on your machine."]}]
+2c:["$","p",null,{"children":["$","$L4a",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"image","src":{"src":"/_next/static/media/iggy_bench.5fe87533.png","width":1891,"height":803,"blurWidth":8,"blurHeight":3,"blurDataURL":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAADCAYAAACuyE5IAAAAQklEQVR42l3MwQ7AEBBF0dm3tI1UjCGIRPz/Dz5ix+LuTi5VZ1F+g/BqsL7B6tqiHgVNGMl8C/kDUQ8eeR7kUasTDKCFHY3Ur3EVAAAAAElFTkSuQmCC"},"placeholder":"blur","className":"rounded-lg"}]}]
+2d:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"early-adopters","children":[["$","a",null,{"data-card":"","href":"#early-adopters","className":"peer","children":"Early adopters"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text- [...]
+2e:["$","p",null,{"children":"Overall, coding and implementing new features is one side of the story, the other is making an actual use of it. You might have the most sophisticated/performant/reliable (you name it) tooling out there, however, if no one is using it or at least experimenting with it, how could you possibly know whether it's even worth an effort to continue with the further development of the project? Well, I truly wish I had an easy answer how to find users willing to play [...]
+2f:["$","p",null,{"children":"In our case, I do believe, that it was a mix of two things — a limited amount of such tooling in the Rust ecosystem (so that the language enthusiasts could to try out something fresh), as well as a much more lightweight and (hopefully) performant message streaming infrastructure than some of the well-established solutions."}]
+30:["$","p",null,{"children":["I'm fully aware that it's a bold claim, and running the synthetic benchmarks is not a viable proof (e.g. on my 7950X, I was able to hit ",["$","strong",null,{"children":"3GB/s writes and up to 10 GB/s reads"}]," with some additional caching enabled), yet, most of our early adopters were very happy with their results e.g. outnumbering Kafka while utilizing much less memory. For example, ",["$","$L1a",null,{"href":"https://github.com/apache/iggy/issues/606"," [...]
+31:["$","blockquote",null,{"children":["\n",["$","p",null,{"children":"20 million msg/sec via tcp is pretty nuts and already blows several commercial systems out of the water."}],"\n"]}]
+32:["$","p",null,{"children":["And he's not the only one who found Iggy.rs to be the right tool for his needs. For example, a few days ago, one of the users on our Discord said that thanks to Iggy he was able to ",["$","strong",null,{"children":"achieve 2ms latency when compared to 300ms"}]," with Kafka. Again, just to make it clear, I'm not saying that we're better than X or Y — I'm simply stating that for some specific usages, we might be a better choice than X or Y."]}]
+33:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"clustering--replication","children":[["$","a",null,{"data-card":"","href":"#clustering--replication","className":"peer","children":"Clustering & replication"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide- [...]
+34:["$","p",null,{"children":"One of the most frequent questions we receive is whether we plan to incorporate some sort of data replication feature. Without any doubts, especially when considering the general system resiliency and reliability, being able to spin up a cluster of the particular piece of infrastructure (database/messaging/streaming/logging etc.) is quite often a critical feature."}]
+35:["$","p",null,{"children":["And yes, we will certainly implement clustering in Iggy — as a matter of fact, we've already built its basic version in the ",["$","$L1a",null,{"href":"https://github.com/iggy-rs/iggy-cluster-sandbox","children":"sandbox repository"}],". In order to achieve that, we've decided to (at least for now) stick to the ",["$","$L1a",null,{"href":"https://raft.github.io","children":"Raft"}]," consensus algorithm. However, adding the data replication feature to the c [...]
+36:["$","p",null,{"children":["$","$L4a",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"image","src":{"src":"/_next/static/media/iggy_cluster.45c5ba16.png","width":2552,"height":1276,"blurWidth":8,"blurHeight":4,"blurDataURL":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAECAYAAACzzX7wAAAATElEQVR42i2MSw4AIQxCXRrtD+9/V0Y6Lkhf6AvDzDjn5FqLHt43IqhePIDqQsFBP6rqJrn35siMBnenZLGEvEIvmP9TEs5bANCs/gNIviTXgcxFfAAAAABJRU5ErkJggg=="},"placeholder":"blur","clas [...]
+37:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"io_uring--thread-per-core--share-nothing","children":[["$","a",null,{"data-card":"","href":"#io_uring--thread-per-core--share-nothing","className":"peer","children":"io_uring & thread-per-core + share-nothing"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round", [...]
+38:["$","p",null,{"children":["What is a message streaming server, besides some more-or-less complicated logic regarding topics, partitioning, message ordering, consumer groups and a few more features? In its very core, ",["$","strong",null,{"children":"it's mostly I/O (disk + networking)"}]," — the more efficient you can make it, the greater it will be. Of course, there's a major difference between throughput and latency, especially when talking about the so-called tail latency (p99 and [...]
+39:["$","p",null,{"children":["However, due to the nature of tasks being shared across the different threads, ",["$","strong",null,{"children":"you can't simply avoid lots of context switches and data being shared & synchronized across these threads"}]," (therefore even more context switches will occur). While it's probably not an issue for like 90% or maybe even 99% use-cases, there might be some (financial systems and similar), where an unpredictable tail latency is a total no-go."]}]
+3a:["$","p",null,{"children":["Certainly, there are already existing solutions dealing with such challenges, such as ",["$","$L1a",null,{"href":"https://aeron.io","children":"Aeron"}],", but ",["$","strong",null,{"children":"we do believe, that we can make Iggy something much easier to use"}]," — one that can handle the typical workloads, as well as the very demanding ones, without the need of getting a PhD in specific tooling :)"]}]
+3b:["$","p",null,{"children":["We've decided to ",["$","strong",null,{"children":["experiment with ",["$","$L1a",null,{"href":"https://unixism.net/loti/what_is_io_uring.html","children":"io_uring"}]," to maximize the I/O performance"]}]," (and at the same time vastly reduce the need of context switches), and at the same time utilize ",["$","strong",null,{"children":"thread-per-core architecture"}],", where ",["$","strong",null,{"children":"each thread is pinned to the CPU core"}],", thus [...]
+3c:["$","p",null,{"children":["And just recently, we've established yet another ",["$","$L1a",null,{"href":"https://github.com/iggy-rs/iggy-thread-per-core-sandbox","children":"sandbox repository"}]," to tackle the different challenges before deciding on the best solution possible and merging these changes into core Iggy streaming server."]}]
+3d:["$","p",null,{"children":["$","$L4a",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"image","src":{"src":"/_next/static/media/iggy_tpc.a0bc9e74.png","width":2298,"height":1232,"blurWidth":8,"blurHeight":4,"blurDataURL":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAECAYAAACzzX7wAAAASElEQVR42m3MsQrAMAhFUUOiLqKDOPj/H/pKWgItdLjb4VJ3IzNhZlhrYc6JMQaI6GmDqkJEQETAzF90gLtDVW+0T7/gHN7gAgOHI1PkicaLAAAAAElFTkSuQmCC"},"placeholder":"blur","className":"roun [...]
+3e:["$","p",null,{"children":"So far, we've got a very simple prototype in place, but there's still lots to be done, especially when thinking of:"}]
+3f:["$","ul",null,{"children":["\n",["$","li",null,{"children":"How to evenly split partitions (the unit of data parallelism) between multiple cores?"}],"\n",["$","li",null,{"children":["How to efficiently rewrite existing server metadata heavily relying on synchronized data with ",["$","code",null,{"children":"Arc<>"}]," and ",["$","code",null,{"children":"RwLock<>"}],"?"]}],"\n",["$","li",null,{"children":"Should we load into memory the same server metadata across all the threads (sepa [...]
+40:["$","p",null,{"children":["This is just the tip of an iceberg, and we've already started ",["$","$L1a",null,{"href":"https://penberg.org/papers/tpc-ancs19.pdf","children":"studying"}]," some of the existing solutions out there, including ",["$","$L1a",null,{"href":"https://seastar.io","children":"Seastar"}]," framework. As you can see, this part has to be done before the clustering, as it involves lots of changes not only regarding the disk I/O, but also networking I/O."]}]
+41:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"production-readiness","children":[["$","a",null,{"data-card":"","href":"#production-readiness","className":"peer","children":"Production readiness"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size- [...]
+42:["$","p",null,{"children":"Is it ready for production deployment? When you look at the versioning, Rust SDK is at 0.4.* and the server is currently at 0.2.*, which may look like a very long way from v1.0."}]
+43:["$","p",null,{"children":["As mentioned before, ",["$","strong",null,{"children":"some of our users already experiment with Iggy"}]," — and simply because of this, we haven't really introduced any significant breaking changes (except one regarding data compression, which was handled by the provided data migration feature)."]}]
+44:["$","p",null,{"children":["We can't guarantee that it will always be like this, but at least for now, we do not see anything that would dramatically impact the existing solution. One of such things could be the ",["$","strong",null,{"children":"redesigned storage, I/O, and clustering feature"}]," (as described in the previous paragraph), but even then, we'll do our best to make it as seamless upgrade as possible — and once we achieve that, it means, we're getting very close to the ve [...]
+45:["$","p",null,{"children":["For the time being, if you're fine with a ",["$","strong",null,{"children":"single-node solution that delivers a really good message streaming performance"}],", give Iggy a try, or at least run the benchmarks to see what are its possibilities and please share your results and thoughts on our ",["$","$L1a",null,{"href":"https://discord.gg/apache-iggy","children":"Discord"}]," — ",["$","strong",null,{"children":"your opinion is really important to us and we r [...]
+46:["$","p",null,{"children":"It's been a very productive year for our core team (we've been and still are doing this in our free time), and once again, huge thanks to all our supporters and contributors!"}]
+47:["$","p",null,{"children":["$","strong",null,{"children":"We've got the fundamentals right, now it's high time to make Iggy blazingly fast!"}]}]
+48:["$","p",null,{"children":["$","$L4a",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"image","src":{"src":"/_next/static/media/iggy_rocket.3360a060.png","width":1920,"height":1080,"blurWidth":8,"blurHeight":5,"blurDataURL":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAFCAYAAAB4ka1VAAAAm0lEQVR42h2Ovw7BYBxFvz/9/FoSFS3SBYNIbB3MjYStXRhIxGKTiM0LSGxMPILB7AmPttu9Nzc5RymtEb+JtRZjDEqpOvc6IWLL7qTFPNvQ7Q/R5dkzmny54Pu8kU5GKPGE/fbEutgRBkISBvzedz6vB3EUoQbic1 [...]
+49:["$","footer",null,{"className":"mt-16 border-t border-fd-border pt-8","children":["$","$L9",null,{"href":"/blogs","className":"inline-flex items-center gap-2 text-sm font-medium text-fd-primary transition-colors hover:opacity-80","children":"← Back to all posts"}]}]
+17:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
+4b:I[27201,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"IconMark"]
+15:null
+19:[["$","title","0",{"children":"Iggy.rs — one year of building the message streaming | Apache Iggy"}],["$","link","1",{"rel":"icon","href":"/img/favicon.png"}],["$","$L4b","2",{}]]
diff --git a/blogs/2024/05/29/one-year-of-building-the-message-streaming/__next._head.txt b/blogs/2024/05/29/one-year-of-building-the-message-streaming/__next._head.txt
new file mode 100644
index 00000000..d52abb88
--- /dev/null
+++ b/blogs/2024/05/29/one-year-of-building-the-message-streaming/__next._head.txt
@@ -0,0 +1,6 @@
+1:"$Sreact.fragment"
+2:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"ViewportBoundary"]
+3:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"MetadataBoundary"]
+4:"$Sreact.suspense"
+5:I[27201,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"IconMark"]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","h",{"children":[null,["$","$L2",null,{"children":[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]}],["$","div",null,{"hidden":true,"children":["$","$L3",null,{"children":["$","$4",null,{"name":"Next.Metadata","children":[["$","title","0",{"children":"Iggy.rs — one year of building the message streaming | Apache Iggy"}],["$","link","1",{"rel":"icon","href":"/img [...]
diff --git a/blogs/2024/05/29/one-year-of-building-the-message-streaming/__next._index.txt b/blogs/2024/05/29/one-year-of-building-the-message-streaming/__next._index.txt
new file mode 100644
index 00000000..fd02bd95
--- /dev/null
+++ b/blogs/2024/05/29/one-year-of-building-the-message-streaming/__next._index.txt
@@ -0,0 +1,7 @@
+1:"$Sreact.fragment"
+2:I[17751,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js"],"RootProvider"]
+3:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+4:I[58298,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/5a37d4cb1abe17d7.js"],"default"]
+5:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+:HL["/_next/static/chunks/32a0415c8ab1bd26.css","style"]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/32a0415c8ab1bd26.css","precedence":"next"}],["$","script","script-0",{"src":"/_next/static/chunks/9ebd3a84bf60af84.js","async":true}],["$","script","script-1",{"src":"/_next/static/chunks/78b5f2e7b839e72f.js","async":true}]],["$","html",null,{"lang":"en","className":"geistsans_d5a4f12f-module__Ur3q_a__variable geistmono_157ca88a-module__iaM1Ya__variable" [...]
diff --git a/blogs/2024/05/29/one-year-of-building-the-message-streaming/__next._tree.txt b/blogs/2024/05/29/one-year-of-building-the-message-streaming/__next._tree.txt
new file mode 100644
index 00000000..5d985643
--- /dev/null
+++ b/blogs/2024/05/29/one-year-of-building-the-message-streaming/__next._tree.txt
@@ -0,0 +1,4 @@
+:HL["/_next/static/chunks/32a0415c8ab1bd26.css","style"]
+:HL["/_next/static/media/GeistMono_Variable.p.2f937313.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+:HL["/_next/static/media/Geist_Variable-s.p.92592eb2.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","tree":{"name":"","paramType":null,"paramKey":"","hasRuntimePrefetch":false,"slots":{"children":{"name":"(site)","paramType":null,"paramKey":"(site)","hasRuntimePrefetch":false,"slots":{"children":{"name":"blogs","paramType":null,"paramKey":"blogs","hasRuntimePrefetch":false,"slots":{"children":{"name":"slug","paramType":"c","paramKey":"2024/05/29/one-year-of-building-the-message-streaming","hasRuntimePrefetch":false,"slots":{"children":{"name":"__PAG [...]
diff --git a/blogs/2024/05/29/one-year-of-building-the-message-streaming/index.html b/blogs/2024/05/29/one-year-of-building-the-message-streaming/index.html
new file mode 100644
index 00000000..5e5fe1b3
--- /dev/null
+++ b/blogs/2024/05/29/one-year-of-building-the-message-streaming/index.html
@@ -0,0 +1,78 @@
+<!DOCTYPE html><!--uBHgltRE2s5QA49x61S_u--><html lang="en" class="geistsans_d5a4f12f-module__Ur3q_a__variable geistmono_157ca88a-module__iaM1Ya__variable"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" href="/_next/static/media/GeistMono_Variable.p.2f937313.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="preload" href="/_next/static/media/Geist_Variable-s.p.92592eb2.woff2" as="font" crossorigin="" type=" [...]
+<p><strong>It's been a little over a year</strong>, since the <a href="https://iggy.rs" rel="noreferrer noopener" target="_blank">Iggy.rs</a> was born. The initial idea of building a side project (as a way of studying Rust) — an infrastructure for the message streaming (think of Kafka, RedPanda, Aeron etc.) — eventually turned out to be something much bigger that I could've ever imagined. In the <a href="https://blog.iggy.rs/posts/building-message-streaming-in-rust/" rel="noref [...]
+<p>This <strong>particular article</strong> turned out to be a sort of <strong>catalyst</strong>, as it received a really nice traction on <a href="https://www.reddit.com/r/rust/comments/18tgubd/iggyrs_building_message_streaming_in_rust/" rel="noreferrer noopener" target="_blank">Reddit</a>, and was also mentioned on the main site of <a href="https://news.ycombinator.com/item?id=38868115" rel="noreferrer noopener" target="_blank">Hacker News</a>, which I do believe were the two main reas [...]
+<p>And although it may seem as if the project development has recently slowed down a bit, I'd say it's quite the opposite — let me quickly summary, what we've achieved so far during the last few months and what we're focusing on now, as the future looks bright :)</p>
+<p><img alt="image" loading="lazy" width="795" height="542" decoding="async" data-nimg="1" class="rounded-lg" style="color:transparent;background-size:cover;background-position:50% 50%;background-repeat:no-repeat;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 320 200'%3E%3Cfilter id='b' color-interpolation-filters='sRGB'%3E%3CfeGaussianBlur stdDeviation='20'/%3E%3CfeColor [...]
+<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="community"><a data-card="" href="#community" class="peer">Community</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a [...]
+<p>First and foremost, if it weren't for the community, we wouldn't have seen such an enormous growth of the Iggy's ecosystem — we've received the dozens of pull requests and there's ~250 members on our <a href="https://discord.gg/apache-iggy" rel="noreferrer noopener" target="_blank">Discord</a>. Whether we talk about bug fixes, improvements, new features, or just sharing the experiences and discussing potential ideas — it's all equally important.</p>
+<p>And it's been even more than that — we've seen our community members take on <strong>building the new SDKs</strong> in their favorite programming languages, fully on their own. Today, you can find the following list of supported SDKs for Iggy.rs — some of them could be lagging behind, but it's expected, as the project is still evolving, and it's not an easy task, to come up with a great development experience from the very beginning.</p>
+<ul>
+<li><a href="https://github.com/apache/iggy" rel="noreferrer noopener" target="_blank">Rust</a></li>
+<li><a href="https://github.com/iggy-rs/iggy-dotnet-client" rel="noreferrer noopener" target="_blank">C#</a></li>
+<li><a href="https://github.com/iggy-rs/iggy-cpp-client" rel="noreferrer noopener" target="_blank">C++</a></li>
+<li><a href="https://github.com/iggy-rs/iggy-node-client" rel="noreferrer noopener" target="_blank">Node (TS)</a></li>
+<li><a href="https://github.com/iggy-rs/iggy-go-client" rel="noreferrer noopener" target="_blank">Go</a></li>
+<li><a href="https://github.com/iggy-rs/iggy-python-client" rel="noreferrer noopener" target="_blank">Python</a></li>
+<li><a href="https://github.com/iggy-rs/iggy-java-client" rel="noreferrer noopener" target="_blank">Java</a></li>
+<li><a href="https://github.com/iggy-rs/iggy-elixir-client" rel="noreferrer noopener" target="_blank">Elixir</a></li>
+</ul>
+<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="changelog"><a data-card="" href="#changelog" class="peer">Changelog</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a [...]
+<p>Adding the brand new SDKs wasn't the only great thing that has happened during last few months. We've also made quite a lot of improvements for the streaming server itself:</p>
+<ul>
+<li>Increased the streaming server throughput by over 30% for both writes and reads</li>
+<li>Added messages compression for client-side & server-side supporting the different algorithms</li>
+<li>Implemented a new way of message batching with an additional tooling for data migration</li>
+<li>Fixed the possible server-side deadlock that could happen for a specific configuration</li>
+<li>Fixed issues with possible memory leaks when storing too many indices in memory</li>
+<li>Rebuilt our custom benchmarking tool</li>
+<li>Improved TCP connection handling</li>
+<li>Constantly upgrading our CI/CD with lots of testing, different runtimes, artifacts, crates and Docker images releases</li>
+<li>Refactored the existing Rust client SDK to follow the new conventions (without the breaking changes to the previous one)</li>
+</ul>
+<p>And at the same time, we've been experimenting a lot with some fancy stuff, which you can read about in the last paragraphs :)</p>
+<p><img alt="image" loading="lazy" width="2117" height="367" decoding="async" data-nimg="1" class="rounded-lg" style="color:transparent;background-size:cover;background-position:50% 50%;background-repeat:no-repeat;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 320 40'%3E%3Cfilter id='b' color-interpolation-filters='sRGB'%3E%3CfeGaussianBlur stdDeviation='20'/%3E%3CfeColor [...]
+<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="tooling"><a data-card="" href="#tooling" class="peer">Tooling</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 [...]
+<p>The core message streaming server and multiple SDKs might sound as the most important parts of the whole ecosystem, but let's not forget about the <strong>management tools</strong>. How to quickly connect to the server, create new topics, validate if the messages are being sent correctly, change the user permissions or check the node statistics?</p>
+<p>This is where our <strong><a href="https://github.com/apache/iggy/tree/master/core/cli" rel="noreferrer noopener" target="_blank">CLI</a> and <a href="https://github.com/iggy-rs/iggy-web-ui" rel="noreferrer noopener" target="_blank">Web UI</a> come in handy</strong>. If you're a fan of working with the terminal and used to the great developer experience, you'll find our CLI a joy to work with.</p>
+<p><img alt="image" loading="lazy" width="1743" height="766" decoding="async" data-nimg="1" class="rounded-lg" style="color:transparent;background-size:cover;background-position:50% 50%;background-repeat:no-repeat;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 320 160'%3E%3Cfilter id='b' color-interpolation-filters='sRGB'%3E%3CfeGaussianBlur stdDeviation='20'/%3E%3CfeColo [...]
+<p>On the other hand, if you prefer a graphical interface accessible via your browser, Web UI has got you covered. What's even more impressive, is that both of these tools have been developed by the single developers.</p>
+<p><img alt="image" loading="lazy" width="2559" height="1353" decoding="async" data-nimg="1" class="rounded-lg" style="color:transparent;background-size:cover;background-position:50% 50%;background-repeat:no-repeat;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 320 160'%3E%3Cfilter id='b' color-interpolation-filters='sRGB'%3E%3CfeGaussianBlur stdDeviation='20'/%3E%3CfeCol [...]
+<p>Last but not least, in order to run the benchmarks, we have our own <a href="https://github.com/apache/iggy/tree/master/core/bench" rel="noreferrer noopener" target="_blank">bench</a> available as a part of the core repository — you can easily configure the number of producers, consumers, streams, etc. and get an overview of the possible streaming performance on your machine.</p>
+<p><img alt="image" loading="lazy" width="1891" height="803" decoding="async" data-nimg="1" class="rounded-lg" style="color:transparent;background-size:cover;background-position:50% 50%;background-repeat:no-repeat;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 320 120'%3E%3Cfilter id='b' color-interpolation-filters='sRGB'%3E%3CfeGaussianBlur stdDeviation='20'/%3E%3CfeColo [...]
+<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="early-adopters"><a data-card="" href="#early-adopters" class="peer">Early adopters</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 [...]
+<p>Overall, coding and implementing new features is one side of the story, the other is making an actual use of it. You might have the most sophisticated/performant/reliable (you name it) tooling out there, however, if no one is using it or at least experimenting with it, how could you possibly know whether it's even worth an effort to continue with the further development of the project? Well, I truly wish I had an easy answer how to find users willing to play with your new shiny toy.</p>
+<p>In our case, I do believe, that it was a mix of two things — a limited amount of such tooling in the Rust ecosystem (so that the language enthusiasts could to try out something fresh), as well as a much more lightweight and (hopefully) performant message streaming infrastructure than some of the well-established solutions.</p>
+<p>I'm fully aware that it's a bold claim, and running the synthetic benchmarks is not a viable proof (e.g. on my 7950X, I was able to hit <strong>3GB/s writes and up to 10 GB/s reads</strong> with some additional caching enabled), yet, most of our early adopters were very happy with their results e.g. outnumbering Kafka while utilizing much less memory. For example, <a href="https://github.com/apache/iggy/issues/606" rel="noreferrer noopener" target="_blank">Marvin</a> wrote:</p>
+<blockquote>
+<p>20 million msg/sec via tcp is pretty nuts and already blows several commercial systems out of the water.</p>
+</blockquote>
+<p>And he's not the only one who found Iggy.rs to be the right tool for his needs. For example, a few days ago, one of the users on our Discord said that thanks to Iggy he was able to <strong>achieve 2ms latency when compared to 300ms</strong> with Kafka. Again, just to make it clear, I'm not saying that we're better than X or Y — I'm simply stating that for some specific usages, we might be a better choice than X or Y.</p>
+<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="clustering--replication"><a data-card="" href="#clustering--replication" class="peer">Clustering & replication</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidde [...]
+<p>One of the most frequent questions we receive is whether we plan to incorporate some sort of data replication feature. Without any doubts, especially when considering the general system resiliency and reliability, being able to spin up a cluster of the particular piece of infrastructure (database/messaging/streaming/logging etc.) is quite often a critical feature.</p>
+<p>And yes, we will certainly implement clustering in Iggy — as a matter of fact, we've already built its basic version in the <a href="https://github.com/iggy-rs/iggy-cluster-sandbox" rel="noreferrer noopener" target="_blank">sandbox repository</a>. In order to achieve that, we've decided to (at least for now) stick to the <a href="https://raft.github.io" rel="noreferrer noopener" target="_blank">Raft</a> consensus algorithm. However, adding the data replication feature to the [...]
+<p><img alt="image" loading="lazy" width="2552" height="1276" decoding="async" data-nimg="1" class="rounded-lg" style="color:transparent;background-size:cover;background-position:50% 50%;background-repeat:no-repeat;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 320 160'%3E%3Cfilter id='b' color-interpolation-filters='sRGB'%3E%3CfeGaussianBlur stdDeviation='20'/%3E%3CfeCol [...]
+<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="io_uring--thread-per-core--share-nothing"><a data-card="" href="#io_uring--thread-per-core--share-nothing" class="peer">io_uring & thread-per-core + share-nothing</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 t [...]
+<p>What is a message streaming server, besides some more-or-less complicated logic regarding topics, partitioning, message ordering, consumer groups and a few more features? In its very core, <strong>it's mostly I/O (disk + networking)</strong> — the more efficient you can make it, the greater it will be. Of course, there's a major difference between throughput and latency, especially when talking about the so-called tail latency (p99 and more). Wouldn't it be great if we [...]
+<p>However, due to the nature of tasks being shared across the different threads, <strong>you can't simply avoid lots of context switches and data being shared & synchronized across these threads</strong> (therefore even more context switches will occur). While it's probably not an issue for like 90% or maybe even 99% use-cases, there might be some (financial systems and similar), where an unpredictable tail latency is a total no-go.</p>
+<p>Certainly, there are already existing solutions dealing with such challenges, such as <a href="https://aeron.io" rel="noreferrer noopener" target="_blank">Aeron</a>, but <strong>we do believe, that we can make Iggy something much easier to use</strong> — one that can handle the typical workloads, as well as the very demanding ones, without the need of getting a PhD in specific tooling :)</p>
+<p>We've decided to <strong>experiment with <a href="https://unixism.net/loti/what_is_io_uring.html" rel="noreferrer noopener" target="_blank">io_uring</a> to maximize the I/O performance</strong> (and at the same time vastly reduce the need of context switches), and at the same time utilize <strong>thread-per-core architecture</strong>, where <strong>each thread is pinned to the CPU core</strong>, thus keeping the data locally, without the need of sharing it with the other threads [...]
+<p>And just recently, we've established yet another <a href="https://github.com/iggy-rs/iggy-thread-per-core-sandbox" rel="noreferrer noopener" target="_blank">sandbox repository</a> to tackle the different challenges before deciding on the best solution possible and merging these changes into core Iggy streaming server.</p>
+<p><img alt="image" loading="lazy" width="2298" height="1232" decoding="async" data-nimg="1" class="rounded-lg" style="color:transparent;background-size:cover;background-position:50% 50%;background-repeat:no-repeat;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 320 160'%3E%3Cfilter id='b' color-interpolation-filters='sRGB'%3E%3CfeGaussianBlur stdDeviation='20'/%3E%3CfeCol [...]
+<p>So far, we've got a very simple prototype in place, but there's still lots to be done, especially when thinking of:</p>
+<ul>
+<li>How to evenly split partitions (the unit of data parallelism) between multiple cores?</li>
+<li>How to efficiently rewrite existing server metadata heavily relying on synchronized data with <code>Arc<></code> and <code>RwLock<></code>?</li>
+<li>Should we load into memory the same server metadata across all the threads (separately from each other) and notify all of them when something changes?</li>
+<li>Should there be single or multiple threads handling the incoming TCP connections?</li>
+<li>When <code>Thread #1</code> receives the request, which has to access the partition from <code>Thread #2</code>, should we use an async two-way channel (remember, no explicit locking and data synchronization between the threads) or maybe just send the descriptor using a one-way channel to the second thread to complete the request?</li>
+<li>What and when could become a bottleneck in such architecture?</li>
+</ul>
+<p>This is just the tip of an iceberg, and we've already started <a href="https://penberg.org/papers/tpc-ancs19.pdf" rel="noreferrer noopener" target="_blank">studying</a> some of the existing solutions out there, including <a href="https://seastar.io" rel="noreferrer noopener" target="_blank">Seastar</a> framework. As you can see, this part has to be done before the clustering, as it involves lots of changes not only regarding the disk I/O, but also networking I/O.</p>
+<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="production-readiness"><a data-card="" href="#production-readiness" class="peer">Production readiness</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path [...]
+<p>Is it ready for production deployment? When you look at the versioning, Rust SDK is at 0.4.* and the server is currently at 0.2.*, which may look like a very long way from v1.0.</p>
+<p>As mentioned before, <strong>some of our users already experiment with Iggy</strong> — and simply because of this, we haven't really introduced any significant breaking changes (except one regarding data compression, which was handled by the provided data migration feature).</p>
+<p>We can't guarantee that it will always be like this, but at least for now, we do not see anything that would dramatically impact the existing solution. One of such things could be the <strong>redesigned storage, I/O, and clustering feature</strong> (as described in the previous paragraph), but even then, we'll do our best to make it as seamless upgrade as possible — and once we achieve that, it means, we're getting very close to the version 1.0.</p>
+<p>For the time being, if you're fine with a <strong>single-node solution that delivers a really good message streaming performance</strong>, give Iggy a try, or at least run the benchmarks to see what are its possibilities and please share your results and thoughts on our <a href="https://discord.gg/apache-iggy" rel="noreferrer noopener" target="_blank">Discord</a> — <strong>your opinion is really important to us and we respect it no matter what</strong>.</p>
+<p>It's been a very productive year for our core team (we've been and still are doing this in our free time), and once again, huge thanks to all our supporters and contributors!</p>
+<p><strong>We've got the fundamentals right, now it's high time to make Iggy blazingly fast!</strong></p>
+<p><img alt="image" loading="lazy" width="1920" height="1080" decoding="async" data-nimg="1" class="rounded-lg" style="color:transparent;background-size:cover;background-position:50% 50%;background-repeat:no-repeat;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 320 200'%3E%3Cfilter id='b' color-interpolation-filters='sRGB'%3E%3CfeGaussianBlur stdDeviation='20'/%3E%3CfeCol [...]
\ No newline at end of file
diff --git a/blogs/2024/05/29/one-year-of-building-the-message-streaming/index.txt b/blogs/2024/05/29/one-year-of-building-the-message-streaming/index.txt
new file mode 100644
index 00000000..ea1f367f
--- /dev/null
+++ b/blogs/2024/05/29/one-year-of-building-the-message-streaming/index.txt
@@ -0,0 +1,79 @@
+1:"$Sreact.fragment"
+2:I[17751,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js"],"RootProvider"]
+3:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+4:I[58298,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/5a37d4cb1abe17d7.js"],"default"]
+5:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+6:I[83571,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Header"]
+7:I[29966,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFDropdown"]
+8:I[36330,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFMobileLinks"]
+9:I[22016,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],""]
+a:I[88760,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Logo"]
+11:I[68027,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+:HL["/_next/static/chunks/32a0415c8ab1bd26.css","style"]
+:HL["/_next/static/media/GeistMono_Variable.p.2f937313.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+:HL["/_next/static/media/Geist_Variable-s.p.92592eb2.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+0:{"P":null,"b":"uBHgltRE2s5QA49x61S_u","c":["","blogs","2024","05","29","one-year-of-building-the-message-streaming",""],"q":"","i":false,"f":[[["",{"children":["(site)",{"children":["blogs",{"children":[["slug","2024/05/29/one-year-of-building-the-message-streaming","c"],{"children":["__PAGE__",{}]}]}]}]},"$undefined","$undefined",true],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/32a0415c8ab1bd26.css","precedence":"next","crossOrigin":" [...]
+13:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"OutletBoundary"]
+14:"$Sreact.suspense"
+16:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"ViewportBoundary"]
+18:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"MetadataBoundary"]
+b:["$","h1",null,{"className":"next-error-h1","style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:1:props:style","children":404}]
+c:["$","div",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:style","children":["$","h2",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style","children":"This page could not be found."}]}]
+d:["$","$1","c",{"children":[null,["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}]
+e:["$","$1","c",{"children":[null,["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}]
+f:["$","$1","c",{"children":["$L12",[["$","script","script-0",{"src":"/_next/static/chunks/00b00679782d0ffd.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/3562882a488c4fbb.js","async":true,"nonce":"$undefined"}]],["$","$L13",null,{"children":["$","$14",null,{"name":"Next.MetadataOutlet","children":"$@15"}]}]]}]
+10:["$","$1","h",{"children":[null,["$","$L16",null,{"children":"$L17"}],["$","div",null,{"hidden":true,"children":["$","$L18",null,{"children":["$","$14",null,{"name":"Next.Metadata","children":"$L19"}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}]
+1a:I[47873,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"default"]
+12:["$","main",null,{"className":"min-h-screen px-6 py-16 md:px-12","children":["$","article",null,{"className":"mx-auto max-w-5xl","children":[["$","header",null,{"className":"mb-10","children":[["$","time",null,{"className":"text-sm font-medium text-fd-muted-foreground","children":"May 29, 2024"}],["$","h1",null,{"className":"mt-3 text-3xl font-extrabold tracking-tight text-fd-foreground md:text-5xl","children":"Iggy.rs — one year of building the message streaming"}],["$","p",null,{"cl [...]
+4a:I[24110,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"Image"]
+1b:["$","p",null,{"children":["$","$L4a",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"image","src":{"src":"/_next/static/media/iggy_stars.5e23fec1.png","width":795,"height":542,"blurWidth":8,"blurHeight":5,"blurDataURL":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAFCAYAAAB4ka1VAAAAZElEQVR42k2OWQ6AIAxEuYAoIFLWCPH+VxxbxcSPl2a2pIpyR6wDq4twocL6DGMJjrVllBQMm4sJD5qRUE+tUrugeSH8l99AHenExobfE4wjrFKe4VughlIG0vwl8BWodvjYcAPpazJO7CwojgAAAABJRU5ErkJggg==" [...]
+1c:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"community","children":[["$","a",null,{"data-card":"","href":"#community","className":"peer","children":"Community"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-foregr [...]
+1d:["$","p",null,{"children":["First and foremost, if it weren't for the community, we wouldn't have seen such an enormous growth of the Iggy's ecosystem — we've received the dozens of pull requests and there's ~250 members on our ",["$","$L1a",null,{"href":"https://discord.gg/apache-iggy","children":"Discord"}],". Whether we talk about bug fixes, improvements, new features, or just sharing the experiences and discussing potential ideas — it's all equally important."]}]
+1e:["$","p",null,{"children":["And it's been even more than that — we've seen our community members take on ",["$","strong",null,{"children":"building the new SDKs"}]," in their favorite programming languages, fully on their own. Today, you can find the following list of supported SDKs for Iggy.rs — some of them could be lagging behind, but it's expected, as the project is still evolving, and it's not an easy task, to come up with a great development experience from the very beginning."]}]
+1f:["$","ul",null,{"children":["\n",["$","li",null,{"children":["$","$L1a",null,{"href":"https://github.com/apache/iggy","children":"Rust"}]}],"\n",["$","li",null,{"children":["$","$L1a",null,{"href":"https://github.com/iggy-rs/iggy-dotnet-client","children":"C#"}]}],"\n",["$","li",null,{"children":["$","$L1a",null,{"href":"https://github.com/iggy-rs/iggy-cpp-client","children":"C++"}]}],"\n",["$","li",null,{"children":["$","$L1a",null,{"href":"https://github.com/iggy-rs/iggy-node-client [...]
+20:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"changelog","children":[["$","a",null,{"data-card":"","href":"#changelog","className":"peer","children":"Changelog"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-foregr [...]
+21:["$","p",null,{"children":"Adding the brand new SDKs wasn't the only great thing that has happened during last few months. We've also made quite a lot of improvements for the streaming server itself:"}]
+22:["$","ul",null,{"children":["\n",["$","li",null,{"children":"Increased the streaming server throughput by over 30% for both writes and reads"}],"\n",["$","li",null,{"children":"Added messages compression for client-side & server-side supporting the different algorithms"}],"\n",["$","li",null,{"children":"Implemented a new way of message batching with an additional tooling for data migration"}],"\n",["$","li",null,{"children":"Fixed the possible server-side deadlock that could happen f [...]
+23:["$","p",null,{"children":"And at the same time, we've been experimenting a lot with some fancy stuff, which you can read about in the last paragraphs :)"}]
+24:["$","p",null,{"children":["$","$L4a",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"image","src":{"src":"/_next/static/media/iggy_perf.c89a7ea7.png","width":2117,"height":367,"blurWidth":8,"blurHeight":1,"blurDataURL":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAABCAYAAADjAO9DAAAAGklEQVR42mPg4+f7z8rK+p+ZmRkDMzEx/QcAgSgIZsYChBAAAAAASUVORK5CYII="},"placeholder":"blur","className":"rounded-lg"}]}]
+25:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"tooling","children":[["$","a",null,{"data-card":"","href":"#tooling","className":"peer","children":"Tooling"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground o [...]
+26:["$","p",null,{"children":["The core message streaming server and multiple SDKs might sound as the most important parts of the whole ecosystem, but let's not forget about the ",["$","strong",null,{"children":"management tools"}],". How to quickly connect to the server, create new topics, validate if the messages are being sent correctly, change the user permissions or check the node statistics?"]}]
+27:["$","p",null,{"children":["This is where our ",["$","strong",null,{"children":[["$","$L1a",null,{"href":"https://github.com/apache/iggy/tree/master/core/cli","children":"CLI"}]," and ",["$","$L1a",null,{"href":"https://github.com/iggy-rs/iggy-web-ui","children":"Web UI"}]," come in handy"]}],". If you're a fan of working with the terminal and used to the great developer experience, you'll find our CLI a joy to work with."]}]
+28:["$","p",null,{"children":["$","$L4a",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"image","src":{"src":"/_next/static/media/iggy_cli.6f56bf04.png","width":1743,"height":766,"blurWidth":8,"blurHeight":4,"blurDataURL":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAECAYAAACzzX7wAAAAQ0lEQVR42mXMOQ7AIAxEUYOwbHmrfP+rTkRSBYrXjL6GRATbWgtzzguZGaoKzIwxxoUiAt2NHb4D0Z+7IzOhqt/lETx91CGCKbRFjQAAAABJRU5ErkJggg=="},"placeholder":"blur","className":"rounded-lg"}]}]
+29:["$","p",null,{"children":"On the other hand, if you prefer a graphical interface accessible via your browser, Web UI has got you covered. What's even more impressive, is that both of these tools have been developed by the single developers."}]
+2a:["$","p",null,{"children":["$","$L4a",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"image","src":{"src":"/_next/static/media/iggy_web.d8f09397.png","width":2559,"height":1353,"blurWidth":8,"blurHeight":4,"blurDataURL":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAECAYAAACzzX7wAAAASklEQVR42nWKQRKAIAwD+x4HRmhpAYWL//9T1I5HOewkmSyJdlibjtaBYsPz3ee8QHEXsDRw6U7+uujh0BYSEpsff1CI+RHqUrgBREMzrbnu6jMAAAAASUVORK5CYII="},"placeholder":"blur","className":" [...]
+2b:["$","p",null,{"children":["Last but not least, in order to run the benchmarks, we have our own ",["$","$L1a",null,{"href":"https://github.com/apache/iggy/tree/master/core/bench","children":"bench"}]," available as a part of the core repository — you can easily configure the number of producers, consumers, streams, etc. and get an overview of the possible streaming performance on your machine."]}]
+2c:["$","p",null,{"children":["$","$L4a",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"image","src":{"src":"/_next/static/media/iggy_bench.5fe87533.png","width":1891,"height":803,"blurWidth":8,"blurHeight":3,"blurDataURL":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAADCAYAAACuyE5IAAAAQklEQVR42l3MwQ7AEBBF0dm3tI1UjCGIRPz/Dz5ix+LuTi5VZ1F+g/BqsL7B6tqiHgVNGMl8C/kDUQ8eeR7kUasTDKCFHY3Ur3EVAAAAAElFTkSuQmCC"},"placeholder":"blur","className":"rounded-lg"}]}]
+2d:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"early-adopters","children":[["$","a",null,{"data-card":"","href":"#early-adopters","className":"peer","children":"Early adopters"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text- [...]
+2e:["$","p",null,{"children":"Overall, coding and implementing new features is one side of the story, the other is making an actual use of it. You might have the most sophisticated/performant/reliable (you name it) tooling out there, however, if no one is using it or at least experimenting with it, how could you possibly know whether it's even worth an effort to continue with the further development of the project? Well, I truly wish I had an easy answer how to find users willing to play [...]
+2f:["$","p",null,{"children":"In our case, I do believe, that it was a mix of two things — a limited amount of such tooling in the Rust ecosystem (so that the language enthusiasts could to try out something fresh), as well as a much more lightweight and (hopefully) performant message streaming infrastructure than some of the well-established solutions."}]
+30:["$","p",null,{"children":["I'm fully aware that it's a bold claim, and running the synthetic benchmarks is not a viable proof (e.g. on my 7950X, I was able to hit ",["$","strong",null,{"children":"3GB/s writes and up to 10 GB/s reads"}]," with some additional caching enabled), yet, most of our early adopters were very happy with their results e.g. outnumbering Kafka while utilizing much less memory. For example, ",["$","$L1a",null,{"href":"https://github.com/apache/iggy/issues/606"," [...]
+31:["$","blockquote",null,{"children":["\n",["$","p",null,{"children":"20 million msg/sec via tcp is pretty nuts and already blows several commercial systems out of the water."}],"\n"]}]
+32:["$","p",null,{"children":["And he's not the only one who found Iggy.rs to be the right tool for his needs. For example, a few days ago, one of the users on our Discord said that thanks to Iggy he was able to ",["$","strong",null,{"children":"achieve 2ms latency when compared to 300ms"}]," with Kafka. Again, just to make it clear, I'm not saying that we're better than X or Y — I'm simply stating that for some specific usages, we might be a better choice than X or Y."]}]
+33:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"clustering--replication","children":[["$","a",null,{"data-card":"","href":"#clustering--replication","className":"peer","children":"Clustering & replication"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide- [...]
+34:["$","p",null,{"children":"One of the most frequent questions we receive is whether we plan to incorporate some sort of data replication feature. Without any doubts, especially when considering the general system resiliency and reliability, being able to spin up a cluster of the particular piece of infrastructure (database/messaging/streaming/logging etc.) is quite often a critical feature."}]
+35:["$","p",null,{"children":["And yes, we will certainly implement clustering in Iggy — as a matter of fact, we've already built its basic version in the ",["$","$L1a",null,{"href":"https://github.com/iggy-rs/iggy-cluster-sandbox","children":"sandbox repository"}],". In order to achieve that, we've decided to (at least for now) stick to the ",["$","$L1a",null,{"href":"https://raft.github.io","children":"Raft"}]," consensus algorithm. However, adding the data replication feature to the c [...]
+36:["$","p",null,{"children":["$","$L4a",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"image","src":{"src":"/_next/static/media/iggy_cluster.45c5ba16.png","width":2552,"height":1276,"blurWidth":8,"blurHeight":4,"blurDataURL":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAECAYAAACzzX7wAAAATElEQVR42i2MSw4AIQxCXRrtD+9/V0Y6Lkhf6AvDzDjn5FqLHt43IqhePIDqQsFBP6rqJrn35siMBnenZLGEvEIvmP9TEs5bANCs/gNIviTXgcxFfAAAAABJRU5ErkJggg=="},"placeholder":"blur","clas [...]
+37:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"io_uring--thread-per-core--share-nothing","children":[["$","a",null,{"data-card":"","href":"#io_uring--thread-per-core--share-nothing","className":"peer","children":"io_uring & thread-per-core + share-nothing"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round", [...]
+38:["$","p",null,{"children":["What is a message streaming server, besides some more-or-less complicated logic regarding topics, partitioning, message ordering, consumer groups and a few more features? In its very core, ",["$","strong",null,{"children":"it's mostly I/O (disk + networking)"}]," — the more efficient you can make it, the greater it will be. Of course, there's a major difference between throughput and latency, especially when talking about the so-called tail latency (p99 and [...]
+39:["$","p",null,{"children":["However, due to the nature of tasks being shared across the different threads, ",["$","strong",null,{"children":"you can't simply avoid lots of context switches and data being shared & synchronized across these threads"}]," (therefore even more context switches will occur). While it's probably not an issue for like 90% or maybe even 99% use-cases, there might be some (financial systems and similar), where an unpredictable tail latency is a total no-go."]}]
+3a:["$","p",null,{"children":["Certainly, there are already existing solutions dealing with such challenges, such as ",["$","$L1a",null,{"href":"https://aeron.io","children":"Aeron"}],", but ",["$","strong",null,{"children":"we do believe, that we can make Iggy something much easier to use"}]," — one that can handle the typical workloads, as well as the very demanding ones, without the need of getting a PhD in specific tooling :)"]}]
+3b:["$","p",null,{"children":["We've decided to ",["$","strong",null,{"children":["experiment with ",["$","$L1a",null,{"href":"https://unixism.net/loti/what_is_io_uring.html","children":"io_uring"}]," to maximize the I/O performance"]}]," (and at the same time vastly reduce the need of context switches), and at the same time utilize ",["$","strong",null,{"children":"thread-per-core architecture"}],", where ",["$","strong",null,{"children":"each thread is pinned to the CPU core"}],", thus [...]
+3c:["$","p",null,{"children":["And just recently, we've established yet another ",["$","$L1a",null,{"href":"https://github.com/iggy-rs/iggy-thread-per-core-sandbox","children":"sandbox repository"}]," to tackle the different challenges before deciding on the best solution possible and merging these changes into core Iggy streaming server."]}]
+3d:["$","p",null,{"children":["$","$L4a",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"image","src":{"src":"/_next/static/media/iggy_tpc.a0bc9e74.png","width":2298,"height":1232,"blurWidth":8,"blurHeight":4,"blurDataURL":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAECAYAAACzzX7wAAAASElEQVR42m3MsQrAMAhFUUOiLqKDOPj/H/pKWgItdLjb4VJ3IzNhZlhrYc6JMQaI6GmDqkJEQETAzF90gLtDVW+0T7/gHN7gAgOHI1PkicaLAAAAAElFTkSuQmCC"},"placeholder":"blur","className":"roun [...]
+3e:["$","p",null,{"children":"So far, we've got a very simple prototype in place, but there's still lots to be done, especially when thinking of:"}]
+3f:["$","ul",null,{"children":["\n",["$","li",null,{"children":"How to evenly split partitions (the unit of data parallelism) between multiple cores?"}],"\n",["$","li",null,{"children":["How to efficiently rewrite existing server metadata heavily relying on synchronized data with ",["$","code",null,{"children":"Arc<>"}]," and ",["$","code",null,{"children":"RwLock<>"}],"?"]}],"\n",["$","li",null,{"children":"Should we load into memory the same server metadata across all the threads (sepa [...]
+40:["$","p",null,{"children":["This is just the tip of an iceberg, and we've already started ",["$","$L1a",null,{"href":"https://penberg.org/papers/tpc-ancs19.pdf","children":"studying"}]," some of the existing solutions out there, including ",["$","$L1a",null,{"href":"https://seastar.io","children":"Seastar"}]," framework. As you can see, this part has to be done before the clustering, as it involves lots of changes not only regarding the disk I/O, but also networking I/O."]}]
+41:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"production-readiness","children":[["$","a",null,{"data-card":"","href":"#production-readiness","className":"peer","children":"Production readiness"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size- [...]
+42:["$","p",null,{"children":"Is it ready for production deployment? When you look at the versioning, Rust SDK is at 0.4.* and the server is currently at 0.2.*, which may look like a very long way from v1.0."}]
+43:["$","p",null,{"children":["As mentioned before, ",["$","strong",null,{"children":"some of our users already experiment with Iggy"}]," — and simply because of this, we haven't really introduced any significant breaking changes (except one regarding data compression, which was handled by the provided data migration feature)."]}]
+44:["$","p",null,{"children":["We can't guarantee that it will always be like this, but at least for now, we do not see anything that would dramatically impact the existing solution. One of such things could be the ",["$","strong",null,{"children":"redesigned storage, I/O, and clustering feature"}]," (as described in the previous paragraph), but even then, we'll do our best to make it as seamless upgrade as possible — and once we achieve that, it means, we're getting very close to the ve [...]
+45:["$","p",null,{"children":["For the time being, if you're fine with a ",["$","strong",null,{"children":"single-node solution that delivers a really good message streaming performance"}],", give Iggy a try, or at least run the benchmarks to see what are its possibilities and please share your results and thoughts on our ",["$","$L1a",null,{"href":"https://discord.gg/apache-iggy","children":"Discord"}]," — ",["$","strong",null,{"children":"your opinion is really important to us and we r [...]
+46:["$","p",null,{"children":"It's been a very productive year for our core team (we've been and still are doing this in our free time), and once again, huge thanks to all our supporters and contributors!"}]
+47:["$","p",null,{"children":["$","strong",null,{"children":"We've got the fundamentals right, now it's high time to make Iggy blazingly fast!"}]}]
+48:["$","p",null,{"children":["$","$L4a",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"image","src":{"src":"/_next/static/media/iggy_rocket.3360a060.png","width":1920,"height":1080,"blurWidth":8,"blurHeight":5,"blurDataURL":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAFCAYAAAB4ka1VAAAAm0lEQVR42h2Ovw7BYBxFvz/9/FoSFS3SBYNIbB3MjYStXRhIxGKTiM0LSGxMPILB7AmPttu9Nzc5RymtEb+JtRZjDEqpOvc6IWLL7qTFPNvQ7Q/R5dkzmny54Pu8kU5GKPGE/fbEutgRBkISBvzedz6vB3EUoQbic1 [...]
+49:["$","footer",null,{"className":"mt-16 border-t border-fd-border pt-8","children":["$","$L9",null,{"href":"/blogs","className":"inline-flex items-center gap-2 text-sm font-medium text-fd-primary transition-colors hover:opacity-80","children":"← Back to all posts"}]}]
+17:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
+4b:I[27201,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"IconMark"]
+15:null
+19:[["$","title","0",{"children":"Iggy.rs — one year of building the message streaming | Apache Iggy"}],["$","link","1",{"rel":"icon","href":"/img/favicon.png"}],["$","$L4b","2",{}]]
diff --git a/blogs/2024/10/28/technology-radar-and-currrent-goals/__next.!KHNpdGUp.blogs.$c$slug.__PAGE__.txt b/blogs/2024/10/28/technology-radar-and-currrent-goals/__next.!KHNpdGUp.blogs.$c$slug.__PAGE__.txt
new file mode 100644
index 00000000..e17699ea
--- /dev/null
+++ b/blogs/2024/10/28/technology-radar-and-currrent-goals/__next.!KHNpdGUp.blogs.$c$slug.__PAGE__.txt
@@ -0,0 +1,65 @@
+1:"$Sreact.fragment"
+2:I[47873,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"default"]
+3:I[24110,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"Image"]
+26:I[44324,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"CodeBlock"]
+27:I[44324,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"Pre"]
+3d:I[22016,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],""]
+3e:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"OutletBoundary"]
+3f:"$Sreact.suspense"
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","c",{"children":[["$","main",null,{"className":"min-h-screen px-6 py-16 md:px-12","children":["$","article",null,{"className":"mx-auto max-w-5xl","children":[["$","header",null,{"className":"mb-10","children":[["$","time",null,{"className":"text-sm font-medium text-fd-muted-foreground","children":"October 28, 2024"}],["$","h1",null,{"className":"mt-3 text-3xl font-extrabold tracking-tight text-fd-foreground md:text-5xl","children":"Igg [...]
+4:["$","p",null,{"children":["And if you are (or will be) one of such persons, please hop onto our ",["$","$L2",null,{"href":"https://discord.gg/apache-iggy","children":"Discord"}]," and share your invaluable feedback with us!"]}]
+5:["$","p",null,{"children":["Now, given the recent publication and increased activity within our ",["$","$L2",null,{"href":"https://github.com/iggy-rs/","children":"OSS community"}]," building the core streaming server & SDKs in multiple programming languages, it's worth mentioning what are the current goals for Iggy."]}]
+6:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"current-goals","children":[["$","a",null,{"data-card":"","href":"#current-goals","className":"peer","children":"Current goals"}],["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opa [...]
+7:["$","h3",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"replication","children":[["$","a",null,{"data-card":"","href":"#replication","className":"peer","children":"Replication"}],["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 [...]
+8:["$","p",null,{"children":"Without a doubt, being able to run your infrastructure (which processes & stores the data) as a cluster, gives much more confidence and greatly impacts the overall reliability."}]
+9:["$","p",null,{"children":["We've started ",["$","$L2",null,{"href":"https://github.com/iggy-rs/iggy-cluster-sandbox","children":"experimenting"}]," with the replication over half a year ago already by implementing the basic, Raft based consensus algorithm for the simple message streaming server."]}]
+a:["$","p",null,{"children":["At the same time, we were researching the other possible solutions, after we've finally decided to move on with ",["$","strong",null,{"children":"Viewstamped Replication"}]," (in its ",["$","$L2",null,{"href":"https://sands.kaust.edu.sa/classes/CS240/F21/papers/vr-revisited.pdf","children":"revisited form"}],"), which was successfully used by e.g. ",["$","$L2",null,{"href":"https://tigerbeetle.com/","children":"TigerBeetle"}],"."]}]
+b:["$","p",null,{"children":["Long story short - the ",["$","strong",null,{"children":"deterministic leader election"}],", allows us to go for ring topology and chain replication of our data - it's excellent for high throughput, which is very important for us."]}]
+c:["$","p",null,{"children":["Moreover, ",["$","strong",null,{"children":"VSR can be run completely in memory"}],", providing us an opportunity to work independently both on the consensus and the storage and how to link these two together, to form a bulletproof storage fault model."]}]
+d:["$","p",null,{"children":"Below is our very first draft for the initial implementation of VSR."}]
+e:["$","p",null,{"children":["$","$L3",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"image","src":{"src":"/_next/static/media/iggy_vsr.2ca278be.png","width":2832,"height":3281,"blurWidth":7,"blurHeight":8,"blurDataURL":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAICAYAAAA1BOUGAAAAgklEQVR42kWOXRICMQiDewSX39a2q6Pe/4oRmFl9SAsT+EI7bgdS0xW7K64+1YgIdBBUFMJS9c80d7g55tgwNWQvKqUwe2wZzvUCE8PHwP6cmO+F5t0LueezsOYGNQXnpqpGDmPdH5XH8s9tYgJmhgU6sZmVpDLzuSbz9yD [...]
+f:["$","h3",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"s3-storage","children":[["$","a",null,{"data-card":"","href":"#s3-storage","className":"peer","children":"S3 storage"}],["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 tr [...]
+10:["$","p",null,{"children":["A few months ago, we did ",["$","$L2",null,{"href":"https://github.com/apache/iggy/pull/1053","children":"implement"}]," an optional archiver for the server state log & streaming data (messages etc.) which supports any S3 compatible storage (just pick up your favorite cloud provider). The configuration is as simple as this example:"]}]
+11:["$","$L26",null,{"className":"shiki shiki-themes github-light github-dark","style":{"--shiki-light":"#24292e","--shiki-dark":"#e1e4e8","--shiki-light-bg":"#fff","--shiki-dark-bg":"#24292e"},"tabIndex":"0","icon":"<svg viewBox=\"0 0 24 24\"><path d=\"M 6,1 C 4.354992,1 3,2.354992 3,4 v 16 c 0,1.645008 1.354992,3 3,3 h 12 c 1.645008,0 3,-1.354992 3,-3 V 8 7 A 1.0001,1.0001 0 0 0 20.707031,6.2929687 l -5,-5 A 1.0001,1.0001 0 0 0 15,1 h -1 z m 0,2 h 7 v 3 c 0,1.645008 1.354992,3 3,3 h 3 [...]
+12:["$","p",null,{"children":[["$","strong",null,{"children":"By making use of S3, you could almost infinitely (and very cheaply) store your data"}]," - for the need of additional backups, being compliant with law regulations etc. However, there's one catch - in order to read the data stored with S3, you'd need to download it from the cloud and restart your server. And this is where things will change in the future - we're planning to implement a dedicated S3 storage, for both, writing a [...]
+13:["$","ul",null,{"children":["\n",["$","li",null,{"children":[["$","strong",null,{"children":"L1"}]," - data available directly from the server RAM (super fast writes/reads)"]}],"\n",["$","li",null,{"children":[["$","strong",null,{"children":"L2"}]," - data stored on your servers disks (still very, very fast with NVME SSD gen4 or 5)"]}],"\n",["$","li",null,{"children":[["$","strong",null,{"children":"L3"}]," - S3 storage, still fast for the typical use-cases which do not require a very [...]
+14:["$","p",null,{"children":[["$","strong",null,{"children":"Each of these storage layers could be optionally enabled or disabled"}],". You can already decide if and how much memory to use for caching the messages. With S3 tiered storage in place, you could e.g. treat your server's SSD as a sort of ring buffer for keeping the most recent data (easily millions or billions of messages, depending on their size) and only fetch the ones from S3, when you need something very old."]}]
+15:["$","p",null,{"children":["Or, you could just ignore your server's RAM & SSD, and do all the writes and reads directly on S3, and still remain blazingly fast (just like ",["$","$L2",null,{"href":"https://quickwit.io","children":"Quickwit"}],")."]}]
+16:["$","h3",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"opentelemetry","children":[["$","a",null,{"data-card":"","href":"#opentelemetry","className":"peer","children":"OpenTelemetry"}],["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground op [...]
+17:["$","p",null,{"children":["Speaking of the Quickwit, we've also ",["$","$L2",null,{"href":"https://github.com/apache/iggy/pull/1294","children":"implemented"}]," a support for ",["$","$L2",null,{"href":"https://opentelemetry.io/","children":"OpenTelemetry"}]," logs & traces for the server. Since our SDK already uses the logging & tracing libraries, we thought that adding such a feature on the server, could help you gain even better, real-time observability into what's happening under [...]
+18:["$","$L26",null,{"className":"shiki shiki-themes github-light github-dark","style":{"--shiki-light":"#24292e","--shiki-dark":"#e1e4e8","--shiki-light-bg":"#fff","--shiki-dark-bg":"#24292e"},"tabIndex":"0","icon":"<svg viewBox=\"0 0 24 24\"><path d=\"M 6,1 C 4.354992,1 3,2.354992 3,4 v 16 c 0,1.645008 1.354992,3 3,3 h 12 c 1.645008,0 3,-1.354992 3,-3 V 8 7 A 1.0001,1.0001 0 0 0 20.707031,6.2929687 l -5,-5 A 1.0001,1.0001 0 0 0 15,1 h -1 z m 0,2 h 7 v 3 c 0,1.645008 1.354992,3 3,3 h 3 [...]
+19:["$","p",null,{"children":[["$","strong",null,{"children":"And just like with S3 storage, it's merely a beginning"}]," - one of the members on our ",["$","$L2",null,{"href":"https://discord.gg/apache-iggy","children":"Discord"}]," had already thought of extending this implementation by ",["$","strong",null,{"children":"propagating the trace context"}]," (via existing message headers metadata) between the clients & server in order to get full understanding of the distributed systems an [...]
+1a:["$","h3",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"optimizations","children":[["$","a",null,{"data-card":"","href":"#optimizations","className":"peer","children":"Optimizations"}],["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground op [...]
+1b:["$","p",null,{"children":["Improved messages batching, keeping the indexes & time indexes in a single file, making use of ",["$","strong",null,{"children":"mmap"}]," or ",["$","strong",null,{"children":"directIO"}]," for the data storage processing, ",["$","$L2",null,{"href":"https://github.com/rkyv/rkyv","children":"rkyv"}]," for ",["$","strong",null,{"children":"zero-copy (de)serialization"}],", keeping open the file descriptors and lots of other minor improvements - all these low [...]
+1c:["$","p",null,{"children":["$","strong",null,{"children":"To start the Iggy server, you just need to wait for a few milliseconds, and the RAM consumption is within a range ~20 MB, which is already over an order of magnitude lower than when compared to Kafka."}]}]
+1d:["$","p",null,{"children":["$","$L3",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"image","src":{"src":"/_next/static/media/iggy_docker.d90b2df3.png","width":2558,"height":1375,"blurWidth":8,"blurHeight":4,"blurDataURL":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAECAYAAACzzX7wAAAAY0lEQVR42jXLSw7DIBAE0eFjAkECsUAQj8n9b1lBsbxr6VVLa41SCjlnUkpYZ7HWEvdO74ys72KtC1Wl985xeLz3hBB4xYjopRtP5pzUWjc6vHMYYxAR5NTPH8cYd+Du9xP8AFWmJJciJgMPAAAAAElFTkSuQmCC"}, [...]
+1e:["$","h3",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"io_uring","children":[["$","a",null,{"data-card":"","href":"#io_uring","className":"peer","children":"io_uring"}],["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transit [...]
+1f:["$","p",null,{"children":["This will certainly require to have its own blog post, as there's so much to talk about. We did experiment with ",["$","$L2",null,{"href":"https://github.com/bytedance/monoio","children":"Monoio"}]," (which, in its basic form without additonal enhancements allowed us to reach ",["$","strong",null,{"children":"over 15 GB/s reads"}]," when compared to 10-12 GB/s for Tokio that we currently use), we also might experiment with ",["$","$L2",null,{"href":"https:/ [...]
+20:["$","p",null,{"children":["Yes, at this point you might call us crazy (",["$","strong",null,{"children":"io_uring"}]," won't happen before we release the first version of the VSR clustering anyway), but if you want to tick all the possible boxes, it's hard to find a generic framework that will meet your demands, especially when mixed altogether with VSR clustering, thread-per-core & shared-nothing design (if will turn out to be suitable), zero-copy deserialization libraries and other [...]
+21:["$","p",null,{"children":[["$","strong",null,{"children":"To innovate, one must experiment"}],", and although we do all these things in our spare time, it's been an exciting journey so far (and lots of experience gained in the meantime) for all of our team members building something fresh, from the very ground up, and regardless of the final outcome, we already know it was all worth it :)"]}]
+22:["$","footer",null,{"className":"mt-16 border-t border-fd-border pt-8","children":["$","$L3d",null,{"href":"/blogs","className":"inline-flex items-center gap-2 text-sm font-medium text-fd-primary transition-colors hover:opacity-80","children":"← Back to all posts"}]}]
+23:["$","script","script-0",{"src":"/_next/static/chunks/00b00679782d0ffd.js","async":true}]
+24:["$","script","script-1",{"src":"/_next/static/chunks/3562882a488c4fbb.js","async":true}]
+25:["$","$L3e",null,{"children":["$","$3f",null,{"name":"Next.MetadataOutlet","children":"$@40"}]}]
+28:["$","span",null,{"style":{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},"children":"\"123\""}]
+29:["$","span",null,{"className":"line"}]
+2a:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"},"children":"# Secret access key for the S3 bucket"}]}]
+2b:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"key_secret = "}],["$","span",null,{"style":{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},"children":"\"secret\""}]]}]
+2c:["$","span",null,{"className":"line"}]
+2d:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"},"children":"# Name of the S3 bucket."}]}]
+2e:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"bucket = "}],["$","span",null,{"style":{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},"children":"\"iggy\""}]]}]
+2f:["$","span",null,{"className":"line"}]
+30:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"},"children":"# Endpoint of the S3 region."}]}]
+31:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"endpoint = "}],["$","span",null,{"style":{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},"children":"\"http://localhost:9000\""}]]}]
+32:["$","span",null,{"className":"line"}]
+33:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"},"children":"# Region of the S3 bucket."}]}]
+34:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"region = "}],["$","span",null,{"style":{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},"children":"\"eu-west-1\""}]]}]
+35:["$","span",null,{"className":"line"}]
+36:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"},"children":"# Temporary directory for storing the data before uploading to S3."}]}]
+37:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"tmp_upload_dir = "}],["$","span",null,{"style":{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},"children":"\"local_data/s3_tmp\""}]]}]
+38:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"]"}]
+39:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"},"children":"# Transport for sending traces. Options: \"grpc\", \"http\"."}]}]
+3a:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"transport = "}],["$","span",null,{"style":{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},"children":"\"grpc\""}]]}]
+3b:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"},"children":"# Endpoint for sending traces."}]}]
+3c:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"endpoint = "}],["$","span",null,{"style":{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},"children":"\"http://localhost:7281/v1/traces\""}]]}]
+40:null
diff --git a/blogs/2024/10/28/technology-radar-and-currrent-goals/__next.!KHNpdGUp.blogs.$c$slug.txt b/blogs/2024/10/28/technology-radar-and-currrent-goals/__next.!KHNpdGUp.blogs.$c$slug.txt
new file mode 100644
index 00000000..11b31bb0
--- /dev/null
+++ b/blogs/2024/10/28/technology-radar-and-currrent-goals/__next.!KHNpdGUp.blogs.$c$slug.txt
@@ -0,0 +1,4 @@
+1:"$Sreact.fragment"
+2:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+3:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","template":["$","$L3",null,{}]}]]}],"loading":null,"isPartial":false}
diff --git a/blogs/2024/10/28/technology-radar-and-currrent-goals/__next.!KHNpdGUp.blogs.txt b/blogs/2024/10/28/technology-radar-and-currrent-goals/__next.!KHNpdGUp.blogs.txt
new file mode 100644
index 00000000..11b31bb0
--- /dev/null
+++ b/blogs/2024/10/28/technology-radar-and-currrent-goals/__next.!KHNpdGUp.blogs.txt
@@ -0,0 +1,4 @@
+1:"$Sreact.fragment"
+2:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+3:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","template":["$","$L3",null,{}]}]]}],"loading":null,"isPartial":false}
diff --git a/blogs/2024/10/28/technology-radar-and-currrent-goals/__next.!KHNpdGUp.txt b/blogs/2024/10/28/technology-radar-and-currrent-goals/__next.!KHNpdGUp.txt
new file mode 100644
index 00000000..ea3bfa55
--- /dev/null
+++ b/blogs/2024/10/28/technology-radar-and-currrent-goals/__next.!KHNpdGUp.txt
@@ -0,0 +1,9 @@
+1:"$Sreact.fragment"
+2:I[83571,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Header"]
+3:I[29966,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFDropdown"]
+4:I[36330,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFMobileLinks"]
+5:I[22016,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],""]
+6:I[88760,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Logo"]
+7:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+8:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","c",{"children":[[["$","script","script-0",{"src":"/_next/static/chunks/8d86be78428a601a.js","async":true}],["$","script","script-1",{"src":"/_next/static/chunks/da34cc6305706ac6.js","async":true}],["$","script","script-2",{"src":"/_next/static/chunks/9baf65674e2de991.js","async":true}],["$","script","script-3",{"src":"/_next/static/chunks/26b70f9828dd1eb5.js","async":true}],["$","script","script-4",{"src":"/_next/static/chunks/adeed83 [...]
diff --git a/blogs/2024/10/28/technology-radar-and-currrent-goals/__next._full.txt b/blogs/2024/10/28/technology-radar-and-currrent-goals/__next._full.txt
new file mode 100644
index 00000000..2351c853
--- /dev/null
+++ b/blogs/2024/10/28/technology-radar-and-currrent-goals/__next._full.txt
@@ -0,0 +1,86 @@
+1:"$Sreact.fragment"
+2:I[17751,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js"],"RootProvider"]
+3:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+4:I[58298,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/5a37d4cb1abe17d7.js"],"default"]
+5:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+6:I[83571,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Header"]
+7:I[29966,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFDropdown"]
+8:I[36330,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFMobileLinks"]
+9:I[22016,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],""]
+a:I[88760,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Logo"]
+11:I[68027,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+:HL["/_next/static/chunks/32a0415c8ab1bd26.css","style"]
+:HL["/_next/static/media/GeistMono_Variable.p.2f937313.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+:HL["/_next/static/media/Geist_Variable-s.p.92592eb2.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+0:{"P":null,"b":"uBHgltRE2s5QA49x61S_u","c":["","blogs","2024","10","28","technology-radar-and-currrent-goals",""],"q":"","i":false,"f":[[["",{"children":["(site)",{"children":["blogs",{"children":[["slug","2024/10/28/technology-radar-and-currrent-goals","c"],{"children":["__PAGE__",{}]}]}]}]},"$undefined","$undefined",true],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/32a0415c8ab1bd26.css","precedence":"next","crossOrigin":"$undefined","n [...]
+13:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"OutletBoundary"]
+14:"$Sreact.suspense"
+16:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"ViewportBoundary"]
+18:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"MetadataBoundary"]
+b:["$","h1",null,{"className":"next-error-h1","style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:1:props:style","children":404}]
+c:["$","div",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:style","children":["$","h2",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style","children":"This page could not be found."}]}]
+d:["$","$1","c",{"children":[null,["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}]
+e:["$","$1","c",{"children":[null,["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}]
+f:["$","$1","c",{"children":["$L12",[["$","script","script-0",{"src":"/_next/static/chunks/00b00679782d0ffd.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/3562882a488c4fbb.js","async":true,"nonce":"$undefined"}]],["$","$L13",null,{"children":["$","$14",null,{"name":"Next.MetadataOutlet","children":"$@15"}]}]]}]
+10:["$","$1","h",{"children":[null,["$","$L16",null,{"children":"$L17"}],["$","div",null,{"hidden":true,"children":["$","$L18",null,{"children":["$","$14",null,{"name":"Next.Metadata","children":"$L19"}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}]
+1a:I[47873,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"default"]
+1b:I[24110,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"Image"]
+12:["$","main",null,{"className":"min-h-screen px-6 py-16 md:px-12","children":["$","article",null,{"className":"mx-auto max-w-5xl","children":[["$","header",null,{"className":"mb-10","children":[["$","time",null,{"className":"text-sm font-medium text-fd-muted-foreground","children":"October 28, 2024"}],["$","h1",null,{"className":"mt-3 text-3xl font-extrabold tracking-tight text-fd-foreground md:text-5xl","children":"Iggy.rs - Technology Radar & current goals"}],["$","p",null,{"classNam [...]
+3b:I[44324,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"CodeBlock"]
+3c:I[44324,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"Pre"]
+1c:["$","p",null,{"children":["And if you are (or will be) one of such persons, please hop onto our ",["$","$L1a",null,{"href":"https://discord.gg/apache-iggy","children":"Discord"}]," and share your invaluable feedback with us!"]}]
+1d:["$","p",null,{"children":["Now, given the recent publication and increased activity within our ",["$","$L1a",null,{"href":"https://github.com/iggy-rs/","children":"OSS community"}]," building the core streaming server & SDKs in multiple programming languages, it's worth mentioning what are the current goals for Iggy."]}]
+1e:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"current-goals","children":[["$","a",null,{"data-card":"","href":"#current-goals","className":"peer","children":"Current goals"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd- [...]
+1f:["$","h3",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"replication","children":[["$","a",null,{"data-card":"","href":"#replication","className":"peer","children":"Replication"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted- [...]
+20:["$","p",null,{"children":"Without a doubt, being able to run your infrastructure (which processes & stores the data) as a cluster, gives much more confidence and greatly impacts the overall reliability."}]
+21:["$","p",null,{"children":["We've started ",["$","$L1a",null,{"href":"https://github.com/iggy-rs/iggy-cluster-sandbox","children":"experimenting"}]," with the replication over half a year ago already by implementing the basic, Raft based consensus algorithm for the simple message streaming server."]}]
+22:["$","p",null,{"children":["At the same time, we were researching the other possible solutions, after we've finally decided to move on with ",["$","strong",null,{"children":"Viewstamped Replication"}]," (in its ",["$","$L1a",null,{"href":"https://sands.kaust.edu.sa/classes/CS240/F21/papers/vr-revisited.pdf","children":"revisited form"}],"), which was successfully used by e.g. ",["$","$L1a",null,{"href":"https://tigerbeetle.com/","children":"TigerBeetle"}],"."]}]
+23:["$","p",null,{"children":["Long story short - the ",["$","strong",null,{"children":"deterministic leader election"}],", allows us to go for ring topology and chain replication of our data - it's excellent for high throughput, which is very important for us."]}]
+24:["$","p",null,{"children":["Moreover, ",["$","strong",null,{"children":"VSR can be run completely in memory"}],", providing us an opportunity to work independently both on the consensus and the storage and how to link these two together, to form a bulletproof storage fault model."]}]
+25:["$","p",null,{"children":"Below is our very first draft for the initial implementation of VSR."}]
+26:["$","p",null,{"children":["$","$L1b",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"image","src":{"src":"/_next/static/media/iggy_vsr.2ca278be.png","width":2832,"height":3281,"blurWidth":7,"blurHeight":8,"blurDataURL":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAICAYAAAA1BOUGAAAAgklEQVR42kWOXRICMQiDewSX39a2q6Pe/4oRmFl9SAsT+EI7bgdS0xW7K64+1YgIdBBUFMJS9c80d7g55tgwNWQvKqUwe2wZzvUCE8PHwP6cmO+F5t0LueezsOYGNQXnpqpGDmPdH5XH8s9tYgJmhgU6sZmVpDLzuSbz9 [...]
+27:["$","h3",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"s3-storage","children":[["$","a",null,{"data-card":"","href":"#s3-storage","className":"peer","children":"S3 storage"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-for [...]
+28:["$","p",null,{"children":["A few months ago, we did ",["$","$L1a",null,{"href":"https://github.com/apache/iggy/pull/1053","children":"implement"}]," an optional archiver for the server state log & streaming data (messages etc.) which supports any S3 compatible storage (just pick up your favorite cloud provider). The configuration is as simple as this example:"]}]
+29:["$","$L3b",null,{"className":"shiki shiki-themes github-light github-dark","style":{"--shiki-light":"#24292e","--shiki-dark":"#e1e4e8","--shiki-light-bg":"#fff","--shiki-dark-bg":"#24292e"},"tabIndex":"0","icon":"<svg viewBox=\"0 0 24 24\"><path d=\"M 6,1 C 4.354992,1 3,2.354992 3,4 v 16 c 0,1.645008 1.354992,3 3,3 h 12 c 1.645008,0 3,-1.354992 3,-3 V 8 7 A 1.0001,1.0001 0 0 0 20.707031,6.2929687 l -5,-5 A 1.0001,1.0001 0 0 0 15,1 h -1 z m 0,2 h 7 v 3 c 0,1.645008 1.354992,3 3,3 h 3 [...]
+2a:["$","p",null,{"children":[["$","strong",null,{"children":"By making use of S3, you could almost infinitely (and very cheaply) store your data"}]," - for the need of additional backups, being compliant with law regulations etc. However, there's one catch - in order to read the data stored with S3, you'd need to download it from the cloud and restart your server. And this is where things will change in the future - we're planning to implement a dedicated S3 storage, for both, writing a [...]
+2b:["$","ul",null,{"children":["\n",["$","li",null,{"children":[["$","strong",null,{"children":"L1"}]," - data available directly from the server RAM (super fast writes/reads)"]}],"\n",["$","li",null,{"children":[["$","strong",null,{"children":"L2"}]," - data stored on your servers disks (still very, very fast with NVME SSD gen4 or 5)"]}],"\n",["$","li",null,{"children":[["$","strong",null,{"children":"L3"}]," - S3 storage, still fast for the typical use-cases which do not require a very [...]
+2c:["$","p",null,{"children":[["$","strong",null,{"children":"Each of these storage layers could be optionally enabled or disabled"}],". You can already decide if and how much memory to use for caching the messages. With S3 tiered storage in place, you could e.g. treat your server's SSD as a sort of ring buffer for keeping the most recent data (easily millions or billions of messages, depending on their size) and only fetch the ones from S3, when you need something very old."]}]
+2d:["$","p",null,{"children":["Or, you could just ignore your server's RAM & SSD, and do all the writes and reads directly on S3, and still remain blazingly fast (just like ",["$","$L1a",null,{"href":"https://quickwit.io","children":"Quickwit"}],")."]}]
+2e:["$","h3",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"opentelemetry","children":[["$","a",null,{"data-card":"","href":"#opentelemetry","className":"peer","children":"OpenTelemetry"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd- [...]
+2f:["$","p",null,{"children":["Speaking of the Quickwit, we've also ",["$","$L1a",null,{"href":"https://github.com/apache/iggy/pull/1294","children":"implemented"}]," a support for ",["$","$L1a",null,{"href":"https://opentelemetry.io/","children":"OpenTelemetry"}]," logs & traces for the server. Since our SDK already uses the logging & tracing libraries, we thought that adding such a feature on the server, could help you gain even better, real-time observability into what's happening und [...]
+30:["$","$L3b",null,{"className":"shiki shiki-themes github-light github-dark","style":{"--shiki-light":"#24292e","--shiki-dark":"#e1e4e8","--shiki-light-bg":"#fff","--shiki-dark-bg":"#24292e"},"tabIndex":"0","icon":"<svg viewBox=\"0 0 24 24\"><path d=\"M 6,1 C 4.354992,1 3,2.354992 3,4 v 16 c 0,1.645008 1.354992,3 3,3 h 12 c 1.645008,0 3,-1.354992 3,-3 V 8 7 A 1.0001,1.0001 0 0 0 20.707031,6.2929687 l -5,-5 A 1.0001,1.0001 0 0 0 15,1 h -1 z m 0,2 h 7 v 3 c 0,1.645008 1.354992,3 3,3 h 3 [...]
+31:["$","p",null,{"children":[["$","strong",null,{"children":"And just like with S3 storage, it's merely a beginning"}]," - one of the members on our ",["$","$L1a",null,{"href":"https://discord.gg/apache-iggy","children":"Discord"}]," had already thought of extending this implementation by ",["$","strong",null,{"children":"propagating the trace context"}]," (via existing message headers metadata) between the clients & server in order to get full understanding of the distributed systems a [...]
+32:["$","h3",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"optimizations","children":[["$","a",null,{"data-card":"","href":"#optimizations","className":"peer","children":"Optimizations"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd- [...]
+33:["$","p",null,{"children":["Improved messages batching, keeping the indexes & time indexes in a single file, making use of ",["$","strong",null,{"children":"mmap"}]," or ",["$","strong",null,{"children":"directIO"}]," for the data storage processing, ",["$","$L1a",null,{"href":"https://github.com/rkyv/rkyv","children":"rkyv"}]," for ",["$","strong",null,{"children":"zero-copy (de)serialization"}],", keeping open the file descriptors and lots of other minor improvements - all these low [...]
+34:["$","p",null,{"children":["$","strong",null,{"children":"To start the Iggy server, you just need to wait for a few milliseconds, and the RAM consumption is within a range ~20 MB, which is already over an order of magnitude lower than when compared to Kafka."}]}]
+35:["$","p",null,{"children":["$","$L1b",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"image","src":{"src":"/_next/static/media/iggy_docker.d90b2df3.png","width":2558,"height":1375,"blurWidth":8,"blurHeight":4,"blurDataURL":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAECAYAAACzzX7wAAAAY0lEQVR42jXLSw7DIBAE0eFjAkECsUAQj8n9b1lBsbxr6VVLa41SCjlnUkpYZ7HWEvdO74ys72KtC1Wl985xeLz3hBB4xYjopRtP5pzUWjc6vHMYYxAR5NTPH8cYd+Du9xP8AFWmJJciJgMPAAAAAElFTkSuQmCC"} [...]
+36:["$","h3",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"io_uring","children":[["$","a",null,{"data-card":"","href":"#io_uring","className":"peer","children":"io_uring"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-foregroun [...]
+37:["$","p",null,{"children":["This will certainly require to have its own blog post, as there's so much to talk about. We did experiment with ",["$","$L1a",null,{"href":"https://github.com/bytedance/monoio","children":"Monoio"}]," (which, in its basic form without additonal enhancements allowed us to reach ",["$","strong",null,{"children":"over 15 GB/s reads"}]," when compared to 10-12 GB/s for Tokio that we currently use), we also might experiment with ",["$","$L1a",null,{"href":"https [...]
+38:["$","p",null,{"children":["Yes, at this point you might call us crazy (",["$","strong",null,{"children":"io_uring"}]," won't happen before we release the first version of the VSR clustering anyway), but if you want to tick all the possible boxes, it's hard to find a generic framework that will meet your demands, especially when mixed altogether with VSR clustering, thread-per-core & shared-nothing design (if will turn out to be suitable), zero-copy deserialization libraries and other [...]
+39:["$","p",null,{"children":[["$","strong",null,{"children":"To innovate, one must experiment"}],", and although we do all these things in our spare time, it's been an exciting journey so far (and lots of experience gained in the meantime) for all of our team members building something fresh, from the very ground up, and regardless of the final outcome, we already know it was all worth it :)"]}]
+3a:["$","footer",null,{"className":"mt-16 border-t border-fd-border pt-8","children":["$","$L9",null,{"href":"/blogs","className":"inline-flex items-center gap-2 text-sm font-medium text-fd-primary transition-colors hover:opacity-80","children":"← Back to all posts"}]}]
+3d:["$","span",null,{"style":{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},"children":"\"123\""}]
+3e:["$","span",null,{"className":"line"}]
+3f:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"},"children":"# Secret access key for the S3 bucket"}]}]
+40:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"key_secret = "}],["$","span",null,{"style":{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},"children":"\"secret\""}]]}]
+41:["$","span",null,{"className":"line"}]
+42:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"},"children":"# Name of the S3 bucket."}]}]
+43:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"bucket = "}],["$","span",null,{"style":{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},"children":"\"iggy\""}]]}]
+44:["$","span",null,{"className":"line"}]
+45:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"},"children":"# Endpoint of the S3 region."}]}]
+46:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"endpoint = "}],["$","span",null,{"style":{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},"children":"\"http://localhost:9000\""}]]}]
+47:["$","span",null,{"className":"line"}]
+48:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"},"children":"# Region of the S3 bucket."}]}]
+49:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"region = "}],["$","span",null,{"style":{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},"children":"\"eu-west-1\""}]]}]
+4a:["$","span",null,{"className":"line"}]
+4b:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"},"children":"# Temporary directory for storing the data before uploading to S3."}]}]
+4c:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"tmp_upload_dir = "}],["$","span",null,{"style":{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},"children":"\"local_data/s3_tmp\""}]]}]
+4d:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"]"}]
+4e:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"},"children":"# Transport for sending traces. Options: \"grpc\", \"http\"."}]}]
+4f:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"transport = "}],["$","span",null,{"style":{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},"children":"\"grpc\""}]]}]
+50:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"},"children":"# Endpoint for sending traces."}]}]
+51:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"endpoint = "}],["$","span",null,{"style":{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},"children":"\"http://localhost:7281/v1/traces\""}]]}]
+17:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
+52:I[27201,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"IconMark"]
+15:null
+19:[["$","title","0",{"children":"Iggy.rs - Technology Radar & current goals | Apache Iggy"}],["$","link","1",{"rel":"icon","href":"/img/favicon.png"}],["$","$L52","2",{}]]
diff --git a/blogs/2024/10/28/technology-radar-and-currrent-goals/__next._head.txt b/blogs/2024/10/28/technology-radar-and-currrent-goals/__next._head.txt
new file mode 100644
index 00000000..c74f97ca
--- /dev/null
+++ b/blogs/2024/10/28/technology-radar-and-currrent-goals/__next._head.txt
@@ -0,0 +1,6 @@
+1:"$Sreact.fragment"
+2:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"ViewportBoundary"]
+3:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"MetadataBoundary"]
+4:"$Sreact.suspense"
+5:I[27201,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"IconMark"]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","h",{"children":[null,["$","$L2",null,{"children":[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]}],["$","div",null,{"hidden":true,"children":["$","$L3",null,{"children":["$","$4",null,{"name":"Next.Metadata","children":[["$","title","0",{"children":"Iggy.rs - Technology Radar & current goals | Apache Iggy"}],["$","link","1",{"rel":"icon","href":"/img/favicon.p [...]
diff --git a/blogs/2024/10/28/technology-radar-and-currrent-goals/__next._index.txt b/blogs/2024/10/28/technology-radar-and-currrent-goals/__next._index.txt
new file mode 100644
index 00000000..fd02bd95
--- /dev/null
+++ b/blogs/2024/10/28/technology-radar-and-currrent-goals/__next._index.txt
@@ -0,0 +1,7 @@
+1:"$Sreact.fragment"
+2:I[17751,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js"],"RootProvider"]
+3:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+4:I[58298,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/5a37d4cb1abe17d7.js"],"default"]
+5:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+:HL["/_next/static/chunks/32a0415c8ab1bd26.css","style"]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/32a0415c8ab1bd26.css","precedence":"next"}],["$","script","script-0",{"src":"/_next/static/chunks/9ebd3a84bf60af84.js","async":true}],["$","script","script-1",{"src":"/_next/static/chunks/78b5f2e7b839e72f.js","async":true}]],["$","html",null,{"lang":"en","className":"geistsans_d5a4f12f-module__Ur3q_a__variable geistmono_157ca88a-module__iaM1Ya__variable" [...]
diff --git a/blogs/2024/10/28/technology-radar-and-currrent-goals/__next._tree.txt b/blogs/2024/10/28/technology-radar-and-currrent-goals/__next._tree.txt
new file mode 100644
index 00000000..2d8a8bc2
--- /dev/null
+++ b/blogs/2024/10/28/technology-radar-and-currrent-goals/__next._tree.txt
@@ -0,0 +1,4 @@
+:HL["/_next/static/chunks/32a0415c8ab1bd26.css","style"]
+:HL["/_next/static/media/GeistMono_Variable.p.2f937313.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+:HL["/_next/static/media/Geist_Variable-s.p.92592eb2.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","tree":{"name":"","paramType":null,"paramKey":"","hasRuntimePrefetch":false,"slots":{"children":{"name":"(site)","paramType":null,"paramKey":"(site)","hasRuntimePrefetch":false,"slots":{"children":{"name":"blogs","paramType":null,"paramKey":"blogs","hasRuntimePrefetch":false,"slots":{"children":{"name":"slug","paramType":"c","paramKey":"2024/10/28/technology-radar-and-currrent-goals","hasRuntimePrefetch":false,"slots":{"children":{"name":"__PAGE__","p [...]
diff --git a/blogs/2024/10/28/technology-radar-and-currrent-goals/index.html b/blogs/2024/10/28/technology-radar-and-currrent-goals/index.html
new file mode 100644
index 00000000..7c35398c
--- /dev/null
+++ b/blogs/2024/10/28/technology-radar-and-currrent-goals/index.html
@@ -0,0 +1,87 @@
+<!DOCTYPE html><!--uBHgltRE2s5QA49x61S_u--><html lang="en" class="geistsans_d5a4f12f-module__Ur3q_a__variable geistmono_157ca88a-module__iaM1Ya__variable"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" href="/_next/static/media/GeistMono_Variable.p.2f937313.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="preload" href="/_next/static/media/Geist_Variable-s.p.92592eb2.woff2" as="font" crossorigin="" type=" [...]
+<p>Quite recently (a few days ago), <a href="https://github.com/apache/iggy" rel="noreferrer noopener" target="_blank">Iggy</a> has been listed on <a href="https://www.thoughtworks.com/radar/platforms/summary/iggy" rel="noreferrer noopener" target="_blank">Technology Radar</a> by <a href="https://www.thoughtworks.com/" rel="noreferrer noopener" target="_blank">Thoughtworks</a> - a well-known technology consulting company.</p>
+<p>If you're not familiar with the Technology Radar, it's essentially an opinionated set (updated twice a year and subscribed by the thousands of developers worldwide) of the tools, platforms, frameworks, techniques etc. which you may want to try out & explore in your IT projects. Everything is split into the different categories, depending on the maturity or popularity of the particular tool.</p>
+<p><img alt="image" loading="lazy" width="4096" height="2290" decoding="async" data-nimg="1" class="rounded-lg" style="color:transparent;background-size:cover;background-position:50% 50%;background-repeat:no-repeat;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 320 160'%3E%3Cfilter id='b' color-interpolation-filters='sRGB'%3E%3CfeGaussianBlur stdDeviation='20'/%3E%3CfeCol [...]
+<p>As you can see, we were put right into the <strong>assess</strong> bucket (next to such renowned solutions such as e.g. <a href="https://www.foundationdb.org/" rel="noreferrer noopener" target="_blank">FoundationDB</a>) - being the projects which are worth exploring & understanding how they might affect your enterprise. Frankly speaking, we weren't expecting this at all, and <strong>from our perspective, it's quite of an accomplishment</strong>.</p>
+<p>Besides gaining an additional amount of trust & recognition, it has led us to another conclusion - someone out there we don't know yet about (maybe even one of their customers) is using/experimenting with Iggy :)</p>
+<p>And if you are (or will be) one of such persons, please hop onto our <a href="https://discord.gg/apache-iggy" rel="noreferrer noopener" target="_blank">Discord</a> and share your invaluable feedback with us!</p>
+<p>Now, given the recent publication and increased activity within our <a href="https://github.com/iggy-rs/" rel="noreferrer noopener" target="_blank">OSS community</a> building the core streaming server & SDKs in multiple programming languages, it's worth mentioning what are the current goals for Iggy.</p>
+<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="current-goals"><a data-card="" href="#current-goals" class="peer">Current goals</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 0 [...]
+<h3 class="flex scroll-m-28 flex-row items-center gap-2" id="replication"><a data-card="" href="#replication" class="peer">Replication</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.5 [...]
+<p>Without a doubt, being able to run your infrastructure (which processes & stores the data) as a cluster, gives much more confidence and greatly impacts the overall reliability.</p>
+<p>We've started <a href="https://github.com/iggy-rs/iggy-cluster-sandbox" rel="noreferrer noopener" target="_blank">experimenting</a> with the replication over half a year ago already by implementing the basic, Raft based consensus algorithm for the simple message streaming server.</p>
+<p>At the same time, we were researching the other possible solutions, after we've finally decided to move on with <strong>Viewstamped Replication</strong> (in its <a href="https://sands.kaust.edu.sa/classes/CS240/F21/papers/vr-revisited.pdf" rel="noreferrer noopener" target="_blank">revisited form</a>), which was successfully used by e.g. <a href="https://tigerbeetle.com/" rel="noreferrer noopener" target="_blank">TigerBeetle</a>.</p>
+<p>Long story short - the <strong>deterministic leader election</strong>, allows us to go for ring topology and chain replication of our data - it's excellent for high throughput, which is very important for us.</p>
+<p>Moreover, <strong>VSR can be run completely in memory</strong>, providing us an opportunity to work independently both on the consensus and the storage and how to link these two together, to form a bulletproof storage fault model.</p>
+<p>Below is our very first draft for the initial implementation of VSR.</p>
+<p><img alt="image" loading="lazy" width="2832" height="3281" decoding="async" data-nimg="1" class="rounded-lg" style="color:transparent;background-size:cover;background-position:50% 50%;background-repeat:no-repeat;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 280 320'%3E%3Cfilter id='b' color-interpolation-filters='sRGB'%3E%3CfeGaussianBlur stdDeviation='20'/%3E%3CfeCol [...]
+<h3 class="flex scroll-m-28 flex-row items-center gap-2" id="s3-storage"><a data-card="" href="#s3-storage" class="peer">S3 storage</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3 [...]
+<p>A few months ago, we did <a href="https://github.com/apache/iggy/pull/1053" rel="noreferrer noopener" target="_blank">implement</a> an optional archiver for the server state log & streaming data (messages etc.) which supports any S3 compatible storage (just pick up your favorite cloud provider). The configuration is as simple as this example:</p>
+<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-3 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-c [...]
+<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Enables or disables the archiver process.</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">enabled = </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">true</span></span>
+<span class="line"></span>
+<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Kind of archiver to use. Available options: "disk", "s3".</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">kind = </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"s3"</span></span>
+<span class="line"></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">[</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">data_maintenance</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">archiver</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">disk</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">] [...]
+<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Path for storing the archived data on disk.</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">path = </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"local_data/archive"</span></span>
+<span class="line"></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">[</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">data_maintenance</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">archiver</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">s3</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]</ [...]
+<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Access key ID for the S3 bucket.</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">key_id = </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"123"</span></span>
+<span class="line"></span>
+<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Secret access key for the S3 bucket</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">key_secret = </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"secret"</span></span>
+<span class="line"></span>
+<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Name of the S3 bucket.</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">bucket = </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"iggy"</span></span>
+<span class="line"></span>
+<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Endpoint of the S3 region.</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">endpoint = </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"http://localhost:9000"</span></span>
+<span class="line"></span>
+<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Region of the S3 bucket.</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">region = </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"eu-west-1"</span></span>
+<span class="line"></span>
+<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Temporary directory for storing the data before uploading to S3.</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">tmp_upload_dir = </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"local_data/s3_tmp"</span></span></code></pre></div></figure>
+<p><strong>By making use of S3, you could almost infinitely (and very cheaply) store your data</strong> - for the need of additional backups, being compliant with law regulations etc. However, there's one catch - in order to read the data stored with S3, you'd need to download it from the cloud and restart your server. And this is where things will change in the future - we're planning to implement a dedicated S3 storage, for both, writing and reading the data in real-time [...]
+<ul>
+<li><strong>L1</strong> - data available directly from the server RAM (super fast writes/reads)</li>
+<li><strong>L2</strong> - data stored on your servers disks (still very, very fast with NVME SSD gen4 or 5)</li>
+<li><strong>L3</strong> - S3 storage, still fast for the typical use-cases which do not require a very stable, microsecond level latencies</li>
+</ul>
+<p><strong>Each of these storage layers could be optionally enabled or disabled</strong>. You can already decide if and how much memory to use for caching the messages. With S3 tiered storage in place, you could e.g. treat your server's SSD as a sort of ring buffer for keeping the most recent data (easily millions or billions of messages, depending on their size) and only fetch the ones from S3, when you need something very old.</p>
+<p>Or, you could just ignore your server's RAM & SSD, and do all the writes and reads directly on S3, and still remain blazingly fast (just like <a href="https://quickwit.io" rel="noreferrer noopener" target="_blank">Quickwit</a>).</p>
+<h3 class="flex scroll-m-28 flex-row items-center gap-2" id="opentelemetry"><a data-card="" href="#opentelemetry" class="peer">OpenTelemetry</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 0 [...]
+<p>Speaking of the Quickwit, we've also <a href="https://github.com/apache/iggy/pull/1294" rel="noreferrer noopener" target="_blank">implemented</a> a support for <a href="https://opentelemetry.io/" rel="noreferrer noopener" target="_blank">OpenTelemetry</a> logs & traces for the server. Since our SDK already uses the logging & tracing libraries, we thought that adding such a feature on the server, could help you gain even better, real-time observability into what's hap [...]
+<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-3 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-c [...]
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">[</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">telemetry</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]</span></span>
+<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Enables or disables telemetry.</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">enabled = </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">false</span></span>
+<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Service name for telemetry.</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">service_name = </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"iggy"</span></span>
+<span class="line"></span>
+<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># OpenTelemetry logs configuration</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">[</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">telemetry</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">logs</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]</span></span>
+<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Transport for sending logs. Options: "grpc", "http".</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">transport = </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"grpc"</span></span>
+<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Endpoint for sending logs.</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">endpoint = </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"http://localhost:7281/v1/logs"</span></span>
+<span class="line"></span>
+<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># OpenTelemetry traces configuration</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">[</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">telemetry</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">traces</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]</span></span>
+<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Transport for sending traces. Options: "grpc", "http".</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">transport = </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"grpc"</span></span>
+<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Endpoint for sending traces.</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">endpoint = </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"http://localhost:7281/v1/traces"</span></span></code></pre></div></figure>
+<p><strong>And just like with S3 storage, it's merely a beginning</strong> - one of the members on our <a href="https://discord.gg/apache-iggy" rel="noreferrer noopener" target="_blank">Discord</a> had already thought of extending this implementation by <strong>propagating the trace context</strong> (via existing message headers metadata) between the clients & server in order to get full understanding of the distributed systems and its dependencies, which could be further visual [...]
+<h3 class="flex scroll-m-28 flex-row items-center gap-2" id="optimizations"><a data-card="" href="#optimizations" class="peer">Optimizations</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 0 [...]
+<p>Improved messages batching, keeping the indexes & time indexes in a single file, making use of <strong>mmap</strong> or <strong>directIO</strong> for the data storage processing, <a href="https://github.com/rkyv/rkyv" rel="noreferrer noopener" target="_blank">rkyv</a> for <strong>zero-copy (de)serialization</strong>, keeping open the file descriptors and lots of other minor improvements - all these low hanging fruits (or at least some of them), will hopefully build up to making Ig [...]
+<p><strong>To start the Iggy server, you just need to wait for a few milliseconds, and the RAM consumption is within a range ~20 MB, which is already over an order of magnitude lower than when compared to Kafka.</strong></p>
+<p><img alt="image" loading="lazy" width="2558" height="1375" decoding="async" data-nimg="1" class="rounded-lg" style="color:transparent;background-size:cover;background-position:50% 50%;background-repeat:no-repeat;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 320 160'%3E%3Cfilter id='b' color-interpolation-filters='sRGB'%3E%3CfeGaussianBlur stdDeviation='20'/%3E%3CfeCol [...]
+<h3 class="flex scroll-m-28 flex-row items-center gap-2" id="io_uring"><a data-card="" href="#io_uring" class="peer">io_uring</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 [...]
+<p>This will certainly require to have its own blog post, as there's so much to talk about. We did experiment with <a href="https://github.com/bytedance/monoio" rel="noreferrer noopener" target="_blank">Monoio</a> (which, in its basic form without additonal enhancements allowed us to reach <strong>over 15 GB/s reads</strong> when compared to 10-12 GB/s for Tokio that we currently use), we also might experiment with <a href="https://github.com/DataDog/glommio" rel="noreferrer noopene [...]
+<p>Yes, at this point you might call us crazy (<strong>io_uring</strong> won't happen before we release the first version of the VSR clustering anyway), but if you want to tick all the possible boxes, it's hard to find a generic framework that will meet your demands, especially when mixed altogether with VSR clustering, thread-per-core & shared-nothing design (if will turn out to be suitable), zero-copy deserialization libraries and other things we might even not be aware o [...]
+<p><strong>To innovate, one must experiment</strong>, and although we do all these things in our spare time, it's been an exciting journey so far (and lots of experience gained in the meantime) for all of our team members building something fresh, from the very ground up, and regardless of the final outcome, we already know it was all worth it :)</p></div><footer class="mt-16 border-t border-fd-border pt-8"><a class="inline-flex items-center gap-2 text-sm font-medium text-fd-primary [...]
\ No newline at end of file
diff --git a/blogs/2024/10/28/technology-radar-and-currrent-goals/index.txt b/blogs/2024/10/28/technology-radar-and-currrent-goals/index.txt
new file mode 100644
index 00000000..2351c853
--- /dev/null
+++ b/blogs/2024/10/28/technology-radar-and-currrent-goals/index.txt
@@ -0,0 +1,86 @@
+1:"$Sreact.fragment"
+2:I[17751,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js"],"RootProvider"]
+3:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+4:I[58298,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/5a37d4cb1abe17d7.js"],"default"]
+5:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+6:I[83571,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Header"]
+7:I[29966,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFDropdown"]
+8:I[36330,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFMobileLinks"]
+9:I[22016,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],""]
+a:I[88760,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Logo"]
+11:I[68027,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+:HL["/_next/static/chunks/32a0415c8ab1bd26.css","style"]
+:HL["/_next/static/media/GeistMono_Variable.p.2f937313.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+:HL["/_next/static/media/Geist_Variable-s.p.92592eb2.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+0:{"P":null,"b":"uBHgltRE2s5QA49x61S_u","c":["","blogs","2024","10","28","technology-radar-and-currrent-goals",""],"q":"","i":false,"f":[[["",{"children":["(site)",{"children":["blogs",{"children":[["slug","2024/10/28/technology-radar-and-currrent-goals","c"],{"children":["__PAGE__",{}]}]}]}]},"$undefined","$undefined",true],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/32a0415c8ab1bd26.css","precedence":"next","crossOrigin":"$undefined","n [...]
+13:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"OutletBoundary"]
+14:"$Sreact.suspense"
+16:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"ViewportBoundary"]
+18:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"MetadataBoundary"]
+b:["$","h1",null,{"className":"next-error-h1","style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:1:props:style","children":404}]
+c:["$","div",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:style","children":["$","h2",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style","children":"This page could not be found."}]}]
+d:["$","$1","c",{"children":[null,["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}]
+e:["$","$1","c",{"children":[null,["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}]
+f:["$","$1","c",{"children":["$L12",[["$","script","script-0",{"src":"/_next/static/chunks/00b00679782d0ffd.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/3562882a488c4fbb.js","async":true,"nonce":"$undefined"}]],["$","$L13",null,{"children":["$","$14",null,{"name":"Next.MetadataOutlet","children":"$@15"}]}]]}]
+10:["$","$1","h",{"children":[null,["$","$L16",null,{"children":"$L17"}],["$","div",null,{"hidden":true,"children":["$","$L18",null,{"children":["$","$14",null,{"name":"Next.Metadata","children":"$L19"}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}]
+1a:I[47873,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"default"]
+1b:I[24110,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"Image"]
+12:["$","main",null,{"className":"min-h-screen px-6 py-16 md:px-12","children":["$","article",null,{"className":"mx-auto max-w-5xl","children":[["$","header",null,{"className":"mb-10","children":[["$","time",null,{"className":"text-sm font-medium text-fd-muted-foreground","children":"October 28, 2024"}],["$","h1",null,{"className":"mt-3 text-3xl font-extrabold tracking-tight text-fd-foreground md:text-5xl","children":"Iggy.rs - Technology Radar & current goals"}],["$","p",null,{"classNam [...]
+3b:I[44324,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"CodeBlock"]
+3c:I[44324,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"Pre"]
+1c:["$","p",null,{"children":["And if you are (or will be) one of such persons, please hop onto our ",["$","$L1a",null,{"href":"https://discord.gg/apache-iggy","children":"Discord"}]," and share your invaluable feedback with us!"]}]
+1d:["$","p",null,{"children":["Now, given the recent publication and increased activity within our ",["$","$L1a",null,{"href":"https://github.com/iggy-rs/","children":"OSS community"}]," building the core streaming server & SDKs in multiple programming languages, it's worth mentioning what are the current goals for Iggy."]}]
+1e:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"current-goals","children":[["$","a",null,{"data-card":"","href":"#current-goals","className":"peer","children":"Current goals"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd- [...]
+1f:["$","h3",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"replication","children":[["$","a",null,{"data-card":"","href":"#replication","className":"peer","children":"Replication"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted- [...]
+20:["$","p",null,{"children":"Without a doubt, being able to run your infrastructure (which processes & stores the data) as a cluster, gives much more confidence and greatly impacts the overall reliability."}]
+21:["$","p",null,{"children":["We've started ",["$","$L1a",null,{"href":"https://github.com/iggy-rs/iggy-cluster-sandbox","children":"experimenting"}]," with the replication over half a year ago already by implementing the basic, Raft based consensus algorithm for the simple message streaming server."]}]
+22:["$","p",null,{"children":["At the same time, we were researching the other possible solutions, after we've finally decided to move on with ",["$","strong",null,{"children":"Viewstamped Replication"}]," (in its ",["$","$L1a",null,{"href":"https://sands.kaust.edu.sa/classes/CS240/F21/papers/vr-revisited.pdf","children":"revisited form"}],"), which was successfully used by e.g. ",["$","$L1a",null,{"href":"https://tigerbeetle.com/","children":"TigerBeetle"}],"."]}]
+23:["$","p",null,{"children":["Long story short - the ",["$","strong",null,{"children":"deterministic leader election"}],", allows us to go for ring topology and chain replication of our data - it's excellent for high throughput, which is very important for us."]}]
+24:["$","p",null,{"children":["Moreover, ",["$","strong",null,{"children":"VSR can be run completely in memory"}],", providing us an opportunity to work independently both on the consensus and the storage and how to link these two together, to form a bulletproof storage fault model."]}]
+25:["$","p",null,{"children":"Below is our very first draft for the initial implementation of VSR."}]
+26:["$","p",null,{"children":["$","$L1b",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"image","src":{"src":"/_next/static/media/iggy_vsr.2ca278be.png","width":2832,"height":3281,"blurWidth":7,"blurHeight":8,"blurDataURL":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAICAYAAAA1BOUGAAAAgklEQVR42kWOXRICMQiDewSX39a2q6Pe/4oRmFl9SAsT+EI7bgdS0xW7K64+1YgIdBBUFMJS9c80d7g55tgwNWQvKqUwe2wZzvUCE8PHwP6cmO+F5t0LueezsOYGNQXnpqpGDmPdH5XH8s9tYgJmhgU6sZmVpDLzuSbz9 [...]
+27:["$","h3",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"s3-storage","children":[["$","a",null,{"data-card":"","href":"#s3-storage","className":"peer","children":"S3 storage"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-for [...]
+28:["$","p",null,{"children":["A few months ago, we did ",["$","$L1a",null,{"href":"https://github.com/apache/iggy/pull/1053","children":"implement"}]," an optional archiver for the server state log & streaming data (messages etc.) which supports any S3 compatible storage (just pick up your favorite cloud provider). The configuration is as simple as this example:"]}]
+29:["$","$L3b",null,{"className":"shiki shiki-themes github-light github-dark","style":{"--shiki-light":"#24292e","--shiki-dark":"#e1e4e8","--shiki-light-bg":"#fff","--shiki-dark-bg":"#24292e"},"tabIndex":"0","icon":"<svg viewBox=\"0 0 24 24\"><path d=\"M 6,1 C 4.354992,1 3,2.354992 3,4 v 16 c 0,1.645008 1.354992,3 3,3 h 12 c 1.645008,0 3,-1.354992 3,-3 V 8 7 A 1.0001,1.0001 0 0 0 20.707031,6.2929687 l -5,-5 A 1.0001,1.0001 0 0 0 15,1 h -1 z m 0,2 h 7 v 3 c 0,1.645008 1.354992,3 3,3 h 3 [...]
+2a:["$","p",null,{"children":[["$","strong",null,{"children":"By making use of S3, you could almost infinitely (and very cheaply) store your data"}]," - for the need of additional backups, being compliant with law regulations etc. However, there's one catch - in order to read the data stored with S3, you'd need to download it from the cloud and restart your server. And this is where things will change in the future - we're planning to implement a dedicated S3 storage, for both, writing a [...]
+2b:["$","ul",null,{"children":["\n",["$","li",null,{"children":[["$","strong",null,{"children":"L1"}]," - data available directly from the server RAM (super fast writes/reads)"]}],"\n",["$","li",null,{"children":[["$","strong",null,{"children":"L2"}]," - data stored on your servers disks (still very, very fast with NVME SSD gen4 or 5)"]}],"\n",["$","li",null,{"children":[["$","strong",null,{"children":"L3"}]," - S3 storage, still fast for the typical use-cases which do not require a very [...]
+2c:["$","p",null,{"children":[["$","strong",null,{"children":"Each of these storage layers could be optionally enabled or disabled"}],". You can already decide if and how much memory to use for caching the messages. With S3 tiered storage in place, you could e.g. treat your server's SSD as a sort of ring buffer for keeping the most recent data (easily millions or billions of messages, depending on their size) and only fetch the ones from S3, when you need something very old."]}]
+2d:["$","p",null,{"children":["Or, you could just ignore your server's RAM & SSD, and do all the writes and reads directly on S3, and still remain blazingly fast (just like ",["$","$L1a",null,{"href":"https://quickwit.io","children":"Quickwit"}],")."]}]
+2e:["$","h3",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"opentelemetry","children":[["$","a",null,{"data-card":"","href":"#opentelemetry","className":"peer","children":"OpenTelemetry"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd- [...]
+2f:["$","p",null,{"children":["Speaking of the Quickwit, we've also ",["$","$L1a",null,{"href":"https://github.com/apache/iggy/pull/1294","children":"implemented"}]," a support for ",["$","$L1a",null,{"href":"https://opentelemetry.io/","children":"OpenTelemetry"}]," logs & traces for the server. Since our SDK already uses the logging & tracing libraries, we thought that adding such a feature on the server, could help you gain even better, real-time observability into what's happening und [...]
+30:["$","$L3b",null,{"className":"shiki shiki-themes github-light github-dark","style":{"--shiki-light":"#24292e","--shiki-dark":"#e1e4e8","--shiki-light-bg":"#fff","--shiki-dark-bg":"#24292e"},"tabIndex":"0","icon":"<svg viewBox=\"0 0 24 24\"><path d=\"M 6,1 C 4.354992,1 3,2.354992 3,4 v 16 c 0,1.645008 1.354992,3 3,3 h 12 c 1.645008,0 3,-1.354992 3,-3 V 8 7 A 1.0001,1.0001 0 0 0 20.707031,6.2929687 l -5,-5 A 1.0001,1.0001 0 0 0 15,1 h -1 z m 0,2 h 7 v 3 c 0,1.645008 1.354992,3 3,3 h 3 [...]
+31:["$","p",null,{"children":[["$","strong",null,{"children":"And just like with S3 storage, it's merely a beginning"}]," - one of the members on our ",["$","$L1a",null,{"href":"https://discord.gg/apache-iggy","children":"Discord"}]," had already thought of extending this implementation by ",["$","strong",null,{"children":"propagating the trace context"}]," (via existing message headers metadata) between the clients & server in order to get full understanding of the distributed systems a [...]
+32:["$","h3",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"optimizations","children":[["$","a",null,{"data-card":"","href":"#optimizations","className":"peer","children":"Optimizations"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd- [...]
+33:["$","p",null,{"children":["Improved messages batching, keeping the indexes & time indexes in a single file, making use of ",["$","strong",null,{"children":"mmap"}]," or ",["$","strong",null,{"children":"directIO"}]," for the data storage processing, ",["$","$L1a",null,{"href":"https://github.com/rkyv/rkyv","children":"rkyv"}]," for ",["$","strong",null,{"children":"zero-copy (de)serialization"}],", keeping open the file descriptors and lots of other minor improvements - all these low [...]
+34:["$","p",null,{"children":["$","strong",null,{"children":"To start the Iggy server, you just need to wait for a few milliseconds, and the RAM consumption is within a range ~20 MB, which is already over an order of magnitude lower than when compared to Kafka."}]}]
+35:["$","p",null,{"children":["$","$L1b",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"image","src":{"src":"/_next/static/media/iggy_docker.d90b2df3.png","width":2558,"height":1375,"blurWidth":8,"blurHeight":4,"blurDataURL":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAECAYAAACzzX7wAAAAY0lEQVR42jXLSw7DIBAE0eFjAkECsUAQj8n9b1lBsbxr6VVLa41SCjlnUkpYZ7HWEvdO74ys72KtC1Wl985xeLz3hBB4xYjopRtP5pzUWjc6vHMYYxAR5NTPH8cYd+Du9xP8AFWmJJciJgMPAAAAAElFTkSuQmCC"} [...]
+36:["$","h3",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"io_uring","children":[["$","a",null,{"data-card":"","href":"#io_uring","className":"peer","children":"io_uring"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-foregroun [...]
+37:["$","p",null,{"children":["This will certainly require to have its own blog post, as there's so much to talk about. We did experiment with ",["$","$L1a",null,{"href":"https://github.com/bytedance/monoio","children":"Monoio"}]," (which, in its basic form without additonal enhancements allowed us to reach ",["$","strong",null,{"children":"over 15 GB/s reads"}]," when compared to 10-12 GB/s for Tokio that we currently use), we also might experiment with ",["$","$L1a",null,{"href":"https [...]
+38:["$","p",null,{"children":["Yes, at this point you might call us crazy (",["$","strong",null,{"children":"io_uring"}]," won't happen before we release the first version of the VSR clustering anyway), but if you want to tick all the possible boxes, it's hard to find a generic framework that will meet your demands, especially when mixed altogether with VSR clustering, thread-per-core & shared-nothing design (if will turn out to be suitable), zero-copy deserialization libraries and other [...]
+39:["$","p",null,{"children":[["$","strong",null,{"children":"To innovate, one must experiment"}],", and although we do all these things in our spare time, it's been an exciting journey so far (and lots of experience gained in the meantime) for all of our team members building something fresh, from the very ground up, and regardless of the final outcome, we already know it was all worth it :)"]}]
+3a:["$","footer",null,{"className":"mt-16 border-t border-fd-border pt-8","children":["$","$L9",null,{"href":"/blogs","className":"inline-flex items-center gap-2 text-sm font-medium text-fd-primary transition-colors hover:opacity-80","children":"← Back to all posts"}]}]
+3d:["$","span",null,{"style":{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},"children":"\"123\""}]
+3e:["$","span",null,{"className":"line"}]
+3f:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"},"children":"# Secret access key for the S3 bucket"}]}]
+40:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"key_secret = "}],["$","span",null,{"style":{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},"children":"\"secret\""}]]}]
+41:["$","span",null,{"className":"line"}]
+42:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"},"children":"# Name of the S3 bucket."}]}]
+43:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"bucket = "}],["$","span",null,{"style":{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},"children":"\"iggy\""}]]}]
+44:["$","span",null,{"className":"line"}]
+45:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"},"children":"# Endpoint of the S3 region."}]}]
+46:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"endpoint = "}],["$","span",null,{"style":{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},"children":"\"http://localhost:9000\""}]]}]
+47:["$","span",null,{"className":"line"}]
+48:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"},"children":"# Region of the S3 bucket."}]}]
+49:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"region = "}],["$","span",null,{"style":{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},"children":"\"eu-west-1\""}]]}]
+4a:["$","span",null,{"className":"line"}]
+4b:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"},"children":"# Temporary directory for storing the data before uploading to S3."}]}]
+4c:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"tmp_upload_dir = "}],["$","span",null,{"style":{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},"children":"\"local_data/s3_tmp\""}]]}]
+4d:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"]"}]
+4e:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"},"children":"# Transport for sending traces. Options: \"grpc\", \"http\"."}]}]
+4f:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"transport = "}],["$","span",null,{"style":{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},"children":"\"grpc\""}]]}]
+50:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"},"children":"# Endpoint for sending traces."}]}]
+51:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"endpoint = "}],["$","span",null,{"style":{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},"children":"\"http://localhost:7281/v1/traces\""}]]}]
+17:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
+52:I[27201,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"IconMark"]
+15:null
+19:[["$","title","0",{"children":"Iggy.rs - Technology Radar & current goals | Apache Iggy"}],["$","link","1",{"rel":"icon","href":"/img/favicon.png"}],["$","$L52","2",{}]]
diff --git a/blogs/2025/02/10/apache-incubator/__next.!KHNpdGUp.blogs.$c$slug.__PAGE__.txt b/blogs/2025/02/10/apache-incubator/__next.!KHNpdGUp.blogs.$c$slug.__PAGE__.txt
new file mode 100644
index 00000000..eac01738
--- /dev/null
+++ b/blogs/2025/02/10/apache-incubator/__next.!KHNpdGUp.blogs.$c$slug.__PAGE__.txt
@@ -0,0 +1,35 @@
+1:"$Sreact.fragment"
+2:I[47873,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"default"]
+1e:I[24110,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"Image"]
+1f:I[22016,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],""]
+20:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"OutletBoundary"]
+21:"$Sreact.suspense"
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","c",{"children":[["$","main",null,{"className":"min-h-screen px-6 py-16 md:px-12","children":["$","article",null,{"className":"mx-auto max-w-5xl","children":[["$","header",null,{"className":"mb-10","children":[["$","time",null,{"className":"text-sm font-medium text-fd-muted-foreground","children":"February 10, 2025"}],["$","h1",null,{"className":"mt-3 text-3xl font-extrabold tracking-tight text-fd-foreground md:text-5xl","children":"Ig [...]
+3:["$","path","19qd67",{"d":"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"}]
+4:["$","p",null,{"children":"Iggy is no longer just about the core repository. Over time, we’ve built an entire ecosystem around it, including:"}]
+5:["$","ul",null,{"children":["\n",["$","li",null,{"children":"✅ SDKs for seamless developer integrations"}],"\n",["$","li",null,{"children":"✅ CLIs for powerful command-line control"}],"\n",["$","li",null,{"children":"✅ Web UIs for intuitive management"}],"\n",["$","li",null,{"children":"✅ And many more…"}],"\n"]}]
+6:["$","p",null,{"children":["We’re already approaching 20 repositories under the Iggy organization (",["$","$L2",null,{"href":"https://github.com/iggy-rs/","children":"see them here"}],"), and as we enter the Apache Incubator, we are committed to ensuring that all of them follow ASF guidelines while maintaining our core values of speed, efficiency, and simplicity."]}]
+7:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"-why-apache","children":[["$","a",null,{"data-card":"","href":"#-why-apache","className":"peer","children":"🔗 Why Apache?"}],["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity [...]
+8:["$","p",null,{"children":["The Apache Software Foundation has nurtured some of the ",["$","strong",null,{"children":"most transformative open-source projects in history"}]," — Hadoop, Spark, Lucene, Solr, Cassandra, Kafka, Flink, and Airflow — technologies that have ",["$","strong",null,{"children":"shaped big data, search, and real-time processing"}],". By joining Apache Incubator, we align with this legacy and ",["$","strong",null,{"children":"gain access to a larger community, bett [...]
+9:["$","p",null,{"children":"🔗 Dive into the Apache Incubator Details"}]
+a:["$","ul",null,{"children":["\n",["$","li",null,{"children":["$","$L2",null,{"href":"https://cwiki.apache.org/confluence/display/INCUBATOR/Iggy+Proposal","children":"Official Proposal"}]}],"\n",["$","li",null,{"children":["$","$L2",null,{"href":"https://lists.apache.org/thread/q9whr3q9qd6wqm89f0vc1f6vkkvzc8xf","children":"Discussion Thread"}]}],"\n",["$","li",null,{"children":["$","$L2",null,{"href":"https://lists.apache.org/thread/6zfgdjwrzs92h4z4x6b25v1r23g3f5yg","children":"Voting R [...]
+b:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"-whats-next","children":[["$","a",null,{"data-card":"","href":"#-whats-next","className":"peer","children":"📈 What’s Next?"}],["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacit [...]
+c:["$","p",null,{"children":[["$","strong",null,{"children":"Our vision is clear: Iggy as a future Apache Top-Level Project (TLP)"}],". We already have ambitious ideas on how to improve both the project and the community around it:"]}]
+d:["$","ul",null,{"children":["\n",["$","li",null,{"children":[["$","strong",null,{"children":"Scaling performance benchmarks"}]," to push the limits of ultra-low-latency streaming"]}],"\n",["$","li",null,{"children":[["$","strong",null,{"children":"Expanding integrations"}]," with modern data infrastructure"]}],"\n",["$","li",null,{"children":[["$","strong",null,{"children":"Building a vibrant developer ecosystem"}]," that makes message streaming frictionless"]}],"\n"]}]
+e:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"-codebase-transition","children":[["$","a",null,{"data-card":"","href":"#-codebase-transition","className":"peer","children":"🦀 Codebase transition"}],["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-f [...]
+f:["$","p",null,{"children":["After the recent ",["$","$L2",null,{"href":"https://lists.apache.org/thread/zrn96nlg23r9353lr5tp2by2ggx4zxqc","children":"discussion"}],", we plan to stick to the ",["$","strong",null,{"children":"monorepo approach"}],", under which, we will have a single repository for all the Iggy-related projects. This will make it easier for the contributors to navigate through the codebase, and to see how the changes in one project affect the others. This should also he [...]
+10:["$","p",null,{"children":["All the repositories under ",["$","$L2",null,{"href":"https://github.com/iggy-rs","children":"iggy-rs"}]," will be eventually moved to the ",["$","$L2",null,{"href":"https://github.com/apache/iggy","children":"apache/iggy"}]," repository, and we will make sure that all the existing links and references are updated accordingly."]}]
+11:["$","p",null,{"children":["We'll also host our website under the ",["$","$L2",null,{"href":"https://iggy.apache.org","children":"iggy.apache.org"}]," domain, including the documentation, blog, and the upcoming benchmarks. We've also updated our social media handles to contain the Apache prefix."]}]
+12:["$","p",null,{"children":"There will be most likely some changes related to hosting the Docker images, as well as the other tools we're using, but we'll make sure to keep you updated on that."}]
+13:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"-join-the-movement","children":[["$","a",null,{"data-card":"","href":"#-join-the-movement","className":"peer","children":"💡 Join the Movement"}],["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-mut [...]
+14:["$","p",null,{"children":"If you believe in a future where message streaming is lightning-fast, hyper-efficient, and accessible to all, we invite you to be part of this journey. Whether you're a developer, architect, or enterprise innovator, your contributions, feedback, and ideas will shape what comes next."}]
+15:["$","p",null,{"children":["And this is just the beginning. ",["$","strong",null,{"children":"Welcome to the era of Hyper-Efficient Message Streaming at Laser Speed."}]]}]
+16:["$","p",null,{"children":[["$","strong",null,{"children":"Last but not least, we've got a new logo"}],"! Our lovely Italian Greyhound is now a part of the Apache family, and we're proud to have it as our mascot. As you can see, it's so fast, that even the light travelling through the optical fiber can't keep up with it :)"]}]
+17:["$","p",null,{"children":["$","$L1e",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"image","src":{"src":"/_next/static/media/iggy_logo.f9977802.png","width":1800,"height":1000,"blurWidth":8,"blurHeight":4,"blurDataURL":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAECAIAAAA8r+mnAAAAWklEQVR42k2MMQqAMBAENyEQkjYPUKs0IXBwqO3BfUJEEfz/H7xCxCkWFnYHALz3OWdL5xw+rJdSjn2bxoGIWmu11pQSYoy99/s612UWEVVlZhO8J5uEEPDjAZO7CGDEbsPrAAAAAElFTkSuQmCC"},"placeholder" [...]
+18:["$","p",null,{"children":"👉 Follow us, contribute, and help to build the future of the message streaming!"}]
+19:["$","ul",null,{"children":["\n",["$","li",null,{"children":["$","$L2",null,{"href":"https://discord.gg/apache-iggy","children":"Discord"}]}],"\n",["$","li",null,{"children":["$","$L2",null,{"href":"https://x.com/ApacheIggy","children":"X (Twitter)"}]}],"\n",["$","li",null,{"children":["$","$L2",null,{"href":"https://bsky.app/profile/iggy.rs","children":"Bluesky"}]}],"\n",["$","li",null,{"children":["$","$L2",null,{"href":"https://www.linkedin.com/company/apache-iggy/","children":"Lin [...]
+1a:["$","footer",null,{"className":"mt-16 border-t border-fd-border pt-8","children":["$","$L1f",null,{"href":"/blogs","className":"inline-flex items-center gap-2 text-sm font-medium text-fd-primary transition-colors hover:opacity-80","children":"← Back to all posts"}]}]
+1b:["$","script","script-0",{"src":"/_next/static/chunks/00b00679782d0ffd.js","async":true}]
+1c:["$","script","script-1",{"src":"/_next/static/chunks/3562882a488c4fbb.js","async":true}]
+1d:["$","$L20",null,{"children":["$","$21",null,{"name":"Next.MetadataOutlet","children":"$@22"}]}]
+22:null
diff --git a/blogs/2025/02/10/apache-incubator/__next.!KHNpdGUp.blogs.$c$slug.txt b/blogs/2025/02/10/apache-incubator/__next.!KHNpdGUp.blogs.$c$slug.txt
new file mode 100644
index 00000000..11b31bb0
--- /dev/null
+++ b/blogs/2025/02/10/apache-incubator/__next.!KHNpdGUp.blogs.$c$slug.txt
@@ -0,0 +1,4 @@
+1:"$Sreact.fragment"
+2:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+3:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","template":["$","$L3",null,{}]}]]}],"loading":null,"isPartial":false}
diff --git a/blogs/2025/02/10/apache-incubator/__next.!KHNpdGUp.blogs.txt b/blogs/2025/02/10/apache-incubator/__next.!KHNpdGUp.blogs.txt
new file mode 100644
index 00000000..11b31bb0
--- /dev/null
+++ b/blogs/2025/02/10/apache-incubator/__next.!KHNpdGUp.blogs.txt
@@ -0,0 +1,4 @@
+1:"$Sreact.fragment"
+2:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+3:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","template":["$","$L3",null,{}]}]]}],"loading":null,"isPartial":false}
diff --git a/blogs/2025/02/10/apache-incubator/__next.!KHNpdGUp.txt b/blogs/2025/02/10/apache-incubator/__next.!KHNpdGUp.txt
new file mode 100644
index 00000000..ea3bfa55
--- /dev/null
+++ b/blogs/2025/02/10/apache-incubator/__next.!KHNpdGUp.txt
@@ -0,0 +1,9 @@
+1:"$Sreact.fragment"
+2:I[83571,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Header"]
+3:I[29966,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFDropdown"]
+4:I[36330,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFMobileLinks"]
+5:I[22016,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],""]
+6:I[88760,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Logo"]
+7:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+8:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","c",{"children":[[["$","script","script-0",{"src":"/_next/static/chunks/8d86be78428a601a.js","async":true}],["$","script","script-1",{"src":"/_next/static/chunks/da34cc6305706ac6.js","async":true}],["$","script","script-2",{"src":"/_next/static/chunks/9baf65674e2de991.js","async":true}],["$","script","script-3",{"src":"/_next/static/chunks/26b70f9828dd1eb5.js","async":true}],["$","script","script-4",{"src":"/_next/static/chunks/adeed83 [...]
diff --git a/blogs/2025/02/10/apache-incubator/__next._full.txt b/blogs/2025/02/10/apache-incubator/__next._full.txt
new file mode 100644
index 00000000..f903374b
--- /dev/null
+++ b/blogs/2025/02/10/apache-incubator/__next._full.txt
@@ -0,0 +1,55 @@
+1:"$Sreact.fragment"
+2:I[17751,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js"],"RootProvider"]
+3:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+4:I[58298,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/5a37d4cb1abe17d7.js"],"default"]
+5:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+6:I[83571,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Header"]
+7:I[29966,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFDropdown"]
+8:I[36330,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFMobileLinks"]
+9:I[22016,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],""]
+a:I[88760,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Logo"]
+11:I[68027,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+:HL["/_next/static/chunks/32a0415c8ab1bd26.css","style"]
+:HL["/_next/static/media/GeistMono_Variable.p.2f937313.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+:HL["/_next/static/media/Geist_Variable-s.p.92592eb2.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+0:{"P":null,"b":"uBHgltRE2s5QA49x61S_u","c":["","blogs","2025","02","10","apache-incubator",""],"q":"","i":false,"f":[[["",{"children":["(site)",{"children":["blogs",{"children":[["slug","2025/02/10/apache-incubator","c"],{"children":["__PAGE__",{}]}]}]}]},"$undefined","$undefined",true],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/32a0415c8ab1bd26.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","sc [...]
+13:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"OutletBoundary"]
+14:"$Sreact.suspense"
+16:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"ViewportBoundary"]
+18:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"MetadataBoundary"]
+b:["$","h1",null,{"className":"next-error-h1","style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:1:props:style","children":404}]
+c:["$","div",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:style","children":["$","h2",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style","children":"This page could not be found."}]}]
+d:["$","$1","c",{"children":[null,["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}]
+e:["$","$1","c",{"children":[null,["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}]
+f:["$","$1","c",{"children":["$L12",[["$","script","script-0",{"src":"/_next/static/chunks/00b00679782d0ffd.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/3562882a488c4fbb.js","async":true,"nonce":"$undefined"}]],["$","$L13",null,{"children":["$","$14",null,{"name":"Next.MetadataOutlet","children":"$@15"}]}]]}]
+10:["$","$1","h",{"children":[null,["$","$L16",null,{"children":"$L17"}],["$","div",null,{"hidden":true,"children":["$","$L18",null,{"children":["$","$14",null,{"name":"Next.Metadata","children":"$L19"}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}]
+1a:I[47873,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"default"]
+12:["$","main",null,{"className":"min-h-screen px-6 py-16 md:px-12","children":["$","article",null,{"className":"mx-auto max-w-5xl","children":[["$","header",null,{"className":"mb-10","children":[["$","time",null,{"className":"text-sm font-medium text-fd-muted-foreground","children":"February 10, 2025"}],["$","h1",null,{"className":"mt-3 text-3xl font-extrabold tracking-tight text-fd-foreground md:text-5xl","children":"Iggy joins the Apache Incubator"}],["$","p",null,{"className":"mt-4 t [...]
+32:I[24110,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"Image"]
+1b:["$","p",null,{"children":"Iggy is no longer just about the core repository. Over time, we’ve built an entire ecosystem around it, including:"}]
+1c:["$","ul",null,{"children":["\n",["$","li",null,{"children":"✅ SDKs for seamless developer integrations"}],"\n",["$","li",null,{"children":"✅ CLIs for powerful command-line control"}],"\n",["$","li",null,{"children":"✅ Web UIs for intuitive management"}],"\n",["$","li",null,{"children":"✅ And many more…"}],"\n"]}]
+1d:["$","p",null,{"children":["We’re already approaching 20 repositories under the Iggy organization (",["$","$L1a",null,{"href":"https://github.com/iggy-rs/","children":"see them here"}],"), and as we enter the Apache Incubator, we are committed to ensuring that all of them follow ASF guidelines while maintaining our core values of speed, efficiency, and simplicity."]}]
+1e:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"-why-apache","children":[["$","a",null,{"data-card":"","href":"#-why-apache","className":"peer","children":"🔗 Why Apache?"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-mute [...]
+1f:["$","p",null,{"children":["The Apache Software Foundation has nurtured some of the ",["$","strong",null,{"children":"most transformative open-source projects in history"}]," — Hadoop, Spark, Lucene, Solr, Cassandra, Kafka, Flink, and Airflow — technologies that have ",["$","strong",null,{"children":"shaped big data, search, and real-time processing"}],". By joining Apache Incubator, we align with this legacy and ",["$","strong",null,{"children":"gain access to a larger community, bet [...]
+20:["$","p",null,{"children":"🔗 Dive into the Apache Incubator Details"}]
+21:["$","ul",null,{"children":["\n",["$","li",null,{"children":["$","$L1a",null,{"href":"https://cwiki.apache.org/confluence/display/INCUBATOR/Iggy+Proposal","children":"Official Proposal"}]}],"\n",["$","li",null,{"children":["$","$L1a",null,{"href":"https://lists.apache.org/thread/q9whr3q9qd6wqm89f0vc1f6vkkvzc8xf","children":"Discussion Thread"}]}],"\n",["$","li",null,{"children":["$","$L1a",null,{"href":"https://lists.apache.org/thread/6zfgdjwrzs92h4z4x6b25v1r23g3f5yg","children":"Voti [...]
+22:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"-whats-next","children":[["$","a",null,{"data-card":"","href":"#-whats-next","className":"peer","children":"📈 What’s Next?"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-mut [...]
+23:["$","p",null,{"children":[["$","strong",null,{"children":"Our vision is clear: Iggy as a future Apache Top-Level Project (TLP)"}],". We already have ambitious ideas on how to improve both the project and the community around it:"]}]
+24:["$","ul",null,{"children":["\n",["$","li",null,{"children":[["$","strong",null,{"children":"Scaling performance benchmarks"}]," to push the limits of ultra-low-latency streaming"]}],"\n",["$","li",null,{"children":[["$","strong",null,{"children":"Expanding integrations"}]," with modern data infrastructure"]}],"\n",["$","li",null,{"children":[["$","strong",null,{"children":"Building a vibrant developer ecosystem"}]," that makes message streaming frictionless"]}],"\n"]}]
+25:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"-codebase-transition","children":[["$","a",null,{"data-card":"","href":"#-codebase-transition","className":"peer","children":"🦀 Codebase transition"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size [...]
+26:["$","p",null,{"children":["After the recent ",["$","$L1a",null,{"href":"https://lists.apache.org/thread/zrn96nlg23r9353lr5tp2by2ggx4zxqc","children":"discussion"}],", we plan to stick to the ",["$","strong",null,{"children":"monorepo approach"}],", under which, we will have a single repository for all the Iggy-related projects. This will make it easier for the contributors to navigate through the codebase, and to see how the changes in one project affect the others. This should also [...]
+27:["$","p",null,{"children":["All the repositories under ",["$","$L1a",null,{"href":"https://github.com/iggy-rs","children":"iggy-rs"}]," will be eventually moved to the ",["$","$L1a",null,{"href":"https://github.com/apache/iggy","children":"apache/iggy"}]," repository, and we will make sure that all the existing links and references are updated accordingly."]}]
+28:["$","p",null,{"children":["We'll also host our website under the ",["$","$L1a",null,{"href":"https://iggy.apache.org","children":"iggy.apache.org"}]," domain, including the documentation, blog, and the upcoming benchmarks. We've also updated our social media handles to contain the Apache prefix."]}]
+29:["$","p",null,{"children":"There will be most likely some changes related to hosting the Docker images, as well as the other tools we're using, but we'll make sure to keep you updated on that."}]
+2a:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"-join-the-movement","children":[["$","a",null,{"data-card":"","href":"#-join-the-movement","className":"peer","children":"💡 Join the Movement"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 s [...]
+2b:["$","p",null,{"children":"If you believe in a future where message streaming is lightning-fast, hyper-efficient, and accessible to all, we invite you to be part of this journey. Whether you're a developer, architect, or enterprise innovator, your contributions, feedback, and ideas will shape what comes next."}]
+2c:["$","p",null,{"children":["And this is just the beginning. ",["$","strong",null,{"children":"Welcome to the era of Hyper-Efficient Message Streaming at Laser Speed."}]]}]
+2d:["$","p",null,{"children":[["$","strong",null,{"children":"Last but not least, we've got a new logo"}],"! Our lovely Italian Greyhound is now a part of the Apache family, and we're proud to have it as our mascot. As you can see, it's so fast, that even the light travelling through the optical fiber can't keep up with it :)"]}]
+2e:["$","p",null,{"children":["$","$L32",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"image","src":{"src":"/_next/static/media/iggy_logo.f9977802.png","width":1800,"height":1000,"blurWidth":8,"blurHeight":4,"blurDataURL":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAECAIAAAA8r+mnAAAAWklEQVR42k2MMQqAMBAENyEQkjYPUKs0IXBwqO3BfUJEEfz/H7xCxCkWFnYHALz3OWdL5xw+rJdSjn2bxoGIWmu11pQSYoy99/s612UWEVVlZhO8J5uEEPDjAZO7CGDEbsPrAAAAAElFTkSuQmCC"},"placeholder" [...]
+2f:["$","p",null,{"children":"👉 Follow us, contribute, and help to build the future of the message streaming!"}]
+30:["$","ul",null,{"children":["\n",["$","li",null,{"children":["$","$L1a",null,{"href":"https://discord.gg/apache-iggy","children":"Discord"}]}],"\n",["$","li",null,{"children":["$","$L1a",null,{"href":"https://x.com/ApacheIggy","children":"X (Twitter)"}]}],"\n",["$","li",null,{"children":["$","$L1a",null,{"href":"https://bsky.app/profile/iggy.rs","children":"Bluesky"}]}],"\n",["$","li",null,{"children":["$","$L1a",null,{"href":"https://www.linkedin.com/company/apache-iggy/","children": [...]
+31:["$","footer",null,{"className":"mt-16 border-t border-fd-border pt-8","children":["$","$L9",null,{"href":"/blogs","className":"inline-flex items-center gap-2 text-sm font-medium text-fd-primary transition-colors hover:opacity-80","children":"← Back to all posts"}]}]
+17:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
+33:I[27201,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"IconMark"]
+15:null
+19:[["$","title","0",{"children":"Iggy joins the Apache Incubator | Apache Iggy"}],["$","link","1",{"rel":"icon","href":"/img/favicon.png"}],["$","$L33","2",{}]]
diff --git a/blogs/2025/02/10/apache-incubator/__next._head.txt b/blogs/2025/02/10/apache-incubator/__next._head.txt
new file mode 100644
index 00000000..97768278
--- /dev/null
+++ b/blogs/2025/02/10/apache-incubator/__next._head.txt
@@ -0,0 +1,6 @@
+1:"$Sreact.fragment"
+2:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"ViewportBoundary"]
+3:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"MetadataBoundary"]
+4:"$Sreact.suspense"
+5:I[27201,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"IconMark"]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","h",{"children":[null,["$","$L2",null,{"children":[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]}],["$","div",null,{"hidden":true,"children":["$","$L3",null,{"children":["$","$4",null,{"name":"Next.Metadata","children":[["$","title","0",{"children":"Iggy joins the Apache Incubator | Apache Iggy"}],["$","link","1",{"rel":"icon","href":"/img/favicon.png"}],["$", [...]
diff --git a/blogs/2025/02/10/apache-incubator/__next._index.txt b/blogs/2025/02/10/apache-incubator/__next._index.txt
new file mode 100644
index 00000000..fd02bd95
--- /dev/null
+++ b/blogs/2025/02/10/apache-incubator/__next._index.txt
@@ -0,0 +1,7 @@
+1:"$Sreact.fragment"
+2:I[17751,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js"],"RootProvider"]
+3:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+4:I[58298,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/5a37d4cb1abe17d7.js"],"default"]
+5:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+:HL["/_next/static/chunks/32a0415c8ab1bd26.css","style"]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/32a0415c8ab1bd26.css","precedence":"next"}],["$","script","script-0",{"src":"/_next/static/chunks/9ebd3a84bf60af84.js","async":true}],["$","script","script-1",{"src":"/_next/static/chunks/78b5f2e7b839e72f.js","async":true}]],["$","html",null,{"lang":"en","className":"geistsans_d5a4f12f-module__Ur3q_a__variable geistmono_157ca88a-module__iaM1Ya__variable" [...]
diff --git a/blogs/2025/02/10/apache-incubator/__next._tree.txt b/blogs/2025/02/10/apache-incubator/__next._tree.txt
new file mode 100644
index 00000000..dbd52849
--- /dev/null
+++ b/blogs/2025/02/10/apache-incubator/__next._tree.txt
@@ -0,0 +1,4 @@
+:HL["/_next/static/chunks/32a0415c8ab1bd26.css","style"]
+:HL["/_next/static/media/GeistMono_Variable.p.2f937313.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+:HL["/_next/static/media/Geist_Variable-s.p.92592eb2.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","tree":{"name":"","paramType":null,"paramKey":"","hasRuntimePrefetch":false,"slots":{"children":{"name":"(site)","paramType":null,"paramKey":"(site)","hasRuntimePrefetch":false,"slots":{"children":{"name":"blogs","paramType":null,"paramKey":"blogs","hasRuntimePrefetch":false,"slots":{"children":{"name":"slug","paramType":"c","paramKey":"2025/02/10/apache-incubator","hasRuntimePrefetch":false,"slots":{"children":{"name":"__PAGE__","paramType":null,"par [...]
diff --git a/blogs/2025/02/10/apache-incubator/index.html b/blogs/2025/02/10/apache-incubator/index.html
new file mode 100644
index 00000000..b72d42bb
--- /dev/null
+++ b/blogs/2025/02/10/apache-incubator/index.html
@@ -0,0 +1,44 @@
+<!DOCTYPE html><!--uBHgltRE2s5QA49x61S_u--><html lang="en" class="geistsans_d5a4f12f-module__Ur3q_a__variable geistmono_157ca88a-module__iaM1Ya__variable"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" href="/_next/static/media/GeistMono_Variable.p.2f937313.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="preload" href="/_next/static/media/Geist_Variable-s.p.92592eb2.woff2" as="font" crossorigin="" type=" [...]
+<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="-a-journey-two-years-in-the-making"><a data-card="" href="#-a-journey-two-years-in-the-making" class="peer">🚀 A Journey Two Years in the Making</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer- [...]
+<p>It’s been almost two years since the very first line of code was written, and we’ve come a long way since the initial release. What started as a bold idea has grown into a high-performance, cost-efficient message streaming solution with a thriving community of contributors, users, and advocates. We’ve received invaluable feedback, contributions, and support, and we’re more excited than ever to take Iggy to the next level.</p>
+<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="-beyond-just-iggy--a-growing-ecosystem"><a data-card="" href="#-beyond-just-iggy--a-growing-ecosystem" class="peer">🔥 Beyond Just Iggy – A Growing Ecosystem</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition- [...]
+<p>Iggy is no longer just about the core repository. Over time, we’ve built an entire ecosystem around it, including:</p>
+<ul>
+<li>✅ SDKs for seamless developer integrations</li>
+<li>✅ CLIs for powerful command-line control</li>
+<li>✅ Web UIs for intuitive management</li>
+<li>✅ And many more…</li>
+</ul>
+<p>We’re already approaching 20 repositories under the Iggy organization (<a href="https://github.com/iggy-rs/" rel="noreferrer noopener" target="_blank">see them here</a>), and as we enter the Apache Incubator, we are committed to ensuring that all of them follow ASF guidelines while maintaining our core values of speed, efficiency, and simplicity.</p>
+<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="-why-apache"><a data-card="" href="#-why-apache" class="peer">🔗 Why Apache?</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54 [...]
+<p>The Apache Software Foundation has nurtured some of the <strong>most transformative open-source projects in history</strong> — Hadoop, Spark, Lucene, Solr, Cassandra, Kafka, Flink, and Airflow — technologies that have <strong>shaped big data, search, and real-time processing</strong>. By joining Apache Incubator, we align with this legacy and <strong>gain access to a larger community, better governance, and long-term sustainability</strong>.</p>
+<p>🔗 Dive into the Apache Incubator Details</p>
+<ul>
+<li><a href="https://cwiki.apache.org/confluence/display/INCUBATOR/Iggy+Proposal" rel="noreferrer noopener" target="_blank">Official Proposal</a></li>
+<li><a href="https://lists.apache.org/thread/q9whr3q9qd6wqm89f0vc1f6vkkvzc8xf" rel="noreferrer noopener" target="_blank">Discussion Thread</a></li>
+<li><a href="https://lists.apache.org/thread/6zfgdjwrzs92h4z4x6b25v1r23g3f5yg" rel="noreferrer noopener" target="_blank">Voting Results</a></li>
+</ul>
+<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="-whats-next"><a data-card="" href="#-whats-next" class="peer">📈 What’s Next?</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.5 [...]
+<p><strong>Our vision is clear: Iggy as a future Apache Top-Level Project (TLP)</strong>. We already have ambitious ideas on how to improve both the project and the community around it:</p>
+<ul>
+<li><strong>Scaling performance benchmarks</strong> to push the limits of ultra-low-latency streaming</li>
+<li><strong>Expanding integrations</strong> with modern data infrastructure</li>
+<li><strong>Building a vibrant developer ecosystem</strong> that makes message streaming frictionless</li>
+</ul>
+<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="-codebase-transition"><a data-card="" href="#-codebase-transition" class="peer">🦀 Codebase transition</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><pat [...]
+<p>After the recent <a href="https://lists.apache.org/thread/zrn96nlg23r9353lr5tp2by2ggx4zxqc" rel="noreferrer noopener" target="_blank">discussion</a>, we plan to stick to the <strong>monorepo approach</strong>, under which, we will have a single repository for all the Iggy-related projects. This will make it easier for the contributors to navigate through the codebase, and to see how the changes in one project affect the others. This should also help us to keep the consistency across t [...]
+<p>All the repositories under <a href="https://github.com/iggy-rs" rel="noreferrer noopener" target="_blank">iggy-rs</a> will be eventually moved to the <a href="https://github.com/apache/iggy" rel="noreferrer noopener" target="_blank">apache/iggy</a> repository, and we will make sure that all the existing links and references are updated accordingly.</p>
+<p>We'll also host our website under the <a href="https://iggy.apache.org" rel="noreferrer noopener" target="_blank">iggy.apache.org</a> domain, including the documentation, blog, and the upcoming benchmarks. We've also updated our social media handles to contain the Apache prefix.</p>
+<p>There will be most likely some changes related to hosting the Docker images, as well as the other tools we're using, but we'll make sure to keep you updated on that.</p>
+<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="-join-the-movement"><a data-card="" href="#-join-the-movement" class="peer">💡 Join the Movement</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M [...]
+<p>If you believe in a future where message streaming is lightning-fast, hyper-efficient, and accessible to all, we invite you to be part of this journey. Whether you're a developer, architect, or enterprise innovator, your contributions, feedback, and ideas will shape what comes next.</p>
+<p>And this is just the beginning. <strong>Welcome to the era of Hyper-Efficient Message Streaming at Laser Speed.</strong></p>
+<p><strong>Last but not least, we've got a new logo</strong>! Our lovely Italian Greyhound is now a part of the Apache family, and we're proud to have it as our mascot. As you can see, it's so fast, that even the light travelling through the optical fiber can't keep up with it :)</p>
+<p><img alt="image" loading="lazy" width="1800" height="1000" decoding="async" data-nimg="1" class="rounded-lg" style="color:transparent;background-size:cover;background-position:50% 50%;background-repeat:no-repeat;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 320 160'%3E%3Cfilter id='b' color-interpolation-filters='sRGB'%3E%3CfeGaussianBlur stdDeviation='20'/%3E%3CfeCol [...]
+<p>👉 Follow us, contribute, and help to build the future of the message streaming!</p>
+<ul>
+<li><a href="https://discord.gg/apache-iggy" rel="noreferrer noopener" target="_blank">Discord</a></li>
+<li><a href="https://x.com/ApacheIggy" rel="noreferrer noopener" target="_blank">X (Twitter)</a></li>
+<li><a href="https://bsky.app/profile/iggy.rs" rel="noreferrer noopener" target="_blank">Bluesky</a></li>
+<li><a href="https://www.linkedin.com/company/apache-iggy/" rel="noreferrer noopener" target="_blank">LinkedIn</a></li>
+</ul></div><footer class="mt-16 border-t border-fd-border pt-8"><a class="inline-flex items-center gap-2 text-sm font-medium text-fd-primary transition-colors hover:opacity-80" href="/blogs/">← Back to all posts</a></footer></article></main><!--$--><!--/$--></main><script src="/_next/static/chunks/922b7f01aa6775a6.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[17751,[\"/_next/static/chu [...]
\ No newline at end of file
diff --git a/blogs/2025/02/10/apache-incubator/index.txt b/blogs/2025/02/10/apache-incubator/index.txt
new file mode 100644
index 00000000..f903374b
--- /dev/null
+++ b/blogs/2025/02/10/apache-incubator/index.txt
@@ -0,0 +1,55 @@
+1:"$Sreact.fragment"
+2:I[17751,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js"],"RootProvider"]
+3:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+4:I[58298,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/5a37d4cb1abe17d7.js"],"default"]
+5:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+6:I[83571,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Header"]
+7:I[29966,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFDropdown"]
+8:I[36330,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFMobileLinks"]
+9:I[22016,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],""]
+a:I[88760,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Logo"]
+11:I[68027,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+:HL["/_next/static/chunks/32a0415c8ab1bd26.css","style"]
+:HL["/_next/static/media/GeistMono_Variable.p.2f937313.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+:HL["/_next/static/media/Geist_Variable-s.p.92592eb2.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+0:{"P":null,"b":"uBHgltRE2s5QA49x61S_u","c":["","blogs","2025","02","10","apache-incubator",""],"q":"","i":false,"f":[[["",{"children":["(site)",{"children":["blogs",{"children":[["slug","2025/02/10/apache-incubator","c"],{"children":["__PAGE__",{}]}]}]}]},"$undefined","$undefined",true],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/32a0415c8ab1bd26.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","sc [...]
+13:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"OutletBoundary"]
+14:"$Sreact.suspense"
+16:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"ViewportBoundary"]
+18:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"MetadataBoundary"]
+b:["$","h1",null,{"className":"next-error-h1","style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:1:props:style","children":404}]
+c:["$","div",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:style","children":["$","h2",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style","children":"This page could not be found."}]}]
+d:["$","$1","c",{"children":[null,["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}]
+e:["$","$1","c",{"children":[null,["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}]
+f:["$","$1","c",{"children":["$L12",[["$","script","script-0",{"src":"/_next/static/chunks/00b00679782d0ffd.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/3562882a488c4fbb.js","async":true,"nonce":"$undefined"}]],["$","$L13",null,{"children":["$","$14",null,{"name":"Next.MetadataOutlet","children":"$@15"}]}]]}]
+10:["$","$1","h",{"children":[null,["$","$L16",null,{"children":"$L17"}],["$","div",null,{"hidden":true,"children":["$","$L18",null,{"children":["$","$14",null,{"name":"Next.Metadata","children":"$L19"}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}]
+1a:I[47873,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"default"]
+12:["$","main",null,{"className":"min-h-screen px-6 py-16 md:px-12","children":["$","article",null,{"className":"mx-auto max-w-5xl","children":[["$","header",null,{"className":"mb-10","children":[["$","time",null,{"className":"text-sm font-medium text-fd-muted-foreground","children":"February 10, 2025"}],["$","h1",null,{"className":"mt-3 text-3xl font-extrabold tracking-tight text-fd-foreground md:text-5xl","children":"Iggy joins the Apache Incubator"}],["$","p",null,{"className":"mt-4 t [...]
+32:I[24110,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"Image"]
+1b:["$","p",null,{"children":"Iggy is no longer just about the core repository. Over time, we’ve built an entire ecosystem around it, including:"}]
+1c:["$","ul",null,{"children":["\n",["$","li",null,{"children":"✅ SDKs for seamless developer integrations"}],"\n",["$","li",null,{"children":"✅ CLIs for powerful command-line control"}],"\n",["$","li",null,{"children":"✅ Web UIs for intuitive management"}],"\n",["$","li",null,{"children":"✅ And many more…"}],"\n"]}]
+1d:["$","p",null,{"children":["We’re already approaching 20 repositories under the Iggy organization (",["$","$L1a",null,{"href":"https://github.com/iggy-rs/","children":"see them here"}],"), and as we enter the Apache Incubator, we are committed to ensuring that all of them follow ASF guidelines while maintaining our core values of speed, efficiency, and simplicity."]}]
+1e:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"-why-apache","children":[["$","a",null,{"data-card":"","href":"#-why-apache","className":"peer","children":"🔗 Why Apache?"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-mute [...]
+1f:["$","p",null,{"children":["The Apache Software Foundation has nurtured some of the ",["$","strong",null,{"children":"most transformative open-source projects in history"}]," — Hadoop, Spark, Lucene, Solr, Cassandra, Kafka, Flink, and Airflow — technologies that have ",["$","strong",null,{"children":"shaped big data, search, and real-time processing"}],". By joining Apache Incubator, we align with this legacy and ",["$","strong",null,{"children":"gain access to a larger community, bet [...]
+20:["$","p",null,{"children":"🔗 Dive into the Apache Incubator Details"}]
+21:["$","ul",null,{"children":["\n",["$","li",null,{"children":["$","$L1a",null,{"href":"https://cwiki.apache.org/confluence/display/INCUBATOR/Iggy+Proposal","children":"Official Proposal"}]}],"\n",["$","li",null,{"children":["$","$L1a",null,{"href":"https://lists.apache.org/thread/q9whr3q9qd6wqm89f0vc1f6vkkvzc8xf","children":"Discussion Thread"}]}],"\n",["$","li",null,{"children":["$","$L1a",null,{"href":"https://lists.apache.org/thread/6zfgdjwrzs92h4z4x6b25v1r23g3f5yg","children":"Voti [...]
+22:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"-whats-next","children":[["$","a",null,{"data-card":"","href":"#-whats-next","className":"peer","children":"📈 What’s Next?"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-mut [...]
+23:["$","p",null,{"children":[["$","strong",null,{"children":"Our vision is clear: Iggy as a future Apache Top-Level Project (TLP)"}],". We already have ambitious ideas on how to improve both the project and the community around it:"]}]
+24:["$","ul",null,{"children":["\n",["$","li",null,{"children":[["$","strong",null,{"children":"Scaling performance benchmarks"}]," to push the limits of ultra-low-latency streaming"]}],"\n",["$","li",null,{"children":[["$","strong",null,{"children":"Expanding integrations"}]," with modern data infrastructure"]}],"\n",["$","li",null,{"children":[["$","strong",null,{"children":"Building a vibrant developer ecosystem"}]," that makes message streaming frictionless"]}],"\n"]}]
+25:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"-codebase-transition","children":[["$","a",null,{"data-card":"","href":"#-codebase-transition","className":"peer","children":"🦀 Codebase transition"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size [...]
+26:["$","p",null,{"children":["After the recent ",["$","$L1a",null,{"href":"https://lists.apache.org/thread/zrn96nlg23r9353lr5tp2by2ggx4zxqc","children":"discussion"}],", we plan to stick to the ",["$","strong",null,{"children":"monorepo approach"}],", under which, we will have a single repository for all the Iggy-related projects. This will make it easier for the contributors to navigate through the codebase, and to see how the changes in one project affect the others. This should also [...]
+27:["$","p",null,{"children":["All the repositories under ",["$","$L1a",null,{"href":"https://github.com/iggy-rs","children":"iggy-rs"}]," will be eventually moved to the ",["$","$L1a",null,{"href":"https://github.com/apache/iggy","children":"apache/iggy"}]," repository, and we will make sure that all the existing links and references are updated accordingly."]}]
+28:["$","p",null,{"children":["We'll also host our website under the ",["$","$L1a",null,{"href":"https://iggy.apache.org","children":"iggy.apache.org"}]," domain, including the documentation, blog, and the upcoming benchmarks. We've also updated our social media handles to contain the Apache prefix."]}]
+29:["$","p",null,{"children":"There will be most likely some changes related to hosting the Docker images, as well as the other tools we're using, but we'll make sure to keep you updated on that."}]
+2a:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"-join-the-movement","children":[["$","a",null,{"data-card":"","href":"#-join-the-movement","className":"peer","children":"💡 Join the Movement"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 s [...]
+2b:["$","p",null,{"children":"If you believe in a future where message streaming is lightning-fast, hyper-efficient, and accessible to all, we invite you to be part of this journey. Whether you're a developer, architect, or enterprise innovator, your contributions, feedback, and ideas will shape what comes next."}]
+2c:["$","p",null,{"children":["And this is just the beginning. ",["$","strong",null,{"children":"Welcome to the era of Hyper-Efficient Message Streaming at Laser Speed."}]]}]
+2d:["$","p",null,{"children":[["$","strong",null,{"children":"Last but not least, we've got a new logo"}],"! Our lovely Italian Greyhound is now a part of the Apache family, and we're proud to have it as our mascot. As you can see, it's so fast, that even the light travelling through the optical fiber can't keep up with it :)"]}]
+2e:["$","p",null,{"children":["$","$L32",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"image","src":{"src":"/_next/static/media/iggy_logo.f9977802.png","width":1800,"height":1000,"blurWidth":8,"blurHeight":4,"blurDataURL":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAECAIAAAA8r+mnAAAAWklEQVR42k2MMQqAMBAENyEQkjYPUKs0IXBwqO3BfUJEEfz/H7xCxCkWFnYHALz3OWdL5xw+rJdSjn2bxoGIWmu11pQSYoy99/s612UWEVVlZhO8J5uEEPDjAZO7CGDEbsPrAAAAAElFTkSuQmCC"},"placeholder" [...]
+2f:["$","p",null,{"children":"👉 Follow us, contribute, and help to build the future of the message streaming!"}]
+30:["$","ul",null,{"children":["\n",["$","li",null,{"children":["$","$L1a",null,{"href":"https://discord.gg/apache-iggy","children":"Discord"}]}],"\n",["$","li",null,{"children":["$","$L1a",null,{"href":"https://x.com/ApacheIggy","children":"X (Twitter)"}]}],"\n",["$","li",null,{"children":["$","$L1a",null,{"href":"https://bsky.app/profile/iggy.rs","children":"Bluesky"}]}],"\n",["$","li",null,{"children":["$","$L1a",null,{"href":"https://www.linkedin.com/company/apache-iggy/","children": [...]
+31:["$","footer",null,{"className":"mt-16 border-t border-fd-border pt-8","children":["$","$L9",null,{"href":"/blogs","className":"inline-flex items-center gap-2 text-sm font-medium text-fd-primary transition-colors hover:opacity-80","children":"← Back to all posts"}]}]
+17:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
+33:I[27201,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"IconMark"]
+15:null
+19:[["$","title","0",{"children":"Iggy joins the Apache Incubator | Apache Iggy"}],["$","link","1",{"rel":"icon","href":"/img/favicon.png"}],["$","$L33","2",{}]]
diff --git a/blogs/2025/02/17/transparent-benchmarks/__next.!KHNpdGUp.blogs.$c$slug.__PAGE__.txt b/blogs/2025/02/17/transparent-benchmarks/__next.!KHNpdGUp.blogs.$c$slug.__PAGE__.txt
new file mode 100644
index 00000000..eeb03705
--- /dev/null
+++ b/blogs/2025/02/17/transparent-benchmarks/__next.!KHNpdGUp.blogs.$c$slug.__PAGE__.txt
@@ -0,0 +1,25 @@
+1:"$Sreact.fragment"
+2:I[47873,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"default"]
+14:I[24110,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"Image"]
+15:I[22016,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],""]
+16:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"OutletBoundary"]
+17:"$Sreact.suspense"
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","c",{"children":[["$","main",null,{"className":"min-h-screen px-6 py-16 md:px-12","children":["$","article",null,{"className":"mx-auto max-w-5xl","children":[["$","header",null,{"className":"mb-10","children":[["$","time",null,{"className":"text-sm font-medium text-fd-muted-foreground","children":"February 17, 2025"}],["$","h1",null,{"className":"mt-3 text-3xl font-extrabold tracking-tight text-fd-foreground md:text-5xl","children":"Tr [...]
+3:["$","p",null,{"children":["Our ",["$","code",null,{"children":"iggy-bench"}]," tool, which is used to run the benchmarks and is part of the core open source repository (can be found under the ",["$","code",null,{"children":"bench"}]," directory), has come a long way and has been serving us well."]}]
+4:["$","p",null,{"children":["$","$L14",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"image","src":{"src":"/_next/static/media/iggy_bench_cli.31c012c6.png","width":2742,"height":1930,"blurWidth":8,"blurHeight":6,"blurDataURL":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAGCAYAAAD+Bd/7AAAAcklEQVR42kWOOQpEIRBE/e4LGIgYqAhi5P0PWIM9M/7gRV2vqllKCSEEOOdgrQXnHIyxl703SimotaL3jiOcsNYaSimwMQYOOWc6GGMgpYQQ4tt2rLUWmd57sp7nIWiitYY5J83EGG/o/nIO/91Tfc0fHxiWNogG [...]
+5:["$","p",null,{"children":["We use it to do quick performance checks, regression testing, and to see how the changes we introduce affect the performance. ",["$","strong",null,{"children":"We run it on our localhost, as well as on the Virtual Machines in the cloud, to see how it behaves under a variety of environments."}]]}]
+6:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"iggy-benchmarking-dashboard","children":[["$","a",null,{"data-card":"","href":"#iggy-benchmarking-dashboard","className":"peer","children":"Iggy benchmarking dashboard"}],["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size [...]
+7:["$","p",null,{"children":[["$","strong",null,{"children":["And today, we're proud to present ",["$","$L2",null,{"href":"https://benchmarks.iggy.apache.org/","children":"benchmarks.iggy.apache.org"}]]}]," - a benchmarking dashboard, which is available to everyone. It's a website where you can see how Iggy performs under the different conditions, and how it scales with the number of clients, messages, and topics."]}]
+8:["$","p",null,{"children":["This is our community-driven effort, where everyone can contribute, and add their own benchmarks. For all the information on how to run the benchmarks, render them on the dashboard, upload your results or contribute to the project, please check the ",["$","$L2",null,{"href":"https://github.com/iggy-rs/iggy-bench-dashboard","children":"iggy-bench-dashboard"}]," repository. In general, it's as simple as:"]}]
+9:["$","ul",null,{"children":["\n",["$","li",null,{"children":["Building the ",["$","$L2",null,{"href":"https://github.com/apache/iggy","children":"Iggy"}]," in the release mode with ",["$","code",null,{"children":"cargo build --release"}]]}],"\n",["$","li",null,{"children":["Starting your Iggy server with ",["$","code",null,{"children":"cargo r --bin iggy-server -r"}]," (feel free to adjust the configuration in ",["$","code",null,{"children":"server.toml"}]," or via environment variable [...]
+a:["$","p",null,{"children":["$","$L14",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"image","src":{"src":"/_next/static/media/iggy_bench_dashboard.913ad513.png","width":2555,"height":1327,"blurWidth":8,"blurHeight":4,"blurDataURL":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAECAYAAACzzX7wAAAAUElEQVR42j3NuQ3AMAxDUQ/jW2ed7D8Xo8hIigcQv2G5rwtmht572puw1kKtNRV3j7jRWvvj521FVcHEiZKAWTHGCBNFRCISRAyifsSe89w8F3YvimrNGGEAAAAASUVORK5CYII="},"placeholder":" [...]
+b:["$","p",null,{"children":[["$","strong",null,{"children":"And this is just the beginning"}],", as we plan to extend the dashboard, and add more benchmarks, which are covering the different use cases."]}]
+c:["$","p",null,{"children":["Our main goal is to make the benchmarking process (and its results) ",["$","strong",null,{"children":"transparent, reproducible, and easy to understand"}],". We want to make them a first-class citizen, and a crucial part of the Iggy project. We want to make them a tool, which will help us to improve the performance, and to make Iggy the best streaming server out there. We're looking forward to your feedback, and we hope you'll enjoy the benchmarks."]}]
+d:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"towards-the-microsecond-latency","children":[["$","a",null,{"data-card":"","href":"#towards-the-microsecond-latency","className":"peer","children":"Towards the microsecond latency"}],["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide luci [...]
+e:["$","p",null,{"children":[["$","strong",null,{"children":"And as a cherry on top, we've recently managed to achieve the sub-millisecond write latency"}],". This is a huge milestone for us, as it's a proof that Iggy can be used in low-latency applications, where speed is crucial. Lately, we've been experimenting a lot with ",["$","$L2",null,{"href":"https://github.com/rkyv/rkyv","children":"rkyv"}]," - zero-copy deserialization framework, which has yielded some great results. Keep in m [...]
+f:["$","p",null,{"children":["And the best part is that we're just getting started. We're looking forward to pushing the limits even further, and to see how far we can go. There's still tons of optimizations coming, including switching the runtime to the ",["$","$L2",null,{"href":"https://github.com/bytedance/monoio","children":"monoio"}]," which does support ",["$","strong",null,{"children":"io_uring"}],", and we've experienced superb results with this one on our experimental branch. Th [...]
+10:["$","footer",null,{"className":"mt-16 border-t border-fd-border pt-8","children":["$","$L15",null,{"href":"/blogs","className":"inline-flex items-center gap-2 text-sm font-medium text-fd-primary transition-colors hover:opacity-80","children":"← Back to all posts"}]}]
+11:["$","script","script-0",{"src":"/_next/static/chunks/00b00679782d0ffd.js","async":true}]
+12:["$","script","script-1",{"src":"/_next/static/chunks/3562882a488c4fbb.js","async":true}]
+13:["$","$L16",null,{"children":["$","$17",null,{"name":"Next.MetadataOutlet","children":"$@18"}]}]
+18:null
diff --git a/blogs/2025/02/17/transparent-benchmarks/__next.!KHNpdGUp.blogs.$c$slug.txt b/blogs/2025/02/17/transparent-benchmarks/__next.!KHNpdGUp.blogs.$c$slug.txt
new file mode 100644
index 00000000..11b31bb0
--- /dev/null
+++ b/blogs/2025/02/17/transparent-benchmarks/__next.!KHNpdGUp.blogs.$c$slug.txt
@@ -0,0 +1,4 @@
+1:"$Sreact.fragment"
+2:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+3:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","template":["$","$L3",null,{}]}]]}],"loading":null,"isPartial":false}
diff --git a/blogs/2025/02/17/transparent-benchmarks/__next.!KHNpdGUp.blogs.txt b/blogs/2025/02/17/transparent-benchmarks/__next.!KHNpdGUp.blogs.txt
new file mode 100644
index 00000000..11b31bb0
--- /dev/null
+++ b/blogs/2025/02/17/transparent-benchmarks/__next.!KHNpdGUp.blogs.txt
@@ -0,0 +1,4 @@
+1:"$Sreact.fragment"
+2:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+3:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","template":["$","$L3",null,{}]}]]}],"loading":null,"isPartial":false}
diff --git a/blogs/2025/02/17/transparent-benchmarks/__next.!KHNpdGUp.txt b/blogs/2025/02/17/transparent-benchmarks/__next.!KHNpdGUp.txt
new file mode 100644
index 00000000..ea3bfa55
--- /dev/null
+++ b/blogs/2025/02/17/transparent-benchmarks/__next.!KHNpdGUp.txt
@@ -0,0 +1,9 @@
+1:"$Sreact.fragment"
+2:I[83571,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Header"]
+3:I[29966,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFDropdown"]
+4:I[36330,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFMobileLinks"]
+5:I[22016,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],""]
+6:I[88760,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Logo"]
+7:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+8:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","c",{"children":[[["$","script","script-0",{"src":"/_next/static/chunks/8d86be78428a601a.js","async":true}],["$","script","script-1",{"src":"/_next/static/chunks/da34cc6305706ac6.js","async":true}],["$","script","script-2",{"src":"/_next/static/chunks/9baf65674e2de991.js","async":true}],["$","script","script-3",{"src":"/_next/static/chunks/26b70f9828dd1eb5.js","async":true}],["$","script","script-4",{"src":"/_next/static/chunks/adeed83 [...]
diff --git a/blogs/2025/02/17/transparent-benchmarks/__next._full.txt b/blogs/2025/02/17/transparent-benchmarks/__next._full.txt
new file mode 100644
index 00000000..12a6d17b
--- /dev/null
+++ b/blogs/2025/02/17/transparent-benchmarks/__next._full.txt
@@ -0,0 +1,46 @@
+1:"$Sreact.fragment"
+2:I[17751,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js"],"RootProvider"]
+3:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+4:I[58298,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/5a37d4cb1abe17d7.js"],"default"]
+5:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+6:I[83571,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Header"]
+7:I[29966,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFDropdown"]
+8:I[36330,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFMobileLinks"]
+9:I[22016,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],""]
+a:I[88760,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Logo"]
+11:I[68027,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+:HL["/_next/static/chunks/32a0415c8ab1bd26.css","style"]
+:HL["/_next/static/media/GeistMono_Variable.p.2f937313.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+:HL["/_next/static/media/Geist_Variable-s.p.92592eb2.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+0:{"P":null,"b":"uBHgltRE2s5QA49x61S_u","c":["","blogs","2025","02","17","transparent-benchmarks",""],"q":"","i":false,"f":[[["",{"children":["(site)",{"children":["blogs",{"children":[["slug","2025/02/17/transparent-benchmarks","c"],{"children":["__PAGE__",{}]}]}]}]},"$undefined","$undefined",true],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/32a0415c8ab1bd26.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$", [...]
+13:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"OutletBoundary"]
+14:"$Sreact.suspense"
+16:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"ViewportBoundary"]
+18:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"MetadataBoundary"]
+b:["$","h1",null,{"className":"next-error-h1","style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:1:props:style","children":404}]
+c:["$","div",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:style","children":["$","h2",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style","children":"This page could not be found."}]}]
+d:["$","$1","c",{"children":[null,["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}]
+e:["$","$1","c",{"children":[null,["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}]
+f:["$","$1","c",{"children":["$L12",[["$","script","script-0",{"src":"/_next/static/chunks/00b00679782d0ffd.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/3562882a488c4fbb.js","async":true,"nonce":"$undefined"}]],["$","$L13",null,{"children":["$","$14",null,{"name":"Next.MetadataOutlet","children":"$@15"}]}]]}]
+10:["$","$1","h",{"children":[null,["$","$L16",null,{"children":"$L17"}],["$","div",null,{"hidden":true,"children":["$","$L18",null,{"children":["$","$14",null,{"name":"Next.Metadata","children":"$L19"}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}]
+1a:I[47873,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"default"]
+12:["$","main",null,{"className":"min-h-screen px-6 py-16 md:px-12","children":["$","article",null,{"className":"mx-auto max-w-5xl","children":[["$","header",null,{"className":"mb-10","children":[["$","time",null,{"className":"text-sm font-medium text-fd-muted-foreground","children":"February 17, 2025"}],["$","h1",null,{"className":"mt-3 text-3xl font-extrabold tracking-tight text-fd-foreground md:text-5xl","children":"Transparent Benchmarking with Apache Iggy"}],["$","p",null,{"classNam [...]
+29:I[24110,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"Image"]
+1b:["$","p",null,{"children":["Our ",["$","code",null,{"children":"iggy-bench"}]," tool, which is used to run the benchmarks and is part of the core open source repository (can be found under the ",["$","code",null,{"children":"bench"}]," directory), has come a long way and has been serving us well."]}]
+1c:["$","p",null,{"children":["$","$L29",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"image","src":{"src":"/_next/static/media/iggy_bench_cli.31c012c6.png","width":2742,"height":1930,"blurWidth":8,"blurHeight":6,"blurDataURL":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAGCAYAAAD+Bd/7AAAAcklEQVR42kWOOQpEIRBE/e4LGIgYqAhi5P0PWIM9M/7gRV2vqllKCSEEOOdgrQXnHIyxl703SimotaL3jiOcsNYaSimwMQYOOWc6GGMgpYQQ4tt2rLUWmd57sp7nIWiitYY5J83EGG/o/nIO/91Tfc0fHxiWNog [...]
+1d:["$","p",null,{"children":["We use it to do quick performance checks, regression testing, and to see how the changes we introduce affect the performance. ",["$","strong",null,{"children":"We run it on our localhost, as well as on the Virtual Machines in the cloud, to see how it behaves under a variety of environments."}]]}]
+1e:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"iggy-benchmarking-dashboard","children":[["$","a",null,{"data-card":"","href":"#iggy-benchmarking-dashboard","className":"peer","children":"Iggy benchmarking dashboard"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"luc [...]
+1f:["$","p",null,{"children":[["$","strong",null,{"children":["And today, we're proud to present ",["$","$L1a",null,{"href":"https://benchmarks.iggy.apache.org/","children":"benchmarks.iggy.apache.org"}]]}]," - a benchmarking dashboard, which is available to everyone. It's a website where you can see how Iggy performs under the different conditions, and how it scales with the number of clients, messages, and topics."]}]
+20:["$","p",null,{"children":["This is our community-driven effort, where everyone can contribute, and add their own benchmarks. For all the information on how to run the benchmarks, render them on the dashboard, upload your results or contribute to the project, please check the ",["$","$L1a",null,{"href":"https://github.com/iggy-rs/iggy-bench-dashboard","children":"iggy-bench-dashboard"}]," repository. In general, it's as simple as:"]}]
+21:["$","ul",null,{"children":["\n",["$","li",null,{"children":["Building the ",["$","$L1a",null,{"href":"https://github.com/apache/iggy","children":"Iggy"}]," in the release mode with ",["$","code",null,{"children":"cargo build --release"}]]}],"\n",["$","li",null,{"children":["Starting your Iggy server with ",["$","code",null,{"children":"cargo r --bin iggy-server -r"}]," (feel free to adjust the configuration in ",["$","code",null,{"children":"server.toml"}]," or via environment variab [...]
+22:["$","p",null,{"children":["$","$L29",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"image","src":{"src":"/_next/static/media/iggy_bench_dashboard.913ad513.png","width":2555,"height":1327,"blurWidth":8,"blurHeight":4,"blurDataURL":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAECAYAAACzzX7wAAAAUElEQVR42j3NuQ3AMAxDUQ/jW2ed7D8Xo8hIigcQv2G5rwtmht572puw1kKtNRV3j7jRWvvj521FVcHEiZKAWTHGCBNFRCISRAyifsSe89w8F3YvimrNGGEAAAAASUVORK5CYII="},"placeholder": [...]
+23:["$","p",null,{"children":[["$","strong",null,{"children":"And this is just the beginning"}],", as we plan to extend the dashboard, and add more benchmarks, which are covering the different use cases."]}]
+24:["$","p",null,{"children":["Our main goal is to make the benchmarking process (and its results) ",["$","strong",null,{"children":"transparent, reproducible, and easy to understand"}],". We want to make them a first-class citizen, and a crucial part of the Iggy project. We want to make them a tool, which will help us to improve the performance, and to make Iggy the best streaming server out there. We're looking forward to your feedback, and we hope you'll enjoy the benchmarks."]}]
+25:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"towards-the-microsecond-latency","children":[["$","a",null,{"data-card":"","href":"#towards-the-microsecond-latency","className":"peer","children":"Towards the microsecond latency"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","cla [...]
+26:["$","p",null,{"children":[["$","strong",null,{"children":"And as a cherry on top, we've recently managed to achieve the sub-millisecond write latency"}],". This is a huge milestone for us, as it's a proof that Iggy can be used in low-latency applications, where speed is crucial. Lately, we've been experimenting a lot with ",["$","$L1a",null,{"href":"https://github.com/rkyv/rkyv","children":"rkyv"}]," - zero-copy deserialization framework, which has yielded some great results. Keep in [...]
+27:["$","p",null,{"children":["And the best part is that we're just getting started. We're looking forward to pushing the limits even further, and to see how far we can go. There's still tons of optimizations coming, including switching the runtime to the ",["$","$L1a",null,{"href":"https://github.com/bytedance/monoio","children":"monoio"}]," which does support ",["$","strong",null,{"children":"io_uring"}],", and we've experienced superb results with this one on our experimental branch. [...]
+28:["$","footer",null,{"className":"mt-16 border-t border-fd-border pt-8","children":["$","$L9",null,{"href":"/blogs","className":"inline-flex items-center gap-2 text-sm font-medium text-fd-primary transition-colors hover:opacity-80","children":"← Back to all posts"}]}]
+17:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
+2a:I[27201,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"IconMark"]
+15:null
+19:[["$","title","0",{"children":"Transparent Benchmarking with Apache Iggy | Apache Iggy"}],["$","link","1",{"rel":"icon","href":"/img/favicon.png"}],["$","$L2a","2",{}]]
diff --git a/blogs/2025/02/17/transparent-benchmarks/__next._head.txt b/blogs/2025/02/17/transparent-benchmarks/__next._head.txt
new file mode 100644
index 00000000..4fc3f9bd
--- /dev/null
+++ b/blogs/2025/02/17/transparent-benchmarks/__next._head.txt
@@ -0,0 +1,6 @@
+1:"$Sreact.fragment"
+2:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"ViewportBoundary"]
+3:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"MetadataBoundary"]
+4:"$Sreact.suspense"
+5:I[27201,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"IconMark"]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","h",{"children":[null,["$","$L2",null,{"children":[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]}],["$","div",null,{"hidden":true,"children":["$","$L3",null,{"children":["$","$4",null,{"name":"Next.Metadata","children":[["$","title","0",{"children":"Transparent Benchmarking with Apache Iggy | Apache Iggy"}],["$","link","1",{"rel":"icon","href":"/img/favicon.pn [...]
diff --git a/blogs/2025/02/17/transparent-benchmarks/__next._index.txt b/blogs/2025/02/17/transparent-benchmarks/__next._index.txt
new file mode 100644
index 00000000..fd02bd95
--- /dev/null
+++ b/blogs/2025/02/17/transparent-benchmarks/__next._index.txt
@@ -0,0 +1,7 @@
+1:"$Sreact.fragment"
+2:I[17751,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js"],"RootProvider"]
+3:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+4:I[58298,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/5a37d4cb1abe17d7.js"],"default"]
+5:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+:HL["/_next/static/chunks/32a0415c8ab1bd26.css","style"]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/32a0415c8ab1bd26.css","precedence":"next"}],["$","script","script-0",{"src":"/_next/static/chunks/9ebd3a84bf60af84.js","async":true}],["$","script","script-1",{"src":"/_next/static/chunks/78b5f2e7b839e72f.js","async":true}]],["$","html",null,{"lang":"en","className":"geistsans_d5a4f12f-module__Ur3q_a__variable geistmono_157ca88a-module__iaM1Ya__variable" [...]
diff --git a/blogs/2025/02/17/transparent-benchmarks/__next._tree.txt b/blogs/2025/02/17/transparent-benchmarks/__next._tree.txt
new file mode 100644
index 00000000..367a31b5
--- /dev/null
+++ b/blogs/2025/02/17/transparent-benchmarks/__next._tree.txt
@@ -0,0 +1,4 @@
+:HL["/_next/static/chunks/32a0415c8ab1bd26.css","style"]
+:HL["/_next/static/media/GeistMono_Variable.p.2f937313.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+:HL["/_next/static/media/Geist_Variable-s.p.92592eb2.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","tree":{"name":"","paramType":null,"paramKey":"","hasRuntimePrefetch":false,"slots":{"children":{"name":"(site)","paramType":null,"paramKey":"(site)","hasRuntimePrefetch":false,"slots":{"children":{"name":"blogs","paramType":null,"paramKey":"blogs","hasRuntimePrefetch":false,"slots":{"children":{"name":"slug","paramType":"c","paramKey":"2025/02/17/transparent-benchmarks","hasRuntimePrefetch":false,"slots":{"children":{"name":"__PAGE__","paramType":nul [...]
diff --git a/blogs/2025/02/17/transparent-benchmarks/index.html b/blogs/2025/02/17/transparent-benchmarks/index.html
new file mode 100644
index 00000000..6bee55cb
--- /dev/null
+++ b/blogs/2025/02/17/transparent-benchmarks/index.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html><!--uBHgltRE2s5QA49x61S_u--><html lang="en" class="geistsans_d5a4f12f-module__Ur3q_a__variable geistmono_157ca88a-module__iaM1Ya__variable"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" href="/_next/static/media/GeistMono_Variable.p.2f937313.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="preload" href="/_next/static/media/Geist_Variable-s.p.92592eb2.woff2" as="font" crossorigin="" type=" [...]
+<p>In the world of software development, <strong>benchmarks are often treated as a second-class citizen</strong>. They're more of an addition to the codebase, rather than a crucial part of it, which should be the other way around, especially when it comes to the performance-critical systems or infrastructure tools.</p>
+<p>Sometimes, the benchmarking results are nothing more than just a <strong>cherry-picking of the best-case scenarios</strong>, which are not representative of real-world usage. In such a case, they simply serve a sole purpose of either making the project look better than it is or how well it does outperform the competition, under the extremely optimized conditions when comparing with its counterparts.</p>
+<p><strong>Trying to reproduce the benchmarks is often a nightmare</strong>, as the environment setup is not documented, the code is unavailable, or the instructions are not clear enough. This makes it close to impossible to verify the results, which are then taken for granted.</p>
+<p>Or even worse, the <strong>benchmarking tool might be so complex, that it's hard to understand how it works</strong>, and what are the assumptions behind it. ALl of these, does result in hard to extend or modify the existing benchmarks, which are not covering the particular use case you're interested in. It's just here to tell everyone that we do have benchmarks, but how we do it, and what they measure, is a mystery.</p>
+<p><strong>Which is why at <a href="https://github.com/apache/iggy/" rel="noreferrer noopener" target="_blank">Iggy</a>, we've decided to make the benchmarks a first-class citizen</strong>.</p>
+<p>Our <code>iggy-bench</code> tool, which is used to run the benchmarks and is part of the core open source repository (can be found under the <code>bench</code> directory), has come a long way and has been serving us well.</p>
+<p><img alt="image" loading="lazy" width="2742" height="1930" decoding="async" data-nimg="1" class="rounded-lg" style="color:transparent;background-size:cover;background-position:50% 50%;background-repeat:no-repeat;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 320 240'%3E%3Cfilter id='b' color-interpolation-filters='sRGB'%3E%3CfeGaussianBlur stdDeviation='20'/%3E%3CfeCol [...]
+<p>We use it to do quick performance checks, regression testing, and to see how the changes we introduce affect the performance. <strong>We run it on our localhost, as well as on the Virtual Machines in the cloud, to see how it behaves under a variety of environments.</strong></p>
+<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="iggy-benchmarking-dashboard"><a data-card="" href="#iggy-benchmarking-dashboard" class="peer">Iggy benchmarking dashboard</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" ari [...]
+<p><strong>And today, we're proud to present <a href="https://benchmarks.iggy.apache.org/" rel="noreferrer noopener" target="_blank">benchmarks.iggy.apache.org</a></strong> - a benchmarking dashboard, which is available to everyone. It's a website where you can see how Iggy performs under the different conditions, and how it scales with the number of clients, messages, and topics.</p>
+<p>This is our community-driven effort, where everyone can contribute, and add their own benchmarks. For all the information on how to run the benchmarks, render them on the dashboard, upload your results or contribute to the project, please check the <a href="https://github.com/iggy-rs/iggy-bench-dashboard" rel="noreferrer noopener" target="_blank">iggy-bench-dashboard</a> repository. In general, it's as simple as:</p>
+<ul>
+<li>Building the <a href="https://github.com/apache/iggy" rel="noreferrer noopener" target="_blank">Iggy</a> in the release mode with <code>cargo build --release</code></li>
+<li>Starting your Iggy server with <code>cargo r --bin iggy-server -r</code> (feel free to adjust the configuration in <code>server.toml</code> or via environment variables)</li>
+<li>Running the <code>iggy-bench</code> tool with the desired parameters, e.g. <code>cargo r --bin iggy-bench -r pinned-producer tcp</code></li>
+<li>Extending your benchmark with the output (HTML charts, JSON sampling etc.) <code>cargo r --bin iggy-bench -r pinned-producer tcp output -o performance_results --identifier spetz</code></li>
+<li>Navigating to the specific benchmark directory to browse the charts and/or uploading them to the dashboard.</li>
+<li>And there's always <code>help</code> command e.g. <code>pinned-producer --help</code> to make your life easier :)</li>
+</ul>
+<p><img alt="image" loading="lazy" width="2555" height="1327" decoding="async" data-nimg="1" class="rounded-lg" style="color:transparent;background-size:cover;background-position:50% 50%;background-repeat:no-repeat;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 320 160'%3E%3Cfilter id='b' color-interpolation-filters='sRGB'%3E%3CfeGaussianBlur stdDeviation='20'/%3E%3CfeCol [...]
+<p><strong>And this is just the beginning</strong>, as we plan to extend the dashboard, and add more benchmarks, which are covering the different use cases.</p>
+<p>Our main goal is to make the benchmarking process (and its results) <strong>transparent, reproducible, and easy to understand</strong>. We want to make them a first-class citizen, and a crucial part of the Iggy project. We want to make them a tool, which will help us to improve the performance, and to make Iggy the best streaming server out there. We're looking forward to your feedback, and we hope you'll enjoy the benchmarks.</p>
+<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="towards-the-microsecond-latency"><a data-card="" href="#towards-the-microsecond-latency" class="peer">Towards the microsecond latency</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opac [...]
+<p><strong>And as a cherry on top, we've recently managed to achieve the sub-millisecond write latency</strong>. This is a huge milestone for us, as it's a proof that Iggy can be used in low-latency applications, where speed is crucial. Lately, we've been experimenting a lot with <a href="https://github.com/rkyv/rkyv" rel="noreferrer noopener" target="_blank">rkyv</a> - zero-copy deserialization framework, which has yielded some great results. Keep in mind that streaming t [...]
+<p>And the best part is that we're just getting started. We're looking forward to pushing the limits even further, and to see how far we can go. There's still tons of optimizations coming, including switching the runtime to the <a href="https://github.com/bytedance/monoio" rel="noreferrer noopener" target="_blank">monoio</a> which does support <strong>io_uring</strong>, and we've experienced superb results with this one on our experimental branch. Then, there's t [...]
\ No newline at end of file
diff --git a/blogs/2025/02/17/transparent-benchmarks/index.txt b/blogs/2025/02/17/transparent-benchmarks/index.txt
new file mode 100644
index 00000000..12a6d17b
--- /dev/null
+++ b/blogs/2025/02/17/transparent-benchmarks/index.txt
@@ -0,0 +1,46 @@
+1:"$Sreact.fragment"
+2:I[17751,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js"],"RootProvider"]
+3:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+4:I[58298,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/5a37d4cb1abe17d7.js"],"default"]
+5:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+6:I[83571,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Header"]
+7:I[29966,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFDropdown"]
+8:I[36330,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFMobileLinks"]
+9:I[22016,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],""]
+a:I[88760,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Logo"]
+11:I[68027,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+:HL["/_next/static/chunks/32a0415c8ab1bd26.css","style"]
+:HL["/_next/static/media/GeistMono_Variable.p.2f937313.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+:HL["/_next/static/media/Geist_Variable-s.p.92592eb2.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+0:{"P":null,"b":"uBHgltRE2s5QA49x61S_u","c":["","blogs","2025","02","17","transparent-benchmarks",""],"q":"","i":false,"f":[[["",{"children":["(site)",{"children":["blogs",{"children":[["slug","2025/02/17/transparent-benchmarks","c"],{"children":["__PAGE__",{}]}]}]}]},"$undefined","$undefined",true],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/32a0415c8ab1bd26.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$", [...]
+13:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"OutletBoundary"]
+14:"$Sreact.suspense"
+16:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"ViewportBoundary"]
+18:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"MetadataBoundary"]
+b:["$","h1",null,{"className":"next-error-h1","style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:1:props:style","children":404}]
+c:["$","div",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:style","children":["$","h2",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style","children":"This page could not be found."}]}]
+d:["$","$1","c",{"children":[null,["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}]
+e:["$","$1","c",{"children":[null,["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}]
+f:["$","$1","c",{"children":["$L12",[["$","script","script-0",{"src":"/_next/static/chunks/00b00679782d0ffd.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/3562882a488c4fbb.js","async":true,"nonce":"$undefined"}]],["$","$L13",null,{"children":["$","$14",null,{"name":"Next.MetadataOutlet","children":"$@15"}]}]]}]
+10:["$","$1","h",{"children":[null,["$","$L16",null,{"children":"$L17"}],["$","div",null,{"hidden":true,"children":["$","$L18",null,{"children":["$","$14",null,{"name":"Next.Metadata","children":"$L19"}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}]
+1a:I[47873,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"default"]
+12:["$","main",null,{"className":"min-h-screen px-6 py-16 md:px-12","children":["$","article",null,{"className":"mx-auto max-w-5xl","children":[["$","header",null,{"className":"mb-10","children":[["$","time",null,{"className":"text-sm font-medium text-fd-muted-foreground","children":"February 17, 2025"}],["$","h1",null,{"className":"mt-3 text-3xl font-extrabold tracking-tight text-fd-foreground md:text-5xl","children":"Transparent Benchmarking with Apache Iggy"}],["$","p",null,{"classNam [...]
+29:I[24110,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"Image"]
+1b:["$","p",null,{"children":["Our ",["$","code",null,{"children":"iggy-bench"}]," tool, which is used to run the benchmarks and is part of the core open source repository (can be found under the ",["$","code",null,{"children":"bench"}]," directory), has come a long way and has been serving us well."]}]
+1c:["$","p",null,{"children":["$","$L29",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"image","src":{"src":"/_next/static/media/iggy_bench_cli.31c012c6.png","width":2742,"height":1930,"blurWidth":8,"blurHeight":6,"blurDataURL":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAGCAYAAAD+Bd/7AAAAcklEQVR42kWOOQpEIRBE/e4LGIgYqAhi5P0PWIM9M/7gRV2vqllKCSEEOOdgrQXnHIyxl703SimotaL3jiOcsNYaSimwMQYOOWc6GGMgpYQQ4tt2rLUWmd57sp7nIWiitYY5J83EGG/o/nIO/91Tfc0fHxiWNog [...]
+1d:["$","p",null,{"children":["We use it to do quick performance checks, regression testing, and to see how the changes we introduce affect the performance. ",["$","strong",null,{"children":"We run it on our localhost, as well as on the Virtual Machines in the cloud, to see how it behaves under a variety of environments."}]]}]
+1e:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"iggy-benchmarking-dashboard","children":[["$","a",null,{"data-card":"","href":"#iggy-benchmarking-dashboard","className":"peer","children":"Iggy benchmarking dashboard"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"luc [...]
+1f:["$","p",null,{"children":[["$","strong",null,{"children":["And today, we're proud to present ",["$","$L1a",null,{"href":"https://benchmarks.iggy.apache.org/","children":"benchmarks.iggy.apache.org"}]]}]," - a benchmarking dashboard, which is available to everyone. It's a website where you can see how Iggy performs under the different conditions, and how it scales with the number of clients, messages, and topics."]}]
+20:["$","p",null,{"children":["This is our community-driven effort, where everyone can contribute, and add their own benchmarks. For all the information on how to run the benchmarks, render them on the dashboard, upload your results or contribute to the project, please check the ",["$","$L1a",null,{"href":"https://github.com/iggy-rs/iggy-bench-dashboard","children":"iggy-bench-dashboard"}]," repository. In general, it's as simple as:"]}]
+21:["$","ul",null,{"children":["\n",["$","li",null,{"children":["Building the ",["$","$L1a",null,{"href":"https://github.com/apache/iggy","children":"Iggy"}]," in the release mode with ",["$","code",null,{"children":"cargo build --release"}]]}],"\n",["$","li",null,{"children":["Starting your Iggy server with ",["$","code",null,{"children":"cargo r --bin iggy-server -r"}]," (feel free to adjust the configuration in ",["$","code",null,{"children":"server.toml"}]," or via environment variab [...]
+22:["$","p",null,{"children":["$","$L29",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"image","src":{"src":"/_next/static/media/iggy_bench_dashboard.913ad513.png","width":2555,"height":1327,"blurWidth":8,"blurHeight":4,"blurDataURL":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAECAYAAACzzX7wAAAAUElEQVR42j3NuQ3AMAxDUQ/jW2ed7D8Xo8hIigcQv2G5rwtmht572puw1kKtNRV3j7jRWvvj521FVcHEiZKAWTHGCBNFRCISRAyifsSe89w8F3YvimrNGGEAAAAASUVORK5CYII="},"placeholder": [...]
+23:["$","p",null,{"children":[["$","strong",null,{"children":"And this is just the beginning"}],", as we plan to extend the dashboard, and add more benchmarks, which are covering the different use cases."]}]
+24:["$","p",null,{"children":["Our main goal is to make the benchmarking process (and its results) ",["$","strong",null,{"children":"transparent, reproducible, and easy to understand"}],". We want to make them a first-class citizen, and a crucial part of the Iggy project. We want to make them a tool, which will help us to improve the performance, and to make Iggy the best streaming server out there. We're looking forward to your feedback, and we hope you'll enjoy the benchmarks."]}]
+25:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"towards-the-microsecond-latency","children":[["$","a",null,{"data-card":"","href":"#towards-the-microsecond-latency","className":"peer","children":"Towards the microsecond latency"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","cla [...]
+26:["$","p",null,{"children":[["$","strong",null,{"children":"And as a cherry on top, we've recently managed to achieve the sub-millisecond write latency"}],". This is a huge milestone for us, as it's a proof that Iggy can be used in low-latency applications, where speed is crucial. Lately, we've been experimenting a lot with ",["$","$L1a",null,{"href":"https://github.com/rkyv/rkyv","children":"rkyv"}]," - zero-copy deserialization framework, which has yielded some great results. Keep in [...]
+27:["$","p",null,{"children":["And the best part is that we're just getting started. We're looking forward to pushing the limits even further, and to see how far we can go. There's still tons of optimizations coming, including switching the runtime to the ",["$","$L1a",null,{"href":"https://github.com/bytedance/monoio","children":"monoio"}]," which does support ",["$","strong",null,{"children":"io_uring"}],", and we've experienced superb results with this one on our experimental branch. [...]
+28:["$","footer",null,{"className":"mt-16 border-t border-fd-border pt-8","children":["$","$L9",null,{"href":"/blogs","className":"inline-flex items-center gap-2 text-sm font-medium text-fd-primary transition-colors hover:opacity-80","children":"← Back to all posts"}]}]
+17:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
+2a:I[27201,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"IconMark"]
+15:null
+19:[["$","title","0",{"children":"Transparent Benchmarking with Apache Iggy | Apache Iggy"}],["$","link","1",{"rel":"icon","href":"/img/favicon.png"}],["$","$L2a","2",{}]]
diff --git a/blogs/2025/05/08/zero-copy-deserialization/__next.!KHNpdGUp.blogs.$c$slug.__PAGE__.txt b/blogs/2025/05/08/zero-copy-deserialization/__next.!KHNpdGUp.blogs.$c$slug.__PAGE__.txt
new file mode 100644
index 00000000..747cf182
--- /dev/null
+++ b/blogs/2025/05/08/zero-copy-deserialization/__next.!KHNpdGUp.blogs.$c$slug.__PAGE__.txt
@@ -0,0 +1,58 @@
+1:"$Sreact.fragment"
+2:I[47873,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"default"]
+2b:I[44324,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"CodeBlock"]
+32:I[24110,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"Image"]
+35:I[22016,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],""]
+36:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"OutletBoundary"]
+37:"$Sreact.suspense"
+39:I[44324,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"Pre"]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","c",{"children":[["$","main",null,{"className":"min-h-screen px-6 py-16 md:px-12","children":["$","article",null,{"className":"mx-auto max-w-5xl","children":[["$","header",null,{"className":"mb-10","children":[["$","time",null,{"className":"text-sm font-medium text-fd-muted-foreground","children":"May 8, 2025"}],["$","h1",null,{"className":"mt-3 text-3xl font-extrabold tracking-tight text-fd-foreground md:text-5xl","children":"Zero-cop [...]
+2c:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+4:["$","p",null,{"children":["Same traits are derived for ",["$","code",null,{"children":"IggyMessage"}]]}]
+2e:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+6:["$","p",null,{"children":["Rkyv internally figures out the memory layout used for serialization, such that it can later on cast it back into its Archived form. (A couple bits of trivia: rkyv, when performing zero copy deserialization, turns the byte representation of your data into its Archived form, so instead of ",["$","code",null,{"children":"IggyBatch"}]," we receive ",["$","code",null,{"children":"ArchivedIggyBatch"}],", rkyv has to reimplement certain complex types such as ",["$ [...]
+7:["$","p",null,{"children":["After a further evaluation of ",["$","code",null,{"children":"IggyBatch"}],", we found that while it was good enough, there was still room for improvement.\nImagine a scenario where the client sends a batch with 100 messages, the server receives it, turns it into Archived form, updates metadata fields, caches/persists it and sends an ack back to the client. The client sends a fetch request for 10 messages, the server receives the request, peeks into the cach [...]
+8:["$","p",null,{"children":["So rather than deriving rkyv's traits to ",["$","code",null,{"children":"IggyBatch"}],", we decided to refine our approach by working at the individual message level."]}]
+30:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+a:["$","p",null,{"children":["We redesigned the IggyBatch structure so that the ",["$","code",null,{"children":"messages"}]," field now stores a byte representation of ",["$","code",null,{"children":"Vec<IggyMessage>"}],", with each message prefixed by its 4-byte length. This approach allows us to traverse through the data, cast individual messages to its archived form, and perform some work on it."]}]
+b:["$","p",null,{"children":["$","$L32",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"image","src":{"src":"/_next/static/media/iggy_batch_schema_1.ca17478c.png","width":1600,"height":664,"blurWidth":8,"blurHeight":3,"blurDataURL":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAADCAYAAACuyE5IAAAAUUlEQVR42h3JyxWAIAwFUUoQ5BMSIoIs1P77eyKLu5gzxvsE1YreB1rruKb3flBYEHYPEyJBRJGIQZkh01EUTBnRBxi7WTjrlrMN1Mm5ffX/Pv3tHxdqJwoTAAAAAElFTkSuQmCC"},"placeholder":"bl [...]
+c:["$","p",null,{"children":"By creating this frankenstein layout that combines length prefixes with rkyv's memory layout, we've achieved the flexibility that we were aiming for, optimized for the most costly copies (messages), rather than the entire batch including its header."}]
+d:["$","p",null,{"children":["One thing worth noting, rkyv requires buffer with your data to be aligned, going after rkyv book - “16-aligned memory should be sufficient.”, thus if you want to prefix your payload with any metadata, make sure that it doesn’t misalign your buffer, or you can opt-in the ",["$","code",null,{"children":"unaligned"}]," feature."]}]
+e:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"beyond-rkyv","children":[["$","a",null,{"data-card":"","href":"#beyond-rkyv","className":"peer","children":"Beyond rkyv"}],["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 [...]
+f:["$","p",null,{"children":["Rkyv is a pretty “heavy” crate that spreads through your entire application from network schema to disk schema, partially coupling your own versioning with its. ",["$","strong",null,{"children":"For many applications there is no way around this"}],", as it is the most complete zero-copy deserialization crate, but we decided to implement a more lightweight solution that gives us control over the memory layout."]}]
+10:["$","p",null,{"children":"We’ve decided to still process messages individually, but have replaced length prefixes with a separate index vector."}]
+33:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+12:["$","p",null,{"children":["$","$L32",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"image","src":{"src":"/_next/static/media/iggy_batch_schema_2.19411d93.png","width":1600,"height":720,"blurWidth":8,"blurHeight":4,"blurDataURL":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAECAYAAACzzX7wAAAAY0lEQVR42jWMQQ7DIBADeUIXUCNgIWlDgP9/cLptlZOt8cguhIhqo/fBdQ3WXKwxOdpO9AG3JaUdJ7k0UlFqq2jKvE3Izw3nxRPMVK2UUon2+GV3OnkIYuXsk/3Vf1BE/mnbB71jKWoQnuRSAAAAAElFTkS [...]
+13:["$","p",null,{"children":["This index vector consists of bytes that, when deserialized form ",["$","code",null,{"children":"u32"}]," values that point to specific positions within the message data. Separating messages from indexes serves purpose beyond the scope of this blog post, but shortly, this index structure closely resembles what we use on the server for message lookup in the log. This in turn, later on ",["$","strong",null,{"children":"allows us to efficiently reuse memory"}],"."]}]
+14:["$","p",null,{"children":["When iterating through the batch, ",["$","strong",null,{"children":"we yield views"}]," instead of fully deserialized messages."]}]
+15:["$","p",null,{"children":["In case if we’d need to have ",["$","code",null,{"children":"IggyMessage"}]," deserialized, we can do it just in time, rather than eagerly, for example when client processes a fetched batch from the server."]}]
+16:["$","p",null,{"children":"This approach allows us to combine the flexibility of solution with length prefixes using rkyv as well as having the freedom of not depending on a 3rd party crate, in fact this solution looks fairly similar to serde partial zero copy deserialization."}]
+17:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"benchmarks","children":[["$","a",null,{"data-card":"","href":"#benchmarks","className":"peer","children":"Benchmarks"}],["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 t [...]
+18:["$","p",null,{"children":"Now the part that all of you are probably most interested in - le benchmarks."}]
+19:["$","p",null,{"children":["Those results come from an ",["$","strong",null,{"children":"AWS i3en.3xlarge"}]," instance"]}]
+1a:["$","p",null,{"children":["$","strong",null,{"children":"Before"}]}]
+1b:["$","p",null,{"children":[["$","$L32",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"image","src":{"src":"/_next/static/media/no_zero_copy_producer.e84a1b6a.png","width":3188,"height":2264,"blurWidth":8,"blurHeight":6,"blurDataURL":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAGCAYAAAD+Bd/7AAAAXUlEQVR42l3NYQ6AIAiGYQ8joJni6v5n+1KM5vrxTmHPRiBiEBFaU1zXbal2+D4wr0+M/6JlgJkMUVxNMGdmcbChrZwzgkhCSgIRh37yPVFqRe0dZ2uoOhrvUcqHHsbOReDKWrrlAAAAAElFTkSuQmC [...]
+1c:["$","div",null,{"className":"relative overflow-auto prose-no-margin my-6","children":["$","table",null,{"children":[["$","thead",null,{"children":["$","tr",null,{"children":[["$","th",null,{"style":{"textAlign":"left"},"children":"No zero-copy"}],["$","th",null,{"style":{"textAlign":"center"},"children":"tput"}],["$","th",null,{"style":{"textAlign":"center"},"children":"p95"}],["$","th",null,{"style":{"textAlign":"center"},"children":"p99"}],["$","th",null,{"style":{"textAlign":"cent [...]
+1d:["$","p",null,{"children":["$","strong",null,{"children":"After"}]}]
+1e:["$","p",null,{"children":[["$","$L32",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"image","src":{"src":"/_next/static/media/zero_copy_producer.61ae01ab.png","width":3194,"height":2260,"blurWidth":8,"blurHeight":6,"blurDataURL":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAGCAYAAAD+Bd/7AAAAYElEQVR42k2OSQ7AIAwDeUw2ukAF/f/XXNIU1INlZTSSk0QEpobzLGito/UbtV4wMzAzkgtE9MYBEX8dLE3oR8gheET0L/ASdLTznHMIM6oh+P6asGHtx7GStw2l1vXHA8YQRbYqY3fqAAAAAElFTkSuQm [...]
+1f:["$","div",null,{"className":"relative overflow-auto prose-no-margin my-6","children":["$","table",null,{"children":[["$","thead",null,{"children":["$","tr",null,{"children":[["$","th",null,{"style":{"textAlign":"left"},"children":"Zero-copy"}],["$","th",null,{"style":{"textAlign":"center"},"children":"tput"}],["$","th",null,{"style":{"textAlign":"center"},"children":"p95"}],["$","th",null,{"style":{"textAlign":"center"},"children":"p99"}],["$","th",null,{"style":{"textAlign":"center" [...]
+20:["$","p",null,{"children":["$","strong",null,{"children":"Almost 2 times higher throughput for reads (2,1GBps vs 4GBps), 40% higher throughput for writes (2,4GBps vs 1,7GBps), 2x better p99 latencies for reads (2.93ms vs 1,46 ms) and 63% better p99 latencies for writes (4.23ms vs 2.59ms)."}]}]
+21:["$","p",null,{"children":["You can find more detailed comparisons on our ",["$","strong",null,{"children":["$","$L2",null,{"href":"https://benchmarks.iggy.apache.org","children":"benchmarking website"}]}],"."]}]
+22:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"concluding","children":[["$","a",null,{"data-card":"","href":"#concluding","className":"peer","children":"Concluding"}],["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 t [...]
+23:["$","p",null,{"children":[["$","strong",null,{"children":"It was a lot of fun exploring the entire design space for our zero copy schema"}],". Depending on the constraints one might end up with a completely different solution, in fact zero copy isn't always the optimal approach, for example, if you'd like to read more about challenges that folks in embedded development have to overcome, check out ",["$","strong",null,{"children":["$","$L2",null,{"href":"https://bsky.app/profile/james [...]
+24:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"whats-next-for-iggy","children":[["$","a",null,{"data-card":"","href":"#whats-next-for-iggy","className":"peer","children":"What’s next for Iggy"}],["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd- [...]
+25:["$","p",null,{"children":["Implementing zero-copy was a major milestone for us, but the train doesn’t slow down. Next in line is ",["$","strong",null,{"children":"io_uring"}]," and ",["$","strong",null,{"children":"thread per core shared nothing"}]," architecture. ",["$","strong",null,{"children":["$","$L2",null,{"href":"https://www.reddit.com/r/rust/comments/1d35fsb/comment/l65wgnt/","children":"We’ve already promised"}]}]," that we will publish more details about it once we have th [...]
+26:["$","p",null,{"children":["For now ",["$","strong",null,{"children":["$","$L2",null,{"href":"https://github.com/apache/iggy/tree/io_uring_monoio_runtime","children":"we did a proof of concept long time ago"}]}],", but realised a few things along the way that we would like to do differently. So we will. Iggy moves onward and upward! 🚀"]}]
+27:["$","footer",null,{"className":"mt-16 border-t border-fd-border pt-8","children":["$","$L35",null,{"href":"/blogs","className":"inline-flex items-center gap-2 text-sm font-medium text-fd-primary transition-colors hover:opacity-80","children":"← Back to all posts"}]}]
+28:["$","script","script-0",{"src":"/_next/static/chunks/00b00679782d0ffd.js","async":true}]
+29:["$","script","script-1",{"src":"/_next/static/chunks/3562882a488c4fbb.js","async":true}]
+2a:["$","$L36",null,{"children":["$","$37",null,{"name":"Next.MetadataOutlet","children":"$@38"}]}]
+2d:["$","$L39",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"#[derive("}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"Archive"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":", "}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"} [...]
+2f:["$","$L39",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"#[derive("}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"Archive"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":", "}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"} [...]
+31:["$","$L39",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" IggyBatch"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" {"}]]}],"\n",["$","span",null,{"className":"line","children":[["$","span",null,{"st [...]
+34:["$","$L39",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" IggyBatch"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8 [...]
+38:null
+3a:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"<"}]
+3b:["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"IggyMessage"}]
+3c:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":">,"}]
+3d:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"}"}]}]
diff --git a/blogs/2025/05/08/zero-copy-deserialization/__next.!KHNpdGUp.blogs.$c$slug.txt b/blogs/2025/05/08/zero-copy-deserialization/__next.!KHNpdGUp.blogs.$c$slug.txt
new file mode 100644
index 00000000..11b31bb0
--- /dev/null
+++ b/blogs/2025/05/08/zero-copy-deserialization/__next.!KHNpdGUp.blogs.$c$slug.txt
@@ -0,0 +1,4 @@
+1:"$Sreact.fragment"
+2:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+3:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","template":["$","$L3",null,{}]}]]}],"loading":null,"isPartial":false}
diff --git a/blogs/2025/05/08/zero-copy-deserialization/__next.!KHNpdGUp.blogs.txt b/blogs/2025/05/08/zero-copy-deserialization/__next.!KHNpdGUp.blogs.txt
new file mode 100644
index 00000000..11b31bb0
--- /dev/null
+++ b/blogs/2025/05/08/zero-copy-deserialization/__next.!KHNpdGUp.blogs.txt
@@ -0,0 +1,4 @@
+1:"$Sreact.fragment"
+2:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+3:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","template":["$","$L3",null,{}]}]]}],"loading":null,"isPartial":false}
diff --git a/blogs/2025/05/08/zero-copy-deserialization/__next.!KHNpdGUp.txt b/blogs/2025/05/08/zero-copy-deserialization/__next.!KHNpdGUp.txt
new file mode 100644
index 00000000..ea3bfa55
--- /dev/null
+++ b/blogs/2025/05/08/zero-copy-deserialization/__next.!KHNpdGUp.txt
@@ -0,0 +1,9 @@
+1:"$Sreact.fragment"
+2:I[83571,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Header"]
+3:I[29966,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFDropdown"]
+4:I[36330,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFMobileLinks"]
+5:I[22016,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],""]
+6:I[88760,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Logo"]
+7:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+8:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","c",{"children":[[["$","script","script-0",{"src":"/_next/static/chunks/8d86be78428a601a.js","async":true}],["$","script","script-1",{"src":"/_next/static/chunks/da34cc6305706ac6.js","async":true}],["$","script","script-2",{"src":"/_next/static/chunks/9baf65674e2de991.js","async":true}],["$","script","script-3",{"src":"/_next/static/chunks/26b70f9828dd1eb5.js","async":true}],["$","script","script-4",{"src":"/_next/static/chunks/adeed83 [...]
diff --git a/blogs/2025/05/08/zero-copy-deserialization/__next._full.txt b/blogs/2025/05/08/zero-copy-deserialization/__next._full.txt
new file mode 100644
index 00000000..30ced98b
--- /dev/null
+++ b/blogs/2025/05/08/zero-copy-deserialization/__next._full.txt
@@ -0,0 +1,79 @@
+1:"$Sreact.fragment"
+2:I[17751,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js"],"RootProvider"]
+3:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+4:I[58298,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/5a37d4cb1abe17d7.js"],"default"]
+5:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+6:I[83571,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Header"]
+7:I[29966,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFDropdown"]
+8:I[36330,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFMobileLinks"]
+9:I[22016,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],""]
+a:I[88760,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Logo"]
+11:I[68027,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+:HL["/_next/static/chunks/32a0415c8ab1bd26.css","style"]
+:HL["/_next/static/media/GeistMono_Variable.p.2f937313.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+:HL["/_next/static/media/Geist_Variable-s.p.92592eb2.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+0:{"P":null,"b":"uBHgltRE2s5QA49x61S_u","c":["","blogs","2025","05","08","zero-copy-deserialization",""],"q":"","i":false,"f":[[["",{"children":["(site)",{"children":["blogs",{"children":[["slug","2025/05/08/zero-copy-deserialization","c"],{"children":["__PAGE__",{}]}]}]}]},"$undefined","$undefined",true],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/32a0415c8ab1bd26.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}] [...]
+13:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"OutletBoundary"]
+14:"$Sreact.suspense"
+16:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"ViewportBoundary"]
+18:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"MetadataBoundary"]
+b:["$","h1",null,{"className":"next-error-h1","style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:1:props:style","children":404}]
+c:["$","div",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:style","children":["$","h2",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style","children":"This page could not be found."}]}]
+d:["$","$1","c",{"children":[null,["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}]
+e:["$","$1","c",{"children":[null,["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}]
+f:["$","$1","c",{"children":["$L12",[["$","script","script-0",{"src":"/_next/static/chunks/00b00679782d0ffd.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/3562882a488c4fbb.js","async":true,"nonce":"$undefined"}]],["$","$L13",null,{"children":["$","$14",null,{"name":"Next.MetadataOutlet","children":"$@15"}]}]]}]
+10:["$","$1","h",{"children":[null,["$","$L16",null,{"children":"$L17"}],["$","div",null,{"hidden":true,"children":["$","$L18",null,{"children":["$","$14",null,{"name":"Next.Metadata","children":"$L19"}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}]
+1a:I[47873,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"default"]
+12:["$","main",null,{"className":"min-h-screen px-6 py-16 md:px-12","children":["$","article",null,{"className":"mx-auto max-w-5xl","children":[["$","header",null,{"className":"mb-10","children":[["$","time",null,{"className":"text-sm font-medium text-fd-muted-foreground","children":"May 8, 2025"}],["$","h1",null,{"className":"mt-3 text-3xl font-extrabold tracking-tight text-fd-foreground md:text-5xl","children":"Zero-copy (de)serialization"}],["$","p",null,{"className":"mt-4 text-base t [...]
+40:I[44324,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"CodeBlock"]
+47:I[24110,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"Image"]
+41:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+1c:["$","p",null,{"children":["Same traits are derived for ",["$","code",null,{"children":"IggyMessage"}]]}]
+43:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+1e:["$","p",null,{"children":["Rkyv internally figures out the memory layout used for serialization, such that it can later on cast it back into its Archived form. (A couple bits of trivia: rkyv, when performing zero copy deserialization, turns the byte representation of your data into its Archived form, so instead of ",["$","code",null,{"children":"IggyBatch"}]," we receive ",["$","code",null,{"children":"ArchivedIggyBatch"}],", rkyv has to reimplement certain complex types such as ",[" [...]
+1f:["$","p",null,{"children":["After a further evaluation of ",["$","code",null,{"children":"IggyBatch"}],", we found that while it was good enough, there was still room for improvement.\nImagine a scenario where the client sends a batch with 100 messages, the server receives it, turns it into Archived form, updates metadata fields, caches/persists it and sends an ack back to the client. The client sends a fetch request for 10 messages, the server receives the request, peeks into the cac [...]
+20:["$","p",null,{"children":["So rather than deriving rkyv's traits to ",["$","code",null,{"children":"IggyBatch"}],", we decided to refine our approach by working at the individual message level."]}]
+45:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+22:["$","p",null,{"children":["We redesigned the IggyBatch structure so that the ",["$","code",null,{"children":"messages"}]," field now stores a byte representation of ",["$","code",null,{"children":"Vec<IggyMessage>"}],", with each message prefixed by its 4-byte length. This approach allows us to traverse through the data, cast individual messages to its archived form, and perform some work on it."]}]
+23:["$","p",null,{"children":["$","$L47",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"image","src":{"src":"/_next/static/media/iggy_batch_schema_1.ca17478c.png","width":1600,"height":664,"blurWidth":8,"blurHeight":3,"blurDataURL":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAADCAYAAACuyE5IAAAAUUlEQVR42h3JyxWAIAwFUUoQ5BMSIoIs1P77eyKLu5gzxvsE1YreB1rruKb3flBYEHYPEyJBRJGIQZkh01EUTBnRBxi7WTjrlrMN1Mm5ffX/Pv3tHxdqJwoTAAAAAElFTkSuQmCC"},"placeholder":"b [...]
+24:["$","p",null,{"children":"By creating this frankenstein layout that combines length prefixes with rkyv's memory layout, we've achieved the flexibility that we were aiming for, optimized for the most costly copies (messages), rather than the entire batch including its header."}]
+25:["$","p",null,{"children":["One thing worth noting, rkyv requires buffer with your data to be aligned, going after rkyv book - “16-aligned memory should be sufficient.”, thus if you want to prefix your payload with any metadata, make sure that it doesn’t misalign your buffer, or you can opt-in the ",["$","code",null,{"children":"unaligned"}]," feature."]}]
+26:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"beyond-rkyv","children":[["$","a",null,{"data-card":"","href":"#beyond-rkyv","className":"peer","children":"Beyond rkyv"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted- [...]
+27:["$","p",null,{"children":["Rkyv is a pretty “heavy” crate that spreads through your entire application from network schema to disk schema, partially coupling your own versioning with its. ",["$","strong",null,{"children":"For many applications there is no way around this"}],", as it is the most complete zero-copy deserialization crate, but we decided to implement a more lightweight solution that gives us control over the memory layout."]}]
+28:["$","p",null,{"children":"We’ve decided to still process messages individually, but have replaced length prefixes with a separate index vector."}]
+48:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+2a:["$","p",null,{"children":["$","$L47",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"image","src":{"src":"/_next/static/media/iggy_batch_schema_2.19411d93.png","width":1600,"height":720,"blurWidth":8,"blurHeight":4,"blurDataURL":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAECAYAAACzzX7wAAAAY0lEQVR42jWMQQ7DIBADeUIXUCNgIWlDgP9/cLptlZOt8cguhIhqo/fBdQ3WXKwxOdpO9AG3JaUdJ7k0UlFqq2jKvE3Izw3nxRPMVK2UUon2+GV3OnkIYuXsk/3Vf1BE/mnbB71jKWoQnuRSAAAAAElFTkS [...]
+2b:["$","p",null,{"children":["This index vector consists of bytes that, when deserialized form ",["$","code",null,{"children":"u32"}]," values that point to specific positions within the message data. Separating messages from indexes serves purpose beyond the scope of this blog post, but shortly, this index structure closely resembles what we use on the server for message lookup in the log. This in turn, later on ",["$","strong",null,{"children":"allows us to efficiently reuse memory"}],"."]}]
+2c:["$","p",null,{"children":["When iterating through the batch, ",["$","strong",null,{"children":"we yield views"}]," instead of fully deserialized messages."]}]
+2d:["$","p",null,{"children":["In case if we’d need to have ",["$","code",null,{"children":"IggyMessage"}]," deserialized, we can do it just in time, rather than eagerly, for example when client processes a fetched batch from the server."]}]
+2e:["$","p",null,{"children":"This approach allows us to combine the flexibility of solution with length prefixes using rkyv as well as having the freedom of not depending on a 3rd party crate, in fact this solution looks fairly similar to serde partial zero copy deserialization."}]
+2f:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"benchmarks","children":[["$","a",null,{"data-card":"","href":"#benchmarks","className":"peer","children":"Benchmarks"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-for [...]
+30:["$","p",null,{"children":"Now the part that all of you are probably most interested in - le benchmarks."}]
+31:["$","p",null,{"children":["Those results come from an ",["$","strong",null,{"children":"AWS i3en.3xlarge"}]," instance"]}]
+32:["$","p",null,{"children":["$","strong",null,{"children":"Before"}]}]
+33:["$","p",null,{"children":[["$","$L47",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"image","src":{"src":"/_next/static/media/no_zero_copy_producer.e84a1b6a.png","width":3188,"height":2264,"blurWidth":8,"blurHeight":6,"blurDataURL":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAGCAYAAAD+Bd/7AAAAXUlEQVR42l3NYQ6AIAiGYQ8joJni6v5n+1KM5vrxTmHPRiBiEBFaU1zXbal2+D4wr0+M/6JlgJkMUVxNMGdmcbChrZwzgkhCSgIRh37yPVFqRe0dZ2uoOhrvUcqHHsbOReDKWrrlAAAAAElFTkSuQmC [...]
+34:["$","div",null,{"className":"relative overflow-auto prose-no-margin my-6","children":["$","table",null,{"children":[["$","thead",null,{"children":["$","tr",null,{"children":[["$","th",null,{"style":{"textAlign":"left"},"children":"No zero-copy"}],["$","th",null,{"style":{"textAlign":"center"},"children":"tput"}],["$","th",null,{"style":{"textAlign":"center"},"children":"p95"}],["$","th",null,{"style":{"textAlign":"center"},"children":"p99"}],["$","th",null,{"style":{"textAlign":"cent [...]
+35:["$","p",null,{"children":["$","strong",null,{"children":"After"}]}]
+36:["$","p",null,{"children":[["$","$L47",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"image","src":{"src":"/_next/static/media/zero_copy_producer.61ae01ab.png","width":3194,"height":2260,"blurWidth":8,"blurHeight":6,"blurDataURL":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAGCAYAAAD+Bd/7AAAAYElEQVR42k2OSQ7AIAwDeUw2ukAF/f/XXNIU1INlZTSSk0QEpobzLGito/UbtV4wMzAzkgtE9MYBEX8dLE3oR8gheET0L/ASdLTznHMIM6oh+P6asGHtx7GStw2l1vXHA8YQRbYqY3fqAAAAAElFTkSuQm [...]
+37:["$","div",null,{"className":"relative overflow-auto prose-no-margin my-6","children":["$","table",null,{"children":[["$","thead",null,{"children":["$","tr",null,{"children":[["$","th",null,{"style":{"textAlign":"left"},"children":"Zero-copy"}],["$","th",null,{"style":{"textAlign":"center"},"children":"tput"}],["$","th",null,{"style":{"textAlign":"center"},"children":"p95"}],["$","th",null,{"style":{"textAlign":"center"},"children":"p99"}],["$","th",null,{"style":{"textAlign":"center" [...]
+38:["$","p",null,{"children":["$","strong",null,{"children":"Almost 2 times higher throughput for reads (2,1GBps vs 4GBps), 40% higher throughput for writes (2,4GBps vs 1,7GBps), 2x better p99 latencies for reads (2.93ms vs 1,46 ms) and 63% better p99 latencies for writes (4.23ms vs 2.59ms)."}]}]
+39:["$","p",null,{"children":["You can find more detailed comparisons on our ",["$","strong",null,{"children":["$","$L1a",null,{"href":"https://benchmarks.iggy.apache.org","children":"benchmarking website"}]}],"."]}]
+3a:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"concluding","children":[["$","a",null,{"data-card":"","href":"#concluding","className":"peer","children":"Concluding"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-for [...]
+3b:["$","p",null,{"children":[["$","strong",null,{"children":"It was a lot of fun exploring the entire design space for our zero copy schema"}],". Depending on the constraints one might end up with a completely different solution, in fact zero copy isn't always the optimal approach, for example, if you'd like to read more about challenges that folks in embedded development have to overcome, check out ",["$","strong",null,{"children":["$","$L1a",null,{"href":"https://bsky.app/profile/jame [...]
+3c:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"whats-next-for-iggy","children":[["$","a",null,{"data-card":"","href":"#whats-next-for-iggy","className":"peer","children":"What’s next for Iggy"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3. [...]
+3d:["$","p",null,{"children":["Implementing zero-copy was a major milestone for us, but the train doesn’t slow down. Next in line is ",["$","strong",null,{"children":"io_uring"}]," and ",["$","strong",null,{"children":"thread per core shared nothing"}]," architecture. ",["$","strong",null,{"children":["$","$L1a",null,{"href":"https://www.reddit.com/r/rust/comments/1d35fsb/comment/l65wgnt/","children":"We’ve already promised"}]}]," that we will publish more details about it once we have t [...]
+3e:["$","p",null,{"children":["For now ",["$","strong",null,{"children":["$","$L1a",null,{"href":"https://github.com/apache/iggy/tree/io_uring_monoio_runtime","children":"we did a proof of concept long time ago"}]}],", but realised a few things along the way that we would like to do differently. So we will. Iggy moves onward and upward! 🚀"]}]
+3f:["$","footer",null,{"className":"mt-16 border-t border-fd-border pt-8","children":["$","$L9",null,{"href":"/blogs","className":"inline-flex items-center gap-2 text-sm font-medium text-fd-primary transition-colors hover:opacity-80","children":"← Back to all posts"}]}]
+4a:I[44324,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"Pre"]
+42:["$","$L4a",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"#[derive("}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"Archive"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":", "}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"} [...]
+44:["$","$L4a",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"#[derive("}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"Archive"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":", "}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"} [...]
+46:["$","$L4a",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" IggyBatch"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" {"}]]}],"\n",["$","span",null,{"className":"line","children":[["$","span",null,{"st [...]
+49:["$","$L4a",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" IggyBatch"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8 [...]
+4b:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"<"}]
+4c:["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"IggyMessage"}]
+4d:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":">,"}]
+4e:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"}"}]}]
+17:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
+4f:I[27201,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"IconMark"]
+15:null
+19:[["$","title","0",{"children":"Zero-copy (de)serialization | Apache Iggy"}],["$","link","1",{"rel":"icon","href":"/img/favicon.png"}],["$","$L4f","2",{}]]
diff --git a/blogs/2025/05/08/zero-copy-deserialization/__next._head.txt b/blogs/2025/05/08/zero-copy-deserialization/__next._head.txt
new file mode 100644
index 00000000..3ca45cad
--- /dev/null
+++ b/blogs/2025/05/08/zero-copy-deserialization/__next._head.txt
@@ -0,0 +1,6 @@
+1:"$Sreact.fragment"
+2:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"ViewportBoundary"]
+3:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"MetadataBoundary"]
+4:"$Sreact.suspense"
+5:I[27201,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"IconMark"]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","h",{"children":[null,["$","$L2",null,{"children":[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]}],["$","div",null,{"hidden":true,"children":["$","$L3",null,{"children":["$","$4",null,{"name":"Next.Metadata","children":[["$","title","0",{"children":"Zero-copy (de)serialization | Apache Iggy"}],["$","link","1",{"rel":"icon","href":"/img/favicon.png"}],["$","$L5 [...]
diff --git a/blogs/2025/05/08/zero-copy-deserialization/__next._index.txt b/blogs/2025/05/08/zero-copy-deserialization/__next._index.txt
new file mode 100644
index 00000000..fd02bd95
--- /dev/null
+++ b/blogs/2025/05/08/zero-copy-deserialization/__next._index.txt
@@ -0,0 +1,7 @@
+1:"$Sreact.fragment"
+2:I[17751,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js"],"RootProvider"]
+3:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+4:I[58298,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/5a37d4cb1abe17d7.js"],"default"]
+5:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+:HL["/_next/static/chunks/32a0415c8ab1bd26.css","style"]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/32a0415c8ab1bd26.css","precedence":"next"}],["$","script","script-0",{"src":"/_next/static/chunks/9ebd3a84bf60af84.js","async":true}],["$","script","script-1",{"src":"/_next/static/chunks/78b5f2e7b839e72f.js","async":true}]],["$","html",null,{"lang":"en","className":"geistsans_d5a4f12f-module__Ur3q_a__variable geistmono_157ca88a-module__iaM1Ya__variable" [...]
diff --git a/blogs/2025/05/08/zero-copy-deserialization/__next._tree.txt b/blogs/2025/05/08/zero-copy-deserialization/__next._tree.txt
new file mode 100644
index 00000000..236d694c
--- /dev/null
+++ b/blogs/2025/05/08/zero-copy-deserialization/__next._tree.txt
@@ -0,0 +1,4 @@
+:HL["/_next/static/chunks/32a0415c8ab1bd26.css","style"]
+:HL["/_next/static/media/GeistMono_Variable.p.2f937313.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+:HL["/_next/static/media/Geist_Variable-s.p.92592eb2.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","tree":{"name":"","paramType":null,"paramKey":"","hasRuntimePrefetch":false,"slots":{"children":{"name":"(site)","paramType":null,"paramKey":"(site)","hasRuntimePrefetch":false,"slots":{"children":{"name":"blogs","paramType":null,"paramKey":"blogs","hasRuntimePrefetch":false,"slots":{"children":{"name":"slug","paramType":"c","paramKey":"2025/05/08/zero-copy-deserialization","hasRuntimePrefetch":false,"slots":{"children":{"name":"__PAGE__","paramType": [...]
diff --git a/blogs/2025/05/08/zero-copy-deserialization/index.html b/blogs/2025/05/08/zero-copy-deserialization/index.html
new file mode 100644
index 00000000..51fc79d8
--- /dev/null
+++ b/blogs/2025/05/08/zero-copy-deserialization/index.html
@@ -0,0 +1,73 @@
+<!DOCTYPE html><!--uBHgltRE2s5QA49x61S_u--><html lang="en" class="geistsans_d5a4f12f-module__Ur3q_a__variable geistmono_157ca88a-module__iaM1Ya__variable"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" href="/_next/static/media/GeistMono_Variable.p.2f937313.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="preload" href="/_next/static/media/Geist_Variable-s.p.92592eb2.woff2" as="font" crossorigin="" type=" [...]
+<p>Apache Iggy considers <strong>performance as one of its core principles</strong>. We take pride in being blazingly fast, as proof of that, we have made <strong><a href="https://iggy.apache.org/blogs/2025/02/17/transparent-benchmarks" rel="noreferrer noopener" target="_blank">benchmarking first-class citizen</a></strong>.</p>
+<p><strong>Zero-copy schema</strong> was a natural next step in our high-performance journey, it was part of our roadmap for quite a while, until the day we have <strong><a href="https://github.com/apache/iggy/pull/1679" rel="noreferrer noopener" target="_blank">finally merged it</a></strong>. In this blog post, we will share our path to implementing it.</p>
+<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="zero-copy-with-rkyv"><a data-card="" href="#zero-copy-with-rkyv" class="peer">Zero copy with rkyv</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d= [...]
+<p>Our initial approach to zero copy was leveraging the existing <strong><a href="https://github.com/rkyv/rkyv" rel="noreferrer noopener" target="_blank">rkyv</a></strong> package which might or might not have been the best choice (more about it later). Using rkyv is pretty straightforward, as it revolves around three traits (<code>Archive</code>, <code>Serialize</code>, <code>Deserialize</code>), all three of which can be derived using derive macros, thus making our job pretty easy.</p>
+<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-3 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-c [...]
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">struct</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> IggyBatch</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> start_offset</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> u64</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> start_timestamp</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> u64</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> end_offset</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> u64</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> end_timestamp</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> u64</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> batch_size</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> u64</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> attributes</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> u16</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> messages</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Vec</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"><</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">IggyMessage</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E [...]
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre></div></figure>
+<p>Same traits are derived for <code>IggyMessage</code></p>
+<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-3 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-c [...]
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">pub</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> struct</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> IggyMessage</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> offset</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> u64</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> timestamp</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> u64</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> value</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Vec</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"><</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">u8</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">>,</sp [...]
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> headers</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Vec</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"><</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">u8</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">>,</ [...]
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre></div></figure>
+<p>Rkyv internally figures out the memory layout used for serialization, such that it can later on cast it back into its Archived form. (A couple bits of trivia: rkyv, when performing zero copy deserialization, turns the byte representation of your data into its Archived form, so instead of <code>IggyBatch</code> we receive <code>ArchivedIggyBatch</code>, rkyv has to reimplement certain complex types such as <code>Vec</code>, <code>HashMap</code> etc., and that’s why it yields back your [...]
+You can learn more about it by reading the <strong><a href="https://rkyv.org" rel="noreferrer noopener" target="_blank">rkyv book</a></strong>, or from this <strong><a href="https://www.youtube.com/watch?v=ON4z2LbTD-4" rel="noreferrer noopener" target="_blank">presentation</a></strong>.</p>
+<p>After a further evaluation of <code>IggyBatch</code>, we found that while it was good enough, there was still room for improvement.
+Imagine a scenario where the client sends a batch with 100 messages, the server receives it, turns it into Archived form, updates metadata fields, caches/persists it and sends an ack back to the client. The client sends a fetch request for 10 messages, the server receives the request, peeks into the cache, finds our batch of 100 messages and here is the tricky bit -
+We would like to send back <strong>only a slice of the cached data</strong> (10 messages instead of 100), but due to rkyv's memory layout, one cannot simply take a slice of those bytes and perform the transformation into its Archived form.</p>
+<p>So rather than deriving rkyv's traits to <code>IggyBatch</code>, we decided to refine our approach by working at the individual message level.</p>
+<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-3 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-c [...]
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> start_offset</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> u64</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> start_timestamp</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> u64</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> end_offset</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> u64</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> end_timestamp</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> u64</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> batch_size</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> u64</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> attributes</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> u16</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> messages</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> AlignedVec</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">// AlignedVec is custom type from rkyv, that represents a vector of [...]
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre></div></figure>
+<p>We redesigned the IggyBatch structure so that the <code>messages</code> field now stores a byte representation of <code>Vec<IggyMessage></code>, with each message prefixed by its 4-byte length. This approach allows us to traverse through the data, cast individual messages to its archived form, and perform some work on it.</p>
+<p><img alt="image" loading="lazy" width="1600" height="664" decoding="async" data-nimg="1" class="rounded-lg" style="color:transparent;background-size:cover;background-position:50% 50%;background-repeat:no-repeat;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 320 120'%3E%3Cfilter id='b' color-interpolation-filters='sRGB'%3E%3CfeGaussianBlur stdDeviation='20'/%3E%3CfeColo [...]
+<p>By creating this frankenstein layout that combines length prefixes with rkyv's memory layout, we've achieved the flexibility that we were aiming for, optimized for the most costly copies (messages), rather than the entire batch including its header.</p>
+<p>One thing worth noting, rkyv requires buffer with your data to be aligned, going after rkyv book - “16-aligned memory should be sufficient.”, thus if you want to prefix your payload with any metadata, make sure that it doesn’t misalign your buffer, or you can opt-in the <code>unaligned</code> feature.</p>
+<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="beyond-rkyv"><a data-card="" href="#beyond-rkyv" class="peer">Beyond rkyv</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.5 [...]
+<p>Rkyv is a pretty “heavy” crate that spreads through your entire application from network schema to disk schema, partially coupling your own versioning with its. <strong>For many applications there is no way around this</strong>, as it is the most complete zero-copy deserialization crate, but we decided to implement a more lightweight solution that gives us control over the memory layout.</p>
+<p>We’ve decided to still process messages individually, but have replaced length prefixes with a separate index vector.</p>
+<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-3 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-c [...]
+<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"> // Remaining fields...</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> indexes</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Vec</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"><</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">u8</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">>,</ [...]
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> messages</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Vec</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"><</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">u8</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">>,< [...]
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre></div></figure>
+<p><img alt="image" loading="lazy" width="1600" height="720" decoding="async" data-nimg="1" class="rounded-lg" style="color:transparent;background-size:cover;background-position:50% 50%;background-repeat:no-repeat;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 320 160'%3E%3Cfilter id='b' color-interpolation-filters='sRGB'%3E%3CfeGaussianBlur stdDeviation='20'/%3E%3CfeColo [...]
+<p>This index vector consists of bytes that, when deserialized form <code>u32</code> values that point to specific positions within the message data. Separating messages from indexes serves purpose beyond the scope of this blog post, but shortly, this index structure closely resembles what we use on the server for message lookup in the log. This in turn, later on <strong>allows us to efficiently reuse memory</strong>.</p>
+<p>When iterating through the batch, <strong>we yield views</strong> instead of fully deserialized messages.</p>
+<p>In case if we’d need to have <code>IggyMessage</code> deserialized, we can do it just in time, rather than eagerly, for example when client processes a fetched batch from the server.</p>
+<p>This approach allows us to combine the flexibility of solution with length prefixes using rkyv as well as having the freedom of not depending on a 3rd party crate, in fact this solution looks fairly similar to serde partial zero copy deserialization.</p>
+<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="benchmarks"><a data-card="" href="#benchmarks" class="peer">Benchmarks</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3 [...]
+<p>Now the part that all of you are probably most interested in - le benchmarks.</p>
+<p>Those results come from an <strong>AWS i3en.3xlarge</strong> instance</p>
+<p><strong>Before</strong></p>
+<p><img alt="image" loading="lazy" width="3188" height="2264" decoding="async" data-nimg="1" class="rounded-lg" style="color:transparent;background-size:cover;background-position:50% 50%;background-repeat:no-repeat;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 320 240'%3E%3Cfilter id='b' color-interpolation-filters='sRGB'%3E%3CfeGaussianBlur stdDeviation='20'/%3E%3CfeCol [...]
+<img alt="image" loading="lazy" width="3186" height="2262" decoding="async" data-nimg="1" class="rounded-lg" style="color:transparent;background-size:cover;background-position:50% 50%;background-repeat:no-repeat;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 320 240'%3E%3Cfilter id='b' color-interpolation-filters='sRGB'%3E%3CfeGaussianBlur stdDeviation='20'/%3E%3CfeColorM [...]
+<div class="relative overflow-auto prose-no-margin my-6"><table><thead><tr><th style="text-align:left">No zero-copy</th><th style="text-align:center">tput</th><th style="text-align:center">p95</th><th style="text-align:center">p99</th><th style="text-align:center">avg</th></tr></thead><tbody><tr><td style="text-align:left">Producer</td><td style="text-align:center">1.7GB/s</td><td style="text-align:center">3.48ms</td><td style="text-align:center">4.23ms</td><td style="text-align:center"> [...]
+<p><strong>After</strong></p>
+<p><img alt="image" loading="lazy" width="3194" height="2260" decoding="async" data-nimg="1" class="rounded-lg" style="color:transparent;background-size:cover;background-position:50% 50%;background-repeat:no-repeat;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 320 240'%3E%3Cfilter id='b' color-interpolation-filters='sRGB'%3E%3CfeGaussianBlur stdDeviation='20'/%3E%3CfeCol [...]
+<img alt="image" loading="lazy" width="3192" height="2266" decoding="async" data-nimg="1" class="rounded-lg" style="color:transparent;background-size:cover;background-position:50% 50%;background-repeat:no-repeat;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 320 240'%3E%3Cfilter id='b' color-interpolation-filters='sRGB'%3E%3CfeGaussianBlur stdDeviation='20'/%3E%3CfeColorM [...]
+<div class="relative overflow-auto prose-no-margin my-6"><table><thead><tr><th style="text-align:left">Zero-copy</th><th style="text-align:center">tput</th><th style="text-align:center">p95</th><th style="text-align:center">p99</th><th style="text-align:center">avg</th></tr></thead><tbody><tr><td style="text-align:left">Producer</td><td style="text-align:center">2.4GB/s</td><td style="text-align:center">2.33ms</td><td style="text-align:center">2.59ms</td><td style="text-align:center">1.6 [...]
+<p><strong>Almost 2 times higher throughput for reads (2,1GBps vs 4GBps), 40% higher throughput for writes (2,4GBps vs 1,7GBps), 2x better p99 latencies for reads (2.93ms vs 1,46 ms) and 63% better p99 latencies for writes (4.23ms vs 2.59ms).</strong></p>
+<p>You can find more detailed comparisons on our <strong><a href="https://benchmarks.iggy.apache.org" rel="noreferrer noopener" target="_blank">benchmarking website</a></strong>.</p>
+<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="concluding"><a data-card="" href="#concluding" class="peer">Concluding</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3 [...]
+<p><strong>It was a lot of fun exploring the entire design space for our zero copy schema</strong>. Depending on the constraints one might end up with a completely different solution, in fact zero copy isn't always the optimal approach, for example, if you'd like to read more about challenges that folks in embedded development have to overcome, check out <strong><a href="https://bsky.app/profile/jamesmunns.com/post/3lnqo5ykawc2r" rel="noreferrer noopener" target="_blank">this B [...]
+<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="whats-next-for-iggy"><a data-card="" href="#whats-next-for-iggy" class="peer">What’s next for Iggy</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d [...]
+<p>Implementing zero-copy was a major milestone for us, but the train doesn’t slow down. Next in line is <strong>io_uring</strong> and <strong>thread per core shared nothing</strong> architecture. <strong><a href="https://www.reddit.com/r/rust/comments/1d35fsb/comment/l65wgnt/" rel="noreferrer noopener" target="_blank">We’ve already promised</a></strong> that we will publish more details about it once we have the results from our benchmark tests, so expect a highly technical blog post in [...]
+<p>For now <strong><a href="https://github.com/apache/iggy/tree/io_uring_monoio_runtime" rel="noreferrer noopener" target="_blank">we did a proof of concept long time ago</a></strong>, but realised a few things along the way that we would like to do differently. So we will. Iggy moves onward and upward! 🚀</p></div><footer class="mt-16 border-t border-fd-border pt-8"><a class="inline-flex items-center gap-2 text-sm font-medium text-fd-primary transition-colors hover:opacity-80" href="/blo [...]
\ No newline at end of file
diff --git a/blogs/2025/05/08/zero-copy-deserialization/index.txt b/blogs/2025/05/08/zero-copy-deserialization/index.txt
new file mode 100644
index 00000000..30ced98b
--- /dev/null
+++ b/blogs/2025/05/08/zero-copy-deserialization/index.txt
@@ -0,0 +1,79 @@
+1:"$Sreact.fragment"
+2:I[17751,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js"],"RootProvider"]
+3:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+4:I[58298,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/5a37d4cb1abe17d7.js"],"default"]
+5:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+6:I[83571,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Header"]
+7:I[29966,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFDropdown"]
+8:I[36330,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFMobileLinks"]
+9:I[22016,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],""]
+a:I[88760,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Logo"]
+11:I[68027,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+:HL["/_next/static/chunks/32a0415c8ab1bd26.css","style"]
+:HL["/_next/static/media/GeistMono_Variable.p.2f937313.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+:HL["/_next/static/media/Geist_Variable-s.p.92592eb2.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+0:{"P":null,"b":"uBHgltRE2s5QA49x61S_u","c":["","blogs","2025","05","08","zero-copy-deserialization",""],"q":"","i":false,"f":[[["",{"children":["(site)",{"children":["blogs",{"children":[["slug","2025/05/08/zero-copy-deserialization","c"],{"children":["__PAGE__",{}]}]}]}]},"$undefined","$undefined",true],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/32a0415c8ab1bd26.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}] [...]
+13:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"OutletBoundary"]
+14:"$Sreact.suspense"
+16:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"ViewportBoundary"]
+18:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"MetadataBoundary"]
+b:["$","h1",null,{"className":"next-error-h1","style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:1:props:style","children":404}]
+c:["$","div",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:style","children":["$","h2",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style","children":"This page could not be found."}]}]
+d:["$","$1","c",{"children":[null,["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}]
+e:["$","$1","c",{"children":[null,["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}]
+f:["$","$1","c",{"children":["$L12",[["$","script","script-0",{"src":"/_next/static/chunks/00b00679782d0ffd.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/3562882a488c4fbb.js","async":true,"nonce":"$undefined"}]],["$","$L13",null,{"children":["$","$14",null,{"name":"Next.MetadataOutlet","children":"$@15"}]}]]}]
+10:["$","$1","h",{"children":[null,["$","$L16",null,{"children":"$L17"}],["$","div",null,{"hidden":true,"children":["$","$L18",null,{"children":["$","$14",null,{"name":"Next.Metadata","children":"$L19"}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}]
+1a:I[47873,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"default"]
+12:["$","main",null,{"className":"min-h-screen px-6 py-16 md:px-12","children":["$","article",null,{"className":"mx-auto max-w-5xl","children":[["$","header",null,{"className":"mb-10","children":[["$","time",null,{"className":"text-sm font-medium text-fd-muted-foreground","children":"May 8, 2025"}],["$","h1",null,{"className":"mt-3 text-3xl font-extrabold tracking-tight text-fd-foreground md:text-5xl","children":"Zero-copy (de)serialization"}],["$","p",null,{"className":"mt-4 text-base t [...]
+40:I[44324,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"CodeBlock"]
+47:I[24110,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"Image"]
+41:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+1c:["$","p",null,{"children":["Same traits are derived for ",["$","code",null,{"children":"IggyMessage"}]]}]
+43:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+1e:["$","p",null,{"children":["Rkyv internally figures out the memory layout used for serialization, such that it can later on cast it back into its Archived form. (A couple bits of trivia: rkyv, when performing zero copy deserialization, turns the byte representation of your data into its Archived form, so instead of ",["$","code",null,{"children":"IggyBatch"}]," we receive ",["$","code",null,{"children":"ArchivedIggyBatch"}],", rkyv has to reimplement certain complex types such as ",[" [...]
+1f:["$","p",null,{"children":["After a further evaluation of ",["$","code",null,{"children":"IggyBatch"}],", we found that while it was good enough, there was still room for improvement.\nImagine a scenario where the client sends a batch with 100 messages, the server receives it, turns it into Archived form, updates metadata fields, caches/persists it and sends an ack back to the client. The client sends a fetch request for 10 messages, the server receives the request, peeks into the cac [...]
+20:["$","p",null,{"children":["So rather than deriving rkyv's traits to ",["$","code",null,{"children":"IggyBatch"}],", we decided to refine our approach by working at the individual message level."]}]
+45:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+22:["$","p",null,{"children":["We redesigned the IggyBatch structure so that the ",["$","code",null,{"children":"messages"}]," field now stores a byte representation of ",["$","code",null,{"children":"Vec<IggyMessage>"}],", with each message prefixed by its 4-byte length. This approach allows us to traverse through the data, cast individual messages to its archived form, and perform some work on it."]}]
+23:["$","p",null,{"children":["$","$L47",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"image","src":{"src":"/_next/static/media/iggy_batch_schema_1.ca17478c.png","width":1600,"height":664,"blurWidth":8,"blurHeight":3,"blurDataURL":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAADCAYAAACuyE5IAAAAUUlEQVR42h3JyxWAIAwFUUoQ5BMSIoIs1P77eyKLu5gzxvsE1YreB1rruKb3flBYEHYPEyJBRJGIQZkh01EUTBnRBxi7WTjrlrMN1Mm5ffX/Pv3tHxdqJwoTAAAAAElFTkSuQmCC"},"placeholder":"b [...]
+24:["$","p",null,{"children":"By creating this frankenstein layout that combines length prefixes with rkyv's memory layout, we've achieved the flexibility that we were aiming for, optimized for the most costly copies (messages), rather than the entire batch including its header."}]
+25:["$","p",null,{"children":["One thing worth noting, rkyv requires buffer with your data to be aligned, going after rkyv book - “16-aligned memory should be sufficient.”, thus if you want to prefix your payload with any metadata, make sure that it doesn’t misalign your buffer, or you can opt-in the ",["$","code",null,{"children":"unaligned"}]," feature."]}]
+26:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"beyond-rkyv","children":[["$","a",null,{"data-card":"","href":"#beyond-rkyv","className":"peer","children":"Beyond rkyv"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted- [...]
+27:["$","p",null,{"children":["Rkyv is a pretty “heavy” crate that spreads through your entire application from network schema to disk schema, partially coupling your own versioning with its. ",["$","strong",null,{"children":"For many applications there is no way around this"}],", as it is the most complete zero-copy deserialization crate, but we decided to implement a more lightweight solution that gives us control over the memory layout."]}]
+28:["$","p",null,{"children":"We’ve decided to still process messages individually, but have replaced length prefixes with a separate index vector."}]
+48:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+2a:["$","p",null,{"children":["$","$L47",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"image","src":{"src":"/_next/static/media/iggy_batch_schema_2.19411d93.png","width":1600,"height":720,"blurWidth":8,"blurHeight":4,"blurDataURL":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAECAYAAACzzX7wAAAAY0lEQVR42jWMQQ7DIBADeUIXUCNgIWlDgP9/cLptlZOt8cguhIhqo/fBdQ3WXKwxOdpO9AG3JaUdJ7k0UlFqq2jKvE3Izw3nxRPMVK2UUon2+GV3OnkIYuXsk/3Vf1BE/mnbB71jKWoQnuRSAAAAAElFTkS [...]
+2b:["$","p",null,{"children":["This index vector consists of bytes that, when deserialized form ",["$","code",null,{"children":"u32"}]," values that point to specific positions within the message data. Separating messages from indexes serves purpose beyond the scope of this blog post, but shortly, this index structure closely resembles what we use on the server for message lookup in the log. This in turn, later on ",["$","strong",null,{"children":"allows us to efficiently reuse memory"}],"."]}]
+2c:["$","p",null,{"children":["When iterating through the batch, ",["$","strong",null,{"children":"we yield views"}]," instead of fully deserialized messages."]}]
+2d:["$","p",null,{"children":["In case if we’d need to have ",["$","code",null,{"children":"IggyMessage"}]," deserialized, we can do it just in time, rather than eagerly, for example when client processes a fetched batch from the server."]}]
+2e:["$","p",null,{"children":"This approach allows us to combine the flexibility of solution with length prefixes using rkyv as well as having the freedom of not depending on a 3rd party crate, in fact this solution looks fairly similar to serde partial zero copy deserialization."}]
+2f:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"benchmarks","children":[["$","a",null,{"data-card":"","href":"#benchmarks","className":"peer","children":"Benchmarks"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-for [...]
+30:["$","p",null,{"children":"Now the part that all of you are probably most interested in - le benchmarks."}]
+31:["$","p",null,{"children":["Those results come from an ",["$","strong",null,{"children":"AWS i3en.3xlarge"}]," instance"]}]
+32:["$","p",null,{"children":["$","strong",null,{"children":"Before"}]}]
+33:["$","p",null,{"children":[["$","$L47",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"image","src":{"src":"/_next/static/media/no_zero_copy_producer.e84a1b6a.png","width":3188,"height":2264,"blurWidth":8,"blurHeight":6,"blurDataURL":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAGCAYAAAD+Bd/7AAAAXUlEQVR42l3NYQ6AIAiGYQ8joJni6v5n+1KM5vrxTmHPRiBiEBFaU1zXbal2+D4wr0+M/6JlgJkMUVxNMGdmcbChrZwzgkhCSgIRh37yPVFqRe0dZ2uoOhrvUcqHHsbOReDKWrrlAAAAAElFTkSuQmC [...]
+34:["$","div",null,{"className":"relative overflow-auto prose-no-margin my-6","children":["$","table",null,{"children":[["$","thead",null,{"children":["$","tr",null,{"children":[["$","th",null,{"style":{"textAlign":"left"},"children":"No zero-copy"}],["$","th",null,{"style":{"textAlign":"center"},"children":"tput"}],["$","th",null,{"style":{"textAlign":"center"},"children":"p95"}],["$","th",null,{"style":{"textAlign":"center"},"children":"p99"}],["$","th",null,{"style":{"textAlign":"cent [...]
+35:["$","p",null,{"children":["$","strong",null,{"children":"After"}]}]
+36:["$","p",null,{"children":[["$","$L47",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"image","src":{"src":"/_next/static/media/zero_copy_producer.61ae01ab.png","width":3194,"height":2260,"blurWidth":8,"blurHeight":6,"blurDataURL":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAGCAYAAAD+Bd/7AAAAYElEQVR42k2OSQ7AIAwDeUw2ukAF/f/XXNIU1INlZTSSk0QEpobzLGito/UbtV4wMzAzkgtE9MYBEX8dLE3oR8gheET0L/ASdLTznHMIM6oh+P6asGHtx7GStw2l1vXHA8YQRbYqY3fqAAAAAElFTkSuQm [...]
+37:["$","div",null,{"className":"relative overflow-auto prose-no-margin my-6","children":["$","table",null,{"children":[["$","thead",null,{"children":["$","tr",null,{"children":[["$","th",null,{"style":{"textAlign":"left"},"children":"Zero-copy"}],["$","th",null,{"style":{"textAlign":"center"},"children":"tput"}],["$","th",null,{"style":{"textAlign":"center"},"children":"p95"}],["$","th",null,{"style":{"textAlign":"center"},"children":"p99"}],["$","th",null,{"style":{"textAlign":"center" [...]
+38:["$","p",null,{"children":["$","strong",null,{"children":"Almost 2 times higher throughput for reads (2,1GBps vs 4GBps), 40% higher throughput for writes (2,4GBps vs 1,7GBps), 2x better p99 latencies for reads (2.93ms vs 1,46 ms) and 63% better p99 latencies for writes (4.23ms vs 2.59ms)."}]}]
+39:["$","p",null,{"children":["You can find more detailed comparisons on our ",["$","strong",null,{"children":["$","$L1a",null,{"href":"https://benchmarks.iggy.apache.org","children":"benchmarking website"}]}],"."]}]
+3a:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"concluding","children":[["$","a",null,{"data-card":"","href":"#concluding","className":"peer","children":"Concluding"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-for [...]
+3b:["$","p",null,{"children":[["$","strong",null,{"children":"It was a lot of fun exploring the entire design space for our zero copy schema"}],". Depending on the constraints one might end up with a completely different solution, in fact zero copy isn't always the optimal approach, for example, if you'd like to read more about challenges that folks in embedded development have to overcome, check out ",["$","strong",null,{"children":["$","$L1a",null,{"href":"https://bsky.app/profile/jame [...]
+3c:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"whats-next-for-iggy","children":[["$","a",null,{"data-card":"","href":"#whats-next-for-iggy","className":"peer","children":"What’s next for Iggy"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3. [...]
+3d:["$","p",null,{"children":["Implementing zero-copy was a major milestone for us, but the train doesn’t slow down. Next in line is ",["$","strong",null,{"children":"io_uring"}]," and ",["$","strong",null,{"children":"thread per core shared nothing"}]," architecture. ",["$","strong",null,{"children":["$","$L1a",null,{"href":"https://www.reddit.com/r/rust/comments/1d35fsb/comment/l65wgnt/","children":"We’ve already promised"}]}]," that we will publish more details about it once we have t [...]
+3e:["$","p",null,{"children":["For now ",["$","strong",null,{"children":["$","$L1a",null,{"href":"https://github.com/apache/iggy/tree/io_uring_monoio_runtime","children":"we did a proof of concept long time ago"}]}],", but realised a few things along the way that we would like to do differently. So we will. Iggy moves onward and upward! 🚀"]}]
+3f:["$","footer",null,{"className":"mt-16 border-t border-fd-border pt-8","children":["$","$L9",null,{"href":"/blogs","className":"inline-flex items-center gap-2 text-sm font-medium text-fd-primary transition-colors hover:opacity-80","children":"← Back to all posts"}]}]
+4a:I[44324,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"Pre"]
+42:["$","$L4a",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"#[derive("}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"Archive"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":", "}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"} [...]
+44:["$","$L4a",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"#[derive("}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"Archive"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":", "}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"} [...]
+46:["$","$L4a",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" IggyBatch"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" {"}]]}],"\n",["$","span",null,{"className":"line","children":[["$","span",null,{"st [...]
+49:["$","$L4a",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" IggyBatch"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8 [...]
+4b:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"<"}]
+4c:["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"IggyMessage"}]
+4d:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":">,"}]
+4e:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"}"}]}]
+17:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
+4f:I[27201,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"IconMark"]
+15:null
+19:[["$","title","0",{"children":"Zero-copy (de)serialization | Apache Iggy"}],["$","link","1",{"rel":"icon","href":"/img/favicon.png"}],["$","$L4f","2",{}]]
diff --git a/blogs/2025/06/06/connectors-runtime/__next.!KHNpdGUp.blogs.$c$slug.__PAGE__.txt b/blogs/2025/06/06/connectors-runtime/__next.!KHNpdGUp.blogs.$c$slug.__PAGE__.txt
new file mode 100644
index 00000000..486b44e2
--- /dev/null
+++ b/blogs/2025/06/06/connectors-runtime/__next.!KHNpdGUp.blogs.$c$slug.__PAGE__.txt
@@ -0,0 +1,70 @@
+1:"$Sreact.fragment"
+2:I[47873,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"default"]
+1a:I[44324,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"CodeBlock"]
+1b:I[44324,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"Pre"]
+2f:I[22016,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],""]
+30:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"OutletBoundary"]
+31:"$Sreact.suspense"
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","c",{"children":[["$","main",null,{"className":"min-h-screen px-6 py-16 md:px-12","children":["$","article",null,{"className":"mx-auto max-w-5xl","children":[["$","header",null,{"className":"mb-10","children":[["$","time",null,{"className":"text-sm font-medium text-fd-muted-foreground","children":"June 6, 2025"}],["$","h1",null,{"className":"mt-3 text-3xl font-extrabold tracking-tight text-fd-foreground md:text-5xl","children":"Connect [...]
+3:["$","strong",null,{"children":"sources"}]
+4:["$","strong",null,{"children":"sinks"}]
+5:["$","p",null,{"children":"Let's say that we would like to get the real-time changes from a database (Postgres CDC for example) and send them to Apache Iggy, while performing some optional data transformation, such as filtering or enriching the data. Or, we might want to fetch data from Apache Iggy (e.g. produced by our custom services), transform it, and then push it further to the external indexer such as Elastic or Quickwit."}]
+6:["$","p",null,{"children":[["$","strong",null,{"children":"Instead of building all these pipelines from scratch as custom applications, we can leverage the power of connectors to simplify the process"}],". Simply download one of the existing plugins, configure it using the provided configuration files, and start using it - no need to write any code!"]}]
+7:["$","p",null,{"children":["Here's an example of a configuration file for the sink connector named ",["$","code",null,{"children":"stdout"}],":"]}]
+8:["$","$L1a",null,{"className":"shiki shiki-themes github-light github-dark","style":{"--shiki-light":"#24292e","--shiki-dark":"#e1e4e8","--shiki-light-bg":"#fff","--shiki-dark-bg":"#24292e"},"tabIndex":"0","icon":"<svg viewBox=\"0 0 24 24\"><path d=\"M 6,1 C 4.354992,1 3,2.354992 3,4 v 16 c 0,1.645008 1.354992,3 3,3 h 12 c 1.645008,0 3,-1.354992 3,-3 V 8 7 A 1.0001,1.0001 0 0 0 20.707031,6.2929687 l -5,-5 A 1.0001,1.0001 0 0 0 15,1 h -1 z m 0,2 h 7 v 3 c 0,1.645008 1.354992,3 3,3 h 3 v [...]
+9:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"rust-based-plugins","children":[["$","a",null,{"data-card":"","href":"#rust-based-plugins","className":"peer","children":"Rust-based plugins"}],["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted [...]
+a:["$","p",null,{"children":["Since Apache Iggy is implemented in Rust, it was an easy choice to implement the connectors in Rust as well. ",["$","strong",null,{"children":"This allows us to take advantage of the Rust's powerful type system and memory safety features"}],", ensuring that the connectors are reliable and efficient. Internally, we use ",["$","strong",null,{"children":["$","$L2",null,{"href":"https://github.com/OpenByteDev/dlopen2","children":"dlopen2"}]}]," library to load t [...]
+b:["$","p",null,{"children":["Thanks to this approach, just like Iggy itself, the connector runtime (which is a separate process), is very lightweight and easy to deploy. ",["$","strong",null,{"children":"The runtime uses just a few MBs of memory on its own, while consuming minimal CPU resources."}]," Behind the scenes, we use the shared ",["$","strong",null,{"children":["$","$L2",null,{"href":"https://tokio.rs","children":"Tokio runtime"}]}]," to manage the asynchronous tasks and events [...]
+c:["$","p",null,{"children":["When running a simple benchmark based on the custom ",["$","strong",null,{"children":["$","$L2",null,{"href":"https://github.com/apache/iggy/tree/master/core/connectors/sinks/quickwit_sink","children":"Quickwit sink"}]}]," connector, which pulls the data in real time from Iggy stream, does a basic data transformation (using the JSON payload format), and then pushes the data further to the Quickwit HTTP API, we observed that this plugin ",["$","strong",null,{ [...]
+d:["$","p",null,{"children":["Last, but not least, It's quite easy to create your own connectors - simply implement either ",["$","code",null,{"children":"Sink"}]," or ",["$","code",null,{"children":"Source"}]," trait, compile the library and configure it in the runtime. Please check the ",["$","strong",null,{"children":["$","$L2",null,{"href":"https://github.com/apache/iggy/tree/master/core/connectors/","children":"repository"}]}]," or the ",["$","strong",null,{"children":["$","$L2",nul [...]
+2b:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+2d:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+10:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"whats-next","children":[["$","a",null,{"data-card":"","href":"#whats-next","className":"peer","children":"What's next?"}],["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 [...]
+11:["$","p",null,{"children":"Since it's the very early release to showcase what's possible with the connector runtime, we plan to focus on improving the performance and stability of the runtime itself."}]
+12:["$","p",null,{"children":"Moreover, we plan to build more connectors, data transformations and schema encoders/decoders, to support the seamless transition between the different data formats and protocols."}]
+13:["$","p",null,{"children":"It's also worth mentioning that the runtime uses one of the existing network protocols available via Rust SDK to connect to the Iggy server (so-called distributed mode). And while it might be the case for most of the deployments out there, we might also support e.g. UDS or some sort of IPC to allow the connectors deployment on the same machine, next to the streaming server."}]
+14:["$","p",null,{"children":["Finally, we would love to hear your feedback and suggestions on how to improve the runtime and connectors. Please feel free to open an ",["$","strong",null,{"children":["$","$L2",null,{"href":"https://github.com/apache/iggy/issues","children":"issue"}]}],", ",["$","strong",null,{"children":["$","$L2",null,{"href":"https://github.com/apache/iggy/pulls","children":"pull request"}]}]," or start a ",["$","strong",null,{"children":["$","$L2",null,{"href":"https: [...]
+15:["$","p",null,{"children":["As always, you are more than welcome to join our ",["$","strong",null,{"children":["$","$L2",null,{"href":"https://discord.gg/apache-iggy","children":"Discord community"}]}],"!"]}]
+16:["$","footer",null,{"className":"mt-16 border-t border-fd-border pt-8","children":["$","$L2f",null,{"href":"/blogs","className":"inline-flex items-center gap-2 text-sm font-medium text-fd-primary transition-colors hover:opacity-80","children":"← Back to all posts"}]}]
+17:["$","script","script-0",{"src":"/_next/static/chunks/00b00679782d0ffd.js","async":true}]
+18:["$","script","script-1",{"src":"/_next/static/chunks/3562882a488c4fbb.js","async":true}]
+19:["$","$L30",null,{"children":["$","$31",null,{"name":"Next.MetadataOutlet","children":"$@32"}]}]
+1c:["$","span",null,{"style":{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},"children":"\"5ms\""}]
+1d:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"consumer_group = "}],["$","span",null,{"style":{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},"children":"\"stdout_sink_connector\""}]]}]
+1e:["$","span",null,{"className":"line"}]
+1f:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"},"children":"# Custom configuration for the sink connector, deserialized to type T from `config` field"}]}]
+20:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"["}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"sinks"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"."}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"stdout"}],["$","span",null,{"style":{"--shiki-light":"#24 [...]
+21:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"print_payload = "}],["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":"true"}]]}]
+22:["$","span",null,{"className":"line"}]
+23:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"},"children":"# Optional data transformation(s) to be applied after consuming messages from the stream"}]}]
+24:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"["}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"sinks"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"."}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"stdout"}],["$","span",null,{"style":{"--shiki-light":"#24 [...]
+25:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"enabled = "}],["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":"true"}]]}]
+26:["$","span",null,{"className":"line"}]
+27:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"},"children":"# Collection of the fields transforms to be applied after consuming messages from the stream"}]}]
+28:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"[["}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"sinks"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"."}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"stdout"}],["$","span",null,{"style":{"--shiki-light":"#2 [...]
+29:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"key = "}],["$","span",null,{"style":{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},"children":"\"message\""}]]}]
+2a:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"value.static = "}],["$","span",null,{"style":{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},"children":"\"hello\""}]]}]
+2c:["$","$L1b",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"#[async_trait]"}]}],"\n",["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" trait"}],["$","span",null,{ [...]
+2e:["$","$L1b",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"#[async_trait]"}]}],"\n",["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" trait"}],["$","span",null,{ [...]
+32:null
+33:["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}]
+34:["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Vec"}]
+35:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"<"}]
+36:["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"ConsumedMessage"}]
+37:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":">,"}]
+38:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" ) "}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"->"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Result"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"<(), "}],["$","span",null,{"style":{"--shiki-ligh [...]
+39:["$","span",null,{"className":"line"}]
+3a:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"},"children":" /// Invoked when the sink is closed, allowing it to perform any necessary cleanup."}]}]
+3b:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" async"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" fn"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" close"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"("}],["$","span",null,{"style":{"--shiki-light [...]
+3c:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"}"}]}]
+3d:["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" close"}]
+3e:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"("}]
+3f:["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"&mut"}]
+40:["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" self"}]
+41:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":") "}]
+42:["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"->"}]
+43:["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Result"}]
+44:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"<(), "}]
+45:["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"Error"}]
+46:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":">;"}]
+47:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"}"}]}]
diff --git a/blogs/2025/06/06/connectors-runtime/__next.!KHNpdGUp.blogs.$c$slug.txt b/blogs/2025/06/06/connectors-runtime/__next.!KHNpdGUp.blogs.$c$slug.txt
new file mode 100644
index 00000000..11b31bb0
--- /dev/null
+++ b/blogs/2025/06/06/connectors-runtime/__next.!KHNpdGUp.blogs.$c$slug.txt
@@ -0,0 +1,4 @@
+1:"$Sreact.fragment"
+2:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+3:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","template":["$","$L3",null,{}]}]]}],"loading":null,"isPartial":false}
diff --git a/blogs/2025/06/06/connectors-runtime/__next.!KHNpdGUp.blogs.txt b/blogs/2025/06/06/connectors-runtime/__next.!KHNpdGUp.blogs.txt
new file mode 100644
index 00000000..11b31bb0
--- /dev/null
+++ b/blogs/2025/06/06/connectors-runtime/__next.!KHNpdGUp.blogs.txt
@@ -0,0 +1,4 @@
+1:"$Sreact.fragment"
+2:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+3:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","template":["$","$L3",null,{}]}]]}],"loading":null,"isPartial":false}
diff --git a/blogs/2025/06/06/connectors-runtime/__next.!KHNpdGUp.txt b/blogs/2025/06/06/connectors-runtime/__next.!KHNpdGUp.txt
new file mode 100644
index 00000000..ea3bfa55
--- /dev/null
+++ b/blogs/2025/06/06/connectors-runtime/__next.!KHNpdGUp.txt
@@ -0,0 +1,9 @@
+1:"$Sreact.fragment"
+2:I[83571,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Header"]
+3:I[29966,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFDropdown"]
+4:I[36330,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFMobileLinks"]
+5:I[22016,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],""]
+6:I[88760,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Logo"]
+7:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+8:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","c",{"children":[[["$","script","script-0",{"src":"/_next/static/chunks/8d86be78428a601a.js","async":true}],["$","script","script-1",{"src":"/_next/static/chunks/da34cc6305706ac6.js","async":true}],["$","script","script-2",{"src":"/_next/static/chunks/9baf65674e2de991.js","async":true}],["$","script","script-3",{"src":"/_next/static/chunks/26b70f9828dd1eb5.js","async":true}],["$","script","script-4",{"src":"/_next/static/chunks/adeed83 [...]
diff --git a/blogs/2025/06/06/connectors-runtime/__next._full.txt b/blogs/2025/06/06/connectors-runtime/__next._full.txt
new file mode 100644
index 00000000..01cc6bee
--- /dev/null
+++ b/blogs/2025/06/06/connectors-runtime/__next._full.txt
@@ -0,0 +1,90 @@
+1:"$Sreact.fragment"
+2:I[17751,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js"],"RootProvider"]
+3:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+4:I[58298,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/5a37d4cb1abe17d7.js"],"default"]
+5:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+6:I[83571,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Header"]
+7:I[29966,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFDropdown"]
+8:I[36330,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFMobileLinks"]
+9:I[22016,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],""]
+a:I[88760,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Logo"]
+11:I[68027,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+:HL["/_next/static/chunks/32a0415c8ab1bd26.css","style"]
+:HL["/_next/static/media/GeistMono_Variable.p.2f937313.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+:HL["/_next/static/media/Geist_Variable-s.p.92592eb2.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+0:{"P":null,"b":"uBHgltRE2s5QA49x61S_u","c":["","blogs","2025","06","06","connectors-runtime",""],"q":"","i":false,"f":[[["",{"children":["(site)",{"children":["blogs",{"children":[["slug","2025/06/06/connectors-runtime","c"],{"children":["__PAGE__",{}]}]}]}]},"$undefined","$undefined",true],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/32a0415c8ab1bd26.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script" [...]
+13:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"OutletBoundary"]
+14:"$Sreact.suspense"
+16:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"ViewportBoundary"]
+18:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"MetadataBoundary"]
+b:["$","h1",null,{"className":"next-error-h1","style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:1:props:style","children":404}]
+c:["$","div",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:style","children":["$","h2",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style","children":"This page could not be found."}]}]
+d:["$","$1","c",{"children":[null,["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}]
+e:["$","$1","c",{"children":[null,["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}]
+f:["$","$1","c",{"children":["$L12",[["$","script","script-0",{"src":"/_next/static/chunks/00b00679782d0ffd.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/3562882a488c4fbb.js","async":true,"nonce":"$undefined"}]],["$","$L13",null,{"children":["$","$14",null,{"name":"Next.MetadataOutlet","children":"$@15"}]}]]}]
+10:["$","$1","h",{"children":[null,["$","$L16",null,{"children":"$L17"}],["$","div",null,{"hidden":true,"children":["$","$L18",null,{"children":["$","$14",null,{"name":"Next.Metadata","children":"$L19"}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}]
+1a:I[47873,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"default"]
+12:["$","main",null,{"className":"min-h-screen px-6 py-16 md:px-12","children":["$","article",null,{"className":"mx-auto max-w-5xl","children":[["$","header",null,{"className":"mb-10","children":[["$","time",null,{"className":"text-sm font-medium text-fd-muted-foreground","children":"June 6, 2025"}],["$","h1",null,{"className":"mt-3 text-3xl font-extrabold tracking-tight text-fd-foreground md:text-5xl","children":"Connectors runtime"}],["$","p",null,{"className":"mt-4 text-base text-fd-m [...]
+2e:I[44324,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"CodeBlock"]
+2f:I[44324,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"Pre"]
+1b:["$","strong",null,{"children":"sinks"}]
+1c:["$","p",null,{"children":"Let's say that we would like to get the real-time changes from a database (Postgres CDC for example) and send them to Apache Iggy, while performing some optional data transformation, such as filtering or enriching the data. Or, we might want to fetch data from Apache Iggy (e.g. produced by our custom services), transform it, and then push it further to the external indexer such as Elastic or Quickwit."}]
+1d:["$","p",null,{"children":[["$","strong",null,{"children":"Instead of building all these pipelines from scratch as custom applications, we can leverage the power of connectors to simplify the process"}],". Simply download one of the existing plugins, configure it using the provided configuration files, and start using it - no need to write any code!"]}]
+1e:["$","p",null,{"children":["Here's an example of a configuration file for the sink connector named ",["$","code",null,{"children":"stdout"}],":"]}]
+1f:["$","$L2e",null,{"className":"shiki shiki-themes github-light github-dark","style":{"--shiki-light":"#24292e","--shiki-dark":"#e1e4e8","--shiki-light-bg":"#fff","--shiki-dark-bg":"#24292e"},"tabIndex":"0","icon":"<svg viewBox=\"0 0 24 24\"><path d=\"M 6,1 C 4.354992,1 3,2.354992 3,4 v 16 c 0,1.645008 1.354992,3 3,3 h 12 c 1.645008,0 3,-1.354992 3,-3 V 8 7 A 1.0001,1.0001 0 0 0 20.707031,6.2929687 l -5,-5 A 1.0001,1.0001 0 0 0 15,1 h -1 z m 0,2 h 7 v 3 c 0,1.645008 1.354992,3 3,3 h 3 [...]
+20:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"rust-based-plugins","children":[["$","a",null,{"data-card":"","href":"#rust-based-plugins","className":"peer","children":"Rust-based plugins"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 sh [...]
+21:["$","p",null,{"children":["Since Apache Iggy is implemented in Rust, it was an easy choice to implement the connectors in Rust as well. ",["$","strong",null,{"children":"This allows us to take advantage of the Rust's powerful type system and memory safety features"}],", ensuring that the connectors are reliable and efficient. Internally, we use ",["$","strong",null,{"children":["$","$L1a",null,{"href":"https://github.com/OpenByteDev/dlopen2","children":"dlopen2"}]}]," library to load [...]
+22:["$","p",null,{"children":["Thanks to this approach, just like Iggy itself, the connector runtime (which is a separate process), is very lightweight and easy to deploy. ",["$","strong",null,{"children":"The runtime uses just a few MBs of memory on its own, while consuming minimal CPU resources."}]," Behind the scenes, we use the shared ",["$","strong",null,{"children":["$","$L1a",null,{"href":"https://tokio.rs","children":"Tokio runtime"}]}]," to manage the asynchronous tasks and even [...]
+23:["$","p",null,{"children":["When running a simple benchmark based on the custom ",["$","strong",null,{"children":["$","$L1a",null,{"href":"https://github.com/apache/iggy/tree/master/core/connectors/sinks/quickwit_sink","children":"Quickwit sink"}]}]," connector, which pulls the data in real time from Iggy stream, does a basic data transformation (using the JSON payload format), and then pushes the data further to the Quickwit HTTP API, we observed that this plugin ",["$","strong",null [...]
+24:["$","p",null,{"children":["Last, but not least, It's quite easy to create your own connectors - simply implement either ",["$","code",null,{"children":"Sink"}]," or ",["$","code",null,{"children":"Source"}]," trait, compile the library and configure it in the runtime. Please check the ",["$","strong",null,{"children":["$","$L1a",null,{"href":"https://github.com/apache/iggy/tree/master/core/connectors/","children":"repository"}]}]," or the ",["$","strong",null,{"children":["$","$L1a", [...]
+3f:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+41:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+27:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"whats-next","children":[["$","a",null,{"data-card":"","href":"#whats-next","className":"peer","children":"What's next?"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-f [...]
+28:["$","p",null,{"children":"Since it's the very early release to showcase what's possible with the connector runtime, we plan to focus on improving the performance and stability of the runtime itself."}]
+29:["$","p",null,{"children":"Moreover, we plan to build more connectors, data transformations and schema encoders/decoders, to support the seamless transition between the different data formats and protocols."}]
+2a:["$","p",null,{"children":"It's also worth mentioning that the runtime uses one of the existing network protocols available via Rust SDK to connect to the Iggy server (so-called distributed mode). And while it might be the case for most of the deployments out there, we might also support e.g. UDS or some sort of IPC to allow the connectors deployment on the same machine, next to the streaming server."}]
+2b:["$","p",null,{"children":["Finally, we would love to hear your feedback and suggestions on how to improve the runtime and connectors. Please feel free to open an ",["$","strong",null,{"children":["$","$L1a",null,{"href":"https://github.com/apache/iggy/issues","children":"issue"}]}],", ",["$","strong",null,{"children":["$","$L1a",null,{"href":"https://github.com/apache/iggy/pulls","children":"pull request"}]}]," or start a ",["$","strong",null,{"children":["$","$L1a",null,{"href":"htt [...]
+2c:["$","p",null,{"children":["As always, you are more than welcome to join our ",["$","strong",null,{"children":["$","$L1a",null,{"href":"https://discord.gg/apache-iggy","children":"Discord community"}]}],"!"]}]
+2d:["$","footer",null,{"className":"mt-16 border-t border-fd-border pt-8","children":["$","$L9",null,{"href":"/blogs","className":"inline-flex items-center gap-2 text-sm font-medium text-fd-primary transition-colors hover:opacity-80","children":"← Back to all posts"}]}]
+30:["$","span",null,{"style":{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},"children":"\"5ms\""}]
+31:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"consumer_group = "}],["$","span",null,{"style":{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},"children":"\"stdout_sink_connector\""}]]}]
+32:["$","span",null,{"className":"line"}]
+33:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"},"children":"# Custom configuration for the sink connector, deserialized to type T from `config` field"}]}]
+34:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"["}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"sinks"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"."}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"stdout"}],["$","span",null,{"style":{"--shiki-light":"#24 [...]
+35:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"print_payload = "}],["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":"true"}]]}]
+36:["$","span",null,{"className":"line"}]
+37:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"},"children":"# Optional data transformation(s) to be applied after consuming messages from the stream"}]}]
+38:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"["}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"sinks"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"."}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"stdout"}],["$","span",null,{"style":{"--shiki-light":"#24 [...]
+39:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"enabled = "}],["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":"true"}]]}]
+3a:["$","span",null,{"className":"line"}]
+3b:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"},"children":"# Collection of the fields transforms to be applied after consuming messages from the stream"}]}]
+3c:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"[["}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"sinks"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"."}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"stdout"}],["$","span",null,{"style":{"--shiki-light":"#2 [...]
+3d:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"key = "}],["$","span",null,{"style":{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},"children":"\"message\""}]]}]
+3e:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"value.static = "}],["$","span",null,{"style":{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},"children":"\"hello\""}]]}]
+40:["$","$L2f",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"#[async_trait]"}]}],"\n",["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" trait"}],["$","span",null,{ [...]
+42:["$","$L2f",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"#[async_trait]"}]}],"\n",["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" trait"}],["$","span",null,{ [...]
+43:["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}]
+44:["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Vec"}]
+45:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"<"}]
+46:["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"ConsumedMessage"}]
+47:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":">,"}]
+48:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" ) "}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"->"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Result"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"<(), "}],["$","span",null,{"style":{"--shiki-ligh [...]
+49:["$","span",null,{"className":"line"}]
+4a:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"},"children":" /// Invoked when the sink is closed, allowing it to perform any necessary cleanup."}]}]
+4b:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" async"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" fn"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" close"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"("}],["$","span",null,{"style":{"--shiki-light [...]
+4c:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"}"}]}]
+4d:["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" close"}]
+4e:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"("}]
+4f:["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"&mut"}]
+50:["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" self"}]
+51:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":") "}]
+52:["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"->"}]
+53:["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Result"}]
+54:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"<(), "}]
+55:["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"Error"}]
+56:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":">;"}]
+57:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"}"}]}]
+17:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
+58:I[27201,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"IconMark"]
+15:null
+19:[["$","title","0",{"children":"Connectors runtime | Apache Iggy"}],["$","link","1",{"rel":"icon","href":"/img/favicon.png"}],["$","$L58","2",{}]]
diff --git a/blogs/2025/06/06/connectors-runtime/__next._head.txt b/blogs/2025/06/06/connectors-runtime/__next._head.txt
new file mode 100644
index 00000000..c5894f45
--- /dev/null
+++ b/blogs/2025/06/06/connectors-runtime/__next._head.txt
@@ -0,0 +1,6 @@
+1:"$Sreact.fragment"
+2:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"ViewportBoundary"]
+3:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"MetadataBoundary"]
+4:"$Sreact.suspense"
+5:I[27201,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"IconMark"]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","h",{"children":[null,["$","$L2",null,{"children":[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]}],["$","div",null,{"hidden":true,"children":["$","$L3",null,{"children":["$","$4",null,{"name":"Next.Metadata","children":[["$","title","0",{"children":"Connectors runtime | Apache Iggy"}],["$","link","1",{"rel":"icon","href":"/img/favicon.png"}],["$","$L5","2",{}] [...]
diff --git a/blogs/2025/06/06/connectors-runtime/__next._index.txt b/blogs/2025/06/06/connectors-runtime/__next._index.txt
new file mode 100644
index 00000000..fd02bd95
--- /dev/null
+++ b/blogs/2025/06/06/connectors-runtime/__next._index.txt
@@ -0,0 +1,7 @@
+1:"$Sreact.fragment"
+2:I[17751,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js"],"RootProvider"]
+3:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+4:I[58298,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/5a37d4cb1abe17d7.js"],"default"]
+5:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+:HL["/_next/static/chunks/32a0415c8ab1bd26.css","style"]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/32a0415c8ab1bd26.css","precedence":"next"}],["$","script","script-0",{"src":"/_next/static/chunks/9ebd3a84bf60af84.js","async":true}],["$","script","script-1",{"src":"/_next/static/chunks/78b5f2e7b839e72f.js","async":true}]],["$","html",null,{"lang":"en","className":"geistsans_d5a4f12f-module__Ur3q_a__variable geistmono_157ca88a-module__iaM1Ya__variable" [...]
diff --git a/blogs/2025/06/06/connectors-runtime/__next._tree.txt b/blogs/2025/06/06/connectors-runtime/__next._tree.txt
new file mode 100644
index 00000000..82c8ee94
--- /dev/null
+++ b/blogs/2025/06/06/connectors-runtime/__next._tree.txt
@@ -0,0 +1,4 @@
+:HL["/_next/static/chunks/32a0415c8ab1bd26.css","style"]
+:HL["/_next/static/media/GeistMono_Variable.p.2f937313.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+:HL["/_next/static/media/Geist_Variable-s.p.92592eb2.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","tree":{"name":"","paramType":null,"paramKey":"","hasRuntimePrefetch":false,"slots":{"children":{"name":"(site)","paramType":null,"paramKey":"(site)","hasRuntimePrefetch":false,"slots":{"children":{"name":"blogs","paramType":null,"paramKey":"blogs","hasRuntimePrefetch":false,"slots":{"children":{"name":"slug","paramType":"c","paramKey":"2025/06/06/connectors-runtime","hasRuntimePrefetch":false,"slots":{"children":{"name":"__PAGE__","paramType":null,"p [...]
diff --git a/blogs/2025/06/06/connectors-runtime/index.html b/blogs/2025/06/06/connectors-runtime/index.html
new file mode 100644
index 00000000..6fbc034b
--- /dev/null
+++ b/blogs/2025/06/06/connectors-runtime/index.html
@@ -0,0 +1,73 @@
+<!DOCTYPE html><!--uBHgltRE2s5QA49x61S_u--><html lang="en" class="geistsans_d5a4f12f-module__Ur3q_a__variable geistmono_157ca88a-module__iaM1Ya__variable"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" href="/_next/static/media/GeistMono_Variable.p.2f937313.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="preload" href="/_next/static/media/Geist_Variable-s.p.92592eb2.woff2" as="font" crossorigin="" type=" [...]
+<p>In the world of message streaming, connectors quite often play a crucial role in facilitating data exchange between different systems. While Apache Iggy remains the core messaging infrastructure, <strong>focusing on extreme efficiency</strong> (high throughput, low latency, and minimal resource consumption), it could also benefit from a more extensible architecture. This is where connectors come into play.</p>
+<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="what-are-the-connectors"><a data-card="" href="#what-are-the-connectors" class="peer">What are the connectors</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="tr [...]
+<p>If you've ever used e.g. Apache Kafka or one of the Kafka-compatible solutions, such as Redpanda, you might've already encountered the concept of connectors. For example, there's a dedicated <a href="https://kafka.apache.org/documentation/#connectapi" rel="noreferrer noopener" target="_blank">Connect API</a> allowing you to create the custom connectors (plugins) for various data sources.</p>
+<p>Typically, connectors are designed to handle data ingestion and transformation tasks. They can be used to read data from external sources, transform it, and then write it to the message streaming system (<strong>sources</strong>), or the other way around (<strong>sinks</strong>) - fetch data from the message streaming system and write it to external services (e.g. databases, file systems, etc.).</p>
+<p>Let's say that we would like to get the real-time changes from a database (Postgres CDC for example) and send them to Apache Iggy, while performing some optional data transformation, such as filtering or enriching the data. Or, we might want to fetch data from Apache Iggy (e.g. produced by our custom services), transform it, and then push it further to the external indexer such as Elastic or Quickwit.</p>
+<p><strong>Instead of building all these pipelines from scratch as custom applications, we can leverage the power of connectors to simplify the process</strong>. Simply download one of the existing plugins, configure it using the provided configuration files, and start using it - no need to write any code!</p>
+<p>Here's an example of a configuration file for the sink connector named <code>stdout</code>:</p>
+<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-3 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-c [...]
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">[</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sinks</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">stdout</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">enabled = </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">true</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">name = </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"Stdout sink"</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">path = </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"connectors/libiggy_connector_stdout_sink"</span></span>
+<span class="line"></span>
+<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Collection of the streams from which messages are consumed</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">[[</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sinks</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">stdout</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">streams</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]]</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">stream = </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"example_stream"</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">topics = [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"example_topic"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">schema = </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"json"</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">batch_size = </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1000</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">poll_interval = </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"5ms"</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">consumer_group = </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"stdout_sink_connector"</span></span>
+<span class="line"></span>
+<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Custom configuration for the sink connector, deserialized to type T from `config` field</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">[</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sinks</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">stdout</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">config</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">print_payload = </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">true</span></span>
+<span class="line"></span>
+<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Optional data transformation(s) to be applied after consuming messages from the stream</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">[</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sinks</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">stdout</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">transforms</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.</span> [...]
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">enabled = </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">true</span></span>
+<span class="line"></span>
+<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Collection of the fields transforms to be applied after consuming messages from the stream</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">[[</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sinks</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">stdout</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">transforms</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.</span [...]
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">key = </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"message"</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">value.static = </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"hello"</span></span></code></pre></div></figure>
+<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="rust-based-plugins"><a data-card="" href="#rust-based-plugins" class="peer">Rust-based plugins</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M1 [...]
+<p>Since Apache Iggy is implemented in Rust, it was an easy choice to implement the connectors in Rust as well. <strong>This allows us to take advantage of the Rust's powerful type system and memory safety features</strong>, ensuring that the connectors are reliable and efficient. Internally, we use <strong><a href="https://github.com/OpenByteDev/dlopen2" rel="noreferrer noopener" target="_blank">dlopen2</a></strong> library to load the plugins during the runtime initialization - fe [...]
+<p>Thanks to this approach, just like Iggy itself, the connector runtime (which is a separate process), is very lightweight and easy to deploy. <strong>The runtime uses just a few MBs of memory on its own, while consuming minimal CPU resources.</strong> Behind the scenes, we use the shared <strong><a href="https://tokio.rs" rel="noreferrer noopener" target="_blank">Tokio runtime</a></strong> to manage the asynchronous tasks and events across all connectors, as well as the <strong><a href [...]
+<p>When running a simple benchmark based on the custom <strong><a href="https://github.com/apache/iggy/tree/master/core/connectors/sinks/quickwit_sink" rel="noreferrer noopener" target="_blank">Quickwit sink</a></strong> connector, which pulls the data in real time from Iggy stream, does a basic data transformation (using the JSON payload format), and then pushes the data further to the Quickwit HTTP API, we observed that this plugin <strong>can easily handle hundreds of thousands of mes [...]
+<p>Last, but not least, It's quite easy to create your own connectors - simply implement either <code>Sink</code> or <code>Source</code> trait, compile the library and configure it in the runtime. Please check the <strong><a href="https://github.com/apache/iggy/tree/master/core/connectors/" rel="noreferrer noopener" target="_blank">repository</a></strong> or the <strong><a href="/docs/connectors/introduction/">documentation</a></strong> for more details.</p>
+<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-3 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-c [...]
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">pub</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> trait</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Sink</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Send</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> +</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Sync</spa [...]
+<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"> /// Invoked when the sink is initialized, allowing it to perform any necessary setup.</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> async</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> fn</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> open</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&mut</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> self</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) [...]
+<span class="line"></span>
+<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"> /// Invoked every time a batch of messages is received from the configured stream(s) and topic(s).</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> async</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> fn</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> consume</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> &</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">self</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> topic_metadata</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> &</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">TopicMetadata</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> messages_metadata</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> MessagesMetadata</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> messages</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Vec</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"><</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">ConsumedMessage</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">>,</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> ) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-></span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Result</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"><(), </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">Error</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">>;</span></span>
+<span class="line"></span>
+<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"> /// Invoked when the sink is closed, allowing it to perform any necessary cleanup.</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> async</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> fn</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> close</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&mut</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> self</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> [...]
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre></div></figure>
+<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-3 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-c [...]
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">pub</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> trait</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Source</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Send</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> +</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Sync</s [...]
+<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"> /// Invoked when the source is initialized, allowing it to perform any necessary setup.</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> async</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> fn</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> open</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&mut</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> self</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) [...]
+<span class="line"></span>
+<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"> /// Invoked every time a batch of messages is produced to the configured stream and topic.</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> async</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> fn</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> poll</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">self</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) </s [...]
+<span class="line"></span>
+<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"> /// Invoked when the source is closed, allowing it to perform any necessary cleanup.</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> async</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> fn</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> close</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&mut</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> self</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> [...]
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre></div></figure>
+<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="whats-next"><a data-card="" href="#whats-next" class="peer">What's next?</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7. [...]
+<p>Since it's the very early release to showcase what's possible with the connector runtime, we plan to focus on improving the performance and stability of the runtime itself.</p>
+<p>Moreover, we plan to build more connectors, data transformations and schema encoders/decoders, to support the seamless transition between the different data formats and protocols.</p>
+<p>It's also worth mentioning that the runtime uses one of the existing network protocols available via Rust SDK to connect to the Iggy server (so-called distributed mode). And while it might be the case for most of the deployments out there, we might also support e.g. UDS or some sort of IPC to allow the connectors deployment on the same machine, next to the streaming server.</p>
+<p>Finally, we would love to hear your feedback and suggestions on how to improve the runtime and connectors. Please feel free to open an <strong><a href="https://github.com/apache/iggy/issues" rel="noreferrer noopener" target="_blank">issue</a></strong>, <strong><a href="https://github.com/apache/iggy/pulls" rel="noreferrer noopener" target="_blank">pull request</a></strong> or start a <strong><a href="https://github.com/apache/iggy/discussions" rel="noreferrer noopener" target="_blank" [...]
+<p>As always, you are more than welcome to join our <strong><a href="https://discord.gg/apache-iggy" rel="noreferrer noopener" target="_blank">Discord community</a></strong>!</p></div><footer class="mt-16 border-t border-fd-border pt-8"><a class="inline-flex items-center gap-2 text-sm font-medium text-fd-primary transition-colors hover:opacity-80" href="/blogs/">← Back to all posts</a></footer></article></main><!--$--><!--/$--></main><script src="/_next/static/chunks/922b7f01aa6775a6.js" [...]
\ No newline at end of file
diff --git a/blogs/2025/06/06/connectors-runtime/index.txt b/blogs/2025/06/06/connectors-runtime/index.txt
new file mode 100644
index 00000000..01cc6bee
--- /dev/null
+++ b/blogs/2025/06/06/connectors-runtime/index.txt
@@ -0,0 +1,90 @@
+1:"$Sreact.fragment"
+2:I[17751,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js"],"RootProvider"]
+3:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+4:I[58298,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/5a37d4cb1abe17d7.js"],"default"]
+5:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+6:I[83571,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Header"]
+7:I[29966,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFDropdown"]
+8:I[36330,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFMobileLinks"]
+9:I[22016,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],""]
+a:I[88760,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Logo"]
+11:I[68027,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+:HL["/_next/static/chunks/32a0415c8ab1bd26.css","style"]
+:HL["/_next/static/media/GeistMono_Variable.p.2f937313.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+:HL["/_next/static/media/Geist_Variable-s.p.92592eb2.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+0:{"P":null,"b":"uBHgltRE2s5QA49x61S_u","c":["","blogs","2025","06","06","connectors-runtime",""],"q":"","i":false,"f":[[["",{"children":["(site)",{"children":["blogs",{"children":[["slug","2025/06/06/connectors-runtime","c"],{"children":["__PAGE__",{}]}]}]}]},"$undefined","$undefined",true],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/32a0415c8ab1bd26.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script" [...]
+13:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"OutletBoundary"]
+14:"$Sreact.suspense"
+16:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"ViewportBoundary"]
+18:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"MetadataBoundary"]
+b:["$","h1",null,{"className":"next-error-h1","style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:1:props:style","children":404}]
+c:["$","div",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:style","children":["$","h2",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style","children":"This page could not be found."}]}]
+d:["$","$1","c",{"children":[null,["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}]
+e:["$","$1","c",{"children":[null,["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}]
+f:["$","$1","c",{"children":["$L12",[["$","script","script-0",{"src":"/_next/static/chunks/00b00679782d0ffd.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/3562882a488c4fbb.js","async":true,"nonce":"$undefined"}]],["$","$L13",null,{"children":["$","$14",null,{"name":"Next.MetadataOutlet","children":"$@15"}]}]]}]
+10:["$","$1","h",{"children":[null,["$","$L16",null,{"children":"$L17"}],["$","div",null,{"hidden":true,"children":["$","$L18",null,{"children":["$","$14",null,{"name":"Next.Metadata","children":"$L19"}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}]
+1a:I[47873,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"default"]
+12:["$","main",null,{"className":"min-h-screen px-6 py-16 md:px-12","children":["$","article",null,{"className":"mx-auto max-w-5xl","children":[["$","header",null,{"className":"mb-10","children":[["$","time",null,{"className":"text-sm font-medium text-fd-muted-foreground","children":"June 6, 2025"}],["$","h1",null,{"className":"mt-3 text-3xl font-extrabold tracking-tight text-fd-foreground md:text-5xl","children":"Connectors runtime"}],["$","p",null,{"className":"mt-4 text-base text-fd-m [...]
+2e:I[44324,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"CodeBlock"]
+2f:I[44324,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"Pre"]
+1b:["$","strong",null,{"children":"sinks"}]
+1c:["$","p",null,{"children":"Let's say that we would like to get the real-time changes from a database (Postgres CDC for example) and send them to Apache Iggy, while performing some optional data transformation, such as filtering or enriching the data. Or, we might want to fetch data from Apache Iggy (e.g. produced by our custom services), transform it, and then push it further to the external indexer such as Elastic or Quickwit."}]
+1d:["$","p",null,{"children":[["$","strong",null,{"children":"Instead of building all these pipelines from scratch as custom applications, we can leverage the power of connectors to simplify the process"}],". Simply download one of the existing plugins, configure it using the provided configuration files, and start using it - no need to write any code!"]}]
+1e:["$","p",null,{"children":["Here's an example of a configuration file for the sink connector named ",["$","code",null,{"children":"stdout"}],":"]}]
+1f:["$","$L2e",null,{"className":"shiki shiki-themes github-light github-dark","style":{"--shiki-light":"#24292e","--shiki-dark":"#e1e4e8","--shiki-light-bg":"#fff","--shiki-dark-bg":"#24292e"},"tabIndex":"0","icon":"<svg viewBox=\"0 0 24 24\"><path d=\"M 6,1 C 4.354992,1 3,2.354992 3,4 v 16 c 0,1.645008 1.354992,3 3,3 h 12 c 1.645008,0 3,-1.354992 3,-3 V 8 7 A 1.0001,1.0001 0 0 0 20.707031,6.2929687 l -5,-5 A 1.0001,1.0001 0 0 0 15,1 h -1 z m 0,2 h 7 v 3 c 0,1.645008 1.354992,3 3,3 h 3 [...]
+20:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"rust-based-plugins","children":[["$","a",null,{"data-card":"","href":"#rust-based-plugins","className":"peer","children":"Rust-based plugins"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 sh [...]
+21:["$","p",null,{"children":["Since Apache Iggy is implemented in Rust, it was an easy choice to implement the connectors in Rust as well. ",["$","strong",null,{"children":"This allows us to take advantage of the Rust's powerful type system and memory safety features"}],", ensuring that the connectors are reliable and efficient. Internally, we use ",["$","strong",null,{"children":["$","$L1a",null,{"href":"https://github.com/OpenByteDev/dlopen2","children":"dlopen2"}]}]," library to load [...]
+22:["$","p",null,{"children":["Thanks to this approach, just like Iggy itself, the connector runtime (which is a separate process), is very lightweight and easy to deploy. ",["$","strong",null,{"children":"The runtime uses just a few MBs of memory on its own, while consuming minimal CPU resources."}]," Behind the scenes, we use the shared ",["$","strong",null,{"children":["$","$L1a",null,{"href":"https://tokio.rs","children":"Tokio runtime"}]}]," to manage the asynchronous tasks and even [...]
+23:["$","p",null,{"children":["When running a simple benchmark based on the custom ",["$","strong",null,{"children":["$","$L1a",null,{"href":"https://github.com/apache/iggy/tree/master/core/connectors/sinks/quickwit_sink","children":"Quickwit sink"}]}]," connector, which pulls the data in real time from Iggy stream, does a basic data transformation (using the JSON payload format), and then pushes the data further to the Quickwit HTTP API, we observed that this plugin ",["$","strong",null [...]
+24:["$","p",null,{"children":["Last, but not least, It's quite easy to create your own connectors - simply implement either ",["$","code",null,{"children":"Sink"}]," or ",["$","code",null,{"children":"Source"}]," trait, compile the library and configure it in the runtime. Please check the ",["$","strong",null,{"children":["$","$L1a",null,{"href":"https://github.com/apache/iggy/tree/master/core/connectors/","children":"repository"}]}]," or the ",["$","strong",null,{"children":["$","$L1a", [...]
+3f:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+41:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+27:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"whats-next","children":[["$","a",null,{"data-card":"","href":"#whats-next","className":"peer","children":"What's next?"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-f [...]
+28:["$","p",null,{"children":"Since it's the very early release to showcase what's possible with the connector runtime, we plan to focus on improving the performance and stability of the runtime itself."}]
+29:["$","p",null,{"children":"Moreover, we plan to build more connectors, data transformations and schema encoders/decoders, to support the seamless transition between the different data formats and protocols."}]
+2a:["$","p",null,{"children":"It's also worth mentioning that the runtime uses one of the existing network protocols available via Rust SDK to connect to the Iggy server (so-called distributed mode). And while it might be the case for most of the deployments out there, we might also support e.g. UDS or some sort of IPC to allow the connectors deployment on the same machine, next to the streaming server."}]
+2b:["$","p",null,{"children":["Finally, we would love to hear your feedback and suggestions on how to improve the runtime and connectors. Please feel free to open an ",["$","strong",null,{"children":["$","$L1a",null,{"href":"https://github.com/apache/iggy/issues","children":"issue"}]}],", ",["$","strong",null,{"children":["$","$L1a",null,{"href":"https://github.com/apache/iggy/pulls","children":"pull request"}]}]," or start a ",["$","strong",null,{"children":["$","$L1a",null,{"href":"htt [...]
+2c:["$","p",null,{"children":["As always, you are more than welcome to join our ",["$","strong",null,{"children":["$","$L1a",null,{"href":"https://discord.gg/apache-iggy","children":"Discord community"}]}],"!"]}]
+2d:["$","footer",null,{"className":"mt-16 border-t border-fd-border pt-8","children":["$","$L9",null,{"href":"/blogs","className":"inline-flex items-center gap-2 text-sm font-medium text-fd-primary transition-colors hover:opacity-80","children":"← Back to all posts"}]}]
+30:["$","span",null,{"style":{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},"children":"\"5ms\""}]
+31:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"consumer_group = "}],["$","span",null,{"style":{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},"children":"\"stdout_sink_connector\""}]]}]
+32:["$","span",null,{"className":"line"}]
+33:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"},"children":"# Custom configuration for the sink connector, deserialized to type T from `config` field"}]}]
+34:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"["}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"sinks"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"."}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"stdout"}],["$","span",null,{"style":{"--shiki-light":"#24 [...]
+35:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"print_payload = "}],["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":"true"}]]}]
+36:["$","span",null,{"className":"line"}]
+37:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"},"children":"# Optional data transformation(s) to be applied after consuming messages from the stream"}]}]
+38:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"["}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"sinks"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"."}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"stdout"}],["$","span",null,{"style":{"--shiki-light":"#24 [...]
+39:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"enabled = "}],["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":"true"}]]}]
+3a:["$","span",null,{"className":"line"}]
+3b:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"},"children":"# Collection of the fields transforms to be applied after consuming messages from the stream"}]}]
+3c:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"[["}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"sinks"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"."}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"stdout"}],["$","span",null,{"style":{"--shiki-light":"#2 [...]
+3d:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"key = "}],["$","span",null,{"style":{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},"children":"\"message\""}]]}]
+3e:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"value.static = "}],["$","span",null,{"style":{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},"children":"\"hello\""}]]}]
+40:["$","$L2f",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"#[async_trait]"}]}],"\n",["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" trait"}],["$","span",null,{ [...]
+42:["$","$L2f",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"#[async_trait]"}]}],"\n",["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" trait"}],["$","span",null,{ [...]
+43:["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}]
+44:["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Vec"}]
+45:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"<"}]
+46:["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"ConsumedMessage"}]
+47:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":">,"}]
+48:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" ) "}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"->"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Result"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"<(), "}],["$","span",null,{"style":{"--shiki-ligh [...]
+49:["$","span",null,{"className":"line"}]
+4a:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"},"children":" /// Invoked when the sink is closed, allowing it to perform any necessary cleanup."}]}]
+4b:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" async"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" fn"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" close"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"("}],["$","span",null,{"style":{"--shiki-light [...]
+4c:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"}"}]}]
+4d:["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" close"}]
+4e:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"("}]
+4f:["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"&mut"}]
+50:["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" self"}]
+51:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":") "}]
+52:["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"->"}]
+53:["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Result"}]
+54:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"<(), "}]
+55:["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"Error"}]
+56:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":">;"}]
+57:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"}"}]}]
+17:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
+58:I[27201,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"IconMark"]
+15:null
+19:[["$","title","0",{"children":"Connectors runtime | Apache Iggy"}],["$","link","1",{"rel":"icon","href":"/img/favicon.png"}],["$","$L58","2",{}]]
diff --git a/blogs/2025/08/10/release-0.5.0/__next.!KHNpdGUp.blogs.$c$slug.__PAGE__.txt b/blogs/2025/08/10/release-0.5.0/__next.!KHNpdGUp.blogs.$c$slug.__PAGE__.txt
new file mode 100644
index 00000000..774281e1
--- /dev/null
+++ b/blogs/2025/08/10/release-0.5.0/__next.!KHNpdGUp.blogs.$c$slug.__PAGE__.txt
@@ -0,0 +1,47 @@
+1:"$Sreact.fragment"
+2:I[47873,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"default"]
+2b:I[22016,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],""]
+2c:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"OutletBoundary"]
+2d:"$Sreact.suspense"
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","c",{"children":[["$","main",null,{"className":"min-h-screen px-6 py-16 md:px-12","children":["$","article",null,{"className":"mx-auto max-w-5xl","children":[["$","header",null,{"className":"mb-10","children":[["$","time",null,{"className":"text-sm font-medium text-fd-muted-foreground","children":"August 10, 2025"}],["$","h1",null,{"className":"mt-3 text-3xl font-extrabold tracking-tight text-fd-foreground md:text-5xl","children":"Apac [...]
+3:["$","p",null,{"children":["The new schema is already supported in the ",["$","strong",null,{"children":["$","$L2",null,{"href":"https://github.com/apache/iggy/tree/master/core/cli","children":"Iggy CLI"}]}]," and ",["$","strong",null,{"children":["$","$L2",null,{"href":"https://github.com/apache/iggy/tree/master/web","children":"Iggy Web UI"}]}],". A simple update is all you need."]}]
+4:["$","p",null,{"children":["Docker images for the server and related components are available on ",["$","strong",null,{"children":["$","$L2",null,{"href":"https://hub.docker.com/u/apache?page=1&search=iggy","children":"Docker Hub"}]}],"."]}]
+5:["$","hr",null,{}]
+6:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"sdks","children":[["$","a",null,{"data-card":"","href":"#sdks","className":"peer","children":"SDKs"}],["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity p [...]
+7:["$","p",null,{"children":"Alongside migrating repositories to the monorepo, we updated all SDKs to support the zero-copy schema and fill in missing features.\nOur supported client libraries now include:"}]
+8:["$","ul",null,{"children":["\n",["$","li",null,{"children":[["$","$L2",null,{"href":"https://crates.io/crates/iggy","children":"Rust"}]," (always up-to-date, core reference implementation)"]}],"\n",["$","li",null,{"children":["$","$L2",null,{"href":"https://www.nuget.org/packages/Apache.Iggy/","children":"C#"}]}],"\n",["$","li",null,{"children":["$","$L2",null,{"href":"https://repository.apache.org/#nexus-search;quick~iggy","children":"Java"}]}],"\n",["$","li",null,{"children":["$","$ [...]
+9:["$","p",null,{"children":["C++ and Elixir clients are in progress under the ",["$","$L2",null,{"href":"https://github.com/apache/iggy/tree/master/foreign","children":"foreign"}]," directory."]}]
+a:["$","p",null,{"children":[["$","strong",null,{"children":"New in Rust SDK:"}],"\nSupport for a ",["$","strong",null,{"children":["$","$L2",null,{"href":"https://github.com/apache/iggy/pull/1838","children":"background producer"}]}],", which buffers messages in the background according to configured linger time and other settings. Examples are available ",["$","$L2",null,{"href":"https://github.com/apache/iggy/tree/master/examples/rust","children":"here"}],"."]}]
+b:["$","hr",null,{}]
+c:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"benchmarks","children":[["$","a",null,{"data-card":"","href":"#benchmarks","className":"peer","children":"Benchmarks"}],["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 tr [...]
+d:["$","p",null,{"children":"We’ve expanded our benchmarking toolkit:"}]
+e:["$","ul",null,{"children":["\n",["$","li",null,{"children":[["$","strong",null,{"children":"Iggy Bench CLI"}]," (",["$","code",null,{"children":"iggy-bench"}],") — run local benchmarks with various configurations and profiles."]}],"\n",["$","li",null,{"children":"JSON output and chart rendering for visual performance analysis."}],"\n",["$","li",null,{"children":["Open benchmark results published at ",["$","$L2",null,{"href":"https://benchmarks.iggy.apache.org","children":"benchmarks.i [...]
+f:["$","p",null,{"children":["As always, you can install the regular CLI with: ",["$","code",null,{"children":"cargo install iggy-cli"}],"."]}]
+10:["$","hr",null,{}]
+11:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"connectors","children":[["$","a",null,{"data-card":"","href":"#connectors","className":"peer","children":"Connectors"}],["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 t [...]
+12:["$","p",null,{"children":["We’ve built a new ",["$","strong",null,{"children":"connectors runtime"}]," for easily creating Rust-based plugins that integrate Iggy with external data sources—similar to Kafka Connect or Redpanda Connect."]}]
+13:["$","p",null,{"children":"You can:"}]
+14:["$","ul",null,{"children":["\n",["$","li",null,{"children":"Ingest data into Iggy from external systems (e.g., Postgres CDC)."}],"\n",["$","li",null,{"children":"Export data from Iggy to external destinations (e.g., indexing engines)."}],"\n",["$","li",null,{"children":"Apply optional transformations and schema mappings along the way."}],"\n"]}]
+15:["$","p",null,{"children":["Learn more in this ",["$","$L2",null,{"href":"https://iggy.apache.org/blogs/2025/06/06/connectors-runtime","children":"post"}]," and in the ",["$","$L2",null,{"href":"/docs/connectors/introduction","children":"documentation"}],"."]}]
+16:["$","hr",null,{}]
+17:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"mcp-server","children":[["$","a",null,{"data-card":"","href":"#mcp-server","className":"peer","children":"MCP Server"}],["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 t [...]
+18:["$","p",null,{"children":["Apache Iggy now includes support for the ",["$","strong",null,{"children":[["$","$L2",null,{"href":"https://modelcontextprotocol.io","children":"Model Context Protocol"}]," (MCP)"]}],"—an open standard for providing context to LLMs."]}]
+19:["$","p",null,{"children":["You can start the MCP server with ",["$","code",null,{"children":"cargo run --bin iggy-mcp"}]," or use the provided Docker image."]}]
+1a:["$","p",null,{"children":["Configuration, credentials, and permissions are detailed in the ",["$","$L2",null,{"href":"/docs/ai/mcp","children":"documentation"}],"."]}]
+1b:["$","hr",null,{}]
+1c:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"versioning","children":[["$","a",null,{"data-card":"","href":"#versioning","className":"peer","children":"Versioning"}],["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 t [...]
+1d:["$","p",null,{"children":["Releases follow ",["$","$L2",null,{"href":"https://semver.org/","children":"semver"}]," (e.g., ",["$","code",null,{"children":"0.5.0"}],") or the ",["$","code",null,{"children":"latest"}]," Docker tag (",["$","code",null,{"children":"apache/iggy:latest"}],")."]}]
+1e:["$","p",null,{"children":["We also publish edge/dev/nightly builds (e.g., ",["$","code",null,{"children":"0.5.0-edge.1"}]," or ",["$","code",null,{"children":"apache/iggy:edge"}],"), which contain the newest changes but are ",["$","strong",null,{"children":"not recommended for production"}],"."]}]
+1f:["$","hr",null,{}]
+20:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"whats-next","children":[["$","a",null,{"data-card":"","href":"#whats-next","className":"peer","children":"What’s Next"}],["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 [...]
+21:["$","p",null,{"children":["Work is underway on a ",["$","strong",null,{"children":"complete rewrite of the server’s core architecture"}]," using the ",["$","strong",null,{"children":"io_uring runtime"}]," with a ",["$","strong",null,{"children":"thread-per-core, shared-nothing design"}],". This will further improve performance, reduce tail latencies, and lower resource usage."]}]
+22:["$","p",null,{"children":"Other upcoming efforts:"}]
+23:["$","ul",null,{"children":["\n",["$","li",null,{"children":"Expanding SDKs across more languages and catching up with the latest features."}],"\n",["$","li",null,{"children":["Synchronous SDK clients and ",["$","$L2",null,{"href":"https://www.firezone.dev/blog/sans-io","children":"sans-io"}]," design."]}],"\n",["$","li",null,{"children":"Benchmarking orchestrator"}],"\n",["$","li",null,{"children":"Enhancing the Connectors Runtime and Web UI."}],"\n",["$","li",null,{"children":"Exten [...]
+24:["$","hr",null,{}]
+25:["$","p",null,{"children":"Thanks to our amazing community and contributors for making Apache Iggy better with every release."}]
+26:["$","p",null,{"children":["$","strong",null,{"children":["Join us on ",["$","$L2",null,{"href":"https://discord.gg/apache-iggy","children":"Discord"}]," and help shape the future of the project!"]}]}]
+27:["$","footer",null,{"className":"mt-16 border-t border-fd-border pt-8","children":["$","$L2b",null,{"href":"/blogs","className":"inline-flex items-center gap-2 text-sm font-medium text-fd-primary transition-colors hover:opacity-80","children":"← Back to all posts"}]}]
+28:["$","script","script-0",{"src":"/_next/static/chunks/00b00679782d0ffd.js","async":true}]
+29:["$","script","script-1",{"src":"/_next/static/chunks/3562882a488c4fbb.js","async":true}]
+2a:["$","$L2c",null,{"children":["$","$2d",null,{"name":"Next.MetadataOutlet","children":"$@2e"}]}]
+2e:null
diff --git a/blogs/2025/08/10/release-0.5.0/__next.!KHNpdGUp.blogs.$c$slug.txt b/blogs/2025/08/10/release-0.5.0/__next.!KHNpdGUp.blogs.$c$slug.txt
new file mode 100644
index 00000000..11b31bb0
--- /dev/null
+++ b/blogs/2025/08/10/release-0.5.0/__next.!KHNpdGUp.blogs.$c$slug.txt
@@ -0,0 +1,4 @@
+1:"$Sreact.fragment"
+2:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+3:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","template":["$","$L3",null,{}]}]]}],"loading":null,"isPartial":false}
diff --git a/blogs/2025/08/10/release-0.5.0/__next.!KHNpdGUp.blogs.txt b/blogs/2025/08/10/release-0.5.0/__next.!KHNpdGUp.blogs.txt
new file mode 100644
index 00000000..11b31bb0
--- /dev/null
+++ b/blogs/2025/08/10/release-0.5.0/__next.!KHNpdGUp.blogs.txt
@@ -0,0 +1,4 @@
+1:"$Sreact.fragment"
+2:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+3:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","template":["$","$L3",null,{}]}]]}],"loading":null,"isPartial":false}
diff --git a/blogs/2025/08/10/release-0.5.0/__next.!KHNpdGUp.txt b/blogs/2025/08/10/release-0.5.0/__next.!KHNpdGUp.txt
new file mode 100644
index 00000000..ea3bfa55
--- /dev/null
+++ b/blogs/2025/08/10/release-0.5.0/__next.!KHNpdGUp.txt
@@ -0,0 +1,9 @@
+1:"$Sreact.fragment"
+2:I[83571,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Header"]
+3:I[29966,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFDropdown"]
+4:I[36330,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFMobileLinks"]
+5:I[22016,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],""]
+6:I[88760,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Logo"]
+7:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+8:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","c",{"children":[[["$","script","script-0",{"src":"/_next/static/chunks/8d86be78428a601a.js","async":true}],["$","script","script-1",{"src":"/_next/static/chunks/da34cc6305706ac6.js","async":true}],["$","script","script-2",{"src":"/_next/static/chunks/9baf65674e2de991.js","async":true}],["$","script","script-3",{"src":"/_next/static/chunks/26b70f9828dd1eb5.js","async":true}],["$","script","script-4",{"src":"/_next/static/chunks/adeed83 [...]
diff --git a/blogs/2025/08/10/release-0.5.0/__next._full.txt b/blogs/2025/08/10/release-0.5.0/__next._full.txt
new file mode 100644
index 00000000..ec171d2f
--- /dev/null
+++ b/blogs/2025/08/10/release-0.5.0/__next._full.txt
@@ -0,0 +1,68 @@
+1:"$Sreact.fragment"
+2:I[17751,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js"],"RootProvider"]
+3:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+4:I[58298,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/5a37d4cb1abe17d7.js"],"default"]
+5:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+6:I[83571,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Header"]
+7:I[29966,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFDropdown"]
+8:I[36330,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFMobileLinks"]
+9:I[22016,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],""]
+a:I[88760,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Logo"]
+11:I[68027,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+:HL["/_next/static/chunks/32a0415c8ab1bd26.css","style"]
+:HL["/_next/static/media/GeistMono_Variable.p.2f937313.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+:HL["/_next/static/media/Geist_Variable-s.p.92592eb2.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+0:{"P":null,"b":"uBHgltRE2s5QA49x61S_u","c":["","blogs","2025","08","10","release-0.5.0",""],"q":"","i":false,"f":[[["",{"children":["(site)",{"children":["blogs",{"children":[["slug","2025/08/10/release-0.5.0","c"],{"children":["__PAGE__",{}]}]}]}]},"$undefined","$undefined",true],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/32a0415c8ab1bd26.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0 [...]
+13:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"OutletBoundary"]
+14:"$Sreact.suspense"
+16:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"ViewportBoundary"]
+18:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"MetadataBoundary"]
+b:["$","h1",null,{"className":"next-error-h1","style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:1:props:style","children":404}]
+c:["$","div",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:style","children":["$","h2",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style","children":"This page could not be found."}]}]
+d:["$","$1","c",{"children":[null,["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}]
+e:["$","$1","c",{"children":[null,["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}]
+f:["$","$1","c",{"children":["$L12",[["$","script","script-0",{"src":"/_next/static/chunks/00b00679782d0ffd.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/3562882a488c4fbb.js","async":true,"nonce":"$undefined"}]],["$","$L13",null,{"children":["$","$14",null,{"name":"Next.MetadataOutlet","children":"$@15"}]}]]}]
+10:["$","$1","h",{"children":[null,["$","$L16",null,{"children":"$L17"}],["$","div",null,{"hidden":true,"children":["$","$L18",null,{"children":["$","$14",null,{"name":"Next.Metadata","children":"$L19"}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}]
+1a:I[47873,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"default"]
+12:["$","main",null,{"className":"min-h-screen px-6 py-16 md:px-12","children":["$","article",null,{"className":"mx-auto max-w-5xl","children":[["$","header",null,{"className":"mb-10","children":[["$","time",null,{"className":"text-sm font-medium text-fd-muted-foreground","children":"August 10, 2025"}],["$","h1",null,{"className":"mt-3 text-3xl font-extrabold tracking-tight text-fd-foreground md:text-5xl","children":"Apache Iggy 0.5.0 Release"}],["$","p",null,{"className":"mt-4 text-base [...]
+1b:["$","p",null,{"children":["The new schema is already supported in the ",["$","strong",null,{"children":["$","$L1a",null,{"href":"https://github.com/apache/iggy/tree/master/core/cli","children":"Iggy CLI"}]}]," and ",["$","strong",null,{"children":["$","$L1a",null,{"href":"https://github.com/apache/iggy/tree/master/web","children":"Iggy Web UI"}]}],". A simple update is all you need."]}]
+1c:["$","p",null,{"children":["Docker images for the server and related components are available on ",["$","strong",null,{"children":["$","$L1a",null,{"href":"https://hub.docker.com/u/apache?page=1&search=iggy","children":"Docker Hub"}]}],"."]}]
+1d:["$","hr",null,{}]
+1e:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"sdks","children":[["$","a",null,{"data-card":"","href":"#sdks","className":"peer","children":"SDKs"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 [...]
+1f:["$","p",null,{"children":"Alongside migrating repositories to the monorepo, we updated all SDKs to support the zero-copy schema and fill in missing features.\nOur supported client libraries now include:"}]
+20:["$","ul",null,{"children":["\n",["$","li",null,{"children":[["$","$L1a",null,{"href":"https://crates.io/crates/iggy","children":"Rust"}]," (always up-to-date, core reference implementation)"]}],"\n",["$","li",null,{"children":["$","$L1a",null,{"href":"https://www.nuget.org/packages/Apache.Iggy/","children":"C#"}]}],"\n",["$","li",null,{"children":["$","$L1a",null,{"href":"https://repository.apache.org/#nexus-search;quick~iggy","children":"Java"}]}],"\n",["$","li",null,{"children":["$ [...]
+21:["$","p",null,{"children":["C++ and Elixir clients are in progress under the ",["$","$L1a",null,{"href":"https://github.com/apache/iggy/tree/master/foreign","children":"foreign"}]," directory."]}]
+22:["$","p",null,{"children":[["$","strong",null,{"children":"New in Rust SDK:"}],"\nSupport for a ",["$","strong",null,{"children":["$","$L1a",null,{"href":"https://github.com/apache/iggy/pull/1838","children":"background producer"}]}],", which buffers messages in the background according to configured linger time and other settings. Examples are available ",["$","$L1a",null,{"href":"https://github.com/apache/iggy/tree/master/examples/rust","children":"here"}],"."]}]
+23:["$","hr",null,{}]
+24:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"benchmarks","children":[["$","a",null,{"data-card":"","href":"#benchmarks","className":"peer","children":"Benchmarks"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-for [...]
+25:["$","p",null,{"children":"We’ve expanded our benchmarking toolkit:"}]
+26:["$","ul",null,{"children":["\n",["$","li",null,{"children":[["$","strong",null,{"children":"Iggy Bench CLI"}]," (",["$","code",null,{"children":"iggy-bench"}],") — run local benchmarks with various configurations and profiles."]}],"\n",["$","li",null,{"children":"JSON output and chart rendering for visual performance analysis."}],"\n",["$","li",null,{"children":["Open benchmark results published at ",["$","$L1a",null,{"href":"https://benchmarks.iggy.apache.org","children":"benchmarks [...]
+27:["$","p",null,{"children":["As always, you can install the regular CLI with: ",["$","code",null,{"children":"cargo install iggy-cli"}],"."]}]
+28:["$","hr",null,{}]
+29:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"connectors","children":[["$","a",null,{"data-card":"","href":"#connectors","className":"peer","children":"Connectors"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-for [...]
+2a:["$","p",null,{"children":["We’ve built a new ",["$","strong",null,{"children":"connectors runtime"}]," for easily creating Rust-based plugins that integrate Iggy with external data sources—similar to Kafka Connect or Redpanda Connect."]}]
+2b:["$","p",null,{"children":"You can:"}]
+2c:["$","ul",null,{"children":["\n",["$","li",null,{"children":"Ingest data into Iggy from external systems (e.g., Postgres CDC)."}],"\n",["$","li",null,{"children":"Export data from Iggy to external destinations (e.g., indexing engines)."}],"\n",["$","li",null,{"children":"Apply optional transformations and schema mappings along the way."}],"\n"]}]
+2d:["$","p",null,{"children":["Learn more in this ",["$","$L1a",null,{"href":"https://iggy.apache.org/blogs/2025/06/06/connectors-runtime","children":"post"}]," and in the ",["$","$L1a",null,{"href":"/docs/connectors/introduction","children":"documentation"}],"."]}]
+2e:["$","hr",null,{}]
+2f:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"mcp-server","children":[["$","a",null,{"data-card":"","href":"#mcp-server","className":"peer","children":"MCP Server"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-for [...]
+30:["$","p",null,{"children":["Apache Iggy now includes support for the ",["$","strong",null,{"children":[["$","$L1a",null,{"href":"https://modelcontextprotocol.io","children":"Model Context Protocol"}]," (MCP)"]}],"—an open standard for providing context to LLMs."]}]
+31:["$","p",null,{"children":["You can start the MCP server with ",["$","code",null,{"children":"cargo run --bin iggy-mcp"}]," or use the provided Docker image."]}]
+32:["$","p",null,{"children":["Configuration, credentials, and permissions are detailed in the ",["$","$L1a",null,{"href":"/docs/ai/mcp","children":"documentation"}],"."]}]
+33:["$","hr",null,{}]
+34:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"versioning","children":[["$","a",null,{"data-card":"","href":"#versioning","className":"peer","children":"Versioning"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-for [...]
+35:["$","p",null,{"children":["Releases follow ",["$","$L1a",null,{"href":"https://semver.org/","children":"semver"}]," (e.g., ",["$","code",null,{"children":"0.5.0"}],") or the ",["$","code",null,{"children":"latest"}]," Docker tag (",["$","code",null,{"children":"apache/iggy:latest"}],")."]}]
+36:["$","p",null,{"children":["We also publish edge/dev/nightly builds (e.g., ",["$","code",null,{"children":"0.5.0-edge.1"}]," or ",["$","code",null,{"children":"apache/iggy:edge"}],"), which contain the newest changes but are ",["$","strong",null,{"children":"not recommended for production"}],"."]}]
+37:["$","hr",null,{}]
+38:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"whats-next","children":[["$","a",null,{"data-card":"","href":"#whats-next","className":"peer","children":"What’s Next"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-fo [...]
+39:["$","p",null,{"children":["Work is underway on a ",["$","strong",null,{"children":"complete rewrite of the server’s core architecture"}]," using the ",["$","strong",null,{"children":"io_uring runtime"}]," with a ",["$","strong",null,{"children":"thread-per-core, shared-nothing design"}],". This will further improve performance, reduce tail latencies, and lower resource usage."]}]
+3a:["$","p",null,{"children":"Other upcoming efforts:"}]
+3b:["$","ul",null,{"children":["\n",["$","li",null,{"children":"Expanding SDKs across more languages and catching up with the latest features."}],"\n",["$","li",null,{"children":["Synchronous SDK clients and ",["$","$L1a",null,{"href":"https://www.firezone.dev/blog/sans-io","children":"sans-io"}]," design."]}],"\n",["$","li",null,{"children":"Benchmarking orchestrator"}],"\n",["$","li",null,{"children":"Enhancing the Connectors Runtime and Web UI."}],"\n",["$","li",null,{"children":"Exte [...]
+3c:["$","hr",null,{}]
+3d:["$","p",null,{"children":"Thanks to our amazing community and contributors for making Apache Iggy better with every release."}]
+3e:["$","p",null,{"children":["$","strong",null,{"children":["Join us on ",["$","$L1a",null,{"href":"https://discord.gg/apache-iggy","children":"Discord"}]," and help shape the future of the project!"]}]}]
+3f:["$","footer",null,{"className":"mt-16 border-t border-fd-border pt-8","children":["$","$L9",null,{"href":"/blogs","className":"inline-flex items-center gap-2 text-sm font-medium text-fd-primary transition-colors hover:opacity-80","children":"← Back to all posts"}]}]
+17:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
+40:I[27201,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"IconMark"]
+15:null
+19:[["$","title","0",{"children":"Apache Iggy 0.5.0 Release | Apache Iggy"}],["$","link","1",{"rel":"icon","href":"/img/favicon.png"}],["$","$L40","2",{}]]
diff --git a/blogs/2025/08/10/release-0.5.0/__next._head.txt b/blogs/2025/08/10/release-0.5.0/__next._head.txt
new file mode 100644
index 00000000..183c2cf8
--- /dev/null
+++ b/blogs/2025/08/10/release-0.5.0/__next._head.txt
@@ -0,0 +1,6 @@
+1:"$Sreact.fragment"
+2:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"ViewportBoundary"]
+3:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"MetadataBoundary"]
+4:"$Sreact.suspense"
+5:I[27201,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"IconMark"]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","h",{"children":[null,["$","$L2",null,{"children":[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]}],["$","div",null,{"hidden":true,"children":["$","$L3",null,{"children":["$","$4",null,{"name":"Next.Metadata","children":[["$","title","0",{"children":"Apache Iggy 0.5.0 Release | Apache Iggy"}],["$","link","1",{"rel":"icon","href":"/img/favicon.png"}],["$","$L5", [...]
diff --git a/blogs/2025/08/10/release-0.5.0/__next._index.txt b/blogs/2025/08/10/release-0.5.0/__next._index.txt
new file mode 100644
index 00000000..fd02bd95
--- /dev/null
+++ b/blogs/2025/08/10/release-0.5.0/__next._index.txt
@@ -0,0 +1,7 @@
+1:"$Sreact.fragment"
+2:I[17751,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js"],"RootProvider"]
+3:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+4:I[58298,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/5a37d4cb1abe17d7.js"],"default"]
+5:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+:HL["/_next/static/chunks/32a0415c8ab1bd26.css","style"]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/32a0415c8ab1bd26.css","precedence":"next"}],["$","script","script-0",{"src":"/_next/static/chunks/9ebd3a84bf60af84.js","async":true}],["$","script","script-1",{"src":"/_next/static/chunks/78b5f2e7b839e72f.js","async":true}]],["$","html",null,{"lang":"en","className":"geistsans_d5a4f12f-module__Ur3q_a__variable geistmono_157ca88a-module__iaM1Ya__variable" [...]
diff --git a/blogs/2025/08/10/release-0.5.0/__next._tree.txt b/blogs/2025/08/10/release-0.5.0/__next._tree.txt
new file mode 100644
index 00000000..dd6a9645
--- /dev/null
+++ b/blogs/2025/08/10/release-0.5.0/__next._tree.txt
@@ -0,0 +1,4 @@
+:HL["/_next/static/chunks/32a0415c8ab1bd26.css","style"]
+:HL["/_next/static/media/GeistMono_Variable.p.2f937313.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+:HL["/_next/static/media/Geist_Variable-s.p.92592eb2.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","tree":{"name":"","paramType":null,"paramKey":"","hasRuntimePrefetch":false,"slots":{"children":{"name":"(site)","paramType":null,"paramKey":"(site)","hasRuntimePrefetch":false,"slots":{"children":{"name":"blogs","paramType":null,"paramKey":"blogs","hasRuntimePrefetch":false,"slots":{"children":{"name":"slug","paramType":"c","paramKey":"2025/08/10/release-0.5.0","hasRuntimePrefetch":false,"slots":{"children":{"name":"__PAGE__","paramType":null,"paramK [...]
diff --git a/blogs/2025/08/10/release-0.5.0/index.html b/blogs/2025/08/10/release-0.5.0/index.html
new file mode 100644
index 00000000..64bd1fc0
--- /dev/null
+++ b/blogs/2025/08/10/release-0.5.0/index.html
@@ -0,0 +1,68 @@
+<!DOCTYPE html><!--uBHgltRE2s5QA49x61S_u--><html lang="en" class="geistsans_d5a4f12f-module__Ur3q_a__variable geistmono_157ca88a-module__iaM1Ya__variable"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" href="/_next/static/media/GeistMono_Variable.p.2f937313.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="preload" href="/_next/static/media/Geist_Variable-s.p.92592eb2.woff2" as="font" crossorigin="" type=" [...]
+<p>It’s been four months since our last <a href="https://github.com/apache/iggy/releases/tag/server-0.4.300" rel="noreferrer noopener" target="_blank">release 0.4.300</a>.
+Over 150 commits, a dozen new contributors, and countless hours later, we’re proud to announce <strong><a href="https://github.com/apache/iggy/releases/tag/server-0.5.0" rel="noreferrer noopener" target="_blank">Apache Iggy 0.5.0</a></strong>!</p>
+<p>This release brings major improvements across the board — core server enhancements, updated SDKs, new tooling, data management interfaces, and more.</p>
+<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="iggy-server"><a data-card="" href="#iggy-server" class="peer">Iggy Server</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.5 [...]
+<p>The most significant change on the server side is the introduction of <strong><a href="https://github.com/apache/iggy/pull/1679" rel="noreferrer noopener" target="_blank">zero-copy (de)serialization</a></strong>.
+This boosts performance (increased throughput and lower tail latency) while reducing memory usage by avoiding unnecessary allocations and copies.</p>
+<p>You can read the full <strong><a href="https://iggy.apache.org/blogs/2025/05/08/zero-copy-deserialization" rel="noreferrer noopener" target="_blank">deep dive</a></strong>, but in short — this is a <strong>breaking change</strong>. It required SDK refactoring, and is supported only in the most recent client library releases.</p>
+<p>The new schema is already supported in the <strong><a href="https://github.com/apache/iggy/tree/master/core/cli" rel="noreferrer noopener" target="_blank">Iggy CLI</a></strong> and <strong><a href="https://github.com/apache/iggy/tree/master/web" rel="noreferrer noopener" target="_blank">Iggy Web UI</a></strong>. A simple update is all you need.</p>
+<p>Docker images for the server and related components are available on <strong><a href="https://hub.docker.com/u/apache?page=1&search=iggy" rel="noreferrer noopener" target="_blank">Docker Hub</a></strong>.</p>
+<hr/>
+<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="sdks"><a data-card="" href="#sdks" class="peer">SDKs</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07- [...]
+<p>Alongside migrating repositories to the monorepo, we updated all SDKs to support the zero-copy schema and fill in missing features.
+Our supported client libraries now include:</p>
+<ul>
+<li><a href="https://crates.io/crates/iggy" rel="noreferrer noopener" target="_blank">Rust</a> (always up-to-date, core reference implementation)</li>
+<li><a href="https://www.nuget.org/packages/Apache.Iggy/" rel="noreferrer noopener" target="_blank">C#</a></li>
+<li><a href="https://repository.apache.org/#nexus-search;quick~iggy" rel="noreferrer noopener" target="_blank">Java</a></li>
+<li><a href="https://pypi.org/project/apache-iggy/" rel="noreferrer noopener" target="_blank">Python</a></li>
+<li><a href="https://www.npmjs.com/package/apache-iggy" rel="noreferrer noopener" target="_blank">Node.js (TypeScript)</a></li>
+<li><a href="https://pkg.go.dev/github.com/apache/iggy/foreign/go" rel="noreferrer noopener" target="_blank">Go</a></li>
+</ul>
+<p>C++ and Elixir clients are in progress under the <a href="https://github.com/apache/iggy/tree/master/foreign" rel="noreferrer noopener" target="_blank">foreign</a> directory.</p>
+<p><strong>New in Rust SDK:</strong>
+Support for a <strong><a href="https://github.com/apache/iggy/pull/1838" rel="noreferrer noopener" target="_blank">background producer</a></strong>, which buffers messages in the background according to configured linger time and other settings. Examples are available <a href="https://github.com/apache/iggy/tree/master/examples/rust" rel="noreferrer noopener" target="_blank">here</a>.</p>
+<hr/>
+<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="benchmarks"><a data-card="" href="#benchmarks" class="peer">Benchmarks</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3 [...]
+<p>We’ve expanded our benchmarking toolkit:</p>
+<ul>
+<li><strong>Iggy Bench CLI</strong> (<code>iggy-bench</code>) — run local benchmarks with various configurations and profiles.</li>
+<li>JSON output and chart rendering for visual performance analysis.</li>
+<li>Open benchmark results published at <a href="https://benchmarks.iggy.apache.org" rel="noreferrer noopener" target="_blank">benchmarks.iggy.apache.org</a>, powered by the open source <a href="https://github.com/apache/iggy/tree/master/core/bench" rel="noreferrer noopener" target="_blank">benchmarking suite</a>.</li>
+</ul>
+<p>As always, you can install the regular CLI with: <code>cargo install iggy-cli</code>.</p>
+<hr/>
+<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="connectors"><a data-card="" href="#connectors" class="peer">Connectors</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3 [...]
+<p>We’ve built a new <strong>connectors runtime</strong> for easily creating Rust-based plugins that integrate Iggy with external data sources—similar to Kafka Connect or Redpanda Connect.</p>
+<p>You can:</p>
+<ul>
+<li>Ingest data into Iggy from external systems (e.g., Postgres CDC).</li>
+<li>Export data from Iggy to external destinations (e.g., indexing engines).</li>
+<li>Apply optional transformations and schema mappings along the way.</li>
+</ul>
+<p>Learn more in this <a href="https://iggy.apache.org/blogs/2025/06/06/connectors-runtime" rel="noreferrer noopener" target="_blank">post</a> and in the <a href="/docs/connectors/introduction/">documentation</a>.</p>
+<hr/>
+<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="mcp-server"><a data-card="" href="#mcp-server" class="peer">MCP Server</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3 [...]
+<p>Apache Iggy now includes support for the <strong><a href="https://modelcontextprotocol.io" rel="noreferrer noopener" target="_blank">Model Context Protocol</a> (MCP)</strong>—an open standard for providing context to LLMs.</p>
+<p>You can start the MCP server with <code>cargo run --bin iggy-mcp</code> or use the provided Docker image.</p>
+<p>Configuration, credentials, and permissions are detailed in the <a href="/docs/ai/mcp/">documentation</a>.</p>
+<hr/>
+<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="versioning"><a data-card="" href="#versioning" class="peer">Versioning</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3 [...]
+<p>Releases follow <a href="https://semver.org/" rel="noreferrer noopener" target="_blank">semver</a> (e.g., <code>0.5.0</code>) or the <code>latest</code> Docker tag (<code>apache/iggy:latest</code>).</p>
+<p>We also publish edge/dev/nightly builds (e.g., <code>0.5.0-edge.1</code> or <code>apache/iggy:edge</code>), which contain the newest changes but are <strong>not recommended for production</strong>.</p>
+<hr/>
+<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="whats-next"><a data-card="" href="#whats-next" class="peer">What’s Next</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l [...]
+<p>Work is underway on a <strong>complete rewrite of the server’s core architecture</strong> using the <strong>io_uring runtime</strong> with a <strong>thread-per-core, shared-nothing design</strong>. This will further improve performance, reduce tail latencies, and lower resource usage.</p>
+<p>Other upcoming efforts:</p>
+<ul>
+<li>Expanding SDKs across more languages and catching up with the latest features.</li>
+<li>Synchronous SDK clients and <a href="https://www.firezone.dev/blog/sans-io" rel="noreferrer noopener" target="_blank">sans-io</a> design.</li>
+<li>Benchmarking orchestrator</li>
+<li>Enhancing the Connectors Runtime and Web UI.</li>
+<li>Extending AI features around the MCP server.</li>
+<li>Exploring <strong>Agentic AI</strong> use cases for streaming-based agent coordination.</li>
+</ul>
+<hr/>
+<p>Thanks to our amazing community and contributors for making Apache Iggy better with every release.</p>
+<p><strong>Join us on <a href="https://discord.gg/apache-iggy" rel="noreferrer noopener" target="_blank">Discord</a> and help shape the future of the project!</strong></p></div><footer class="mt-16 border-t border-fd-border pt-8"><a class="inline-flex items-center gap-2 text-sm font-medium text-fd-primary transition-colors hover:opacity-80" href="/blogs/">← Back to all posts</a></footer></article></main><!--$--><!--/$--></main><script src="/_next/static/chunks/922b7f01aa6775a6.js" id="_R [...]
\ No newline at end of file
diff --git a/blogs/2025/08/10/release-0.5.0/index.txt b/blogs/2025/08/10/release-0.5.0/index.txt
new file mode 100644
index 00000000..ec171d2f
--- /dev/null
+++ b/blogs/2025/08/10/release-0.5.0/index.txt
@@ -0,0 +1,68 @@
+1:"$Sreact.fragment"
+2:I[17751,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js"],"RootProvider"]
+3:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+4:I[58298,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/5a37d4cb1abe17d7.js"],"default"]
+5:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+6:I[83571,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Header"]
+7:I[29966,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFDropdown"]
+8:I[36330,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFMobileLinks"]
+9:I[22016,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],""]
+a:I[88760,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Logo"]
+11:I[68027,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+:HL["/_next/static/chunks/32a0415c8ab1bd26.css","style"]
+:HL["/_next/static/media/GeistMono_Variable.p.2f937313.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+:HL["/_next/static/media/Geist_Variable-s.p.92592eb2.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+0:{"P":null,"b":"uBHgltRE2s5QA49x61S_u","c":["","blogs","2025","08","10","release-0.5.0",""],"q":"","i":false,"f":[[["",{"children":["(site)",{"children":["blogs",{"children":[["slug","2025/08/10/release-0.5.0","c"],{"children":["__PAGE__",{}]}]}]}]},"$undefined","$undefined",true],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/32a0415c8ab1bd26.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0 [...]
+13:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"OutletBoundary"]
+14:"$Sreact.suspense"
+16:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"ViewportBoundary"]
+18:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"MetadataBoundary"]
+b:["$","h1",null,{"className":"next-error-h1","style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:1:props:style","children":404}]
+c:["$","div",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:style","children":["$","h2",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style","children":"This page could not be found."}]}]
+d:["$","$1","c",{"children":[null,["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}]
+e:["$","$1","c",{"children":[null,["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}]
+f:["$","$1","c",{"children":["$L12",[["$","script","script-0",{"src":"/_next/static/chunks/00b00679782d0ffd.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/3562882a488c4fbb.js","async":true,"nonce":"$undefined"}]],["$","$L13",null,{"children":["$","$14",null,{"name":"Next.MetadataOutlet","children":"$@15"}]}]]}]
+10:["$","$1","h",{"children":[null,["$","$L16",null,{"children":"$L17"}],["$","div",null,{"hidden":true,"children":["$","$L18",null,{"children":["$","$14",null,{"name":"Next.Metadata","children":"$L19"}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}]
+1a:I[47873,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"default"]
+12:["$","main",null,{"className":"min-h-screen px-6 py-16 md:px-12","children":["$","article",null,{"className":"mx-auto max-w-5xl","children":[["$","header",null,{"className":"mb-10","children":[["$","time",null,{"className":"text-sm font-medium text-fd-muted-foreground","children":"August 10, 2025"}],["$","h1",null,{"className":"mt-3 text-3xl font-extrabold tracking-tight text-fd-foreground md:text-5xl","children":"Apache Iggy 0.5.0 Release"}],["$","p",null,{"className":"mt-4 text-base [...]
+1b:["$","p",null,{"children":["The new schema is already supported in the ",["$","strong",null,{"children":["$","$L1a",null,{"href":"https://github.com/apache/iggy/tree/master/core/cli","children":"Iggy CLI"}]}]," and ",["$","strong",null,{"children":["$","$L1a",null,{"href":"https://github.com/apache/iggy/tree/master/web","children":"Iggy Web UI"}]}],". A simple update is all you need."]}]
+1c:["$","p",null,{"children":["Docker images for the server and related components are available on ",["$","strong",null,{"children":["$","$L1a",null,{"href":"https://hub.docker.com/u/apache?page=1&search=iggy","children":"Docker Hub"}]}],"."]}]
+1d:["$","hr",null,{}]
+1e:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"sdks","children":[["$","a",null,{"data-card":"","href":"#sdks","className":"peer","children":"SDKs"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 [...]
+1f:["$","p",null,{"children":"Alongside migrating repositories to the monorepo, we updated all SDKs to support the zero-copy schema and fill in missing features.\nOur supported client libraries now include:"}]
+20:["$","ul",null,{"children":["\n",["$","li",null,{"children":[["$","$L1a",null,{"href":"https://crates.io/crates/iggy","children":"Rust"}]," (always up-to-date, core reference implementation)"]}],"\n",["$","li",null,{"children":["$","$L1a",null,{"href":"https://www.nuget.org/packages/Apache.Iggy/","children":"C#"}]}],"\n",["$","li",null,{"children":["$","$L1a",null,{"href":"https://repository.apache.org/#nexus-search;quick~iggy","children":"Java"}]}],"\n",["$","li",null,{"children":["$ [...]
+21:["$","p",null,{"children":["C++ and Elixir clients are in progress under the ",["$","$L1a",null,{"href":"https://github.com/apache/iggy/tree/master/foreign","children":"foreign"}]," directory."]}]
+22:["$","p",null,{"children":[["$","strong",null,{"children":"New in Rust SDK:"}],"\nSupport for a ",["$","strong",null,{"children":["$","$L1a",null,{"href":"https://github.com/apache/iggy/pull/1838","children":"background producer"}]}],", which buffers messages in the background according to configured linger time and other settings. Examples are available ",["$","$L1a",null,{"href":"https://github.com/apache/iggy/tree/master/examples/rust","children":"here"}],"."]}]
+23:["$","hr",null,{}]
+24:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"benchmarks","children":[["$","a",null,{"data-card":"","href":"#benchmarks","className":"peer","children":"Benchmarks"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-for [...]
+25:["$","p",null,{"children":"We’ve expanded our benchmarking toolkit:"}]
+26:["$","ul",null,{"children":["\n",["$","li",null,{"children":[["$","strong",null,{"children":"Iggy Bench CLI"}]," (",["$","code",null,{"children":"iggy-bench"}],") — run local benchmarks with various configurations and profiles."]}],"\n",["$","li",null,{"children":"JSON output and chart rendering for visual performance analysis."}],"\n",["$","li",null,{"children":["Open benchmark results published at ",["$","$L1a",null,{"href":"https://benchmarks.iggy.apache.org","children":"benchmarks [...]
+27:["$","p",null,{"children":["As always, you can install the regular CLI with: ",["$","code",null,{"children":"cargo install iggy-cli"}],"."]}]
+28:["$","hr",null,{}]
+29:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"connectors","children":[["$","a",null,{"data-card":"","href":"#connectors","className":"peer","children":"Connectors"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-for [...]
+2a:["$","p",null,{"children":["We’ve built a new ",["$","strong",null,{"children":"connectors runtime"}]," for easily creating Rust-based plugins that integrate Iggy with external data sources—similar to Kafka Connect or Redpanda Connect."]}]
+2b:["$","p",null,{"children":"You can:"}]
+2c:["$","ul",null,{"children":["\n",["$","li",null,{"children":"Ingest data into Iggy from external systems (e.g., Postgres CDC)."}],"\n",["$","li",null,{"children":"Export data from Iggy to external destinations (e.g., indexing engines)."}],"\n",["$","li",null,{"children":"Apply optional transformations and schema mappings along the way."}],"\n"]}]
+2d:["$","p",null,{"children":["Learn more in this ",["$","$L1a",null,{"href":"https://iggy.apache.org/blogs/2025/06/06/connectors-runtime","children":"post"}]," and in the ",["$","$L1a",null,{"href":"/docs/connectors/introduction","children":"documentation"}],"."]}]
+2e:["$","hr",null,{}]
+2f:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"mcp-server","children":[["$","a",null,{"data-card":"","href":"#mcp-server","className":"peer","children":"MCP Server"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-for [...]
+30:["$","p",null,{"children":["Apache Iggy now includes support for the ",["$","strong",null,{"children":[["$","$L1a",null,{"href":"https://modelcontextprotocol.io","children":"Model Context Protocol"}]," (MCP)"]}],"—an open standard for providing context to LLMs."]}]
+31:["$","p",null,{"children":["You can start the MCP server with ",["$","code",null,{"children":"cargo run --bin iggy-mcp"}]," or use the provided Docker image."]}]
+32:["$","p",null,{"children":["Configuration, credentials, and permissions are detailed in the ",["$","$L1a",null,{"href":"/docs/ai/mcp","children":"documentation"}],"."]}]
+33:["$","hr",null,{}]
+34:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"versioning","children":[["$","a",null,{"data-card":"","href":"#versioning","className":"peer","children":"Versioning"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-for [...]
+35:["$","p",null,{"children":["Releases follow ",["$","$L1a",null,{"href":"https://semver.org/","children":"semver"}]," (e.g., ",["$","code",null,{"children":"0.5.0"}],") or the ",["$","code",null,{"children":"latest"}]," Docker tag (",["$","code",null,{"children":"apache/iggy:latest"}],")."]}]
+36:["$","p",null,{"children":["We also publish edge/dev/nightly builds (e.g., ",["$","code",null,{"children":"0.5.0-edge.1"}]," or ",["$","code",null,{"children":"apache/iggy:edge"}],"), which contain the newest changes but are ",["$","strong",null,{"children":"not recommended for production"}],"."]}]
+37:["$","hr",null,{}]
+38:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"whats-next","children":[["$","a",null,{"data-card":"","href":"#whats-next","className":"peer","children":"What’s Next"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-fo [...]
+39:["$","p",null,{"children":["Work is underway on a ",["$","strong",null,{"children":"complete rewrite of the server’s core architecture"}]," using the ",["$","strong",null,{"children":"io_uring runtime"}]," with a ",["$","strong",null,{"children":"thread-per-core, shared-nothing design"}],". This will further improve performance, reduce tail latencies, and lower resource usage."]}]
+3a:["$","p",null,{"children":"Other upcoming efforts:"}]
+3b:["$","ul",null,{"children":["\n",["$","li",null,{"children":"Expanding SDKs across more languages and catching up with the latest features."}],"\n",["$","li",null,{"children":["Synchronous SDK clients and ",["$","$L1a",null,{"href":"https://www.firezone.dev/blog/sans-io","children":"sans-io"}]," design."]}],"\n",["$","li",null,{"children":"Benchmarking orchestrator"}],"\n",["$","li",null,{"children":"Enhancing the Connectors Runtime and Web UI."}],"\n",["$","li",null,{"children":"Exte [...]
+3c:["$","hr",null,{}]
+3d:["$","p",null,{"children":"Thanks to our amazing community and contributors for making Apache Iggy better with every release."}]
+3e:["$","p",null,{"children":["$","strong",null,{"children":["Join us on ",["$","$L1a",null,{"href":"https://discord.gg/apache-iggy","children":"Discord"}]," and help shape the future of the project!"]}]}]
+3f:["$","footer",null,{"className":"mt-16 border-t border-fd-border pt-8","children":["$","$L9",null,{"href":"/blogs","className":"inline-flex items-center gap-2 text-sm font-medium text-fd-primary transition-colors hover:opacity-80","children":"← Back to all posts"}]}]
+17:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
+40:I[27201,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"IconMark"]
+15:null
+19:[["$","title","0",{"children":"Apache Iggy 0.5.0 Release | Apache Iggy"}],["$","link","1",{"rel":"icon","href":"/img/favicon.png"}],["$","$L40","2",{}]]
diff --git a/blogs/2025/11/17/websocket-io-uring/__next.!KHNpdGUp.blogs.$c$slug.__PAGE__.txt b/blogs/2025/11/17/websocket-io-uring/__next.!KHNpdGUp.blogs.$c$slug.__PAGE__.txt
new file mode 100644
index 00000000..763ec854
--- /dev/null
+++ b/blogs/2025/11/17/websocket-io-uring/__next.!KHNpdGUp.blogs.$c$slug.__PAGE__.txt
@@ -0,0 +1,258 @@
+1:"$Sreact.fragment"
+2:I[47873,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"default"]
+7a:I[44324,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"CodeBlock"]
+81:I[35250,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"Mermaid"]
+8c:I[44324,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"Pre"]
+8d:I[24110,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"Image"]
+8e:I[22016,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],""]
+8f:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"OutletBoundary"]
+90:"$Sreact.suspense"
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","c",{"children":[["$","main",null,{"className":"min-h-screen px-6 py-16 md:px-12","children":["$","article",null,{"className":"mx-auto max-w-5xl","children":[["$","header",null,{"className":"mb-10","children":[["$","time",null,{"className":"text-sm font-medium text-fd-muted-foreground","children":"November 17, 2025"}],["$","h1",null,{"className":"mt-3 text-3xl font-extrabold tracking-tight text-fd-foreground md:text-5xl","children":"Bu [...]
+3:["$","$L2",null,{"href":"https://github.com/compio-rs/compio/pull/501","children":"contributing"}]
+4:["$","code",null,{"children":"compio"}]
+5:["$","hr",null,{}]
+6:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"understanding-the-architectural-divide-poll-vs-completion","children":[["$","a",null,{"data-card":"","href":"#understanding-the-architectural-divide-poll-vs-completion","className":"peer","children":"Understanding the architectural divide (poll vs completion)"}],["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWi [...]
+7:["$","p",null,{"children":"Let's see why poll-based libraries can't easily work with completion based runtimes by examining the traits of compio, tungstenite."}]
+7b:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+9:["$","p",null,{"children":"The Read trait assumes you borrow a buffer. Compio's AsyncRead needs to take ownership of the buffer, submit it to the kernel, and return it later."}]
+7d:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+b:["$","p",null,{"children":"There's no way to make this work directly with compio's owned-buffer model. The abstractions are fundamentally incompatible."}]
+c:["$","p",null,{"children":["When we need to add WebSocket support, we can't just drop in tokio-tungstenite, which uses ",["$","code",null,{"children":"future_util::io::AsyncRead"}]," trait. We need an adapter that:"]}]
+d:["$","ul",null,{"children":["\n",["$","li",null,{"children":"Works with compio's owned-buffer async I/O"}],"\n",["$","li",null,{"children":"Presents synchronous Read/Write traits to tungstenite"}],"\n",["$","li",null,{"children":"Efficiently bridges sync and async world"}],"\n"]}]
+e:["$","hr",null,{}]
+f:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"challenge-with-tungstenite","children":[["$","a",null,{"data-card":"","href":"#challenge-with-tungstenite","className":"peer","children":"Challenge with Tungstenite"}],["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3. [...]
+10:["$","p",null,{"children":"Tungstenite is the de-facto Rust WebSocket protocol implementation. It handles all the WebSocket protocol logic:"}]
+11:["$","ul",null,{"children":["\n",["$","li",null,{"children":"Frame parsing and generation"}],"\n",["$","li",null,{"children":"Message fragmentation"}],"\n",["$","li",null,{"children":"Control frames (ping, pong, close)"}],"\n",["$","li",null,{"children":"Protocol violations and error handling"}],"\n",["$","li",null,{"children":"Text encoding validation"}],"\n"]}]
+12:["$","p",null,{"children":"Our initial thought was to contribute to async-tungstenite, which provides runtime-agnostic WebSocket support. It has adapters for multiple async runtimes through a trait-based abstraction. But as we dug deeper into adapting it for compio we realized a fundamental incompatibility"}]
+13:["$","p",null,{"children":"The realization: async-tungstenite is strongly coupled to poll-based IO"}]
+14:["$","p",null,{"children":"The incompatibility becomes clear when we examine the AsyncRead traits of compio and Future's AsyncRead"}]
+7f:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+16:["$","p",null,{"children":"These are fundamentally different programming models that don't compose cleanly."}]
+17:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"decision-a-separate-crate","children":[["$","a",null,{"data-card":"","href":"#decision-a-separate-crate","className":"peer","children":"Decision: A separate crate"}],["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 [...]
+18:["$","p",null,{"children":["After realizing the incompatibility, we've decided to create ",["$","code",null,{"children":"compio-ws"}]," as a standalone crate. The architecture would be:"]}]
+19:["$","$L81",null,{"chart":"graph TD\n A[Application Code] --> B[compio-ws]\n B --> C[Tungstenite]\n C --> D[GrowableSyncStream]\n D --> E[Compio Runtime]"}]
+1a:["$","p",null,{"children":"The key insight: we need a bridge layer that provides synchronous Read/Write traits to tungstenite while internally using compio's async owned-buffer I/O."}]
+1b:["$","hr",null,{}]
+1c:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"first-attempt-syncstream","children":[["$","a",null,{"data-card":"","href":"#first-attempt-syncstream","className":"peer","children":["First Attempt: ",["$","code",null,{"children":"SyncStream"}]]}],["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","classN [...]
+1d:["$","p",null,{"children":["Compio already provides ",["$","code",null,{"children":"SyncStream"}]," in the ",["$","code",null,{"children":"compio-io::compat"}]," module specifically for interoperating with libraries that expect synchronous I/O traits. It's a clever structure that maintains internal buffers to bridge the async/sync boundary:"]}]
+82:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+1f:["$","p",null,{"children":["The default ",["$","code",null,{"children":"DEFAULT_BUF_SIZE"}]," is 8KB, but you can specify any capacity you want. Once created, the buffer capacity is fixed. It never grows. This can be a problem, which we will discuss below, read along."]}]
+20:["$","p",null,{"children":"Here's how it works:"}]
+21:["$","p",null,{"children":"Reading (sync to async):"}]
+84:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+23:["$","p",null,{"children":"Writing (sync to async):"}]
+86:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+25:["$","p",null,{"children":"The pattern is:"}]
+26:["$","ul",null,{"children":["\n",["$","li",null,{"children":["Sync ",["$","code",null,{"children":"read()"}],"/",["$","code",null,{"children":"write()"}]," operate on internal buffers"]}],"\n",["$","li",null,{"children":["Return ",["$","code",null,{"children":"WouldBlock"}]," when buffer is empty/full"]}],"\n",["$","li",null,{"children":["Call async ",["$","code",null,{"children":"fill_read_buf()"}],"/",["$","code",null,{"children":"flush_write_buf()"}]," to service buffers"]}],"\n",[ [...]
+27:["$","p",null,{"children":"This allows tungstenite to work with compio streams:"}]
+88:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+29:["$","hr",null,{}]
+2a:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"the-problem-with-fixed-buffer-size-in-syncstream","children":[["$","a",null,{"data-card":"","href":"#the-problem-with-fixed-buffer-size-in-syncstream","className":"peer","children":["The problem with fixed buffer size in ",["$","code",null,{"children":"SyncStream"}]]}],["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor"," [...]
+2b:["$","p",null,{"children":"The initial implementation worked perfectly for messages smaller than the buffer. WebSocket handshakes completed, ping/pong frames exchanged, text messages flowed. Everything seemed fine."}]
+2c:["$","p",null,{"children":"Then we tested with larger messages, and the performance collapsed."}]
+2d:["$","p",null,{"children":"The Problem Scenario: Sending a 16MB binary message through WebSocket with the default 8KB SyncStream buffer:"}]
+2e:["$","p",null,{"children":"Here's what happens inside:"}]
+2f:["$","$L81",null,{"chart":"graph TD\n A[16MB Message] --> B[Tungstenite frames it]\n B --> C[SyncStream write with chunks]\n C --> D[8KB buffer - fixed capacity]\n D --> E[Write 8KB → WouldBlock → flush]\n E -->|repeat| D\n D --> F[2048 round trips total]"}]
+30:["$","p",null,{"children":"The measurements were bad:"}]
+31:["$","ul",null,{"children":["\n",["$","li",null,{"children":"Time: Over 100 seconds to send 16MB"}],"\n",["$","li",null,{"children":"Memory: Excessive allocations from repeated buffer handling. At times this lead to the websocket process being OOM killed by the OS."}],"\n"]}]
+32:["$","p",null,{"children":["Each ",["$","code",null,{"children":"WouldBlock"}]," -> async call -> retry cycle involved:"]}]
+33:["$","ul",null,{"children":["\n",["$","li",null,{"children":"Saving state in tungstenite"}],"\n",["$","li",null,{"children":"Suspending the sync call"}],"\n",["$","li",null,{"children":"Executing async flush"}],"\n",["$","li",null,{"children":"Resuming the sync call"}],"\n"]}]
+34:["$","p",null,{"children":["The sync trait contract requires immediate success or ",["$","code",null,{"children":"WouldBlock"}],". There's no way to say \"I need a bigger buffer\" or \"give me partial progress while I grow the buffer.\" Each ",["$","code",null,{"children":"WouldBlock"}]," forces a complete async round trip."]}]
+35:["$","p",null,{"children":["We tried the obvious fix of increasing the ",["$","code",null,{"children":"SyncStream"}]," buffer size to 1MB. Which worked perfectly and compio-ws passed all tests in the standard autobahn testsuite. But this solution is still fragile when the user doesn't know the peak memory usage of their workload and this can lead to overprovisioning and wastage of server resources."]}]
+36:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"the-solution-growablesyncstream","children":[["$","a",null,{"data-card":"","href":"#the-solution-growablesyncstream","className":"peer","children":["The Solution: ",["$","code",null,{"children":"GrowableSyncStream"}]]}],["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLine [...]
+37:["$","p",null,{"children":"Design goals:"}]
+38:["$","ul",null,{"children":["\n",["$","li",null,{"children":"Dynamic growth: Buffers start small and grow as needed"}],"\n",["$","li",null,{"children":"Bounded maximum: Prevent memory exhaustion with configurable limits"}],"\n",["$","li",null,{"children":"Automatic shrinking: Return to base capacity based on a threshold"}],"\n",["$","li",null,{"children":["Minimal round trips: Handle large messages without constant ",["$","code",null,{"children":"WouldBlock"}]]}],"\n"]}]
+39:["$","p",null,{"children":"Architecture Overview:"}]
+8a:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+3b:["$","p",null,{"children":"Buffer growth strategy:"}]
+3c:["$","ul",null,{"children":["\n",["$","li",null,{"children":"Start with a small sized buffer (128 KB matching tungstenite default buffer size)"}],"\n",["$","li",null,{"children":["Grow in predictable increments of ",["$","code",null,{"children":"base_capacity"}]," sized chunks"]}],"\n",["$","li",null,{"children":"Cap growth at reasonable limit (64MB default)"}],"\n",["$","li",null,{"children":["Shrink back to ",["$","code",null,{"children":"base_capacity"}]," when all data is consumed [...]
+3d:["$","p",null,{"children":"Key operations:"}]
+3e:["$","p",null,{"children":"Read path:"}]
+3f:["$","ul",null,{"children":["\n",["$","li",null,{"children":"Compacts buffer when needed (moves unread data to front)"}],"\n",["$","li",null,{"children":["Grows in ",["$","code",null,{"children":"base_capacity"}]," increments during ",["$","code",null,{"children":"fill_read_buf()"}]]}],"\n",["$","li",null,{"children":"Shrinks back to base when all data consumed and buffer > 4× base"}],"\n"]}]
+40:["$","p",null,{"children":"Write path:"}]
+41:["$","ul",null,{"children":["\n",["$","li",null,{"children":[["$","code",null,{"children":"Vec::extend_from_slice"}]," handles growth automatically up to ",["$","code",null,{"children":"max_buffer_size"}]]}],"\n",["$","li",null,{"children":["Returns ",["$","code",null,{"children":"WouldBlock"}]," only when approaching max limit"]}],"\n",["$","li",null,{"children":[["$","code",null,{"children":"flush_write_buf()"}]," handles progressive flushing and shrinks back to base"]}],"\n"]}]
+42:["$","p",null,{"children":["With these changes compio-ws successfully passes the all the tests in ",["$","code",null,{"children":"autobahn-testsuite"}]," that ",["$","code",null,{"children":"tokio-tungstenite"}]," passes."]}]
+43:["$","hr",null,{}]
+44:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"benchmarks","children":[["$","a",null,{"data-card":"","href":"#benchmarks","className":"peer","children":"Benchmarks"}],["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 t [...]
+45:["$","h3",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"benchmark-methodology","children":[["$","a",null,{"data-card":"","href":"#benchmark-methodology","className":"peer","children":"Benchmark Methodology"}],["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 tex [...]
+46:["$","p",null,{"children":"To understand the real-world performance characteristics of compio-ws, we ran Apache Iggy's pinned producer benchmark and pinned consumer benchmark"}]
+47:["$","p",null,{"children":"The following benchmarks are run using AWS i3en.3xlarge instance using 24.04 Ubuntu OS."}]
+48:["$","p",null,{"children":["$","strong",null,{"children":"Hardware Specifications:"}]}]
+49:["$","ul",null,{"children":["\n",["$","li",null,{"children":[["$","strong",null,{"children":"CPU:"}]," Intel Xeon Platinum 8259CL @ 2.50GHz (Cascade Lake)"]}],"\n",["$","li",null,{"children":[["$","strong",null,{"children":"Cores:"}]," 6 physical cores with hyperthreading (12 vCPUs total)"]}],"\n",["$","li",null,{"children":[["$","strong",null,{"children":"Cache:"}]," 36 MB L3 cache"]}],"\n",["$","li",null,{"children":[["$","strong",null,{"children":"Memory:"}]," 96 GB RAM"]}],"\n",[" [...]
+4a:["$","p",null,{"children":"Common benchmark setting used:"}]
+4b:["$","ul",null,{"children":["\n",["$","li",null,{"children":["enable fsync and fsync every single message (",["$","code",null,{"children":"export IGGY_SYSTEM_PARTITION_ENFORCE_FSYNC=true"}]," and ",["$","code",null,{"children":"export IGGY_SYSTEM_PARTITION_MESSAGES_REQUIRED_TO_SAVE=1"}],")"]}],"\n",["$","li",null,{"children":"Use huge pages in linux."}],"\n"]}]
+4c:["$","$L7a",null,{"className":"shiki shiki-themes github-light github-dark","style":{"--shiki-light":"#24292e","--shiki-dark":"#e1e4e8","--shiki-light-bg":"#fff","--shiki-dark-bg":"#24292e"},"tabIndex":"0","icon":"<svg viewBox=\"0 0 24 24\"><path d=\"M 6,1 C 4.354992,1 3,2.354992 3,4 v 16 c 0,1.645008 1.354992,3 3,3 h 12 c 1.645008,0 3,-1.354992 3,-3 V 8 7 A 1.0001,1.0001 0 0 0 20.707031,6.2929687 l -5,-5 A 1.0001,1.0001 0 0 0 15,1 h -1 z m 0,2 h 7 v 3 c 0,1.645008 1.354992,3 3,3 h 3 [...]
+4d:["$","p",null,{"children":"Workload characteristics:"}]
+4e:["$","ul",null,{"children":["\n",["$","li",null,{"children":"4 Producers (one per CPU core)"}],"\n",["$","li",null,{"children":"4 Streams, 1 Topic per Stream, 1 Partition per Topic"}],"\n",["$","li",null,{"children":"1000 messages per batch"}],"\n",["$","li",null,{"children":"40,000 batches"}],"\n",["$","li",null,{"children":"1000 bytes per message"}],"\n",["$","li",null,{"children":"Total: 40M messages, 40GB of data"}],"\n"]}]
+4f:["$","p",null,{"children":"We compared two scenarios:"}]
+50:["$","ul",null,{"children":["\n",["$","li",null,{"children":"TCP: Direct TCP connection (baseline)"}],"\n",["$","li",null,{"children":"WebSocket: compio-ws with GrowableSyncStream"}],"\n"]}]
+51:["$","h3",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"results-tcp-vs-websocket","children":[["$","a",null,{"data-card":"","href":"#results-tcp-vs-websocket","className":"peer","children":"Results: TCP vs WebSocket"}],["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 sh [...]
+52:["$","div",null,{"className":"relative overflow-auto prose-no-margin my-6","children":["$","table",null,{"children":[["$","thead",null,{"children":["$","tr",null,{"children":[["$","th",null,{"children":"Percentile"}],["$","th",null,{"style":{"textAlign":"right"},"children":"TCP"}],["$","th",null,{"style":{"textAlign":"right"},"children":"WebSocket"}],["$","th",null,{"children":"Difference"}]]}]}],["$","tbody",null,{"children":[["$","tr",null,{"children":[["$","td",null,{"children":"Av [...]
+53:["$","p",null,{"children":"Benchmark graphs:"}]
+54:["$","h4",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"tcp","children":[["$","a",null,{"data-card":"","href":"#tcp","className":"peer","children":"TCP"}],["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity pee [...]
+55:["$","p",null,{"children":["$","$L8d",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"image","src":{"src":"/_next/static/media/tcp-1234.445ddcbf.png","width":1600,"height":1200,"blurWidth":8,"blurHeight":6,"blurDataURL":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAGCAYAAAD+Bd/7AAAAc0lEQVR42m2NQQ6DMAwE85g4deI0TempVSVog0D8/0FLYjggwWGktTXaNUQE5xyYGd57peX2s9bCEDk9ztBRuF1Krd1wqLUSK1IJkHuCpAyuUyp8vm/8xx6/0mMoA8apYF4mdK/nNhFjwiN3St5pOQRRYQUpJ0hgr3F1t [...]
+56:["$","h4",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"websocket","children":[["$","a",null,{"data-card":"","href":"#websocket","className":"peer","children":"WebSocket"}],["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 tran [...]
+57:["$","p",null,{"children":["$","$L8d",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"image","src":{"src":"/_next/static/media/ws-1234.fbc1ea56.png","width":1600,"height":1200,"blurWidth":8,"blurHeight":6,"blurDataURL":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAGCAYAAAD+Bd/7AAAAbElEQVR42l2NSQqAMAxFe5imSR1wQERxwmHh/S/0tS1C7eKRn+SFKCKCMQYiAmutx2U301pDERnfpLjDSGAwB1JJ8RusMORdfpU5Epaxx32uOLYZ977hWifs84CmKsOLoqxQt92fpkOW5V54AAohR/a+FArJAAAAAElFTk [...]
+58:["$","hr",null,{}]
+59:["$","p",null,{"children":"Next we look at pinned-consumer benchmark."}]
+5a:["$","p",null,{"children":"Workload characteristics:"}]
+5b:["$","ul",null,{"children":["\n",["$","li",null,{"children":"4 Consumers (one per CPU core)"}],"\n",["$","li",null,{"children":"4 Streams, 1 Topic per Stream, 1 Partition per Topic"}],"\n",["$","li",null,{"children":"1000 messages per batch"}],"\n",["$","li",null,{"children":"40,000 batches"}],"\n",["$","li",null,{"children":"1000 bytes per message"}],"\n",["$","li",null,{"children":"Total: 40M messages, 40GB of data"}],"\n"]}]
+5c:["$","div",null,{"className":"relative overflow-auto prose-no-margin my-6","children":["$","table",null,{"children":[["$","thead",null,{"children":["$","tr",null,{"children":[["$","th",null,{"children":"Percentile"}],["$","th",null,{"style":{"textAlign":"right"},"children":"TCP"}],["$","th",null,{"style":{"textAlign":"right"},"children":"WebSocket"}],["$","th",null,{"children":"Difference"}]]}]}],["$","tbody",null,{"children":[["$","tr",null,{"children":[["$","td",null,{"children":"Av [...]
+5d:["$","p",null,{"children":"Benchmark graphs:"}]
+5e:["$","h4",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"tcp-1","children":[["$","a",null,{"data-card":"","href":"#tcp-1","className":"peer","children":"TCP"}],["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity [...]
+5f:["$","p",null,{"children":["$","$L8d",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"image","src":{"src":"/_next/static/media/pc_tcp.c620c51e.png","width":1600,"height":1200,"blurWidth":8,"blurHeight":6,"blurDataURL":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAGCAYAAAD+Bd/7AAAAeklEQVR42l2NWw6DIBBFXQyPGSlEokg7tErS/a/pVjBNGz9O5pFzcwetNYwxICIwc4eIobWBUgrDV7jS/l1oh7X2SNm/+ZOGlCKWeYI8ZpSSIZJwXyOc41PI64IiGdsmqPWFuj/x3gUh+LNidB4+TLgd+BA7bSceu/ABWmJ [...]
+60:["$","h4",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"websocket-1","children":[["$","a",null,{"data-card":"","href":"#websocket-1","className":"peer","children":"WebSocket"}],["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 [...]
+61:["$","p",null,{"children":["$","$L8d",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"image","src":{"src":"/_next/static/media/pc_ws.aa40a190.png","width":1600,"height":1200,"blurWidth":8,"blurHeight":6,"blurDataURL":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAGCAYAAAD+Bd/7AAAAXUlEQVR42n2NWwqAMAwEe5impsVoGsGi97/XausDFPRjIITZXUdECCGAmcExIu7Um/af9x6OKDThTQ3+CN0tuWviq8VJL5jMYFmRdTxRpJSOCc2GUlbMZXkgMjRhA8mvRyFE1f+bAAAAAElFTkSuQmCC"},"placeholder" [...]
+62:["$","h3",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"analysis","children":[["$","a",null,{"data-card":"","href":"#analysis","className":"peer","children":"Analysis:"}],["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transi [...]
+63:["$","p",null,{"children":["The results show measurable but ",["$","strong",null,{"children":"reasonable"}]," overhead from the WebSocket layer:"]}]
+64:["$","p",null,{"children":[["$","strong",null,{"children":"Producer latency:"}]," WebSocket adds ~0.8-1.0ms across most percentiles (30-40% higher than TCP). Even at P9999, we achieve 9.48ms latency - impressive for a durable workload with fsync-per-message enabled."]}]
+65:["$","p",null,{"children":[["$","strong",null,{"children":"Consumer latency:"}]," WebSocket shows roughly 2× the latency of raw TCP, adding ~0.7-1.0ms. The P9999 of 2.52ms demonstrates consistent performance even at high percentiles."]}]
+66:["$","p",null,{"children":"Under durability constraints, achieving single-digit millisecond latencies at P9999 for producers and sub-3ms for consumers is quite good."}]
+67:["$","p",null,{"children":[["$","strong",null,{"children":"Adapter layer cost:"}]," The current implementation uses GrowableSyncStream as a bridge between sync and async I/O models. The buffer grows in linear increments, which can be suboptimal for large messages. However, for this first implementation enabling WebSocket support in a completion-based runtime, the performance is acceptable."]}]
+68:["$","p",null,{"children":["$","strong",null,{"children":"WebSocket protocol overhead:"}]}]
+69:["$","ul",null,{"children":["\n",["$","li",null,{"children":"WebSocket framing: each message needs frame headers."}],"\n",["$","li",null,{"children":"Masking: XOR operation on payload"}],"\n"]}]
+6a:["$","p",null,{"children":[["$","strong",null,{"children":"Tail latency consistency:"}]," GrowableSyncStream maintains roughly proportional overhead even at high percentiles. The P9999 shows larger absolute differences but percentage-wise remains consistent with lower percentiles, indicating predictable behavior under load."]}]
+6b:["$","hr",null,{}]
+6c:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"future-work","children":[["$","a",null,{"data-card":"","href":"#future-work","className":"peer","children":"Future Work"}],["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity- [...]
+6d:["$","ol",null,{"children":["\n",["$","li",null,{"children":["\n",["$","p",null,{"children":"Smarter Buffer Growth"}],"\n",["$","ul",null,{"children":["\n",["$","li",null,{"children":["Current: Linear ",["$","code",null,{"children":"base_capacity"}]," increments"]}],"\n",["$","li",null,{"children":["Better: Exponential growth (like ",["$","code",null,{"children":"Vec::reserve"}],")"]}],"\n",["$","li",null,{"children":"Impact: Reduce reallocation overhead for large messages"}],"\n"]}], [...]
+6e:["$","p",null,{"children":["We ",["$","$L2",null,{"href":"https://github.com/compio-rs/compio/pull/501","children":"contributed"}]," ",["$","code",null,{"children":"compio-ws"}]," to ",["$","code",null,{"children":"compio"}]," and anyone interested in improving ",["$","code",null,{"children":"compio-ws"}]," can contribute to ",["$","code",null,{"children":"compio"}],"."]}]
+6f:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"conclusion","children":[["$","a",null,{"data-card":"","href":"#conclusion","className":"peer","children":"Conclusion"}],["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 t [...]
+70:["$","p",null,{"children":[["$","strong",null,{"children":"Current state in Iggy:"}]," WebSocket support is currently implemented with long polling on the consumer side and push-based notifications is planned for future releases. This has different implications for producers and consumers."]}]
+71:["$","p",null,{"children":[["$","strong",null,{"children":"For consumers (receiving messages):"}]," The current long polling implementation means consumers must repeatedly request new messages, even when none are available. This is inefficient, especially for low-power edge clients."]}]
+72:["$","p",null,{"children":[["$","strong",null,{"children":"For producers (sending messages):"}]," WebSocket provides immediate benefits. Instead of establishing new connections or using inefficient long polling, producers can maintain a persistent WebSocket connection and push messages directly to the server. This is particularly valuable for:"]}]
+73:["$","ul",null,{"children":["\n",["$","li",null,{"children":"Browser-based producers sending events or telemetry"}],"\n",["$","li",null,{"children":"Edge devices reporting sensor data or metrics"}],"\n",["$","li",null,{"children":"Dashboard applications sending commands or configuration updates"}],"\n"]}]
+74:["$","p",null,{"children":[["$","strong",null,{"children":"What's next:"}]," While compio-ws with GrowableSyncStream enables WebSocket support today, significant optimization potential remains. A native WebSocket implementation designed for owned buffers from the ground up could eliminate the adapter layer overhead and unlock the full performance potential of io_uring's zero-copy capabilities.\nWe invite the Rust community to contribute:"]}]
+75:["$","ul",null,{"children":["\n",["$","li",null,{"children":[["$","strong",null,{"children":"Optimize"}]," ",["$","code",null,{"children":"GrowableSyncStream"}],": Implement exponential buffer growth and pooling"]}],"\n",["$","li",null,{"children":[["$","strong",null,{"children":"Owned buffer WS protocol implementation:"}]," Build WebSocket from scratch with owned buffers"]}],"\n",["$","li",null,{"children":[["$","strong",null,{"children":"Push-based consumers:"}]," Help implement ser [...]
+76:["$","footer",null,{"className":"mt-16 border-t border-fd-border pt-8","children":["$","$L8e",null,{"href":"/blogs","className":"inline-flex items-center gap-2 text-sm font-medium text-fd-primary transition-colors hover:opacity-80","children":"← Back to all posts"}]}]
+77:["$","script","script-0",{"src":"/_next/static/chunks/00b00679782d0ffd.js","async":true}]
+78:["$","script","script-1",{"src":"/_next/static/chunks/3562882a488c4fbb.js","async":true}]
+79:["$","$L8f",null,{"children":["$","$90",null,{"name":"Next.MetadataOutlet","children":"$@91"}]}]
+7c:["$","$L8c",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"},"children":"// The Rust std::io::Read trait (what tungstenite expects)"}]}],"\n",["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F9758 [...]
+7e:["$","$L8c",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"},"children":"// Tungstenite's WebSocket structure"}]}],"\n",["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struc [...]
+80:["$","$L8c",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"},"children":"// Compio's async read - can't be made into a poll-based trait"}]}],"\n",["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"async"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":" [...]
+83:["$","$L8c",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" SyncStream"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E [...]
+85:["$","$L8c",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"impl"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"<"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"S"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children": [...]
+87:["$","$L8c",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"impl"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"<"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"S"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children": [...]
+89:["$","$L8c",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"let"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" stream "}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"="}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"chil [...]
+8b:["$","$L8c",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" GrowableSyncStream"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark" [...]
+91:null
+92:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":") "}]
+93:["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"->"}]
+94:["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" BufResult"}]
+95:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"<"}]
+96:["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"usize"}]
+97:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":", "}]
+98:["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"B"}]
+99:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":">;"}]
+9a:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"},"children":" // ^"}]}]
+9b:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"},"children":" // Owned buffer - kernel owns it temporarily"}]}]
+9c:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"}"}]}]
+9d:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"}"}]}]
+9e:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"]) "}]
+9f:["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"->"}]
+a0:["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Poll"}]
+a1:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"<io"}]
+a2:["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"::"}]
+a3:["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"Result"}]
+a4:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"<"}]
+a5:["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"usize"}]
+a6:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":">>;"}]
+a7:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"},"children":"// Borrowed buffer ^^^^"}]}]
+a8:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" {"}]
+a9:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" Self"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"::"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"with_capacity"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"("}],["$","span",null,{"style":{"--shi [...]
+aa:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" }"}]}]
+ab:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"}"}]}]
+ac:["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":"self"}]
+ad:["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"."}]
+ae:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"eof {"}]
+af:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"},"children":" // No data available - need to fill from async stream"}]}]
+b0:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" return"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Err"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"("}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"io"}],["$","span",null,{"style":{"--shiki- [...]
+b1:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" io"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"::"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"ErrorKind"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"::"}],["$","span",null,{"style":{"-- [...]
+b2:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},"children":" \"need to fill the read buffer\""}]}]
+b3:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" ));"}]}]
+b4:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" }"}]}]
+b5:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" "}]}]
+b6:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"},"children":" // Copy from internal buffer to caller's buffer"}]}]
+b7:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" let"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" to_read "}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"="}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" available"}],["$","span",null,{"style":{"-- [...]
+b8:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" buf["}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":".."}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"to_read]"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"."}],["$","span",null,{"style":{"--shiki-li [...]
+b9:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" self"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"."}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"read_buffer"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"."}],["$","span",null,{"style":{"--shiki- [...]
+ba:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" "}]}]
+bb:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Ok"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"(to_read)"}]]}]
+bc:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" }"}]}]
+bd:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"}"}]}]
+be:["$","span",null,{"className":"line"}]
+bf:["$","span",null,{"className":"line"}]
+c0:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"impl"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"<"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"S"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1", [...]
+c1:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" async"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" fn"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" fill_read_buf"}],["$","span",null,{"style":{"--s [...]
+c2:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"},"children":" // Async operation to fill the internal buffer"}]}]
+c3:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" let"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" len "}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"="}],["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" self"}],["$","span",null,{"style":{"--shiki-lig [...]
+c4:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" ."}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"with"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"("}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"|"}],["$","span",null,{"style":{"--shiki-light" [...]
+c5:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" let"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" len "}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"="}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" b"}],["$","span",null,{"style":{"--shik [...]
+c6:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" let"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" b "}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"="}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" b"}],["$","span",null,{"style":{"--shiki- [...]
+c7:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" self"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"."}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"stream"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"."}],["$","span",null,{"style":{"--shi [...]
+c8:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" })"}]}]
+c9:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" .await?"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":";"}]]}]
+ca:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" "}]}]
+cb:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" if"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" len "}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"=="}],["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" 0"}],["$","span",null,{"style":{"--shiki-light" [...]
+cc:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" self"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"."}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"eof "}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"="}],["$","span",null,{"style":{"--shiki-lig [...]
+cd:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" }"}]}]
+ce:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Ok"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"(len)"}]]}]
+cf:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" }"}]}]
+d0:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"}"}]}]
+d1:["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"::"}]
+d2:["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"ErrorKind"}]
+d3:["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"::"}]
+d4:["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"WouldBlock"}]
+d5:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]
+d6:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},"children":" \"need to flush the write buffer\""}]}]
+d7:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" ));"}]}]
+d8:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" }"}]}]
+d9:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" "}]}]
+da:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"},"children":" // Copy into internal buffer"}]}]
+db:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" let"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" len "}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"="}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" buf"}],["$","span",null,{"style":{"--shiki-ligh [...]
+dc:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"},"children":" // ... copy data ..."}]}]
+dd:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Ok"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"(len)"}]]}]
+de:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" }"}]}]
+df:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" "}]}]
+e0:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" fn"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" flush"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"("}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"&mut"}],["$","span",null,{"style":{"--shiki-light":" [...]
+e1:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"},"children":" // Just return Ok - actual flushing happens in flush_write_buf"}]}]
+e2:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Ok"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"(())"}]]}]
+e3:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" }"}]}]
+e4:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"}"}]}]
+e5:["$","span",null,{"className":"line"}]
+e6:["$","span",null,{"className":"line"}]
+e7:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"impl"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"<"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"S"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1", [...]
+e8:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" async"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" fn"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" flush_write_buf"}],["$","span",null,{"style":{"- [...]
+e9:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"},"children":" // Async operation to flush the internal buffer"}]}]
+ea:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" let"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" len "}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"="}],["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" self"}],["$","span",null,{"style":{"--shiki-lig [...]
+eb:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" self"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"."}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"stream"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"."}],["$","span",null,{"style":{"--shiki-light [...]
+ec:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Ok"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"(len)"}]]}]
+ed:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" }"}]}]
+ee:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"}"}]}]
+ef:["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"Error"}]
+f0:["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"::"}]
+f1:["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"Io"}]
+f2:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"(e)) "}]
+f3:["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"if"}]
+f4:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" e"}]
+f5:["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"."}]
+f6:["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"kind"}]
+f7:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"() "}]
+f8:["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"=="}]
+f9:["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" ErrorKind"}]
+fa:["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"::"}]
+fb:["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"WouldBlock"}]
+fc:["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" =>"}]
+fd:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" {"}]
+fe:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"},"children":" // Need to fill the read buffer"}]}]
+ff:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" websocket"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"."}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"get_mut"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"()"}],["$","span",null,{"style":{"-- [...]
+100:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" continue"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":";"}]]}]
+101:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" }"}]}]
+102:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Err"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"(e) "}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"=>"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" return"}],["$","span",null,{"style":{"--shiki- [...]
+103:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" }"}]}]
+104:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"}"}]}]
+105:["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}]
+106:["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" usize"}]
+107:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":", "}]
+108:["$","span",null,{"style":{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"},"children":"// Maximum size (default: 64MB)"}]
+109:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"}"}]}]
diff --git a/blogs/2025/11/17/websocket-io-uring/__next.!KHNpdGUp.blogs.$c$slug.txt b/blogs/2025/11/17/websocket-io-uring/__next.!KHNpdGUp.blogs.$c$slug.txt
new file mode 100644
index 00000000..11b31bb0
--- /dev/null
+++ b/blogs/2025/11/17/websocket-io-uring/__next.!KHNpdGUp.blogs.$c$slug.txt
@@ -0,0 +1,4 @@
+1:"$Sreact.fragment"
+2:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+3:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","template":["$","$L3",null,{}]}]]}],"loading":null,"isPartial":false}
diff --git a/blogs/2025/11/17/websocket-io-uring/__next.!KHNpdGUp.blogs.txt b/blogs/2025/11/17/websocket-io-uring/__next.!KHNpdGUp.blogs.txt
new file mode 100644
index 00000000..11b31bb0
--- /dev/null
+++ b/blogs/2025/11/17/websocket-io-uring/__next.!KHNpdGUp.blogs.txt
@@ -0,0 +1,4 @@
+1:"$Sreact.fragment"
+2:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+3:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","template":["$","$L3",null,{}]}]]}],"loading":null,"isPartial":false}
diff --git a/blogs/2025/11/17/websocket-io-uring/__next.!KHNpdGUp.txt b/blogs/2025/11/17/websocket-io-uring/__next.!KHNpdGUp.txt
new file mode 100644
index 00000000..ea3bfa55
--- /dev/null
+++ b/blogs/2025/11/17/websocket-io-uring/__next.!KHNpdGUp.txt
@@ -0,0 +1,9 @@
+1:"$Sreact.fragment"
+2:I[83571,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Header"]
+3:I[29966,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFDropdown"]
+4:I[36330,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFMobileLinks"]
+5:I[22016,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],""]
+6:I[88760,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Logo"]
+7:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+8:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","c",{"children":[[["$","script","script-0",{"src":"/_next/static/chunks/8d86be78428a601a.js","async":true}],["$","script","script-1",{"src":"/_next/static/chunks/da34cc6305706ac6.js","async":true}],["$","script","script-2",{"src":"/_next/static/chunks/9baf65674e2de991.js","async":true}],["$","script","script-3",{"src":"/_next/static/chunks/26b70f9828dd1eb5.js","async":true}],["$","script","script-4",{"src":"/_next/static/chunks/adeed83 [...]
diff --git a/blogs/2025/11/17/websocket-io-uring/__next._full.txt b/blogs/2025/11/17/websocket-io-uring/__next._full.txt
new file mode 100644
index 00000000..a39f33fe
--- /dev/null
+++ b/blogs/2025/11/17/websocket-io-uring/__next._full.txt
@@ -0,0 +1,278 @@
+1:"$Sreact.fragment"
+2:I[17751,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js"],"RootProvider"]
+3:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+4:I[58298,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/5a37d4cb1abe17d7.js"],"default"]
+5:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+6:I[83571,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Header"]
+7:I[29966,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFDropdown"]
+8:I[36330,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFMobileLinks"]
+9:I[22016,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],""]
+a:I[88760,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Logo"]
+11:I[68027,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+:HL["/_next/static/chunks/32a0415c8ab1bd26.css","style"]
+:HL["/_next/static/media/GeistMono_Variable.p.2f937313.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+:HL["/_next/static/media/Geist_Variable-s.p.92592eb2.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+0:{"P":null,"b":"uBHgltRE2s5QA49x61S_u","c":["","blogs","2025","11","17","websocket-io-uring",""],"q":"","i":false,"f":[[["",{"children":["(site)",{"children":["blogs",{"children":[["slug","2025/11/17/websocket-io-uring","c"],{"children":["__PAGE__",{}]}]}]}]},"$undefined","$undefined",true],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/32a0415c8ab1bd26.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script" [...]
+13:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"OutletBoundary"]
+14:"$Sreact.suspense"
+16:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"ViewportBoundary"]
+18:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"MetadataBoundary"]
+b:["$","h1",null,{"className":"next-error-h1","style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:1:props:style","children":404}]
+c:["$","div",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:style","children":["$","h2",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style","children":"This page could not be found."}]}]
+d:["$","$1","c",{"children":[null,["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}]
+e:["$","$1","c",{"children":[null,["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}]
+f:["$","$1","c",{"children":["$L12",[["$","script","script-0",{"src":"/_next/static/chunks/00b00679782d0ffd.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/3562882a488c4fbb.js","async":true,"nonce":"$undefined"}]],["$","$L13",null,{"children":["$","$14",null,{"name":"Next.MetadataOutlet","children":"$@15"}]}]]}]
+10:["$","$1","h",{"children":[null,["$","$L16",null,{"children":"$L17"}],["$","div",null,{"hidden":true,"children":["$","$L18",null,{"children":["$","$14",null,{"name":"Next.Metadata","children":"$L19"}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}]
+1a:I[47873,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"default"]
+12:["$","main",null,{"className":"min-h-screen px-6 py-16 md:px-12","children":["$","article",null,{"className":"mx-auto max-w-5xl","children":[["$","header",null,{"className":"mb-10","children":[["$","time",null,{"className":"text-sm font-medium text-fd-muted-foreground","children":"November 17, 2025"}],["$","h1",null,{"className":"mt-3 text-3xl font-extrabold tracking-tight text-fd-foreground md:text-5xl","children":"Building WebSocket Protocol in Apache Iggy using io_uring and Complet [...]
+8e:I[44324,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"CodeBlock"]
+95:I[35250,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"Mermaid"]
+a0:I[44324,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"Pre"]
+a1:I[24110,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"Image"]
+1b:["$","code",null,{"children":"compio"}]
+1c:["$","hr",null,{}]
+1d:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"understanding-the-architectural-divide-poll-vs-completion","children":[["$","a",null,{"data-card":"","href":"#understanding-the-architectural-divide-poll-vs-completion","className":"peer","children":"Understanding the architectural divide (poll vs completion)"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"cur [...]
+1e:["$","p",null,{"children":"Let's see why poll-based libraries can't easily work with completion based runtimes by examining the traits of compio, tungstenite."}]
+8f:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+20:["$","p",null,{"children":"The Read trait assumes you borrow a buffer. Compio's AsyncRead needs to take ownership of the buffer, submit it to the kernel, and return it later."}]
+91:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+22:["$","p",null,{"children":"There's no way to make this work directly with compio's owned-buffer model. The abstractions are fundamentally incompatible."}]
+23:["$","p",null,{"children":["When we need to add WebSocket support, we can't just drop in tokio-tungstenite, which uses ",["$","code",null,{"children":"future_util::io::AsyncRead"}]," trait. We need an adapter that:"]}]
+24:["$","ul",null,{"children":["\n",["$","li",null,{"children":"Works with compio's owned-buffer async I/O"}],"\n",["$","li",null,{"children":"Presents synchronous Read/Write traits to tungstenite"}],"\n",["$","li",null,{"children":"Efficiently bridges sync and async world"}],"\n"]}]
+25:["$","hr",null,{}]
+26:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"challenge-with-tungstenite","children":[["$","a",null,{"data-card":"","href":"#challenge-with-tungstenite","className":"peer","children":"Challenge with Tungstenite"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide [...]
+27:["$","p",null,{"children":"Tungstenite is the de-facto Rust WebSocket protocol implementation. It handles all the WebSocket protocol logic:"}]
+28:["$","ul",null,{"children":["\n",["$","li",null,{"children":"Frame parsing and generation"}],"\n",["$","li",null,{"children":"Message fragmentation"}],"\n",["$","li",null,{"children":"Control frames (ping, pong, close)"}],"\n",["$","li",null,{"children":"Protocol violations and error handling"}],"\n",["$","li",null,{"children":"Text encoding validation"}],"\n"]}]
+29:["$","p",null,{"children":"Our initial thought was to contribute to async-tungstenite, which provides runtime-agnostic WebSocket support. It has adapters for multiple async runtimes through a trait-based abstraction. But as we dug deeper into adapting it for compio we realized a fundamental incompatibility"}]
+2a:["$","p",null,{"children":"The realization: async-tungstenite is strongly coupled to poll-based IO"}]
+2b:["$","p",null,{"children":"The incompatibility becomes clear when we examine the AsyncRead traits of compio and Future's AsyncRead"}]
+93:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+2d:["$","p",null,{"children":"These are fundamentally different programming models that don't compose cleanly."}]
+2e:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"decision-a-separate-crate","children":[["$","a",null,{"data-card":"","href":"#decision-a-separate-crate","className":"peer","children":"Decision: A separate crate"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide l [...]
+2f:["$","p",null,{"children":["After realizing the incompatibility, we've decided to create ",["$","code",null,{"children":"compio-ws"}]," as a standalone crate. The architecture would be:"]}]
+30:["$","$L95",null,{"chart":"graph TD\n A[Application Code] --> B[compio-ws]\n B --> C[Tungstenite]\n C --> D[GrowableSyncStream]\n D --> E[Compio Runtime]"}]
+31:["$","p",null,{"children":"The key insight: we need a bridge layer that provides synchronous Read/Write traits to tungstenite while internally using compio's async owned-buffer I/O."}]
+32:["$","hr",null,{}]
+33:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"first-attempt-syncstream","children":[["$","a",null,{"data-card":"","href":"#first-attempt-syncstream","className":"peer","children":["First Attempt: ",["$","code",null,{"children":"SyncStream"}]]}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejo [...]
+34:["$","p",null,{"children":["Compio already provides ",["$","code",null,{"children":"SyncStream"}]," in the ",["$","code",null,{"children":"compio-io::compat"}]," module specifically for interoperating with libraries that expect synchronous I/O traits. It's a clever structure that maintains internal buffers to bridge the async/sync boundary:"]}]
+96:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+36:["$","p",null,{"children":["The default ",["$","code",null,{"children":"DEFAULT_BUF_SIZE"}]," is 8KB, but you can specify any capacity you want. Once created, the buffer capacity is fixed. It never grows. This can be a problem, which we will discuss below, read along."]}]
+37:["$","p",null,{"children":"Here's how it works:"}]
+38:["$","p",null,{"children":"Reading (sync to async):"}]
+98:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+3a:["$","p",null,{"children":"Writing (sync to async):"}]
+9a:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+3c:["$","p",null,{"children":"The pattern is:"}]
+3d:["$","ul",null,{"children":["\n",["$","li",null,{"children":["Sync ",["$","code",null,{"children":"read()"}],"/",["$","code",null,{"children":"write()"}]," operate on internal buffers"]}],"\n",["$","li",null,{"children":["Return ",["$","code",null,{"children":"WouldBlock"}]," when buffer is empty/full"]}],"\n",["$","li",null,{"children":["Call async ",["$","code",null,{"children":"fill_read_buf()"}],"/",["$","code",null,{"children":"flush_write_buf()"}]," to service buffers"]}],"\n",[ [...]
+3e:["$","p",null,{"children":"This allows tungstenite to work with compio streams:"}]
+9c:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+40:["$","hr",null,{}]
+41:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"the-problem-with-fixed-buffer-size-in-syncstream","children":[["$","a",null,{"data-card":"","href":"#the-problem-with-fixed-buffer-size-in-syncstream","className":"peer","children":["The problem with fixed buffer size in ",["$","code",null,{"children":"SyncStream"}]]}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","strok [...]
+42:["$","p",null,{"children":"The initial implementation worked perfectly for messages smaller than the buffer. WebSocket handshakes completed, ping/pong frames exchanged, text messages flowed. Everything seemed fine."}]
+43:["$","p",null,{"children":"Then we tested with larger messages, and the performance collapsed."}]
+44:["$","p",null,{"children":"The Problem Scenario: Sending a 16MB binary message through WebSocket with the default 8KB SyncStream buffer:"}]
+45:["$","p",null,{"children":"Here's what happens inside:"}]
+46:["$","$L95",null,{"chart":"graph TD\n A[16MB Message] --> B[Tungstenite frames it]\n B --> C[SyncStream write with chunks]\n C --> D[8KB buffer - fixed capacity]\n D --> E[Write 8KB → WouldBlock → flush]\n E -->|repeat| D\n D --> F[2048 round trips total]"}]
+47:["$","p",null,{"children":"The measurements were bad:"}]
+48:["$","ul",null,{"children":["\n",["$","li",null,{"children":"Time: Over 100 seconds to send 16MB"}],"\n",["$","li",null,{"children":"Memory: Excessive allocations from repeated buffer handling. At times this lead to the websocket process being OOM killed by the OS."}],"\n"]}]
+49:["$","p",null,{"children":["Each ",["$","code",null,{"children":"WouldBlock"}]," -> async call -> retry cycle involved:"]}]
+4a:["$","ul",null,{"children":["\n",["$","li",null,{"children":"Saving state in tungstenite"}],"\n",["$","li",null,{"children":"Suspending the sync call"}],"\n",["$","li",null,{"children":"Executing async flush"}],"\n",["$","li",null,{"children":"Resuming the sync call"}],"\n"]}]
+4b:["$","p",null,{"children":["The sync trait contract requires immediate success or ",["$","code",null,{"children":"WouldBlock"}],". There's no way to say \"I need a bigger buffer\" or \"give me partial progress while I grow the buffer.\" Each ",["$","code",null,{"children":"WouldBlock"}]," forces a complete async round trip."]}]
+4c:["$","p",null,{"children":["We tried the obvious fix of increasing the ",["$","code",null,{"children":"SyncStream"}]," buffer size to 1MB. Which worked perfectly and compio-ws passed all tests in the standard autobahn testsuite. But this solution is still fragile when the user doesn't know the peak memory usage of their workload and this can lead to overprovisioning and wastage of server resources."]}]
+4d:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"the-solution-growablesyncstream","children":[["$","a",null,{"data-card":"","href":"#the-solution-growablesyncstream","className":"peer","children":["The Solution: ",["$","code",null,{"children":"GrowableSyncStream"}]]}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap": [...]
+4e:["$","p",null,{"children":"Design goals:"}]
+4f:["$","ul",null,{"children":["\n",["$","li",null,{"children":"Dynamic growth: Buffers start small and grow as needed"}],"\n",["$","li",null,{"children":"Bounded maximum: Prevent memory exhaustion with configurable limits"}],"\n",["$","li",null,{"children":"Automatic shrinking: Return to base capacity based on a threshold"}],"\n",["$","li",null,{"children":["Minimal round trips: Handle large messages without constant ",["$","code",null,{"children":"WouldBlock"}]]}],"\n"]}]
+50:["$","p",null,{"children":"Architecture Overview:"}]
+9e:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+52:["$","p",null,{"children":"Buffer growth strategy:"}]
+53:["$","ul",null,{"children":["\n",["$","li",null,{"children":"Start with a small sized buffer (128 KB matching tungstenite default buffer size)"}],"\n",["$","li",null,{"children":["Grow in predictable increments of ",["$","code",null,{"children":"base_capacity"}]," sized chunks"]}],"\n",["$","li",null,{"children":"Cap growth at reasonable limit (64MB default)"}],"\n",["$","li",null,{"children":["Shrink back to ",["$","code",null,{"children":"base_capacity"}]," when all data is consumed [...]
+54:["$","p",null,{"children":"Key operations:"}]
+55:["$","p",null,{"children":"Read path:"}]
+56:["$","ul",null,{"children":["\n",["$","li",null,{"children":"Compacts buffer when needed (moves unread data to front)"}],"\n",["$","li",null,{"children":["Grows in ",["$","code",null,{"children":"base_capacity"}]," increments during ",["$","code",null,{"children":"fill_read_buf()"}]]}],"\n",["$","li",null,{"children":"Shrinks back to base when all data consumed and buffer > 4× base"}],"\n"]}]
+57:["$","p",null,{"children":"Write path:"}]
+58:["$","ul",null,{"children":["\n",["$","li",null,{"children":[["$","code",null,{"children":"Vec::extend_from_slice"}]," handles growth automatically up to ",["$","code",null,{"children":"max_buffer_size"}]]}],"\n",["$","li",null,{"children":["Returns ",["$","code",null,{"children":"WouldBlock"}]," only when approaching max limit"]}],"\n",["$","li",null,{"children":[["$","code",null,{"children":"flush_write_buf()"}]," handles progressive flushing and shrinks back to base"]}],"\n"]}]
+59:["$","p",null,{"children":["With these changes compio-ws successfully passes the all the tests in ",["$","code",null,{"children":"autobahn-testsuite"}]," that ",["$","code",null,{"children":"tokio-tungstenite"}]," passes."]}]
+5a:["$","hr",null,{}]
+5b:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"benchmarks","children":[["$","a",null,{"data-card":"","href":"#benchmarks","className":"peer","children":"Benchmarks"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-for [...]
+5c:["$","h3",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"benchmark-methodology","children":[["$","a",null,{"data-card":"","href":"#benchmark-methodology","className":"peer","children":"Benchmark Methodology"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link si [...]
+5d:["$","p",null,{"children":"To understand the real-world performance characteristics of compio-ws, we ran Apache Iggy's pinned producer benchmark and pinned consumer benchmark"}]
+5e:["$","p",null,{"children":"The following benchmarks are run using AWS i3en.3xlarge instance using 24.04 Ubuntu OS."}]
+5f:["$","p",null,{"children":["$","strong",null,{"children":"Hardware Specifications:"}]}]
+60:["$","ul",null,{"children":["\n",["$","li",null,{"children":[["$","strong",null,{"children":"CPU:"}]," Intel Xeon Platinum 8259CL @ 2.50GHz (Cascade Lake)"]}],"\n",["$","li",null,{"children":[["$","strong",null,{"children":"Cores:"}]," 6 physical cores with hyperthreading (12 vCPUs total)"]}],"\n",["$","li",null,{"children":[["$","strong",null,{"children":"Cache:"}]," 36 MB L3 cache"]}],"\n",["$","li",null,{"children":[["$","strong",null,{"children":"Memory:"}]," 96 GB RAM"]}],"\n",[" [...]
+61:["$","p",null,{"children":"Common benchmark setting used:"}]
+62:["$","ul",null,{"children":["\n",["$","li",null,{"children":["enable fsync and fsync every single message (",["$","code",null,{"children":"export IGGY_SYSTEM_PARTITION_ENFORCE_FSYNC=true"}]," and ",["$","code",null,{"children":"export IGGY_SYSTEM_PARTITION_MESSAGES_REQUIRED_TO_SAVE=1"}],")"]}],"\n",["$","li",null,{"children":"Use huge pages in linux."}],"\n"]}]
+63:["$","$L8e",null,{"className":"shiki shiki-themes github-light github-dark","style":{"--shiki-light":"#24292e","--shiki-dark":"#e1e4e8","--shiki-light-bg":"#fff","--shiki-dark-bg":"#24292e"},"tabIndex":"0","icon":"<svg viewBox=\"0 0 24 24\"><path d=\"M 6,1 C 4.354992,1 3,2.354992 3,4 v 16 c 0,1.645008 1.354992,3 3,3 h 12 c 1.645008,0 3,-1.354992 3,-3 V 8 7 A 1.0001,1.0001 0 0 0 20.707031,6.2929687 l -5,-5 A 1.0001,1.0001 0 0 0 15,1 h -1 z m 0,2 h 7 v 3 c 0,1.645008 1.354992,3 3,3 h 3 [...]
+64:["$","p",null,{"children":"Workload characteristics:"}]
+65:["$","ul",null,{"children":["\n",["$","li",null,{"children":"4 Producers (one per CPU core)"}],"\n",["$","li",null,{"children":"4 Streams, 1 Topic per Stream, 1 Partition per Topic"}],"\n",["$","li",null,{"children":"1000 messages per batch"}],"\n",["$","li",null,{"children":"40,000 batches"}],"\n",["$","li",null,{"children":"1000 bytes per message"}],"\n",["$","li",null,{"children":"Total: 40M messages, 40GB of data"}],"\n"]}]
+66:["$","p",null,{"children":"We compared two scenarios:"}]
+67:["$","ul",null,{"children":["\n",["$","li",null,{"children":"TCP: Direct TCP connection (baseline)"}],"\n",["$","li",null,{"children":"WebSocket: compio-ws with GrowableSyncStream"}],"\n"]}]
+68:["$","h3",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"results-tcp-vs-websocket","children":[["$","a",null,{"data-card":"","href":"#results-tcp-vs-websocket","className":"peer","children":"Results: TCP vs WebSocket"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide luci [...]
+69:["$","div",null,{"className":"relative overflow-auto prose-no-margin my-6","children":["$","table",null,{"children":[["$","thead",null,{"children":["$","tr",null,{"children":[["$","th",null,{"children":"Percentile"}],["$","th",null,{"style":{"textAlign":"right"},"children":"TCP"}],["$","th",null,{"style":{"textAlign":"right"},"children":"WebSocket"}],["$","th",null,{"children":"Difference"}]]}]}],["$","tbody",null,{"children":[["$","tr",null,{"children":[["$","td",null,{"children":"Av [...]
+6a:["$","p",null,{"children":"Benchmark graphs:"}]
+6b:["$","h4",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"tcp","children":[["$","a",null,{"data-card":"","href":"#tcp","className":"peer","children":"TCP"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 tra [...]
+6c:["$","p",null,{"children":["$","$La1",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"image","src":{"src":"/_next/static/media/tcp-1234.445ddcbf.png","width":1600,"height":1200,"blurWidth":8,"blurHeight":6,"blurDataURL":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAGCAYAAAD+Bd/7AAAAc0lEQVR42m2NQQ6DMAwE85g4deI0TempVSVog0D8/0FLYjggwWGktTXaNUQE5xyYGd57peX2s9bCEDk9ztBRuF1Krd1wqLUSK1IJkHuCpAyuUyp8vm/8xx6/0mMoA8apYF4mdK/nNhFjwiN3St5pOQRRYQUpJ0hgr3F1t [...]
+6d:["$","h4",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"websocket","children":[["$","a",null,{"data-card":"","href":"#websocket","className":"peer","children":"WebSocket"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-foregr [...]
+6e:["$","p",null,{"children":["$","$La1",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"image","src":{"src":"/_next/static/media/ws-1234.fbc1ea56.png","width":1600,"height":1200,"blurWidth":8,"blurHeight":6,"blurDataURL":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAGCAYAAAD+Bd/7AAAAbElEQVR42l2NSQqAMAxFe5imSR1wQERxwmHh/S/0tS1C7eKRn+SFKCKCMQYiAmutx2U301pDERnfpLjDSGAwB1JJ8RusMORdfpU5Epaxx32uOLYZ977hWifs84CmKsOLoqxQt92fpkOW5V54AAohR/a+FArJAAAAAElFTk [...]
+6f:["$","hr",null,{}]
+70:["$","p",null,{"children":"Next we look at pinned-consumer benchmark."}]
+71:["$","p",null,{"children":"Workload characteristics:"}]
+72:["$","ul",null,{"children":["\n",["$","li",null,{"children":"4 Consumers (one per CPU core)"}],"\n",["$","li",null,{"children":"4 Streams, 1 Topic per Stream, 1 Partition per Topic"}],"\n",["$","li",null,{"children":"1000 messages per batch"}],"\n",["$","li",null,{"children":"40,000 batches"}],"\n",["$","li",null,{"children":"1000 bytes per message"}],"\n",["$","li",null,{"children":"Total: 40M messages, 40GB of data"}],"\n"]}]
+73:["$","div",null,{"className":"relative overflow-auto prose-no-margin my-6","children":["$","table",null,{"children":[["$","thead",null,{"children":["$","tr",null,{"children":[["$","th",null,{"children":"Percentile"}],["$","th",null,{"style":{"textAlign":"right"},"children":"TCP"}],["$","th",null,{"style":{"textAlign":"right"},"children":"WebSocket"}],["$","th",null,{"children":"Difference"}]]}]}],["$","tbody",null,{"children":[["$","tr",null,{"children":[["$","td",null,{"children":"Av [...]
+74:["$","p",null,{"children":"Benchmark graphs:"}]
+75:["$","h4",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"tcp-1","children":[["$","a",null,{"data-card":"","href":"#tcp-1","className":"peer","children":"TCP"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 [...]
+76:["$","p",null,{"children":["$","$La1",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"image","src":{"src":"/_next/static/media/pc_tcp.c620c51e.png","width":1600,"height":1200,"blurWidth":8,"blurHeight":6,"blurDataURL":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAGCAYAAAD+Bd/7AAAAeklEQVR42l2NWw6DIBBFXQyPGSlEokg7tErS/a/pVjBNGz9O5pFzcwetNYwxICIwc4eIobWBUgrDV7jS/l1oh7X2SNm/+ZOGlCKWeYI8ZpSSIZJwXyOc41PI64IiGdsmqPWFuj/x3gUh+LNidB4+TLgd+BA7bSceu/ABWmJ [...]
+77:["$","h4",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"websocket-1","children":[["$","a",null,{"data-card":"","href":"#websocket-1","className":"peer","children":"WebSocket"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-fo [...]
+78:["$","p",null,{"children":["$","$La1",null,{"sizes":"(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px","alt":"image","src":{"src":"/_next/static/media/pc_ws.aa40a190.png","width":1600,"height":1200,"blurWidth":8,"blurHeight":6,"blurDataURL":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAGCAYAAAD+Bd/7AAAAXUlEQVR42n2NWwqAMAwEe5impsVoGsGi97/XausDFPRjIITZXUdECCGAmcExIu7Um/af9x6OKDThTQ3+CN0tuWviq8VJL5jMYFmRdTxRpJSOCc2GUlbMZXkgMjRhA8mvRyFE1f+bAAAAAElFTkSuQmCC"},"placeholder" [...]
+79:["$","h3",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"analysis","children":[["$","a",null,{"data-card":"","href":"#analysis","className":"peer","children":"Analysis:"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-foregrou [...]
+7a:["$","p",null,{"children":["The results show measurable but ",["$","strong",null,{"children":"reasonable"}]," overhead from the WebSocket layer:"]}]
+7b:["$","p",null,{"children":[["$","strong",null,{"children":"Producer latency:"}]," WebSocket adds ~0.8-1.0ms across most percentiles (30-40% higher than TCP). Even at P9999, we achieve 9.48ms latency - impressive for a durable workload with fsync-per-message enabled."]}]
+7c:["$","p",null,{"children":[["$","strong",null,{"children":"Consumer latency:"}]," WebSocket shows roughly 2× the latency of raw TCP, adding ~0.7-1.0ms. The P9999 of 2.52ms demonstrates consistent performance even at high percentiles."]}]
+7d:["$","p",null,{"children":"Under durability constraints, achieving single-digit millisecond latencies at P9999 for producers and sub-3ms for consumers is quite good."}]
+7e:["$","p",null,{"children":[["$","strong",null,{"children":"Adapter layer cost:"}]," The current implementation uses GrowableSyncStream as a bridge between sync and async I/O models. The buffer grows in linear increments, which can be suboptimal for large messages. However, for this first implementation enabling WebSocket support in a completion-based runtime, the performance is acceptable."]}]
+7f:["$","p",null,{"children":["$","strong",null,{"children":"WebSocket protocol overhead:"}]}]
+80:["$","ul",null,{"children":["\n",["$","li",null,{"children":"WebSocket framing: each message needs frame headers."}],"\n",["$","li",null,{"children":"Masking: XOR operation on payload"}],"\n"]}]
+81:["$","p",null,{"children":[["$","strong",null,{"children":"Tail latency consistency:"}]," GrowableSyncStream maintains roughly proportional overhead even at high percentiles. The P9999 shows larger absolute differences but percentage-wise remains consistent with lower percentiles, indicating predictable behavior under load."]}]
+82:["$","hr",null,{}]
+83:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"future-work","children":[["$","a",null,{"data-card":"","href":"#future-work","className":"peer","children":"Future Work"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted- [...]
+84:["$","ol",null,{"children":["\n",["$","li",null,{"children":["\n",["$","p",null,{"children":"Smarter Buffer Growth"}],"\n",["$","ul",null,{"children":["\n",["$","li",null,{"children":["Current: Linear ",["$","code",null,{"children":"base_capacity"}]," increments"]}],"\n",["$","li",null,{"children":["Better: Exponential growth (like ",["$","code",null,{"children":"Vec::reserve"}],")"]}],"\n",["$","li",null,{"children":"Impact: Reduce reallocation overhead for large messages"}],"\n"]}], [...]
+85:["$","p",null,{"children":["We ",["$","$L1a",null,{"href":"https://github.com/compio-rs/compio/pull/501","children":"contributed"}]," ",["$","code",null,{"children":"compio-ws"}]," to ",["$","code",null,{"children":"compio"}]," and anyone interested in improving ",["$","code",null,{"children":"compio-ws"}]," can contribute to ",["$","code",null,{"children":"compio"}],"."]}]
+86:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"conclusion","children":[["$","a",null,{"data-card":"","href":"#conclusion","className":"peer","children":"Conclusion"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-link size-3.5 shrink-0 text-fd-muted-for [...]
+87:["$","p",null,{"children":[["$","strong",null,{"children":"Current state in Iggy:"}]," WebSocket support is currently implemented with long polling on the consumer side and push-based notifications is planned for future releases. This has different implications for producers and consumers."]}]
+88:["$","p",null,{"children":[["$","strong",null,{"children":"For consumers (receiving messages):"}]," The current long polling implementation means consumers must repeatedly request new messages, even when none are available. This is inefficient, especially for low-power edge clients."]}]
+89:["$","p",null,{"children":[["$","strong",null,{"children":"For producers (sending messages):"}]," WebSocket provides immediate benefits. Instead of establishing new connections or using inefficient long polling, producers can maintain a persistent WebSocket connection and push messages directly to the server. This is particularly valuable for:"]}]
+8a:["$","ul",null,{"children":["\n",["$","li",null,{"children":"Browser-based producers sending events or telemetry"}],"\n",["$","li",null,{"children":"Edge devices reporting sensor data or metrics"}],"\n",["$","li",null,{"children":"Dashboard applications sending commands or configuration updates"}],"\n"]}]
+8b:["$","p",null,{"children":[["$","strong",null,{"children":"What's next:"}]," While compio-ws with GrowableSyncStream enables WebSocket support today, significant optimization potential remains. A native WebSocket implementation designed for owned buffers from the ground up could eliminate the adapter layer overhead and unlock the full performance potential of io_uring's zero-copy capabilities.\nWe invite the Rust community to contribute:"]}]
+8c:["$","ul",null,{"children":["\n",["$","li",null,{"children":[["$","strong",null,{"children":"Optimize"}]," ",["$","code",null,{"children":"GrowableSyncStream"}],": Implement exponential buffer growth and pooling"]}],"\n",["$","li",null,{"children":[["$","strong",null,{"children":"Owned buffer WS protocol implementation:"}]," Build WebSocket from scratch with owned buffers"]}],"\n",["$","li",null,{"children":[["$","strong",null,{"children":"Push-based consumers:"}]," Help implement ser [...]
+8d:["$","footer",null,{"className":"mt-16 border-t border-fd-border pt-8","children":["$","$L9",null,{"href":"/blogs","className":"inline-flex items-center gap-2 text-sm font-medium text-fd-primary transition-colors hover:opacity-80","children":"← Back to all posts"}]}]
+90:["$","$La0",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"},"children":"// The Rust std::io::Read trait (what tungstenite expects)"}]}],"\n",["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F9758 [...]
+92:["$","$La0",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"},"children":"// Tungstenite's WebSocket structure"}]}],"\n",["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struc [...]
+94:["$","$La0",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"},"children":"// Compio's async read - can't be made into a poll-based trait"}]}],"\n",["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"async"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":" [...]
+97:["$","$La0",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" SyncStream"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E [...]
+99:["$","$La0",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"impl"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"<"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"S"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children": [...]
+9b:["$","$La0",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"impl"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"<"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"S"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children": [...]
+9d:["$","$La0",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"let"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" stream "}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"="}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"chil [...]
+9f:["$","$La0",null,{"children":["$","code",null,{"children":[["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" struct"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" GrowableSyncStream"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark" [...]
+a2:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":") "}]
+a3:["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"->"}]
+a4:["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" BufResult"}]
+a5:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"<"}]
+a6:["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"usize"}]
+a7:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":", "}]
+a8:["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"B"}]
+a9:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":">;"}]
+aa:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"},"children":" // ^"}]}]
+ab:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"},"children":" // Owned buffer - kernel owns it temporarily"}]}]
+ac:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"}"}]}]
+ad:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"}"}]}]
+ae:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"]) "}]
+af:["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"->"}]
+b0:["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Poll"}]
+b1:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"<io"}]
+b2:["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"::"}]
+b3:["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"Result"}]
+b4:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"<"}]
+b5:["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"usize"}]
+b6:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":">>;"}]
+b7:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"},"children":"// Borrowed buffer ^^^^"}]}]
+b8:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" {"}]
+b9:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" Self"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"::"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"with_capacity"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"("}],["$","span",null,{"style":{"--shi [...]
+ba:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" }"}]}]
+bb:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"}"}]}]
+bc:["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":"self"}]
+bd:["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"."}]
+be:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"eof {"}]
+bf:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"},"children":" // No data available - need to fill from async stream"}]}]
+c0:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" return"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Err"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"("}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"io"}],["$","span",null,{"style":{"--shiki- [...]
+c1:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" io"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"::"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"ErrorKind"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"::"}],["$","span",null,{"style":{"-- [...]
+c2:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},"children":" \"need to fill the read buffer\""}]}]
+c3:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" ));"}]}]
+c4:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" }"}]}]
+c5:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" "}]}]
+c6:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"},"children":" // Copy from internal buffer to caller's buffer"}]}]
+c7:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" let"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" to_read "}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"="}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" available"}],["$","span",null,{"style":{"-- [...]
+c8:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" buf["}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":".."}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"to_read]"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"."}],["$","span",null,{"style":{"--shiki-li [...]
+c9:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" self"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"."}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"read_buffer"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"."}],["$","span",null,{"style":{"--shiki- [...]
+ca:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" "}]}]
+cb:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Ok"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"(to_read)"}]]}]
+cc:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" }"}]}]
+cd:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"}"}]}]
+ce:["$","span",null,{"className":"line"}]
+cf:["$","span",null,{"className":"line"}]
+d0:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"impl"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"<"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"S"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1", [...]
+d1:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" async"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" fn"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" fill_read_buf"}],["$","span",null,{"style":{"--s [...]
+d2:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"},"children":" // Async operation to fill the internal buffer"}]}]
+d3:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" let"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" len "}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"="}],["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" self"}],["$","span",null,{"style":{"--shiki-lig [...]
+d4:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" ."}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"with"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"("}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"|"}],["$","span",null,{"style":{"--shiki-light" [...]
+d5:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" let"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" len "}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"="}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" b"}],["$","span",null,{"style":{"--shik [...]
+d6:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" let"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" b "}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"="}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" b"}],["$","span",null,{"style":{"--shiki- [...]
+d7:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" self"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"."}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"stream"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"."}],["$","span",null,{"style":{"--shi [...]
+d8:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" })"}]}]
+d9:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" .await?"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":";"}]]}]
+da:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" "}]}]
+db:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" if"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" len "}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"=="}],["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" 0"}],["$","span",null,{"style":{"--shiki-light" [...]
+dc:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" self"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"."}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"eof "}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"="}],["$","span",null,{"style":{"--shiki-lig [...]
+dd:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" }"}]}]
+de:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Ok"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"(len)"}]]}]
+df:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" }"}]}]
+e0:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"}"}]}]
+e1:["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"::"}]
+e2:["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"ErrorKind"}]
+e3:["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"::"}]
+e4:["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"WouldBlock"}]
+e5:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":","}]
+e6:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},"children":" \"need to flush the write buffer\""}]}]
+e7:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" ));"}]}]
+e8:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" }"}]}]
+e9:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" "}]}]
+ea:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"},"children":" // Copy into internal buffer"}]}]
+eb:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" let"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" len "}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"="}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" buf"}],["$","span",null,{"style":{"--shiki-ligh [...]
+ec:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"},"children":" // ... copy data ..."}]}]
+ed:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Ok"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"(len)"}]]}]
+ee:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" }"}]}]
+ef:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" "}]}]
+f0:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" fn"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" flush"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"("}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"&mut"}],["$","span",null,{"style":{"--shiki-light":" [...]
+f1:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"},"children":" // Just return Ok - actual flushing happens in flush_write_buf"}]}]
+f2:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Ok"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"(())"}]]}]
+f3:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" }"}]}]
+f4:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"}"}]}]
+f5:["$","span",null,{"className":"line"}]
+f6:["$","span",null,{"className":"line"}]
+f7:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"impl"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"<"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"S"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1", [...]
+f8:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" pub"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" async"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" fn"}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" flush_write_buf"}],["$","span",null,{"style":{"- [...]
+f9:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"},"children":" // Async operation to flush the internal buffer"}]}]
+fa:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" let"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" len "}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"="}],["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" self"}],["$","span",null,{"style":{"--shiki-lig [...]
+fb:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},"children":" self"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"."}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"stream"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"."}],["$","span",null,{"style":{"--shiki-light [...]
+fc:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Ok"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"(len)"}]]}]
+fd:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" }"}]}]
+fe:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"}"}]}]
+ff:["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"Error"}]
+100:["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"::"}]
+101:["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"Io"}]
+102:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"(e)) "}]
+103:["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"if"}]
+104:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" e"}]
+105:["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"."}]
+106:["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"kind"}]
+107:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"() "}]
+108:["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"=="}]
+109:["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" ErrorKind"}]
+10a:["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"::"}]
+10b:["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"WouldBlock"}]
+10c:["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" =>"}]
+10d:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" {"}]
+10e:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"},"children":" // Need to fill the read buffer"}]}]
+10f:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" websocket"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"."}],["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":"get_mut"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"()"}],["$","span",null,{"style":{"- [...]
+110:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" continue"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":";"}]]}]
+111:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" }"}]}]
+112:["$","span",null,{"className":"line","children":[["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" Err"}],["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"(e) "}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":"=>"}],["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":" return"}],["$","span",null,{"style":{"--shiki- [...]
+113:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":" }"}]}]
+114:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"}"}]}]
+115:["$","span",null,{"style":{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},"children":":"}]
+116:["$","span",null,{"style":{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},"children":" usize"}]
+117:["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":", "}]
+118:["$","span",null,{"style":{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"},"children":"// Maximum size (default: 64MB)"}]
+119:["$","span",null,{"className":"line","children":["$","span",null,{"style":{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},"children":"}"}]}]
+17:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
+11a:I[27201,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"IconMark"]
+15:null
+19:[["$","title","0",{"children":"Building WebSocket Protocol in Apache Iggy using io_uring and Completion Based I/O Architecture | Apache Iggy"}],["$","link","1",{"rel":"icon","href":"/img/favicon.png"}],["$","$L11a","2",{}]]
diff --git a/blogs/2025/11/17/websocket-io-uring/__next._head.txt b/blogs/2025/11/17/websocket-io-uring/__next._head.txt
new file mode 100644
index 00000000..8147f735
--- /dev/null
+++ b/blogs/2025/11/17/websocket-io-uring/__next._head.txt
@@ -0,0 +1,6 @@
+1:"$Sreact.fragment"
+2:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"ViewportBoundary"]
+3:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"MetadataBoundary"]
+4:"$Sreact.suspense"
+5:I[27201,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"IconMark"]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","h",{"children":[null,["$","$L2",null,{"children":[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]}],["$","div",null,{"hidden":true,"children":["$","$L3",null,{"children":["$","$4",null,{"name":"Next.Metadata","children":[["$","title","0",{"children":"Building WebSocket Protocol in Apache Iggy using io_uring and Completion Based I/O Architecture | Apache Iggy"}] [...]
diff --git a/blogs/2025/11/17/websocket-io-uring/__next._index.txt b/blogs/2025/11/17/websocket-io-uring/__next._index.txt
new file mode 100644
index 00000000..fd02bd95
--- /dev/null
+++ b/blogs/2025/11/17/websocket-io-uring/__next._index.txt
@@ -0,0 +1,7 @@
+1:"$Sreact.fragment"
+2:I[17751,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js"],"RootProvider"]
+3:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+4:I[58298,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/5a37d4cb1abe17d7.js"],"default"]
+5:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+:HL["/_next/static/chunks/32a0415c8ab1bd26.css","style"]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","rsc":["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/32a0415c8ab1bd26.css","precedence":"next"}],["$","script","script-0",{"src":"/_next/static/chunks/9ebd3a84bf60af84.js","async":true}],["$","script","script-1",{"src":"/_next/static/chunks/78b5f2e7b839e72f.js","async":true}]],["$","html",null,{"lang":"en","className":"geistsans_d5a4f12f-module__Ur3q_a__variable geistmono_157ca88a-module__iaM1Ya__variable" [...]
diff --git a/blogs/2025/11/17/websocket-io-uring/__next._tree.txt b/blogs/2025/11/17/websocket-io-uring/__next._tree.txt
new file mode 100644
index 00000000..4955b518
--- /dev/null
+++ b/blogs/2025/11/17/websocket-io-uring/__next._tree.txt
@@ -0,0 +1,4 @@
+:HL["/_next/static/chunks/32a0415c8ab1bd26.css","style"]
+:HL["/_next/static/media/GeistMono_Variable.p.2f937313.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+:HL["/_next/static/media/Geist_Variable-s.p.92592eb2.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+0:{"buildId":"uBHgltRE2s5QA49x61S_u","tree":{"name":"","paramType":null,"paramKey":"","hasRuntimePrefetch":false,"slots":{"children":{"name":"(site)","paramType":null,"paramKey":"(site)","hasRuntimePrefetch":false,"slots":{"children":{"name":"blogs","paramType":null,"paramKey":"blogs","hasRuntimePrefetch":false,"slots":{"children":{"name":"slug","paramType":"c","paramKey":"2025/11/17/websocket-io-uring","hasRuntimePrefetch":false,"slots":{"children":{"name":"__PAGE__","paramType":null,"p [...]
diff --git a/blogs/2025/11/17/websocket-io-uring/index.html b/blogs/2025/11/17/websocket-io-uring/index.html
new file mode 100644
index 00000000..afe95b53
--- /dev/null
+++ b/blogs/2025/11/17/websocket-io-uring/index.html
@@ -0,0 +1,366 @@
+<!DOCTYPE html><!--uBHgltRE2s5QA49x61S_u--><html lang="en" class="geistsans_d5a4f12f-module__Ur3q_a__variable geistmono_157ca88a-module__iaM1Ya__variable"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" href="/_next/static/media/GeistMono_Variable.p.2f937313.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="preload" href="/_next/static/media/Geist_Variable-s.p.92592eb2.woff2" as="font" crossorigin="" type=" [...]
+<p>In our <a href="https://iggy.apache.org/blogs/2025/08/10/release-0.5.0" rel="noreferrer noopener" target="_blank">0.5.0 release blog post</a>, we announced that work was underway on a complete rewrite of Apache Iggy's core architecture using io_uring with a thread-per-core, shared nothing design. This architectural redesign aims to further improve performance, reduce tail latecies and lower resource usage by <strong>leveraging io_uring's completion based I/O model</strong>.</p>
+<p>As part of this rewrite, we migrated from Tokio to <a href="https://github.com/compio-rs/compio" rel="noreferrer noopener" target="_blank">compio</a>, a completion-based async runtime that allows us to better utilize io_uring capabilities. However, it also presents different challenges when integrating with the wider Rust ecosystem.</p>
+<p>We came across one such challenge when we needed to add WebSocket support to Iggy server. WebSockets are useful for browser clients and streaming dashboards. The Rust ecosystem has excellent WebSocket libraries like <a href="https://github.com/snapview/tungstenite-rs" rel="noreferrer noopener" target="_blank">tungstenite</a> and <a href="https://github.com/snapview/tokio-tungstenite" rel="noreferrer noopener" target="_blank">tokio-tungstenite</a> but they are made when poll-based IO w [...]
+<p>Here we describe our journey of building compio-ws, a WebSocket implementation for the compio async runtime, and the engineering challenges we faced bridging two fundamentally different I/O models and it finally lead to us <a href="https://github.com/compio-rs/compio/pull/501" rel="noreferrer noopener" target="_blank">contributing</a> to <code>compio</code>.</p>
+<hr/>
+<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="understanding-the-architectural-divide-poll-vs-completion"><a data-card="" href="#understanding-the-architectural-divide-poll-vs-completion" class="peer">Understanding the architectural divide (poll vs completion)</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link size-3. [...]
+<p>Let's see why poll-based libraries can't easily work with completion based runtimes by examining the traits of compio, tungstenite.</p>
+<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-3 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-c [...]
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">pub</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> trait</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Read</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> fn</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> read</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&mut</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> self</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, buf</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</ [...]
+<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"> // ^^^^^^^^^^</span></span>
+<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"> // Mutable borrow - caller owns buffer</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
+<span class="line"></span>
+<span class="line"></span>
+<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">// What compio needs</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">pub</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> trait</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> AsyncRead</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> async</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> fn</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> read</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"><</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">B</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> IoBufMut< [...]
+<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"> // ^</span></span>
+<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"> // Owned buffer - kernel owns it temporarily</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre></div></figure>
+<p>The Read trait assumes you borrow a buffer. Compio's AsyncRead needs to take ownership of the buffer, submit it to the kernel, and return it later.</p>
+<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-3 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-c [...]
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">pub</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> struct</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> WebSocket</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"><</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">Stream</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">> {</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> socket</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Stream</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">// Expects Stream: Read + Write</span></span>
+<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"> // ... internal state</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
+<span class="line"></span>
+<span class="line"></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">impl</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"><</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">Stream</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Read</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> +</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Write</sp [...]
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> fn</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> read</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&mut</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> self</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) </ [...]
+<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"> // Calls self.socket.read(&mut buf) internally</span></span>
+<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"> // Expects to borrow buffers, not own them</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> }</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre></div></figure>
+<p>There's no way to make this work directly with compio's owned-buffer model. The abstractions are fundamentally incompatible.</p>
+<p>When we need to add WebSocket support, we can't just drop in tokio-tungstenite, which uses <code>future_util::io::AsyncRead</code> trait. We need an adapter that:</p>
+<ul>
+<li>Works with compio's owned-buffer async I/O</li>
+<li>Presents synchronous Read/Write traits to tungstenite</li>
+<li>Efficiently bridges sync and async world</li>
+</ul>
+<hr/>
+<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="challenge-with-tungstenite"><a data-card="" href="#challenge-with-tungstenite" class="peer">Challenge with Tungstenite</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-h [...]
+<p>Tungstenite is the de-facto Rust WebSocket protocol implementation. It handles all the WebSocket protocol logic:</p>
+<ul>
+<li>Frame parsing and generation</li>
+<li>Message fragmentation</li>
+<li>Control frames (ping, pong, close)</li>
+<li>Protocol violations and error handling</li>
+<li>Text encoding validation</li>
+</ul>
+<p>Our initial thought was to contribute to async-tungstenite, which provides runtime-agnostic WebSocket support. It has adapters for multiple async runtimes through a trait-based abstraction. But as we dug deeper into adapting it for compio we realized a fundamental incompatibility</p>
+<p>The realization: async-tungstenite is strongly coupled to poll-based IO</p>
+<p>The incompatibility becomes clear when we examine the AsyncRead traits of compio and Future's AsyncRead</p>
+<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-3 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-c [...]
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">async</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> fn</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> read</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"><</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">B</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> IoBufMut</sp [...]
+<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">// Owned buffer ^^^^</span></span>
+<span class="line"></span>
+<span class="line"></span>
+<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">// Futures' AsyncRead - expects polling with borrowed buffers</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">fn</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> poll_read</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">self</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Pin</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"><</span [...]
+<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">// Borrowed buffer ^^^^</span></span></code></pre></div></figure>
+<p>These are fundamentally different programming models that don't compose cleanly.</p>
+<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="decision-a-separate-crate"><a data-card="" href="#decision-a-separate-crate" class="peer">Decision: A separate crate</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hid [...]
+<p>After realizing the incompatibility, we've decided to create <code>compio-ws</code> as a standalone crate. The architecture would be:</p>
+<!-- -->
+<p>The key insight: we need a bridge layer that provides synchronous Read/Write traits to tungstenite while internally using compio's async owned-buffer I/O.</p>
+<hr/>
+<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="first-attempt-syncstream"><a data-card="" href="#first-attempt-syncstream" class="peer">First Attempt: <code>SyncStream</code></a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100 [...]
+<p>Compio already provides <code>SyncStream</code> in the <code>compio-io::compat</code> module specifically for interoperating with libraries that expect synchronous I/O traits. It's a clever structure that maintains internal buffers to bridge the async/sync boundary:</p>
+<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-3 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-c [...]
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> stream</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> S</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">// The async compio stream</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> eof</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> bool</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> read_buffer</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Buffer</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">// Internal read buffer</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> write_buffer</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Buffer</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">// Internal write buffer </span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
+<span class="line"></span>
+<span class="line"></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">impl</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"><</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">S</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">> </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">SyncStream</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"><</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">S</s [...]
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> fn</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> new</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(stream</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> S</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) </span> [...]
+<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> Self</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">::</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">with_capacity</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">DEFAULT_BUF_SIZE</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, stream)</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> }</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre></div></figure>
+<p>The default <code>DEFAULT_BUF_SIZE</code> is 8KB, but you can specify any capacity you want. Once created, the buffer capacity is fixed. It never grows. This can be a problem, which we will discuss below, read along.</p>
+<p>Here's how it works:</p>
+<p>Reading (sync to async):</p>
+<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-3 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-c [...]
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> fn</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> read</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&mut</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> self</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, buf</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</ [...]
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> let</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> available </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> self</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">.</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">read_buffer</span><span style="--shiki-light:#D73A49;--shiki-dark:#F [...]
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> </span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> available</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">is_empty</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">() </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&&</span><span style="--shiki-light:#D73A49;--shiki-dark: [...]
+<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"> // No data available - need to fill from async stream</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> return</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Err</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">io</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">::</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">Error</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">: [...]
+<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> io</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">::</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">ErrorKind</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">::</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">WouldBlock</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "need to fill the read buffer"</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> ));</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> }</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> </span></span>
+<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"> // Copy from internal buffer to caller's buffer</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> let</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> to_read </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> available</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">len</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8 [...]
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> buf[</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">..</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">to_read]</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">copy_from_slice</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F9 [...]
+<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> self</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">.</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">read_buffer</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">advance</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(to_read);</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> </span></span>
+<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Ok</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(to_read)</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> }</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
+<span class="line"></span>
+<span class="line"></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">impl</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"><</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">S</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> AsyncRead</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">> </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">SyncStr [...]
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> async</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> fn</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> fill_read_buf</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&mut</span><span style="--shiki-light:#005CC5;--shiki-dark:#79 [...]
+<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"> // Async operation to fill the internal buffer</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> let</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> len </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> self</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">.</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">read_buffer</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> .</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">with</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">|</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">b</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">|</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> async</span [...]
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> let</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> len </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> b</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">buf_len</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8 [...]
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> let</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> b </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> b</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">slice</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(l [...]
+<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> self</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">.</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">stream</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">read</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(b)</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583 [...]
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> })</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> .await?</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> </span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> len </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">==</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
+<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> self</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">.</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">eof </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> true</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> }</span></span>
+<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Ok</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(len)</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> }</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre></div></figure>
+<p>Writing (sync to async):</p>
+<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-3 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-c [...]
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> fn</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> write</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&mut</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> self</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, buf</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:< [...]
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> if</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> self</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">.</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">write_buffer</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">need_flush</span><span style="--shiki-light:#24292E;--shiki-dark:#E1 [...]
+<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"> // Buffer full - need async flush</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> return</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Err</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">io</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">::</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">Error</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">: [...]
+<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> io</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">::</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">ErrorKind</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">::</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">WouldBlock</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
+<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "need to flush the write buffer"</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> ));</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> }</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> </span></span>
+<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"> // Copy into internal buffer</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> let</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> len </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> buf</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">len</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">()</span [...]
+<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"> // ... copy data ...</span></span>
+<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Ok</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(len)</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> }</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> </span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> fn</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> flush</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&mut</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> self</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-> [...]
+<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"> // Just return Ok - actual flushing happens in flush_write_buf</span></span>
+<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Ok</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(())</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> }</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
+<span class="line"></span>
+<span class="line"></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">impl</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"><</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">S</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> AsyncWrite</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">> </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">SyncSt [...]
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> pub</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> async</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> fn</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> flush_write_buf</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&mut</span><span style="--shiki-light:#005CC5;--shiki-dark:# [...]
+<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"> // Async operation to flush the internal buffer</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> let</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> len </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> self</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">.</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">write_buffer</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583 [...]
+<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> self</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">.</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">stream</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">flush</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">()</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">.await [...]
+<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Ok</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(len)</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> }</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre></div></figure>
+<p>The pattern is:</p>
+<ul>
+<li>Sync <code>read()</code>/<code>write()</code> operate on internal buffers</li>
+<li>Return <code>WouldBlock</code> when buffer is empty/full</li>
+<li>Call async <code>fill_read_buf()</code>/<code>flush_write_buf()</code> to service buffers</li>
+<li>Retry the sync operation</li>
+</ul>
+<p>This allows tungstenite to work with compio streams:</p>
+<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-3 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-c [...]
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">let</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> sync_stream </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> SyncStream</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">::</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">new</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8" [...]
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">let</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> mut</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> websocket </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> WebSocket</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">::</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">f [...]
+<span class="line"></span>
+<span class="line"></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">loop</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> match</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> websocket</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">read</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">() {</span></span>
+<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Ok</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(msg) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=></span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> process</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(msg),</span></span>
+<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Err</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">Error</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">::</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">Io</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(e)) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">if</spa [...]
+<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"> // Need to fill the read buffer</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> websocket</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">get_mut</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">()</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">fill_read_buf</span><span style="--shiki-light:#24292E;--shiki-da [...]
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> continue</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> }</span></span>
+<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Err</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(e) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=></span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> return</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Err</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(e),</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> }</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre></div></figure>
+<hr/>
+<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="the-problem-with-fixed-buffer-size-in-syncstream"><a data-card="" href="#the-problem-with-fixed-buffer-size-in-syncstream" class="peer">The problem with fixed buffer size in <code>SyncStream</code></a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link size-3.5 shrink-0 text- [...]
+<p>The initial implementation worked perfectly for messages smaller than the buffer. WebSocket handshakes completed, ping/pong frames exchanged, text messages flowed. Everything seemed fine.</p>
+<p>Then we tested with larger messages, and the performance collapsed.</p>
+<p>The Problem Scenario: Sending a 16MB binary message through WebSocket with the default 8KB SyncStream buffer:</p>
+<p>Here's what happens inside:</p>
+<!-- -->
+<p>The measurements were bad:</p>
+<ul>
+<li>Time: Over 100 seconds to send 16MB</li>
+<li>Memory: Excessive allocations from repeated buffer handling. At times this lead to the websocket process being OOM killed by the OS.</li>
+</ul>
+<p>Each <code>WouldBlock</code> -> async call -> retry cycle involved:</p>
+<ul>
+<li>Saving state in tungstenite</li>
+<li>Suspending the sync call</li>
+<li>Executing async flush</li>
+<li>Resuming the sync call</li>
+</ul>
+<p>The sync trait contract requires immediate success or <code>WouldBlock</code>. There's no way to say "I need a bigger buffer" or "give me partial progress while I grow the buffer." Each <code>WouldBlock</code> forces a complete async round trip.</p>
+<p>We tried the obvious fix of increasing the <code>SyncStream</code> buffer size to 1MB. Which worked perfectly and compio-ws passed all tests in the standard autobahn testsuite. But this solution is still fragile when the user doesn't know the peak memory usage of their workload and this can lead to overprovisioning and wastage of server resources.</p>
+<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="the-solution-growablesyncstream"><a data-card="" href="#the-solution-growablesyncstream" class="peer">The Solution: <code>GrowableSyncStream</code></a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity p [...]
+<p>Design goals:</p>
+<ul>
+<li>Dynamic growth: Buffers start small and grow as needed</li>
+<li>Bounded maximum: Prevent memory exhaustion with configurable limits</li>
+<li>Automatic shrinking: Return to base capacity based on a threshold</li>
+<li>Minimal round trips: Handle large messages without constant <code>WouldBlock</code></li>
+</ul>
+<p>Architecture Overview:</p>
+<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-3 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-c [...]
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> inner</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> S</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">// The async compio stream</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> read_buf</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Vec</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"><</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">u8</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">>, </span><span style="--shiki-light:#6A737D;--shiki-dark:#6 [...]
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> read_pos</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> usize</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">// Current read position in buffer</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> write_buf</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Vec</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"><</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">u8</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">>, </span><span style="--shiki-light:#6A737D;--shiki-dark:#6 [...]
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> eof</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> bool</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">// End of stream marker</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> base_capacity</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> usize</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">// Starting capacity (default: 8KB)</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> max_buffer_size</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> usize</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">// Maximum size (default: 64MB)</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre></div></figure>
+<p>Buffer growth strategy:</p>
+<ul>
+<li>Start with a small sized buffer (128 KB matching tungstenite default buffer size)</li>
+<li>Grow in predictable increments of <code>base_capacity</code> sized chunks</li>
+<li>Cap growth at reasonable limit (64MB default)</li>
+<li>Shrink back to <code>base_capacity</code> when all data is consumed and current size > 4x base_capacity</li>
+</ul>
+<p>Key operations:</p>
+<p>Read path:</p>
+<ul>
+<li>Compacts buffer when needed (moves unread data to front)</li>
+<li>Grows in <code>base_capacity</code> increments during <code>fill_read_buf()</code></li>
+<li>Shrinks back to base when all data consumed and buffer > 4× base</li>
+</ul>
+<p>Write path:</p>
+<ul>
+<li><code>Vec::extend_from_slice</code> handles growth automatically up to <code>max_buffer_size</code></li>
+<li>Returns <code>WouldBlock</code> only when approaching max limit</li>
+<li><code>flush_write_buf()</code> handles progressive flushing and shrinks back to base</li>
+</ul>
+<p>With these changes compio-ws successfully passes the all the tests in <code>autobahn-testsuite</code> that <code>tokio-tungstenite</code> passes.</p>
+<hr/>
+<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="benchmarks"><a data-card="" href="#benchmarks" class="peer">Benchmarks</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3 [...]
+<h3 class="flex scroll-m-28 flex-row items-center gap-2" id="benchmark-methodology"><a data-card="" href="#benchmark-methodology" class="peer">Benchmark Methodology</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><p [...]
+<p>To understand the real-world performance characteristics of compio-ws, we ran Apache Iggy's pinned producer benchmark and pinned consumer benchmark</p>
+<p>The following benchmarks are run using AWS i3en.3xlarge instance using 24.04 Ubuntu OS.</p>
+<p><strong>Hardware Specifications:</strong></p>
+<ul>
+<li><strong>CPU:</strong> Intel Xeon Platinum 8259CL @ 2.50GHz (Cascade Lake)</li>
+<li><strong>Cores:</strong> 6 physical cores with hyperthreading (12 vCPUs total)</li>
+<li><strong>Cache:</strong> 36 MB L3 cache</li>
+<li><strong>Memory:</strong> 96 GB RAM</li>
+<li><strong>Storage:</strong> Local NVMe SSD</li>
+</ul>
+<p>Common benchmark setting used:</p>
+<ul>
+<li>enable fsync and fsync every single message (<code>export IGGY_SYSTEM_PARTITION_ENFORCE_FSYNC=true</code> and <code>export IGGY_SYSTEM_PARTITION_MESSAGES_REQUIRED_TO_SAVE=1</code>)</li>
+<li>Use huge pages in linux.</li>
+</ul>
+<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-3 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-c [...]
+<span class="line"><span>sudo sysctl -w vm.dirty_background_ratio=10</span></span>
+<span class="line"><span>sudo sysctl -w vm.dirty_ratio=30</span></span>
+<span class="line"><span>sudo sysctl -w vm.nr_hugepages=2048</span></span>
+<span class="line"><span></span></span>
+<span class="line"><span></span></span>
+<span class="line"><span>export MIMALLOC_ALLOW_LARGE_OS_PAGES=1</span></span>
+<span class="line"><span>export MIMALLOC_RESERVE_HUGE_OS_PAGES=2048</span></span></code></pre></div></figure>
+<p>Workload characteristics:</p>
+<ul>
+<li>4 Producers (one per CPU core)</li>
+<li>4 Streams, 1 Topic per Stream, 1 Partition per Topic</li>
+<li>1000 messages per batch</li>
+<li>40,000 batches</li>
+<li>1000 bytes per message</li>
+<li>Total: 40M messages, 40GB of data</li>
+</ul>
+<p>We compared two scenarios:</p>
+<ul>
+<li>TCP: Direct TCP connection (baseline)</li>
+<li>WebSocket: compio-ws with GrowableSyncStream</li>
+</ul>
+<h3 class="flex scroll-m-28 flex-row items-center gap-2" id="results-tcp-vs-websocket"><a data-card="" href="#results-tcp-vs-websocket" class="peer">Results: TCP vs WebSocket</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden [...]
+<div class="relative overflow-auto prose-no-margin my-6"><table><thead><tr><th>Percentile</th><th style="text-align:right">TCP</th><th style="text-align:right">WebSocket</th><th>Difference</th></tr></thead><tbody><tr><td>Average</td><td style="text-align:right">2.61 ms</td><td style="text-align:right">3.43 ms</td><td>+0.82 ms (31.4% higher)</td></tr><tr><td>Median (P50)</td><td style="text-align:right">2.58 ms</td><td style="text-align:right">3.34 ms</td><td>+0.76 ms (29.5% higher)</td>< [...]
+<p>Benchmark graphs:</p>
+<h4 class="flex scroll-m-28 flex-row items-center gap-2" id="tcp"><a data-card="" href="#tcp" class="peer">TCP</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.0 [...]
+<p><img alt="image" loading="lazy" width="1600" height="1200" decoding="async" data-nimg="1" class="rounded-lg" style="color:transparent;background-size:cover;background-position:50% 50%;background-repeat:no-repeat;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 320 240'%3E%3Cfilter id='b' color-interpolation-filters='sRGB'%3E%3CfeGaussianBlur stdDeviation='20'/%3E%3CfeCol [...]
+<h4 class="flex scroll-m-28 flex-row items-center gap-2" id="websocket"><a data-card="" href="#websocket" class="peer">WebSocket</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a [...]
+<p><img alt="image" loading="lazy" width="1600" height="1200" decoding="async" data-nimg="1" class="rounded-lg" style="color:transparent;background-size:cover;background-position:50% 50%;background-repeat:no-repeat;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 320 240'%3E%3Cfilter id='b' color-interpolation-filters='sRGB'%3E%3CfeGaussianBlur stdDeviation='20'/%3E%3CfeCol [...]
+<hr/>
+<p>Next we look at pinned-consumer benchmark.</p>
+<p>Workload characteristics:</p>
+<ul>
+<li>4 Consumers (one per CPU core)</li>
+<li>4 Streams, 1 Topic per Stream, 1 Partition per Topic</li>
+<li>1000 messages per batch</li>
+<li>40,000 batches</li>
+<li>1000 bytes per message</li>
+<li>Total: 40M messages, 40GB of data</li>
+</ul>
+<div class="relative overflow-auto prose-no-margin my-6"><table><thead><tr><th>Percentile</th><th style="text-align:right">TCP</th><th style="text-align:right">WebSocket</th><th>Difference</th></tr></thead><tbody><tr><td>Average</td><td style="text-align:right">0.70 ms</td><td style="text-align:right">1.44 ms</td><td>+0.74 ms (105.7% higher)</td></tr><tr><td>Median (P50)</td><td style="text-align:right">0.68 ms</td><td style="text-align:right">1.41 ms</td><td>+0.73 ms (107.4% higher)</td [...]
+<p>Benchmark graphs:</p>
+<h4 class="flex scroll-m-28 flex-row items-center gap-2" id="tcp-1"><a data-card="" href="#tcp-1" class="peer">TCP</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07 [...]
+<p><img alt="image" loading="lazy" width="1600" height="1200" decoding="async" data-nimg="1" class="rounded-lg" style="color:transparent;background-size:cover;background-position:50% 50%;background-repeat:no-repeat;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 320 240'%3E%3Cfilter id='b' color-interpolation-filters='sRGB'%3E%3CfeGaussianBlur stdDeviation='20'/%3E%3CfeCol [...]
+<h4 class="flex scroll-m-28 flex-row items-center gap-2" id="websocket-1"><a data-card="" href="#websocket-1" class="peer">WebSocket</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l [...]
+<p><img alt="image" loading="lazy" width="1600" height="1200" decoding="async" data-nimg="1" class="rounded-lg" style="color:transparent;background-size:cover;background-position:50% 50%;background-repeat:no-repeat;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 320 240'%3E%3Cfilter id='b' color-interpolation-filters='sRGB'%3E%3CfeGaussianBlur stdDeviation='20'/%3E%3CfeCol [...]
+<h3 class="flex scroll-m-28 flex-row items-center gap-2" id="analysis"><a data-card="" href="#analysis" class="peer">Analysis:</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 [...]
+<p>The results show measurable but <strong>reasonable</strong> overhead from the WebSocket layer:</p>
+<p><strong>Producer latency:</strong> WebSocket adds ~0.8-1.0ms across most percentiles (30-40% higher than TCP). Even at P9999, we achieve 9.48ms latency - impressive for a durable workload with fsync-per-message enabled.</p>
+<p><strong>Consumer latency:</strong> WebSocket shows roughly 2× the latency of raw TCP, adding ~0.7-1.0ms. The P9999 of 2.52ms demonstrates consistent performance even at high percentiles.</p>
+<p>Under durability constraints, achieving single-digit millisecond latencies at P9999 for producers and sub-3ms for consumers is quite good.</p>
+<p><strong>Adapter layer cost:</strong> The current implementation uses GrowableSyncStream as a bridge between sync and async I/O models. The buffer grows in linear increments, which can be suboptimal for large messages. However, for this first implementation enabling WebSocket support in a completion-based runtime, the performance is acceptable.</p>
+<p><strong>WebSocket protocol overhead:</strong></p>
+<ul>
+<li>WebSocket framing: each message needs frame headers.</li>
+<li>Masking: XOR operation on payload</li>
+</ul>
+<p><strong>Tail latency consistency:</strong> GrowableSyncStream maintains roughly proportional overhead even at high percentiles. The P9999 shows larger absolute differences but percentage-wise remains consistent with lower percentiles, indicating predictable behavior under load.</p>
+<hr/>
+<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="future-work"><a data-card="" href="#future-work" class="peer">Future Work</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.5 [...]
+<ol>
+<li>
+<p>Smarter Buffer Growth</p>
+<ul>
+<li>Current: Linear <code>base_capacity</code> increments</li>
+<li>Better: Exponential growth (like <code>Vec::reserve</code>)</li>
+<li>Impact: Reduce reallocation overhead for large messages</li>
+</ul>
+</li>
+<li>
+<p>Buffer Pooling</p>
+<ul>
+<li>Current: Allocate/deallocate per message</li>
+<li>Better: Per-core buffer pools with object reuse</li>
+<li>Impact: Reduce allocator pressure</li>
+</ul>
+</li>
+<li>
+<p>WebSocket implementation with native owned buffers</p>
+<ul>
+<li>Implement WebSocket protocol directly with owned buffers from scratch.</li>
+<li>Direct integration with compio to use io_uring capabilities.</li>
+<li>Could increase performance significantly.</li>
+<li>This is a significant undertaking due to full RFC compliance.</li>
+</ul>
+</li>
+</ol>
+<p>We <a href="https://github.com/compio-rs/compio/pull/501" rel="noreferrer noopener" target="_blank">contributed</a> <code>compio-ws</code> to <code>compio</code> and anyone interested in improving <code>compio-ws</code> can contribute to <code>compio</code>.</p>
+<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="conclusion"><a data-card="" href="#conclusion" class="peer">Conclusion</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3 [...]
+<p><strong>Current state in Iggy:</strong> WebSocket support is currently implemented with long polling on the consumer side and push-based notifications is planned for future releases. This has different implications for producers and consumers.</p>
+<p><strong>For consumers (receiving messages):</strong> The current long polling implementation means consumers must repeatedly request new messages, even when none are available. This is inefficient, especially for low-power edge clients.</p>
+<p><strong>For producers (sending messages):</strong> WebSocket provides immediate benefits. Instead of establishing new connections or using inefficient long polling, producers can maintain a persistent WebSocket connection and push messages directly to the server. This is particularly valuable for:</p>
+<ul>
+<li>Browser-based producers sending events or telemetry</li>
+<li>Edge devices reporting sensor data or metrics</li>
+<li>Dashboard applications sending commands or configuration updates</li>
+</ul>
+<p><strong>What's next:</strong> While compio-ws with GrowableSyncStream enables WebSocket support today, significant optimization potential remains. A native WebSocket implementation designed for owned buffers from the ground up could eliminate the adapter layer overhead and unlock the full performance potential of io_uring's zero-copy capabilities.
+We invite the Rust community to contribute:</p>
+<ul>
+<li><strong>Optimize</strong> <code>GrowableSyncStream</code>: Implement exponential buffer growth and pooling</li>
+<li><strong>Owned buffer WS protocol implementation:</strong> Build WebSocket from scratch with owned buffers</li>
+<li><strong>Push-based consumers:</strong> Help implement server-push notifications in Iggy</li>
+<li><strong>Edge client libraries:</strong> Create WebSocket SDKs optimized for resource-constrained devices</li>
+</ul></div><footer class="mt-16 border-t border-fd-border pt-8"><a class="inline-flex items-center gap-2 text-sm font-medium text-fd-primary transition-colors hover:opacity-80" href="/blogs/">← Back to all posts</a></footer></article></main><!--$--><!--/$--></main><script src="/_next/static/chunks/922b7f01aa6775a6.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[17751,[\"/_next/static/chu [...]
\ No newline at end of file
diff --git a/blogs/2025/11/17/websocket-io-uring/index.txt b/blogs/2025/11/17/websocket-io-uring/index.txt
new file mode 100644
index 00000000..a39f33fe
--- /dev/null
+++ b/blogs/2025/11/17/websocket-io-uring/index.txt
@@ -0,0 +1,278 @@
+1:"$Sreact.fragment"
+2:I[17751,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js"],"RootProvider"]
+3:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+4:I[58298,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/5a37d4cb1abe17d7.js"],"default"]
+5:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+6:I[83571,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Header"]
+7:I[29966,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFDropdown"]
+8:I[36330,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"ASFMobileLinks"]
+9:I[22016,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],""]
+a:I[88760,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js"],"Logo"]
+11:I[68027,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
+:HL["/_next/static/chunks/32a0415c8ab1bd26.css","style"]
+:HL["/_next/static/media/GeistMono_Variable.p.2f937313.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+:HL["/_next/static/media/Geist_Variable-s.p.92592eb2.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
+0:{"P":null,"b":"uBHgltRE2s5QA49x61S_u","c":["","blogs","2025","11","17","websocket-io-uring",""],"q":"","i":false,"f":[[["",{"children":["(site)",{"children":["blogs",{"children":[["slug","2025/11/17/websocket-io-uring","c"],{"children":["__PAGE__",{}]}]}]}]},"$undefined","$undefined",true],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/32a0415c8ab1bd26.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script" [...]
+13:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"OutletBoundary"]
+14:"$Sreact.suspense"
+16:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"ViewportBoundary"]
+18:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"MetadataBoundary"]
+b:["$","h1",null,{"className":"next-error-h1","style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:1:props:style","children":404}]
+c:["$","div",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:style","children":["$","h2",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style","children":"This page could not be found."}]}]
+d:["$","$1","c",{"children":[null,["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}]
+e:["$","$1","c",{"children":[null,["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}]
+f:["$","$1","c",{"children":["$L12",[["$","script","script-0",{"src":"/_next/static/chunks/00b00679782d0ffd.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/3562882a488c4fbb.js","async":true,"nonce":"$undefined"}]],["$","$L13",null,{"children":["$","$14",null,{"name":"Next.MetadataOutlet","children":"$@15"}]}]]}]
+10:["$","$1","h",{"children":[null,["$","$L16",null,{"children":"$L17"}],["$","div",null,{"hidden":true,"children":["$","$L18",null,{"children":["$","$14",null,{"name":"Next.Metadata","children":"$L19"}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}]
+1a:I[47873,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"default"]
+12:["$","main",null,{"className":"min-h-screen px-6 py-16 md:px-12","children":["$","article",null,{"className":"mx-auto max-w-5xl","children":[["$","header",null,{"className":"mb-10","children":[["$","time",null,{"className":"text-sm font-medium text-fd-muted-foreground","children":"November 17, 2025"}],["$","h1",null,{"className":"mt-3 text-3xl font-extrabold tracking-tight text-fd-foreground md:text-5xl","children":"Building WebSocket Protocol in Apache Iggy using io_uring and Complet [...]
+8e:I[44324,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"CodeBlock"]
+95:I[35250,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"Mermaid"]
+a0:I[44324,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"Pre"]
+a1:I[24110,["/_next/static/chunks/9ebd3a84bf60af84.js","/_next/static/chunks/78b5f2e7b839e72f.js","/_next/static/chunks/8d86be78428a601a.js","/_next/static/chunks/da34cc6305706ac6.js","/_next/static/chunks/9baf65674e2de991.js","/_next/static/chunks/26b70f9828dd1eb5.js","/_next/static/chunks/adeed8304bab826b.js","/_next/static/chunks/00b00679782d0ffd.js","/_next/static/chunks/3562882a488c4fbb.js"],"Image"]
+1b:["$","code",null,{"children":"compio"}]
+1c:["$","hr",null,{}]
+1d:["$","h2",null,{"className":"flex scroll-m-28 flex-row items-center gap-2","id":"understanding-the-architectural-divide-poll-vs-completion","children":[["$","a",null,{"data-card":"","href":"#understanding-the-architectural-divide-poll-vs-completion","className":"peer","children":"Understanding the architectural divide (poll vs completion)"}],["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"cur [...]
+1e:["$","p",null,{"children":"Let's see why poll-based libraries can't easily work with completion based runtimes by examining the traits of compio, tungstenite."}]
+8f:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+20:["$","p",null,{"children":"The Read trait assumes you borrow a buffer. Compio's AsyncRead needs to take ownership of the buffer, submit it to the kernel, and return it later."}]
+91:T1068,<svg viewBox="0 0 24 24"><path d="M23.8346 11.7033l-1.0073-.6236a13.7268 13.7268 0 00-.0283-.2936l.8656-.8069a.3483.3483 0 00-.1154-.578l-1.1066-.414a8.4958 8.4958 0 00-.087-.2856l.6904-.9587a.3462.3462 0 00-.2257-.5446l-1.1663-.1894a9.3574 9.3574 0 00-.1407-.2622l.49-1.0761a.3437.3437 0 00-.0274-.3361.3486.3486 0 00-.3006-.154l-1.1845.0416a6.7444 6.7444 0 00-.1873-.2268l.2723-1.153a.3472.3472 0 00-.417-.4172l-1.1532.2724a14.0183 14.0183 0 00-.2278-.1873l.0415-1.1845a.3442.3442 [...]
+22:["$","p",null,{"children":"There's no way to make this work directly with compio's owned-buffer model. The abstractions are fundamentally incompatible."}]
... 36571 lines suppressed ...