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/01/14 07:34:57 UTC
(iggy-website) branch asf-site updated (5624cf55 -> 0ea10bb5)
This is an automated email from the ASF dual-hosted git repository.
github-bot pushed a change to branch asf-site
in repository https://gitbox.apache.org/repos/asf/iggy-website.git
discard 5624cf55 Deploy website from main branch 502f77de2c53716b1ef91ad9d00aadef47f43bc1
new 0ea10bb5 Deploy website from main branch 567eabbbfaf1785d17aa46fe360484c3f6fadce3
This update added new revisions after undoing existing revisions.
That is to say, some revisions that were in the old version of the
branch are not in the new version. This situation occurs
when a user --force pushes a change and generates a repository
containing something like this:
* -- * -- B -- O -- O -- O (5624cf55)
\
N -- N -- N refs/heads/asf-site (0ea10bb5)
You should already have received notification emails for all of the O
revisions, and so the following emails describe only the N revisions
from the common base, B.
Any revisions marked "omit" are not gone; other references still
refer to them. Any revisions marked "discard" are gone forever.
The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
Summary of changes:
404.html | 2 +-
assets/js/1ccbcc53.e07bbf74.js | 1 +
assets/js/1ccbcc53.fbf47cec.js | 1 -
assets/js/{2edd2ec4.1dd507a6.js => 2edd2ec4.b07d806b.js} | 2 +-
assets/js/363979b1.65efb962.js | 1 -
assets/js/363979b1.b3617742.js | 1 +
assets/js/{46167e1b.c20895e1.js => 46167e1b.5ffdfdf8.js} | 2 +-
assets/js/8a6c01a6.16d131ba.js | 1 -
assets/js/8a6c01a6.639a0c4e.js | 1 +
assets/js/a2ea038e.095c135e.js | 1 -
assets/js/a2ea038e.c09cea3c.js | 1 +
assets/js/d1796fc4.0cd296d9.js | 1 -
assets/js/d1796fc4.af5f7d2c.js | 1 +
assets/js/{runtime~main.faa91a19.js => runtime~main.0a940c88.js} | 2 +-
blogs/2023/12/29/building-message-streaming-in-rust/index.html | 2 +-
.../2024/05/29/one-year-of-building-the-message-streaming/index.html | 2 +-
blogs/2024/10/28/technology-radar-and-currrent-goals/index.html | 2 +-
blogs/2025/02/10/apache-incubator/index.html | 2 +-
blogs/2025/02/17/transparent-benchmarks/index.html | 2 +-
blogs/2025/05/08/zero-copy-deserialization/index.html | 2 +-
blogs/2025/06/06/connectors-runtime/index.html | 2 +-
blogs/2025/08/10/release-0.5.0/index.html | 2 +-
blogs/2025/11/17/websocket-io-uring/index.html | 2 +-
blogs/2025/12/09/release-0.6.0/index.html | 2 +-
blogs/archive/index.html | 2 +-
blogs/authors/index.html | 2 +-
blogs/consumer-identifier/index.html | 2 +-
blogs/iggy-0-1-0-release/index.html | 2 +-
blogs/index.html | 2 +-
blogs/message-expiry/index.html | 2 +-
blogs/message-headers/index.html | 2 +-
blogs/message-state/index.html | 2 +-
blogs/page/2/index.html | 2 +-
blogs/personal-access-tokens/index.html | 2 +-
blogs/tags/0-5-0/index.html | 2 +-
blogs/tags/0-6-0/index.html | 2 +-
blogs/tags/announcement/index.html | 2 +-
blogs/tags/async/index.html | 2 +-
blogs/tags/breaking-changes/index.html | 2 +-
blogs/tags/compio/index.html | 2 +-
blogs/tags/consumers/index.html | 2 +-
blogs/tags/hello/index.html | 2 +-
blogs/tags/identifier/index.html | 2 +-
blogs/tags/index.html | 2 +-
blogs/tags/io-uring/index.html | 2 +-
blogs/tags/message-checksum/index.html | 2 +-
blogs/tags/message-expiry/index.html | 2 +-
blogs/tags/message-headers/index.html | 2 +-
blogs/tags/message-state/index.html | 2 +-
blogs/tags/new-features/index.html | 2 +-
blogs/tags/pat/index.html | 2 +-
blogs/tags/performance/index.html | 2 +-
blogs/tags/permissions/index.html | 2 +-
blogs/tags/personal-access-tokens/index.html | 2 +-
blogs/tags/release/index.html | 2 +-
blogs/tags/schema/index.html | 2 +-
blogs/tags/update/index.html | 2 +-
blogs/tags/users/index.html | 2 +-
blogs/tags/websocket/index.html | 2 +-
blogs/updated-schemas/index.html | 2 +-
blogs/users-and-permissions/index.html | 2 +-
blogs/welcome-to-the-changelog/index.html | 2 +-
docs/ai/introduction/index.html | 2 +-
docs/ai/mcp/index.html | 2 +-
docs/cli/iggy-cli/index.html | 2 +-
docs/connectors/introduction/index.html | 2 +-
docs/connectors/runtime/index.html | 2 +-
docs/connectors/sdk/index.html | 2 +-
docs/connectors/sink/index.html | 2 +-
docs/connectors/sinks/elasticsearch/index.html | 2 +-
docs/connectors/sinks/iceberg/index.html | 2 +-
docs/connectors/sinks/postgres/index.html | 2 +-
docs/connectors/sinks/quickwit/index.html | 2 +-
docs/connectors/source/index.html | 2 +-
docs/connectors/sources/elasticsearch/index.html | 2 +-
docs/connectors/sources/postgres/index.html | 2 +-
docs/faq/faq/index.html | 2 +-
docs/index.html | 2 +-
docs/introduction/about/index.html | 2 +-
docs/introduction/architecture/index.html | 2 +-
docs/introduction/getting-started/index.html | 2 +-
docs/sdk/csharp/examples/index.html | 2 +-
docs/sdk/csharp/intro/index.html | 4 ++--
docs/sdk/go/examples/index.html | 2 +-
docs/sdk/go/intro/index.html | 4 ++--
docs/sdk/introduction/index.html | 2 +-
docs/sdk/java/examples/index.html | 2 +-
docs/sdk/java/intro/index.html | 4 ++--
docs/sdk/node/examples/index.html | 2 +-
docs/sdk/node/intro/index.html | 4 ++--
docs/sdk/python/examples/index.html | 2 +-
docs/sdk/python/intro/index.html | 4 ++--
docs/sdk/rust/examples/index.html | 2 +-
docs/sdk/rust/high-level-sdk/index.html | 2 +-
docs/sdk/rust/intro/index.html | 2 +-
docs/sdk/rust/stream-builder/index.html | 2 +-
docs/server/benchmarking/index.html | 4 ++--
docs/server/configuration/index.html | 2 +-
docs/server/docker/index.html | 2 +-
docs/server/introduction/index.html | 2 +-
docs/server/schema/index.html | 2 +-
docs/web-ui/iggy-web-ui/index.html | 4 ++--
downloads/index.html | 2 +-
index.html | 2 +-
markdown-page/index.html | 2 +-
105 files changed, 107 insertions(+), 107 deletions(-)
create mode 100644 assets/js/1ccbcc53.e07bbf74.js
delete mode 100644 assets/js/1ccbcc53.fbf47cec.js
rename assets/js/{2edd2ec4.1dd507a6.js => 2edd2ec4.b07d806b.js} (89%)
delete mode 100644 assets/js/363979b1.65efb962.js
create mode 100644 assets/js/363979b1.b3617742.js
rename assets/js/{46167e1b.c20895e1.js => 46167e1b.5ffdfdf8.js} (51%)
delete mode 100644 assets/js/8a6c01a6.16d131ba.js
create mode 100644 assets/js/8a6c01a6.639a0c4e.js
delete mode 100644 assets/js/a2ea038e.095c135e.js
create mode 100644 assets/js/a2ea038e.c09cea3c.js
delete mode 100644 assets/js/d1796fc4.0cd296d9.js
create mode 100644 assets/js/d1796fc4.af5f7d2c.js
rename assets/js/{runtime~main.faa91a19.js => runtime~main.0a940c88.js} (95%)
(iggy-website) 01/01: Deploy website from main branch 567eabbbfaf1785d17aa46fe360484c3f6fadce3
Posted by gi...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
github-bot pushed a commit to branch asf-site
in repository https://gitbox.apache.org/repos/asf/iggy-website.git
commit 0ea10bb533af75c29a7ac18548ff39c78fcdcf1a
Author: github-actions[bot] <gi...@users.noreply.github.com>
AuthorDate: Wed Jan 14 07:34:50 2026 +0000
Deploy website from main branch 567eabbbfaf1785d17aa46fe360484c3f6fadce3
---
.asf.yaml | 36 +
.nojekyll | 0
404.html | 28 +
apache-incubator/iggy_logo.png | Bin 0 -> 105328 bytes
assets/css/styles.eaf589d9.css | 25 +
...chitecture-5d7f7f7ed58a399ea2f5a7c74c074f65.png | Bin 0 -> 760914 bytes
.../bench_cli-02b0d7bd13656d700fbdf1c76ae76fa3.png | Bin 0 -> 380000 bytes
...h_platform-dad3f0256bec6e556b40ea798366b7fe.png | Bin 0 -> 326093 bytes
..._trending-bbecb9e6ddc18e345fbdb7c8bae838d9.jpeg | Bin 0 -> 390292 bytes
...hero-main-e1a5810725936dc0dcd079d7858873b0.webp | Bin 0 -> 150984 bytes
...iggy_0_1_0-c635523620b5dc0af17545d1c3ce3edd.jpg | Bin 0 -> 82650 bytes
...h_schema_1-61b4d896b850e3d0ee08270f7db7c6b5.png | Bin 0 -> 525799 bytes
...h_schema_2-c7a5fc6158b838999c178ef8aea96089.png | Bin 0 -> 546950 bytes
...ggy_bench-9ea0ebbd13ad66abb94ec3d8d8697048.jpeg | Bin 0 -> 615288 bytes
...iggy_bench-eed7510a845dfb053ac67be624599c99.png | Bin 0 -> 111659 bytes
...nch_0_1_0-afcc4cf7770ab3863afbdd2a7871492b.jpeg | Bin 0 -> 1386983 bytes
..._bench_cli-32946d97899e6925f99469dad967ca7e.png | Bin 0 -> 515157 bytes
..._dashboard-20dc5e120f14f0c4618f23227cd08ac9.png | Bin 0 -> 394188 bytes
..._ci_0_1_0-b31e9445de207c06bd2eee74dafac357.jpeg | Bin 0 -> 538032 bytes
...ggy_ci_cd-a03f984dde69dbbc209f61481d7d1c91.jpeg | Bin 0 -> 78169 bytes
.../iggy_cli-b139e02165e2570574ac638f7db8801f.png | Bin 0 -> 231092 bytes
.../iggy_cli-c140d5ecfddf24acd537722137b70c47.png | Bin 0 -> 90242 bytes
.../iggy_cli-efc853d35dfcddfb68957f9f7cbdd745.jpeg | Bin 0 -> 538239 bytes
...cli_0_1_0-aa8dbc85bd46875427ae87e133ec8482.jpeg | Bin 0 -> 1049410 bytes
...gy_cluster-c2c33596763c8b9930c7de7e12dc3586.png | Bin 0 -> 872341 bytes
...ggy_docker-37b72ad9d9a244e1464c94f03c162193.png | Bin 0 -> 721661 bytes
.../iggy_logo-f0e83b91b22303a5545dfb6d49756d18.png | Bin 0 -> 105328 bytes
.../iggy_perf-33fc4db2b6cbd7156b753eee6aeaba60.png | Bin 0 -> 68641 bytes
...ggy_rocket-24a27df28dafae43eb9634a4f6b00c5e.png | Bin 0 -> 225148 bytes
...gy_sample-39395c20221652515f2296734851e042.jpeg | Bin 0 -> 874973 bytes
...gy_server-b28372292592869008ceb03c1edfdc51.jpeg | Bin 0 -> 976463 bytes
...ggy_server-f7851820c876c0a5b3c0159f953ae728.png | Bin 0 -> 1176428 bytes
...ver_0_1_0-7d957a6db68439149d9c805432318296.jpeg | Bin 0 -> 1064181 bytes
...iggy_stars-adb7a001298df7df97de6b0fdd6321ce.png | Bin 0 -> 35419 bytes
...logy_radar-291413e3a6d4cb1a5b7832ab5865423e.png | Bin 0 -> 406596 bytes
.../iggy_tpc-a6b43534112bfc2c863a2ef675c0a547.png | Bin 0 -> 423184 bytes
.../iggy_vsr-3d747255ce17ecda927ccd4d258f7016.png | Bin 0 -> 3958317 bytes
.../iggy_web-76023f316d53cc2e44ae6f7b83193529.png | Bin 0 -> 109581 bytes
...ggy_web_ui-40085aee2ec268a2dbb1e8c946009e38.png | Bin 0 -> 145001 bytes
...gy_web_ui-58fc54e40a2756eba04dec9206de70a5.jpeg | Bin 0 -> 215638 bytes
..._ui_0_1_0-58fc54e40a2756eba04dec9206de70a5.jpeg | Bin 0 -> 215638 bytes
.../iggys-5cd88b6e4af91d0e5b0f1ef688b8efac.jpeg | Bin 0 -> 512046 bytes
...elections-f973c06ac3c6b230945e496faa6f314e.jpeg | Bin 0 -> 1299078 bytes
...y_consumer-ae546079ca662038a43983969c9fa325.png | Bin 0 -> 1490151 bytes
...y_producer-ffed3643f7efa9c5ac43a3ce4cba746c.png | Bin 0 -> 684901 bytes
.../pc_tcp-ad927c98e841cf0dd0647d5e45fb0a2f.png | Bin 0 -> 197964 bytes
.../pc_ws-08cd4047c7106ef1fa677c0e5c23ac8e.png | Bin 0 -> 184540 bytes
.../tcp-1234-784a4e2d38f3ad9fceaa5d15d9960f38.png | Bin 0 -> 205593 bytes
.../ws-1234-057d2fad76235bff8a09d63c800065e4.png | Bin 0 -> 190067 bytes
...y_consumer-b0a3206f473d6d13c8cc4fc8dfca3486.png | Bin 0 -> 485344 bytes
...y_producer-6cd58f250a711fb170bba9091da38606.png | Bin 0 -> 602342 bytes
assets/js/0058b4c6.218c9c78.js | 1 +
assets/js/0169d23c.fd4b8724.js | 1 +
assets/js/01a85c17.6c21dcd6.js | 1 +
assets/js/02f37a76.a5684c00.js | 1 +
assets/js/03a9e148.43ffc5aa.js | 1 +
assets/js/05a04b69.3ea04df7.js | 1 +
assets/js/069b8ada.42fffa6f.js | 1 +
assets/js/0755831e.1bf5793d.js | 1 +
assets/js/097d5e07.39fd361c.js | 1 +
assets/js/0aee7f2c.6a6c1610.js | 1 +
assets/js/12deeac4.5cb63c58.js | 1 +
assets/js/17896441.d7a5b32e.js | 1 +
assets/js/17e33b4e.b0dffc45.js | 1 +
assets/js/19432d33.f98b55c4.js | 1 +
assets/js/1b6ff2c5.21356684.js | 1 +
assets/js/1ccbcc53.e07bbf74.js | 1 +
assets/js/1df93b7f.673a3437.js | 1 +
assets/js/1e0e7c89.2b1af6bd.js | 1 +
assets/js/1e5ad4f9.5e2cfa1c.js | 1 +
assets/js/1f391b9e.c18cd7bf.js | 1 +
assets/js/20544421.d6213ad7.js | 1 +
assets/js/20777f46.dbc6f3e2.js | 1 +
assets/js/218f3d72.37781d12.js | 1 +
assets/js/21becccd.cd40ea52.js | 1 +
assets/js/2237.6c3e7917.js | 1 +
assets/js/25cfbc78.0066d365.js | 1 +
assets/js/296d7672.c7832931.js | 1 +
assets/js/2edd2ec4.b07d806b.js | 1 +
assets/js/2f80e784.a39c8d58.js | 1 +
assets/js/3049ae2a.488bf80d.js | 1 +
assets/js/332362b2.39ebe1e6.js | 1 +
assets/js/354f99ce.89131802.js | 1 +
assets/js/363979b1.b3617742.js | 1 +
assets/js/36994c47.1e60f9d1.js | 1 +
assets/js/393be207.07c8ec51.js | 1 +
assets/js/3defdf4b.ff8218cb.js | 1 +
assets/js/3e020208.096f0d3f.js | 1 +
assets/js/41d2f7e6.4ebdea67.js | 1 +
assets/js/41e60a44.218722f3.js | 1 +
assets/js/46167e1b.5ffdfdf8.js | 1 +
assets/js/4726e312.53413681.js | 1 +
assets/js/48f67714.1c3059fb.js | 1 +
assets/js/5159.4a3ad2a8.js | 1 +
assets/js/544367a9.c65b84c0.js | 1 +
assets/js/54b5fc15.201edbba.js | 1 +
assets/js/5a05130f.bc1f4807.js | 1 +
assets/js/5e95c892.37dc07a6.js | 1 +
assets/js/5f481cd4.41d5e514.js | 1 +
assets/js/621db11d.819d0f16.js | 1 +
assets/js/62290500.da4bf761.js | 1 +
assets/js/62f16c65.74087662.js | 1 +
assets/js/64ee4266.3c907e7e.js | 1 +
assets/js/666c9b96.a99edd99.js | 1 +
assets/js/6875c492.54465a18.js | 1 +
assets/js/6a23e949.842b7bde.js | 1 +
assets/js/6a2e60e3.49ea32ea.js | 1 +
assets/js/6ea6d42b.8ec6e032.js | 1 +
assets/js/71369862.389b65a4.js | 1 +
assets/js/71a4f72a.33b69016.js | 1 +
assets/js/75ca37af.95fd5b0a.js | 1 +
assets/js/76680d72.316aea42.js | 1 +
assets/js/782bd44c.8e7b6968.js | 1 +
assets/js/7d3d0ee4.4863b032.js | 1 +
assets/js/7e31e0a8.09702a89.js | 1 +
assets/js/7eb7d8a5.702c4cec.js | 1 +
assets/js/814f3328.06173faf.js | 1 +
assets/js/8159d786.a420f58d.js | 1 +
assets/js/83d73c01.973abd8d.js | 1 +
assets/js/8a6c01a6.639a0c4e.js | 1 +
assets/js/8b22b5f5.6d8995e6.js | 1 +
assets/js/8b8cddd6.09ed27e1.js | 1 +
assets/js/8c2332e9.230bfb24.js | 1 +
assets/js/8d3840f5.dd179b79.js | 1 +
assets/js/907ba26f.e5873668.js | 1 +
assets/js/92abec30.3fcf9928.js | 1 +
assets/js/94b97bcf.533c6de4.js | 1 +
assets/js/9590c6d3.c1bc7f1a.js | 1 +
assets/js/9785.c88c4f8f.js | 1 +
assets/js/98883e6e.7624cfd7.js | 1 +
assets/js/9ca9f017.ce7ac0ed.js | 1 +
assets/js/9d09e2d4.26833eb9.js | 1 +
assets/js/9e4087bc.cca813d0.js | 1 +
assets/js/a1b14ee0.3bcb29f1.js | 1 +
assets/js/a2ea038e.c09cea3c.js | 1 +
assets/js/a4d21046.a7aebcd9.js | 1 +
assets/js/a6aa9e1f.bebee82c.js | 1 +
assets/js/a7456010.73397789.js | 1 +
assets/js/a74c909c.3e7a9fe3.js | 1 +
assets/js/a7bd4aaa.5eefa923.js | 1 +
assets/js/a7c1df9a.6e25e2d5.js | 1 +
assets/js/a902938a.fb6b2399.js | 1 +
assets/js/a94703ab.711fab16.js | 1 +
assets/js/aba21aa0.dacb74ee.js | 1 +
assets/js/acecf23e.f2134d2b.js | 1 +
assets/js/b041cdfc.67cfd8b0.js | 1 +
assets/js/b1fb958a.893ecd9d.js | 1 +
assets/js/b3082b0e.c815e613.js | 1 +
assets/js/b8b35ff1.229c2418.js | 1 +
assets/js/bc9f1601.0244c8c0.js | 1 +
assets/js/c065b223.697090a8.js | 1 +
assets/js/c23ee533.8d4c8ea6.js | 1 +
assets/js/c3a24e9c.b974124f.js | 1 +
assets/js/c5f172dd.d9a01a14.js | 1 +
assets/js/c70ea44c.d887c741.js | 1 +
assets/js/c8d81af2.80074e8c.js | 1 +
assets/js/ca66c66a.bac75913.js | 1 +
assets/js/cc16a589.0b02c6d8.js | 1 +
assets/js/ccc49370.6f4e6b50.js | 1 +
assets/js/ce80ecba.0be0ba49.js | 1 +
assets/js/cfbe654b.8cbbb9ce.js | 1 +
assets/js/cfc3091e.dcbac72c.js | 1 +
assets/js/d1796fc4.af5f7d2c.js | 1 +
assets/js/d19ecac4.8085d0bf.js | 1 +
assets/js/d6bb211a.cb33a65e.js | 1 +
assets/js/d74d5d7a.f6a6968e.js | 1 +
assets/js/d83bd44c.77b02546.js | 1 +
assets/js/da420000.3791224c.js | 1 +
assets/js/da5fc804.e726472f.js | 1 +
assets/js/dfcda264.b56831bf.js | 1 +
assets/js/e05ad208.9235c545.js | 1 +
assets/js/e35843f4.53368b71.js | 1 +
assets/js/e519dda2.b29721be.js | 1 +
assets/js/e7c222e2.cb5f5454.js | 1 +
assets/js/e982becf.8d9b70f9.js | 1 +
assets/js/eaff7a86.1fc2390f.js | 1 +
assets/js/efbe804b.17d540da.js | 1 +
assets/js/f5480997.6bb83246.js | 1 +
assets/js/fbf041e5.94bb2d2b.js | 1 +
assets/js/ff030c8a.f1a46e99.js | 1 +
assets/js/ff06d166.308a6f91.js | 1 +
assets/js/main.4a006c5e.js | 2 +
assets/js/main.4a006c5e.js.LICENSE.txt | 61 +
assets/js/runtime~main.0a940c88.js | 1 +
.../building-message-streaming-in-rust/index.html | 115 ++
.../index.html | 105 ++
.../technology-radar-and-currrent-goals/index.html | 67 ++
blogs/2025/02/10/apache-incubator/index.html | 71 ++
blogs/2025/02/17/transparent-benchmarks/index.html | 53 +
.../05/08/zero-copy-deserialization/index.html | 73 ++
blogs/2025/06/06/connectors-runtime/index.html | 49 +
blogs/2025/08/10/release-0.5.0/index.html | 95 ++
blogs/2025/11/17/websocket-io-uring/index.html | 251 +++++
blogs/2025/12/09/release-0.6.0/index.html | 105 ++
blogs/archive/index.html | 28 +
blogs/atom.css | 75 ++
blogs/atom.xml | 1173 ++++++++++++++++++++
blogs/atom.xsl | 92 ++
blogs/authors/index.html | 28 +
blogs/consumer-identifier/index.html | 41 +
blogs/iggy-0-1-0-release/index.html | 43 +
blogs/index.html | 42 +
blogs/message-expiry/index.html | 53 +
blogs/message-headers/index.html | 72 ++
blogs/message-state/index.html | 52 +
blogs/page/2/index.html | 28 +
blogs/personal-access-tokens/index.html | 44 +
blogs/rss.css | 75 ++
blogs/rss.xml | 1095 ++++++++++++++++++
blogs/rss.xsl | 86 ++
blogs/tags/0-5-0/index.html | 31 +
blogs/tags/0-6-0/index.html | 30 +
blogs/tags/announcement/index.html | 33 +
blogs/tags/async/index.html | 29 +
blogs/tags/breaking-changes/index.html | 28 +
blogs/tags/compio/index.html | 29 +
blogs/tags/consumers/index.html | 28 +
blogs/tags/hello/index.html | 28 +
blogs/tags/identifier/index.html | 28 +
blogs/tags/index.html | 28 +
blogs/tags/io-uring/index.html | 29 +
blogs/tags/message-checksum/index.html | 28 +
blogs/tags/message-expiry/index.html | 28 +
blogs/tags/message-headers/index.html | 28 +
blogs/tags/message-state/index.html | 28 +
blogs/tags/new-features/index.html | 28 +
blogs/tags/pat/index.html | 28 +
blogs/tags/performance/index.html | 29 +
blogs/tags/permissions/index.html | 28 +
blogs/tags/personal-access-tokens/index.html | 28 +
blogs/tags/release/index.html | 33 +
blogs/tags/schema/index.html | 28 +
blogs/tags/update/index.html | 28 +
blogs/tags/users/index.html | 28 +
blogs/tags/websocket/index.html | 29 +
blogs/updated-schemas/index.html | 43 +
blogs/users-and-permissions/index.html | 69 ++
blogs/welcome-to-the-changelog/index.html | 30 +
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/ai/introduction/index.html | 29 +
docs/ai/mcp/index.html | 36 +
docs/cli/iggy-cli/index.html | 49 +
docs/connectors/introduction/index.html | 83 ++
docs/connectors/runtime/index.html | 99 ++
docs/connectors/sdk/index.html | 83 ++
docs/connectors/sink/index.html | 70 ++
docs/connectors/sinks/elasticsearch/index.html | 47 +
docs/connectors/sinks/iceberg/index.html | 68 ++
docs/connectors/sinks/postgres/index.html | 92 ++
docs/connectors/sinks/quickwit/index.html | 34 +
docs/connectors/source/index.html | 74 ++
docs/connectors/sources/elasticsearch/index.html | 125 +++
docs/connectors/sources/postgres/index.html | 86 ++
docs/faq/faq/index.html | 31 +
docs/index.html | 29 +
docs/introduction/about/index.html | 110 ++
docs/introduction/architecture/index.html | 60 +
docs/introduction/getting-started/index.html | 122 ++
docs/sdk/csharp/examples/index.html | 28 +
docs/sdk/csharp/intro/index.html | 28 +
docs/sdk/go/examples/index.html | 28 +
docs/sdk/go/intro/index.html | 28 +
docs/sdk/introduction/index.html | 28 +
docs/sdk/java/examples/index.html | 28 +
docs/sdk/java/intro/index.html | 29 +
docs/sdk/node/examples/index.html | 28 +
docs/sdk/node/intro/index.html | 28 +
docs/sdk/python/examples/index.html | 28 +
docs/sdk/python/intro/index.html | 28 +
docs/sdk/rust/examples/index.html | 35 +
docs/sdk/rust/high-level-sdk/index.html | 88 ++
docs/sdk/rust/intro/index.html | 29 +
docs/sdk/rust/stream-builder/index.html | 112 ++
docs/server/benchmarking/index.html | 69 ++
docs/server/configuration/index.html | 51 +
docs/server/docker/index.html | 33 +
docs/server/introduction/index.html | 35 +
docs/server/schema/index.html | 324 ++++++
docs/web-ui/iggy-web-ui/index.html | 31 +
downloads/index.html | 57 +
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-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 | 28 +
markdown-page/index.html | 29 +
.../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
sitemap.xml | 1 +
.../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
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
384 files changed, 8789 insertions(+)
diff --git a/.asf.yaml b/.asf.yaml
new file mode 100644
index 00000000..cb43a065
--- /dev/null
+++ b/.asf.yaml
@@ -0,0 +1,36 @@
+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
+
+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
\ No newline at end of file
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..d64c55d5
--- /dev/null
+++ b/404.html
@@ -0,0 +1,28 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="plugin-native plugin-id-default" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">Page Not Found | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" pro [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed">
+
+
+
+
+
+<link rel="preconnect" href="https://analytics.apache.org/">
+<script>var _paq=window._paq=window._paq||[];_paq.push(["setRequestMethod","POST"]),_paq.push(["trackPageView"]),_paq.push(["enableLinkTracking"]),_paq.push(["enableHeartBeatTimer"]),function(){var e="https://analytics.apache.org/";_paq.push(["setRequestMethod","POST"]),_paq.push(["setTrackerUrl",e+"matomo.php"]),_paq.push(["setSiteId","80"]);var a=document,t=a.createElement("script"),p=a.getElementsByTagName("script")[0];t.type="text/javascript",t.async=!0,t.src=e+"matomo.js",p.parentNo [...]
+<script src="/assets/js/runtime~main.0a940c88.js" defer="defer"></script>
+<script src="/assets/js/main.4a006c5e.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/img/apache-iggy0.5x.png"><link rel="preload" as="image" [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
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/assets/css/styles.eaf589d9.css b/assets/css/styles.eaf589d9.css
new file mode 100644
index 00000000..f503765c
--- /dev/null
+++ b/assets/css/styles.eaf589d9.css
@@ -0,0 +1,25 @@
+@import url(https://fonts.googleapis.com/css2?family=Manrope:wght@300;400;500;600;700&display=swap);@import url(https://fonts.googleapis.com/icon?family=Material+Icons);:root{--ifm-color-scheme:light;--ifm-dark-value:10%;--ifm-darker-value:15%;--ifm-darkest-value:30%;--ifm-light-value:15%;--ifm-lighter-value:30%;--ifm-lightest-value:50%;--ifm-contrast-background-value:90%;--ifm-contrast-foreground-value:70%;--ifm-contrast-background-dark-value:70%;--ifm-contrast-foreground-dark-value:90% [...]
+ --ifm-color-primary-contrast-background
+ );--ifm-alert-background-color-highlight:#3578e526;--ifm-alert-foreground-color:var(
+ --ifm-color-primary-contrast-foreground
+ );--ifm-alert-border-color:var(--ifm-color-primary-dark)}.alert--secondary{--ifm-alert-background-color:var(
+ --ifm-color-secondary-contrast-background
+ );--ifm-alert-background-color-highlight:#ebedf026;--ifm-alert-foreground-color:var(
+ --ifm-color-secondary-contrast-foreground
+ );--ifm-alert-border-color:var(--ifm-color-secondary-dark)}.alert--success{--ifm-alert-background-color:var(
+ --ifm-color-success-contrast-background
+ );--ifm-alert-background-color-highlight:#00a40026;--ifm-alert-foreground-color:var(
+ --ifm-color-success-contrast-foreground
+ );--ifm-alert-border-color:var(--ifm-color-success-dark)}.alert--info{--ifm-alert-background-color:var(
+ --ifm-color-info-contrast-background
+ );--ifm-alert-background-color-highlight:#54c7ec26;--ifm-alert-foreground-color:var(
+ --ifm-color-info-contrast-foreground
+ );--ifm-alert-border-color:var(--ifm-color-info-dark)}.alert--warning{--ifm-alert-background-color:var(
+ --ifm-color-warning-contrast-background
+ );--ifm-alert-background-color-highlight:#ffba0026;--ifm-alert-foreground-color:var(
+ --ifm-color-warning-contrast-foreground
+ );--ifm-alert-border-color:var(--ifm-color-warning-dark)}.alert--danger{--ifm-alert-background-color:var(
+ --ifm-color-danger-contrast-background
+ );--ifm-alert-background-color-highlight:#fa383e26;--ifm-alert-foreground-color:var(
+ --ifm-color-danger-contrast-foreground
+ );--ifm-alert-border-color:var(--ifm-color-danger-dark)}.alert{--ifm-code-background:var(--ifm-alert-background-color-highlight);--ifm-link-color:var(--ifm-alert-foreground-color);--ifm-link-hover-color:var(--ifm-alert-foreground-color);--ifm-link-decoration:underline;--ifm-tabs-color:var(--ifm-alert-foreground-color);--ifm-tabs-color-active:var(--ifm-alert-foreground-color);--ifm-tabs-color-active-border:var(--ifm-alert-border-color);background-color:var(--ifm-alert-background-col [...]
\ No newline at end of file
diff --git a/assets/images/architecture-5d7f7f7ed58a399ea2f5a7c74c074f65.png b/assets/images/architecture-5d7f7f7ed58a399ea2f5a7c74c074f65.png
new file mode 100644
index 00000000..0d1c885f
Binary files /dev/null and b/assets/images/architecture-5d7f7f7ed58a399ea2f5a7c74c074f65.png differ
diff --git a/assets/images/bench_cli-02b0d7bd13656d700fbdf1c76ae76fa3.png b/assets/images/bench_cli-02b0d7bd13656d700fbdf1c76ae76fa3.png
new file mode 100644
index 00000000..5bf0eacc
Binary files /dev/null and b/assets/images/bench_cli-02b0d7bd13656d700fbdf1c76ae76fa3.png differ
diff --git a/assets/images/bench_platform-dad3f0256bec6e556b40ea798366b7fe.png b/assets/images/bench_platform-dad3f0256bec6e556b40ea798366b7fe.png
new file mode 100644
index 00000000..8e56cd1d
Binary files /dev/null and b/assets/images/bench_platform-dad3f0256bec6e556b40ea798366b7fe.png differ
diff --git a/assets/images/gh_trending-bbecb9e6ddc18e345fbdb7c8bae838d9.jpeg b/assets/images/gh_trending-bbecb9e6ddc18e345fbdb7c8bae838d9.jpeg
new file mode 100644
index 00000000..117b7e77
Binary files /dev/null and b/assets/images/gh_trending-bbecb9e6ddc18e345fbdb7c8bae838d9.jpeg differ
diff --git a/assets/images/hero-main-e1a5810725936dc0dcd079d7858873b0.webp b/assets/images/hero-main-e1a5810725936dc0dcd079d7858873b0.webp
new file mode 100644
index 00000000..12874b7c
Binary files /dev/null and b/assets/images/hero-main-e1a5810725936dc0dcd079d7858873b0.webp differ
diff --git a/assets/images/iggy_0_1_0-c635523620b5dc0af17545d1c3ce3edd.jpg b/assets/images/iggy_0_1_0-c635523620b5dc0af17545d1c3ce3edd.jpg
new file mode 100644
index 00000000..8b738337
Binary files /dev/null and b/assets/images/iggy_0_1_0-c635523620b5dc0af17545d1c3ce3edd.jpg differ
diff --git a/assets/images/iggy_batch_schema_1-61b4d896b850e3d0ee08270f7db7c6b5.png b/assets/images/iggy_batch_schema_1-61b4d896b850e3d0ee08270f7db7c6b5.png
new file mode 100644
index 00000000..bdba4165
Binary files /dev/null and b/assets/images/iggy_batch_schema_1-61b4d896b850e3d0ee08270f7db7c6b5.png differ
diff --git a/assets/images/iggy_batch_schema_2-c7a5fc6158b838999c178ef8aea96089.png b/assets/images/iggy_batch_schema_2-c7a5fc6158b838999c178ef8aea96089.png
new file mode 100644
index 00000000..a3ed870e
Binary files /dev/null and b/assets/images/iggy_batch_schema_2-c7a5fc6158b838999c178ef8aea96089.png differ
diff --git a/assets/images/iggy_bench-9ea0ebbd13ad66abb94ec3d8d8697048.jpeg b/assets/images/iggy_bench-9ea0ebbd13ad66abb94ec3d8d8697048.jpeg
new file mode 100644
index 00000000..a3de266b
Binary files /dev/null and b/assets/images/iggy_bench-9ea0ebbd13ad66abb94ec3d8d8697048.jpeg differ
diff --git a/assets/images/iggy_bench-eed7510a845dfb053ac67be624599c99.png b/assets/images/iggy_bench-eed7510a845dfb053ac67be624599c99.png
new file mode 100644
index 00000000..0bc290f9
Binary files /dev/null and b/assets/images/iggy_bench-eed7510a845dfb053ac67be624599c99.png differ
diff --git a/assets/images/iggy_bench_0_1_0-afcc4cf7770ab3863afbdd2a7871492b.jpeg b/assets/images/iggy_bench_0_1_0-afcc4cf7770ab3863afbdd2a7871492b.jpeg
new file mode 100644
index 00000000..36aeca37
Binary files /dev/null and b/assets/images/iggy_bench_0_1_0-afcc4cf7770ab3863afbdd2a7871492b.jpeg differ
diff --git a/assets/images/iggy_bench_cli-32946d97899e6925f99469dad967ca7e.png b/assets/images/iggy_bench_cli-32946d97899e6925f99469dad967ca7e.png
new file mode 100644
index 00000000..cfd27806
Binary files /dev/null and b/assets/images/iggy_bench_cli-32946d97899e6925f99469dad967ca7e.png differ
diff --git a/assets/images/iggy_bench_dashboard-20dc5e120f14f0c4618f23227cd08ac9.png b/assets/images/iggy_bench_dashboard-20dc5e120f14f0c4618f23227cd08ac9.png
new file mode 100644
index 00000000..67847f4c
Binary files /dev/null and b/assets/images/iggy_bench_dashboard-20dc5e120f14f0c4618f23227cd08ac9.png differ
diff --git a/assets/images/iggy_ci_0_1_0-b31e9445de207c06bd2eee74dafac357.jpeg b/assets/images/iggy_ci_0_1_0-b31e9445de207c06bd2eee74dafac357.jpeg
new file mode 100644
index 00000000..2a597fb3
Binary files /dev/null and b/assets/images/iggy_ci_0_1_0-b31e9445de207c06bd2eee74dafac357.jpeg differ
diff --git a/assets/images/iggy_ci_cd-a03f984dde69dbbc209f61481d7d1c91.jpeg b/assets/images/iggy_ci_cd-a03f984dde69dbbc209f61481d7d1c91.jpeg
new file mode 100644
index 00000000..0f7caf01
Binary files /dev/null and b/assets/images/iggy_ci_cd-a03f984dde69dbbc209f61481d7d1c91.jpeg differ
diff --git a/assets/images/iggy_cli-b139e02165e2570574ac638f7db8801f.png b/assets/images/iggy_cli-b139e02165e2570574ac638f7db8801f.png
new file mode 100644
index 00000000..43acc469
Binary files /dev/null and b/assets/images/iggy_cli-b139e02165e2570574ac638f7db8801f.png differ
diff --git a/assets/images/iggy_cli-c140d5ecfddf24acd537722137b70c47.png b/assets/images/iggy_cli-c140d5ecfddf24acd537722137b70c47.png
new file mode 100644
index 00000000..36488263
Binary files /dev/null and b/assets/images/iggy_cli-c140d5ecfddf24acd537722137b70c47.png differ
diff --git a/assets/images/iggy_cli-efc853d35dfcddfb68957f9f7cbdd745.jpeg b/assets/images/iggy_cli-efc853d35dfcddfb68957f9f7cbdd745.jpeg
new file mode 100644
index 00000000..8520661a
Binary files /dev/null and b/assets/images/iggy_cli-efc853d35dfcddfb68957f9f7cbdd745.jpeg differ
diff --git a/assets/images/iggy_cli_0_1_0-aa8dbc85bd46875427ae87e133ec8482.jpeg b/assets/images/iggy_cli_0_1_0-aa8dbc85bd46875427ae87e133ec8482.jpeg
new file mode 100644
index 00000000..1853b130
Binary files /dev/null and b/assets/images/iggy_cli_0_1_0-aa8dbc85bd46875427ae87e133ec8482.jpeg differ
diff --git a/assets/images/iggy_cluster-c2c33596763c8b9930c7de7e12dc3586.png b/assets/images/iggy_cluster-c2c33596763c8b9930c7de7e12dc3586.png
new file mode 100644
index 00000000..dc246210
Binary files /dev/null and b/assets/images/iggy_cluster-c2c33596763c8b9930c7de7e12dc3586.png differ
diff --git a/assets/images/iggy_docker-37b72ad9d9a244e1464c94f03c162193.png b/assets/images/iggy_docker-37b72ad9d9a244e1464c94f03c162193.png
new file mode 100644
index 00000000..41e3a607
Binary files /dev/null and b/assets/images/iggy_docker-37b72ad9d9a244e1464c94f03c162193.png differ
diff --git a/assets/images/iggy_logo-f0e83b91b22303a5545dfb6d49756d18.png b/assets/images/iggy_logo-f0e83b91b22303a5545dfb6d49756d18.png
new file mode 100644
index 00000000..33c3e2c2
Binary files /dev/null and b/assets/images/iggy_logo-f0e83b91b22303a5545dfb6d49756d18.png differ
diff --git a/assets/images/iggy_perf-33fc4db2b6cbd7156b753eee6aeaba60.png b/assets/images/iggy_perf-33fc4db2b6cbd7156b753eee6aeaba60.png
new file mode 100644
index 00000000..1b91cdd3
Binary files /dev/null and b/assets/images/iggy_perf-33fc4db2b6cbd7156b753eee6aeaba60.png differ
diff --git a/assets/images/iggy_rocket-24a27df28dafae43eb9634a4f6b00c5e.png b/assets/images/iggy_rocket-24a27df28dafae43eb9634a4f6b00c5e.png
new file mode 100644
index 00000000..ec60dffd
Binary files /dev/null and b/assets/images/iggy_rocket-24a27df28dafae43eb9634a4f6b00c5e.png differ
diff --git a/assets/images/iggy_sample-39395c20221652515f2296734851e042.jpeg b/assets/images/iggy_sample-39395c20221652515f2296734851e042.jpeg
new file mode 100644
index 00000000..67cb96a6
Binary files /dev/null and b/assets/images/iggy_sample-39395c20221652515f2296734851e042.jpeg differ
diff --git a/assets/images/iggy_server-b28372292592869008ceb03c1edfdc51.jpeg b/assets/images/iggy_server-b28372292592869008ceb03c1edfdc51.jpeg
new file mode 100644
index 00000000..eaa7b762
Binary files /dev/null and b/assets/images/iggy_server-b28372292592869008ceb03c1edfdc51.jpeg differ
diff --git a/assets/images/iggy_server-f7851820c876c0a5b3c0159f953ae728.png b/assets/images/iggy_server-f7851820c876c0a5b3c0159f953ae728.png
new file mode 100644
index 00000000..02e27e0e
Binary files /dev/null and b/assets/images/iggy_server-f7851820c876c0a5b3c0159f953ae728.png differ
diff --git a/assets/images/iggy_server_0_1_0-7d957a6db68439149d9c805432318296.jpeg b/assets/images/iggy_server_0_1_0-7d957a6db68439149d9c805432318296.jpeg
new file mode 100644
index 00000000..2f6b74ad
Binary files /dev/null and b/assets/images/iggy_server_0_1_0-7d957a6db68439149d9c805432318296.jpeg differ
diff --git a/assets/images/iggy_stars-adb7a001298df7df97de6b0fdd6321ce.png b/assets/images/iggy_stars-adb7a001298df7df97de6b0fdd6321ce.png
new file mode 100644
index 00000000..4af17ca7
Binary files /dev/null and b/assets/images/iggy_stars-adb7a001298df7df97de6b0fdd6321ce.png differ
diff --git a/assets/images/iggy_technology_radar-291413e3a6d4cb1a5b7832ab5865423e.png b/assets/images/iggy_technology_radar-291413e3a6d4cb1a5b7832ab5865423e.png
new file mode 100644
index 00000000..ed08158a
Binary files /dev/null and b/assets/images/iggy_technology_radar-291413e3a6d4cb1a5b7832ab5865423e.png differ
diff --git a/assets/images/iggy_tpc-a6b43534112bfc2c863a2ef675c0a547.png b/assets/images/iggy_tpc-a6b43534112bfc2c863a2ef675c0a547.png
new file mode 100644
index 00000000..a8ae7b19
Binary files /dev/null and b/assets/images/iggy_tpc-a6b43534112bfc2c863a2ef675c0a547.png differ
diff --git a/assets/images/iggy_vsr-3d747255ce17ecda927ccd4d258f7016.png b/assets/images/iggy_vsr-3d747255ce17ecda927ccd4d258f7016.png
new file mode 100644
index 00000000..1615725e
Binary files /dev/null and b/assets/images/iggy_vsr-3d747255ce17ecda927ccd4d258f7016.png differ
diff --git a/assets/images/iggy_web-76023f316d53cc2e44ae6f7b83193529.png b/assets/images/iggy_web-76023f316d53cc2e44ae6f7b83193529.png
new file mode 100644
index 00000000..492ad4b8
Binary files /dev/null and b/assets/images/iggy_web-76023f316d53cc2e44ae6f7b83193529.png differ
diff --git a/assets/images/iggy_web_ui-40085aee2ec268a2dbb1e8c946009e38.png b/assets/images/iggy_web_ui-40085aee2ec268a2dbb1e8c946009e38.png
new file mode 100644
index 00000000..1fa0d7db
Binary files /dev/null and b/assets/images/iggy_web_ui-40085aee2ec268a2dbb1e8c946009e38.png differ
diff --git a/assets/images/iggy_web_ui-58fc54e40a2756eba04dec9206de70a5.jpeg b/assets/images/iggy_web_ui-58fc54e40a2756eba04dec9206de70a5.jpeg
new file mode 100644
index 00000000..168eeda4
Binary files /dev/null and b/assets/images/iggy_web_ui-58fc54e40a2756eba04dec9206de70a5.jpeg differ
diff --git a/assets/images/iggy_web_ui_0_1_0-58fc54e40a2756eba04dec9206de70a5.jpeg b/assets/images/iggy_web_ui_0_1_0-58fc54e40a2756eba04dec9206de70a5.jpeg
new file mode 100644
index 00000000..168eeda4
Binary files /dev/null and b/assets/images/iggy_web_ui_0_1_0-58fc54e40a2756eba04dec9206de70a5.jpeg differ
diff --git a/assets/images/iggys-5cd88b6e4af91d0e5b0f1ef688b8efac.jpeg b/assets/images/iggys-5cd88b6e4af91d0e5b0f1ef688b8efac.jpeg
new file mode 100644
index 00000000..cd593d6f
Binary files /dev/null and b/assets/images/iggys-5cd88b6e4af91d0e5b0f1ef688b8efac.jpeg differ
diff --git a/assets/images/leader_elections-f973c06ac3c6b230945e496faa6f314e.jpeg b/assets/images/leader_elections-f973c06ac3c6b230945e496faa6f314e.jpeg
new file mode 100644
index 00000000..352e9412
Binary files /dev/null and b/assets/images/leader_elections-f973c06ac3c6b230945e496faa6f314e.jpeg differ
diff --git a/assets/images/no_zero_copy_consumer-ae546079ca662038a43983969c9fa325.png b/assets/images/no_zero_copy_consumer-ae546079ca662038a43983969c9fa325.png
new file mode 100644
index 00000000..7252a706
Binary files /dev/null and b/assets/images/no_zero_copy_consumer-ae546079ca662038a43983969c9fa325.png differ
diff --git a/assets/images/no_zero_copy_producer-ffed3643f7efa9c5ac43a3ce4cba746c.png b/assets/images/no_zero_copy_producer-ffed3643f7efa9c5ac43a3ce4cba746c.png
new file mode 100644
index 00000000..c352f690
Binary files /dev/null and b/assets/images/no_zero_copy_producer-ffed3643f7efa9c5ac43a3ce4cba746c.png differ
diff --git a/assets/images/pc_tcp-ad927c98e841cf0dd0647d5e45fb0a2f.png b/assets/images/pc_tcp-ad927c98e841cf0dd0647d5e45fb0a2f.png
new file mode 100644
index 00000000..f8f45511
Binary files /dev/null and b/assets/images/pc_tcp-ad927c98e841cf0dd0647d5e45fb0a2f.png differ
diff --git a/assets/images/pc_ws-08cd4047c7106ef1fa677c0e5c23ac8e.png b/assets/images/pc_ws-08cd4047c7106ef1fa677c0e5c23ac8e.png
new file mode 100644
index 00000000..253699b7
Binary files /dev/null and b/assets/images/pc_ws-08cd4047c7106ef1fa677c0e5c23ac8e.png differ
diff --git a/assets/images/tcp-1234-784a4e2d38f3ad9fceaa5d15d9960f38.png b/assets/images/tcp-1234-784a4e2d38f3ad9fceaa5d15d9960f38.png
new file mode 100644
index 00000000..7b97f0a1
Binary files /dev/null and b/assets/images/tcp-1234-784a4e2d38f3ad9fceaa5d15d9960f38.png differ
diff --git a/assets/images/ws-1234-057d2fad76235bff8a09d63c800065e4.png b/assets/images/ws-1234-057d2fad76235bff8a09d63c800065e4.png
new file mode 100644
index 00000000..08de72e4
Binary files /dev/null and b/assets/images/ws-1234-057d2fad76235bff8a09d63c800065e4.png differ
diff --git a/assets/images/zero_copy_consumer-b0a3206f473d6d13c8cc4fc8dfca3486.png b/assets/images/zero_copy_consumer-b0a3206f473d6d13c8cc4fc8dfca3486.png
new file mode 100644
index 00000000..cb2d3101
Binary files /dev/null and b/assets/images/zero_copy_consumer-b0a3206f473d6d13c8cc4fc8dfca3486.png differ
diff --git a/assets/images/zero_copy_producer-6cd58f250a711fb170bba9091da38606.png b/assets/images/zero_copy_producer-6cd58f250a711fb170bba9091da38606.png
new file mode 100644
index 00000000..0239eee7
Binary files /dev/null and b/assets/images/zero_copy_producer-6cd58f250a711fb170bba9091da38606.png differ
diff --git a/assets/js/0058b4c6.218c9c78.js b/assets/js/0058b4c6.218c9c78.js
new file mode 100644
index 00000000..21c401d9
--- /dev/null
+++ b/assets/js/0058b4c6.218c9c78.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[849],{6164:e=>{e.exports=JSON.parse('{"version":{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"tutorialSidebar":[{"type":"link","href":"/docs/","label":"Welcome","docId":"iggy","unlisted":false},{"type":"category","label":"Introduction","collapsible":true,"collapsed":true," [...]
\ No newline at end of file
diff --git a/assets/js/0169d23c.fd4b8724.js b/assets/js/0169d23c.fd4b8724.js
new file mode 100644
index 00000000..01bddf98
--- /dev/null
+++ b/assets/js/0169d23c.fd4b8724.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[9437],{1262:e=>{e.exports=JSON.parse('{"permalink":"/blogs/welcome-to-the-changelog","source":"@site/blog/2023-08-16-welcome.md","title":"Welcome to the changelog","description":"Welcome to the changelog, in which you will read about all the changes that we make to the project.","date":"2023-08-16T00:00:00.000Z","tags":[{"inline":true,"label":"hello","permalink":"/blogs/tags/hello"}],"readin [...]
\ No newline at end of file
diff --git a/assets/js/01a85c17.6c21dcd6.js b/assets/js/01a85c17.6c21dcd6.js
new file mode 100644
index 00000000..31dff251
--- /dev/null
+++ b/assets/js/01a85c17.6c21dcd6.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[8209],{4096:(e,t,a)=>{a.d(t,{in:()=>c,OU:()=>P,Ki:()=>A,kJ:()=>b,x:()=>l,e7:()=>m,J_:()=>f,Gx:()=>y});var s=a(6540),n=a(9532),i=a(6803),r=a(4848);function l(){const e=(0,i.A)(),t=e?.data?.blogMetadata;if(!t)throw new Error("useBlogMetadata() can't be called on the current route because the blog metadata could not be found in route context");return t}const o=s.createContext(null);function c({ [...]
\ No newline at end of file
diff --git a/assets/js/02f37a76.a5684c00.js b/assets/js/02f37a76.a5684c00.js
new file mode 100644
index 00000000..cb063a10
--- /dev/null
+++ b/assets/js/02f37a76.a5684c00.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[2127],{443:e=>{e.exports=JSON.parse('{"permalink":"/blogs/2025/06/06/connectors-runtime","source":"@site/blog/2025-06-06-connectors-runtime.md","title":"Connectors runtime","description":"Extending Apache Iggy capabilities","date":"2025-06-06T00:00:00.000Z","tags":[],"readingTime":5.1,"hasTruncateMarker":true,"authors":[{"name":"Piotr Gankiewicz","title":"Apache Iggy founder","url":"https:// [...]
\ No newline at end of file
diff --git a/assets/js/03a9e148.43ffc5aa.js b/assets/js/03a9e148.43ffc5aa.js
new file mode 100644
index 00000000..452fb53d
--- /dev/null
+++ b/assets/js/03a9e148.43ffc5aa.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[512],{5106:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>l,contentTitle:()=>c,default:()=>h,frontMatter:()=>t,metadata:()=>s,toc:()=>a});const s=JSON.parse('{"id":"connectors/connectors-runtime","title":"Runtime","description":"Runtime is responsible for managing the lifecycle of the connectors and providing the necessary infrastructure for the connectors to run.","source":"@site/docs/connectors/runtim [...]
\ No newline at end of file
diff --git a/assets/js/05a04b69.3ea04df7.js b/assets/js/05a04b69.3ea04df7.js
new file mode 100644
index 00000000..d6520cae
--- /dev/null
+++ b/assets/js/05a04b69.3ea04df7.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[172],{1262:e=>{e.exports=JSON.parse('{"permalink":"/blogs/welcome-to-the-changelog","source":"@site/blog/2023-08-16-welcome.md","title":"Welcome to the changelog","description":"Welcome to the changelog, in which you will read about all the changes that we make to the project.","date":"2023-08-16T00:00:00.000Z","tags":[{"inline":true,"label":"hello","permalink":"/blogs/tags/hello"}],"reading [...]
\ No newline at end of file
diff --git a/assets/js/069b8ada.42fffa6f.js b/assets/js/069b8ada.42fffa6f.js
new file mode 100644
index 00000000..6b43741d
--- /dev/null
+++ b/assets/js/069b8ada.42fffa6f.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[9016],{3252:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>a,contentTitle:()=>c,default:()=>h,frontMatter:()=>r,metadata:()=>t,toc:()=>l});const t=JSON.parse('{"id":"connectors/sinks/connectors-sinks-iceberg","title":"Iceberg Sink","description":"The Iceberg Sink Connector allows you to consume messages from Iggy topics and store them in Iceberg tables.","source":"@site/docs/connectors/sinks/iceberg.md" [...]
\ No newline at end of file
diff --git a/assets/js/0755831e.1bf5793d.js b/assets/js/0755831e.1bf5793d.js
new file mode 100644
index 00000000..1c813eb8
--- /dev/null
+++ b/assets/js/0755831e.1bf5793d.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[6675],{1844:e=>{e.exports=JSON.parse('{"tag":{"label":"new-features","permalink":"/blogs/tags/new-features","allTagsPath":"/blogs/tags","count":6,"unlisted":false},"listMetadata":{"permalink":"/blogs/tags/new-features","page":1,"postsPerPage":10,"totalPages":1,"totalCount":6,"blogDescription":"Blog","blogTitle":"Blogs"}}')}}]);
\ No newline at end of file
diff --git a/assets/js/097d5e07.39fd361c.js b/assets/js/097d5e07.39fd361c.js
new file mode 100644
index 00000000..c8f23ce4
--- /dev/null
+++ b/assets/js/097d5e07.39fd361c.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[1318],{6047:e=>{e.exports=JSON.parse('{"permalink":"/blogs/updated-schemas","source":"@site/blog/2023-08-31-updated-schemas.md","title":"Updated schemas","description":"The latest update introduces the changes to the PollMessages and GetConsumerOffset commands response schema, as well as the Stream, Topic and Partition structs extended with created_at field.","date":"2023-08-31T00:00:00.000Z [...]
\ No newline at end of file
diff --git a/assets/js/0aee7f2c.6a6c1610.js b/assets/js/0aee7f2c.6a6c1610.js
new file mode 100644
index 00000000..5210fa27
--- /dev/null
+++ b/assets/js/0aee7f2c.6a6c1610.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[4314],{6825:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>p,contentTitle:()=>a,default:()=>c,frontMatter:()=>r,metadata:()=>n,toc:()=>l});const n=JSON.parse('{"id":"sdk/python/sdk-python-examples","title":"Examples","description":"","source":"@site/docs/sdk/python/examples.md","sourceDirName":"sdk/python","slug":"/sdk/python/examples","permalink":"/docs/sdk/python/examples","draft":false,"unlisted":fal [...]
\ No newline at end of file
diff --git a/assets/js/12deeac4.5cb63c58.js b/assets/js/12deeac4.5cb63c58.js
new file mode 100644
index 00000000..75c3d8e7
--- /dev/null
+++ b/assets/js/12deeac4.5cb63c58.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[5388],{331:e=>{e.exports=JSON.parse('{"permalink":"/blogs/iggy-0-1-0-release","source":"@site/blog/2023-11-26-release-0.1.0.md","title":"Iggy 0.1.0 release","description":"We are happy to announce that Iggy.rs has reached the 0.1.0 release. This is a major milestone for the project, as it\'s getting closer to the first stable release.","date":"2023-11-26T00:00:00.000Z","tags":[{"inline":true [...]
\ No newline at end of file
diff --git a/assets/js/17896441.d7a5b32e.js b/assets/js/17896441.d7a5b32e.js
new file mode 100644
index 00000000..96cf641a
--- /dev/null
+++ b/assets/js/17896441.d7a5b32e.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[8401],{1689:(e,n,t)=>{t.d(n,{A:()=>d});t(6540);var s=t(4164),a=t(4084),i=t(7559),l=t(7293),o=t(4848);function r({className:e}){return(0,o.jsx)(l.A,{type:"caution",title:(0,o.jsx)(a.Yh,{}),className:(0,s.A)(e,i.G.common.draftBanner),children:(0,o.jsx)(a.TT,{})})}var c=t(2234);function d({metadata:e}){const{unlisted:n,frontMatter:t}=e;return(0,o.jsxs)(o.Fragment,{children:[(n||t.unlisted)&&(0, [...]
\ No newline at end of file
diff --git a/assets/js/17e33b4e.b0dffc45.js b/assets/js/17e33b4e.b0dffc45.js
new file mode 100644
index 00000000..c4737c69
--- /dev/null
+++ b/assets/js/17e33b4e.b0dffc45.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[1689],{3879:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>c,contentTitle:()=>d,default:()=>h,frontMatter:()=>l,metadata:()=>i,toc:()=>o});const i=JSON.parse('{"id":"server/server-schema","title":"Schema","description":"Since the Iggy server supports a variety of transport protocols, it is important to have a common schema for all of them, that will represent the data in a unified way. Commands (request [...]
\ No newline at end of file
diff --git a/assets/js/19432d33.f98b55c4.js b/assets/js/19432d33.f98b55c4.js
new file mode 100644
index 00000000..fc361a35
--- /dev/null
+++ b/assets/js/19432d33.f98b55c4.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[3986],{5675:s=>{s.exports=JSON.parse('{"tag":{"label":"message-checksum","permalink":"/blogs/tags/message-checksum","allTagsPath":"/blogs/tags","count":1,"unlisted":false},"listMetadata":{"permalink":"/blogs/tags/message-checksum","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blogs"}}')}}]);
\ No newline at end of file
diff --git a/assets/js/1b6ff2c5.21356684.js b/assets/js/1b6ff2c5.21356684.js
new file mode 100644
index 00000000..b7b79b49
--- /dev/null
+++ b/assets/js/1b6ff2c5.21356684.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[5754],{5091:e=>{e.exports=JSON.parse('{"archive":{"blogPosts":[{"id":"/2025/12/09/release-0.6.0","metadata":{"permalink":"/blogs/2025/12/09/release-0.6.0","source":"@site/blog/2025-12-09-release-0.6.0.md","title":"Apache Iggy 0.6.0 Release","description":"Release 0.6.0","date":"2025-12-09T00:00:00.000Z","tags":[{"inline":true,"label":"release","permalink":"/blogs/tags/release"},{"inline":tru [...]
\ No newline at end of file
diff --git a/assets/js/1ccbcc53.e07bbf74.js b/assets/js/1ccbcc53.e07bbf74.js
new file mode 100644
index 00000000..9c783de0
--- /dev/null
+++ b/assets/js/1ccbcc53.e07bbf74.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[586],{5145:(t,e,o)=>{o.r(e),o.d(e,{assets:()=>c,contentTitle:()=>a,default:()=>d,frontMatter:()=>r,metadata:()=>n,toc:()=>p});const n=JSON.parse('{"id":"sdk/python/sdk-python-intro","title":"Intro","description":"The Iggy Python SDK is a client library that allows you to interact with the Iggy API from your Python application. Repository can be found here.","source":"@site/docs/sdk/python/in [...]
\ No newline at end of file
diff --git a/assets/js/1df93b7f.673a3437.js b/assets/js/1df93b7f.673a3437.js
new file mode 100644
index 00000000..8ff1d74c
--- /dev/null
+++ b/assets/js/1df93b7f.673a3437.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[4583],{2082:(e,a,s)=>{s.r(a),s.d(a,{default:()=>c});var t=s(4586),n=s(1656);s(1107);var r=s(4848);s(4276).A,r.Fragment,s(8444).A,r.Fragment,s(8705).A,r.Fragment,s(3370).A,r.Fragment,s(8968).A,r.Fragment,s(3043).A,r.Fragment;function l(){return(0,r.jsx)("div",{className:"build-for-performance",children:(0,r.jsx)("div",{className:"container",children:(0,r.jsxs)("div",{className:"wrapper-m",chi [...]
\ No newline at end of file
diff --git a/assets/js/1e0e7c89.2b1af6bd.js b/assets/js/1e0e7c89.2b1af6bd.js
new file mode 100644
index 00000000..a0ecdbd1
--- /dev/null
+++ b/assets/js/1e0e7c89.2b1af6bd.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[9195],{1783:a=>{a.exports=JSON.parse('{"tag":{"label":"async","permalink":"/blogs/tags/async","allTagsPath":"/blogs/tags","count":1,"unlisted":false},"listMetadata":{"permalink":"/blogs/tags/async","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blogs"}}')}}]);
\ No newline at end of file
diff --git a/assets/js/1e5ad4f9.5e2cfa1c.js b/assets/js/1e5ad4f9.5e2cfa1c.js
new file mode 100644
index 00000000..1aa267c8
--- /dev/null
+++ b/assets/js/1e5ad4f9.5e2cfa1c.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[7452],{8453:(t,e,n)=>{n.d(e,{R:()=>i,x:()=>a});var o=n(6540);const s={},r=o.createContext(s);function i(t){const e=o.useContext(r);return o.useMemo(function(){return"function"==typeof t?t(e):{...e,...t}},[e,t])}function a(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(s):t.components||s:i(t.components),o.createElement(r.Provider,{value:e},t.children)}}, [...]
\ No newline at end of file
diff --git a/assets/js/1f391b9e.c18cd7bf.js b/assets/js/1f391b9e.c18cd7bf.js
new file mode 100644
index 00000000..c2b30161
--- /dev/null
+++ b/assets/js/1f391b9e.c18cd7bf.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[6061],{1689:(e,n,t)=>{t.d(n,{A:()=>d});t(6540);var i=t(4164),a=t(4084),s=t(7559),r=t(7293),l=t(4848);function c({className:e}){return(0,l.jsx)(r.A,{type:"caution",title:(0,l.jsx)(a.Yh,{}),className:(0,i.A)(e,s.G.common.draftBanner),children:(0,l.jsx)(a.TT,{})})}var o=t(2234);function d({metadata:e}){const{unlisted:n,frontMatter:t}=e;return(0,l.jsxs)(l.Fragment,{children:[(n||t.unlisted)&&(0, [...]
\ No newline at end of file
diff --git a/assets/js/20544421.d6213ad7.js b/assets/js/20544421.d6213ad7.js
new file mode 100644
index 00000000..bb3596ba
--- /dev/null
+++ b/assets/js/20544421.d6213ad7.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[4877],{1991:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>a,contentTitle:()=>c,default:()=>h,frontMatter:()=>s,metadata:()=>i,toc:()=>d});const i=JSON.parse('{"id":"connectors/connectors-introduction","title":"Introduction","description":"The highly performant and modular runtime for statically typed, yet dynamically loaded connectors. Ingest the data from the external sources and push it further to th [...]
\ No newline at end of file
diff --git a/assets/js/20777f46.dbc6f3e2.js b/assets/js/20777f46.dbc6f3e2.js
new file mode 100644
index 00000000..da835cf7
--- /dev/null
+++ b/assets/js/20777f46.dbc6f3e2.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[9618],{2412:e=>{e.exports=JSON.parse('{"authors":[{"name":"Piotr Gankiewicz","title":"Apache Iggy founder","url":"https://github.com/spetz","imageURL":"/img/authors/piotr.png","key":"piotr","page":null,"count":17},{"name":"Grzegorz Koszyk","title":"Apache Iggy PPMC Member","url":"https://github.com/numinnex","imageURL":"/img/authors/grzegorz.png","key":"grzegorz","page":null,"count":1},{"nam [...]
\ No newline at end of file
diff --git a/assets/js/218f3d72.37781d12.js b/assets/js/218f3d72.37781d12.js
new file mode 100644
index 00000000..51c39e30
--- /dev/null
+++ b/assets/js/218f3d72.37781d12.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[6904],{369:a=>{a.exports=JSON.parse('{"tag":{"label":"update","permalink":"/blogs/tags/update","allTagsPath":"/blogs/tags","count":1,"unlisted":false},"listMetadata":{"permalink":"/blogs/tags/update","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blogs"}}')}}]);
\ No newline at end of file
diff --git a/assets/js/21becccd.cd40ea52.js b/assets/js/21becccd.cd40ea52.js
new file mode 100644
index 00000000..6fe65ee4
--- /dev/null
+++ b/assets/js/21becccd.cd40ea52.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[5084],{4837:a=>{a.exports=JSON.parse('{"tag":{"label":"io_uring","permalink":"/blogs/tags/io-uring","allTagsPath":"/blogs/tags","count":1,"unlisted":false},"listMetadata":{"permalink":"/blogs/tags/io-uring","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blogs"}}')}}]);
\ No newline at end of file
diff --git a/assets/js/2237.6c3e7917.js b/assets/js/2237.6c3e7917.js
new file mode 100644
index 00000000..0d8b8ba4
--- /dev/null
+++ b/assets/js/2237.6c3e7917.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[2237],{2237:(e,t,i)=>{i.r(t),i.d(t,{default:()=>h});i(6540);var n=i(1312),o=i(5500),s=i(1656),a=i(3363),r=i(4848);function h(){const e=(0,n.T)({id:"theme.NotFound.title",message:"Page Not Found"});return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(o.be,{title:e}),(0,r.jsx)(s.A,{children:(0,r.jsx)(a.A,{})})]})}},3363:(e,t,i)=>{i.d(t,{A:()=>r});i(6540);var n=i(4164),o=i(1312),s=i(1107),a=i(4848) [...]
\ No newline at end of file
diff --git a/assets/js/25cfbc78.0066d365.js b/assets/js/25cfbc78.0066d365.js
new file mode 100644
index 00000000..bca912f8
--- /dev/null
+++ b/assets/js/25cfbc78.0066d365.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[1223],{3430:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>a,contentTitle:()=>c,default:()=>u,frontMatter:()=>s,metadata:()=>t,toc:()=>d});const t=JSON.parse('{"id":"server/server-docker","title":"Docker","description":"You can easily run the Iggy server with Docker - the official images can be found here, simply type docker pull apache/iggy.","source":"@site/docs/server/docker.md","sourceDirName":"serv [...]
\ No newline at end of file
diff --git a/assets/js/296d7672.c7832931.js b/assets/js/296d7672.c7832931.js
new file mode 100644
index 00000000..8e8ac1f8
--- /dev/null
+++ b/assets/js/296d7672.c7832931.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[4906],{807:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>c,contentTitle:()=>u,default:()=>l,frontMatter:()=>o,metadata:()=>s,toc:()=>d});var s=r(9603),i=r(4848),t=r(8453);const o={title:"Consumer identifier",slug:"consumer-identifier",authors:["piotr"],tags:["new-features","consumers","identifier"],hide_table_of_contents:!1},u=void 0,c={authorsImageUrls:[void 0]},d=[{value:"Breaking changes",id:"breaki [...]
\ No newline at end of file
diff --git a/assets/js/2edd2ec4.b07d806b.js b/assets/js/2edd2ec4.b07d806b.js
new file mode 100644
index 00000000..d0be6b5c
--- /dev/null
+++ b/assets/js/2edd2ec4.b07d806b.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[290],{8453:(t,e,o)=>{o.d(e,{R:()=>r,x:()=>a});var n=o(6540);const i={},s=n.createContext(i);function r(t){const e=n.useContext(s);return n.useMemo(function(){return"function"==typeof t?t(e):{...e,...t}},[e,t])}function a(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(i):t.components||i:r(t.components),n.createElement(s.Provider,{value:e},t.children)}},9 [...]
\ No newline at end of file
diff --git a/assets/js/2f80e784.a39c8d58.js b/assets/js/2f80e784.a39c8d58.js
new file mode 100644
index 00000000..09492a6e
--- /dev/null
+++ b/assets/js/2f80e784.a39c8d58.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[8143],{6958:(e,s,t)=>{t.r(s),t.d(s,{assets:()=>c,contentTitle:()=>i,default:()=>d,frontMatter:()=>o,metadata:()=>n,toc:()=>p});const n=JSON.parse('{"id":"sdk/csharp/sdk-csharp-examples","title":"Examples","description":"","source":"@site/docs/sdk/csharp/examples.md","sourceDirName":"sdk/csharp","slug":"/sdk/csharp/examples","permalink":"/docs/sdk/csharp/examples","draft":false,"unlisted":fal [...]
\ No newline at end of file
diff --git a/assets/js/3049ae2a.488bf80d.js b/assets/js/3049ae2a.488bf80d.js
new file mode 100644
index 00000000..acacb23d
--- /dev/null
+++ b/assets/js/3049ae2a.488bf80d.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[3922],{725:e=>{e.exports=JSON.parse('{"permalink":"/blogs/personal-access-tokens","source":"@site/blog/2023-10-12-personal-access-tokens.md","title":"Personal access tokens","description":"Since the most recent update, Iggy.rs supports personal access tokens, which can be used to authenticate the clients, instead of the username and password. The tokens can be created and deleted using the a [...]
\ No newline at end of file
diff --git a/assets/js/332362b2.39ebe1e6.js b/assets/js/332362b2.39ebe1e6.js
new file mode 100644
index 00000000..c9b6da04
--- /dev/null
+++ b/assets/js/332362b2.39ebe1e6.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[2244],{218:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>o,default:()=>h,frontMatter:()=>a,metadata:()=>s,toc:()=>l});const s=JSON.parse('{"id":"server/server-configuration","title":"Configuration","description":"The configuration can be found in server.toml file in configs directory. The config file is loaded from the current working directory, but you can specify the path to the co [...]
\ No newline at end of file
diff --git a/assets/js/354f99ce.89131802.js b/assets/js/354f99ce.89131802.js
new file mode 100644
index 00000000..38218c43
--- /dev/null
+++ b/assets/js/354f99ce.89131802.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[6843],{2821:e=>{e.exports=JSON.parse('{"permalink":"/blogs/2025/08/10/release-0.5.0","source":"@site/blog/2025-08-10-release-0.5.0.md","title":"Apache Iggy 0.5.0 Release","description":"Release 0.5.0","date":"2025-08-10T00:00:00.000Z","tags":[{"inline":true,"label":"release","permalink":"/blogs/tags/release"},{"inline":true,"label":"0.5.0","permalink":"/blogs/tags/0-5-0"},{"inline":true,"lab [...]
\ No newline at end of file
diff --git a/assets/js/363979b1.b3617742.js b/assets/js/363979b1.b3617742.js
new file mode 100644
index 00000000..6fb561aa
--- /dev/null
+++ b/assets/js/363979b1.b3617742.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[1335],{317:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>o,contentTitle:()=>a,default:()=>d,frontMatter:()=>c,metadata:()=>s,toc:()=>h});const s=JSON.parse('{"id":"server/server-benchmarking","title":"Benchmarking","description":"Benchmarks should be the first-class citizens. We believe that performance is crucial for any system, and we strive to provide the best possible performance for our users. Ple [...]
\ No newline at end of file
diff --git a/assets/js/36994c47.1e60f9d1.js b/assets/js/36994c47.1e60f9d1.js
new file mode 100644
index 00000000..d9dc9a1e
--- /dev/null
+++ b/assets/js/36994c47.1e60f9d1.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[9858],{5516:e=>{e.exports=JSON.parse('{"name":"docusaurus-plugin-content-blog","id":"default"}')}}]);
\ No newline at end of file
diff --git a/assets/js/393be207.07c8ec51.js b/assets/js/393be207.07c8ec51.js
new file mode 100644
index 00000000..dffee19d
--- /dev/null
+++ b/assets/js/393be207.07c8ec51.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[4134],{591:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>p,default:()=>l,frontMatter:()=>s,metadata:()=>a,toc:()=>i});const a=JSON.parse('{"type":"mdx","permalink":"/markdown-page","source":"@site/src/pages/markdown-page.md","title":"Markdown page example","description":"You don\'t need React to write simple standalone pages.","frontMatter":{"title":"Markdown page example"},"unlisted [...]
\ No newline at end of file
diff --git a/assets/js/3defdf4b.ff8218cb.js b/assets/js/3defdf4b.ff8218cb.js
new file mode 100644
index 00000000..18a039fa
--- /dev/null
+++ b/assets/js/3defdf4b.ff8218cb.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[9919],{297:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>a,default:()=>p,frontMatter:()=>r,metadata:()=>s,toc:()=>l});const s=JSON.parse('{"id":"sdk/node/sdk-node-examples","title":"Examples","description":"","source":"@site/docs/sdk/node/examples.md","sourceDirName":"sdk/node","slug":"/sdk/node/examples","permalink":"/docs/sdk/node/examples","draft":false,"unlisted":false,"tags":[], [...]
\ No newline at end of file
diff --git a/assets/js/3e020208.096f0d3f.js b/assets/js/3e020208.096f0d3f.js
new file mode 100644
index 00000000..2fb0f543
--- /dev/null
+++ b/assets/js/3e020208.096f0d3f.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[2399],{5569:a=>{a.exports=JSON.parse('{"tag":{"label":"0.5.0","permalink":"/blogs/tags/0-5-0","allTagsPath":"/blogs/tags","count":1,"unlisted":false},"listMetadata":{"permalink":"/blogs/tags/0-5-0","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blogs"}}')}}]);
\ No newline at end of file
diff --git a/assets/js/41d2f7e6.4ebdea67.js b/assets/js/41d2f7e6.4ebdea67.js
new file mode 100644
index 00000000..8b5a995e
--- /dev/null
+++ b/assets/js/41d2f7e6.4ebdea67.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[2060],{3721:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>l,contentTitle:()=>c,default:()=>u,frontMatter:()=>r,metadata:()=>o,toc:()=>a});const o=JSON.parse('{"id":"connectors/sources/connectors-sources-postgres","title":"Postgres Source","description":"The PostgreSQL source connector allows you to fetch data from PostgreSQL databases and stream it to Iggy topics. It supports both table polling and Cha [...]
\ No newline at end of file
diff --git a/assets/js/41e60a44.218722f3.js b/assets/js/41e60a44.218722f3.js
new file mode 100644
index 00000000..c85ce37b
--- /dev/null
+++ b/assets/js/41e60a44.218722f3.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[3286],{3757:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>l,contentTitle:()=>r,default:()=>p,frontMatter:()=>i,metadata:()=>a,toc:()=>d});const a=JSON.parse('{"id":"sdk/java/sdk-java-examples","title":"Examples","description":"","source":"@site/docs/sdk/java/examples.md","sourceDirName":"sdk/java","slug":"/sdk/java/examples","permalink":"/docs/sdk/java/examples","draft":false,"unlisted":false,"tags":[] [...]
\ No newline at end of file
diff --git a/assets/js/46167e1b.5ffdfdf8.js b/assets/js/46167e1b.5ffdfdf8.js
new file mode 100644
index 00000000..209937e1
--- /dev/null
+++ b/assets/js/46167e1b.5ffdfdf8.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[8501],{638:(t,e,o)=>{o.r(e),o.d(e,{assets:()=>c,contentTitle:()=>a,default:()=>d,frontMatter:()=>s,metadata:()=>n,toc:()=>p});const n=JSON.parse('{"id":"sdk/csharp/sdk-csharp-intro","title":"Intro","description":"The Iggy SDK for C# is a library that allows you to interact with the Iggy API from your C# applications. This SDK provides a convenient way to interact with the Iggy API and allows [...]
\ No newline at end of file
diff --git a/assets/js/4726e312.53413681.js b/assets/js/4726e312.53413681.js
new file mode 100644
index 00000000..01a9a454
--- /dev/null
+++ b/assets/js/4726e312.53413681.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[6185],{5490:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>a,contentTitle:()=>c,default:()=>l,frontMatter:()=>s,metadata:()=>i,toc:()=>d});const i=JSON.parse('{"id":"server/server-introduction","title":"Introduction","description":"Introduction","source":"@site/docs/server/introduction.md","sourceDirName":"server","slug":"/server/introduction","permalink":"/docs/server/introduction","draft":false,"unlis [...]
\ No newline at end of file
diff --git a/assets/js/48f67714.1c3059fb.js b/assets/js/48f67714.1c3059fb.js
new file mode 100644
index 00000000..8a827d3b
--- /dev/null
+++ b/assets/js/48f67714.1c3059fb.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[2486],{3646:(n,e,t)=>{t.r(e),t.d(e,{assets:()=>a,contentTitle:()=>r,default:()=>l,frontMatter:()=>c,metadata:()=>i,toc:()=>u});const i=JSON.parse('{"id":"connectors/sinks/connectors-sinks-quickwit","title":"Quickwit Sink","description":"The Quickwit connector allows you to send data to the Quickwit API using HTTP. This sink will ensure that the index exists (create it if it doesn\'t) and wil [...]
\ No newline at end of file
diff --git a/assets/js/5159.4a3ad2a8.js b/assets/js/5159.4a3ad2a8.js
new file mode 100644
index 00000000..88ccd5b7
--- /dev/null
+++ b/assets/js/5159.4a3ad2a8.js
@@ -0,0 +1 @@
+(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[5159],{540:(e,t,n)=>{"use strict";n.d(t,{A:()=>ze});var s=n(6540),a=n(8453),r=n(5260),c=n(2303),o=n(4164),i=n(5293),l=n(6342);function d(){const{prism:e}=(0,l.p)(),{colorMode:t}=(0,i.G)(),n=e.theme,s=e.darkTheme||n;return"dark"===t?s:n}var u=n(7559),m=n(8426),h=n.n(m),f=n(9532),p=n(4848);const g=/title=(?<quote>["'])(?<title>.*?)\1/,x=/\{(?<range>[\d,-]+)\}/,j={js:{start:"\\/\\/",end:""},jsBlock:{start:" [...]
\ No newline at end of file
diff --git a/assets/js/544367a9.c65b84c0.js b/assets/js/544367a9.c65b84c0.js
new file mode 100644
index 00000000..46843fe5
--- /dev/null
+++ b/assets/js/544367a9.c65b84c0.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[492],{7842:e=>{e.exports=JSON.parse('{"tags":[{"label":"release","permalink":"/blogs/tags/release","count":3},{"label":"0.6.0","permalink":"/blogs/tags/0-6-0","count":1},{"label":"announcement","permalink":"/blogs/tags/announcement","count":2},{"label":"websocket","permalink":"/blogs/tags/websocket","count":1},{"label":"io_uring","permalink":"/blogs/tags/io-uring","count":1},{"label":"async" [...]
\ No newline at end of file
diff --git a/assets/js/54b5fc15.201edbba.js b/assets/js/54b5fc15.201edbba.js
new file mode 100644
index 00000000..49da749c
--- /dev/null
+++ b/assets/js/54b5fc15.201edbba.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[8848],{1975:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>g,frontMatter:()=>a,metadata:()=>r,toc:()=>l});var r=n(3093),o=n(4848),i=n(8453);const a={title:"Zero-copy (de)serialization",authors:["grzegorz","hubert"],tags:[],hide_table_of_contents:!1,date:new Date("2025-05-08T00:00:00.000Z")},s=void 0,c={authorsImageUrls:[void 0,void 0]},l=[{value:"Introduction",id:"introd [...]
\ No newline at end of file
diff --git a/assets/js/5a05130f.bc1f4807.js b/assets/js/5a05130f.bc1f4807.js
new file mode 100644
index 00000000..34cb51cb
--- /dev/null
+++ b/assets/js/5a05130f.bc1f4807.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[1258],{5048:e=>{e.exports=JSON.parse('{"metadata":{"permalink":"/blogs","page":1,"postsPerPage":10,"totalPages":2,"totalCount":19,"nextPage":"/blogs/page/2","blogDescription":"Blog","blogTitle":"Blogs"}}')}}]);
\ No newline at end of file
diff --git a/assets/js/5e95c892.37dc07a6.js b/assets/js/5e95c892.37dc07a6.js
new file mode 100644
index 00000000..0064765f
--- /dev/null
+++ b/assets/js/5e95c892.37dc07a6.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[9647],{7121:(e,s,r)=>{r.r(s),r.d(s,{default:()=>g});r(6540);var a=r(4164),i=r(7559),t=r(5500),u=r(2831),c=r(1656),l=r(4848);function g(e){return(0,l.jsx)(t.e3,{className:(0,a.A)(i.G.wrapper.docsPages),children:(0,l.jsx)(c.A,{children:(0,u.v)(e.route.routes)})})}}}]);
\ No newline at end of file
diff --git a/assets/js/5f481cd4.41d5e514.js b/assets/js/5f481cd4.41d5e514.js
new file mode 100644
index 00000000..2b53738c
--- /dev/null
+++ b/assets/js/5f481cd4.41d5e514.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[6190],{1628:(e,t,s)=>{s.d(t,{A:()=>r});const r=s.p+"assets/images/iggy_batch_schema_2-c7a5fc6158b838999c178ef8aea96089.png"},3093:e=>{e.exports=JSON.parse('{"permalink":"/blogs/2025/05/08/zero-copy-deserialization","source":"@site/blog/2025-05-08-zero-copy-deserialization.md","title":"Zero-copy (de)serialization","description":"Introduction","date":"2025-05-08T00:00:00.000Z","tags":[],"readi [...]
\ No newline at end of file
diff --git a/assets/js/621db11d.819d0f16.js b/assets/js/621db11d.819d0f16.js
new file mode 100644
index 00000000..1e780407
--- /dev/null
+++ b/assets/js/621db11d.819d0f16.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[4212],{3250:(t,s,e)=>{e.r(s),e.d(s,{default:()=>m});e(6540);var a=e(4164),o=e(5500),r=e(7559),u=e(6461),l=e(8027),i=e(1463),n=e(1107),h=e(9907);const c={authorListItem:"authorListItem_n3yI"};var g=e(4848);function p({author:t}){return(0,g.jsx)("li",{className:c.authorListItem,children:(0,g.jsx)(h.A,{as:"h2",author:t,count:t.count})})}function d({authors:t}){return(0,g.jsx)("section",{classNa [...]
\ No newline at end of file
diff --git a/assets/js/62290500.da4bf761.js b/assets/js/62290500.da4bf761.js
new file mode 100644
index 00000000..3e03078f
--- /dev/null
+++ b/assets/js/62290500.da4bf761.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[7349],{1695:(e,s,t)=>{t.r(s),t.d(s,{assets:()=>l,contentTitle:()=>a,default:()=>u,frontMatter:()=>o,metadata:()=>n,toc:()=>d});const n=JSON.parse('{"id":"sdk/rust/sdk-rust-examples","title":"Examples","description":"In the core repository, you can find the following examples using the Rust SDK:","source":"@site/docs/sdk/rust/examples.md","sourceDirName":"sdk/rust","slug":"/sdk/rust/examples" [...]
\ No newline at end of file
diff --git a/assets/js/62f16c65.74087662.js b/assets/js/62f16c65.74087662.js
new file mode 100644
index 00000000..72975005
--- /dev/null
+++ b/assets/js/62f16c65.74087662.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[1014],{80:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>u,frontMatter:()=>o,metadata:()=>a,toc:()=>c});var a=n(9902),r=n(4848),s=n(8453);const o={title:"Apache Iggy 0.6.0 Release",authors:["piotr"],tags:["release","0.6.0","announcement"],hide_table_of_contents:!1,date:new Date("2025-12-09T00:00:00.000Z")},i=void 0,l={authorsImageUrls:[void 0]},c=[{value:"Release 0.6.0", [...]
\ No newline at end of file
diff --git a/assets/js/64ee4266.3c907e7e.js b/assets/js/64ee4266.3c907e7e.js
new file mode 100644
index 00000000..5ad68c38
--- /dev/null
+++ b/assets/js/64ee4266.3c907e7e.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[8245],{2121:a=>{a.exports=JSON.parse('{"tag":{"label":"breaking-changes","permalink":"/blogs/tags/breaking-changes","allTagsPath":"/blogs/tags","count":1,"unlisted":false},"listMetadata":{"permalink":"/blogs/tags/breaking-changes","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blogs"}}')}}]);
\ No newline at end of file
diff --git a/assets/js/666c9b96.a99edd99.js b/assets/js/666c9b96.a99edd99.js
new file mode 100644
index 00000000..62da6499
--- /dev/null
+++ b/assets/js/666c9b96.a99edd99.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[1242],{8584:s=>{s.exports=JSON.parse('{"tag":{"label":"users","permalink":"/blogs/tags/users","allTagsPath":"/blogs/tags","count":1,"unlisted":false},"listMetadata":{"permalink":"/blogs/tags/users","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blogs"}}')}}]);
\ No newline at end of file
diff --git a/assets/js/6875c492.54465a18.js b/assets/js/6875c492.54465a18.js
new file mode 100644
index 00000000..ae5d60b6
--- /dev/null
+++ b/assets/js/6875c492.54465a18.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[4813],{2053:(e,t,a)=>{a.d(t,{A:()=>o});a(6540);var n=a(4164),s=a(1312),i=a(6133);const r={tags:"tags_jXut",tag:"tag_QGVx"};var l=a(4848);function o({tags:e}){return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)("b",{children:(0,l.jsx)(s.A,{id:"theme.tags.tagsListLabel",description:"The label alongside a tag list",children:"Tags:"})}),(0,l.jsx)("ul",{className:(0,n.A)(r.tags,"padding--none","marg [...]
\ No newline at end of file
diff --git a/assets/js/6a23e949.842b7bde.js b/assets/js/6a23e949.842b7bde.js
new file mode 100644
index 00000000..17aacddc
--- /dev/null
+++ b/assets/js/6a23e949.842b7bde.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[2498],{2573:s=>{s.exports=JSON.parse('{"tag":{"label":"personal-access-tokens","permalink":"/blogs/tags/personal-access-tokens","allTagsPath":"/blogs/tags","count":1,"unlisted":false},"listMetadata":{"permalink":"/blogs/tags/personal-access-tokens","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blogs"}}')}}]);
\ No newline at end of file
diff --git a/assets/js/6a2e60e3.49ea32ea.js b/assets/js/6a2e60e3.49ea32ea.js
new file mode 100644
index 00000000..fc68889d
--- /dev/null
+++ b/assets/js/6a2e60e3.49ea32ea.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[6549],{4441:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>h,contentTitle:()=>a,default:()=>l,frontMatter:()=>o,metadata:()=>r,toc:()=>c});var r=n(5295),s=n(4848),i=n(8453);const o={title:"Transparent Benchmarking with Apache Iggy",authors:["piotr"],tags:[],hide_table_of_contents:!1,date:new Date("2025-02-17T00:00:00.000Z")},a=void 0,h={authorsImageUrls:[void 0]},c=[{value:"Benchmarks should be the firs [...]
\ No newline at end of file
diff --git a/assets/js/6ea6d42b.8ec6e032.js b/assets/js/6ea6d42b.8ec6e032.js
new file mode 100644
index 00000000..ea51d224
--- /dev/null
+++ b/assets/js/6ea6d42b.8ec6e032.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[8529],{331:e=>{e.exports=JSON.parse('{"permalink":"/blogs/iggy-0-1-0-release","source":"@site/blog/2023-11-26-release-0.1.0.md","title":"Iggy 0.1.0 release","description":"We are happy to announce that Iggy.rs has reached the 0.1.0 release. This is a major milestone for the project, as it\'s getting closer to the first stable release.","date":"2023-11-26T00:00:00.000Z","tags":[{"inline":true [...]
\ No newline at end of file
diff --git a/assets/js/71369862.389b65a4.js b/assets/js/71369862.389b65a4.js
new file mode 100644
index 00000000..0e6c0a80
--- /dev/null
+++ b/assets/js/71369862.389b65a4.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[195],{7823:e=>{e.exports=JSON.parse('{"metadata":{"permalink":"/blogs/page/2","page":2,"postsPerPage":10,"totalPages":2,"totalCount":19,"previousPage":"/blogs","blogDescription":"Blog","blogTitle":"Blogs"}}')}}]);
\ No newline at end of file
diff --git a/assets/js/71a4f72a.33b69016.js b/assets/js/71a4f72a.33b69016.js
new file mode 100644
index 00000000..bd1f2bca
--- /dev/null
+++ b/assets/js/71a4f72a.33b69016.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[4382],{6775:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>a,default:()=>d,frontMatter:()=>o,metadata:()=>r,toc:()=>l});const r=JSON.parse('{"id":"sdk/rust/sdk-rust-stream-builder","title":"Stream Builder","description":"In the previous section, the high level SDK introduced the connection string to simplify the client configuration and","source":"@site/docs/sdk/rust/stream_builder.md [...]
\ No newline at end of file
diff --git a/assets/js/75ca37af.95fd5b0a.js b/assets/js/75ca37af.95fd5b0a.js
new file mode 100644
index 00000000..b27b2dec
--- /dev/null
+++ b/assets/js/75ca37af.95fd5b0a.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[4292],{3762:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>l,contentTitle:()=>r,default:()=>g,frontMatter:()=>o,metadata:()=>a,toc:()=>d});const a=JSON.parse('{"id":"connectors/sinks/connectors-sinks-postgres","title":"Postgres Sink","description":"The PostgreSQL sink connector allows you to consume messages from Iggy topics and store them in PostgreSQL databases.","source":"@site/docs/connectors/sinks/ [...]
\ No newline at end of file
diff --git a/assets/js/76680d72.316aea42.js b/assets/js/76680d72.316aea42.js
new file mode 100644
index 00000000..1ff57da3
--- /dev/null
+++ b/assets/js/76680d72.316aea42.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[2669],{2803:e=>{e.exports=JSON.parse('{"tag":{"label":"message-headers","permalink":"/blogs/tags/message-headers","allTagsPath":"/blogs/tags","count":1,"unlisted":false},"listMetadata":{"permalink":"/blogs/tags/message-headers","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blogs"}}')}}]);
\ No newline at end of file
diff --git a/assets/js/782bd44c.8e7b6968.js b/assets/js/782bd44c.8e7b6968.js
new file mode 100644
index 00000000..24723d7d
--- /dev/null
+++ b/assets/js/782bd44c.8e7b6968.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[3173],{8399:l=>{l.exports=JSON.parse('{"tag":{"label":"hello","permalink":"/blogs/tags/hello","allTagsPath":"/blogs/tags","count":1,"unlisted":false},"listMetadata":{"permalink":"/blogs/tags/hello","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blogs"}}')}}]);
\ No newline at end of file
diff --git a/assets/js/7d3d0ee4.4863b032.js b/assets/js/7d3d0ee4.4863b032.js
new file mode 100644
index 00000000..47311b21
--- /dev/null
+++ b/assets/js/7d3d0ee4.4863b032.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[2729],{3020:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>m,frontMatter:()=>r,metadata:()=>s,toc:()=>h});var s=a(4529),n=a(4848),o=a(8453);const r={title:"Message headers",slug:"message-headers",authors:["piotr"],tags:["new-features","message-headers","breaking-changes"],hide_table_of_contents:!1},i=void 0,l={authorsImageUrls:[void 0]},h=[];function g(e){const t={p:"p", [...]
\ No newline at end of file
diff --git a/assets/js/7e31e0a8.09702a89.js b/assets/js/7e31e0a8.09702a89.js
new file mode 100644
index 00000000..943cf701
--- /dev/null
+++ b/assets/js/7e31e0a8.09702a89.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[4347],{2492:s=>{s.exports=JSON.parse('{"tag":{"label":"permissions","permalink":"/blogs/tags/permissions","allTagsPath":"/blogs/tags","count":1,"unlisted":false},"listMetadata":{"permalink":"/blogs/tags/permissions","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blogs"}}')}}]);
\ No newline at end of file
diff --git a/assets/js/7eb7d8a5.702c4cec.js b/assets/js/7eb7d8a5.702c4cec.js
new file mode 100644
index 00000000..28ae8c89
--- /dev/null
+++ b/assets/js/7eb7d8a5.702c4cec.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[9160],{5304:a=>{a.exports=JSON.parse('{"tag":{"label":"pat","permalink":"/blogs/tags/pat","allTagsPath":"/blogs/tags","count":1,"unlisted":false},"listMetadata":{"permalink":"/blogs/tags/pat","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blogs"}}')}}]);
\ No newline at end of file
diff --git a/assets/js/814f3328.06173faf.js b/assets/js/814f3328.06173faf.js
new file mode 100644
index 00000000..547c9a60
--- /dev/null
+++ b/assets/js/814f3328.06173faf.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[7472],{5513:e=>{e.exports=JSON.parse('{"title":"Recent posts","items":[{"title":"Apache Iggy 0.6.0 Release","permalink":"/blogs/2025/12/09/release-0.6.0","unlisted":false,"date":"2025-12-09T00:00:00.000Z"},{"title":"Building WebSocket Protocol in Apache Iggy using io_uring and Completion Based I/O Architecture","permalink":"/blogs/2025/11/17/websocket-io-uring","unlisted":false,"date":"2025- [...]
\ No newline at end of file
diff --git a/assets/js/8159d786.a420f58d.js b/assets/js/8159d786.a420f58d.js
new file mode 100644
index 00000000..08f2d135
--- /dev/null
+++ b/assets/js/8159d786.a420f58d.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[8073],{4633:e=>{e.exports=JSON.parse('{"permalink":"/blogs/2025/11/17/websocket-io-uring","source":"@site/blog/2025-11-17-websocket-io-uring.md","title":"Building WebSocket Protocol in Apache Iggy using io_uring and Completion Based I/O Architecture","description":"Introduction","date":"2025-11-17T00:00:00.000Z","tags":[{"inline":true,"label":"websocket","permalink":"/blogs/tags/websocket"}, [...]
\ No newline at end of file
diff --git a/assets/js/83d73c01.973abd8d.js b/assets/js/83d73c01.973abd8d.js
new file mode 100644
index 00000000..3f53d74e
--- /dev/null
+++ b/assets/js/83d73c01.973abd8d.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[448],{6641:(t,e,n)=>{n.r(e),n.d(e,{assets:()=>a,contentTitle:()=>c,default:()=>l,frontMatter:()=>s,metadata:()=>o,toc:()=>u});const o=JSON.parse('{"id":"ai/ai-introduction","title":"Introduction","description":"This module contains the AI-related components of the Apache Iggy message streaming infrastructure.","source":"@site/docs/ai/introduction.md","sourceDirName":"ai","slug":"/ai/introduc [...]
\ No newline at end of file
diff --git a/assets/js/8a6c01a6.639a0c4e.js b/assets/js/8a6c01a6.639a0c4e.js
new file mode 100644
index 00000000..d61816ca
--- /dev/null
+++ b/assets/js/8a6c01a6.639a0c4e.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[823],{6277:(t,e,o)=>{o.r(e),o.d(e,{assets:()=>c,contentTitle:()=>a,default:()=>p,frontMatter:()=>r,metadata:()=>n,toc:()=>l});const n=JSON.parse('{"id":"sdk/go/sdk-go-intro","title":"Intro","description":"The Iggy Go SDK is a client library that allows you to interact with the Iggy API from your Go application. Repository can be found here.","source":"@site/docs/sdk/go/intro.md","sourceDirNa [...]
\ No newline at end of file
diff --git a/assets/js/8b22b5f5.6d8995e6.js b/assets/js/8b22b5f5.6d8995e6.js
new file mode 100644
index 00000000..1b97b720
--- /dev/null
+++ b/assets/js/8b22b5f5.6d8995e6.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[9917],{5911:e=>{e.exports=JSON.parse('{"tag":{"label":"identifier","permalink":"/blogs/tags/identifier","allTagsPath":"/blogs/tags","count":1,"unlisted":false},"listMetadata":{"permalink":"/blogs/tags/identifier","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blogs"}}')}}]);
\ No newline at end of file
diff --git a/assets/js/8b8cddd6.09ed27e1.js b/assets/js/8b8cddd6.09ed27e1.js
new file mode 100644
index 00000000..9942310e
--- /dev/null
+++ b/assets/js/8b8cddd6.09ed27e1.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[7012],{4074:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>a,default:()=>h,frontMatter:()=>o,metadata:()=>s,toc:()=>c});const s=JSON.parse('{"id":"introduction/introduction-getting-started","title":"Getting started","description":"Before we start","source":"@site/docs/introduction/getting_started.md","sourceDirName":"introduction","slug":"/introduction/getting-started","permalink":"/d [...]
\ No newline at end of file
diff --git a/assets/js/8c2332e9.230bfb24.js b/assets/js/8c2332e9.230bfb24.js
new file mode 100644
index 00000000..e4e73f36
--- /dev/null
+++ b/assets/js/8c2332e9.230bfb24.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[7688],{1085:(e,t,n)=>{n.d(t,{A:()=>s});const s=n.p+"assets/images/iggy_bench-9ea0ebbd13ad66abb94ec3d8d8697048.jpeg"},2693:(e,t,n)=>{n.d(t,{A:()=>s});const s=n.p+"assets/images/iggys-5cd88b6e4af91d0e5b0f1ef688b8efac.jpeg"},2698:(e,t,n)=>{n.d(t,{A:()=>s});const s=n.p+"assets/images/iggy_server-b28372292592869008ceb03c1edfdc51.jpeg"},4170:e=>{e.exports=JSON.parse('{"permalink":"/blogs/2023/12/2 [...]
\ No newline at end of file
diff --git a/assets/js/8d3840f5.dd179b79.js b/assets/js/8d3840f5.dd179b79.js
new file mode 100644
index 00000000..ede2025c
--- /dev/null
+++ b/assets/js/8d3840f5.dd179b79.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[8541],{4468:a=>{a.exports=JSON.parse('{"tag":{"label":"performance","permalink":"/blogs/tags/performance","allTagsPath":"/blogs/tags","count":1,"unlisted":false},"listMetadata":{"permalink":"/blogs/tags/performance","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blogs"}}')}}]);
\ No newline at end of file
diff --git a/assets/js/907ba26f.e5873668.js b/assets/js/907ba26f.e5873668.js
new file mode 100644
index 00000000..83b7627a
--- /dev/null
+++ b/assets/js/907ba26f.e5873668.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[5214],{352:(e,t,n)=>{n.d(t,{A:()=>r});const r=n.p+"assets/images/iggy_vsr-3d747255ce17ecda927ccd4d258f7016.png"},3150:(e,t,n)=>{n.d(t,{A:()=>r});const r=n.p+"assets/images/iggy_technology_radar-291413e3a6d4cb1a5b7832ab5865423e.png"},3151:e=>{e.exports=JSON.parse('{"permalink":"/blogs/2024/10/28/technology-radar-and-currrent-goals","source":"@site/blog/2024-10-28-technology-radar-and-currrent [...]
\ No newline at end of file
diff --git a/assets/js/92abec30.3fcf9928.js b/assets/js/92abec30.3fcf9928.js
new file mode 100644
index 00000000..78f8acb5
--- /dev/null
+++ b/assets/js/92abec30.3fcf9928.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[8154],{2144:(e,s,n)=>{n.d(s,{A:()=>t});const t=n.p+"assets/images/iggy_cli-b139e02165e2570574ac638f7db8801f.png"},7812:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>c,contentTitle:()=>r,default:()=>d,frontMatter:()=>o,metadata:()=>t,toc:()=>l});const t=JSON.parse('{"id":"cli/cli-iggy-cli","title":"Iggy CLI","description":"The Iggy CLI is a command-line interface that allows you to interact with the Igg [...]
\ No newline at end of file
diff --git a/assets/js/94b97bcf.533c6de4.js b/assets/js/94b97bcf.533c6de4.js
new file mode 100644
index 00000000..cfac2516
--- /dev/null
+++ b/assets/js/94b97bcf.533c6de4.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[1467],{8500:a=>{a.exports=JSON.parse('{"tag":{"label":"compio","permalink":"/blogs/tags/compio","allTagsPath":"/blogs/tags","count":1,"unlisted":false},"listMetadata":{"permalink":"/blogs/tags/compio","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blogs"}}')}}]);
\ No newline at end of file
diff --git a/assets/js/9590c6d3.c1bc7f1a.js b/assets/js/9590c6d3.c1bc7f1a.js
new file mode 100644
index 00000000..669109b0
--- /dev/null
+++ b/assets/js/9590c6d3.c1bc7f1a.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[90],{4170:e=>{e.exports=JSON.parse('{"permalink":"/blogs/2023/12/29/building-message-streaming-in-rust","source":"@site/blog/2023-12-29-building-message-streaming-in-rust.md","title":"Iggy.rs - building message streaming in Rust","description":"Origins","date":"2023-12-29T00:00:00.000Z","tags":[],"readingTime":13.24,"hasTruncateMarker":true,"authors":[{"name":"Piotr Gankiewicz","title":"Apac [...]
\ No newline at end of file
diff --git a/assets/js/9785.c88c4f8f.js b/assets/js/9785.c88c4f8f.js
new file mode 100644
index 00000000..a67b03e8
--- /dev/null
+++ b/assets/js/9785.c88c4f8f.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[9785],{4096:(e,t,s)=>{s.d(t,{in:()=>c,OU:()=>A,Ki:()=>C,kJ:()=>x,x:()=>l,e7:()=>h,J_:()=>p,Gx:()=>k});var a=s(6540),n=s(9532),i=s(6803),r=s(4848);function l(){const e=(0,i.A)(),t=e?.data?.blogMetadata;if(!t)throw new Error("useBlogMetadata() can't be called on the current route because the blog metadata could not be found in route context");return t}const o=a.createContext(null);function c({ [...]
\ No newline at end of file
diff --git a/assets/js/98883e6e.7624cfd7.js b/assets/js/98883e6e.7624cfd7.js
new file mode 100644
index 00000000..4c7ab125
--- /dev/null
+++ b/assets/js/98883e6e.7624cfd7.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[7487],{2331:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>g,contentTitle:()=>i,default:()=>h,frontMatter:()=>o,metadata:()=>a,toc:()=>l});var a=s(9896),n=s(4848),r=s(8453);const o={title:"Iggy.rs \u2014 one year of building the message streaming",authors:["piotr"],tags:[],hide_table_of_contents:!1,date:new Date("2024-05-29T00:00:00.000Z")},i=void 0,g={authorsImageUrls:[void 0]},l=[{value:"Throwback",id [...]
\ No newline at end of file
diff --git a/assets/js/9ca9f017.ce7ac0ed.js b/assets/js/9ca9f017.ce7ac0ed.js
new file mode 100644
index 00000000..60f8bf87
--- /dev/null
+++ b/assets/js/9ca9f017.ce7ac0ed.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[8895],{2842:(e,t,i)=>{i.d(t,{A:()=>s});const s=i.p+"assets/images/architecture-5d7f7f7ed58a399ea2f5a7c74c074f65.png"},7676:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>h,contentTitle:()=>o,default:()=>l,frontMatter:()=>a,metadata:()=>s,toc:()=>c});const s=JSON.parse('{"id":"introduction/introduction-architecture","title":"Architecture","description":"Iggy is the persistent message streaming, which mea [...]
\ No newline at end of file
diff --git a/assets/js/9d09e2d4.26833eb9.js b/assets/js/9d09e2d4.26833eb9.js
new file mode 100644
index 00000000..427bbf83
--- /dev/null
+++ b/assets/js/9d09e2d4.26833eb9.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[1232],{4633:e=>{e.exports=JSON.parse('{"permalink":"/blogs/2025/11/17/websocket-io-uring","source":"@site/blog/2025-11-17-websocket-io-uring.md","title":"Building WebSocket Protocol in Apache Iggy using io_uring and Completion Based I/O Architecture","description":"Introduction","date":"2025-11-17T00:00:00.000Z","tags":[{"inline":true,"label":"websocket","permalink":"/blogs/tags/websocket"}, [...]
\ No newline at end of file
diff --git a/assets/js/9e4087bc.cca813d0.js b/assets/js/9e4087bc.cca813d0.js
new file mode 100644
index 00000000..9b0b99f1
--- /dev/null
+++ b/assets/js/9e4087bc.cca813d0.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[2711],{6266:(e,a,r)=>{r.d(a,{i:()=>i});var t=r(4586);function i(e={}){const{i18n:{currentLocale:a}}=(0,t.A)(),r=function(){const{i18n:{currentLocale:e,localeConfigs:a}}=(0,t.A)();return a[e].calendar}();return new Intl.DateTimeFormat(a,{calendar:r,...e})}},9331:(e,a,r)=>{r.r(a),r.d(a,{default:()=>m});r(6540);var t=r(8774),i=r(1312),s=r(5500),n=r(6266),c=r(1656),l=r(1107),o=r(4848);function h [...]
\ No newline at end of file
diff --git a/assets/js/a1b14ee0.3bcb29f1.js b/assets/js/a1b14ee0.3bcb29f1.js
new file mode 100644
index 00000000..669aaa9f
--- /dev/null
+++ b/assets/js/a1b14ee0.3bcb29f1.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[4488],{4195:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>a,contentTitle:()=>o,default:()=>u,frontMatter:()=>r,metadata:()=>i,toc:()=>l});const i=JSON.parse('{"id":"connectors/sinks/connectors-sinks-elasticsearch","title":"Elasticsearch Sink","description":"A sink connector that consumes messages from Iggy streams and indexes them to Elasticsearch.","source":"@site/docs/connectors/sinks/elasticsearch.m [...]
\ No newline at end of file
diff --git a/assets/js/a2ea038e.c09cea3c.js b/assets/js/a2ea038e.c09cea3c.js
new file mode 100644
index 00000000..8f1cca3c
--- /dev/null
+++ b/assets/js/a2ea038e.c09cea3c.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[3658],{6341:(t,e,a)=>{a.r(e),a.d(e,{assets:()=>c,contentTitle:()=>r,default:()=>p,frontMatter:()=>i,metadata:()=>o,toc:()=>d});const o=JSON.parse('{"id":"sdk/java/sdk-java-intro","title":"Intro","description":"The Iggy Java SDK is a library that allows you to interact with the Iggy API from your Java application.","source":"@site/docs/sdk/java/intro.md","sourceDirName":"sdk/java","slug":"/sd [...]
\ No newline at end of file
diff --git a/assets/js/a4d21046.a7aebcd9.js b/assets/js/a4d21046.a7aebcd9.js
new file mode 100644
index 00000000..06134086
--- /dev/null
+++ b/assets/js/a4d21046.a7aebcd9.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[5747],{6826:e=>{e.exports=JSON.parse('{"tag":{"label":"message-expiry","permalink":"/blogs/tags/message-expiry","allTagsPath":"/blogs/tags","count":1,"unlisted":false},"listMetadata":{"permalink":"/blogs/tags/message-expiry","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blogs"}}')}}]);
\ No newline at end of file
diff --git a/assets/js/a6aa9e1f.bebee82c.js b/assets/js/a6aa9e1f.bebee82c.js
new file mode 100644
index 00000000..b4acd7fa
--- /dev/null
+++ b/assets/js/a6aa9e1f.bebee82c.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[7643],{2053:(e,t,a)=>{a.d(t,{A:()=>o});a(6540);var n=a(4164),s=a(1312),i=a(6133);const r={tags:"tags_jXut",tag:"tag_QGVx"};var l=a(4848);function o({tags:e}){return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)("b",{children:(0,l.jsx)(s.A,{id:"theme.tags.tagsListLabel",description:"The label alongside a tag list",children:"Tags:"})}),(0,l.jsx)("ul",{className:(0,n.A)(r.tags,"padding--none","marg [...]
\ No newline at end of file
diff --git a/assets/js/a7456010.73397789.js b/assets/js/a7456010.73397789.js
new file mode 100644
index 00000000..7824e8f5
--- /dev/null
+++ b/assets/js/a7456010.73397789.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[1235],{8552:e=>{e.exports=JSON.parse('{"name":"docusaurus-plugin-content-pages","id":"default"}')}}]);
\ No newline at end of file
diff --git a/assets/js/a74c909c.3e7a9fe3.js b/assets/js/a74c909c.3e7a9fe3.js
new file mode 100644
index 00000000..67d36ef1
--- /dev/null
+++ b/assets/js/a74c909c.3e7a9fe3.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[6527],{327:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>c,contentTitle:()=>i,default:()=>u,frontMatter:()=>o,metadata:()=>t,toc:()=>l});const t=JSON.parse('{"id":"connectors/sources/connectors-sources-elasticsearch","title":"Elasticsearch Source","description":"This Elasticsearch source connector provides comprehensive state management capabilities to track processing progress and enable fault-toleran [...]
\ No newline at end of file
diff --git a/assets/js/a7bd4aaa.5eefa923.js b/assets/js/a7bd4aaa.5eefa923.js
new file mode 100644
index 00000000..76c7fdae
--- /dev/null
+++ b/assets/js/a7bd4aaa.5eefa923.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[7098],{1723:(n,e,s)=>{s.r(e),s.d(e,{default:()=>d});s(6540);var r=s(5500);function o(n,e){return`docs-${n}-${e}`}var i=s(3025),t=s(2831),c=s(1463),a=s(4848);function u(n){const{version:e}=n;return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(c.A,{version:e.version,tag:o(e.pluginId,e.version)}),(0,a.jsx)(r.be,{children:e.noIndex&&(0,a.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})]}) [...]
\ No newline at end of file
diff --git a/assets/js/a7c1df9a.6e25e2d5.js b/assets/js/a7c1df9a.6e25e2d5.js
new file mode 100644
index 00000000..31564f01
--- /dev/null
+++ b/assets/js/a7c1df9a.6e25e2d5.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[1163],{6934:e=>{e.exports=JSON.parse('{"permalink":"/blogs/users-and-permissions","source":"@site/blog/2023-09-20-users-and-permissions.md","title":"Users and permissions","description":"In the most recent update, the Iggy server as well as the clients for all the available transport protocols have been extended with the support for users and permissions. From now on, you can additionally se [...]
\ No newline at end of file
diff --git a/assets/js/a902938a.fb6b2399.js b/assets/js/a902938a.fb6b2399.js
new file mode 100644
index 00000000..99710fc1
--- /dev/null
+++ b/assets/js/a902938a.fb6b2399.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[2942],{2819:s=>{s.exports=JSON.parse('{"tag":{"label":"consumers","permalink":"/blogs/tags/consumers","allTagsPath":"/blogs/tags","count":1,"unlisted":false},"listMetadata":{"permalink":"/blogs/tags/consumers","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blogs"}}')}}]);
\ No newline at end of file
diff --git a/assets/js/a94703ab.711fab16.js b/assets/js/a94703ab.711fab16.js
new file mode 100644
index 00000000..dd67b68a
--- /dev/null
+++ b/assets/js/a94703ab.711fab16.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[9048],{3363:(e,t,n)=>{n.d(t,{A:()=>l});n(6540);var a=n(4164),i=n(1312),o=n(1107),s=n(4848);function l({className:e}){return(0,s.jsx)("main",{className:(0,a.A)("container margin-vert--xl",e),children:(0,s.jsx)("div",{className:"row",children:(0,s.jsxs)("div",{className:"col col--6 col--offset-3",children:[(0,s.jsx)(o.A,{as:"h1",className:"hero__title",children:(0,s.jsx)(i.A,{id:"theme.NotFoun [...]
\ No newline at end of file
diff --git a/assets/js/aba21aa0.dacb74ee.js b/assets/js/aba21aa0.dacb74ee.js
new file mode 100644
index 00000000..89c0d692
--- /dev/null
+++ b/assets/js/aba21aa0.dacb74ee.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[5742],{7093:e=>{e.exports=JSON.parse('{"name":"docusaurus-plugin-content-docs","id":"default"}')}}]);
\ No newline at end of file
diff --git a/assets/js/acecf23e.f2134d2b.js b/assets/js/acecf23e.f2134d2b.js
new file mode 100644
index 00000000..66554c61
--- /dev/null
+++ b/assets/js/acecf23e.f2134d2b.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[1903],{1912:s=>{s.exports=JSON.parse('{"blogBasePath":"/blogs","blogTitle":"Blogs","authorsListPath":"/blogs/authors"}')}}]);
\ No newline at end of file
diff --git a/assets/js/b041cdfc.67cfd8b0.js b/assets/js/b041cdfc.67cfd8b0.js
new file mode 100644
index 00000000..707060df
--- /dev/null
+++ b/assets/js/b041cdfc.67cfd8b0.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[3632],{741:(e,t,i)=>{i.d(t,{A:()=>s});const s=i.p+"assets/images/iggy_bench-eed7510a845dfb053ac67be624599c99.png"},1401:(e,t,i)=>{i.d(t,{A:()=>s});const s=i.p+"assets/images/iggy_cluster-c2c33596763c8b9930c7de7e12dc3586.png"},1773:(e,t,i)=>{i.d(t,{A:()=>s});const s=i.p+"assets/images/iggy_web-76023f316d53cc2e44ae6f7b83193529.png"},3894:(e,t,i)=>{i.d(t,{A:()=>s});const s=i.p+"assets/images/ig [...]
\ No newline at end of file
diff --git a/assets/js/b1fb958a.893ecd9d.js b/assets/js/b1fb958a.893ecd9d.js
new file mode 100644
index 00000000..cc187d69
--- /dev/null
+++ b/assets/js/b1fb958a.893ecd9d.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[8275],{841:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>l,contentTitle:()=>a,default:()=>d,frontMatter:()=>i,metadata:()=>n,toc:()=>u});var n=s(9603),r=s(4848),o=s(8453);const i={title:"Consumer identifier",slug:"consumer-identifier",authors:["piotr"],tags:["new-features","consumers","identifier"],hide_table_of_contents:!1},a=void 0,l={authorsImageUrls:[void 0]},u=[];function c(e){const t={code:"code" [...]
\ No newline at end of file
diff --git a/assets/js/b3082b0e.c815e613.js b/assets/js/b3082b0e.c815e613.js
new file mode 100644
index 00000000..f21ed35a
--- /dev/null
+++ b/assets/js/b3082b0e.c815e613.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[1895],{3268:a=>{a.exports=JSON.parse('{"tag":{"label":"announcement","permalink":"/blogs/tags/announcement","allTagsPath":"/blogs/tags","count":2,"unlisted":false},"listMetadata":{"permalink":"/blogs/tags/announcement","page":1,"postsPerPage":10,"totalPages":1,"totalCount":2,"blogDescription":"Blog","blogTitle":"Blogs"}}')}}]);
\ No newline at end of file
diff --git a/assets/js/b8b35ff1.229c2418.js b/assets/js/b8b35ff1.229c2418.js
new file mode 100644
index 00000000..94c56082
--- /dev/null
+++ b/assets/js/b8b35ff1.229c2418.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[7930],{738:e=>{e.exports=JSON.parse('{"permalink":"/blogs/2025/02/10/apache-incubator","source":"@site/blog/2025-02-10-apache-incubator.md","title":"Iggy joins the Apache Incubator","description":"We are thrilled to announce that Iggy has officially joined the Apache Incubator! This marks a major milestone in our journey to redefine message streaming \u2014 one that is blazingly fast, hyper- [...]
\ No newline at end of file
diff --git a/assets/js/bc9f1601.0244c8c0.js b/assets/js/bc9f1601.0244c8c0.js
new file mode 100644
index 00000000..59551d00
--- /dev/null
+++ b/assets/js/bc9f1601.0244c8c0.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[899],{948:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>a,contentTitle:()=>c,default:()=>u,frontMatter:()=>i,metadata:()=>o,toc:()=>l});const o=JSON.parse('{"id":"connectors/sources/connectors-source","title":"Source","description":"Overview","source":"@site/docs/connectors/sources/source.md","sourceDirName":"connectors/sources","slug":"/connectors/source","permalink":"/docs/connectors/source","draft": [...]
\ No newline at end of file
diff --git a/assets/js/c065b223.697090a8.js b/assets/js/c065b223.697090a8.js
new file mode 100644
index 00000000..a68302e1
--- /dev/null
+++ b/assets/js/c065b223.697090a8.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[5956],{737:e=>{e.exports=JSON.parse('{"permalink":"/blogs/message-state","source":"@site/blog/2023-08-22-message-state.md","title":"Message state","description":"The message state is a simple field which extends the existing message and provides a way to define whether the particular message might be consumed by the client or not, depending on its value. Let\'s briefly discuss the motivation [...]
\ No newline at end of file
diff --git a/assets/js/c23ee533.8d4c8ea6.js b/assets/js/c23ee533.8d4c8ea6.js
new file mode 100644
index 00000000..b3d31e55
--- /dev/null
+++ b/assets/js/c23ee533.8d4c8ea6.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[2608],{1280:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>h,contentTitle:()=>d,default:()=>c,frontMatter:()=>i,metadata:()=>a,toc:()=>l});var a=n(4529),t=n(4848),r=n(8453);const i={title:"Message headers",slug:"message-headers",authors:["piotr"],tags:["new-features","message-headers","breaking-changes"],hide_table_of_contents:!1},d=void 0,h={authorsImageUrls:[void 0]},l=[{value:"Breaking changes",id:"b [...]
\ No newline at end of file
diff --git a/assets/js/c3a24e9c.b974124f.js b/assets/js/c3a24e9c.b974124f.js
new file mode 100644
index 00000000..7d3b6075
--- /dev/null
+++ b/assets/js/c3a24e9c.b974124f.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[3297],{1117:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>d,contentTitle:()=>a,default:()=>p,frontMatter:()=>r,metadata:()=>o,toc:()=>l});const o=JSON.parse('{"id":"sdk/go/sdk-go-examples","title":"Examples","description":"","source":"@site/docs/sdk/go/examples.md","sourceDirName":"sdk/go","slug":"/sdk/go/examples","permalink":"/docs/sdk/go/examples","draft":false,"unlisted":false,"tags":[],"version":" [...]
\ No newline at end of file
diff --git a/assets/js/c5f172dd.d9a01a14.js b/assets/js/c5f172dd.d9a01a14.js
new file mode 100644
index 00000000..e61dfcbe
--- /dev/null
+++ b/assets/js/c5f172dd.d9a01a14.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[5511],{4547:e=>{e.exports=JSON.parse('{"permalink":"/blogs/message-expiry","source":"@site/blog/2023-08-27-message-expiry.md","title":"Message expiry","description":"The message expiration is a server-side feature, allowing to automatically delete the old data (expired segment as a whole) depending on the provided configuration. By specifying the custom retention policy, the server can clean [...]
\ No newline at end of file
diff --git a/assets/js/c70ea44c.d887c741.js b/assets/js/c70ea44c.d887c741.js
new file mode 100644
index 00000000..6474beb3
--- /dev/null
+++ b/assets/js/c70ea44c.d887c741.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[6056],{725:e=>{e.exports=JSON.parse('{"permalink":"/blogs/personal-access-tokens","source":"@site/blog/2023-10-12-personal-access-tokens.md","title":"Personal access tokens","description":"Since the most recent update, Iggy.rs supports personal access tokens, which can be used to authenticate the clients, instead of the username and password. The tokens can be created and deleted using the a [...]
\ No newline at end of file
diff --git a/assets/js/c8d81af2.80074e8c.js b/assets/js/c8d81af2.80074e8c.js
new file mode 100644
index 00000000..f849d0c2
--- /dev/null
+++ b/assets/js/c8d81af2.80074e8c.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[3384],{445:(e,n,i)=>{i.d(n,{A:()=>s});const s=i.p+"assets/images/iggy_server-f7851820c876c0a5b3c0159f953ae728.png"},6206:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>a,contentTitle:()=>c,default:()=>h,frontMatter:()=>o,metadata:()=>s,toc:()=>l});const s=JSON.parse('{"id":"introduction/introduction-about","title":"About","description":"Iggy is a persistent message streaming platform written in Rust, su [...]
\ No newline at end of file
diff --git a/assets/js/ca66c66a.bac75913.js b/assets/js/ca66c66a.bac75913.js
new file mode 100644
index 00000000..f8d4b5c9
--- /dev/null
+++ b/assets/js/ca66c66a.bac75913.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[1019],{212:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>c,frontMatter:()=>r,metadata:()=>a,toc:()=>p});var a=s(4547),n=s(4848),i=s(8453);const r={title:"Message expiry",slug:"message-expiry",authors:["piotr"],tags:["new-features","message-expiry"],hide_table_of_contents:!1},o=void 0,l={authorsImageUrls:[void 0]},p=[];function g(e){const t={p:"p",...(0,i.R)(),...e.compo [...]
\ No newline at end of file
diff --git a/assets/js/cc16a589.0b02c6d8.js b/assets/js/cc16a589.0b02c6d8.js
new file mode 100644
index 00000000..e69d251d
--- /dev/null
+++ b/assets/js/cc16a589.0b02c6d8.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[3759],{7943:a=>{a.exports=JSON.parse('{"tag":{"label":"schema","permalink":"/blogs/tags/schema","allTagsPath":"/blogs/tags","count":1,"unlisted":false},"listMetadata":{"permalink":"/blogs/tags/schema","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blogs"}}')}}]);
\ No newline at end of file
diff --git a/assets/js/ccc49370.6f4e6b50.js b/assets/js/ccc49370.6f4e6b50.js
new file mode 100644
index 00000000..bfea4afe
--- /dev/null
+++ b/assets/js/ccc49370.6f4e6b50.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[3249],{1689:(e,t,n)=>{n.d(t,{A:()=>d});n(6540);var a=n(4164),s=n(4084),i=n(7559),r=n(7293),l=n(4848);function o({className:e}){return(0,l.jsx)(r.A,{type:"caution",title:(0,l.jsx)(s.Yh,{}),className:(0,a.A)(e,i.G.common.draftBanner),children:(0,l.jsx)(s.TT,{})})}var c=n(2234);function d({metadata:e}){const{unlisted:t,frontMatter:n}=e;return(0,l.jsxs)(l.Fragment,{children:[(t||n.unlisted)&&(0, [...]
\ No newline at end of file
diff --git a/assets/js/ce80ecba.0be0ba49.js b/assets/js/ce80ecba.0be0ba49.js
new file mode 100644
index 00000000..f25c403f
--- /dev/null
+++ b/assets/js/ce80ecba.0be0ba49.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[4720],{7264:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>a,contentTitle:()=>r,default:()=>l,frontMatter:()=>s,metadata:()=>o,toc:()=>u});const o=JSON.parse('{"id":"iggy","title":"Welcome","description":"Welcome to Apache Iggy (Incubating) documentation, which is under an active development.","source":"@site/docs/iggy.md","sourceDirName":".","slug":"/","permalink":"/docs/","draft":false,"unlisted":fals [...]
\ No newline at end of file
diff --git a/assets/js/cfbe654b.8cbbb9ce.js b/assets/js/cfbe654b.8cbbb9ce.js
new file mode 100644
index 00000000..51296f28
--- /dev/null
+++ b/assets/js/cfbe654b.8cbbb9ce.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[5562],{2821:e=>{e.exports=JSON.parse('{"permalink":"/blogs/2025/08/10/release-0.5.0","source":"@site/blog/2025-08-10-release-0.5.0.md","title":"Apache Iggy 0.5.0 Release","description":"Release 0.5.0","date":"2025-08-10T00:00:00.000Z","tags":[{"inline":true,"label":"release","permalink":"/blogs/tags/release"},{"inline":true,"label":"0.5.0","permalink":"/blogs/tags/0-5-0"},{"inline":true,"lab [...]
\ No newline at end of file
diff --git a/assets/js/cfc3091e.dcbac72c.js b/assets/js/cfc3091e.dcbac72c.js
new file mode 100644
index 00000000..a9ace038
--- /dev/null
+++ b/assets/js/cfc3091e.dcbac72c.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[2321],{738:e=>{e.exports=JSON.parse('{"permalink":"/blogs/2025/02/10/apache-incubator","source":"@site/blog/2025-02-10-apache-incubator.md","title":"Iggy joins the Apache Incubator","description":"We are thrilled to announce that Iggy has officially joined the Apache Incubator! This marks a major milestone in our journey to redefine message streaming \u2014 one that is blazingly fast, hyper- [...]
\ No newline at end of file
diff --git a/assets/js/d1796fc4.af5f7d2c.js b/assets/js/d1796fc4.af5f7d2c.js
new file mode 100644
index 00000000..9fbb946b
--- /dev/null
+++ b/assets/js/d1796fc4.af5f7d2c.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[1047],{8453:(e,n,t)=>{t.d(n,{R:()=>a,x:()=>o});var s=t(6540);const i={},r=s.createContext(i);function a(e){const n=s.useContext(r);return s.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),s.createElement(r.Provider,{value:n},e.children)}}, [...]
\ No newline at end of file
diff --git a/assets/js/d19ecac4.8085d0bf.js b/assets/js/d19ecac4.8085d0bf.js
new file mode 100644
index 00000000..0eed0f23
--- /dev/null
+++ b/assets/js/d19ecac4.8085d0bf.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[933],{8453:(e,n,o)=>{o.d(n,{R:()=>i,x:()=>a});var r=o(6540);const t={},s=r.createContext(t);function i(e){const n=r.useContext(s);return r.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:i(e.components),r.createElement(s.Provider,{value:n},e.children)}},8 [...]
\ No newline at end of file
diff --git a/assets/js/d6bb211a.cb33a65e.js b/assets/js/d6bb211a.cb33a65e.js
new file mode 100644
index 00000000..4b086073
--- /dev/null
+++ b/assets/js/d6bb211a.cb33a65e.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[6440],{3956:s=>{s.exports=JSON.parse('{"tag":{"label":"message-state","permalink":"/blogs/tags/message-state","allTagsPath":"/blogs/tags","count":1,"unlisted":false},"listMetadata":{"permalink":"/blogs/tags/message-state","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blogs"}}')}}]);
\ No newline at end of file
diff --git a/assets/js/d74d5d7a.f6a6968e.js b/assets/js/d74d5d7a.f6a6968e.js
new file mode 100644
index 00000000..f586eda8
--- /dev/null
+++ b/assets/js/d74d5d7a.f6a6968e.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[2911],{443:e=>{e.exports=JSON.parse('{"permalink":"/blogs/2025/06/06/connectors-runtime","source":"@site/blog/2025-06-06-connectors-runtime.md","title":"Connectors runtime","description":"Extending Apache Iggy capabilities","date":"2025-06-06T00:00:00.000Z","tags":[],"readingTime":5.1,"hasTruncateMarker":true,"authors":[{"name":"Piotr Gankiewicz","title":"Apache Iggy founder","url":"https:// [...]
\ No newline at end of file
diff --git a/assets/js/d83bd44c.77b02546.js b/assets/js/d83bd44c.77b02546.js
new file mode 100644
index 00000000..4457befc
--- /dev/null
+++ b/assets/js/d83bd44c.77b02546.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[5515],{2761:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>a,default:()=>p,frontMatter:()=>s,metadata:()=>o,toc:()=>d});const o=JSON.parse('{"id":"ai/ai-mcp","title":"MCP Server","description":"The Model Context Protocol (MCP) is an open protocol that standardizes how applications provide context to LLMs. The Apache Iggy MCP Server is an implementation of the MCP protocol for the mess [...]
\ No newline at end of file
diff --git a/assets/js/da420000.3791224c.js b/assets/js/da420000.3791224c.js
new file mode 100644
index 00000000..7a66b5c7
--- /dev/null
+++ b/assets/js/da420000.3791224c.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[1572],{737:e=>{e.exports=JSON.parse('{"permalink":"/blogs/message-state","source":"@site/blog/2023-08-22-message-state.md","title":"Message state","description":"The message state is a simple field which extends the existing message and provides a way to define whether the particular message might be consumed by the client or not, depending on its value. Let\'s briefly discuss the motivation [...]
\ No newline at end of file
diff --git a/assets/js/da5fc804.e726472f.js b/assets/js/da5fc804.e726472f.js
new file mode 100644
index 00000000..053948ee
--- /dev/null
+++ b/assets/js/da5fc804.e726472f.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[4822],{3547:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>h,contentTitle:()=>c,default:()=>l,frontMatter:()=>t,metadata:()=>r,toc:()=>d});const r=JSON.parse('{"type":"mdx","permalink":"/downloads","source":"@site/src/pages/downloads.md","title":"Downloads","description":"Official release artifacts of Apache Iggy (Incubating)","frontMatter":{"title":"Downloads","description":"Official release artifacts [...]
\ No newline at end of file
diff --git a/assets/js/dfcda264.b56831bf.js b/assets/js/dfcda264.b56831bf.js
new file mode 100644
index 00000000..3d3e80f0
--- /dev/null
+++ b/assets/js/dfcda264.b56831bf.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[1683],{397:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>c,contentTitle:()=>r,default:()=>f,frontMatter:()=>s,metadata:()=>i,toc:()=>l});const i=JSON.parse('{"id":"faq/faq","title":"FAQ","description":"Q: What is the difference between Iggy and traditional message brokers like Kafka?","source":"@site/docs/faq/faq.md","sourceDirName":"faq","slug":"/faq/faq","permalink":"/docs/faq/faq","draft":false,"unl [...]
\ No newline at end of file
diff --git a/assets/js/e05ad208.9235c545.js b/assets/js/e05ad208.9235c545.js
new file mode 100644
index 00000000..d6cc4dcc
--- /dev/null
+++ b/assets/js/e05ad208.9235c545.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[9648],{2346:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>g,frontMatter:()=>s,metadata:()=>r,toc:()=>c});var r=o(3151),n=o(4848),a=o(8453);const s={title:"Iggy.rs - Technology Radar & current goals",authors:["piotr"],tags:[],hide_table_of_contents:!1,date:new Date("2024-10-28T00:00:00.000Z")},i=void 0,l={authorsImageUrls:[void 0]},c=[{value:"Technology Radar",id:"techno [...]
\ No newline at end of file
diff --git a/assets/js/e35843f4.53368b71.js b/assets/js/e35843f4.53368b71.js
new file mode 100644
index 00000000..ec888afe
--- /dev/null
+++ b/assets/js/e35843f4.53368b71.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[1761],{5295:e=>{e.exports=JSON.parse('{"permalink":"/blogs/2025/02/17/transparent-benchmarks","source":"@site/blog/2025-02-17-transparent-benchmarks.md","title":"Transparent Benchmarking with Apache Iggy","description":"Benchmarks should be the first-class citizen","date":"2025-02-17T00:00:00.000Z","tags":[],"readingTime":4.18,"hasTruncateMarker":true,"authors":[{"name":"Piotr Gankiewicz","t [...]
\ No newline at end of file
diff --git a/assets/js/e519dda2.b29721be.js b/assets/js/e519dda2.b29721be.js
new file mode 100644
index 00000000..87f5b4d7
--- /dev/null
+++ b/assets/js/e519dda2.b29721be.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[570],{210:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>r,default:()=>h,frontMatter:()=>a,metadata:()=>s,toc:()=>l});const s=JSON.parse('{"id":"connectors/sinks/connectors-sink","title":"Sink","description":"Overview","source":"@site/docs/connectors/sinks/sink.md","sourceDirName":"connectors/sinks","slug":"/connectors/sink","permalink":"/docs/connectors/sink","draft":false,"unlisted" [...]
\ No newline at end of file
diff --git a/assets/js/e7c222e2.cb5f5454.js b/assets/js/e7c222e2.cb5f5454.js
new file mode 100644
index 00000000..a861caea
--- /dev/null
+++ b/assets/js/e7c222e2.cb5f5454.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[3713],{6047:e=>{e.exports=JSON.parse('{"permalink":"/blogs/updated-schemas","source":"@site/blog/2023-08-31-updated-schemas.md","title":"Updated schemas","description":"The latest update introduces the changes to the PollMessages and GetConsumerOffset commands response schema, as well as the Stream, Topic and Partition structs extended with created_at field.","date":"2023-08-31T00:00:00.000Z [...]
\ No newline at end of file
diff --git a/assets/js/e982becf.8d9b70f9.js b/assets/js/e982becf.8d9b70f9.js
new file mode 100644
index 00000000..d0c00254
--- /dev/null
+++ b/assets/js/e982becf.8d9b70f9.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[235],{145:e=>{e.exports=JSON.parse('{"tag":{"label":"websocket","permalink":"/blogs/tags/websocket","allTagsPath":"/blogs/tags","count":1,"unlisted":false},"listMetadata":{"permalink":"/blogs/tags/websocket","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blogs"}}')}}]);
\ No newline at end of file
diff --git a/assets/js/eaff7a86.1fc2390f.js b/assets/js/eaff7a86.1fc2390f.js
new file mode 100644
index 00000000..121216fd
--- /dev/null
+++ b/assets/js/eaff7a86.1fc2390f.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[9419],{6137:a=>{a.exports=JSON.parse('{"tag":{"label":"0.6.0","permalink":"/blogs/tags/0-6-0","allTagsPath":"/blogs/tags","count":1,"unlisted":false},"listMetadata":{"permalink":"/blogs/tags/0-6-0","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blogs"}}')}}]);
\ No newline at end of file
diff --git a/assets/js/efbe804b.17d540da.js b/assets/js/efbe804b.17d540da.js
new file mode 100644
index 00000000..5001c292
--- /dev/null
+++ b/assets/js/efbe804b.17d540da.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[3179],{6767:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>c,default:()=>h,frontMatter:()=>r,metadata:()=>s,toc:()=>a});const s=JSON.parse('{"id":"sdk/rust/sdk-rust-high-level-sdk","title":"High-level SDK","description":"If you\'ve read through the getting started guide, you might have noticed that it\'s quite verbose and requires a lot of boilerplate code to get started. This is wher [...]
\ No newline at end of file
diff --git a/assets/js/f5480997.6bb83246.js b/assets/js/f5480997.6bb83246.js
new file mode 100644
index 00000000..6091e7e4
--- /dev/null
+++ b/assets/js/f5480997.6bb83246.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[6273],{1930:(t,e,s)=>{s.r(e),s.d(e,{assets:()=>c,contentTitle:()=>a,default:()=>l,frontMatter:()=>i,metadata:()=>r,toc:()=>d});const r=JSON.parse('{"id":"sdk/rust/sdk-rust-intro","title":"Intro","description":"To learn more about the Rust SDK, please check the getting started guide. The SDK is available on crates.io and the source code can be is part of the core repository, located under sdk [...]
\ No newline at end of file
diff --git a/assets/js/fbf041e5.94bb2d2b.js b/assets/js/fbf041e5.94bb2d2b.js
new file mode 100644
index 00000000..1fc69b4a
--- /dev/null
+++ b/assets/js/fbf041e5.94bb2d2b.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[9306],{772:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>l,contentTitle:()=>a,default:()=>d,frontMatter:()=>o,metadata:()=>r,toc:()=>c});var r=s(9902),i=s(4848),t=s(8453);const o={title:"Apache Iggy 0.6.0 Release",authors:["piotr"],tags:["release","0.6.0","announcement"],hide_table_of_contents:!1,date:new Date("2025-12-09T00:00:00.000Z")},a=void 0,l={authorsImageUrls:[void 0]},c=[{value:"Release 0.6.0" [...]
\ No newline at end of file
diff --git a/assets/js/ff030c8a.f1a46e99.js b/assets/js/ff030c8a.f1a46e99.js
new file mode 100644
index 00000000..9e953f30
--- /dev/null
+++ b/assets/js/ff030c8a.f1a46e99.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[8374],{3364:e=>{e.exports=JSON.parse('{"tag":{"label":"release","permalink":"/blogs/tags/release","allTagsPath":"/blogs/tags","count":3,"unlisted":false},"listMetadata":{"permalink":"/blogs/tags/release","page":1,"postsPerPage":10,"totalPages":1,"totalCount":3,"blogDescription":"Blog","blogTitle":"Blogs"}}')}}]);
\ No newline at end of file
diff --git a/assets/js/ff06d166.308a6f91.js b/assets/js/ff06d166.308a6f91.js
new file mode 100644
index 00000000..7b177966
--- /dev/null
+++ b/assets/js/ff06d166.308a6f91.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[7128],{1176:(e,s,t)=>{t.r(s),t.d(s,{assets:()=>l,contentTitle:()=>a,default:()=>c,frontMatter:()=>i,metadata:()=>n,toc:()=>u});var n=t(6934),r=t(4848),o=t(8453);const i={title:"Users and permissions",slug:"users-and-permissions",authors:["piotr"],tags:["new-features","users","permissions"],hide_table_of_contents:!1},a=void 0,l={authorsImageUrls:[void 0]},u=[];function p(e){const s={p:"p",str [...]
\ No newline at end of file
diff --git a/assets/js/main.4a006c5e.js b/assets/js/main.4a006c5e.js
new file mode 100644
index 00000000..063daed8
--- /dev/null
+++ b/assets/js/main.4a006c5e.js
@@ -0,0 +1,2 @@
+/*! For license information please see main.4a006c5e.js.LICENSE.txt */
+(globalThis.webpackChunkiggy_website=globalThis.webpackChunkiggy_website||[]).push([[8792],{115:e=>{var t="undefined"!=typeof Element,n="function"==typeof Map,r="function"==typeof Set,a="function"==typeof ArrayBuffer&&!!ArrayBuffer.isView;function o(e,i){if(e===i)return!0;if(e&&i&&"object"==typeof e&&"object"==typeof i){if(e.constructor!==i.constructor)return!1;var s,l,c,u;if(Array.isArray(e)){if((s=e.length)!=i.length)return!1;for(l=s;0!==l--;)if(!o(e[l],i[l]))return!1;return!0}if(n&&e [...]
\ No newline at end of file
diff --git a/assets/js/main.4a006c5e.js.LICENSE.txt b/assets/js/main.4a006c5e.js.LICENSE.txt
new file mode 100644
index 00000000..4c963e46
--- /dev/null
+++ b/assets/js/main.4a006c5e.js.LICENSE.txt
@@ -0,0 +1,61 @@
+/* NProgress, (c) 2013, 2014 Rico Sta. Cruz - http://ricostacruz.com/nprogress
+ * @license MIT */
+
+/**
+ * @license React
+ * react-dom-client.production.js
+ *
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+/**
+ * @license React
+ * react-dom.production.js
+ *
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+/**
+ * @license React
+ * react-jsx-runtime.production.js
+ *
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+/**
+ * @license React
+ * react.production.js
+ *
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+/**
+ * @license React
+ * scheduler.production.js
+ *
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+/** @license React v16.13.1
+ * react-is.production.min.js
+ *
+ * Copyright (c) Facebook, Inc. and its affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
diff --git a/assets/js/runtime~main.0a940c88.js b/assets/js/runtime~main.0a940c88.js
new file mode 100644
index 00000000..47029a03
--- /dev/null
+++ b/assets/js/runtime~main.0a940c88.js
@@ -0,0 +1 @@
+(()=>{"use strict";var e,a,c,f,d,b={},t={};function r(e){var a=t[e];if(void 0!==a)return a.exports;var c=t[e]={exports:{}};return b[e].call(c.exports,c,c.exports,r),c.exports}r.m=b,e=[],r.O=(a,c,f,d)=>{if(!c){var b=1/0;for(i=0;i<e.length;i++){for(var[c,f,d]=e[i],t=!0,o=0;o<c.length;o++)(!1&d||b>=d)&&Object.keys(r.O).every(e=>r.O[e](c[o]))?c.splice(o--,1):(t=!1,d<b&&(b=d));if(t){e.splice(i--,1);var n=f();void 0!==n&&(a=n)}}return a}d=d||0;for(var i=e.length;i>0&&e[i-1][2]>d;i--)e[i]=e[i-1 [...]
\ No newline at end of file
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..2abf2229
--- /dev/null
+++ b/blogs/2023/12/29/building-message-streaming-in-rust/index.html
@@ -0,0 +1,115 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="blog-wrapper blog-post-page plugin-blog plugin-id-default" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">Iggy.rs - building message streaming in Rust | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed">
+
+
+
+
+
+<link rel="preconnect" href="https://analytics.apache.org/">
+<script>var _paq=window._paq=window._paq||[];_paq.push(["setRequestMethod","POST"]),_paq.push(["trackPageView"]),_paq.push(["enableLinkTracking"]),_paq.push(["enableHeartBeatTimer"]),function(){var e="https://analytics.apache.org/";_paq.push(["setRequestMethod","POST"]),_paq.push(["setTrackerUrl",e+"matomo.php"]),_paq.push(["setSiteId","80"]);var a=document,t=a.createElement("script"),p=a.getElementsByTagName("script")[0];t.type="text/javascript",t.async=!0,t.src=e+"matomo.js",p.parentNo [...]
+<script src="/assets/js/runtime~main.0a940c88.js" defer="defer"></script>
+<script src="/assets/js/main.4a006c5e.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/img/apache-iggy0.5x.png"><link rel="preload" as="image" [...]
+<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" target="_blank" rel="noopener noreferrer" class="">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 (m [...]
+<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/" target="_blank" rel="noopener noreferrer" class="">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 messagin [...]
+<p>And this is how the <a href="https://iggy.rs" target="_blank" rel="noopener noreferrer" class="">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/" target="_blank" rel="noopener noreferrer" class="">two of them</a>), small yet extremely fast dogs, the best in their class.</p>
+<p><img decoding="async" loading="lazy" alt="image" src="/assets/images/iggys-5cd88b6e4af91d0e5b0f1ef688b8efac.jpeg" width="1506" height="1282" class="img_ev3q"></p>
+<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="anchor anchorTargetStickyNavbar_Vzrq" id="project">Project<a href="#project" class="hash-link" aria-label="Direct link to Project" title="Direct link to Project" translate="no"></a></h2>
+<p>At the very beginning, Iggy had rather limited functionality, and everything was handled using the <a href="https://www.chromium.org/quic/" target="_blank" rel="noopener noreferrer" class="">QUIC</a> protocol based on <a href="https://github.com/quinn-rs/quinn" target="_blank" rel="noopener noreferrer" class="">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 [...]
+<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 decoding="async" loading="lazy" alt="image" src="/assets/images/iggy_sample-39395c20221652515f2296734851e042.jpeg" width="4064" height="2408" class="img_ev3q"></p>
+<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" target="_blank" rel="noopener noreferrer" class="">bytes</a>, along with the <a href="https://tokio.rs" target="_blank" rel="noopener noreferrer" class="">Tokio</a> <strong>work stealing</strong> approach, yie [...]
+<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>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> polled_messages </span><span c [...]
+<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" target="_blank" rel="noopener noreferrer" class="">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 [...]
+<p><img decoding="async" loading="lazy" alt="image" src="/assets/images/iggy_bench-9ea0ebbd13ad66abb94ec3d8d8697048.jpeg" width="3494" height="1750" class="img_ev3q"></p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="team">Team<a href="#team" class="hash-link" aria-label="Direct link to Team" title="Direct link to Team" translate="no"></a></h2>
+<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 decoding="async" loading="lazy" alt="image" src="/assets/images/iggy_server-b28372292592869008ceb03c1edfdc51.jpeg" width="4088" height="1610" class="img_ev3q"></p>
+<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="anchor anchorTargetStickyNavbar_Vzrq" id="features">Features<a href="#features" class="hash-link" aria-label="Direct link to Features" title="Direct link to Features" translate="no"></a></h2>
+<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 class=""><strong>Highly performant</strong>, persistent append-only log for the message streaming</li>
+<li class=""><strong>Very high throughput</strong> for both writes and reads</li>
+<li class=""><strong>Low latency and predictable resource usage</strong> thanks to the Rust compiled language (no GC)</li>
+<li class=""><strong>Users authentication and authorization</strong> with granular permissions and PAT (Personal Access Tokens)</li>
+<li class="">Support for multiple streams, topics and partitions</li>
+<li class="">Support for <strong>multiple transport protocols</strong> (QUIC, TCP, HTTP)</li>
+<li class="">Fully operational RESTful API which can be optionally enabled</li>
+<li class="">Available client SDK in multiple languages</li>
+<li class=""><strong>Works directly with the binary data</strong> (lack of enforced schema and serialization/deserialization)</li>
+<li class="">Configurable server features (e.g. caching, segment size, data flush interval, transport protocols etc.)</li>
+<li class="">Possibility of storing the <strong>consumer offsets</strong> on the server</li>
+<li class="">Multiple ways of polling the messages:<!-- -->
+<ul>
+<li class="">By offset (using the indexes)</li>
+<li class="">By timestamp (using the time indexes)</li>
+<li class="">First/Last N messages</li>
+<li class="">Next N messages for the specific consumer</li>
+</ul>
+</li>
+<li class="">Possibility of <strong>auto committing the offset</strong> (e.g. to achieve <em>at-most-once</em> delivery)</li>
+<li class=""><strong>Consumer groups</strong> providing the message ordering and horizontal scaling across the connected clients</li>
+<li class=""><strong>Message expiry</strong> with auto deletion based on the configurable <strong>retention policy</strong></li>
+<li class="">Additional features such as <strong>server side message deduplication</strong></li>
+<li class=""><strong>TLS</strong> support for all transport protocols (TCP, QUIC, HTTPS)</li>
+<li class="">Optional server-side as well as client-side <strong>data encryption</strong> using AES-256-GCM</li>
+<li class="">Optional metadata support in the form of <strong>message headers</strong></li>
+<li class="">Built-in <strong>CLI</strong> to manage the streaming server</li>
+<li class="">Built-in <strong>benchmarking app</strong> to test the performance</li>
+<li class=""><strong>Single binary deployment</strong> (no external dependencies)</li>
+<li class="">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 class=""><a href="https://crates.io/crates/iggy" target="_blank" rel="noopener noreferrer" class="">Rust</a></li>
+<li class=""><a href="https://github.com/iggy-rs/iggy-dotnet-client" target="_blank" rel="noopener noreferrer" class="">C#</a></li>
+<li class=""><a href="https://github.com/iggy-rs/iggy-go-client" target="_blank" rel="noopener noreferrer" class="">Go</a></li>
+<li class=""><a href="https://github.com/iggy-rs/iggy-node-client" target="_blank" rel="noopener noreferrer" class="">Node</a></li>
+<li class=""><a href="https://github.com/iggy-rs/iggy-python-client" target="_blank" rel="noopener noreferrer" class="">Python</a></li>
+<li class=""><a href="https://github.com/iggy-rs/iggy-java-client" target="_blank" rel="noopener noreferrer" class="">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" target="_blank" rel="noopener noreferrer" class="">CLI</a></strong>.</p>
+<p><img decoding="async" loading="lazy" alt="image" src="/assets/images/iggy_cli-efc853d35dfcddfb68957f9f7cbdd745.jpeg" width="2942" height="2162" class="img_ev3q"></p>
+<p>As well as modern <strong><a href="https://github.com/iggy-rs/iggy-web-ui" target="_blank" rel="noopener noreferrer" class="">Web UI</a></strong> to make it happen :)</p>
+<p><img decoding="async" loading="lazy" alt="image" src="/assets/images/iggy_web_ui-58fc54e40a2756eba04dec9206de70a5.jpeg" width="4060" height="2408" class="img_ev3q"></p>
+<p>Last but not least, we've got a fully-featured <a href="https://github.com/apache/iggy/actions" target="_blank" rel="noopener noreferrer" class="">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" target="_blank" rel="noopener noreferrer" class="">Docker images</a>.</p>
+<p><img decoding="async" loading="lazy" alt="image" src="/assets/images/iggy_ci_cd-a03f984dde69dbbc209f61481d7d1c91.jpeg" width="2000" height="1000" class="img_ev3q"></p>
+<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="anchor anchorTargetStickyNavbar_Vzrq" id="roadmap">Roadmap<a href="#roadmap" class="hash-link" aria-label="Direct link to Roadmap" title="Direct link to Roadmap" translate="no"></a></h2>
+<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" target="_blank" rel="noopener noreferrer" class="">company</a> using it already), and discussed what features would be a good addition to the current stack.</p>
+<p><img decoding="async" loading="lazy" alt="image" src="/assets/images/gh_trending-bbecb9e6ddc18e345fbdb7c8bae838d9.jpeg" width="2234" height="1830" class="img_ev3q"></p>
+<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 decoding="async" loading="lazy" alt="image" src="/assets/images/leader_elections-f973c06ac3c6b230945e496faa6f314e.jpeg" width="4058" height="2316" class="img_ev3q"></p>
+<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" target="_blank" rel="noopener noreferrer" class="">io_uring</a></strong> for all I/O operations (disk or network related). The brand new, completion based API (available [...]
+<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" target="_bla [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="future">Future<a href="#future" class="hash-link" aria-label="Direct link to Future" title="Direct link to Future" translate="no"></a></h2>
+<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" target="_blank" rel="noopener noreferrer" class="">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/" target="_blank" rel="noopener noreferrer" class="">Rust</a>.</p></div></article><nav class="pagination-nav docusaurus-mt-lg" aria-label="Blog post page navigation"><a class="pagination-nav__link pagination-nav__link--prev" href="/blogs/2024/05/29/one-year-of-building-the-message-streaming"><div class="pagination-nav__sublabel">Newer post</div><div class="pagination-nav__label">Iggy.rs — one year of building the message streaming</div>< [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
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..01e10459
--- /dev/null
+++ b/blogs/2024/05/29/one-year-of-building-the-message-streaming/index.html
@@ -0,0 +1,105 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="blog-wrapper blog-post-page plugin-blog plugin-id-default" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">Iggy.rs — one year of building the message streaming | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-ligh [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed">
+
+
+
+
+
+<link rel="preconnect" href="https://analytics.apache.org/">
+<script>var _paq=window._paq=window._paq||[];_paq.push(["setRequestMethod","POST"]),_paq.push(["trackPageView"]),_paq.push(["enableLinkTracking"]),_paq.push(["enableHeartBeatTimer"]),function(){var e="https://analytics.apache.org/";_paq.push(["setRequestMethod","POST"]),_paq.push(["setTrackerUrl",e+"matomo.php"]),_paq.push(["setSiteId","80"]);var a=document,t=a.createElement("script"),p=a.getElementsByTagName("script")[0];t.type="text/javascript",t.async=!0,t.src=e+"matomo.js",p.parentNo [...]
+<script src="/assets/js/runtime~main.0a940c88.js" defer="defer"></script>
+<script src="/assets/js/main.4a006c5e.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/img/apache-iggy0.5x.png"><link rel="preload" as="image" [...]
+<p><strong>It's been a little over a year</strong>, since the <a href="https://iggy.rs" target="_blank" rel="noopener noreferrer" class="">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/" t [...]
+<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/" target="_blank" rel="noopener noreferrer" class="">Reddit</a>, and was also mentioned on the main site of <a href="https://news.ycombinator.com/item?id=38868115" target="_blank" rel="noopener noreferrer" class="">Hacker News</a>, which I do believe were [...]
+<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 decoding="async" loading="lazy" alt="image" src="/assets/images/iggy_stars-adb7a001298df7df97de6b0fdd6321ce.png" width="795" height="542" class="img_ev3q"></p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="community">Community<a href="#community" class="hash-link" aria-label="Direct link to Community" title="Direct link to Community" translate="no"></a></h2>
+<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" target="_blank" rel="noopener noreferrer" class="">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 class=""><a href="https://github.com/apache/iggy" target="_blank" rel="noopener noreferrer" class="">Rust</a></li>
+<li class=""><a href="https://github.com/iggy-rs/iggy-dotnet-client" target="_blank" rel="noopener noreferrer" class="">C#</a></li>
+<li class=""><a href="https://github.com/iggy-rs/iggy-cpp-client" target="_blank" rel="noopener noreferrer" class="">C++</a></li>
+<li class=""><a href="https://github.com/iggy-rs/iggy-node-client" target="_blank" rel="noopener noreferrer" class="">Node (TS)</a></li>
+<li class=""><a href="https://github.com/iggy-rs/iggy-go-client" target="_blank" rel="noopener noreferrer" class="">Go</a></li>
+<li class=""><a href="https://github.com/iggy-rs/iggy-python-client" target="_blank" rel="noopener noreferrer" class="">Python</a></li>
+<li class=""><a href="https://github.com/iggy-rs/iggy-java-client" target="_blank" rel="noopener noreferrer" class="">Java</a></li>
+<li class=""><a href="https://github.com/iggy-rs/iggy-elixir-client" target="_blank" rel="noopener noreferrer" class="">Elixir</a></li>
+</ul>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="changelog">Changelog<a href="#changelog" class="hash-link" aria-label="Direct link to Changelog" title="Direct link to Changelog" translate="no"></a></h2>
+<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 class="">Increased the streaming server throughput by over 30% for both writes and reads</li>
+<li class="">Added messages compression for client-side & server-side supporting the different algorithms</li>
+<li class="">Implemented a new way of message batching with an additional tooling for data migration</li>
+<li class="">Fixed the possible server-side deadlock that could happen for a specific configuration</li>
+<li class="">Fixed issues with possible memory leaks when storing too many indices in memory</li>
+<li class="">Rebuilt our custom benchmarking tool</li>
+<li class="">Improved TCP connection handling</li>
+<li class="">Constantly upgrading our CI/CD with lots of testing, different runtimes, artifacts, crates and Docker images releases</li>
+<li class="">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 decoding="async" loading="lazy" alt="image" src="/assets/images/iggy_perf-33fc4db2b6cbd7156b753eee6aeaba60.png" width="2117" height="367" class="img_ev3q"></p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="tooling">Tooling<a href="#tooling" class="hash-link" aria-label="Direct link to Tooling" title="Direct link to Tooling" translate="no"></a></h2>
+<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" target="_blank" rel="noopener noreferrer" class="">CLI</a> and <a href="https://github.com/iggy-rs/iggy-web-ui" target="_blank" rel="noopener noreferrer" class="">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 decoding="async" loading="lazy" alt="image" src="/assets/images/iggy_cli-c140d5ecfddf24acd537722137b70c47.png" width="1743" height="766" class="img_ev3q"></p>
+<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 decoding="async" loading="lazy" alt="image" src="/assets/images/iggy_web-76023f316d53cc2e44ae6f7b83193529.png" width="2559" height="1353" class="img_ev3q"></p>
+<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" target="_blank" rel="noopener noreferrer" class="">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 decoding="async" loading="lazy" alt="image" src="/assets/images/iggy_bench-eed7510a845dfb053ac67be624599c99.png" width="1891" height="803" class="img_ev3q"></p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="early-adopters">Early adopters<a href="#early-adopters" class="hash-link" aria-label="Direct link to Early adopters" title="Direct link to Early adopters" translate="no"></a></h2>
+<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" target="_blank" rel="noopener noreferrer" class="">Marvin</a [...]
+<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="anchor anchorTargetStickyNavbar_Vzrq" id="clustering--replication">Clustering & replication<a href="#clustering--replication" class="hash-link" aria-label="Direct link to Clustering & replication" title="Direct link to Clustering & replication" translate="no"></a></h2>
+<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" target="_blank" rel="noopener noreferrer" class="">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" target="_blank" rel="noopener noreferrer" class="">Raft</a> consensus algorithm. However, adding the data replicat [...]
+<p><img decoding="async" loading="lazy" alt="image" src="/assets/images/iggy_cluster-c2c33596763c8b9930c7de7e12dc3586.png" width="2552" height="1276" class="img_ev3q"></p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="io_uring--thread-per-core--share-nothing">io_uring & thread-per-core + share-nothing<a href="#io_uring--thread-per-core--share-nothing" class="hash-link" aria-label="Direct link to io_uring & thread-per-core + share-nothing" title="Direct link to io_uring & thread-per-core + share-nothing" translate="no"></a></h2>
+<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" target="_blank" rel="noopener noreferrer" class="">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" target="_blank" rel="noopener noreferrer" class="">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 [...]
+<p>And just recently, we've established yet another <a href="https://github.com/iggy-rs/iggy-thread-per-core-sandbox" target="_blank" rel="noopener noreferrer" class="">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 decoding="async" loading="lazy" alt="image" src="/assets/images/iggy_tpc-a6b43534112bfc2c863a2ef675c0a547.png" width="2298" height="1232" class="img_ev3q"></p>
+<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 class="">How to evenly split partitions (the unit of data parallelism) between multiple cores?</li>
+<li class="">How to efficiently rewrite existing server metadata heavily relying on synchronized data with <code>Arc<></code> and <code>RwLock<></code>?</li>
+<li class="">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 class="">Should there be single or multiple threads handling the incoming TCP connections?</li>
+<li class="">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 class="">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" target="_blank" rel="noopener noreferrer" class="">studying</a> some of the existing solutions out there, including <a href="https://seastar.io" target="_blank" rel="noopener noreferrer" class="">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="anchor anchorTargetStickyNavbar_Vzrq" id="production-readiness">Production readiness<a href="#production-readiness" class="hash-link" aria-label="Direct link to Production readiness" title="Direct link to Production readiness" translate="no"></a></h2>
+<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" target="_blank" rel="noopener noreferrer" class="">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 decoding="async" loading="lazy" alt="image" src="/assets/images/iggy_rocket-24a27df28dafae43eb9634a4f6b00c5e.png" width="1920" height="1080" class="img_ev3q"></p></div></article><nav class="pagination-nav docusaurus-mt-lg" aria-label="Blog post page navigation"><a class="pagination-nav__link pagination-nav__link--prev" href="/blogs/2024/10/28/technology-radar-and-currrent-goals"><div class="pagination-nav__sublabel">Newer post</div><div class="pagination-nav__label">Iggy.rs - Tec [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
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..b25d9a41
--- /dev/null
+++ b/blogs/2024/10/28/technology-radar-and-currrent-goals/index.html
@@ -0,0 +1,67 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="blog-wrapper blog-post-page plugin-blog plugin-id-default" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">Iggy.rs - Technology Radar & current goals | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0. [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed">
+
+
+
+
+
+<link rel="preconnect" href="https://analytics.apache.org/">
+<script>var _paq=window._paq=window._paq||[];_paq.push(["setRequestMethod","POST"]),_paq.push(["trackPageView"]),_paq.push(["enableLinkTracking"]),_paq.push(["enableHeartBeatTimer"]),function(){var e="https://analytics.apache.org/";_paq.push(["setRequestMethod","POST"]),_paq.push(["setTrackerUrl",e+"matomo.php"]),_paq.push(["setSiteId","80"]);var a=document,t=a.createElement("script"),p=a.getElementsByTagName("script")[0];t.type="text/javascript",t.async=!0,t.src=e+"matomo.js",p.parentNo [...]
+<script src="/assets/js/runtime~main.0a940c88.js" defer="defer"></script>
+<script src="/assets/js/main.4a006c5e.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/img/apache-iggy0.5x.png"><link rel="preload" as="image" [...]
+<p>Quite recently (a few days ago), <a href="https://github.com/apache/iggy" target="_blank" rel="noopener noreferrer" class="">Iggy</a> has been listed on <a href="https://www.thoughtworks.com/radar/platforms/summary/iggy" target="_blank" rel="noopener noreferrer" class="">Technology Radar</a> by <a href="https://www.thoughtworks.com/" target="_blank" rel="noopener noreferrer" class="">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 decoding="async" loading="lazy" alt="image" src="/assets/images/iggy_technology_radar-291413e3a6d4cb1a5b7832ab5865423e.png" width="4096" height="2290" class="img_ev3q"></p>
+<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/" target="_blank" rel="noopener noreferrer" class="">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" target="_blank" rel="noopener noreferrer" class="">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/" target="_blank" rel="noopener noreferrer" class="">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="anchor anchorTargetStickyNavbar_Vzrq" id="current-goals">Current goals<a href="#current-goals" class="hash-link" aria-label="Direct link to Current goals" title="Direct link to Current goals" translate="no"></a></h2>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="replication">Replication<a href="#replication" class="hash-link" aria-label="Direct link to Replication" title="Direct link to Replication" translate="no"></a></h3>
+<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" target="_blank" rel="noopener noreferrer" class="">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://pmg.csail.mit.edu/papers/vr-revisited.pdf" target="_blank" rel="noopener noreferrer" class="">revisited form</a>), which was successfully used by e.g. <a href="https://tigerbeetle.com/" target="_blank" rel="noopener noreferrer" class="">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 decoding="async" loading="lazy" alt="image" src="/assets/images/iggy_vsr-3d747255ce17ecda927ccd4d258f7016.png" width="2832" height="3281" class="img_ev3q"></p>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="s3-storage">S3 storage<a href="#s3-storage" class="hash-link" aria-label="Direct link to S3 storage" title="Direct link to S3 storage" translate="no"></a></h3>
+<p>A few months ago, we did <a href="https://github.com/apache/iggy/pull/1053" target="_blank" rel="noopener noreferrer" class="">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>
+<div class="language-toml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-toml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">[</span><span class="token table class-name">data_maintenance.a [...]
+<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 class=""><strong>L1</strong> - data available directly from the server RAM (super fast writes/reads)</li>
+<li class=""><strong>L2</strong> - data stored on your servers disks (still very, very fast with NVME SSD gen4 or 5)</li>
+<li class=""><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" target="_blank" rel="noopener noreferrer" class="">Quickwit</a>).</p>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="opentelemetry">OpenTelemetry<a href="#opentelemetry" class="hash-link" aria-label="Direct link to OpenTelemetry" title="Direct link to OpenTelemetry" translate="no"></a></h3>
+<p>Speaking of the Quickwit, we've also <a href="https://github.com/apache/iggy/pull/1294" target="_blank" rel="noopener noreferrer" class="">implemented</a> a support for <a href="https://opentelemetry.io/" target="_blank" rel="noopener noreferrer" class="">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 in [...]
+<div class="language-toml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-toml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># OpenTelemetry configuration</span><span class=" [...]
+<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" target="_blank" rel="noopener noreferrer" class="">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 furth [...]
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="optimizations">Optimizations<a href="#optimizations" class="hash-link" aria-label="Direct link to Optimizations" title="Direct link to Optimizations" translate="no"></a></h3>
+<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" target="_blank" rel="noopener noreferrer" class="">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 [...]
+<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 decoding="async" loading="lazy" alt="image" src="/assets/images/iggy_docker-37b72ad9d9a244e1464c94f03c162193.png" width="2558" height="1375" class="img_ev3q"></p>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="io_uring">io_uring<a href="#io_uring" class="hash-link" aria-label="Direct link to io_uring" title="Direct link to io_uring" translate="no"></a></h3>
+<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" target="_blank" rel="noopener noreferrer" class="">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" target="_blank [...]
+<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></article><nav class="pagination-nav docusaurus-mt-lg" aria-label="Blog post page navigation"><a class="pagination-nav__link pagi [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
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..a4dfb349
--- /dev/null
+++ b/blogs/2025/02/10/apache-incubator/index.html
@@ -0,0 +1,71 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="blog-wrapper blog-post-page plugin-blog plugin-id-default" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">Iggy joins the Apache Incubator | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta d [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed">
+
+
+
+
+
+<link rel="preconnect" href="https://analytics.apache.org/">
+<script>var _paq=window._paq=window._paq||[];_paq.push(["setRequestMethod","POST"]),_paq.push(["trackPageView"]),_paq.push(["enableLinkTracking"]),_paq.push(["enableHeartBeatTimer"]),function(){var e="https://analytics.apache.org/";_paq.push(["setRequestMethod","POST"]),_paq.push(["setTrackerUrl",e+"matomo.php"]),_paq.push(["setSiteId","80"]);var a=document,t=a.createElement("script"),p=a.getElementsByTagName("script")[0];t.type="text/javascript",t.async=!0,t.src=e+"matomo.js",p.parentNo [...]
+<script src="/assets/js/runtime~main.0a940c88.js" defer="defer"></script>
+<script src="/assets/js/main.4a006c5e.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/img/apache-iggy0.5x.png"><link rel="preload" as="image" [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-a-journey-two-years-in-the-making">🚀 A Journey Two Years in the Making<a href="#-a-journey-two-years-in-the-making" class="hash-link" aria-label="Direct link to 🚀 A Journey Two Years in the Making" title="Direct link to 🚀 A Journey Two Years in the Making" translate="no"></a></h2>
+<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="anchor anchorTargetStickyNavbar_Vzrq" id="-beyond-just-iggy--a-growing-ecosystem">🔥 Beyond Just Iggy – A Growing Ecosystem<a href="#-beyond-just-iggy--a-growing-ecosystem" class="hash-link" aria-label="Direct link to 🔥 Beyond Just Iggy – A Growing Ecosystem" title="Direct link to 🔥 Beyond Just Iggy – A Growing Ecosystem" translate="no"></a></h2>
+<p>Iggy is no longer just about the core repository. Over time, we’ve built an entire ecosystem around it, including:</p>
+<ul>
+<li class="">✅ SDKs for seamless developer integrations</li>
+<li class="">✅ CLIs for powerful command-line control</li>
+<li class="">✅ Web UIs for intuitive management</li>
+<li class="">✅ And many more…</li>
+</ul>
+<p>We’re already approaching 20 repositories under the Iggy organization (<a href="https://github.com/iggy-rs/" target="_blank" rel="noopener noreferrer" class="">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="anchor anchorTargetStickyNavbar_Vzrq" id="-why-apache">🔗 Why Apache?<a href="#-why-apache" class="hash-link" aria-label="Direct link to 🔗 Why Apache?" title="Direct link to 🔗 Why Apache?" translate="no"></a></h2>
+<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 class=""><a href="https://cwiki.apache.org/confluence/display/INCUBATOR/Iggy+Proposal" target="_blank" rel="noopener noreferrer" class="">Official Proposal</a></li>
+<li class=""><a href="https://lists.apache.org/thread/q9whr3q9qd6wqm89f0vc1f6vkkvzc8xf" target="_blank" rel="noopener noreferrer" class="">Discussion Thread</a></li>
+<li class=""><a href="https://lists.apache.org/thread/6zfgdjwrzs92h4z4x6b25v1r23g3f5yg" target="_blank" rel="noopener noreferrer" class="">Voting Results</a></li>
+</ul>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-whats-next">📈 What’s Next?<a href="#-whats-next" class="hash-link" aria-label="Direct link to 📈 What’s Next?" title="Direct link to 📈 What’s Next?" translate="no"></a></h2>
+<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 class=""><strong>Scaling performance benchmarks</strong> to push the limits of ultra-low-latency streaming</li>
+<li class=""><strong>Expanding integrations</strong> with modern data infrastructure</li>
+<li class=""><strong>Building a vibrant developer ecosystem</strong> that makes message streaming frictionless</li>
+</ul>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-codebase-transition">🦀 Codebase transition<a href="#-codebase-transition" class="hash-link" aria-label="Direct link to 🦀 Codebase transition" title="Direct link to 🦀 Codebase transition" translate="no"></a></h2>
+<p>After the recent <a href="https://lists.apache.org/thread/zrn96nlg23r9353lr5tp2by2ggx4zxqc" target="_blank" rel="noopener noreferrer" class="">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 [...]
+<p>All the repositories under <a href="https://github.com/iggy-rs" target="_blank" rel="noopener noreferrer" class="">iggy-rs</a> will be eventually moved to the <a href="https://github.com/apache/iggy" target="_blank" rel="noopener noreferrer" class="">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" target="_blank" rel="noopener noreferrer" class="">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="anchor anchorTargetStickyNavbar_Vzrq" id="-join-the-movement">💡 Join the Movement<a href="#-join-the-movement" class="hash-link" aria-label="Direct link to 💡 Join the Movement" title="Direct link to 💡 Join the Movement" translate="no"></a></h2>
+<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 decoding="async" loading="lazy" alt="image" src="/assets/images/iggy_logo-f0e83b91b22303a5545dfb6d49756d18.png" width="1800" height="1000" class="img_ev3q"></p>
+<p>👉 Follow us, contribute, and help to build the future of the message streaming!</p>
+<ul>
+<li class=""><a href="https://discord.gg/apache-iggy" target="_blank" rel="noopener noreferrer" class="">Discord</a></li>
+<li class=""><a href="https://x.com/ApacheIggy" target="_blank" rel="noopener noreferrer" class="">X (Twitter)</a></li>
+<li class=""><a href="https://bsky.app/profile/iggy.rs" target="_blank" rel="noopener noreferrer" class="">Bluesky</a></li>
+<li class=""><a href="https://www.linkedin.com/company/apache-iggy/" target="_blank" rel="noopener noreferrer" class="">LinkedIn</a></li>
+</ul></div></article><nav class="pagination-nav docusaurus-mt-lg" aria-label="Blog post page navigation"><a class="pagination-nav__link pagination-nav__link--prev" href="/blogs/2025/02/17/transparent-benchmarks"><div class="pagination-nav__sublabel">Newer post</div><div class="pagination-nav__label">Transparent Benchmarking with Apache Iggy</div></a><a class="pagination-nav__link pagination-nav__link--next" href="/blogs/2024/10/28/technology-radar-and-currrent-goals"><div class="paginati [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
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..4ddd96aa
--- /dev/null
+++ b/blogs/2025/02/17/transparent-benchmarks/index.html
@@ -0,0 +1,53 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="blog-wrapper blog-post-page plugin-blog plugin-id-default" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">Transparent Benchmarking with Apache Iggy | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.pn [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed">
+
+
+
+
+
+<link rel="preconnect" href="https://analytics.apache.org/">
+<script>var _paq=window._paq=window._paq||[];_paq.push(["setRequestMethod","POST"]),_paq.push(["trackPageView"]),_paq.push(["enableLinkTracking"]),_paq.push(["enableHeartBeatTimer"]),function(){var e="https://analytics.apache.org/";_paq.push(["setRequestMethod","POST"]),_paq.push(["setTrackerUrl",e+"matomo.php"]),_paq.push(["setSiteId","80"]);var a=document,t=a.createElement("script"),p=a.getElementsByTagName("script")[0];t.type="text/javascript",t.async=!0,t.src=e+"matomo.js",p.parentNo [...]
+<script src="/assets/js/runtime~main.0a940c88.js" defer="defer"></script>
+<script src="/assets/js/main.4a006c5e.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/img/apache-iggy0.5x.png"><link rel="preload" as="image" [...]
+<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/" target="_blank" rel="noopener noreferrer" class="">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 decoding="async" loading="lazy" alt="image" src="/assets/images/iggy_bench_cli-32946d97899e6925f99469dad967ca7e.png" width="2742" height="1930" class="img_ev3q"></p>
+<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="anchor anchorTargetStickyNavbar_Vzrq" id="iggy-benchmarking-dashboard">Iggy benchmarking dashboard<a href="#iggy-benchmarking-dashboard" class="hash-link" aria-label="Direct link to Iggy benchmarking dashboard" title="Direct link to Iggy benchmarking dashboard" translate="no"></a></h2>
+<p><strong>And today, we're proud to present <a href="https://benchmarks.iggy.apache.org/" target="_blank" rel="noopener noreferrer" class="">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" target="_blank" rel="noopener noreferrer" class="">iggy-bench-dashboard</a> repository. In general, it's as simple as:</p>
+<ul>
+<li class="">Building the <a href="https://github.com/apache/iggy" target="_blank" rel="noopener noreferrer" class="">Iggy</a> in the release mode with <code>cargo build --release</code></li>
+<li class="">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 class="">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 class="">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 class="">Navigating to the specific benchmark directory to browse the charts and/or uploading them to the dashboard.</li>
+<li class="">And there's always <code>help</code> command e.g. <code>pinned-producer --help</code> to make your life easier :)</li>
+</ul>
+<p><img decoding="async" loading="lazy" alt="image" src="/assets/images/iggy_bench_dashboard-20dc5e120f14f0c4618f23227cd08ac9.png" width="2555" height="1327" class="img_ev3q"></p>
+<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="anchor anchorTargetStickyNavbar_Vzrq" id="towards-the-microsecond-latency">Towards the microsecond latency<a href="#towards-the-microsecond-latency" class="hash-link" aria-label="Direct link to Towards the microsecond latency" title="Direct link to Towards the microsecond latency" translate="no"></a></h2>
+<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" target="_blank" rel="noopener noreferrer" class="">rkyv</a> - zero-copy deserialization framework, which has yielded some great results. Keep in mind that st [...]
+<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" target="_blank" rel="noopener noreferrer" class="">monoio</a> which does support <strong>io_uring</strong>, and we've experienced superb results with this one on our experimental branch. Then, there [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
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..cb8d8bf0
--- /dev/null
+++ b/blogs/2025/05/08/zero-copy-deserialization/index.html
@@ -0,0 +1,73 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="blog-wrapper blog-post-page plugin-blog plugin-id-default" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">Zero-copy (de)serialization | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data- [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed">
+
+
+
+
+
+<link rel="preconnect" href="https://analytics.apache.org/">
+<script>var _paq=window._paq=window._paq||[];_paq.push(["setRequestMethod","POST"]),_paq.push(["trackPageView"]),_paq.push(["enableLinkTracking"]),_paq.push(["enableHeartBeatTimer"]),function(){var e="https://analytics.apache.org/";_paq.push(["setRequestMethod","POST"]),_paq.push(["setTrackerUrl",e+"matomo.php"]),_paq.push(["setSiteId","80"]);var a=document,t=a.createElement("script"),p=a.getElementsByTagName("script")[0];t.type="text/javascript",t.async=!0,t.src=e+"matomo.js",p.parentNo [...]
+<script src="/assets/js/runtime~main.0a940c88.js" defer="defer"></script>
+<script src="/assets/js/main.4a006c5e.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/img/apache-iggy0.5x.png"><link rel="preload" as="image" [...]
+<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" target="_blank" rel="noopener noreferrer" class="">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" target="_blank" rel="noopener noreferrer" class="">finally merged it</a></strong>. In this blog post, we will share our path to implementing it.</p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="zero-copy-with-rkyv">Zero copy with rkyv<a href="#zero-copy-with-rkyv" class="hash-link" aria-label="Direct link to Zero copy with rkyv" title="Direct link to Zero copy with rkyv" translate="no"></a></h2>
+<p>Our initial approach to zero copy was leveraging the existing <strong><a href="https://github.com/rkyv/rkyv" target="_blank" rel="noopener noreferrer" class="">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 [...]
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token attribute attr-name" style="color:#00a4db">#[derive(Archive, Deserialize, Serialize)]</span><span [...]
+<p>Same traits are derived for <code>IggyMessage</code></p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token attribute attr-name" style="color:#00a4db">#[derive(Archive, Deserialize, Serialize)]</span><span [...]
+<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" target="_blank" rel="noopener noreferrer" class="">rkyv book</a></strong>, or from this <strong><a href="https://www.youtube.com/watch?v=ON4z2LbTD-4" target="_blank" rel="noopener noreferrer" class="">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>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">struct</span><span class="token plain"> </span><span class="token t [...]
+<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 decoding="async" loading="lazy" alt="image" src="/assets/images/iggy_batch_schema_1-61b4d896b850e3d0ee08270f7db7c6b5.png" width="1600" height="664" class="img_ev3q"></p>
+<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="anchor anchorTargetStickyNavbar_Vzrq" id="beyond-rkyv">Beyond rkyv<a href="#beyond-rkyv" class="hash-link" aria-label="Direct link to Beyond rkyv" title="Direct link to Beyond rkyv" translate="no"></a></h2>
+<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>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<p><img decoding="async" loading="lazy" alt="image" src="/assets/images/iggy_batch_schema_2-c7a5fc6158b838999c178ef8aea96089.png" width="1600" height="720" class="img_ev3q"></p>
+<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="anchor anchorTargetStickyNavbar_Vzrq" id="benchmarks">Benchmarks<a href="#benchmarks" class="hash-link" aria-label="Direct link to Benchmarks" title="Direct link to Benchmarks" translate="no"></a></h2>
+<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 decoding="async" loading="lazy" alt="image" src="/assets/images/no_zero_copy_producer-ffed3643f7efa9c5ac43a3ce4cba746c.png" width="3188" height="2264" class="img_ev3q">
+<img decoding="async" loading="lazy" alt="image" src="/assets/images/no_zero_copy_consumer-ae546079ca662038a43983969c9fa325.png" width="3186" height="2262" class="img_ev3q"></p>
+<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">2.39ms</td></tr><tr><td style="text-align:left">Consumer< [...]
+<p><strong>After</strong></p>
+<p><img decoding="async" loading="lazy" alt="image" src="/assets/images/zero_copy_producer-6cd58f250a711fb170bba9091da38606.png" width="3194" height="2260" class="img_ev3q">
+<img decoding="async" loading="lazy" alt="image" src="/assets/images/zero_copy_consumer-b0a3206f473d6d13c8cc4fc8dfca3486.png" width="3192" height="2266" class="img_ev3q"></p>
+<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.63ms</td></tr><tr><td style="text-align:left">Consumer</td [...]
+<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" target="_blank" rel="noopener noreferrer" class="">benchmarking website</a></strong>.</p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="concluding">Concluding<a href="#concluding" class="hash-link" aria-label="Direct link to Concluding" title="Direct link to Concluding" translate="no"></a></h2>
+<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" target="_blank" rel="noopener noreferrer" class= [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-next-for-iggy">What’s next for Iggy<a href="#whats-next-for-iggy" class="hash-link" aria-label="Direct link to What’s next for Iggy" title="Direct link to What’s next for Iggy" translate="no"></a></h2>
+<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/" target="_blank" rel="noopener noreferrer" class="">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 blo [...]
+<p>For now <strong><a href="https://github.com/apache/iggy/tree/io_uring_monoio_runtime" target="_blank" rel="noopener noreferrer" class="">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></article><nav class="pagination-nav docusaurus-mt-lg" aria-label="Blog post page navigation"><a class="pagination-nav__link pagination-nav__link--prev" href="/blogs/2 [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
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..e8fe9485
--- /dev/null
+++ b/blogs/2025/06/06/connectors-runtime/index.html
@@ -0,0 +1,49 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="blog-wrapper blog-post-page plugin-blog plugin-id-default" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">Connectors runtime | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed">
+
+
+
+
+
+<link rel="preconnect" href="https://analytics.apache.org/">
+<script>var _paq=window._paq=window._paq||[];_paq.push(["setRequestMethod","POST"]),_paq.push(["trackPageView"]),_paq.push(["enableLinkTracking"]),_paq.push(["enableHeartBeatTimer"]),function(){var e="https://analytics.apache.org/";_paq.push(["setRequestMethod","POST"]),_paq.push(["setTrackerUrl",e+"matomo.php"]),_paq.push(["setSiteId","80"]);var a=document,t=a.createElement("script"),p=a.getElementsByTagName("script")[0];t.type="text/javascript",t.async=!0,t.src=e+"matomo.js",p.parentNo [...]
+<script src="/assets/js/runtime~main.0a940c88.js" defer="defer"></script>
+<script src="/assets/js/main.4a006c5e.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/img/apache-iggy0.5x.png"><link rel="preload" as="image" [...]
+<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="anchor anchorTargetStickyNavbar_Vzrq" id="what-are-the-connectors">What are the connectors<a href="#what-are-the-connectors" class="hash-link" aria-label="Direct link to What are the connectors" title="Direct link to What are the connectors" translate="no"></a></h2>
+<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" target="_blank" rel="noopener noreferrer" class="">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>
+<div class="language-toml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-toml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># Required configuration for a sink connector</sp [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="rust-based-plugins">Rust-based plugins<a href="#rust-based-plugins" class="hash-link" aria-label="Direct link to Rust-based plugins" title="Direct link to Rust-based plugins" translate="no"></a></h2>
+<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" target="_blank" rel="noopener noreferrer" class="">dlopen2</a></strong> library to load the plugins during the runtime initializa [...]
+<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" target="_blank" rel="noopener noreferrer" class="">Tokio runtime</a></strong> to manage the asynchronous tasks and events across all connectors, as well as the <stron [...]
+<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" target="_blank" rel="noopener noreferrer" class="">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 thousan [...]
+<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/" target="_blank" rel="noopener noreferrer" class="">repository</a></strong> or the <strong><a class="" href="/docs/connectors/introduction">documentation</a></strong> for more details.</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token attribute attr-name" style="color:#00a4db">#[async_trait]</span><span class="token plain"></span>< [...]
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token attribute attr-name" style="color:#00a4db">#[async_trait]</span><span class="token plain"></span>< [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-next">What's next?<a href="#whats-next" class="hash-link" aria-label="Direct link to What's next?" title="Direct link to What's next?" translate="no"></a></h2>
+<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" target="_blank" rel="noopener noreferrer" class="">issue</a></strong>, <strong><a href="https://github.com/apache/iggy/pulls" target="_blank" rel="noopener noreferrer" class="">pull request</a></strong> or start a <strong><a href="https://github.com/apache/iggy/discussions" target="_blank" rel="no [...]
+<p>As always, you are more than welcome to join our <strong><a href="https://discord.gg/apache-iggy" target="_blank" rel="noopener noreferrer" class="">Discord community</a></strong>!</p></div></article><nav class="pagination-nav docusaurus-mt-lg" aria-label="Blog post page navigation"><a class="pagination-nav__link pagination-nav__link--prev" href="/blogs/2025/08/10/release-0.5.0"><div class="pagination-nav__sublabel">Newer post</div><div class="pagination-nav__label">Apache Iggy 0.5.0 [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
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..3ce871bf
--- /dev/null
+++ b/blogs/2025/08/10/release-0.5.0/index.html
@@ -0,0 +1,95 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="blog-wrapper blog-post-page plugin-blog plugin-id-default" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">Apache Iggy 0.5.0 Release | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed">
+
+
+
+
+
+<link rel="preconnect" href="https://analytics.apache.org/">
+<script>var _paq=window._paq=window._paq||[];_paq.push(["setRequestMethod","POST"]),_paq.push(["trackPageView"]),_paq.push(["enableLinkTracking"]),_paq.push(["enableHeartBeatTimer"]),function(){var e="https://analytics.apache.org/";_paq.push(["setRequestMethod","POST"]),_paq.push(["setTrackerUrl",e+"matomo.php"]),_paq.push(["setSiteId","80"]);var a=document,t=a.createElement("script"),p=a.getElementsByTagName("script")[0];t.type="text/javascript",t.async=!0,t.src=e+"matomo.js",p.parentNo [...]
+<script src="/assets/js/runtime~main.0a940c88.js" defer="defer"></script>
+<script src="/assets/js/main.4a006c5e.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/img/apache-iggy0.5x.png"><link rel="preload" as="image" [...]
+<p>It’s been four months since our last <a href="https://github.com/apache/iggy/releases/tag/server-0.4.300" target="_blank" rel="noopener noreferrer" class="">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" target="_blank" rel="noopener noreferrer" class="">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="anchor anchorTargetStickyNavbar_Vzrq" id="iggy-server">Iggy Server<a href="#iggy-server" class="hash-link" aria-label="Direct link to Iggy Server" title="Direct link to Iggy Server" translate="no"></a></h2>
+<p>The most significant change on the server side is the introduction of <strong><a href="https://github.com/apache/iggy/pull/1679" target="_blank" rel="noopener noreferrer" class="">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" target="_blank" rel="noopener noreferrer" class="">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" target="_blank" rel="noopener noreferrer" class="">Iggy CLI</a></strong> and <strong><a href="https://github.com/apache/iggy/tree/master/web" target="_blank" rel="noopener noreferrer" class="">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" target="_blank" rel="noopener noreferrer" class="">Docker Hub</a></strong>.</p>
+<hr>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="sdks">SDKs<a href="#sdks" class="hash-link" aria-label="Direct link to SDKs" title="Direct link to SDKs" translate="no"></a></h2>
+<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 class=""><a href="https://crates.io/crates/iggy" target="_blank" rel="noopener noreferrer" class="">Rust</a> (always up-to-date, core reference implementation)</li>
+<li class=""><a href="https://www.nuget.org/packages/Apache.Iggy/" target="_blank" rel="noopener noreferrer" class="">C#</a></li>
+<li class=""><a href="https://repository.apache.org/#nexus-search;quick~iggy" target="_blank" rel="noopener noreferrer" class="">Java</a></li>
+<li class=""><a href="https://pypi.org/project/apache-iggy/" target="_blank" rel="noopener noreferrer" class="">Python</a></li>
+<li class=""><a href="https://www.npmjs.com/package/apache-iggy" target="_blank" rel="noopener noreferrer" class="">Node.js (TypeScript)</a></li>
+<li class=""><a href="https://pkg.go.dev/github.com/apache/iggy/foreign/go" target="_blank" rel="noopener noreferrer" class="">Go</a></li>
+</ul>
+<p>C++ and Elixir clients are in progress under the <a href="https://github.com/apache/iggy/tree/master/foreign" target="_blank" rel="noopener noreferrer" class="">foreign</a> directory.</p>
+<p><strong>New in Rust SDK:</strong>
+Support for a <strong><a href="https://github.com/apache/iggy/pull/1838" target="_blank" rel="noopener noreferrer" class="">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" target="_blank" rel="noopener noreferrer" class="">here</a>.</p>
+<hr>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="benchmarks">Benchmarks<a href="#benchmarks" class="hash-link" aria-label="Direct link to Benchmarks" title="Direct link to Benchmarks" translate="no"></a></h2>
+<p>We’ve expanded our benchmarking toolkit:</p>
+<ul>
+<li class=""><strong>Iggy Bench CLI</strong> (<code>iggy-bench</code>) — run local benchmarks with various configurations and profiles.</li>
+<li class="">JSON output and chart rendering for visual performance analysis.</li>
+<li class="">Open benchmark results published at <a href="https://benchmarks.iggy.apache.org" target="_blank" rel="noopener noreferrer" class="">benchmarks.iggy.apache.org</a>, powered by the open source <a href="https://github.com/apache/iggy/tree/master/core/bench" target="_blank" rel="noopener noreferrer" class="">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="anchor anchorTargetStickyNavbar_Vzrq" id="connectors">Connectors<a href="#connectors" class="hash-link" aria-label="Direct link to Connectors" title="Direct link to Connectors" translate="no"></a></h2>
+<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 class="">Ingest data into Iggy from external systems (e.g., Postgres CDC).</li>
+<li class="">Export data from Iggy to external destinations (e.g., indexing engines).</li>
+<li class="">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" target="_blank" rel="noopener noreferrer" class="">post</a> and in the <a class="" href="/docs/connectors/introduction">documentation</a>.</p>
+<hr>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="mcp-server">MCP Server<a href="#mcp-server" class="hash-link" aria-label="Direct link to MCP Server" title="Direct link to MCP Server" translate="no"></a></h2>
+<p>Apache Iggy now includes support for the <strong><a href="https://modelcontextprotocol.io" target="_blank" rel="noopener noreferrer" class="">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 class="" href="/docs/ai/mcp">documentation</a>.</p>
+<hr>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="versioning">Versioning<a href="#versioning" class="hash-link" aria-label="Direct link to Versioning" title="Direct link to Versioning" translate="no"></a></h2>
+<p>Releases follow <a href="https://semver.org/" target="_blank" rel="noopener noreferrer" class="">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="anchor anchorTargetStickyNavbar_Vzrq" id="whats-next">What’s Next<a href="#whats-next" class="hash-link" aria-label="Direct link to What’s Next" title="Direct link to What’s Next" translate="no"></a></h2>
+<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 class="">Expanding SDKs across more languages and catching up with the latest features.</li>
+<li class="">Synchronous SDK clients and <a href="https://www.firezone.dev/blog/sans-io" target="_blank" rel="noopener noreferrer" class="">sans-io</a> design.</li>
+<li class="">Benchmarking orchestrator</li>
+<li class="">Enhancing the Connectors Runtime and Web UI.</li>
+<li class="">Extending AI features around the MCP server.</li>
+<li class="">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" target="_blank" rel="noopener noreferrer" class="">Discord</a> and help shape the future of the project!</strong></p></div><footer class="docusaurus-mt-lg"><div class="row margin-top--sm theme-blog-footer-edit-meta-row"><div class="col"><b>Tags:</b><ul class="tags_jXut padding--none margin-left--sm"><li class="tag_QGVx"><a rel="tag" class="tag_zVej tagRegular_sFm0" href="/blogs/tags/release">release</a></li><li class="tag_QGV [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
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..11ca80f3
--- /dev/null
+++ b/blogs/2025/11/17/websocket-io-uring/index.html
@@ -0,0 +1,251 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="blog-wrapper blog-post-page plugin-blog plugin-id-default" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">Building WebSocket Protocol in Apache Iggy using io_uring and Completion Based I/O Architecture | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="ht [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed">
+
+
+
+
+
+<link rel="preconnect" href="https://analytics.apache.org/">
+<script>var _paq=window._paq=window._paq||[];_paq.push(["setRequestMethod","POST"]),_paq.push(["trackPageView"]),_paq.push(["enableLinkTracking"]),_paq.push(["enableHeartBeatTimer"]),function(){var e="https://analytics.apache.org/";_paq.push(["setRequestMethod","POST"]),_paq.push(["setTrackerUrl",e+"matomo.php"]),_paq.push(["setSiteId","80"]);var a=document,t=a.createElement("script"),p=a.getElementsByTagName("script")[0];t.type="text/javascript",t.async=!0,t.src=e+"matomo.js",p.parentNo [...]
+<script src="/assets/js/runtime~main.0a940c88.js" defer="defer"></script>
+<script src="/assets/js/main.4a006c5e.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/img/apache-iggy0.5x.png"><link rel="preload" as="image" [...]
+<p>In our <a href="https://iggy.apache.org/blogs/2025/08/10/release-0.5.0" target="_blank" rel="noopener noreferrer" class="">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</ [...]
+<p>As part of this rewrite, we migrated from Tokio to <a href="https://github.com/compio-rs/compio" target="_blank" rel="noopener noreferrer" class="">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" target="_blank" rel="noopener noreferrer" class="">tungstenite</a> and <a href="https://github.com/snapview/tokio-tungstenite" target="_blank" rel="noopener noreferrer" class="">tokio-tungstenite</a> but they are made wh [...]
+<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" target="_blank" rel="noopener noreferrer" class="">contributing</a> to <code>compio</code>.</p>
+<hr>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="understanding-the-architectural-divide-poll-vs-completion">Understanding the architectural divide (poll vs completion)<a href="#understanding-the-architectural-divide-poll-vs-completion" class="hash-link" aria-label="Direct link to Understanding the architectural divide (poll vs completion)" title="Direct link to Understanding the architectural divide (poll vs completion)" translate="no"></a></h2>
+<p>Let's see why poll-based libraries can't easily work with completion based runtimes by examining the traits of compio, tungstenite.</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// The Rust std::io::Read trait (what tungstenite [...]
+<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>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// Tungstenite's WebSocket structure</span>< [...]
+<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 class="">Works with compio's owned-buffer async I/O</li>
+<li class="">Presents synchronous Read/Write traits to tungstenite</li>
+<li class="">Efficiently bridges sync and async world</li>
+</ul>
+<hr>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="challenge-with-tungstenite">Challenge with Tungstenite<a href="#challenge-with-tungstenite" class="hash-link" aria-label="Direct link to Challenge with Tungstenite" title="Direct link to Challenge with Tungstenite" translate="no"></a></h2>
+<p>Tungstenite is the de-facto Rust WebSocket protocol implementation. It handles all the WebSocket protocol logic:</p>
+<ul>
+<li class="">Frame parsing and generation</li>
+<li class="">Message fragmentation</li>
+<li class="">Control frames (ping, pong, close)</li>
+<li class="">Protocol violations and error handling</li>
+<li class="">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>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// Compio's async read - can't be made [...]
+<p>These are fundamentally different programming models that don't compose cleanly.</p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="decision-a-separate-crate">Decision: A separate crate<a href="#decision-a-separate-crate" class="hash-link" aria-label="Direct link to Decision: A separate crate" title="Direct link to Decision: A separate crate" translate="no"></a></h2>
+<p>After realizing the incompatibility, we've decided to create <code>compio-ws</code> as a standalone crate. The architecture would be:</p>
+<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain"> ┌────────────────────────────┐</span><br></span><span class [...]
+<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="anchor anchorTargetStickyNavbar_Vzrq" id="first-attempt-syncstream">First Attempt: <code>SyncStream</code><a href="#first-attempt-syncstream" class="hash-link" aria-label="Direct link to first-attempt-syncstream" title="Direct link to first-attempt-syncstream" translate="no"></a></h2>
+<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>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<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>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">impl</span><span class="token operator" style="color:#393A34"><< [...]
+<p>Writing (sync to async):</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">impl</span><span class="token operator" style="color:#393A34"><< [...]
+<p>The pattern is:</p>
+<ul>
+<li class="">Sync <code>read()</code>/<code>write()</code> operate on internal buffers</li>
+<li class="">Return <code>WouldBlock</code> when buffer is empty/full</li>
+<li class="">Call async <code>fill_read_buf()</code>/<code>flush_write_buf()</code> to service buffers</li>
+<li class="">Retry the sync operation</li>
+</ul>
+<p>This allows tungstenite to work with compio streams:</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> stream </span><span class="tok [...]
+<hr>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-problem-with-fixed-buffer-size-in-syncstream">The problem with fixed buffer size in <code>SyncStream</code><a href="#the-problem-with-fixed-buffer-size-in-syncstream" class="hash-link" aria-label="Direct link to the-problem-with-fixed-buffer-size-in-syncstream" title="Direct link to the-problem-with-fixed-buffer-size-in-syncstream" translate="no"></a></h2>
+<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>
+<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Message: 16MB</span><br></span><span class="token-line" style="color:#393A34"><span class=" [...]
+<p>The measurements were bad:</p>
+<ul>
+<li class="">Time: Over 100 seconds to send 16MB</li>
+<li class="">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 class="">Saving state in tungstenite</li>
+<li class="">Suspending the sync call</li>
+<li class="">Executing async flush</li>
+<li class="">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="anchor anchorTargetStickyNavbar_Vzrq" id="the-solution-growablesyncstream">The Solution: <code>GrowableSyncStream</code><a href="#the-solution-growablesyncstream" class="hash-link" aria-label="Direct link to the-solution-growablesyncstream" title="Direct link to the-solution-growablesyncstream" translate="no"></a></h2>
+<p>Design goals:</p>
+<ul>
+<li class="">Dynamic growth: Buffers start small and grow as needed</li>
+<li class="">Bounded maximum: Prevent memory exhaustion with configurable limits</li>
+<li class="">Automatic shrinking: Return to base capacity based on a threshold</li>
+<li class="">Minimal round trips: Handle large messages without constant <code>WouldBlock</code></li>
+</ul>
+<p>Architecture Overview:</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<p>Buffer growth strategy:</p>
+<ul>
+<li class="">Start with a small sized buffer (128 KB matching tungstenite default buffer size)</li>
+<li class="">Grow in predictable increments of <code>base_capacity</code> sized chunks</li>
+<li class="">Cap growth at reasonable limit (64MB default)</li>
+<li class="">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 class="">Compacts buffer when needed (moves unread data to front)</li>
+<li class="">Grows in <code>base_capacity</code> increments during <code>fill_read_buf()</code></li>
+<li class="">Shrinks back to base when all data consumed and buffer > 4× base</li>
+</ul>
+<p>Write path:</p>
+<ul>
+<li class=""><code>Vec::extend_from_slice</code> handles growth automatically up to <code>max_buffer_size</code></li>
+<li class="">Returns <code>WouldBlock</code> only when approaching max limit</li>
+<li class=""><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="anchor anchorTargetStickyNavbar_Vzrq" id="benchmarks">Benchmarks<a href="#benchmarks" class="hash-link" aria-label="Direct link to Benchmarks" title="Direct link to Benchmarks" translate="no"></a></h2>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="benchmark-methodology">Benchmark Methodology<a href="#benchmark-methodology" class="hash-link" aria-label="Direct link to Benchmark Methodology" title="Direct link to Benchmark Methodology" translate="no"></a></h3>
+<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 class=""><strong>CPU:</strong> Intel Xeon Platinum 8259CL @ 2.50GHz (Cascade Lake)</li>
+<li class=""><strong>Cores:</strong> 6 physical cores with hyperthreading (12 vCPUs total)</li>
+<li class=""><strong>Cache:</strong> 36 MB L3 cache</li>
+<li class=""><strong>Memory:</strong> 96 GB RAM</li>
+<li class=""><strong>Storage:</strong> Local NVMe SSD</li>
+</ul>
+<p>Common benchmark setting used:</p>
+<ul>
+<li class="">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 class="">Use huge pages in linux.</li>
+</ul>
+<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">sudo sysctl -w vm.swappiness=10</span><br></span><span class="token-line" style="color:#393 [...]
+<p>Workload characteristics:</p>
+<ul>
+<li class="">4 Producers (one per CPU core)</li>
+<li class="">4 Streams, 1 Topic per Stream, 1 Partition per Topic</li>
+<li class="">1000 messages per batch</li>
+<li class="">40,000 batches</li>
+<li class="">1000 bytes per message</li>
+<li class="">Total: 40M messages, 40GB of data</li>
+</ul>
+<p>We compared two scenarios:</p>
+<ul>
+<li class="">TCP: Direct TCP connection (baseline)</li>
+<li class="">WebSocket: compio-ws with GrowableSyncStream</li>
+</ul>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="results-tcp-vs-websocket">Results: TCP vs WebSocket<a href="#results-tcp-vs-websocket" class="hash-link" aria-label="Direct link to Results: TCP vs WebSocket" title="Direct link to Results: TCP vs WebSocket" translate="no"></a></h3>
+<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></tr><tr><td>P95</td><td style="text-align:right">2.94 ms< [...]
+<p>Benchmark graphs:</p>
+<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="tcp">TCP<a href="#tcp" class="hash-link" aria-label="Direct link to TCP" title="Direct link to TCP" translate="no"></a></h4>
+<p><img decoding="async" loading="lazy" alt="image" src="/assets/images/tcp-1234-784a4e2d38f3ad9fceaa5d15d9960f38.png" width="1600" height="1200" class="img_ev3q"></p>
+<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="websocket">WebSocket<a href="#websocket" class="hash-link" aria-label="Direct link to WebSocket" title="Direct link to WebSocket" translate="no"></a></h4>
+<p><img decoding="async" loading="lazy" alt="image" src="/assets/images/ws-1234-057d2fad76235bff8a09d63c800065e4.png" width="1600" height="1200" class="img_ev3q"></p>
+<hr>
+<p>Next we look at pinned-consumer benchmark.</p>
+<p>Workload characteristics:</p>
+<ul>
+<li class="">4 Consumers (one per CPU core)</li>
+<li class="">4 Streams, 1 Topic per Stream, 1 Partition per Topic</li>
+<li class="">1000 messages per batch</li>
+<li class="">40,000 batches</li>
+<li class="">1000 bytes per message</li>
+<li class="">Total: 40M messages, 40GB of data</li>
+</ul>
+<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></tr><tr><td>P95</td><td style="text-align:right">0.85 m [...]
+<p>Benchmark graphs:</p>
+<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="tcp-1">TCP<a href="#tcp-1" class="hash-link" aria-label="Direct link to TCP" title="Direct link to TCP" translate="no"></a></h4>
+<p><img decoding="async" loading="lazy" alt="image" src="/assets/images/pc_tcp-ad927c98e841cf0dd0647d5e45fb0a2f.png" width="1600" height="1200" class="img_ev3q"></p>
+<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="websocket-1">WebSocket<a href="#websocket-1" class="hash-link" aria-label="Direct link to WebSocket" title="Direct link to WebSocket" translate="no"></a></h4>
+<p><img decoding="async" loading="lazy" alt="image" src="/assets/images/pc_ws-08cd4047c7106ef1fa677c0e5c23ac8e.png" width="1600" height="1200" class="img_ev3q"></p>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="analysis">Analysis:<a href="#analysis" class="hash-link" aria-label="Direct link to Analysis:" title="Direct link to Analysis:" translate="no"></a></h3>
+<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 class="">WebSocket framing: each message needs frame headers.</li>
+<li class="">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="anchor anchorTargetStickyNavbar_Vzrq" id="future-work">Future Work<a href="#future-work" class="hash-link" aria-label="Direct link to Future Work" title="Direct link to Future Work" translate="no"></a></h2>
+<ol>
+<li class="">
+<p>Smarter Buffer Growth</p>
+<ul>
+<li class="">Current: Linear <code>base_capacity</code> increments</li>
+<li class="">Better: Exponential growth (like <code>Vec::reserve</code>)</li>
+<li class="">Impact: Reduce reallocation overhead for large messages</li>
+</ul>
+</li>
+<li class="">
+<p>Buffer Pooling</p>
+<ul>
+<li class="">Current: Allocate/deallocate per message</li>
+<li class="">Better: Per-core buffer pools with object reuse</li>
+<li class="">Impact: Reduce allocator pressure</li>
+</ul>
+</li>
+<li class="">
+<p>WebSocket implementation with native owned buffers</p>
+<ul>
+<li class="">Implement WebSocket protocol directly with owned buffers from scratch.</li>
+<li class="">Direct integration with compio to use io_uring capabilities.</li>
+<li class="">Could increase performance significantly.</li>
+<li class="">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" target="_blank" rel="noopener noreferrer" class="">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="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no"></a></h2>
+<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 class="">Browser-based producers sending events or telemetry</li>
+<li class="">Edge devices reporting sensor data or metrics</li>
+<li class="">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 class=""><strong>Optimize</strong> <code>GrowableSyncStream</code>: Implement exponential buffer growth and pooling</li>
+<li class=""><strong>Owned buffer WS protocol implementation:</strong> Build WebSocket from scratch with owned buffers</li>
+<li class=""><strong>Push-based consumers:</strong> Help implement server-push notifications in Iggy</li>
+<li class=""><strong>Edge client libraries:</strong> Create WebSocket SDKs optimized for resource-constrained devices</li>
+</ul></div><footer class="docusaurus-mt-lg"><div class="row margin-top--sm theme-blog-footer-edit-meta-row"><div class="col"><b>Tags:</b><ul class="tags_jXut padding--none margin-left--sm"><li class="tag_QGVx"><a rel="tag" class="tag_zVej tagRegular_sFm0" href="/blogs/tags/websocket">websocket</a></li><li class="tag_QGVx"><a rel="tag" class="tag_zVej tagRegular_sFm0" href="/blogs/tags/io-uring">io_uring</a></li><li class="tag_QGVx"><a rel="tag" class="tag_zVej tagRegular_sFm0" href="/blo [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/blogs/2025/12/09/release-0.6.0/index.html b/blogs/2025/12/09/release-0.6.0/index.html
new file mode 100644
index 00000000..c8909d54
--- /dev/null
+++ b/blogs/2025/12/09/release-0.6.0/index.html
@@ -0,0 +1,105 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="blog-wrapper blog-post-page plugin-blog plugin-id-default" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">Apache Iggy 0.6.0 Release | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed">
+
+
+
+
+
+<link rel="preconnect" href="https://analytics.apache.org/">
+<script>var _paq=window._paq=window._paq||[];_paq.push(["setRequestMethod","POST"]),_paq.push(["trackPageView"]),_paq.push(["enableLinkTracking"]),_paq.push(["enableHeartBeatTimer"]),function(){var e="https://analytics.apache.org/";_paq.push(["setRequestMethod","POST"]),_paq.push(["setTrackerUrl",e+"matomo.php"]),_paq.push(["setSiteId","80"]);var a=document,t=a.createElement("script"),p=a.getElementsByTagName("script")[0];t.type="text/javascript",t.async=!0,t.src=e+"matomo.js",p.parentNo [...]
+<script src="/assets/js/runtime~main.0a940c88.js" defer="defer"></script>
+<script src="/assets/js/main.4a006c5e.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/img/apache-iggy0.5x.png"><link rel="preload" as="image" [...]
+<p>Four months after <a href="https://iggy.apache.org/blogs/2025/08/10/release-0.5.0/" target="_blank" rel="noopener noreferrer" class="">0.5.0</a>, we're excited to release <strong><a href="https://github.com/apache/iggy/releases/tag/server-0.6.0" target="_blank" rel="noopener noreferrer" class="">Apache Iggy 0.6.0</a></strong> — our biggest architectural change yet.</p>
+<p>This release represents a <strong>major architectural evolution</strong> of Apache Iggy with substantial performance improvements, new connectors, and SDK enhancements.</p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="iggy-server">Iggy Server<a href="#iggy-server" class="hash-link" aria-label="Direct link to Iggy Server" title="Direct link to Iggy Server" translate="no"></a></h2>
+<p>The most significant change in 0.6.0 is the <strong>complete server rewrite</strong> using <strong><a href="https://github.com/apache/iggy/pull/2299" target="_blank" rel="noopener noreferrer" class="">io_uring</a></strong> with a <strong>thread-per-core, shared-nothing architecture</strong>. This represents a fundamental shift from the previous Tokio-based poll model to a completion-based async runtime using <a href="https://github.com/compio-rs/compio" target="_blank" rel="noopener n [...]
+<p>Key aspects of this architectural change:</p>
+<ul>
+<li class=""><strong>Completion-based I/O</strong> - unlike poll-based models, <strong>io_uring</strong> uses completion queues where the kernel notifies when operations finish</li>
+<li class=""><strong>Thread-per-core design</strong> - each CPU core runs its own event loop with dedicated resources, eliminating cross-thread synchronization overhead</li>
+<li class=""><strong>Shared-nothing model</strong> - data is partitioned across cores to minimize contention and cache invalidation</li>
+</ul>
+<p>This delivers improved throughput, lower latency, and more predictable tail latencies (p99+) under load.</p>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="websocket-transport">WebSocket Transport<a href="#websocket-transport" class="hash-link" aria-label="Direct link to WebSocket Transport" title="Direct link to WebSocket Transport" translate="no"></a></h3>
+<p>Along with the io_uring migration, we've decided to implement <strong>WebSocket transport</strong> as a first-class communication protocol alongside TCP, QUIC and HTTP. This enables seamless integration with web clients and environments where WebSocket is preferred. Since existing libraries are poll-based and incompatible with compio's completion model, the solution was <strong><a href="https://iggy.apache.org/blogs/2025/11/17/websocket-io-uring" target="_blank" rel="noopene [...]
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="breaking-changes">Breaking Changes<a href="#breaking-changes" class="hash-link" aria-label="Direct link to Breaking Changes" title="Direct link to Breaking Changes" translate="no"></a></h3>
+<ul>
+<li class=""><strong>Argon2</strong> - the default password hashing algorithm is no longer using <strong>bcrypt</strong> but <strong>Argon2id</strong> for improved security and performance</li>
+<li class=""><strong>xxHash3 replaces CRC32</strong> - message checksums now use <strong>xxHash3</strong> (64 bits), and <strong>UUIDv4</strong> is used for random message IDs</li>
+<li class=""><strong>Cluster configuration restructured</strong> - <code>ClusterNode</code> now uses <code>TransportEndpoints</code> for multi-protocol communication</li>
+<li class=""><strong>Auto-generated root password</strong> - default root password is now auto-generated if not provided</li>
+</ul>
+<p>Docker images are available on <strong><a href="https://hub.docker.com/u/apache?page=1&search=iggy" target="_blank" rel="noopener noreferrer" class="">Docker Hub</a></strong>.</p>
+<hr>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="sdks">SDKs<a href="#sdks" class="hash-link" aria-label="Direct link to SDKs" title="Direct link to SDKs" translate="no"></a></h2>
+<p>All SDKs received significant updates:</p>
+<ul>
+<li class=""><a href="https://crates.io/crates/iggy" target="_blank" rel="noopener noreferrer" class="">Rust</a> - builder pattern for client, unified TransportProtocol enum, cluster metadata support</li>
+<li class=""><a href="https://www.nuget.org/packages/Apache.Iggy/" target="_blank" rel="noopener noreferrer" class="">C#</a> - high-level IggyPublisher/IggyConsumer clients, TCP reconnection, TLS support, AES encryption</li>
+<li class=""><a href="https://mvnrepository.com/artifact/org.apache.iggy/iggy-java-sdk" target="_blank" rel="noopener noreferrer" class="">Java</a> - complete async API using Netty with CompletableFutures, TLS TCP support, fixed memory leak for sync client</li>
+<li class=""><a href="https://pypi.org/project/apache-iggy/" target="_blank" rel="noopener noreferrer" class="">Python</a> - connection string support, bytes data, typing stubs, musllinux wheels</li>
+<li class=""><a href="https://www.npmjs.com/package/apache-iggy" target="_blank" rel="noopener noreferrer" class="">Node.js (TypeScript)</a> - virtual commands (ensureStream, ensureTopic), cluster metadata, added examples</li>
+<li class=""><a href="https://pkg.go.dev/github.com/apache/iggy/foreign/go" target="_blank" rel="noopener noreferrer" class="">Go</a> - DeleteConsumerOffset, improved error handling and deserialization</li>
+</ul>
+<hr>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="connectors">Connectors<a href="#connectors" class="hash-link" aria-label="Direct link to Connectors" title="Direct link to Connectors" translate="no"></a></h2>
+<p>New connectors expand integration options:</p>
+<ul>
+<li class=""><strong><a href="https://github.com/apache/iggy/pull/2191" target="_blank" rel="noopener noreferrer" class="">Iceberg sink</a></strong> - S3-compatible storage, REST catalogs, single destination table, and multiple-table fan-out</li>
+<li class=""><strong><a href="https://github.com/apache/iggy/pull/1872" target="_blank" rel="noopener noreferrer" class="">Elasticsearch sink and source</a></strong> - Full Elasticsearch integration with rustls TLS support</li>
+<li class=""><strong><a href="https://github.com/apache/iggy/pull/2300" target="_blank" rel="noopener noreferrer" class="">Flink processor</a></strong> - Stream processing integration with Apache Flink</li>
+</ul>
+<p>The connectors runtime also gained an extensible configuration provider system, HTTP-based config provider, TCP TLS support, and a comprehensive E2E test suite.</p>
+<p>Learn more in the <a class="" href="/docs/connectors/introduction">documentation</a>.</p>
+<hr>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="clustering-work-in-progress">Clustering (Work in Progress)<a href="#clustering-work-in-progress" class="hash-link" aria-label="Direct link to Clustering (Work in Progress)" title="Direct link to Clustering (Work in Progress)" translate="no"></a></h2>
+<p>Foundation for clustering is being laid:</p>
+<ul>
+<li class=""><strong>GetClusterMetadata command</strong> - retrieve cluster topology and node status</li>
+<li class=""><strong>Leader-aware connect</strong> - SDKs can detect and connect to cluster leader</li>
+<li class=""><strong>TransportEndpoints</strong> - multi-protocol cluster communication (TCP, QUIC, HTTP, WebSocket)</li>
+<li class=""><strong>Consensus and metadata modules</strong> - foundation for cluster consensus</li>
+</ul>
+<hr>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="web-ui">Web UI<a href="#web-ui" class="hash-link" aria-label="Direct link to Web UI" title="Direct link to Web UI" translate="no"></a></h2>
+<ul>
+<li class="">Autocomplete functionality</li>
+<li class="">Fixed large number (u64/u128) rendering</li>
+<li class="">Enhanced keyboard navigation</li>
+<li class="">Security improvements (removed password persistence)</li>
+<li class="">Fixed create stream/topic commands</li>
+</ul>
+<hr>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="helm-charts">Helm Charts<a href="#helm-charts" class="hash-link" aria-label="Direct link to Helm Charts" title="Direct link to Helm Charts" translate="no"></a></h2>
+<p>Server and UI combined into a <strong><a href="https://github.com/apache/iggy/pull/2185" target="_blank" rel="noopener noreferrer" class="">unified Helm chart</a></strong> with environment variable support and improved Kubernetes compatibility.</p>
+<hr>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-next">What's Next<a href="#whats-next" class="hash-link" aria-label="Direct link to What's Next" title="Direct link to What's Next" translate="no"></a></h2>
+<p>Our primary focus is <strong>clustering with <a href="https://pmg.csail.mit.edu/papers/vr-revisited.pdf" target="_blank" rel="noopener noreferrer" class="">Viewstamped Replication (VSR)</a></strong> consensus protocol. This will enable fault-tolerant, replicated deployments — a critical milestone for production workloads requiring high availability and reliability.</p>
+<p>Other upcoming efforts:</p>
+<ul>
+<li class="">Server's core optimizataions such as kTLS, DirectIO, NUMA, TCP connections transfer across shards and more</li>
+<li class="">Expanding SDKs with synchronous clients and <a href="https://www.firezone.dev/blog/sans-io" target="_blank" rel="noopener noreferrer" class="">sans-io</a> design</li>
+<li class="">Enhancing the Connectors Runtime with more integrations</li>
+<li class="">Exploring <strong>Agentic AI</strong> use cases for streaming-based agent coordination</li>
+<li class="">Web UI improvements</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" target="_blank" rel="noopener noreferrer" class="">Discord</a> and help shape the future of the project!</strong></p></div><footer class="docusaurus-mt-lg"><div class="row margin-top--sm theme-blog-footer-edit-meta-row"><div class="col"><b>Tags:</b><ul class="tags_jXut padding--none margin-left--sm"><li class="tag_QGVx"><a rel="tag" class="tag_zVej tagRegular_sFm0" href="/blogs/tags/release">release</a></li><li class="tag_QGV [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/blogs/archive/index.html b/blogs/archive/index.html
new file mode 100644
index 00000000..d0db7865
--- /dev/null
+++ b/blogs/archive/index.html
@@ -0,0 +1,28 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="plugin-blog plugin-id-default" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">Archive | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" property=" [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed">
+
+
+
+
+
+<link rel="preconnect" href="https://analytics.apache.org/">
+<script>var _paq=window._paq=window._paq||[];_paq.push(["setRequestMethod","POST"]),_paq.push(["trackPageView"]),_paq.push(["enableLinkTracking"]),_paq.push(["enableHeartBeatTimer"]),function(){var e="https://analytics.apache.org/";_paq.push(["setRequestMethod","POST"]),_paq.push(["setTrackerUrl",e+"matomo.php"]),_paq.push(["setSiteId","80"]);var a=document,t=a.createElement("script"),p=a.getElementsByTagName("script")[0];t.type="text/javascript",t.async=!0,t.src=e+"matomo.js",p.parentNo [...]
+<script src="/assets/js/runtime~main.0a940c88.js" defer="defer"></script>
+<script src="/assets/js/main.4a006c5e.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/img/apache-iggy0.5x.png"><link rel="preload" as="image" [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/blogs/atom.css b/blogs/atom.css
new file mode 100644
index 00000000..d2fc20b2
--- /dev/null
+++ b/blogs/atom.css
@@ -0,0 +1,75 @@
+/**
+ * Copyright (c) Facebook, Inc. and its affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+main {
+ flex: 1 0 auto;
+ width: 100%;
+ margin: 2rem auto;
+ max-width: 800px;
+ /* stylelint-disable-next-line font-family-name-quotes */
+ font-family: system-ui, -apple-system, Segoe UI, Roboto, Ubuntu, Cantarell;
+}
+
+.info {
+ display: block;
+ margin: 2rem 0;
+ padding: 1.6rem 2.4rem;
+ border: 1px solid dodgerblue;
+ border-left-width: 0.5rem;
+ border-radius: 0.4rem;
+ background-color: #edf5ff;
+}
+
+a {
+ color: #005aff;
+ text-decoration: none;
+}
+
+h1 {
+ text-wrap: balance;
+ font-size: 3.4rem;
+ font-weight: 800;
+ margin-bottom: 2rem;
+ display: flex;
+ align-items: center;
+}
+
+h1 .rss-icon {
+ height: 3.2rem;
+ width: 3.2rem;
+ margin-right: 1rem;
+}
+
+h2 {
+ font-size: 2.2rem;
+ font-weight: 700;
+ margin-bottom: 0.2rem;
+}
+
+h3 {
+ font-size: 1.8rem;
+ font-weight: 700;
+ margin-bottom: 0.1rem;
+}
+
+.blog-description {
+ font-size: 1.4rem;
+ margin-bottom: 0.6rem;
+}
+
+.blog-post-date {
+ font-size: 1rem;
+ line-height: 1.4rem;
+ font-style: italic;
+ color: #797b7e;
+}
+
+.blog-post-description {
+ font-size: 1rem;
+ line-height: 1.4rem;
+ color: #434349;
+}
diff --git a/blogs/atom.xml b/blogs/atom.xml
new file mode 100644
index 00000000..fa64d60c
--- /dev/null
+++ b/blogs/atom.xml
@@ -0,0 +1,1173 @@
+<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="atom.xsl"?>
+<feed xmlns="http://www.w3.org/2005/Atom">
+ <id>https://iggy.apache.org/blogs</id>
+ <title>Hyper-Efficient Message Streaming at Laser Speed. Blog</title>
+ <updated>2025-12-09T00:00:00.000Z</updated>
+ <generator>https://github.com/jpmonette/feed</generator>
+ <link rel="alternate" href="https://iggy.apache.org/blogs"/>
+ <subtitle>Hyper-Efficient Message Streaming at Laser Speed. Blog</subtitle>
+ <icon>https://iggy.apache.org/img/favicon.png</icon>
+ <entry>
+ <title type="html"><![CDATA[Apache Iggy 0.6.0 Release]]></title>
+ <id>https://iggy.apache.org/blogs/2025/12/09/release-0.6.0</id>
+ <link href="https://iggy.apache.org/blogs/2025/12/09/release-0.6.0"/>
+ <updated>2025-12-09T00:00:00.000Z</updated>
+ <summary type="html"><![CDATA[Release 0.6.0]]></summary>
+ <content type="html"><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="release-060">Release 0.6.0<a href="https://iggy.apache.org/blogs/2025/12/09/release-0.6.0#release-060" class="hash-link" aria-label="Direct link to Release 0.6.0" title="Direct link to Release 0.6.0" translate="no"></a></h2>
+<p>Four months after <a href="https://iggy.apache.org/blogs/2025/08/10/release-0.5.0/" target="_blank" rel="noopener noreferrer" class="">0.5.0</a>, we're excited to release <strong><a href="https://github.com/apache/iggy/releases/tag/server-0.6.0" target="_blank" rel="noopener noreferrer" class="">Apache Iggy 0.6.0</a></strong> — our biggest architectural change yet.</p>
+<p>This release represents a <strong>major architectural evolution</strong> of Apache Iggy with substantial performance improvements, new connectors, and SDK enhancements.</p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="iggy-server">Iggy Server<a href="https://iggy.apache.org/blogs/2025/12/09/release-0.6.0#iggy-server" class="hash-link" aria-label="Direct link to Iggy Server" title="Direct link to Iggy Server" translate="no"></a></h2>
+<p>The most significant change in 0.6.0 is the <strong>complete server rewrite</strong> using <strong><a href="https://github.com/apache/iggy/pull/2299" target="_blank" rel="noopener noreferrer" class="">io_uring</a></strong> with a <strong>thread-per-core, shared-nothing architecture</strong>. This represents a fundamental shift from the previous Tokio-based poll model to a completion-based async runtime using <a href="https://github.com/compio-rs/compio" target="_blank" rel="noopener n [...]
+<p>Key aspects of this architectural change:</p>
+<ul>
+<li class=""><strong>Completion-based I/O</strong> - unlike poll-based models, <strong>io_uring</strong> uses completion queues where the kernel notifies when operations finish</li>
+<li class=""><strong>Thread-per-core design</strong> - each CPU core runs its own event loop with dedicated resources, eliminating cross-thread synchronization overhead</li>
+<li class=""><strong>Shared-nothing model</strong> - data is partitioned across cores to minimize contention and cache invalidation</li>
+</ul>
+<p>This delivers improved throughput, lower latency, and more predictable tail latencies (p99+) under load.</p>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="websocket-transport">WebSocket Transport<a href="https://iggy.apache.org/blogs/2025/12/09/release-0.6.0#websocket-transport" class="hash-link" aria-label="Direct link to WebSocket Transport" title="Direct link to WebSocket Transport" translate="no"></a></h3>
+<p>Along with the io_uring migration, we've decided to implement <strong>WebSocket transport</strong> as a first-class communication protocol alongside TCP, QUIC and HTTP. This enables seamless integration with web clients and environments where WebSocket is preferred. Since existing libraries are poll-based and incompatible with compio's completion model, the solution was <strong><a href="https://iggy.apache.org/blogs/2025/11/17/websocket-io-uring" target="_blank" rel="noopener noreferr [...]
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="breaking-changes">Breaking Changes<a href="https://iggy.apache.org/blogs/2025/12/09/release-0.6.0#breaking-changes" class="hash-link" aria-label="Direct link to Breaking Changes" title="Direct link to Breaking Changes" translate="no"></a></h3>
+<ul>
+<li class=""><strong>Argon2</strong> - the default password hashing algorithm is no longer using <strong>bcrypt</strong> but <strong>Argon2id</strong> for improved security and performance</li>
+<li class=""><strong>xxHash3 replaces CRC32</strong> - message checksums now use <strong>xxHash3</strong> (64 bits), and <strong>UUIDv4</strong> is used for random message IDs</li>
+<li class=""><strong>Cluster configuration restructured</strong> - <code>ClusterNode</code> now uses <code>TransportEndpoints</code> for multi-protocol communication</li>
+<li class=""><strong>Auto-generated root password</strong> - default root password is now auto-generated if not provided</li>
+</ul>
+<p>Docker images are available on <strong><a href="https://hub.docker.com/u/apache?page=1&search=iggy" target="_blank" rel="noopener noreferrer" class="">Docker Hub</a></strong>.</p>
+<hr>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="sdks">SDKs<a href="https://iggy.apache.org/blogs/2025/12/09/release-0.6.0#sdks" class="hash-link" aria-label="Direct link to SDKs" title="Direct link to SDKs" translate="no"></a></h2>
+<p>All SDKs received significant updates:</p>
+<ul>
+<li class=""><a href="https://crates.io/crates/iggy" target="_blank" rel="noopener noreferrer" class="">Rust</a> - builder pattern for client, unified TransportProtocol enum, cluster metadata support</li>
+<li class=""><a href="https://www.nuget.org/packages/Apache.Iggy/" target="_blank" rel="noopener noreferrer" class="">C#</a> - high-level IggyPublisher/IggyConsumer clients, TCP reconnection, TLS support, AES encryption</li>
+<li class=""><a href="https://mvnrepository.com/artifact/org.apache.iggy/iggy-java-sdk" target="_blank" rel="noopener noreferrer" class="">Java</a> - complete async API using Netty with CompletableFutures, TLS TCP support, fixed memory leak for sync client</li>
+<li class=""><a href="https://pypi.org/project/apache-iggy/" target="_blank" rel="noopener noreferrer" class="">Python</a> - connection string support, bytes data, typing stubs, musllinux wheels</li>
+<li class=""><a href="https://www.npmjs.com/package/apache-iggy" target="_blank" rel="noopener noreferrer" class="">Node.js (TypeScript)</a> - virtual commands (ensureStream, ensureTopic), cluster metadata, added examples</li>
+<li class=""><a href="https://pkg.go.dev/github.com/apache/iggy/foreign/go" target="_blank" rel="noopener noreferrer" class="">Go</a> - DeleteConsumerOffset, improved error handling and deserialization</li>
+</ul>
+<hr>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="connectors">Connectors<a href="https://iggy.apache.org/blogs/2025/12/09/release-0.6.0#connectors" class="hash-link" aria-label="Direct link to Connectors" title="Direct link to Connectors" translate="no"></a></h2>
+<p>New connectors expand integration options:</p>
+<ul>
+<li class=""><strong><a href="https://github.com/apache/iggy/pull/2191" target="_blank" rel="noopener noreferrer" class="">Iceberg sink</a></strong> - S3-compatible storage, REST catalogs, single destination table, and multiple-table fan-out</li>
+<li class=""><strong><a href="https://github.com/apache/iggy/pull/1872" target="_blank" rel="noopener noreferrer" class="">Elasticsearch sink and source</a></strong> - Full Elasticsearch integration with rustls TLS support</li>
+<li class=""><strong><a href="https://github.com/apache/iggy/pull/2300" target="_blank" rel="noopener noreferrer" class="">Flink processor</a></strong> - Stream processing integration with Apache Flink</li>
+</ul>
+<p>The connectors runtime also gained an extensible configuration provider system, HTTP-based config provider, TCP TLS support, and a comprehensive E2E test suite.</p>
+<p>Learn more in the <a class="" href="https://iggy.apache.org/docs/connectors/introduction">documentation</a>.</p>
+<hr>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="clustering-work-in-progress">Clustering (Work in Progress)<a href="https://iggy.apache.org/blogs/2025/12/09/release-0.6.0#clustering-work-in-progress" class="hash-link" aria-label="Direct link to Clustering (Work in Progress)" title="Direct link to Clustering (Work in Progress)" translate="no"></a></h2>
+<p>Foundation for clustering is being laid:</p>
+<ul>
+<li class=""><strong>GetClusterMetadata command</strong> - retrieve cluster topology and node status</li>
+<li class=""><strong>Leader-aware connect</strong> - SDKs can detect and connect to cluster leader</li>
+<li class=""><strong>TransportEndpoints</strong> - multi-protocol cluster communication (TCP, QUIC, HTTP, WebSocket)</li>
+<li class=""><strong>Consensus and metadata modules</strong> - foundation for cluster consensus</li>
+</ul>
+<hr>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="web-ui">Web UI<a href="https://iggy.apache.org/blogs/2025/12/09/release-0.6.0#web-ui" class="hash-link" aria-label="Direct link to Web UI" title="Direct link to Web UI" translate="no"></a></h2>
+<ul>
+<li class="">Autocomplete functionality</li>
+<li class="">Fixed large number (u64/u128) rendering</li>
+<li class="">Enhanced keyboard navigation</li>
+<li class="">Security improvements (removed password persistence)</li>
+<li class="">Fixed create stream/topic commands</li>
+</ul>
+<hr>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="helm-charts">Helm Charts<a href="https://iggy.apache.org/blogs/2025/12/09/release-0.6.0#helm-charts" class="hash-link" aria-label="Direct link to Helm Charts" title="Direct link to Helm Charts" translate="no"></a></h2>
+<p>Server and UI combined into a <strong><a href="https://github.com/apache/iggy/pull/2185" target="_blank" rel="noopener noreferrer" class="">unified Helm chart</a></strong> with environment variable support and improved Kubernetes compatibility.</p>
+<hr>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-next">What's Next<a href="https://iggy.apache.org/blogs/2025/12/09/release-0.6.0#whats-next" class="hash-link" aria-label="Direct link to What's Next" title="Direct link to What's Next" translate="no"></a></h2>
+<p>Our primary focus is <strong>clustering with <a href="https://pmg.csail.mit.edu/papers/vr-revisited.pdf" target="_blank" rel="noopener noreferrer" class="">Viewstamped Replication (VSR)</a></strong> consensus protocol. This will enable fault-tolerant, replicated deployments — a critical milestone for production workloads requiring high availability and reliability.</p>
+<p>Other upcoming efforts:</p>
+<ul>
+<li class="">Server's core optimizataions such as kTLS, DirectIO, NUMA, TCP connections transfer across shards and more</li>
+<li class="">Expanding SDKs with synchronous clients and <a href="https://www.firezone.dev/blog/sans-io" target="_blank" rel="noopener noreferrer" class="">sans-io</a> design</li>
+<li class="">Enhancing the Connectors Runtime with more integrations</li>
+<li class="">Exploring <strong>Agentic AI</strong> use cases for streaming-based agent coordination</li>
+<li class="">Web UI improvements</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" target="_blank" rel="noopener noreferrer" class="">Discord</a> and help shape the future of the project!</strong></p>]]></content>
+ <author>
+ <name>Piotr Gankiewicz</name>
+ <uri>https://github.com/spetz</uri>
+ </author>
+ <category label="release" term="release"/>
+ <category label="0.6.0" term="0.6.0"/>
+ <category label="announcement" term="announcement"/>
+ </entry>
+ <entry>
+ <title type="html"><![CDATA[Building WebSocket Protocol in Apache Iggy using io_uring and Completion Based I/O Architecture]]></title>
+ <id>https://iggy.apache.org/blogs/2025/11/17/websocket-io-uring</id>
+ <link href="https://iggy.apache.org/blogs/2025/11/17/websocket-io-uring"/>
+ <updated>2025-11-17T00:00:00.000Z</updated>
+ <summary type="html"><![CDATA[Introduction]]></summary>
+ <content type="html"><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="introduction">Introduction<a href="https://iggy.apache.org/blogs/2025/11/17/websocket-io-uring#introduction" class="hash-link" aria-label="Direct link to Introduction" title="Direct link to Introduction" translate="no"></a></h2>
+<p>In our <a href="https://iggy.apache.org/blogs/2025/08/10/release-0.5.0" target="_blank" rel="noopener noreferrer" class="">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" target="_blank" rel="noopener noreferrer" class="">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" target="_blank" rel="noopener noreferrer" class="">tungstenite</a> and <a href="https://github.com/snapview/tokio-tungstenite" target="_blank" rel="noopener noreferrer" class="">tokio-tungstenite</a> but they are made wh [...]
+<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" target="_blank" rel="noopener noreferrer" class="">contributing</a> to <code>compio</code>.</p>
+<hr>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="understanding-the-architectural-divide-poll-vs-completion">Understanding the architectural divide (poll vs completion)<a href="https://iggy.apache.org/blogs/2025/11/17/websocket-io-uring#understanding-the-architectural-divide-poll-vs-completion" class="hash-link" aria-label="Direct link to Understanding the architectural divide (poll vs completion)" title="Direct link to Understanding the architectural divide (poll vs completion)" tran [...]
+<p>Let's see why poll-based libraries can't easily work with completion based runtimes by examining the traits of compio, tungstenite.</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// The Rust std::io::Read trait (what tungstenite [...]
+<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>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// Tungstenite's WebSocket structure</span><span [...]
+<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 class="">Works with compio's owned-buffer async I/O</li>
+<li class="">Presents synchronous Read/Write traits to tungstenite</li>
+<li class="">Efficiently bridges sync and async world</li>
+</ul>
+<hr>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="challenge-with-tungstenite">Challenge with Tungstenite<a href="https://iggy.apache.org/blogs/2025/11/17/websocket-io-uring#challenge-with-tungstenite" class="hash-link" aria-label="Direct link to Challenge with Tungstenite" title="Direct link to Challenge with Tungstenite" translate="no"></a></h2>
+<p>Tungstenite is the de-facto Rust WebSocket protocol implementation. It handles all the WebSocket protocol logic:</p>
+<ul>
+<li class="">Frame parsing and generation</li>
+<li class="">Message fragmentation</li>
+<li class="">Control frames (ping, pong, close)</li>
+<li class="">Protocol violations and error handling</li>
+<li class="">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>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// Compio's async read - can't be made into a pol [...]
+<p>These are fundamentally different programming models that don't compose cleanly.</p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="decision-a-separate-crate">Decision: A separate crate<a href="https://iggy.apache.org/blogs/2025/11/17/websocket-io-uring#decision-a-separate-crate" class="hash-link" aria-label="Direct link to Decision: A separate crate" title="Direct link to Decision: A separate crate" translate="no"></a></h2>
+<p>After realizing the incompatibility, we've decided to create <code>compio-ws</code> as a standalone crate. The architecture would be:</p>
+<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain"> ┌────────────────────────────┐</span><br></span><span class [...]
+<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="anchor anchorTargetStickyNavbar_Vzrq" id="first-attempt-syncstream">First Attempt: <code>SyncStream</code><a href="https://iggy.apache.org/blogs/2025/11/17/websocket-io-uring#first-attempt-syncstream" class="hash-link" aria-label="Direct link to first-attempt-syncstream" title="Direct link to first-attempt-syncstream" translate="no"></a></h2>
+<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>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<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>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">impl</span><span class="token operator" style="color:#393A34"><< [...]
+<p>Writing (sync to async):</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">impl</span><span class="token operator" style="color:#393A34"><< [...]
+<p>The pattern is:</p>
+<ul>
+<li class="">Sync <code>read()</code>/<code>write()</code> operate on internal buffers</li>
+<li class="">Return <code>WouldBlock</code> when buffer is empty/full</li>
+<li class="">Call async <code>fill_read_buf()</code>/<code>flush_write_buf()</code> to service buffers</li>
+<li class="">Retry the sync operation</li>
+</ul>
+<p>This allows tungstenite to work with compio streams:</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> stream </span><span class="tok [...]
+<hr>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-problem-with-fixed-buffer-size-in-syncstream">The problem with fixed buffer size in <code>SyncStream</code><a href="https://iggy.apache.org/blogs/2025/11/17/websocket-io-uring#the-problem-with-fixed-buffer-size-in-syncstream" class="hash-link" aria-label="Direct link to the-problem-with-fixed-buffer-size-in-syncstream" title="Direct link to the-problem-with-fixed-buffer-size-in-syncstream" translate="no"></a></h2>
+<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>
+<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Message: 16MB</span><br></span><span class="token-line" style="color:#393A34"><span class=" [...]
+<p>The measurements were bad:</p>
+<ul>
+<li class="">Time: Over 100 seconds to send 16MB</li>
+<li class="">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 class="">Saving state in tungstenite</li>
+<li class="">Suspending the sync call</li>
+<li class="">Executing async flush</li>
+<li class="">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="anchor anchorTargetStickyNavbar_Vzrq" id="the-solution-growablesyncstream">The Solution: <code>GrowableSyncStream</code><a href="https://iggy.apache.org/blogs/2025/11/17/websocket-io-uring#the-solution-growablesyncstream" class="hash-link" aria-label="Direct link to the-solution-growablesyncstream" title="Direct link to the-solution-growablesyncstream" translate="no"></a></h2>
+<p>Design goals:</p>
+<ul>
+<li class="">Dynamic growth: Buffers start small and grow as needed</li>
+<li class="">Bounded maximum: Prevent memory exhaustion with configurable limits</li>
+<li class="">Automatic shrinking: Return to base capacity based on a threshold</li>
+<li class="">Minimal round trips: Handle large messages without constant <code>WouldBlock</code></li>
+</ul>
+<p>Architecture Overview:</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<p>Buffer growth strategy:</p>
+<ul>
+<li class="">Start with a small sized buffer (128 KB matching tungstenite default buffer size)</li>
+<li class="">Grow in predictable increments of <code>base_capacity</code> sized chunks</li>
+<li class="">Cap growth at reasonable limit (64MB default)</li>
+<li class="">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 class="">Compacts buffer when needed (moves unread data to front)</li>
+<li class="">Grows in <code>base_capacity</code> increments during <code>fill_read_buf()</code></li>
+<li class="">Shrinks back to base when all data consumed and buffer > 4× base</li>
+</ul>
+<p>Write path:</p>
+<ul>
+<li class=""><code>Vec::extend_from_slice</code> handles growth automatically up to <code>max_buffer_size</code></li>
+<li class="">Returns <code>WouldBlock</code> only when approaching max limit</li>
+<li class=""><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="anchor anchorTargetStickyNavbar_Vzrq" id="benchmarks">Benchmarks<a href="https://iggy.apache.org/blogs/2025/11/17/websocket-io-uring#benchmarks" class="hash-link" aria-label="Direct link to Benchmarks" title="Direct link to Benchmarks" translate="no"></a></h2>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="benchmark-methodology">Benchmark Methodology<a href="https://iggy.apache.org/blogs/2025/11/17/websocket-io-uring#benchmark-methodology" class="hash-link" aria-label="Direct link to Benchmark Methodology" title="Direct link to Benchmark Methodology" translate="no"></a></h3>
+<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 class=""><strong>CPU:</strong> Intel Xeon Platinum 8259CL @ 2.50GHz (Cascade Lake)</li>
+<li class=""><strong>Cores:</strong> 6 physical cores with hyperthreading (12 vCPUs total)</li>
+<li class=""><strong>Cache:</strong> 36 MB L3 cache</li>
+<li class=""><strong>Memory:</strong> 96 GB RAM</li>
+<li class=""><strong>Storage:</strong> Local NVMe SSD</li>
+</ul>
+<p>Common benchmark setting used:</p>
+<ul>
+<li class="">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 class="">Use huge pages in linux.</li>
+</ul>
+<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">sudo sysctl -w vm.swappiness=10</span><br></span><span class="token-line" style="color:#393 [...]
+<p>Workload characteristics:</p>
+<ul>
+<li class="">4 Producers (one per CPU core)</li>
+<li class="">4 Streams, 1 Topic per Stream, 1 Partition per Topic</li>
+<li class="">1000 messages per batch</li>
+<li class="">40,000 batches</li>
+<li class="">1000 bytes per message</li>
+<li class="">Total: 40M messages, 40GB of data</li>
+</ul>
+<p>We compared two scenarios:</p>
+<ul>
+<li class="">TCP: Direct TCP connection (baseline)</li>
+<li class="">WebSocket: compio-ws with GrowableSyncStream</li>
+</ul>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="results-tcp-vs-websocket">Results: TCP vs WebSocket<a href="https://iggy.apache.org/blogs/2025/11/17/websocket-io-uring#results-tcp-vs-websocket" class="hash-link" aria-label="Direct link to Results: TCP vs WebSocket" title="Direct link to Results: TCP vs WebSocket" translate="no"></a></h3>
+<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></tr><tr><td>P95</td><td style="text-align:right">2.94 ms< [...]
+<p>Benchmark graphs:</p>
+<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="tcp">TCP<a href="https://iggy.apache.org/blogs/2025/11/17/websocket-io-uring#tcp" class="hash-link" aria-label="Direct link to TCP" title="Direct link to TCP" translate="no"></a></h4>
+<p><img decoding="async" loading="lazy" alt="image" src="https://iggy.apache.org/assets/images/tcp-1234-784a4e2d38f3ad9fceaa5d15d9960f38.png" width="1600" height="1200" class="img_ev3q"></p>
+<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="websocket">WebSocket<a href="https://iggy.apache.org/blogs/2025/11/17/websocket-io-uring#websocket" class="hash-link" aria-label="Direct link to WebSocket" title="Direct link to WebSocket" translate="no"></a></h4>
+<p><img decoding="async" loading="lazy" alt="image" src="https://iggy.apache.org/assets/images/ws-1234-057d2fad76235bff8a09d63c800065e4.png" width="1600" height="1200" class="img_ev3q"></p>
+<hr>
+<p>Next we look at pinned-consumer benchmark.</p>
+<p>Workload characteristics:</p>
+<ul>
+<li class="">4 Consumers (one per CPU core)</li>
+<li class="">4 Streams, 1 Topic per Stream, 1 Partition per Topic</li>
+<li class="">1000 messages per batch</li>
+<li class="">40,000 batches</li>
+<li class="">1000 bytes per message</li>
+<li class="">Total: 40M messages, 40GB of data</li>
+</ul>
+<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></tr><tr><td>P95</td><td style="text-align:right">0.85 m [...]
+<p>Benchmark graphs:</p>
+<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="tcp-1">TCP<a href="https://iggy.apache.org/blogs/2025/11/17/websocket-io-uring#tcp-1" class="hash-link" aria-label="Direct link to TCP" title="Direct link to TCP" translate="no"></a></h4>
+<p><img decoding="async" loading="lazy" alt="image" src="https://iggy.apache.org/assets/images/pc_tcp-ad927c98e841cf0dd0647d5e45fb0a2f.png" width="1600" height="1200" class="img_ev3q"></p>
+<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="websocket-1">WebSocket<a href="https://iggy.apache.org/blogs/2025/11/17/websocket-io-uring#websocket-1" class="hash-link" aria-label="Direct link to WebSocket" title="Direct link to WebSocket" translate="no"></a></h4>
+<p><img decoding="async" loading="lazy" alt="image" src="https://iggy.apache.org/assets/images/pc_ws-08cd4047c7106ef1fa677c0e5c23ac8e.png" width="1600" height="1200" class="img_ev3q"></p>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="analysis">Analysis:<a href="https://iggy.apache.org/blogs/2025/11/17/websocket-io-uring#analysis" class="hash-link" aria-label="Direct link to Analysis:" title="Direct link to Analysis:" translate="no"></a></h3>
+<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 class="">WebSocket framing: each message needs frame headers.</li>
+<li class="">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="anchor anchorTargetStickyNavbar_Vzrq" id="future-work">Future Work<a href="https://iggy.apache.org/blogs/2025/11/17/websocket-io-uring#future-work" class="hash-link" aria-label="Direct link to Future Work" title="Direct link to Future Work" translate="no"></a></h2>
+<ol>
+<li class="">
+<p>Smarter Buffer Growth</p>
+<ul>
+<li class="">Current: Linear <code>base_capacity</code> increments</li>
+<li class="">Better: Exponential growth (like <code>Vec::reserve</code>)</li>
+<li class="">Impact: Reduce reallocation overhead for large messages</li>
+</ul>
+</li>
+<li class="">
+<p>Buffer Pooling</p>
+<ul>
+<li class="">Current: Allocate/deallocate per message</li>
+<li class="">Better: Per-core buffer pools with object reuse</li>
+<li class="">Impact: Reduce allocator pressure</li>
+</ul>
+</li>
+<li class="">
+<p>WebSocket implementation with native owned buffers</p>
+<ul>
+<li class="">Implement WebSocket protocol directly with owned buffers from scratch.</li>
+<li class="">Direct integration with compio to use io_uring capabilities.</li>
+<li class="">Could increase performance significantly.</li>
+<li class="">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" target="_blank" rel="noopener noreferrer" class="">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="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://iggy.apache.org/blogs/2025/11/17/websocket-io-uring#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no"></a></h2>
+<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 class="">Browser-based producers sending events or telemetry</li>
+<li class="">Edge devices reporting sensor data or metrics</li>
+<li class="">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 class=""><strong>Optimize</strong> <code>GrowableSyncStream</code>: Implement exponential buffer growth and pooling</li>
+<li class=""><strong>Owned buffer WS protocol implementation:</strong> Build WebSocket from scratch with owned buffers</li>
+<li class=""><strong>Push-based consumers:</strong> Help implement server-push notifications in Iggy</li>
+<li class=""><strong>Edge client libraries:</strong> Create WebSocket SDKs optimized for resource-constrained devices</li>
+</ul>]]></content>
+ <author>
+ <name>Krishna Vishal Vemula</name>
+ <uri>https://github.com/krishvishal</uri>
+ </author>
+ <category label="websocket" term="websocket"/>
+ <category label="io_uring" term="io_uring"/>
+ <category label="async" term="async"/>
+ <category label="compio" term="compio"/>
+ <category label="performance" term="performance"/>
+ </entry>
+ <entry>
+ <title type="html"><![CDATA[Apache Iggy 0.5.0 Release]]></title>
+ <id>https://iggy.apache.org/blogs/2025/08/10/release-0.5.0</id>
+ <link href="https://iggy.apache.org/blogs/2025/08/10/release-0.5.0"/>
+ <updated>2025-08-10T00:00:00.000Z</updated>
+ <summary type="html"><![CDATA[Release 0.5.0]]></summary>
+ <content type="html"><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="release-050">Release 0.5.0<a href="https://iggy.apache.org/blogs/2025/08/10/release-0.5.0#release-050" class="hash-link" aria-label="Direct link to Release 0.5.0" title="Direct link to Release 0.5.0" translate="no"></a></h2>
+<p>It’s been four months since our last <a href="https://github.com/apache/iggy/releases/tag/server-0.4.300" target="_blank" rel="noopener noreferrer" class="">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" target="_blank" rel="noopener noreferrer" class="">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="anchor anchorTargetStickyNavbar_Vzrq" id="iggy-server">Iggy Server<a href="https://iggy.apache.org/blogs/2025/08/10/release-0.5.0#iggy-server" class="hash-link" aria-label="Direct link to Iggy Server" title="Direct link to Iggy Server" translate="no"></a></h2>
+<p>The most significant change on the server side is the introduction of <strong><a href="https://github.com/apache/iggy/pull/1679" target="_blank" rel="noopener noreferrer" class="">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" target="_blank" rel="noopener noreferrer" class="">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" target="_blank" rel="noopener noreferrer" class="">Iggy CLI</a></strong> and <strong><a href="https://github.com/apache/iggy/tree/master/web" target="_blank" rel="noopener noreferrer" class="">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" target="_blank" rel="noopener noreferrer" class="">Docker Hub</a></strong>.</p>
+<hr>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="sdks">SDKs<a href="https://iggy.apache.org/blogs/2025/08/10/release-0.5.0#sdks" class="hash-link" aria-label="Direct link to SDKs" title="Direct link to SDKs" translate="no"></a></h2>
+<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 class=""><a href="https://crates.io/crates/iggy" target="_blank" rel="noopener noreferrer" class="">Rust</a> (always up-to-date, core reference implementation)</li>
+<li class=""><a href="https://www.nuget.org/packages/Apache.Iggy/" target="_blank" rel="noopener noreferrer" class="">C#</a></li>
+<li class=""><a href="https://repository.apache.org/#nexus-search;quick~iggy" target="_blank" rel="noopener noreferrer" class="">Java</a></li>
+<li class=""><a href="https://pypi.org/project/apache-iggy/" target="_blank" rel="noopener noreferrer" class="">Python</a></li>
+<li class=""><a href="https://www.npmjs.com/package/apache-iggy" target="_blank" rel="noopener noreferrer" class="">Node.js (TypeScript)</a></li>
+<li class=""><a href="https://pkg.go.dev/github.com/apache/iggy/foreign/go" target="_blank" rel="noopener noreferrer" class="">Go</a></li>
+</ul>
+<p>C++ and Elixir clients are in progress under the <a href="https://github.com/apache/iggy/tree/master/foreign" target="_blank" rel="noopener noreferrer" class="">foreign</a> directory.</p>
+<p><strong>New in Rust SDK:</strong>
+Support for a <strong><a href="https://github.com/apache/iggy/pull/1838" target="_blank" rel="noopener noreferrer" class="">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" target="_blank" rel="noopener noreferrer" class="">here</a>.</p>
+<hr>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="benchmarks">Benchmarks<a href="https://iggy.apache.org/blogs/2025/08/10/release-0.5.0#benchmarks" class="hash-link" aria-label="Direct link to Benchmarks" title="Direct link to Benchmarks" translate="no"></a></h2>
+<p>We’ve expanded our benchmarking toolkit:</p>
+<ul>
+<li class=""><strong>Iggy Bench CLI</strong> (<code>iggy-bench</code>) — run local benchmarks with various configurations and profiles.</li>
+<li class="">JSON output and chart rendering for visual performance analysis.</li>
+<li class="">Open benchmark results published at <a href="https://benchmarks.iggy.apache.org/" target="_blank" rel="noopener noreferrer" class="">benchmarks.iggy.apache.org</a>, powered by the open source <a href="https://github.com/apache/iggy/tree/master/core/bench" target="_blank" rel="noopener noreferrer" class="">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="anchor anchorTargetStickyNavbar_Vzrq" id="connectors">Connectors<a href="https://iggy.apache.org/blogs/2025/08/10/release-0.5.0#connectors" class="hash-link" aria-label="Direct link to Connectors" title="Direct link to Connectors" translate="no"></a></h2>
+<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 class="">Ingest data into Iggy from external systems (e.g., Postgres CDC).</li>
+<li class="">Export data from Iggy to external destinations (e.g., indexing engines).</li>
+<li class="">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" target="_blank" rel="noopener noreferrer" class="">post</a> and in the <a class="" href="https://iggy.apache.org/docs/connectors/introduction">documentation</a>.</p>
+<hr>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="mcp-server">MCP Server<a href="https://iggy.apache.org/blogs/2025/08/10/release-0.5.0#mcp-server" class="hash-link" aria-label="Direct link to MCP Server" title="Direct link to MCP Server" translate="no"></a></h2>
+<p>Apache Iggy now includes support for the <strong><a href="https://modelcontextprotocol.io/" target="_blank" rel="noopener noreferrer" class="">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 class="" href="https://iggy.apache.org/docs/ai/mcp">documentation</a>.</p>
+<hr>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="versioning">Versioning<a href="https://iggy.apache.org/blogs/2025/08/10/release-0.5.0#versioning" class="hash-link" aria-label="Direct link to Versioning" title="Direct link to Versioning" translate="no"></a></h2>
+<p>Releases follow <a href="https://semver.org/" target="_blank" rel="noopener noreferrer" class="">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="anchor anchorTargetStickyNavbar_Vzrq" id="whats-next">What’s Next<a href="https://iggy.apache.org/blogs/2025/08/10/release-0.5.0#whats-next" class="hash-link" aria-label="Direct link to What’s Next" title="Direct link to What’s Next" translate="no"></a></h2>
+<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 class="">Expanding SDKs across more languages and catching up with the latest features.</li>
+<li class="">Synchronous SDK clients and <a href="https://www.firezone.dev/blog/sans-io" target="_blank" rel="noopener noreferrer" class="">sans-io</a> design.</li>
+<li class="">Benchmarking orchestrator</li>
+<li class="">Enhancing the Connectors Runtime and Web UI.</li>
+<li class="">Extending AI features around the MCP server.</li>
+<li class="">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" target="_blank" rel="noopener noreferrer" class="">Discord</a> and help shape the future of the project!</strong></p>]]></content>
+ <author>
+ <name>Piotr Gankiewicz</name>
+ <uri>https://github.com/spetz</uri>
+ </author>
+ <category label="release" term="release"/>
+ <category label="0.5.0" term="0.5.0"/>
+ <category label="announcement" term="announcement"/>
+ </entry>
+ <entry>
+ <title type="html"><![CDATA[Connectors runtime]]></title>
+ <id>https://iggy.apache.org/blogs/2025/06/06/connectors-runtime</id>
+ <link href="https://iggy.apache.org/blogs/2025/06/06/connectors-runtime"/>
+ <updated>2025-06-06T00:00:00.000Z</updated>
+ <summary type="html"><![CDATA[Extending Apache Iggy capabilities]]></summary>
+ <content type="html"><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="extending-apache-iggy-capabilities">Extending Apache Iggy capabilities<a href="https://iggy.apache.org/blogs/2025/06/06/connectors-runtime#extending-apache-iggy-capabilities" class="hash-link" aria-label="Direct link to Extending Apache Iggy capabilities" title="Direct link to Extending Apache Iggy capabilities" translate="no"></a></h2>
+<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="anchor anchorTargetStickyNavbar_Vzrq" id="what-are-the-connectors">What are the connectors<a href="https://iggy.apache.org/blogs/2025/06/06/connectors-runtime#what-are-the-connectors" class="hash-link" aria-label="Direct link to What are the connectors" title="Direct link to What are the connectors" translate="no"></a></h2>
+<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" target="_blank" rel="noopener noreferrer" class="">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>
+<div class="language-toml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-toml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># Required configuration for a sink connector</sp [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="rust-based-plugins">Rust-based plugins<a href="https://iggy.apache.org/blogs/2025/06/06/connectors-runtime#rust-based-plugins" class="hash-link" aria-label="Direct link to Rust-based plugins" title="Direct link to Rust-based plugins" translate="no"></a></h2>
+<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" target="_blank" rel="noopener noreferrer" class="">dlopen2</a></strong> library to load the plugins during the runtime initialization [...]
+<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/" target="_blank" rel="noopener noreferrer" class="">Tokio runtime</a></strong> to manage the asynchronous tasks and events across all connectors, as well as the <stro [...]
+<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" target="_blank" rel="noopener noreferrer" class="">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 thousan [...]
+<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/" target="_blank" rel="noopener noreferrer" class="">repository</a></strong> or the <strong><a class="" href="https://iggy.apache.org/docs/connectors/introduction">documentation</a></strong> for more de [...]
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token attribute attr-name" style="color:#00a4db">#[async_trait]</span><span class="token plain"></span>< [...]
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token attribute attr-name" style="color:#00a4db">#[async_trait]</span><span class="token plain"></span>< [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-next">What's next?<a href="https://iggy.apache.org/blogs/2025/06/06/connectors-runtime#whats-next" class="hash-link" aria-label="Direct link to What's next?" title="Direct link to What's next?" translate="no"></a></h2>
+<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" target="_blank" rel="noopener noreferrer" class="">issue</a></strong>, <strong><a href="https://github.com/apache/iggy/pulls" target="_blank" rel="noopener noreferrer" class="">pull request</a></strong> or start a <strong><a href="https://github.com/apache/iggy/discussions" target="_blank" rel="no [...]
+<p>As always, you are more than welcome to join our <strong><a href="https://discord.gg/apache-iggy" target="_blank" rel="noopener noreferrer" class="">Discord community</a></strong>!</p>]]></content>
+ <author>
+ <name>Piotr Gankiewicz</name>
+ <uri>https://github.com/spetz</uri>
+ </author>
+ </entry>
+ <entry>
+ <title type="html"><![CDATA[Zero-copy (de)serialization]]></title>
+ <id>https://iggy.apache.org/blogs/2025/05/08/zero-copy-deserialization</id>
+ <link href="https://iggy.apache.org/blogs/2025/05/08/zero-copy-deserialization"/>
+ <updated>2025-05-08T00:00:00.000Z</updated>
+ <summary type="html"><![CDATA[Introduction]]></summary>
+ <content type="html"><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="introduction">Introduction<a href="https://iggy.apache.org/blogs/2025/05/08/zero-copy-deserialization#introduction" class="hash-link" aria-label="Direct link to Introduction" title="Direct link to Introduction" translate="no"></a></h2>
+<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" target="_blank" rel="noopener noreferrer" class="">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" target="_blank" rel="noopener noreferrer" class="">finally merged it</a></strong>. In this blog post, we will share our path to implementing it.</p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="zero-copy-with-rkyv">Zero copy with rkyv<a href="https://iggy.apache.org/blogs/2025/05/08/zero-copy-deserialization#zero-copy-with-rkyv" class="hash-link" aria-label="Direct link to Zero copy with rkyv" title="Direct link to Zero copy with rkyv" translate="no"></a></h2>
+<p>Our initial approach to zero copy was leveraging the existing <strong><a href="https://github.com/rkyv/rkyv" target="_blank" rel="noopener noreferrer" class="">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 [...]
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token attribute attr-name" style="color:#00a4db">#[derive(Archive, Deserialize, Serialize)]</span><span [...]
+<p>Same traits are derived for <code>IggyMessage</code></p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token attribute attr-name" style="color:#00a4db">#[derive(Archive, Deserialize, Serialize)]</span><span [...]
+<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/" target="_blank" rel="noopener noreferrer" class="">rkyv book</a></strong>, or from this <strong><a href="https://www.youtube.com/watch?v=ON4z2LbTD-4" target="_blank" rel="noopener noreferrer" class="">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>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">struct</span><span class="token plain"> </span><span class="token t [...]
+<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 decoding="async" loading="lazy" alt="image" src="https://iggy.apache.org/assets/images/iggy_batch_schema_1-61b4d896b850e3d0ee08270f7db7c6b5.png" width="1600" height="664" class="img_ev3q"></p>
+<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="anchor anchorTargetStickyNavbar_Vzrq" id="beyond-rkyv">Beyond rkyv<a href="https://iggy.apache.org/blogs/2025/05/08/zero-copy-deserialization#beyond-rkyv" class="hash-link" aria-label="Direct link to Beyond rkyv" title="Direct link to Beyond rkyv" translate="no"></a></h2>
+<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>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<p><img decoding="async" loading="lazy" alt="image" src="https://iggy.apache.org/assets/images/iggy_batch_schema_2-c7a5fc6158b838999c178ef8aea96089.png" width="1600" height="720" class="img_ev3q"></p>
+<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="anchor anchorTargetStickyNavbar_Vzrq" id="benchmarks">Benchmarks<a href="https://iggy.apache.org/blogs/2025/05/08/zero-copy-deserialization#benchmarks" class="hash-link" aria-label="Direct link to Benchmarks" title="Direct link to Benchmarks" translate="no"></a></h2>
+<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 decoding="async" loading="lazy" alt="image" src="https://iggy.apache.org/assets/images/no_zero_copy_producer-ffed3643f7efa9c5ac43a3ce4cba746c.png" width="3188" height="2264" class="img_ev3q">
+<img decoding="async" loading="lazy" alt="image" src="https://iggy.apache.org/assets/images/no_zero_copy_consumer-ae546079ca662038a43983969c9fa325.png" width="3186" height="2262" class="img_ev3q"></p>
+<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">2.39ms</td></tr><tr><td style="text-align:left">Consumer< [...]
+<p><strong>After</strong></p>
+<p><img decoding="async" loading="lazy" alt="image" src="https://iggy.apache.org/assets/images/zero_copy_producer-6cd58f250a711fb170bba9091da38606.png" width="3194" height="2260" class="img_ev3q">
+<img decoding="async" loading="lazy" alt="image" src="https://iggy.apache.org/assets/images/zero_copy_consumer-b0a3206f473d6d13c8cc4fc8dfca3486.png" width="3192" height="2266" class="img_ev3q"></p>
+<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.63ms</td></tr><tr><td style="text-align:left">Consumer</td [...]
+<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/" target="_blank" rel="noopener noreferrer" class="">benchmarking website</a></strong>.</p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="concluding">Concluding<a href="https://iggy.apache.org/blogs/2025/05/08/zero-copy-deserialization#concluding" class="hash-link" aria-label="Direct link to Concluding" title="Direct link to Concluding" translate="no"></a></h2>
+<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" target="_blank" rel="noopener noreferrer" class="">this Bl [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-next-for-iggy">What’s next for Iggy<a href="https://iggy.apache.org/blogs/2025/05/08/zero-copy-deserialization#whats-next-for-iggy" class="hash-link" aria-label="Direct link to What’s next for Iggy" title="Direct link to What’s next for Iggy" translate="no"></a></h2>
+<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/" target="_blank" rel="noopener noreferrer" class="">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 blo [...]
+<p>For now <strong><a href="https://github.com/apache/iggy/tree/io_uring_monoio_runtime" target="_blank" rel="noopener noreferrer" class="">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>]]></content>
+ <author>
+ <name>Grzegorz Koszyk</name>
+ <uri>https://github.com/numinnex</uri>
+ </author>
+ <author>
+ <name>Hubert Gruszecki</name>
+ <uri>https://github.com/hubcio</uri>
+ </author>
+ </entry>
+ <entry>
+ <title type="html"><![CDATA[Transparent Benchmarking with Apache Iggy]]></title>
+ <id>https://iggy.apache.org/blogs/2025/02/17/transparent-benchmarks</id>
+ <link href="https://iggy.apache.org/blogs/2025/02/17/transparent-benchmarks"/>
+ <updated>2025-02-17T00:00:00.000Z</updated>
+ <summary type="html"><![CDATA[Benchmarks should be the first-class citizen]]></summary>
+ <content type="html"><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="benchmarks-should-be-the-first-class-citizen">Benchmarks should be the first-class citizen<a href="https://iggy.apache.org/blogs/2025/02/17/transparent-benchmarks#benchmarks-should-be-the-first-class-citizen" class="hash-link" aria-label="Direct link to Benchmarks should be the first-class citizen" title="Direct link to Benchmarks should be the first-class citizen" translate="no"></a></h2>
+<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/" target="_blank" rel="noopener noreferrer" class="">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 decoding="async" loading="lazy" alt="image" src="https://iggy.apache.org/assets/images/iggy_bench_cli-32946d97899e6925f99469dad967ca7e.png" width="2742" height="1930" class="img_ev3q"></p>
+<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="anchor anchorTargetStickyNavbar_Vzrq" id="iggy-benchmarking-dashboard">Iggy benchmarking dashboard<a href="https://iggy.apache.org/blogs/2025/02/17/transparent-benchmarks#iggy-benchmarking-dashboard" class="hash-link" aria-label="Direct link to Iggy benchmarking dashboard" title="Direct link to Iggy benchmarking dashboard" translate="no"></a></h2>
+<p><strong>And today, we're proud to present <a href="https://benchmarks.iggy.apache.org/" target="_blank" rel="noopener noreferrer" class="">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" target="_blank" rel="noopener noreferrer" class="">iggy-bench-dashboard</a> repository. In general, it's as simple as:</p>
+<ul>
+<li class="">Building the <a href="https://github.com/apache/iggy" target="_blank" rel="noopener noreferrer" class="">Iggy</a> in the release mode with <code>cargo build --release</code></li>
+<li class="">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 class="">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 class="">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 class="">Navigating to the specific benchmark directory to browse the charts and/or uploading them to the dashboard.</li>
+<li class="">And there's always <code>help</code> command e.g. <code>pinned-producer --help</code> to make your life easier :)</li>
+</ul>
+<p><img decoding="async" loading="lazy" alt="image" src="https://iggy.apache.org/assets/images/iggy_bench_dashboard-20dc5e120f14f0c4618f23227cd08ac9.png" width="2555" height="1327" class="img_ev3q"></p>
+<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="anchor anchorTargetStickyNavbar_Vzrq" id="towards-the-microsecond-latency">Towards the microsecond latency<a href="https://iggy.apache.org/blogs/2025/02/17/transparent-benchmarks#towards-the-microsecond-latency" class="hash-link" aria-label="Direct link to Towards the microsecond latency" title="Direct link to Towards the microsecond latency" translate="no"></a></h2>
+<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" target="_blank" rel="noopener noreferrer" class="">rkyv</a> - zero-copy deserialization framework, which has yielded some great results. Keep in mind that streaming the dat [...]
+<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" target="_blank" rel="noopener noreferrer" class="">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 the whole concept [...]
+ <author>
+ <name>Piotr Gankiewicz</name>
+ <uri>https://github.com/spetz</uri>
+ </author>
+ </entry>
+ <entry>
+ <title type="html"><![CDATA[Iggy joins the Apache Incubator]]></title>
+ <id>https://iggy.apache.org/blogs/2025/02/10/apache-incubator</id>
+ <link href="https://iggy.apache.org/blogs/2025/02/10/apache-incubator"/>
+ <updated>2025-02-10T00:00:00.000Z</updated>
+ <summary type="html"><![CDATA[We are thrilled to announce that Iggy has officially joined the Apache Incubator! This marks a major milestone in our journey to redefine message streaming — one that is blazingly fast, hyper-efficient, and built for the future. Since the very first day, Iggy was always meant to be a truly FOSS project — not just open-source in name, but deeply rooted in the values of transparency, collaboration, and community-driven innovation.]]></summary>
+ <content type="html"><![CDATA[<p>We are thrilled to announce that <strong>Iggy</strong> has officially joined the <strong><a href="https://incubator.apache.org/" target="_blank" rel="noopener noreferrer" class="">Apache Incubator</a></strong>! This marks a major milestone in our journey to redefine message streaming — one that is <strong>blazingly fast, hyper-efficient, and built for the future</strong>. Since the very first day, <strong>Iggy was always meant to be a truly FOSS p [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-a-journey-two-years-in-the-making">🚀 A Journey Two Years in the Making<a href="https://iggy.apache.org/blogs/2025/02/10/apache-incubator#-a-journey-two-years-in-the-making" class="hash-link" aria-label="Direct link to 🚀 A Journey Two Years in the Making" title="Direct link to 🚀 A Journey Two Years in the Making" translate="no"></a></h2>
+<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="anchor anchorTargetStickyNavbar_Vzrq" id="-beyond-just-iggy--a-growing-ecosystem">🔥 Beyond Just Iggy – A Growing Ecosystem<a href="https://iggy.apache.org/blogs/2025/02/10/apache-incubator#-beyond-just-iggy--a-growing-ecosystem" class="hash-link" aria-label="Direct link to 🔥 Beyond Just Iggy – A Growing Ecosystem" title="Direct link to 🔥 Beyond Just Iggy – A Growing Ecosystem" translate="no"></a></h2>
+<p>Iggy is no longer just about the core repository. Over time, we’ve built an entire ecosystem around it, including:</p>
+<ul>
+<li class="">✅ SDKs for seamless developer integrations</li>
+<li class="">✅ CLIs for powerful command-line control</li>
+<li class="">✅ Web UIs for intuitive management</li>
+<li class="">✅ And many more…</li>
+</ul>
+<p>We’re already approaching 20 repositories under the Iggy organization (<a href="https://github.com/iggy-rs/" target="_blank" rel="noopener noreferrer" class="">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="anchor anchorTargetStickyNavbar_Vzrq" id="-why-apache">🔗 Why Apache?<a href="https://iggy.apache.org/blogs/2025/02/10/apache-incubator#-why-apache" class="hash-link" aria-label="Direct link to 🔗 Why Apache?" title="Direct link to 🔗 Why Apache?" translate="no"></a></h2>
+<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 class=""><a href="https://cwiki.apache.org/confluence/display/INCUBATOR/Iggy+Proposal" target="_blank" rel="noopener noreferrer" class="">Official Proposal</a></li>
+<li class=""><a href="https://lists.apache.org/thread/q9whr3q9qd6wqm89f0vc1f6vkkvzc8xf" target="_blank" rel="noopener noreferrer" class="">Discussion Thread</a></li>
+<li class=""><a href="https://lists.apache.org/thread/6zfgdjwrzs92h4z4x6b25v1r23g3f5yg" target="_blank" rel="noopener noreferrer" class="">Voting Results</a></li>
+</ul>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-whats-next">📈 What’s Next?<a href="https://iggy.apache.org/blogs/2025/02/10/apache-incubator#-whats-next" class="hash-link" aria-label="Direct link to 📈 What’s Next?" title="Direct link to 📈 What’s Next?" translate="no"></a></h2>
+<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 class=""><strong>Scaling performance benchmarks</strong> to push the limits of ultra-low-latency streaming</li>
+<li class=""><strong>Expanding integrations</strong> with modern data infrastructure</li>
+<li class=""><strong>Building a vibrant developer ecosystem</strong> that makes message streaming frictionless</li>
+</ul>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-codebase-transition">🦀 Codebase transition<a href="https://iggy.apache.org/blogs/2025/02/10/apache-incubator#-codebase-transition" class="hash-link" aria-label="Direct link to 🦀 Codebase transition" title="Direct link to 🦀 Codebase transition" translate="no"></a></h2>
+<p>After the recent <a href="https://lists.apache.org/thread/zrn96nlg23r9353lr5tp2by2ggx4zxqc" target="_blank" rel="noopener noreferrer" class="">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 [...]
+<p>All the repositories under <a href="https://github.com/iggy-rs" target="_blank" rel="noopener noreferrer" class="">iggy-rs</a> will be eventually moved to the <a href="https://github.com/apache/iggy" target="_blank" rel="noopener noreferrer" class="">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/" target="_blank" rel="noopener noreferrer" class="">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="anchor anchorTargetStickyNavbar_Vzrq" id="-join-the-movement">💡 Join the Movement<a href="https://iggy.apache.org/blogs/2025/02/10/apache-incubator#-join-the-movement" class="hash-link" aria-label="Direct link to 💡 Join the Movement" title="Direct link to 💡 Join the Movement" translate="no"></a></h2>
+<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 decoding="async" loading="lazy" alt="image" src="https://iggy.apache.org/assets/images/iggy_logo-f0e83b91b22303a5545dfb6d49756d18.png" width="1800" height="1000" class="img_ev3q"></p>
+<p>👉 Follow us, contribute, and help to build the future of the message streaming!</p>
+<ul>
+<li class=""><a href="https://discord.gg/apache-iggy" target="_blank" rel="noopener noreferrer" class="">Discord</a></li>
+<li class=""><a href="https://x.com/ApacheIggy" target="_blank" rel="noopener noreferrer" class="">X (Twitter)</a></li>
+<li class=""><a href="https://bsky.app/profile/iggy.rs" target="_blank" rel="noopener noreferrer" class="">Bluesky</a></li>
+<li class=""><a href="https://www.linkedin.com/company/apache-iggy/" target="_blank" rel="noopener noreferrer" class="">LinkedIn</a></li>
+</ul>]]></content>
+ <author>
+ <name>Piotr Gankiewicz</name>
+ <uri>https://github.com/spetz</uri>
+ </author>
+ </entry>
+ <entry>
+ <title type="html"><![CDATA[Iggy.rs - Technology Radar & current goals]]></title>
+ <id>https://iggy.apache.org/blogs/2024/10/28/technology-radar-and-currrent-goals</id>
+ <link href="https://iggy.apache.org/blogs/2024/10/28/technology-radar-and-currrent-goals"/>
+ <updated>2024-10-28T00:00:00.000Z</updated>
+ <summary type="html"><![CDATA[Technology Radar]]></summary>
+ <content type="html"><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="technology-radar">Technology Radar<a href="https://iggy.apache.org/blogs/2024/10/28/technology-radar-and-currrent-goals#technology-radar" class="hash-link" aria-label="Direct link to Technology Radar" title="Direct link to Technology Radar" translate="no"></a></h2>
+<p>Quite recently (a few days ago), <a href="https://github.com/apache/iggy" target="_blank" rel="noopener noreferrer" class="">Iggy</a> has been listed on <a href="https://www.thoughtworks.com/radar/platforms/summary/iggy" target="_blank" rel="noopener noreferrer" class="">Technology Radar</a> by <a href="https://www.thoughtworks.com/" target="_blank" rel="noopener noreferrer" class="">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 decoding="async" loading="lazy" alt="image" src="https://iggy.apache.org/assets/images/iggy_technology_radar-291413e3a6d4cb1a5b7832ab5865423e.png" width="4096" height="2290" class="img_ev3q"></p>
+<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/" target="_blank" rel="noopener noreferrer" class="">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" target="_blank" rel="noopener noreferrer" class="">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/" target="_blank" rel="noopener noreferrer" class="">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="anchor anchorTargetStickyNavbar_Vzrq" id="current-goals">Current goals<a href="https://iggy.apache.org/blogs/2024/10/28/technology-radar-and-currrent-goals#current-goals" class="hash-link" aria-label="Direct link to Current goals" title="Direct link to Current goals" translate="no"></a></h2>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="replication">Replication<a href="https://iggy.apache.org/blogs/2024/10/28/technology-radar-and-currrent-goals#replication" class="hash-link" aria-label="Direct link to Replication" title="Direct link to Replication" translate="no"></a></h3>
+<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" target="_blank" rel="noopener noreferrer" class="">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://pmg.csail.mit.edu/papers/vr-revisited.pdf" target="_blank" rel="noopener noreferrer" class="">revisited form</a>), which was successfully used by e.g. <a href="https://tigerbeetle.com/" target="_blank" rel="noopener noreferrer" class="">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 decoding="async" loading="lazy" alt="image" src="https://iggy.apache.org/assets/images/iggy_vsr-3d747255ce17ecda927ccd4d258f7016.png" width="2832" height="3281" class="img_ev3q"></p>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="s3-storage">S3 storage<a href="https://iggy.apache.org/blogs/2024/10/28/technology-radar-and-currrent-goals#s3-storage" class="hash-link" aria-label="Direct link to S3 storage" title="Direct link to S3 storage" translate="no"></a></h3>
+<p>A few months ago, we did <a href="https://github.com/apache/iggy/pull/1053" target="_blank" rel="noopener noreferrer" class="">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>
+<div class="language-toml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-toml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">[</span><span class="token table class-name">data_maintenance.a [...]
+<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 if needed. You [...]
+<ul>
+<li class=""><strong>L1</strong> - data available directly from the server RAM (super fast writes/reads)</li>
+<li class=""><strong>L2</strong> - data stored on your servers disks (still very, very fast with NVME SSD gen4 or 5)</li>
+<li class=""><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/" target="_blank" rel="noopener noreferrer" class="">Quickwit</a>).</p>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="opentelemetry">OpenTelemetry<a href="https://iggy.apache.org/blogs/2024/10/28/technology-radar-and-currrent-goals#opentelemetry" class="hash-link" aria-label="Direct link to OpenTelemetry" title="Direct link to OpenTelemetry" translate="no"></a></h3>
+<p>Speaking of the Quickwit, we've also <a href="https://github.com/apache/iggy/pull/1294" target="_blank" rel="noopener noreferrer" class="">implemented</a> a support for <a href="https://opentelemetry.io/" target="_blank" rel="noopener noreferrer" class="">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 wh [...]
+<div class="language-toml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-toml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># OpenTelemetry configuration</span><span class=" [...]
+<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" target="_blank" rel="noopener noreferrer" class="">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 vi [...]
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="optimizations">Optimizations<a href="https://iggy.apache.org/blogs/2024/10/28/technology-radar-and-currrent-goals#optimizations" class="hash-link" aria-label="Direct link to Optimizations" title="Direct link to Optimizations" translate="no"></a></h3>
+<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" target="_blank" rel="noopener noreferrer" class="">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 [...]
+<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 decoding="async" loading="lazy" alt="image" src="https://iggy.apache.org/assets/images/iggy_docker-37b72ad9d9a244e1464c94f03c162193.png" width="2558" height="1375" class="img_ev3q"></p>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="io_uring">io_uring<a href="https://iggy.apache.org/blogs/2024/10/28/technology-radar-and-currrent-goals#io_uring" class="hash-link" aria-label="Direct link to io_uring" title="Direct link to io_uring" translate="no"></a></h3>
+<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" target="_blank" rel="noopener noreferrer" class="">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" target="_blank" rel [...]
+<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 of yet.</p>
+<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>]]></content>
+ <author>
+ <name>Piotr Gankiewicz</name>
+ <uri>https://github.com/spetz</uri>
+ </author>
+ </entry>
+ <entry>
+ <title type="html"><![CDATA[Iggy.rs — one year of building the message streaming]]></title>
+ <id>https://iggy.apache.org/blogs/2024/05/29/one-year-of-building-the-message-streaming</id>
+ <link href="https://iggy.apache.org/blogs/2024/05/29/one-year-of-building-the-message-streaming"/>
+ <updated>2024-05-29T00:00:00.000Z</updated>
+ <summary type="html"><![CDATA[Throwback]]></summary>
+ <content type="html"><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="throwback">Throwback<a href="https://iggy.apache.org/blogs/2024/05/29/one-year-of-building-the-message-streaming#throwback" class="hash-link" aria-label="Direct link to Throwback" title="Direct link to Throwback" translate="no"></a></h2>
+<p><strong>It's been a little over a year</strong>, since the <a href="https://iggy.rs/" target="_blank" rel="noopener noreferrer" class="">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/" target="_b [...]
+<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/" target="_blank" rel="noopener noreferrer" class="">Reddit</a>, and was also mentioned on the main site of <a href="https://news.ycombinator.com/item?id=38868115" target="_blank" rel="noopener noreferrer" class="">Hacker News</a>, which I do believe were [...]
+<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 decoding="async" loading="lazy" alt="image" src="https://iggy.apache.org/assets/images/iggy_stars-adb7a001298df7df97de6b0fdd6321ce.png" width="795" height="542" class="img_ev3q"></p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="community">Community<a href="https://iggy.apache.org/blogs/2024/05/29/one-year-of-building-the-message-streaming#community" class="hash-link" aria-label="Direct link to Community" title="Direct link to Community" translate="no"></a></h2>
+<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" target="_blank" rel="noopener noreferrer" class="">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 class=""><a href="https://github.com/apache/iggy" target="_blank" rel="noopener noreferrer" class="">Rust</a></li>
+<li class=""><a href="https://github.com/iggy-rs/iggy-dotnet-client" target="_blank" rel="noopener noreferrer" class="">C#</a></li>
+<li class=""><a href="https://github.com/iggy-rs/iggy-cpp-client" target="_blank" rel="noopener noreferrer" class="">C++</a></li>
+<li class=""><a href="https://github.com/iggy-rs/iggy-node-client" target="_blank" rel="noopener noreferrer" class="">Node (TS)</a></li>
+<li class=""><a href="https://github.com/iggy-rs/iggy-go-client" target="_blank" rel="noopener noreferrer" class="">Go</a></li>
+<li class=""><a href="https://github.com/iggy-rs/iggy-python-client" target="_blank" rel="noopener noreferrer" class="">Python</a></li>
+<li class=""><a href="https://github.com/iggy-rs/iggy-java-client" target="_blank" rel="noopener noreferrer" class="">Java</a></li>
+<li class=""><a href="https://github.com/iggy-rs/iggy-elixir-client" target="_blank" rel="noopener noreferrer" class="">Elixir</a></li>
+</ul>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="changelog">Changelog<a href="https://iggy.apache.org/blogs/2024/05/29/one-year-of-building-the-message-streaming#changelog" class="hash-link" aria-label="Direct link to Changelog" title="Direct link to Changelog" translate="no"></a></h2>
+<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 class="">Increased the streaming server throughput by over 30% for both writes and reads</li>
+<li class="">Added messages compression for client-side & server-side supporting the different algorithms</li>
+<li class="">Implemented a new way of message batching with an additional tooling for data migration</li>
+<li class="">Fixed the possible server-side deadlock that could happen for a specific configuration</li>
+<li class="">Fixed issues with possible memory leaks when storing too many indices in memory</li>
+<li class="">Rebuilt our custom benchmarking tool</li>
+<li class="">Improved TCP connection handling</li>
+<li class="">Constantly upgrading our CI/CD with lots of testing, different runtimes, artifacts, crates and Docker images releases</li>
+<li class="">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 decoding="async" loading="lazy" alt="image" src="https://iggy.apache.org/assets/images/iggy_perf-33fc4db2b6cbd7156b753eee6aeaba60.png" width="2117" height="367" class="img_ev3q"></p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="tooling">Tooling<a href="https://iggy.apache.org/blogs/2024/05/29/one-year-of-building-the-message-streaming#tooling" class="hash-link" aria-label="Direct link to Tooling" title="Direct link to Tooling" translate="no"></a></h2>
+<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" target="_blank" rel="noopener noreferrer" class="">CLI</a> and <a href="https://github.com/iggy-rs/iggy-web-ui" target="_blank" rel="noopener noreferrer" class="">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 decoding="async" loading="lazy" alt="image" src="https://iggy.apache.org/assets/images/iggy_cli-c140d5ecfddf24acd537722137b70c47.png" width="1743" height="766" class="img_ev3q"></p>
+<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 decoding="async" loading="lazy" alt="image" src="https://iggy.apache.org/assets/images/iggy_web-76023f316d53cc2e44ae6f7b83193529.png" width="2559" height="1353" class="img_ev3q"></p>
+<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" target="_blank" rel="noopener noreferrer" class="">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 decoding="async" loading="lazy" alt="image" src="https://iggy.apache.org/assets/images/iggy_bench-eed7510a845dfb053ac67be624599c99.png" width="1891" height="803" class="img_ev3q"></p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="early-adopters">Early adopters<a href="https://iggy.apache.org/blogs/2024/05/29/one-year-of-building-the-message-streaming#early-adopters" class="hash-link" aria-label="Direct link to Early adopters" title="Direct link to Early adopters" translate="no"></a></h2>
+<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" target="_blank" rel="noopener noreferrer" class="">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="anchor anchorTargetStickyNavbar_Vzrq" id="clustering--replication">Clustering & replication<a href="https://iggy.apache.org/blogs/2024/05/29/one-year-of-building-the-message-streaming#clustering--replication" class="hash-link" aria-label="Direct link to Clustering & replication" title="Direct link to Clustering & replication" translate="no"></a></h2>
+<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" target="_blank" rel="noopener noreferrer" class="">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/" target="_blank" rel="noopener noreferrer" class="">Raft</a> consensus algorithm. However, adding the data replication featu [...]
+<p><img decoding="async" loading="lazy" alt="image" src="https://iggy.apache.org/assets/images/iggy_cluster-c2c33596763c8b9930c7de7e12dc3586.png" width="2552" height="1276" class="img_ev3q"></p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="io_uring--thread-per-core--share-nothing">io_uring & thread-per-core + share-nothing<a href="https://iggy.apache.org/blogs/2024/05/29/one-year-of-building-the-message-streaming#io_uring--thread-per-core--share-nothing" class="hash-link" aria-label="Direct link to io_uring & thread-per-core + share-nothing" title="Direct link to io_uring & thread-per-core + share-nothing" translate="no"></a></h2>
+<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 could have a ve [...]
+<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/" target="_blank" rel="noopener noreferrer" class="">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" target="_blank" rel="noopener noreferrer" class="">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 thre [...]
+<p>And just recently, we've established yet another <a href="https://github.com/iggy-rs/iggy-thread-per-core-sandbox" target="_blank" rel="noopener noreferrer" class="">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 decoding="async" loading="lazy" alt="image" src="https://iggy.apache.org/assets/images/iggy_tpc-a6b43534112bfc2c863a2ef675c0a547.png" width="2298" height="1232" class="img_ev3q"></p>
+<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 class="">How to evenly split partitions (the unit of data parallelism) between multiple cores?</li>
+<li class="">How to efficiently rewrite existing server metadata heavily relying on synchronized data with <code>Arc<></code> and <code>RwLock<></code>?</li>
+<li class="">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 class="">Should there be single or multiple threads handling the incoming TCP connections?</li>
+<li class="">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 class="">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" target="_blank" rel="noopener noreferrer" class="">studying</a> some of the existing solutions out there, including <a href="https://seastar.io/" target="_blank" rel="noopener noreferrer" class="">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="anchor anchorTargetStickyNavbar_Vzrq" id="production-readiness">Production readiness<a href="https://iggy.apache.org/blogs/2024/05/29/one-year-of-building-the-message-streaming#production-readiness" class="hash-link" aria-label="Direct link to Production readiness" title="Direct link to Production readiness" translate="no"></a></h2>
+<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" target="_blank" rel="noopener noreferrer" class="">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 decoding="async" loading="lazy" alt="image" src="https://iggy.apache.org/assets/images/iggy_rocket-24a27df28dafae43eb9634a4f6b00c5e.png" width="1920" height="1080" class="img_ev3q"></p>]]></content>
+ <author>
+ <name>Piotr Gankiewicz</name>
+ <uri>https://github.com/spetz</uri>
+ </author>
+ </entry>
+ <entry>
+ <title type="html"><![CDATA[Iggy.rs - building message streaming in Rust]]></title>
+ <id>https://iggy.apache.org/blogs/2023/12/29/building-message-streaming-in-rust</id>
+ <link href="https://iggy.apache.org/blogs/2023/12/29/building-message-streaming-in-rust"/>
+ <updated>2023-12-29T00:00:00.000Z</updated>
+ <summary type="html"><![CDATA[Origins]]></summary>
+ <content type="html"><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="origins">Origins<a href="https://iggy.apache.org/blogs/2023/12/29/building-message-streaming-in-rust#origins" class="hash-link" aria-label="Direct link to Origins" title="Direct link to Origins" translate="no"></a></h2>
+<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" target="_blank" rel="noopener noreferrer" class="">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 [...]
+<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/" target="_blank" rel="noopener noreferrer" class="">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 messagin [...]
+<p>And this is how the <a href="https://iggy.rs/" target="_blank" rel="noopener noreferrer" class="">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/" target="_blank" rel="noopener noreferrer" class="">two of them</a>), small yet extremely fast dogs, the best in their class.</p>
+<p><img decoding="async" loading="lazy" alt="image" src="https://iggy.apache.org/assets/images/iggys-5cd88b6e4af91d0e5b0f1ef688b8efac.jpeg" width="1506" height="1282" class="img_ev3q"></p>
+<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="anchor anchorTargetStickyNavbar_Vzrq" id="project">Project<a href="https://iggy.apache.org/blogs/2023/12/29/building-message-streaming-in-rust#project" class="hash-link" aria-label="Direct link to Project" title="Direct link to Project" translate="no"></a></h2>
+<p>At the very beginning, Iggy had rather limited functionality, and everything was handled using the <a href="https://www.chromium.org/quic/" target="_blank" rel="noopener noreferrer" class="">QUIC</a> protocol based on <a href="https://github.com/quinn-rs/quinn" target="_blank" rel="noopener noreferrer" class="">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 [...]
+<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 decoding="async" loading="lazy" alt="image" src="https://iggy.apache.org/assets/images/iggy_sample-39395c20221652515f2296734851e042.jpeg" width="4064" height="2408" class="img_ev3q"></p>
+<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" target="_blank" rel="noopener noreferrer" class="">bytes</a>, along with the <a href="https://tokio.rs/" target="_blank" rel="noopener noreferrer" class="">Tokio</a> <strong>work stealing</strong> approach, yielded the [...]
+<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>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> polled_messages </span><span c [...]
+<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" target="_blank" rel="noopener noreferrer" class="">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 mont [...]
+<p><img decoding="async" loading="lazy" alt="image" src="https://iggy.apache.org/assets/images/iggy_bench-9ea0ebbd13ad66abb94ec3d8d8697048.jpeg" width="3494" height="1750" class="img_ev3q"></p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="team">Team<a href="https://iggy.apache.org/blogs/2023/12/29/building-message-streaming-in-rust#team" class="hash-link" aria-label="Direct link to Team" title="Direct link to Team" translate="no"></a></h2>
+<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 specifically. F [...]
+<p><img decoding="async" loading="lazy" alt="image" src="https://iggy.apache.org/assets/images/iggy_server-b28372292592869008ceb03c1edfdc51.jpeg" width="4088" height="1610" class="img_ev3q"></p>
+<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="anchor anchorTargetStickyNavbar_Vzrq" id="features">Features<a href="https://iggy.apache.org/blogs/2023/12/29/building-message-streaming-in-rust#features" class="hash-link" aria-label="Direct link to Features" title="Direct link to Features" translate="no"></a></h2>
+<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 class=""><strong>Highly performant</strong>, persistent append-only log for the message streaming</li>
+<li class=""><strong>Very high throughput</strong> for both writes and reads</li>
+<li class=""><strong>Low latency and predictable resource usage</strong> thanks to the Rust compiled language (no GC)</li>
+<li class=""><strong>Users authentication and authorization</strong> with granular permissions and PAT (Personal Access Tokens)</li>
+<li class="">Support for multiple streams, topics and partitions</li>
+<li class="">Support for <strong>multiple transport protocols</strong> (QUIC, TCP, HTTP)</li>
+<li class="">Fully operational RESTful API which can be optionally enabled</li>
+<li class="">Available client SDK in multiple languages</li>
+<li class=""><strong>Works directly with the binary data</strong> (lack of enforced schema and serialization/deserialization)</li>
+<li class="">Configurable server features (e.g. caching, segment size, data flush interval, transport protocols etc.)</li>
+<li class="">Possibility of storing the <strong>consumer offsets</strong> on the server</li>
+<li class="">Multiple ways of polling the messages:<!-- -->
+<ul>
+<li class="">By offset (using the indexes)</li>
+<li class="">By timestamp (using the time indexes)</li>
+<li class="">First/Last N messages</li>
+<li class="">Next N messages for the specific consumer</li>
+</ul>
+</li>
+<li class="">Possibility of <strong>auto committing the offset</strong> (e.g. to achieve <em>at-most-once</em> delivery)</li>
+<li class=""><strong>Consumer groups</strong> providing the message ordering and horizontal scaling across the connected clients</li>
+<li class=""><strong>Message expiry</strong> with auto deletion based on the configurable <strong>retention policy</strong></li>
+<li class="">Additional features such as <strong>server side message deduplication</strong></li>
+<li class=""><strong>TLS</strong> support for all transport protocols (TCP, QUIC, HTTPS)</li>
+<li class="">Optional server-side as well as client-side <strong>data encryption</strong> using AES-256-GCM</li>
+<li class="">Optional metadata support in the form of <strong>message headers</strong></li>
+<li class="">Built-in <strong>CLI</strong> to manage the streaming server</li>
+<li class="">Built-in <strong>benchmarking app</strong> to test the performance</li>
+<li class=""><strong>Single binary deployment</strong> (no external dependencies)</li>
+<li class="">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 class=""><a href="https://crates.io/crates/iggy" target="_blank" rel="noopener noreferrer" class="">Rust</a></li>
+<li class=""><a href="https://github.com/iggy-rs/iggy-dotnet-client" target="_blank" rel="noopener noreferrer" class="">C#</a></li>
+<li class=""><a href="https://github.com/iggy-rs/iggy-go-client" target="_blank" rel="noopener noreferrer" class="">Go</a></li>
+<li class=""><a href="https://github.com/iggy-rs/iggy-node-client" target="_blank" rel="noopener noreferrer" class="">Node</a></li>
+<li class=""><a href="https://github.com/iggy-rs/iggy-python-client" target="_blank" rel="noopener noreferrer" class="">Python</a></li>
+<li class=""><a href="https://github.com/iggy-rs/iggy-java-client" target="_blank" rel="noopener noreferrer" class="">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 stress enough <strong>how gr [...]
+<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" target="_blank" rel="noopener noreferrer" class="">CLI</a></strong>.</p>
+<p><img decoding="async" loading="lazy" alt="image" src="https://iggy.apache.org/assets/images/iggy_cli-efc853d35dfcddfb68957f9f7cbdd745.jpeg" width="2942" height="2162" class="img_ev3q"></p>
+<p>As well as modern <strong><a href="https://github.com/iggy-rs/iggy-web-ui" target="_blank" rel="noopener noreferrer" class="">Web UI</a></strong> to make it happen :)</p>
+<p><img decoding="async" loading="lazy" alt="image" src="https://iggy.apache.org/assets/images/iggy_web_ui-58fc54e40a2756eba04dec9206de70a5.jpeg" width="4060" height="2408" class="img_ev3q"></p>
+<p>Last but not least, we've got a fully-featured <a href="https://github.com/apache/iggy/actions" target="_blank" rel="noopener noreferrer" class="">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" target="_blank" rel="noopener noreferrer" class="">Docker images</a>.</p>
+<p><img decoding="async" loading="lazy" alt="image" src="https://iggy.apache.org/assets/images/iggy_ci_cd-a03f984dde69dbbc209f61481d7d1c91.jpeg" width="2000" height="1000" class="img_ev3q"></p>
+<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="anchor anchorTargetStickyNavbar_Vzrq" id="roadmap">Roadmap<a href="https://iggy.apache.org/blogs/2023/12/29/building-message-streaming-in-rust#roadmap" class="hash-link" aria-label="Direct link to Roadmap" title="Direct link to Roadmap" translate="no"></a></h2>
+<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/" target="_blank" rel="noopener noreferrer" class="">company</a> using it already), and discussed what features would be a good addition to the current stack.</p>
+<p><img decoding="async" loading="lazy" alt="image" src="https://iggy.apache.org/assets/images/gh_trending-bbecb9e6ddc18e345fbdb7c8bae838d9.jpeg" width="2234" height="1830" class="img_ev3q"></p>
+<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) and swi [...]
+<p><img decoding="async" loading="lazy" alt="image" src="https://iggy.apache.org/assets/images/leader_elections-f973c06ac3c6b230945e496faa6f314e.jpeg" width="4058" height="2316" class="img_ev3q"></p>
+<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" target="_blank" rel="noopener noreferrer" class="">io_uring</a></strong> for all I/O operations (disk or network related). The brand new, completion based API (available in the re [...]
+<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" target="_blank" rel="n [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="future">Future<a href="https://iggy.apache.org/blogs/2023/12/29/building-message-streaming-in-rust#future" class="hash-link" aria-label="Direct link to Future" title="Direct link to Future" translate="no"></a></h2>
+<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. Aero [...]
+<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" target="_blank" rel="noopener noreferrer" class="">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/" target="_blank" rel="noopener noreferrer" class="">Rust</a>.</p>]]></content>
+ <author>
+ <name>Piotr Gankiewicz</name>
+ <uri>https://github.com/spetz</uri>
+ </author>
+ </entry>
+ <entry>
+ <title type="html"><![CDATA[Iggy 0.1.0 release]]></title>
+ <id>https://iggy.apache.org/blogs/iggy-0-1-0-release</id>
+ <link href="https://iggy.apache.org/blogs/iggy-0-1-0-release"/>
+ <updated>2023-11-26T00:00:00.000Z</updated>
+ <summary type="html"><![CDATA[We are happy to announce that Iggy.rs has reached the 0.1.0 release. This is a major milestone for the project, as it's getting closer to the first stable release.]]></summary>
+ <content type="html"><![CDATA[<p>We are happy to announce that Iggy.rs has reached the <code>0.1.0</code> release. This is a major milestone for the project, as it's getting closer to the first stable release.</p>
+<p><img decoding="async" loading="lazy" alt="0.1.0" src="https://iggy.apache.org/assets/images/iggy_0_1_0-c635523620b5dc0af17545d1c3ce3edd.jpg" width="1000" height="500" class="img_ev3q"></p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="release-notes">Release notes<a href="https://iggy.apache.org/blogs/iggy-0-1-0-release#release-notes" class="hash-link" aria-label="Direct link to Release notes" title="Direct link to Release notes" translate="no"></a></h2>
+<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 decoding="async" loading="lazy" alt="CI" src="https://iggy.apache.org/assets/images/iggy_server_0_1_0-7d957a6db68439149d9c805432318296.jpeg" width="4092" height="1664" class="img_ev3q"></p>
+<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 decoding="async" loading="lazy" alt="CI" src="https://iggy.apache.org/assets/images/iggy_ci_0_1_0-b31e9445de207c06bd2eee74dafac357.jpeg" width="3598" height="1248" class="img_ev3q"></p>
+<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 decoding="async" loading="lazy" alt="Bench" src="https://iggy.apache.org/assets/images/iggy_bench_0_1_0-afcc4cf7770ab3863afbdd2a7871492b.jpeg" width="4068" height="2138" class="img_ev3q"></p>
+<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 decoding="async" loading="lazy" alt="CLI" src="https://iggy.apache.org/assets/images/iggy_cli_0_1_0-aa8dbc85bd46875427ae87e133ec8482.jpeg" width="2942" height="2164" class="img_ev3q"></p>
+<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 decoding="async" loading="lazy" alt="Web UI" src="https://iggy.apache.org/assets/images/iggy_web_ui_0_1_0-58fc54e40a2756eba04dec9206de70a5.jpeg" width="4060" height="2408" class="img_ev3q"></p>
+<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" target="_blank" rel="noopener noreferrer" class="">Discord</a> server, and let us know what you think about the project. We are looking forward to hearing from you!</p>]]></content>
+ <author>
+ <name>Piotr Gankiewicz</name>
+ <uri>https://github.com/spetz</uri>
+ </author>
+ <category label="release" term="release"/>
+ </entry>
+ <entry>
+ <title type="html"><![CDATA[Personal access tokens]]></title>
+ <id>https://iggy.apache.org/blogs/personal-access-tokens</id>
+ <link href="https://iggy.apache.org/blogs/personal-access-tokens"/>
+ <updated>2023-10-12T00:00:00.000Z</updated>
+ <summary type="html"><![CDATA[Since the most recent update, Iggy.rs supports personal access tokens, which can be used to authenticate the clients, instead of the username and password. The tokens can be created and deleted using the available APIs.]]></summary>
+ <content type="html"><![CDATA[<p>Since the most recent update, Iggy.rs supports personal access tokens, which can be used to authenticate the clients, instead of the username and password. The tokens can be created and deleted using the available APIs.</p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="breaking-changes">Breaking changes<a href="https://iggy.apache.org/blogs/personal-access-tokens#breaking-changes" class="hash-link" aria-label="Direct link to Breaking changes" title="Direct link to Breaking changes" translate="no"></a></h2>
+<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" target="_blank" rel="noopener noreferrer" class="">#e74c25e</a>.</p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="personal-access-tokens">Personal access tokens<a href="https://iggy.apache.org/blogs/personal-access-tokens#personal-access-tokens" class="hash-link" aria-label="Direct link to Personal access tokens" title="Direct link to Personal access tokens" translate="no"></a></h2>
+<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>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<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>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">async</span><span class="token plain"> </span><span class="token ke [...]
+<p>When creating the token, the server returns the <code>RawPersonalAccessToken</code> struct, which contains the string <code>token</code> value.</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<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>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<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="anchor anchorTargetStickyNavbar_Vzrq" id="configuration">Configuration<a href="https://iggy.apache.org/blogs/personal-access-tokens#configuration" class="hash-link" aria-label="Direct link to Configuration" title="Direct link to Configuration" translate="no"></a></h2>
+<p>On the server side, you can enable the background task responsible for deleting the expired tokens.</p>
+<div class="language-toml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-toml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">[</span><span class="token table class-name">personal_access_to [...]
+ <author>
+ <name>Piotr Gankiewicz</name>
+ <uri>https://github.com/spetz</uri>
+ </author>
+ <category label="new-features" term="new-features"/>
+ <category label="personal-access-tokens" term="personal-access-tokens"/>
+ <category label="pat" term="pat"/>
+ </entry>
+ <entry>
+ <title type="html"><![CDATA[Consumer identifier]]></title>
+ <id>https://iggy.apache.org/blogs/consumer-identifier</id>
+ <link href="https://iggy.apache.org/blogs/consumer-identifier"/>
+ <updated>2023-10-02T00:00:00.000Z</updated>
+ <summary type="html"><![CDATA[In the latest update, the Iggy server as well as the clients for all the available transport protocols have been extended with the support for consumer identifier. Whether you poll the messages, store the consumer offsets, or create consumer groups, you can use the well-established identifier type, instead of just u32, which is now a common standard for the resources' identification such as streams, topics, users and consumers.]]></summary>
+ <content type="html"><![CDATA[<p>In the latest update, the Iggy server as well as the clients for all the available transport protocols have been extended with the support for <strong>consumer identifier</strong>. Whether you poll the messages, store the consumer offsets, or create consumer groups, you can use the well-established <code>identifier</code> type, instead of just <code>u32</code>, which is now a common standard for the resources' identification such as streams, topic [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="breaking-changes">Breaking changes<a href="https://iggy.apache.org/blogs/consumer-identifier#breaking-changes" class="hash-link" aria-label="Direct link to Breaking changes" title="Direct link to Breaking changes" translate="no"></a></h2>
+<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" target="_blank" rel="noopener noreferrer" class="">#655f9b6</a>.</p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="consumer-identifier">Consumer identifier<a href="https://iggy.apache.org/blogs/consumer-identifier#consumer-identifier" class="hash-link" aria-label="Direct link to Consumer identifier" title="Direct link to Consumer identifier" translate="no"></a></h2>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<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="anchor anchorTargetStickyNavbar_Vzrq" id="consumer-groups">Consumer groups<a href="https://iggy.apache.org/blogs/consumer-identifier#consumer-groups" class="hash-link" aria-label="Direct link to Consumer groups" title="Direct link to Consumer groups" translate="no"></a></h2>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<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>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<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>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<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>]]></content>
+ <author>
+ <name>Piotr Gankiewicz</name>
+ <uri>https://github.com/spetz</uri>
+ </author>
+ <category label="new-features" term="new-features"/>
+ <category label="consumers" term="consumers"/>
+ <category label="identifier" term="identifier"/>
+ </entry>
+ <entry>
+ <title type="html"><![CDATA[Users and permissions]]></title>
+ <id>https://iggy.apache.org/blogs/users-and-permissions</id>
+ <link href="https://iggy.apache.org/blogs/users-and-permissions"/>
+ <updated>2023-09-20T00:00:00.000Z</updated>
+ <summary type="html"><![CDATA[In the most recent update, the Iggy server as well as the clients for all the available transport protocols have been extended with the support for users and permissions. From now on, you can additionally secure your data using the authentication and authorization by specifying the granular set of permissions for each user.]]></summary>
+ <content type="html"><![CDATA[<p>In the most recent update, the Iggy server as well as the clients for all the available transport protocols have been extended with the support for <strong>users and permissions</strong>. From now on, you can additionally secure your data using the authentication and authorization by specifying the granular set of permissions for each user.</p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="breaking-changes">Breaking changes<a href="https://iggy.apache.org/blogs/users-and-permissions#breaking-changes" class="hash-link" aria-label="Direct link to Breaking changes" title="Direct link to Breaking changes" translate="no"></a></h2>
+<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>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<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" target="_blank" rel="noopener noreferrer" class="">#23b3309</a>. The available <a href="https://crates.io/crates/iggy" target="_blank" rel="noopener noreferrer" class="">iggy crate</a> supports these changes since version 0.0.80.</p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="configuration">Configuration<a href="https://iggy.apache.org/blogs/users-and-permissions#configuration" class="hash-link" aria-label="Direct link to Configuration" title="Direct link to Configuration" translate="no"></a></h2>
+<p>Currently, the authentication and authorization can be enabled in the <code>server.toml</code> configuration via <code>[system.user]</code> section:</p>
+<div class="language-toml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-toml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">[</span><span class="token table class-name">system.user</span> [...]
+<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>
+<div class="language-toml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-toml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">[</span><span class="token table class-name">http.jwt</span><sp [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="authentication-and-authorization">Authentication and authorization<a href="https://iggy.apache.org/blogs/users-and-permissions#authentication-and-authorization" class="hash-link" aria-label="Direct link to Authentication and authorization" title="Direct link to Authentication and authorization" translate="no"></a></h2>
+<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's n [...]
+<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>
+<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class [...]
+<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>
+<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="sdk">SDK<a href="https://iggy.apache.org/blogs/users-and-permissions#sdk" class="hash-link" aria-label="Direct link to SDK" title="Direct link to SDK" translate="no"></a></h2>
+<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>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="commands-and-models">Commands and models<a href="https://iggy.apache.org/blogs/users-and-permissions#commands-and-models" class="hash-link" aria-label="Direct link to Commands and models" title="Direct link to Commands and models" translate="no"></a></h2>
+<p>The following commands and response models have been added:</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<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="anchor anchorTargetStickyNavbar_Vzrq" id="http-api">HTTP API<a href="https://iggy.apache.org/blogs/users-and-permissions#http-api" class="hash-link" aria-label="Direct link to HTTP API" title="Direct link to HTTP API" translate="no"></a></h2>
+<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>
+<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">POST {{url}}/users/login</span><br></span><span class="token-line" style="color:#393A34"><s [...]
+ <author>
+ <name>Piotr Gankiewicz</name>
+ <uri>https://github.com/spetz</uri>
+ </author>
+ <category label="new-features" term="new-features"/>
+ <category label="users" term="users"/>
+ <category label="permissions" term="permissions"/>
+ </entry>
+ <entry>
+ <title type="html"><![CDATA[Updated schemas]]></title>
+ <id>https://iggy.apache.org/blogs/updated-schemas</id>
+ <link href="https://iggy.apache.org/blogs/updated-schemas"/>
+ <updated>2023-08-31T00:00:00.000Z</updated>
+ <summary type="html"><![CDATA[The latest update introduces the changes to the PollMessages and GetConsumerOffset commands response schema, as well as the Stream, Topic and Partition structs extended with created_at field.]]></summary>
+ <content type="html"><![CDATA[<p>The latest update introduces the changes to the <code>PollMessages</code> and <code>GetConsumerOffset</code> commands response schema, as well as the <code>Stream</code>, <code>Topic</code> and <code>Partition</code> structs extended with <code>created_at</code> field.</p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="breaking-changes">Breaking changes<a href="https://iggy.apache.org/blogs/updated-schemas#breaking-changes" class="hash-link" aria-label="Direct link to Breaking changes" title="Direct link to Breaking changes" translate="no"></a></h2>
+<p>Breaking changes have been introduced with the commit <a href="https://github.com/apache/iggy/commit/670a8baba8617bb7e52bd51d556a621349e2e9f0" target="_blank" rel="noopener noreferrer" class="">#670a8ba</a>. The available <a href="https://crates.io/crates/iggy" target="_blank" rel="noopener noreferrer" class="">iggy crate</a> supports these changes since version 0.0.60.</p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="pollmessages">PollMessages<a href="https://iggy.apache.org/blogs/updated-schemas#pollmessages" class="hash-link" aria-label="Direct link to PollMessages" title="Direct link to PollMessages" translate="no"></a></h2>
+<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 [...]
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<p>Serialization:</p>
+<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Partition ID (4 bytes) + Current offset (8 bytes) + Messages count (4 bytes) + Messages (N [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="getconsumeroffset">GetConsumerOffset<a href="https://iggy.apache.org/blogs/updated-schemas#getconsumeroffset" class="hash-link" aria-label="Direct link to GetConsumerOffset" title="Direct link to GetConsumerOffset" translate="no"></a></h2>
+<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>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<p>Serialization:</p>
+<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Partition ID (4 bytes) + Current offset (8 bytes) + Stored offset (8 bytes)</span><br></spa [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="stream-topic-partition">Stream, Topic, Partition<a href="https://iggy.apache.org/blogs/updated-schemas#stream-topic-partition" class="hash-link" aria-label="Direct link to Stream, Topic, Partition" title="Direct link to Stream, Topic, Partition" translate="no"></a></h2>
+<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>]]></content>
+ <author>
+ <name>Piotr Gankiewicz</name>
+ <uri>https://github.com/spetz</uri>
+ </author>
+ <category label="update" term="update"/>
+ <category label="schema" term="schema"/>
+ </entry>
+ <entry>
+ <title type="html"><![CDATA[Message expiry]]></title>
+ <id>https://iggy.apache.org/blogs/message-expiry</id>
+ <link href="https://iggy.apache.org/blogs/message-expiry"/>
+ <updated>2023-08-27T00:00:00.000Z</updated>
+ <summary type="html"><![CDATA[The message expiration is a server-side feature, allowing to automatically delete the old data (expired segment as a whole) depending on the provided configuration. By specifying the custom retention policy, the server can clean up no longer needed messages, which can help with the disk space management.]]></summary>
+ <content type="html"><![CDATA[<p>The message expiration is a server-side feature, allowing to automatically delete the old data (expired segment as a whole) depending on the provided configuration. By specifying the custom retention policy, the server can clean up no longer needed messages, which can help with the disk space management.</p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="breaking-changes">Breaking changes<a href="https://iggy.apache.org/blogs/message-expiry#breaking-changes" class="hash-link" aria-label="Direct link to Breaking changes" title="Direct link to Breaking changes" translate="no"></a></h2>
+<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" target="_blank" rel="noopener noreferrer" class="">#ea3bf9c</a>. The available <a href="https://crates.io/crates/iggy" tar [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="introduction">Introduction<a href="https://iggy.apache.org/blogs/message-expiry#introduction" class="hash-link" aria-label="Direct link to Introduction" title="Direct link to Introduction" translate="no"></a></h2>
+<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="anchor anchorTargetStickyNavbar_Vzrq" id="configuration">Configuration<a href="https://iggy.apache.org/blogs/message-expiry#configuration" class="hash-link" aria-label="Direct link to Configuration" title="Direct link to Configuration" translate="no"></a></h2>
+<div class="language-toml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-toml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">[</span><span class="token table class-name">message_cleaner</s [...]
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="message-cleaner">Message cleaner<a href="https://iggy.apache.org/blogs/message-expiry#message-cleaner" class="hash-link" aria-label="Direct link to Message cleaner" title="Direct link to Message cleaner" translate="no"></a></h3>
+<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="anchor anchorTargetStickyNavbar_Vzrq" id="segment">Segment<a href="https://iggy.apache.org/blogs/message-expiry#segment" class="hash-link" aria-label="Direct link to Segment" title="Direct link to Segment" translate="no"></a></h3>
+<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="anchor anchorTargetStickyNavbar_Vzrq" id="commands">Commands<a href="https://iggy.apache.org/blogs/message-expiry#commands" class="hash-link" aria-label="Direct link to Commands" title="Direct link to Commands" translate="no"></a></h2>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<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>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">fn</span><span class="token plain"> </span><span class="token funct [...]
+<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>
+<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Topic ID (4 bytes) + Partitions count (4 bytes) + Message expiry (4 bytes) + Size (8 bytes) [...]
+<p>The same changes (<code>name_length</code>) apply to the <code>Stream</code> and <code>StreamDetails</code> structs.</p>
+<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Stream ID (4 bytes) + Topics count (4 bytes) + Size (8 bytes) + Messages count (8 bytes) + [...]
+ <author>
+ <name>Piotr Gankiewicz</name>
+ <uri>https://github.com/spetz</uri>
+ </author>
+ <category label="new-features" term="new-features"/>
+ <category label="message-expiry" term="message-expiry"/>
+ </entry>
+ <entry>
+ <title type="html"><![CDATA[Message state]]></title>
+ <id>https://iggy.apache.org/blogs/message-state</id>
+ <link href="https://iggy.apache.org/blogs/message-state"/>
+ <updated>2023-08-22T00:00:00.000Z</updated>
+ <summary type="html"><![CDATA[The message state is a simple field which extends the existing message and provides a way to define whether the particular message might be consumed by the client or not, depending on its value. Let's briefly discuss the motivation behind this feature, the implementation details and the breaking changes introduced by this release.]]></summary>
+ <content type="html"><![CDATA[<p>The message state is a simple field which extends the existing <code>message</code> and provides a way to define whether the particular message might be consumed by the client or not, depending on its value. Let's briefly discuss the motivation behind this feature, the implementation details and the breaking changes introduced by this release.</p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="breaking-changes">Breaking changes<a href="https://iggy.apache.org/blogs/message-state#breaking-changes" class="hash-link" aria-label="Direct link to Breaking changes" title="Direct link to Breaking changes" translate="no"></a></h2>
+<p>Starting with the commit <a href="https://github.com/apache/iggy/commit/b07f23db798ffcda7c39650f34547f20137ff725" target="_blank" rel="noopener noreferrer" class="">#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" target="_ [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="introduction">Introduction<a href="https://iggy.apache.org/blogs/message-state#introduction" class="hash-link" aria-label="Direct link to Introduction" title="Direct link to Introduction" translate="no"></a></h2>
+<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="anchor anchorTargetStickyNavbar_Vzrq" id="implementation">Implementation<a href="https://iggy.apache.org/blogs/message-state#implementation" class="hash-link" aria-label="Direct link to Implementation" title="Direct link to Implementation" translate="no"></a></h2>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="structures">Structures<a href="https://iggy.apache.org/blogs/message-state#structures" class="hash-link" aria-label="Direct link to Structures" title="Direct link to Structures" translate="no"></a></h3>
+<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 request the m [...]
+<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) [...]
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="json-transport">JSON transport<a href="https://iggy.apache.org/blogs/message-state#json-transport" class="hash-link" aria-label="Direct link to JSON transport" title="Direct link to JSON transport" translate="no"></a></h3>
+<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>
+<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token p [...]
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="binary-transport">Binary transport<a href="https://iggy.apache.org/blogs/message-state#binary-transport" class="hash-link" aria-label="Direct link to Binary transport" title="Direct link to Binary transport" translate="no"></a></h3>
+<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>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<p>And the serialization was:</p>
+<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Offset (8 bytes) + Timestamp (8 bytes) + ID (16 bytes) + Headers (N bytes) + Length (4 byte [...]
+<p>Now, the <code>message</code> looks like this:</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<p>And the serialization has changed to:</p>
+<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Offset (8 bytes) + State (1 byte) + Timestamp (8 bytes) + ID (16 bytes) + Checksum (4 bytes [...]
+<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>]]></content>
+ <author>
+ <name>Piotr Gankiewicz</name>
+ <uri>https://github.com/spetz</uri>
+ </author>
+ <category label="new-features" term="new-features"/>
+ <category label="message-state" term="message-state"/>
+ <category label="message-checksum" term="message-checksum"/>
+ </entry>
+ <entry>
+ <title type="html"><![CDATA[Message headers]]></title>
+ <id>https://iggy.apache.org/blogs/message-headers</id>
+ <link href="https://iggy.apache.org/blogs/message-headers"/>
+ <updated>2023-08-19T00:00:00.000Z</updated>
+ <summary type="html"><![CDATA[The optional message headers which you can think of as an additional metadata for your messages have been recently implemented, Let's discover what these headers are, how to use them and more importantly, how to implement them in your own transport.]]></summary>
+ <content type="html"><![CDATA[<p>The optional message headers which you can think of as an additional metadata for your messages have been recently implemented, Let's discover what these headers are, how to use them and more importantly, how to implement them in your own transport.</p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="breaking-changes">Breaking changes<a href="https://iggy.apache.org/blogs/message-headers#breaking-changes" class="hash-link" aria-label="Direct link to Breaking changes" title="Direct link to Breaking changes" translate="no"></a></h2>
+<p>The first draft of the message headers implementation starts with the initial commit <a href="https://github.com/apache/iggy/commit/bc1d0b369a268783bd329436aba3f6920aae478e" target="_blank" rel="noopener noreferrer" class="">#bc1d0b3</a>. The breaking change to the streaming server has been introduced in the commit <a href="https://github.com/apache/iggy/commit/7c73bd3d9d59fb685cbaaca5901dec6cac43ddaf" target="_blank" rel="noopener noreferrer" class="">#7c73bd3</a> - up until this poi [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="introduction">Introduction<a href="https://iggy.apache.org/blogs/message-headers#introduction" class="hash-link" aria-label="Direct link to Introduction" title="Direct link to Introduction" translate="no"></a></h2>
+<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/core/examples/src/message-headers" target="_blank" rel="noopener noreferrer" class="">here</a>.</p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="implementation">Implementation<a href="https://iggy.apache.org/blogs/message-headers#implementation" class="hash-link" aria-label="Direct link to Implementation" title="Direct link to Implementation" translate="no"></a></h2>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="structures">Structures<a href="https://iggy.apache.org/blogs/message-headers#structures" class="hash-link" aria-label="Direct link to Structures" title="Direct link to Structures" translate="no"></a></h3>
+<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>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<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>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="json-transport">JSON transport<a href="https://iggy.apache.org/blogs/message-headers#json-transport" class="hash-link" aria-label="Direct link to JSON transport" title="Direct link to JSON transport" translate="no"></a></h3>
+<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>
+<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class [...]
+<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="anchor anchorTargetStickyNavbar_Vzrq" id="binary-transport">Binary transport<a href="https://iggy.apache.org/blogs/message-headers#binary-transport" class="hash-link" aria-label="Direct link to Binary transport" title="Direct link to Binary transport" translate="no"></a></h3>
+<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>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">impl</span><span class="token plain"> </span><span class="token cla [...]
+<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>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">impl</span><span class="token plain"> </span><span class="token cla [...]
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="sending-the-messages-with-headers">Sending the messages with headers<a href="https://iggy.apache.org/blogs/message-headers#sending-the-messages-with-headers" class="hash-link" aria-label="Direct link to Sending the messages with headers" title="Direct link to Sending the messages with headers" translate="no"></a></h3>
+<p>Now, let's see how we can include the headers in a message serialization:</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">fn</span><span class="token plain"> </span><span class="token funct [...]
+<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 headers [...]
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="polling-the-messages-with-headers">Polling the messages with headers<a href="https://iggy.apache.org/blogs/message-headers#polling-the-messages-with-headers" class="hash-link" aria-label="Direct link to Polling the messages with headers" title="Direct link to Polling the messages with headers" translate="no"></a></h3>
+<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>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<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="anchor anchorTargetStickyNavbar_Vzrq" id="sample-usage">Sample usage<a href="https://iggy.apache.org/blogs/message-headers#sample-usage" class="hash-link" aria-label="Direct link to Sample usage" title="Direct link to Sample usage" translate="no"></a></h3>
+<p>The headers usage is pretty straightforward, as we simply need to create the new <code>HashMap</code>:</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> </span><span class="token keyw [...]
+<p>You might also use the conversion based on the implemented traits:</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">headers</span><span class="token punctuation" style="color:#393A34">.</span><span class="to [...]
+<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>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> send_messages </span><span cla [...]
+<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>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> value1 </span><span class="tok [...]
+ <author>
+ <name>Piotr Gankiewicz</name>
+ <uri>https://github.com/spetz</uri>
+ </author>
+ <category label="new-features" term="new-features"/>
+ <category label="message-headers" term="message-headers"/>
+ <category label="breaking-changes" term="breaking-changes"/>
+ </entry>
+ <entry>
+ <title type="html"><![CDATA[Welcome to the changelog]]></title>
+ <id>https://iggy.apache.org/blogs/welcome-to-the-changelog</id>
+ <link href="https://iggy.apache.org/blogs/welcome-to-the-changelog"/>
+ <updated>2023-08-16T00:00:00.000Z</updated>
+ <summary type="html"><![CDATA[Welcome to the changelog, in which you will read about all the changes that we make to the project.]]></summary>
+ <content type="html"><![CDATA[<p>Welcome to the changelog, in which you will read about all the changes that we make to the project.</p>
+<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>]]></content>
+ <author>
+ <name>Piotr Gankiewicz</name>
+ <uri>https://github.com/spetz</uri>
+ </author>
+ <category label="hello" term="hello"/>
+ </entry>
+</feed>
\ No newline at end of file
diff --git a/blogs/atom.xsl b/blogs/atom.xsl
new file mode 100644
index 00000000..b4b2d961
--- /dev/null
+++ b/blogs/atom.xsl
@@ -0,0 +1,92 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<xsl:stylesheet
+ version="3.0"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:atom="http://www.w3.org/2005/Atom">
+ <xsl:output method="html" version="1.0" encoding="UTF-8" indent="yes" />
+
+ <xsl:template match="/">
+ <html xmlns="http://www.w3.org/1999/xhtml" lang="en">
+ <head>
+ <title>Atom Feed | <xsl:value-of
+ select="atom:feed/atom:title"
+ /></title>
+ <link rel="stylesheet" href="atom.css" />
+ </head>
+ <body>
+ <main>
+ <div class="description">
+ <div class="info">
+ <strong>This is an Atom feed</strong>. Subscribe by copying the URL
+ from the address bar into your newsreader. Visit
+ <a href="https://aboutfeeds.com/">About Feeds</a> to learn more
+ and get started. It’s free.
+ </div>
+ <h1>
+ <div class="rss-icon">
+ <svg
+ version="1.1"
+ id="Capa_1"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ viewBox="0 0 455.731 455.731"
+ xml:space="preserve">
+ <g>
+ <rect
+ x="0"
+ y="0"
+ style="fill: #f78422"
+ width="455.731"
+ height="455.731"
+ />
+ <g>
+ <path
+ style="fill: #ffffff"
+ d="M296.208,159.16C234.445,97.397,152.266,63.382,64.81,63.382v64.348
+ c70.268,0,136.288,27.321,185.898,76.931c49.609,49.61,76.931,115.63,76.931,185.898h64.348
+ C391.986,303.103,357.971,220.923,296.208,159.16z"
+ />
+ <path
+ style="fill: #ffffff"
+ d="M64.143,172.273v64.348c84.881,0,153.938,69.056,153.938,153.939h64.348
+ C282.429,270.196,184.507,172.273,64.143,172.273z"
+ />
+ <circle
+ style="fill: #ffffff"
+ cx="109.833"
+ cy="346.26"
+ r="46.088"
+ />
+ </g>
+ </g>
+ </svg>
+ </div>
+ <xsl:value-of select="atom:feed/atom:title" />
+ </h1>
+ <p class="blog-description">
+ <xsl:value-of select="atom:feed/atom:subtitle" />
+ </p>
+ </div>
+ <h2>Recent Posts</h2>
+ <div class="blog-posts">
+ <xsl:for-each select="atom:feed/atom:entry">
+ <div class="blog-post">
+ <h3><a href="{atom:link/@href}"><xsl:value-of
+ select="atom:title"
+ /></a></h3>
+ <div class="blog-post-date">
+ Published on <xsl:value-of
+ select="substring(atom:updated,0,11)"
+ />
+ </div>
+ <div class="blog-post-description">
+ <xsl:value-of select="atom:summary" />
+ </div>
+ </div>
+ </xsl:for-each>
+ </div>
+ </main>
+ </body>
+ </html>
+ </xsl:template>
+</xsl:stylesheet>
diff --git a/blogs/authors/index.html b/blogs/authors/index.html
new file mode 100644
index 00000000..831f6164
--- /dev/null
+++ b/blogs/authors/index.html
@@ -0,0 +1,28 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="blog-wrapper blog-authors-list-page plugin-blog plugin-id-default" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">Authors | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" property=" [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed">
+
+
+
+
+
+<link rel="preconnect" href="https://analytics.apache.org/">
+<script>var _paq=window._paq=window._paq||[];_paq.push(["setRequestMethod","POST"]),_paq.push(["trackPageView"]),_paq.push(["enableLinkTracking"]),_paq.push(["enableHeartBeatTimer"]),function(){var e="https://analytics.apache.org/";_paq.push(["setRequestMethod","POST"]),_paq.push(["setTrackerUrl",e+"matomo.php"]),_paq.push(["setSiteId","80"]);var a=document,t=a.createElement("script"),p=a.getElementsByTagName("script")[0];t.type="text/javascript",t.async=!0,t.src=e+"matomo.js",p.parentNo [...]
+<script src="/assets/js/runtime~main.0a940c88.js" defer="defer"></script>
+<script src="/assets/js/main.4a006c5e.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/img/apache-iggy0.5x.png"><link rel="preload" as="image" [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/blogs/consumer-identifier/index.html b/blogs/consumer-identifier/index.html
new file mode 100644
index 00000000..35fe9c05
--- /dev/null
+++ b/blogs/consumer-identifier/index.html
@@ -0,0 +1,41 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="blog-wrapper blog-post-page plugin-blog plugin-id-default" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">Consumer identifier | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed">
+
+
+
+
+
+<link rel="preconnect" href="https://analytics.apache.org/">
+<script>var _paq=window._paq=window._paq||[];_paq.push(["setRequestMethod","POST"]),_paq.push(["trackPageView"]),_paq.push(["enableLinkTracking"]),_paq.push(["enableHeartBeatTimer"]),function(){var e="https://analytics.apache.org/";_paq.push(["setRequestMethod","POST"]),_paq.push(["setTrackerUrl",e+"matomo.php"]),_paq.push(["setSiteId","80"]);var a=document,t=a.createElement("script"),p=a.getElementsByTagName("script")[0];t.type="text/javascript",t.async=!0,t.src=e+"matomo.js",p.parentNo [...]
+<script src="/assets/js/runtime~main.0a940c88.js" defer="defer"></script>
+<script src="/assets/js/main.4a006c5e.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/img/apache-iggy0.5x.png"><link rel="preload" as="image" [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="breaking-changes">Breaking changes<a href="#breaking-changes" class="hash-link" aria-label="Direct link to Breaking changes" title="Direct link to Breaking changes" translate="no"></a></h2>
+<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" target="_blank" rel="noopener noreferrer" class="">#655f9b6</a>.</p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="consumer-identifier">Consumer identifier<a href="#consumer-identifier" class="hash-link" aria-label="Direct link to Consumer identifier" title="Direct link to Consumer identifier" translate="no"></a></h2>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<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="anchor anchorTargetStickyNavbar_Vzrq" id="consumer-groups">Consumer groups<a href="#consumer-groups" class="hash-link" aria-label="Direct link to Consumer groups" title="Direct link to Consumer groups" translate="no"></a></h2>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<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>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<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>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<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="docusaurus-mt-lg"><div class="row margin-top--sm theme-blog-footer-edit-meta-row"><div class="col"><b>Tags:</b><ul class="tags_jXut padding--none margin-left--sm"><li class="tag_QGVx"><a rel="tag" class="tag_zVej tagRegular_sFm0" href="/blogs/tags [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/blogs/iggy-0-1-0-release/index.html b/blogs/iggy-0-1-0-release/index.html
new file mode 100644
index 00000000..f6a2846f
--- /dev/null
+++ b/blogs/iggy-0-1-0-release/index.html
@@ -0,0 +1,43 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="blog-wrapper blog-post-page plugin-blog plugin-id-default" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">Iggy 0.1.0 release | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed">
+
+
+
+
+
+<link rel="preconnect" href="https://analytics.apache.org/">
+<script>var _paq=window._paq=window._paq||[];_paq.push(["setRequestMethod","POST"]),_paq.push(["trackPageView"]),_paq.push(["enableLinkTracking"]),_paq.push(["enableHeartBeatTimer"]),function(){var e="https://analytics.apache.org/";_paq.push(["setRequestMethod","POST"]),_paq.push(["setTrackerUrl",e+"matomo.php"]),_paq.push(["setSiteId","80"]);var a=document,t=a.createElement("script"),p=a.getElementsByTagName("script")[0];t.type="text/javascript",t.async=!0,t.src=e+"matomo.js",p.parentNo [...]
+<script src="/assets/js/runtime~main.0a940c88.js" defer="defer"></script>
+<script src="/assets/js/main.4a006c5e.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/img/apache-iggy0.5x.png"><link rel="preload" as="image" [...]
+<p><img decoding="async" loading="lazy" alt="0.1.0" src="/assets/images/iggy_0_1_0-c635523620b5dc0af17545d1c3ce3edd.jpg" width="1000" height="500" class="img_ev3q"></p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="release-notes">Release notes<a href="#release-notes" class="hash-link" aria-label="Direct link to Release notes" title="Direct link to Release notes" translate="no"></a></h2>
+<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 decoding="async" loading="lazy" alt="CI" src="/assets/images/iggy_server_0_1_0-7d957a6db68439149d9c805432318296.jpeg" width="4092" height="1664" class="img_ev3q"></p>
+<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 decoding="async" loading="lazy" alt="CI" src="/assets/images/iggy_ci_0_1_0-b31e9445de207c06bd2eee74dafac357.jpeg" width="3598" height="1248" class="img_ev3q"></p>
+<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 decoding="async" loading="lazy" alt="Bench" src="/assets/images/iggy_bench_0_1_0-afcc4cf7770ab3863afbdd2a7871492b.jpeg" width="4068" height="2138" class="img_ev3q"></p>
+<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 decoding="async" loading="lazy" alt="CLI" src="/assets/images/iggy_cli_0_1_0-aa8dbc85bd46875427ae87e133ec8482.jpeg" width="2942" height="2164" class="img_ev3q"></p>
+<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 decoding="async" loading="lazy" alt="Web UI" src="/assets/images/iggy_web_ui_0_1_0-58fc54e40a2756eba04dec9206de70a5.jpeg" width="4060" height="2408" class="img_ev3q"></p>
+<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" target="_blank" rel="noopener noreferrer" class="">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="docusaurus-mt-lg"><div class="row margin-top--sm theme-blog-footer-edit-meta-row"><div class="col"><b>Tags:</b><ul class="tags_jXut padding--none margin-left--sm"><li class="tag_QGVx"><a rel="tag" class="tag_zVej tagRegular_sFm0" href="/blog [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/blogs/index.html b/blogs/index.html
new file mode 100644
index 00000000..cc36cbb6
--- /dev/null
+++ b/blogs/index.html
@@ -0,0 +1,42 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="blog-wrapper blog-list-page plugin-blog plugin-id-default" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">Blogs | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" property="og [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed">
+
+
+
+
+
+<link rel="preconnect" href="https://analytics.apache.org/">
+<script>var _paq=window._paq=window._paq||[];_paq.push(["setRequestMethod","POST"]),_paq.push(["trackPageView"]),_paq.push(["enableLinkTracking"]),_paq.push(["enableHeartBeatTimer"]),function(){var e="https://analytics.apache.org/";_paq.push(["setRequestMethod","POST"]),_paq.push(["setTrackerUrl",e+"matomo.php"]),_paq.push(["setSiteId","80"]);var a=document,t=a.createElement("script"),p=a.getElementsByTagName("script")[0];t.type="text/javascript",t.async=!0,t.src=e+"matomo.js",p.parentNo [...]
+<script src="/assets/js/runtime~main.0a940c88.js" defer="defer"></script>
+<script src="/assets/js/main.4a006c5e.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/img/apache-iggy0.5x.png"><link rel="preload" as="image" [...]
+<p>Four months after <a href="https://iggy.apache.org/blogs/2025/08/10/release-0.5.0/" target="_blank" rel="noopener noreferrer" class="">0.5.0</a>, we're excited to release <strong><a href="https://github.com/apache/iggy/releases/tag/server-0.6.0" target="_blank" rel="noopener noreferrer" class="">Apache Iggy 0.6.0</a></strong> — our biggest architectural change yet.</p>
+<p>This release represents a <strong>major architectural evolution</strong> of Apache Iggy with substantial performance improvements, new connectors, and SDK enhancements.</p></div><footer class="row docusaurus-mt-lg"><div class="col col--9"><b>Tags:</b><ul class="tags_jXut padding--none margin-left--sm"><li class="tag_QGVx"><a rel="tag" class="tag_zVej tagRegular_sFm0" href="/blogs/tags/release">release</a></li><li class="tag_QGVx"><a rel="tag" class="tag_zVej tagRegular_sFm0" href="/bl [...]
+<p>In our <a href="https://iggy.apache.org/blogs/2025/08/10/release-0.5.0" target="_blank" rel="noopener noreferrer" class="">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</ [...]
+<p>It’s been four months since our last <a href="https://github.com/apache/iggy/releases/tag/server-0.4.300" target="_blank" rel="noopener noreferrer" class="">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" target="_blank" rel="noopener noreferrer" class="">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></div><footer class="row docusaurus-mt-lg"><div class="col col--9"><b>Tags:</b><ul class="tags_jXut padding--none margin-left--sm"><li class="tag_QGVx"><a rel="tag" class="tag_zVej tagRegular_sFm0" href="/blogs/tags/release">release</a></li><li class="tag_QGVx"><a rel="tag" class="tag_zVej tagRegular_sFm0" href="/blogs/tags/0-5-0">0.5. [...]
+<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></div><footer class="row docusaurus-mt-lg"><div class="col text--right"><a a [...]
+<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" target="_blank" rel="noopener noreferrer" class="">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" target="_blank" rel="noopener noreferrer" class="">finally merged it</a></strong>. In this blog post, we will share our path to implementing it.</p></div><footer class="row docusaurus-mt-lg"><div class="col text--right"><a aria-label="Read more about Zero-copy (de)serial [...]
+<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></div><footer class="row docusaurus-mt-lg"><div class="col text--right"><a aria-label="Read more about Transparent Benchmarking with Apache Iggy" href="/blogs/2025/02/ [...]
+<p>Quite recently (a few days ago), <a href="https://github.com/apache/iggy" target="_blank" rel="noopener noreferrer" class="">Iggy</a> has been listed on <a href="https://www.thoughtworks.com/radar/platforms/summary/iggy" target="_blank" rel="noopener noreferrer" class="">Technology Radar</a> by <a href="https://www.thoughtworks.com/" target="_blank" rel="noopener noreferrer" class="">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></div><footer class="row docusaurus-mt-lg"><div class="col text--right"><a ari [...]
+<p><strong>It's been a little over a year</strong>, since the <a href="https://iggy.rs" target="_blank" rel="noopener noreferrer" class="">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/" t [...]
+<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" target="_blank" rel="noopener noreferrer" class="">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 (m [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/blogs/message-expiry/index.html b/blogs/message-expiry/index.html
new file mode 100644
index 00000000..0340599a
--- /dev/null
+++ b/blogs/message-expiry/index.html
@@ -0,0 +1,53 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="blog-wrapper blog-post-page plugin-blog plugin-id-default" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">Message expiry | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" pro [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed">
+
+
+
+
+
+<link rel="preconnect" href="https://analytics.apache.org/">
+<script>var _paq=window._paq=window._paq||[];_paq.push(["setRequestMethod","POST"]),_paq.push(["trackPageView"]),_paq.push(["enableLinkTracking"]),_paq.push(["enableHeartBeatTimer"]),function(){var e="https://analytics.apache.org/";_paq.push(["setRequestMethod","POST"]),_paq.push(["setTrackerUrl",e+"matomo.php"]),_paq.push(["setSiteId","80"]);var a=document,t=a.createElement("script"),p=a.getElementsByTagName("script")[0];t.type="text/javascript",t.async=!0,t.src=e+"matomo.js",p.parentNo [...]
+<script src="/assets/js/runtime~main.0a940c88.js" defer="defer"></script>
+<script src="/assets/js/main.4a006c5e.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/img/apache-iggy0.5x.png"><link rel="preload" as="image" [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="breaking-changes">Breaking changes<a href="#breaking-changes" class="hash-link" aria-label="Direct link to Breaking changes" title="Direct link to Breaking changes" translate="no"></a></h2>
+<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" target="_blank" rel="noopener noreferrer" class="">#ea3bf9c</a>. The available <a href="https://crates.io/crates/iggy" tar [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="introduction">Introduction<a href="#introduction" class="hash-link" aria-label="Direct link to Introduction" title="Direct link to Introduction" translate="no"></a></h2>
+<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="anchor anchorTargetStickyNavbar_Vzrq" id="configuration">Configuration<a href="#configuration" class="hash-link" aria-label="Direct link to Configuration" title="Direct link to Configuration" translate="no"></a></h2>
+<div class="language-toml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-toml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">[</span><span class="token table class-name">message_cleaner</s [...]
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="message-cleaner">Message cleaner<a href="#message-cleaner" class="hash-link" aria-label="Direct link to Message cleaner" title="Direct link to Message cleaner" translate="no"></a></h3>
+<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="anchor anchorTargetStickyNavbar_Vzrq" id="segment">Segment<a href="#segment" class="hash-link" aria-label="Direct link to Segment" title="Direct link to Segment" translate="no"></a></h3>
+<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="anchor anchorTargetStickyNavbar_Vzrq" id="commands">Commands<a href="#commands" class="hash-link" aria-label="Direct link to Commands" title="Direct link to Commands" translate="no"></a></h2>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<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>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">fn</span><span class="token plain"> </span><span class="token funct [...]
+<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>
+<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Topic ID (4 bytes) + Partitions count (4 bytes) + Message expiry (4 bytes) + Size (8 bytes) [...]
+<p>The same changes (<code>name_length</code>) apply to the <code>Stream</code> and <code>StreamDetails</code> structs.</p>
+<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Stream ID (4 bytes) + Topics count (4 bytes) + Size (8 bytes) + Messages count (8 bytes) + [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/blogs/message-headers/index.html b/blogs/message-headers/index.html
new file mode 100644
index 00000000..da4d9922
--- /dev/null
+++ b/blogs/message-headers/index.html
@@ -0,0 +1,72 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="blog-wrapper blog-post-page plugin-blog plugin-id-default" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">Message headers | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" pr [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed">
+
+
+
+
+
+<link rel="preconnect" href="https://analytics.apache.org/">
+<script>var _paq=window._paq=window._paq||[];_paq.push(["setRequestMethod","POST"]),_paq.push(["trackPageView"]),_paq.push(["enableLinkTracking"]),_paq.push(["enableHeartBeatTimer"]),function(){var e="https://analytics.apache.org/";_paq.push(["setRequestMethod","POST"]),_paq.push(["setTrackerUrl",e+"matomo.php"]),_paq.push(["setSiteId","80"]);var a=document,t=a.createElement("script"),p=a.getElementsByTagName("script")[0];t.type="text/javascript",t.async=!0,t.src=e+"matomo.js",p.parentNo [...]
+<script src="/assets/js/runtime~main.0a940c88.js" defer="defer"></script>
+<script src="/assets/js/main.4a006c5e.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/img/apache-iggy0.5x.png"><link rel="preload" as="image" [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="breaking-changes">Breaking changes<a href="#breaking-changes" class="hash-link" aria-label="Direct link to Breaking changes" title="Direct link to Breaking changes" translate="no"></a></h2>
+<p>The first draft of the message headers implementation starts with the initial commit <a href="https://github.com/apache/iggy/commit/bc1d0b369a268783bd329436aba3f6920aae478e" target="_blank" rel="noopener noreferrer" class="">#bc1d0b3</a>. The breaking change to the streaming server has been introduced in the commit <a href="https://github.com/apache/iggy/commit/7c73bd3d9d59fb685cbaaca5901dec6cac43ddaf" target="_blank" rel="noopener noreferrer" class="">#7c73bd3</a> - up until this poi [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="introduction">Introduction<a href="#introduction" class="hash-link" aria-label="Direct link to Introduction" title="Direct link to Introduction" translate="no"></a></h2>
+<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/core/examples/src/message-headers" target="_blank" rel="noopener noreferrer" class="">here</a>.</p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="implementation">Implementation<a href="#implementation" class="hash-link" aria-label="Direct link to Implementation" title="Direct link to Implementation" translate="no"></a></h2>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="structures">Structures<a href="#structures" class="hash-link" aria-label="Direct link to Structures" title="Direct link to Structures" translate="no"></a></h3>
+<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>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<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>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="json-transport">JSON transport<a href="#json-transport" class="hash-link" aria-label="Direct link to JSON transport" title="Direct link to JSON transport" translate="no"></a></h3>
+<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>
+<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class [...]
+<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="anchor anchorTargetStickyNavbar_Vzrq" id="binary-transport">Binary transport<a href="#binary-transport" class="hash-link" aria-label="Direct link to Binary transport" title="Direct link to Binary transport" translate="no"></a></h3>
+<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>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">impl</span><span class="token plain"> </span><span class="token cla [...]
+<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>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">impl</span><span class="token plain"> </span><span class="token cla [...]
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="sending-the-messages-with-headers">Sending the messages with headers<a href="#sending-the-messages-with-headers" class="hash-link" aria-label="Direct link to Sending the messages with headers" title="Direct link to Sending the messages with headers" translate="no"></a></h3>
+<p>Now, let's see how we can include the headers in a message serialization:</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">fn</span><span class="token plain"> </span><span class="token funct [...]
+<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="anchor anchorTargetStickyNavbar_Vzrq" id="polling-the-messages-with-headers">Polling the messages with headers<a href="#polling-the-messages-with-headers" class="hash-link" aria-label="Direct link to Polling the messages with headers" title="Direct link to Polling the messages with headers" translate="no"></a></h3>
+<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>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<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="anchor anchorTargetStickyNavbar_Vzrq" id="sample-usage">Sample usage<a href="#sample-usage" class="hash-link" aria-label="Direct link to Sample usage" title="Direct link to Sample usage" translate="no"></a></h3>
+<p>The headers usage is pretty straightforward, as we simply need to create the new <code>HashMap</code>:</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> </span><span class="token keyw [...]
+<p>You might also use the conversion based on the implemented traits:</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">headers</span><span class="token punctuation" style="color:#393A34">.</span><span class="to [...]
+<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>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> send_messages </span><span cla [...]
+<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>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> value1 </span><span class="tok [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/blogs/message-state/index.html b/blogs/message-state/index.html
new file mode 100644
index 00000000..14874dbc
--- /dev/null
+++ b/blogs/message-state/index.html
@@ -0,0 +1,52 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="blog-wrapper blog-post-page plugin-blog plugin-id-default" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">Message state | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" prop [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed">
+
+
+
+
+
+<link rel="preconnect" href="https://analytics.apache.org/">
+<script>var _paq=window._paq=window._paq||[];_paq.push(["setRequestMethod","POST"]),_paq.push(["trackPageView"]),_paq.push(["enableLinkTracking"]),_paq.push(["enableHeartBeatTimer"]),function(){var e="https://analytics.apache.org/";_paq.push(["setRequestMethod","POST"]),_paq.push(["setTrackerUrl",e+"matomo.php"]),_paq.push(["setSiteId","80"]);var a=document,t=a.createElement("script"),p=a.getElementsByTagName("script")[0];t.type="text/javascript",t.async=!0,t.src=e+"matomo.js",p.parentNo [...]
+<script src="/assets/js/runtime~main.0a940c88.js" defer="defer"></script>
+<script src="/assets/js/main.4a006c5e.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/img/apache-iggy0.5x.png"><link rel="preload" as="image" [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="breaking-changes">Breaking changes<a href="#breaking-changes" class="hash-link" aria-label="Direct link to Breaking changes" title="Direct link to Breaking changes" translate="no"></a></h2>
+<p>Starting with the commit <a href="https://github.com/apache/iggy/commit/b07f23db798ffcda7c39650f34547f20137ff725" target="_blank" rel="noopener noreferrer" class="">#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" target="_ [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="introduction">Introduction<a href="#introduction" class="hash-link" aria-label="Direct link to Introduction" title="Direct link to Introduction" translate="no"></a></h2>
+<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="anchor anchorTargetStickyNavbar_Vzrq" id="implementation">Implementation<a href="#implementation" class="hash-link" aria-label="Direct link to Implementation" title="Direct link to Implementation" translate="no"></a></h2>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="structures">Structures<a href="#structures" class="hash-link" aria-label="Direct link to Structures" title="Direct link to Structures" translate="no"></a></h3>
+<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) [...]
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="json-transport">JSON transport<a href="#json-transport" class="hash-link" aria-label="Direct link to JSON transport" title="Direct link to JSON transport" translate="no"></a></h3>
+<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>
+<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token p [...]
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="binary-transport">Binary transport<a href="#binary-transport" class="hash-link" aria-label="Direct link to Binary transport" title="Direct link to Binary transport" translate="no"></a></h3>
+<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>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<p>And the serialization was:</p>
+<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Offset (8 bytes) + Timestamp (8 bytes) + ID (16 bytes) + Headers (N bytes) + Length (4 byte [...]
+<p>Now, the <code>message</code> looks like this:</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<p>And the serialization has changed to:</p>
+<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Offset (8 bytes) + State (1 byte) + Timestamp (8 bytes) + ID (16 bytes) + Checksum (4 bytes [...]
+<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="docusaurus-mt-lg"><div class="row margin-top--sm theme-blog-footer-edit-meta-row"><div class="col"><b>Tags:</b><ul class="tags_jXut padding--none margin-left--sm"><li class="tag_QGVx"><a rel="tag" class="tag_zVej tagRegular_sFm0" href="/blogs/tags/new-features">new-features</ [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/blogs/page/2/index.html b/blogs/page/2/index.html
new file mode 100644
index 00000000..12dcec8b
--- /dev/null
+++ b/blogs/page/2/index.html
@@ -0,0 +1,28 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="blog-wrapper blog-list-page plugin-blog plugin-id-default" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">Blogs | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" property="og [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed">
+
+
+
+
+
+<link rel="preconnect" href="https://analytics.apache.org/">
+<script>var _paq=window._paq=window._paq||[];_paq.push(["setRequestMethod","POST"]),_paq.push(["trackPageView"]),_paq.push(["enableLinkTracking"]),_paq.push(["enableHeartBeatTimer"]),function(){var e="https://analytics.apache.org/";_paq.push(["setRequestMethod","POST"]),_paq.push(["setTrackerUrl",e+"matomo.php"]),_paq.push(["setSiteId","80"]);var a=document,t=a.createElement("script"),p=a.getElementsByTagName("script")[0];t.type="text/javascript",t.async=!0,t.src=e+"matomo.js",p.parentNo [...]
+<script src="/assets/js/runtime~main.0a940c88.js" defer="defer"></script>
+<script src="/assets/js/main.4a006c5e.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/img/apache-iggy0.5x.png"><link rel="preload" as="image" [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/blogs/personal-access-tokens/index.html b/blogs/personal-access-tokens/index.html
new file mode 100644
index 00000000..0475c438
--- /dev/null
+++ b/blogs/personal-access-tokens/index.html
@@ -0,0 +1,44 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="blog-wrapper blog-post-page plugin-blog plugin-id-default" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">Personal access tokens | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="t [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed">
+
+
+
+
+
+<link rel="preconnect" href="https://analytics.apache.org/">
+<script>var _paq=window._paq=window._paq||[];_paq.push(["setRequestMethod","POST"]),_paq.push(["trackPageView"]),_paq.push(["enableLinkTracking"]),_paq.push(["enableHeartBeatTimer"]),function(){var e="https://analytics.apache.org/";_paq.push(["setRequestMethod","POST"]),_paq.push(["setTrackerUrl",e+"matomo.php"]),_paq.push(["setSiteId","80"]);var a=document,t=a.createElement("script"),p=a.getElementsByTagName("script")[0];t.type="text/javascript",t.async=!0,t.src=e+"matomo.js",p.parentNo [...]
+<script src="/assets/js/runtime~main.0a940c88.js" defer="defer"></script>
+<script src="/assets/js/main.4a006c5e.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/img/apache-iggy0.5x.png"><link rel="preload" as="image" [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="breaking-changes">Breaking changes<a href="#breaking-changes" class="hash-link" aria-label="Direct link to Breaking changes" title="Direct link to Breaking changes" translate="no"></a></h2>
+<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" target="_blank" rel="noopener noreferrer" class="">#e74c25e</a>.</p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="personal-access-tokens">Personal access tokens<a href="#personal-access-tokens" class="hash-link" aria-label="Direct link to Personal access tokens" title="Direct link to Personal access tokens" translate="no"></a></h2>
+<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>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<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>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">async</span><span class="token plain"> </span><span class="token ke [...]
+<p>When creating the token, the server returns the <code>RawPersonalAccessToken</code> struct, which contains the string <code>token</code> value.</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<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>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<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="anchor anchorTargetStickyNavbar_Vzrq" id="configuration">Configuration<a href="#configuration" class="hash-link" aria-label="Direct link to Configuration" title="Direct link to Configuration" translate="no"></a></h2>
+<p>On the server side, you can enable the background task responsible for deleting the expired tokens.</p>
+<div class="language-toml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-toml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">[</span><span class="token table class-name">personal_access_to [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/blogs/rss.css b/blogs/rss.css
new file mode 100644
index 00000000..d2fc20b2
--- /dev/null
+++ b/blogs/rss.css
@@ -0,0 +1,75 @@
+/**
+ * Copyright (c) Facebook, Inc. and its affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+main {
+ flex: 1 0 auto;
+ width: 100%;
+ margin: 2rem auto;
+ max-width: 800px;
+ /* stylelint-disable-next-line font-family-name-quotes */
+ font-family: system-ui, -apple-system, Segoe UI, Roboto, Ubuntu, Cantarell;
+}
+
+.info {
+ display: block;
+ margin: 2rem 0;
+ padding: 1.6rem 2.4rem;
+ border: 1px solid dodgerblue;
+ border-left-width: 0.5rem;
+ border-radius: 0.4rem;
+ background-color: #edf5ff;
+}
+
+a {
+ color: #005aff;
+ text-decoration: none;
+}
+
+h1 {
+ text-wrap: balance;
+ font-size: 3.4rem;
+ font-weight: 800;
+ margin-bottom: 2rem;
+ display: flex;
+ align-items: center;
+}
+
+h1 .rss-icon {
+ height: 3.2rem;
+ width: 3.2rem;
+ margin-right: 1rem;
+}
+
+h2 {
+ font-size: 2.2rem;
+ font-weight: 700;
+ margin-bottom: 0.2rem;
+}
+
+h3 {
+ font-size: 1.8rem;
+ font-weight: 700;
+ margin-bottom: 0.1rem;
+}
+
+.blog-description {
+ font-size: 1.4rem;
+ margin-bottom: 0.6rem;
+}
+
+.blog-post-date {
+ font-size: 1rem;
+ line-height: 1.4rem;
+ font-style: italic;
+ color: #797b7e;
+}
+
+.blog-post-description {
+ font-size: 1rem;
+ line-height: 1.4rem;
+ color: #434349;
+}
diff --git a/blogs/rss.xml b/blogs/rss.xml
new file mode 100644
index 00000000..bac025d6
--- /dev/null
+++ b/blogs/rss.xml
@@ -0,0 +1,1095 @@
+<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="rss.xsl"?>
+<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
+ <channel>
+ <title>Hyper-Efficient Message Streaming at Laser Speed. Blog</title>
+ <link>https://iggy.apache.org/blogs</link>
+ <description>Hyper-Efficient Message Streaming at Laser Speed. Blog</description>
+ <lastBuildDate>Tue, 09 Dec 2025 00:00:00 GMT</lastBuildDate>
+ <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
+ <generator>https://github.com/jpmonette/feed</generator>
+ <language>en</language>
+ <item>
+ <title><![CDATA[Apache Iggy 0.6.0 Release]]></title>
+ <link>https://iggy.apache.org/blogs/2025/12/09/release-0.6.0</link>
+ <guid>https://iggy.apache.org/blogs/2025/12/09/release-0.6.0</guid>
+ <pubDate>Tue, 09 Dec 2025 00:00:00 GMT</pubDate>
+ <description><![CDATA[Release 0.6.0]]></description>
+ <content:encoded><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="release-060">Release 0.6.0<a href="https://iggy.apache.org/blogs/2025/12/09/release-0.6.0#release-060" class="hash-link" aria-label="Direct link to Release 0.6.0" title="Direct link to Release 0.6.0" translate="no"></a></h2>
+<p>Four months after <a href="https://iggy.apache.org/blogs/2025/08/10/release-0.5.0/" target="_blank" rel="noopener noreferrer" class="">0.5.0</a>, we're excited to release <strong><a href="https://github.com/apache/iggy/releases/tag/server-0.6.0" target="_blank" rel="noopener noreferrer" class="">Apache Iggy 0.6.0</a></strong> — our biggest architectural change yet.</p>
+<p>This release represents a <strong>major architectural evolution</strong> of Apache Iggy with substantial performance improvements, new connectors, and SDK enhancements.</p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="iggy-server">Iggy Server<a href="https://iggy.apache.org/blogs/2025/12/09/release-0.6.0#iggy-server" class="hash-link" aria-label="Direct link to Iggy Server" title="Direct link to Iggy Server" translate="no"></a></h2>
+<p>The most significant change in 0.6.0 is the <strong>complete server rewrite</strong> using <strong><a href="https://github.com/apache/iggy/pull/2299" target="_blank" rel="noopener noreferrer" class="">io_uring</a></strong> with a <strong>thread-per-core, shared-nothing architecture</strong>. This represents a fundamental shift from the previous Tokio-based poll model to a completion-based async runtime using <a href="https://github.com/compio-rs/compio" target="_blank" rel="noopener n [...]
+<p>Key aspects of this architectural change:</p>
+<ul>
+<li class=""><strong>Completion-based I/O</strong> - unlike poll-based models, <strong>io_uring</strong> uses completion queues where the kernel notifies when operations finish</li>
+<li class=""><strong>Thread-per-core design</strong> - each CPU core runs its own event loop with dedicated resources, eliminating cross-thread synchronization overhead</li>
+<li class=""><strong>Shared-nothing model</strong> - data is partitioned across cores to minimize contention and cache invalidation</li>
+</ul>
+<p>This delivers improved throughput, lower latency, and more predictable tail latencies (p99+) under load.</p>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="websocket-transport">WebSocket Transport<a href="https://iggy.apache.org/blogs/2025/12/09/release-0.6.0#websocket-transport" class="hash-link" aria-label="Direct link to WebSocket Transport" title="Direct link to WebSocket Transport" translate="no"></a></h3>
+<p>Along with the io_uring migration, we've decided to implement <strong>WebSocket transport</strong> as a first-class communication protocol alongside TCP, QUIC and HTTP. This enables seamless integration with web clients and environments where WebSocket is preferred. Since existing libraries are poll-based and incompatible with compio's completion model, the solution was <strong><a href="https://iggy.apache.org/blogs/2025/11/17/websocket-io-uring" target="_blank" rel="noopener noreferr [...]
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="breaking-changes">Breaking Changes<a href="https://iggy.apache.org/blogs/2025/12/09/release-0.6.0#breaking-changes" class="hash-link" aria-label="Direct link to Breaking Changes" title="Direct link to Breaking Changes" translate="no"></a></h3>
+<ul>
+<li class=""><strong>Argon2</strong> - the default password hashing algorithm is no longer using <strong>bcrypt</strong> but <strong>Argon2id</strong> for improved security and performance</li>
+<li class=""><strong>xxHash3 replaces CRC32</strong> - message checksums now use <strong>xxHash3</strong> (64 bits), and <strong>UUIDv4</strong> is used for random message IDs</li>
+<li class=""><strong>Cluster configuration restructured</strong> - <code>ClusterNode</code> now uses <code>TransportEndpoints</code> for multi-protocol communication</li>
+<li class=""><strong>Auto-generated root password</strong> - default root password is now auto-generated if not provided</li>
+</ul>
+<p>Docker images are available on <strong><a href="https://hub.docker.com/u/apache?page=1&search=iggy" target="_blank" rel="noopener noreferrer" class="">Docker Hub</a></strong>.</p>
+<hr>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="sdks">SDKs<a href="https://iggy.apache.org/blogs/2025/12/09/release-0.6.0#sdks" class="hash-link" aria-label="Direct link to SDKs" title="Direct link to SDKs" translate="no"></a></h2>
+<p>All SDKs received significant updates:</p>
+<ul>
+<li class=""><a href="https://crates.io/crates/iggy" target="_blank" rel="noopener noreferrer" class="">Rust</a> - builder pattern for client, unified TransportProtocol enum, cluster metadata support</li>
+<li class=""><a href="https://www.nuget.org/packages/Apache.Iggy/" target="_blank" rel="noopener noreferrer" class="">C#</a> - high-level IggyPublisher/IggyConsumer clients, TCP reconnection, TLS support, AES encryption</li>
+<li class=""><a href="https://mvnrepository.com/artifact/org.apache.iggy/iggy-java-sdk" target="_blank" rel="noopener noreferrer" class="">Java</a> - complete async API using Netty with CompletableFutures, TLS TCP support, fixed memory leak for sync client</li>
+<li class=""><a href="https://pypi.org/project/apache-iggy/" target="_blank" rel="noopener noreferrer" class="">Python</a> - connection string support, bytes data, typing stubs, musllinux wheels</li>
+<li class=""><a href="https://www.npmjs.com/package/apache-iggy" target="_blank" rel="noopener noreferrer" class="">Node.js (TypeScript)</a> - virtual commands (ensureStream, ensureTopic), cluster metadata, added examples</li>
+<li class=""><a href="https://pkg.go.dev/github.com/apache/iggy/foreign/go" target="_blank" rel="noopener noreferrer" class="">Go</a> - DeleteConsumerOffset, improved error handling and deserialization</li>
+</ul>
+<hr>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="connectors">Connectors<a href="https://iggy.apache.org/blogs/2025/12/09/release-0.6.0#connectors" class="hash-link" aria-label="Direct link to Connectors" title="Direct link to Connectors" translate="no"></a></h2>
+<p>New connectors expand integration options:</p>
+<ul>
+<li class=""><strong><a href="https://github.com/apache/iggy/pull/2191" target="_blank" rel="noopener noreferrer" class="">Iceberg sink</a></strong> - S3-compatible storage, REST catalogs, single destination table, and multiple-table fan-out</li>
+<li class=""><strong><a href="https://github.com/apache/iggy/pull/1872" target="_blank" rel="noopener noreferrer" class="">Elasticsearch sink and source</a></strong> - Full Elasticsearch integration with rustls TLS support</li>
+<li class=""><strong><a href="https://github.com/apache/iggy/pull/2300" target="_blank" rel="noopener noreferrer" class="">Flink processor</a></strong> - Stream processing integration with Apache Flink</li>
+</ul>
+<p>The connectors runtime also gained an extensible configuration provider system, HTTP-based config provider, TCP TLS support, and a comprehensive E2E test suite.</p>
+<p>Learn more in the <a class="" href="https://iggy.apache.org/docs/connectors/introduction">documentation</a>.</p>
+<hr>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="clustering-work-in-progress">Clustering (Work in Progress)<a href="https://iggy.apache.org/blogs/2025/12/09/release-0.6.0#clustering-work-in-progress" class="hash-link" aria-label="Direct link to Clustering (Work in Progress)" title="Direct link to Clustering (Work in Progress)" translate="no"></a></h2>
+<p>Foundation for clustering is being laid:</p>
+<ul>
+<li class=""><strong>GetClusterMetadata command</strong> - retrieve cluster topology and node status</li>
+<li class=""><strong>Leader-aware connect</strong> - SDKs can detect and connect to cluster leader</li>
+<li class=""><strong>TransportEndpoints</strong> - multi-protocol cluster communication (TCP, QUIC, HTTP, WebSocket)</li>
+<li class=""><strong>Consensus and metadata modules</strong> - foundation for cluster consensus</li>
+</ul>
+<hr>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="web-ui">Web UI<a href="https://iggy.apache.org/blogs/2025/12/09/release-0.6.0#web-ui" class="hash-link" aria-label="Direct link to Web UI" title="Direct link to Web UI" translate="no"></a></h2>
+<ul>
+<li class="">Autocomplete functionality</li>
+<li class="">Fixed large number (u64/u128) rendering</li>
+<li class="">Enhanced keyboard navigation</li>
+<li class="">Security improvements (removed password persistence)</li>
+<li class="">Fixed create stream/topic commands</li>
+</ul>
+<hr>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="helm-charts">Helm Charts<a href="https://iggy.apache.org/blogs/2025/12/09/release-0.6.0#helm-charts" class="hash-link" aria-label="Direct link to Helm Charts" title="Direct link to Helm Charts" translate="no"></a></h2>
+<p>Server and UI combined into a <strong><a href="https://github.com/apache/iggy/pull/2185" target="_blank" rel="noopener noreferrer" class="">unified Helm chart</a></strong> with environment variable support and improved Kubernetes compatibility.</p>
+<hr>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-next">What's Next<a href="https://iggy.apache.org/blogs/2025/12/09/release-0.6.0#whats-next" class="hash-link" aria-label="Direct link to What's Next" title="Direct link to What's Next" translate="no"></a></h2>
+<p>Our primary focus is <strong>clustering with <a href="https://pmg.csail.mit.edu/papers/vr-revisited.pdf" target="_blank" rel="noopener noreferrer" class="">Viewstamped Replication (VSR)</a></strong> consensus protocol. This will enable fault-tolerant, replicated deployments — a critical milestone for production workloads requiring high availability and reliability.</p>
+<p>Other upcoming efforts:</p>
+<ul>
+<li class="">Server's core optimizataions such as kTLS, DirectIO, NUMA, TCP connections transfer across shards and more</li>
+<li class="">Expanding SDKs with synchronous clients and <a href="https://www.firezone.dev/blog/sans-io" target="_blank" rel="noopener noreferrer" class="">sans-io</a> design</li>
+<li class="">Enhancing the Connectors Runtime with more integrations</li>
+<li class="">Exploring <strong>Agentic AI</strong> use cases for streaming-based agent coordination</li>
+<li class="">Web UI improvements</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" target="_blank" rel="noopener noreferrer" class="">Discord</a> and help shape the future of the project!</strong></p>]]></content:encoded>
+ <category>release</category>
+ <category>0.6.0</category>
+ <category>announcement</category>
+ </item>
+ <item>
+ <title><![CDATA[Building WebSocket Protocol in Apache Iggy using io_uring and Completion Based I/O Architecture]]></title>
+ <link>https://iggy.apache.org/blogs/2025/11/17/websocket-io-uring</link>
+ <guid>https://iggy.apache.org/blogs/2025/11/17/websocket-io-uring</guid>
+ <pubDate>Mon, 17 Nov 2025 00:00:00 GMT</pubDate>
+ <description><![CDATA[Introduction]]></description>
+ <content:encoded><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="introduction">Introduction<a href="https://iggy.apache.org/blogs/2025/11/17/websocket-io-uring#introduction" class="hash-link" aria-label="Direct link to Introduction" title="Direct link to Introduction" translate="no"></a></h2>
+<p>In our <a href="https://iggy.apache.org/blogs/2025/08/10/release-0.5.0" target="_blank" rel="noopener noreferrer" class="">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" target="_blank" rel="noopener noreferrer" class="">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" target="_blank" rel="noopener noreferrer" class="">tungstenite</a> and <a href="https://github.com/snapview/tokio-tungstenite" target="_blank" rel="noopener noreferrer" class="">tokio-tungstenite</a> but they are made wh [...]
+<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" target="_blank" rel="noopener noreferrer" class="">contributing</a> to <code>compio</code>.</p>
+<hr>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="understanding-the-architectural-divide-poll-vs-completion">Understanding the architectural divide (poll vs completion)<a href="https://iggy.apache.org/blogs/2025/11/17/websocket-io-uring#understanding-the-architectural-divide-poll-vs-completion" class="hash-link" aria-label="Direct link to Understanding the architectural divide (poll vs completion)" title="Direct link to Understanding the architectural divide (poll vs completion)" tran [...]
+<p>Let's see why poll-based libraries can't easily work with completion based runtimes by examining the traits of compio, tungstenite.</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// The Rust std::io::Read trait (what tungstenite [...]
+<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>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// Tungstenite's WebSocket structure</span><span [...]
+<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 class="">Works with compio's owned-buffer async I/O</li>
+<li class="">Presents synchronous Read/Write traits to tungstenite</li>
+<li class="">Efficiently bridges sync and async world</li>
+</ul>
+<hr>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="challenge-with-tungstenite">Challenge with Tungstenite<a href="https://iggy.apache.org/blogs/2025/11/17/websocket-io-uring#challenge-with-tungstenite" class="hash-link" aria-label="Direct link to Challenge with Tungstenite" title="Direct link to Challenge with Tungstenite" translate="no"></a></h2>
+<p>Tungstenite is the de-facto Rust WebSocket protocol implementation. It handles all the WebSocket protocol logic:</p>
+<ul>
+<li class="">Frame parsing and generation</li>
+<li class="">Message fragmentation</li>
+<li class="">Control frames (ping, pong, close)</li>
+<li class="">Protocol violations and error handling</li>
+<li class="">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>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// Compio's async read - can't be made into a pol [...]
+<p>These are fundamentally different programming models that don't compose cleanly.</p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="decision-a-separate-crate">Decision: A separate crate<a href="https://iggy.apache.org/blogs/2025/11/17/websocket-io-uring#decision-a-separate-crate" class="hash-link" aria-label="Direct link to Decision: A separate crate" title="Direct link to Decision: A separate crate" translate="no"></a></h2>
+<p>After realizing the incompatibility, we've decided to create <code>compio-ws</code> as a standalone crate. The architecture would be:</p>
+<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain"> ┌────────────────────────────┐</span><br></span><span class [...]
+<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="anchor anchorTargetStickyNavbar_Vzrq" id="first-attempt-syncstream">First Attempt: <code>SyncStream</code><a href="https://iggy.apache.org/blogs/2025/11/17/websocket-io-uring#first-attempt-syncstream" class="hash-link" aria-label="Direct link to first-attempt-syncstream" title="Direct link to first-attempt-syncstream" translate="no"></a></h2>
+<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>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<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>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">impl</span><span class="token operator" style="color:#393A34"><< [...]
+<p>Writing (sync to async):</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">impl</span><span class="token operator" style="color:#393A34"><< [...]
+<p>The pattern is:</p>
+<ul>
+<li class="">Sync <code>read()</code>/<code>write()</code> operate on internal buffers</li>
+<li class="">Return <code>WouldBlock</code> when buffer is empty/full</li>
+<li class="">Call async <code>fill_read_buf()</code>/<code>flush_write_buf()</code> to service buffers</li>
+<li class="">Retry the sync operation</li>
+</ul>
+<p>This allows tungstenite to work with compio streams:</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> stream </span><span class="tok [...]
+<hr>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-problem-with-fixed-buffer-size-in-syncstream">The problem with fixed buffer size in <code>SyncStream</code><a href="https://iggy.apache.org/blogs/2025/11/17/websocket-io-uring#the-problem-with-fixed-buffer-size-in-syncstream" class="hash-link" aria-label="Direct link to the-problem-with-fixed-buffer-size-in-syncstream" title="Direct link to the-problem-with-fixed-buffer-size-in-syncstream" translate="no"></a></h2>
+<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>
+<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Message: 16MB</span><br></span><span class="token-line" style="color:#393A34"><span class=" [...]
+<p>The measurements were bad:</p>
+<ul>
+<li class="">Time: Over 100 seconds to send 16MB</li>
+<li class="">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 class="">Saving state in tungstenite</li>
+<li class="">Suspending the sync call</li>
+<li class="">Executing async flush</li>
+<li class="">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="anchor anchorTargetStickyNavbar_Vzrq" id="the-solution-growablesyncstream">The Solution: <code>GrowableSyncStream</code><a href="https://iggy.apache.org/blogs/2025/11/17/websocket-io-uring#the-solution-growablesyncstream" class="hash-link" aria-label="Direct link to the-solution-growablesyncstream" title="Direct link to the-solution-growablesyncstream" translate="no"></a></h2>
+<p>Design goals:</p>
+<ul>
+<li class="">Dynamic growth: Buffers start small and grow as needed</li>
+<li class="">Bounded maximum: Prevent memory exhaustion with configurable limits</li>
+<li class="">Automatic shrinking: Return to base capacity based on a threshold</li>
+<li class="">Minimal round trips: Handle large messages without constant <code>WouldBlock</code></li>
+</ul>
+<p>Architecture Overview:</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<p>Buffer growth strategy:</p>
+<ul>
+<li class="">Start with a small sized buffer (128 KB matching tungstenite default buffer size)</li>
+<li class="">Grow in predictable increments of <code>base_capacity</code> sized chunks</li>
+<li class="">Cap growth at reasonable limit (64MB default)</li>
+<li class="">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 class="">Compacts buffer when needed (moves unread data to front)</li>
+<li class="">Grows in <code>base_capacity</code> increments during <code>fill_read_buf()</code></li>
+<li class="">Shrinks back to base when all data consumed and buffer > 4× base</li>
+</ul>
+<p>Write path:</p>
+<ul>
+<li class=""><code>Vec::extend_from_slice</code> handles growth automatically up to <code>max_buffer_size</code></li>
+<li class="">Returns <code>WouldBlock</code> only when approaching max limit</li>
+<li class=""><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="anchor anchorTargetStickyNavbar_Vzrq" id="benchmarks">Benchmarks<a href="https://iggy.apache.org/blogs/2025/11/17/websocket-io-uring#benchmarks" class="hash-link" aria-label="Direct link to Benchmarks" title="Direct link to Benchmarks" translate="no"></a></h2>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="benchmark-methodology">Benchmark Methodology<a href="https://iggy.apache.org/blogs/2025/11/17/websocket-io-uring#benchmark-methodology" class="hash-link" aria-label="Direct link to Benchmark Methodology" title="Direct link to Benchmark Methodology" translate="no"></a></h3>
+<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 class=""><strong>CPU:</strong> Intel Xeon Platinum 8259CL @ 2.50GHz (Cascade Lake)</li>
+<li class=""><strong>Cores:</strong> 6 physical cores with hyperthreading (12 vCPUs total)</li>
+<li class=""><strong>Cache:</strong> 36 MB L3 cache</li>
+<li class=""><strong>Memory:</strong> 96 GB RAM</li>
+<li class=""><strong>Storage:</strong> Local NVMe SSD</li>
+</ul>
+<p>Common benchmark setting used:</p>
+<ul>
+<li class="">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 class="">Use huge pages in linux.</li>
+</ul>
+<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">sudo sysctl -w vm.swappiness=10</span><br></span><span class="token-line" style="color:#393 [...]
+<p>Workload characteristics:</p>
+<ul>
+<li class="">4 Producers (one per CPU core)</li>
+<li class="">4 Streams, 1 Topic per Stream, 1 Partition per Topic</li>
+<li class="">1000 messages per batch</li>
+<li class="">40,000 batches</li>
+<li class="">1000 bytes per message</li>
+<li class="">Total: 40M messages, 40GB of data</li>
+</ul>
+<p>We compared two scenarios:</p>
+<ul>
+<li class="">TCP: Direct TCP connection (baseline)</li>
+<li class="">WebSocket: compio-ws with GrowableSyncStream</li>
+</ul>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="results-tcp-vs-websocket">Results: TCP vs WebSocket<a href="https://iggy.apache.org/blogs/2025/11/17/websocket-io-uring#results-tcp-vs-websocket" class="hash-link" aria-label="Direct link to Results: TCP vs WebSocket" title="Direct link to Results: TCP vs WebSocket" translate="no"></a></h3>
+<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></tr><tr><td>P95</td><td style="text-align:right">2.94 ms< [...]
+<p>Benchmark graphs:</p>
+<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="tcp">TCP<a href="https://iggy.apache.org/blogs/2025/11/17/websocket-io-uring#tcp" class="hash-link" aria-label="Direct link to TCP" title="Direct link to TCP" translate="no"></a></h4>
+<p><img decoding="async" loading="lazy" alt="image" src="https://iggy.apache.org/assets/images/tcp-1234-784a4e2d38f3ad9fceaa5d15d9960f38.png" width="1600" height="1200" class="img_ev3q"></p>
+<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="websocket">WebSocket<a href="https://iggy.apache.org/blogs/2025/11/17/websocket-io-uring#websocket" class="hash-link" aria-label="Direct link to WebSocket" title="Direct link to WebSocket" translate="no"></a></h4>
+<p><img decoding="async" loading="lazy" alt="image" src="https://iggy.apache.org/assets/images/ws-1234-057d2fad76235bff8a09d63c800065e4.png" width="1600" height="1200" class="img_ev3q"></p>
+<hr>
+<p>Next we look at pinned-consumer benchmark.</p>
+<p>Workload characteristics:</p>
+<ul>
+<li class="">4 Consumers (one per CPU core)</li>
+<li class="">4 Streams, 1 Topic per Stream, 1 Partition per Topic</li>
+<li class="">1000 messages per batch</li>
+<li class="">40,000 batches</li>
+<li class="">1000 bytes per message</li>
+<li class="">Total: 40M messages, 40GB of data</li>
+</ul>
+<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></tr><tr><td>P95</td><td style="text-align:right">0.85 m [...]
+<p>Benchmark graphs:</p>
+<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="tcp-1">TCP<a href="https://iggy.apache.org/blogs/2025/11/17/websocket-io-uring#tcp-1" class="hash-link" aria-label="Direct link to TCP" title="Direct link to TCP" translate="no"></a></h4>
+<p><img decoding="async" loading="lazy" alt="image" src="https://iggy.apache.org/assets/images/pc_tcp-ad927c98e841cf0dd0647d5e45fb0a2f.png" width="1600" height="1200" class="img_ev3q"></p>
+<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="websocket-1">WebSocket<a href="https://iggy.apache.org/blogs/2025/11/17/websocket-io-uring#websocket-1" class="hash-link" aria-label="Direct link to WebSocket" title="Direct link to WebSocket" translate="no"></a></h4>
+<p><img decoding="async" loading="lazy" alt="image" src="https://iggy.apache.org/assets/images/pc_ws-08cd4047c7106ef1fa677c0e5c23ac8e.png" width="1600" height="1200" class="img_ev3q"></p>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="analysis">Analysis:<a href="https://iggy.apache.org/blogs/2025/11/17/websocket-io-uring#analysis" class="hash-link" aria-label="Direct link to Analysis:" title="Direct link to Analysis:" translate="no"></a></h3>
+<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 class="">WebSocket framing: each message needs frame headers.</li>
+<li class="">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="anchor anchorTargetStickyNavbar_Vzrq" id="future-work">Future Work<a href="https://iggy.apache.org/blogs/2025/11/17/websocket-io-uring#future-work" class="hash-link" aria-label="Direct link to Future Work" title="Direct link to Future Work" translate="no"></a></h2>
+<ol>
+<li class="">
+<p>Smarter Buffer Growth</p>
+<ul>
+<li class="">Current: Linear <code>base_capacity</code> increments</li>
+<li class="">Better: Exponential growth (like <code>Vec::reserve</code>)</li>
+<li class="">Impact: Reduce reallocation overhead for large messages</li>
+</ul>
+</li>
+<li class="">
+<p>Buffer Pooling</p>
+<ul>
+<li class="">Current: Allocate/deallocate per message</li>
+<li class="">Better: Per-core buffer pools with object reuse</li>
+<li class="">Impact: Reduce allocator pressure</li>
+</ul>
+</li>
+<li class="">
+<p>WebSocket implementation with native owned buffers</p>
+<ul>
+<li class="">Implement WebSocket protocol directly with owned buffers from scratch.</li>
+<li class="">Direct integration with compio to use io_uring capabilities.</li>
+<li class="">Could increase performance significantly.</li>
+<li class="">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" target="_blank" rel="noopener noreferrer" class="">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="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://iggy.apache.org/blogs/2025/11/17/websocket-io-uring#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no"></a></h2>
+<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 class="">Browser-based producers sending events or telemetry</li>
+<li class="">Edge devices reporting sensor data or metrics</li>
+<li class="">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 class=""><strong>Optimize</strong> <code>GrowableSyncStream</code>: Implement exponential buffer growth and pooling</li>
+<li class=""><strong>Owned buffer WS protocol implementation:</strong> Build WebSocket from scratch with owned buffers</li>
+<li class=""><strong>Push-based consumers:</strong> Help implement server-push notifications in Iggy</li>
+<li class=""><strong>Edge client libraries:</strong> Create WebSocket SDKs optimized for resource-constrained devices</li>
+</ul>]]></content:encoded>
+ <category>websocket</category>
+ <category>io_uring</category>
+ <category>async</category>
+ <category>compio</category>
+ <category>performance</category>
+ </item>
+ <item>
+ <title><![CDATA[Apache Iggy 0.5.0 Release]]></title>
+ <link>https://iggy.apache.org/blogs/2025/08/10/release-0.5.0</link>
+ <guid>https://iggy.apache.org/blogs/2025/08/10/release-0.5.0</guid>
+ <pubDate>Sun, 10 Aug 2025 00:00:00 GMT</pubDate>
+ <description><![CDATA[Release 0.5.0]]></description>
+ <content:encoded><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="release-050">Release 0.5.0<a href="https://iggy.apache.org/blogs/2025/08/10/release-0.5.0#release-050" class="hash-link" aria-label="Direct link to Release 0.5.0" title="Direct link to Release 0.5.0" translate="no"></a></h2>
+<p>It’s been four months since our last <a href="https://github.com/apache/iggy/releases/tag/server-0.4.300" target="_blank" rel="noopener noreferrer" class="">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" target="_blank" rel="noopener noreferrer" class="">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="anchor anchorTargetStickyNavbar_Vzrq" id="iggy-server">Iggy Server<a href="https://iggy.apache.org/blogs/2025/08/10/release-0.5.0#iggy-server" class="hash-link" aria-label="Direct link to Iggy Server" title="Direct link to Iggy Server" translate="no"></a></h2>
+<p>The most significant change on the server side is the introduction of <strong><a href="https://github.com/apache/iggy/pull/1679" target="_blank" rel="noopener noreferrer" class="">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" target="_blank" rel="noopener noreferrer" class="">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" target="_blank" rel="noopener noreferrer" class="">Iggy CLI</a></strong> and <strong><a href="https://github.com/apache/iggy/tree/master/web" target="_blank" rel="noopener noreferrer" class="">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" target="_blank" rel="noopener noreferrer" class="">Docker Hub</a></strong>.</p>
+<hr>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="sdks">SDKs<a href="https://iggy.apache.org/blogs/2025/08/10/release-0.5.0#sdks" class="hash-link" aria-label="Direct link to SDKs" title="Direct link to SDKs" translate="no"></a></h2>
+<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 class=""><a href="https://crates.io/crates/iggy" target="_blank" rel="noopener noreferrer" class="">Rust</a> (always up-to-date, core reference implementation)</li>
+<li class=""><a href="https://www.nuget.org/packages/Apache.Iggy/" target="_blank" rel="noopener noreferrer" class="">C#</a></li>
+<li class=""><a href="https://repository.apache.org/#nexus-search;quick~iggy" target="_blank" rel="noopener noreferrer" class="">Java</a></li>
+<li class=""><a href="https://pypi.org/project/apache-iggy/" target="_blank" rel="noopener noreferrer" class="">Python</a></li>
+<li class=""><a href="https://www.npmjs.com/package/apache-iggy" target="_blank" rel="noopener noreferrer" class="">Node.js (TypeScript)</a></li>
+<li class=""><a href="https://pkg.go.dev/github.com/apache/iggy/foreign/go" target="_blank" rel="noopener noreferrer" class="">Go</a></li>
+</ul>
+<p>C++ and Elixir clients are in progress under the <a href="https://github.com/apache/iggy/tree/master/foreign" target="_blank" rel="noopener noreferrer" class="">foreign</a> directory.</p>
+<p><strong>New in Rust SDK:</strong>
+Support for a <strong><a href="https://github.com/apache/iggy/pull/1838" target="_blank" rel="noopener noreferrer" class="">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" target="_blank" rel="noopener noreferrer" class="">here</a>.</p>
+<hr>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="benchmarks">Benchmarks<a href="https://iggy.apache.org/blogs/2025/08/10/release-0.5.0#benchmarks" class="hash-link" aria-label="Direct link to Benchmarks" title="Direct link to Benchmarks" translate="no"></a></h2>
+<p>We’ve expanded our benchmarking toolkit:</p>
+<ul>
+<li class=""><strong>Iggy Bench CLI</strong> (<code>iggy-bench</code>) — run local benchmarks with various configurations and profiles.</li>
+<li class="">JSON output and chart rendering for visual performance analysis.</li>
+<li class="">Open benchmark results published at <a href="https://benchmarks.iggy.apache.org/" target="_blank" rel="noopener noreferrer" class="">benchmarks.iggy.apache.org</a>, powered by the open source <a href="https://github.com/apache/iggy/tree/master/core/bench" target="_blank" rel="noopener noreferrer" class="">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="anchor anchorTargetStickyNavbar_Vzrq" id="connectors">Connectors<a href="https://iggy.apache.org/blogs/2025/08/10/release-0.5.0#connectors" class="hash-link" aria-label="Direct link to Connectors" title="Direct link to Connectors" translate="no"></a></h2>
+<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 class="">Ingest data into Iggy from external systems (e.g., Postgres CDC).</li>
+<li class="">Export data from Iggy to external destinations (e.g., indexing engines).</li>
+<li class="">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" target="_blank" rel="noopener noreferrer" class="">post</a> and in the <a class="" href="https://iggy.apache.org/docs/connectors/introduction">documentation</a>.</p>
+<hr>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="mcp-server">MCP Server<a href="https://iggy.apache.org/blogs/2025/08/10/release-0.5.0#mcp-server" class="hash-link" aria-label="Direct link to MCP Server" title="Direct link to MCP Server" translate="no"></a></h2>
+<p>Apache Iggy now includes support for the <strong><a href="https://modelcontextprotocol.io/" target="_blank" rel="noopener noreferrer" class="">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 class="" href="https://iggy.apache.org/docs/ai/mcp">documentation</a>.</p>
+<hr>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="versioning">Versioning<a href="https://iggy.apache.org/blogs/2025/08/10/release-0.5.0#versioning" class="hash-link" aria-label="Direct link to Versioning" title="Direct link to Versioning" translate="no"></a></h2>
+<p>Releases follow <a href="https://semver.org/" target="_blank" rel="noopener noreferrer" class="">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="anchor anchorTargetStickyNavbar_Vzrq" id="whats-next">What’s Next<a href="https://iggy.apache.org/blogs/2025/08/10/release-0.5.0#whats-next" class="hash-link" aria-label="Direct link to What’s Next" title="Direct link to What’s Next" translate="no"></a></h2>
+<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 class="">Expanding SDKs across more languages and catching up with the latest features.</li>
+<li class="">Synchronous SDK clients and <a href="https://www.firezone.dev/blog/sans-io" target="_blank" rel="noopener noreferrer" class="">sans-io</a> design.</li>
+<li class="">Benchmarking orchestrator</li>
+<li class="">Enhancing the Connectors Runtime and Web UI.</li>
+<li class="">Extending AI features around the MCP server.</li>
+<li class="">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" target="_blank" rel="noopener noreferrer" class="">Discord</a> and help shape the future of the project!</strong></p>]]></content:encoded>
+ <category>release</category>
+ <category>0.5.0</category>
+ <category>announcement</category>
+ </item>
+ <item>
+ <title><![CDATA[Connectors runtime]]></title>
+ <link>https://iggy.apache.org/blogs/2025/06/06/connectors-runtime</link>
+ <guid>https://iggy.apache.org/blogs/2025/06/06/connectors-runtime</guid>
+ <pubDate>Fri, 06 Jun 2025 00:00:00 GMT</pubDate>
+ <description><![CDATA[Extending Apache Iggy capabilities]]></description>
+ <content:encoded><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="extending-apache-iggy-capabilities">Extending Apache Iggy capabilities<a href="https://iggy.apache.org/blogs/2025/06/06/connectors-runtime#extending-apache-iggy-capabilities" class="hash-link" aria-label="Direct link to Extending Apache Iggy capabilities" title="Direct link to Extending Apache Iggy capabilities" translate="no"></a></h2>
+<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="anchor anchorTargetStickyNavbar_Vzrq" id="what-are-the-connectors">What are the connectors<a href="https://iggy.apache.org/blogs/2025/06/06/connectors-runtime#what-are-the-connectors" class="hash-link" aria-label="Direct link to What are the connectors" title="Direct link to What are the connectors" translate="no"></a></h2>
+<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" target="_blank" rel="noopener noreferrer" class="">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>
+<div class="language-toml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-toml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># Required configuration for a sink connector</sp [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="rust-based-plugins">Rust-based plugins<a href="https://iggy.apache.org/blogs/2025/06/06/connectors-runtime#rust-based-plugins" class="hash-link" aria-label="Direct link to Rust-based plugins" title="Direct link to Rust-based plugins" translate="no"></a></h2>
+<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" target="_blank" rel="noopener noreferrer" class="">dlopen2</a></strong> library to load the plugins during the runtime initialization [...]
+<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/" target="_blank" rel="noopener noreferrer" class="">Tokio runtime</a></strong> to manage the asynchronous tasks and events across all connectors, as well as the <stro [...]
+<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" target="_blank" rel="noopener noreferrer" class="">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 thousan [...]
+<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/" target="_blank" rel="noopener noreferrer" class="">repository</a></strong> or the <strong><a class="" href="https://iggy.apache.org/docs/connectors/introduction">documentation</a></strong> for more de [...]
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token attribute attr-name" style="color:#00a4db">#[async_trait]</span><span class="token plain"></span>< [...]
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token attribute attr-name" style="color:#00a4db">#[async_trait]</span><span class="token plain"></span>< [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-next">What's next?<a href="https://iggy.apache.org/blogs/2025/06/06/connectors-runtime#whats-next" class="hash-link" aria-label="Direct link to What's next?" title="Direct link to What's next?" translate="no"></a></h2>
+<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" target="_blank" rel="noopener noreferrer" class="">issue</a></strong>, <strong><a href="https://github.com/apache/iggy/pulls" target="_blank" rel="noopener noreferrer" class="">pull request</a></strong> or start a <strong><a href="https://github.com/apache/iggy/discussions" target="_blank" rel="no [...]
+<p>As always, you are more than welcome to join our <strong><a href="https://discord.gg/apache-iggy" target="_blank" rel="noopener noreferrer" class="">Discord community</a></strong>!</p>]]></content:encoded>
+ </item>
+ <item>
+ <title><![CDATA[Zero-copy (de)serialization]]></title>
+ <link>https://iggy.apache.org/blogs/2025/05/08/zero-copy-deserialization</link>
+ <guid>https://iggy.apache.org/blogs/2025/05/08/zero-copy-deserialization</guid>
+ <pubDate>Thu, 08 May 2025 00:00:00 GMT</pubDate>
+ <description><![CDATA[Introduction]]></description>
+ <content:encoded><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="introduction">Introduction<a href="https://iggy.apache.org/blogs/2025/05/08/zero-copy-deserialization#introduction" class="hash-link" aria-label="Direct link to Introduction" title="Direct link to Introduction" translate="no"></a></h2>
+<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" target="_blank" rel="noopener noreferrer" class="">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" target="_blank" rel="noopener noreferrer" class="">finally merged it</a></strong>. In this blog post, we will share our path to implementing it.</p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="zero-copy-with-rkyv">Zero copy with rkyv<a href="https://iggy.apache.org/blogs/2025/05/08/zero-copy-deserialization#zero-copy-with-rkyv" class="hash-link" aria-label="Direct link to Zero copy with rkyv" title="Direct link to Zero copy with rkyv" translate="no"></a></h2>
+<p>Our initial approach to zero copy was leveraging the existing <strong><a href="https://github.com/rkyv/rkyv" target="_blank" rel="noopener noreferrer" class="">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 [...]
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token attribute attr-name" style="color:#00a4db">#[derive(Archive, Deserialize, Serialize)]</span><span [...]
+<p>Same traits are derived for <code>IggyMessage</code></p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token attribute attr-name" style="color:#00a4db">#[derive(Archive, Deserialize, Serialize)]</span><span [...]
+<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/" target="_blank" rel="noopener noreferrer" class="">rkyv book</a></strong>, or from this <strong><a href="https://www.youtube.com/watch?v=ON4z2LbTD-4" target="_blank" rel="noopener noreferrer" class="">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>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">struct</span><span class="token plain"> </span><span class="token t [...]
+<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 decoding="async" loading="lazy" alt="image" src="https://iggy.apache.org/assets/images/iggy_batch_schema_1-61b4d896b850e3d0ee08270f7db7c6b5.png" width="1600" height="664" class="img_ev3q"></p>
+<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="anchor anchorTargetStickyNavbar_Vzrq" id="beyond-rkyv">Beyond rkyv<a href="https://iggy.apache.org/blogs/2025/05/08/zero-copy-deserialization#beyond-rkyv" class="hash-link" aria-label="Direct link to Beyond rkyv" title="Direct link to Beyond rkyv" translate="no"></a></h2>
+<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>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<p><img decoding="async" loading="lazy" alt="image" src="https://iggy.apache.org/assets/images/iggy_batch_schema_2-c7a5fc6158b838999c178ef8aea96089.png" width="1600" height="720" class="img_ev3q"></p>
+<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="anchor anchorTargetStickyNavbar_Vzrq" id="benchmarks">Benchmarks<a href="https://iggy.apache.org/blogs/2025/05/08/zero-copy-deserialization#benchmarks" class="hash-link" aria-label="Direct link to Benchmarks" title="Direct link to Benchmarks" translate="no"></a></h2>
+<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 decoding="async" loading="lazy" alt="image" src="https://iggy.apache.org/assets/images/no_zero_copy_producer-ffed3643f7efa9c5ac43a3ce4cba746c.png" width="3188" height="2264" class="img_ev3q">
+<img decoding="async" loading="lazy" alt="image" src="https://iggy.apache.org/assets/images/no_zero_copy_consumer-ae546079ca662038a43983969c9fa325.png" width="3186" height="2262" class="img_ev3q"></p>
+<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">2.39ms</td></tr><tr><td style="text-align:left">Consumer< [...]
+<p><strong>After</strong></p>
+<p><img decoding="async" loading="lazy" alt="image" src="https://iggy.apache.org/assets/images/zero_copy_producer-6cd58f250a711fb170bba9091da38606.png" width="3194" height="2260" class="img_ev3q">
+<img decoding="async" loading="lazy" alt="image" src="https://iggy.apache.org/assets/images/zero_copy_consumer-b0a3206f473d6d13c8cc4fc8dfca3486.png" width="3192" height="2266" class="img_ev3q"></p>
+<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.63ms</td></tr><tr><td style="text-align:left">Consumer</td [...]
+<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/" target="_blank" rel="noopener noreferrer" class="">benchmarking website</a></strong>.</p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="concluding">Concluding<a href="https://iggy.apache.org/blogs/2025/05/08/zero-copy-deserialization#concluding" class="hash-link" aria-label="Direct link to Concluding" title="Direct link to Concluding" translate="no"></a></h2>
+<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" target="_blank" rel="noopener noreferrer" class="">this Bl [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-next-for-iggy">What’s next for Iggy<a href="https://iggy.apache.org/blogs/2025/05/08/zero-copy-deserialization#whats-next-for-iggy" class="hash-link" aria-label="Direct link to What’s next for Iggy" title="Direct link to What’s next for Iggy" translate="no"></a></h2>
+<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/" target="_blank" rel="noopener noreferrer" class="">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 blo [...]
+<p>For now <strong><a href="https://github.com/apache/iggy/tree/io_uring_monoio_runtime" target="_blank" rel="noopener noreferrer" class="">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>]]></content:encoded>
+ </item>
+ <item>
+ <title><![CDATA[Transparent Benchmarking with Apache Iggy]]></title>
+ <link>https://iggy.apache.org/blogs/2025/02/17/transparent-benchmarks</link>
+ <guid>https://iggy.apache.org/blogs/2025/02/17/transparent-benchmarks</guid>
+ <pubDate>Mon, 17 Feb 2025 00:00:00 GMT</pubDate>
+ <description><![CDATA[Benchmarks should be the first-class citizen]]></description>
+ <content:encoded><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="benchmarks-should-be-the-first-class-citizen">Benchmarks should be the first-class citizen<a href="https://iggy.apache.org/blogs/2025/02/17/transparent-benchmarks#benchmarks-should-be-the-first-class-citizen" class="hash-link" aria-label="Direct link to Benchmarks should be the first-class citizen" title="Direct link to Benchmarks should be the first-class citizen" translate="no"></a></h2>
+<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/" target="_blank" rel="noopener noreferrer" class="">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 decoding="async" loading="lazy" alt="image" src="https://iggy.apache.org/assets/images/iggy_bench_cli-32946d97899e6925f99469dad967ca7e.png" width="2742" height="1930" class="img_ev3q"></p>
+<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="anchor anchorTargetStickyNavbar_Vzrq" id="iggy-benchmarking-dashboard">Iggy benchmarking dashboard<a href="https://iggy.apache.org/blogs/2025/02/17/transparent-benchmarks#iggy-benchmarking-dashboard" class="hash-link" aria-label="Direct link to Iggy benchmarking dashboard" title="Direct link to Iggy benchmarking dashboard" translate="no"></a></h2>
+<p><strong>And today, we're proud to present <a href="https://benchmarks.iggy.apache.org/" target="_blank" rel="noopener noreferrer" class="">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" target="_blank" rel="noopener noreferrer" class="">iggy-bench-dashboard</a> repository. In general, it's as simple as:</p>
+<ul>
+<li class="">Building the <a href="https://github.com/apache/iggy" target="_blank" rel="noopener noreferrer" class="">Iggy</a> in the release mode with <code>cargo build --release</code></li>
+<li class="">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 class="">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 class="">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 class="">Navigating to the specific benchmark directory to browse the charts and/or uploading them to the dashboard.</li>
+<li class="">And there's always <code>help</code> command e.g. <code>pinned-producer --help</code> to make your life easier :)</li>
+</ul>
+<p><img decoding="async" loading="lazy" alt="image" src="https://iggy.apache.org/assets/images/iggy_bench_dashboard-20dc5e120f14f0c4618f23227cd08ac9.png" width="2555" height="1327" class="img_ev3q"></p>
+<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="anchor anchorTargetStickyNavbar_Vzrq" id="towards-the-microsecond-latency">Towards the microsecond latency<a href="https://iggy.apache.org/blogs/2025/02/17/transparent-benchmarks#towards-the-microsecond-latency" class="hash-link" aria-label="Direct link to Towards the microsecond latency" title="Direct link to Towards the microsecond latency" translate="no"></a></h2>
+<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" target="_blank" rel="noopener noreferrer" class="">rkyv</a> - zero-copy deserialization framework, which has yielded some great results. Keep in mind that streaming the dat [...]
+<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" target="_blank" rel="noopener noreferrer" class="">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 the whole concept [...]
+ </item>
+ <item>
+ <title><![CDATA[Iggy joins the Apache Incubator]]></title>
+ <link>https://iggy.apache.org/blogs/2025/02/10/apache-incubator</link>
+ <guid>https://iggy.apache.org/blogs/2025/02/10/apache-incubator</guid>
+ <pubDate>Mon, 10 Feb 2025 00:00:00 GMT</pubDate>
+ <description><![CDATA[We are thrilled to announce that Iggy has officially joined the Apache Incubator! This marks a major milestone in our journey to redefine message streaming — one that is blazingly fast, hyper-efficient, and built for the future. Since the very first day, Iggy was always meant to be a truly FOSS project — not just open-source in name, but deeply rooted in the values of transparency, collaboration, and community-driven innovation.]]></description>
+ <content:encoded><![CDATA[<p>We are thrilled to announce that <strong>Iggy</strong> has officially joined the <strong><a href="https://incubator.apache.org/" target="_blank" rel="noopener noreferrer" class="">Apache Incubator</a></strong>! This marks a major milestone in our journey to redefine message streaming — one that is <strong>blazingly fast, hyper-efficient, and built for the future</strong>. Since the very first day, <strong>Iggy was always meant to be a truly FOSS p [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-a-journey-two-years-in-the-making">🚀 A Journey Two Years in the Making<a href="https://iggy.apache.org/blogs/2025/02/10/apache-incubator#-a-journey-two-years-in-the-making" class="hash-link" aria-label="Direct link to 🚀 A Journey Two Years in the Making" title="Direct link to 🚀 A Journey Two Years in the Making" translate="no"></a></h2>
+<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="anchor anchorTargetStickyNavbar_Vzrq" id="-beyond-just-iggy--a-growing-ecosystem">🔥 Beyond Just Iggy – A Growing Ecosystem<a href="https://iggy.apache.org/blogs/2025/02/10/apache-incubator#-beyond-just-iggy--a-growing-ecosystem" class="hash-link" aria-label="Direct link to 🔥 Beyond Just Iggy – A Growing Ecosystem" title="Direct link to 🔥 Beyond Just Iggy – A Growing Ecosystem" translate="no"></a></h2>
+<p>Iggy is no longer just about the core repository. Over time, we’ve built an entire ecosystem around it, including:</p>
+<ul>
+<li class="">✅ SDKs for seamless developer integrations</li>
+<li class="">✅ CLIs for powerful command-line control</li>
+<li class="">✅ Web UIs for intuitive management</li>
+<li class="">✅ And many more…</li>
+</ul>
+<p>We’re already approaching 20 repositories under the Iggy organization (<a href="https://github.com/iggy-rs/" target="_blank" rel="noopener noreferrer" class="">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="anchor anchorTargetStickyNavbar_Vzrq" id="-why-apache">🔗 Why Apache?<a href="https://iggy.apache.org/blogs/2025/02/10/apache-incubator#-why-apache" class="hash-link" aria-label="Direct link to 🔗 Why Apache?" title="Direct link to 🔗 Why Apache?" translate="no"></a></h2>
+<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 class=""><a href="https://cwiki.apache.org/confluence/display/INCUBATOR/Iggy+Proposal" target="_blank" rel="noopener noreferrer" class="">Official Proposal</a></li>
+<li class=""><a href="https://lists.apache.org/thread/q9whr3q9qd6wqm89f0vc1f6vkkvzc8xf" target="_blank" rel="noopener noreferrer" class="">Discussion Thread</a></li>
+<li class=""><a href="https://lists.apache.org/thread/6zfgdjwrzs92h4z4x6b25v1r23g3f5yg" target="_blank" rel="noopener noreferrer" class="">Voting Results</a></li>
+</ul>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-whats-next">📈 What’s Next?<a href="https://iggy.apache.org/blogs/2025/02/10/apache-incubator#-whats-next" class="hash-link" aria-label="Direct link to 📈 What’s Next?" title="Direct link to 📈 What’s Next?" translate="no"></a></h2>
+<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 class=""><strong>Scaling performance benchmarks</strong> to push the limits of ultra-low-latency streaming</li>
+<li class=""><strong>Expanding integrations</strong> with modern data infrastructure</li>
+<li class=""><strong>Building a vibrant developer ecosystem</strong> that makes message streaming frictionless</li>
+</ul>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-codebase-transition">🦀 Codebase transition<a href="https://iggy.apache.org/blogs/2025/02/10/apache-incubator#-codebase-transition" class="hash-link" aria-label="Direct link to 🦀 Codebase transition" title="Direct link to 🦀 Codebase transition" translate="no"></a></h2>
+<p>After the recent <a href="https://lists.apache.org/thread/zrn96nlg23r9353lr5tp2by2ggx4zxqc" target="_blank" rel="noopener noreferrer" class="">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 [...]
+<p>All the repositories under <a href="https://github.com/iggy-rs" target="_blank" rel="noopener noreferrer" class="">iggy-rs</a> will be eventually moved to the <a href="https://github.com/apache/iggy" target="_blank" rel="noopener noreferrer" class="">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/" target="_blank" rel="noopener noreferrer" class="">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="anchor anchorTargetStickyNavbar_Vzrq" id="-join-the-movement">💡 Join the Movement<a href="https://iggy.apache.org/blogs/2025/02/10/apache-incubator#-join-the-movement" class="hash-link" aria-label="Direct link to 💡 Join the Movement" title="Direct link to 💡 Join the Movement" translate="no"></a></h2>
+<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 decoding="async" loading="lazy" alt="image" src="https://iggy.apache.org/assets/images/iggy_logo-f0e83b91b22303a5545dfb6d49756d18.png" width="1800" height="1000" class="img_ev3q"></p>
+<p>👉 Follow us, contribute, and help to build the future of the message streaming!</p>
+<ul>
+<li class=""><a href="https://discord.gg/apache-iggy" target="_blank" rel="noopener noreferrer" class="">Discord</a></li>
+<li class=""><a href="https://x.com/ApacheIggy" target="_blank" rel="noopener noreferrer" class="">X (Twitter)</a></li>
+<li class=""><a href="https://bsky.app/profile/iggy.rs" target="_blank" rel="noopener noreferrer" class="">Bluesky</a></li>
+<li class=""><a href="https://www.linkedin.com/company/apache-iggy/" target="_blank" rel="noopener noreferrer" class="">LinkedIn</a></li>
+</ul>]]></content:encoded>
+ </item>
+ <item>
+ <title><![CDATA[Iggy.rs - Technology Radar & current goals]]></title>
+ <link>https://iggy.apache.org/blogs/2024/10/28/technology-radar-and-currrent-goals</link>
+ <guid>https://iggy.apache.org/blogs/2024/10/28/technology-radar-and-currrent-goals</guid>
+ <pubDate>Mon, 28 Oct 2024 00:00:00 GMT</pubDate>
+ <description><![CDATA[Technology Radar]]></description>
+ <content:encoded><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="technology-radar">Technology Radar<a href="https://iggy.apache.org/blogs/2024/10/28/technology-radar-and-currrent-goals#technology-radar" class="hash-link" aria-label="Direct link to Technology Radar" title="Direct link to Technology Radar" translate="no"></a></h2>
+<p>Quite recently (a few days ago), <a href="https://github.com/apache/iggy" target="_blank" rel="noopener noreferrer" class="">Iggy</a> has been listed on <a href="https://www.thoughtworks.com/radar/platforms/summary/iggy" target="_blank" rel="noopener noreferrer" class="">Technology Radar</a> by <a href="https://www.thoughtworks.com/" target="_blank" rel="noopener noreferrer" class="">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 decoding="async" loading="lazy" alt="image" src="https://iggy.apache.org/assets/images/iggy_technology_radar-291413e3a6d4cb1a5b7832ab5865423e.png" width="4096" height="2290" class="img_ev3q"></p>
+<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/" target="_blank" rel="noopener noreferrer" class="">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" target="_blank" rel="noopener noreferrer" class="">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/" target="_blank" rel="noopener noreferrer" class="">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="anchor anchorTargetStickyNavbar_Vzrq" id="current-goals">Current goals<a href="https://iggy.apache.org/blogs/2024/10/28/technology-radar-and-currrent-goals#current-goals" class="hash-link" aria-label="Direct link to Current goals" title="Direct link to Current goals" translate="no"></a></h2>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="replication">Replication<a href="https://iggy.apache.org/blogs/2024/10/28/technology-radar-and-currrent-goals#replication" class="hash-link" aria-label="Direct link to Replication" title="Direct link to Replication" translate="no"></a></h3>
+<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" target="_blank" rel="noopener noreferrer" class="">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://pmg.csail.mit.edu/papers/vr-revisited.pdf" target="_blank" rel="noopener noreferrer" class="">revisited form</a>), which was successfully used by e.g. <a href="https://tigerbeetle.com/" target="_blank" rel="noopener noreferrer" class="">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 decoding="async" loading="lazy" alt="image" src="https://iggy.apache.org/assets/images/iggy_vsr-3d747255ce17ecda927ccd4d258f7016.png" width="2832" height="3281" class="img_ev3q"></p>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="s3-storage">S3 storage<a href="https://iggy.apache.org/blogs/2024/10/28/technology-radar-and-currrent-goals#s3-storage" class="hash-link" aria-label="Direct link to S3 storage" title="Direct link to S3 storage" translate="no"></a></h3>
+<p>A few months ago, we did <a href="https://github.com/apache/iggy/pull/1053" target="_blank" rel="noopener noreferrer" class="">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>
+<div class="language-toml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-toml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">[</span><span class="token table class-name">data_maintenance.a [...]
+<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 if needed. You [...]
+<ul>
+<li class=""><strong>L1</strong> - data available directly from the server RAM (super fast writes/reads)</li>
+<li class=""><strong>L2</strong> - data stored on your servers disks (still very, very fast with NVME SSD gen4 or 5)</li>
+<li class=""><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/" target="_blank" rel="noopener noreferrer" class="">Quickwit</a>).</p>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="opentelemetry">OpenTelemetry<a href="https://iggy.apache.org/blogs/2024/10/28/technology-radar-and-currrent-goals#opentelemetry" class="hash-link" aria-label="Direct link to OpenTelemetry" title="Direct link to OpenTelemetry" translate="no"></a></h3>
+<p>Speaking of the Quickwit, we've also <a href="https://github.com/apache/iggy/pull/1294" target="_blank" rel="noopener noreferrer" class="">implemented</a> a support for <a href="https://opentelemetry.io/" target="_blank" rel="noopener noreferrer" class="">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 wh [...]
+<div class="language-toml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-toml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># OpenTelemetry configuration</span><span class=" [...]
+<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" target="_blank" rel="noopener noreferrer" class="">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 vi [...]
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="optimizations">Optimizations<a href="https://iggy.apache.org/blogs/2024/10/28/technology-radar-and-currrent-goals#optimizations" class="hash-link" aria-label="Direct link to Optimizations" title="Direct link to Optimizations" translate="no"></a></h3>
+<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" target="_blank" rel="noopener noreferrer" class="">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 [...]
+<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 decoding="async" loading="lazy" alt="image" src="https://iggy.apache.org/assets/images/iggy_docker-37b72ad9d9a244e1464c94f03c162193.png" width="2558" height="1375" class="img_ev3q"></p>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="io_uring">io_uring<a href="https://iggy.apache.org/blogs/2024/10/28/technology-radar-and-currrent-goals#io_uring" class="hash-link" aria-label="Direct link to io_uring" title="Direct link to io_uring" translate="no"></a></h3>
+<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" target="_blank" rel="noopener noreferrer" class="">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" target="_blank" rel [...]
+<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 of yet.</p>
+<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>]]></content:encoded>
+ </item>
+ <item>
+ <title><![CDATA[Iggy.rs — one year of building the message streaming]]></title>
+ <link>https://iggy.apache.org/blogs/2024/05/29/one-year-of-building-the-message-streaming</link>
+ <guid>https://iggy.apache.org/blogs/2024/05/29/one-year-of-building-the-message-streaming</guid>
+ <pubDate>Wed, 29 May 2024 00:00:00 GMT</pubDate>
+ <description><![CDATA[Throwback]]></description>
+ <content:encoded><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="throwback">Throwback<a href="https://iggy.apache.org/blogs/2024/05/29/one-year-of-building-the-message-streaming#throwback" class="hash-link" aria-label="Direct link to Throwback" title="Direct link to Throwback" translate="no"></a></h2>
+<p><strong>It's been a little over a year</strong>, since the <a href="https://iggy.rs/" target="_blank" rel="noopener noreferrer" class="">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/" target="_b [...]
+<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/" target="_blank" rel="noopener noreferrer" class="">Reddit</a>, and was also mentioned on the main site of <a href="https://news.ycombinator.com/item?id=38868115" target="_blank" rel="noopener noreferrer" class="">Hacker News</a>, which I do believe were [...]
+<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 decoding="async" loading="lazy" alt="image" src="https://iggy.apache.org/assets/images/iggy_stars-adb7a001298df7df97de6b0fdd6321ce.png" width="795" height="542" class="img_ev3q"></p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="community">Community<a href="https://iggy.apache.org/blogs/2024/05/29/one-year-of-building-the-message-streaming#community" class="hash-link" aria-label="Direct link to Community" title="Direct link to Community" translate="no"></a></h2>
+<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" target="_blank" rel="noopener noreferrer" class="">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 class=""><a href="https://github.com/apache/iggy" target="_blank" rel="noopener noreferrer" class="">Rust</a></li>
+<li class=""><a href="https://github.com/iggy-rs/iggy-dotnet-client" target="_blank" rel="noopener noreferrer" class="">C#</a></li>
+<li class=""><a href="https://github.com/iggy-rs/iggy-cpp-client" target="_blank" rel="noopener noreferrer" class="">C++</a></li>
+<li class=""><a href="https://github.com/iggy-rs/iggy-node-client" target="_blank" rel="noopener noreferrer" class="">Node (TS)</a></li>
+<li class=""><a href="https://github.com/iggy-rs/iggy-go-client" target="_blank" rel="noopener noreferrer" class="">Go</a></li>
+<li class=""><a href="https://github.com/iggy-rs/iggy-python-client" target="_blank" rel="noopener noreferrer" class="">Python</a></li>
+<li class=""><a href="https://github.com/iggy-rs/iggy-java-client" target="_blank" rel="noopener noreferrer" class="">Java</a></li>
+<li class=""><a href="https://github.com/iggy-rs/iggy-elixir-client" target="_blank" rel="noopener noreferrer" class="">Elixir</a></li>
+</ul>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="changelog">Changelog<a href="https://iggy.apache.org/blogs/2024/05/29/one-year-of-building-the-message-streaming#changelog" class="hash-link" aria-label="Direct link to Changelog" title="Direct link to Changelog" translate="no"></a></h2>
+<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 class="">Increased the streaming server throughput by over 30% for both writes and reads</li>
+<li class="">Added messages compression for client-side & server-side supporting the different algorithms</li>
+<li class="">Implemented a new way of message batching with an additional tooling for data migration</li>
+<li class="">Fixed the possible server-side deadlock that could happen for a specific configuration</li>
+<li class="">Fixed issues with possible memory leaks when storing too many indices in memory</li>
+<li class="">Rebuilt our custom benchmarking tool</li>
+<li class="">Improved TCP connection handling</li>
+<li class="">Constantly upgrading our CI/CD with lots of testing, different runtimes, artifacts, crates and Docker images releases</li>
+<li class="">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 decoding="async" loading="lazy" alt="image" src="https://iggy.apache.org/assets/images/iggy_perf-33fc4db2b6cbd7156b753eee6aeaba60.png" width="2117" height="367" class="img_ev3q"></p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="tooling">Tooling<a href="https://iggy.apache.org/blogs/2024/05/29/one-year-of-building-the-message-streaming#tooling" class="hash-link" aria-label="Direct link to Tooling" title="Direct link to Tooling" translate="no"></a></h2>
+<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" target="_blank" rel="noopener noreferrer" class="">CLI</a> and <a href="https://github.com/iggy-rs/iggy-web-ui" target="_blank" rel="noopener noreferrer" class="">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 decoding="async" loading="lazy" alt="image" src="https://iggy.apache.org/assets/images/iggy_cli-c140d5ecfddf24acd537722137b70c47.png" width="1743" height="766" class="img_ev3q"></p>
+<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 decoding="async" loading="lazy" alt="image" src="https://iggy.apache.org/assets/images/iggy_web-76023f316d53cc2e44ae6f7b83193529.png" width="2559" height="1353" class="img_ev3q"></p>
+<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" target="_blank" rel="noopener noreferrer" class="">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 decoding="async" loading="lazy" alt="image" src="https://iggy.apache.org/assets/images/iggy_bench-eed7510a845dfb053ac67be624599c99.png" width="1891" height="803" class="img_ev3q"></p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="early-adopters">Early adopters<a href="https://iggy.apache.org/blogs/2024/05/29/one-year-of-building-the-message-streaming#early-adopters" class="hash-link" aria-label="Direct link to Early adopters" title="Direct link to Early adopters" translate="no"></a></h2>
+<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" target="_blank" rel="noopener noreferrer" class="">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="anchor anchorTargetStickyNavbar_Vzrq" id="clustering--replication">Clustering & replication<a href="https://iggy.apache.org/blogs/2024/05/29/one-year-of-building-the-message-streaming#clustering--replication" class="hash-link" aria-label="Direct link to Clustering & replication" title="Direct link to Clustering & replication" translate="no"></a></h2>
+<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" target="_blank" rel="noopener noreferrer" class="">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/" target="_blank" rel="noopener noreferrer" class="">Raft</a> consensus algorithm. However, adding the data replication featu [...]
+<p><img decoding="async" loading="lazy" alt="image" src="https://iggy.apache.org/assets/images/iggy_cluster-c2c33596763c8b9930c7de7e12dc3586.png" width="2552" height="1276" class="img_ev3q"></p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="io_uring--thread-per-core--share-nothing">io_uring & thread-per-core + share-nothing<a href="https://iggy.apache.org/blogs/2024/05/29/one-year-of-building-the-message-streaming#io_uring--thread-per-core--share-nothing" class="hash-link" aria-label="Direct link to io_uring & thread-per-core + share-nothing" title="Direct link to io_uring & thread-per-core + share-nothing" translate="no"></a></h2>
+<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 could have a ve [...]
+<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/" target="_blank" rel="noopener noreferrer" class="">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" target="_blank" rel="noopener noreferrer" class="">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 thre [...]
+<p>And just recently, we've established yet another <a href="https://github.com/iggy-rs/iggy-thread-per-core-sandbox" target="_blank" rel="noopener noreferrer" class="">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 decoding="async" loading="lazy" alt="image" src="https://iggy.apache.org/assets/images/iggy_tpc-a6b43534112bfc2c863a2ef675c0a547.png" width="2298" height="1232" class="img_ev3q"></p>
+<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 class="">How to evenly split partitions (the unit of data parallelism) between multiple cores?</li>
+<li class="">How to efficiently rewrite existing server metadata heavily relying on synchronized data with <code>Arc<></code> and <code>RwLock<></code>?</li>
+<li class="">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 class="">Should there be single or multiple threads handling the incoming TCP connections?</li>
+<li class="">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 class="">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" target="_blank" rel="noopener noreferrer" class="">studying</a> some of the existing solutions out there, including <a href="https://seastar.io/" target="_blank" rel="noopener noreferrer" class="">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="anchor anchorTargetStickyNavbar_Vzrq" id="production-readiness">Production readiness<a href="https://iggy.apache.org/blogs/2024/05/29/one-year-of-building-the-message-streaming#production-readiness" class="hash-link" aria-label="Direct link to Production readiness" title="Direct link to Production readiness" translate="no"></a></h2>
+<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" target="_blank" rel="noopener noreferrer" class="">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 decoding="async" loading="lazy" alt="image" src="https://iggy.apache.org/assets/images/iggy_rocket-24a27df28dafae43eb9634a4f6b00c5e.png" width="1920" height="1080" class="img_ev3q"></p>]]></content:encoded>
+ </item>
+ <item>
+ <title><![CDATA[Iggy.rs - building message streaming in Rust]]></title>
+ <link>https://iggy.apache.org/blogs/2023/12/29/building-message-streaming-in-rust</link>
+ <guid>https://iggy.apache.org/blogs/2023/12/29/building-message-streaming-in-rust</guid>
+ <pubDate>Fri, 29 Dec 2023 00:00:00 GMT</pubDate>
+ <description><![CDATA[Origins]]></description>
+ <content:encoded><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="origins">Origins<a href="https://iggy.apache.org/blogs/2023/12/29/building-message-streaming-in-rust#origins" class="hash-link" aria-label="Direct link to Origins" title="Direct link to Origins" translate="no"></a></h2>
+<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" target="_blank" rel="noopener noreferrer" class="">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 [...]
+<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/" target="_blank" rel="noopener noreferrer" class="">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 messagin [...]
+<p>And this is how the <a href="https://iggy.rs/" target="_blank" rel="noopener noreferrer" class="">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/" target="_blank" rel="noopener noreferrer" class="">two of them</a>), small yet extremely fast dogs, the best in their class.</p>
+<p><img decoding="async" loading="lazy" alt="image" src="https://iggy.apache.org/assets/images/iggys-5cd88b6e4af91d0e5b0f1ef688b8efac.jpeg" width="1506" height="1282" class="img_ev3q"></p>
+<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="anchor anchorTargetStickyNavbar_Vzrq" id="project">Project<a href="https://iggy.apache.org/blogs/2023/12/29/building-message-streaming-in-rust#project" class="hash-link" aria-label="Direct link to Project" title="Direct link to Project" translate="no"></a></h2>
+<p>At the very beginning, Iggy had rather limited functionality, and everything was handled using the <a href="https://www.chromium.org/quic/" target="_blank" rel="noopener noreferrer" class="">QUIC</a> protocol based on <a href="https://github.com/quinn-rs/quinn" target="_blank" rel="noopener noreferrer" class="">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 [...]
+<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 decoding="async" loading="lazy" alt="image" src="https://iggy.apache.org/assets/images/iggy_sample-39395c20221652515f2296734851e042.jpeg" width="4064" height="2408" class="img_ev3q"></p>
+<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" target="_blank" rel="noopener noreferrer" class="">bytes</a>, along with the <a href="https://tokio.rs/" target="_blank" rel="noopener noreferrer" class="">Tokio</a> <strong>work stealing</strong> approach, yielded the [...]
+<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>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> polled_messages </span><span c [...]
+<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" target="_blank" rel="noopener noreferrer" class="">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 mont [...]
+<p><img decoding="async" loading="lazy" alt="image" src="https://iggy.apache.org/assets/images/iggy_bench-9ea0ebbd13ad66abb94ec3d8d8697048.jpeg" width="3494" height="1750" class="img_ev3q"></p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="team">Team<a href="https://iggy.apache.org/blogs/2023/12/29/building-message-streaming-in-rust#team" class="hash-link" aria-label="Direct link to Team" title="Direct link to Team" translate="no"></a></h2>
+<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 specifically. F [...]
+<p><img decoding="async" loading="lazy" alt="image" src="https://iggy.apache.org/assets/images/iggy_server-b28372292592869008ceb03c1edfdc51.jpeg" width="4088" height="1610" class="img_ev3q"></p>
+<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="anchor anchorTargetStickyNavbar_Vzrq" id="features">Features<a href="https://iggy.apache.org/blogs/2023/12/29/building-message-streaming-in-rust#features" class="hash-link" aria-label="Direct link to Features" title="Direct link to Features" translate="no"></a></h2>
+<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 class=""><strong>Highly performant</strong>, persistent append-only log for the message streaming</li>
+<li class=""><strong>Very high throughput</strong> for both writes and reads</li>
+<li class=""><strong>Low latency and predictable resource usage</strong> thanks to the Rust compiled language (no GC)</li>
+<li class=""><strong>Users authentication and authorization</strong> with granular permissions and PAT (Personal Access Tokens)</li>
+<li class="">Support for multiple streams, topics and partitions</li>
+<li class="">Support for <strong>multiple transport protocols</strong> (QUIC, TCP, HTTP)</li>
+<li class="">Fully operational RESTful API which can be optionally enabled</li>
+<li class="">Available client SDK in multiple languages</li>
+<li class=""><strong>Works directly with the binary data</strong> (lack of enforced schema and serialization/deserialization)</li>
+<li class="">Configurable server features (e.g. caching, segment size, data flush interval, transport protocols etc.)</li>
+<li class="">Possibility of storing the <strong>consumer offsets</strong> on the server</li>
+<li class="">Multiple ways of polling the messages:<!-- -->
+<ul>
+<li class="">By offset (using the indexes)</li>
+<li class="">By timestamp (using the time indexes)</li>
+<li class="">First/Last N messages</li>
+<li class="">Next N messages for the specific consumer</li>
+</ul>
+</li>
+<li class="">Possibility of <strong>auto committing the offset</strong> (e.g. to achieve <em>at-most-once</em> delivery)</li>
+<li class=""><strong>Consumer groups</strong> providing the message ordering and horizontal scaling across the connected clients</li>
+<li class=""><strong>Message expiry</strong> with auto deletion based on the configurable <strong>retention policy</strong></li>
+<li class="">Additional features such as <strong>server side message deduplication</strong></li>
+<li class=""><strong>TLS</strong> support for all transport protocols (TCP, QUIC, HTTPS)</li>
+<li class="">Optional server-side as well as client-side <strong>data encryption</strong> using AES-256-GCM</li>
+<li class="">Optional metadata support in the form of <strong>message headers</strong></li>
+<li class="">Built-in <strong>CLI</strong> to manage the streaming server</li>
+<li class="">Built-in <strong>benchmarking app</strong> to test the performance</li>
+<li class=""><strong>Single binary deployment</strong> (no external dependencies)</li>
+<li class="">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 class=""><a href="https://crates.io/crates/iggy" target="_blank" rel="noopener noreferrer" class="">Rust</a></li>
+<li class=""><a href="https://github.com/iggy-rs/iggy-dotnet-client" target="_blank" rel="noopener noreferrer" class="">C#</a></li>
+<li class=""><a href="https://github.com/iggy-rs/iggy-go-client" target="_blank" rel="noopener noreferrer" class="">Go</a></li>
+<li class=""><a href="https://github.com/iggy-rs/iggy-node-client" target="_blank" rel="noopener noreferrer" class="">Node</a></li>
+<li class=""><a href="https://github.com/iggy-rs/iggy-python-client" target="_blank" rel="noopener noreferrer" class="">Python</a></li>
+<li class=""><a href="https://github.com/iggy-rs/iggy-java-client" target="_blank" rel="noopener noreferrer" class="">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 stress enough <strong>how gr [...]
+<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" target="_blank" rel="noopener noreferrer" class="">CLI</a></strong>.</p>
+<p><img decoding="async" loading="lazy" alt="image" src="https://iggy.apache.org/assets/images/iggy_cli-efc853d35dfcddfb68957f9f7cbdd745.jpeg" width="2942" height="2162" class="img_ev3q"></p>
+<p>As well as modern <strong><a href="https://github.com/iggy-rs/iggy-web-ui" target="_blank" rel="noopener noreferrer" class="">Web UI</a></strong> to make it happen :)</p>
+<p><img decoding="async" loading="lazy" alt="image" src="https://iggy.apache.org/assets/images/iggy_web_ui-58fc54e40a2756eba04dec9206de70a5.jpeg" width="4060" height="2408" class="img_ev3q"></p>
+<p>Last but not least, we've got a fully-featured <a href="https://github.com/apache/iggy/actions" target="_blank" rel="noopener noreferrer" class="">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" target="_blank" rel="noopener noreferrer" class="">Docker images</a>.</p>
+<p><img decoding="async" loading="lazy" alt="image" src="https://iggy.apache.org/assets/images/iggy_ci_cd-a03f984dde69dbbc209f61481d7d1c91.jpeg" width="2000" height="1000" class="img_ev3q"></p>
+<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="anchor anchorTargetStickyNavbar_Vzrq" id="roadmap">Roadmap<a href="https://iggy.apache.org/blogs/2023/12/29/building-message-streaming-in-rust#roadmap" class="hash-link" aria-label="Direct link to Roadmap" title="Direct link to Roadmap" translate="no"></a></h2>
+<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/" target="_blank" rel="noopener noreferrer" class="">company</a> using it already), and discussed what features would be a good addition to the current stack.</p>
+<p><img decoding="async" loading="lazy" alt="image" src="https://iggy.apache.org/assets/images/gh_trending-bbecb9e6ddc18e345fbdb7c8bae838d9.jpeg" width="2234" height="1830" class="img_ev3q"></p>
+<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) and swi [...]
+<p><img decoding="async" loading="lazy" alt="image" src="https://iggy.apache.org/assets/images/leader_elections-f973c06ac3c6b230945e496faa6f314e.jpeg" width="4058" height="2316" class="img_ev3q"></p>
+<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" target="_blank" rel="noopener noreferrer" class="">io_uring</a></strong> for all I/O operations (disk or network related). The brand new, completion based API (available in the re [...]
+<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" target="_blank" rel="n [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="future">Future<a href="https://iggy.apache.org/blogs/2023/12/29/building-message-streaming-in-rust#future" class="hash-link" aria-label="Direct link to Future" title="Direct link to Future" translate="no"></a></h2>
+<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. Aero [...]
+<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" target="_blank" rel="noopener noreferrer" class="">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/" target="_blank" rel="noopener noreferrer" class="">Rust</a>.</p>]]></content:encoded>
+ </item>
+ <item>
+ <title><![CDATA[Iggy 0.1.0 release]]></title>
+ <link>https://iggy.apache.org/blogs/iggy-0-1-0-release</link>
+ <guid>https://iggy.apache.org/blogs/iggy-0-1-0-release</guid>
+ <pubDate>Sun, 26 Nov 2023 00:00:00 GMT</pubDate>
+ <description><![CDATA[We are happy to announce that Iggy.rs has reached the 0.1.0 release. This is a major milestone for the project, as it's getting closer to the first stable release.]]></description>
+ <content:encoded><![CDATA[<p>We are happy to announce that Iggy.rs has reached the <code>0.1.0</code> release. This is a major milestone for the project, as it's getting closer to the first stable release.</p>
+<p><img decoding="async" loading="lazy" alt="0.1.0" src="https://iggy.apache.org/assets/images/iggy_0_1_0-c635523620b5dc0af17545d1c3ce3edd.jpg" width="1000" height="500" class="img_ev3q"></p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="release-notes">Release notes<a href="https://iggy.apache.org/blogs/iggy-0-1-0-release#release-notes" class="hash-link" aria-label="Direct link to Release notes" title="Direct link to Release notes" translate="no"></a></h2>
+<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 decoding="async" loading="lazy" alt="CI" src="https://iggy.apache.org/assets/images/iggy_server_0_1_0-7d957a6db68439149d9c805432318296.jpeg" width="4092" height="1664" class="img_ev3q"></p>
+<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 decoding="async" loading="lazy" alt="CI" src="https://iggy.apache.org/assets/images/iggy_ci_0_1_0-b31e9445de207c06bd2eee74dafac357.jpeg" width="3598" height="1248" class="img_ev3q"></p>
+<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 decoding="async" loading="lazy" alt="Bench" src="https://iggy.apache.org/assets/images/iggy_bench_0_1_0-afcc4cf7770ab3863afbdd2a7871492b.jpeg" width="4068" height="2138" class="img_ev3q"></p>
+<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 decoding="async" loading="lazy" alt="CLI" src="https://iggy.apache.org/assets/images/iggy_cli_0_1_0-aa8dbc85bd46875427ae87e133ec8482.jpeg" width="2942" height="2164" class="img_ev3q"></p>
+<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 decoding="async" loading="lazy" alt="Web UI" src="https://iggy.apache.org/assets/images/iggy_web_ui_0_1_0-58fc54e40a2756eba04dec9206de70a5.jpeg" width="4060" height="2408" class="img_ev3q"></p>
+<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" target="_blank" rel="noopener noreferrer" class="">Discord</a> server, and let us know what you think about the project. We are looking forward to hearing from you!</p>]]></content:encoded>
+ <category>release</category>
+ </item>
+ <item>
+ <title><![CDATA[Personal access tokens]]></title>
+ <link>https://iggy.apache.org/blogs/personal-access-tokens</link>
+ <guid>https://iggy.apache.org/blogs/personal-access-tokens</guid>
+ <pubDate>Thu, 12 Oct 2023 00:00:00 GMT</pubDate>
+ <description><![CDATA[Since the most recent update, Iggy.rs supports personal access tokens, which can be used to authenticate the clients, instead of the username and password. The tokens can be created and deleted using the available APIs.]]></description>
+ <content:encoded><![CDATA[<p>Since the most recent update, Iggy.rs supports personal access tokens, which can be used to authenticate the clients, instead of the username and password. The tokens can be created and deleted using the available APIs.</p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="breaking-changes">Breaking changes<a href="https://iggy.apache.org/blogs/personal-access-tokens#breaking-changes" class="hash-link" aria-label="Direct link to Breaking changes" title="Direct link to Breaking changes" translate="no"></a></h2>
+<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" target="_blank" rel="noopener noreferrer" class="">#e74c25e</a>.</p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="personal-access-tokens">Personal access tokens<a href="https://iggy.apache.org/blogs/personal-access-tokens#personal-access-tokens" class="hash-link" aria-label="Direct link to Personal access tokens" title="Direct link to Personal access tokens" translate="no"></a></h2>
+<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>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<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>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">async</span><span class="token plain"> </span><span class="token ke [...]
+<p>When creating the token, the server returns the <code>RawPersonalAccessToken</code> struct, which contains the string <code>token</code> value.</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<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>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<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="anchor anchorTargetStickyNavbar_Vzrq" id="configuration">Configuration<a href="https://iggy.apache.org/blogs/personal-access-tokens#configuration" class="hash-link" aria-label="Direct link to Configuration" title="Direct link to Configuration" translate="no"></a></h2>
+<p>On the server side, you can enable the background task responsible for deleting the expired tokens.</p>
+<div class="language-toml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-toml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">[</span><span class="token table class-name">personal_access_to [...]
+ <category>new-features</category>
+ <category>personal-access-tokens</category>
+ <category>pat</category>
+ </item>
+ <item>
+ <title><![CDATA[Consumer identifier]]></title>
+ <link>https://iggy.apache.org/blogs/consumer-identifier</link>
+ <guid>https://iggy.apache.org/blogs/consumer-identifier</guid>
+ <pubDate>Mon, 02 Oct 2023 00:00:00 GMT</pubDate>
+ <description><![CDATA[In the latest update, the Iggy server as well as the clients for all the available transport protocols have been extended with the support for consumer identifier. Whether you poll the messages, store the consumer offsets, or create consumer groups, you can use the well-established identifier type, instead of just u32, which is now a common standard for the resources' identification such as streams, topics, users and consumers.]]></description>
+ <content:encoded><![CDATA[<p>In the latest update, the Iggy server as well as the clients for all the available transport protocols have been extended with the support for <strong>consumer identifier</strong>. Whether you poll the messages, store the consumer offsets, or create consumer groups, you can use the well-established <code>identifier</code> type, instead of just <code>u32</code>, which is now a common standard for the resources' identification such as streams, topic [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="breaking-changes">Breaking changes<a href="https://iggy.apache.org/blogs/consumer-identifier#breaking-changes" class="hash-link" aria-label="Direct link to Breaking changes" title="Direct link to Breaking changes" translate="no"></a></h2>
+<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" target="_blank" rel="noopener noreferrer" class="">#655f9b6</a>.</p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="consumer-identifier">Consumer identifier<a href="https://iggy.apache.org/blogs/consumer-identifier#consumer-identifier" class="hash-link" aria-label="Direct link to Consumer identifier" title="Direct link to Consumer identifier" translate="no"></a></h2>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<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="anchor anchorTargetStickyNavbar_Vzrq" id="consumer-groups">Consumer groups<a href="https://iggy.apache.org/blogs/consumer-identifier#consumer-groups" class="hash-link" aria-label="Direct link to Consumer groups" title="Direct link to Consumer groups" translate="no"></a></h2>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<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>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<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>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<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>]]></content:encoded>
+ <category>new-features</category>
+ <category>consumers</category>
+ <category>identifier</category>
+ </item>
+ <item>
+ <title><![CDATA[Users and permissions]]></title>
+ <link>https://iggy.apache.org/blogs/users-and-permissions</link>
+ <guid>https://iggy.apache.org/blogs/users-and-permissions</guid>
+ <pubDate>Wed, 20 Sep 2023 00:00:00 GMT</pubDate>
+ <description><![CDATA[In the most recent update, the Iggy server as well as the clients for all the available transport protocols have been extended with the support for users and permissions. From now on, you can additionally secure your data using the authentication and authorization by specifying the granular set of permissions for each user.]]></description>
+ <content:encoded><![CDATA[<p>In the most recent update, the Iggy server as well as the clients for all the available transport protocols have been extended with the support for <strong>users and permissions</strong>. From now on, you can additionally secure your data using the authentication and authorization by specifying the granular set of permissions for each user.</p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="breaking-changes">Breaking changes<a href="https://iggy.apache.org/blogs/users-and-permissions#breaking-changes" class="hash-link" aria-label="Direct link to Breaking changes" title="Direct link to Breaking changes" translate="no"></a></h2>
+<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>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<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" target="_blank" rel="noopener noreferrer" class="">#23b3309</a>. The available <a href="https://crates.io/crates/iggy" target="_blank" rel="noopener noreferrer" class="">iggy crate</a> supports these changes since version 0.0.80.</p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="configuration">Configuration<a href="https://iggy.apache.org/blogs/users-and-permissions#configuration" class="hash-link" aria-label="Direct link to Configuration" title="Direct link to Configuration" translate="no"></a></h2>
+<p>Currently, the authentication and authorization can be enabled in the <code>server.toml</code> configuration via <code>[system.user]</code> section:</p>
+<div class="language-toml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-toml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">[</span><span class="token table class-name">system.user</span> [...]
+<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>
+<div class="language-toml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-toml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">[</span><span class="token table class-name">http.jwt</span><sp [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="authentication-and-authorization">Authentication and authorization<a href="https://iggy.apache.org/blogs/users-and-permissions#authentication-and-authorization" class="hash-link" aria-label="Direct link to Authentication and authorization" title="Direct link to Authentication and authorization" translate="no"></a></h2>
+<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's n [...]
+<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>
+<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class [...]
+<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>
+<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="sdk">SDK<a href="https://iggy.apache.org/blogs/users-and-permissions#sdk" class="hash-link" aria-label="Direct link to SDK" title="Direct link to SDK" translate="no"></a></h2>
+<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>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="commands-and-models">Commands and models<a href="https://iggy.apache.org/blogs/users-and-permissions#commands-and-models" class="hash-link" aria-label="Direct link to Commands and models" title="Direct link to Commands and models" translate="no"></a></h2>
+<p>The following commands and response models have been added:</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<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="anchor anchorTargetStickyNavbar_Vzrq" id="http-api">HTTP API<a href="https://iggy.apache.org/blogs/users-and-permissions#http-api" class="hash-link" aria-label="Direct link to HTTP API" title="Direct link to HTTP API" translate="no"></a></h2>
+<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>
+<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">POST {{url}}/users/login</span><br></span><span class="token-line" style="color:#393A34"><s [...]
+ <category>new-features</category>
+ <category>users</category>
+ <category>permissions</category>
+ </item>
+ <item>
+ <title><![CDATA[Updated schemas]]></title>
+ <link>https://iggy.apache.org/blogs/updated-schemas</link>
+ <guid>https://iggy.apache.org/blogs/updated-schemas</guid>
+ <pubDate>Thu, 31 Aug 2023 00:00:00 GMT</pubDate>
+ <description><![CDATA[The latest update introduces the changes to the PollMessages and GetConsumerOffset commands response schema, as well as the Stream, Topic and Partition structs extended with created_at field.]]></description>
+ <content:encoded><![CDATA[<p>The latest update introduces the changes to the <code>PollMessages</code> and <code>GetConsumerOffset</code> commands response schema, as well as the <code>Stream</code>, <code>Topic</code> and <code>Partition</code> structs extended with <code>created_at</code> field.</p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="breaking-changes">Breaking changes<a href="https://iggy.apache.org/blogs/updated-schemas#breaking-changes" class="hash-link" aria-label="Direct link to Breaking changes" title="Direct link to Breaking changes" translate="no"></a></h2>
+<p>Breaking changes have been introduced with the commit <a href="https://github.com/apache/iggy/commit/670a8baba8617bb7e52bd51d556a621349e2e9f0" target="_blank" rel="noopener noreferrer" class="">#670a8ba</a>. The available <a href="https://crates.io/crates/iggy" target="_blank" rel="noopener noreferrer" class="">iggy crate</a> supports these changes since version 0.0.60.</p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="pollmessages">PollMessages<a href="https://iggy.apache.org/blogs/updated-schemas#pollmessages" class="hash-link" aria-label="Direct link to PollMessages" title="Direct link to PollMessages" translate="no"></a></h2>
+<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 [...]
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<p>Serialization:</p>
+<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Partition ID (4 bytes) + Current offset (8 bytes) + Messages count (4 bytes) + Messages (N [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="getconsumeroffset">GetConsumerOffset<a href="https://iggy.apache.org/blogs/updated-schemas#getconsumeroffset" class="hash-link" aria-label="Direct link to GetConsumerOffset" title="Direct link to GetConsumerOffset" translate="no"></a></h2>
+<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>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<p>Serialization:</p>
+<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Partition ID (4 bytes) + Current offset (8 bytes) + Stored offset (8 bytes)</span><br></spa [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="stream-topic-partition">Stream, Topic, Partition<a href="https://iggy.apache.org/blogs/updated-schemas#stream-topic-partition" class="hash-link" aria-label="Direct link to Stream, Topic, Partition" title="Direct link to Stream, Topic, Partition" translate="no"></a></h2>
+<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>]]></content:encoded>
+ <category>update</category>
+ <category>schema</category>
+ </item>
+ <item>
+ <title><![CDATA[Message expiry]]></title>
+ <link>https://iggy.apache.org/blogs/message-expiry</link>
+ <guid>https://iggy.apache.org/blogs/message-expiry</guid>
+ <pubDate>Sun, 27 Aug 2023 00:00:00 GMT</pubDate>
+ <description><![CDATA[The message expiration is a server-side feature, allowing to automatically delete the old data (expired segment as a whole) depending on the provided configuration. By specifying the custom retention policy, the server can clean up no longer needed messages, which can help with the disk space management.]]></description>
+ <content:encoded><![CDATA[<p>The message expiration is a server-side feature, allowing to automatically delete the old data (expired segment as a whole) depending on the provided configuration. By specifying the custom retention policy, the server can clean up no longer needed messages, which can help with the disk space management.</p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="breaking-changes">Breaking changes<a href="https://iggy.apache.org/blogs/message-expiry#breaking-changes" class="hash-link" aria-label="Direct link to Breaking changes" title="Direct link to Breaking changes" translate="no"></a></h2>
+<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" target="_blank" rel="noopener noreferrer" class="">#ea3bf9c</a>. The available <a href="https://crates.io/crates/iggy" tar [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="introduction">Introduction<a href="https://iggy.apache.org/blogs/message-expiry#introduction" class="hash-link" aria-label="Direct link to Introduction" title="Direct link to Introduction" translate="no"></a></h2>
+<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="anchor anchorTargetStickyNavbar_Vzrq" id="configuration">Configuration<a href="https://iggy.apache.org/blogs/message-expiry#configuration" class="hash-link" aria-label="Direct link to Configuration" title="Direct link to Configuration" translate="no"></a></h2>
+<div class="language-toml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-toml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">[</span><span class="token table class-name">message_cleaner</s [...]
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="message-cleaner">Message cleaner<a href="https://iggy.apache.org/blogs/message-expiry#message-cleaner" class="hash-link" aria-label="Direct link to Message cleaner" title="Direct link to Message cleaner" translate="no"></a></h3>
+<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="anchor anchorTargetStickyNavbar_Vzrq" id="segment">Segment<a href="https://iggy.apache.org/blogs/message-expiry#segment" class="hash-link" aria-label="Direct link to Segment" title="Direct link to Segment" translate="no"></a></h3>
+<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="anchor anchorTargetStickyNavbar_Vzrq" id="commands">Commands<a href="https://iggy.apache.org/blogs/message-expiry#commands" class="hash-link" aria-label="Direct link to Commands" title="Direct link to Commands" translate="no"></a></h2>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<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>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">fn</span><span class="token plain"> </span><span class="token funct [...]
+<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>
+<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Topic ID (4 bytes) + Partitions count (4 bytes) + Message expiry (4 bytes) + Size (8 bytes) [...]
+<p>The same changes (<code>name_length</code>) apply to the <code>Stream</code> and <code>StreamDetails</code> structs.</p>
+<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Stream ID (4 bytes) + Topics count (4 bytes) + Size (8 bytes) + Messages count (8 bytes) + [...]
+ <category>new-features</category>
+ <category>message-expiry</category>
+ </item>
+ <item>
+ <title><![CDATA[Message state]]></title>
+ <link>https://iggy.apache.org/blogs/message-state</link>
+ <guid>https://iggy.apache.org/blogs/message-state</guid>
+ <pubDate>Tue, 22 Aug 2023 00:00:00 GMT</pubDate>
+ <description><![CDATA[The message state is a simple field which extends the existing message and provides a way to define whether the particular message might be consumed by the client or not, depending on its value. Let's briefly discuss the motivation behind this feature, the implementation details and the breaking changes introduced by this release.]]></description>
+ <content:encoded><![CDATA[<p>The message state is a simple field which extends the existing <code>message</code> and provides a way to define whether the particular message might be consumed by the client or not, depending on its value. Let's briefly discuss the motivation behind this feature, the implementation details and the breaking changes introduced by this release.</p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="breaking-changes">Breaking changes<a href="https://iggy.apache.org/blogs/message-state#breaking-changes" class="hash-link" aria-label="Direct link to Breaking changes" title="Direct link to Breaking changes" translate="no"></a></h2>
+<p>Starting with the commit <a href="https://github.com/apache/iggy/commit/b07f23db798ffcda7c39650f34547f20137ff725" target="_blank" rel="noopener noreferrer" class="">#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" target="_ [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="introduction">Introduction<a href="https://iggy.apache.org/blogs/message-state#introduction" class="hash-link" aria-label="Direct link to Introduction" title="Direct link to Introduction" translate="no"></a></h2>
+<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="anchor anchorTargetStickyNavbar_Vzrq" id="implementation">Implementation<a href="https://iggy.apache.org/blogs/message-state#implementation" class="hash-link" aria-label="Direct link to Implementation" title="Direct link to Implementation" translate="no"></a></h2>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="structures">Structures<a href="https://iggy.apache.org/blogs/message-state#structures" class="hash-link" aria-label="Direct link to Structures" title="Direct link to Structures" translate="no"></a></h3>
+<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 request the m [...]
+<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) [...]
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="json-transport">JSON transport<a href="https://iggy.apache.org/blogs/message-state#json-transport" class="hash-link" aria-label="Direct link to JSON transport" title="Direct link to JSON transport" translate="no"></a></h3>
+<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>
+<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token p [...]
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="binary-transport">Binary transport<a href="https://iggy.apache.org/blogs/message-state#binary-transport" class="hash-link" aria-label="Direct link to Binary transport" title="Direct link to Binary transport" translate="no"></a></h3>
+<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>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<p>And the serialization was:</p>
+<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Offset (8 bytes) + Timestamp (8 bytes) + ID (16 bytes) + Headers (N bytes) + Length (4 byte [...]
+<p>Now, the <code>message</code> looks like this:</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<p>And the serialization has changed to:</p>
+<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Offset (8 bytes) + State (1 byte) + Timestamp (8 bytes) + ID (16 bytes) + Checksum (4 bytes [...]
+<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>]]></content:encoded>
+ <category>new-features</category>
+ <category>message-state</category>
+ <category>message-checksum</category>
+ </item>
+ <item>
+ <title><![CDATA[Message headers]]></title>
+ <link>https://iggy.apache.org/blogs/message-headers</link>
+ <guid>https://iggy.apache.org/blogs/message-headers</guid>
+ <pubDate>Sat, 19 Aug 2023 00:00:00 GMT</pubDate>
+ <description><![CDATA[The optional message headers which you can think of as an additional metadata for your messages have been recently implemented, Let's discover what these headers are, how to use them and more importantly, how to implement them in your own transport.]]></description>
+ <content:encoded><![CDATA[<p>The optional message headers which you can think of as an additional metadata for your messages have been recently implemented, Let's discover what these headers are, how to use them and more importantly, how to implement them in your own transport.</p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="breaking-changes">Breaking changes<a href="https://iggy.apache.org/blogs/message-headers#breaking-changes" class="hash-link" aria-label="Direct link to Breaking changes" title="Direct link to Breaking changes" translate="no"></a></h2>
+<p>The first draft of the message headers implementation starts with the initial commit <a href="https://github.com/apache/iggy/commit/bc1d0b369a268783bd329436aba3f6920aae478e" target="_blank" rel="noopener noreferrer" class="">#bc1d0b3</a>. The breaking change to the streaming server has been introduced in the commit <a href="https://github.com/apache/iggy/commit/7c73bd3d9d59fb685cbaaca5901dec6cac43ddaf" target="_blank" rel="noopener noreferrer" class="">#7c73bd3</a> - up until this poi [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="introduction">Introduction<a href="https://iggy.apache.org/blogs/message-headers#introduction" class="hash-link" aria-label="Direct link to Introduction" title="Direct link to Introduction" translate="no"></a></h2>
+<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/core/examples/src/message-headers" target="_blank" rel="noopener noreferrer" class="">here</a>.</p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="implementation">Implementation<a href="https://iggy.apache.org/blogs/message-headers#implementation" class="hash-link" aria-label="Direct link to Implementation" title="Direct link to Implementation" translate="no"></a></h2>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="structures">Structures<a href="https://iggy.apache.org/blogs/message-headers#structures" class="hash-link" aria-label="Direct link to Structures" title="Direct link to Structures" translate="no"></a></h3>
+<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>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<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>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="json-transport">JSON transport<a href="https://iggy.apache.org/blogs/message-headers#json-transport" class="hash-link" aria-label="Direct link to JSON transport" title="Direct link to JSON transport" translate="no"></a></h3>
+<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>
+<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class [...]
+<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="anchor anchorTargetStickyNavbar_Vzrq" id="binary-transport">Binary transport<a href="https://iggy.apache.org/blogs/message-headers#binary-transport" class="hash-link" aria-label="Direct link to Binary transport" title="Direct link to Binary transport" translate="no"></a></h3>
+<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>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">impl</span><span class="token plain"> </span><span class="token cla [...]
+<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>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">impl</span><span class="token plain"> </span><span class="token cla [...]
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="sending-the-messages-with-headers">Sending the messages with headers<a href="https://iggy.apache.org/blogs/message-headers#sending-the-messages-with-headers" class="hash-link" aria-label="Direct link to Sending the messages with headers" title="Direct link to Sending the messages with headers" translate="no"></a></h3>
+<p>Now, let's see how we can include the headers in a message serialization:</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">fn</span><span class="token plain"> </span><span class="token funct [...]
+<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 headers [...]
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="polling-the-messages-with-headers">Polling the messages with headers<a href="https://iggy.apache.org/blogs/message-headers#polling-the-messages-with-headers" class="hash-link" aria-label="Direct link to Polling the messages with headers" title="Direct link to Polling the messages with headers" translate="no"></a></h3>
+<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>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<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="anchor anchorTargetStickyNavbar_Vzrq" id="sample-usage">Sample usage<a href="https://iggy.apache.org/blogs/message-headers#sample-usage" class="hash-link" aria-label="Direct link to Sample usage" title="Direct link to Sample usage" translate="no"></a></h3>
+<p>The headers usage is pretty straightforward, as we simply need to create the new <code>HashMap</code>:</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> </span><span class="token keyw [...]
+<p>You might also use the conversion based on the implemented traits:</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">headers</span><span class="token punctuation" style="color:#393A34">.</span><span class="to [...]
+<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>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> send_messages </span><span cla [...]
+<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>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> value1 </span><span class="tok [...]
+ <category>new-features</category>
+ <category>message-headers</category>
+ <category>breaking-changes</category>
+ </item>
+ <item>
+ <title><![CDATA[Welcome to the changelog]]></title>
+ <link>https://iggy.apache.org/blogs/welcome-to-the-changelog</link>
+ <guid>https://iggy.apache.org/blogs/welcome-to-the-changelog</guid>
+ <pubDate>Wed, 16 Aug 2023 00:00:00 GMT</pubDate>
+ <description><![CDATA[Welcome to the changelog, in which you will read about all the changes that we make to the project.]]></description>
+ <content:encoded><![CDATA[<p>Welcome to the changelog, in which you will read about all the changes that we make to the project.</p>
+<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>]]></content:encoded>
+ <category>hello</category>
+ </item>
+ </channel>
+</rss>
\ No newline at end of file
diff --git a/blogs/rss.xsl b/blogs/rss.xsl
new file mode 100644
index 00000000..e9695b29
--- /dev/null
+++ b/blogs/rss.xsl
@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<xsl:stylesheet
+ version="3.0"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:atom="http://www.w3.org/2005/Atom">
+ <xsl:output method="html" version="1.0" encoding="UTF-8" indent="yes" />
+
+ <xsl:template match="/">
+ <html xmlns="http://www.w3.org/1999/xhtml" lang="en">
+ <head>
+ <title>RSS Feed | <xsl:value-of select="rss/channel/title" /></title>
+ <link rel="stylesheet" href="rss.css" />
+ </head>
+ <body>
+ <main>
+ <div class="description">
+ <div class="info">
+ <strong>This is an RSS feed</strong>. Subscribe by copying the URL
+ from the address bar into your newsreader. Visit
+ <a href="https://aboutfeeds.com/">About Feeds</a> to learn more
+ and get started. It’s free.
+ </div>
+ <h1>
+ <div class="rss-icon">
+ <svg
+ version="1.1"
+ id="Capa_1"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ viewBox="0 0 455.731 455.731"
+ xml:space="preserve">
+ <g>
+ <rect
+ x="0"
+ y="0"
+ style="fill: #f78422"
+ width="455.731"
+ height="455.731"
+ />
+ <g>
+ <path
+ style="fill: #ffffff"
+ d="M296.208,159.16C234.445,97.397,152.266,63.382,64.81,63.382v64.348
+ c70.268,0,136.288,27.321,185.898,76.931c49.609,49.61,76.931,115.63,76.931,185.898h64.348
+ C391.986,303.103,357.971,220.923,296.208,159.16z"
+ />
+ <path
+ style="fill: #ffffff"
+ d="M64.143,172.273v64.348c84.881,0,153.938,69.056,153.938,153.939h64.348
+ C282.429,270.196,184.507,172.273,64.143,172.273z"
+ />
+ <circle
+ style="fill: #ffffff"
+ cx="109.833"
+ cy="346.26"
+ r="46.088"
+ />
+ </g>
+ </g>
+ </svg>
+ </div>
+ <xsl:value-of select="rss/channel/title" />
+ </h1>
+ <p class="blog-description">
+ <xsl:value-of select="rss/channel/description" />
+ </p>
+ </div>
+ <h2>Recent Posts</h2>
+ <div class="blog-posts">
+ <xsl:for-each select="rss/channel/item">
+ <div class="blog-post">
+ <h3><a href="{link}"><xsl:value-of select="title" /></a></h3>
+ <div class="blog-post-date">
+ Published on <xsl:value-of select="substring(pubDate,0,17)" />
+ </div>
+ <div class="blog-post-description">
+ <xsl:value-of select="description" />
+ </div>
+ </div>
+ </xsl:for-each>
+ </div>
+ </main>
+ </body>
+ </html>
+ </xsl:template>
+</xsl:stylesheet>
diff --git a/blogs/tags/0-5-0/index.html b/blogs/tags/0-5-0/index.html
new file mode 100644
index 00000000..52b8b62e
--- /dev/null
+++ b/blogs/tags/0-5-0/index.html
@@ -0,0 +1,31 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="blog-wrapper blog-tags-post-list-page plugin-blog plugin-id-default" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">One post tagged with "0.5.0" | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"> [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed">
+
+
+
+
+
+<link rel="preconnect" href="https://analytics.apache.org/">
+<script>var _paq=window._paq=window._paq||[];_paq.push(["setRequestMethod","POST"]),_paq.push(["trackPageView"]),_paq.push(["enableLinkTracking"]),_paq.push(["enableHeartBeatTimer"]),function(){var e="https://analytics.apache.org/";_paq.push(["setRequestMethod","POST"]),_paq.push(["setTrackerUrl",e+"matomo.php"]),_paq.push(["setSiteId","80"]);var a=document,t=a.createElement("script"),p=a.getElementsByTagName("script")[0];t.type="text/javascript",t.async=!0,t.src=e+"matomo.js",p.parentNo [...]
+<script src="/assets/js/runtime~main.0a940c88.js" defer="defer"></script>
+<script src="/assets/js/main.4a006c5e.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/img/apache-iggy0.5x.png"><link rel="preload" as="image" [...]
+<p>It’s been four months since our last <a href="https://github.com/apache/iggy/releases/tag/server-0.4.300" target="_blank" rel="noopener noreferrer" class="">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" target="_blank" rel="noopener noreferrer" class="">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></div><footer class="row docusaurus-mt-lg"><div class="col col--9"><b>Tags:</b><ul class="tags_jXut padding--none margin-left--sm"><li class="tag_QGVx"><a rel="tag" class="tag_zVej tagRegular_sFm0" href="/blogs/tags/release">release</a></li><li class="tag_QGVx"><a rel="tag" class="tag_zVej tagRegular_sFm0" href="/blogs/tags/0-5-0">0.5. [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/blogs/tags/0-6-0/index.html b/blogs/tags/0-6-0/index.html
new file mode 100644
index 00000000..8c2e5eef
--- /dev/null
+++ b/blogs/tags/0-6-0/index.html
@@ -0,0 +1,30 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="blog-wrapper blog-tags-post-list-page plugin-blog plugin-id-default" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">One post tagged with "0.6.0" | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"> [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed">
+
+
+
+
+
+<link rel="preconnect" href="https://analytics.apache.org/">
+<script>var _paq=window._paq=window._paq||[];_paq.push(["setRequestMethod","POST"]),_paq.push(["trackPageView"]),_paq.push(["enableLinkTracking"]),_paq.push(["enableHeartBeatTimer"]),function(){var e="https://analytics.apache.org/";_paq.push(["setRequestMethod","POST"]),_paq.push(["setTrackerUrl",e+"matomo.php"]),_paq.push(["setSiteId","80"]);var a=document,t=a.createElement("script"),p=a.getElementsByTagName("script")[0];t.type="text/javascript",t.async=!0,t.src=e+"matomo.js",p.parentNo [...]
+<script src="/assets/js/runtime~main.0a940c88.js" defer="defer"></script>
+<script src="/assets/js/main.4a006c5e.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/img/apache-iggy0.5x.png"><link rel="preload" as="image" [...]
+<p>Four months after <a href="https://iggy.apache.org/blogs/2025/08/10/release-0.5.0/" target="_blank" rel="noopener noreferrer" class="">0.5.0</a>, we're excited to release <strong><a href="https://github.com/apache/iggy/releases/tag/server-0.6.0" target="_blank" rel="noopener noreferrer" class="">Apache Iggy 0.6.0</a></strong> — our biggest architectural change yet.</p>
+<p>This release represents a <strong>major architectural evolution</strong> of Apache Iggy with substantial performance improvements, new connectors, and SDK enhancements.</p></div><footer class="row docusaurus-mt-lg"><div class="col col--9"><b>Tags:</b><ul class="tags_jXut padding--none margin-left--sm"><li class="tag_QGVx"><a rel="tag" class="tag_zVej tagRegular_sFm0" href="/blogs/tags/release">release</a></li><li class="tag_QGVx"><a rel="tag" class="tag_zVej tagRegular_sFm0" href="/bl [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/blogs/tags/announcement/index.html b/blogs/tags/announcement/index.html
new file mode 100644
index 00000000..f74a6ec1
--- /dev/null
+++ b/blogs/tags/announcement/index.html
@@ -0,0 +1,33 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="blog-wrapper blog-tags-post-list-page plugin-blog plugin-id-default" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">2 posts tagged with "announcement" | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed">
+
+
+
+
+
+<link rel="preconnect" href="https://analytics.apache.org/">
+<script>var _paq=window._paq=window._paq||[];_paq.push(["setRequestMethod","POST"]),_paq.push(["trackPageView"]),_paq.push(["enableLinkTracking"]),_paq.push(["enableHeartBeatTimer"]),function(){var e="https://analytics.apache.org/";_paq.push(["setRequestMethod","POST"]),_paq.push(["setTrackerUrl",e+"matomo.php"]),_paq.push(["setSiteId","80"]);var a=document,t=a.createElement("script"),p=a.getElementsByTagName("script")[0];t.type="text/javascript",t.async=!0,t.src=e+"matomo.js",p.parentNo [...]
+<script src="/assets/js/runtime~main.0a940c88.js" defer="defer"></script>
+<script src="/assets/js/main.4a006c5e.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/img/apache-iggy0.5x.png"><link rel="preload" as="image" [...]
+<p>Four months after <a href="https://iggy.apache.org/blogs/2025/08/10/release-0.5.0/" target="_blank" rel="noopener noreferrer" class="">0.5.0</a>, we're excited to release <strong><a href="https://github.com/apache/iggy/releases/tag/server-0.6.0" target="_blank" rel="noopener noreferrer" class="">Apache Iggy 0.6.0</a></strong> — our biggest architectural change yet.</p>
+<p>This release represents a <strong>major architectural evolution</strong> of Apache Iggy with substantial performance improvements, new connectors, and SDK enhancements.</p></div><footer class="row docusaurus-mt-lg"><div class="col col--9"><b>Tags:</b><ul class="tags_jXut padding--none margin-left--sm"><li class="tag_QGVx"><a rel="tag" class="tag_zVej tagRegular_sFm0" href="/blogs/tags/release">release</a></li><li class="tag_QGVx"><a rel="tag" class="tag_zVej tagRegular_sFm0" href="/bl [...]
+<p>It’s been four months since our last <a href="https://github.com/apache/iggy/releases/tag/server-0.4.300" target="_blank" rel="noopener noreferrer" class="">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" target="_blank" rel="noopener noreferrer" class="">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></div><footer class="row docusaurus-mt-lg"><div class="col col--9"><b>Tags:</b><ul class="tags_jXut padding--none margin-left--sm"><li class="tag_QGVx"><a rel="tag" class="tag_zVej tagRegular_sFm0" href="/blogs/tags/release">release</a></li><li class="tag_QGVx"><a rel="tag" class="tag_zVej tagRegular_sFm0" href="/blogs/tags/0-5-0">0.5. [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/blogs/tags/async/index.html b/blogs/tags/async/index.html
new file mode 100644
index 00000000..9f8d6965
--- /dev/null
+++ b/blogs/tags/async/index.html
@@ -0,0 +1,29 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="blog-wrapper blog-tags-post-list-page plugin-blog plugin-id-default" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">One post tagged with "async" | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"> [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed">
+
+
+
+
+
+<link rel="preconnect" href="https://analytics.apache.org/">
+<script>var _paq=window._paq=window._paq||[];_paq.push(["setRequestMethod","POST"]),_paq.push(["trackPageView"]),_paq.push(["enableLinkTracking"]),_paq.push(["enableHeartBeatTimer"]),function(){var e="https://analytics.apache.org/";_paq.push(["setRequestMethod","POST"]),_paq.push(["setTrackerUrl",e+"matomo.php"]),_paq.push(["setSiteId","80"]);var a=document,t=a.createElement("script"),p=a.getElementsByTagName("script")[0];t.type="text/javascript",t.async=!0,t.src=e+"matomo.js",p.parentNo [...]
+<script src="/assets/js/runtime~main.0a940c88.js" defer="defer"></script>
+<script src="/assets/js/main.4a006c5e.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/img/apache-iggy0.5x.png"><link rel="preload" as="image" [...]
+<p>In our <a href="https://iggy.apache.org/blogs/2025/08/10/release-0.5.0" target="_blank" rel="noopener noreferrer" class="">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</ [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/blogs/tags/breaking-changes/index.html b/blogs/tags/breaking-changes/index.html
new file mode 100644
index 00000000..4caa4b79
--- /dev/null
+++ b/blogs/tags/breaking-changes/index.html
@@ -0,0 +1,28 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="blog-wrapper blog-tags-post-list-page plugin-blog plugin-id-default" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">One post tagged with "breaking-changes" | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-b [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed">
+
+
+
+
+
+<link rel="preconnect" href="https://analytics.apache.org/">
+<script>var _paq=window._paq=window._paq||[];_paq.push(["setRequestMethod","POST"]),_paq.push(["trackPageView"]),_paq.push(["enableLinkTracking"]),_paq.push(["enableHeartBeatTimer"]),function(){var e="https://analytics.apache.org/";_paq.push(["setRequestMethod","POST"]),_paq.push(["setTrackerUrl",e+"matomo.php"]),_paq.push(["setSiteId","80"]);var a=document,t=a.createElement("script"),p=a.getElementsByTagName("script")[0];t.type="text/javascript",t.async=!0,t.src=e+"matomo.js",p.parentNo [...]
+<script src="/assets/js/runtime~main.0a940c88.js" defer="defer"></script>
+<script src="/assets/js/main.4a006c5e.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/img/apache-iggy0.5x.png"><link rel="preload" as="image" [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/blogs/tags/compio/index.html b/blogs/tags/compio/index.html
new file mode 100644
index 00000000..bdb1d926
--- /dev/null
+++ b/blogs/tags/compio/index.html
@@ -0,0 +1,29 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="blog-wrapper blog-tags-post-list-page plugin-blog plugin-id-default" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">One post tagged with "compio" | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png" [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed">
+
+
+
+
+
+<link rel="preconnect" href="https://analytics.apache.org/">
+<script>var _paq=window._paq=window._paq||[];_paq.push(["setRequestMethod","POST"]),_paq.push(["trackPageView"]),_paq.push(["enableLinkTracking"]),_paq.push(["enableHeartBeatTimer"]),function(){var e="https://analytics.apache.org/";_paq.push(["setRequestMethod","POST"]),_paq.push(["setTrackerUrl",e+"matomo.php"]),_paq.push(["setSiteId","80"]);var a=document,t=a.createElement("script"),p=a.getElementsByTagName("script")[0];t.type="text/javascript",t.async=!0,t.src=e+"matomo.js",p.parentNo [...]
+<script src="/assets/js/runtime~main.0a940c88.js" defer="defer"></script>
+<script src="/assets/js/main.4a006c5e.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/img/apache-iggy0.5x.png"><link rel="preload" as="image" [...]
+<p>In our <a href="https://iggy.apache.org/blogs/2025/08/10/release-0.5.0" target="_blank" rel="noopener noreferrer" class="">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</ [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/blogs/tags/consumers/index.html b/blogs/tags/consumers/index.html
new file mode 100644
index 00000000..28c70fc7
--- /dev/null
+++ b/blogs/tags/consumers/index.html
@@ -0,0 +1,28 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="blog-wrapper blog-tags-post-list-page plugin-blog plugin-id-default" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">One post tagged with "consumers" | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.p [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed">
+
+
+
+
+
+<link rel="preconnect" href="https://analytics.apache.org/">
+<script>var _paq=window._paq=window._paq||[];_paq.push(["setRequestMethod","POST"]),_paq.push(["trackPageView"]),_paq.push(["enableLinkTracking"]),_paq.push(["enableHeartBeatTimer"]),function(){var e="https://analytics.apache.org/";_paq.push(["setRequestMethod","POST"]),_paq.push(["setTrackerUrl",e+"matomo.php"]),_paq.push(["setSiteId","80"]);var a=document,t=a.createElement("script"),p=a.getElementsByTagName("script")[0];t.type="text/javascript",t.async=!0,t.src=e+"matomo.js",p.parentNo [...]
+<script src="/assets/js/runtime~main.0a940c88.js" defer="defer"></script>
+<script src="/assets/js/main.4a006c5e.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/img/apache-iggy0.5x.png"><link rel="preload" as="image" [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/blogs/tags/hello/index.html b/blogs/tags/hello/index.html
new file mode 100644
index 00000000..4e784551
--- /dev/null
+++ b/blogs/tags/hello/index.html
@@ -0,0 +1,28 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="blog-wrapper blog-tags-post-list-page plugin-blog plugin-id-default" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">One post tagged with "hello" | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"> [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed">
+
+
+
+
+
+<link rel="preconnect" href="https://analytics.apache.org/">
+<script>var _paq=window._paq=window._paq||[];_paq.push(["setRequestMethod","POST"]),_paq.push(["trackPageView"]),_paq.push(["enableLinkTracking"]),_paq.push(["enableHeartBeatTimer"]),function(){var e="https://analytics.apache.org/";_paq.push(["setRequestMethod","POST"]),_paq.push(["setTrackerUrl",e+"matomo.php"]),_paq.push(["setSiteId","80"]);var a=document,t=a.createElement("script"),p=a.getElementsByTagName("script")[0];t.type="text/javascript",t.async=!0,t.src=e+"matomo.js",p.parentNo [...]
+<script src="/assets/js/runtime~main.0a940c88.js" defer="defer"></script>
+<script src="/assets/js/main.4a006c5e.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/img/apache-iggy0.5x.png"><link rel="preload" as="image" [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/blogs/tags/identifier/index.html b/blogs/tags/identifier/index.html
new file mode 100644
index 00000000..dbddc2af
--- /dev/null
+++ b/blogs/tags/identifier/index.html
@@ -0,0 +1,28 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="blog-wrapper blog-tags-post-list-page plugin-blog plugin-id-default" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">One post tagged with "identifier" | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x. [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed">
+
+
+
+
+
+<link rel="preconnect" href="https://analytics.apache.org/">
+<script>var _paq=window._paq=window._paq||[];_paq.push(["setRequestMethod","POST"]),_paq.push(["trackPageView"]),_paq.push(["enableLinkTracking"]),_paq.push(["enableHeartBeatTimer"]),function(){var e="https://analytics.apache.org/";_paq.push(["setRequestMethod","POST"]),_paq.push(["setTrackerUrl",e+"matomo.php"]),_paq.push(["setSiteId","80"]);var a=document,t=a.createElement("script"),p=a.getElementsByTagName("script")[0];t.type="text/javascript",t.async=!0,t.src=e+"matomo.js",p.parentNo [...]
+<script src="/assets/js/runtime~main.0a940c88.js" defer="defer"></script>
+<script src="/assets/js/main.4a006c5e.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/img/apache-iggy0.5x.png"><link rel="preload" as="image" [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/blogs/tags/index.html b/blogs/tags/index.html
new file mode 100644
index 00000000..06fa96b0
--- /dev/null
+++ b/blogs/tags/index.html
@@ -0,0 +1,28 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="blog-wrapper blog-tags-list-page plugin-blog plugin-id-default" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">Tags | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" property="og: [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed">
+
+
+
+
+
+<link rel="preconnect" href="https://analytics.apache.org/">
+<script>var _paq=window._paq=window._paq||[];_paq.push(["setRequestMethod","POST"]),_paq.push(["trackPageView"]),_paq.push(["enableLinkTracking"]),_paq.push(["enableHeartBeatTimer"]),function(){var e="https://analytics.apache.org/";_paq.push(["setRequestMethod","POST"]),_paq.push(["setTrackerUrl",e+"matomo.php"]),_paq.push(["setSiteId","80"]);var a=document,t=a.createElement("script"),p=a.getElementsByTagName("script")[0];t.type="text/javascript",t.async=!0,t.src=e+"matomo.js",p.parentNo [...]
+<script src="/assets/js/runtime~main.0a940c88.js" defer="defer"></script>
+<script src="/assets/js/main.4a006c5e.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/img/apache-iggy0.5x.png"><link rel="preload" as="image" [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/blogs/tags/io-uring/index.html b/blogs/tags/io-uring/index.html
new file mode 100644
index 00000000..1f766538
--- /dev/null
+++ b/blogs/tags/io-uring/index.html
@@ -0,0 +1,29 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="blog-wrapper blog-tags-post-list-page plugin-blog plugin-id-default" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">One post tagged with "io_uring" | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.pn [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed">
+
+
+
+
+
+<link rel="preconnect" href="https://analytics.apache.org/">
+<script>var _paq=window._paq=window._paq||[];_paq.push(["setRequestMethod","POST"]),_paq.push(["trackPageView"]),_paq.push(["enableLinkTracking"]),_paq.push(["enableHeartBeatTimer"]),function(){var e="https://analytics.apache.org/";_paq.push(["setRequestMethod","POST"]),_paq.push(["setTrackerUrl",e+"matomo.php"]),_paq.push(["setSiteId","80"]);var a=document,t=a.createElement("script"),p=a.getElementsByTagName("script")[0];t.type="text/javascript",t.async=!0,t.src=e+"matomo.js",p.parentNo [...]
+<script src="/assets/js/runtime~main.0a940c88.js" defer="defer"></script>
+<script src="/assets/js/main.4a006c5e.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/img/apache-iggy0.5x.png"><link rel="preload" as="image" [...]
+<p>In our <a href="https://iggy.apache.org/blogs/2025/08/10/release-0.5.0" target="_blank" rel="noopener noreferrer" class="">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</ [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/blogs/tags/message-checksum/index.html b/blogs/tags/message-checksum/index.html
new file mode 100644
index 00000000..b382ffb8
--- /dev/null
+++ b/blogs/tags/message-checksum/index.html
@@ -0,0 +1,28 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="blog-wrapper blog-tags-post-list-page plugin-blog plugin-id-default" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">One post tagged with "message-checksum" | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-b [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed">
+
+
+
+
+
+<link rel="preconnect" href="https://analytics.apache.org/">
+<script>var _paq=window._paq=window._paq||[];_paq.push(["setRequestMethod","POST"]),_paq.push(["trackPageView"]),_paq.push(["enableLinkTracking"]),_paq.push(["enableHeartBeatTimer"]),function(){var e="https://analytics.apache.org/";_paq.push(["setRequestMethod","POST"]),_paq.push(["setTrackerUrl",e+"matomo.php"]),_paq.push(["setSiteId","80"]);var a=document,t=a.createElement("script"),p=a.getElementsByTagName("script")[0];t.type="text/javascript",t.async=!0,t.src=e+"matomo.js",p.parentNo [...]
+<script src="/assets/js/runtime~main.0a940c88.js" defer="defer"></script>
+<script src="/assets/js/main.4a006c5e.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/img/apache-iggy0.5x.png"><link rel="preload" as="image" [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/blogs/tags/message-expiry/index.html b/blogs/tags/message-expiry/index.html
new file mode 100644
index 00000000..a9438e4c
--- /dev/null
+++ b/blogs/tags/message-expiry/index.html
@@ -0,0 +1,28 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="blog-wrapper blog-tags-post-list-page plugin-blog plugin-id-default" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">One post tagged with "message-expiry" | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0 [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed">
+
+
+
+
+
+<link rel="preconnect" href="https://analytics.apache.org/">
+<script>var _paq=window._paq=window._paq||[];_paq.push(["setRequestMethod","POST"]),_paq.push(["trackPageView"]),_paq.push(["enableLinkTracking"]),_paq.push(["enableHeartBeatTimer"]),function(){var e="https://analytics.apache.org/";_paq.push(["setRequestMethod","POST"]),_paq.push(["setTrackerUrl",e+"matomo.php"]),_paq.push(["setSiteId","80"]);var a=document,t=a.createElement("script"),p=a.getElementsByTagName("script")[0];t.type="text/javascript",t.async=!0,t.src=e+"matomo.js",p.parentNo [...]
+<script src="/assets/js/runtime~main.0a940c88.js" defer="defer"></script>
+<script src="/assets/js/main.4a006c5e.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/img/apache-iggy0.5x.png"><link rel="preload" as="image" [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/blogs/tags/message-headers/index.html b/blogs/tags/message-headers/index.html
new file mode 100644
index 00000000..04971f15
--- /dev/null
+++ b/blogs/tags/message-headers/index.html
@@ -0,0 +1,28 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="blog-wrapper blog-tags-post-list-page plugin-blog plugin-id-default" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">One post tagged with "message-headers" | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed">
+
+
+
+
+
+<link rel="preconnect" href="https://analytics.apache.org/">
+<script>var _paq=window._paq=window._paq||[];_paq.push(["setRequestMethod","POST"]),_paq.push(["trackPageView"]),_paq.push(["enableLinkTracking"]),_paq.push(["enableHeartBeatTimer"]),function(){var e="https://analytics.apache.org/";_paq.push(["setRequestMethod","POST"]),_paq.push(["setTrackerUrl",e+"matomo.php"]),_paq.push(["setSiteId","80"]);var a=document,t=a.createElement("script"),p=a.getElementsByTagName("script")[0];t.type="text/javascript",t.async=!0,t.src=e+"matomo.js",p.parentNo [...]
+<script src="/assets/js/runtime~main.0a940c88.js" defer="defer"></script>
+<script src="/assets/js/main.4a006c5e.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/img/apache-iggy0.5x.png"><link rel="preload" as="image" [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/blogs/tags/message-state/index.html b/blogs/tags/message-state/index.html
new file mode 100644
index 00000000..abad9e80
--- /dev/null
+++ b/blogs/tags/message-state/index.html
@@ -0,0 +1,28 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="blog-wrapper blog-tags-post-list-page plugin-blog plugin-id-default" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">One post tagged with "message-state" | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0. [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed">
+
+
+
+
+
+<link rel="preconnect" href="https://analytics.apache.org/">
+<script>var _paq=window._paq=window._paq||[];_paq.push(["setRequestMethod","POST"]),_paq.push(["trackPageView"]),_paq.push(["enableLinkTracking"]),_paq.push(["enableHeartBeatTimer"]),function(){var e="https://analytics.apache.org/";_paq.push(["setRequestMethod","POST"]),_paq.push(["setTrackerUrl",e+"matomo.php"]),_paq.push(["setSiteId","80"]);var a=document,t=a.createElement("script"),p=a.getElementsByTagName("script")[0];t.type="text/javascript",t.async=!0,t.src=e+"matomo.js",p.parentNo [...]
+<script src="/assets/js/runtime~main.0a940c88.js" defer="defer"></script>
+<script src="/assets/js/main.4a006c5e.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/img/apache-iggy0.5x.png"><link rel="preload" as="image" [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/blogs/tags/new-features/index.html b/blogs/tags/new-features/index.html
new file mode 100644
index 00000000..82c1f448
--- /dev/null
+++ b/blogs/tags/new-features/index.html
@@ -0,0 +1,28 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="blog-wrapper blog-tags-post-list-page plugin-blog plugin-id-default" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">6 posts tagged with "new-features" | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed">
+
+
+
+
+
+<link rel="preconnect" href="https://analytics.apache.org/">
+<script>var _paq=window._paq=window._paq||[];_paq.push(["setRequestMethod","POST"]),_paq.push(["trackPageView"]),_paq.push(["enableLinkTracking"]),_paq.push(["enableHeartBeatTimer"]),function(){var e="https://analytics.apache.org/";_paq.push(["setRequestMethod","POST"]),_paq.push(["setTrackerUrl",e+"matomo.php"]),_paq.push(["setSiteId","80"]);var a=document,t=a.createElement("script"),p=a.getElementsByTagName("script")[0];t.type="text/javascript",t.async=!0,t.src=e+"matomo.js",p.parentNo [...]
+<script src="/assets/js/runtime~main.0a940c88.js" defer="defer"></script>
+<script src="/assets/js/main.4a006c5e.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/img/apache-iggy0.5x.png"><link rel="preload" as="image" [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/blogs/tags/pat/index.html b/blogs/tags/pat/index.html
new file mode 100644
index 00000000..55cd6ebc
--- /dev/null
+++ b/blogs/tags/pat/index.html
@@ -0,0 +1,28 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="blog-wrapper blog-tags-post-list-page plugin-blog plugin-id-default" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">One post tagged with "pat" | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><m [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed">
+
+
+
+
+
+<link rel="preconnect" href="https://analytics.apache.org/">
+<script>var _paq=window._paq=window._paq||[];_paq.push(["setRequestMethod","POST"]),_paq.push(["trackPageView"]),_paq.push(["enableLinkTracking"]),_paq.push(["enableHeartBeatTimer"]),function(){var e="https://analytics.apache.org/";_paq.push(["setRequestMethod","POST"]),_paq.push(["setTrackerUrl",e+"matomo.php"]),_paq.push(["setSiteId","80"]);var a=document,t=a.createElement("script"),p=a.getElementsByTagName("script")[0];t.type="text/javascript",t.async=!0,t.src=e+"matomo.js",p.parentNo [...]
+<script src="/assets/js/runtime~main.0a940c88.js" defer="defer"></script>
+<script src="/assets/js/main.4a006c5e.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/img/apache-iggy0.5x.png"><link rel="preload" as="image" [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/blogs/tags/performance/index.html b/blogs/tags/performance/index.html
new file mode 100644
index 00000000..6a8a33b4
--- /dev/null
+++ b/blogs/tags/performance/index.html
@@ -0,0 +1,29 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="blog-wrapper blog-tags-post-list-page plugin-blog plugin-id-default" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">One post tagged with "performance" | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed">
+
+
+
+
+
+<link rel="preconnect" href="https://analytics.apache.org/">
+<script>var _paq=window._paq=window._paq||[];_paq.push(["setRequestMethod","POST"]),_paq.push(["trackPageView"]),_paq.push(["enableLinkTracking"]),_paq.push(["enableHeartBeatTimer"]),function(){var e="https://analytics.apache.org/";_paq.push(["setRequestMethod","POST"]),_paq.push(["setTrackerUrl",e+"matomo.php"]),_paq.push(["setSiteId","80"]);var a=document,t=a.createElement("script"),p=a.getElementsByTagName("script")[0];t.type="text/javascript",t.async=!0,t.src=e+"matomo.js",p.parentNo [...]
+<script src="/assets/js/runtime~main.0a940c88.js" defer="defer"></script>
+<script src="/assets/js/main.4a006c5e.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/img/apache-iggy0.5x.png"><link rel="preload" as="image" [...]
+<p>In our <a href="https://iggy.apache.org/blogs/2025/08/10/release-0.5.0" target="_blank" rel="noopener noreferrer" class="">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</ [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/blogs/tags/permissions/index.html b/blogs/tags/permissions/index.html
new file mode 100644
index 00000000..fbd4e96d
--- /dev/null
+++ b/blogs/tags/permissions/index.html
@@ -0,0 +1,28 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="blog-wrapper blog-tags-post-list-page plugin-blog plugin-id-default" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">One post tagged with "permissions" | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed">
+
+
+
+
+
+<link rel="preconnect" href="https://analytics.apache.org/">
+<script>var _paq=window._paq=window._paq||[];_paq.push(["setRequestMethod","POST"]),_paq.push(["trackPageView"]),_paq.push(["enableLinkTracking"]),_paq.push(["enableHeartBeatTimer"]),function(){var e="https://analytics.apache.org/";_paq.push(["setRequestMethod","POST"]),_paq.push(["setTrackerUrl",e+"matomo.php"]),_paq.push(["setSiteId","80"]);var a=document,t=a.createElement("script"),p=a.getElementsByTagName("script")[0];t.type="text/javascript",t.async=!0,t.src=e+"matomo.js",p.parentNo [...]
+<script src="/assets/js/runtime~main.0a940c88.js" defer="defer"></script>
+<script src="/assets/js/main.4a006c5e.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/img/apache-iggy0.5x.png"><link rel="preload" as="image" [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/blogs/tags/personal-access-tokens/index.html b/blogs/tags/personal-access-tokens/index.html
new file mode 100644
index 00000000..d2f4f041
--- /dev/null
+++ b/blogs/tags/personal-access-tokens/index.html
@@ -0,0 +1,28 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="blog-wrapper blog-tags-post-list-page plugin-blog plugin-id-default" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">One post tagged with "personal-access-tokens" | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-l [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed">
+
+
+
+
+
+<link rel="preconnect" href="https://analytics.apache.org/">
+<script>var _paq=window._paq=window._paq||[];_paq.push(["setRequestMethod","POST"]),_paq.push(["trackPageView"]),_paq.push(["enableLinkTracking"]),_paq.push(["enableHeartBeatTimer"]),function(){var e="https://analytics.apache.org/";_paq.push(["setRequestMethod","POST"]),_paq.push(["setTrackerUrl",e+"matomo.php"]),_paq.push(["setSiteId","80"]);var a=document,t=a.createElement("script"),p=a.getElementsByTagName("script")[0];t.type="text/javascript",t.async=!0,t.src=e+"matomo.js",p.parentNo [...]
+<script src="/assets/js/runtime~main.0a940c88.js" defer="defer"></script>
+<script src="/assets/js/main.4a006c5e.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/img/apache-iggy0.5x.png"><link rel="preload" as="image" [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/blogs/tags/release/index.html b/blogs/tags/release/index.html
new file mode 100644
index 00000000..3e34fb30
--- /dev/null
+++ b/blogs/tags/release/index.html
@@ -0,0 +1,33 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="blog-wrapper blog-tags-post-list-page plugin-blog plugin-id-default" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">3 posts tagged with "release" | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png" [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed">
+
+
+
+
+
+<link rel="preconnect" href="https://analytics.apache.org/">
+<script>var _paq=window._paq=window._paq||[];_paq.push(["setRequestMethod","POST"]),_paq.push(["trackPageView"]),_paq.push(["enableLinkTracking"]),_paq.push(["enableHeartBeatTimer"]),function(){var e="https://analytics.apache.org/";_paq.push(["setRequestMethod","POST"]),_paq.push(["setTrackerUrl",e+"matomo.php"]),_paq.push(["setSiteId","80"]);var a=document,t=a.createElement("script"),p=a.getElementsByTagName("script")[0];t.type="text/javascript",t.async=!0,t.src=e+"matomo.js",p.parentNo [...]
+<script src="/assets/js/runtime~main.0a940c88.js" defer="defer"></script>
+<script src="/assets/js/main.4a006c5e.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/img/apache-iggy0.5x.png"><link rel="preload" as="image" [...]
+<p>Four months after <a href="https://iggy.apache.org/blogs/2025/08/10/release-0.5.0/" target="_blank" rel="noopener noreferrer" class="">0.5.0</a>, we're excited to release <strong><a href="https://github.com/apache/iggy/releases/tag/server-0.6.0" target="_blank" rel="noopener noreferrer" class="">Apache Iggy 0.6.0</a></strong> — our biggest architectural change yet.</p>
+<p>This release represents a <strong>major architectural evolution</strong> of Apache Iggy with substantial performance improvements, new connectors, and SDK enhancements.</p></div><footer class="row docusaurus-mt-lg"><div class="col col--9"><b>Tags:</b><ul class="tags_jXut padding--none margin-left--sm"><li class="tag_QGVx"><a rel="tag" class="tag_zVej tagRegular_sFm0" href="/blogs/tags/release">release</a></li><li class="tag_QGVx"><a rel="tag" class="tag_zVej tagRegular_sFm0" href="/bl [...]
+<p>It’s been four months since our last <a href="https://github.com/apache/iggy/releases/tag/server-0.4.300" target="_blank" rel="noopener noreferrer" class="">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" target="_blank" rel="noopener noreferrer" class="">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></div><footer class="row docusaurus-mt-lg"><div class="col col--9"><b>Tags:</b><ul class="tags_jXut padding--none margin-left--sm"><li class="tag_QGVx"><a rel="tag" class="tag_zVej tagRegular_sFm0" href="/blogs/tags/release">release</a></li><li class="tag_QGVx"><a rel="tag" class="tag_zVej tagRegular_sFm0" href="/blogs/tags/0-5-0">0.5. [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/blogs/tags/schema/index.html b/blogs/tags/schema/index.html
new file mode 100644
index 00000000..5cc304c8
--- /dev/null
+++ b/blogs/tags/schema/index.html
@@ -0,0 +1,28 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="blog-wrapper blog-tags-post-list-page plugin-blog plugin-id-default" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">One post tagged with "schema" | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png" [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed">
+
+
+
+
+
+<link rel="preconnect" href="https://analytics.apache.org/">
+<script>var _paq=window._paq=window._paq||[];_paq.push(["setRequestMethod","POST"]),_paq.push(["trackPageView"]),_paq.push(["enableLinkTracking"]),_paq.push(["enableHeartBeatTimer"]),function(){var e="https://analytics.apache.org/";_paq.push(["setRequestMethod","POST"]),_paq.push(["setTrackerUrl",e+"matomo.php"]),_paq.push(["setSiteId","80"]);var a=document,t=a.createElement("script"),p=a.getElementsByTagName("script")[0];t.type="text/javascript",t.async=!0,t.src=e+"matomo.js",p.parentNo [...]
+<script src="/assets/js/runtime~main.0a940c88.js" defer="defer"></script>
+<script src="/assets/js/main.4a006c5e.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/img/apache-iggy0.5x.png"><link rel="preload" as="image" [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/blogs/tags/update/index.html b/blogs/tags/update/index.html
new file mode 100644
index 00000000..b00e141b
--- /dev/null
+++ b/blogs/tags/update/index.html
@@ -0,0 +1,28 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="blog-wrapper blog-tags-post-list-page plugin-blog plugin-id-default" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">One post tagged with "update" | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png" [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed">
+
+
+
+
+
+<link rel="preconnect" href="https://analytics.apache.org/">
+<script>var _paq=window._paq=window._paq||[];_paq.push(["setRequestMethod","POST"]),_paq.push(["trackPageView"]),_paq.push(["enableLinkTracking"]),_paq.push(["enableHeartBeatTimer"]),function(){var e="https://analytics.apache.org/";_paq.push(["setRequestMethod","POST"]),_paq.push(["setTrackerUrl",e+"matomo.php"]),_paq.push(["setSiteId","80"]);var a=document,t=a.createElement("script"),p=a.getElementsByTagName("script")[0];t.type="text/javascript",t.async=!0,t.src=e+"matomo.js",p.parentNo [...]
+<script src="/assets/js/runtime~main.0a940c88.js" defer="defer"></script>
+<script src="/assets/js/main.4a006c5e.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/img/apache-iggy0.5x.png"><link rel="preload" as="image" [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/blogs/tags/users/index.html b/blogs/tags/users/index.html
new file mode 100644
index 00000000..d066bd11
--- /dev/null
+++ b/blogs/tags/users/index.html
@@ -0,0 +1,28 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="blog-wrapper blog-tags-post-list-page plugin-blog plugin-id-default" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">One post tagged with "users" | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"> [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed">
+
+
+
+
+
+<link rel="preconnect" href="https://analytics.apache.org/">
+<script>var _paq=window._paq=window._paq||[];_paq.push(["setRequestMethod","POST"]),_paq.push(["trackPageView"]),_paq.push(["enableLinkTracking"]),_paq.push(["enableHeartBeatTimer"]),function(){var e="https://analytics.apache.org/";_paq.push(["setRequestMethod","POST"]),_paq.push(["setTrackerUrl",e+"matomo.php"]),_paq.push(["setSiteId","80"]);var a=document,t=a.createElement("script"),p=a.getElementsByTagName("script")[0];t.type="text/javascript",t.async=!0,t.src=e+"matomo.js",p.parentNo [...]
+<script src="/assets/js/runtime~main.0a940c88.js" defer="defer"></script>
+<script src="/assets/js/main.4a006c5e.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/img/apache-iggy0.5x.png"><link rel="preload" as="image" [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/blogs/tags/websocket/index.html b/blogs/tags/websocket/index.html
new file mode 100644
index 00000000..d1a68df7
--- /dev/null
+++ b/blogs/tags/websocket/index.html
@@ -0,0 +1,29 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="blog-wrapper blog-tags-post-list-page plugin-blog plugin-id-default" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">One post tagged with "websocket" | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.p [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed">
+
+
+
+
+
+<link rel="preconnect" href="https://analytics.apache.org/">
+<script>var _paq=window._paq=window._paq||[];_paq.push(["setRequestMethod","POST"]),_paq.push(["trackPageView"]),_paq.push(["enableLinkTracking"]),_paq.push(["enableHeartBeatTimer"]),function(){var e="https://analytics.apache.org/";_paq.push(["setRequestMethod","POST"]),_paq.push(["setTrackerUrl",e+"matomo.php"]),_paq.push(["setSiteId","80"]);var a=document,t=a.createElement("script"),p=a.getElementsByTagName("script")[0];t.type="text/javascript",t.async=!0,t.src=e+"matomo.js",p.parentNo [...]
+<script src="/assets/js/runtime~main.0a940c88.js" defer="defer"></script>
+<script src="/assets/js/main.4a006c5e.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/img/apache-iggy0.5x.png"><link rel="preload" as="image" [...]
+<p>In our <a href="https://iggy.apache.org/blogs/2025/08/10/release-0.5.0" target="_blank" rel="noopener noreferrer" class="">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</ [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/blogs/updated-schemas/index.html b/blogs/updated-schemas/index.html
new file mode 100644
index 00000000..5e8a1cb8
--- /dev/null
+++ b/blogs/updated-schemas/index.html
@@ -0,0 +1,43 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="blog-wrapper blog-post-page plugin-blog plugin-id-default" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">Updated schemas | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" pr [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed">
+
+
+
+
+
+<link rel="preconnect" href="https://analytics.apache.org/">
+<script>var _paq=window._paq=window._paq||[];_paq.push(["setRequestMethod","POST"]),_paq.push(["trackPageView"]),_paq.push(["enableLinkTracking"]),_paq.push(["enableHeartBeatTimer"]),function(){var e="https://analytics.apache.org/";_paq.push(["setRequestMethod","POST"]),_paq.push(["setTrackerUrl",e+"matomo.php"]),_paq.push(["setSiteId","80"]);var a=document,t=a.createElement("script"),p=a.getElementsByTagName("script")[0];t.type="text/javascript",t.async=!0,t.src=e+"matomo.js",p.parentNo [...]
+<script src="/assets/js/runtime~main.0a940c88.js" defer="defer"></script>
+<script src="/assets/js/main.4a006c5e.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/img/apache-iggy0.5x.png"><link rel="preload" as="image" [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="breaking-changes">Breaking changes<a href="#breaking-changes" class="hash-link" aria-label="Direct link to Breaking changes" title="Direct link to Breaking changes" translate="no"></a></h2>
+<p>Breaking changes have been introduced with the commit <a href="https://github.com/apache/iggy/commit/670a8baba8617bb7e52bd51d556a621349e2e9f0" target="_blank" rel="noopener noreferrer" class="">#670a8ba</a>. The available <a href="https://crates.io/crates/iggy" target="_blank" rel="noopener noreferrer" class="">iggy crate</a> supports these changes since version 0.0.60.</p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="pollmessages">PollMessages<a href="#pollmessages" class="hash-link" aria-label="Direct link to PollMessages" title="Direct link to PollMessages" translate="no"></a></h2>
+<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 [...]
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<p>Serialization:</p>
+<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Partition ID (4 bytes) + Current offset (8 bytes) + Messages count (4 bytes) + Messages (N [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="getconsumeroffset">GetConsumerOffset<a href="#getconsumeroffset" class="hash-link" aria-label="Direct link to GetConsumerOffset" title="Direct link to GetConsumerOffset" translate="no"></a></h2>
+<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>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<p>Serialization:</p>
+<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Partition ID (4 bytes) + Current offset (8 bytes) + Stored offset (8 bytes)</span><br></spa [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="stream-topic-partition">Stream, Topic, Partition<a href="#stream-topic-partition" class="hash-link" aria-label="Direct link to Stream, Topic, Partition" title="Direct link to Stream, Topic, Partition" translate="no"></a></h2>
+<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="docusaurus-mt-lg"><div class="row margin-top--sm theme-blog-footer-edit-meta-row"><div class="col"><b>Tags:</b><ul class="tags_jXut padding--none margin-left--sm"><li class="tag_QGVx"><a rel="tag" class="tag_zVej tagRegular_sFm0" href="/blogs/tags/update">update</a></li><li class="tag_QGVx"><a re [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/blogs/users-and-permissions/index.html b/blogs/users-and-permissions/index.html
new file mode 100644
index 00000000..e82eb0fc
--- /dev/null
+++ b/blogs/users-and-permissions/index.html
@@ -0,0 +1,69 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="blog-wrapper blog-post-page plugin-blog plugin-id-default" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">Users and permissions | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="tr [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed">
+
+
+
+
+
+<link rel="preconnect" href="https://analytics.apache.org/">
+<script>var _paq=window._paq=window._paq||[];_paq.push(["setRequestMethod","POST"]),_paq.push(["trackPageView"]),_paq.push(["enableLinkTracking"]),_paq.push(["enableHeartBeatTimer"]),function(){var e="https://analytics.apache.org/";_paq.push(["setRequestMethod","POST"]),_paq.push(["setTrackerUrl",e+"matomo.php"]),_paq.push(["setSiteId","80"]);var a=document,t=a.createElement("script"),p=a.getElementsByTagName("script")[0];t.type="text/javascript",t.async=!0,t.src=e+"matomo.js",p.parentNo [...]
+<script src="/assets/js/runtime~main.0a940c88.js" defer="defer"></script>
+<script src="/assets/js/main.4a006c5e.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/img/apache-iggy0.5x.png"><link rel="preload" as="image" [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="breaking-changes">Breaking changes<a href="#breaking-changes" class="hash-link" aria-label="Direct link to Breaking changes" title="Direct link to Breaking changes" translate="no"></a></h2>
+<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>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<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" target="_blank" rel="noopener noreferrer" class="">#23b3309</a>. The available <a href="https://crates.io/crates/iggy" target="_blank" rel="noopener noreferrer" class="">iggy crate</a> supports these changes since version 0.0.80.</p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="configuration">Configuration<a href="#configuration" class="hash-link" aria-label="Direct link to Configuration" title="Direct link to Configuration" translate="no"></a></h2>
+<p>Currently, the authentication and authorization can be enabled in the <code>server.toml</code> configuration via <code>[system.user]</code> section:</p>
+<div class="language-toml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-toml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">[</span><span class="token table class-name">system.user</span> [...]
+<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>
+<div class="language-toml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-toml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">[</span><span class="token table class-name">http.jwt</span><sp [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="authentication-and-authorization">Authentication and authorization<a href="#authentication-and-authorization" class="hash-link" aria-label="Direct link to Authentication and authorization" title="Direct link to Authentication and authorization" translate="no"></a></h2>
+<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>
+<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class [...]
+<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>
+<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="sdk">SDK<a href="#sdk" class="hash-link" aria-label="Direct link to SDK" title="Direct link to SDK" translate="no"></a></h2>
+<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>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="commands-and-models">Commands and models<a href="#commands-and-models" class="hash-link" aria-label="Direct link to Commands and models" title="Direct link to Commands and models" translate="no"></a></h2>
+<p>The following commands and response models have been added:</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<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="anchor anchorTargetStickyNavbar_Vzrq" id="http-api">HTTP API<a href="#http-api" class="hash-link" aria-label="Direct link to HTTP API" title="Direct link to HTTP API" translate="no"></a></h2>
+<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>
+<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">POST {{url}}/users/login</span><br></span><span class="token-line" style="color:#393A34"><s [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/blogs/welcome-to-the-changelog/index.html b/blogs/welcome-to-the-changelog/index.html
new file mode 100644
index 00000000..e721954c
--- /dev/null
+++ b/blogs/welcome-to-the-changelog/index.html
@@ -0,0 +1,30 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="blog-wrapper blog-post-page plugin-blog plugin-id-default" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">Welcome to the changelog | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh= [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed">
+
+
+
+
+
+<link rel="preconnect" href="https://analytics.apache.org/">
+<script>var _paq=window._paq=window._paq||[];_paq.push(["setRequestMethod","POST"]),_paq.push(["trackPageView"]),_paq.push(["enableLinkTracking"]),_paq.push(["enableHeartBeatTimer"]),function(){var e="https://analytics.apache.org/";_paq.push(["setRequestMethod","POST"]),_paq.push(["setTrackerUrl",e+"matomo.php"]),_paq.push(["setSiteId","80"]);var a=document,t=a.createElement("script"),p=a.getElementsByTagName("script")[0];t.type="text/javascript",t.async=!0,t.src=e+"matomo.js",p.parentNo [...]
+<script src="/assets/js/runtime~main.0a940c88.js" defer="defer"></script>
+<script src="/assets/js/main.4a006c5e.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/img/apache-iggy0.5x.png"><link rel="preload" as="image" [...]
+<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="docusaurus-mt-lg"><div class="row margin-top--sm theme-blog-footer-edit-meta-row"><div class="col"><b>Tags:</b><ul class="tags_jXut padding--none margin-left--sm"><li class="tag_QGVx"><a rel="tag" class="tag_zVej tagRegular_sFm0" href="/blogs/tags/hello">hello</a></li></ul></div></div></footer></article><nav class="pagination-nav docusaurus-mt-lg" aria-label="Blog post page [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/building-message-streaming/gh_trending.jpeg b/building-message-streaming/gh_trending.jpeg
new file mode 100644
index 00000000..117b7e77
Binary files /dev/null and b/building-message-streaming/gh_trending.jpeg differ
diff --git a/building-message-streaming/iggy_bench.jpeg b/building-message-streaming/iggy_bench.jpeg
new file mode 100644
index 00000000..a3de266b
Binary files /dev/null and b/building-message-streaming/iggy_bench.jpeg differ
diff --git a/building-message-streaming/iggy_ci_cd.jpeg b/building-message-streaming/iggy_ci_cd.jpeg
new file mode 100644
index 00000000..0f7caf01
Binary files /dev/null and b/building-message-streaming/iggy_ci_cd.jpeg differ
diff --git a/building-message-streaming/iggy_cli.jpeg b/building-message-streaming/iggy_cli.jpeg
new file mode 100644
index 00000000..8520661a
Binary files /dev/null and b/building-message-streaming/iggy_cli.jpeg differ
diff --git a/building-message-streaming/iggy_sample.jpeg b/building-message-streaming/iggy_sample.jpeg
new file mode 100644
index 00000000..67cb96a6
Binary files /dev/null and b/building-message-streaming/iggy_sample.jpeg differ
diff --git a/building-message-streaming/iggy_server.jpeg b/building-message-streaming/iggy_server.jpeg
new file mode 100644
index 00000000..eaa7b762
Binary files /dev/null and b/building-message-streaming/iggy_server.jpeg differ
diff --git a/building-message-streaming/iggy_web_ui.jpeg b/building-message-streaming/iggy_web_ui.jpeg
new file mode 100644
index 00000000..168eeda4
Binary files /dev/null and b/building-message-streaming/iggy_web_ui.jpeg differ
diff --git a/building-message-streaming/iggys.jpeg b/building-message-streaming/iggys.jpeg
new file mode 100644
index 00000000..cd593d6f
Binary files /dev/null and b/building-message-streaming/iggys.jpeg differ
diff --git a/building-message-streaming/leader_elections.jpeg b/building-message-streaming/leader_elections.jpeg
new file mode 100644
index 00000000..352e9412
Binary files /dev/null and b/building-message-streaming/leader_elections.jpeg differ
diff --git a/docs/ai/introduction/index.html b/docs/ai/introduction/index.html
new file mode 100644
index 00000000..8ee1eaf9
--- /dev/null
+++ b/docs/ai/introduction/index.html
@@ -0,0 +1,29 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-ai/ai-introduction" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">Introduction | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" prope [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed">
+
+
+
+
+
+<link rel="preconnect" href="https://analytics.apache.org/">
+<script>var _paq=window._paq=window._paq||[];_paq.push(["setRequestMethod","POST"]),_paq.push(["trackPageView"]),_paq.push(["enableLinkTracking"]),_paq.push(["enableHeartBeatTimer"]),function(){var e="https://analytics.apache.org/";_paq.push(["setRequestMethod","POST"]),_paq.push(["setTrackerUrl",e+"matomo.php"]),_paq.push(["setSiteId","80"]);var a=document,t=a.createElement("script"),p=a.getElementsByTagName("script")[0];t.type="text/javascript",t.async=!0,t.src=e+"matomo.js",p.parentNo [...]
+<script src="/assets/js/runtime~main.0a940c88.js" defer="defer"></script>
+<script src="/assets/js/main.4a006c5e.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/img/apache-iggy0.5x.png"><link rel="preload" as="image" [...]
+<p>Please check the <strong><a class="" href="/docs/ai/mcp">MCP Server</a></strong> for the details about Iggy MCP (Model Context Protocol) server.</p></div></article><nav class="docusaurus-mt-lg pagination-nav" aria-label="Docs pages"><a class="pagination-nav__link pagination-nav__link--prev" href="/docs/connectors/sources/postgres"><div class="pagination-nav__sublabel">Previous</div><div class="pagination-nav__label">Postgres Source</div></a><a class="pagination-nav__link pagination-na [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/ai/mcp/index.html b/docs/ai/mcp/index.html
new file mode 100644
index 00000000..95d1f5ed
--- /dev/null
+++ b/docs/ai/mcp/index.html
@@ -0,0 +1,36 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-ai/ai-mcp" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">MCP Server | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" propert [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed">
+
+
+
+
+
+<link rel="preconnect" href="https://analytics.apache.org/">
+<script>var _paq=window._paq=window._paq||[];_paq.push(["setRequestMethod","POST"]),_paq.push(["trackPageView"]),_paq.push(["enableLinkTracking"]),_paq.push(["enableHeartBeatTimer"]),function(){var e="https://analytics.apache.org/";_paq.push(["setRequestMethod","POST"]),_paq.push(["setTrackerUrl",e+"matomo.php"]),_paq.push(["setSiteId","80"]);var a=document,t=a.createElement("script"),p=a.getElementsByTagName("script")[0];t.type="text/javascript",t.async=!0,t.src=e+"matomo.js",p.parentNo [...]
+<script src="/assets/js/runtime~main.0a940c88.js" defer="defer"></script>
+<script src="/assets/js/main.4a006c5e.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/img/apache-iggy0.5x.png"><link rel="preload" as="image" [...]
+<p>To start the MCP server, simply run <code>cargo run --bin iggy-mcp</code>.</p>
+<p>The <a href="https://hub.docker.com/r/apache/iggy-mcp" target="_blank" rel="noopener noreferrer" class="">docker image</a> is available, and can be fetched via <code>docker pull apache/iggy-mcp</code>.</p>
+<p>The minimal viable configuration requires at least the Iggy credentials, to create the connection with the running Iggy server using TCP with which the MCP server will communicate. You can choose between HTTP and STDIO transports (e.g. for the local usage with tools such as <a href="https://claude.ai/download" target="_blank" rel="noopener noreferrer" class="">Claude Desktop</a> choose <code>stdio</code>).</p>
+<div class="language-toml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-toml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key property" style="color:#36acaa">transport</span><span class="token plain"> </span><span class= [...]
+<p>Keep in mind that either of <code>toml</code>, <code>yaml</code>, or <code>json</code> formats are supported for the configuration file. The path to the configuration can be overriden by <code>IGGY_MCP_CONFIG_PATH</code> environment variable. Each configuration section can be also additionally updated by using the following convention <code>IGGY_MCP_SECTION_NAME.KEY_NAME</code> e.g. <code>IGGY_MCP_IGGY_USERNAME</code> and so on.</p>
+<p>Here's the example configuration to be used with Claude Desktop:</p>
+<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class [...]
+<p><strong>Remember to use the appropriate Iggy account credentials for your environment</strong> (e.g. create the user with read-only permissions to avoid modifying the data). On top of this, you can also configure the <code>permissions</code> for the MCP server to control which operations are allowed (this will be checked first, before forwarding the actual request to the Iggy server).</p></div></article><nav class="docusaurus-mt-lg pagination-nav" aria-label="Docs pages"><a class="pag [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/cli/iggy-cli/index.html b/docs/cli/iggy-cli/index.html
new file mode 100644
index 00000000..5e8e279c
--- /dev/null
+++ b/docs/cli/iggy-cli/index.html
@@ -0,0 +1,49 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-cli/cli-iggy-cli" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">Iggy CLI | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" property= [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed">
+
+
+
+
+
+<link rel="preconnect" href="https://analytics.apache.org/">
+<script>var _paq=window._paq=window._paq||[];_paq.push(["setRequestMethod","POST"]),_paq.push(["trackPageView"]),_paq.push(["enableLinkTracking"]),_paq.push(["enableHeartBeatTimer"]),function(){var e="https://analytics.apache.org/";_paq.push(["setRequestMethod","POST"]),_paq.push(["setTrackerUrl",e+"matomo.php"]),_paq.push(["setSiteId","80"]);var a=document,t=a.createElement("script"),p=a.getElementsByTagName("script")[0];t.type="text/javascript",t.async=!0,t.src=e+"matomo.js",p.parentNo [...]
+<script src="/assets/js/runtime~main.0a940c88.js" defer="defer"></script>
+<script src="/assets/js/main.4a006c5e.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/img/apache-iggy0.5x.png"><link rel="preload" as="image" [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="installation">Installation<a href="#installation" class="hash-link" aria-label="Direct link to Installation" title="Direct link to Installation" translate="no"></a></h2>
+<p>Currently, the only way to install the Iggy CLI is by using the Cargo package manager. You can install it by running the following command:</p>
+<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">cargo</span><span class="token plain"> </span><span class="token f [...]
+<p>Then, you can simply invoke the <code>iggy</code> command to see the available options and subcommands.</p>
+<p><img decoding="async" loading="lazy" alt="CLI" src="/assets/images/iggy_cli-b139e02165e2570574ac638f7db8801f.png" width="2048" height="893" class="img_ev3q"></p>
+<p>For example, you can use the following commands to list all the available streams given the server is running on the default address:</p>
+<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">iggy </span><span class="token parameter variable" style="color:#36acaa">--username</span>< [...]
+<p>or with the short syntax:</p>
+<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">iggy </span><span class="token parameter variable" style="color:#36acaa">-u</span><span cla [...]
+<p>To create a new stream with the specific TCP transport and server address, you can use the following command:</p>
+<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">iggy </span><span class="token parameter variable" style="color:#36acaa">--transport</span> [...]
+<p>To create a new topic within the stream with the specific partition count and retention policy, you can use the following command:</p>
+<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">iggy </span><span class="token parameter variable" style="color:#36acaa">-u</span><span cla [...]
+<p>To send a raw string message to the specific partition of the topic, you can use the following command:</p>
+<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">iggy </span><span class="token parameter variable" style="color:#36acaa">-u</span><span cla [...]
+<p>To fetch the messages from the specific partition of the topic, you can use the following command:</p>
+<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">iggy </span><span class="token parameter variable" style="color:#36acaa">-u</span><span cla [...]
+<p>You could also login with the specific user and password for the given duration and invoke the subsequent requests.
+<strong>Please keep in mind that this mode is only supported on Linux systems.</strong></p>
+<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">iggy </span><span class="token parameter variable" style="color:#36acaa">-u</span><span cla [...]
+<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">iggy stream list</span><br></span></code></pre></div></div></div></article><nav class="docu [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/connectors/introduction/index.html b/docs/connectors/introduction/index.html
new file mode 100644
index 00000000..dd8ba223
--- /dev/null
+++ b/docs/connectors/introduction/index.html
@@ -0,0 +1,83 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-connectors/connectors-introduction" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">Introduction | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" prope [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed">
+
+
+
+
+
+<link rel="preconnect" href="https://analytics.apache.org/">
+<script>var _paq=window._paq=window._paq||[];_paq.push(["setRequestMethod","POST"]),_paq.push(["trackPageView"]),_paq.push(["enableLinkTracking"]),_paq.push(["enableHeartBeatTimer"]),function(){var e="https://analytics.apache.org/";_paq.push(["setRequestMethod","POST"]),_paq.push(["setTrackerUrl",e+"matomo.php"]),_paq.push(["setSiteId","80"]);var a=document,t=a.createElement("script"),p=a.getElementsByTagName("script")[0];t.type="text/javascript",t.async=!0,t.src=e+"matomo.js",p.parentNo [...]
+<script src="/assets/js/runtime~main.0a940c88.js" defer="defer"></script>
+<script src="/assets/js/main.4a006c5e.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/img/apache-iggy0.5x.png"><link rel="preload" as="image" [...]
+<p>The <a href="https://hub.docker.com/r/apache/iggy-connect" target="_blank" rel="noopener noreferrer" class="">docker image</a> is available, and can be fetched via <code>docker pull apache/iggy-connect</code>.</p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="features">Features<a href="#features" class="hash-link" aria-label="Direct link to Features" title="Direct link to Features" translate="no"></a></h2>
+<ul>
+<li class=""><strong>High Performance</strong>: Utilizes Rust's performance characteristics to ensure fast data ingestion and egress.</li>
+<li class=""><strong>Low memory footprint</strong>: Designed with memory efficiency in mind, minimizing the memory footprint of the connectors.</li>
+<li class=""><strong>Modular Design</strong>: Designed with modularity in mind, allowing for easy extension and customization.</li>
+<li class=""><strong>Dynamic Loading</strong>: Supports dynamic loading of plugins, enabling seamless integration with various data sources and sinks.</li>
+<li class=""><strong>Statically Typed</strong>: Ensures type safety and compile-time checks, reducing runtime errors.</li>
+<li class=""><strong>Easy Customization</strong>: Provides a simple interface for implementing custom connectors, making it easy to create new plugins.</li>
+<li class=""><strong>Data transformation</strong>: Supports data transformation with the help of existing functions.</li>
+<li class=""><strong>Powerful configuration</strong>: Define your sinks, sources, and transformations in the configuration file or fetch them from a remote HTTP API.</li>
+<li class=""><strong>Flexible configuration providers</strong>: Support for local file-based and HTTP-based configuration providers for centralized configuration management.</li>
+</ul>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="quick-start">Quick Start<a href="#quick-start" class="hash-link" aria-label="Direct link to Quick Start" title="Direct link to Quick Start" translate="no"></a></h2>
+<ol>
+<li class="">
+<p>Build the project in release mode (or debug, and update the connectors paths in the config accordingly), and make sure that the plugins specified in <code>core/connectors/runtime/example_config/connectors/</code> directory under <code>path</code> are available. The configuration must be provided in <code>toml</code> format.</p>
+</li>
+<li class="">
+<p>Run <code>docker compose up -d</code> from <code>/examples/rust/src/sink-data-producer</code> which will start the Quickwit server to be used by an example sink connector. At this point, you can access the Quickwit UI at <a href="http://localhost:7280" target="_blank" rel="noopener noreferrer" class="">http://localhost:7280</a> - check this dashboard again later on, after the <code>events</code> index will be created.</p>
+</li>
+<li class="">
+<p>Set environment variable <code>IGGY_CONNECTORS_CONFIG_PATH=core/connectors/runtime/example_config/config.toml</code> (adjust the path as needed) pointing to the runtime configuration file.</p>
+</li>
+<li class="">
+<p>Start the Iggy server and invoke the following commands via Iggy CLI to create the example streams and topics used by the sample connectors.</p>
+<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">iggy </span><span class="token parameter variable" style="color:#36acaa">--username</span>< [...]
+</li>
+<li class="">
+<p>Execute <code>cargo run --example sink-data-producer -r</code> which will start the example data producer application, sending the messages to previously created <code>qw</code> stream and <code>records</code> topic (this will be used by the Quickwit sink connector).</p>
+</li>
+<li class="">
+<p>Start the connector runtime <code>cargo run --bin iggy-connectors -r</code> - you should be able to browse Quickwit UI with records being constantly added to the <code>events</code> index. At the same time, you should see the new messages being added to the <code>example</code> stream and <code>topic1</code> topic by the test source connector - you can use Iggy Web UI to browse the data. The messages will have applied the basic fields transformations.</p>
+</li>
+</ol>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="configuration">Configuration<a href="#configuration" class="hash-link" aria-label="Direct link to Configuration" title="Direct link to Configuration" translate="no"></a></h2>
+<p>The same rules applies when it comes to overringing the configuration via environment variables as for the main <a class="" href="/docs/server/configuration">Iggy server</a>.</p>
+<p>You can provide the following envs during the runtime startup:</p>
+<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">IGGY_CONNECTORS_ENV_PATH - path to the .env file for custom environment variables</span><br [...]
+<p>Any configuration section can be overriden with <code>IGGY_CONNECTORS_</code> prefix, followed by the section name and the key name, e.g. <code>IGGY_CONNECTORS_IGGY_USERNAME</code>.</p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="runtime">Runtime<a href="#runtime" class="hash-link" aria-label="Direct link to Runtime" title="Direct link to Runtime" translate="no"></a></h2>
+<p>All the connectors are implemented as Rust libraries and can be used as a part of the connector runtime. The runtime is responsible for managing the lifecycle of the connectors and providing the necessary infrastructure for the connectors to run. For more information, please refer to the <strong><a class="" href="/docs/connectors/runtime">runtime documentation</a></strong>.</p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="sink">Sink<a href="#sink" class="hash-link" aria-label="Direct link to Sink" title="Direct link to Sink" translate="no"></a></h2>
+<p>Sinks are responsible for consuming the messages from the configured stream(s) and topic(s) and sending them further to the specified destination. For example, the Quickwit sink connector is responsible for sending the messages to the Quickwit indexer.</p>
+<p>Please refer to the <strong><a class="" href="/docs/connectors/sink">Sink documentation</a></strong> for the details about the configuration and the sample implementation.</p>
+<p>When implementing <code>Sink</code>, make sure to use the <code>sink_connector!</code> macro to expose the FFI interface and allow the connector runtime to register the sink with the runtime.
+Each sink should have its own, custom configuration, which is passed along with the unique plugin ID via expected <code>new()</code> method.</p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="source">Source<a href="#source" class="hash-link" aria-label="Direct link to Source" title="Direct link to Source" translate="no"></a></h2>
+<p>Sources are responsible for producing the messages to the configured stream(s) and topic(s). For example, the Test source connector will generate the random messages that will be then sent to the configured stream and topic.</p>
+<p>Please refer to the <strong><a class="" href="/docs/connectors/source">Source documentation</a></strong> for the details about the configuration and the sample implementation.</p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="building-the-connectors">Building the connectors<a href="#building-the-connectors" class="hash-link" aria-label="Direct link to Building the connectors" title="Direct link to Building the connectors" translate="no"></a></h2>
+<p>New connector can be built simply by implementing either <code>Sink</code> or <code>Source</code> trait. Please check the <strong><a class="" href="/docs/connectors/sink">sink</a></strong> or <strong><a class="" href="/docs/connectors/source">source</a></strong> documentation, as well as the existing examples under <code>/sinks</code> and <code>/sources</code> directories.</p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="transformations">Transformations<a href="#transformations" class="hash-link" aria-label="Direct link to Transformations" title="Direct link to Transformations" translate="no"></a></h2>
+<p>Field transformations (depending on the supported payload formats) can be applied to the messages either before they are sent to the specified topic (e.g. when produced by the source connectors), or before consumed by the sink connectors. To add the new transformation, simply implement the <code>Transform</code> trait and extend the existing <code>load</code> function. Each transform may have its own, custom configuration.</p>
+<p>To find out more about the transforms, stream decoders or encoders, please refer to the <strong><a class="" href="/docs/connectors/sdk">SDK documentation</a></strong>.</p></div></article><nav class="docusaurus-mt-lg pagination-nav" aria-label="Docs pages"><a class="pagination-nav__link pagination-nav__link--prev" href="/docs/cli/iggy-cli"><div class="pagination-nav__sublabel">Previous</div><div class="pagination-nav__label">Iggy CLI</div></a><a class="pagination-nav__link pagination-n [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/connectors/runtime/index.html b/docs/connectors/runtime/index.html
new file mode 100644
index 00000000..4dfc68a5
--- /dev/null
+++ b/docs/connectors/runtime/index.html
@@ -0,0 +1,99 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-connectors/connectors-runtime" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">Runtime | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" property=" [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed">
+
+
+
+
+
+<link rel="preconnect" href="https://analytics.apache.org/">
+<script>var _paq=window._paq=window._paq||[];_paq.push(["setRequestMethod","POST"]),_paq.push(["trackPageView"]),_paq.push(["enableLinkTracking"]),_paq.push(["enableHeartBeatTimer"]),function(){var e="https://analytics.apache.org/";_paq.push(["setRequestMethod","POST"]),_paq.push(["setTrackerUrl",e+"matomo.php"]),_paq.push(["setSiteId","80"]);var a=document,t=a.createElement("script"),p=a.getElementsByTagName("script")[0];t.type="text/javascript",t.async=!0,t.src=e+"matomo.js",p.parentNo [...]
+<script src="/assets/js/runtime~main.0a940c88.js" defer="defer"></script>
+<script src="/assets/js/main.4a006c5e.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/img/apache-iggy0.5x.png"><link rel="preload" as="image" [...]
+<p>The runtime uses a shared <a href="https://tokio.rs" target="_blank" rel="noopener noreferrer" class="">Tokio runtime</a> to manage the asynchronous tasks and events across all connectors. Additionally, it has built-in support for logging via <a href="https://docs.rs/tracing/latest/tracing/" target="_blank" rel="noopener noreferrer" class="">tracing</a> crate.</p>
+<p>The connector are implemented as Rust libraries, and these are loaded dynamically during the runtime initialization process.</p>
+<p>Internally, <a href="https://github.com/OpenByteDev/dlopen2" target="_blank" rel="noopener noreferrer" class="">dlopen2</a> provides a safe and efficient way of loading the plugins via C FFI.</p>
+<p>By default, runtime will look for the configuration file, to decide which connectors to load and how to configure them.</p>
+<p>To start the connector runtime, simply run <code>cargo run --bin iggy-connectors</code>.</p>
+<p>The <a href="https://hub.docker.com/r/apache/iggy-connect" target="_blank" rel="noopener noreferrer" class="">docker image</a> is available, and can be fetched via <code>docker pull apache/iggy-connect</code>.</p>
+<p>The minimal viable configuration requires at least the Iggy credentials to create 2 separate instances of producer & consumer connections, the state directory path where source connectors can store their optional state, and the connectors configuration provider settings.</p>
+<div class="language-toml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-toml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">[</span><span class="token table class-name">iggy</span><span c [...]
+<p>The path to the configuration can be overridden by <code>IGGY_CONNECTORS_CONFIG_PATH</code> environment variable. Each configuration section can be also additionally updated by using the following convention <code>IGGY_CONNECTORS_SECTION_NAME.KEY_NAME</code> e.g. <code>IGGY_CONNECTORS_IGGY_USERNAME</code> and so on.</p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="configuration-providers">Configuration Providers<a href="#configuration-providers" class="hash-link" aria-label="Direct link to Configuration Providers" title="Direct link to Configuration Providers" translate="no"></a></h2>
+<p>The runtime supports two types of configuration providers for managing connector configurations:</p>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="local-file-provider">Local File Provider<a href="#local-file-provider" class="hash-link" aria-label="Direct link to Local File Provider" title="Direct link to Local File Provider" translate="no"></a></h3>
+<p>The default configuration provider reads connector configurations from local files. Each connector (source or sink) is configured in its own separate file within the directory specified by <code>connectors.config_dir</code>. If <code>config_dir</code> is empty or the directory doesn't exist, no connectors will be loaded.</p>
+<div class="language-toml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-toml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">[</span><span class="token table class-name">connectors</span>< [...]
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="http-configuration-provider">HTTP Configuration Provider<a href="#http-configuration-provider" class="hash-link" aria-label="Direct link to HTTP Configuration Provider" title="Direct link to HTTP Configuration Provider" translate="no"></a></h3>
+<p>The HTTP configuration provider allows the runtime to fetch connector configurations from a remote HTTP/REST API. This enables centralized configuration management and dynamic configuration updates.</p>
+<div class="language-toml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-toml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">[</span><span class="token table class-name">connectors</span>< [...]
+<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="configuration-options">Configuration Options<a href="#configuration-options" class="hash-link" aria-label="Direct link to Configuration Options" title="Direct link to Configuration Options" translate="no"></a></h4>
+<ul>
+<li class=""><strong>base_url</strong> (required): Base URL of the configuration API endpoint</li>
+<li class=""><strong>timeout</strong> (optional): HTTP request timeout (default: 10s)</li>
+<li class=""><strong>request_headers</strong> (optional): Custom headers to include in all HTTP requests (e.g., authentication headers)</li>
+<li class=""><strong>url_templates</strong> (optional): Custom URL templates for API endpoints. Supports variable substitution with <code>{key}</code> and <code>{version}</code> placeholders.</li>
+<li class=""><strong>response.data_path</strong> (optional): JSON path to extract response data from nested structures (e.g., "data.config")</li>
+<li class=""><strong>response.error_path</strong> (optional): JSON path to check for errors in responses</li>
+</ul>
+<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="default-url-templates">Default URL Templates<a href="#default-url-templates" class="hash-link" aria-label="Direct link to Default URL Templates" title="Direct link to Default URL Templates" translate="no"></a></h4>
+<p>If not customized, the HTTP provider uses the following RESTful URL patterns:</p>
+<ul>
+<li class="">Create sink config: <code>POST {base_url}/sinks/{key}/configs</code></li>
+<li class="">Create source config: <code>POST {base_url}/sources/{key}/configs</code></li>
+<li class="">Get active configs: <code>GET {base_url}/configs/active</code></li>
+<li class="">Get active versions: <code>GET {base_url}/configs/active/versions</code></li>
+<li class="">Set active sink version: <code>PUT {base_url}/sinks/{key}/configs/active</code></li>
+<li class="">Set active source version: <code>PUT {base_url}/sources/{key}/configs/active</code></li>
+<li class="">Get sink configs: <code>GET {base_url}/sinks/{key}/configs</code></li>
+<li class="">Get sink config by version: <code>GET {base_url}/sinks/{key}/configs/{version}</code></li>
+<li class="">Get active sink config: <code>GET {base_url}/sinks/{key}/configs/active</code></li>
+<li class="">Get source configs: <code>GET {base_url}/sources/{key}/configs</code></li>
+<li class="">Get source config by version: <code>GET {base_url}/sources/{key}/configs/{version}</code></li>
+<li class="">Get active source config: <code>GET {base_url}/sources/{key}/configs/active</code></li>
+<li class="">Delete sink config: <code>DELETE {base_url}/sinks/{key}/configs</code></li>
+<li class="">Delete source config: <code>DELETE {base_url}/sources/{key}/configs</code></li>
+</ul>
+<p>The HTTP provider expects the remote API to implement these endpoints and return connector configuration data in the same format as used by the local provider.</p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="http-api">HTTP API<a href="#http-api" class="hash-link" aria-label="Direct link to HTTP API" title="Direct link to HTTP API" translate="no"></a></h2>
+<p>Connector runtime has an optional HTTP API that can be enabled by setting the <code>enabled</code> flag to <code>true</code> in the <code>[http]</code> section.</p>
+<div class="language-toml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-toml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">[</span><span class="token table class-name">http</span><span c [...]
+<p>Currently, it does expose the following endpoints:</p>
+<ul>
+<li class=""><code>GET /</code>: welcome message.</li>
+<li class=""><code>GET /health</code>: health status of the runtime.</li>
+<li class=""><code>GET /sinks</code>: list of sinks.</li>
+<li class=""><code>GET /sinks/{key}</code>: sink details.</li>
+<li class=""><code>GET /sinks/{key}/configs</code>: list of configuration versions for the sink.</li>
+<li class=""><code>POST /sinks/{key}/configs</code>: add a new configuration version for the sink.</li>
+<li class=""><code>GET /sinks/{key}/configs/{version}</code>: configuration details for a specific version.</li>
+<li class=""><code>GET /sinks/{key}/configs/active</code>: active configuration details.</li>
+<li class=""><code>PUT /sinks/{key}/configs/active</code>: activate a specific configuration version for the sink.</li>
+<li class=""><code>GET /sinks/{key}/configs/plugin</code>: sink plugin config, including the optional <code>format</code> query parameter to specify the config format.</li>
+<li class=""><code>GET /sinks/{key}/transforms</code>: sink transforms to be applied to the fields.</li>
+<li class=""><code>GET /sources</code>: list of sources.</li>
+<li class=""><code>GET /sources/{key}</code>: source details.</li>
+<li class=""><code>GET /sources/{key}/configs</code>: list of configuration versions for the source.</li>
+<li class=""><code>POST /sources/{key}/configs</code>: add a new configuration version for the source.</li>
+<li class=""><code>GET /sources/{key}/configs/{version}</code>: configuration details for a specific version.</li>
+<li class=""><code>GET /sources/{key}/configs/active</code>: active configuration details.</li>
+<li class=""><code>PUT /sources/{key}/configs/active</code>: activate a specific configuration version for the source.</li>
+<li class=""><code>GET /sources/{key}/configs/plugin</code>: source plugin config, including the optional <code>format</code> query parameter to specify the config format.</li>
+<li class=""><code>GET /sources/{key}/transforms</code>: source transforms to be applied to the fields.</li>
+</ul></div></article><nav class="docusaurus-mt-lg pagination-nav" aria-label="Docs pages"><a class="pagination-nav__link pagination-nav__link--prev" href="/docs/connectors/introduction"><div class="pagination-nav__sublabel">Previous</div><div class="pagination-nav__label">Introduction</div></a><a class="pagination-nav__link pagination-nav__link--next" href="/docs/connectors/sdk"><div class="pagination-nav__sublabel">Next</div><div class="pagination-nav__label">SDK</div></a></nav></div></ [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/connectors/sdk/index.html b/docs/connectors/sdk/index.html
new file mode 100644
index 00000000..d05e27a8
--- /dev/null
+++ b/docs/connectors/sdk/index.html
@@ -0,0 +1,83 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-connectors/connectors-sdk" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">SDK | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" property="og:u [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed">
+
+
+
+
+
+<link rel="preconnect" href="https://analytics.apache.org/">
+<script>var _paq=window._paq=window._paq||[];_paq.push(["setRequestMethod","POST"]),_paq.push(["trackPageView"]),_paq.push(["enableLinkTracking"]),_paq.push(["enableHeartBeatTimer"]),function(){var e="https://analytics.apache.org/";_paq.push(["setRequestMethod","POST"]),_paq.push(["setTrackerUrl",e+"matomo.php"]),_paq.push(["setSiteId","80"]);var a=document,t=a.createElement("script"),p=a.getElementsByTagName("script")[0];t.type="text/javascript",t.async=!0,t.src=e+"matomo.js",p.parentNo [...]
+<script src="/assets/js/runtime~main.0a940c88.js" defer="defer"></script>
+<script src="/assets/js/main.4a006c5e.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/img/apache-iggy0.5x.png"><link rel="preload" as="image" [...]
+<p>Moreover, it contains both, the <code>decoders</code> and <code>encoders</code> modules, implementing either <code>StreamDecoder</code> or <code>StreamEncoder</code> traits, which are used when consuming or producing data from/to Iggy streams.</p>
+<p>SDK is WiP, and it'd certainly benefit from having the support of multiple format schemas, such as Avro, Flatbuffers etc. including decoding/encoding the data between the different formats (when applicable) and supporting the data transformations whenever possible (easy for JSON, but complex for Bincode for example).</p>
+<p>Last but not least, the different <code>transforms</code> are available, to transform (add, update, delete etc.) the particular fields of the data being processed via external configuration. It's as simple as adding a new transform to the <code>transforms</code> section of the particular connector configuration file:</p>
+<div class="language-toml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-toml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">[</span><span class="token table class-name">transforms.add_fie [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="protocol-buffers-support">Protocol Buffers Support<a href="#protocol-buffers-support" class="hash-link" aria-label="Direct link to Protocol Buffers Support" title="Direct link to Protocol Buffers Support" translate="no"></a></h2>
+<p>The SDK includes support for Protocol Buffers (protobuf) format with both encoding and decoding capabilities. Protocol Buffers provide efficient serialization and are particularly useful for high-performance data streaming scenarios.</p>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="configuration-example">Configuration Example<a href="#configuration-example" class="hash-link" aria-label="Direct link to Configuration Example" title="Direct link to Configuration Example" translate="no"></a></h3>
+<p>Here's a complete example configuration for using Protocol Buffers with Iggy connectors.</p>
+<p><strong>Main runtime config (config.toml):</strong></p>
+<div class="language-toml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-toml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">[</span><span class="token table class-name">iggy</span><span c [...]
+<p><strong>Source connector config (connectors/protobuf_source.toml):</strong></p>
+<div class="language-toml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-toml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key property" style="color:#36acaa">type</span><span class="token plain"> </span><span class="toke [...]
+<p><strong>Sink connector config (connectors/protobuf_sink.toml):</strong></p>
+<div class="language-toml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-toml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key property" style="color:#36acaa">type</span><span class="token plain"> </span><span class="toke [...]
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="key-configuration-options">Key Configuration Options<a href="#key-configuration-options" class="hash-link" aria-label="Direct link to Key Configuration Options" title="Direct link to Key Configuration Options" translate="no"></a></h3>
+<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="source-configuration">Source Configuration<a href="#source-configuration" class="hash-link" aria-label="Direct link to Source Configuration" title="Direct link to Source Configuration" translate="no"></a></h4>
+<ul>
+<li class=""><strong><code>schema_path</code></strong>: Path to the <code>.proto</code> file containing message definitions</li>
+<li class=""><strong><code>message_type</code></strong>: Fully qualified name of the protobuf message type to use</li>
+<li class=""><strong><code>use_any_wrapper</code></strong>: Whether to wrap messages in <code>google.protobuf.Any</code> for type safety</li>
+</ul>
+<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="transform-options">Transform Options<a href="#transform-options" class="hash-link" aria-label="Direct link to Transform Options" title="Direct link to Transform Options" translate="no"></a></h4>
+<ul>
+<li class=""><strong><code>proto_convert</code></strong>: Transform for converting between protobuf and other formats</li>
+<li class=""><strong><code>target_format</code></strong>: Target format for conversion (<code>json</code>, <code>proto</code>, <code>text</code>)</li>
+<li class=""><strong><code>preserve_structure</code></strong>: Whether to preserve the original message structure during conversion</li>
+<li class=""><strong><code>field_mappings</code></strong>: Mapping of field names for transformation (e.g., <code>"old_field" = "new_field"</code>)</li>
+</ul>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="supported-features">Supported Features<a href="#supported-features" class="hash-link" aria-label="Direct link to Supported Features" title="Direct link to Supported Features" translate="no"></a></h3>
+<ul>
+<li class=""><strong>Encoding</strong>: Convert JSON, Text, and Raw data to protobuf format</li>
+<li class=""><strong>Decoding</strong>: Parse protobuf messages into JSON format with type information</li>
+<li class=""><strong>Transforms</strong>: Convert between protobuf and other formats (JSON, Text)</li>
+<li class=""><strong>Field Mapping</strong>: Transform field names during format conversion</li>
+<li class=""><strong>Any Wrapper</strong>: Support for <code>google.protobuf.Any</code> message wrapper</li>
+</ul>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="programmatic-usage">Programmatic Usage<a href="#programmatic-usage" class="hash-link" aria-label="Direct link to Programmatic Usage" title="Direct link to Programmatic Usage" translate="no"></a></h3>
+<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="dynamic-schema-loading">Dynamic Schema Loading<a href="#dynamic-schema-loading" class="hash-link" aria-label="Direct link to Dynamic Schema Loading" title="Direct link to Dynamic Schema Loading" translate="no"></a></h4>
+<p>You can load or reload schemas programmatically:</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">use</span><span class="token plain"> </span><span class="token name [...]
+<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="schema-registry-integration">Schema Registry Integration<a href="#schema-registry-integration" class="hash-link" aria-label="Direct link to Schema Registry Integration" title="Direct link to Schema Registry Integration" translate="no"></a></h4>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">use</span><span class="token plain"> </span><span class="token name [...]
+<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="creating-converters-with-schema">Creating Converters with Schema<a href="#creating-converters-with-schema" class="hash-link" aria-label="Direct link to Creating Converters with Schema" title="Direct link to Creating Converters with Schema" translate="no"></a></h4>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">use</span><span class="token plain"> </span><span class="token name [...]
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="usage-notes">Usage Notes<a href="#usage-notes" class="hash-link" aria-label="Direct link to Usage Notes" title="Direct link to Usage Notes" translate="no"></a></h3>
+<ul>
+<li class=""><strong>Automatic Loading</strong>: Schemas are loaded automatically when <code>schema_path</code> or <code>descriptor_set</code> is provided in config</li>
+<li class=""><strong>Manual Loading</strong>: Use <code>load_schema()</code> method for dynamic schema loading or reloading</li>
+<li class=""><strong>Error Handling</strong>: Schema loading errors are handled gracefully with fallback to Any wrapper mode</li>
+<li class=""><strong>Immutable Design</strong>: Converters are created with fixed configuration - create new instances for different schemas</li>
+<li class="">When <code>use_any_wrapper</code> is enabled, messages are wrapped in <code>google.protobuf.Any</code> for better type safety</li>
+<li class="">The <code>proto_convert</code> transform can be used to convert protobuf messages to JSON for easier processing</li>
+<li class="">Field mappings allow you to rename fields during format conversion</li>
+<li class="">Protocol Buffers provide efficient binary serialization compared to JSON</li>
+</ul></div></article><nav class="docusaurus-mt-lg pagination-nav" aria-label="Docs pages"><a class="pagination-nav__link pagination-nav__link--prev" href="/docs/connectors/runtime"><div class="pagination-nav__sublabel">Previous</div><div class="pagination-nav__label">Runtime</div></a><a class="pagination-nav__link pagination-nav__link--next" href="/docs/connectors/sink"><div class="pagination-nav__sublabel">Next</div><div class="pagination-nav__label">Sink</div></a></nav></div></div><div [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/connectors/sink/index.html b/docs/connectors/sink/index.html
new file mode 100644
index 00000000..5f4ed3e5
--- /dev/null
+++ b/docs/connectors/sink/index.html
@@ -0,0 +1,70 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-connectors/sinks/connectors-sink" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">Sink | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" property="og: [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed">
+
+
+
+
+
+<link rel="preconnect" href="https://analytics.apache.org/">
+<script>var _paq=window._paq=window._paq||[];_paq.push(["setRequestMethod","POST"]),_paq.push(["trackPageView"]),_paq.push(["enableLinkTracking"]),_paq.push(["enableHeartBeatTimer"]),function(){var e="https://analytics.apache.org/";_paq.push(["setRequestMethod","POST"]),_paq.push(["setTrackerUrl",e+"matomo.php"]),_paq.push(["setSiteId","80"]);var a=document,t=a.createElement("script"),p=a.getElementsByTagName("script")[0];t.type="text/javascript",t.async=!0,t.src=e+"matomo.js",p.parentNo [...]
+<script src="/assets/js/runtime~main.0a940c88.js" defer="defer"></script>
+<script src="/assets/js/main.4a006c5e.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/img/apache-iggy0.5x.png"><link rel="preload" as="image" [...]
+<p>Sink connectors are responsible for writing data from Iggy streams to external systems or destinations. They provide a way to integrate Apache Iggy with various data sources and destinations, enabling seamless data flow and processing.</p>
+<p>The sink is represented by the single <code>Sink</code> trait, which defines the basic interface for all sink connectors. It provides methods for initializing the sink, writing data to external destination, and closing the sink.</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token attribute attr-name" style="color:#00a4db">#[async_trait]</span><span class="token plain"></span>< [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="configuration">Configuration<a href="#configuration" class="hash-link" aria-label="Direct link to Configuration" title="Direct link to Configuration" translate="no"></a></h2>
+<p>Each sink connector is configured in its own separate configuration file within the connectors directory specified in the main runtime config.</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<p><strong>Main runtime config (config.toml):</strong></p>
+<div class="language-toml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-toml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">[</span><span class="token table class-name">connectors</span>< [...]
+<p><strong>Sink connector config (connectors/stdout.toml):</strong></p>
+<div class="language-toml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-toml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># Type of connector (sink or source)</span><span [...]
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="environment-variable-overrides">Environment Variable Overrides<a href="#environment-variable-overrides" class="hash-link" aria-label="Direct link to Environment Variable Overrides" title="Direct link to Environment Variable Overrides" translate="no"></a></h3>
+<p>Configuration properties can be overridden using environment variables. The pattern follows: <code>IGGY_CONNECTORS_SINK_[KEY]_[PROPERTY]</code></p>
+<p>For example, to override the <code>enabled</code> property for a sink with ID <code>stdout</code>:</p>
+<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token assign-left variable" style="color:#36acaa">IGGY_CONNECTORS_SINK_STDOUT_ENABLED</span><span class= [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="sample-implementation">Sample implementation<a href="#sample-implementation" class="hash-link" aria-label="Direct link to Sample implementation" title="Direct link to Sample implementation" translate="no"></a></h2>
+<p>Let's implement the example sink connector, which will simply print the messages to the standard output.</p>
+<p>Additionally, our sink connector will have its own state, which can be used e.g. to track the overall progress or store some relevant information when ingesting the data further to the external sources or tooling.</p>
+<p>Also, when implementing the sink connector, make sure to use the <code>sink_connector!</code> macro to expose the FFI interface and allow the connector runtime to register the sink with the runtime.</p>
+<p>And finally, each sink should have its own, custom configuration, which is passed along with the unique plugin ID via expected <code>new()</code> method.</p>
+<p>Let's start by defining the internal state and the public sink connector along with its own configuration.</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token attribute attr-name" style="color:#00a4db">#[derive(Debug)]</span><span class="token plain"></span [...]
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token attribute attr-name" style="color:#00a4db">#[derive(Debug)]</span><span class="token plain"></span [...]
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token attribute attr-name" style="color:#00a4db">#[derive(Debug, Serialize, Deserialize)]</span><span cl [...]
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">impl</span><span class="token plain"> </span><span class="token cla [...]
+<p>We can invoke the expected macro to expose the FFI interface and allow the connector runtime to register the sink within the runtime.</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token macro property" style="color:#36acaa">sink_connector!</span><span class="token punctuation" style= [...]
+<p>At a bare minimum, we need to add the following dependencies to the <code>Cargo.toml</code> file to compile the plugin at all:</p>
+<ul>
+<li class="">dashmap</li>
+<li class="">once_cell</li>
+<li class="">tracing</li>
+</ul>
+<p>Now, let's implement the <code>Sink</code> trait for our <code>StdoutSink</code> struct.</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token attribute attr-name" style="color:#00a4db">#[async_trait]</span><span class="token plain"></span>< [...]
+<p>It's also important to note, that the supported format(s) might vary depending on the connector implementation. For example, you might expect <code>JSON</code> as the payload format, which can be then easily parsed and processed by upstream components such as data transforms, but at the same time, you could support the other formats and let the user decide which one to use.</p>
+<p>For example, you can match against the <code>payload</code> enum field containing the deserialized value to process (or not) the consumed message(s).</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> message </span><span class="to [...]
+<p>While the schema of messages (that will be consumed from the Iggy stream), cannot be controlled by the sink connector itself, the built-in configuration allows to decide what's the expected format of the messages (the particular <code>StreamDecoder</code> will be used).</p>
+<p>Keep in mind, that it might be sometimes difficult/impossible e.g. to transform one format to another e.g. JSON to SBE or so, and in such a case, the consumed messages will be ignored.</p>
+<p>Eventually, compile the source code and create a separate connector configuration file in the connectors directory (as specified in the main runtime <code>config.toml</code>). Make sure that <code>path</code> points to the existing plugin.</p>
+<p>And that's all, enjoy using the sink connector!</p>
+<p>On a side note, if you'd like to produce the messages to the Iggy stream instead, you can implement your own <strong><a href="https://github.com/apache/iggy/tree/master/core/connectors/sources" target="_blank" rel="noopener noreferrer" class="">Source connector</a></strong> too :)</p></div></article><nav class="docusaurus-mt-lg pagination-nav" aria-label="Docs pages"><a class="pagination-nav__link pagination-nav__link--prev" href="/docs/connectors/sdk"><div class="pagination-nav_ [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/connectors/sinks/elasticsearch/index.html b/docs/connectors/sinks/elasticsearch/index.html
new file mode 100644
index 00000000..604adf1c
--- /dev/null
+++ b/docs/connectors/sinks/elasticsearch/index.html
@@ -0,0 +1,47 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-connectors/sinks/connectors-sinks-elasticsearch" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">Elasticsearch Sink | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed">
+
+
+
+
+
+<link rel="preconnect" href="https://analytics.apache.org/">
+<script>var _paq=window._paq=window._paq||[];_paq.push(["setRequestMethod","POST"]),_paq.push(["trackPageView"]),_paq.push(["enableLinkTracking"]),_paq.push(["enableHeartBeatTimer"]),function(){var e="https://analytics.apache.org/";_paq.push(["setRequestMethod","POST"]),_paq.push(["setTrackerUrl",e+"matomo.php"]),_paq.push(["setSiteId","80"]);var a=document,t=a.createElement("script"),p=a.getElementsByTagName("script")[0];t.type="text/javascript",t.async=!0,t.src=e+"matomo.js",p.parentNo [...]
+<script src="/assets/js/runtime~main.0a940c88.js" defer="defer"></script>
+<script src="/assets/js/main.4a006c5e.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/img/apache-iggy0.5x.png"><link rel="preload" as="image" [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="configuration">Configuration<a href="#configuration" class="hash-link" aria-label="Direct link to Configuration" title="Direct link to Configuration" translate="no"></a></h2>
+<ul>
+<li class=""><code>url</code>: Elasticsearch cluster URL</li>
+<li class=""><code>index</code>: Target index name</li>
+<li class=""><code>username/password</code>: Optional authentication credentials</li>
+<li class=""><code>batch_size</code>: Bulk indexing batch size (default: 100)</li>
+<li class=""><code>timeout_seconds</code>: Request timeout (default: 30s)</li>
+<li class=""><code>create_index_if_not_exists</code>: Automatically create index (default: true)</li>
+<li class=""><code>index_mapping</code>: Index mapping configuration</li>
+</ul>
+<div class="language-toml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-toml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">[</span><span class="token table class-name">plugin_config</spa [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="features">Features<a href="#features" class="hash-link" aria-label="Direct link to Features" title="Direct link to Features" translate="no"></a></h2>
+<ul>
+<li class="">Bulk indexing optimization</li>
+<li class="">Automatic index creation</li>
+<li class="">Error handling and retry mechanisms</li>
+<li class="">Metadata field injection</li>
+<li class="">Support for multiple data formats</li>
+</ul></div></article><nav class="docusaurus-mt-lg pagination-nav" aria-label="Docs pages"><a class="pagination-nav__link pagination-nav__link--prev" href="/docs/connectors/sink"><div class="pagination-nav__sublabel">Previous</div><div class="pagination-nav__label">Sink</div></a><a class="pagination-nav__link pagination-nav__link--next" href="/docs/connectors/sinks/iceberg"><div class="pagination-nav__sublabel">Next</div><div class="pagination-nav__label">Iceberg Sink</div></a></nav></div [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/connectors/sinks/iceberg/index.html b/docs/connectors/sinks/iceberg/index.html
new file mode 100644
index 00000000..18aabfb9
--- /dev/null
+++ b/docs/connectors/sinks/iceberg/index.html
@@ -0,0 +1,68 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-connectors/sinks/connectors-sinks-iceberg" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">Iceberg Sink | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" prope [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed">
+
+
+
+
+
+<link rel="preconnect" href="https://analytics.apache.org/">
+<script>var _paq=window._paq=window._paq||[];_paq.push(["setRequestMethod","POST"]),_paq.push(["trackPageView"]),_paq.push(["enableLinkTracking"]),_paq.push(["enableHeartBeatTimer"]),function(){var e="https://analytics.apache.org/";_paq.push(["setRequestMethod","POST"]),_paq.push(["setTrackerUrl",e+"matomo.php"]),_paq.push(["setSiteId","80"]);var a=document,t=a.createElement("script"),p=a.getElementsByTagName("script")[0];t.type="text/javascript",t.async=!0,t.src=e+"matomo.js",p.parentNo [...]
+<script src="/assets/js/runtime~main.0a940c88.js" defer="defer"></script>
+<script src="/assets/js/main.4a006c5e.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/img/apache-iggy0.5x.png"><link rel="preload" as="image" [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="features">Features<a href="#features" class="hash-link" aria-label="Direct link to Features" title="Direct link to Features" translate="no"></a></h2>
+<ul>
+<li class=""><strong>Support for S3-compatible storage</strong></li>
+<li class=""><strong>Support for REST catalogs</strong></li>
+<li class=""><strong>Single destination table</strong></li>
+<li class=""><strong>Multiple-table fan-out static routing</strong></li>
+<li class=""><strong>Multiple-table fan-out dynamic routing</strong></li>
+</ul>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="configuration-example">Configuration example<a href="#configuration-example" class="hash-link" aria-label="Direct link to Configuration example" title="Direct link to Configuration example" translate="no"></a></h2>
+<div class="language-toml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-toml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">[</span><span class="token table class-name">plugin_config</spa [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="configuration-options">Configuration Options<a href="#configuration-options" class="hash-link" aria-label="Direct link to Configuration Options" title="Direct link to Configuration Options" translate="no"></a></h2>
+<ul>
+<li class=""><strong>tables</strong>: The names of the Iceberg tables you want to statically route Iggy messages to. The name should include the table’s namespace, separated by a dot (<code>.</code>).</li>
+<li class=""><strong>catalog_type</strong>: The type of catalog you are routing data to. <strong>Currently, only REST catalogs are fully supported.</strong></li>
+<li class=""><strong>warehouse</strong>: The name of the bucket or warehouse where Iggy will upload data files.</li>
+<li class=""><strong>URI</strong>: The URI of the Iceberg catalog.</li>
+<li class=""><strong>dynamic_routing</strong>: Enables dynamic routing. See more details later in this document.</li>
+<li class=""><strong>dynamic_route_field</strong>: The name of the message field that specifies the Iceberg table to route data to. See more details below.</li>
+<li class=""><strong>store_url</strong>: The URL of the object storage for data uploads.</li>
+<li class=""><strong>store_access_key_id</strong>: The access key ID of the object storage.</li>
+<li class=""><strong>store_secret_access_key</strong>: The secret key used to upload data to the object storage.</li>
+<li class=""><strong>store_region</strong>: The region of the object storage, if applicable.</li>
+<li class=""><strong>store_class</strong>: The storage class to use. <strong>Currently, only S3-compatible storage is supported.</strong></li>
+</ul>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="dynamic-routing">Dynamic Routing<a href="#dynamic-routing" class="hash-link" aria-label="Direct link to Dynamic Routing" title="Direct link to Dynamic Routing" translate="no"></a></h2>
+<p>If you don't know the names of the Iceberg tables you want to route data to in advance, you can use the dynamic routing feature.
+Insert a field in your Iggy messages with the name of the Iceberg table the message should be routed to. The Iggy connector will parse this field at runtime and route the message to the correct table.</p>
+<p>The Iggy Iceberg Connector will skip messages in the following cases:</p>
+<ul>
+<li class="">The table declared in the message field does not exist.</li>
+<li class="">The message does not contain the field specified in the <code>dynamic_route_field</code> configuration option.</li>
+</ul>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="dynamic-routing-configuration-example">Dynamic routing configuration example<a href="#dynamic-routing-configuration-example" class="hash-link" aria-label="Direct link to Dynamic routing configuration example" title="Direct link to Dynamic routing configuration example" translate="no"></a></h3>
+<div class="language-toml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-toml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">[</span><span class="token table class-name">plugin_config</spa [...]
+<p><strong>Note:</strong> The value in the message field <strong>must</strong> contain both the namespace and the table name, separated by a dot (<code>.</code>).
+Example:</p>
+<ul>
+<li class="">Namespace: <code>nyc</code></li>
+<li class="">Table name: <code>users</code></li>
+</ul></div></article><nav class="docusaurus-mt-lg pagination-nav" aria-label="Docs pages"><a class="pagination-nav__link pagination-nav__link--prev" href="/docs/connectors/sinks/elasticsearch"><div class="pagination-nav__sublabel">Previous</div><div class="pagination-nav__label">Elasticsearch Sink</div></a><a class="pagination-nav__link pagination-nav__link--next" href="/docs/connectors/sinks/postgres"><div class="pagination-nav__sublabel">Next</div><div class="pagination-nav__label">Pos [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/connectors/sinks/postgres/index.html b/docs/connectors/sinks/postgres/index.html
new file mode 100644
index 00000000..f3102cfd
--- /dev/null
+++ b/docs/connectors/sinks/postgres/index.html
@@ -0,0 +1,92 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-connectors/sinks/connectors-sinks-postgres" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">Postgres Sink | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" prop [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed">
+
+
+
+
+
+<link rel="preconnect" href="https://analytics.apache.org/">
+<script>var _paq=window._paq=window._paq||[];_paq.push(["setRequestMethod","POST"]),_paq.push(["trackPageView"]),_paq.push(["enableLinkTracking"]),_paq.push(["enableHeartBeatTimer"]),function(){var e="https://analytics.apache.org/";_paq.push(["setRequestMethod","POST"]),_paq.push(["setTrackerUrl",e+"matomo.php"]),_paq.push(["setSiteId","80"]);var a=document,t=a.createElement("script"),p=a.getElementsByTagName("script")[0];t.type="text/javascript",t.async=!0,t.src=e+"matomo.js",p.parentNo [...]
+<script src="/assets/js/runtime~main.0a940c88.js" defer="defer"></script>
+<script src="/assets/js/main.4a006c5e.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/img/apache-iggy0.5x.png"><link rel="preload" as="image" [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="features">Features<a href="#features" class="hash-link" aria-label="Direct link to Features" title="Direct link to Features" translate="no"></a></h2>
+<ul>
+<li class=""><strong>Automatic Table Creation</strong>: Optionally create tables automatically</li>
+<li class=""><strong>Batch Processing</strong>: Insert messages in configurable batches for performance</li>
+<li class=""><strong>Metadata Storage</strong>: Store Iggy message metadata (offset, timestamp, topic, etc.)</li>
+<li class=""><strong>Raw Payload Storage</strong>: Store original message payload as raw bytes</li>
+<li class=""><strong>Flexible Data Handling</strong>: Works with any payload type (JSON, text, binary, protobuf, etc.)</li>
+<li class=""><strong>Connection Pooling</strong>: Efficient database connection management</li>
+</ul>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="configuration">Configuration<a href="#configuration" class="hash-link" aria-label="Direct link to Configuration" title="Direct link to Configuration" translate="no"></a></h2>
+<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class [...]
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="configuration-options">Configuration Options<a href="#configuration-options" class="hash-link" aria-label="Direct link to Configuration Options" title="Direct link to Configuration Options" translate="no"></a></h3>
+<ul>
+<li class=""><code>connection_string</code>: PostgreSQL connection string</li>
+<li class=""><code>target_table</code>: Name of the table to insert messages into</li>
+<li class=""><code>batch_size</code>: Number of messages to insert in each batch (default: 100)</li>
+<li class=""><code>max_connections</code>: Maximum database connections (default: 10)</li>
+<li class=""><code>auto_create_table</code>: Automatically create the target table if it doesn't exist (default: false)</li>
+<li class=""><code>include_metadata</code>: Include Iggy metadata columns (default: true)</li>
+<li class=""><code>include_checksum</code>: Include message checksum (default: true)</li>
+<li class=""><code>include_origin_timestamp</code>: Include original message timestamp (default: true)</li>
+</ul>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="table-schema">Table Schema<a href="#table-schema" class="hash-link" aria-label="Direct link to Table Schema" title="Direct link to Table Schema" translate="no"></a></h2>
+<p>When <code>auto_create_table</code> is enabled, the following table structure is created:</p>
+<div class="language-sql codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sql codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">CREATE</span><span class="token plain"> </span><span class="token key [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="data-storage">Data Storage<a href="#data-storage" class="hash-link" aria-label="Direct link to Data Storage" title="Direct link to Data Storage" translate="no"></a></h2>
+<p>The payload is stored as raw bytes in the <code>payload</code> column, regardless of the original format:</p>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="json-messages">JSON Messages<a href="#json-messages" class="hash-link" aria-label="Direct link to JSON Messages" title="Direct link to JSON Messages" translate="no"></a></h3>
+<p>JSON payloads are stored as UTF-8 encoded bytes. You can query them using PostgreSQL's JSON functions:</p>
+<div class="language-sql codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sql codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">SELECT</span><span class="token plain"> id</span><span class="token p [...]
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="text-messages">Text Messages<a href="#text-messages" class="hash-link" aria-label="Direct link to Text Messages" title="Direct link to Text Messages" translate="no"></a></h3>
+<p>Text payloads are stored as UTF-8 encoded bytes:</p>
+<div class="language-sql codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sql codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">SELECT</span><span class="token plain"> id</span><span class="token p [...]
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="binary-messages">Binary Messages<a href="#binary-messages" class="hash-link" aria-label="Direct link to Binary Messages" title="Direct link to Binary Messages" translate="no"></a></h3>
+<p>Binary data is stored directly as bytes:</p>
+<div class="language-sql codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sql codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">SELECT</span><span class="token plain"> id</span><span class="token p [...]
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="protocol-buffer-messages">Protocol Buffer Messages<a href="#protocol-buffer-messages" class="hash-link" aria-label="Direct link to Protocol Buffer Messages" title="Direct link to Protocol Buffer Messages" translate="no"></a></h3>
+<p>Protobuf messages are stored as raw bytes and can be processed by your application:</p>
+<div class="language-sql codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sql codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">SELECT</span><span class="token plain"> id</span><span class="token p [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="usage-example">Usage Example<a href="#usage-example" class="hash-link" aria-label="Direct link to Usage Example" title="Direct link to Usage Example" translate="no"></a></h2>
+<ol>
+<li class="">Configure the sink connector in your Iggy connectors runtime</li>
+<li class="">Messages consumed from the specified topics will be inserted into PostgreSQL</li>
+<li class="">Query the data using standard SQL:</li>
+</ol>
+<div class="language-sql codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sql codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">-- Get all messages from a specific stream</span><s [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="performance-considerations">Performance Considerations<a href="#performance-considerations" class="hash-link" aria-label="Direct link to Performance Considerations" title="Direct link to Performance Considerations" translate="no"></a></h2>
+<ul>
+<li class="">Use appropriate <code>batch_size</code> for your workload (larger batches = better throughput)</li>
+<li class="">Consider creating indexes on frequently queried columns</li>
+<li class="">Monitor connection pool usage with <code>max_connections</code></li>
+<li class="">Create indexes for efficient queries:</li>
+</ul>
+<div class="language-sql codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sql codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">CREATE</span><span class="token plain"> </span><span class="token key [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="working-with-different-payload-types">Working with Different Payload Types<a href="#working-with-different-payload-types" class="hash-link" aria-label="Direct link to Working with Different Payload Types" title="Direct link to Working with Different Payload Types" translate="no"></a></h2>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="json-payloads">JSON Payloads<a href="#json-payloads" class="hash-link" aria-label="Direct link to JSON Payloads" title="Direct link to JSON Payloads" translate="no"></a></h3>
+<p>For JSON data, you can use PostgreSQL's JSON operators:</p>
+<div class="language-sql codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sql codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">-- Extract JSON fields (assuming payload is JSON)</ [...]
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="text-payloads">Text Payloads<a href="#text-payloads" class="hash-link" aria-label="Direct link to Text Payloads" title="Direct link to Text Payloads" translate="no"></a></h3>
+<p>For text data, convert bytes to text:</p>
+<div class="language-sql codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sql codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">-- Full-text search on text payloads</span><span cl [...]
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="binary-payloads">Binary Payloads<a href="#binary-payloads" class="hash-link" aria-label="Direct link to Binary Payloads" title="Direct link to Binary Payloads" translate="no"></a></h3>
+<p>For binary data, work with raw bytes or encode as needed:</p>
+<div class="language-sql codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sql codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">-- Get binary payload as hex</span><span class="tok [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/connectors/sinks/quickwit/index.html b/docs/connectors/sinks/quickwit/index.html
new file mode 100644
index 00000000..bbefdf4c
--- /dev/null
+++ b/docs/connectors/sinks/quickwit/index.html
@@ -0,0 +1,34 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-connectors/sinks/connectors-sinks-quickwit" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">Quickwit Sink | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" prop [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed">
+
+
+
+
+
+<link rel="preconnect" href="https://analytics.apache.org/">
+<script>var _paq=window._paq=window._paq||[];_paq.push(["setRequestMethod","POST"]),_paq.push(["trackPageView"]),_paq.push(["enableLinkTracking"]),_paq.push(["enableHeartBeatTimer"]),function(){var e="https://analytics.apache.org/";_paq.push(["setRequestMethod","POST"]),_paq.push(["setTrackerUrl",e+"matomo.php"]),_paq.push(["setSiteId","80"]);var a=document,t=a.createElement("script"),p=a.getElementsByTagName("script")[0];t.type="text/javascript",t.async=!0,t.src=e+"matomo.js",p.parentNo [...]
+<script src="/assets/js/runtime~main.0a940c88.js" defer="defer"></script>
+<script src="/assets/js/main.4a006c5e.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/img/apache-iggy0.5x.png"><link rel="preload" as="image" [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="configuration">Configuration<a href="#configuration" class="hash-link" aria-label="Direct link to Configuration" title="Direct link to Configuration" translate="no"></a></h2>
+<ul>
+<li class=""><code>url</code>: The URL of the Quickwit server.</li>
+<li class=""><code>index</code>: The index configuration using YAML, as described in the <a href="https://quickwit.io/docs/configuration/index-config" target="_blank" rel="noopener noreferrer" class="">Quickwit index configuration docs</a></li>
+</ul>
+<div class="language-toml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-toml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">[</span><span class="token table class-name">plugin_config</spa [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/connectors/source/index.html b/docs/connectors/source/index.html
new file mode 100644
index 00000000..634c5f42
--- /dev/null
+++ b/docs/connectors/source/index.html
@@ -0,0 +1,74 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-connectors/sources/connectors-source" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">Source | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" property="o [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed">
+
+
+
+
+
+<link rel="preconnect" href="https://analytics.apache.org/">
+<script>var _paq=window._paq=window._paq||[];_paq.push(["setRequestMethod","POST"]),_paq.push(["trackPageView"]),_paq.push(["enableLinkTracking"]),_paq.push(["enableHeartBeatTimer"]),function(){var e="https://analytics.apache.org/";_paq.push(["setRequestMethod","POST"]),_paq.push(["setTrackerUrl",e+"matomo.php"]),_paq.push(["setSiteId","80"]);var a=document,t=a.createElement("script"),p=a.getElementsByTagName("script")[0];t.type="text/javascript",t.async=!0,t.src=e+"matomo.js",p.parentNo [...]
+<script src="/assets/js/runtime~main.0a940c88.js" defer="defer"></script>
+<script src="/assets/js/main.4a006c5e.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/img/apache-iggy0.5x.png"><link rel="preload" as="image" [...]
+<p>Source connectors are responsible for ingesting data from external sources into Apache Iggy. They provide a way to integrate Apache Iggy with various data sources, such as databases, message queues, or file systems.</p>
+<p>The source is represented by the single <code>Source</code> trait, which defines the basic interface for all source connectors. It provides methods for initializing the source, reading data from it, and closing the source.</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token attribute attr-name" style="color:#00a4db">#[async_trait]</span><span class="token plain"></span>< [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="configuration">Configuration<a href="#configuration" class="hash-link" aria-label="Direct link to Configuration" title="Direct link to Configuration" translate="no"></a></h2>
+<p>Each source connector is configured in its own separate configuration file within the connectors directory specified in the main runtime config.</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<p><strong>Main runtime config (config.toml):</strong></p>
+<div class="language-toml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-toml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">[</span><span class="token table class-name">connectors</span>< [...]
+<p><strong>Source connector config (connectors/random.toml):</strong></p>
+<div class="language-toml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-toml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># Type of connector (sink or source)</span><span [...]
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="environment-variable-overrides">Environment Variable Overrides<a href="#environment-variable-overrides" class="hash-link" aria-label="Direct link to Environment Variable Overrides" title="Direct link to Environment Variable Overrides" translate="no"></a></h3>
+<p>Configuration properties can be overridden using environment variables. The pattern follows: <code>IGGY_CONNECTORS_SOURCE_[KEY]_[PROPERTY]</code></p>
+<p>For example, to override the <code>enabled</code> property for a source with ID <code>random</code>:</p>
+<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token assign-left variable" style="color:#36acaa">IGGY_CONNECTORS_SOURCE_RANDOM_ENABLED</span><span clas [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="sample-implementation">Sample implementation<a href="#sample-implementation" class="hash-link" aria-label="Direct link to Sample implementation" title="Direct link to Sample implementation" translate="no"></a></h2>
+<p>Let's implement the example source connector, which will simply generate the N random messages depending on the count specified in the configuration.</p>
+<p>Additionally, our source connector will have its own state, which can be used e.g. to track the overall progress or store some relevant information when producing the data from the actual external sources or tooling.</p>
+<p>Keep in mind, that the produced messages will be sent further to the specified stream, however it's already the responsibility of the runtime to handle the delivery.</p>
+<p>Also, when implementing the source connector, make sure to use the <code>source_connector!</code> macro to expose the FFI interface and allow the connector runtime to register the source with the runtime.</p>
+<p>And finally, each source should have its own, custom configuration, which is passed along with the unique plugin ID and optional state via expected <code>new()</code> method.</p>
+<p>Let's start by defining the internal state and the public source connector along with its own configuration.</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token attribute attr-name" style="color:#00a4db">#[derive(Debug)]</span><span class="token plain"></span [...]
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token attribute attr-name" style="color:#00a4db">#[derive(Debug)]</span><span class="token plain"></span [...]
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token attribute attr-name" style="color:#00a4db">#[derive(Debug, Serialize, Deserialize)]</span><span cl [...]
+<p>At this point, we can expose the required <code>new()</code> method, which will be used by the runtime to create a new instance of the source connector. The <code>id</code> is assigned by the runtime, and represents the unique identifier of the source connector. The <code>state</code> is an optional connector state (e.g. persisted in the local file), which will be provided by the runtime, given that the connector has persisted its own state before the runtime was restarted.</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">impl</span><span class="token plain"> </span><span class="token cla [...]
+<p>We can invoke the expected macro to expose the FFI interface and allow the connector runtime to register the source within the runtime.</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token macro property" style="color:#36acaa">source_connector!</span><span class="token punctuation" styl [...]
+<p>At a bare minimum, we need to add the following dependencies to the <code>Cargo.toml</code> file to compile the plugin at all:</p>
+<ul>
+<li class="">dashmap</li>
+<li class="">once_cell</li>
+<li class="">tracing</li>
+</ul>
+<p>Before we make use of the <code>Source</code> trait, let's define the internal payload of the message that will be produced (e.g. as if it was pulled from some external database or so).</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token attribute attr-name" style="color:#00a4db">#[derive(Debug, Serialize, Deserialize)]</span><span cl [...]
+<p>Now, let's implement the <code>Source</code> trait for our <code>RandomSource</code> struct. We'll assume that the amount of messages (provided in the config), will be generated every 100ms to mimic the behavior of a real-world external source. On top of this, we'll also keep track of the current ID of the last message produced and return the state along with the <code>ProducedMessages</code> - the state in this case, will be just a binary encoded number, but it can be [...]
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token attribute attr-name" style="color:#00a4db">#[async_trait]</span><span class="token plain"></span>< [...]
+<p>As you can see, the <code>ProducedMessage</code> can be customized to fit your needs, as all the fields will be directly mapped to the existing Iggy message struct.</p>
+<p>It's also important to note, that the supported format(s) might vary depending on the connector implementation. For example, you might use <code>JSON</code> as the payload format, which can be then easily parsed and processed by downstream components such as data transforms, but at the same time, you could support the other formats and let the user decide which one to use.</p>
+<p>While the final schema of messages (that will be appended to the Iggy stream), can be controlled with the built-in configuration (the particular <code>StreamEncoder</code> will be used), keep in mind, that it might be sometimes difficult/impossible e.g. to transform one format to another e.g. JSON to SBE or so, and in such a case, the produced messages will be ignored.</p>
+<p>Eventually, compile the source code and create a separate connector configuration file in the connectors directory (as specified in the main runtime <code>config.toml</code>). Make sure that <code>path</code> points to the existing plugin.</p>
+<p>And before starting the runtime, do not forget to create the specified stream and topic e.g. via Iggy CLI.</p>
+<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">iggy </span><span class="token parameter variable" style="color:#36acaa">--username</span>< [...]
+<p>And that's all, enjoy using the source connector!</p>
+<p>On a side note, if you'd like to process the messages consumed from the Iggy stream instead, you can implement your own <strong><a href="https://github.com/apache/iggy/tree/master/core/connectors/sinks" target="_blank" rel="noopener noreferrer" class="">Sink connector</a></strong> too :)</p></div></article><nav class="docusaurus-mt-lg pagination-nav" aria-label="Docs pages"><a class="pagination-nav__link pagination-nav__link--prev" href="/docs/connectors/sinks/quickwit"><div clas [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/connectors/sources/elasticsearch/index.html b/docs/connectors/sources/elasticsearch/index.html
new file mode 100644
index 00000000..18107992
--- /dev/null
+++ b/docs/connectors/sources/elasticsearch/index.html
@@ -0,0 +1,125 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-connectors/sources/connectors-sources-elasticsearch" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">Elasticsearch Source | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="tru [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed">
+
+
+
+
+
+<link rel="preconnect" href="https://analytics.apache.org/">
+<script>var _paq=window._paq=window._paq||[];_paq.push(["setRequestMethod","POST"]),_paq.push(["trackPageView"]),_paq.push(["enableLinkTracking"]),_paq.push(["enableHeartBeatTimer"]),function(){var e="https://analytics.apache.org/";_paq.push(["setRequestMethod","POST"]),_paq.push(["setTrackerUrl",e+"matomo.php"]),_paq.push(["setSiteId","80"]);var a=document,t=a.createElement("script"),p=a.getElementsByTagName("script")[0];t.type="text/javascript",t.async=!0,t.src=e+"matomo.js",p.parentNo [...]
+<script src="/assets/js/runtime~main.0a940c88.js" defer="defer"></script>
+<script src="/assets/js/main.4a006c5e.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/img/apache-iggy0.5x.png"><link rel="preload" as="image" [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="features">Features<a href="#features" class="hash-link" aria-label="Direct link to Features" title="Direct link to Features" translate="no"></a></h2>
+<ul>
+<li class=""><strong>Incremental Data Processing</strong>: Track last processed timestamp to avoid reprocessing data</li>
+<li class=""><strong>Cursor-based Pagination</strong>: Support for document ID-based cursors</li>
+<li class=""><strong>Scroll-based Pagination</strong>: Support for Elasticsearch scroll API</li>
+<li class=""><strong>Error Tracking</strong>: Monitor error counts and last error messages</li>
+<li class=""><strong>Processing Statistics</strong>: Track performance metrics and processing times</li>
+<li class=""><strong>Persistent State Storage</strong>: Multiple storage backends (file, Elasticsearch, Redis)</li>
+<li class=""><strong>Auto-save</strong>: Configurable automatic state persistence</li>
+<li class=""><strong>State Recovery</strong>: Resume processing from last known position after restart</li>
+</ul>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="configuration">Configuration<a href="#configuration" class="hash-link" aria-label="Direct link to Configuration" title="Direct link to Configuration" translate="no"></a></h2>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="basic-configuration">Basic Configuration<a href="#basic-configuration" class="hash-link" aria-label="Direct link to Basic Configuration" title="Direct link to Basic Configuration" translate="no"></a></h3>
+<div class="language-toml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-toml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key property" style="color:#36acaa">type</span><span class="token plain"> </span><span class="toke [...]
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="state-management-configuration">State Management Configuration<a href="#state-management-configuration" class="hash-link" aria-label="Direct link to State Management Configuration" title="Direct link to State Management Configuration" translate="no"></a></h3>
+<div class="language-toml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-toml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">[</span><span class="token table class-name">plugin_config</spa [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="state-information">State Information<a href="#state-information" class="hash-link" aria-label="Direct link to State Information" title="Direct link to State Information" translate="no"></a></h2>
+<p>The connector tracks the following state information:</p>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="processing-state">Processing State<a href="#processing-state" class="hash-link" aria-label="Direct link to Processing State" title="Direct link to Processing State" translate="no"></a></h3>
+<ul>
+<li class=""><code>last_poll_timestamp</code>: Last successful poll timestamp</li>
+<li class=""><code>total_documents_fetched</code>: Total number of documents processed</li>
+<li class=""><code>poll_count</code>: Number of polling cycles executed</li>
+<li class=""><code>last_document_id</code>: Last processed document ID (for cursor pagination)</li>
+<li class=""><code>last_scroll_id</code>: Last scroll ID (for scroll pagination)</li>
+<li class=""><code>last_offset</code>: Last processed offset</li>
+</ul>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="error-tracking">Error Tracking<a href="#error-tracking" class="hash-link" aria-label="Direct link to Error Tracking" title="Direct link to Error Tracking" translate="no"></a></h3>
+<ul>
+<li class=""><code>error_count</code>: Total number of errors encountered</li>
+<li class=""><code>last_error</code>: Last error message</li>
+</ul>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="performance-statistics">Performance Statistics<a href="#performance-statistics" class="hash-link" aria-label="Direct link to Performance Statistics" title="Direct link to Performance Statistics" translate="no"></a></h3>
+<ul>
+<li class=""><code>total_bytes_processed</code>: Total bytes processed</li>
+<li class=""><code>avg_batch_processing_time_ms</code>: Average processing time per batch</li>
+<li class=""><code>last_successful_poll</code>: Timestamp of last successful poll</li>
+<li class=""><code>empty_polls_count</code>: Number of polls that returned no documents</li>
+<li class=""><code>successful_polls_count</code>: Number of successful polls</li>
+</ul>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="storage-backends">Storage Backends<a href="#storage-backends" class="hash-link" aria-label="Direct link to Storage Backends" title="Direct link to Storage Backends" translate="no"></a></h2>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="file-storage-default">File Storage (Default)<a href="#file-storage-default" class="hash-link" aria-label="Direct link to File Storage (Default)" title="Direct link to File Storage (Default)" translate="no"></a></h3>
+<div class="language-toml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-toml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key property" style="color:#36acaa">state</span><span class="token plain"> </span><span class="tok [...]
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="elasticsearch-storage">Elasticsearch Storage<a href="#elasticsearch-storage" class="hash-link" aria-label="Direct link to Elasticsearch Storage" title="Direct link to Elasticsearch Storage" translate="no"></a></h3>
+<div class="language-toml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-toml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key property" style="color:#36acaa">state</span><span class="token plain"> </span><span class="tok [...]
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="redis-storage">Redis Storage<a href="#redis-storage" class="hash-link" aria-label="Direct link to Redis Storage" title="Direct link to Redis Storage" translate="no"></a></h3>
+<div class="language-toml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-toml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key property" style="color:#36acaa">state</span><span class="token plain"> </span><span class="tok [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="usage-examples">Usage Examples<a href="#usage-examples" class="hash-link" aria-label="Direct link to Usage Examples" title="Direct link to Usage Examples" translate="no"></a></h2>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="basic-usage-with-state-management">Basic Usage with State Management<a href="#basic-usage-with-state-management" class="hash-link" aria-label="Direct link to Basic Usage with State Management" title="Direct link to Basic Usage with State Management" translate="no"></a></h3>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">use</span><span class="token plain"> </span><span class="token name [...]
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="manual-state-management">Manual State Management<a href="#manual-state-management" class="hash-link" aria-label="Direct link to Manual State Management" title="Direct link to Manual State Management" translate="no"></a></h3>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">use</span><span class="token plain"> </span><span class="token name [...]
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="state-manager-utilities">State Manager Utilities<a href="#state-manager-utilities" class="hash-link" aria-label="Direct link to State Manager Utilities" title="Direct link to State Manager Utilities" translate="no"></a></h3>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">use</span><span class="token plain"> </span><span class="token name [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="state-file-format">State File Format<a href="#state-file-format" class="hash-link" aria-label="Direct link to State File Format" title="Direct link to State File Format" translate="no"></a></h2>
+<p>State files are stored as JSON with the following structure:</p>
+<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="best-practices">Best Practices<a href="#best-practices" class="hash-link" aria-label="Direct link to Best Practices" title="Direct link to Best Practices" translate="no"></a></h2>
+<ol>
+<li class=""><strong>State ID Uniqueness</strong>: Use unique state IDs for different connector instances</li>
+<li class=""><strong>Auto-save Interval</strong>: Set appropriate auto-save intervals based on your data volume</li>
+<li class=""><strong>Storage Location</strong>: Use persistent storage locations for production deployments</li>
+<li class=""><strong>State Cleanup</strong>: Regularly clean up old state files to prevent disk space issues</li>
+<li class=""><strong>Error Handling</strong>: Monitor error counts and implement appropriate alerting</li>
+<li class=""><strong>Backup</strong>: Regularly backup state files for disaster recovery</li>
+</ol>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="troubleshooting">Troubleshooting<a href="#troubleshooting" class="hash-link" aria-label="Direct link to Troubleshooting" title="Direct link to Troubleshooting" translate="no"></a></h2>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="common-issues">Common Issues<a href="#common-issues" class="hash-link" aria-label="Direct link to Common Issues" title="Direct link to Common Issues" translate="no"></a></h3>
+<ol>
+<li class=""><strong>State Not Loading</strong>: Check file permissions and storage path</li>
+<li class=""><strong>State Corruption</strong>: Delete corrupted state files to start fresh</li>
+<li class=""><strong>Performance Issues</strong>: Adjust auto-save interval and batch sizes</li>
+<li class=""><strong>Storage Full</strong>: Implement state cleanup policies</li>
+</ol>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="monitoring">Monitoring<a href="#monitoring" class="hash-link" aria-label="Direct link to Monitoring" title="Direct link to Monitoring" translate="no"></a></h3>
+<p>Monitor the following metrics:</p>
+<ul>
+<li class="">State save/load success rates</li>
+<li class="">Processing statistics</li>
+<li class="">Error counts and types</li>
+<li class="">Storage usage for state files</li>
+</ul>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="migration">Migration<a href="#migration" class="hash-link" aria-label="Direct link to Migration" title="Direct link to Migration" translate="no"></a></h2>
+<p>To migrate from a connector without state management:</p>
+<ol>
+<li class="">Add state configuration to your connector config</li>
+<li class="">Set <code>enabled = true</code> in state config</li>
+<li class="">Restart the connector</li>
+<li class="">The connector will start tracking state from the next poll cycle</li>
+</ol>
+<p>To migrate between storage backends:</p>
+<ol>
+<li class="">Export state from current storage</li>
+<li class="">Update storage configuration</li>
+<li class="">Import state to new storage</li>
+<li class="">Restart connector</li>
+</ol></div></article><nav class="docusaurus-mt-lg pagination-nav" aria-label="Docs pages"><a class="pagination-nav__link pagination-nav__link--prev" href="/docs/connectors/source"><div class="pagination-nav__sublabel">Previous</div><div class="pagination-nav__label">Source</div></a><a class="pagination-nav__link pagination-nav__link--next" href="/docs/connectors/sources/postgres"><div class="pagination-nav__sublabel">Next</div><div class="pagination-nav__label">Postgres Source</div></a>< [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/connectors/sources/postgres/index.html b/docs/connectors/sources/postgres/index.html
new file mode 100644
index 00000000..1f4652fe
--- /dev/null
+++ b/docs/connectors/sources/postgres/index.html
@@ -0,0 +1,86 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-connectors/sources/connectors-sources-postgres" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">Postgres Source | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" pr [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed">
+
+
+
+
+
+<link rel="preconnect" href="https://analytics.apache.org/">
+<script>var _paq=window._paq=window._paq||[];_paq.push(["setRequestMethod","POST"]),_paq.push(["trackPageView"]),_paq.push(["enableLinkTracking"]),_paq.push(["enableHeartBeatTimer"]),function(){var e="https://analytics.apache.org/";_paq.push(["setRequestMethod","POST"]),_paq.push(["setTrackerUrl",e+"matomo.php"]),_paq.push(["setSiteId","80"]);var a=document,t=a.createElement("script"),p=a.getElementsByTagName("script")[0];t.type="text/javascript",t.async=!0,t.src=e+"matomo.js",p.parentNo [...]
+<script src="/assets/js/runtime~main.0a940c88.js" defer="defer"></script>
+<script src="/assets/js/main.4a006c5e.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/img/apache-iggy0.5x.png"><link rel="preload" as="image" [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="features">Features<a href="#features" class="hash-link" aria-label="Direct link to Features" title="Direct link to Features" translate="no"></a></h2>
+<ul>
+<li class=""><strong>Table Polling</strong>: Incrementally fetch data from PostgreSQL tables</li>
+<li class=""><strong>Change Data Capture</strong>: Monitor database changes using PostgreSQL logical replication<!-- -->
+<ul>
+<li class="">Built-in logical decoding using <code>pg_logical_slot_get_changes</code></li>
+<li class="">Optional backend using Supabase's ETL (<code>pg_replicate</code>) framework via feature flag</li>
+</ul>
+</li>
+<li class=""><strong>Configurable Polling Intervals</strong>: Control how often to check for new data</li>
+<li class=""><strong>Batch Processing</strong>: Fetch data in configurable batch sizes</li>
+<li class=""><strong>Offset Tracking</strong>: Keep track of processed records to avoid duplicates</li>
+<li class=""><strong>Multiple Tables</strong>: Monitor multiple tables simultaneously</li>
+<li class=""><strong>Column Mapping</strong>: Transform column names (e.g., to snake_case)</li>
+<li class=""><strong>Custom Queries</strong>: Use custom SQL queries instead of simple table polling</li>
+</ul>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="configuration">Configuration<a href="#configuration" class="hash-link" aria-label="Direct link to Configuration" title="Direct link to Configuration" translate="no"></a></h2>
+<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class [...]
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="configuration-options">Configuration Options<a href="#configuration-options" class="hash-link" aria-label="Direct link to Configuration Options" title="Direct link to Configuration Options" translate="no"></a></h3>
+<ul>
+<li class=""><code>connection_string</code>: PostgreSQL connection string</li>
+<li class=""><code>mode</code>: Operation mode - <code>polling</code> or <code>cdc</code></li>
+<li class=""><code>tables</code>: List of tables to monitor (used for polling and to create publications in CDC)</li>
+<li class=""><code>poll_interval</code>: How often to poll for new data (e.g., "30s", "5m")</li>
+<li class=""><code>batch_size</code>: Maximum number of rows to fetch per poll (default: 1000)</li>
+<li class=""><code>tracking_column</code>: Column to track for incremental updates (default: "id")</li>
+<li class=""><code>initial_offset</code>: Starting value for the tracking column</li>
+<li class=""><code>max_connections</code>: Maximum database connections (default: 10)</li>
+<li class=""><code>enable_wal_cdc</code>: Enable WAL-based CDC (requires logical replication setup)</li>
+<li class=""><code>custom_query</code>: Custom SQL query (overrides table + tracking_column)</li>
+<li class=""><code>snake_case_columns</code>: Convert column names to snake_case (default: false)</li>
+<li class=""><code>include_metadata</code>: Wrap results with metadata (default: true)</li>
+<li class=""><code>publication_name</code>: Logical replication publication name (default: <code>iggy_publication</code>)</li>
+<li class=""><code>replication_slot</code>: Replication slot name (default: <code>iggy_slot</code>)</li>
+<li class=""><code>capture_operations</code>: Operations to capture in CDC mode (default: ["INSERT","UPDATE","DELETE"])</li>
+<li class=""><code>cdc_backend</code>: CDC backend implementation: <code>builtin</code> (default) or <code>pg_replicate</code></li>
+</ul>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="pg_replicate-backend">pg_replicate backend<a href="#pg_replicate-backend" class="hash-link" aria-label="Direct link to pg_replicate backend" title="Direct link to pg_replicate backend" translate="no"></a></h3>
+<ul>
+<li class="">Build-time feature flag: enable with <code>--features cdc_pg_replicate</code> on the <code>iggy_connector_postgres_source</code> crate.</li>
+<li class="">When <code>cdc_backend</code> is set to <code>pg_replicate</code> but the feature is not enabled, the connector will return a clear initialization error.</li>
+<li class="">The backend integrates Supabase's ETL for robust WAL decoding and resume from LSN.</li>
+</ul>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="notes">Notes<a href="#notes" class="hash-link" aria-label="Direct link to Notes" title="Direct link to Notes" translate="no"></a></h3>
+<ul>
+<li class="">CDC requires <code>wal_level = logical</code> on the PostgreSQL server.</li>
+<li class="">Ensure a direct connection (no pooler) for replication where required.</li>
+</ul>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="output-format">Output Format<a href="#output-format" class="hash-link" aria-label="Direct link to Output Format" title="Direct link to Output Format" translate="no"></a></h2>
+<p>Each message contains:</p>
+<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="usage-example">Usage Example<a href="#usage-example" class="hash-link" aria-label="Direct link to Usage Example" title="Direct link to Usage Example" translate="no"></a></h2>
+<ol>
+<li class="">Configure the connector in your Iggy connectors runtime</li>
+<li class="">The connector will start polling the specified tables</li>
+<li class="">Data changes will be streamed to the configured Iggy topic</li>
+<li class="">Each row becomes a separate message in JSON format</li>
+</ol></div></article><nav class="docusaurus-mt-lg pagination-nav" aria-label="Docs pages"><a class="pagination-nav__link pagination-nav__link--prev" href="/docs/connectors/sources/elasticsearch"><div class="pagination-nav__sublabel">Previous</div><div class="pagination-nav__label">Elasticsearch Source</div></a><a class="pagination-nav__link pagination-nav__link--next" href="/docs/ai/introduction"><div class="pagination-nav__sublabel">Next</div><div class="pagination-nav__label">Introduct [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/faq/faq/index.html b/docs/faq/faq/index.html
new file mode 100644
index 00000000..b9bcc7ff
--- /dev/null
+++ b/docs/faq/faq/index.html
@@ -0,0 +1,31 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-faq/faq" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">FAQ | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" property="og:u [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed">
+
+
+
+
+
+<link rel="preconnect" href="https://analytics.apache.org/">
+<script>var _paq=window._paq=window._paq||[];_paq.push(["setRequestMethod","POST"]),_paq.push(["trackPageView"]),_paq.push(["enableLinkTracking"]),_paq.push(["enableHeartBeatTimer"]),function(){var e="https://analytics.apache.org/";_paq.push(["setRequestMethod","POST"]),_paq.push(["setTrackerUrl",e+"matomo.php"]),_paq.push(["setSiteId","80"]);var a=document,t=a.createElement("script"),p=a.getElementsByTagName("script")[0];t.type="text/javascript",t.async=!0,t.src=e+"matomo.js",p.parentNo [...]
+<script src="/assets/js/runtime~main.0a940c88.js" defer="defer"></script>
+<script src="/assets/js/main.4a006c5e.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/img/apache-iggy0.5x.png"><link rel="preload" as="image" [...]
+<p>Iggy is a persistent message streaming platform that stores messages in an append-only log format, similar to Kafka. However, Iggy is designed for high performance and low latency using <code>io_uring</code> and a thread-per-core architecture. Iggy doesn't use kafka protocol, instead it has its own binary protocol optimized for speed and efficiency, which means that clients need to use our native client libraries.</p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="q-are-there-plans-to-support-kafka-protocol-in-iggy">Q: Are there plans to support Kafka protocol in Iggy?<a href="#q-are-there-plans-to-support-kafka-protocol-in-iggy" class="hash-link" aria-label="Direct link to Q: Are there plans to support Kafka protocol in Iggy?" title="Direct link to Q: Are there plans to support Kafka protocol in Iggy?" translate="no"></a></h2>
+<p>Currently, Iggy does not support the Kafka protocol. Our focus is on providing a high-performance native protocol that leverages the strengths of Iggy’s architecture. However, we are open to community contributions (in fact there is an <a href="https://github.com/apache/iggy/discussions/6" target="_blank" rel="noopener noreferrer" class="">discussion</a> about it).</p></div></article><nav class="docusaurus-mt-lg pagination-nav" aria-label="Docs pages"><a class="pagination-nav__link pa [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/index.html b/docs/index.html
new file mode 100644
index 00000000..f1066968
--- /dev/null
+++ b/docs/index.html
@@ -0,0 +1,29 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-iggy" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">Welcome | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" property=" [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed">
+
+
+
+
+
+<link rel="preconnect" href="https://analytics.apache.org/">
+<script>var _paq=window._paq=window._paq||[];_paq.push(["setRequestMethod","POST"]),_paq.push(["trackPageView"]),_paq.push(["enableLinkTracking"]),_paq.push(["enableHeartBeatTimer"]),function(){var e="https://analytics.apache.org/";_paq.push(["setRequestMethod","POST"]),_paq.push(["setTrackerUrl",e+"matomo.php"]),_paq.push(["setSiteId","80"]);var a=document,t=a.createElement("script"),p=a.getElementsByTagName("script")[0];t.type="text/javascript",t.async=!0,t.src=e+"matomo.js",p.parentNo [...]
+<script src="/assets/js/runtime~main.0a940c88.js" defer="defer"></script>
+<script src="/assets/js/main.4a006c5e.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/img/apache-iggy0.5x.png"><link rel="preload" as="image" [...]
+<p>Please, check the <a class="" href="/docs/introduction/about">introduction</a> to get the grasp of the fundamental concepts.</p></div></article><nav class="docusaurus-mt-lg pagination-nav" aria-label="Docs pages"><a class="pagination-nav__link pagination-nav__link--next" href="/docs/introduction/about"><div class="pagination-nav__sublabel">Next</div><div class="pagination-nav__label">About</div></a></nav></div></div></div></div></main></div></div></div><footer class="theme-layout-foot [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/introduction/about/index.html b/docs/introduction/about/index.html
new file mode 100644
index 00000000..644f6f64
--- /dev/null
+++ b/docs/introduction/about/index.html
@@ -0,0 +1,110 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-introduction/introduction-about" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">About | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" property="og [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed">
+
+
+
+
+
+<link rel="preconnect" href="https://analytics.apache.org/">
+<script>var _paq=window._paq=window._paq||[];_paq.push(["setRequestMethod","POST"]),_paq.push(["trackPageView"]),_paq.push(["enableLinkTracking"]),_paq.push(["enableHeartBeatTimer"]),function(){var e="https://analytics.apache.org/";_paq.push(["setRequestMethod","POST"]),_paq.push(["setTrackerUrl",e+"matomo.php"]),_paq.push(["setSiteId","80"]);var a=document,t=a.createElement("script"),p=a.getElementsByTagName("script")[0];t.type="text/javascript",t.async=!0,t.src=e+"matomo.js",p.parentNo [...]
+<script src="/assets/js/runtime~main.0a940c88.js" defer="defer"></script>
+<script src="/assets/js/main.4a006c5e.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/img/apache-iggy0.5x.png"><link rel="preload" as="image" [...]
+<p>Iggy provides <strong>exceptionally high throughput and performance</strong> while utilizing minimal computing resources.</p>
+<p>This is <strong>not yet another extension</strong> running on top of existing infrastructure, such as Kafka or SQL database.</p>
+<p>Iggy is a persistent message streaming log <strong>built from the ground up</strong> using low-level I/O with <strong>thread-per-core shared nothing architecture</strong>, <code>io_uring</code> and <code>compio</code> for maximum speed and efficiency.</p>
+<p>The name is an abbreviation for the Italian Greyhound - small yet extremely fast dogs, the best in their class. See the lovely <a href="https://www.instagram.com/fabio.and.cookie/" target="_blank" rel="noopener noreferrer" class="">Fabio & Cookie</a> ❤️</p>
+<p><img decoding="async" loading="lazy" alt="Iggy Server" src="/assets/images/iggy_server-f7851820c876c0a5b3c0159f953ae728.png" width="2048" height="1182" class="img_ev3q"></p>
+<hr>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="features">Features<a href="#features" class="hash-link" aria-label="Direct link to Features" title="Direct link to Features" translate="no"></a></h3>
+<ul>
+<li class=""><strong>Highly performant</strong>, persistent append-only log for message streaming</li>
+<li class=""><strong>Very high throughput</strong> for both writes and reads</li>
+<li class=""><strong>Low latency and predictable resource usage</strong> thanks to the Rust compiled language (no GC) and <code>io_uring</code>.</li>
+<li class=""><strong>User authentication and authorization</strong> with granular permissions and Personal Access Tokens (PAT)</li>
+<li class="">Support for multiple streams, topics and partitions</li>
+<li class="">Support for <strong>multiple transport protocols</strong> (QUIC, TCP, WebSocket, HTTP)</li>
+<li class="">Fully operational RESTful API which can be optionally enabled</li>
+<li class="">Available client SDK in multiple languages</li>
+<li class=""><strong>Thread per core shared nothing design</strong> together with <code>io_uring</code> guarantee the best possible performance on modern <code>Linux</code> systems.</li>
+<li class=""><strong>Works directly with binary data</strong>, avoiding enforced schema and serialization/deserialization overhead</li>
+<li class="">Custom <strong>zero-copy (de)serialization</strong>, which greatly improves the performance and reduces memory usage.</li>
+<li class="">Configurable server features (e.g. caching, segment size, data flush interval, transport protocols etc.)</li>
+<li class="">Server-side storage of <strong>consumer offsets</strong></li>
+<li class="">Multiple ways of polling the messages:<!-- -->
+<ul>
+<li class="">By offset (using the indexes)</li>
+<li class="">By timestamp (using the time indexes)</li>
+<li class="">First/Last N messages</li>
+<li class="">Next N messages for the specific consumer</li>
+</ul>
+</li>
+<li class="">Possibility of <strong>auto committing the offset</strong> (e.g. to achieve <em>at-most-once</em> delivery)</li>
+<li class=""><strong>Consumer groups</strong> providing the message ordering and horizontal scaling across the connected clients</li>
+<li class=""><strong>Message expiry</strong> with auto deletion based on the configurable <strong>retention policy</strong></li>
+<li class="">Additional features such as <strong>server side message deduplication</strong></li>
+<li class=""><strong>Multi-tenant</strong> support via abstraction of <strong>streams</strong> which group <strong>topics</strong></li>
+<li class=""><strong>TLS</strong> support for all transport protocols (TCP, QUIC, WebSocket, HTTPS)</li>
+<li class=""><strong><a href="https://github.com/apache/iggy/tree/master/core/connectors" target="_blank" rel="noopener noreferrer" class="">Connectors</a></strong> - sinks, sources and data transformations based on the <strong>custom Rust plugins</strong></li>
+<li class=""><strong><a href="https://github.com/apache/iggy/tree/master/core/ai/mcp" target="_blank" rel="noopener noreferrer" class="">Model Context Protocol</a></strong> - provide context to LLM with <strong>MCP server</strong></li>
+<li class="">Optional server-side as well as client-side <strong>data encryption</strong> using AES-256-GCM</li>
+<li class="">Optional metadata support in the form of <strong>message headers</strong></li>
+<li class="">Optional <strong>data backups and archiving</strong> to disk or <strong>S3</strong> compatible cloud storage (e.g. AWS S3)</li>
+<li class="">Support for <strong>OpenTelemetry</strong> logs & traces + Prometheus metrics</li>
+<li class="">Built-in <strong>CLI</strong> to manage the streaming server installable via <code>cargo install iggy-cli</code></li>
+<li class="">Built-in <strong>benchmarking app</strong> to test the performance</li>
+<li class=""><strong>Single binary deployment</strong> (no external dependencies)</li>
+<li class="">Running as a single node (clustering based on Viewstamped Replication will be implemented in the near future)</li>
+</ul>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="supported-languages-sdk">Supported languages SDK<a href="#supported-languages-sdk" class="hash-link" aria-label="Direct link to Supported languages SDK" title="Direct link to Supported languages SDK" translate="no"></a></h2>
+<ul>
+<li class=""><a href="https://crates.io/crates/iggy" target="_blank" rel="noopener noreferrer" class="">Rust</a></li>
+<li class=""><a href="https://www.nuget.org/packages/Apache.Iggy/" target="_blank" rel="noopener noreferrer" class="">C#</a></li>
+<li class=""><a href="https://mvnrepository.com/artifact/org.apache.iggy/iggy-java-sdk" target="_blank" rel="noopener noreferrer" class="">Java</a></li>
+<li class=""><a href="https://pypi.org/project/apache-iggy/" target="_blank" rel="noopener noreferrer" class="">Python</a></li>
+<li class=""><a href="https://www.npmjs.com/package/apache-iggy" target="_blank" rel="noopener noreferrer" class="">Node.js (TypeScript)</a></li>
+<li class=""><a href="https://pkg.go.dev/github.com/apache/iggy/foreign/go" target="_blank" rel="noopener noreferrer" class="">Go</a></li>
+</ul>
+<p>C++ and Elixir SDKs are a work in progress.</p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="cli">CLI<a href="#cli" class="hash-link" aria-label="Direct link to CLI" title="Direct link to CLI" translate="no"></a></h2>
+<p>The interactive CLI is implemented under the <code>cli</code> project, to provide the best developer experience. This is a great addition to the Web UI, especially for developers who prefer using the console tools.</p>
+<p>Iggy CLI can be installed with <code>cargo install iggy-cli</code> and then simply accessed by typing <code>iggy</code> in your terminal.</p>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="web-ui">Web UI<a href="#web-ui" class="hash-link" aria-label="Direct link to Web UI" title="Direct link to Web UI" translate="no"></a></h3>
+<p>There's a dedicated Web UI for the server, which allows you to manage streams, topics, partitions, browsing the messages and so on. This is an ongoing effort to build a comprehensive dashboard for administrative purposes of the Iggy server. Check the Web UI in the <code>/web</code> directory.
+The <a href="https://hub.docker.com/r/apache/iggy-web-ui" target="_blank" rel="noopener noreferrer" class="">docker image</a> is available, and can be fetched via <code>docker pull apache/iggy-web-ui</code>.</p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="connectors">Connectors<a href="#connectors" class="hash-link" aria-label="Direct link to Connectors" title="Direct link to Connectors" translate="no"></a></h2>
+<p>Iggy provides a highly performant and modular <strong><a class="" href="/docs/connectors/runtime">runtime</a></strong> for statically typed, yet dynamically loaded connectors. You can ingest data from external sources and push the data to Iggy streams, or fetch data from Iggy streams and forward it to external systems. <strong>Create your own Rust plugins</strong> by simply implementing either the <code>Source</code> or <code>Sink</code> trait and <strong>build custom pipelines for th [...]
+The <a href="https://hub.docker.com/r/apache/iggy-connect" target="_blank" rel="noopener noreferrer" class="">docker image</a> is available, and can be fetched via <code>docker pull apache/iggy-connect</code>.</p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="model-context-protocol">Model Context Protocol<a href="#model-context-protocol" class="hash-link" aria-label="Direct link to Model Context Protocol" title="Direct link to Model Context Protocol" translate="no"></a></h2>
+<p>The <a href="https://modelcontextprotocol.io" target="_blank" rel="noopener noreferrer" class="">Model Context Protocol</a> (MCP) is an open protocol that standardizes how applications provide context to LLMs. The <strong><a class="" href="/docs/ai/mcp">Iggy MCP Server</a></strong> is an implementation of the MCP protocol for message streaming infrastructure. It can be used to provide context to LLMs in real-time, allowing for more accurate and relevant responses.
+The <a href="https://hub.docker.com/r/apache/iggy-mcp" target="_blank" rel="noopener noreferrer" class="">docker image</a> is available, and can be fetched via <code>docker pull apache/iggy-mcp</code>.</p>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="docker">Docker<a href="#docker" class="hash-link" aria-label="Direct link to Docker" title="Direct link to Docker" translate="no"></a></h3>
+<p>The official Apache Iggy images can be found on <a href="https://hub.docker.com/r/apache/iggy" target="_blank" rel="noopener noreferrer" class="">Docker Hub</a>. Simply type <code>docker pull apache/iggy</code> to pull the image.</p>
+<p>You can also find the images for all the different tooling such as Connectors, MCP Server etc. <a href="https://hub.docker.com/u/apache?page=1&search=iggy" target="_blank" rel="noopener noreferrer" class="">here</a>.</p>
+<p>Please note that the images tagged as <code>latest</code> are based on the official, stable releases, while the <code>edge</code> ones are updated directly from latest version of the <code>master</code> branch.</p>
+<p>You can find the <code>Dockerfile</code> and <code>docker-compose</code> in the root of the repository. To build and start the server, run: <code>docker compose up</code>.</p>
+<p>Additionally, you can run the <code>CLI</code> which is available in the running container, by executing: <code>docker exec -it iggy-server /iggy</code>.</p>
+<p>Keep in mind that running the container on operating systems other than Linux, where the Docker is running in the VM, might result in the performance degradation.</p>
+<p>Also, when running the container, <strong>make sure to include the additional capabilities</strong>, as you can find in <a href="https://github.com/apache/iggy/blob/master/docker-compose.yml" target="_blank" rel="noopener noreferrer" class="">docker-compose</a> file:</p>
+<div class="language-yml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">cap_add</span><span class="token punctuation" style="color:#393A34 [...]
+<p>Or when running with <code>docker run</code>:</p>
+<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">docker run --cap-add=SYS_NICE --security-opt seccomp=unconfined --ulimit memlock=-1:-1 apac [...]
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="versioning">Versioning<a href="#versioning" class="hash-link" aria-label="Direct link to Versioning" title="Direct link to Versioning" translate="no"></a></h3>
+<p>The official releases follow the regular semver (<code>0.5.0</code>) or have a <code>latest</code> tag applied (<code>apache/iggy:latest</code>).</p>
+<p>We also publish edge/dev/nightly releases (e.g. <code>0.6.0-edge.1</code> or <code>apache/iggy:edge</code>), for both SDKs and the Docker images. These are typically compatible with the latest changes but are not guaranteed to be stable and, as the name suggests, are not recommended for production use.</p></div></article><nav class="docusaurus-mt-lg pagination-nav" aria-label="Docs pages"><a class="pagination-nav__link pagination-nav__link--prev" href="/docs/"><div class="pagination-n [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/introduction/architecture/index.html b/docs/introduction/architecture/index.html
new file mode 100644
index 00000000..de7b3e17
--- /dev/null
+++ b/docs/introduction/architecture/index.html
@@ -0,0 +1,60 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-introduction/introduction-architecture" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">Architecture | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" prope [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed">
+
+
+
+
+
+<link rel="preconnect" href="https://analytics.apache.org/">
+<script>var _paq=window._paq=window._paq||[];_paq.push(["setRequestMethod","POST"]),_paq.push(["trackPageView"]),_paq.push(["enableLinkTracking"]),_paq.push(["enableHeartBeatTimer"]),function(){var e="https://analytics.apache.org/";_paq.push(["setRequestMethod","POST"]),_paq.push(["setTrackerUrl",e+"matomo.php"]),_paq.push(["setSiteId","80"]);var a=document,t=a.createElement("script"),p=a.getElementsByTagName("script")[0];t.type="text/javascript",t.async=!0,t.src=e+"matomo.js",p.parentNo [...]
+<script src="/assets/js/runtime~main.0a940c88.js" defer="defer"></script>
+<script src="/assets/js/main.4a006c5e.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/img/apache-iggy0.5x.png"><link rel="preload" as="image" [...]
+<p>Let's discuss in-depth what these concepts are all about and how they relate to each other.</p>
+<p><img decoding="async" loading="lazy" alt="Architecture" src="/assets/images/architecture-5d7f7f7ed58a399ea2f5a7c74c074f65.png" width="6000" height="3375" class="img_ev3q"></p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="message-streaming">Message streaming<a href="#message-streaming" class="hash-link" aria-label="Direct link to Message streaming" title="Direct link to Message streaming" translate="no"></a></h2>
+<p>There's a high chance that you've already used messaging tools such as RabbitMQ or Kafka, just to name a few. While they might look similar at the first glance, and actually, you can achieve the similar results with all of them (e.g. publishing and consuming the events by the different applications built on top of microservices architecture), they are quite different in their core.</p>
+<p>The main difference is that RabbitMQ (except the recently released Streams plugin) is the message broker, which means that it's responsible for delivering the messages to the consumers. It works in the FIFO (First In, First Out) manner and the messages are being kept in the queues. For example, if you have multiple, distinct consumers, then each one would create its own queue, the message would be replicated between each queue and each consumer would be responsible for reading th [...]
+<p>On the other hand, Kafka is a message streaming platform, meaning that it's not responsible for delivering the messages to the consumers, but rather it's storing them in a form of an append-only log. The consumers are responsible for reading the messages from the log and processing them. You might have multiple distinct consumers, and it doesn't affect the resource usage as there's only one log. The consumers can read the messages from the beginning, or from the sp [...]
+<p>There are advantages and disadvantages of both approaches, but the main difference is that the message broker is responsible for delivering the messages to the consumers, while the message streaming platform is not. The message broker is a more mature concept, but the message streaming platform is gaining more and more popularity, especially in the cloud-native world. And you can achieve much higher performance and throughput with the message streaming platform, since it acts as a sim [...]
+<p>As you might've guessed by now, Iggy is the latter - the message streaming platform.</p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="thread-per-core-shared-nothing--io_uring">Thread per core (shared nothing) + io_uring<a href="#thread-per-core-shared-nothing--io_uring" class="hash-link" aria-label="Direct link to Thread per core (shared nothing) + io_uring" title="Direct link to Thread per core (shared nothing) + io_uring" translate="no"></a></h2>
+<p>Iggy utilizies <code>io_uring</code> as the main I/O interface, which allows it to achieve high performance and low latency. Each core (shard), runs it's own instance of the server, which means that there is (almost) no shared state between the cores. This allows Iggy to scale linearly with the number of cores, as there is no contention between the cores. This architecture been proven by systems such as <code>redpanda</code> or <code>scylladb</code>, which are known for their hig [...]
+<div class="language-rs codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rs codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">pub fn calculate_shard_assignment(ns: &IggyNamespace, upperbound: u32) -> u16 {</span><b [...]
+<p><code>io_uring</code> is an ever-growing beast, to learn more about it please check the <a href="https://kernel.dk/io_uring.pdf" target="_blank" rel="noopener noreferrer" class="">documentation</a> or the excellent <a href="https://www.youtube.com/watch?v=ToSRCSijRuE" target="_blank" rel="noopener noreferrer" class="">presentation</a> by Jens Axboe, the original author of <code>io_uring</code>.</p>
+<p>Check <a class="" href="/docs/server/benchmarking">benchmarking</a> section to see some performance numbers.</p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="append-only-log">Append-only log<a href="#append-only-log" class="hash-link" aria-label="Direct link to Append-only log" title="Direct link to Append-only log" translate="no"></a></h2>
+<p>The append-only log is the core concept of Iggy. It's a simple data structure, which is optimized for the append-only operations. It's a sequence of records, that are being appended to the end of the log. The records are immutable, so that they can't be changed once they are written to the log. The records are being written in the order they are received, which results in the log being is ordered.</p>
+<p>To navigate the log, you can use the offset, which is the position of the record in the log. The offset is a simple integer, that starts from 0 and is incremented by 1 for each record. When the client is reading the records from the log, it can specify the offset from which it wants to start reading the records. The client can also specify the maximum number of records it wants to read. The client can read the records from the beginning, or from the specific offset, which means that y [...]
+<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">+-------------------------------------------------------+</span><br></span><span class="tok [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="stream">Stream<a href="#stream" class="hash-link" aria-label="Direct link to Stream" title="Direct link to Stream" translate="no"></a></h2>
+<p>While we could put an equal sign between the log and the stream, they are not the same, at least in a case of Iggy streaming server.
+The stream is a logical concept, and you might think of it as a namespace. For example, you could have a single stream for the whole system, or multiple streams e.g. representing the different environments, such as <code>dev</code>, <code>staging</code> and <code>production</code>. The stream is identified by its unique ID. The stream can have one or more topics assigned, which results in the records being published to the specific topics that belong to the particular stream.</p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="topic">Topic<a href="#topic" class="hash-link" aria-label="Direct link to Topic" title="Direct link to Topic" translate="no"></a></h2>
+<p>The topic is also the logical concept, which is a part of the stream. The topic is identified by its unique ID. You could think of topic as an entity being responsible for storing the specific type of the records. For example, you could have a topic for the user events, and another topic for the order events, etc.</p>
+<p>The important thing to note is that, the messages are not being stored in the topic directly, but rather in the partitions, which are assigned to the topic. The topic can have one or more partitions assigned, that could help achieve higher parallelism and throughput. The topic can also have the retention policy assigned, which means that the records are being deleted automatically once they are older than the specified retention period.</p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="partition">Partition<a href="#partition" class="hash-link" aria-label="Direct link to Partition" title="Direct link to Partition" translate="no"></a></h2>
+<p>The partition has its own unique ID and belongs to the topic. The partition is responsible for storing the records. The records are being distributed between the partitions, therefore the partition acts as a simple database, which is optimized for the append-only operations. The partition is identified by its unique ID, which is an integer. The partition ID starts from 1 and is incremented by 1 for each partition. The partition ID is unique per topic, thus the same partition ID can be [...]
+<p>Thanks to having multiple partitions, we can achieve the horizontal scalability between many independent consumers, since each consumer can read the messages from the different partitions. This can be achieved by using more advanced concepts such as consumer groups.</p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="segment">Segment<a href="#segment" class="hash-link" aria-label="Direct link to Segment" title="Direct link to Segment" translate="no"></a></h2>
+<p>The segment, being a part of the partition, is the actual physical layer which stores the records in the binary format in a form of the files. Each segment has the limited size (e.g. 1 GB) and once it's full, the new segment is being created automatically. The segment name is based on the start offset of the first record in the segment and is unique per partition.</p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="structure">Structure<a href="#structure" class="hash-link" aria-label="Direct link to Structure" title="Direct link to Structure" translate="no"></a></h2>
+<p>Having in mind that stream consists of topics, which might have one or more partitions assigned, and each partition consists of segments, we can visualize the structure of the Iggy data directory as follows:</p>
+<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">streams</span><br></span><span class="token-line" style="color:#393A34"><span class="token [...]
+<p>The additional <code>.index</code> file is being created automatically and are being used to speed up the search operations by keeping track of the offsets and timestamps of the records.</p></div></article><nav class="docusaurus-mt-lg pagination-nav" aria-label="Docs pages"><a class="pagination-nav__link pagination-nav__link--prev" href="/docs/introduction/about"><div class="pagination-nav__sublabel">Previous</div><div class="pagination-nav__label">About</div></a><a class="pagination- [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/introduction/getting-started/index.html b/docs/introduction/getting-started/index.html
new file mode 100644
index 00000000..df7b91f1
--- /dev/null
+++ b/docs/introduction/getting-started/index.html
@@ -0,0 +1,122 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-introduction/introduction-getting-started" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">Getting started | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" pr [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed">
+
+
+
+
+
+<link rel="preconnect" href="https://analytics.apache.org/">
+<script>var _paq=window._paq=window._paq||[];_paq.push(["setRequestMethod","POST"]),_paq.push(["trackPageView"]),_paq.push(["enableLinkTracking"]),_paq.push(["enableHeartBeatTimer"]),function(){var e="https://analytics.apache.org/";_paq.push(["setRequestMethod","POST"]),_paq.push(["setTrackerUrl",e+"matomo.php"]),_paq.push(["setSiteId","80"]);var a=document,t=a.createElement("script"),p=a.getElementsByTagName("script")[0];t.type="text/javascript",t.async=!0,t.src=e+"matomo.js",p.parentNo [...]
+<script src="/assets/js/runtime~main.0a940c88.js" defer="defer"></script>
+<script src="/assets/js/main.4a006c5e.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/img/apache-iggy0.5x.png"><link rel="preload" as="image" [...]
+<p>This is a <strong>Rust based implementation</strong>, to look for examples in the other programming languages, please check the <a class="" href="/docs/sdk/introduction">SDK</a></p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-we-will-build">What we will build<a href="#what-we-will-build" class="hash-link" aria-label="Direct link to What we will build" title="Direct link to What we will build" translate="no"></a></h2>
+<p>Once you're familiar with the <a class="" href="/docs/introduction/architecture">architecture</a>, it's high time to build the first application, or actually the set of applications - so-called <strong>producer</strong> (the one that will be publishing the messages to the stream) and <strong>consumer</strong> (yes, you got that right - it will handle the incoming messages stream).</p>
+<p>In the typical scenario, e.g. when working with the microservices architecture or any other kind of the distributed system, each application can be both at the same time (producer and consumer), as the particular service might publish its own messages (typically in a form of the events - facts, that have already happened) while at the same time be interested in the notifications coming from the other service(s).</p>
+<p>The completed sample can be found in <a href="https://github.com/apache/iggy/tree/master/core/examples/src/getting-started" target="_blank" rel="noopener noreferrer" class="">repository</a>, however, we will go through the implementation step by step, so that you can get a better understanding of how to build the applications from scratch.</p>
+<p>Also, please do keep in mind that we'll be using the default implementation of <code>IggyClient</code> which provides a wrapper on top of the low-level, transport-specific <code>Client</code> trait (which you can always use, if you want to have more control over the communication with the server).</p>
+<p>On the other hand, if you're looking for a <strong>more developer-friendly client builder API</strong> providing additional features and extensions, please check the next article under <a class="" href="/docs/sdk/rust/high-level-sdk">High-level SDK</a> section (this is typically how you'd use Iggy SDK in the real-world applications).</p>
+<p>Nevertheless, let's start with the basic scenario, and build the producer and consumer applications using the default <code>IggyClient</code> implementation, so you can get a better understanding of how to work with the streaming server.</p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="starting-the-iggy-server">Starting the Iggy server<a href="#starting-the-iggy-server" class="hash-link" aria-label="Direct link to Starting the Iggy server" title="Direct link to Starting the Iggy server" translate="no"></a></h2>
+<p>For our purpose, we will focus on the basic scenario in order to keep things simple. Before we begin implementing the consumer and producer apps, we need to start the Iggy streaming server first - since there's no official package to be downloaded yet, the only way to get things up and running is by cloning the <a href="https://github.com/apache/iggy" target="_blank" rel="noopener noreferrer" class="">repository</a> and then starting the server by running the following command: < [...]
+<p>As long as the Iggy server is running, we're good to go. If you'd like to play with the configuration (e.g. change the addresses, ports, caching or so) you will find the <code>server.toml</code> under <code>configs</code> directory in the root of the repository.</p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="setting-up-the-project">Setting up the project<a href="#setting-up-the-project" class="hash-link" aria-label="Direct link to Setting up the project" title="Direct link to Setting up the project" translate="no"></a></h2>
+<p>Let's start by creating a new project - simply type <code>cargo new iggy-sample</code> and open your newly created project with the favorite code editor.</p>
+<p>At the very beginning, we will organize the files a little bit differently - create a new <code>consumer</code> directory under <code>src</code> and move the <code>main.rs</code> file here. You should have the following project structure:</p>
+<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">├── Cargo.lock</span><br></span><span class="token-line" style="color:#393A34"><span class= [...]
+<p>Then, open <code>Cargo.toml</code> and add the following code before the <code>[dependencies]</code></p>
+<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">[[bin]]</span><br></span><span class="token-line" style="color:#393A34"><span class="token [...]
+<p>Just to make sure that everything is set correctly, try to run the app with <code>cargo r --bin consumer</code>.</p>
+<p>Now, let's do the same for the <code>producer</code> part. Create a new <code>producer</code> directory, copy & paste the existing <code>main.rs</code>, and update the <code>Cargo.toml</code> with the following code:</p>
+<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">[[bin]]</span><br></span><span class="token-line" style="color:#393A34"><span class="token [...]
+<p>You should have the project structure as shown below:</p>
+<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">├── Cargo.lock</span><br></span><span class="token-line" style="color:#393A34"><span class= [...]
+<p>From that point on, we will focus on implementing the message streaming between our applications, starting with the producer.</p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="building-the-producer">Building the producer<a href="#building-the-producer" class="hash-link" aria-label="Direct link to Building the producer" title="Direct link to Building the producer" translate="no"></a></h2>
+<p>We will begin with installing the Iggy client crate - execute <code>cargo add iggy</code> in your terminal. Next, install <a href="https://tokio.rs" target="_blank" rel="noopener noreferrer" class="">tokio.rs</a> dependency with <code>cargo add tokio</code> as we will use the asynchronous runtime. Eventually, modify your <code>main.rs</code>, so it looks like this:</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">use</span><span class="token plain"> </span><span class="token name [...]
+<p>Let's instantiate a new connection to the server. As the description states, Iggy does support different transport protocols such as TCP, QUIC and HTTP, which is entirely true. Yet remember, we want to keep things as simple as possible here, thus, we will make use of the default implementation of <code>IggyClient</code> struct, which wraps the underlying raw client for one of the selected transports (in our scenario, this will be <code>TcpClient</code>).</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> client </span><span class="tok [...]
+<p>The default server address being <code>127.0.0.1:8090</code> is configured on the server side, and can be easily adjusted by updating the <code>server.toml</code> (the default configuration) or <code>server.json</code> file in <code>configs</code> directory.</p>
+<p>We could make use of more advanced components such as <a href="https://github.com/apache/iggy/blob/master/core/sdk/src/client_provider.rs" target="_blank" rel="noopener noreferrer" class=""><code>ClientProvider</code></a>, pass the custom configuration built via console args to choose between the different protocols as all the available clients implement the same <a href="https://github.com/apache/iggy/blob/master/core/sdk/src/clients/client.rs" target="_blank" rel="noopener noreferre [...]
+<p>If you're eager to find out how to build more advanced (and configurable) applications, check the Rust <a class="" href="/docs/sdk/rust/examples">examples</a>. Nevertheless, let's focus on implementing our producer side :)</p>
+<p>Next, we need to authenticate the user, as all the available actions (except the <code>ping</code> and <code>login</code>) require the user to be authenticated and have the appropriate permissions e.g. you might be able to send or poll the messages, but you won't be able to create the stream or topic. For the sake of simplicity, we will use the default credentials for the root user (username: <code>iggy</code>, password: <code>iggy</code>), that can do anything and cannot be dele [...]
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">client</span><br></span><span class="token-line" style="color:#393A34"><span class="token p [...]
+<p>When you start the application now, by running <code>cargo r --bin producer</code> it will execute immediately, however, you should be able to see the logs on Iggy server - connection should be accepted, user logged in, and then connection should be closed right away, meaning that we've just established our very first communication with the streaming server.</p>
+<p>Before we will move on with the code, let's include some logging in our apps as well (Iggy client already has some logging in place on different levels). Let's make use of the <a href="https://tracing.rs" target="_blank" rel="noopener noreferrer" class="">tracing.rs</a> crates: <code>cargo add tracing tracing_subscriber</code>.</p>
+<p>To make use of logging, simply invoke <code>tracing_subscriber::fmt::init()</code> at the beginning of <code>main()</code> method:</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">use</span><span class="token plain"> </span><span class="token name [...]
+<p>From that point on, when starting the application, you should be able to see at least the basic logs, for example regarding the connection status. Keep in mind, that you can change the default log level by setting <code>RUST_LOG</code> environment variable, e.g. <code>export RUST_LOG=trace</code> (or other command depending on OS).</p>
+<p>So far, so good, however, before we will be able to publish any messages to our streaming server, at first, we need to create the stream, topic and partition(s) - if you're unfamiliar with these concepts, please refer to <a class="" href="/docs/introduction/architecture">architecture</a> where all these concepts are described in-depth.</p>
+<p>Since our <code>IggyClient</code> implements the common <a href="https://github.com/apache/iggy/blob/master/core/sdk/src/clients/client.rs" target="_blank" rel="noopener noreferrer" class="">Client</a> trait, you can find lots of the different methods to interact with the server, also from the administrative point of view, e.g. creating the streams, topics etc.</p>
+<p>One thing worth mentioning is that, these methods are not idempotent - for example, if you were to try creating the stream with the same ID which already exists on the server, you would receive the specific error. In such a case, you can simply check for an error and move on. Let's do this then :)</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">use</span><span class="token plain"> </span><span class="token name [...]
+<p>Finally, let's send some messages into our stream. We will implement the basic loop with an interval between each iteration to simulate publishing the batch of messages. Since the streaming server works directly with the binary data, and couldn't care less about the (de)serialization format for the message payload, it's really up to you, how to efficiently stream the messages for your use case.</p>
+<p>In our example, we will simply use the string payload, and pass it via <code>from_str</code> trait to construct the <a href="https://github.com/apache/iggy/blob/master/core/common/src/commands/messages/send_messages.rs#L423" target="_blank" rel="noopener noreferrer" class="">Message</a>.</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> payload </span><span class="to [...]
+<p>Next, we need to call the appropriate method to send the messages to the server:</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> payload </span><span class="to [...]
+<p>As you might've already noticed, there are quite a few fields to be assigned. While some of them should be rather self-descriptive, let's discuss the <code>identifier</code> (created implicitly by using <code>TryFrom</code> on top of <code>STREAM_ID</code> and <code>TOPIC_ID</code>) and the <code>partitioning</code> which might be a little bit confusing at first, starting with the former.</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<p>Whenever we interact with the streaming server in terms of e.g. sending or polling the messages, managing the streams, topics etc. we need to provide the unique identifier of the stream and the topic that we want to use. Since each stream and topic have a unique numeric ID, as well as a unique name, we can use either of them. Here, we use the numeric ID by calling <code>Identifier::numeric()</code>, however, you can also use the string identifier by invoking the <code>Identifier::name [...]
+<p>Next, let's move onto the <code>partitioning</code> field:</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<p>In our scenario, we simply make use of <code>PartitioningKind::PartitionId</code> (by invoking the helper method <code>partition_id()</code>) meaning that we want to send the messages to the specified partition ID - in that case, the length will be 4 bytes (as the partition ID is of type <code>u32</code>), and the value will be the actual partition ID encoded as the bytes array.</p>
+<p>However, once your system grows, you might want to parallelize the messages across the independent consumers, in order to achieve the horizontal scaling, higher resiliency etc. In that case, you might consider using either <code>PartitioningKind::Balanced</code> (this will automatically calculate the next partition ID using the simple round-robin algorithm approach e.g. 1->2->3->1->2->3 etc.) or <code>PartitioningKind::MessagesKey</code> instead (e.g. by invoking one of [...]
+<p>For example, given that you process the set of messages related to the specific order ID (e.g. created, confirmed, paid, delivered etc.), you could use that as a key value to ensure that all the messages which are part of the specific workflow, will always be put onto the same partition. The value of the key can be anything (e.g. string, number) with the maximum length of 255 bytes.</p>
+<p>Anyway, let's get back to our scenario, and consider the following code responsible for publishing the messages:</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">async</span><span class="token plain"> </span><span class="token ke [...]
+<p>The reason behind passing a mutable reference is that the underlying client (especially when using the <code>IggyClient</code> wrapper on top of the low-level client) might want to modify the command before sending it to the server. For example, the client might want to encrypt the payload, include the default headers, or provide a custom <code>Partitioner</code> implementation etc. thus by using <code>&mut</code> we can avoid copying the command each time.</p>
+<p>Finally, let's complete the implementation of the producer - once you start the application after the latest changes, you shall see the messages being sent to the newly created stream.</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">use</span><span class="token plain"> </span><span class="token name [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="building-the-consumer">Building the consumer<a href="#building-the-consumer" class="hash-link" aria-label="Direct link to Building the consumer" title="Direct link to Building the consumer" translate="no"></a></h2>
+<p>The consumer part will be rather easy to implement. Just like on the producer side, we want to make use of the asynchronous runtime, logging and last but not least, the same <code>Client</code> trait. Let's find out, how we can make use of the <code>poll_messages</code> method, to fetch the messages from the stream. Consider the following code:</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> polled_messages </span><span c [...]
+<p>At the first glance, it might look a bit more complicated than <code>send_messages</code> function, so let's discuss the fields one by one:</p>
+<ul>
+<li class="">
+<p><code>stream_id</code> - the ID of the stream (numeric or string) from which we want to poll the messages.</p>
+</li>
+<li class="">
+<p><code>topic_id</code> - the ID of the topic (numeric or string) from which we want to poll the messages.</p>
+</li>
+<li class="">
+<p><code>partition_id</code> - the ID of the partition from which we want to poll the messages. The partition has to be specified for the regular <code>Consumer</code>, while for the <code>ConsumerGroup</code> it's ignored (<code>None</code> value), as the server will automatically assign the partition to the consumer from the group.</p>
+</li>
+<li class="">
+<p><code>consumer</code> - the type of the consumer (kind + ID), either the default <code>Consumer</code> means the standalone client which does the message polling on its own, independently of the other consumers (unless they would use the same ID), or the <code>ConsumerGroup</code> which might be used to create the group of consumers sharing the common identifier - this is especially useful in the case of the horizontal scaling, where we want to ensure, that the same (and only one) con [...]
+</li>
+<li class="">
+<p><code>strategy</code> - the way in which we want to poll the messages. The default one being <code>Offset</code> (underlying <code>PollingKind</code> enum) means that we will start polling the messages from the particular offset provided in the <code>value</code> field - it's on the client, to keep track of the most recent offset. On the other hand, we could also use the different kind, for example <code>Next</code>, which means, that the next messages will be returned to the cli [...]
+</li>
+<li class="">
+<p><code>count</code> - amount of the messages that the consumer would like to receive in the single response from the server.</p>
+</li>
+<li class="">
+<p><code>auto_commit</code> - whether the consumer offset should be automatically committed on the server side, once the messages are fetched.</p>
+</li>
+</ul>
+<p>Next, let's take a look at the following method responsible for polling the messages based on the specified interval.</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">async</span><span class="token plain"> </span><span class="token ke [...]
+<p>And here's the final code for our consumer application:</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">use</span><span class="token plain"> </span><span class="token name [...]
+<p>Start the Iggy server, and then producer and consumer applications respectively - you should observe your messages being streamed flawlessly :)</p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="summary">Summary<a href="#summary" class="hash-link" aria-label="Direct link to Summary" title="Direct link to Summary" translate="no"></a></h2>
+<p>What we've just achieved is merely the tip of an iceberg, however, it should give you a good understanding of what Iggy is all about, and hopefully, it wasn't too difficult to follow and get things up and running for the first time. Feel free to take a look at the more advanced <a href="https://github.com/apache/iggy/tree/master/core/examples" target="_blank" rel="noopener noreferrer" class="">examples</a>, how to make use of <code>IggyClient</code> wrapper on top of the exi [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/sdk/csharp/examples/index.html b/docs/sdk/csharp/examples/index.html
new file mode 100644
index 00000000..d32a8238
--- /dev/null
+++ b/docs/sdk/csharp/examples/index.html
@@ -0,0 +1,28 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-sdk/csharp/sdk-csharp-examples" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">Examples | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" property= [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed">
+
+
+
+
+
+<link rel="preconnect" href="https://analytics.apache.org/">
+<script>var _paq=window._paq=window._paq||[];_paq.push(["setRequestMethod","POST"]),_paq.push(["trackPageView"]),_paq.push(["enableLinkTracking"]),_paq.push(["enableHeartBeatTimer"]),function(){var e="https://analytics.apache.org/";_paq.push(["setRequestMethod","POST"]),_paq.push(["setTrackerUrl",e+"matomo.php"]),_paq.push(["setSiteId","80"]);var a=document,t=a.createElement("script"),p=a.getElementsByTagName("script")[0];t.type="text/javascript",t.async=!0,t.src=e+"matomo.js",p.parentNo [...]
+<script src="/assets/js/runtime~main.0a940c88.js" defer="defer"></script>
+<script src="/assets/js/main.4a006c5e.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/img/apache-iggy0.5x.png"><link rel="preload" as="image" [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/sdk/csharp/intro/index.html b/docs/sdk/csharp/intro/index.html
new file mode 100644
index 00000000..aec722e3
--- /dev/null
+++ b/docs/sdk/csharp/intro/index.html
@@ -0,0 +1,28 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-sdk/csharp/sdk-csharp-intro" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">Intro | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" property="og [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed">
+
+
+
+
+
+<link rel="preconnect" href="https://analytics.apache.org/">
+<script>var _paq=window._paq=window._paq||[];_paq.push(["setRequestMethod","POST"]),_paq.push(["trackPageView"]),_paq.push(["enableLinkTracking"]),_paq.push(["enableHeartBeatTimer"]),function(){var e="https://analytics.apache.org/";_paq.push(["setRequestMethod","POST"]),_paq.push(["setTrackerUrl",e+"matomo.php"]),_paq.push(["setSiteId","80"]);var a=document,t=a.createElement("script"),p=a.getElementsByTagName("script")[0];t.type="text/javascript",t.async=!0,t.src=e+"matomo.js",p.parentNo [...]
+<script src="/assets/js/runtime~main.0a940c88.js" defer="defer"></script>
+<script src="/assets/js/main.4a006c5e.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/img/apache-iggy0.5x.png"><link rel="preload" as="image" [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/sdk/go/examples/index.html b/docs/sdk/go/examples/index.html
new file mode 100644
index 00000000..b2d7854c
--- /dev/null
+++ b/docs/sdk/go/examples/index.html
@@ -0,0 +1,28 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-sdk/go/sdk-go-examples" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">Examples | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" property= [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed">
+
+
+
+
+
+<link rel="preconnect" href="https://analytics.apache.org/">
+<script>var _paq=window._paq=window._paq||[];_paq.push(["setRequestMethod","POST"]),_paq.push(["trackPageView"]),_paq.push(["enableLinkTracking"]),_paq.push(["enableHeartBeatTimer"]),function(){var e="https://analytics.apache.org/";_paq.push(["setRequestMethod","POST"]),_paq.push(["setTrackerUrl",e+"matomo.php"]),_paq.push(["setSiteId","80"]);var a=document,t=a.createElement("script"),p=a.getElementsByTagName("script")[0];t.type="text/javascript",t.async=!0,t.src=e+"matomo.js",p.parentNo [...]
+<script src="/assets/js/runtime~main.0a940c88.js" defer="defer"></script>
+<script src="/assets/js/main.4a006c5e.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/img/apache-iggy0.5x.png"><link rel="preload" as="image" [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/sdk/go/intro/index.html b/docs/sdk/go/intro/index.html
new file mode 100644
index 00000000..351af7c7
--- /dev/null
+++ b/docs/sdk/go/intro/index.html
@@ -0,0 +1,28 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-sdk/go/sdk-go-intro" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">Intro | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" property="og [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed">
+
+
+
+
+
+<link rel="preconnect" href="https://analytics.apache.org/">
+<script>var _paq=window._paq=window._paq||[];_paq.push(["setRequestMethod","POST"]),_paq.push(["trackPageView"]),_paq.push(["enableLinkTracking"]),_paq.push(["enableHeartBeatTimer"]),function(){var e="https://analytics.apache.org/";_paq.push(["setRequestMethod","POST"]),_paq.push(["setTrackerUrl",e+"matomo.php"]),_paq.push(["setSiteId","80"]);var a=document,t=a.createElement("script"),p=a.getElementsByTagName("script")[0];t.type="text/javascript",t.async=!0,t.src=e+"matomo.js",p.parentNo [...]
+<script src="/assets/js/runtime~main.0a940c88.js" defer="defer"></script>
+<script src="/assets/js/main.4a006c5e.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/img/apache-iggy0.5x.png"><link rel="preload" as="image" [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/sdk/introduction/index.html b/docs/sdk/introduction/index.html
new file mode 100644
index 00000000..1bbde194
--- /dev/null
+++ b/docs/sdk/introduction/index.html
@@ -0,0 +1,28 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-sdk/sdk-introduction" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">Introduction | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" prope [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed">
+
+
+
+
+
+<link rel="preconnect" href="https://analytics.apache.org/">
+<script>var _paq=window._paq=window._paq||[];_paq.push(["setRequestMethod","POST"]),_paq.push(["trackPageView"]),_paq.push(["enableLinkTracking"]),_paq.push(["enableHeartBeatTimer"]),function(){var e="https://analytics.apache.org/";_paq.push(["setRequestMethod","POST"]),_paq.push(["setTrackerUrl",e+"matomo.php"]),_paq.push(["setSiteId","80"]);var a=document,t=a.createElement("script"),p=a.getElementsByTagName("script")[0];t.type="text/javascript",t.async=!0,t.src=e+"matomo.js",p.parentNo [...]
+<script src="/assets/js/runtime~main.0a940c88.js" defer="defer"></script>
+<script src="/assets/js/main.4a006c5e.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/img/apache-iggy0.5x.png"><link rel="preload" as="image" [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/sdk/java/examples/index.html b/docs/sdk/java/examples/index.html
new file mode 100644
index 00000000..8f1b7ca2
--- /dev/null
+++ b/docs/sdk/java/examples/index.html
@@ -0,0 +1,28 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-sdk/java/sdk-java-examples" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">Examples | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" property= [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed">
+
+
+
+
+
+<link rel="preconnect" href="https://analytics.apache.org/">
+<script>var _paq=window._paq=window._paq||[];_paq.push(["setRequestMethod","POST"]),_paq.push(["trackPageView"]),_paq.push(["enableLinkTracking"]),_paq.push(["enableHeartBeatTimer"]),function(){var e="https://analytics.apache.org/";_paq.push(["setRequestMethod","POST"]),_paq.push(["setTrackerUrl",e+"matomo.php"]),_paq.push(["setSiteId","80"]);var a=document,t=a.createElement("script"),p=a.getElementsByTagName("script")[0];t.type="text/javascript",t.async=!0,t.src=e+"matomo.js",p.parentNo [...]
+<script src="/assets/js/runtime~main.0a940c88.js" defer="defer"></script>
+<script src="/assets/js/main.4a006c5e.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/img/apache-iggy0.5x.png"><link rel="preload" as="image" [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/sdk/java/intro/index.html b/docs/sdk/java/intro/index.html
new file mode 100644
index 00000000..8368d5be
--- /dev/null
+++ b/docs/sdk/java/intro/index.html
@@ -0,0 +1,29 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-sdk/java/sdk-java-intro" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">Intro | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" property="og [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed">
+
+
+
+
+
+<link rel="preconnect" href="https://analytics.apache.org/">
+<script>var _paq=window._paq=window._paq||[];_paq.push(["setRequestMethod","POST"]),_paq.push(["trackPageView"]),_paq.push(["enableLinkTracking"]),_paq.push(["enableHeartBeatTimer"]),function(){var e="https://analytics.apache.org/";_paq.push(["setRequestMethod","POST"]),_paq.push(["setTrackerUrl",e+"matomo.php"]),_paq.push(["setSiteId","80"]);var a=document,t=a.createElement("script"),p=a.getElementsByTagName("script")[0];t.type="text/javascript",t.async=!0,t.src=e+"matomo.js",p.parentNo [...]
+<script src="/assets/js/runtime~main.0a940c88.js" defer="defer"></script>
+<script src="/assets/js/main.4a006c5e.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/img/apache-iggy0.5x.png"><link rel="preload" as="image" [...]
+Repository can be found <a href="https://github.com/apache/iggy/tree/master/foreign/java" target="_blank" rel="noopener noreferrer" class="">here</a>.</p></div></article><nav class="docusaurus-mt-lg pagination-nav" aria-label="Docs pages"><a class="pagination-nav__link pagination-nav__link--prev" href="/docs/sdk/node/examples"><div class="pagination-nav__sublabel">Previous</div><div class="pagination-nav__label">Examples</div></a><a class="pagination-nav__link pagination-nav__link--next" [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/sdk/node/examples/index.html b/docs/sdk/node/examples/index.html
new file mode 100644
index 00000000..29d9e755
--- /dev/null
+++ b/docs/sdk/node/examples/index.html
@@ -0,0 +1,28 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-sdk/node/sdk-node-examples" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">Examples | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" property= [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed">
+
+
+
+
+
+<link rel="preconnect" href="https://analytics.apache.org/">
+<script>var _paq=window._paq=window._paq||[];_paq.push(["setRequestMethod","POST"]),_paq.push(["trackPageView"]),_paq.push(["enableLinkTracking"]),_paq.push(["enableHeartBeatTimer"]),function(){var e="https://analytics.apache.org/";_paq.push(["setRequestMethod","POST"]),_paq.push(["setTrackerUrl",e+"matomo.php"]),_paq.push(["setSiteId","80"]);var a=document,t=a.createElement("script"),p=a.getElementsByTagName("script")[0];t.type="text/javascript",t.async=!0,t.src=e+"matomo.js",p.parentNo [...]
+<script src="/assets/js/runtime~main.0a940c88.js" defer="defer"></script>
+<script src="/assets/js/main.4a006c5e.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/img/apache-iggy0.5x.png"><link rel="preload" as="image" [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/sdk/node/intro/index.html b/docs/sdk/node/intro/index.html
new file mode 100644
index 00000000..f6cff83e
--- /dev/null
+++ b/docs/sdk/node/intro/index.html
@@ -0,0 +1,28 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-sdk/node/sdk-node-intro" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">Intro | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" property="og [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed">
+
+
+
+
+
+<link rel="preconnect" href="https://analytics.apache.org/">
+<script>var _paq=window._paq=window._paq||[];_paq.push(["setRequestMethod","POST"]),_paq.push(["trackPageView"]),_paq.push(["enableLinkTracking"]),_paq.push(["enableHeartBeatTimer"]),function(){var e="https://analytics.apache.org/";_paq.push(["setRequestMethod","POST"]),_paq.push(["setTrackerUrl",e+"matomo.php"]),_paq.push(["setSiteId","80"]);var a=document,t=a.createElement("script"),p=a.getElementsByTagName("script")[0];t.type="text/javascript",t.async=!0,t.src=e+"matomo.js",p.parentNo [...]
+<script src="/assets/js/runtime~main.0a940c88.js" defer="defer"></script>
+<script src="/assets/js/main.4a006c5e.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/img/apache-iggy0.5x.png"><link rel="preload" as="image" [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/sdk/python/examples/index.html b/docs/sdk/python/examples/index.html
new file mode 100644
index 00000000..515e9d80
--- /dev/null
+++ b/docs/sdk/python/examples/index.html
@@ -0,0 +1,28 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-sdk/python/sdk-python-examples" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">Examples | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" property= [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed">
+
+
+
+
+
+<link rel="preconnect" href="https://analytics.apache.org/">
+<script>var _paq=window._paq=window._paq||[];_paq.push(["setRequestMethod","POST"]),_paq.push(["trackPageView"]),_paq.push(["enableLinkTracking"]),_paq.push(["enableHeartBeatTimer"]),function(){var e="https://analytics.apache.org/";_paq.push(["setRequestMethod","POST"]),_paq.push(["setTrackerUrl",e+"matomo.php"]),_paq.push(["setSiteId","80"]);var a=document,t=a.createElement("script"),p=a.getElementsByTagName("script")[0];t.type="text/javascript",t.async=!0,t.src=e+"matomo.js",p.parentNo [...]
+<script src="/assets/js/runtime~main.0a940c88.js" defer="defer"></script>
+<script src="/assets/js/main.4a006c5e.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/img/apache-iggy0.5x.png"><link rel="preload" as="image" [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/sdk/python/intro/index.html b/docs/sdk/python/intro/index.html
new file mode 100644
index 00000000..03a9d17c
--- /dev/null
+++ b/docs/sdk/python/intro/index.html
@@ -0,0 +1,28 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-sdk/python/sdk-python-intro" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">Intro | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" property="og [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed">
+
+
+
+
+
+<link rel="preconnect" href="https://analytics.apache.org/">
+<script>var _paq=window._paq=window._paq||[];_paq.push(["setRequestMethod","POST"]),_paq.push(["trackPageView"]),_paq.push(["enableLinkTracking"]),_paq.push(["enableHeartBeatTimer"]),function(){var e="https://analytics.apache.org/";_paq.push(["setRequestMethod","POST"]),_paq.push(["setTrackerUrl",e+"matomo.php"]),_paq.push(["setSiteId","80"]);var a=document,t=a.createElement("script"),p=a.getElementsByTagName("script")[0];t.type="text/javascript",t.async=!0,t.src=e+"matomo.js",p.parentNo [...]
+<script src="/assets/js/runtime~main.0a940c88.js" defer="defer"></script>
+<script src="/assets/js/main.4a006c5e.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/img/apache-iggy0.5x.png"><link rel="preload" as="image" [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/sdk/rust/examples/index.html b/docs/sdk/rust/examples/index.html
new file mode 100644
index 00000000..1a6f1b2c
--- /dev/null
+++ b/docs/sdk/rust/examples/index.html
@@ -0,0 +1,35 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-sdk/rust/sdk-rust-examples" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">Examples | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" property= [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed">
+
+
+
+
+
+<link rel="preconnect" href="https://analytics.apache.org/">
+<script>var _paq=window._paq=window._paq||[];_paq.push(["setRequestMethod","POST"]),_paq.push(["trackPageView"]),_paq.push(["enableLinkTracking"]),_paq.push(["enableHeartBeatTimer"]),function(){var e="https://analytics.apache.org/";_paq.push(["setRequestMethod","POST"]),_paq.push(["setTrackerUrl",e+"matomo.php"]),_paq.push(["setSiteId","80"]);var a=document,t=a.createElement("script"),p=a.getElementsByTagName("script")[0];t.type="text/javascript",t.async=!0,t.src=e+"matomo.js",p.parentNo [...]
+<script src="/assets/js/runtime~main.0a940c88.js" defer="defer"></script>
+<script src="/assets/js/main.4a006c5e.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/img/apache-iggy0.5x.png"><link rel="preload" as="image" [...]
+<ul>
+<li class=""><strong>Getting started</strong> - the basic example which is discussed in the <a class="" href="/docs/introduction/getting-started">getting started</a> guide.</li>
+<li class=""><strong>Message envelope</strong> - the example of how to send a message with a custom envelope e.g. to differentiate between different types of messages.</li>
+<li class=""><strong>Message headers</strong> - the example of how to send a message with custom headers e.g. to differentiate between different types of messages.</li>
+<li class=""><strong>Multi-tenant</strong> - the comprehensive example of how to structure your application to support multiple tenants (separated by the unique streams) with the different users, permissions, topics etc.</li>
+<li class=""><strong>New SDK</strong> - an introduction to the high-level SDK as discussed in the <a class="" href="/docs/sdk/rust/high-level-sdk">dedicated guide</a>.</li>
+</ul></div></article><nav class="docusaurus-mt-lg pagination-nav" aria-label="Docs pages"><a class="pagination-nav__link pagination-nav__link--prev" href="/docs/sdk/rust/intro"><div class="pagination-nav__sublabel">Previous</div><div class="pagination-nav__label">Intro</div></a><a class="pagination-nav__link pagination-nav__link--next" href="/docs/sdk/rust/high-level-sdk"><div class="pagination-nav__sublabel">Next</div><div class="pagination-nav__label">High-level SDK</div></a></nav></di [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/sdk/rust/high-level-sdk/index.html b/docs/sdk/rust/high-level-sdk/index.html
new file mode 100644
index 00000000..353e63f1
--- /dev/null
+++ b/docs/sdk/rust/high-level-sdk/index.html
@@ -0,0 +1,88 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-sdk/rust/sdk-rust-high-level-sdk" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">High-level SDK | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" pro [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed">
+
+
+
+
+
+<link rel="preconnect" href="https://analytics.apache.org/">
+<script>var _paq=window._paq=window._paq||[];_paq.push(["setRequestMethod","POST"]),_paq.push(["trackPageView"]),_paq.push(["enableLinkTracking"]),_paq.push(["enableHeartBeatTimer"]),function(){var e="https://analytics.apache.org/";_paq.push(["setRequestMethod","POST"]),_paq.push(["setTrackerUrl",e+"matomo.php"]),_paq.push(["setSiteId","80"]);var a=document,t=a.createElement("script"),p=a.getElementsByTagName("script")[0];t.type="text/javascript",t.async=!0,t.src=e+"matomo.js",p.parentNo [...]
+<script src="/assets/js/runtime~main.0a940c88.js" defer="defer"></script>
+<script src="/assets/js/main.4a006c5e.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/img/apache-iggy0.5x.png"><link rel="preload" as="image" [...]
+<ul>
+<li class="">Automatically creating & joining the consumer groups</li>
+<li class="">Committing the offset depending on the particular mode (e.g. in the background based on some interval, after polling N messages etc.)</li>
+<li class="">Batching the messages, whether it's about producing or consuming</li>
+<li class="">Processing the messages as if the stream was an async iterator</li>
+<li class="">Reusing the same client for both, producing and consuming on the same topic without repeating the configuration</li>
+<li class="">And more...</li>
+</ul>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="connection-string">Connection string<a href="#connection-string" class="hash-link" aria-label="Direct link to Connection string" title="Direct link to Connection string" translate="no"></a></h2>
+<p>Instead of providing the configuration for the client, you can use the connection string. It's a string that contains all the necessary information to connect to the Iggy API with only a single caveat, as it does support TCP protocol only for now. Here's the basic example:</p>
+<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">iggy://iggy:secret@localhost:3050</span><br></span></code></pre></div></div>
+<p>Which can be used to create the client like this:</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> client </span><span class="tok [...]
+<p>By default, the connection string will use TCP transport protocol, but you can also specify the other one by including <code>+{protocol}</code> to the initial <code>iggy</code> part, for example:</p>
+<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">iggy+tcp://iggy:secret@localhost:3050</span><br></span><span class="token-line" style="colo [...]
+<p>And here's the full example of TCP connection string with its all optional parts:</p>
+<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">iggy://iggy:secret@localhost:3050?tls</span><span class="token operator" style="color:#393A [...]
+<p>By default, the <strong>TCP</strong> connection string is parsed with the following options:</p>
+<ul>
+<li class=""><code>tls</code> - whether to use the TLS connection or not (default: <code>false</code>)</li>
+<li class=""><code>tls_domain</code> - the domain to use for the TLS connection (default: <code>None</code>)</li>
+<li class=""><code>tls_ca_file</code> - the path to the CA file to use for the TLS connection (default: <code>None</code>)</li>
+<li class=""><code>reconnection_retries</code> - the number of retries to establish the connection (default: <code>unlimited</code>)</li>
+<li class=""><code>reconnection_interval</code> - the interval between the reconnection attempts (default: <code>1s</code>)</li>
+<li class=""><code>reestablish_after</code> - the time to wait before reestablishing the connection (default: <code>5s</code>)</li>
+<li class=""><code>heartbeat_interval</code> - the interval between the heartbeat messages (default: <code>5s</code>)</li>
+<li class=""><code>nodelay</code> - whether to use the TCP_NODELAY option or not (default: <code>false</code>)</li>
+</ul>
+<p>For <strong>QUIC</strong>, the connection string is parsed with the following options:</p>
+<ul>
+<li class=""><code>response_buffer_size</code> - the size of the response buffer (default: <code>10_000_000</code>)</li>
+<li class=""><code>max_concurrent_bidi_streams</code> - the maximum number of concurrent bidirectional streams (default: <code>10000</code>)</li>
+<li class=""><code>datagram_send_buffer_size</code> - the size of the datagram send buffer (default: <code>100_000</code>)</li>
+<li class=""><code>initial_mtu</code> - the initial MTU size (default: <code>1200</code>)</li>
+<li class=""><code>send_window</code> - the size of the send window (default: <code>100_000</code>)</li>
+<li class=""><code>receive_window</code> - the size of the receive window (default: <code>100_000</code>)</li>
+<li class=""><code>keep_alive_interval</code> - the interval between the keep-alive messages (default: <code>5000</code>)</li>
+<li class=""><code>max_idle_timeout</code> - the maximum idle timeout (default: <code>10000</code>)</li>
+<li class=""><code>validate_certificate</code> - whether to validate the server certificate or not (default: <code>false</code>)</li>
+<li class=""><code>reconnection_retries</code> - the number of retries to establish the connection (default: <code>unlimited</code>)</li>
+<li class=""><code>reconnection_interval</code> - the interval between the reconnection attempts (default: <code>1s</code>)</li>
+<li class=""><code>reestablish_after</code> - the time to wait before reestablishing the connection (default: <code>5s</code>)</li>
+<li class=""><code>heartbeat_interval</code> - the interval between the heartbeat messages (default: <code>5s</code>)</li>
+</ul>
+<p>Unless you need to provide a specific implementation of the client-side <code>Encryptor</code>, <code>Partitioner</code> or adjust some other settings, you should be good to go with the connection string. On the other hand, you can always make use of <code>IggyClientBuilder::from_connection_string()</code> to extend the options on top of the provided connection string.</p>
+<p>Additionally, if you were to check the internal implementation of <code>IggyClient</code>, you'd notice that it does use <code>IggySharedMut<></code> which means that you can use a single instance of the client across multiple threads. Typically, it's a good idea to create a separate connection for producing and consuming, but it's not a requirement.</p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="producer">Producer<a href="#producer" class="hash-link" aria-label="Direct link to Producer" title="Direct link to Producer" translate="no"></a></h2>
+<p>The producer is a high-level abstraction that allows you to send messages to the topic. It's quite simple to use and doesn't require you to handle the offsets, partitions or any other low-level details. To begin with, you can simply invoke <code>client.producer()</code> to get the <code>IggyProducerBuilder</code> allowing you to configure the producer. Let's take a look at the basic example:</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> </span><span class="token keyw [...]
+<p>The code above will result in creating the producer that will try to send the messages in batches of 1000 every 5 milliseconds. You can choose between the <code>direct</code> (an instant producer) or the <code>background</code> (which will send the messages in the background by buffering them). The partitioning is set to <code>balanced</code> which means that the producer will try to distribute the messages evenly across all the partitions. The <code>init()</code> method is used to en [...]
+<p>Finally, you can use the <code>send()</code> method to send the messages to the topic. The producer doesn't need to be a mutable reference, as it's only required during the initialization phase. Here's how you can send the messages:</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> messages </span><span class="t [...]
+<p>Of course, you can provide the message headers, custom binary serialization etc. as it's the same <code>Message</code> struct as the one used in the low-level API. The producer will take care of the rest, including the retries, partitioning, batching etc.</p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="consumer">Consumer<a href="#consumer" class="hash-link" aria-label="Direct link to Consumer" title="Direct link to Consumer" translate="no"></a></h2>
+<p>The consumer is a high-level abstraction that allows you to receive the messages from the topic. It's quite simple to use and doesn't require you to handle the offsets, partitions or any other low-level details. To begin with, you can simply invoke <code>client.consumer()</code> to get the <code>IggyConsumerBuilder</code> allowing you to configure the consumer. Let's take a look at the basic example:</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> </span><span class="token keyw [...]
+<p>The code above will result in creating the consumer that will try to consume the messages in batches of 1000 every 1 millisecond. The auto-commit is set to commit the offset every second or when all the messages are consumed (fetched). The polling strategy is set to <code>next</code> which means that the consumer will try to consume the next available message from the partition currently assigned to the consumer group (you can also invoke a regular <code>consumer()</code> builder if y [...]
+<p>Finally, you can use the <code>next()</code> method to receive the messages from the topic. The consumer doesn't need to be a mutable reference, as it's only required during the initialization phase. The <code>init()</code> is used to ensure that the consumer is ready to receive the messages by validating the existence of the stream, topic, consumer group etc. Here's how you can consume the messages:</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">consumer</span><span class="token punctuation" style="color:#393A34">.</span><span class="t [...]
+<p>In order to use the async iterator extension, add <a href="https://crates.io/crates/futures-util" target="_blank" rel="noopener noreferrer" class="">futures-util</a> dependency.</p></div></article><nav class="docusaurus-mt-lg pagination-nav" aria-label="Docs pages"><a class="pagination-nav__link pagination-nav__link--prev" href="/docs/sdk/rust/examples"><div class="pagination-nav__sublabel">Previous</div><div class="pagination-nav__label">Examples</div></a><a class="pagination-nav__li [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/sdk/rust/intro/index.html b/docs/sdk/rust/intro/index.html
new file mode 100644
index 00000000..e2172588
--- /dev/null
+++ b/docs/sdk/rust/intro/index.html
@@ -0,0 +1,29 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-sdk/rust/sdk-rust-intro" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">Intro | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" property="og [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed">
+
+
+
+
+
+<link rel="preconnect" href="https://analytics.apache.org/">
+<script>var _paq=window._paq=window._paq||[];_paq.push(["setRequestMethod","POST"]),_paq.push(["trackPageView"]),_paq.push(["enableLinkTracking"]),_paq.push(["enableHeartBeatTimer"]),function(){var e="https://analytics.apache.org/";_paq.push(["setRequestMethod","POST"]),_paq.push(["setTrackerUrl",e+"matomo.php"]),_paq.push(["setSiteId","80"]);var a=document,t=a.createElement("script"),p=a.getElementsByTagName("script")[0];t.type="text/javascript",t.async=!0,t.src=e+"matomo.js",p.parentNo [...]
+<script src="/assets/js/runtime~main.0a940c88.js" defer="defer"></script>
+<script src="/assets/js/main.4a006c5e.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/img/apache-iggy0.5x.png"><link rel="preload" as="image" [...]
+<p>To start using the Iggy SDK in your Rust project, simply run <code>cargo add iggy</code>.</p></div></article><nav class="docusaurus-mt-lg pagination-nav" aria-label="Docs pages"><a class="pagination-nav__link pagination-nav__link--prev" href="/docs/sdk/python/examples"><div class="pagination-nav__sublabel">Previous</div><div class="pagination-nav__label">Examples</div></a><a class="pagination-nav__link pagination-nav__link--next" href="/docs/sdk/rust/examples"><div class="pagination-n [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/sdk/rust/stream-builder/index.html b/docs/sdk/rust/stream-builder/index.html
new file mode 100644
index 00000000..26835e3b
--- /dev/null
+++ b/docs/sdk/rust/stream-builder/index.html
@@ -0,0 +1,112 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-sdk/rust/sdk-rust-stream-builder" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">Stream Builder | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" pro [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed">
+
+
+
+
+
+<link rel="preconnect" href="https://analytics.apache.org/">
+<script>var _paq=window._paq=window._paq||[];_paq.push(["setRequestMethod","POST"]),_paq.push(["trackPageView"]),_paq.push(["enableLinkTracking"]),_paq.push(["enableHeartBeatTimer"]),function(){var e="https://analytics.apache.org/";_paq.push(["setRequestMethod","POST"]),_paq.push(["setTrackerUrl",e+"matomo.php"]),_paq.push(["setSiteId","80"]);var a=document,t=a.createElement("script"),p=a.getElementsByTagName("script")[0];t.type="text/javascript",t.async=!0,t.src=e+"matomo.js",p.parentNo [...]
+<script src="/assets/js/runtime~main.0a940c88.js" defer="defer"></script>
+<script src="/assets/js/main.4a006c5e.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/img/apache-iggy0.5x.png"><link rel="preload" as="image" [...]
+indeed, it does provide a simple way to connect to the server. However, when you write an event based application,
+you typically encounter one or more of the following scenarios:</p>
+<ol>
+<li class="">The consumer and producer operate on the same stream and topic.</li>
+<li class="">The consumer operates on different streams and topics.</li>
+<li class="">The producers operate on different streams and topics.</li>
+<li class="">Add consumers dynamically at runtime.</li>
+<li class="">Add producers dynamically at runtime.</li>
+</ol>
+<p>The stream builder provides a convenient way to create the iggy client, producer and consumer for these use cases.
+All source code examples are located in the <a href="https://github.com/apache/iggy/tree/master/core/examples/src/stream-builder" target="_blank" rel="noopener noreferrer" class=""><strong>examples folder</strong></a> of the iggy repository. Also,
+if you encounter a problem with any of the examples below, please ask in the <a href="https://discord.gg/apache-iggy" target="_blank" rel="noopener noreferrer" class=""><strong>community discord</strong></a>.</p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="iggystream-builder">IggyStream Builder<a href="#iggystream-builder" class="hash-link" aria-label="Direct link to IggyStream Builder" title="Direct link to IggyStream Builder" translate="no"></a></h2>
+<p>In the first case, the IggyStream Builder offers a fast and efficient way to get you started:</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">use</span><span class="token plain"> </span><span class="token name [...]
+<p>As you can see, the <code>IggyStream</code> builder is used to create the iggy client, producer and consumer.
+Here, we use the default configuration to get started quickly, but you can always customize the configuration to fit
+your requirements.</p>
+<p>The <code>consume_messages</code> method is not part of the IggyConsumer; instead, you import the IggyConsumerMessageExt
+trait which provides the <code>consume_messages</code> method. The PrintEventConsumer implements the MessageConsumer trait
+and is invoked to process each incoming message. A simple implementation is show below:</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">use</span><span class="token plain"> </span><span class="token name [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="iggystreamproducer-builder">IggyStreamProducer Builder<a href="#iggystreamproducer-builder" class="hash-link" aria-label="Direct link to IggyStreamProducer Builder" title="Direct link to IggyStreamProducer Builder" translate="no"></a></h2>
+<p>When you implement the producer side, you can use the <code>IggyStreamProducer</code> to get started:</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">use</span><span class="token plain"> </span><span class="token name [...]
+<p>If you already have a custom iggy client, you can use that one by replacing the <code>with_client_from_url</code>
+constructor with the following:</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">let</span><span class="token p [...]
+<p>You find sample utils to build a customized iggy client in
+the <a href="https://github.com/apache/iggy/blob/master/core/examples/src/shared/client.rs" target="_blank" rel="noopener noreferrer" class=""><strong>examples folder</strong></a> of the iggy
+repository.</p>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="producer-configuration">Producer configuration<a href="#producer-configuration" class="hash-link" aria-label="Direct link to Producer configuration" title="Direct link to Producer configuration" translate="no"></a></h3>
+<p>The IggyProducerConfig gives you a way to configure the producer in sufficient detail. Please note, if you have
+questions about any of those settings, please ask in the community discord. For basic customization, the <code>from_stream_topic</code> constructor
+lets you set a custom stream and topic name as well as the maximum batch size and message send interval.</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">use</span><span class="token plain"> </span><span class="token name [...]
+<p>The remaining configuration fields are set to default values applicable to the most common use case. This should be sufficient for a simple application, or proof of concept without getting lost in details.
+However, for more complex applications, you might want to configure more
+details and for that, see below a commented example of the full producer configuration:</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">use</span><span class="token plain"> </span><span class="token name [...]
+<p>Note, when your requirements exceed this configuration, you can still
+use the <a href="https://github.com/apache/iggy/blob/master/core/examples/src/basic/producer/main.rs" target="_blank" rel="noopener noreferrer" class=""><strong>underlying low level SDK</strong></a> for fine grained control over every detail of the producer.</p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="iggystreamconsumer-builder">IggyStreamConsumer Builder<a href="#iggystreamconsumer-builder" class="hash-link" aria-label="Direct link to IggyStreamConsumer Builder" title="Direct link to IggyStreamConsumer Builder" translate="no"></a></h2>
+<p>When you have an existing server with multiple producers, you may have to implement a consumer for a specific stream or
+topic. In some cases you may already have a configured iggy client, in others you may need to create
+one. In either case, you can use the <code>IggyStreamConsumer</code> to create the consumer.</p>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="build-consumer-and-client">Build consumer and client<a href="#build-consumer-and-client" class="hash-link" aria-label="Direct link to Build consumer and client" title="Direct link to Build consumer and client" translate="no"></a></h3>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">use</span><span class="token plain"> </span><span class="token name [...]
+<p>Similar to the previous StreamBuilder, the IggyConsumerMessageExt is used to process messages using
+the PrintEventConsumer implementation of the MessageConsumer trait.</p>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="build-consumer-from-an-existing-client">Build consumer from an existing client<a href="#build-consumer-from-an-existing-client" class="hash-link" aria-label="Direct link to Build consumer from an existing client" title="Direct link to Build consumer from an existing client" translate="no"></a></h3>
+<p>In the event that you have an existing iggy client, you can use the <code>IggyStreamConsumer::build</code> method to create the
+consumer. To do so, just replace the <code>with_client_from_url</code> with the following:</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">let</span><span class="token plai [...]
+<p>Notice, you find some utils to build a customized iggy client in
+the <a href="https://github.com/apache/iggy/blob/master/core/examples/src/shared/client.rs" target="_blank" rel="noopener noreferrer" class=""><strong>examples folder</strong></a> of the iggy
+repository.</p>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="consumer-configuration">Consumer configuration<a href="#consumer-configuration" class="hash-link" aria-label="Direct link to Consumer configuration" title="Direct link to Consumer configuration" translate="no"></a></h3>
+<p>The default configuration only exists to get you started quickly i.e. to test out an idea, draft an proof of concept or
+similar. In practice, you often want fine grained control over the configuration. The IggyConsumerConfig gives you a way
+to configure the consumer in sufficient detail without distracting with low level details.
+Please note, if you have questions about any of those settings, please ask in
+the <a href="https://discord.gg/apache-iggy" target="_blank" rel="noopener noreferrer" class="">community discord</a>. See below a commented configuration example:</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">use</span><span class="token plain"> </span><span class="token name [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="add-consumers-dynamically-at-runtime">Add consumers dynamically at runtime.<a href="#add-consumers-dynamically-at-runtime" class="hash-link" aria-label="Direct link to Add consumers dynamically at runtime." title="Direct link to Add consumers dynamically at runtime." translate="no"></a></h2>
+<p>When you create consumers on demand at application runtime, you have to
+ensure that the stream and topic exist before creating the consumer and
+you have to set the <code>init_retries</code> and <code>init_interval</code> in the stream builder
+to ensure the consumer retries a few more times in case the topic and stream are not immediately available.</p>
+<p>However, when you cannot guarantee that the stream or topic exist before the consumer starts,
+you have to set <code>create_stream_if_not_exists</code> and <code>create_topic_if_not_exists</code> to <code>true</code> in the IggyConsumerConfig
+to ensure the consumer creates them and starts correctly. Other than that, you just call the
+<code>IggyStreamConsumer::build</code> method as before i.e.:</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">let</span><span class="token p [...]
+<p>Where <code>get_my_custom_iggy_consumer_config</code> refers to a function that returns an <code>IggyConsumerConfig</code>
+that specifies the stream and topic to consume as well the init retry or whether to create the stream and topic.</p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="add-producers-dynamically-at-runtime">Add producers dynamically at runtime.<a href="#add-producers-dynamically-at-runtime" class="hash-link" aria-label="Direct link to Add producers dynamically at runtime." title="Direct link to Add producers dynamically at runtime." translate="no"></a></h2>
+<p>Adding new producers to the iggy server at runtime is as simple as creating a new config and
+calling the <code>IggyStreamProducer::build</code> method. Unlike the consumer, the producer always crates
+missing streams or topics by default. The <code>IggyConsumerConfig</code> has a convenient builder to create
+a new configuration from just the stream, topic, batch size and send interval. See the example below.</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">let</span><span class="token p [...]
+<p>If you encounter a problem with any of the examples show on this page,
+please ask in the <a href="https://discord.gg/apache-iggy" target="_blank" rel="noopener noreferrer" class=""><strong>community discord</strong></a>.</p></div></article><nav class="docusaurus-mt-lg pagination-nav" aria-label="Docs pages"><a class="pagination-nav__link pagination-nav__link--prev" href="/docs/sdk/rust/high-level-sdk"><div class="pagination-nav__sublabel">Previous</div><div class="pagination-nav__label">High-level SDK</div></a><a class="pagination-nav__link pagination-nav__ [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/server/benchmarking/index.html b/docs/server/benchmarking/index.html
new file mode 100644
index 00000000..9cb5a661
--- /dev/null
+++ b/docs/server/benchmarking/index.html
@@ -0,0 +1,69 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-server/server-benchmarking" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">Benchmarking | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" prope [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed">
+
+
+
+
+
+<link rel="preconnect" href="https://analytics.apache.org/">
+<script>var _paq=window._paq=window._paq||[];_paq.push(["setRequestMethod","POST"]),_paq.push(["trackPageView"]),_paq.push(["enableLinkTracking"]),_paq.push(["enableHeartBeatTimer"]),function(){var e="https://analytics.apache.org/";_paq.push(["setRequestMethod","POST"]),_paq.push(["setTrackerUrl",e+"matomo.php"]),_paq.push(["setSiteId","80"]);var a=document,t=a.createElement("script"),p=a.getElementsByTagName("script")[0];t.type="text/javascript",t.async=!0,t.src=e+"matomo.js",p.parentNo [...]
+<script src="/assets/js/runtime~main.0a940c88.js" defer="defer"></script>
+<script src="/assets/js/main.4a006c5e.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/img/apache-iggy0.5x.png"><link rel="preload" as="image" [...]
+<p>We've also built the <strong><a href="https://benchmarks.iggy.apache.org" target="_blank" rel="noopener noreferrer" class="">benchmarking platform</a></strong> where anyone can upload the benchmarks and compare the results with others. This is the another open-source project available <a href="https://github.com/apache/iggy/tree/master/core/bench/dashboard" target="_blank" rel="noopener noreferrer" class="">here</a>.</p>
+<p><img decoding="async" loading="lazy" alt="Benchmarking Platform" src="/assets/images/bench_platform-dad3f0256bec6e556b40ea798366b7fe.png" width="2048" height="1255" class="img_ev3q"></p>
+<p>Iggy comes with a built-in benchmarking tool <code>iggy-bench</code> that allows you to measure the performance of the server. It is written in Rust and uses the <code>tokio</code> runtime for asynchronous I/O operations mimicking the example client applications. The tool is designed to be as close to real-world scenarios as possible, so you can use it to estimate the performance of the server in your environment. It is part of the <a href="https://github.com/apache/iggy/tree/master/ [...]
+<p><img decoding="async" loading="lazy" alt="Bench CLI" src="/assets/images/bench_cli-02b0d7bd13656d700fbdf1c76ae76fa3.png" width="2048" height="1079" class="img_ev3q"></p>
+<p>To benchmark the project, first build the project in release mode:</p>
+<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">cargo</span><span class="token plain"> build </span><span class="t [...]
+<p>Then, run the benchmarking app with the desired options:</p>
+<ol>
+<li class="">
+<p>Sending (writing) benchmark</p>
+<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">cargo</span><span class="token plain"> r </span><span class="token [...]
+</li>
+<li class="">
+<p>Polling (reading) benchmark</p>
+<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">cargo</span><span class="token plain"> r </span><span class="token [...]
+</li>
+<li class="">
+<p>Parallel sending and polling benchmark</p>
+<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">cargo</span><span class="token plain"> r </span><span class="token [...]
+</li>
+<li class="">
+<p>Balanced sending to multiple partitions benchmark</p>
+<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">cargo</span><span class="token plain"> r </span><span class="token [...]
+</li>
+<li class="">
+<p>Consumer group polling benchmark:</p>
+<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">cargo</span><span class="token plain"> r </span><span class="token [...]
+</li>
+<li class="">
+<p>Parallel balanced sending and polling from consumer group benchmark:</p>
+<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">cargo</span><span class="token plain"> r </span><span class="token [...]
+</li>
+<li class="">
+<p>End to end producing and consuming benchmark (single task produces and consumes messages in sequence):</p>
+<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">cargo</span><span class="token plain"> r </span><span class="token [...]
+</li>
+</ol>
+<p>These benchmarks would start the server with the default configuration, create a stream, topic and partition, and then send or poll the messages. The default configuration is optimized for the best performance, so you might want to tweak it for your needs. If you need more options, please refer to <code>iggy-bench</code> subcommands <code>help</code> and <code>examples</code>.</p>
+<p>For example, to run the benchmark for the already started server, provide the additional argument <code>--server-address 0.0.0.0:8090</code>.</p>
+<p>Depending on the hardware, transport protocol (<code>quic</code>, <code>tcp</code> or <code>http</code>) and payload size (<code>messages-per-batch * message-size</code>) you might expect <strong>over 5000 MB/s (e.g. 5M of 1 KB msg/sec) throughput for writes and reads</strong>.</p>
+<p><strong>Iggy is already capable of processing millions of messages per second at the microseconds range for p99+ latency</strong>, and with the upcoming optimizations related to the io_uring support along with the shared-nothing design, it will only get better.</p></div></article><nav class="docusaurus-mt-lg pagination-nav" aria-label="Docs pages"><a class="pagination-nav__link pagination-nav__link--prev" href="/docs/server/schema"><div class="pagination-nav__sublabel">Previous</div>< [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/server/configuration/index.html b/docs/server/configuration/index.html
new file mode 100644
index 00000000..b15ef86a
--- /dev/null
+++ b/docs/server/configuration/index.html
@@ -0,0 +1,51 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-server/server-configuration" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">Configuration | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" prop [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed">
+
+
+
+
+
+<link rel="preconnect" href="https://analytics.apache.org/">
+<script>var _paq=window._paq=window._paq||[];_paq.push(["setRequestMethod","POST"]),_paq.push(["trackPageView"]),_paq.push(["enableLinkTracking"]),_paq.push(["enableHeartBeatTimer"]),function(){var e="https://analytics.apache.org/";_paq.push(["setRequestMethod","POST"]),_paq.push(["setTrackerUrl",e+"matomo.php"]),_paq.push(["setSiteId","80"]);var a=document,t=a.createElement("script"),p=a.getElementsByTagName("script")[0];t.type="text/javascript",t.async=!0,t.src=e+"matomo.js",p.parentNo [...]
+<script src="/assets/js/runtime~main.0a940c88.js" defer="defer"></script>
+<script src="/assets/js/main.4a006c5e.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/img/apache-iggy0.5x.png"><link rel="preload" as="image" [...]
+<p>In case no configuration file is found, the server will use the default configuration.</p>
+<p>Let's take a look at the configuration file, and discuss the available options.</p>
+<div class="language-toml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-toml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">[</span><span class="token table class-name">data_maintenance.a [...]
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="durability">Durability<a href="#durability" class="hash-link" aria-label="Direct link to Durability" title="Direct link to Durability" translate="no"></a></h3>
+<p>The single node <code>Iggy</code> server by default provides low durability guarantees, meaning that in case of a crash or power loss, some of messages might be lost.
+To fix that you can enable <code>enforce_fsync</code> option in <code>system.partition</code> section together with setting <code>messages_required_to_save</code> and <code>size_of_messages_required_to_save</code> to lowest allowed values.
+Since <code>messages_required_to_save</code> has to be at least 32 and <code>size_of_messages_required_to_save</code> at least 512 B, in case if your message size is not big enough, you might want to pad your message to 512 B boundary, or alternatively send messages in batches.</p>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="http">HTTP<a href="#http" class="hash-link" aria-label="Direct link to HTTP" title="Direct link to HTTP" translate="no"></a></h3>
+<p>An optional transport layer, which can be used to connect to the server with any tool or application that supports HTTP. It is enabled by default, but you can disable it by setting <code>enabled</code> to <code>false</code>. The <code>address</code> option specifies the address and port to listen on. The <code>cors</code> section allows you to configure the CORS policy, which internally uses <a href="https://docs.rs/tower-http/latest/tower_http/cors/index.html" target="_blank" rel="no [...]
+<p>HTTP API is built on top of <a href="https://github.com/tokio-rs/axum" target="_blank" rel="noopener noreferrer" class="">Axum</a> and you can find all the available endpoints in <a href="https://github.com/apache/iggy/blob/master/core/server/server.http" target="_blank" rel="noopener noreferrer" class="">server.http</a> file, which can be used with <a href="https://marketplace.visualstudio.com/items?itemName=humao.rest-client" target="_blank" rel="noopener noreferrer" class="">REST C [...]
+<p>To consume the HTTP API from Iggy SDK, you need to make use of the available <code>HttpClient</code> component.</p>
+<p>HTTP API is highly performant, however, it's not as performant as TCP, and, since it's a stateless protocol, there's no such thing as the ongoing connection between client and server, thus some of the features such as consumer groups are not available.</p>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="tcp">TCP<a href="#tcp" class="hash-link" aria-label="Direct link to TCP" title="Direct link to TCP" translate="no"></a></h3>
+<p>An optional transport layer, which can be used to connect to the server with any tool or application that supports TCP. It is enabled by default, but you can disable it by setting <code>enabled</code> to <code>false</code>. The <code>address</code> option specifies the address and port to listen on.</p>
+<p>TCP provides the highest performance and throughput as it works directly with the binary data without an additional overhead of e.g. HTTP spec along with the JSON serialization.</p>
+<p>To consume the TCP API from Iggy SDK, you need to make use of the available <code>TcpClient</code> component.</p>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="quic">QUIC<a href="#quic" class="hash-link" aria-label="Direct link to QUIC" title="Direct link to QUIC" translate="no"></a></h3>
+<p>An optional transport layer, which can be used to connect to the server with any tool or application that supports QUIC. It is enabled by default, but you can disable it by setting <code>enabled</code> to <code>false</code>. The <code>address</code> option specifies the address and port to listen on.</p>
+<p>Similar to TCP it's a stateful protocol, however, it's not as performant as TCP. QUIC support is built on top of <a href="https://github.com/quinn-rs/quinn" target="_blank" rel="noopener noreferrer" class="">Quinn</a> library, and all the remaining options are essentially the direct mapping of the options available in Quinn. QUIC and TCP use the same custom binary protocol specification.</p>
+<p>To consume the QUIC API from Iggy SDK, you need to make use of the available <code>QuicClient</code> component.</p>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="websocket">WebSocket<a href="#websocket" class="hash-link" aria-label="Direct link to WebSocket" title="Direct link to WebSocket" translate="no"></a></h3>
+<p>An optional transport layer, which can be used to connect to the server with any tool or application that supports WebSocket. It is enabled by default, but you can disable it by setting <code>enabled</code> to <code>false</code>. The <code>address</code> option specifies the address and port to listen on.</p>
+<p>To consume the WebSocket API from Iggy SDK, you need to make use of the available <code>WebSocketClient</code> component.</p></div></article><nav class="docusaurus-mt-lg pagination-nav" aria-label="Docs pages"><a class="pagination-nav__link pagination-nav__link--prev" href="/docs/server/introduction"><div class="pagination-nav__sublabel">Previous</div><div class="pagination-nav__label">Introduction</div></a><a class="pagination-nav__link pagination-nav__link--next" href="/docs/server/ [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/server/docker/index.html b/docs/server/docker/index.html
new file mode 100644
index 00000000..1b33a3d4
--- /dev/null
+++ b/docs/server/docker/index.html
@@ -0,0 +1,33 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-server/server-docker" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">Docker | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" property="o [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed">
+
+
+
+
+
+<link rel="preconnect" href="https://analytics.apache.org/">
+<script>var _paq=window._paq=window._paq||[];_paq.push(["setRequestMethod","POST"]),_paq.push(["trackPageView"]),_paq.push(["enableLinkTracking"]),_paq.push(["enableHeartBeatTimer"]),function(){var e="https://analytics.apache.org/";_paq.push(["setRequestMethod","POST"]),_paq.push(["setTrackerUrl",e+"matomo.php"]),_paq.push(["setSiteId","80"]);var a=document,t=a.createElement("script"),p=a.getElementsByTagName("script")[0];t.type="text/javascript",t.async=!0,t.src=e+"matomo.js",p.parentNo [...]
+<script src="/assets/js/runtime~main.0a940c88.js" defer="defer"></script>
+<script src="/assets/js/main.4a006c5e.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/img/apache-iggy0.5x.png"><link rel="preload" as="image" [...]
+<p>Below is an example of the <code>docker-compose.yml</code> file which additionally overrides the default configuration (described in the section below) with the environment variables. If you prefer using the configuration file, you can mount it as a volume and provide the path to it with the <code>IGGY_CONFIG_PATH</code> environment variable.</p>
+<p>When running the container, <strong>make sure to include the additional capabilities</strong>, as you can find in <a href="https://github.com/apache/iggy/blob/master/docker-compose.yml" target="_blank" rel="noopener noreferrer" class="">docker-compose</a> file:</p>
+<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">iggy</span><span class="token punctuation" style="color:#393A34" [...]
+<p>Or when running with <code>docker run</code>:</p>
+<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">docker run --cap-add=SYS_NICE --security-opt seccomp=unconfined --ulimit memlock=-1:-1 apac [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/server/introduction/index.html b/docs/server/introduction/index.html
new file mode 100644
index 00000000..d7c05df3
--- /dev/null
+++ b/docs/server/introduction/index.html
@@ -0,0 +1,35 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-server/server-introduction" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">Introduction | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" prope [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed">
+
+
+
+
+
+<link rel="preconnect" href="https://analytics.apache.org/">
+<script>var _paq=window._paq=window._paq||[];_paq.push(["setRequestMethod","POST"]),_paq.push(["trackPageView"]),_paq.push(["enableLinkTracking"]),_paq.push(["enableHeartBeatTimer"]),function(){var e="https://analytics.apache.org/";_paq.push(["setRequestMethod","POST"]),_paq.push(["setTrackerUrl",e+"matomo.php"]),_paq.push(["setSiteId","80"]);var a=document,t=a.createElement("script"),p=a.getElementsByTagName("script")[0];t.type="text/javascript",t.async=!0,t.src=e+"matomo.js",p.parentNo [...]
+<script src="/assets/js/runtime~main.0a940c88.js" defer="defer"></script>
+<script src="/assets/js/main.4a006c5e.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/img/apache-iggy0.5x.png"><link rel="preload" as="image" [...]
+<p>Iggy server is the most important part of the system as it's responsible for handling all the incoming connections, managing the data and providing the API for the clients. The server is written in Rust and can be run on any platform that supports it.</p>
+<p>The releases are published to GitHub and can be found <a href="https://github.com/apache/iggy/tags" target="_blank" rel="noopener noreferrer" class="">here</a>. The official Docker images can be found <a href="https://hub.docker.com/r/apache/iggy" target="_blank" rel="noopener noreferrer" class="">here</a>, simply type <code>docker pull apache/iggy</code>.</p>
+<p>Keep in mind, that if you were to compile the source code in release mode, the longer compilation time is due to <a href="https://doc.rust-lang.org/rustc/linker-plugin-lto.html" target="_blank" rel="noopener noreferrer" class="">LTO</a> enabled in <a href="https://github.com/apache/iggy/blob/master/Cargo.toml#L2" target="_blank" rel="noopener noreferrer" class="">profile</a>.</p>
+<p>The HTTP API endpoints can be found in <a href="https://github.com/apache/iggy/blob/master/core/server/server.http" target="_blank" rel="noopener noreferrer" class="">server.http</a> file, which can be used with <a href="https://marketplace.visualstudio.com/items?itemName=humao.rest-client" target="_blank" rel="noopener noreferrer" class="">REST Client</a> extension for VS Code.</p>
+<p>In order to see the detailed logs from the server, run it with <code>RUST_LOG=trace</code> environment variable.</p>
+<p>And finally, to seed the example data, simply execute <code>cargo r --bin data-seeder-tool</code> from the root of the repository while running your Iggy server.</p>
+<p>All the requests to the server except of sending a ping, fetching the stats or logging in, require the session to be authenticated. The session is created by logging in with the user's credentials or personal access token and is valid for the duration of the session or until the user logs out or the connection is lost. In case of HTTP API, the authentication is done by providing the <code>Authorization</code> header with the <code>Bearer</code> token.</p></div></article><nav clas [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/server/schema/index.html b/docs/server/schema/index.html
new file mode 100644
index 00000000..9d74f85f
--- /dev/null
+++ b/docs/server/schema/index.html
@@ -0,0 +1,324 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-server/server-schema" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">Schema | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" property="o [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed">
+
+
+
+
+
+<link rel="preconnect" href="https://analytics.apache.org/">
+<script>var _paq=window._paq=window._paq||[];_paq.push(["setRequestMethod","POST"]),_paq.push(["trackPageView"]),_paq.push(["enableLinkTracking"]),_paq.push(["enableHeartBeatTimer"]),function(){var e="https://analytics.apache.org/";_paq.push(["setRequestMethod","POST"]),_paq.push(["setTrackerUrl",e+"matomo.php"]),_paq.push(["setSiteId","80"]);var a=document,t=a.createElement("script"),p=a.getElementsByTagName("script")[0];t.type="text/javascript",t.async=!0,t.src=e+"matomo.js",p.parentNo [...]
+<script src="/assets/js/runtime~main.0a940c88.js" defer="defer"></script>
+<script src="/assets/js/main.4a006c5e.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/img/apache-iggy0.5x.png"><link rel="preload" as="image" [...]
+<p>Currently, there are 2 ways of data representation: JSON (text) and binary - any serialization format that you prefer such as bincode, SBE, flatbuffers, protobuf or even your custom one, as the server simply expects the raw bytes as the message payload.</p>
+<p>The binary format is more compact and efficient, but it is not human-readable - it's being used by TCP and QUIC transports. The JSON format is used by HTTP transport - all the existing endpoints are available in the <a href="https://github.com/apache/iggy/blob/master/core/server/server.http" target="_blank" rel="noopener noreferrer" class="">server.http</a>.</p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="request-schema">Request schema<a href="#request-schema" class="hash-link" aria-label="Direct link to Request schema" title="Direct link to Request schema" translate="no"></a></h2>
+<p>All the requests are represented as a binary message. The message consists of 3 parts: length, code and payload:</p>
+<ul>
+<li class="">length - 4-byte integer (u32) which represents the total length: code (4 bytes) + payload (N bytes)</li>
+<li class="">code - 4-byte integer (u32) which represents the request code</li>
+<li class="">payload - binary data of N bytes length</li>
+</ul>
+<p>For example, if the payload is 100 bytes, the length will have a value of 104 (100 bytes for payload + 4 const bytes for the code). The message as whole will have 108 (4 + 4 + 100) bytes size.</p>
+<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">+-----------------------------------------------------------+</span><br></span><span class= [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="response-schema">Response schema<a href="#response-schema" class="hash-link" aria-label="Direct link to Response schema" title="Direct link to Response schema" translate="no"></a></h2>
+<p>All the responses are represented as a binary message. The message consists of 3 parts: status, length and payload:</p>
+<ul>
+<li class="">status - 4-byte integer (u32) which represents the status code. The status code is 0 for success and any other value for an error.</li>
+<li class="">length - 4-byte integer (u32) which represents the total length: status (4 bytes) + payload (N bytes)</li>
+<li class="">payload - binary data of N bytes length</li>
+</ul>
+<p>In case of errors, the length will be always equal to 0 and the payload will be empty.</p>
+<p>When trying to fetch the resource which may not exist, such as a stream, topic, user etc., the response will have a status code 0 (OK), but the payload will be empty, as there's no data to return.</p>
+<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">+-----------------------------------------------------------+</span><br></span><span class= [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="request-codes">Request codes<a href="#request-codes" class="hash-link" aria-label="Direct link to Request codes" title="Direct link to Request codes" translate="no"></a></h2>
+<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">PING </span><span class="token operator" style="color:#393A34">=</span><span class="token p [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="shared">Shared<a href="#shared" class="hash-link" aria-label="Direct link to Shared" title="Direct link to Shared" translate="no"></a></h2>
+<hr>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="consumer">Consumer<a href="#consumer" class="hash-link" aria-label="Direct link to Consumer" title="Direct link to Consumer" translate="no"></a></h3>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<p>The <code>Consumer</code> is a simple structs which represents the type of the consumer. It can be either a consumer or a consumer group. This type is used when interacting with the messages related commands data such as <code>PollMessages</code>, <code>GetConsumerOffset</code> and <code>StoreConsumerOffset</code>.</p>
+<p><strong>Serialization</strong></p>
+<ul>
+<li class=""><code>kind</code> - 1 byte</li>
+<li class=""><code>id</code> - 4 bytes</li>
+</ul>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="identifier">Identifier<a href="#identifier" class="hash-link" aria-label="Direct link to Identifier" title="Direct link to Identifier" translate="no"></a></h3>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<p>The <code>Identifier</code> is a struct which represents the identifier of the stream or topic. It consists of the <code>kind</code> (numeric or string), <code>length</code> (length of the identifier value) and <code>value</code> (actual value of the identifier). The <code>value</code> is a vector of bytes, which can be either a numeric value (e.g. 1 encoded as const 4 bytes for u32 type) or a string (e.g. "my-stream") with variable length of UTF-8 string, maximum 255 bytes [...]
+<p><strong>Serialization</strong></p>
+<ul>
+<li class=""><code>kind</code> - 1 byte</li>
+<li class=""><code>length</code> - 1 byte</li>
+<li class=""><code>value</code> - N bytes</li>
+</ul>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="polledmessages">PolledMessages<a href="#polledmessages" class="hash-link" aria-label="Direct link to PolledMessages" title="Direct link to PolledMessages" translate="no"></a></h3>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<p>The <code>PolledMessages</code> is a struct returned by the <code>PollMessages</code> command. It consists of the <code>partition_id</code>, <code>current_offset</code> and <code>messages</code> fields. The <code>messages</code> field is a vector of <code>Message</code> structs.</p>
+<p><strong>Serialization</strong></p>
+<ul>
+<li class=""><code>partition_id</code> - 4 bytes</li>
+<li class=""><code>current_offset</code> - 8 bytes</li>
+<li class=""><code>messages_count</code> - 4 bytes (hidden field)</li>
+<li class=""><code>messages</code> - N bytes</li>
+</ul>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="message">Message<a href="#message" class="hash-link" aria-label="Direct link to Message" title="Direct link to Message" translate="no"></a></h3>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<p>The <code>Message</code> consists of the <code>offset</code> (offset of the message in the partition), <code>state</code> (state of the message), <code>timestamp</code> (timestamp of the message), <code>id</code> (unique identifier of the message), <code>checksum</code> (checksum of the message), <code>headers</code> (optional headers of the message), <code>length</code> (length of the payload) and <code>payload</code> (actual payload of the message).</p>
+<p><strong>Serialization</strong></p>
+<ul>
+<li class=""><code>offset</code> - 8 bytes</li>
+<li class=""><code>state</code> - 1 byte</li>
+<li class=""><code>timestamp</code> - 8 bytes</li>
+<li class=""><code>id</code> - 16 bytes</li>
+<li class=""><code>checksum</code> - 4 bytes</li>
+<li class=""><code>headers</code> - N bytes</li>
+<li class=""><code>length</code> - 4 bytes</li>
+<li class=""><code>payload</code> - N bytes</li>
+</ul>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="consumeroffsetinfo">ConsumerOffsetInfo<a href="#consumeroffsetinfo" class="hash-link" aria-label="Direct link to ConsumerOffsetInfo" title="Direct link to ConsumerOffsetInfo" translate="no"></a></h3>
+<p>The <code>ConsumerOffsetInfo</code> is a struct returned by the <code>GetConsumerOffset</code> command. It consists of the <code>partition_id</code>, <code>current_offset</code> and <code>stored_offset</code> fields.</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<p><strong>Serialization</strong></p>
+<ul>
+<li class=""><code>partition_id</code> - 4 bytes</li>
+<li class=""><code>current_offset</code> - 8 bytes</li>
+<li class=""><code>stored_offset</code> - 8 bytes</li>
+</ul>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="streams">Streams<a href="#streams" class="hash-link" aria-label="Direct link to Streams" title="Direct link to Streams" translate="no"></a></h2>
+<hr>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="get-stream">Get stream<a href="#get-stream" class="hash-link" aria-label="Direct link to Get stream" title="Direct link to Get stream" translate="no"></a></h3>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<p><strong>Code: 200</strong></p>
+<p><strong>Serialization</strong></p>
+<ul>
+<li class=""><code>stream_id</code> - 3-257 bytes</li>
+</ul>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="get-streams">Get streams<a href="#get-streams" class="hash-link" aria-label="Direct link to Get streams" title="Direct link to Get streams" translate="no"></a></h3>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<p><strong>Code: 201</strong></p>
+<p><strong>Serialization</strong></p>
+<ul>
+<li class="">Empty bytes</li>
+</ul>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="create-stream">Create stream<a href="#create-stream" class="hash-link" aria-label="Direct link to Create stream" title="Direct link to Create stream" translate="no"></a></h3>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<p><strong>Code: 202</strong></p>
+<p><strong>Serialization</strong></p>
+<ul>
+<li class=""><code>stream_id</code> - 3-257 bytes</li>
+<li class=""><code>name_length</code> - 1 byte (hidden field)</li>
+<li class=""><code>name</code> - 1-255 bytes</li>
+</ul>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="delete-stream">Delete stream<a href="#delete-stream" class="hash-link" aria-label="Direct link to Delete stream" title="Direct link to Delete stream" translate="no"></a></h3>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<p><strong>Code: 203</strong></p>
+<p><strong>Serialization</strong></p>
+<ul>
+<li class=""><code>stream_id</code> - 3-257 bytes</li>
+</ul>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="topics">Topics<a href="#topics" class="hash-link" aria-label="Direct link to Topics" title="Direct link to Topics" translate="no"></a></h2>
+<hr>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="get-topic">Get topic<a href="#get-topic" class="hash-link" aria-label="Direct link to Get topic" title="Direct link to Get topic" translate="no"></a></h3>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<p><strong>Code: 300</strong></p>
+<p><strong>Serialization</strong></p>
+<ul>
+<li class=""><code>stream_id</code> - 3-257 bytes</li>
+<li class=""><code>topic_id</code> - 3-257 bytes</li>
+</ul>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="get-topics">Get topics<a href="#get-topics" class="hash-link" aria-label="Direct link to Get topics" title="Direct link to Get topics" translate="no"></a></h3>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<p><strong>Code: 301</strong></p>
+<p><strong>Serialization</strong></p>
+<ul>
+<li class=""><code>stream_id</code> - 3-257 bytes</li>
+</ul>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="create-topic">Create topic<a href="#create-topic" class="hash-link" aria-label="Direct link to Create topic" title="Direct link to Create topic" translate="no"></a></h3>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<p><strong>Code: 302</strong></p>
+<p><strong>Serialization</strong></p>
+<ul>
+<li class=""><code>stream_id</code> - 3-257 bytes</li>
+<li class=""><code>topic_id</code> - 3-257 bytes</li>
+<li class=""><code>partitions_count</code> - 4 bytes</li>
+<li class=""><code>name_length</code> - 1 byte (hidden field)</li>
+<li class=""><code>name</code> - 1-255 bytes</li>
+</ul>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="delete-topic">Delete topic<a href="#delete-topic" class="hash-link" aria-label="Direct link to Delete topic" title="Direct link to Delete topic" translate="no"></a></h3>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<p><strong>Code: 303</strong></p>
+<p><strong>Serialization</strong></p>
+<ul>
+<li class=""><code>stream_id</code> - 3-257 bytes</li>
+<li class=""><code>topic_id</code> - 3-257 bytes</li>
+</ul>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="partitions">Partitions<a href="#partitions" class="hash-link" aria-label="Direct link to Partitions" title="Direct link to Partitions" translate="no"></a></h2>
+<hr>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="create-partitions">Create partitions<a href="#create-partitions" class="hash-link" aria-label="Direct link to Create partitions" title="Direct link to Create partitions" translate="no"></a></h3>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<p><strong>Code: 402</strong></p>
+<p><strong>Serialization</strong></p>
+<ul>
+<li class=""><code>stream_id</code> - 3-257 bytes</li>
+<li class=""><code>topic_id</code> - 3-257 bytes</li>
+<li class=""><code>partitions_count</code> - 4 bytes</li>
+</ul>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="delete-partitions">Delete partitions<a href="#delete-partitions" class="hash-link" aria-label="Direct link to Delete partitions" title="Direct link to Delete partitions" translate="no"></a></h3>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<p><strong>Code: 403</strong></p>
+<p><strong>Serialization</strong></p>
+<ul>
+<li class=""><code>stream_id</code> - 3-257 bytes</li>
+<li class=""><code>topic_id</code> - 3-257 bytes</li>
+<li class=""><code>partitions_count</code> - 4 bytes</li>
+</ul>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="messages">Messages<a href="#messages" class="hash-link" aria-label="Direct link to Messages" title="Direct link to Messages" translate="no"></a></h2>
+<hr>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="poll-messages">Poll messages<a href="#poll-messages" class="hash-link" aria-label="Direct link to Poll messages" title="Direct link to Poll messages" translate="no"></a></h3>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<p><strong>Code: 100</strong></p>
+<p><strong>Serialization</strong></p>
+<ul>
+<li class=""><code>consumer</code> - 5 bytes</li>
+<li class=""><code>stream_id</code> - 3-257 bytes</li>
+<li class=""><code>topic_id</code> - 3-257 bytes</li>
+<li class=""><code>partition_id</code> - 4 bytes</li>
+<li class=""><code>strategy</code> - 9 bytes</li>
+<li class=""><code>count</code> - 4 bytes</li>
+<li class=""><code>auto_commit</code> - 1 byte</li>
+</ul>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="send-messages">Send messages<a href="#send-messages" class="hash-link" aria-label="Direct link to Send messages" title="Direct link to Send messages" translate="no"></a></h3>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<p><strong>Code: 101</strong></p>
+<p><strong>Serialization</strong></p>
+<ul>
+<li class=""><code>stream_id</code> - 3-257 bytes</li>
+<li class=""><code>topic_id</code> - 3-257 bytes</li>
+<li class=""><code>partitioning</code> - 3-257 bytes</li>
+<li class=""><code>messages</code> - 16 + 4 + N bytes per single message</li>
+</ul>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="consumer-offsets">Consumer offsets<a href="#consumer-offsets" class="hash-link" aria-label="Direct link to Consumer offsets" title="Direct link to Consumer offsets" translate="no"></a></h2>
+<hr>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="get-consumer-offset">Get consumer offset<a href="#get-consumer-offset" class="hash-link" aria-label="Direct link to Get consumer offset" title="Direct link to Get consumer offset" translate="no"></a></h3>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<p><strong>Code: 120</strong></p>
+<p><strong>Serialization</strong></p>
+<ul>
+<li class=""><code>consumer</code> - 5 bytes</li>
+<li class=""><code>stream_id</code> - 3-257 bytes</li>
+<li class=""><code>topic_id</code> - 3-257 bytes</li>
+<li class=""><code>partition_id</code> - 4 bytes</li>
+</ul>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="store-consumer-offset">Store consumer offset<a href="#store-consumer-offset" class="hash-link" aria-label="Direct link to Store consumer offset" title="Direct link to Store consumer offset" translate="no"></a></h3>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<p><strong>Code: 121</strong></p>
+<p><strong>Serialization</strong></p>
+<ul>
+<li class=""><code>consumer</code> - 5 bytes</li>
+<li class=""><code>stream_id</code> - 3-257 bytes</li>
+<li class=""><code>topic_id</code> - 3-257 bytes</li>
+<li class=""><code>partition_id</code> - 4 bytes</li>
+<li class=""><code>offset</code> - 8 bytes</li>
+</ul>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="consumer-groups">Consumer groups<a href="#consumer-groups" class="hash-link" aria-label="Direct link to Consumer groups" title="Direct link to Consumer groups" translate="no"></a></h2>
+<hr>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="get-consumer-group">Get consumer group<a href="#get-consumer-group" class="hash-link" aria-label="Direct link to Get consumer group" title="Direct link to Get consumer group" translate="no"></a></h3>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<p><strong>Code: 600</strong></p>
+<p><strong>Serialization</strong></p>
+<ul>
+<li class=""><code>stream_id</code> - 3-257 bytes</li>
+<li class=""><code>topic_id</code> - 3-257 bytes</li>
+<li class=""><code>consumer_group_id</code> - 4 bytes</li>
+</ul>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="get-consumer-groups">Get consumer groups<a href="#get-consumer-groups" class="hash-link" aria-label="Direct link to Get consumer groups" title="Direct link to Get consumer groups" translate="no"></a></h3>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<p><strong>Code: 601</strong></p>
+<p><strong>Serialization</strong></p>
+<ul>
+<li class=""><code>stream_id</code> - 3-257 bytes</li>
+<li class=""><code>topic_id</code> - 3-257 bytes</li>
+</ul>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="create-consumer-group">Create consumer group<a href="#create-consumer-group" class="hash-link" aria-label="Direct link to Create consumer group" title="Direct link to Create consumer group" translate="no"></a></h3>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<p><strong>Code: 602</strong></p>
+<p><strong>Serialization</strong></p>
+<ul>
+<li class=""><code>stream_id</code> - 3-257 bytes</li>
+<li class=""><code>topic_id</code> - 3-257 bytes</li>
+<li class=""><code>consumer_group_id</code> - 4 bytes</li>
+</ul>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="delete-consumer-group">Delete consumer group<a href="#delete-consumer-group" class="hash-link" aria-label="Direct link to Delete consumer group" title="Direct link to Delete consumer group" translate="no"></a></h3>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<p><strong>Code: 603</strong></p>
+<p><strong>Serialization</strong></p>
+<ul>
+<li class=""><code>stream_id</code> - 3-257 bytes</li>
+<li class=""><code>topic_id</code> - 3-257 bytes</li>
+<li class=""><code>consumer_group_id</code> - 4 bytes</li>
+</ul>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="join-consumer-group">Join consumer group<a href="#join-consumer-group" class="hash-link" aria-label="Direct link to Join consumer group" title="Direct link to Join consumer group" translate="no"></a></h3>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<p><strong>Code: 604</strong></p>
+<p><strong>Serialization</strong></p>
+<ul>
+<li class=""><code>stream_id</code> - 3-257 bytes</li>
+<li class=""><code>topic_id</code> - 3-257 bytes</li>
+<li class=""><code>consumer_group_id</code> - 4 bytes</li>
+</ul>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="leave-consumer-group">Leave consumer group<a href="#leave-consumer-group" class="hash-link" aria-label="Direct link to Leave consumer group" title="Direct link to Leave consumer group" translate="no"></a></h3>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<p><strong>Code: 605</strong></p>
+<p><strong>Serialization</strong></p>
+<ul>
+<li class=""><code>stream_id</code> - 3-257 bytes</li>
+<li class=""><code>topic_id</code> - 3-257 bytes</li>
+<li class=""><code>consumer_group_id</code> - 4 bytes</li>
+</ul>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="system">System<a href="#system" class="hash-link" aria-label="Direct link to System" title="Direct link to System" translate="no"></a></h2>
+<hr>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="get-me">Get me<a href="#get-me" class="hash-link" aria-label="Direct link to Get me" title="Direct link to Get me" translate="no"></a></h3>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<p><strong>Code: 20</strong></p>
+<p><strong>Serialization</strong></p>
+<ul>
+<li class="">Empty bytes</li>
+</ul>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="get-client">Get client<a href="#get-client" class="hash-link" aria-label="Direct link to Get client" title="Direct link to Get client" translate="no"></a></h3>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<p><strong>Code: 21</strong></p>
+<p><strong>Serialization</strong></p>
+<ul>
+<li class=""><code>client_id</code> - 4 bytes</li>
+</ul>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="get-clients">Get clients<a href="#get-clients" class="hash-link" aria-label="Direct link to Get clients" title="Direct link to Get clients" translate="no"></a></h3>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<p><strong>Code: 22</strong></p>
+<p><strong>Serialization</strong></p>
+<ul>
+<li class="">Empty bytes</li>
+</ul>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="get-stats">Get stats<a href="#get-stats" class="hash-link" aria-label="Direct link to Get stats" title="Direct link to Get stats" translate="no"></a></h3>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyw [...]
+<p><strong>Code: 10</strong></p>
+<p><strong>Serialization</strong></p>
+<ul>
+<li class="">Empty bytes</li>
+</ul></div></article><nav class="docusaurus-mt-lg pagination-nav" aria-label="Docs pages"><a class="pagination-nav__link pagination-nav__link--prev" href="/docs/server/docker"><div class="pagination-nav__sublabel">Previous</div><div class="pagination-nav__label">Docker</div></a><a class="pagination-nav__link pagination-nav__link--next" href="/docs/server/benchmarking"><div class="pagination-nav__sublabel">Next</div><div class="pagination-nav__label">Benchmarking</div></a></nav></div></di [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/web-ui/iggy-web-ui/index.html b/docs/web-ui/iggy-web-ui/index.html
new file mode 100644
index 00000000..1a7792d0
--- /dev/null
+++ b/docs/web-ui/iggy-web-ui/index.html
@@ -0,0 +1,31 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-web_ui/web-ui-iggy-web-ui" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">Iggy Web UI | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" proper [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed">
+
+
+
+
+
+<link rel="preconnect" href="https://analytics.apache.org/">
+<script>var _paq=window._paq=window._paq||[];_paq.push(["setRequestMethod","POST"]),_paq.push(["trackPageView"]),_paq.push(["enableLinkTracking"]),_paq.push(["enableHeartBeatTimer"]),function(){var e="https://analytics.apache.org/";_paq.push(["setRequestMethod","POST"]),_paq.push(["setTrackerUrl",e+"matomo.php"]),_paq.push(["setSiteId","80"]);var a=document,t=a.createElement("script"),p=a.getElementsByTagName("script")[0];t.type="text/javascript",t.async=!0,t.src=e+"matomo.js",p.parentNo [...]
+<script src="/assets/js/runtime~main.0a940c88.js" defer="defer"></script>
+<script src="/assets/js/main.4a006c5e.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/img/apache-iggy0.5x.png"><link rel="preload" as="image" [...]
+<p><img decoding="async" loading="lazy" alt="Web UI" src="/assets/images/iggy_web_ui-40085aee2ec268a2dbb1e8c946009e38.png" width="2048" height="1198" class="img_ev3q"></p>
+<p>Here's the full example of the <code>docker-compose.yml</code> file that starts the Iggy server, initializes it with the <code>my-stream</code> stream and <code>my-topic</code> topic with the help of <a class="" href="/docs/cli/iggy-cli">Iggy CLI</a>, and eventually starts the Iggy Web UI:</p>
+<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">iggy</span><span class="token punctuation" style="color:#393A34" [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/downloads/index.html b/downloads/index.html
new file mode 100644
index 00000000..a61b1bfb
--- /dev/null
+++ b/downloads/index.html
@@ -0,0 +1,57 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="downloads-page mdx-page plugin-pages plugin-id-default" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">Downloads | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" property [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed">
+
+
+
+
+
+<link rel="preconnect" href="https://analytics.apache.org/">
+<script>var _paq=window._paq=window._paq||[];_paq.push(["setRequestMethod","POST"]),_paq.push(["trackPageView"]),_paq.push(["enableLinkTracking"]),_paq.push(["enableHeartBeatTimer"]),function(){var e="https://analytics.apache.org/";_paq.push(["setRequestMethod","POST"]),_paq.push(["setTrackerUrl",e+"matomo.php"]),_paq.push(["setSiteId","80"]);var a=document,t=a.createElement("script"),p=a.getElementsByTagName("script")[0];t.type="text/javascript",t.async=!0,t.src=e+"matomo.js",p.parentNo [...]
+<script src="/assets/js/runtime~main.0a940c88.js" defer="defer"></script>
+<script src="/assets/js/main.4a006c5e.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/img/apache-iggy0.5x.png"><link rel="preload" as="image" [...]
+<p>The Apache Iggy project publishes source‑code releases as compressed archives (<code>.tar.gz</code>). Binary convenience builds may appear in the future, but <strong>the only official artifacts today are the source packages signed by Iggy committers and mirrored by the Apache Software Foundation.</strong></p>
+<hr>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="releases">Releases<a href="#releases" class="hash-link" aria-label="Direct link to Releases" title="Direct link to Releases" translate="no"></a></h2>
+<table><thead><tr><th>Version</th><th>Date (UTC)</th><th>Source archive</th><th>Signatures & checksums</th><th>Changelog</th></tr></thead><tbody><tr><td><strong>0.6.0-incubating</strong> <em>(latest)</em></td><td>2025-12-09</td><td><a href="https://downloads.apache.org/incubator/iggy/0.6.0/iggy-0.6.0-incubating-src.tar.gz" target="_blank" rel="noopener noreferrer" class=""><code>iggy-0.6.0-incubating-src.tar.gz</code></a></td><td><a href="https://downloads.apache.org/incubator/iggy/0 [...]
+<p>Older incubating releases will appear in the same <a href="https://downloads.apache.org/incubator/iggy/" target="_blank" rel="noopener noreferrer" class="">downloads directory</a> after they are approved by the Apache Incubator PMC. Permanent archives are kept at <a href="https://archive.apache.org/" target="_blank" rel="noopener noreferrer" class="">archive.apache.org</a>; none exist yet because there are no older releases.</p>
+<hr>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="notes">Notes<a href="#notes" class="hash-link" aria-label="Direct link to Notes" title="Direct link to Notes" translate="no"></a></h2>
+<ul>
+<li class=""><strong>Verify before use.</strong> Always check the OpenPGP <strong>signature</strong> (<code>.asc</code>) or, if that is not possible, at least the <strong>SHA‑512 checksum</strong>.</li>
+<li class="">The <a href="https://downloads.apache.org/incubator/iggy/KEYS" target="_blank" rel="noopener noreferrer" class=""><code>KEYS</code></a> file contains all public keys used to sign Iggy releases. Import it once; only new keys need to be added in future releases.</li>
+<li class="">Because Iggy is still in the Apache Incubator, releases are <strong>incubating releases</strong> and are not yet official ASF products. They are distributed under the Incubator’s rules and may evolve rapidly.</li>
+</ul>
+<hr>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="verify-the-signature">Verify the signature<a href="#verify-the-signature" class="hash-link" aria-label="Direct link to Verify the signature" title="Direct link to Verify the signature" translate="no"></a></h3>
+<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># Download artifact, matching .asc file and KEYS< [...]
+<p>A successful verification prints <strong>"Good signature from …"</strong> and the fingerprint of an Iggy committer’s key.</p>
+<hr>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="verify-the-checksum">Verify the checksum<a href="#verify-the-checksum" class="hash-link" aria-label="Direct link to Verify the checksum" title="Direct link to Verify the checksum" translate="no"></a></h3>
+<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">curl</span><span class="token plain"> </span><span class="token pa [...]
+<p>The command should output:</p>
+<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">iggy-0.6.0-incubating-src.tar.gz: OK</span><br></span></code></pre></div></div>
+<hr>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="need-bleeding-edge-code">Need bleeding-edge code?<a href="#need-bleeding-edge-code" class="hash-link" aria-label="Direct link to Need bleeding-edge code?" title="Direct link to Need bleeding-edge code?" translate="no"></a></h2>
+<p>The latest development code is available from the <code>master</code> branch on GitHub:</p>
+<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">git</span><span class="token plain"> clone https://github.com/apac [...]
+<p>Be aware that trunk builds <strong>may be unstable and are not ASF‑endorsed releases</strong>.</p>
+<hr>
+<p>© 2025 The Apache Software Foundation.
+Apache, Apache Iggy, the Apache feather logo, and related marks are trademarks of the ASF.</p></article></div><div class="col col--2"><div class="tableOfContents_bqdL thin-scrollbar"><ul class="table-of-contents table-of-contents__left-border"><li><a href="#releases" class="table-of-contents__link toc-highlight">Releases</a></li><li><a href="#notes" class="table-of-contents__link toc-highlight">Notes</a><ul><li><a href="#verify-the-signature" class="table-of-contents__link toc-highlight" [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/fonts/Inter-Medium.ttf b/fonts/Inter-Medium.ttf
new file mode 100644
index 00000000..06ae9e9c
Binary files /dev/null and b/fonts/Inter-Medium.ttf differ
diff --git a/fonts/Inter-Regular.ttf b/fonts/Inter-Regular.ttf
new file mode 100644
index 00000000..cc73944a
Binary files /dev/null and b/fonts/Inter-Regular.ttf differ
diff --git a/fonts/Inter-SemiBold.ttf b/fonts/Inter-SemiBold.ttf
new file mode 100644
index 00000000..278ceaa3
Binary files /dev/null and b/fonts/Inter-SemiBold.ttf differ
diff --git a/img/AdvancedFeatures.svg b/img/AdvancedFeatures.svg
new file mode 100644
index 00000000..b4d8a22e
--- /dev/null
+++ b/img/AdvancedFeatures.svg
@@ -0,0 +1,30 @@
+<svg width="30" height="30" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+ <g clip-path="url(#clip0_1018_3046)">
+ <path
+ d="M17.8002 19.817L15.6282 20.955C15.5638 20.9885 15.4913 21.0035 15.4188 20.9982C15.3463 20.9929 15.2767 20.9676 15.2178 20.9251C15.1589 20.8826 15.113 20.8245 15.0851 20.7574C15.0573 20.6903 15.0487 20.6167 15.0602 20.545L15.4752 18.134L13.7182 16.427C13.6658 16.3763 13.6287 16.3119 13.6111 16.2411C13.5935 16.1703 13.5962 16.096 13.6188 16.0266C13.6414 15.9573 13.6831 15.8957 13.7391 15.8489C13.795 15.8021 13.863 15.772 13.9352 15.762L16.3632 15.41L17.4492 13.217C17.4817 13.1517 17. [...]
+ stroke="#FF41EC"
+ stroke-width="2"
+ stroke-linecap="round"
+ stroke-linejoin="round"
+ />
+ <path
+ d="M6.20063 19.817L4.02863 20.955C3.96417 20.9885 3.89166 21.0035 3.81919 20.9982C3.74672 20.9929 3.67714 20.9676 3.61822 20.9251C3.5593 20.8826 3.51336 20.8245 3.48554 20.7574C3.45771 20.6903 3.44908 20.6167 3.46063 20.545L3.87563 18.134L2.11863 16.427C2.06619 16.3763 2.02905 16.3119 2.01147 16.2411C1.99389 16.1703 1.99656 16.096 2.01919 16.0266C2.04182 15.9573 2.08349 15.8957 2.13944 15.8489C2.19539 15.8021 2.26338 15.772 2.33563 15.762L4.76363 15.41L5.84963 13.217C5.88211 13.1517 5 [...]
+ stroke="#FF41EC"
+ stroke-width="2"
+ stroke-linecap="round"
+ stroke-linejoin="round"
+ />
+ <path
+ d="M11.9995 9.81698L9.82746 10.955C9.763 10.9885 9.69049 11.0035 9.61802 10.9982C9.54554 10.9929 9.47597 10.9676 9.41705 10.9251C9.35813 10.8826 9.31219 10.8245 9.28436 10.7574C9.25654 10.6903 9.24791 10.6167 9.25946 10.545L9.67446 8.13398L7.91746 6.42698C7.86501 6.37628 7.82788 6.31186 7.8103 6.24107C7.79272 6.17027 7.79539 6.09597 7.81802 6.02662C7.84065 5.95728 7.88232 5.89569 7.93827 5.8489C7.99422 5.8021 8.0622 5.77198 8.13446 5.76198L10.5625 5.40998L11.6485 3.21698C11.6809 3.151 [...]
+ stroke="#FF41EC"
+ stroke-width="2"
+ stroke-linecap="round"
+ stroke-linejoin="round"
+ />
+ </g>
+ <defs>
+ <clipPath id="clip0_1018_3046">
+ <rect width="24" height="24" fill="white" />
+ </clipPath>
+ </defs>
+</svg>
diff --git a/img/Avatar-Placeholder.svg b/img/Avatar-Placeholder.svg
new file mode 100644
index 00000000..9a71aadd
--- /dev/null
+++ b/img/Avatar-Placeholder.svg
@@ -0,0 +1,9 @@
+<svg width="320" height="320" viewBox="0 0 320 320" fill="none" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+<rect width="320" height="320" fill="url(#pattern0)"/>
+<defs>
+<pattern id="pattern0" patternContentUnits="objectBoundingBox" width="1" height="1">
+<use xlink:href="#image0_2258_22954" transform="scale(0.00225225)"/>
+</pattern>
+<image id="image0_2258_22954" width="444" height="444" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAbwAAAG8CAYAAAClsBDfAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAABJ/SURBVHgB7d17b1TXucDhlUAIjuwDAYFikoJElEQ6qXQqnX7/T5BKjZRUDVGQzDWyi7nYYkgAUb+MdwwEsD37Mnuv93kkaxzaqH8w3b9Z1/ng0ezFiwIAlfuwAEACggdACoIHQAqCB0AKggdACoIHQAqCB0AKggdACoIHQAqCB0AKggdACoIHQAqCB0AKggdACoIHQAqCB0AKggdACoIHQAqCB0AKggdACoIHQAqCB0AKggdACoIHQAqCB0AKggdACoIHQAqCB0AKggdACoIHQAqCB0AKggd [...]
+</defs>
+</svg>
diff --git a/img/ExtremelyEfficient.svg b/img/ExtremelyEfficient.svg
new file mode 100644
index 00000000..7a045659
--- /dev/null
+++ b/img/ExtremelyEfficient.svg
@@ -0,0 +1,9 @@
+<svg width="30" height="31" viewBox="0 0 24 25" fill="none" xmlns="http://www.w3.org/2000/svg">
+ <path
+ d="M16 18.5C16.5304 18.5 17.0391 18.7107 17.4142 19.0858C17.7893 19.4609 18 19.9696 18 20.5C18 19.9696 18.2107 19.4609 18.5858 19.0858C18.9609 18.7107 19.4696 18.5 20 18.5C19.4696 18.5 18.9609 18.2893 18.5858 17.9142C18.2107 17.5391 18 17.0304 18 16.5C18 17.0304 17.7893 17.5391 17.4142 17.9142C17.0391 18.2893 16.5304 18.5 16 18.5ZM16 6.5C16.5304 6.5 17.0391 6.71071 17.4142 7.08579C17.7893 7.46086 18 7.96957 18 8.5C18 7.96957 18.2107 7.46086 18.5858 7.08579C18.9609 6.71071 19.4696 6.5 2 [...]
+ stroke="#FF4341"
+ stroke-width="2"
+ stroke-linecap="round"
+ stroke-linejoin="round"
+ />
+</svg>
diff --git a/img/FullyOpenSourced.svg b/img/FullyOpenSourced.svg
new file mode 100644
index 00000000..fe8af7f4
--- /dev/null
+++ b/img/FullyOpenSourced.svg
@@ -0,0 +1,16 @@
+<svg width="30" height="30" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+ <g clip-path="url(#clip0_1018_3074)">
+ <path
+ d="M9 19C4.7 20.4 4.7 16.5 3 16M15 21V17.5C15 16.5 15.1 16.1 14.5 15.5C17.3 15.2 20 14.1 20 9.49995C19.9988 8.30492 19.5325 7.15726 18.7 6.29995C19.0905 5.26192 19.0545 4.11158 18.6 3.09995C18.6 3.09995 17.5 2.79995 15.1 4.39995C13.0672 3.87054 10.9328 3.87054 8.9 4.39995C6.5 2.79995 5.4 3.09995 5.4 3.09995C4.94548 4.11158 4.90953 5.26192 5.3 6.29995C4.46745 7.15726 4.00122 8.30492 4 9.49995C4 14.1 6.7 15.2 9.5 15.5C8.9 16.1 8.9 16.7 9 17.5V21"
+ stroke="#FF4341"
+ stroke-width="2"
+ stroke-linecap="round"
+ stroke-linejoin="round"
+ />
+ </g>
+ <defs>
+ <clipPath id="clip0_1018_3074">
+ <rect width="24" height="24" fill="white" />
+ </clipPath>
+ </defs>
+</svg>
diff --git a/img/Image-Placeholder-1.svg b/img/Image-Placeholder-1.svg
new file mode 100644
index 00000000..0f37ffcd
--- /dev/null
+++ b/img/Image-Placeholder-1.svg
@@ -0,0 +1,4 @@
+<svg width="800" height="600" viewBox="0 0 800 600" fill="none" xmlns="http://www.w3.org/2000/svg">
+<rect width="800" height="600" fill="#F2F7FF"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M421.524 283.579H416.421V278.476C416.421 277.112 415.309 276 413.945 276H413.869C412.48 276 411.368 277.112 411.368 278.476V283.579H406.291C404.926 283.579 403.815 284.691 403.789 286.055V286.131C403.789 287.52 404.901 288.632 406.291 288.632H411.368V293.709C411.368 295.074 412.48 296.211 413.869 296.185H413.945C415.309 296.185 416.421 295.074 416.421 293.709V288.632H421.524C422.888 288.632 424 287.52 424 286.156V286.055C424 284.691 422.88 [...]
+</svg>
diff --git a/img/Image-Placeholder-2.svg b/img/Image-Placeholder-2.svg
new file mode 100644
index 00000000..3f2b8c1d
... 1477 lines suppressed ...