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 2025/02/10 06:43:03 UTC

(iggy-website) 01/01: deploy: edf73c68d45c4a2b6090b292087a4e8e2b7e3783

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 254cfd69f226594dda876ada71bf4935d47905fe
Author: kparisa <kp...@users.noreply.github.com>
AuthorDate: Mon Feb 10 06:42:52 2025 +0000

    deploy: edf73c68d45c4a2b6090b292087a4e8e2b7e3783
---
 .asf.yaml                                          |  21 +
 .nojekyll                                          |   0
 404.html                                           |  18 +
 apache-incubator/iggy_logo.png                     | Bin 0 -> 105328 bytes
 assets/css/styles.db211002.css                     |   1 +
 ..._trending-bbecb9e6ddc18e345fbdb7c8bae838d9.jpeg | Bin 0 -> 390292 bytes
 ...iggy_0_1_0-c635523620b5dc0af17545d1c3ce3edd.jpg | Bin 0 -> 82650 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-3f67adf8dfda89c5280aa2e90842b5ff.png | Bin 0 -> 3023980 bytes
 ..._ci_0_1_0-b31e9445de207c06bd2eee74dafac357.jpeg | Bin 0 -> 538032 bytes
 ...ggy_ci_cd-a03f984dde69dbbc209f61481d7d1c91.jpeg | Bin 0 -> 78169 bytes
 .../iggy_cli-63113b8950820b09e7f9b50fe664093f.png  | Bin 0 -> 446479 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
 ...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
 ...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
 assets/js/0058b4c6.28e82736.js                     |   1 +
 assets/js/0169d23c.0aa57185.js                     |   1 +
 assets/js/01a85c17.e58a14d4.js                     |   1 +
 assets/js/05a04b69.4f4dda6d.js                     |   1 +
 assets/js/0755831e.0f6e8acc.js                     |   1 +
 assets/js/097d5e07.b1a2906f.js                     |   1 +
 assets/js/0aee7f2c.ac0a3bdb.js                     |   1 +
 assets/js/0d6079f6.22c49f60.js                     |   1 +
 assets/js/12deeac4.85cd72fa.js                     |   1 +
 assets/js/144.28b31aea.js                          |   1 +
 assets/js/17896441.e977e951.js                     |   1 +
 assets/js/17e33b4e.add68643.js                     |   1 +
 assets/js/19432d33.3f53ea4d.js                     |   1 +
 assets/js/1b6ff2c5.4ace8d62.js                     |   1 +
 assets/js/1ccbcc53.6c5a9c0b.js                     |   1 +
 assets/js/1df93b7f.c213798e.js                     |   1 +
 assets/js/1f391b9e.691973e8.js                     |   1 +
 assets/js/218f3d72.d3b47fbb.js                     |   1 +
 assets/js/25cfbc78.63c117ec.js                     |   1 +
 assets/js/296d7672.77e2810c.js                     |   1 +
 assets/js/2edd2ec4.031f3bf0.js                     |   1 +
 assets/js/2f80e784.6ba7b6f9.js                     |   1 +
 assets/js/3042.3f1c7327.js                         |   1 +
 assets/js/3049ae2a.9a2249cf.js                     |   1 +
 assets/js/332362b2.cdd7b1d9.js                     |   1 +
 assets/js/363979b1.33988d75.js                     |   1 +
 assets/js/36994c47.a62ea346.js                     |   1 +
 assets/js/393be207.8efd7034.js                     |   1 +
 assets/js/3defdf4b.bf771193.js                     |   1 +
 assets/js/41e60a44.1bbb0d27.js                     |   1 +
 assets/js/46167e1b.736707f3.js                     |   1 +
 assets/js/4726e312.a15f3436.js                     |   1 +
 assets/js/544367a9.8636f3f4.js                     |   1 +
 assets/js/5a05130f.71d5a345.js                     |   1 +
 assets/js/5e95c892.04e1f2fd.js                     |   1 +
 assets/js/62290500.023f56e0.js                     |   1 +
 assets/js/64ee4266.21b531a2.js                     |   1 +
 assets/js/65d17065.9a3a3a9f.js                     |   1 +
 assets/js/666c9b96.510c7926.js                     |   1 +
 assets/js/6875c492.8859c660.js                     |   1 +
 assets/js/6a23e949.a1f58d72.js                     |   1 +
 assets/js/6ea6d42b.24ff764b.js                     |   1 +
 assets/js/71369862.d9140114.js                     |   1 +
 assets/js/76680d72.08874437.js                     |   1 +
 assets/js/782bd44c.a82b3fbd.js                     |   1 +
 assets/js/7d3d0ee4.ca75fd8f.js                     |   1 +
 assets/js/7e31e0a8.6a486898.js                     |   1 +
 assets/js/7eb7d8a5.35fc5cc6.js                     |   1 +
 assets/js/814f3328.37c13981.js                     |   1 +
 assets/js/8a6c01a6.85bf8a3b.js                     |   1 +
 assets/js/8b22b5f5.be549698.js                     |   1 +
 assets/js/8b8cddd6.06caa7b2.js                     |   1 +
 assets/js/8c2332e9.25938787.js                     |   1 +
 assets/js/907ba26f.2f311a11.js                     |   1 +
 assets/js/92abec30.8e8717b2.js                     |   1 +
 assets/js/9392.cb8189ce.js                         |   1 +
 assets/js/9590c6d3.1df5f6eb.js                     |   1 +
 assets/js/98883e6e.d336253a.js                     |   1 +
 assets/js/9ca9f017.9a1d556b.js                     |   1 +
 assets/js/9e4087bc.f3461460.js                     |   1 +
 assets/js/a2ea038e.a071e3a8.js                     |   1 +
 assets/js/a4d21046.9d474182.js                     |   1 +
 assets/js/a6aa9e1f.acf07fb4.js                     |   1 +
 assets/js/a7456010.a8a22b85.js                     |   1 +
 assets/js/a7bd4aaa.5082748c.js                     |   1 +
 assets/js/a7c1df9a.c0fe9b64.js                     |   1 +
 assets/js/a902938a.31fa8d6e.js                     |   1 +
 assets/js/a94703ab.e9ffcf54.js                     |   1 +
 assets/js/aba21aa0.c17b1acf.js                     |   1 +
 assets/js/acecf23e.ed39bb7e.js                     |   1 +
 assets/js/b041cdfc.5c63557c.js                     |   1 +
 assets/js/b1fb958a.2370b490.js                     |   1 +
 assets/js/b8b35ff1.7c7ba905.js                     |   1 +
 assets/js/c065b223.703e6b26.js                     |   1 +
 assets/js/c23ee533.34274de9.js                     |   1 +
 assets/js/c3a24e9c.3b029fae.js                     |   1 +
 assets/js/c5f172dd.a7ca6ff6.js                     |   1 +
 assets/js/c70ea44c.35598963.js                     |   1 +
 assets/js/c8d81af2.ae9cf841.js                     |   1 +
 assets/js/ca66c66a.cc0118d1.js                     |   1 +
 assets/js/cc16a589.7aa15748.js                     |   1 +
 assets/js/ccc49370.d03da207.js                     |   1 +
 assets/js/ce80ecba.ae60a561.js                     |   1 +
 assets/js/cfc3091e.2ce2d774.js                     |   1 +
 assets/js/d1796fc4.2439a4f4.js                     |   1 +
 assets/js/d47c8727.9c7f885c.js                     |   1 +
 assets/js/d6bb211a.cb8dda6e.js                     |   1 +
 assets/js/da420000.5101deac.js                     |   1 +
 assets/js/e05ad208.7a270d29.js                     |   1 +
 assets/js/e7c222e2.ab35a9f0.js                     |   1 +
 assets/js/f5480997.3a933f2b.js                     |   1 +
 assets/js/ff030c8a.e940df38.js                     |   1 +
 assets/js/ff06d166.504db088.js                     |   1 +
 assets/js/main.f5453fd5.js                         |   2 +
 assets/js/main.f5453fd5.js.LICENSE.txt             |  74 +++
 assets/js/runtime~main.b0a22bcd.js                 |   1 +
 .../building-message-streaming-in-rust/index.html  | 105 ++++
 .../index.html                                     |  95 ++++
 .../technology-radar-and-currrent-goals/index.html |  57 ++
 blogs/2025/02/10/apache-incubator/index.html       |  31 +
 blogs/2025/02/12/transparent-benchmarks/index.html |  36 ++
 blogs/archive/index.html                           |  18 +
 blogs/atom.xml                                     | 628 +++++++++++++++++++++
 blogs/consumer-identifier/index.html               |  31 +
 blogs/iggy-0-1-0-release/index.html                |  33 ++
 blogs/index.html                                   | 252 +++++++++
 blogs/message-expiry/index.html                    |  43 ++
 blogs/message-headers/index.html                   |  62 ++
 blogs/message-state/index.html                     |  42 ++
 blogs/page/2/index.html                            |  18 +
 blogs/personal-access-tokens/index.html            |  34 ++
 blogs/rss.xml                                      | 574 +++++++++++++++++++
 blogs/tags/breaking-changes/index.html             |  18 +
 blogs/tags/consumers/index.html                    |  18 +
 blogs/tags/hello/index.html                        |  18 +
 blogs/tags/identifier/index.html                   |  18 +
 blogs/tags/index.html                              |  18 +
 blogs/tags/message-checksum/index.html             |  18 +
 blogs/tags/message-expiry/index.html               |  18 +
 blogs/tags/message-headers/index.html              |  18 +
 blogs/tags/message-state/index.html                |  18 +
 blogs/tags/new-features/index.html                 |  18 +
 blogs/tags/pat/index.html                          |  18 +
 blogs/tags/permissions/index.html                  |  18 +
 blogs/tags/personal-access-tokens/index.html       |  18 +
 blogs/tags/release/index.html                      |  18 +
 blogs/tags/schema/index.html                       |  18 +
 blogs/tags/update/index.html                       |  18 +
 blogs/tags/users/index.html                        |  18 +
 blogs/updated-schemas/index.html                   |  33 ++
 blogs/users-and-permissions/index.html             |  59 ++
 blogs/welcome-to-the-changelog/index.html          |  20 +
 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/cli/iggy-cli/index.html                       |  39 ++
 docs/index.html                                    |  19 +
 docs/introduction/about/index.html                 |  71 +++
 docs/introduction/architecture/index.html          |  44 ++
 docs/introduction/getting-started/index.html       | 110 ++++
 docs/introduction/high-level-sdk/index.html        |  58 ++
 docs/sdk/csharp/examples/index.html                |  18 +
 docs/sdk/csharp/intro/index.html                   |  18 +
 docs/sdk/go/examples/index.html                    |  18 +
 docs/sdk/go/intro/index.html                       |  18 +
 docs/sdk/java/examples/index.html                  |  18 +
 docs/sdk/java/intro/index.html                     |  19 +
 docs/sdk/node/examples/index.html                  |  18 +
 docs/sdk/node/intro/index.html                     |  18 +
 docs/sdk/python/examples/index.html                |  18 +
 docs/sdk/python/intro/index.html                   |  18 +
 docs/sdk/rust/examples/index.html                  |  25 +
 docs/sdk/rust/intro/index.html                     |  19 +
 docs/server/benchmarking/index.html                |  41 ++
 docs/server/configuration/index.html               |  34 ++
 docs/server/docker/index.html                      |  20 +
 docs/server/introduction/index.html                |  25 +
 docs/server/schema/index.html                      | 314 +++++++++++
 docs/web-ui/iggy-web-ui/index.html                 |  21 +
 img/AdvancedFeatures.svg                           |  30 +
 img/ExtremelyEfficient.svg                         |   9 +
 img/FullyOpenSourced.svg                           |  16 +
 img/ManagementInterface.svg                        |  30 +
 img/MultipleTransports.svg                         |  72 +++
 img/Sdk.svg                                        |  44 ++
 img/apache-iggy-light-bg0.5x.png                   | Bin 0 -> 97156 bytes
 img/apache-iggy0.5x.png                            | Bin 0 -> 96018 bytes
 img/docusaurus-social-card.jpg                     | Bin 0 -> 55746 bytes
 img/docusaurus.png                                 | Bin 0 -> 5142 bytes
 img/favicon.ico                                    | Bin 0 -> 15406 bytes
 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 -> 446479 bytes
 img/iggy_cli_0_1_0.jpeg                            | Bin 0 -> 1049410 bytes
 img/iggy_server_0_1_0.jpeg                         | Bin 0 -> 1064181 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/undraw_docusaurus_mountain.svg                 | 171 ++++++
 img/undraw_docusaurus_react.svg                    | 170 ++++++
 img/undraw_docusaurus_tree.svg                     |  40 ++
 index.html                                         |  18 +
 markdown-page/index.html                           |  19 +
 .../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 -> 3023980 bytes
 241 files changed, 4329 insertions(+)

diff --git a/.asf.yaml b/.asf.yaml
new file mode 100644
index 000000000..0aeb7d296
--- /dev/null
+++ b/.asf.yaml
@@ -0,0 +1,21 @@
+github:
+  description: "Apache Iggy (Incubating) Website"
+  homepage: https://iggy.apache.org/
+  labels:
+    - rust
+    - message-streaming
+    - iggy
+    - apache
+  enabled_merge_buttons:
+    squash:  true
+    merge:   false
+    rebase:  false
+
+publish:
+  whoami: asf-site
+
+notifications:
+  commits: commits@iggy.apache.org
+  issues: dev@iggy.apache.org
+  pullrequests: dev@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 000000000..e69de29bb
diff --git a/404.html b/404.html
new file mode 100644
index 000000000..ba1f09b7a
--- /dev/null
+++ b/404.html
@@ -0,0 +1,18 @@
+<!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.7.0">
+<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="stylesheet" href="/assets/css/styles.db211002.css">
+<script src="/assets/js/runtime~main.b0a22bcd.js" defer="defer"></script>
+<script src="/assets/js/main.f5453fd5.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const n=new URLSearchParams(window.location.search).entries();for(var[t,e]of n)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentEle [...]
+<div>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div>
+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 000000000..33c3e2c28
Binary files /dev/null and b/apache-incubator/iggy_logo.png differ
diff --git a/assets/css/styles.db211002.css b/assets/css/styles.db211002.css
new file mode 100644
index 000000000..7d5df8924
--- /dev/null
+++ b/assets/css/styles.db211002.css
@@ -0,0 +1 @@
+.col,.container{padding:0 var(--ifm-spacing-horizontal);width:100%}.markdown>h2,.markdown>h3,.markdown>h4,.markdown>h5,.markdown>h6{margin-bottom:calc(var(--ifm-heading-vertical-rhythm-bottom)*var(--ifm-leading))}.markdown li,body{word-wrap:break-word}body,ol ol,ol ul,ul ol,ul ul{margin:0}pre,table{overflow:auto}blockquote,pre{margin:0 0 var(--ifm-spacing-vertical)}.breadcrumbs__link,.button{transition-timing-function:var(--ifm-transition-timing-default)}.button,code{vertical-align:middl [...]
\ No newline at end of file
diff --git a/assets/images/gh_trending-bbecb9e6ddc18e345fbdb7c8bae838d9.jpeg b/assets/images/gh_trending-bbecb9e6ddc18e345fbdb7c8bae838d9.jpeg
new file mode 100644
index 000000000..117b7e77f
Binary files /dev/null and b/assets/images/gh_trending-bbecb9e6ddc18e345fbdb7c8bae838d9.jpeg 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 000000000..8b7383373
Binary files /dev/null and b/assets/images/iggy_0_1_0-c635523620b5dc0af17545d1c3ce3edd.jpg differ
diff --git a/assets/images/iggy_bench-9ea0ebbd13ad66abb94ec3d8d8697048.jpeg b/assets/images/iggy_bench-9ea0ebbd13ad66abb94ec3d8d8697048.jpeg
new file mode 100644
index 000000000..a3de266b7
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 000000000..0bc290f94
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 000000000..36aeca376
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 000000000..cfd278069
Binary files /dev/null and b/assets/images/iggy_bench_cli-32946d97899e6925f99469dad967ca7e.png differ
diff --git a/assets/images/iggy_bench_dashboard-3f67adf8dfda89c5280aa2e90842b5ff.png b/assets/images/iggy_bench_dashboard-3f67adf8dfda89c5280aa2e90842b5ff.png
new file mode 100644
index 000000000..64cf3bb02
Binary files /dev/null and b/assets/images/iggy_bench_dashboard-3f67adf8dfda89c5280aa2e90842b5ff.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 000000000..2a597fb35
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 000000000..0f7caf01a
Binary files /dev/null and b/assets/images/iggy_ci_cd-a03f984dde69dbbc209f61481d7d1c91.jpeg differ
diff --git a/assets/images/iggy_cli-63113b8950820b09e7f9b50fe664093f.png b/assets/images/iggy_cli-63113b8950820b09e7f9b50fe664093f.png
new file mode 100644
index 000000000..50131be4c
Binary files /dev/null and b/assets/images/iggy_cli-63113b8950820b09e7f9b50fe664093f.png differ
diff --git a/assets/images/iggy_cli-c140d5ecfddf24acd537722137b70c47.png b/assets/images/iggy_cli-c140d5ecfddf24acd537722137b70c47.png
new file mode 100644
index 000000000..364882633
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 000000000..8520661a3
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 000000000..1853b130f
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 000000000..dc2462104
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 000000000..41e3a6070
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 000000000..33c3e2c28
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 000000000..1b91cdd38
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 000000000..ec60dffdd
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 000000000..67cb96a67
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 000000000..eaa7b7628
Binary files /dev/null and b/assets/images/iggy_server-b28372292592869008ceb03c1edfdc51.jpeg 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 000000000..2f6b74adb
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 000000000..4af17ca75
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 000000000..ed08158ae
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 000000000..a8ae7b19f
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 000000000..1615725e7
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 000000000..492ad4b82
Binary files /dev/null and b/assets/images/iggy_web-76023f316d53cc2e44ae6f7b83193529.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 000000000..168eeda49
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 000000000..168eeda49
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 000000000..cd593d6ff
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 000000000..352e9412c
Binary files /dev/null and b/assets/images/leader_elections-f973c06ac3c6b230945e496faa6f314e.jpeg differ
diff --git a/assets/js/0058b4c6.28e82736.js b/assets/js/0058b4c6.28e82736.js
new file mode 100644
index 000000000..11eb90ed1
--- /dev/null
+++ b/assets/js/0058b4c6.28e82736.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.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","label":"Welcome","href":"/docs/","docId":"iggy","unlisted":false},{"type":"category","label":"Introduction","collapsible":true,"collapsed":true,"items":[{"ty [...]
\ No newline at end of file
diff --git a/assets/js/0169d23c.0aa57185.js b/assets/js/0169d23c.0aa57185.js
new file mode 100644
index 000000000..216e5749b
--- /dev/null
+++ b/assets/js/0169d23c.0aa57185.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[9437],{2997:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>g,frontMatter:()=>l,metadata:()=>n,toc:()=>r});var n=o(1262),s=o(4848),a=o(8453);const l={title:"Welcome to the changelog",slug:"welcome-to-the-changelog",authors:[{name:"Piotr Gankiewicz",title:"Iggy.rs founder",url:"https://github.com/spetz",image_url:"https://github.com/spetz.png"}],tags:["hello"],hide_table_of_contents:! [...]
\ No newline at end of file
diff --git a/assets/js/01a85c17.e58a14d4.js b/assets/js/01a85c17.e58a14d4.js
new file mode 100644
index 000000000..4d4719786
--- /dev/null
+++ b/assets/js/01a85c17.e58a14d4.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[8209],{3750:(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(6849),i=a(9062),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(e){let{childr [...]
\ No newline at end of file
diff --git a/assets/js/05a04b69.4f4dda6d.js b/assets/js/05a04b69.4f4dda6d.js
new file mode 100644
index 000000000..8c9d9d6a7
--- /dev/null
+++ b/assets/js/05a04b69.4f4dda6d.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[172],{2979:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>h,contentTitle:()=>r,default:()=>g,frontMatter:()=>l,metadata:()=>n,toc:()=>i});var n=o(1262),a=o(4848),s=o(8453);const l={title:"Welcome to the changelog",slug:"welcome-to-the-changelog",authors:[{name:"Piotr Gankiewicz",title:"Iggy.rs founder",url:"https://github.com/spetz",image_url:"https://github.com/spetz.png"}],tags:["hello"],hide_table_of_contents:!1 [...]
\ No newline at end of file
diff --git a/assets/js/0755831e.0f6e8acc.js b/assets/js/0755831e.0f6e8acc.js
new file mode 100644
index 000000000..e14e876fd
--- /dev/null
+++ b/assets/js/0755831e.0f6e8acc.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.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.b1a2906f.js b/assets/js/097d5e07.b1a2906f.js
new file mode 100644
index 000000000..a58dc5961
--- /dev/null
+++ b/assets/js/097d5e07.b1a2906f.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[1318],{6214:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>l,frontMatter:()=>r,metadata:()=>n,toc:()=>d});var n=s(6047),i=s(4848),a=s(8453);const r={title:"Updated schemas",slug:"updated-schemas",authors:[{name:"Piotr Gankiewicz",title:"Iggy.rs founder",url:"https://github.com/spetz",image_url:"https://github.com/spetz.png"}],tags:["update","schema"],hide_table_of_contents:!1},o=voi [...]
\ No newline at end of file
diff --git a/assets/js/0aee7f2c.ac0a3bdb.js b/assets/js/0aee7f2c.ac0a3bdb.js
new file mode 100644
index 000000000..4fe2f50d9
--- /dev/null
+++ b/assets/js/0aee7f2c.ac0a3bdb.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[4314],{5057:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>p,contentTitle:()=>a,default:()=>c,frontMatter:()=>i,metadata:()=>n,toc:()=>d});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":false,"tags":[] [...]
\ No newline at end of file
diff --git a/assets/js/0d6079f6.22c49f60.js b/assets/js/0d6079f6.22c49f60.js
new file mode 100644
index 000000000..03366ccdf
--- /dev/null
+++ b/assets/js/0d6079f6.22c49f60.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[9345],{3806:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>h,contentTitle:()=>a,default:()=>l,frontMatter:()=>o,metadata:()=>s,toc:()=>c});var s=n(5787),r=n(4848),i=n(8453);const o={title:"Iggy and the Transparent Benchmarks",authors:[{name:"Piotr Gankiewicz",title:"Iggy.rs founder",url:"https://github.com/spetz",image_url:"https://github.com/spetz.png"}],tags:[],hide_table_of_contents:!1,date:new Date("2025-02-12T [...]
\ No newline at end of file
diff --git a/assets/js/12deeac4.85cd72fa.js b/assets/js/12deeac4.85cd72fa.js
new file mode 100644
index 000000000..3a46c0392
--- /dev/null
+++ b/assets/js/12deeac4.85cd72fa.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[5388],{9109:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>h,contentTitle:()=>o,default:()=>l,frontMatter:()=>r,metadata:()=>n,toc:()=>c});var n=s(331),a=s(4848),i=s(8453);const r={title:"Iggy 0.1.0 release",slug:"iggy-0-1-0-release",authors:[{name:"Piotr Gankiewicz",title:"Iggy.rs founder",url:"https://github.com/spetz",image_url:"https://github.com/spetz.png"}],tags:["release"],hide_table_of_contents:!1,date:new  [...]
\ No newline at end of file
diff --git a/assets/js/144.28b31aea.js b/assets/js/144.28b31aea.js
new file mode 100644
index 000000000..2042f40fe
--- /dev/null
+++ b/assets/js/144.28b31aea.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[144],{3750:(e,t,a)=>{a.d(t,{in:()=>c,OU:()=>M,Ki:()=>_,kJ:()=>p,x:()=>i,e7:()=>m,J_:()=>f,Gx:()=>C});var s=a(6540),n=a(6849),l=a(9062),r=a(4848);function i(){const e=(0,l.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(e){let{childre [...]
\ No newline at end of file
diff --git a/assets/js/17896441.e977e951.js b/assets/js/17896441.e977e951.js
new file mode 100644
index 000000000..9673b0ce7
--- /dev/null
+++ b/assets/js/17896441.e977e951.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[8401],{665:(e,t,n)=>{n.d(t,{A:()=>c});n(6540);var s=n(4164),a=n(7289),i=n(204),l=n(2362),o=n(4848);function r(e){let{className:t}=e;return(0,o.jsx)(l.A,{type:"caution",title:(0,o.jsx)(a.Rc,{}),className:(0,s.A)(t,i.G.common.unlistedBanner),children:(0,o.jsx)(a.Uh,{})})}function c(e){return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(a.AE,{}),(0,o.jsx)(r,{...e})]})}},2075:(e,t,n)=>{n.d(t,{A:()=>d});n(6540) [...]
\ No newline at end of file
diff --git a/assets/js/17e33b4e.add68643.js b/assets/js/17e33b4e.add68643.js
new file mode 100644
index 000000000..ef08026d5
--- /dev/null
+++ b/assets/js/17e33b4e.add68643.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[1689],{7001:(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 (requests), response [...]
\ No newline at end of file
diff --git a/assets/js/19432d33.3f53ea4d.js b/assets/js/19432d33.3f53ea4d.js
new file mode 100644
index 000000000..784212d36
--- /dev/null
+++ b/assets/js/19432d33.3f53ea4d.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.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.4ace8d62.js b/assets/js/1b6ff2c5.4ace8d62.js
new file mode 100644
index 000000000..800aa79ce
--- /dev/null
+++ b/assets/js/1b6ff2c5.4ace8d62.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[5754],{5091:e=>{e.exports=JSON.parse('{"archive":{"blogPosts":[{"id":"/2025/02/12/transparent-benchmarks","metadata":{"permalink":"/blogs/2025/02/12/transparent-benchmarks","source":"@site/blog/2025-02-12-transparent-benchmarks.md","title":"Iggy and the Transparent Benchmarks","description":"Benchmarks should be the first-class citizen","date":"2025-02-12T00:00:00.000Z","tags":[],"readingTime":3.415,"ha [...]
\ No newline at end of file
diff --git a/assets/js/1ccbcc53.6c5a9c0b.js b/assets/js/1ccbcc53.6c5a9c0b.js
new file mode 100644
index 000000000..6294516a1
--- /dev/null
+++ b/assets/js/1ccbcc53.6c5a9c0b.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[586],{9051:(t,e,n)=>{n.r(e),n.d(e,{assets:()=>c,contentTitle:()=>a,default:()=>l,frontMatter:()=>r,metadata:()=>o,toc:()=>p});const o=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/intro.md","sou [...]
\ No newline at end of file
diff --git a/assets/js/1df93b7f.c213798e.js b/assets/js/1df93b7f.c213798e.js
new file mode 100644
index 000000000..f303cabb0
--- /dev/null
+++ b/assets/js/1df93b7f.c213798e.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[4583],{2205:(e,t,n)=>{n.d(t,{A:()=>s});var r,a,l=n(6540);function i(){return i=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)({}).hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},i.apply(null,arguments)}const s=e=>{let{title:t,titleId:n,...s}=e;return l.createElement("svg",i({xmlns:"http://www.w3.org/2000/svg",width:30,height:30,fill: [...]
\ No newline at end of file
diff --git a/assets/js/1f391b9e.691973e8.js b/assets/js/1f391b9e.691973e8.js
new file mode 100644
index 000000000..ee68fcc32
--- /dev/null
+++ b/assets/js/1f391b9e.691973e8.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[6061],{665:(e,n,t)=>{t.d(n,{A:()=>o});t(6540);var i=t(4164),a=t(7289),s=t(204),l=t(2362),r=t(4848);function c(e){let{className:n}=e;return(0,r.jsx)(l.A,{type:"caution",title:(0,r.jsx)(a.Rc,{}),className:(0,i.A)(n,s.G.common.unlistedBanner),children:(0,r.jsx)(a.Uh,{})})}function o(e){return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(a.AE,{}),(0,r.jsx)(c,{...e})]})}},2075:(e,n,t)=>{t.d(n,{A:()=>d});t(6540) [...]
\ No newline at end of file
diff --git a/assets/js/218f3d72.d3b47fbb.js b/assets/js/218f3d72.d3b47fbb.js
new file mode 100644
index 000000000..50cff8fa3
--- /dev/null
+++ b/assets/js/218f3d72.d3b47fbb.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[6904],{369:e=>{e.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/25cfbc78.63c117ec.js b/assets/js/25cfbc78.63c117ec.js
new file mode 100644
index 000000000..140a7f215
--- /dev/null
+++ b/assets/js/25cfbc78.63c117ec.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[1223],{6397:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>a,contentTitle:()=>c,default:()=>g,frontMatter:()=>s,metadata:()=>t,toc:()=>l});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 iggyrs/iggy.","source":"@site/docs/server/docker.md","sourceDirName":"server","slug":" [...]
\ No newline at end of file
diff --git a/assets/js/296d7672.77e2810c.js b/assets/js/296d7672.77e2810c.js
new file mode 100644
index 000000000..ba8907ed6
--- /dev/null
+++ b/assets/js/296d7672.77e2810c.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[4906],{6057:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>c,contentTitle:()=>u,default:()=>l,frontMatter:()=>o,metadata:()=>r,toc:()=>d});var r=s(9603),t=s(4848),i=s(8453);const o={title:"Consumer identifier",slug:"consumer-identifier",authors:[{name:"Piotr Gankiewicz",title:"Iggy.rs founder",url:"https://github.com/spetz",image_url:"https://github.com/spetz.png"}],tags:["new-features","consumers","identifier"],hi [...]
\ No newline at end of file
diff --git a/assets/js/2edd2ec4.031f3bf0.js b/assets/js/2edd2ec4.031f3bf0.js
new file mode 100644
index 000000000..37274590d
--- /dev/null
+++ b/assets/js/2edd2ec4.031f3bf0.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[290],{7310:(t,e,o)=>{o.r(e),o.d(e,{assets:()=>d,contentTitle:()=>a,default:()=>u,frontMatter:()=>r,metadata:()=>n,toc:()=>c});const n=JSON.parse('{"id":"sdk/node/sdk-node-intro","title":"Intro","description":"The Iggy Node.js SDK is a client library that allows you to interact with the Iggy API from your Node.js applications. This guide will help you get started with the SDK and show you how to use it t [...]
\ No newline at end of file
diff --git a/assets/js/2f80e784.6ba7b6f9.js b/assets/js/2f80e784.6ba7b6f9.js
new file mode 100644
index 000000000..3060dfed6
--- /dev/null
+++ b/assets/js/2f80e784.6ba7b6f9.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[8143],{7028:(e,s,t)=>{t.r(s),t.d(s,{assets:()=>c,contentTitle:()=>i,default:()=>l,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":false,"tags":[] [...]
\ No newline at end of file
diff --git a/assets/js/3042.3f1c7327.js b/assets/js/3042.3f1c7327.js
new file mode 100644
index 000000000..c36aaae7f
--- /dev/null
+++ b/assets/js/3042.3f1c7327.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[3042],{5932:(e,t,i)=>{i.d(t,{A:()=>a});i(6540);var n=i(4164),s=i(539),o=i(9303),r=i(4848);function a(e){let{className:t}=e;return(0,r.jsx)("main",{className:(0,n.A)("container margin-vert--xl",t),children:(0,r.jsx)("div",{className:"row",children:(0,r.jsxs)("div",{className:"col col--6 col--offset-3",children:[(0,r.jsx)(o.A,{as:"h1",className:"hero__title",children:(0,r.jsx)(s.A,{id:"theme.NotFound.titl [...]
\ No newline at end of file
diff --git a/assets/js/3049ae2a.9a2249cf.js b/assets/js/3049ae2a.9a2249cf.js
new file mode 100644
index 000000000..b0bf69d60
--- /dev/null
+++ b/assets/js/3049ae2a.9a2249cf.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[3922],{9356:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>u,frontMatter:()=>r,metadata:()=>n,toc:()=>l});var n=s(725),a=s(4848),o=s(8453);const r={title:"Personal access tokens",slug:"personal-access-tokens",authors:[{name:"Piotr Gankiewicz",title:"Iggy.rs founder",url:"https://github.com/spetz",image_url:"https://github.com/spetz.png"}],tags:["new-features","personal-access-tokens [...]
\ No newline at end of file
diff --git a/assets/js/332362b2.cdd7b1d9.js b/assets/js/332362b2.cdd7b1d9.js
new file mode 100644
index 000000000..18e14697b
--- /dev/null
+++ b/assets/js/332362b2.cdd7b1d9.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[2244],{5849:(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 configuration [...]
\ No newline at end of file
diff --git a/assets/js/363979b1.33988d75.js b/assets/js/363979b1.33988d75.js
new file mode 100644
index 000000000..c9b3fab8d
--- /dev/null
+++ b/assets/js/363979b1.33988d75.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[1335],{7539:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>c,contentTitle:()=>i,default:()=>h,frontMatter:()=>t,metadata:()=>r,toc:()=>l});const r=JSON.parse('{"id":"server/server-benchmarking","title":"Benchmarking","description":"Iggy comes with a built-in benchmarking tool that allows you to measure the performance of the server. It is written in Rust and uses the tokio runtime for asynchronous I/O operations mi [...]
\ No newline at end of file
diff --git a/assets/js/36994c47.a62ea346.js b/assets/js/36994c47.a62ea346.js
new file mode 100644
index 000000000..08f73b795
--- /dev/null
+++ b/assets/js/36994c47.a62ea346.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.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.8efd7034.js b/assets/js/393be207.8efd7034.js
new file mode 100644
index 000000000..f76f1350d
--- /dev/null
+++ b/assets/js/393be207.8efd7034.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[4134],{1943:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>p,default:()=>l,frontMatter:()=>s,metadata:()=>a,toc:()=>d});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":false}'); [...]
\ No newline at end of file
diff --git a/assets/js/3defdf4b.bf771193.js b/assets/js/3defdf4b.bf771193.js
new file mode 100644
index 000000000..3e800f7b4
--- /dev/null
+++ b/assets/js/3defdf4b.bf771193.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[9919],{5199:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>a,contentTitle:()=>d,default:()=>p,frontMatter:()=>i,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":[],"version":" [...]
\ No newline at end of file
diff --git a/assets/js/41e60a44.1bbb0d27.js b/assets/js/41e60a44.1bbb0d27.js
new file mode 100644
index 000000000..bca55bb16
--- /dev/null
+++ b/assets/js/41e60a44.1bbb0d27.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[3286],{1667:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>d,contentTitle:()=>i,default:()=>p,frontMatter:()=>r,metadata:()=>a,toc:()=>l});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":[],"version":" [...]
\ No newline at end of file
diff --git a/assets/js/46167e1b.736707f3.js b/assets/js/46167e1b.736707f3.js
new file mode 100644
index 000000000..f40f42981
--- /dev/null
+++ b/assets/js/46167e1b.736707f3.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[8501],{1607:(t,e,n)=>{n.r(e),n.d(e,{assets:()=>c,contentTitle:()=>a,default:()=>d,frontMatter:()=>s,metadata:()=>o,toc:()=>p});const o=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 you to eas [...]
\ No newline at end of file
diff --git a/assets/js/4726e312.a15f3436.js b/assets/js/4726e312.a15f3436.js
new file mode 100644
index 000000000..7fcce664a
--- /dev/null
+++ b/assets/js/4726e312.a15f3436.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[6185],{4352:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>c,default:()=>h,frontMatter:()=>s,metadata:()=>i,toc:()=>a});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,"unlisted":false," [...]
\ No newline at end of file
diff --git a/assets/js/544367a9.8636f3f4.js b/assets/js/544367a9.8636f3f4.js
new file mode 100644
index 000000000..17e8cf1dd
--- /dev/null
+++ b/assets/js/544367a9.8636f3f4.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[492],{7842:e=>{e.exports=JSON.parse('{"tags":[{"label":"release","permalink":"/blogs/tags/release","count":1},{"label":"new-features","permalink":"/blogs/tags/new-features","count":6},{"label":"personal-access-tokens","permalink":"/blogs/tags/personal-access-tokens","count":1},{"label":"pat","permalink":"/blogs/tags/pat","count":1},{"label":"consumers","permalink":"/blogs/tags/consumers","count":1},{"la [...]
\ No newline at end of file
diff --git a/assets/js/5a05130f.71d5a345.js b/assets/js/5a05130f.71d5a345.js
new file mode 100644
index 000000000..07a86281d
--- /dev/null
+++ b/assets/js/5a05130f.71d5a345.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[1258],{5048:e=>{e.exports=JSON.parse('{"metadata":{"permalink":"/blogs","page":1,"postsPerPage":10,"totalPages":2,"totalCount":14,"nextPage":"/blogs/page/2","blogDescription":"Blog","blogTitle":"Blogs"}}')}}]);
\ No newline at end of file
diff --git a/assets/js/5e95c892.04e1f2fd.js b/assets/js/5e95c892.04e1f2fd.js
new file mode 100644
index 000000000..81b0f171b
--- /dev/null
+++ b/assets/js/5e95c892.04e1f2fd.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[9647],{8122:(e,s,r)=>{r.r(s),r.d(s,{default:()=>l});r(6540);var t=r(4164),u=r(1082),a=r(204),c=r(2831),i=r(1410),n=r(4848);function l(e){return(0,n.jsx)(u.e3,{className:(0,t.A)(a.G.wrapper.docsPages),children:(0,n.jsx)(i.A,{children:(0,c.v)(e.route.routes)})})}}}]);
\ No newline at end of file
diff --git a/assets/js/62290500.023f56e0.js b/assets/js/62290500.023f56e0.js
new file mode 100644
index 000000000..6e4c91716
--- /dev/null
+++ b/assets/js/62290500.023f56e0.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[7349],{6363:(e,t,s)=>{s.r(t),s.d(t,{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","permalink" [...]
\ No newline at end of file
diff --git a/assets/js/64ee4266.21b531a2.js b/assets/js/64ee4266.21b531a2.js
new file mode 100644
index 000000000..a49fa6559
--- /dev/null
+++ b/assets/js/64ee4266.21b531a2.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[8245],{2121:e=>{e.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/65d17065.9a3a3a9f.js b/assets/js/65d17065.9a3a3a9f.js
new file mode 100644
index 000000000..47f656ad5
--- /dev/null
+++ b/assets/js/65d17065.9a3a3a9f.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[3067],{3513:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>a,contentTitle:()=>c,default:()=>h,frontMatter:()=>r,metadata:()=>i,toc:()=>l});const i=JSON.parse('{"id":"introduction/introduction-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 where th [...]
\ No newline at end of file
diff --git a/assets/js/666c9b96.510c7926.js b/assets/js/666c9b96.510c7926.js
new file mode 100644
index 000000000..054d15db5
--- /dev/null
+++ b/assets/js/666c9b96.510c7926.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.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.8859c660.js b/assets/js/6875c492.8859c660.js
new file mode 100644
index 000000000..2ef568fa1
--- /dev/null
+++ b/assets/js/6875c492.8859c660.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[4813],{7448:(e,t,n)=>{n.d(t,{A:()=>r});n(6540);var i=n(539),s=n(1865),a=n(4848);function r(e){const{metadata:t}=e,{previousPage:n,nextPage:r}=t;return(0,a.jsxs)("nav",{className:"pagination-nav","aria-label":(0,i.T)({id:"theme.blog.paginator.navAriaLabel",message:"Blog list page navigation",description:"The ARIA label for the blog pagination"}),children:[n&&(0,a.jsx)(s.A,{permalink:n,title:(0,a.jsx)(i.A [...]
\ No newline at end of file
diff --git a/assets/js/6a23e949.a1f58d72.js b/assets/js/6a23e949.a1f58d72.js
new file mode 100644
index 000000000..765ea0895
--- /dev/null
+++ b/assets/js/6a23e949.a1f58d72.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.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/6ea6d42b.24ff764b.js b/assets/js/6ea6d42b.24ff764b.js
new file mode 100644
index 000000000..a0201f9ca
--- /dev/null
+++ b/assets/js/6ea6d42b.24ff764b.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[8529],{8727:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>u,frontMatter:()=>o,metadata:()=>n,toc:()=>g});var n=s(331),r=s(4848),a=s(8453);const o={title:"Iggy 0.1.0 release",slug:"iggy-0-1-0-release",authors:[{name:"Piotr Gankiewicz",title:"Iggy.rs founder",url:"https://github.com/spetz",image_url:"https://github.com/spetz.png"}],tags:["release"],hide_table_of_contents:!1,date:new  [...]
\ No newline at end of file
diff --git a/assets/js/71369862.d9140114.js b/assets/js/71369862.d9140114.js
new file mode 100644
index 000000000..3f13861fe
--- /dev/null
+++ b/assets/js/71369862.d9140114.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[195],{7823:e=>{e.exports=JSON.parse('{"metadata":{"permalink":"/blogs/page/2","page":2,"postsPerPage":10,"totalPages":2,"totalCount":14,"previousPage":"/blogs","blogDescription":"Blog","blogTitle":"Blogs"}}')}}]);
\ No newline at end of file
diff --git a/assets/js/76680d72.08874437.js b/assets/js/76680d72.08874437.js
new file mode 100644
index 000000000..5eb8fcccf
--- /dev/null
+++ b/assets/js/76680d72.08874437.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.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.a82b3fbd.js b/assets/js/782bd44c.a82b3fbd.js
new file mode 100644
index 000000000..227c0c167
--- /dev/null
+++ b/assets/js/782bd44c.a82b3fbd.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.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.ca75fd8f.js b/assets/js/7d3d0ee4.ca75fd8f.js
new file mode 100644
index 000000000..848c247f6
--- /dev/null
+++ b/assets/js/7d3d0ee4.ca75fd8f.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[2729],{494:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>m,frontMatter:()=>r,metadata:()=>a,toc:()=>g});var a=s(4529),n=s(4848),o=s(8453);const r={title:"Message headers",slug:"message-headers",authors:[{name:"Piotr Gankiewicz",title:"Iggy.rs founder",url:"https://github.com/spetz",image_url:"https://github.com/spetz.png"}],tags:["new-features","message-headers","breaking-changes"] [...]
\ No newline at end of file
diff --git a/assets/js/7e31e0a8.6a486898.js b/assets/js/7e31e0a8.6a486898.js
new file mode 100644
index 000000000..1fb574b51
--- /dev/null
+++ b/assets/js/7e31e0a8.6a486898.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.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.35fc5cc6.js b/assets/js/7eb7d8a5.35fc5cc6.js
new file mode 100644
index 000000000..4590be25d
--- /dev/null
+++ b/assets/js/7eb7d8a5.35fc5cc6.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[9160],{5304:t=>{t.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.37c13981.js b/assets/js/814f3328.37c13981.js
new file mode 100644
index 000000000..f2f45dc0d
--- /dev/null
+++ b/assets/js/814f3328.37c13981.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[7472],{5513:e=>{e.exports=JSON.parse('{"title":"Recent posts","items":[{"title":"Iggy and the Transparent Benchmarks","permalink":"/blogs/2025/02/12/transparent-benchmarks","unlisted":false,"date":"2025-02-12T00:00:00.000Z"},{"title":"Iggy joins the Apache Incubator","permalink":"/blogs/2025/02/10/apache-incubator","unlisted":false,"date":"2025-02-10T00:00:00.000Z"},{"title":"Iggy.rs - Technology Radar  [...]
\ No newline at end of file
diff --git a/assets/js/8a6c01a6.85bf8a3b.js b/assets/js/8a6c01a6.85bf8a3b.js
new file mode 100644
index 000000000..0cf499c31
--- /dev/null
+++ b/assets/js/8a6c01a6.85bf8a3b.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[823],{8003:(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","sourceDirName":"sdk/go" [...]
\ No newline at end of file
diff --git a/assets/js/8b22b5f5.be549698.js b/assets/js/8b22b5f5.be549698.js
new file mode 100644
index 000000000..96eca4932
--- /dev/null
+++ b/assets/js/8b22b5f5.be549698.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.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.06caa7b2.js b/assets/js/8b8cddd6.06caa7b2.js
new file mode 100644
index 000000000..6be0babfa
--- /dev/null
+++ b/assets/js/8b8cddd6.06caa7b2.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[7012],{2920:(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":"What we will build","source":"@site/docs/introduction/getting_started.md","sourceDirName":"introduction","slug":"/introduction/getting-started","permalink":"/docs/intro [...]
\ No newline at end of file
diff --git a/assets/js/8c2332e9.25938787.js b/assets/js/8c2332e9.25938787.js
new file mode 100644
index 000000000..f5aca5b2a
--- /dev/null
+++ b/assets/js/8c2332e9.25938787.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[7688],{6476:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>h,contentTitle:()=>a,default:()=>c,frontMatter:()=>o,metadata:()=>s,toc:()=>l});var s=n(4170),i=n(4848),r=n(8453);const o={title:"Iggy.rs - building message streaming in Rust",authors:[{name:"Piotr Gankiewicz",title:"Iggy.rs founder",url:"https://github.com/spetz",image_url:"https://github.com/spetz.png"}],tags:[],hide_table_of_contents:!1,date:new Date("20 [...]
\ No newline at end of file
diff --git a/assets/js/907ba26f.2f311a11.js b/assets/js/907ba26f.2f311a11.js
new file mode 100644
index 000000000..d283f8e25
--- /dev/null
+++ b/assets/js/907ba26f.2f311a11.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[5214],{4884:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>a,default:()=>c,frontMatter:()=>s,metadata:()=>r,toc:()=>h});var r=n(3151),i=n(4848),o=n(8453);const s={title:"Iggy.rs - Technology Radar & current goals",authors:[{name:"Piotr Gankiewicz",title:"Iggy.rs founder",url:"https://github.com/spetz",image_url:"https://github.com/spetz.png"}],tags:[],hide_table_of_contents:!1,date:new Date("2024 [...]
\ No newline at end of file
diff --git a/assets/js/92abec30.8e8717b2.js b/assets/js/92abec30.8e8717b2.js
new file mode 100644
index 000000000..261ad1b0d
--- /dev/null
+++ b/assets/js/92abec30.8e8717b2.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[8154],{8303:(e,s,i)=>{i.r(s),i.d(s,{assets:()=>c,contentTitle:()=>r,default:()=>d,frontMatter:()=>o,metadata:()=>n,toc:()=>l});const n=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 Iggy server. You can use the CLI to manage the streams, topics, partitions, messages, users and more. It is part of the co [...]
\ No newline at end of file
diff --git a/assets/js/9392.cb8189ce.js b/assets/js/9392.cb8189ce.js
new file mode 100644
index 000000000..ce30145fa
--- /dev/null
+++ b/assets/js/9392.cb8189ce.js
@@ -0,0 +1 @@
+(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[9392],{2362:(e,t,n)=>{"use strict";n.d(t,{A:()=>S});var s=n(6540),o=n(4848);function a(e){const{mdxAdmonitionTitle:t,rest:n}=function(e){const t=s.Children.toArray(e),n=t.find((e=>s.isValidElement(e)&&"mdxAdmonitionTitle"===e.type)),a=t.filter((e=>e!==n)),c=n?.props.children;return{mdxAdmonitionTitle:c,rest:a.length>0?(0,o.jsx)(o.Fragment,{children:a}):null}}(e.children),a=e.title??t;return{...e,...a&&{title:a},chil [...]
\ No newline at end of file
diff --git a/assets/js/9590c6d3.1df5f6eb.js b/assets/js/9590c6d3.1df5f6eb.js
new file mode 100644
index 000000000..906316589
--- /dev/null
+++ b/assets/js/9590c6d3.1df5f6eb.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[90],{7352:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>h,contentTitle:()=>a,default:()=>c,frontMatter:()=>o,metadata:()=>s,toc:()=>l});var s=n(4170),i=n(4848),r=n(8453);const o={title:"Iggy.rs - building message streaming in Rust",authors:[{name:"Piotr Gankiewicz",title:"Iggy.rs founder",url:"https://github.com/spetz",image_url:"https://github.com/spetz.png"}],tags:[],hide_table_of_contents:!1,date:new Date("2023 [...]
\ No newline at end of file
diff --git a/assets/js/98883e6e.d336253a.js b/assets/js/98883e6e.d336253a.js
new file mode 100644
index 000000000..fa9730992
--- /dev/null
+++ b/assets/js/98883e6e.d336253a.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[7487],{1353:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>h,contentTitle:()=>o,default:()=>d,frontMatter:()=>a,metadata:()=>s,toc:()=>l});var s=i(9896),n=i(4848),r=i(8453);const a={title:"Iggy.rs \u2014 one year of building the message streaming",authors:[{name:"Piotr Gankiewicz",title:"Iggy.rs founder",url:"https://github.com/spetz",image_url:"https://github.com/spetz.png"}],tags:[],hide_table_of_contents:!1,date [...]
\ No newline at end of file
diff --git a/assets/js/9ca9f017.9a1d556b.js b/assets/js/9ca9f017.9a1d556b.js
new file mode 100644
index 000000000..1a07779e7
--- /dev/null
+++ b/assets/js/9ca9f017.9a1d556b.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[8895],{6561:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>h,contentTitle:()=>o,default:()=>l,frontMatter:()=>r,metadata:()=>s,toc:()=>c});const s=JSON.parse('{"id":"introduction/introduction-architecture","title":"Architecture","description":"Iggy is the persistent message streaming, which means, that the messages are being stored in a form of an append-only log. You can create multiple streams, consisting of topi [...]
\ No newline at end of file
diff --git a/assets/js/9e4087bc.f3461460.js b/assets/js/9e4087bc.f3461460.js
new file mode 100644
index 000000000..d3a83b54d
--- /dev/null
+++ b/assets/js/9e4087bc.f3461460.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[2711],{4750:(e,t,r)=>{r.r(t),r.d(t,{default:()=>m});r(6540);var a=r(6289),n=r(539),s=r(1082),i=r(8569),c=r(1410),l=r(9303),o=r(4848);function d(e){let{year:t,posts:r}=e;const n=(0,i.i)({day:"numeric",month:"long",timeZone:"UTC"});return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(l.A,{as:"h3",id:t,children:t}),(0,o.jsx)("ul",{children:r.map((e=>{return(0,o.jsx)("li",{children:(0,o.jsxs)(a.A,{to:e.metadata [...]
\ No newline at end of file
diff --git a/assets/js/a2ea038e.a071e3a8.js b/assets/js/a2ea038e.a071e3a8.js
new file mode 100644
index 000000000..16dd628e6
--- /dev/null
+++ b/assets/js/a2ea038e.a071e3a8.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[3658],{4396:(t,e,a)=>{a.r(e),a.d(e,{assets:()=>c,contentTitle:()=>r,default:()=>u,frontMatter:()=>i,metadata:()=>n,toc:()=>d});const n=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":"/sdk/java/intro [...]
\ No newline at end of file
diff --git a/assets/js/a4d21046.9d474182.js b/assets/js/a4d21046.9d474182.js
new file mode 100644
index 000000000..52ad13aba
--- /dev/null
+++ b/assets/js/a4d21046.9d474182.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.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.acf07fb4.js b/assets/js/a6aa9e1f.acf07fb4.js
new file mode 100644
index 000000000..c08f62e40
--- /dev/null
+++ b/assets/js/a6aa9e1f.acf07fb4.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[7643],{5631:(e,t,i)=>{i.r(t),i.d(t,{default:()=>m});i(6540);var n=i(4164),a=i(797),s=i(1082),r=i(204),l=i(569),o=i(7448),g=i(7220),c=i(4005),p=i(7143),d=i(3750),x=i(4848);function b(e){const t=(0,d.kJ)(e);return(0,x.jsx)(p.A,{children:(0,x.jsx)("script",{type:"application/ld+json",children:JSON.stringify(t)})})}function h(e){const{metadata:t}=e,{siteConfig:{title:i}}=(0,a.A)(),{blogDescription:n,blogTit [...]
\ No newline at end of file
diff --git a/assets/js/a7456010.a8a22b85.js b/assets/js/a7456010.a8a22b85.js
new file mode 100644
index 000000000..c6ea579ba
--- /dev/null
+++ b/assets/js/a7456010.a8a22b85.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.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/a7bd4aaa.5082748c.js b/assets/js/a7bd4aaa.5082748c.js
new file mode 100644
index 000000000..66b72b5e3
--- /dev/null
+++ b/assets/js/a7bd4aaa.5082748c.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[7098],{7419:(n,e,s)=>{s.r(e),s.d(e,{default:()=>d});s(6540);var r=s(1082);function t(n,e){return`docs-${n}-${e}`}var o=s(1858),i=s(2831),c=s(7220),u=s(4848);function a(n){const{version:e}=n;return(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(c.A,{version:e.version,tag:t(e.pluginId,e.version)}),(0,u.jsx)(r.be,{children:e.noIndex&&(0,u.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})]})}function l( [...]
\ No newline at end of file
diff --git a/assets/js/a7c1df9a.c0fe9b64.js b/assets/js/a7c1df9a.c0fe9b64.js
new file mode 100644
index 000000000..5a2e6c45b
--- /dev/null
+++ b/assets/js/a7c1df9a.c0fe9b64.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[1163],{5574:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>l,contentTitle:()=>o,default:()=>d,frontMatter:()=>i,metadata:()=>t,toc:()=>u});var t=s(6934),r=s(4848),a=s(8453);const i={title:"Users and permissions",slug:"users-and-permissions",authors:[{name:"Piotr Gankiewicz",title:"Iggy.rs founder",url:"https://github.com/spetz",image_url:"https://github.com/spetz.png"}],tags:["new-features","users","permissions"],h [...]
\ No newline at end of file
diff --git a/assets/js/a902938a.31fa8d6e.js b/assets/js/a902938a.31fa8d6e.js
new file mode 100644
index 000000000..3ae5924c7
--- /dev/null
+++ b/assets/js/a902938a.31fa8d6e.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.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.e9ffcf54.js b/assets/js/a94703ab.e9ffcf54.js
new file mode 100644
index 000000000..ba774eb23
--- /dev/null
+++ b/assets/js/a94703ab.e9ffcf54.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[9048],{1841:(e,t,n)=>{n.r(t),n.d(t,{default:()=>pe});var a=n(6540),o=n(4164),i=n(1082),s=n(204),l=n(3751),r=n(2306),c=n(539),d=n(5627),u=n(7685);const m={backToTopButton:"backToTopButton_sjWU",backToTopButtonShow:"backToTopButtonShow_xfvO"};var b=n(4848);function h(){const{shown:e,scrollToTop:t}=function(e){let{threshold:t}=e;const[n,o]=(0,a.useState)(!1),i=(0,a.useRef)(!1),{startScroll:s,cancelScroll:l [...]
\ No newline at end of file
diff --git a/assets/js/aba21aa0.c17b1acf.js b/assets/js/aba21aa0.c17b1acf.js
new file mode 100644
index 000000000..60e504ab1
--- /dev/null
+++ b/assets/js/aba21aa0.c17b1acf.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.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.ed39bb7e.js b/assets/js/acecf23e.ed39bb7e.js
new file mode 100644
index 000000000..610bc0dbf
--- /dev/null
+++ b/assets/js/acecf23e.ed39bb7e.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.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.5c63557c.js b/assets/js/b041cdfc.5c63557c.js
new file mode 100644
index 000000000..4fa690304
--- /dev/null
+++ b/assets/js/b041cdfc.5c63557c.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[3632],{4887:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>h,contentTitle:()=>o,default:()=>d,frontMatter:()=>a,metadata:()=>s,toc:()=>l});var s=i(9896),n=i(4848),r=i(8453);const a={title:"Iggy.rs \u2014 one year of building the message streaming",authors:[{name:"Piotr Gankiewicz",title:"Iggy.rs founder",url:"https://github.com/spetz",image_url:"https://github.com/spetz.png"}],tags:[],hide_table_of_contents:!1,date [...]
\ No newline at end of file
diff --git a/assets/js/b1fb958a.2370b490.js b/assets/js/b1fb958a.2370b490.js
new file mode 100644
index 000000000..3384ea425
--- /dev/null
+++ b/assets/js/b1fb958a.2370b490.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[8275],{9800:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>u,contentTitle:()=>a,default:()=>p,frontMatter:()=>o,metadata:()=>n,toc:()=>l});var n=s(9603),r=s(4848),i=s(8453);const o={title:"Consumer identifier",slug:"consumer-identifier",authors:[{name:"Piotr Gankiewicz",title:"Iggy.rs founder",url:"https://github.com/spetz",image_url:"https://github.com/spetz.png"}],tags:["new-features","consumers","identifier"],hi [...]
\ No newline at end of file
diff --git a/assets/js/b8b35ff1.7c7ba905.js b/assets/js/b8b35ff1.7c7ba905.js
new file mode 100644
index 000000000..5643d0a28
--- /dev/null
+++ b/assets/js/b8b35ff1.7c7ba905.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[7930],{9803:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>h,contentTitle:()=>i,default:()=>g,frontMatter:()=>r,metadata:()=>n,toc:()=>l});var n=a(738),o=a(4848),s=a(8453);const r={title:"Iggy joins the Apache Incubator",authors:[{name:"Piotr Gankiewicz",title:"Iggy.rs founder",url:"https://github.com/spetz",image_url:"https://github.com/spetz.png"}],tags:[],hide_table_of_contents:!1,date:new Date("2025-02-10T00:00 [...]
\ No newline at end of file
diff --git a/assets/js/c065b223.703e6b26.js b/assets/js/c065b223.703e6b26.js
new file mode 100644
index 000000000..b9f022212
--- /dev/null
+++ b/assets/js/c065b223.703e6b26.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[5956],{5561:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>g,contentTitle:()=>o,default:()=>u,frontMatter:()=>r,metadata:()=>a,toc:()=>l});var a=s(737),n=s(4848),i=s(8453);const r={title:"Message state",slug:"message-state",authors:[{name:"Piotr Gankiewicz",title:"Iggy.rs founder",url:"https://github.com/spetz",image_url:"https://github.com/spetz.png"}],tags:["new-features","message-state","message-checksum"],hide_ [...]
\ No newline at end of file
diff --git a/assets/js/c23ee533.34274de9.js b/assets/js/c23ee533.34274de9.js
new file mode 100644
index 000000000..d4246c9a5
--- /dev/null
+++ b/assets/js/c23ee533.34274de9.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[2608],{7498:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>h,contentTitle:()=>d,default:()=>c,frontMatter:()=>i,metadata:()=>t,toc:()=>l});var t=n(4529),a=n(4848),r=n(8453);const i={title:"Message headers",slug:"message-headers",authors:[{name:"Piotr Gankiewicz",title:"Iggy.rs founder",url:"https://github.com/spetz",image_url:"https://github.com/spetz.png"}],tags:["new-features","message-headers","breaking-changes" [...]
\ No newline at end of file
diff --git a/assets/js/c3a24e9c.3b029fae.js b/assets/js/c3a24e9c.3b029fae.js
new file mode 100644
index 000000000..120a55907
--- /dev/null
+++ b/assets/js/c3a24e9c.3b029fae.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[3297],{4843:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>d,contentTitle:()=>a,default:()=>p,frontMatter:()=>i,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":"current","si [...]
\ No newline at end of file
diff --git a/assets/js/c5f172dd.a7ca6ff6.js b/assets/js/c5f172dd.a7ca6ff6.js
new file mode 100644
index 000000000..32b8b8f7a
--- /dev/null
+++ b/assets/js/c5f172dd.a7ca6ff6.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[5511],{1514:(e,s,t)=>{t.r(s),t.d(s,{assets:()=>o,contentTitle:()=>l,default:()=>h,frontMatter:()=>r,metadata:()=>n,toc:()=>d});var n=t(4547),i=t(4848),a=t(8453);const r={title:"Message expiry",slug:"message-expiry",authors:[{name:"Piotr Gankiewicz",title:"Iggy.rs founder",url:"https://github.com/spetz",image_url:"https://github.com/spetz.png"}],tags:["new-features","message-expiry"],hide_table_of_conten [...]
\ No newline at end of file
diff --git a/assets/js/c70ea44c.35598963.js b/assets/js/c70ea44c.35598963.js
new file mode 100644
index 000000000..d3b4ad08c
--- /dev/null
+++ b/assets/js/c70ea44c.35598963.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[6056],{9632:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>i,contentTitle:()=>c,default:()=>d,frontMatter:()=>r,metadata:()=>t,toc:()=>l});var t=s(725),a=s(4848),o=s(8453);const r={title:"Personal access tokens",slug:"personal-access-tokens",authors:[{name:"Piotr Gankiewicz",title:"Iggy.rs founder",url:"https://github.com/spetz",image_url:"https://github.com/spetz.png"}],tags:["new-features","personal-access-tokens [...]
\ No newline at end of file
diff --git a/assets/js/c8d81af2.ae9cf841.js b/assets/js/c8d81af2.ae9cf841.js
new file mode 100644
index 000000000..8508d9989
--- /dev/null
+++ b/assets/js/c8d81af2.ae9cf841.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[3384],{7560:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>a,contentTitle:()=>l,default:()=>h,frontMatter:()=>o,metadata:()=>i,toc:()=>c});const i=JSON.parse('{"id":"introduction/introduction-about","title":"About","description":"Iggy is the persistent message streaming platform written in Rust, supporting QUIC, TCP (custom binary specification) and HTTP (regular REST API) transport protocols. Currently, running as [...]
\ No newline at end of file
diff --git a/assets/js/ca66c66a.cc0118d1.js b/assets/js/ca66c66a.cc0118d1.js
new file mode 100644
index 000000000..b06fd04a4
--- /dev/null
+++ b/assets/js/ca66c66a.cc0118d1.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[1019],{3710:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>c,frontMatter:()=>r,metadata:()=>n,toc:()=>l});var n=s(4547),a=s(4848),i=s(8453);const r={title:"Message expiry",slug:"message-expiry",authors:[{name:"Piotr Gankiewicz",title:"Iggy.rs founder",url:"https://github.com/spetz",image_url:"https://github.com/spetz.png"}],tags:["new-features","message-expiry"],hide_table_of_conten [...]
\ No newline at end of file
diff --git a/assets/js/cc16a589.7aa15748.js b/assets/js/cc16a589.7aa15748.js
new file mode 100644
index 000000000..618d32ac8
--- /dev/null
+++ b/assets/js/cc16a589.7aa15748.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[3759],{7943:s=>{s.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.d03da207.js b/assets/js/ccc49370.d03da207.js
new file mode 100644
index 000000000..adec6f0bb
--- /dev/null
+++ b/assets/js/ccc49370.d03da207.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[3249],{7191:(e,t,n)=>{n.r(t),n.d(t,{default:()=>b});n(6540);var i=n(4164),a=n(1082),s=n(204),r=n(3750),o=n(569),l=n(2384),c=n(539),d=n(1865),u=n(4848);function m(e){const{nextItem:t,prevItem:n}=e;return(0,u.jsxs)("nav",{className:"pagination-nav docusaurus-mt-lg","aria-label":(0,c.T)({id:"theme.blog.post.paginator.navAriaLabel",message:"Blog post page navigation",description:"The ARIA label for the blog [...]
\ No newline at end of file
diff --git a/assets/js/ce80ecba.ae60a561.js b/assets/js/ce80ecba.ae60a561.js
new file mode 100644
index 000000000..f28fb478a
--- /dev/null
+++ b/assets/js/ce80ecba.ae60a561.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[4720],{24:(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":false,"tags":[],"v [...]
\ No newline at end of file
diff --git a/assets/js/cfc3091e.2ce2d774.js b/assets/js/cfc3091e.2ce2d774.js
new file mode 100644
index 000000000..8eb57fa01
--- /dev/null
+++ b/assets/js/cfc3091e.2ce2d774.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[2321],{6121:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>h,contentTitle:()=>i,default:()=>g,frontMatter:()=>r,metadata:()=>n,toc:()=>l});var n=a(738),o=a(4848),s=a(8453);const r={title:"Iggy joins the Apache Incubator",authors:[{name:"Piotr Gankiewicz",title:"Iggy.rs founder",url:"https://github.com/spetz",image_url:"https://github.com/spetz.png"}],tags:[],hide_table_of_contents:!1,date:new Date("2025-02-10T00:00 [...]
\ No newline at end of file
diff --git a/assets/js/d1796fc4.2439a4f4.js b/assets/js/d1796fc4.2439a4f4.js
new file mode 100644
index 000000000..eca122356
--- /dev/null
+++ b/assets/js/d1796fc4.2439a4f4.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[1047],{3639:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>a,contentTitle:()=>o,default:()=>l,frontMatter:()=>g,metadata:()=>i,toc:()=>c});const i=JSON.parse('{"id":"web_ui/web-ui-iggy-web-ui","title":"Iggy Web UI","description":"Iggy Web UI provides a comprehensive dashboard for Iggy server. It allows you to monitor the server\'s health, streams, topics, browse the messages, users and more. The dashboard is built  [...]
\ No newline at end of file
diff --git a/assets/js/d47c8727.9c7f885c.js b/assets/js/d47c8727.9c7f885c.js
new file mode 100644
index 000000000..a2ecefcc1
--- /dev/null
+++ b/assets/js/d47c8727.9c7f885c.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[5059],{2546:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>h,contentTitle:()=>a,default:()=>l,frontMatter:()=>o,metadata:()=>s,toc:()=>c});var s=n(5787),r=n(4848),i=n(8453);const o={title:"Iggy and the Transparent Benchmarks",authors:[{name:"Piotr Gankiewicz",title:"Iggy.rs founder",url:"https://github.com/spetz",image_url:"https://github.com/spetz.png"}],tags:[],hide_table_of_contents:!1,date:new Date("2025-02-12T [...]
\ No newline at end of file
diff --git a/assets/js/d6bb211a.cb8dda6e.js b/assets/js/d6bb211a.cb8dda6e.js
new file mode 100644
index 000000000..0fbe88319
--- /dev/null
+++ b/assets/js/d6bb211a.cb8dda6e.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.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/da420000.5101deac.js b/assets/js/da420000.5101deac.js
new file mode 100644
index 000000000..7cda61f53
--- /dev/null
+++ b/assets/js/da420000.5101deac.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[1572],{8695:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>d,contentTitle:()=>h,default:()=>c,frontMatter:()=>r,metadata:()=>n,toc:()=>l});var n=s(737),a=s(4848),i=s(8453);const r={title:"Message state",slug:"message-state",authors:[{name:"Piotr Gankiewicz",title:"Iggy.rs founder",url:"https://github.com/spetz",image_url:"https://github.com/spetz.png"}],tags:["new-features","message-state","message-checksum"],hide_ [...]
\ No newline at end of file
diff --git a/assets/js/e05ad208.7a270d29.js b/assets/js/e05ad208.7a270d29.js
new file mode 100644
index 000000000..3b4c0eda9
--- /dev/null
+++ b/assets/js/e05ad208.7a270d29.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[9648],{5744:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>a,default:()=>c,frontMatter:()=>s,metadata:()=>r,toc:()=>h});var r=n(3151),i=n(4848),o=n(8453);const s={title:"Iggy.rs - Technology Radar & current goals",authors:[{name:"Piotr Gankiewicz",title:"Iggy.rs founder",url:"https://github.com/spetz",image_url:"https://github.com/spetz.png"}],tags:[],hide_table_of_contents:!1,date:new Date("2024 [...]
\ No newline at end of file
diff --git a/assets/js/e7c222e2.ab35a9f0.js b/assets/js/e7c222e2.ab35a9f0.js
new file mode 100644
index 000000000..ac3e8f8c0
--- /dev/null
+++ b/assets/js/e7c222e2.ab35a9f0.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[3713],{5562:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>c,contentTitle:()=>r,default:()=>p,frontMatter:()=>i,metadata:()=>n,toc:()=>d});var n=s(6047),a=s(4848),o=s(8453);const i={title:"Updated schemas",slug:"updated-schemas",authors:[{name:"Piotr Gankiewicz",title:"Iggy.rs founder",url:"https://github.com/spetz",image_url:"https://github.com/spetz.png"}],tags:["update","schema"],hide_table_of_contents:!1},r=voi [...]
\ No newline at end of file
diff --git a/assets/js/f5480997.3a933f2b.js b/assets/js/f5480997.3a933f2b.js
new file mode 100644
index 000000000..b215ce0da
--- /dev/null
+++ b/assets/js/f5480997.3a933f2b.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[6273],{6534:(e,t,s)=>{s.r(t),s.d(t,{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 directory." [...]
\ No newline at end of file
diff --git a/assets/js/ff030c8a.e940df38.js b/assets/js/ff030c8a.e940df38.js
new file mode 100644
index 000000000..be4378e7f
--- /dev/null
+++ b/assets/js/ff030c8a.e940df38.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[8374],{3364:e=>{e.exports=JSON.parse('{"tag":{"label":"release","permalink":"/blogs/tags/release","allTagsPath":"/blogs/tags","count":1,"unlisted":false},"listMetadata":{"permalink":"/blogs/tags/release","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blogs"}}')}}]);
\ No newline at end of file
diff --git a/assets/js/ff06d166.504db088.js b/assets/js/ff06d166.504db088.js
new file mode 100644
index 000000000..5acddf022
--- /dev/null
+++ b/assets/js/ff06d166.504db088.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[7128],{5722:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>u,contentTitle:()=>a,default:()=>c,frontMatter:()=>o,metadata:()=>n,toc:()=>l});var n=s(6934),r=s(4848),i=s(8453);const o={title:"Users and permissions",slug:"users-and-permissions",authors:[{name:"Piotr Gankiewicz",title:"Iggy.rs founder",url:"https://github.com/spetz",image_url:"https://github.com/spetz.png"}],tags:["new-features","users","permissions"],h [...]
\ No newline at end of file
diff --git a/assets/js/main.f5453fd5.js b/assets/js/main.f5453fd5.js
new file mode 100644
index 000000000..05d487f82
--- /dev/null
+++ b/assets/js/main.f5453fd5.js
@@ -0,0 +1,2 @@
+/*! For license information please see main.f5453fd5.js.LICENSE.txt */
+(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[8792],{8912:(e,t,n)=>{"use strict";n.d(t,{A:()=>p});n(6540);var r=n(3259),a=n.n(r),o=n(4054);const i={"0058b4c6":[()=>n.e(849).then(n.t.bind(n,6164,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-175.json",6164],"0169d23c":[()=>n.e(9437).then(n.bind(n,2997)),"@site/blog/2023-08-16-welcome.md?truncated=true",2997],"01a85c17":[()=>Promise.all([n.e(1869),n.e(8209)]).then(n.bind(n,4941)),"@theme/BlogTagsL [...]
\ No newline at end of file
diff --git a/assets/js/main.f5453fd5.js.LICENSE.txt b/assets/js/main.f5453fd5.js.LICENSE.txt
new file mode 100644
index 000000000..b79e8be46
--- /dev/null
+++ b/assets/js/main.f5453fd5.js.LICENSE.txt
@@ -0,0 +1,74 @@
+/* NProgress, (c) 2013, 2014 Rico Sta. Cruz - http://ricostacruz.com/nprogress
+ * @license MIT */
+
+/*! Bundled license information:
+
+prismjs/prism.js:
+  (**
+   * Prism: Lightweight, robust, elegant syntax highlighting
+   *
+   * @license MIT <https://opensource.org/licenses/MIT>
+   * @author Lea Verou <https://lea.verou.me>
+   * @namespace
+   * @public
+   *)
+*/
+
+/**
+ * @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.b0a22bcd.js b/assets/js/runtime~main.b0a22bcd.js
new file mode 100644
index 000000000..e2768d2d4
--- /dev/null
+++ b/assets/js/runtime~main.b0a22bcd.js
@@ -0,0 +1 @@
+(()=>{"use strict";var e,a,c,d,f,b={},t={};function r(e){var a=t[e];if(void 0!==a)return a.exports;var c=t[e]={id:e,loaded:!1,exports:{}};return b[e].call(c.exports,c,c.exports,r),c.loaded=!0,c.exports}r.m=b,r.c=t,e=[],r.O=(a,c,d,f)=>{if(!c){var b=1/0;for(i=0;i<e.length;i++){c=e[i][0],d=e[i][1],f=e[i][2];for(var t=!0,o=0;o<c.length;o++)(!1&f||b>=f)&&Object.keys(r.O).every((e=>r.O[e](c[o])))?c.splice(o--,1):(t=!1,f<b&&(b=f));if(t){e.splice(i--,1);var n=d();void 0!==n&&(a=n)}}return a}f=f| [...]
\ 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 000000000..c1399ef8d
--- /dev/null
+++ b/blogs/2023/12/29/building-message-streaming-in-rust/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.7.0">
+<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="stylesheet" href="/assets/css/styles.db211002.css">
+<script src="/assets/js/runtime~main.b0a22bcd.js" defer="defer"></script>
+<script src="/assets/js/main.f5453fd5.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const n=new URLSearchParams(window.location.search).entries();for(var[t,e]of n)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentEle [...]
+<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">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&#x27;ve been dealing with the different kinds of distributed systems (mostly usi [...]
+<p>After a few months of trying to figure out (or just staying in the limbo I guess), what would be the best project to work on, I decided to build the <strong>message streaming platform</strong> (keep in mind that streaming is <a href="https://blog.iron.io/message-queue-vs-streaming/" target="_blank" rel="noopener noreferrer">not the same</a> as regular message broker). The other reason (besides getting to know Rust) was to <strong>truly understand the internals of the messaging systems [...]
+<p>And this is how the <a href="https://iggy.rs" target="_blank" rel="noopener noreferrer">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">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&#x27;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 anchorWithStickyNavbar_LWe7" id="project">Project<a href="#project" class="hash-link" aria-label="Direct link to Project" title="Direct link to Project">​</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">QUIC</a> protocol based on <a href="https://github.com/quinn-rs/quinn" target="_blank" rel="noopener noreferrer">Quinn</a> library. You could connect multiple applications into the server, and start exchanging the messages between them, simply by appending the data to the stream (from the producer perspect [...]
+<p>After spending a few weeks on building the initial version, and then another few weeks on rewriting its core part (yes, prototyping + validation repeated in a continuous loop worked quite well), I managed to implement the persistent streaming server being capable of parallel writes/reads to/from independent streams supporting many distinct apps connected into it. Simply put, one could easily have many applications, and even <strong>thousands of the streams</strong> (depending on how d [...]
+<p>On top of this, the support for <strong>TCP</strong> and <strong>HTTP</strong> protocols have been added. Under the hood, the typical architecture of streams, consisting of the topics being split into the partitions, which eventually operate on a raw file data using so-called segments has been implemented as well.</p>
+<p><img 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 &quot;aha&quot; 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">bytes</a>, along with the <a href="https://tokio.rs" target="_blank" rel="noopener noreferrer">Tokio</a> <strong>work stealing</strong> approach, yielded the great imp [...]
+<p>I do believe, that somewhere at this point I had realized, that <strong>Iggy might actually become something useful</strong> - not just a toy project, to be abandoned after reaching its initial goal (which was sort of already achieved).</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><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/iggy-rs/iggy/tree/master/bench" target="_blank" rel="noopener noreferrer">benchmarking purposes</a></strong>) and seeing the promising numbers (<strong>range of 2-6 GB/s for both, writes &amp; reads when processing millions of messages</strong>), I eventually decided to give it a long-term shot. Being fully aware that there&#x27;s still lots to be done (speaking of many months, or e [...]
+<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 anchorWithStickyNavbar_LWe7" id="team">Team<a href="#team" class="hash-link" aria-label="Direct link to Team" title="Direct link to Team">​</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&#x27;t actually looking for anyone, as I didn&#x27;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&#x27;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&#x27;re building, and you&#x27;re consistent about it (it was one of the main reasons why I&#x27;ve been contributing to Iggy every day since its inception, and still doing so), there&#x27;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&#x27;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&#x27;d be much harder (or even impossible) to deliver so many features.</p>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="features">Features<a href="#features" class="hash-link" aria-label="Direct link to Features" title="Direct link to Features">​</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><strong>Highly performant</strong>, persistent append-only log for the message streaming</li>
+<li><strong>Very high throughput</strong> for both writes and reads</li>
+<li><strong>Low latency and predictable resource usage</strong> thanks to the Rust compiled language (no GC)</li>
+<li><strong>Users authentication and authorization</strong> with granular permissions and PAT (Personal Access Tokens)</li>
+<li>Support for multiple streams, topics and partitions</li>
+<li>Support for <strong>multiple transport protocols</strong> (QUIC, TCP, HTTP)</li>
+<li>Fully operational RESTful API which can be optionally enabled</li>
+<li>Available client SDK in multiple languages</li>
+<li><strong>Works directly with the binary data</strong> (lack of enforced schema and serialization/deserialization)</li>
+<li>Configurable server features (e.g. caching, segment size, data flush interval, transport protocols etc.)</li>
+<li>Possibility of storing the <strong>consumer offsets</strong> on the server</li>
+<li>Multiple ways of polling the messages:<!-- -->
+<ul>
+<li>By offset (using the indexes)</li>
+<li>By timestamp (using the time indexes)</li>
+<li>First/Last N messages</li>
+<li>Next N messages for the specific consumer</li>
+</ul>
+</li>
+<li>Possibility of <strong>auto committing the offset</strong> (e.g. to achieve <em>at-most-once</em> delivery)</li>
+<li><strong>Consumer groups</strong> providing the message ordering and horizontal scaling across the connected clients</li>
+<li><strong>Message expiry</strong> with auto deletion based on the configurable <strong>retention policy</strong></li>
+<li>Additional features such as <strong>server side message deduplication</strong></li>
+<li><strong>TLS</strong> support for all transport protocols (TCP, QUIC, HTTPS)</li>
+<li>Optional server-side as well as client-side <strong>data encryption</strong> using AES-256-GCM</li>
+<li>Optional metadata support in the form of <strong>message headers</strong></li>
+<li>Built-in <strong>CLI</strong> to manage the streaming server</li>
+<li>Built-in <strong>benchmarking app</strong> to test the performance</li>
+<li><strong>Single binary deployment</strong> (no external dependencies)</li>
+<li>Running as a single node (no cluster support yet)</li>
+</ul>
+<p>And as already mentioned, we&#x27;ve been working on SDKs for the multiple programming languages:</p>
+<ul>
+<li><a href="https://crates.io/crates/iggy" target="_blank" rel="noopener noreferrer">Rust</a></li>
+<li><a href="https://github.com/iggy-rs/iggy-dotnet-client" target="_blank" rel="noopener noreferrer">C#</a></li>
+<li><a href="https://github.com/iggy-rs/iggy-go-client" target="_blank" rel="noopener noreferrer">Go</a></li>
+<li><a href="https://github.com/iggy-rs/iggy-node-client" target="_blank" rel="noopener noreferrer">Node</a></li>
+<li><a href="https://github.com/iggy-rs/iggy-python-client" target="_blank" rel="noopener noreferrer">Python</a></li>
+<li><a href="https://github.com/iggy-rs/iggy-java-client" target="_blank" rel="noopener noreferrer">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&#x27;s API and the underlying TCP/UDP stack with custom serialization to be implemented from the scratch (except for HTTP transport, that&#x27;s the easier one), I&#x27;d say we&#x27;re doing quite ok, and I can&#x27;t str [...]
+<p>But wait, there&#x27;s even more - what would be a message streaming platform without some additional tooling for managing it? We&#x27;ve also been developing the <strong><a href="https://github.com/iggy-rs/iggy/tree/master/cmd" target="_blank" rel="noopener noreferrer">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">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&#x27;ve got a fully-featured <a href="https://github.com/iggy-rs/iggy/actions" target="_blank" rel="noopener noreferrer">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">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&#x27;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&#x27;s discuss the roadmap.</p>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="roadmap">Roadmap<a href="#roadmap" class="hash-link" aria-label="Direct link to Roadmap" title="Direct link to Roadmap">​</a></h2>
+<p>After gaining some traction a few months ago (mostly due to landing on the GitHub trending page in July), we&#x27;ve talked to some users potentially interested in making Iggy part of their infrastructure (there&#x27;s even one <a href="https://neferdata.com" target="_blank" rel="noopener noreferrer">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&#x27;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 additonal 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&#x27;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&#x27;s still (potentially a huge) room for improvement. We&#x27;re planning to use <strong><a href="https://unixism.net/loti/what_is_io_uring.html" target="_blank" rel="noopener noreferrer">io_uring</a></strong> for all I/O operations (disk or network related). The brand new, completion based API (available in the r [...]
+<p><strong>Thread-per-core</strong> - in order to avoid the rather costly context switches due to the usage of synchronization mechanism when accessing the data from the different threads (e.g. via Tokio&#x27;s work stealing mechanism), we&#x27;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 anchorWithStickyNavbar_LWe7" id="future">Future<a href="#future" class="hash-link" aria-label="Direct link to Future" title="Direct link to Future">​</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&#x27;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&#x27;re already excited enough to challenge ourselves</strong>. We&#x27;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://iggy.rs/discord" target="_blank" rel="noopener noreferrer">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">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></a><a cla [...]
+<div>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div>
+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 000000000..b85cd8ab0
--- /dev/null
+++ b/blogs/2024/05/29/one-year-of-building-the-message-streaming/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.7.0">
+<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="stylesheet" href="/assets/css/styles.db211002.css">
+<script src="/assets/js/runtime~main.b0a22bcd.js" defer="defer"></script>
+<script src="/assets/js/main.f5453fd5.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const n=new URLSearchParams(window.location.search).entries();for(var[t,e]of n)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentEle [...]
+<p><strong>It&#x27;s been a little over a year</strong>, since the <a href="https://iggy.rs" target="_blank" rel="noopener noreferrer">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&#x27;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">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">Hacker News</a>, which I do believe were the two main reas [...]
+<p>And although it may seem as if the project development has recently slowed down a bit, I&#x27;d say it&#x27;s quite the opposite — let me quickly summary, what we&#x27;ve achieved so far during the last few months and what we&#x27;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 anchorWithStickyNavbar_LWe7" id="community">Community<a href="#community" class="hash-link" aria-label="Direct link to Community" title="Direct link to Community">​</a></h2>
+<p>First and foremost, if it weren&#x27;t for the community, we wouldn&#x27;t have seen such an enormous growth of the Iggy&#x27;s ecosystem — we&#x27;ve received the dozens of pull requests and there&#x27;s ~250 members on our <a href="https://iggy.rs/discord" target="_blank" rel="noopener noreferrer">Discord</a>. Whether we talk about bug fixes, improvements, new features, or just sharing the experiences and discussing potential ideas — it&#x27;s all equally important.</p>
+<p>And it&#x27;s been even more than that — we&#x27;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&#x27;s expected, as the project is still evolving, and it&#x27;s not an easy task, to come up with a great development experience from the very beginning.</p>
+<ul>
+<li><a href="https://github.com/iggy-rs/iggy" target="_blank" rel="noopener noreferrer">Rust</a></li>
+<li><a href="https://github.com/iggy-rs/iggy-dotnet-client" target="_blank" rel="noopener noreferrer">C#</a></li>
+<li><a href="https://github.com/iggy-rs/iggy-cpp-client" target="_blank" rel="noopener noreferrer">C++</a></li>
+<li><a href="https://github.com/iggy-rs/iggy-node-client" target="_blank" rel="noopener noreferrer">Node (TS)</a></li>
+<li><a href="https://github.com/iggy-rs/iggy-go-client" target="_blank" rel="noopener noreferrer">Go</a></li>
+<li><a href="https://github.com/iggy-rs/iggy-python-client" target="_blank" rel="noopener noreferrer">Python</a></li>
+<li><a href="https://github.com/iggy-rs/iggy-java-client" target="_blank" rel="noopener noreferrer">Java</a></li>
+<li><a href="https://github.com/iggy-rs/iggy-elixir-client" target="_blank" rel="noopener noreferrer">Elixir</a></li>
+</ul>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="changelog">Changelog<a href="#changelog" class="hash-link" aria-label="Direct link to Changelog" title="Direct link to Changelog">​</a></h2>
+<p>Adding the brand new SDKs wasn&#x27;t the only great thing that has happened during last few months. We&#x27;ve also made quite a lot of improvements for the streaming server itself:</p>
+<ul>
+<li>Increased the streaming server throughput by over 30% for both writes and reads</li>
+<li>Added messages compression for client-side &amp; server-side supporting the different algorithms</li>
+<li>Implemented a new way of message batching with an additional tooling for data migration</li>
+<li>Fixed the possible server-side deadlock that could happen for a specific configuration</li>
+<li>Fixed issues with possible memory leaks when storing too many indices in memory</li>
+<li>Rebuilt our custom benchmarking tool</li>
+<li>Improved TCP connection handling</li>
+<li>Constantly upgrading our CI/CD with lots of testing, different runtimes, artifacts, crates and Docker images releases</li>
+<li>Refactored the existing Rust client SDK to follow the new conventions (without the breaking changes to the previous one)</li>
+</ul>
+<p>And at the same time, we&#x27;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 anchorWithStickyNavbar_LWe7" id="tooling">Tooling<a href="#tooling" class="hash-link" aria-label="Direct link to Tooling" title="Direct link to Tooling">​</a></h2>
+<p>The core message streaming server and multiple SDKs might sound as the most important parts of the whole ecosystem, but let&#x27;s not forget about the <strong>management tools</strong>. How to quickly connect to the 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/iggy-rs/iggy/tree/master/cli" target="_blank" rel="noopener noreferrer">CLI</a> and <a href="https://github.com/iggy-rs/iggy-web-ui" target="_blank" rel="noopener noreferrer">Web UI</a> come in handy</strong>. If you&#x27;re a fan of working with the terminal and used to the great developer experience, you&#x27;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&#x27;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/iggy-rs/iggy/tree/master/bench" target="_blank" rel="noopener noreferrer">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 anchorWithStickyNavbar_LWe7" 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">​</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&#x27;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&#x27;m fully aware that it&#x27;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/iggy-rs/iggy/issues/606" target="_blank" rel="noopener noreferrer">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&#x27;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&#x27;m not saying that we&#x27;re better than X or Y — I&#x27;m simply stating that for some specific usages, we might be a better choice than X or Y.</p>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="clustering--replication">Clustering &amp; replication<a href="#clustering--replication" class="hash-link" aria-label="Direct link to Clustering &amp; replication" title="Direct link to Clustering &amp; replication">​</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&#x27;ve already built its basic version in the <a href="https://github.com/iggy-rs/iggy-cluster-sandbox" target="_blank" rel="noopener noreferrer">sandbox repository</a>. In order to achieve that, we&#x27;ve decided to (at least for now) stick to the <a href="https://raft.github.io" target="_blank" rel="noopener noreferrer">Raft</a> consensus algorithm. However, adding the data replication feature to the [...]
+<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 anchorWithStickyNavbar_LWe7" id="io_uring--thread-per-core--share-nothing">io_uring &amp; thread-per-core + share-nothing<a href="#io_uring--thread-per-core--share-nothing" class="hash-link" aria-label="Direct link to io_uring &amp; thread-per-core + share-nothing" title="Direct link to io_uring &amp; thread-per-core + share-nothing">​</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&#x27;s mostly I/O (disk + networking)</strong> — the more efficient you can make it, the greater it will be. Of course, there&#x27;s a major difference between throughput and latency, especially when talking about the so-called tail latency (p99 and more). Wouldn&#x27;t it be great if we  [...]
+<p>However, due to the nature of tasks being shared across the different threads, <strong>you can&#x27;t simply avoid lots of context switches and data being shared &amp; synchronized across these threads</strong> (therefore even more context switches will occur). While it&#x27;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">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&#x27;ve decided to <strong>experiment with <a href="https://unixism.net/loti/what_is_io_uring.html" target="_blank" rel="noopener noreferrer">io_uring</a> to maximize the I/O performance</strong> (and at the same time vastly reduce the need of context switches), and at the same time utilize <strong>thread-per-core architecture</strong>, where <strong>each thread is pinned to the CPU core</strong>, thus keeping the data locally, without the need of sharing it with the other threads  [...]
+<p>And just recently, we&#x27;ve established yet another <a href="https://github.com/iggy-rs/iggy-thread-per-core-sandbox" target="_blank" rel="noopener noreferrer">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&#x27;ve got a very simple prototype in place, but there&#x27;s still lots to be done, especially when thinking of:</p>
+<ul>
+<li>How to evenly split partitions (the unit of data parallelism) between multiple cores?</li>
+<li>How to efficiently rewrite existing server metadata heavily relying on synchronized data with <code>Arc&lt;&gt;</code> and <code>RwLock&lt;&gt;</code>?</li>
+<li>Should we load into memory the same server metadata across all the threads (separately from each other) and notify all of them when something changes?</li>
+<li>Should there be single or multiple threads handling the incoming TCP connections?</li>
+<li>When <code>Thread #1</code> receives the request, which has to access the partition from <code>Thread #2</code>, should we use an async two-way channel (remember, no explicit locking and data synchronization between the threads) or maybe just send the descriptor using a one-way channel to the second thread to complete the request?</li>
+<li>What and when could become a bottleneck in such architecture?</li>
+</ul>
+<p>This is just the tip of an iceberg, and we&#x27;ve already started <a href="https://penberg.org/papers/tpc-ancs19.pdf" target="_blank" rel="noopener noreferrer">studying</a> some of the existing solutions out there, including <a href="https://seastar.io" target="_blank" rel="noopener noreferrer">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 anchorWithStickyNavbar_LWe7" 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">​</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&#x27;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&#x27;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&#x27;ll do our best to make it as seamless upgrade as possible — and once we achieve that, it means, we&#x27;re getting very close to the version 1.0.</p>
+<p>For the time being, if you&#x27;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://iggy.rs/discord" target="_blank" rel="noopener noreferrer">Discord</a> — <strong>your opinion is really important to us and we respect it no matter what</strong>.</p>
+<p>It&#x27;s been a very productive year for our core team (we&#x27;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&#x27;ve got the fundamentals right, now it&#x27;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>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div>
+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 000000000..ff846e555
--- /dev/null
+++ b/blogs/2024/10/28/technology-radar-and-currrent-goals/index.html
@@ -0,0 +1,57 @@
+<!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.7.0">
+<title data-rh="true">Iggy.rs - Technology Radar &amp; 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="stylesheet" href="/assets/css/styles.db211002.css">
+<script src="/assets/js/runtime~main.b0a22bcd.js" defer="defer"></script>
+<script src="/assets/js/main.f5453fd5.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const n=new URLSearchParams(window.location.search).entries();for(var[t,e]of n)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentEle [...]
+<p>Quite recently (a few days ago), <a href="https://github.com/iggy-rs/iggy" target="_blank" rel="noopener noreferrer">Iggy</a> has been listed on <a href="https://www.thoughtworks.com/radar/platforms/summary/iggy" target="_blank" rel="noopener noreferrer">Technology Radar</a> by <a href="https://www.thoughtworks.com/" target="_blank" rel="noopener noreferrer">Thoughtworks</a> - a well-known technology consulting company.</p>
+<p>If you&#x27;re not familiar with the Technology Radar, it&#x27;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 &amp; 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">FoundationDB</a>) - being the projects which are worth exploring &amp; understanding how they might affect your enterprise. Frankly speaking, we weren&#x27;t expecting this at all, and <strong>from our perspective, it&#x27;s quite of an accomplishment</strong>.</p>
+<p>Besides gaining an additional amount of trust &amp; recognition, it has led us to another conclusion - someone out there we don&#x27;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://iggy.rs/discord" target="_blank" rel="noopener noreferrer">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">OSS community</a> building the core streaming server &amp; SDKs in multiple programming languages, it&#x27;s worth mentioning what are the current goals for Iggy.</p>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" 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">​</a></h2>
+<h3 class="anchor anchorWithStickyNavbar_LWe7" id="replication">Replication<a href="#replication" class="hash-link" aria-label="Direct link to Replication" title="Direct link to Replication">​</a></h3>
+<p>Without a doubt, being able to run your infrastructure (which processes &amp; stores the data) as a cluster, gives much more confidence and greatly impacts the overall reliability.</p>
+<p>We&#x27;ve started <a href="https://github.com/iggy-rs/iggy-cluster-sandbox" target="_blank" rel="noopener noreferrer">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&#x27;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">revisited form</a>), which was successfully used by e.g. <a href="https://tigerbeetle.com/" target="_blank" rel="noopener noreferrer">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&#x27;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 anchorWithStickyNavbar_LWe7" 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">​</a></h3>
+<p>A few months ago, we did <a href="https://github.com/iggy-rs/iggy/pull/1053" target="_blank" rel="noopener noreferrer">implement</a> an optional archiver for the server state log &amp; 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_biex"><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 plain">[data_maintenance.archiver]</span><br></span><span class="token-line" style="color:#393A34" [...]
+<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&#x27;s one catch - in order to read the data stored with S3, you&#x27;d need to download it from the cloud and restart your server. And this is where things will change in the future - we&#x27;re planning to implement a dedicated S3 storage, for both, writing and reading the data in real-time [...]
+<ul>
+<li><strong>L1</strong> - data available directly from the server RAM (super fast writes/reads)</li>
+<li><strong>L2</strong> - data stored on your servers disks (still very, very fast with NVME SSD gen4 or 5)</li>
+<li><strong>L3</strong> - S3 storage, still fast for the typical use-cases which do not require a very stable, microsecond level latencies</li>
+</ul>
+<p><strong>Each of these storage layers could be optionally enabled or disabled</strong>. You can already decide if and how much memory to use for caching the messages. With S3 tiered storage in place, you could e.g. treat your server&#x27;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&#x27;s RAM &amp; 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">Quickwit</a>).</p>
+<h3 class="anchor anchorWithStickyNavbar_LWe7" id="opentelemetry">OpenTelemetry<a href="#opentelemetry" class="hash-link" aria-label="Direct link to OpenTelemetry" title="Direct link to OpenTelemetry">​</a></h3>
+<p>Speaking of the Quickwit, we&#x27;ve also <a href="https://github.com/iggy-rs/iggy/pull/1294" target="_blank" rel="noopener noreferrer">implemented</a> a support for <a href="https://opentelemetry.io/" target="_blank" rel="noopener noreferrer">OpenTelemetry</a> logs &amp; traces for the server. Since our SDK already uses the logging &amp; tracing libraries, we thought that adding such a feature on the server, could help you gain even better, real-time observability into what&#x27;s ha [...]
+<div class="language-toml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><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 plain"># OpenTelemetry configuration</span><br></span><span class="token-line" style="color:#393A3 [...]
+<p><strong>And just like with S3 storage, it&#x27;s merely a beginning</strong> - one of the members on our <a href="https://iggy.rs/discord" target="_blank" rel="noopener noreferrer">Discord</a> had already thought of extending this implementation by <strong>propagating the trace context</strong> (via existing message headers metadata) between the clients &amp; server in order to get full understanding of the distributed systems and its dependencies, which could be further visualized by [...]
+<h3 class="anchor anchorWithStickyNavbar_LWe7" id="optimizations">Optimizations<a href="#optimizations" class="hash-link" aria-label="Direct link to Optimizations" title="Direct link to Optimizations">​</a></h3>
+<p>Improved messages batching, keeping the indexes &amp; 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">rkyv</a> for <strong>zero-copy (de)serialization</strong>, keeping open the file descriptors and lots of other minor improvements - all these low hanging fruits (or at least some of them), will hopefully build up to making Ig [...]
+<p><strong>To start the Iggy server, you just need to wait for a few milliseconds, and the RAM consumption is within a range ~20 MB, which is already over an order of magnitude lower than when compared to Kafka.</strong></p>
+<p><img decoding="async" loading="lazy" alt="image" src="/assets/images/iggy_docker-37b72ad9d9a244e1464c94f03c162193.png" width="2558" height="1375" class="img_ev3q"></p>
+<h3 class="anchor anchorWithStickyNavbar_LWe7" 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">​</a></h3>
+<p>This will certainly require to have its own blog post, as there&#x27;s so much to talk about. We did experiment with <a href="https://github.com/bytedance/monoio" target="_blank" rel="noopener noreferrer">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="no [...]
+<p>Yes, at this point you might call us crazy (<strong>io_uring</strong> won&#x27;t happen before we release the first version of the VSR clustering anyway), but if you want to tick all the possible boxes, it&#x27;s hard to find a generic framework that will meet your demands, especially when mixed altogether with VSR clustering, thread-per-core &amp; 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&#x27;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>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div>
+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 000000000..0fc5c0fc5
--- /dev/null
+++ b/blogs/2025/02/10/apache-incubator/index.html
@@ -0,0 +1,31 @@
+<!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.7.0">
+<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="stylesheet" href="/assets/css/styles.db211002.css">
+<script src="/assets/js/runtime~main.b0a22bcd.js" defer="defer"></script>
+<script src="/assets/js/main.f5453fd5.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const n=new URLSearchParams(window.location.search).entries();for(var[t,e]of n)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentEle [...]
+<p>We&#x27;re extremely excited to announce that Iggy has been accepted into the <a href="https://incubator.apache.org" target="_blank" rel="noopener noreferrer">Apache Incubator</a> program! Since the very first day, <strong>Iggy was always meant to be a truly FOSS project</strong>, and we&#x27;re thrilled to see it being recognized by the Apache Software Foundation (ASF). This is a huge milestone for us, and we&#x27;re looking forward to the journey ahead.</p>
+<p>Here you can find the <a href="https://cwiki.apache.org/confluence/display/INCUBATOR/Iggy+Proposal" target="_blank" rel="noopener noreferrer">official proposal</a>, along with the <a href="https://lists.apache.org/thread/q9whr3q9qd6wqm89f0vc1f6vkkvzc8xf" target="_blank" rel="noopener noreferrer">discussion</a> and the <a href="https://lists.apache.org/thread/6zfgdjwrzs92h4z4x6b25v1r23g3f5yg" target="_blank" rel="noopener noreferrer">voting results</a>.</p>
+<p>It&#x27;s been almost 2 years now since the very first line of code was written, and we&#x27;ve come a long way since the initial release. We&#x27;ve managed to build an amazing community around Iggy, and we&#x27;re grateful for all the contributions and feedback we&#x27;ve received. We&#x27;re confident that this move will help us grow even further and make Iggy even better.</p>
+<p>What&#x27;s also worth mentioning is that it&#x27;s not just about the core Iggy repository anymore, but also about the <a href="https://github.com/iggy-rs/" target="_blank" rel="noopener noreferrer">ecosystem</a> around it such as SDKs, CLIs, Web UIs, and more - we&#x27;re already close to 20 repositories in total, and we want to ensure that all of them are following the ASF guidelines.</p>
+<p>We&#x27;ll do our best to make Iggy the TLP (Top-Level Project) in the future, as we already have a lot of ideas on how to improve the project and the community around it.</p>
+<p><strong>The future of message streaming is with Iggy, and we want to make sure that everyone can benefit from it as Free and Open Source Software, that will stay this way forever.</strong></p>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" 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">​</a></h2>
+<p>After the recent <a href="https://lists.apache.org/thread/zrn96nlg23r9353lr5tp2by2ggx4zxqc" target="_blank" rel="noopener noreferrer">discussion</a>, we plan to stick to the <strong>monorepo approach</strong>, under which, we will have a single repository for all the Iggy-related projects. This will make it easier for the contributors to navigate through the codebase, and to see how the changes in one project affect the others. This should also help us to keep the consistency across t [...]
+<p>All the repositories under <a href="https://github.com/iggy-rs" target="_blank" rel="noopener noreferrer">iggy-rs</a> will be eventually moved to the <a href="https://github.com/apache/iggy" target="_blank" rel="noopener noreferrer">apache/iggy</a> repository, and we will make sure that all the existing links and references are updated accordingly.</p>
+<p>We&#x27;ll also host our website under the <a href="https://iggy.apache.org" target="_blank" rel="noopener noreferrer">iggy.apache.org</a> domain, including the documentation, blog, and the upcoming benchmarks. We&#x27;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&#x27;re using, but we&#x27;ll make sure to keep you updated on that.</p>
+<p><strong>Last but not least, we&#x27;ve got a new logo</strong>! Our lovely Italian Greyhound is now a part of the Apache family, and we&#x27;re proud to have it as our mascot. As you can see, it&#x27;s so fast, that even the light travelling through the optical can&#x27;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></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/12/transparent-benchmarks"><div class="pagination-nav__sublabel">Newer post</div><div class="pagination-nav__label">Iggy and the Transparent Ben [...]
+<div>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div>
+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/12/transparent-benchmarks/index.html b/blogs/2025/02/12/transparent-benchmarks/index.html
new file mode 100644
index 000000000..fcc8e5be2
--- /dev/null
+++ b/blogs/2025/02/12/transparent-benchmarks/index.html
@@ -0,0 +1,36 @@
+<!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.7.0">
+<title data-rh="true">Iggy and the Transparent Benchmarks | 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"><me [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed"><link rel="stylesheet" href="/assets/css/styles.db211002.css">
+<script src="/assets/js/runtime~main.b0a22bcd.js" defer="defer"></script>
+<script src="/assets/js/main.f5453fd5.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const n=new URLSearchParams(window.location.search).entries();for(var[t,e]of n)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentEle [...]
+<p>In the world of software development, <strong>benchmarks are often treated as a second-class citizen</strong>. They&#x27;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&#x27;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&#x27;re interested in. It&#x27;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/iggy-rs/iggy/" target="_blank" rel="noopener noreferrer">Iggy</a>, we&#x27;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 anchorWithStickyNavbar_LWe7" 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">​</a></h2>
+<p><strong>And today, we&#x27;re proud to present <a href="https://benchmarks.iggy.rs/" target="_blank" rel="noopener noreferrer">benchmarks.iggy.rs</a></strong> - a benchmarking dashboard, which is available to everyone. It&#x27;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. Simply run the <code>iggy-bench</code> tool, and submit the results to our <a href="https://github.com/iggy-rs/iggy-bench-dashboard/" target="_blank" rel="noopener noreferrer">iggy-bench-dashboard</a>, which is of course, an open-source project as well.
+Please check the current readme for the instructions on how to submit the results.</p>
+<p><img decoding="async" loading="lazy" alt="image" src="/assets/images/iggy_bench_dashboard-3f67adf8dfda89c5280aa2e90842b5ff.png" width="4090" height="2354" 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&#x27;re looking forward to your feedback, and we hope you&#x27;ll enjoy the benchmarks.</p>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" 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">​</a></h2>
+<p><strong>And as a cherry on top, we&#x27;ve recently managed to achieve the sub-millisecond write latency</strong>. This is a huge milestone for us, as it&#x27;s a proof that Iggy can be used in low-latency applications, where speed is crucial. Lately, we&#x27;ve been experimenting a lot with <a href="https://github.com/rkyv/rkyv" target="_blank" rel="noopener noreferrer">rkyv</a> - zero-copy deserialization framework, which has yielded some great results. Keep in mind that streaming t [...]
+<p>And the best part is that we&#x27;re just getting started. We&#x27;re looking forward to pushing the limits even further, and to see how far we can go. There&#x27;s still tons of optimizations coming, including switching the runtime to the <a href="https://github.com/bytedance/monoio" target="_blank" rel="noopener noreferrer">monoio</a> which does support <strong>io_uring</strong>, and we&#x27;ve experienced superb results with this one on our experimental branch. Then, there&#x27;s t [...]
+<div>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div>
+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 000000000..4b035a090
--- /dev/null
+++ b/blogs/archive/index.html
@@ -0,0 +1,18 @@
+<!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.7.0">
+<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="stylesheet" href="/assets/css/styles.db211002.css">
+<script src="/assets/js/runtime~main.b0a22bcd.js" defer="defer"></script>
+<script src="/assets/js/main.f5453fd5.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const n=new URLSearchParams(window.location.search).entries();for(var[t,e]of n)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentEle [...]
+<div>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div>
+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.xml b/blogs/atom.xml
new file mode 100644
index 000000000..8d4504255
--- /dev/null
+++ b/blogs/atom.xml
@@ -0,0 +1,628 @@
+<?xml version="1.0" encoding="utf-8"?>
+<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-02-12T00: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.ico</icon>
+    <entry>
+        <title type="html"><![CDATA[Iggy and the Transparent Benchmarks]]></title>
+        <id>https://iggy.apache.org/blogs/2025/02/12/transparent-benchmarks</id>
+        <link href="https://iggy.apache.org/blogs/2025/02/12/transparent-benchmarks"/>
+        <updated>2025-02-12T00:00:00.000Z</updated>
+        <summary type="html"><![CDATA[Benchmarks should be the first-class citizen]]></summary>
+        <content type="html"><![CDATA[<h2 class="anchor anchorWithStickyNavbar_LWe7" id="benchmarks-should-be-the-first-class-citizen">Benchmarks should be the first-class citizen<a href="https://iggy.apache.org/blogs/2025/02/12/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">​</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/iggy-rs/iggy/" target="_blank" rel="noopener noreferrer">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 anchorWithStickyNavbar_LWe7" id="iggy-benchmarking-dashboard">Iggy benchmarking dashboard<a href="https://iggy.apache.org/blogs/2025/02/12/transparent-benchmarks#iggy-benchmarking-dashboard" class="hash-link" aria-label="Direct link to Iggy benchmarking dashboard" title="Direct link to Iggy benchmarking dashboard">​</a></h2>
+<p><strong>And today, we're proud to present <a href="https://benchmarks.iggy.rs/" target="_blank" rel="noopener noreferrer">benchmarks.iggy.rs</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. Simply run the <code>iggy-bench</code> tool, and submit the results to our <a href="https://github.com/iggy-rs/iggy-bench-dashboard/" target="_blank" rel="noopener noreferrer">iggy-bench-dashboard</a>, which is of course, an open-source project as well.
+Please check the current readme for the instructions on how to submit the results.</p>
+<p><img decoding="async" loading="lazy" alt="image" src="https://iggy.apache.org/assets/images/iggy_bench_dashboard-3f67adf8dfda89c5280aa2e90842b5ff.png" width="4090" height="2354" 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 anchorWithStickyNavbar_LWe7" id="towards-the-microsecond-latency">Towards the microsecond latency<a href="https://iggy.apache.org/blogs/2025/02/12/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">​</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">rkyv</a> - zero-copy deserialization framework, which has yielded some great results. Keep in mind that streaming the data within  [...]
+<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">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 of share [...]
+        <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[Apache Incubation]]></summary>
+        <content type="html"><![CDATA[<h2 class="anchor anchorWithStickyNavbar_LWe7" id="apache-incubation">Apache Incubation<a href="https://iggy.apache.org/blogs/2025/02/10/apache-incubator#apache-incubation" class="hash-link" aria-label="Direct link to Apache Incubation" title="Direct link to Apache Incubation">​</a></h2>
+<p>We're extremely excited to announce that Iggy has been accepted into the <a href="https://incubator.apache.org/" target="_blank" rel="noopener noreferrer">Apache Incubator</a> program! Since the very first day, <strong>Iggy was always meant to be a truly FOSS project</strong>, and we're thrilled to see it being recognized by the Apache Software Foundation (ASF). This is a huge milestone for us, and we're looking forward to the journey ahead.</p>
+<p>Here you can find the <a href="https://cwiki.apache.org/confluence/display/INCUBATOR/Iggy+Proposal" target="_blank" rel="noopener noreferrer">official proposal</a>, along with the <a href="https://lists.apache.org/thread/q9whr3q9qd6wqm89f0vc1f6vkkvzc8xf" target="_blank" rel="noopener noreferrer">discussion</a> and the <a href="https://lists.apache.org/thread/6zfgdjwrzs92h4z4x6b25v1r23g3f5yg" target="_blank" rel="noopener noreferrer">voting results</a>.</p>
+<p>It's been almost 2 years now since the very first line of code was written, and we've come a long way since the initial release. We've managed to build an amazing community around Iggy, and we're grateful for all the contributions and feedback we've received. We're confident that this move will help us grow even further and make Iggy even better.</p>
+<p>What's also worth mentioning is that it's not just about the core Iggy repository anymore, but also about the <a href="https://github.com/iggy-rs/" target="_blank" rel="noopener noreferrer">ecosystem</a> around it such as SDKs, CLIs, Web UIs, and more - we're already close to 20 repositories in total, and we want to ensure that all of them are following the ASF guidelines.</p>
+<p>We'll do our best to make Iggy the TLP (Top-Level Project) in the future, as we already have a lot of ideas on how to improve the project and the community around it.</p>
+<p><strong>The future of message streaming is with Iggy, and we want to make sure that everyone can benefit from it as Free and Open Source Software, that will stay this way forever.</strong></p>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" 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">​</a></h2>
+<p>After the recent <a href="https://lists.apache.org/thread/zrn96nlg23r9353lr5tp2by2ggx4zxqc" target="_blank" rel="noopener noreferrer">discussion</a>, we plan to stick to the <strong>monorepo approach</strong>, under which, we will have a single repository for all the Iggy-related projects. This will make it easier for the contributors to navigate through the codebase, and to see how the changes in one project affect the others. This should also help us to keep the consistency across t [...]
+<p>All the repositories under <a href="https://github.com/iggy-rs" target="_blank" rel="noopener noreferrer">iggy-rs</a> will be eventually moved to the <a href="https://github.com/apache/iggy" target="_blank" rel="noopener noreferrer">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">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>
+<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 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>]]></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 anchorWithStickyNavbar_LWe7" 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">​</a></h2>
+<p>Quite recently (a few days ago), <a href="https://github.com/iggy-rs/iggy" target="_blank" rel="noopener noreferrer">Iggy</a> has been listed on <a href="https://www.thoughtworks.com/radar/platforms/summary/iggy" target="_blank" rel="noopener noreferrer">Technology Radar</a> by <a href="https://www.thoughtworks.com/" target="_blank" rel="noopener noreferrer">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 &amp; 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">FoundationDB</a>) - being the projects which are worth exploring &amp; 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 &amp; 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://iggy.rs/discord" target="_blank" rel="noopener noreferrer">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">OSS community</a> building the core streaming server &amp; SDKs in multiple programming languages, it's worth mentioning what are the current goals for Iggy.</p>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" 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">​</a></h2>
+<h3 class="anchor anchorWithStickyNavbar_LWe7" 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">​</a></h3>
+<p>Without a doubt, being able to run your infrastructure (which processes &amp; 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">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">revisited form</a>), which was successfully used by e.g. <a href="https://tigerbeetle.com/" target="_blank" rel="noopener noreferrer">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 anchorWithStickyNavbar_LWe7" 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">​</a></h3>
+<p>A few months ago, we did <a href="https://github.com/iggy-rs/iggy/pull/1053" target="_blank" rel="noopener noreferrer">implement</a> an optional archiver for the server state log &amp; 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_biex"><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 plain">[data_maintenance.archiver]</span><br></span><span class="token-line" style="color:#393A34" [...]
+<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><strong>L1</strong> - data available directly from the server RAM (super fast writes/reads)</li>
+<li><strong>L2</strong> - data stored on your servers disks (still very, very fast with NVME SSD gen4 or 5)</li>
+<li><strong>L3</strong> - S3 storage, still fast for the typical use-cases which do not require a very stable, microsecond level latencies</li>
+</ul>
+<p><strong>Each of these storage layers could be optionally enabled or disabled</strong>. You can already decide if and how much memory to use for caching the messages. With S3 tiered storage in place, you could e.g. treat your server's SSD as a sort of ring buffer for keeping the most recent data (easily millions or billions of messages, depending on their size) and only fetch the ones from S3, when you need something very old.</p>
+<p>Or, you could just ignore your server's RAM &amp; 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">Quickwit</a>).</p>
+<h3 class="anchor anchorWithStickyNavbar_LWe7" 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">​</a></h3>
+<p>Speaking of the Quickwit, we've also <a href="https://github.com/iggy-rs/iggy/pull/1294" target="_blank" rel="noopener noreferrer">implemented</a> a support for <a href="https://opentelemetry.io/" target="_blank" rel="noopener noreferrer">OpenTelemetry</a> logs &amp; traces for the server. Since our SDK already uses the logging &amp; tracing libraries, we thought that adding such a feature on the server, could help you gain even better, real-time observability into what's happening un [...]
+<div class="language-toml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><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 plain"># OpenTelemetry configuration</span><br></span><span class="token-line" style="color:#393A3 [...]
+<p><strong>And just like with S3 storage, it's merely a beginning</strong> - one of the members on our <a href="https://iggy.rs/discord" target="_blank" rel="noopener noreferrer">Discord</a> had already thought of extending this implementation by <strong>propagating the trace context</strong> (via existing message headers metadata) between the clients &amp; server in order to get full understanding of the distributed systems and its dependencies, which could be further visualized by tool [...]
+<h3 class="anchor anchorWithStickyNavbar_LWe7" 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">​</a></h3>
+<p>Improved messages batching, keeping the indexes &amp; 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">rkyv</a> for <strong>zero-copy (de)serialization</strong>, keeping open the file descriptors and lots of other minor improvements - all these low hanging fruits (or at least some of them), will hopefully build up to making Ig [...]
+<p><strong>To start the Iggy server, you just need to wait for a few milliseconds, and the RAM consumption is within a range ~20 MB, which is already over an order of magnitude lower than when compared to Kafka.</strong></p>
+<p><img 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 anchorWithStickyNavbar_LWe7" 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">​</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">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="noopene [...]
+<p>Yes, at this point you might call us crazy (<strong>io_uring</strong> won't happen before we release the first version of the VSR clustering anyway), but if you want to tick all the possible boxes, it's hard to find a generic framework that will meet your demands, especially when mixed altogether with VSR clustering, thread-per-core &amp; 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 anchorWithStickyNavbar_LWe7" 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">​</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">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="_blank" rel [...]
+<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">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">Hacker News</a>, which I do believe were the two main reas [...]
+<p>And although it may seem as if the project development has recently slowed down a bit, I'd say it's quite the opposite — let me quickly summary, what we've achieved so far during the last few months and what we're focusing on now, as the future looks bright :)</p>
+<p><img 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 anchorWithStickyNavbar_LWe7" 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">​</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://iggy.rs/discord" target="_blank" rel="noopener noreferrer">Discord</a>. Whether we talk about bug fixes, improvements, new features, or just sharing the experiences and discussing potential ideas — it's all equally important.</p>
+<p>And it's been even more than that — we've seen our community members take on <strong>building the new SDKs</strong> in their favorite programming languages, fully on their own. Today, you can find the following list of supported SDKs for Iggy.rs — some of them could be lagging behind, but it's expected, as the project is still evolving, and it's not an easy task, to come up with a great development experience from the very beginning.</p>
+<ul>
+<li><a href="https://github.com/iggy-rs/iggy" target="_blank" rel="noopener noreferrer">Rust</a></li>
+<li><a href="https://github.com/iggy-rs/iggy-dotnet-client" target="_blank" rel="noopener noreferrer">C#</a></li>
+<li><a href="https://github.com/iggy-rs/iggy-cpp-client" target="_blank" rel="noopener noreferrer">C++</a></li>
+<li><a href="https://github.com/iggy-rs/iggy-node-client" target="_blank" rel="noopener noreferrer">Node (TS)</a></li>
+<li><a href="https://github.com/iggy-rs/iggy-go-client" target="_blank" rel="noopener noreferrer">Go</a></li>
+<li><a href="https://github.com/iggy-rs/iggy-python-client" target="_blank" rel="noopener noreferrer">Python</a></li>
+<li><a href="https://github.com/iggy-rs/iggy-java-client" target="_blank" rel="noopener noreferrer">Java</a></li>
+<li><a href="https://github.com/iggy-rs/iggy-elixir-client" target="_blank" rel="noopener noreferrer">Elixir</a></li>
+</ul>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" 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">​</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>Increased the streaming server throughput by over 30% for both writes and reads</li>
+<li>Added messages compression for client-side &amp; server-side supporting the different algorithms</li>
+<li>Implemented a new way of message batching with an additional tooling for data migration</li>
+<li>Fixed the possible server-side deadlock that could happen for a specific configuration</li>
+<li>Fixed issues with possible memory leaks when storing too many indices in memory</li>
+<li>Rebuilt our custom benchmarking tool</li>
+<li>Improved TCP connection handling</li>
+<li>Constantly upgrading our CI/CD with lots of testing, different runtimes, artifacts, crates and Docker images releases</li>
+<li>Refactored the existing Rust client SDK to follow the new conventions (without the breaking changes to the previous one)</li>
+</ul>
+<p>And at the same time, we've been experimenting a lot with some fancy stuff, which you can read about in the last paragraphs :)</p>
+<p><img 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 anchorWithStickyNavbar_LWe7" 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">​</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 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/iggy-rs/iggy/tree/master/cli" target="_blank" rel="noopener noreferrer">CLI</a> and <a href="https://github.com/iggy-rs/iggy-web-ui" target="_blank" rel="noopener noreferrer">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/iggy-rs/iggy/tree/master/bench" target="_blank" rel="noopener noreferrer">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 anchorWithStickyNavbar_LWe7" 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">​</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/iggy-rs/iggy/issues/606" target="_blank" rel="noopener noreferrer">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 anchorWithStickyNavbar_LWe7" id="clustering--replication">Clustering &amp; 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 &amp; replication" title="Direct link to Clustering &amp; replication">​</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">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">Raft</a> consensus algorithm. However, adding the data replication feature to the core Igg [...]
+<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 anchorWithStickyNavbar_LWe7" id="io_uring--thread-per-core--share-nothing">io_uring &amp; 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 &amp; thread-per-core + share-nothing" title="Direct link to io_uring &amp; thread-per-core + share-nothing">​</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 &amp; 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">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">io_uring</a> to maximize the I/O performance</strong> (and at the same time vastly reduce the need of context switches), and at the same time utilize <strong>thread-per-core architecture</strong>, where <strong>each thread is pinned to the CPU core</strong>, thus keeping the data locally, without the need of sharing it with the other threads (shar [...]
+<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">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>How to evenly split partitions (the unit of data parallelism) between multiple cores?</li>
+<li>How to efficiently rewrite existing server metadata heavily relying on synchronized data with <code>Arc&lt;&gt;</code> and <code>RwLock&lt;&gt;</code>?</li>
+<li>Should we load into memory the same server metadata across all the threads (separately from each other) and notify all of them when something changes?</li>
+<li>Should there be single or multiple threads handling the incoming TCP connections?</li>
+<li>When <code>Thread #1</code> receives the request, which has to access the partition from <code>Thread #2</code>, should we use an async two-way channel (remember, no explicit locking and data synchronization between the threads) or maybe just send the descriptor using a one-way channel to the second thread to complete the request?</li>
+<li>What and when could become a bottleneck in such architecture?</li>
+</ul>
+<p>This is just the tip of an iceberg, and we've already started <a href="https://penberg.org/papers/tpc-ancs19.pdf" target="_blank" rel="noopener noreferrer">studying</a> some of the existing solutions out there, including <a href="https://seastar.io/" target="_blank" rel="noopener noreferrer">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 anchorWithStickyNavbar_LWe7" 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">​</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://iggy.rs/discord" target="_blank" rel="noopener noreferrer">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 anchorWithStickyNavbar_LWe7" 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">​</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">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 using C# [...]
+<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">not the same</a> as regular message broker). The other reason (besides getting to know Rust) was to <strong>truly understand the internals of the messaging systems [...]
+<p>And this is how the <a href="https://iggy.rs/" target="_blank" rel="noopener noreferrer">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">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 anchorWithStickyNavbar_LWe7" 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">​</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">QUIC</a> protocol based on <a href="https://github.com/quinn-rs/quinn" target="_blank" rel="noopener noreferrer">Quinn</a> library. You could connect multiple applications into the server, and start exchanging the messages between them, simply by appending the data to the stream (from the producer perspect [...]
+<p>After spending a few weeks on building the initial version, and then another few weeks on rewriting its core part (yes, prototyping + validation repeated in a continuous loop worked quite well), I managed to implement the persistent streaming server being capable of parallel writes/reads to/from independent streams supporting many distinct apps connected into it. Simply put, one could easily have many applications, and even <strong>thousands of the streams</strong> (depending on how d [...]
+<p>On top of this, the support for <strong>TCP</strong> and <strong>HTTP</strong> protocols have been added. Under the hood, the typical architecture of streams, consisting of the topics being split into the partitions, which eventually operate on a raw file data using so-called segments has been implemented as well.</p>
+<p><img 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">bytes</a>, along with the <a href="https://tokio.rs/" target="_blank" rel="noopener noreferrer">Tokio</a> <strong>work stealing</strong> approach, yielded the great improvements [...]
+<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_biex"><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/iggy-rs/iggy/tree/master/bench" target="_blank" rel="noopener noreferrer">benchmarking purposes</a></strong>) and seeing the promising numbers (<strong>range of 2-6 GB/s for both, writes &amp; reads when processing millions of messages</strong>), I eventually decided to give it a long-term shot. Being fully aware that there's still lots to be done (speaking of many months, or even y [...]
+<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 anchorWithStickyNavbar_LWe7" 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">​</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 anchorWithStickyNavbar_LWe7" 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">​</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><strong>Highly performant</strong>, persistent append-only log for the message streaming</li>
+<li><strong>Very high throughput</strong> for both writes and reads</li>
+<li><strong>Low latency and predictable resource usage</strong> thanks to the Rust compiled language (no GC)</li>
+<li><strong>Users authentication and authorization</strong> with granular permissions and PAT (Personal Access Tokens)</li>
+<li>Support for multiple streams, topics and partitions</li>
+<li>Support for <strong>multiple transport protocols</strong> (QUIC, TCP, HTTP)</li>
+<li>Fully operational RESTful API which can be optionally enabled</li>
+<li>Available client SDK in multiple languages</li>
+<li><strong>Works directly with the binary data</strong> (lack of enforced schema and serialization/deserialization)</li>
+<li>Configurable server features (e.g. caching, segment size, data flush interval, transport protocols etc.)</li>
+<li>Possibility of storing the <strong>consumer offsets</strong> on the server</li>
+<li>Multiple ways of polling the messages:<!-- -->
+<ul>
+<li>By offset (using the indexes)</li>
+<li>By timestamp (using the time indexes)</li>
+<li>First/Last N messages</li>
+<li>Next N messages for the specific consumer</li>
+</ul>
+</li>
+<li>Possibility of <strong>auto committing the offset</strong> (e.g. to achieve <em>at-most-once</em> delivery)</li>
+<li><strong>Consumer groups</strong> providing the message ordering and horizontal scaling across the connected clients</li>
+<li><strong>Message expiry</strong> with auto deletion based on the configurable <strong>retention policy</strong></li>
+<li>Additional features such as <strong>server side message deduplication</strong></li>
+<li><strong>TLS</strong> support for all transport protocols (TCP, QUIC, HTTPS)</li>
+<li>Optional server-side as well as client-side <strong>data encryption</strong> using AES-256-GCM</li>
+<li>Optional metadata support in the form of <strong>message headers</strong></li>
+<li>Built-in <strong>CLI</strong> to manage the streaming server</li>
+<li>Built-in <strong>benchmarking app</strong> to test the performance</li>
+<li><strong>Single binary deployment</strong> (no external dependencies)</li>
+<li>Running as a single node (no cluster support yet)</li>
+</ul>
+<p>And as already mentioned, we've been working on SDKs for the multiple programming languages:</p>
+<ul>
+<li><a href="https://crates.io/crates/iggy" target="_blank" rel="noopener noreferrer">Rust</a></li>
+<li><a href="https://github.com/iggy-rs/iggy-dotnet-client" target="_blank" rel="noopener noreferrer">C#</a></li>
+<li><a href="https://github.com/iggy-rs/iggy-go-client" target="_blank" rel="noopener noreferrer">Go</a></li>
+<li><a href="https://github.com/iggy-rs/iggy-node-client" target="_blank" rel="noopener noreferrer">Node</a></li>
+<li><a href="https://github.com/iggy-rs/iggy-python-client" target="_blank" rel="noopener noreferrer">Python</a></li>
+<li><a href="https://github.com/iggy-rs/iggy-java-client" target="_blank" rel="noopener noreferrer">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/iggy-rs/iggy/tree/master/cmd" target="_blank" rel="noopener noreferrer">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">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/iggy-rs/iggy/actions" target="_blank" rel="noopener noreferrer">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">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 anchorWithStickyNavbar_LWe7" 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">​</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">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 additonal 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">io_uring</a></strong> for all I/O operations (disk or network related). The brand new, completion based API (available in the recent Linu [...]
+<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 anchorWithStickyNavbar_LWe7" 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">​</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://iggy.rs/discord" target="_blank" rel="noopener noreferrer">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">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 anchorWithStickyNavbar_LWe7" 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">​</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://iggy.rs/discord" target="_blank" rel="noopener noreferrer">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 anchorWithStickyNavbar_LWe7" 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">​</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/iggy-rs/iggy/commit/e74c25e058b1f39119ee89b5ada5d93f171cb221" target="_blank" rel="noopener noreferrer">#e74c25e</a>.</p>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" 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">​</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_biex"><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_biex"><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_biex"><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_biex"><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 anchorWithStickyNavbar_LWe7" 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">​</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_biex"><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 plain">[personal_access_token_cleaner]</span><br></span><span class="token-line" style="color:#393 [...]
+        <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 anchorWithStickyNavbar_LWe7" 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">​</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/iggy-rs/iggy/commit/655f9b6bccb0ae4148422f32475a9bedc09827d2" target="_blank" rel="noopener noreferrer">#655f9b6</a>.</p>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" 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">​</a></h2>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><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 anchorWithStickyNavbar_LWe7" 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">​</a></h2>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><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_biex"><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_biex"><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 anchorWithStickyNavbar_LWe7" 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">​</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_biex"><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 -&gt; N clients).</p>
+<p>This breaking change has been introduced with the commit <a href="https://github.com/iggy-rs/iggy/commit/23b330928aa38463ef907c95a9f672fa7b728881" target="_blank" rel="noopener noreferrer">#23b3309</a>. The available <a href="https://crates.io/crates/iggy" target="_blank" rel="noopener noreferrer">iggy crate</a> supports these changes since version 0.0.80.</p>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" 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">​</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_biex"><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 plain">[system.user]</span><br></span><span class="token-line" style="color:#393A34"><span class=" [...]
+<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_biex"><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 plain">[http.jwt]</span><br></span><span class="token-line" style="color:#393A34"><span class="tok [...]
+<h2 class="anchor anchorWithStickyNavbar_LWe7" 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">​</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_biex"><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_biex"><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 anchorWithStickyNavbar_LWe7" 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">​</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_biex"><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 anchorWithStickyNavbar_LWe7" 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">​</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_biex"><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_biex"><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_biex"><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_biex"><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_biex"><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_biex"><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_biex"><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_biex"><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_biex"><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_biex"><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_biex"><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_biex"><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 anchorWithStickyNavbar_LWe7" 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">​</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="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><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"><span class="tok [...]
+        <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 anchorWithStickyNavbar_LWe7" 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">​</a></h2>
+<p>Breaking changes have been introduced with the commit <a href="https://github.com/iggy-rs/iggy/commit/670a8baba8617bb7e52bd51d556a621349e2e9f0" target="_blank" rel="noopener noreferrer">#670a8ba</a>. The available <a href="https://crates.io/crates/iggy" target="_blank" rel="noopener noreferrer">iggy crate</a> supports these changes since version 0.0.60.</p>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" 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">​</a></h2>
+<p>By default, the <code>PollMessages</code> used to return <code>Vec&lt;Message&gt;</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_biex"><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="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><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 bytes)</span>< [...]
+<h2 class="anchor anchorWithStickyNavbar_LWe7" 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">​</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_biex"><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="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><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></span></code></pre [...]
+<h2 class="anchor anchorWithStickyNavbar_LWe7" 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">​</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 anchorWithStickyNavbar_LWe7" 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">​</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/iggy-rs/iggy/commit/ea3bf9c16dd5f93e1c80c140e9e1d14cfa70f570" target="_blank" rel="noopener noreferrer">#ea3bf9c</a>. The available <a href="https://crates.io/crates/iggy" target="_bl [...]
+<h2 class="anchor anchorWithStickyNavbar_LWe7" 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">​</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 anchorWithStickyNavbar_LWe7" 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">​</a></h2>
+<div class="language-toml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><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 plain">[message_cleaner]</span><br></span><span class="token-line" style="color:#393A34"><span cla [...]
+<h3 class="anchor anchorWithStickyNavbar_LWe7" 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">​</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 anchorWithStickyNavbar_LWe7" 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">​</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 anchorWithStickyNavbar_LWe7" 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">​</a></h2>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><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_biex"><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="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><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) + Messages co [...]
+<p>The same changes (<code>name_length</code>) apply to the <code>Stream</code> and <code>StreamDetails</code> structs.</p>
+<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><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) + Name length (1 [...]
+        <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 anchorWithStickyNavbar_LWe7" 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">​</a></h2>
+<p>Starting with the commit <a href="https://github.com/iggy-rs/iggy/commit/b07f23db798ffcda7c39650f34547f20137ff725" target="_blank" rel="noopener noreferrer">#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="_blank" r [...]
+<h2 class="anchor anchorWithStickyNavbar_LWe7" 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">​</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 availabe 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 anchorWithStickyNavbar_LWe7" 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">​</a></h2>
+<h3 class="anchor anchorWithStickyNavbar_LWe7" 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">​</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_biex"><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 anchorWithStickyNavbar_LWe7" 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">​</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_biex"><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 anchorWithStickyNavbar_LWe7" 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">​</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_biex"><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="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><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 bytes) + Payload ( [...]
+<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_biex"><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="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><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) + Headers (N [...]
+<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 anchorWithStickyNavbar_LWe7" 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">​</a></h2>
+<p>The first draft of the message headers implementation starts with the initial commit <a href="https://github.com/iggy-rs/iggy/commit/bc1d0b369a268783bd329436aba3f6920aae478e" target="_blank" rel="noopener noreferrer">#bc1d0b3</a>. The breaking change to the streaming server has been introduced in the commit <a href="https://github.com/iggy-rs/iggy/commit/7c73bd3d9d59fb685cbaaca5901dec6cac43ddaf" target="_blank" rel="noopener noreferrer">#7c73bd3</a> - up until this point, the existing [...]
+<h2 class="anchor anchorWithStickyNavbar_LWe7" 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">​</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/iggy-rs/iggy/tree/master/examples/src/message-headers" target="_blank" rel="noopener noreferrer">here</a>.</p>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" 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">​</a></h2>
+<h3 class="anchor anchorWithStickyNavbar_LWe7" 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">​</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&lt;u8&gt;</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_biex"><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_biex"><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 anchorWithStickyNavbar_LWe7" 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">​</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_biex"><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 anchorWithStickyNavbar_LWe7" 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">​</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_biex"><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_biex"><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 anchorWithStickyNavbar_LWe7" 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">​</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_biex"><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 anchorWithStickyNavbar_LWe7" 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">​</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_biex"><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 anchorWithStickyNavbar_LWe7" 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">​</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_biex"><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_biex"><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_biex"><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_biex"><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/consumer-identifier/index.html b/blogs/consumer-identifier/index.html
new file mode 100644
index 000000000..273cfaf8d
--- /dev/null
+++ b/blogs/consumer-identifier/index.html
@@ -0,0 +1,31 @@
+<!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.7.0">
+<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="stylesheet" href="/assets/css/styles.db211002.css">
+<script src="/assets/js/runtime~main.b0a22bcd.js" defer="defer"></script>
+<script src="/assets/js/main.f5453fd5.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const n=new URLSearchParams(window.location.search).entries();for(var[t,e]of n)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentEle [...]
+<h2 class="anchor anchorWithStickyNavbar_LWe7" 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">​</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/iggy-rs/iggy/commit/655f9b6bccb0ae4148422f32475a9bedc09827d2" target="_blank" rel="noopener noreferrer">#655f9b6</a>.</p>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" 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">​</a></h2>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><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 anchorWithStickyNavbar_LWe7" 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">​</a></h2>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><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_biex"><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_biex"><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 class="tag_zVej tagRegular_sFm0" href="/blogs/tags/new-featu [...]
+<div>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div>
+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 000000000..31f692721
--- /dev/null
+++ b/blogs/iggy-0-1-0-release/index.html
@@ -0,0 +1,33 @@
+<!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.7.0">
+<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="stylesheet" href="/assets/css/styles.db211002.css">
+<script src="/assets/js/runtime~main.b0a22bcd.js" defer="defer"></script>
+<script src="/assets/js/main.f5453fd5.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const n=new URLSearchParams(window.location.search).entries();for(var[t,e]of n)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentEle [...]
+<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 anchorWithStickyNavbar_LWe7" 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">​</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&#x27;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&#x27;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&#x27;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&#x27;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://iggy.rs/discord" target="_blank" rel="noopener noreferrer">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 class="tag_zVej tagRegular_sFm0" href="/blogs/tags/release">release</a [...]
+<div>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div>
+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 000000000..5885a5df6
--- /dev/null
+++ b/blogs/index.html
@@ -0,0 +1,252 @@
+<!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.7.0">
+<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="stylesheet" href="/assets/css/styles.db211002.css">
+<script src="/assets/js/runtime~main.b0a22bcd.js" defer="defer"></script>
+<script src="/assets/js/main.f5453fd5.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const n=new URLSearchParams(window.location.search).entries();for(var[t,e]of n)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentEle [...]
+<p>In the world of software development, <strong>benchmarks are often treated as a second-class citizen</strong>. They&#x27;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&#x27;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&#x27;re interested in. It&#x27;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/iggy-rs/iggy/" target="_blank" rel="noopener noreferrer">Iggy</a>, we&#x27;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 anchorWithStickyNavbar_LWe7" 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">​</a></h2>
+<p><strong>And today, we&#x27;re proud to present <a href="https://benchmarks.iggy.rs/" target="_blank" rel="noopener noreferrer">benchmarks.iggy.rs</a></strong> - a benchmarking dashboard, which is available to everyone. It&#x27;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. Simply run the <code>iggy-bench</code> tool, and submit the results to our <a href="https://github.com/iggy-rs/iggy-bench-dashboard/" target="_blank" rel="noopener noreferrer">iggy-bench-dashboard</a>, which is of course, an open-source project as well.
+Please check the current readme for the instructions on how to submit the results.</p>
+<p><img decoding="async" loading="lazy" alt="image" src="/assets/images/iggy_bench_dashboard-3f67adf8dfda89c5280aa2e90842b5ff.png" width="4090" height="2354" 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&#x27;re looking forward to your feedback, and we hope you&#x27;ll enjoy the benchmarks.</p>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" 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">​</a></h2>
+<p><strong>And as a cherry on top, we&#x27;ve recently managed to achieve the sub-millisecond write latency</strong>. This is a huge milestone for us, as it&#x27;s a proof that Iggy can be used in low-latency applications, where speed is crucial. Lately, we&#x27;ve been experimenting a lot with <a href="https://github.com/rkyv/rkyv" target="_blank" rel="noopener noreferrer">rkyv</a> - zero-copy deserialization framework, which has yielded some great results. Keep in mind that streaming t [...]
+<p>And the best part is that we&#x27;re just getting started. We&#x27;re looking forward to pushing the limits even further, and to see how far we can go. There&#x27;s still tons of optimizations coming, including switching the runtime to the <a href="https://github.com/bytedance/monoio" target="_blank" rel="noopener noreferrer">monoio</a> which does support <strong>io_uring</strong>, and we&#x27;ve experienced superb results with this one on our experimental branch. Then, there&#x27;s t [...]
+<p>We&#x27;re extremely excited to announce that Iggy has been accepted into the <a href="https://incubator.apache.org" target="_blank" rel="noopener noreferrer">Apache Incubator</a> program! Since the very first day, <strong>Iggy was always meant to be a truly FOSS project</strong>, and we&#x27;re thrilled to see it being recognized by the Apache Software Foundation (ASF). This is a huge milestone for us, and we&#x27;re looking forward to the journey ahead.</p>
+<p>Here you can find the <a href="https://cwiki.apache.org/confluence/display/INCUBATOR/Iggy+Proposal" target="_blank" rel="noopener noreferrer">official proposal</a>, along with the <a href="https://lists.apache.org/thread/q9whr3q9qd6wqm89f0vc1f6vkkvzc8xf" target="_blank" rel="noopener noreferrer">discussion</a> and the <a href="https://lists.apache.org/thread/6zfgdjwrzs92h4z4x6b25v1r23g3f5yg" target="_blank" rel="noopener noreferrer">voting results</a>.</p>
+<p>It&#x27;s been almost 2 years now since the very first line of code was written, and we&#x27;ve come a long way since the initial release. We&#x27;ve managed to build an amazing community around Iggy, and we&#x27;re grateful for all the contributions and feedback we&#x27;ve received. We&#x27;re confident that this move will help us grow even further and make Iggy even better.</p>
+<p>What&#x27;s also worth mentioning is that it&#x27;s not just about the core Iggy repository anymore, but also about the <a href="https://github.com/iggy-rs/" target="_blank" rel="noopener noreferrer">ecosystem</a> around it such as SDKs, CLIs, Web UIs, and more - we&#x27;re already close to 20 repositories in total, and we want to ensure that all of them are following the ASF guidelines.</p>
+<p>We&#x27;ll do our best to make Iggy the TLP (Top-Level Project) in the future, as we already have a lot of ideas on how to improve the project and the community around it.</p>
+<p><strong>The future of message streaming is with Iggy, and we want to make sure that everyone can benefit from it as Free and Open Source Software, that will stay this way forever.</strong></p>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" 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">​</a></h2>
+<p>After the recent <a href="https://lists.apache.org/thread/zrn96nlg23r9353lr5tp2by2ggx4zxqc" target="_blank" rel="noopener noreferrer">discussion</a>, we plan to stick to the <strong>monorepo approach</strong>, under which, we will have a single repository for all the Iggy-related projects. This will make it easier for the contributors to navigate through the codebase, and to see how the changes in one project affect the others. This should also help us to keep the consistency across t [...]
+<p>All the repositories under <a href="https://github.com/iggy-rs" target="_blank" rel="noopener noreferrer">iggy-rs</a> will be eventually moved to the <a href="https://github.com/apache/iggy" target="_blank" rel="noopener noreferrer">apache/iggy</a> repository, and we will make sure that all the existing links and references are updated accordingly.</p>
+<p>We&#x27;ll also host our website under the <a href="https://iggy.apache.org" target="_blank" rel="noopener noreferrer">iggy.apache.org</a> domain, including the documentation, blog, and the upcoming benchmarks. We&#x27;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&#x27;re using, but we&#x27;ll make sure to keep you updated on that.</p>
+<p><strong>Last but not least, we&#x27;ve got a new logo</strong>! Our lovely Italian Greyhound is now a part of the Apache family, and we&#x27;re proud to have it as our mascot. As you can see, it&#x27;s so fast, that even the light travelling through the optical can&#x27;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></div></article><article class="margin-bottom--xl"><header><h2 class="title_f1Hy"><a href="/blogs/2024/10/28/technology-radar-and-currrent-goals">Iggy.rs - Technology Radar &amp; current goals</a></h2><div class="container_mt6G margin-vert--md"><time datetime="2024-10-28T00:00:00.000Z">October 28, 2024</time> · <!-- -->7 m [...]
+<p>Quite recently (a few days ago), <a href="https://github.com/iggy-rs/iggy" target="_blank" rel="noopener noreferrer">Iggy</a> has been listed on <a href="https://www.thoughtworks.com/radar/platforms/summary/iggy" target="_blank" rel="noopener noreferrer">Technology Radar</a> by <a href="https://www.thoughtworks.com/" target="_blank" rel="noopener noreferrer">Thoughtworks</a> - a well-known technology consulting company.</p>
+<p>If you&#x27;re not familiar with the Technology Radar, it&#x27;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 &amp; 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">FoundationDB</a>) - being the projects which are worth exploring &amp; understanding how they might affect your enterprise. Frankly speaking, we weren&#x27;t expecting this at all, and <strong>from our perspective, it&#x27;s quite of an accomplishment</strong>.</p>
+<p>Besides gaining an additional amount of trust &amp; recognition, it has led us to another conclusion - someone out there we don&#x27;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://iggy.rs/discord" target="_blank" rel="noopener noreferrer">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">OSS community</a> building the core streaming server &amp; SDKs in multiple programming languages, it&#x27;s worth mentioning what are the current goals for Iggy.</p>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" 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">​</a></h2>
+<h3 class="anchor anchorWithStickyNavbar_LWe7" id="replication">Replication<a href="#replication" class="hash-link" aria-label="Direct link to Replication" title="Direct link to Replication">​</a></h3>
+<p>Without a doubt, being able to run your infrastructure (which processes &amp; stores the data) as a cluster, gives much more confidence and greatly impacts the overall reliability.</p>
+<p>We&#x27;ve started <a href="https://github.com/iggy-rs/iggy-cluster-sandbox" target="_blank" rel="noopener noreferrer">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&#x27;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">revisited form</a>), which was successfully used by e.g. <a href="https://tigerbeetle.com/" target="_blank" rel="noopener noreferrer">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&#x27;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 anchorWithStickyNavbar_LWe7" 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">​</a></h3>
+<p>A few months ago, we did <a href="https://github.com/iggy-rs/iggy/pull/1053" target="_blank" rel="noopener noreferrer">implement</a> an optional archiver for the server state log &amp; 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_biex"><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 plain">[data_maintenance.archiver]</span><br></span><span class="token-line" style="color:#393A34" [...]
+<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&#x27;s one catch - in order to read the data stored with S3, you&#x27;d need to download it from the cloud and restart your server. And this is where things will change in the future - we&#x27;re planning to implement a dedicated S3 storage, for both, writing and reading the data in real-time [...]
+<ul>
+<li><strong>L1</strong> - data available directly from the server RAM (super fast writes/reads)</li>
+<li><strong>L2</strong> - data stored on your servers disks (still very, very fast with NVME SSD gen4 or 5)</li>
+<li><strong>L3</strong> - S3 storage, still fast for the typical use-cases which do not require a very stable, microsecond level latencies</li>
+</ul>
+<p><strong>Each of these storage layers could be optionally enabled or disabled</strong>. You can already decide if and how much memory to use for caching the messages. With S3 tiered storage in place, you could e.g. treat your server&#x27;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&#x27;s RAM &amp; 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">Quickwit</a>).</p>
+<h3 class="anchor anchorWithStickyNavbar_LWe7" id="opentelemetry">OpenTelemetry<a href="#opentelemetry" class="hash-link" aria-label="Direct link to OpenTelemetry" title="Direct link to OpenTelemetry">​</a></h3>
+<p>Speaking of the Quickwit, we&#x27;ve also <a href="https://github.com/iggy-rs/iggy/pull/1294" target="_blank" rel="noopener noreferrer">implemented</a> a support for <a href="https://opentelemetry.io/" target="_blank" rel="noopener noreferrer">OpenTelemetry</a> logs &amp; traces for the server. Since our SDK already uses the logging &amp; tracing libraries, we thought that adding such a feature on the server, could help you gain even better, real-time observability into what&#x27;s ha [...]
+<div class="language-toml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><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 plain"># OpenTelemetry configuration</span><br></span><span class="token-line" style="color:#393A3 [...]
+<p><strong>And just like with S3 storage, it&#x27;s merely a beginning</strong> - one of the members on our <a href="https://iggy.rs/discord" target="_blank" rel="noopener noreferrer">Discord</a> had already thought of extending this implementation by <strong>propagating the trace context</strong> (via existing message headers metadata) between the clients &amp; server in order to get full understanding of the distributed systems and its dependencies, which could be further visualized by [...]
+<h3 class="anchor anchorWithStickyNavbar_LWe7" id="optimizations">Optimizations<a href="#optimizations" class="hash-link" aria-label="Direct link to Optimizations" title="Direct link to Optimizations">​</a></h3>
+<p>Improved messages batching, keeping the indexes &amp; 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">rkyv</a> for <strong>zero-copy (de)serialization</strong>, keeping open the file descriptors and lots of other minor improvements - all these low hanging fruits (or at least some of them), will hopefully build up to making Ig [...]
+<p><strong>To start the Iggy server, you just need to wait for a few milliseconds, and the RAM consumption is within a range ~20 MB, which is already over an order of magnitude lower than when compared to Kafka.</strong></p>
+<p><img decoding="async" loading="lazy" alt="image" src="/assets/images/iggy_docker-37b72ad9d9a244e1464c94f03c162193.png" width="2558" height="1375" class="img_ev3q"></p>
+<h3 class="anchor anchorWithStickyNavbar_LWe7" 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">​</a></h3>
+<p>This will certainly require to have its own blog post, as there&#x27;s so much to talk about. We did experiment with <a href="https://github.com/bytedance/monoio" target="_blank" rel="noopener noreferrer">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="no [...]
+<p>Yes, at this point you might call us crazy (<strong>io_uring</strong> won&#x27;t happen before we release the first version of the VSR clustering anyway), but if you want to tick all the possible boxes, it&#x27;s hard to find a generic framework that will meet your demands, especially when mixed altogether with VSR clustering, thread-per-core &amp; 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&#x27;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><article class="margin-bottom--xl"><header><h2 class="title_f1Hy"><a href="/blogs/2024/05/29/one-year-of-building-the-m [...]
+<p><strong>It&#x27;s been a little over a year</strong>, since the <a href="https://iggy.rs" target="_blank" rel="noopener noreferrer">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&#x27;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">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">Hacker News</a>, which I do believe were the two main reas [...]
+<p>And although it may seem as if the project development has recently slowed down a bit, I&#x27;d say it&#x27;s quite the opposite — let me quickly summary, what we&#x27;ve achieved so far during the last few months and what we&#x27;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 anchorWithStickyNavbar_LWe7" id="community">Community<a href="#community" class="hash-link" aria-label="Direct link to Community" title="Direct link to Community">​</a></h2>
+<p>First and foremost, if it weren&#x27;t for the community, we wouldn&#x27;t have seen such an enormous growth of the Iggy&#x27;s ecosystem — we&#x27;ve received the dozens of pull requests and there&#x27;s ~250 members on our <a href="https://iggy.rs/discord" target="_blank" rel="noopener noreferrer">Discord</a>. Whether we talk about bug fixes, improvements, new features, or just sharing the experiences and discussing potential ideas — it&#x27;s all equally important.</p>
+<p>And it&#x27;s been even more than that — we&#x27;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&#x27;s expected, as the project is still evolving, and it&#x27;s not an easy task, to come up with a great development experience from the very beginning.</p>
+<ul>
+<li><a href="https://github.com/iggy-rs/iggy" target="_blank" rel="noopener noreferrer">Rust</a></li>
+<li><a href="https://github.com/iggy-rs/iggy-dotnet-client" target="_blank" rel="noopener noreferrer">C#</a></li>
+<li><a href="https://github.com/iggy-rs/iggy-cpp-client" target="_blank" rel="noopener noreferrer">C++</a></li>
+<li><a href="https://github.com/iggy-rs/iggy-node-client" target="_blank" rel="noopener noreferrer">Node (TS)</a></li>
+<li><a href="https://github.com/iggy-rs/iggy-go-client" target="_blank" rel="noopener noreferrer">Go</a></li>
+<li><a href="https://github.com/iggy-rs/iggy-python-client" target="_blank" rel="noopener noreferrer">Python</a></li>
+<li><a href="https://github.com/iggy-rs/iggy-java-client" target="_blank" rel="noopener noreferrer">Java</a></li>
+<li><a href="https://github.com/iggy-rs/iggy-elixir-client" target="_blank" rel="noopener noreferrer">Elixir</a></li>
+</ul>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="changelog">Changelog<a href="#changelog" class="hash-link" aria-label="Direct link to Changelog" title="Direct link to Changelog">​</a></h2>
+<p>Adding the brand new SDKs wasn&#x27;t the only great thing that has happened during last few months. We&#x27;ve also made quite a lot of improvements for the streaming server itself:</p>
+<ul>
+<li>Increased the streaming server throughput by over 30% for both writes and reads</li>
+<li>Added messages compression for client-side &amp; server-side supporting the different algorithms</li>
+<li>Implemented a new way of message batching with an additional tooling for data migration</li>
+<li>Fixed the possible server-side deadlock that could happen for a specific configuration</li>
+<li>Fixed issues with possible memory leaks when storing too many indices in memory</li>
+<li>Rebuilt our custom benchmarking tool</li>
+<li>Improved TCP connection handling</li>
+<li>Constantly upgrading our CI/CD with lots of testing, different runtimes, artifacts, crates and Docker images releases</li>
+<li>Refactored the existing Rust client SDK to follow the new conventions (without the breaking changes to the previous one)</li>
+</ul>
+<p>And at the same time, we&#x27;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 anchorWithStickyNavbar_LWe7" id="tooling">Tooling<a href="#tooling" class="hash-link" aria-label="Direct link to Tooling" title="Direct link to Tooling">​</a></h2>
+<p>The core message streaming server and multiple SDKs might sound as the most important parts of the whole ecosystem, but let&#x27;s not forget about the <strong>management tools</strong>. How to quickly connect to the 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/iggy-rs/iggy/tree/master/cli" target="_blank" rel="noopener noreferrer">CLI</a> and <a href="https://github.com/iggy-rs/iggy-web-ui" target="_blank" rel="noopener noreferrer">Web UI</a> come in handy</strong>. If you&#x27;re a fan of working with the terminal and used to the great developer experience, you&#x27;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&#x27;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/iggy-rs/iggy/tree/master/bench" target="_blank" rel="noopener noreferrer">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 anchorWithStickyNavbar_LWe7" 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">​</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&#x27;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&#x27;m fully aware that it&#x27;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/iggy-rs/iggy/issues/606" target="_blank" rel="noopener noreferrer">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&#x27;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&#x27;m not saying that we&#x27;re better than X or Y — I&#x27;m simply stating that for some specific usages, we might be a better choice than X or Y.</p>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="clustering--replication">Clustering &amp; replication<a href="#clustering--replication" class="hash-link" aria-label="Direct link to Clustering &amp; replication" title="Direct link to Clustering &amp; replication">​</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&#x27;ve already built its basic version in the <a href="https://github.com/iggy-rs/iggy-cluster-sandbox" target="_blank" rel="noopener noreferrer">sandbox repository</a>. In order to achieve that, we&#x27;ve decided to (at least for now) stick to the <a href="https://raft.github.io" target="_blank" rel="noopener noreferrer">Raft</a> consensus algorithm. However, adding the data replication feature to the [...]
+<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 anchorWithStickyNavbar_LWe7" id="io_uring--thread-per-core--share-nothing">io_uring &amp; thread-per-core + share-nothing<a href="#io_uring--thread-per-core--share-nothing" class="hash-link" aria-label="Direct link to io_uring &amp; thread-per-core + share-nothing" title="Direct link to io_uring &amp; thread-per-core + share-nothing">​</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&#x27;s mostly I/O (disk + networking)</strong> — the more efficient you can make it, the greater it will be. Of course, there&#x27;s a major difference between throughput and latency, especially when talking about the so-called tail latency (p99 and more). Wouldn&#x27;t it be great if we  [...]
+<p>However, due to the nature of tasks being shared across the different threads, <strong>you can&#x27;t simply avoid lots of context switches and data being shared &amp; synchronized across these threads</strong> (therefore even more context switches will occur). While it&#x27;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">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&#x27;ve decided to <strong>experiment with <a href="https://unixism.net/loti/what_is_io_uring.html" target="_blank" rel="noopener noreferrer">io_uring</a> to maximize the I/O performance</strong> (and at the same time vastly reduce the need of context switches), and at the same time utilize <strong>thread-per-core architecture</strong>, where <strong>each thread is pinned to the CPU core</strong>, thus keeping the data locally, without the need of sharing it with the other threads  [...]
+<p>And just recently, we&#x27;ve established yet another <a href="https://github.com/iggy-rs/iggy-thread-per-core-sandbox" target="_blank" rel="noopener noreferrer">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&#x27;ve got a very simple prototype in place, but there&#x27;s still lots to be done, especially when thinking of:</p>
+<ul>
+<li>How to evenly split partitions (the unit of data parallelism) between multiple cores?</li>
+<li>How to efficiently rewrite existing server metadata heavily relying on synchronized data with <code>Arc&lt;&gt;</code> and <code>RwLock&lt;&gt;</code>?</li>
+<li>Should we load into memory the same server metadata across all the threads (separately from each other) and notify all of them when something changes?</li>
+<li>Should there be single or multiple threads handling the incoming TCP connections?</li>
+<li>When <code>Thread #1</code> receives the request, which has to access the partition from <code>Thread #2</code>, should we use an async two-way channel (remember, no explicit locking and data synchronization between the threads) or maybe just send the descriptor using a one-way channel to the second thread to complete the request?</li>
+<li>What and when could become a bottleneck in such architecture?</li>
+</ul>
+<p>This is just the tip of an iceberg, and we&#x27;ve already started <a href="https://penberg.org/papers/tpc-ancs19.pdf" target="_blank" rel="noopener noreferrer">studying</a> some of the existing solutions out there, including <a href="https://seastar.io" target="_blank" rel="noopener noreferrer">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 anchorWithStickyNavbar_LWe7" 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">​</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&#x27;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&#x27;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&#x27;ll do our best to make it as seamless upgrade as possible — and once we achieve that, it means, we&#x27;re getting very close to the version 1.0.</p>
+<p>For the time being, if you&#x27;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://iggy.rs/discord" target="_blank" rel="noopener noreferrer">Discord</a> — <strong>your opinion is really important to us and we respect it no matter what</strong>.</p>
+<p>It&#x27;s been a very productive year for our core team (we&#x27;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&#x27;ve got the fundamentals right, now it&#x27;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><article class="margin-bottom--xl"><header><h2 class="title_f1Hy"><a href="/blogs/2023/12/29/building-message-streaming-in-rust">Iggy.rs - building message streaming in Rust</a></h2><div class="container_mt6G margin-vert--md"><time datetime="2023-12-29T00:00:00.000Z">December 29, 2023</time> · <!-- -->13  [...]
+<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">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&#x27;ve been dealing with the different kinds of distributed systems (mostly usi [...]
+<p>After a few months of trying to figure out (or just staying in the limbo I guess), what would be the best project to work on, I decided to build the <strong>message streaming platform</strong> (keep in mind that streaming is <a href="https://blog.iron.io/message-queue-vs-streaming/" target="_blank" rel="noopener noreferrer">not the same</a> as regular message broker). The other reason (besides getting to know Rust) was to <strong>truly understand the internals of the messaging systems [...]
+<p>And this is how the <a href="https://iggy.rs" target="_blank" rel="noopener noreferrer">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">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&#x27;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 anchorWithStickyNavbar_LWe7" id="project">Project<a href="#project" class="hash-link" aria-label="Direct link to Project" title="Direct link to Project">​</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">QUIC</a> protocol based on <a href="https://github.com/quinn-rs/quinn" target="_blank" rel="noopener noreferrer">Quinn</a> library. You could connect multiple applications into the server, and start exchanging the messages between them, simply by appending the data to the stream (from the producer perspect [...]
+<p>After spending a few weeks on building the initial version, and then another few weeks on rewriting its core part (yes, prototyping + validation repeated in a continuous loop worked quite well), I managed to implement the persistent streaming server being capable of parallel writes/reads to/from independent streams supporting many distinct apps connected into it. Simply put, one could easily have many applications, and even <strong>thousands of the streams</strong> (depending on how d [...]
+<p>On top of this, the support for <strong>TCP</strong> and <strong>HTTP</strong> protocols have been added. Under the hood, the typical architecture of streams, consisting of the topics being split into the partitions, which eventually operate on a raw file data using so-called segments has been implemented as well.</p>
+<p><img 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 &quot;aha&quot; 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">bytes</a>, along with the <a href="https://tokio.rs" target="_blank" rel="noopener noreferrer">Tokio</a> <strong>work stealing</strong> approach, yielded the great imp [...]
+<p>I do believe, that somewhere at this point I had realized, that <strong>Iggy might actually become something useful</strong> - not just a toy project, to be abandoned after reaching its initial goal (which was sort of already achieved).</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><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/iggy-rs/iggy/tree/master/bench" target="_blank" rel="noopener noreferrer">benchmarking purposes</a></strong>) and seeing the promising numbers (<strong>range of 2-6 GB/s for both, writes &amp; reads when processing millions of messages</strong>), I eventually decided to give it a long-term shot. Being fully aware that there&#x27;s still lots to be done (speaking of many months, or e [...]
+<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 anchorWithStickyNavbar_LWe7" id="team">Team<a href="#team" class="hash-link" aria-label="Direct link to Team" title="Direct link to Team">​</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&#x27;t actually looking for anyone, as I didn&#x27;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&#x27;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&#x27;re building, and you&#x27;re consistent about it (it was one of the main reasons why I&#x27;ve been contributing to Iggy every day since its inception, and still doing so), there&#x27;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&#x27;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&#x27;d be much harder (or even impossible) to deliver so many features.</p>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="features">Features<a href="#features" class="hash-link" aria-label="Direct link to Features" title="Direct link to Features">​</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><strong>Highly performant</strong>, persistent append-only log for the message streaming</li>
+<li><strong>Very high throughput</strong> for both writes and reads</li>
+<li><strong>Low latency and predictable resource usage</strong> thanks to the Rust compiled language (no GC)</li>
+<li><strong>Users authentication and authorization</strong> with granular permissions and PAT (Personal Access Tokens)</li>
+<li>Support for multiple streams, topics and partitions</li>
+<li>Support for <strong>multiple transport protocols</strong> (QUIC, TCP, HTTP)</li>
+<li>Fully operational RESTful API which can be optionally enabled</li>
+<li>Available client SDK in multiple languages</li>
+<li><strong>Works directly with the binary data</strong> (lack of enforced schema and serialization/deserialization)</li>
+<li>Configurable server features (e.g. caching, segment size, data flush interval, transport protocols etc.)</li>
+<li>Possibility of storing the <strong>consumer offsets</strong> on the server</li>
+<li>Multiple ways of polling the messages:<!-- -->
+<ul>
+<li>By offset (using the indexes)</li>
+<li>By timestamp (using the time indexes)</li>
+<li>First/Last N messages</li>
+<li>Next N messages for the specific consumer</li>
+</ul>
+</li>
+<li>Possibility of <strong>auto committing the offset</strong> (e.g. to achieve <em>at-most-once</em> delivery)</li>
+<li><strong>Consumer groups</strong> providing the message ordering and horizontal scaling across the connected clients</li>
+<li><strong>Message expiry</strong> with auto deletion based on the configurable <strong>retention policy</strong></li>
+<li>Additional features such as <strong>server side message deduplication</strong></li>
+<li><strong>TLS</strong> support for all transport protocols (TCP, QUIC, HTTPS)</li>
+<li>Optional server-side as well as client-side <strong>data encryption</strong> using AES-256-GCM</li>
+<li>Optional metadata support in the form of <strong>message headers</strong></li>
+<li>Built-in <strong>CLI</strong> to manage the streaming server</li>
+<li>Built-in <strong>benchmarking app</strong> to test the performance</li>
+<li><strong>Single binary deployment</strong> (no external dependencies)</li>
+<li>Running as a single node (no cluster support yet)</li>
+</ul>
+<p>And as already mentioned, we&#x27;ve been working on SDKs for the multiple programming languages:</p>
+<ul>
+<li><a href="https://crates.io/crates/iggy" target="_blank" rel="noopener noreferrer">Rust</a></li>
+<li><a href="https://github.com/iggy-rs/iggy-dotnet-client" target="_blank" rel="noopener noreferrer">C#</a></li>
+<li><a href="https://github.com/iggy-rs/iggy-go-client" target="_blank" rel="noopener noreferrer">Go</a></li>
+<li><a href="https://github.com/iggy-rs/iggy-node-client" target="_blank" rel="noopener noreferrer">Node</a></li>
+<li><a href="https://github.com/iggy-rs/iggy-python-client" target="_blank" rel="noopener noreferrer">Python</a></li>
+<li><a href="https://github.com/iggy-rs/iggy-java-client" target="_blank" rel="noopener noreferrer">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&#x27;s API and the underlying TCP/UDP stack with custom serialization to be implemented from the scratch (except for HTTP transport, that&#x27;s the easier one), I&#x27;d say we&#x27;re doing quite ok, and I can&#x27;t str [...]
+<p>But wait, there&#x27;s even more - what would be a message streaming platform without some additional tooling for managing it? We&#x27;ve also been developing the <strong><a href="https://github.com/iggy-rs/iggy/tree/master/cmd" target="_blank" rel="noopener noreferrer">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">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&#x27;ve got a fully-featured <a href="https://github.com/iggy-rs/iggy/actions" target="_blank" rel="noopener noreferrer">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">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&#x27;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&#x27;s discuss the roadmap.</p>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="roadmap">Roadmap<a href="#roadmap" class="hash-link" aria-label="Direct link to Roadmap" title="Direct link to Roadmap">​</a></h2>
+<p>After gaining some traction a few months ago (mostly due to landing on the GitHub trending page in July), we&#x27;ve talked to some users potentially interested in making Iggy part of their infrastructure (there&#x27;s even one <a href="https://neferdata.com" target="_blank" rel="noopener noreferrer">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&#x27;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 additonal 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&#x27;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&#x27;s still (potentially a huge) room for improvement. We&#x27;re planning to use <strong><a href="https://unixism.net/loti/what_is_io_uring.html" target="_blank" rel="noopener noreferrer">io_uring</a></strong> for all I/O operations (disk or network related). The brand new, completion based API (available in the r [...]
+<p><strong>Thread-per-core</strong> - in order to avoid the rather costly context switches due to the usage of synchronization mechanism when accessing the data from the different threads (e.g. via Tokio&#x27;s work stealing mechanism), we&#x27;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 anchorWithStickyNavbar_LWe7" id="future">Future<a href="#future" class="hash-link" aria-label="Direct link to Future" title="Direct link to Future">​</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&#x27;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&#x27;re already excited enough to challenge ourselves</strong>. We&#x27;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://iggy.rs/discord" target="_blank" rel="noopener noreferrer">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">Rust</a>.</p></div></article><article class="margin-bottom--xl"><header><h2 class="title_f1Hy"><a href="/blogs/iggy-0-1-0-release">Iggy 0.1.0 release</a></h2><div class="container_mt6G margin-vert--md"><time datetime="2023-11-26T00:00:00.000Z">November 26, 2023</time> · <!-- -->2 min read</div><div class="margin-top--md margin-bottom--sm row"><div class="col col--12 authorCol_Hf19"><div class=" [...]
+<div>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div>
+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 000000000..a38ccb15a
--- /dev/null
+++ b/blogs/message-expiry/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.7.0">
+<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="stylesheet" href="/assets/css/styles.db211002.css">
+<script src="/assets/js/runtime~main.b0a22bcd.js" defer="defer"></script>
+<script src="/assets/js/main.f5453fd5.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const n=new URLSearchParams(window.location.search).entries();for(var[t,e]of n)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentEle [...]
+<h2 class="anchor anchorWithStickyNavbar_LWe7" 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">​</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/iggy-rs/iggy/commit/ea3bf9c16dd5f93e1c80c140e9e1d14cfa70f570" target="_blank" rel="noopener noreferrer">#ea3bf9c</a>. The available <a href="https://crates.io/crates/iggy" target="_bl [...]
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="introduction">Introduction<a href="#introduction" class="hash-link" aria-label="Direct link to Introduction" title="Direct link to Introduction">​</a></h2>
+<p>The expiration policy is defined per topic, and it&#x27;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 anchorWithStickyNavbar_LWe7" id="configuration">Configuration<a href="#configuration" class="hash-link" aria-label="Direct link to Configuration" title="Direct link to Configuration">​</a></h2>
+<div class="language-toml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><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 plain">[message_cleaner]</span><br></span><span class="token-line" style="color:#393A34"><span cla [...]
+<h3 class="anchor anchorWithStickyNavbar_LWe7" 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">​</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 anchorWithStickyNavbar_LWe7" id="segment">Segment<a href="#segment" class="hash-link" aria-label="Direct link to Segment" title="Direct link to Segment">​</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 anchorWithStickyNavbar_LWe7" id="commands">Commands<a href="#commands" class="hash-link" aria-label="Direct link to Commands" title="Direct link to Commands">​</a></h2>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><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_biex"><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="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><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) + Messages co [...]
+<p>The same changes (<code>name_length</code>) apply to the <code>Stream</code> and <code>StreamDetails</code> structs.</p>
+<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><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) + Name length (1 [...]
+<div>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div>
+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 000000000..782a37bc4
--- /dev/null
+++ b/blogs/message-headers/index.html
@@ -0,0 +1,62 @@
+<!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.7.0">
+<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="stylesheet" href="/assets/css/styles.db211002.css">
+<script src="/assets/js/runtime~main.b0a22bcd.js" defer="defer"></script>
+<script src="/assets/js/main.f5453fd5.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const n=new URLSearchParams(window.location.search).entries();for(var[t,e]of n)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentEle [...]
+<h2 class="anchor anchorWithStickyNavbar_LWe7" 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">​</a></h2>
+<p>The first draft of the message headers implementation starts with the initial commit <a href="https://github.com/iggy-rs/iggy/commit/bc1d0b369a268783bd329436aba3f6920aae478e" target="_blank" rel="noopener noreferrer">#bc1d0b3</a>. The breaking change to the streaming server has been introduced in the commit <a href="https://github.com/iggy-rs/iggy/commit/7c73bd3d9d59fb685cbaaca5901dec6cac43ddaf" target="_blank" rel="noopener noreferrer">#7c73bd3</a> - up until this point, the existing [...]
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="introduction">Introduction<a href="#introduction" class="hash-link" aria-label="Direct link to Introduction" title="Direct link to Introduction">​</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&#x27;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&#x27;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/iggy-rs/iggy/tree/master/examples/src/message-headers" target="_blank" rel="noopener noreferrer">here</a>.</p>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="implementation">Implementation<a href="#implementation" class="hash-link" aria-label="Direct link to Implementation" title="Direct link to Implementation">​</a></h2>
+<h3 class="anchor anchorWithStickyNavbar_LWe7" id="structures">Structures<a href="#structures" class="hash-link" aria-label="Direct link to Structures" title="Direct link to Structures">​</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&lt;u8&gt;</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_biex"><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&#x27;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_biex"><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 anchorWithStickyNavbar_LWe7" 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">​</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&#x27;s up to you. The important part is the serialization. For the JSON transport, it&#x27;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_biex"><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 anchorWithStickyNavbar_LWe7" 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">​</a></h3>
+<p>Now, we can move on to the more complex part, being the binary transport (as always, it&#x27;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_biex"><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&#x27;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_biex"><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 anchorWithStickyNavbar_LWe7" 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">​</a></h3>
+<p>Now, let&#x27;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_biex"><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&#x27; 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 anchorWithStickyNavbar_LWe7" 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">​</a></h3>
+<p>Eventually, let&#x27;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&#x27;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&#x27;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_biex"><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 anchorWithStickyNavbar_LWe7" 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">​</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_biex"><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_biex"><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_biex"><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_biex"><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>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div>
+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 000000000..37e67fc10
--- /dev/null
+++ b/blogs/message-state/index.html
@@ -0,0 +1,42 @@
+<!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.7.0">
+<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="stylesheet" href="/assets/css/styles.db211002.css">
+<script src="/assets/js/runtime~main.b0a22bcd.js" defer="defer"></script>
+<script src="/assets/js/main.f5453fd5.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const n=new URLSearchParams(window.location.search).entries();for(var[t,e]of n)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentEle [...]
+<h2 class="anchor anchorWithStickyNavbar_LWe7" 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">​</a></h2>
+<p>Starting with the commit <a href="https://github.com/iggy-rs/iggy/commit/b07f23db798ffcda7c39650f34547f20137ff725" target="_blank" rel="noopener noreferrer">#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="_blank" r [...]
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="introduction">Introduction<a href="#introduction" class="hash-link" aria-label="Direct link to Introduction" title="Direct link to Introduction">​</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 availabe 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 anchorWithStickyNavbar_LWe7" id="implementation">Implementation<a href="#implementation" class="hash-link" aria-label="Direct link to Implementation" title="Direct link to Implementation">​</a></h2>
+<h3 class="anchor anchorWithStickyNavbar_LWe7" id="structures">Structures<a href="#structures" class="hash-link" aria-label="Direct link to Structures" title="Direct link to Structures">​</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&#x27;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&#x27;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_biex"><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 anchorWithStickyNavbar_LWe7" 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">​</a></h3>
+<p>As usual, the JSON transport should be rather easy to implement, as it&#x27;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_biex"><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 anchorWithStickyNavbar_LWe7" 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">​</a></h3>
+<p>Next, let&#x27;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_biex"><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="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><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 bytes) + Payload ( [...]
+<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_biex"><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="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><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) + Headers (N [...]
+<p>And that&#x27;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 class="tag_zVej tagRegular_sFm0" href="/blogs/tags/new-features">new-features</a></li><li [...]
+<div>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div>
+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 000000000..aee4ab1d7
--- /dev/null
+++ b/blogs/page/2/index.html
@@ -0,0 +1,18 @@
+<!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.7.0">
+<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="stylesheet" href="/assets/css/styles.db211002.css">
+<script src="/assets/js/runtime~main.b0a22bcd.js" defer="defer"></script>
+<script src="/assets/js/main.f5453fd5.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const n=new URLSearchParams(window.location.search).entries();for(var[t,e]of n)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentEle [...]
+<div>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div>
+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 000000000..5fb666c61
--- /dev/null
+++ b/blogs/personal-access-tokens/index.html
@@ -0,0 +1,34 @@
+<!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.7.0">
+<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="stylesheet" href="/assets/css/styles.db211002.css">
+<script src="/assets/js/runtime~main.b0a22bcd.js" defer="defer"></script>
+<script src="/assets/js/main.f5453fd5.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const n=new URLSearchParams(window.location.search).entries();for(var[t,e]of n)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentEle [...]
+<h2 class="anchor anchorWithStickyNavbar_LWe7" 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">​</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/iggy-rs/iggy/commit/e74c25e058b1f39119ee89b5ada5d93f171cb221" target="_blank" rel="noopener noreferrer">#e74c25e</a>.</p>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" 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">​</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&#x27;s not tied to the user&#x27;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_biex"><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_biex"><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_biex"><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&#x27;s a raw, secure token, which should be stored by the client. The server only stores the hashed version of the token, and it&#x27;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_biex"><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 anchorWithStickyNavbar_LWe7" id="configuration">Configuration<a href="#configuration" class="hash-link" aria-label="Direct link to Configuration" title="Direct link to Configuration">​</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_biex"><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 plain">[personal_access_token_cleaner]</span><br></span><span class="token-line" style="color:#393 [...]
+<div>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div>
+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.xml b/blogs/rss.xml
new file mode 100644
index 000000000..a88899273
--- /dev/null
+++ b/blogs/rss.xml
@@ -0,0 +1,574 @@
+<?xml version="1.0" encoding="utf-8"?>
+<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>Wed, 12 Feb 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[Iggy and the Transparent Benchmarks]]></title>
+            <link>https://iggy.apache.org/blogs/2025/02/12/transparent-benchmarks</link>
+            <guid>https://iggy.apache.org/blogs/2025/02/12/transparent-benchmarks</guid>
+            <pubDate>Wed, 12 Feb 2025 00:00:00 GMT</pubDate>
+            <description><![CDATA[Benchmarks should be the first-class citizen]]></description>
+            <content:encoded><![CDATA[<h2 class="anchor anchorWithStickyNavbar_LWe7" id="benchmarks-should-be-the-first-class-citizen">Benchmarks should be the first-class citizen<a href="https://iggy.apache.org/blogs/2025/02/12/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">​</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/iggy-rs/iggy/" target="_blank" rel="noopener noreferrer">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 anchorWithStickyNavbar_LWe7" id="iggy-benchmarking-dashboard">Iggy benchmarking dashboard<a href="https://iggy.apache.org/blogs/2025/02/12/transparent-benchmarks#iggy-benchmarking-dashboard" class="hash-link" aria-label="Direct link to Iggy benchmarking dashboard" title="Direct link to Iggy benchmarking dashboard">​</a></h2>
+<p><strong>And today, we're proud to present <a href="https://benchmarks.iggy.rs/" target="_blank" rel="noopener noreferrer">benchmarks.iggy.rs</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. Simply run the <code>iggy-bench</code> tool, and submit the results to our <a href="https://github.com/iggy-rs/iggy-bench-dashboard/" target="_blank" rel="noopener noreferrer">iggy-bench-dashboard</a>, which is of course, an open-source project as well.
+Please check the current readme for the instructions on how to submit the results.</p>
+<p><img decoding="async" loading="lazy" alt="image" src="https://iggy.apache.org/assets/images/iggy_bench_dashboard-3f67adf8dfda89c5280aa2e90842b5ff.png" width="4090" height="2354" 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 anchorWithStickyNavbar_LWe7" id="towards-the-microsecond-latency">Towards the microsecond latency<a href="https://iggy.apache.org/blogs/2025/02/12/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">​</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">rkyv</a> - zero-copy deserialization framework, which has yielded some great results. Keep in mind that streaming the data within  [...]
+<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">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 of share [...]
+        </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[Apache Incubation]]></description>
+            <content:encoded><![CDATA[<h2 class="anchor anchorWithStickyNavbar_LWe7" id="apache-incubation">Apache Incubation<a href="https://iggy.apache.org/blogs/2025/02/10/apache-incubator#apache-incubation" class="hash-link" aria-label="Direct link to Apache Incubation" title="Direct link to Apache Incubation">​</a></h2>
+<p>We're extremely excited to announce that Iggy has been accepted into the <a href="https://incubator.apache.org/" target="_blank" rel="noopener noreferrer">Apache Incubator</a> program! Since the very first day, <strong>Iggy was always meant to be a truly FOSS project</strong>, and we're thrilled to see it being recognized by the Apache Software Foundation (ASF). This is a huge milestone for us, and we're looking forward to the journey ahead.</p>
+<p>Here you can find the <a href="https://cwiki.apache.org/confluence/display/INCUBATOR/Iggy+Proposal" target="_blank" rel="noopener noreferrer">official proposal</a>, along with the <a href="https://lists.apache.org/thread/q9whr3q9qd6wqm89f0vc1f6vkkvzc8xf" target="_blank" rel="noopener noreferrer">discussion</a> and the <a href="https://lists.apache.org/thread/6zfgdjwrzs92h4z4x6b25v1r23g3f5yg" target="_blank" rel="noopener noreferrer">voting results</a>.</p>
+<p>It's been almost 2 years now since the very first line of code was written, and we've come a long way since the initial release. We've managed to build an amazing community around Iggy, and we're grateful for all the contributions and feedback we've received. We're confident that this move will help us grow even further and make Iggy even better.</p>
+<p>What's also worth mentioning is that it's not just about the core Iggy repository anymore, but also about the <a href="https://github.com/iggy-rs/" target="_blank" rel="noopener noreferrer">ecosystem</a> around it such as SDKs, CLIs, Web UIs, and more - we're already close to 20 repositories in total, and we want to ensure that all of them are following the ASF guidelines.</p>
+<p>We'll do our best to make Iggy the TLP (Top-Level Project) in the future, as we already have a lot of ideas on how to improve the project and the community around it.</p>
+<p><strong>The future of message streaming is with Iggy, and we want to make sure that everyone can benefit from it as Free and Open Source Software, that will stay this way forever.</strong></p>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" 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">​</a></h2>
+<p>After the recent <a href="https://lists.apache.org/thread/zrn96nlg23r9353lr5tp2by2ggx4zxqc" target="_blank" rel="noopener noreferrer">discussion</a>, we plan to stick to the <strong>monorepo approach</strong>, under which, we will have a single repository for all the Iggy-related projects. This will make it easier for the contributors to navigate through the codebase, and to see how the changes in one project affect the others. This should also help us to keep the consistency across t [...]
+<p>All the repositories under <a href="https://github.com/iggy-rs" target="_blank" rel="noopener noreferrer">iggy-rs</a> will be eventually moved to the <a href="https://github.com/apache/iggy" target="_blank" rel="noopener noreferrer">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">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>
+<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 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>]]></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 anchorWithStickyNavbar_LWe7" 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">​</a></h2>
+<p>Quite recently (a few days ago), <a href="https://github.com/iggy-rs/iggy" target="_blank" rel="noopener noreferrer">Iggy</a> has been listed on <a href="https://www.thoughtworks.com/radar/platforms/summary/iggy" target="_blank" rel="noopener noreferrer">Technology Radar</a> by <a href="https://www.thoughtworks.com/" target="_blank" rel="noopener noreferrer">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 &amp; 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">FoundationDB</a>) - being the projects which are worth exploring &amp; 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 &amp; 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://iggy.rs/discord" target="_blank" rel="noopener noreferrer">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">OSS community</a> building the core streaming server &amp; SDKs in multiple programming languages, it's worth mentioning what are the current goals for Iggy.</p>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" 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">​</a></h2>
+<h3 class="anchor anchorWithStickyNavbar_LWe7" 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">​</a></h3>
+<p>Without a doubt, being able to run your infrastructure (which processes &amp; 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">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">revisited form</a>), which was successfully used by e.g. <a href="https://tigerbeetle.com/" target="_blank" rel="noopener noreferrer">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 anchorWithStickyNavbar_LWe7" 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">​</a></h3>
+<p>A few months ago, we did <a href="https://github.com/iggy-rs/iggy/pull/1053" target="_blank" rel="noopener noreferrer">implement</a> an optional archiver for the server state log &amp; 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_biex"><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 plain">[data_maintenance.archiver]</span><br></span><span class="token-line" style="color:#393A34" [...]
+<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><strong>L1</strong> - data available directly from the server RAM (super fast writes/reads)</li>
+<li><strong>L2</strong> - data stored on your servers disks (still very, very fast with NVME SSD gen4 or 5)</li>
+<li><strong>L3</strong> - S3 storage, still fast for the typical use-cases which do not require a very stable, microsecond level latencies</li>
+</ul>
+<p><strong>Each of these storage layers could be optionally enabled or disabled</strong>. You can already decide if and how much memory to use for caching the messages. With S3 tiered storage in place, you could e.g. treat your server's SSD as a sort of ring buffer for keeping the most recent data (easily millions or billions of messages, depending on their size) and only fetch the ones from S3, when you need something very old.</p>
+<p>Or, you could just ignore your server's RAM &amp; 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">Quickwit</a>).</p>
+<h3 class="anchor anchorWithStickyNavbar_LWe7" 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">​</a></h3>
+<p>Speaking of the Quickwit, we've also <a href="https://github.com/iggy-rs/iggy/pull/1294" target="_blank" rel="noopener noreferrer">implemented</a> a support for <a href="https://opentelemetry.io/" target="_blank" rel="noopener noreferrer">OpenTelemetry</a> logs &amp; traces for the server. Since our SDK already uses the logging &amp; tracing libraries, we thought that adding such a feature on the server, could help you gain even better, real-time observability into what's happening un [...]
+<div class="language-toml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><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 plain"># OpenTelemetry configuration</span><br></span><span class="token-line" style="color:#393A3 [...]
+<p><strong>And just like with S3 storage, it's merely a beginning</strong> - one of the members on our <a href="https://iggy.rs/discord" target="_blank" rel="noopener noreferrer">Discord</a> had already thought of extending this implementation by <strong>propagating the trace context</strong> (via existing message headers metadata) between the clients &amp; server in order to get full understanding of the distributed systems and its dependencies, which could be further visualized by tool [...]
+<h3 class="anchor anchorWithStickyNavbar_LWe7" 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">​</a></h3>
+<p>Improved messages batching, keeping the indexes &amp; 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">rkyv</a> for <strong>zero-copy (de)serialization</strong>, keeping open the file descriptors and lots of other minor improvements - all these low hanging fruits (or at least some of them), will hopefully build up to making Ig [...]
+<p><strong>To start the Iggy server, you just need to wait for a few milliseconds, and the RAM consumption is within a range ~20 MB, which is already over an order of magnitude lower than when compared to Kafka.</strong></p>
+<p><img 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 anchorWithStickyNavbar_LWe7" 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">​</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">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="noopene [...]
+<p>Yes, at this point you might call us crazy (<strong>io_uring</strong> won't happen before we release the first version of the VSR clustering anyway), but if you want to tick all the possible boxes, it's hard to find a generic framework that will meet your demands, especially when mixed altogether with VSR clustering, thread-per-core &amp; 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 anchorWithStickyNavbar_LWe7" 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">​</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">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="_blank" rel [...]
+<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">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">Hacker News</a>, which I do believe were the two main reas [...]
+<p>And although it may seem as if the project development has recently slowed down a bit, I'd say it's quite the opposite — let me quickly summary, what we've achieved so far during the last few months and what we're focusing on now, as the future looks bright :)</p>
+<p><img 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 anchorWithStickyNavbar_LWe7" 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">​</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://iggy.rs/discord" target="_blank" rel="noopener noreferrer">Discord</a>. Whether we talk about bug fixes, improvements, new features, or just sharing the experiences and discussing potential ideas — it's all equally important.</p>
+<p>And it's been even more than that — we've seen our community members take on <strong>building the new SDKs</strong> in their favorite programming languages, fully on their own. Today, you can find the following list of supported SDKs for Iggy.rs — some of them could be lagging behind, but it's expected, as the project is still evolving, and it's not an easy task, to come up with a great development experience from the very beginning.</p>
+<ul>
+<li><a href="https://github.com/iggy-rs/iggy" target="_blank" rel="noopener noreferrer">Rust</a></li>
+<li><a href="https://github.com/iggy-rs/iggy-dotnet-client" target="_blank" rel="noopener noreferrer">C#</a></li>
+<li><a href="https://github.com/iggy-rs/iggy-cpp-client" target="_blank" rel="noopener noreferrer">C++</a></li>
+<li><a href="https://github.com/iggy-rs/iggy-node-client" target="_blank" rel="noopener noreferrer">Node (TS)</a></li>
+<li><a href="https://github.com/iggy-rs/iggy-go-client" target="_blank" rel="noopener noreferrer">Go</a></li>
+<li><a href="https://github.com/iggy-rs/iggy-python-client" target="_blank" rel="noopener noreferrer">Python</a></li>
+<li><a href="https://github.com/iggy-rs/iggy-java-client" target="_blank" rel="noopener noreferrer">Java</a></li>
+<li><a href="https://github.com/iggy-rs/iggy-elixir-client" target="_blank" rel="noopener noreferrer">Elixir</a></li>
+</ul>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" 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">​</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>Increased the streaming server throughput by over 30% for both writes and reads</li>
+<li>Added messages compression for client-side &amp; server-side supporting the different algorithms</li>
+<li>Implemented a new way of message batching with an additional tooling for data migration</li>
+<li>Fixed the possible server-side deadlock that could happen for a specific configuration</li>
+<li>Fixed issues with possible memory leaks when storing too many indices in memory</li>
+<li>Rebuilt our custom benchmarking tool</li>
+<li>Improved TCP connection handling</li>
+<li>Constantly upgrading our CI/CD with lots of testing, different runtimes, artifacts, crates and Docker images releases</li>
+<li>Refactored the existing Rust client SDK to follow the new conventions (without the breaking changes to the previous one)</li>
+</ul>
+<p>And at the same time, we've been experimenting a lot with some fancy stuff, which you can read about in the last paragraphs :)</p>
+<p><img 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 anchorWithStickyNavbar_LWe7" 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">​</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 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/iggy-rs/iggy/tree/master/cli" target="_blank" rel="noopener noreferrer">CLI</a> and <a href="https://github.com/iggy-rs/iggy-web-ui" target="_blank" rel="noopener noreferrer">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/iggy-rs/iggy/tree/master/bench" target="_blank" rel="noopener noreferrer">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 anchorWithStickyNavbar_LWe7" 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">​</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/iggy-rs/iggy/issues/606" target="_blank" rel="noopener noreferrer">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 anchorWithStickyNavbar_LWe7" id="clustering--replication">Clustering &amp; 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 &amp; replication" title="Direct link to Clustering &amp; replication">​</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">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">Raft</a> consensus algorithm. However, adding the data replication feature to the core Igg [...]
+<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 anchorWithStickyNavbar_LWe7" id="io_uring--thread-per-core--share-nothing">io_uring &amp; 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 &amp; thread-per-core + share-nothing" title="Direct link to io_uring &amp; thread-per-core + share-nothing">​</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 &amp; 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">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">io_uring</a> to maximize the I/O performance</strong> (and at the same time vastly reduce the need of context switches), and at the same time utilize <strong>thread-per-core architecture</strong>, where <strong>each thread is pinned to the CPU core</strong>, thus keeping the data locally, without the need of sharing it with the other threads (shar [...]
+<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">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>How to evenly split partitions (the unit of data parallelism) between multiple cores?</li>
+<li>How to efficiently rewrite existing server metadata heavily relying on synchronized data with <code>Arc&lt;&gt;</code> and <code>RwLock&lt;&gt;</code>?</li>
+<li>Should we load into memory the same server metadata across all the threads (separately from each other) and notify all of them when something changes?</li>
+<li>Should there be single or multiple threads handling the incoming TCP connections?</li>
+<li>When <code>Thread #1</code> receives the request, which has to access the partition from <code>Thread #2</code>, should we use an async two-way channel (remember, no explicit locking and data synchronization between the threads) or maybe just send the descriptor using a one-way channel to the second thread to complete the request?</li>
+<li>What and when could become a bottleneck in such architecture?</li>
+</ul>
+<p>This is just the tip of an iceberg, and we've already started <a href="https://penberg.org/papers/tpc-ancs19.pdf" target="_blank" rel="noopener noreferrer">studying</a> some of the existing solutions out there, including <a href="https://seastar.io/" target="_blank" rel="noopener noreferrer">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 anchorWithStickyNavbar_LWe7" 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">​</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://iggy.rs/discord" target="_blank" rel="noopener noreferrer">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 anchorWithStickyNavbar_LWe7" 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">​</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">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 using C# [...]
+<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">not the same</a> as regular message broker). The other reason (besides getting to know Rust) was to <strong>truly understand the internals of the messaging systems [...]
+<p>And this is how the <a href="https://iggy.rs/" target="_blank" rel="noopener noreferrer">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">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 anchorWithStickyNavbar_LWe7" 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">​</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">QUIC</a> protocol based on <a href="https://github.com/quinn-rs/quinn" target="_blank" rel="noopener noreferrer">Quinn</a> library. You could connect multiple applications into the server, and start exchanging the messages between them, simply by appending the data to the stream (from the producer perspect [...]
+<p>After spending a few weeks on building the initial version, and then another few weeks on rewriting its core part (yes, prototyping + validation repeated in a continuous loop worked quite well), I managed to implement the persistent streaming server being capable of parallel writes/reads to/from independent streams supporting many distinct apps connected into it. Simply put, one could easily have many applications, and even <strong>thousands of the streams</strong> (depending on how d [...]
+<p>On top of this, the support for <strong>TCP</strong> and <strong>HTTP</strong> protocols have been added. Under the hood, the typical architecture of streams, consisting of the topics being split into the partitions, which eventually operate on a raw file data using so-called segments has been implemented as well.</p>
+<p><img 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">bytes</a>, along with the <a href="https://tokio.rs/" target="_blank" rel="noopener noreferrer">Tokio</a> <strong>work stealing</strong> approach, yielded the great improvements [...]
+<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_biex"><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/iggy-rs/iggy/tree/master/bench" target="_blank" rel="noopener noreferrer">benchmarking purposes</a></strong>) and seeing the promising numbers (<strong>range of 2-6 GB/s for both, writes &amp; reads when processing millions of messages</strong>), I eventually decided to give it a long-term shot. Being fully aware that there's still lots to be done (speaking of many months, or even y [...]
+<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 anchorWithStickyNavbar_LWe7" 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">​</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 anchorWithStickyNavbar_LWe7" 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">​</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><strong>Highly performant</strong>, persistent append-only log for the message streaming</li>
+<li><strong>Very high throughput</strong> for both writes and reads</li>
+<li><strong>Low latency and predictable resource usage</strong> thanks to the Rust compiled language (no GC)</li>
+<li><strong>Users authentication and authorization</strong> with granular permissions and PAT (Personal Access Tokens)</li>
+<li>Support for multiple streams, topics and partitions</li>
+<li>Support for <strong>multiple transport protocols</strong> (QUIC, TCP, HTTP)</li>
+<li>Fully operational RESTful API which can be optionally enabled</li>
+<li>Available client SDK in multiple languages</li>
+<li><strong>Works directly with the binary data</strong> (lack of enforced schema and serialization/deserialization)</li>
+<li>Configurable server features (e.g. caching, segment size, data flush interval, transport protocols etc.)</li>
+<li>Possibility of storing the <strong>consumer offsets</strong> on the server</li>
+<li>Multiple ways of polling the messages:<!-- -->
+<ul>
+<li>By offset (using the indexes)</li>
+<li>By timestamp (using the time indexes)</li>
+<li>First/Last N messages</li>
+<li>Next N messages for the specific consumer</li>
+</ul>
+</li>
+<li>Possibility of <strong>auto committing the offset</strong> (e.g. to achieve <em>at-most-once</em> delivery)</li>
+<li><strong>Consumer groups</strong> providing the message ordering and horizontal scaling across the connected clients</li>
+<li><strong>Message expiry</strong> with auto deletion based on the configurable <strong>retention policy</strong></li>
+<li>Additional features such as <strong>server side message deduplication</strong></li>
+<li><strong>TLS</strong> support for all transport protocols (TCP, QUIC, HTTPS)</li>
+<li>Optional server-side as well as client-side <strong>data encryption</strong> using AES-256-GCM</li>
+<li>Optional metadata support in the form of <strong>message headers</strong></li>
+<li>Built-in <strong>CLI</strong> to manage the streaming server</li>
+<li>Built-in <strong>benchmarking app</strong> to test the performance</li>
+<li><strong>Single binary deployment</strong> (no external dependencies)</li>
+<li>Running as a single node (no cluster support yet)</li>
+</ul>
+<p>And as already mentioned, we've been working on SDKs for the multiple programming languages:</p>
+<ul>
+<li><a href="https://crates.io/crates/iggy" target="_blank" rel="noopener noreferrer">Rust</a></li>
+<li><a href="https://github.com/iggy-rs/iggy-dotnet-client" target="_blank" rel="noopener noreferrer">C#</a></li>
+<li><a href="https://github.com/iggy-rs/iggy-go-client" target="_blank" rel="noopener noreferrer">Go</a></li>
+<li><a href="https://github.com/iggy-rs/iggy-node-client" target="_blank" rel="noopener noreferrer">Node</a></li>
+<li><a href="https://github.com/iggy-rs/iggy-python-client" target="_blank" rel="noopener noreferrer">Python</a></li>
+<li><a href="https://github.com/iggy-rs/iggy-java-client" target="_blank" rel="noopener noreferrer">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/iggy-rs/iggy/tree/master/cmd" target="_blank" rel="noopener noreferrer">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">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/iggy-rs/iggy/actions" target="_blank" rel="noopener noreferrer">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">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 anchorWithStickyNavbar_LWe7" 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">​</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">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 additonal 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">io_uring</a></strong> for all I/O operations (disk or network related). The brand new, completion based API (available in the recent Linu [...]
+<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 anchorWithStickyNavbar_LWe7" 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">​</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://iggy.rs/discord" target="_blank" rel="noopener noreferrer">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">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 anchorWithStickyNavbar_LWe7" 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">​</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://iggy.rs/discord" target="_blank" rel="noopener noreferrer">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 anchorWithStickyNavbar_LWe7" 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">​</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/iggy-rs/iggy/commit/e74c25e058b1f39119ee89b5ada5d93f171cb221" target="_blank" rel="noopener noreferrer">#e74c25e</a>.</p>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" 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">​</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_biex"><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_biex"><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_biex"><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_biex"><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 anchorWithStickyNavbar_LWe7" 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">​</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_biex"><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 plain">[personal_access_token_cleaner]</span><br></span><span class="token-line" style="color:#393 [...]
+            <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 anchorWithStickyNavbar_LWe7" 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">​</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/iggy-rs/iggy/commit/655f9b6bccb0ae4148422f32475a9bedc09827d2" target="_blank" rel="noopener noreferrer">#655f9b6</a>.</p>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" 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">​</a></h2>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><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 anchorWithStickyNavbar_LWe7" 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">​</a></h2>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><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_biex"><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_biex"><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 anchorWithStickyNavbar_LWe7" 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">​</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_biex"><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 -&gt; N clients).</p>
+<p>This breaking change has been introduced with the commit <a href="https://github.com/iggy-rs/iggy/commit/23b330928aa38463ef907c95a9f672fa7b728881" target="_blank" rel="noopener noreferrer">#23b3309</a>. The available <a href="https://crates.io/crates/iggy" target="_blank" rel="noopener noreferrer">iggy crate</a> supports these changes since version 0.0.80.</p>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" 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">​</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_biex"><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 plain">[system.user]</span><br></span><span class="token-line" style="color:#393A34"><span class=" [...]
+<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_biex"><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 plain">[http.jwt]</span><br></span><span class="token-line" style="color:#393A34"><span class="tok [...]
+<h2 class="anchor anchorWithStickyNavbar_LWe7" 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">​</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_biex"><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_biex"><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 anchorWithStickyNavbar_LWe7" 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">​</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_biex"><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 anchorWithStickyNavbar_LWe7" 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">​</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_biex"><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_biex"><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_biex"><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_biex"><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_biex"><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_biex"><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_biex"><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_biex"><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_biex"><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_biex"><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_biex"><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_biex"><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 anchorWithStickyNavbar_LWe7" 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">​</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="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><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"><span class="tok [...]
+            <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 anchorWithStickyNavbar_LWe7" 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">​</a></h2>
+<p>Breaking changes have been introduced with the commit <a href="https://github.com/iggy-rs/iggy/commit/670a8baba8617bb7e52bd51d556a621349e2e9f0" target="_blank" rel="noopener noreferrer">#670a8ba</a>. The available <a href="https://crates.io/crates/iggy" target="_blank" rel="noopener noreferrer">iggy crate</a> supports these changes since version 0.0.60.</p>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" 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">​</a></h2>
+<p>By default, the <code>PollMessages</code> used to return <code>Vec&lt;Message&gt;</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_biex"><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="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><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 bytes)</span>< [...]
+<h2 class="anchor anchorWithStickyNavbar_LWe7" 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">​</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_biex"><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="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><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></span></code></pre [...]
+<h2 class="anchor anchorWithStickyNavbar_LWe7" 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">​</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 anchorWithStickyNavbar_LWe7" 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">​</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/iggy-rs/iggy/commit/ea3bf9c16dd5f93e1c80c140e9e1d14cfa70f570" target="_blank" rel="noopener noreferrer">#ea3bf9c</a>. The available <a href="https://crates.io/crates/iggy" target="_bl [...]
+<h2 class="anchor anchorWithStickyNavbar_LWe7" 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">​</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 anchorWithStickyNavbar_LWe7" 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">​</a></h2>
+<div class="language-toml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><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 plain">[message_cleaner]</span><br></span><span class="token-line" style="color:#393A34"><span cla [...]
+<h3 class="anchor anchorWithStickyNavbar_LWe7" 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">​</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 anchorWithStickyNavbar_LWe7" 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">​</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 anchorWithStickyNavbar_LWe7" 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">​</a></h2>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><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_biex"><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="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><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) + Messages co [...]
+<p>The same changes (<code>name_length</code>) apply to the <code>Stream</code> and <code>StreamDetails</code> structs.</p>
+<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><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) + Name length (1 [...]
+            <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 anchorWithStickyNavbar_LWe7" 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">​</a></h2>
+<p>Starting with the commit <a href="https://github.com/iggy-rs/iggy/commit/b07f23db798ffcda7c39650f34547f20137ff725" target="_blank" rel="noopener noreferrer">#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="_blank" r [...]
+<h2 class="anchor anchorWithStickyNavbar_LWe7" 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">​</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 availabe 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 anchorWithStickyNavbar_LWe7" 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">​</a></h2>
+<h3 class="anchor anchorWithStickyNavbar_LWe7" 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">​</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_biex"><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 anchorWithStickyNavbar_LWe7" 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">​</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_biex"><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 anchorWithStickyNavbar_LWe7" 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">​</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_biex"><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="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><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 bytes) + Payload ( [...]
+<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_biex"><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="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><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) + Headers (N [...]
+<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 anchorWithStickyNavbar_LWe7" 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">​</a></h2>
+<p>The first draft of the message headers implementation starts with the initial commit <a href="https://github.com/iggy-rs/iggy/commit/bc1d0b369a268783bd329436aba3f6920aae478e" target="_blank" rel="noopener noreferrer">#bc1d0b3</a>. The breaking change to the streaming server has been introduced in the commit <a href="https://github.com/iggy-rs/iggy/commit/7c73bd3d9d59fb685cbaaca5901dec6cac43ddaf" target="_blank" rel="noopener noreferrer">#7c73bd3</a> - up until this point, the existing [...]
+<h2 class="anchor anchorWithStickyNavbar_LWe7" 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">​</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/iggy-rs/iggy/tree/master/examples/src/message-headers" target="_blank" rel="noopener noreferrer">here</a>.</p>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" 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">​</a></h2>
+<h3 class="anchor anchorWithStickyNavbar_LWe7" 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">​</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&lt;u8&gt;</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_biex"><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_biex"><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 anchorWithStickyNavbar_LWe7" 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">​</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_biex"><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 anchorWithStickyNavbar_LWe7" 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">​</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_biex"><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_biex"><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 anchorWithStickyNavbar_LWe7" 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">​</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_biex"><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 anchorWithStickyNavbar_LWe7" 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">​</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_biex"><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 anchorWithStickyNavbar_LWe7" 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">​</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_biex"><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_biex"><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_biex"><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_biex"><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/tags/breaking-changes/index.html b/blogs/tags/breaking-changes/index.html
new file mode 100644
index 000000000..0ff0f6de1
--- /dev/null
+++ b/blogs/tags/breaking-changes/index.html
@@ -0,0 +1,18 @@
+<!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.7.0">
+<title data-rh="true">One post tagged with &quot;breaking-changes&quot; | 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="stylesheet" href="/assets/css/styles.db211002.css">
+<script src="/assets/js/runtime~main.b0a22bcd.js" defer="defer"></script>
+<script src="/assets/js/main.f5453fd5.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const n=new URLSearchParams(window.location.search).entries();for(var[t,e]of n)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentEle [...]
+<div>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div>
+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 000000000..fbbef58d0
--- /dev/null
+++ b/blogs/tags/consumers/index.html
@@ -0,0 +1,18 @@
+<!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.7.0">
+<title data-rh="true">One post tagged with &quot;consumers&quot; | 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="stylesheet" href="/assets/css/styles.db211002.css">
+<script src="/assets/js/runtime~main.b0a22bcd.js" defer="defer"></script>
+<script src="/assets/js/main.f5453fd5.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const n=new URLSearchParams(window.location.search).entries();for(var[t,e]of n)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentEle [...]
+<div>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div>
+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 000000000..e975fa678
--- /dev/null
+++ b/blogs/tags/hello/index.html
@@ -0,0 +1,18 @@
+<!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.7.0">
+<title data-rh="true">One post tagged with &quot;hello&quot; | 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="stylesheet" href="/assets/css/styles.db211002.css">
+<script src="/assets/js/runtime~main.b0a22bcd.js" defer="defer"></script>
+<script src="/assets/js/main.f5453fd5.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const n=new URLSearchParams(window.location.search).entries();for(var[t,e]of n)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentEle [...]
+<div>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div>
+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 000000000..af2cc2696
--- /dev/null
+++ b/blogs/tags/identifier/index.html
@@ -0,0 +1,18 @@
+<!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.7.0">
+<title data-rh="true">One post tagged with &quot;identifier&quot; | 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="stylesheet" href="/assets/css/styles.db211002.css">
+<script src="/assets/js/runtime~main.b0a22bcd.js" defer="defer"></script>
+<script src="/assets/js/main.f5453fd5.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const n=new URLSearchParams(window.location.search).entries();for(var[t,e]of n)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentEle [...]
+<div>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div>
+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 000000000..c7858d2ee
--- /dev/null
+++ b/blogs/tags/index.html
@@ -0,0 +1,18 @@
+<!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.7.0">
+<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="stylesheet" href="/assets/css/styles.db211002.css">
+<script src="/assets/js/runtime~main.b0a22bcd.js" defer="defer"></script>
+<script src="/assets/js/main.f5453fd5.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const n=new URLSearchParams(window.location.search).entries();for(var[t,e]of n)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentEle [...]
+<div>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div>
+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 000000000..6c8724044
--- /dev/null
+++ b/blogs/tags/message-checksum/index.html
@@ -0,0 +1,18 @@
+<!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.7.0">
+<title data-rh="true">One post tagged with &quot;message-checksum&quot; | 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="stylesheet" href="/assets/css/styles.db211002.css">
+<script src="/assets/js/runtime~main.b0a22bcd.js" defer="defer"></script>
+<script src="/assets/js/main.f5453fd5.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const n=new URLSearchParams(window.location.search).entries();for(var[t,e]of n)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentEle [...]
+<div>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div>
+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 000000000..509eff8e6
--- /dev/null
+++ b/blogs/tags/message-expiry/index.html
@@ -0,0 +1,18 @@
+<!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.7.0">
+<title data-rh="true">One post tagged with &quot;message-expiry&quot; | 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="stylesheet" href="/assets/css/styles.db211002.css">
+<script src="/assets/js/runtime~main.b0a22bcd.js" defer="defer"></script>
+<script src="/assets/js/main.f5453fd5.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const n=new URLSearchParams(window.location.search).entries();for(var[t,e]of n)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentEle [...]
+<div>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div>
+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 000000000..0f12b4d97
--- /dev/null
+++ b/blogs/tags/message-headers/index.html
@@ -0,0 +1,18 @@
+<!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.7.0">
+<title data-rh="true">One post tagged with &quot;message-headers&quot; | 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="stylesheet" href="/assets/css/styles.db211002.css">
+<script src="/assets/js/runtime~main.b0a22bcd.js" defer="defer"></script>
+<script src="/assets/js/main.f5453fd5.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const n=new URLSearchParams(window.location.search).entries();for(var[t,e]of n)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentEle [...]
+<div>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div>
+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 000000000..7a6da226d
--- /dev/null
+++ b/blogs/tags/message-state/index.html
@@ -0,0 +1,18 @@
+<!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.7.0">
+<title data-rh="true">One post tagged with &quot;message-state&quot; | 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="stylesheet" href="/assets/css/styles.db211002.css">
+<script src="/assets/js/runtime~main.b0a22bcd.js" defer="defer"></script>
+<script src="/assets/js/main.f5453fd5.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const n=new URLSearchParams(window.location.search).entries();for(var[t,e]of n)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentEle [...]
+<div>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div>
+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 000000000..082b3d18b
--- /dev/null
+++ b/blogs/tags/new-features/index.html
@@ -0,0 +1,18 @@
+<!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.7.0">
+<title data-rh="true">6 posts tagged with &quot;new-features&quot; | 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="stylesheet" href="/assets/css/styles.db211002.css">
+<script src="/assets/js/runtime~main.b0a22bcd.js" defer="defer"></script>
+<script src="/assets/js/main.f5453fd5.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const n=new URLSearchParams(window.location.search).entries();for(var[t,e]of n)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentEle [...]
+<div>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div>
+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 000000000..ce255eb7c
--- /dev/null
+++ b/blogs/tags/pat/index.html
@@ -0,0 +1,18 @@
+<!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.7.0">
+<title data-rh="true">One post tagged with &quot;pat&quot; | 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="stylesheet" href="/assets/css/styles.db211002.css">
+<script src="/assets/js/runtime~main.b0a22bcd.js" defer="defer"></script>
+<script src="/assets/js/main.f5453fd5.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const n=new URLSearchParams(window.location.search).entries();for(var[t,e]of n)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentEle [...]
+<div>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div>
+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 000000000..40b0f6722
--- /dev/null
+++ b/blogs/tags/permissions/index.html
@@ -0,0 +1,18 @@
+<!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.7.0">
+<title data-rh="true">One post tagged with &quot;permissions&quot; | 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="stylesheet" href="/assets/css/styles.db211002.css">
+<script src="/assets/js/runtime~main.b0a22bcd.js" defer="defer"></script>
+<script src="/assets/js/main.f5453fd5.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const n=new URLSearchParams(window.location.search).entries();for(var[t,e]of n)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentEle [...]
+<div>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div>
+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 000000000..d6da0becf
--- /dev/null
+++ b/blogs/tags/personal-access-tokens/index.html
@@ -0,0 +1,18 @@
+<!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.7.0">
+<title data-rh="true">One post tagged with &quot;personal-access-tokens&quot; | 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="stylesheet" href="/assets/css/styles.db211002.css">
+<script src="/assets/js/runtime~main.b0a22bcd.js" defer="defer"></script>
+<script src="/assets/js/main.f5453fd5.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const n=new URLSearchParams(window.location.search).entries();for(var[t,e]of n)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentEle [...]
+<div>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div>
+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 000000000..7c411f479
--- /dev/null
+++ b/blogs/tags/release/index.html
@@ -0,0 +1,18 @@
+<!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.7.0">
+<title data-rh="true">One post tagged with &quot;release&quot; | 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="stylesheet" href="/assets/css/styles.db211002.css">
+<script src="/assets/js/runtime~main.b0a22bcd.js" defer="defer"></script>
+<script src="/assets/js/main.f5453fd5.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const n=new URLSearchParams(window.location.search).entries();for(var[t,e]of n)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentEle [...]
+<div>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div>
+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 000000000..a77713d4d
--- /dev/null
+++ b/blogs/tags/schema/index.html
@@ -0,0 +1,18 @@
+<!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.7.0">
+<title data-rh="true">One post tagged with &quot;schema&quot; | 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="stylesheet" href="/assets/css/styles.db211002.css">
+<script src="/assets/js/runtime~main.b0a22bcd.js" defer="defer"></script>
+<script src="/assets/js/main.f5453fd5.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const n=new URLSearchParams(window.location.search).entries();for(var[t,e]of n)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentEle [...]
+<div>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div>
+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 000000000..2456990c9
--- /dev/null
+++ b/blogs/tags/update/index.html
@@ -0,0 +1,18 @@
+<!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.7.0">
+<title data-rh="true">One post tagged with &quot;update&quot; | 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="stylesheet" href="/assets/css/styles.db211002.css">
+<script src="/assets/js/runtime~main.b0a22bcd.js" defer="defer"></script>
+<script src="/assets/js/main.f5453fd5.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const n=new URLSearchParams(window.location.search).entries();for(var[t,e]of n)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentEle [...]
+<div>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div>
+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 000000000..1cf035859
--- /dev/null
+++ b/blogs/tags/users/index.html
@@ -0,0 +1,18 @@
+<!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.7.0">
+<title data-rh="true">One post tagged with &quot;users&quot; | 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="stylesheet" href="/assets/css/styles.db211002.css">
+<script src="/assets/js/runtime~main.b0a22bcd.js" defer="defer"></script>
+<script src="/assets/js/main.f5453fd5.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const n=new URLSearchParams(window.location.search).entries();for(var[t,e]of n)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentEle [...]
+<div>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div>
+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 000000000..213a76533
--- /dev/null
+++ b/blogs/updated-schemas/index.html
@@ -0,0 +1,33 @@
+<!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.7.0">
+<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="stylesheet" href="/assets/css/styles.db211002.css">
+<script src="/assets/js/runtime~main.b0a22bcd.js" defer="defer"></script>
+<script src="/assets/js/main.f5453fd5.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const n=new URLSearchParams(window.location.search).entries();for(var[t,e]of n)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentEle [...]
+<h2 class="anchor anchorWithStickyNavbar_LWe7" 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">​</a></h2>
+<p>Breaking changes have been introduced with the commit <a href="https://github.com/iggy-rs/iggy/commit/670a8baba8617bb7e52bd51d556a621349e2e9f0" target="_blank" rel="noopener noreferrer">#670a8ba</a>. The available <a href="https://crates.io/crates/iggy" target="_blank" rel="noopener noreferrer">iggy crate</a> supports these changes since version 0.0.60.</p>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="pollmessages">PollMessages<a href="#pollmessages" class="hash-link" aria-label="Direct link to PollMessages" title="Direct link to PollMessages">​</a></h2>
+<p>By default, the <code>PollMessages</code> used to return <code>Vec&lt;Message&gt;</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_biex"><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="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><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 bytes)</span>< [...]
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="getconsumeroffset">GetConsumerOffset<a href="#getconsumeroffset" class="hash-link" aria-label="Direct link to GetConsumerOffset" title="Direct link to GetConsumerOffset">​</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_biex"><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="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><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></span></code></pre [...]
+<h2 class="anchor anchorWithStickyNavbar_LWe7" 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">​</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 class="tag_zVej tagRegular_sFm0" href="/blogs/tags/update">update</a></li><li class="tag_QGVx"><a class="tag_z [...]
+<div>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div>
+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 000000000..128230633
--- /dev/null
+++ b/blogs/users-and-permissions/index.html
@@ -0,0 +1,59 @@
+<!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.7.0">
+<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="stylesheet" href="/assets/css/styles.db211002.css">
+<script src="/assets/js/runtime~main.b0a22bcd.js" defer="defer"></script>
+<script src="/assets/js/main.f5453fd5.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const n=new URLSearchParams(window.location.search).entries();for(var[t,e]of n)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentEle [...]
+<h2 class="anchor anchorWithStickyNavbar_LWe7" 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">​</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_biex"><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&#x27;s only returned when the user is authenticated. Otherwise, it&#x27;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&#x27;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 -&gt; N clients).</p>
+<p>This breaking change has been introduced with the commit <a href="https://github.com/iggy-rs/iggy/commit/23b330928aa38463ef907c95a9f672fa7b728881" target="_blank" rel="noopener noreferrer">#23b3309</a>. The available <a href="https://crates.io/crates/iggy" target="_blank" rel="noopener noreferrer">iggy crate</a> supports these changes since version 0.0.80.</p>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="configuration">Configuration<a href="#configuration" class="hash-link" aria-label="Direct link to Configuration" title="Direct link to Configuration">​</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_biex"><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 plain">[system.user]</span><br></span><span class="token-line" style="color:#393A34"><span class=" [...]
+<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_biex"><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 plain">[http.jwt]</span><br></span><span class="token-line" style="color:#393A34"><span class="tok [...]
+<h2 class="anchor anchorWithStickyNavbar_LWe7" 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">​</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&#x2 [...]
+<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_biex"><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_biex"><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 anchorWithStickyNavbar_LWe7" id="sdk">SDK<a href="#sdk" class="hash-link" aria-label="Direct link to SDK" title="Direct link to SDK">​</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_biex"><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 anchorWithStickyNavbar_LWe7" 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">​</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_biex"><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_biex"><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_biex"><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_biex"><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_biex"><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_biex"><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_biex"><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_biex"><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_biex"><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_biex"><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_biex"><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_biex"><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 anchorWithStickyNavbar_LWe7" 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">​</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="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><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"><span class="tok [...]
+<div>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div>
+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 000000000..4b3d50d64
--- /dev/null
+++ b/blogs/welcome-to-the-changelog/index.html
@@ -0,0 +1,20 @@
+<!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.7.0">
+<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="stylesheet" href="/assets/css/styles.db211002.css">
+<script src="/assets/js/runtime~main.b0a22bcd.js" defer="defer"></script>
+<script src="/assets/js/main.f5453fd5.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const n=new URLSearchParams(window.location.search).entries();for(var[t,e]of n)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentEle [...]
+<p>For the time being, I haven&#x27;t documented all the changes that I&#x27;ve made to the project, but since there&#x27;s already a few of us working on the different parts of the project, I think it&#x27;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 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 navigation [...]
+<div>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div>
+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 000000000..117b7e77f
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 000000000..a3de266b7
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 000000000..0f7caf01a
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 000000000..8520661a3
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 000000000..67cb96a67
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 000000000..eaa7b7628
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 000000000..168eeda49
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 000000000..cd593d6ff
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 000000000..352e9412c
Binary files /dev/null and b/building-message-streaming/leader_elections.jpeg differ
diff --git a/docs/cli/iggy-cli/index.html b/docs/cli/iggy-cli/index.html
new file mode 100644
index 000000000..efeff8392
--- /dev/null
+++ b/docs/cli/iggy-cli/index.html
@@ -0,0 +1,39 @@
+<!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.7.0">
+<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="stylesheet" href="/assets/css/styles.db211002.css">
+<script src="/assets/js/runtime~main.b0a22bcd.js" defer="defer"></script>
+<script src="/assets/js/main.f5453fd5.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const n=new URLSearchParams(window.location.search).entries();for(var[t,e]of n)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentEle [...]
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="installation">Installation<a href="#installation" class="hash-link" aria-label="Direct link to Installation" title="Direct link to Installation">​</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_biex"><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">cargo install iggy-cli</span><br></span></code></pre><div class="buttonGroup__atx"><button  [...]
+<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-63113b8950820b09e7f9b50fe664093f.png" width="3060" height="2318" 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_biex"><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 --username iggy --password iggy stream list</span><br></span></code></pre><div class=" [...]
+<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_biex"><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 -u iggy -p iggy stream list</span><br></span></code></pre><div class="buttonGroup__atx [...]
+<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_biex"><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 --transport tcp --tcp-server-address localhost:8090 -u iggy -p secret stream create my [...]
+<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_biex"><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 -u iggy -p secret topic create my-stream my-topic 1 none 7d</span><br></span></code></ [...]
+<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_biex"><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 -u iggy -p iggy message send --partition-id 1 my-stream my-topic &quot;hello world&quo [...]
+<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_biex"><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 -u iggy -p iggy message poll --offset 0 --message-count 10 my-stream my-topic 1</span> [...]
+<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_biex"><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 -u iggy -p secret login 1h</span><br></span></code></pre><div class="buttonGroup__atx" [...]
+<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><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 class="buttonGroup__atx"><button type=" [...]
+<div>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div>
+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 000000000..93f554120
--- /dev/null
+++ b/docs/index.html
@@ -0,0 +1,19 @@
+<!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.7.0">
+<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="stylesheet" href="/assets/css/styles.db211002.css">
+<script src="/assets/js/runtime~main.b0a22bcd.js" defer="defer"></script>
+<script src="/assets/js/main.f5453fd5.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const n=new URLSearchParams(window.location.search).entries();for(var[t,e]of n)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentEle [...]
+<p>Check the <a href="/introduction/about">introduction</a> to get the grasp of the fundamental concepts.</p></div></article><nav class="pagination-nav docusaurus-mt-lg" 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="footer footer--dark"><div class="contai [...]
+<div>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div>
+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 000000000..d2060855d
--- /dev/null
+++ b/docs/introduction/about/index.html
@@ -0,0 +1,71 @@
+<!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.7.0">
+<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="stylesheet" href="/assets/css/styles.db211002.css">
+<script src="/assets/js/runtime~main.b0a22bcd.js" defer="defer"></script>
+<script src="/assets/js/main.f5453fd5.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const n=new URLSearchParams(window.location.search).entries();for(var[t,e]of n)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentEle [...]
+<p>The goal of the project is to make a distributed streaming platform (running as a cluster), which will be able to scale horizontally and handle <strong>millions of messages per second</strong>.</p>
+<hr>
+<h3 class="anchor anchorWithStickyNavbar_LWe7" id="features">Features<a href="#features" class="hash-link" aria-label="Direct link to Features" title="Direct link to Features">​</a></h3>
+<ul>
+<li><strong>Highly performant</strong>, persistent append-only log for the message streaming</li>
+<li><strong>Very high throughput</strong> for both writes and reads</li>
+<li><strong>Low latency and predictable resource usage</strong> thanks to the Rust compiled language (no GC)</li>
+<li><strong>Users authentication and authorization</strong> with granular permissions and PAT (Personal Access Tokens)</li>
+<li>Support for multiple streams, topics and partitions</li>
+<li>Support for <strong>multiple transport protocols</strong> (QUIC, TCP, HTTP)</li>
+<li>Fully operational RESTful API which can be optionally enabled</li>
+<li>Available client SDK in multiple languages</li>
+<li><strong>Works directly with the binary data</strong> (lack of enforced schema and serialization/deserialization)</li>
+<li>Configurable server features (e.g. caching, segment size, data flush interval, transport protocols etc.)</li>
+<li>Possibility of storing the <strong>consumer offsets</strong> on the server</li>
+<li>Multiple ways of polling the messages:<!-- -->
+<ul>
+<li>By offset (using the indexes)</li>
+<li>By timestamp (using the time indexes)</li>
+<li>First/Last N messages</li>
+<li>Next N messages for the specific consumer</li>
+</ul>
+</li>
+<li>Possibility of <strong>auto committing the offset</strong> (e.g. to achieve <em>at-most-once</em> delivery)</li>
+<li><strong>Consumer groups</strong> providing the message ordering and horizontal scaling across the connected clients</li>
+<li><strong>Message expiry</strong> with auto deletion based on the configurable <strong>retention policy</strong></li>
+<li>Additional features such as <strong>server side message deduplication</strong></li>
+<li><strong>Multi-tenant</strong> support via abstraction of <strong>streams</strong> whch group <strong>topics</strong></li>
+<li><strong>TLS</strong> support for all transport protocols (TCP, QUIC, HTTPS)</li>
+<li>Optional server-side as well as client-side <strong>data encryption</strong> using AES-256-GCM</li>
+<li>Optional metadata support in the form of <strong>message headers</strong></li>
+<li>Optional <strong>data backups &amp; archivization</strong> on disk and/or the <strong>S3</strong> compatible cloud storage (e.g. AWS S3)</li>
+<li>Support for <strong><a href="https://opentelemetry.io/" target="_blank" rel="noopener noreferrer">OpenTelemetry</a></strong> logs &amp; traces + Prometheus metrics</li>
+<li>Built-in <strong>CLI</strong> to manage the streaming server installable via <code>cargo install iggy-cli</code></li>
+<li>Built-in <strong>benchmarking app</strong> to test the performance</li>
+<li><strong>Single binary deployment</strong> (no external dependencies)</li>
+<li>Running as a single node (no cluster support yet)</li>
+</ul>
+<h3 class="anchor anchorWithStickyNavbar_LWe7" 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">​</a></h3>
+<ul>
+<li><a href="https://crates.io/crates/iggy" target="_blank" rel="noopener noreferrer">Rust</a></li>
+<li><a href="https://github.com/iggy-rs/iggy-dotnet-client" target="_blank" rel="noopener noreferrer">C#</a></li>
+<li><a href="https://github.com/iggy-rs/iggy-go-client" target="_blank" rel="noopener noreferrer">Go</a></li>
+<li><a href="https://github.com/iggy-rs/iggy-node-client" target="_blank" rel="noopener noreferrer">Node</a></li>
+<li><a href="https://github.com/iggy-rs/iggy-python-client" target="_blank" rel="noopener noreferrer">Python</a></li>
+<li><a href="https://github.com/iggy-rs/iggy-java-client" target="_blank" rel="noopener noreferrer">Java</a></li>
+</ul>
+<h3 class="anchor anchorWithStickyNavbar_LWe7" id="cli">CLI<a href="#cli" class="hash-link" aria-label="Direct link to CLI" title="Direct link to CLI">​</a></h3>
+<p>The brand new, rich, interactive CLI is being implemented under the <code>cmd</code> project, to provide the best developer experience. This will be a great addition to the Web UI, especially for all the developers who prefer using the console tools.</p>
+<h3 class="anchor anchorWithStickyNavbar_LWe7" 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">​</a></h3>
+<p>There&#x27;s an ongoing effort to build the administrative web UI for the server, which will allow to manage the streams, topics, partitions, messages and so on. Check the <a href="https://github.com/iggy-rs/iggy-web-ui" target="_blank" rel="noopener noreferrer">Web UI repository</a></p>
+<h3 class="anchor anchorWithStickyNavbar_LWe7" id="docker">Docker<a href="#docker" class="hash-link" aria-label="Direct link to Docker" title="Direct link to Docker">​</a></h3>
+<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>. The official images can be found <a href="https://hub.docker.com/r/iggyrs/iggy" target="_blank" rel="noopener noreferrer">here</a>, simply type <code>docker pull iggyrs/iggy</code>.</p></div></article><nav class="pagination-nav docusaurus-mt-lg" aria-label="Docs pages"><a class="pagination-nav__link pagination-nav__ [...]
+<div>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div>
+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 000000000..ff8e83ac9
--- /dev/null
+++ b/docs/introduction/architecture/index.html
@@ -0,0 +1,44 @@
+<!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.7.0">
+<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="stylesheet" href="/assets/css/styles.db211002.css">
+<script src="/assets/js/runtime~main.b0a22bcd.js" defer="defer"></script>
+<script src="/assets/js/main.f5453fd5.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const n=new URLSearchParams(window.location.search).entries();for(var[t,e]of n)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentEle [...]
+<p>Let&#x27;s discuss in-depth what these concepts are all about and how they relate to each other.</p>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" 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">​</a></h2>
+<p>There&#x27;s a high chance that you&#x27;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&#x27;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&#x27;s not responsible for delivering the messages to the consumers, but rather it&#x27;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&#x27;t affect the resource usage as there&#x27;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&#x27;ve guessed by now, Iggy is the latter - the message streaming platform.</p>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" 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">​</a></h2>
+<p>The append-only log is the core concept of Iggy. It&#x27;s a simple data structure, which is optimized for the append-only operations. It&#x27;s a sequence of records, that are being appended to the end of the log. The records are immutable, so that they can&#x27;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="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><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="token-line" style [...]
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="stream">Stream<a href="#stream" class="hash-link" aria-label="Direct link to Stream" title="Direct link to Stream">​</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 anchorWithStickyNavbar_LWe7" id="topic">Topic<a href="#topic" class="hash-link" aria-label="Direct link to Topic" title="Direct link to Topic">​</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 anchorWithStickyNavbar_LWe7" id="partition">Partition<a href="#partition" class="hash-link" aria-label="Direct link to Partition" title="Direct link to Partition">​</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 anchorWithStickyNavbar_LWe7" id="segment">Segment<a href="#segment" class="hash-link" aria-label="Direct link to Segment" title="Direct link to Segment">​</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&#x27;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 anchorWithStickyNavbar_LWe7" id="structure">Structure<a href="#structure" class="hash-link" aria-label="Direct link to Structure" title="Direct link to Structure">​</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="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><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 plain">└── 1</ [...]
+<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="pagination-nav docusaurus-mt-lg" 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>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div>
+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 000000000..ecec358dc
--- /dev/null
+++ b/docs/introduction/getting-started/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-getting-started" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.7.0">
+<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="stylesheet" href="/assets/css/styles.db211002.css">
+<script src="/assets/js/runtime~main.b0a22bcd.js" defer="defer"></script>
+<script src="/assets/js/main.f5453fd5.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const n=new URLSearchParams(window.location.search).entries();for(var[t,e]of n)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentEle [...]
+<p>Once you&#x27;re familiar with the <a href="/introduction/architecture">architecture</a>, it&#x27;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/iggy-rs/iggy/tree/master/examples/src/getting-started" target="_blank" rel="noopener noreferrer">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&#x27;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&#x27;re looking for a <strong>more developer-friendly client builder API</strong> providing additional features and extensions, please check the next article under <a href="/introduction/high-level-sdk">High-level SDK</a> section (this is typically how you&#x27;d use Iggy SDK in the real-world applications).</p>
+<p>Nevertheless, let&#x27;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 anchorWithStickyNavbar_LWe7" 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">​</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&#x27;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/iggy-rs/iggy" target="_blank" rel="noopener noreferrer">repository</a> and then starting the server by running the following command: <code>car [...]
+<p>As long as the Iggy server is running, we&#x27;re good to go. If you&#x27;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 anchorWithStickyNavbar_LWe7" 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">​</a></h2>
+<p>Let&#x27;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="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><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="token plain"> [...]
+<p>Then, open <code>Cargo.toml</code> and add the following code before the <code>[dependencies]</code></p>
+<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><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 plain">name =  [...]
+<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&#x27;s do the same for the <code>producer</code> part. Create a new <code>producer</code> directory, copy &amp; paste the existing <code>main.rs</code>, and update the <code>Cargo.toml</code> with the following code:</p>
+<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><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 plain">name =  [...]
+<p>You should have the project structure as shown below:</p>
+<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><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="token plain"> [...]
+<p>From that point on, we will focus on implementing the message streaming between our applications, starting with the producer.</p>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" 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">​</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">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_biex"><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&#x27;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_biex"><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/iggy-rs/iggy/blob/master/sdk/src/client_provider.rs" target="_blank" rel="noopener noreferrer"><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/iggy-rs/iggy/blob/master/sdk/src/client.rs" target="_blank" rel="noopener noreferrer">Client</a> trait and s [...]
+<p>If you&#x27;re eager to find out how to build more advanced (and configurable) applications, check the Rust <a href="/sdk/rust/examples">examples</a>. Nevertheless, let&#x27;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&#x27;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_biex"><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&#x27;ve just established our very first communication with the streaming server.</p>
+<p>Before we will move on with the code, let&#x27;s include some logging in our apps as well (Iggy client already has some logging in place on different levels). Let&#x27;s make use of the <a href="https://tracing.rs" target="_blank" rel="noopener noreferrer">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_biex"><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&#x27;re unfamiliar with these concepts, please refer to <a href="/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/iggy-rs/iggy/blob/master/sdk/src/client.rs" target="_blank" rel="noopener noreferrer">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&#x27;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_biex"><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&#x27;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&#x27;t care less about the (de)serialization format for the message payload, it&#x27;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/iggy-rs/iggy/blob/master/sdk/src/messages/send_messages.rs#L423" target="_blank" rel="noopener noreferrer">Message</a>.</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><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_biex"><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&#x27;ve already noticed, there are quite a few fields to be assigned. While some of them should be rather self-descriptive, let&#x27;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_biex"><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&#x27;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_biex"><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-&gt;2-&gt;3-&gt;1-&gt;2-&gt;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&#x27;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_biex"><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>&amp;mut</code> we can avoid copying the command each time.</p>
+<p>Finally, let&#x27;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_biex"><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 anchorWithStickyNavbar_LWe7" 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">​</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&#x27;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_biex"><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&#x27;s discuss the fields one by one:</p>
+<ul>
+<li>
+<p><code>stream_id</code> - the ID of the stream (numeric or string) from which we want to poll the messages.</p>
+</li>
+<li>
+<p><code>topic_id</code> - the ID of the topic (numeric or string) from which we want to poll the messages.</p>
+</li>
+<li>
+<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&#x27;s ignored (<code>None</code> value), as the server will automatically assign the partition to the consumer from the group.</p>
+</li>
+<li>
+<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>
+<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&#x27;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>
+<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>
+<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&#x27;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_biex"><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&#x27;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_biex"><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 anchorWithStickyNavbar_LWe7" id="summary">Summary<a href="#summary" class="hash-link" aria-label="Direct link to Summary" title="Direct link to Summary">​</a></h2>
+<p>What we&#x27;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&#x27;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/iggy-rs/iggy/tree/master/examples" target="_blank" rel="noopener noreferrer">examples</a>, how to make use of <code>IggyClient</code> wrapper on top of the existing impleme [...]
+<div>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div>
+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/high-level-sdk/index.html b/docs/introduction/high-level-sdk/index.html
new file mode 100644
index 000000000..227b819ee
--- /dev/null
+++ b/docs/introduction/high-level-sdk/index.html
@@ -0,0 +1,58 @@
+<!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-high-level-sdk" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.7.0">
+<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="stylesheet" href="/assets/css/styles.db211002.css">
+<script src="/assets/js/runtime~main.b0a22bcd.js" defer="defer"></script>
+<script src="/assets/js/main.f5453fd5.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const n=new URLSearchParams(window.location.search).entries();for(var[t,e]of n)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentEle [...]
+<ul>
+<li>Automatically creating &amp; joining the consumer groups</li>
+<li>Commiting the offset depending on the particular mode (e.g. in the background based on some interval, after polling N messages etc.)</li>
+<li>Batching the messages, whether it&#x27;s about producing or consuming</li>
+<li>Processing the messages as if the stream was an async iterator</li>
+<li>Reusing the same client for both, producing and consuming on the same topic without repeating the configuration</li>
+<li>And more...</li>
+</ul>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" 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">​</a></h2>
+<p>Instead of providing the configuration for the client, you can use the connection string. It&#x27;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&#x27;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_biex"><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 class="buttonGroup__at [...]
+<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_biex"><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>And here&#x27;s the full example 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_biex"><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=true&amp;tls_domain=test.com&amp;reconnection_retries [...]
+<p>By default, the connection string is parsed with the following options:</p>
+<ul>
+<li><code>tls</code> - whether to use the TLS connection or not (default: <code>false</code>)</li>
+<li><code>tls_domain</code> - the domain to use for the TLS connection (default: <code>None</code>)</li>
+<li><code>reconnection_retries</code> - the number of retries to establish the connection (default: <code>unlimited</code>)</li>
+<li><code>reconnection_interval</code> - the interval between the reconnection attempts (default: <code>1s</code>)</li>
+<li><code>reestablish_after</code> - the time to wait before reestablishing the connection (default: <code>5s</code>)</li>
+<li><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&#x27;d notice that it does use <code>IggySharedMut&lt;&gt;</code> which means that you can use a single instance of the client across multiple threads. Typically, it&#x27;s a good idea to create a separate connection for producing and consuming, but it&#x27;s not a requirement.</p>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="producer">Producer<a href="#producer" class="hash-link" aria-label="Direct link to Producer" title="Direct link to Producer">​</a></h2>
+<p>The producer is a high-level abstraction that allows you to send messages to the topic. It&#x27;s quite simple to use and doesn&#x27;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&#x27;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_biex"><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. 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 ensure that the producer is ready to send the messages by validating the existence of the stream, topic etc.</p>
+<p>Finally, you can use the <code>send()</code> method to send the messages to the topic. The producer doesn&#x27;t need to be a mutable reference, as it&#x27;s only required during the initialization phase. Here&#x27;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_biex"><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&#x27;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 anchorWithStickyNavbar_LWe7" id="consumer">Consumer<a href="#consumer" class="hash-link" aria-label="Direct link to Consumer" title="Direct link to Consumer">​</a></h2>
+<p>The consumer is a high-level abstraction that allows you to receive the messages from the topic. It&#x27;s quite simple to use and doesn&#x27;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&#x27;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_biex"><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&#x27;t need to be a mutable reference, as it&#x27;s only required during the initialization phase. Here&#x27;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_biex"><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">futures-util</a> dependency.</p></div></article><nav class="pagination-nav docusaurus-mt-lg" aria-label="Docs pages"><a class="pagination-nav__link pagination-nav__link--prev" href="/docs/introduction/getting-started"><div class="pagination-nav__sublabel">Previous</div><div class="pagination-nav__label">Getting started</div></a><a class="paginatio [...]
+<div>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div>
+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 000000000..cb8f1da51
--- /dev/null
+++ b/docs/sdk/csharp/examples/index.html
@@ -0,0 +1,18 @@
+<!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.7.0">
+<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="stylesheet" href="/assets/css/styles.db211002.css">
+<script src="/assets/js/runtime~main.b0a22bcd.js" defer="defer"></script>
+<script src="/assets/js/main.f5453fd5.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const n=new URLSearchParams(window.location.search).entries();for(var[t,e]of n)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentEle [...]
+<div>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div>
+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 000000000..1dfd2ff3e
--- /dev/null
+++ b/docs/sdk/csharp/intro/index.html
@@ -0,0 +1,18 @@
+<!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.7.0">
+<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="stylesheet" href="/assets/css/styles.db211002.css">
+<script src="/assets/js/runtime~main.b0a22bcd.js" defer="defer"></script>
+<script src="/assets/js/main.f5453fd5.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const n=new URLSearchParams(window.location.search).entries();for(var[t,e]of n)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentEle [...]
+<div>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div>
+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 000000000..eb1a0347f
--- /dev/null
+++ b/docs/sdk/go/examples/index.html
@@ -0,0 +1,18 @@
+<!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.7.0">
+<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="stylesheet" href="/assets/css/styles.db211002.css">
+<script src="/assets/js/runtime~main.b0a22bcd.js" defer="defer"></script>
+<script src="/assets/js/main.f5453fd5.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const n=new URLSearchParams(window.location.search).entries();for(var[t,e]of n)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentEle [...]
+<div>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div>
+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 000000000..a636e3e22
--- /dev/null
+++ b/docs/sdk/go/intro/index.html
@@ -0,0 +1,18 @@
+<!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.7.0">
+<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="stylesheet" href="/assets/css/styles.db211002.css">
+<script src="/assets/js/runtime~main.b0a22bcd.js" defer="defer"></script>
+<script src="/assets/js/main.f5453fd5.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const n=new URLSearchParams(window.location.search).entries();for(var[t,e]of n)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentEle [...]
+<div>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div>
+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 000000000..76f3edc4a
--- /dev/null
+++ b/docs/sdk/java/examples/index.html
@@ -0,0 +1,18 @@
+<!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.7.0">
+<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="stylesheet" href="/assets/css/styles.db211002.css">
+<script src="/assets/js/runtime~main.b0a22bcd.js" defer="defer"></script>
+<script src="/assets/js/main.f5453fd5.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const n=new URLSearchParams(window.location.search).entries();for(var[t,e]of n)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentEle [...]
+<div>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div>
+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 000000000..dd839d339
--- /dev/null
+++ b/docs/sdk/java/intro/index.html
@@ -0,0 +1,19 @@
+<!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.7.0">
+<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="stylesheet" href="/assets/css/styles.db211002.css">
+<script src="/assets/js/runtime~main.b0a22bcd.js" defer="defer"></script>
+<script src="/assets/js/main.f5453fd5.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const n=new URLSearchParams(window.location.search).entries();for(var[t,e]of n)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentEle [...]
+Repository can be found <a href="https://github.com/iggy-rs/iggy-java-client" target="_blank" rel="noopener noreferrer">here</a>.</p></div></article><nav class="pagination-nav docusaurus-mt-lg" aria-label="Docs pages"><a class="pagination-nav__link pagination-nav__link--prev" href="/docs/sdk/go/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/java/e [...]
+<div>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div>
+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 000000000..8d9071164
--- /dev/null
+++ b/docs/sdk/node/examples/index.html
@@ -0,0 +1,18 @@
+<!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.7.0">
+<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="stylesheet" href="/assets/css/styles.db211002.css">
+<script src="/assets/js/runtime~main.b0a22bcd.js" defer="defer"></script>
+<script src="/assets/js/main.f5453fd5.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const n=new URLSearchParams(window.location.search).entries();for(var[t,e]of n)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentEle [...]
+<div>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div>
+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 000000000..3fce69b2a
--- /dev/null
+++ b/docs/sdk/node/intro/index.html
@@ -0,0 +1,18 @@
+<!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.7.0">
+<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="stylesheet" href="/assets/css/styles.db211002.css">
+<script src="/assets/js/runtime~main.b0a22bcd.js" defer="defer"></script>
+<script src="/assets/js/main.f5453fd5.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const n=new URLSearchParams(window.location.search).entries();for(var[t,e]of n)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentEle [...]
+<div>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div>
+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 000000000..193a4c1ed
--- /dev/null
+++ b/docs/sdk/python/examples/index.html
@@ -0,0 +1,18 @@
+<!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.7.0">
+<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="stylesheet" href="/assets/css/styles.db211002.css">
+<script src="/assets/js/runtime~main.b0a22bcd.js" defer="defer"></script>
+<script src="/assets/js/main.f5453fd5.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const n=new URLSearchParams(window.location.search).entries();for(var[t,e]of n)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentEle [...]
+<div>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div>
+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 000000000..30948454f
--- /dev/null
+++ b/docs/sdk/python/intro/index.html
@@ -0,0 +1,18 @@
+<!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.7.0">
+<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="stylesheet" href="/assets/css/styles.db211002.css">
+<script src="/assets/js/runtime~main.b0a22bcd.js" defer="defer"></script>
+<script src="/assets/js/main.f5453fd5.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const n=new URLSearchParams(window.location.search).entries();for(var[t,e]of n)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentEle [...]
+<div>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div>
+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 000000000..f062dc70b
--- /dev/null
+++ b/docs/sdk/rust/examples/index.html
@@ -0,0 +1,25 @@
+<!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.7.0">
+<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="stylesheet" href="/assets/css/styles.db211002.css">
+<script src="/assets/js/runtime~main.b0a22bcd.js" defer="defer"></script>
+<script src="/assets/js/main.f5453fd5.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const n=new URLSearchParams(window.location.search).entries();for(var[t,e]of n)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentEle [...]
+<ul>
+<li><strong>Getting started</strong> - the basic example which is discussed in the <a href="/introduction/getting-started">getting started</a> guide.</li>
+<li><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><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><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><strong>New SDK</strong> - an introduction to the high-level SDK as discussed in the <a href="/introduction/high-level-sdk">dedicated guide</a>.</li>
+</ul></div></article><nav class="pagination-nav docusaurus-mt-lg" 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/cli/iggy-cli"><div class="pagination-nav__sublabel">Next</div><div class="pagination-nav__label">Iggy CLI</div></a></nav></div></div></div></d [...]
+<div>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div>
+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 000000000..1e9bc3531
--- /dev/null
+++ b/docs/sdk/rust/intro/index.html
@@ -0,0 +1,19 @@
+<!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.7.0">
+<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="stylesheet" href="/assets/css/styles.db211002.css">
+<script src="/assets/js/runtime~main.b0a22bcd.js" defer="defer"></script>
+<script src="/assets/js/main.f5453fd5.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const n=new URLSearchParams(window.location.search).entries();for(var[t,e]of n)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentEle [...]
+<p>To start using the Iggy SDK in your Rust project, simply run <code>cargo add iggy</code>.</p></div></article><nav class="pagination-nav docusaurus-mt-lg" 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>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div>
+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 000000000..702b752cf
--- /dev/null
+++ b/docs/server/benchmarking/index.html
@@ -0,0 +1,41 @@
+<!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.7.0">
+<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="stylesheet" href="/assets/css/styles.db211002.css">
+<script src="/assets/js/runtime~main.b0a22bcd.js" defer="defer"></script>
+<script src="/assets/js/main.f5453fd5.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const n=new URLSearchParams(window.location.search).entries();for(var[t,e]of n)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentEle [...]
+<p>To benchmark the project, first build the project in release mode or download the pre-built binary from the <a href="https://hub.docker.com/r/iggyrs/iggy/tags" target="_blank" rel="noopener noreferrer">releases page</a>.</p>
+<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><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">cargo build --release</span><br></span></code></pre><div class="buttonGroup__atx"><button t [...]
+<p>Next, start the server in the release mode (or use the pre-built binary) with the default configuration.</p>
+<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><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">cargo run --bin iggy-server -r</span><br></span></code></pre><div class="buttonGroup__atx"> [...]
+<p>Then, run the benchmarking app with the desired options. You can also use <a href="https://github.com/casey/just" target="_blank" rel="noopener noreferrer">just</a> to simplify the process. The <code>justfile</code> in the root level of repository and one of its commands is <code>rb</code> that runs the benchmarking app with the default options.</p>
+<p>The benchmarking app has several subcommands that allow you to test different scenarios. The most common subcommands are <code>send</code>, <code>poll</code>, <code>send-and-poll</code>, and <code>consumer-group-poll</code>. The <code>send</code> subcommand sends messages to the server, the <code>poll</code> subcommand reads messages from the server, the <code>send-and-poll</code> subcommand sends and reads messages in parallel, and the <code>consumer-group-poll</code> subcommand read [...]
+<p>You can also provide additional options to the subcommands to customize the benchmarking process like the message size, number of messages, number of producers and consumers, and other options.</p>
+<h3 class="anchor anchorWithStickyNavbar_LWe7" id="polling-reading-benchmark">Polling (reading) benchmark<a href="#polling-reading-benchmark" class="hash-link" aria-label="Direct link to Polling (reading) benchmark" title="Direct link to Polling (reading) benchmark">​</a></h3>
+<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><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">cargo r --bin iggy-bench -r -- -c -v send tcp</span><br></span></code></pre><div class="but [...]
+<h3 class="anchor anchorWithStickyNavbar_LWe7" id="sending-writing-benchmark">Sending (writing) benchmark<a href="#sending-writing-benchmark" class="hash-link" aria-label="Direct link to Sending (writing) benchmark" title="Direct link to Sending (writing) benchmark">​</a></h3>
+<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><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">cargo r --bin iggy-bench -r -- -c -v poll tcp</span><br></span></code></pre><div class="but [...]
+<h3 class="anchor anchorWithStickyNavbar_LWe7" id="parallel-sending-and-polling-benchmark">Parallel sending and polling benchmark<a href="#parallel-sending-and-polling-benchmark" class="hash-link" aria-label="Direct link to Parallel sending and polling benchmark" title="Direct link to Parallel sending and polling benchmark">​</a></h3>
+<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><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">cargo r --bin iggy-bench -r -- -c -v send-and-poll tcp</span><br></span></code></pre><div c [...]
+<h3 class="anchor anchorWithStickyNavbar_LWe7" id="polling-with-consumer-group">Polling with consumer group<a href="#polling-with-consumer-group" class="hash-link" aria-label="Direct link to Polling with consumer group" title="Direct link to Polling with consumer group">​</a></h3>
+<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><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">cargo r --bin iggy-bench -r -- -c -v send --streams 1 --partitions 10 --disable-parallel-pr [...]
+<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><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">cargo r --bin iggy-bench -r -- -c -v consumer-group-poll tcp</span><br></span></code></pre> [...]
+<h3 class="anchor anchorWithStickyNavbar_LWe7" id="send-a-total-amount-of-1mln-messages-1kb-each-by-30-producers-to-30-streams">Send a total amount of 1mln messages 1KB each by 30 producers to 30 streams<a href="#send-a-total-amount-of-1mln-messages-1kb-each-by-30-producers-to-30-streams" class="hash-link" aria-label="Direct link to Send a total amount of 1mln messages 1KB each by 30 producers to 30 streams" title="Direct link to Send a total amount of 1mln messages 1KB each by 30 produc [...]
+<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><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">cargo r --bin iggy-bench -r send --streams 30 --producers 30 --message-size 1000 --messages [...]
+<h3 class="anchor anchorWithStickyNavbar_LWe7" id="poll-a-total-amount-of-1mln-messages-1kb-each-by-30-consumers-from-30-streams">Poll a total amount of 1mln messages 1KB each by 30 consumers from 30 streams<a href="#poll-a-total-amount-of-1mln-messages-1kb-each-by-30-consumers-from-30-streams" class="hash-link" aria-label="Direct link to Poll a total amount of 1mln messages 1KB each by 30 consumers from 30 streams" title="Direct link to Poll a total amount of 1mln messages 1KB each by 3 [...]
+<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><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">cargo r --bin iggy-bench -r poll --streams 30 --consumers 30 --messages-per-batch 1000 --me [...]
+<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>.
+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>), message size, amount of messages, number of producers and consumers, and other factors, the results may vary. You can also tune the server configuration to achieve better performance.</p></div></article><nav class="pagination-nav docusaurus-mt-lg" aria-label="Docs pages"><a class="pagination-nav__link pagination-nav__link--prev" href="/docs/server/schema"><div class="pagination-na [...]
+<div>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div>
+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 000000000..1f9353eba
--- /dev/null
+++ b/docs/server/configuration/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-server/server-configuration" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.7.0">
+<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="stylesheet" href="/assets/css/styles.db211002.css">
+<script src="/assets/js/runtime~main.b0a22bcd.js" defer="defer"></script>
+<script src="/assets/js/main.f5453fd5.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const n=new URLSearchParams(window.location.search).entries();for(var[t,e]of n)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentEle [...]
+<p>In case no configuration file is found, the server will use the default configuration.</p>
+<p>Let&#x27;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_biex"><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 plain">[data_maintenance.archiver]</span><br></span><span class="token-line" style="color:#393A34" [...]
+<h3 class="anchor anchorWithStickyNavbar_LWe7" id="http">HTTP<a href="#http" class="hash-link" aria-label="Direct link to HTTP" title="Direct link to HTTP">​</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">Axum</a> and you can find all the available endpoints in <a href="https://github.com/iggy-rs/iggy/blob/master/server/server.http" target="_blank" rel="noopener noreferrer">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">REST Client</a> extension for VS Code.</p>
+<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&#x27;s not as performant as TCP, and, since it&#x27;s a stateless protocol, there&#x27;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 anchorWithStickyNavbar_LWe7" id="tcp">TCP<a href="#tcp" class="hash-link" aria-label="Direct link to TCP" title="Direct link to TCP">​</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 anchorWithStickyNavbar_LWe7" id="quic">QUIC<a href="#quic" class="hash-link" aria-label="Direct link to QUIC" title="Direct link to QUIC">​</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&#x27;s a stateful protocol, however, it&#x27;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">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></div></article><nav class="pagination-nav docusaurus-mt-lg" 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/docker"><d [...]
+<div>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div>
+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 000000000..f165c84ad
--- /dev/null
+++ b/docs/server/docker/index.html
@@ -0,0 +1,20 @@
+<!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.7.0">
+<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="stylesheet" href="/assets/css/styles.db211002.css">
+<script src="/assets/js/runtime~main.b0a22bcd.js" defer="defer"></script>
+<script src="/assets/js/main.f5453fd5.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const n=new URLSearchParams(window.location.search).entries();for(var[t,e]of n)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentEle [...]
+<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>
+<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><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>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div>
+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 000000000..7ad6334a4
--- /dev/null
+++ b/docs/server/introduction/index.html
@@ -0,0 +1,25 @@
+<!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.7.0">
+<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="stylesheet" href="/assets/css/styles.db211002.css">
+<script src="/assets/js/runtime~main.b0a22bcd.js" defer="defer"></script>
+<script src="/assets/js/main.f5453fd5.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const n=new URLSearchParams(window.location.search).entries();for(var[t,e]of n)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentEle [...]
+<p>Iggy server is the most important part of the system as it&#x27;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/iggy-rs/iggy/tags" target="_blank" rel="noopener noreferrer">here</a>. The official Docker images can be found <a href="https://hub.docker.com/r/iggyrs/iggy" target="_blank" rel="noopener noreferrer">here</a>, simply type <code>docker pull iggyrs/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">LTO</a> enabled in <a href="https://github.com/iggy-rs/iggy/blob/master/Cargo.toml#L2" target="_blank" rel="noopener noreferrer">profile</a>.</p>
+<p>The HTTP API endpoints can be found in <a href="https://github.com/iggy-rs/iggy/blob/master/server/server.http" target="_blank" rel="noopener noreferrer">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">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&#x27;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>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div>
+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 000000000..289b3b61e
--- /dev/null
+++ b/docs/server/schema/index.html
@@ -0,0 +1,314 @@
+<!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.7.0">
+<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="stylesheet" href="/assets/css/styles.db211002.css">
+<script src="/assets/js/runtime~main.b0a22bcd.js" defer="defer"></script>
+<script src="/assets/js/main.f5453fd5.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const n=new URLSearchParams(window.location.search).entries();for(var[t,e]of n)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentEle [...]
+<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&#x27;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/iggy-rs/iggy/blob/master/server/server.http" target="_blank" rel="noopener noreferrer">server.http</a>.</p>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" 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">​</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>length - 4-byte integer (u32) which represents the total length: code (4 bytes) + payload (N bytes)</li>
+<li>code - 4-byte integer (u32) which represents the request code</li>
+<li>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="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><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="token-line" s [...]
+<h2 class="anchor anchorWithStickyNavbar_LWe7" 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">​</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>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>length - 4-byte integer (u32) which represents the total length: status (4 bytes) + payload (N bytes)</li>
+<li>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&#x27;s no data to return.</p>
+<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><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="token-line" s [...]
+<h2 class="anchor anchorWithStickyNavbar_LWe7" 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">​</a></h2>
+<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><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 = 1;</span><br></span><span class="token-line" style="color:#393A34"><span class="toke [...]
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="shared">Shared<a href="#shared" class="hash-link" aria-label="Direct link to Shared" title="Direct link to Shared">​</a></h2>
+<hr>
+<h3 class="anchor anchorWithStickyNavbar_LWe7" id="consumer">Consumer<a href="#consumer" class="hash-link" aria-label="Direct link to Consumer" title="Direct link to Consumer">​</a></h3>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><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><code>kind</code> - 1 byte</li>
+<li><code>id</code> - 4 bytes</li>
+</ul>
+<h3 class="anchor anchorWithStickyNavbar_LWe7" id="identifier">Identifier<a href="#identifier" class="hash-link" aria-label="Direct link to Identifier" title="Direct link to Identifier">​</a></h3>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><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. &quot;my-stream&quot;) with variable length of UTF-8 string, maximum 255 bytes  [...]
+<p><strong>Serialization</strong></p>
+<ul>
+<li><code>kind</code> - 1 byte</li>
+<li><code>length</code> - 1 byte</li>
+<li><code>value</code> - N bytes</li>
+</ul>
+<h3 class="anchor anchorWithStickyNavbar_LWe7" id="polledmessages">PolledMessages<a href="#polledmessages" class="hash-link" aria-label="Direct link to PolledMessages" title="Direct link to PolledMessages">​</a></h3>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><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><code>partition_id</code> - 4 bytes</li>
+<li><code>current_offset</code> - 8 bytes</li>
+<li><code>messages_count</code> - 4 bytes (hidden field)</li>
+<li><code>messages</code> - N bytes</li>
+</ul>
+<h3 class="anchor anchorWithStickyNavbar_LWe7" id="message">Message<a href="#message" class="hash-link" aria-label="Direct link to Message" title="Direct link to Message">​</a></h3>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><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><code>offset</code> - 8 bytes</li>
+<li><code>state</code> - 1 byte</li>
+<li><code>timestamp</code> - 8 bytes</li>
+<li><code>id</code> - 16 bytes</li>
+<li><code>checksum</code> - 4 bytes</li>
+<li><code>headers</code> - N bytes</li>
+<li><code>length</code> - 4 bytes</li>
+<li><code>payload</code> - N bytes</li>
+</ul>
+<h3 class="anchor anchorWithStickyNavbar_LWe7" id="consumeroffsetinfo">ConsumerOffsetInfo<a href="#consumeroffsetinfo" class="hash-link" aria-label="Direct link to ConsumerOffsetInfo" title="Direct link to ConsumerOffsetInfo">​</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_biex"><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><code>partition_id</code> - 4 bytes</li>
+<li><code>current_offset</code> - 8 bytes</li>
+<li><code>stored_offset</code> - 8 bytes</li>
+</ul>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="streams">Streams<a href="#streams" class="hash-link" aria-label="Direct link to Streams" title="Direct link to Streams">​</a></h2>
+<hr>
+<h3 class="anchor anchorWithStickyNavbar_LWe7" 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">​</a></h3>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><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><code>stream_id</code> - 3-257 bytes</li>
+</ul>
+<h3 class="anchor anchorWithStickyNavbar_LWe7" 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">​</a></h3>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><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>Empty bytes</li>
+</ul>
+<h3 class="anchor anchorWithStickyNavbar_LWe7" 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">​</a></h3>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><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><code>stream_id</code> - 3-257 bytes</li>
+<li><code>name_length</code> - 1 byte (hidden field)</li>
+<li><code>name</code> - 1-255 bytes</li>
+</ul>
+<h3 class="anchor anchorWithStickyNavbar_LWe7" 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">​</a></h3>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><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><code>stream_id</code> - 3-257 bytes</li>
+</ul>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="topics">Topics<a href="#topics" class="hash-link" aria-label="Direct link to Topics" title="Direct link to Topics">​</a></h2>
+<hr>
+<h3 class="anchor anchorWithStickyNavbar_LWe7" 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">​</a></h3>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><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><code>stream_id</code> - 3-257 bytes</li>
+<li><code>topic_id</code> - 3-257 bytes</li>
+</ul>
+<h3 class="anchor anchorWithStickyNavbar_LWe7" 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">​</a></h3>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><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><code>stream_id</code> - 3-257 bytes</li>
+</ul>
+<h3 class="anchor anchorWithStickyNavbar_LWe7" 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">​</a></h3>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><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><code>stream_id</code> - 3-257 bytes</li>
+<li><code>topic_id</code> - 3-257 bytes</li>
+<li><code>partitions_count</code> - 4 bytes</li>
+<li><code>name_length</code> - 1 byte (hidden field)</li>
+<li><code>name</code> - 1-255 bytes</li>
+</ul>
+<h3 class="anchor anchorWithStickyNavbar_LWe7" 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">​</a></h3>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><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><code>stream_id</code> - 3-257 bytes</li>
+<li><code>topic_id</code> - 3-257 bytes</li>
+</ul>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="partitions">Partitions<a href="#partitions" class="hash-link" aria-label="Direct link to Partitions" title="Direct link to Partitions">​</a></h2>
+<hr>
+<h3 class="anchor anchorWithStickyNavbar_LWe7" 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">​</a></h3>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><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><code>stream_id</code> - 3-257 bytes</li>
+<li><code>topic_id</code> - 3-257 bytes</li>
+<li><code>partitions_count</code> - 4 bytes</li>
+</ul>
+<h3 class="anchor anchorWithStickyNavbar_LWe7" 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">​</a></h3>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><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><code>stream_id</code> - 3-257 bytes</li>
+<li><code>topic_id</code> - 3-257 bytes</li>
+<li><code>partitions_count</code> - 4 bytes</li>
+</ul>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="messages">Messages<a href="#messages" class="hash-link" aria-label="Direct link to Messages" title="Direct link to Messages">​</a></h2>
+<hr>
+<h3 class="anchor anchorWithStickyNavbar_LWe7" 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">​</a></h3>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><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><code>consumer</code> - 5 bytes</li>
+<li><code>stream_id</code> - 3-257 bytes</li>
+<li><code>topic_id</code> - 3-257 bytes</li>
+<li><code>partition_id</code> - 4 bytes</li>
+<li><code>strategy</code> - 9 bytes</li>
+<li><code>count</code> - 4 bytes</li>
+<li><code>auto_commit</code> - 1 byte</li>
+</ul>
+<h3 class="anchor anchorWithStickyNavbar_LWe7" 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">​</a></h3>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><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><code>stream_id</code> - 3-257 bytes</li>
+<li><code>topic_id</code> - 3-257 bytes</li>
+<li><code>partitioning</code> - 3-257 bytes</li>
+<li><code>messages</code> - 16 + 4 + N bytes per single message</li>
+</ul>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" 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">​</a></h2>
+<hr>
+<h3 class="anchor anchorWithStickyNavbar_LWe7" 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">​</a></h3>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><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><code>consumer</code> - 5 bytes</li>
+<li><code>stream_id</code> - 3-257 bytes</li>
+<li><code>topic_id</code> - 3-257 bytes</li>
+<li><code>partition_id</code> - 4 bytes</li>
+</ul>
+<h3 class="anchor anchorWithStickyNavbar_LWe7" 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">​</a></h3>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><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><code>consumer</code> - 5 bytes</li>
+<li><code>stream_id</code> - 3-257 bytes</li>
+<li><code>topic_id</code> - 3-257 bytes</li>
+<li><code>partition_id</code> - 4 bytes</li>
+<li><code>offset</code> - 8 bytes</li>
+</ul>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" 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">​</a></h2>
+<hr>
+<h3 class="anchor anchorWithStickyNavbar_LWe7" 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">​</a></h3>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><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><code>stream_id</code> - 3-257 bytes</li>
+<li><code>topic_id</code> - 3-257 bytes</li>
+<li><code>consumer_group_id</code> - 4 bytes</li>
+</ul>
+<h3 class="anchor anchorWithStickyNavbar_LWe7" 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">​</a></h3>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><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><code>stream_id</code> - 3-257 bytes</li>
+<li><code>topic_id</code> - 3-257 bytes</li>
+</ul>
+<h3 class="anchor anchorWithStickyNavbar_LWe7" 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">​</a></h3>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><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><code>stream_id</code> - 3-257 bytes</li>
+<li><code>topic_id</code> - 3-257 bytes</li>
+<li><code>consumer_group_id</code> - 4 bytes</li>
+</ul>
+<h3 class="anchor anchorWithStickyNavbar_LWe7" 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">​</a></h3>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><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><code>stream_id</code> - 3-257 bytes</li>
+<li><code>topic_id</code> - 3-257 bytes</li>
+<li><code>consumer_group_id</code> - 4 bytes</li>
+</ul>
+<h3 class="anchor anchorWithStickyNavbar_LWe7" 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">​</a></h3>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><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><code>stream_id</code> - 3-257 bytes</li>
+<li><code>topic_id</code> - 3-257 bytes</li>
+<li><code>consumer_group_id</code> - 4 bytes</li>
+</ul>
+<h3 class="anchor anchorWithStickyNavbar_LWe7" 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">​</a></h3>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><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><code>stream_id</code> - 3-257 bytes</li>
+<li><code>topic_id</code> - 3-257 bytes</li>
+<li><code>consumer_group_id</code> - 4 bytes</li>
+</ul>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="system">System<a href="#system" class="hash-link" aria-label="Direct link to System" title="Direct link to System">​</a></h2>
+<hr>
+<h3 class="anchor anchorWithStickyNavbar_LWe7" 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">​</a></h3>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><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>Empty bytes</li>
+</ul>
+<h3 class="anchor anchorWithStickyNavbar_LWe7" 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">​</a></h3>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><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><code>client_id</code> - 4 bytes</li>
+</ul>
+<h3 class="anchor anchorWithStickyNavbar_LWe7" 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">​</a></h3>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><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>Empty bytes</li>
+</ul>
+<h3 class="anchor anchorWithStickyNavbar_LWe7" 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">​</a></h3>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><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>Empty bytes</li>
+</ul></div></article><nav class="pagination-nav docusaurus-mt-lg" 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>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div>
+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 000000000..bcb40c880
--- /dev/null
+++ b/docs/web-ui/iggy-web-ui/index.html
@@ -0,0 +1,21 @@
+<!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.7.0">
+<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="stylesheet" href="/assets/css/styles.db211002.css">
+<script src="/assets/js/runtime~main.b0a22bcd.js" defer="defer"></script>
+<script src="/assets/js/main.f5453fd5.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const n=new URLSearchParams(window.location.search).entries();for(var[t,e]of n)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentEle [...]
+<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>Here&#x27;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 href="/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_biex"><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>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div>
+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/img/AdvancedFeatures.svg b/img/AdvancedFeatures.svg
new file mode 100644
index 000000000..b4d8a22ef
--- /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/ExtremelyEfficient.svg b/img/ExtremelyEfficient.svg
new file mode 100644
index 000000000..7a0456596
--- /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 000000000..fe8af7f43
--- /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/ManagementInterface.svg b/img/ManagementInterface.svg
new file mode 100644
index 000000000..6045a91fd
--- /dev/null
+++ b/img/ManagementInterface.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_3069)">
+		<path
+			d="M3 7C3 6.46957 3.21071 5.96086 3.58579 5.58579C3.96086 5.21071 4.46957 5 5 5H19C19.5304 5 20.0391 5.21071 20.4142 5.58579C20.7893 5.96086 21 6.46957 21 7V17C21 17.5304 20.7893 18.0391 20.4142 18.4142C20.0391 18.7893 19.5304 19 19 19H5C4.46957 19 3.96086 18.7893 3.58579 18.4142C3.21071 18.0391 3 17.5304 3 17V7Z"
+			stroke="#FF41EC"
+			stroke-width="2"
+			stroke-linecap="round"
+			stroke-linejoin="round"
+		/>
+		<path
+			d="M6 8H6.01"
+			stroke="#FF41EC"
+			stroke-width="2"
+			stroke-linecap="round"
+			stroke-linejoin="round"
+		/>
+		<path
+			d="M9 8H9.01"
+			stroke="#FF41EC"
+			stroke-width="2"
+			stroke-linecap="round"
+			stroke-linejoin="round"
+		/>
+	</g>
+	<defs>
+		<clipPath id="clip0_1018_3069">
+			<rect width="24" height="24" fill="white" />
+		</clipPath>
+	</defs>
+</svg>
diff --git a/img/MultipleTransports.svg b/img/MultipleTransports.svg
new file mode 100644
index 000000000..7a7fb6c76
--- /dev/null
+++ b/img/MultipleTransports.svg
@@ -0,0 +1,72 @@
+<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_3051)">
+		<path
+			d="M8 18C8 17.4696 7.78929 16.9609 7.41421 16.5858C7.03914 16.2107 6.53043 16 6 16C5.46957 16 4.96086 16.2107 4.58579 16.5858C4.21071 16.9609 4 17.4696 4 18C4 18.5304 4.21071 19.0391 4.58579 19.4142C4.96086 19.7893 5.46957 20 6 20C6.53043 20 7.03914 19.7893 7.41421 19.4142C7.78929 19.0391 8 18.5304 8 18Z"
+			stroke="#4E7FFF"
+			stroke-width="2"
+			stroke-linecap="round"
+			stroke-linejoin="round"
+		/>
+		<path
+			d="M20 6C20 5.46957 19.7893 4.96086 19.4142 4.58579C19.0391 4.21071 18.5304 4 18 4C17.4696 4 16.9609 4.21071 16.5858 4.58579C16.2107 4.96086 16 5.46957 16 6C16 6.53043 16.2107 7.03914 16.5858 7.41421C16.9609 7.78929 17.4696 8 18 8C18.5304 8 19.0391 7.78929 19.4142 7.41421C19.7893 7.03914 20 6.53043 20 6Z"
+			stroke="#4E7FFF"
+			stroke-width="2"
+			stroke-linecap="round"
+			stroke-linejoin="round"
+		/>
+		<path
+			d="M8 6C8 5.46957 7.78929 4.96086 7.41421 4.58579C7.03914 4.21071 6.53043 4 6 4C5.46957 4 4.96086 4.21071 4.58579 4.58579C4.21071 4.96086 4 5.46957 4 6C4 6.53043 4.21071 7.03914 4.58579 7.41421C4.96086 7.78929 5.46957 8 6 8C6.53043 8 7.03914 7.78929 7.41421 7.41421C7.78929 7.03914 8 6.53043 8 6Z"
+			stroke="#4E7FFF"
+			stroke-width="2"
+			stroke-linecap="round"
+			stroke-linejoin="round"
+		/>
+		<path
+			d="M20 18C20 17.4696 19.7893 16.9609 19.4142 16.5858C19.0391 16.2107 18.5304 16 18 16C17.4696 16 16.9609 16.2107 16.5858 16.5858C16.2107 16.9609 16 17.4696 16 18C16 18.5304 16.2107 19.0391 16.5858 19.4142C16.9609 19.7893 17.4696 20 18 20C18.5304 20 19.0391 19.7893 19.4142 19.4142C19.7893 19.0391 20 18.5304 20 18Z"
+			stroke="#4E7FFF"
+			stroke-width="2"
+			stroke-linecap="round"
+			stroke-linejoin="round"
+		/>
+		<path
+			d="M14 12C14 11.4696 13.7893 10.9609 13.4142 10.5858C13.0391 10.2107 12.5304 10 12 10C11.4696 10 10.9609 10.2107 10.5858 10.5858C10.2107 10.9609 10 11.4696 10 12C10 12.5304 10.2107 13.0391 10.5858 13.4142C10.9609 13.7893 11.4696 14 12 14C12.5304 14 13.0391 13.7893 13.4142 13.4142C13.7893 13.0391 14 12.5304 14 12Z"
+			stroke="#4E7FFF"
+			stroke-width="2"
+			stroke-linecap="round"
+			stroke-linejoin="round"
+		/>
+		<path
+			d="M7.5 7.5L10.5 10.5"
+			stroke="#4E7FFF"
+			stroke-width="2"
+			stroke-linecap="round"
+			stroke-linejoin="round"
+		/>
+		<path
+			d="M7.5 16.5L10.5 13.5"
+			stroke="#4E7FFF"
+			stroke-width="2"
+			stroke-linecap="round"
+			stroke-linejoin="round"
+		/>
+		<path
+			d="M13.5 13.5L16.5 16.5"
+			stroke="#4E7FFF"
+			stroke-width="2"
+			stroke-linecap="round"
+			stroke-linejoin="round"
+		/>
+		<path
+			d="M16.5 7.5L13.5 10.5"
+			stroke="#4E7FFF"
+			stroke-width="2"
+			stroke-linecap="round"
+			stroke-linejoin="round"
+		/>
+	</g>
+	<defs>
+		<clipPath id="clip0_1018_3051">
+			<rect width="24" height="24" fill="white" />
+		</clipPath>
+	</defs>
+</svg>
diff --git a/img/Sdk.svg b/img/Sdk.svg
new file mode 100644
index 000000000..71c184777
--- /dev/null
+++ b/img/Sdk.svg
@@ -0,0 +1,44 @@
+<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_3062)">
+		<path
+			d="M7 8H4C3.73478 8 3.48043 8.10536 3.29289 8.29289C3.10536 8.48043 3 8.73478 3 9V11C3 11.2652 3.10536 11.5196 3.29289 11.7071C3.48043 11.8946 3.73478 12 4 12H6C6.26522 12 6.51957 12.1054 6.70711 12.2929C6.89464 12.4804 7 12.7348 7 13V15C7 15.2652 6.89464 15.5196 6.70711 15.7071C6.51957 15.8946 6.26522 16 6 16H3"
+			stroke="#4E7FFF"
+			stroke-width="2"
+			stroke-linecap="round"
+			stroke-linejoin="round"
+		/>
+		<path
+			d="M17 8V16"
+			stroke="#4E7FFF"
+			stroke-width="2"
+			stroke-linecap="round"
+			stroke-linejoin="round"
+		/>
+		<path
+			d="M21 8L18 12L21 16"
+			stroke="#4E7FFF"
+			stroke-width="2"
+			stroke-linecap="round"
+			stroke-linejoin="round"
+		/>
+		<path
+			d="M17 12H18"
+			stroke="#4E7FFF"
+			stroke-width="2"
+			stroke-linecap="round"
+			stroke-linejoin="round"
+		/>
+		<path
+			d="M10 8V16H12C12.5304 16 13.0391 15.7893 13.4142 15.4142C13.7893 15.0391 14 14.5304 14 14V10C14 9.46957 13.7893 8.96086 13.4142 8.58579C13.0391 8.21071 12.5304 8 12 8H10Z"
+			stroke="#4E7FFF"
+			stroke-width="2"
+			stroke-linecap="round"
+			stroke-linejoin="round"
+		/>
+	</g>
+	<defs>
+		<clipPath id="clip0_1018_3062">
+			<rect width="24" height="24" fill="white" />
+		</clipPath>
+	</defs>
+</svg>
diff --git a/img/apache-iggy-light-bg0.5x.png b/img/apache-iggy-light-bg0.5x.png
new file mode 100644
index 000000000..85ff17636
Binary files /dev/null and b/img/apache-iggy-light-bg0.5x.png differ
diff --git a/img/apache-iggy0.5x.png b/img/apache-iggy0.5x.png
new file mode 100644
index 000000000..90a39b63e
Binary files /dev/null and b/img/apache-iggy0.5x.png differ
diff --git a/img/docusaurus-social-card.jpg b/img/docusaurus-social-card.jpg
new file mode 100644
index 000000000..ffcb44821
Binary files /dev/null and b/img/docusaurus-social-card.jpg differ
diff --git a/img/docusaurus.png b/img/docusaurus.png
new file mode 100644
index 000000000..f458149e3
Binary files /dev/null and b/img/docusaurus.png differ
diff --git a/img/favicon.ico b/img/favicon.ico
new file mode 100644
index 000000000..131996275
Binary files /dev/null and b/img/favicon.ico differ
diff --git a/img/iggy-logo-1.png b/img/iggy-logo-1.png
new file mode 100644
index 000000000..e7df66b51
Binary files /dev/null and b/img/iggy-logo-1.png differ
diff --git a/img/iggy.png b/img/iggy.png
new file mode 100644
index 000000000..06fcd4c71
Binary files /dev/null and b/img/iggy.png differ
diff --git a/img/iggy_0_1_0.jpg b/img/iggy_0_1_0.jpg
new file mode 100644
index 000000000..8b7383373
Binary files /dev/null and b/img/iggy_0_1_0.jpg differ
diff --git a/img/iggy_bench_0_1_0.jpeg b/img/iggy_bench_0_1_0.jpeg
new file mode 100644
index 000000000..36aeca376
Binary files /dev/null and b/img/iggy_bench_0_1_0.jpeg differ
diff --git a/img/iggy_ci_0_1_0.jpeg b/img/iggy_ci_0_1_0.jpeg
new file mode 100644
index 000000000..2a597fb35
Binary files /dev/null and b/img/iggy_ci_0_1_0.jpeg differ
diff --git a/img/iggy_cli.png b/img/iggy_cli.png
new file mode 100644
index 000000000..50131be4c
Binary files /dev/null and b/img/iggy_cli.png differ
diff --git a/img/iggy_cli_0_1_0.jpeg b/img/iggy_cli_0_1_0.jpeg
new file mode 100644
index 000000000..1853b130f
Binary files /dev/null and b/img/iggy_cli_0_1_0.jpeg differ
diff --git a/img/iggy_server_0_1_0.jpeg b/img/iggy_server_0_1_0.jpeg
new file mode 100644
index 000000000..2f6b74adb
Binary files /dev/null and b/img/iggy_server_0_1_0.jpeg differ
diff --git a/img/iggy_web_ui_0_1_0.jpeg b/img/iggy_web_ui_0_1_0.jpeg
new file mode 100644
index 000000000..168eeda49
Binary files /dev/null and b/img/iggy_web_ui_0_1_0.jpeg differ
diff --git a/img/logo.png b/img/logo.png
new file mode 100644
index 000000000..bf1f0d329
Binary files /dev/null and b/img/logo.png differ
diff --git a/img/logo.svg b/img/logo.svg
new file mode 100644
index 000000000..9db6d0d06
--- /dev/null
+++ b/img/logo.svg
@@ -0,0 +1 @@
+<svg width="200" height="200" viewBox="0 0 200 200" xmlns="http://www.w3.org/2000/svg"><g fill="none" fill-rule="evenodd"><path fill="#FFF" d="M99 52h84v34H99z"/><path d="M23 163c-7.398 0-13.843-4.027-17.303-10A19.886 19.886 0 0 0 3 163c0 11.046 8.954 20 20 20h20v-20H23z" fill="#3ECC5F"/><path d="M112.98 57.376L183 53V43c0-11.046-8.954-20-20-20H73l-2.5-4.33c-1.112-1.925-3.889-1.925-5 0L63 23l-2.5-4.33c-1.111-1.925-3.889-1.925-5 0L53 23l-2.5-4.33c-1.111-1.925-3.889-1.925-5 0L43 23c-.022 0 [...]
\ No newline at end of file
diff --git a/img/undraw_docusaurus_mountain.svg b/img/undraw_docusaurus_mountain.svg
new file mode 100644
index 000000000..af961c49a
--- /dev/null
+++ b/img/undraw_docusaurus_mountain.svg
@@ -0,0 +1,171 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="1088" height="687.962" viewBox="0 0 1088 687.962">
+  <title>Easy to Use</title>
+  <g id="Group_12" data-name="Group 12" transform="translate(-57 -56)">
+    <g id="Group_11" data-name="Group 11" transform="translate(57 56)">
+      <path id="Path_83" data-name="Path 83" d="M1017.81,560.461c-5.27,45.15-16.22,81.4-31.25,110.31-20,38.52-54.21,54.04-84.77,70.28a193.275,193.275,0,0,1-27.46,11.94c-55.61,19.3-117.85,14.18-166.74,3.99a657.282,657.282,0,0,0-104.09-13.16q-14.97-.675-29.97-.67c-15.42.02-293.07,5.29-360.67-131.57-16.69-33.76-28.13-75-32.24-125.27-11.63-142.12,52.29-235.46,134.74-296.47,155.97-115.41,369.76-110.57,523.43,7.88C941.15,276.621,1036.99,396.031,1017.81,560.461Z" transform="translate(-56 -106.0 [...]
+      <path id="Path_84" data-name="Path 84" d="M986.56,670.771c-20,38.52-47.21,64.04-77.77,80.28a193.272,193.272,0,0,1-27.46,11.94c-55.61,19.3-117.85,14.18-166.74,3.99a657.3,657.3,0,0,0-104.09-13.16q-14.97-.675-29.97-.67-23.13.03-46.25,1.72c-100.17,7.36-253.82-6.43-321.42-143.29L382,283.981,444.95,445.6l20.09,51.59,55.37-75.98L549,381.981l130.2,149.27,36.8-81.27L970.78,657.9l14.21,11.59Z" transform="translate(-56 -106.019)" fill="#f2f2f2"/>
+      <path id="Path_85" data-name="Path 85" d="M302,282.962l26-57,36,83-31-60Z" opacity="0.1"/>
+      <path id="Path_86" data-name="Path 86" d="M610.5,753.821q-14.97-.675-29.97-.67L465.04,497.191Z" transform="translate(-56 -106.019)" opacity="0.1"/>
+      <path id="Path_87" data-name="Path 87" d="M464.411,315.191,493,292.962l130,150-132-128Z" opacity="0.1"/>
+      <path id="Path_88" data-name="Path 88" d="M908.79,751.051a193.265,193.265,0,0,1-27.46,11.94L679.2,531.251Z" transform="translate(-56 -106.019)" opacity="0.1"/>
+      <circle id="Ellipse_11" data-name="Ellipse 11" cx="3" cy="3" r="3" transform="translate(479 98.962)" fill="#f2f2f2"/>
+      <circle id="Ellipse_12" data-name="Ellipse 12" cx="3" cy="3" r="3" transform="translate(396 201.962)" fill="#f2f2f2"/>
+      <circle id="Ellipse_13" data-name="Ellipse 13" cx="2" cy="2" r="2" transform="translate(600 220.962)" fill="#f2f2f2"/>
+      <circle id="Ellipse_14" data-name="Ellipse 14" cx="2" cy="2" r="2" transform="translate(180 265.962)" fill="#f2f2f2"/>
+      <circle id="Ellipse_15" data-name="Ellipse 15" cx="2" cy="2" r="2" transform="translate(612 96.962)" fill="#f2f2f2"/>
+      <circle id="Ellipse_16" data-name="Ellipse 16" cx="2" cy="2" r="2" transform="translate(736 192.962)" fill="#f2f2f2"/>
+      <circle id="Ellipse_17" data-name="Ellipse 17" cx="2" cy="2" r="2" transform="translate(858 344.962)" fill="#f2f2f2"/>
+      <path id="Path_89" data-name="Path 89" d="M306,121.222h-2.76v-2.76h-1.48v2.76H299V122.7h2.76v2.759h1.48V122.7H306Z" fill="#f2f2f2"/>
+      <path id="Path_90" data-name="Path 90" d="M848,424.222h-2.76v-2.76h-1.48v2.76H841V425.7h2.76v2.759h1.48V425.7H848Z" fill="#f2f2f2"/>
+      <path id="Path_91" data-name="Path 91" d="M1144,719.981c0,16.569-243.557,74-544,74s-544-57.431-544-74,243.557,14,544,14S1144,703.413,1144,719.981Z" transform="translate(-56 -106.019)" fill="#3f3d56"/>
+      <path id="Path_92" data-name="Path 92" d="M1144,719.981c0,16.569-243.557,74-544,74s-544-57.431-544-74,243.557,14,544,14S1144,703.413,1144,719.981Z" transform="translate(-56 -106.019)" opacity="0.1"/>
+      <ellipse id="Ellipse_18" data-name="Ellipse 18" cx="544" cy="30" rx="544" ry="30" transform="translate(0 583.962)" fill="#3f3d56"/>
+      <path id="Path_93" data-name="Path 93" d="M624,677.981c0,33.137-14.775,24-33,24s-33,9.137-33-24,33-96,33-96S624,644.844,624,677.981Z" transform="translate(-56 -106.019)" fill="#ff6584"/>
+      <path id="Path_94" data-name="Path 94" d="M606,690.66c0,15.062-6.716,10.909-15,10.909s-15,4.153-15-10.909,15-43.636,15-43.636S606,675.6,606,690.66Z" transform="translate(-56 -106.019)" opacity="0.1"/>
+      <rect id="Rectangle_97" data-name="Rectangle 97" width="92" height="18" rx="9" transform="translate(489 604.962)" fill="#2f2e41"/>
+      <rect id="Rectangle_98" data-name="Rectangle 98" width="92" height="18" rx="9" transform="translate(489 586.962)" fill="#2f2e41"/>
+      <path id="Path_95" data-name="Path 95" d="M193,596.547c0,55.343,34.719,100.126,77.626,100.126" transform="translate(-56 -106.019)" fill="#3f3d56"/>
+      <path id="Path_96" data-name="Path 96" d="M270.626,696.673c0-55.965,38.745-101.251,86.626-101.251" transform="translate(-56 -106.019)" fill="#6c63ff"/>
+      <path id="Path_97" data-name="Path 97" d="M221.125,601.564c0,52.57,22.14,95.109,49.5,95.109" transform="translate(-56 -106.019)" fill="#6c63ff"/>
+      <path id="Path_98" data-name="Path 98" d="M270.626,696.673c0-71.511,44.783-129.377,100.126-129.377" transform="translate(-56 -106.019)" fill="#3f3d56"/>
+      <path id="Path_99" data-name="Path 99" d="M254.3,697.379s11.009-.339,14.326-2.7,16.934-5.183,17.757-1.395,16.544,18.844,4.115,18.945-28.879-1.936-32.19-3.953S254.3,697.379,254.3,697.379Z" transform="translate(-56 -106.019)" fill="#a8a8a8"/>
+      <path id="Path_100" data-name="Path 100" d="M290.716,710.909c-12.429.1-28.879-1.936-32.19-3.953-2.522-1.536-3.527-7.048-3.863-9.591l-.368.014s.7,8.879,4.009,10.9,19.761,4.053,32.19,3.953c3.588-.029,4.827-1.305,4.759-3.2C294.755,710.174,293.386,710.887,290.716,710.909Z" transform="translate(-56 -106.019)" opacity="0.2"/>
+      <path id="Path_101" data-name="Path 101" d="M777.429,633.081c0,38.029,23.857,68.8,53.341,68.8" transform="translate(-56 -106.019)" fill="#3f3d56"/>
+      <path id="Path_102" data-name="Path 102" d="M830.769,701.882c0-38.456,26.623-69.575,59.525-69.575" transform="translate(-56 -106.019)" fill="#6c63ff"/>
+      <path id="Path_103" data-name="Path 103" d="M796.755,636.528c0,36.124,15.213,65.354,34.014,65.354" transform="translate(-56 -106.019)" fill="#6c63ff"/>
+      <path id="Path_104" data-name="Path 104" d="M830.769,701.882c0-49.139,30.773-88.9,68.8-88.9" transform="translate(-56 -106.019)" fill="#3f3d56"/>
+      <path id="Path_105" data-name="Path 105" d="M819.548,702.367s7.565-.233,9.844-1.856,11.636-3.562,12.2-.958,11.368,12.949,2.828,13.018-19.844-1.33-22.119-2.716S819.548,702.367,819.548,702.367Z" transform="translate(-56 -106.019)" fill="#a8a8a8"/>
+      <path id="Path_106" data-name="Path 106" d="M844.574,711.664c-8.54.069-19.844-1.33-22.119-2.716-1.733-1.056-2.423-4.843-2.654-6.59l-.253.01s.479,6.1,2.755,7.487,13.579,2.785,22.119,2.716c2.465-.02,3.317-.9,3.27-2.2C847.349,711.159,846.409,711.649,844.574,711.664Z" transform="translate(-56 -106.019)" opacity="0.2"/>
+      <path id="Path_107" data-name="Path 107" d="M949.813,724.718s11.36-1.729,14.5-4.591,16.89-7.488,18.217-3.667,19.494,17.447,6.633,19.107-30.153,1.609-33.835-.065S949.813,724.718,949.813,724.718Z" transform="translate(-56 -106.019)" fill="#a8a8a8"/>
+      <path id="Path_108" data-name="Path 108" d="M989.228,734.173c-12.86,1.659-30.153,1.609-33.835-.065-2.8-1.275-4.535-6.858-5.2-9.45l-.379.061s1.833,9.109,5.516,10.783,20.975,1.725,33.835.065c3.712-.479,4.836-1.956,4.529-3.906C993.319,732.907,991.991,733.817,989.228,734.173Z" transform="translate(-56 -106.019)" opacity="0.2"/>
+      <path id="Path_109" data-name="Path 109" d="M670.26,723.9s9.587-1.459,12.237-3.875,14.255-6.32,15.374-3.095,16.452,14.725,5.6,16.125-25.448,1.358-28.555-.055S670.26,723.9,670.26,723.9Z" transform="translate(-56 -106.019)" fill="#a8a8a8"/>
+      <path id="Path_110" data-name="Path 110" d="M703.524,731.875c-10.853,1.4-25.448,1.358-28.555-.055-2.367-1.076-3.827-5.788-4.39-7.976l-.32.051s1.547,7.687,4.655,9.1,17.7,1.456,28.555.055c3.133-.4,4.081-1.651,3.822-3.3C706.977,730.807,705.856,731.575,703.524,731.875Z" transform="translate(-56 -106.019)" opacity="0.2"/>
+      <path id="Path_111" data-name="Path 111" d="M178.389,719.109s7.463-1.136,9.527-3.016,11.1-4.92,11.969-2.409,12.808,11.463,4.358,12.553-19.811,1.057-22.23-.043S178.389,719.109,178.389,719.109Z" transform="translate(-56 -106.019)" fill="#a8a8a8"/>
+      <path id="Path_112" data-name="Path 112" d="M204.285,725.321c-8.449,1.09-19.811,1.057-22.23-.043-1.842-.838-2.979-4.506-3.417-6.209l-.249.04s1.2,5.984,3.624,7.085,13.781,1.133,22.23.043c2.439-.315,3.177-1.285,2.976-2.566C206.973,724.489,206.1,725.087,204.285,725.321Z" transform="translate(-56 -106.019)" opacity="0.2"/>
+      <path id="Path_113" data-name="Path 113" d="M439.7,707.337c0,30.22-42.124,20.873-93.7,20.873s-93.074,9.347-93.074-20.873,42.118-36.793,93.694-36.793S439.7,677.117,439.7,707.337Z" transform="translate(-56 -106.019)" opacity="0.1"/>
+      <path id="Path_114" data-name="Path 114" d="M439.7,699.9c0,30.22-42.124,20.873-93.7,20.873s-93.074,9.347-93.074-20.873S295.04,663.1,346.616,663.1,439.7,669.676,439.7,699.9Z" transform="translate(-56 -106.019)" fill="#3f3d56"/>
+    </g>
+    <g id="docusaurus_keytar" transform="translate(312.271 493.733)">
+      <path id="Path_40" data-name="Path 40" d="M99,52h91.791V89.153H99Z" transform="translate(5.904 -14.001)" fill="#fff" fill-rule="evenodd"/>
+      <path id="Path_41" data-name="Path 41" d="M24.855,163.927A21.828,21.828,0,0,1,5.947,153a21.829,21.829,0,0,0,18.908,32.782H46.71V163.927Z" transform="translate(-3 -4.634)" fill="#3ecc5f" fill-rule="evenodd"/>
+      <path id="Path_42" data-name="Path 42" d="M121.861,61.1l76.514-4.782V45.39A21.854,21.854,0,0,0,176.52,23.535H78.173L75.441,18.8a3.154,3.154,0,0,0-5.464,0l-2.732,4.732L64.513,18.8a3.154,3.154,0,0,0-5.464,0l-2.732,4.732L53.586,18.8a3.154,3.154,0,0,0-5.464,0L45.39,23.535c-.024,0-.046,0-.071,0l-4.526-4.525a3.153,3.153,0,0,0-5.276,1.414l-1.5,5.577-5.674-1.521a3.154,3.154,0,0,0-3.863,3.864L26,34.023l-5.575,1.494a3.155,3.155,0,0,0-1.416,5.278l4.526,4.526c0,.023,0,.046,0,.07L18.8,48.122a3. [...]
+      <path id="Path_43" data-name="Path 43" d="M143,186.71h32.782V143H143Z" transform="translate(9.984 -5.561)" fill="#3ecc5f" fill-rule="evenodd"/>
+      <path id="Path_44" data-name="Path 44" d="M196.71,159.855a5.438,5.438,0,0,0-.7.07c-.042-.164-.081-.329-.127-.493a5.457,5.457,0,1,0-5.4-9.372q-.181-.185-.366-.367a5.454,5.454,0,1,0-9.384-5.4c-.162-.046-.325-.084-.486-.126a5.467,5.467,0,1,0-10.788,0c-.162.042-.325.08-.486.126a5.457,5.457,0,1,0-9.384,5.4,21.843,21.843,0,1,0,36.421,21.02,5.452,5.452,0,1,0,.7-10.858" transform="translate(10.912 -6.025)" fill="#44d860" fill-rule="evenodd"/>
+      <path id="Path_45" data-name="Path 45" d="M153,124.855h32.782V103H153Z" transform="translate(10.912 -9.271)" fill="#3ecc5f" fill-rule="evenodd"/>
+      <path id="Path_46" data-name="Path 46" d="M194.855,116.765a2.732,2.732,0,1,0,0-5.464,2.811,2.811,0,0,0-.349.035c-.022-.082-.04-.164-.063-.246a2.733,2.733,0,0,0-1.052-5.253,2.7,2.7,0,0,0-1.648.566q-.09-.093-.184-.184a2.7,2.7,0,0,0,.553-1.633,2.732,2.732,0,0,0-5.245-1.07,10.928,10.928,0,1,0,0,21.031,2.732,2.732,0,0,0,5.245-1.07,2.7,2.7,0,0,0-.553-1.633q.093-.09.184-.184a2.7,2.7,0,0,0,1.648.566,2.732,2.732,0,0,0,1.052-5.253c.023-.081.042-.164.063-.246a2.814,2.814,0,0,0,.349.035" trans [...]
+      <path id="Path_47" data-name="Path 47" d="M65.087,56.891a2.732,2.732,0,0,1-2.732-2.732,8.2,8.2,0,0,0-16.391,0,2.732,2.732,0,0,1-5.464,0,13.659,13.659,0,0,1,27.319,0,2.732,2.732,0,0,1-2.732,2.732" transform="translate(0.478 -15.068)" fill-rule="evenodd"/>
+      <path id="Path_48" data-name="Path 48" d="M103,191.347h65.565a21.854,21.854,0,0,0,21.855-21.855V93H124.855A21.854,21.854,0,0,0,103,114.855Z" transform="translate(6.275 -10.199)" fill="#ffff50" fill-rule="evenodd"/>
+      <path id="Path_49" data-name="Path 49" d="M173.216,129.787H118.535a1.093,1.093,0,1,1,0-2.185h54.681a1.093,1.093,0,0,1,0,2.185m0,21.855H118.535a1.093,1.093,0,1,1,0-2.186h54.681a1.093,1.093,0,0,1,0,2.186m0,21.855H118.535a1.093,1.093,0,1,1,0-2.185h54.681a1.093,1.093,0,0,1,0,2.185m0-54.434H118.535a1.093,1.093,0,1,1,0-2.185h54.681a1.093,1.093,0,0,1,0,2.185m0,21.652H118.535a1.093,1.093,0,1,1,0-2.186h54.681a1.093,1.093,0,0,1,0,2.186m0,21.855H118.535a1.093,1.093,0,1,1,0-2.186h54.681a1.093, [...]
+      <path id="Path_50" data-name="Path 50" d="M83,186.71h43.71V143H83Z" transform="translate(4.42 -5.561)" fill="#3ecc5f" fill-rule="evenodd"/>
+      <g id="Group_8" data-name="Group 8" transform="matrix(0.966, -0.259, 0.259, 0.966, 109.327, 91.085)">
+        <rect id="Rectangle_3" data-name="Rectangle 3" width="92.361" height="36.462" rx="2" transform="translate(0 0)" fill="#d8d8d8"/>
+        <g id="Group_2" data-name="Group 2" transform="translate(1.531 23.03)">
+          <rect id="Rectangle_4" data-name="Rectangle 4" width="5.336" height="5.336" rx="1" transform="translate(16.797 0)" fill="#4a4a4a"/>
+          <rect id="Rectangle_5" data-name="Rectangle 5" width="5.336" height="5.336" rx="1" transform="translate(23.12 0)" fill="#4a4a4a"/>
+          <rect id="Rectangle_6" data-name="Rectangle 6" width="5.336" height="5.336" rx="1" transform="translate(29.444 0)" fill="#4a4a4a"/>
+          <rect id="Rectangle_7" data-name="Rectangle 7" width="5.336" height="5.336" rx="1" transform="translate(35.768 0)" fill="#4a4a4a"/>
+          <rect id="Rectangle_8" data-name="Rectangle 8" width="5.336" height="5.336" rx="1" transform="translate(42.091 0)" fill="#4a4a4a"/>
+          <rect id="Rectangle_9" data-name="Rectangle 9" width="5.336" height="5.336" rx="1" transform="translate(48.415 0)" fill="#4a4a4a"/>
+          <rect id="Rectangle_10" data-name="Rectangle 10" width="5.336" height="5.336" rx="1" transform="translate(54.739 0)" fill="#4a4a4a"/>
+          <rect id="Rectangle_11" data-name="Rectangle 11" width="5.336" height="5.336" rx="1" transform="translate(61.063 0)" fill="#4a4a4a"/>
+          <rect id="Rectangle_12" data-name="Rectangle 12" width="5.336" height="5.336" rx="1" transform="translate(67.386 0)" fill="#4a4a4a"/>
+          <path id="Path_51" data-name="Path 51" d="M1.093,0H14.518a1.093,1.093,0,0,1,1.093,1.093V4.243a1.093,1.093,0,0,1-1.093,1.093H1.093A1.093,1.093,0,0,1,0,4.243V1.093A1.093,1.093,0,0,1,1.093,0ZM75,0H88.426a1.093,1.093,0,0,1,1.093,1.093V4.243a1.093,1.093,0,0,1-1.093,1.093H75a1.093,1.093,0,0,1-1.093-1.093V1.093A1.093,1.093,0,0,1,75,0Z" transform="translate(0 0)" fill="#4a4a4a" fill-rule="evenodd"/>
+        </g>
+        <g id="Group_3" data-name="Group 3" transform="translate(1.531 10.261)">
+          <path id="Path_52" data-name="Path 52" d="M1.093,0H6.218A1.093,1.093,0,0,1,7.31,1.093V4.242A1.093,1.093,0,0,1,6.218,5.335H1.093A1.093,1.093,0,0,1,0,4.242V1.093A1.093,1.093,0,0,1,1.093,0Z" transform="translate(0 0)" fill="#4a4a4a" fill-rule="evenodd"/>
+          <rect id="Rectangle_13" data-name="Rectangle 13" width="5.336" height="5.336" rx="1" transform="translate(8.299 0)" fill="#4a4a4a"/>
+          <rect id="Rectangle_14" data-name="Rectangle 14" width="5.336" height="5.336" rx="1" transform="translate(14.623 0)" fill="#4a4a4a"/>
+          <rect id="Rectangle_15" data-name="Rectangle 15" width="5.336" height="5.336" rx="1" transform="translate(20.947 0)" fill="#4a4a4a"/>
+          <rect id="Rectangle_16" data-name="Rectangle 16" width="5.336" height="5.336" rx="1" transform="translate(27.271 0)" fill="#4a4a4a"/>
+          <rect id="Rectangle_17" data-name="Rectangle 17" width="5.336" height="5.336" rx="1" transform="translate(33.594 0)" fill="#4a4a4a"/>
+          <rect id="Rectangle_18" data-name="Rectangle 18" width="5.336" height="5.336" rx="1" transform="translate(39.918 0)" fill="#4a4a4a"/>
+          <rect id="Rectangle_19" data-name="Rectangle 19" width="5.336" height="5.336" rx="1" transform="translate(46.242 0)" fill="#4a4a4a"/>
+          <rect id="Rectangle_20" data-name="Rectangle 20" width="5.336" height="5.336" rx="1" transform="translate(52.565 0)" fill="#4a4a4a"/>
+          <rect id="Rectangle_21" data-name="Rectangle 21" width="5.336" height="5.336" rx="1" transform="translate(58.888 0)" fill="#4a4a4a"/>
+          <rect id="Rectangle_22" data-name="Rectangle 22" width="5.336" height="5.336" rx="1" transform="translate(65.212 0)" fill="#4a4a4a"/>
+          <rect id="Rectangle_23" data-name="Rectangle 23" width="5.336" height="5.336" rx="1" transform="translate(71.536 0)" fill="#4a4a4a"/>
+          <rect id="Rectangle_24" data-name="Rectangle 24" width="5.336" height="5.336" rx="1" transform="translate(77.859 0)" fill="#4a4a4a"/>
+          <rect id="Rectangle_25" data-name="Rectangle 25" width="5.336" height="5.336" rx="1" transform="translate(84.183 0)" fill="#4a4a4a"/>
+        </g>
+        <g id="Group_4" data-name="Group 4" transform="translate(91.05 9.546) rotate(180)">
+          <path id="Path_53" data-name="Path 53" d="M1.093,0H6.219A1.093,1.093,0,0,1,7.312,1.093v3.15A1.093,1.093,0,0,1,6.219,5.336H1.093A1.093,1.093,0,0,1,0,4.243V1.093A1.093,1.093,0,0,1,1.093,0Z" transform="translate(0 0)" fill="#4a4a4a" fill-rule="evenodd"/>
+          <rect id="Rectangle_26" data-name="Rectangle 26" width="5.336" height="5.336" rx="1" transform="translate(8.299 0)" fill="#4a4a4a"/>
+          <rect id="Rectangle_27" data-name="Rectangle 27" width="5.336" height="5.336" rx="1" transform="translate(14.623 0)" fill="#4a4a4a"/>
+          <rect id="Rectangle_28" data-name="Rectangle 28" width="5.336" height="5.336" rx="1" transform="translate(20.947 0)" fill="#4a4a4a"/>
+          <rect id="Rectangle_29" data-name="Rectangle 29" width="5.336" height="5.336" rx="1" transform="translate(27.271 0)" fill="#4a4a4a"/>
+          <rect id="Rectangle_30" data-name="Rectangle 30" width="5.336" height="5.336" rx="1" transform="translate(33.594 0)" fill="#4a4a4a"/>
+          <rect id="Rectangle_31" data-name="Rectangle 31" width="5.336" height="5.336" rx="1" transform="translate(39.918 0)" fill="#4a4a4a"/>
+          <rect id="Rectangle_32" data-name="Rectangle 32" width="5.336" height="5.336" rx="1" transform="translate(46.242 0)" fill="#4a4a4a"/>
+          <rect id="Rectangle_33" data-name="Rectangle 33" width="5.336" height="5.336" rx="1" transform="translate(52.565 0)" fill="#4a4a4a"/>
+          <rect id="Rectangle_34" data-name="Rectangle 34" width="5.336" height="5.336" rx="1" transform="translate(58.889 0)" fill="#4a4a4a"/>
+          <rect id="Rectangle_35" data-name="Rectangle 35" width="5.336" height="5.336" rx="1" transform="translate(65.213 0)" fill="#4a4a4a"/>
+          <rect id="Rectangle_36" data-name="Rectangle 36" width="5.336" height="5.336" rx="1" transform="translate(71.537 0)" fill="#4a4a4a"/>
+          <rect id="Rectangle_37" data-name="Rectangle 37" width="5.336" height="5.336" rx="1" transform="translate(77.86 0)" fill="#4a4a4a"/>
+          <rect id="Rectangle_38" data-name="Rectangle 38" width="5.336" height="5.336" rx="1" transform="translate(84.183 0)" fill="#4a4a4a"/>
+          <rect id="Rectangle_39" data-name="Rectangle 39" width="5.336" height="5.336" rx="1" transform="translate(8.299 0)" fill="#4a4a4a"/>
+          <rect id="Rectangle_40" data-name="Rectangle 40" width="5.336" height="5.336" rx="1" transform="translate(14.623 0)" fill="#4a4a4a"/>
+          <rect id="Rectangle_41" data-name="Rectangle 41" width="5.336" height="5.336" rx="1" transform="translate(20.947 0)" fill="#4a4a4a"/>
+          <rect id="Rectangle_42" data-name="Rectangle 42" width="5.336" height="5.336" rx="1" transform="translate(27.271 0)" fill="#4a4a4a"/>
+          <rect id="Rectangle_43" data-name="Rectangle 43" width="5.336" height="5.336" rx="1" transform="translate(33.594 0)" fill="#4a4a4a"/>
+          <rect id="Rectangle_44" data-name="Rectangle 44" width="5.336" height="5.336" rx="1" transform="translate(39.918 0)" fill="#4a4a4a"/>
+          <rect id="Rectangle_45" data-name="Rectangle 45" width="5.336" height="5.336" rx="1" transform="translate(46.242 0)" fill="#4a4a4a"/>
+          <rect id="Rectangle_46" data-name="Rectangle 46" width="5.336" height="5.336" rx="1" transform="translate(52.565 0)" fill="#4a4a4a"/>
+          <rect id="Rectangle_47" data-name="Rectangle 47" width="5.336" height="5.336" rx="1" transform="translate(58.889 0)" fill="#4a4a4a"/>
+          <rect id="Rectangle_48" data-name="Rectangle 48" width="5.336" height="5.336" rx="1" transform="translate(65.213 0)" fill="#4a4a4a"/>
+          <rect id="Rectangle_49" data-name="Rectangle 49" width="5.336" height="5.336" rx="1" transform="translate(71.537 0)" fill="#4a4a4a"/>
+          <rect id="Rectangle_50" data-name="Rectangle 50" width="5.336" height="5.336" rx="1" transform="translate(77.86 0)" fill="#4a4a4a"/>
+          <rect id="Rectangle_51" data-name="Rectangle 51" width="5.336" height="5.336" rx="1" transform="translate(84.183 0)" fill="#4a4a4a"/>
+        </g>
+        <g id="Group_6" data-name="Group 6" transform="translate(1.531 16.584)">
+          <path id="Path_54" data-name="Path 54" d="M1.093,0h7.3A1.093,1.093,0,0,1,9.485,1.093v3.15A1.093,1.093,0,0,1,8.392,5.336h-7.3A1.093,1.093,0,0,1,0,4.243V1.094A1.093,1.093,0,0,1,1.093,0Z" transform="translate(0 0)" fill="#4a4a4a" fill-rule="evenodd"/>
+          <g id="Group_5" data-name="Group 5" transform="translate(10.671 0)">
+            <rect id="Rectangle_52" data-name="Rectangle 52" width="5.336" height="5.336" rx="1" fill="#4a4a4a"/>
+            <rect id="Rectangle_53" data-name="Rectangle 53" width="5.336" height="5.336" rx="1" transform="translate(6.324 0)" fill="#4a4a4a"/>
+            <rect id="Rectangle_54" data-name="Rectangle 54" width="5.336" height="5.336" rx="1" transform="translate(12.647 0)" fill="#4a4a4a"/>
+            <rect id="Rectangle_55" data-name="Rectangle 55" width="5.336" height="5.336" rx="1" transform="translate(18.971 0)" fill="#4a4a4a"/>
+            <rect id="Rectangle_56" data-name="Rectangle 56" width="5.336" height="5.336" rx="1" transform="translate(25.295 0)" fill="#4a4a4a"/>
+            <rect id="Rectangle_57" data-name="Rectangle 57" width="5.336" height="5.336" rx="1" transform="translate(31.619 0)" fill="#4a4a4a"/>
+            <rect id="Rectangle_58" data-name="Rectangle 58" width="5.336" height="5.336" rx="1" transform="translate(37.942 0)" fill="#4a4a4a"/>
+            <rect id="Rectangle_59" data-name="Rectangle 59" width="5.336" height="5.336" rx="1" transform="translate(44.265 0)" fill="#4a4a4a"/>
+            <rect id="Rectangle_60" data-name="Rectangle 60" width="5.336" height="5.336" rx="1" transform="translate(50.589 0)" fill="#4a4a4a"/>
+            <rect id="Rectangle_61" data-name="Rectangle 61" width="5.336" height="5.336" rx="1" transform="translate(56.912 0)" fill="#4a4a4a"/>
+            <rect id="Rectangle_62" data-name="Rectangle 62" width="5.336" height="5.336" rx="1" transform="translate(63.236 0)" fill="#4a4a4a"/>
+          </g>
+          <path id="Path_55" data-name="Path 55" d="M1.094,0H8A1.093,1.093,0,0,1,9.091,1.093v3.15A1.093,1.093,0,0,1,8,5.336H1.093A1.093,1.093,0,0,1,0,4.243V1.094A1.093,1.093,0,0,1,1.093,0Z" transform="translate(80.428 0)" fill="#4a4a4a" fill-rule="evenodd"/>
+        </g>
+        <g id="Group_7" data-name="Group 7" transform="translate(1.531 29.627)">
+          <rect id="Rectangle_63" data-name="Rectangle 63" width="5.336" height="5.336" rx="1" transform="translate(0 0)" fill="#4a4a4a"/>
+          <rect id="Rectangle_64" data-name="Rectangle 64" width="5.336" height="5.336" rx="1" transform="translate(6.324 0)" fill="#4a4a4a"/>
+          <rect id="Rectangle_65" data-name="Rectangle 65" width="5.336" height="5.336" rx="1" transform="translate(12.647 0)" fill="#4a4a4a"/>
+          <rect id="Rectangle_66" data-name="Rectangle 66" width="5.336" height="5.336" rx="1" transform="translate(18.971 0)" fill="#4a4a4a"/>
+          <path id="Path_56" data-name="Path 56" d="M1.093,0H31.515a1.093,1.093,0,0,1,1.093,1.093V4.244a1.093,1.093,0,0,1-1.093,1.093H1.093A1.093,1.093,0,0,1,0,4.244V1.093A1.093,1.093,0,0,1,1.093,0ZM34.687,0h3.942a1.093,1.093,0,0,1,1.093,1.093V4.244a1.093,1.093,0,0,1-1.093,1.093H34.687a1.093,1.093,0,0,1-1.093-1.093V1.093A1.093,1.093,0,0,1,34.687,0Z" transform="translate(25.294 0)" fill="#4a4a4a" fill-rule="evenodd"/>
+          <rect id="Rectangle_67" data-name="Rectangle 67" width="5.336" height="5.336" rx="1" transform="translate(66.003 0)" fill="#4a4a4a"/>
+          <rect id="Rectangle_68" data-name="Rectangle 68" width="5.336" height="5.336" rx="1" transform="translate(72.327 0)" fill="#4a4a4a"/>
+          <rect id="Rectangle_69" data-name="Rectangle 69" width="5.336" height="5.336" rx="1" transform="translate(84.183 0)" fill="#4a4a4a"/>
+          <path id="Path_57" data-name="Path 57" d="M5.336,0V1.18A1.093,1.093,0,0,1,4.243,2.273H1.093A1.093,1.093,0,0,1,0,1.18V0Z" transform="translate(83.59 2.273) rotate(180)" fill="#4a4a4a"/>
+          <path id="Path_58" data-name="Path 58" d="M5.336,0V1.18A1.093,1.093,0,0,1,4.243,2.273H1.093A1.093,1.093,0,0,1,0,1.18V0Z" transform="translate(78.255 3.063)" fill="#4a4a4a"/>
+        </g>
+        <rect id="Rectangle_70" data-name="Rectangle 70" width="88.927" height="2.371" rx="1.085" transform="translate(1.925 1.17)" fill="#4a4a4a"/>
+        <rect id="Rectangle_71" data-name="Rectangle 71" width="4.986" height="1.581" rx="0.723" transform="translate(4.1 1.566)" fill="#d8d8d8" opacity="0.136"/>
+        <rect id="Rectangle_72" data-name="Rectangle 72" width="4.986" height="1.581" rx="0.723" transform="translate(10.923 1.566)" fill="#d8d8d8" opacity="0.136"/>
+        <rect id="Rectangle_73" data-name="Rectangle 73" width="4.986" height="1.581" rx="0.723" transform="translate(16.173 1.566)" fill="#d8d8d8" opacity="0.136"/>
+        <rect id="Rectangle_74" data-name="Rectangle 74" width="4.986" height="1.581" rx="0.723" transform="translate(21.421 1.566)" fill="#d8d8d8" opacity="0.136"/>
+        <rect id="Rectangle_75" data-name="Rectangle 75" width="4.986" height="1.581" rx="0.723" transform="translate(26.671 1.566)" fill="#d8d8d8" opacity="0.136"/>
+        <rect id="Rectangle_76" data-name="Rectangle 76" width="4.986" height="1.581" rx="0.723" transform="translate(33.232 1.566)" fill="#d8d8d8" opacity="0.136"/>
+        <rect id="Rectangle_77" data-name="Rectangle 77" width="4.986" height="1.581" rx="0.723" transform="translate(38.48 1.566)" fill="#d8d8d8" opacity="0.136"/>
+        <rect id="Rectangle_78" data-name="Rectangle 78" width="4.986" height="1.581" rx="0.723" transform="translate(43.73 1.566)" fill="#d8d8d8" opacity="0.136"/>
+        <rect id="Rectangle_79" data-name="Rectangle 79" width="4.986" height="1.581" rx="0.723" transform="translate(48.978 1.566)" fill="#d8d8d8" opacity="0.136"/>
+        <rect id="Rectangle_80" data-name="Rectangle 80" width="4.986" height="1.581" rx="0.723" transform="translate(55.54 1.566)" fill="#d8d8d8" opacity="0.136"/>
+        <rect id="Rectangle_81" data-name="Rectangle 81" width="4.986" height="1.581" rx="0.723" transform="translate(60.788 1.566)" fill="#d8d8d8" opacity="0.136"/>
+        <rect id="Rectangle_82" data-name="Rectangle 82" width="4.986" height="1.581" rx="0.723" transform="translate(66.038 1.566)" fill="#d8d8d8" opacity="0.136"/>
+        <rect id="Rectangle_83" data-name="Rectangle 83" width="4.986" height="1.581" rx="0.723" transform="translate(72.599 1.566)" fill="#d8d8d8" opacity="0.136"/>
+        <rect id="Rectangle_84" data-name="Rectangle 84" width="4.986" height="1.581" rx="0.723" transform="translate(77.847 1.566)" fill="#d8d8d8" opacity="0.136"/>
+        <rect id="Rectangle_85" data-name="Rectangle 85" width="4.986" height="1.581" rx="0.723" transform="translate(83.097 1.566)" fill="#d8d8d8" opacity="0.136"/>
+      </g>
+      <path id="Path_59" data-name="Path 59" d="M146.71,159.855a5.439,5.439,0,0,0-.7.07c-.042-.164-.081-.329-.127-.493a5.457,5.457,0,1,0-5.4-9.372q-.181-.185-.366-.367a5.454,5.454,0,1,0-9.384-5.4c-.162-.046-.325-.084-.486-.126a5.467,5.467,0,1,0-10.788,0c-.162.042-.325.08-.486.126a5.457,5.457,0,1,0-9.384,5.4,21.843,21.843,0,1,0,36.421,21.02,5.452,5.452,0,1,0,.7-10.858" transform="translate(6.275 -6.025)" fill="#44d860" fill-rule="evenodd"/>
+      <path id="Path_60" data-name="Path 60" d="M83,124.855h43.71V103H83Z" transform="translate(4.42 -9.271)" fill="#3ecc5f" fill-rule="evenodd"/>
+      <path id="Path_61" data-name="Path 61" d="M134.855,116.765a2.732,2.732,0,1,0,0-5.464,2.811,2.811,0,0,0-.349.035c-.022-.082-.04-.164-.063-.246a2.733,2.733,0,0,0-1.052-5.253,2.7,2.7,0,0,0-1.648.566q-.09-.093-.184-.184a2.7,2.7,0,0,0,.553-1.633,2.732,2.732,0,0,0-5.245-1.07,10.928,10.928,0,1,0,0,21.031,2.732,2.732,0,0,0,5.245-1.07,2.7,2.7,0,0,0-.553-1.633q.093-.09.184-.184a2.7,2.7,0,0,0,1.648.566,2.732,2.732,0,0,0,1.052-5.253c.023-.081.042-.164.063-.246a2.811,2.811,0,0,0,.349.035" trans [...]
+      <path id="Path_62" data-name="Path 62" d="M143.232,42.33a2.967,2.967,0,0,1-.535-.055,2.754,2.754,0,0,1-.514-.153,2.838,2.838,0,0,1-.471-.251,4.139,4.139,0,0,1-.415-.339,3.2,3.2,0,0,1-.338-.415A2.7,2.7,0,0,1,140.5,39.6a2.968,2.968,0,0,1,.055-.535,3.152,3.152,0,0,1,.152-.514,2.874,2.874,0,0,1,.252-.47,2.633,2.633,0,0,1,.753-.754,2.837,2.837,0,0,1,.471-.251,2.753,2.753,0,0,1,.514-.153,2.527,2.527,0,0,1,1.071,0,2.654,2.654,0,0,1,.983.4,4.139,4.139,0,0,1,.415.339,4.019,4.019,0,0,1,.339. [...]
+    </g>
+  </g>
+</svg>
diff --git a/img/undraw_docusaurus_react.svg b/img/undraw_docusaurus_react.svg
new file mode 100644
index 000000000..94b5cf08f
--- /dev/null
+++ b/img/undraw_docusaurus_react.svg
@@ -0,0 +1,170 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="1041.277" height="554.141" viewBox="0 0 1041.277 554.141">
+  <title>Powered by React</title>
+  <g id="Group_24" data-name="Group 24" transform="translate(-440 -263)">
+    <g id="Group_23" data-name="Group 23" transform="translate(439.989 262.965)">
+      <path id="Path_299" data-name="Path 299" d="M1040.82,611.12q-1.74,3.75-3.47,7.4-2.7,5.67-5.33,11.12c-.78,1.61-1.56,3.19-2.32,4.77-8.6,17.57-16.63,33.11-23.45,45.89A73.21,73.21,0,0,1,942.44,719l-151.65,1.65h-1.6l-13,.14-11.12.12-34.1.37h-1.38l-17.36.19h-.53l-107,1.16-95.51,1-11.11.12-69,.75H429l-44.75.48h-.48l-141.5,1.53-42.33.46a87.991,87.991,0,0,1-10.79-.54h0c-1.22-.14-2.44-.3-3.65-.49a87.38,87.38,0,0,1-51.29-27.54C116,678.37,102.75,655,93.85,629.64q-1.93-5.49-3.6-11.12C59.44,514. [...]
+      <path id="Path_300" data-name="Path 300" d="M576.36,618.52a95.21,95.21,0,0,1-1.87,11.12h93.7V618.52Zm-78.25,62.81,11.11-.09V653.77c-3.81-.17-7.52-.34-11.11-.52ZM265.19,618.52v11.12h198.5V618.52ZM1114.87,279h-74V191.51q-5.35-2.17-11.12-4V279H776.21V186.58c-3.73.73-7.43,1.5-11.12,2.28V279H509.22V236.15c-3.69-.11-7.4-.29-11.11-.53V279H242.24V217c-24.83,15.16-48.14,36.48-68.93,62h-.07v.08q-4.4,5.4-8.64,11h8.64V618.52h-83q1.66,5.63,3.6,11.12h79.39v93.62a87,87,0,0,0,12.2,2.79c1.21.19,2.4 [...]
+      <path id="Path_301" data-name="Path 301" d="M863.09,533.65v13l-151.92,1.4-1.62.03-57.74.53-1.38.02-17.55.15h-.52l-106.98.99L349.77,551.4h-.15l-44.65.42-.48.01-198.4,1.82v-15l46.65-28,93.6-.78,2-.01.66-.01,2-.03,44.94-.37,2.01-.01.64-.01,2-.01L315,509.3l.38-.01,35.55-.3h.29l277.4-2.34,6.79-.05h.68l5.18-.05,37.65-.31,2-.03,1.85-.02h.96l11.71-.09,2.32-.03,3.11-.02,9.75-.09,15.47-.13,2-.02,3.48-.02h.65l74.71-.64Z" fill="#65617d"/>
+      <path id="Path_302" data-name="Path 302" d="M863.09,533.65v13l-151.92,1.4-1.62.03-57.74.53-1.38.02-17.55.15h-.52l-106.98.99L349.77,551.4h-.15l-44.65.42-.48.01-198.4,1.82v-15l46.65-28,93.6-.78,2-.01.66-.01,2-.03,44.94-.37,2.01-.01.64-.01,2-.01L315,509.3l.38-.01,35.55-.3h.29l277.4-2.34,6.79-.05h.68l5.18-.05,37.65-.31,2-.03,1.85-.02h.96l11.71-.09,2.32-.03,3.11-.02,9.75-.09,15.47-.13,2-.02,3.48-.02h.65l74.71-.64Z" opacity="0.2"/>
+      <path id="Path_303" data-name="Path 303" d="M375.44,656.57v24.49a6.13,6.13,0,0,1-3.5,5.54,6,6,0,0,1-2.5.6l-34.9.74a6,6,0,0,1-2.7-.57,6.12,6.12,0,0,1-3.57-5.57V656.57Z" transform="translate(-79.34 -172.91)" fill="#3f3d56"/>
+      <path id="Path_304" data-name="Path 304" d="M375.44,656.57v24.49a6.13,6.13,0,0,1-3.5,5.54,6,6,0,0,1-2.5.6l-34.9.74a6,6,0,0,1-2.7-.57,6.12,6.12,0,0,1-3.57-5.57V656.57Z" transform="translate(-79.34 -172.91)" opacity="0.1"/>
+      <path id="Path_305" data-name="Path 305" d="M377.44,656.57v24.49a6.13,6.13,0,0,1-3.5,5.54,6,6,0,0,1-2.5.6l-34.9.74a6,6,0,0,1-2.7-.57,6.12,6.12,0,0,1-3.57-5.57V656.57Z" transform="translate(-79.34 -172.91)" fill="#3f3d56"/>
+      <rect id="Rectangle_137" data-name="Rectangle 137" width="47.17" height="31.5" transform="translate(680.92 483.65)" fill="#3f3d56"/>
+      <rect id="Rectangle_138" data-name="Rectangle 138" width="47.17" height="31.5" transform="translate(680.92 483.65)" opacity="0.1"/>
+      <rect id="Rectangle_139" data-name="Rectangle 139" width="47.17" height="31.5" transform="translate(678.92 483.65)" fill="#3f3d56"/>
+      <path id="Path_306" data-name="Path 306" d="M298.09,483.65v4.97l-47.17,1.26v-6.23Z" opacity="0.1"/>
+      <path id="Path_307" data-name="Path 307" d="M460.69,485.27v168.2a4,4,0,0,1-3.85,3.95l-191.65,5.1h-.05a4,4,0,0,1-3.95-3.95V485.27a4,4,0,0,1,3.95-3.95h191.6a4,4,0,0,1,3.95,3.95Z" transform="translate(-79.34 -172.91)" fill="#65617d"/>
+      <path id="Path_308" data-name="Path 308" d="M265.19,481.32v181.2h-.05a4,4,0,0,1-3.95-3.95V485.27a4,4,0,0,1,3.95-3.95Z" transform="translate(-79.34 -172.91)" opacity="0.1"/>
+      <path id="Path_309" data-name="Path 309" d="M194.59,319.15h177.5V467.4l-177.5,4Z" fill="#39374d"/>
+      <path id="Path_310" data-name="Path 310" d="M726.09,483.65v6.41l-47.17-1.26v-5.15Z" opacity="0.1"/>
+      <path id="Path_311" data-name="Path 311" d="M867.69,485.27v173.3a4,4,0,0,1-4,3.95h0L672,657.42a4,4,0,0,1-3.85-3.95V485.27a4,4,0,0,1,3.95-3.95H863.7a4,4,0,0,1,3.99,3.95Z" transform="translate(-79.34 -172.91)" fill="#65617d"/>
+      <path id="Path_312" data-name="Path 312" d="M867.69,485.27v173.3a4,4,0,0,1-4,3.95h0V481.32h0a4,4,0,0,1,4,3.95Z" transform="translate(-79.34 -172.91)" opacity="0.1"/>
+      <path id="Path_313" data-name="Path 313" d="M775.59,319.15H598.09V467.4l177.5,4Z" fill="#39374d"/>
+      <path id="Path_314" data-name="Path 314" d="M663.19,485.27v168.2a4,4,0,0,1-3.85,3.95l-191.65,5.1h0a4,4,0,0,1-4-3.95V485.27a4,4,0,0,1,3.95-3.95h191.6A4,4,0,0,1,663.19,485.27Z" transform="translate(-79.34 -172.91)" fill="#65617d"/>
+      <path id="Path_315" data-name="Path 315" d="M397.09,319.15h177.5V467.4l-177.5,4Z" fill="#4267b2"/>
+      <path id="Path_316" data-name="Path 316" d="M863.09,533.65v13l-151.92,1.4-1.62.03-57.74.53-1.38.02-17.55.15h-.52l-106.98.99L349.77,551.4h-.15l-44.65.42-.48.01-198.4,1.82v-15l202.51-1.33h.48l40.99-.28h.19l283.08-1.87h.29l.17-.01h.47l4.79-.03h1.46l74.49-.5,4.4-.02.98-.01Z" opacity="0.1"/>
+      <circle id="Ellipse_111" data-name="Ellipse 111" cx="51.33" cy="51.33" r="51.33" transform="translate(435.93 246.82)" fill="#fbbebe"/>
+      <path id="Path_317" data-name="Path 317" d="M617.94,550.07s-99.5,12-90,0c3.44-4.34,4.39-17.2,4.2-31.85-.06-4.45-.22-9.06-.45-13.65-1.1-22-3.75-43.5-3.75-43.5s87-41,77-8.5c-4,13.13-2.69,31.57.35,48.88.89,5.05,1.92,10,3,14.7a344.66,344.66,0,0,0,9.65,33.92Z" transform="translate(-79.34 -172.91)" fill="#fbbebe"/>
+      <path id="Path_318" data-name="Path 318" d="M585.47,546c11.51-2.13,23.7-6,34.53-1.54,2.85,1.17,5.47,2.88,8.39,3.86s6.12,1.22,9.16,1.91c10.68,2.42,19.34,10.55,24.9,20s8.44,20.14,11.26,30.72l6.9,25.83c6,22.45,12,45.09,13.39,68.3a2437.506,2437.506,0,0,1-250.84,1.43c5.44-10.34,11-21.31,10.54-33s-7.19-23.22-4.76-34.74c1.55-7.34,6.57-13.39,9.64-20.22,8.75-19.52,1.94-45.79,17.32-60.65,6.92-6.68,17-9.21,26.63-8.89,12.28.41,24.85,4.24,37,6.11C555.09,547.48,569.79,548.88,585.47,546Z" transfo [...]
+      <path id="Path_319" data-name="Path 319" d="M716.37,657.17l-.1,1.43v.1l-.17,2.3-1.33,18.51-1.61,22.3-.46,6.28-1,13.44v.17l-107,1-175.59,1.9v.84h-.14v-1.12l.45-14.36.86-28.06.74-23.79.07-2.37a10.53,10.53,0,0,1,11.42-10.17c4.72.4,10.85.89,18.18,1.41l3,.22c42.33,2.94,120.56,6.74,199.5,2,1.66-.09,3.33-.19,5-.31,12.24-.77,24.47-1.76,36.58-3a10.53,10.53,0,0,1,11.6,11.23Z" transform="translate(-79.34 -172.91)" opacity="0.1"/>
+      <path id="Path_320" data-name="Path 320" d="M429.08,725.44v-.84l175.62-1.91,107-1h.3v-.17l1-13.44.43-6,1.64-22.61,1.29-17.9v-.44a10.617,10.617,0,0,0-.11-2.47.3.3,0,0,0,0-.1,10.391,10.391,0,0,0-2-4.64,10.54,10.54,0,0,0-9.42-4c-12.11,1.24-24.34,2.23-36.58,3-1.67.12-3.34.22-5,.31-78.94,4.69-157.17.89-199.5-2l-3-.22c-7.33-.52-13.46-1-18.18-1.41a10.54,10.54,0,0,0-11.24,8.53,11,11,0,0,0-.18,1.64l-.68,22.16L429.54,710l-.44,14.36v1.12Z" transform="translate(-79.34 -172.91)" fill="#3f3d56"/>
+      <path id="Path_321" data-name="Path 321" d="M716.67,664.18l-1.23,15.33-1.83,22.85-.46,5.72-1,12.81-.06.64v.17h0l-.15,1.48.11-1.48h-.29l-107,1-175.65,1.9v-.28l.49-14.36,1-28.06.64-18.65A6.36,6.36,0,0,1,434.3,658a6.25,6.25,0,0,1,3.78-.9c2.1.17,4.68.37,7.69.59,4.89.36,10.92.78,17.94,1.22,13,.82,29.31,1.7,48,2.42,52,2,122.2,2.67,188.88-3.17,3-.26,6.1-.55,9.13-.84a6.26,6.26,0,0,1,3.48.66,5.159,5.159,0,0,1,.86.54,6.14,6.14,0,0,1,2,2.46,3.564,3.564,0,0,1,.25.61A6.279,6.279,0,0,1,716.67,66 [...]
+      <path id="Path_322" data-name="Path 322" d="M377.44,677.87v3.19a6.13,6.13,0,0,1-3.5,5.54l-40.1.77a6.12,6.12,0,0,1-3.57-5.57v-3Z" transform="translate(-79.34 -172.91)" opacity="0.1"/>
+      <path id="Path_323" data-name="Path 323" d="M298.59,515.57l-52.25,1V507.9l52.25-1Z" fill="#3f3d56"/>
+      <path id="Path_324" data-name="Path 324" d="M298.59,515.57l-52.25,1V507.9l52.25-1Z" opacity="0.1"/>
+      <path id="Path_325" data-name="Path 325" d="M300.59,515.57l-52.25,1V507.9l52.25-1Z" fill="#3f3d56"/>
+      <path id="Path_326" data-name="Path 326" d="M758.56,679.87v3.19a6.13,6.13,0,0,0,3.5,5.54l40.1.77a6.12,6.12,0,0,0,3.57-5.57v-3Z" transform="translate(-79.34 -172.91)" opacity="0.1"/>
+      <path id="Path_327" data-name="Path 327" d="M678.72,517.57l52.25,1V509.9l-52.25-1Z" opacity="0.1"/>
+      <path id="Path_328" data-name="Path 328" d="M676.72,517.57l52.25,1V509.9l-52.25-1Z" fill="#3f3d56"/>
+      <path id="Path_329" data-name="Path 329" d="M534.13,486.79c.08,7-3.16,13.6-5.91,20.07a163.491,163.491,0,0,0-12.66,74.71c.73,11,2.58,22,.73,32.9s-8.43,21.77-19,24.9c17.53,10.45,41.26,9.35,57.76-2.66,8.79-6.4,15.34-15.33,21.75-24.11a97.86,97.86,0,0,1-13.31,44.75A103.43,103.43,0,0,0,637,616.53c4.31-5.81,8.06-12.19,9.72-19.23,3.09-13-1.22-26.51-4.51-39.5a266.055,266.055,0,0,1-6.17-33c-.43-3.56-.78-7.22.1-10.7,1-4.07,3.67-7.51,5.64-11.22,5.6-10.54,5.73-23.3,2.86-34.88s-8.49-22.26-14.06- [...]
+    </g>
+    <g id="docusaurus_keytar" transform="translate(670.271 615.768)">
+      <path id="Path_40" data-name="Path 40" d="M99,52h43.635V69.662H99Z" transform="translate(-49.132 -33.936)" fill="#fff" fill-rule="evenodd"/>
+      <path id="Path_41" data-name="Path 41" d="M13.389,158.195A10.377,10.377,0,0,1,4.4,153a10.377,10.377,0,0,0,8.988,15.584H23.779V158.195Z" transform="translate(-3 -82.47)" fill="#3ecc5f" fill-rule="evenodd"/>
+      <path id="Path_42" data-name="Path 42" d="M66.967,38.083l36.373-2.273V30.615A10.389,10.389,0,0,0,92.95,20.226H46.2l-1.3-2.249a1.5,1.5,0,0,0-2.6,0L41,20.226l-1.3-2.249a1.5,1.5,0,0,0-2.6,0l-1.3,2.249-1.3-2.249a1.5,1.5,0,0,0-2.6,0l-1.3,2.249-.034,0-2.152-2.151a1.5,1.5,0,0,0-2.508.672L25.21,21.4l-2.7-.723a1.5,1.5,0,0,0-1.836,1.837l.722,2.7-2.65.71a1.5,1.5,0,0,0-.673,2.509l2.152,2.152c0,.011,0,.022,0,.033l-2.249,1.3a1.5,1.5,0,0,0,0,2.6l2.249,1.3-2.249,1.3a1.5,1.5,0,0,0,0,2.6L20.226,41l- [...]
+      <path id="Path_43" data-name="Path 43" d="M143,163.779h15.584V143H143Z" transform="translate(-70.275 -77.665)" fill="#3ecc5f" fill-rule="evenodd"/>
+      <path id="Path_44" data-name="Path 44" d="M173.779,148.389a2.582,2.582,0,0,0-.332.033c-.02-.078-.038-.156-.06-.234a2.594,2.594,0,1,0-2.567-4.455q-.086-.088-.174-.175a2.593,2.593,0,1,0-4.461-2.569c-.077-.022-.154-.04-.231-.06a2.6,2.6,0,1,0-5.128,0c-.077.02-.154.038-.231.06a2.594,2.594,0,1,0-4.461,2.569,10.384,10.384,0,1,0,17.314,9.992,2.592,2.592,0,1,0,.332-5.161" transform="translate(-75.08 -75.262)" fill="#44d860" fill-rule="evenodd"/>
+      <path id="Path_45" data-name="Path 45" d="M153,113.389h15.584V103H153Z" transform="translate(-75.08 -58.444)" fill="#3ecc5f" fill-rule="evenodd"/>
+      <path id="Path_46" data-name="Path 46" d="M183.389,108.944a1.3,1.3,0,1,0,0-2.6,1.336,1.336,0,0,0-.166.017c-.01-.039-.019-.078-.03-.117a1.3,1.3,0,0,0-.5-2.5,1.285,1.285,0,0,0-.783.269q-.043-.044-.087-.087a1.285,1.285,0,0,0,.263-.776,1.3,1.3,0,0,0-2.493-.509,5.195,5.195,0,1,0,0,10,1.3,1.3,0,0,0,2.493-.509,1.285,1.285,0,0,0-.263-.776q.044-.043.087-.087a1.285,1.285,0,0,0,.783.269,1.3,1.3,0,0,0,.5-2.5c.011-.038.02-.078.03-.117a1.337,1.337,0,0,0,.166.017" transform="translate(-84.691 -57 [...]
+      <path id="Path_47" data-name="Path 47" d="M52.188,48.292a1.3,1.3,0,0,1-1.3-1.3,3.9,3.9,0,0,0-7.792,0,1.3,1.3,0,1,1-2.6,0,6.493,6.493,0,0,1,12.987,0,1.3,1.3,0,0,1-1.3,1.3" transform="translate(-21.02 -28.41)" fill-rule="evenodd"/>
+      <path id="Path_48" data-name="Path 48" d="M103,139.752h31.168a10.389,10.389,0,0,0,10.389-10.389V93H113.389A10.389,10.389,0,0,0,103,103.389Z" transform="translate(-51.054 -53.638)" fill="#ffff50" fill-rule="evenodd"/>
+      <path id="Path_49" data-name="Path 49" d="M141.1,94.017H115.106a.519.519,0,1,1,0-1.039H141.1a.519.519,0,0,1,0,1.039m0,10.389H115.106a.519.519,0,1,1,0-1.039H141.1a.519.519,0,0,1,0,1.039m0,10.389H115.106a.519.519,0,1,1,0-1.039H141.1a.519.519,0,0,1,0,1.039m0-25.877H115.106a.519.519,0,1,1,0-1.039H141.1a.519.519,0,0,1,0,1.039m0,10.293H115.106a.519.519,0,1,1,0-1.039H141.1a.519.519,0,0,1,0,1.039m0,10.389H115.106a.519.519,0,1,1,0-1.039H141.1a.519.519,0,0,1,0,1.039m7.782-47.993c-.006,0-.011 [...]
+      <path id="Path_50" data-name="Path 50" d="M83,163.779h20.779V143H83Z" transform="translate(-41.443 -77.665)" fill="#3ecc5f" fill-rule="evenodd"/>
+      <g id="Group_8" data-name="Group 8" transform="matrix(0.966, -0.259, 0.259, 0.966, 51.971, 43.3)">
+        <rect id="Rectangle_3" data-name="Rectangle 3" width="43.906" height="17.333" rx="2" transform="translate(0 0)" fill="#d8d8d8"/>
+        <g id="Group_2" data-name="Group 2" transform="translate(0.728 10.948)">
+          <rect id="Rectangle_4" data-name="Rectangle 4" width="2.537" height="2.537" rx="1" transform="translate(7.985 0)" fill="#4a4a4a"/>
+          <rect id="Rectangle_5" data-name="Rectangle 5" width="2.537" height="2.537" rx="1" transform="translate(10.991 0)" fill="#4a4a4a"/>
+          <rect id="Rectangle_6" data-name="Rectangle 6" width="2.537" height="2.537" rx="1" transform="translate(13.997 0)" fill="#4a4a4a"/>
+          <rect id="Rectangle_7" data-name="Rectangle 7" width="2.537" height="2.537" rx="1" transform="translate(17.003 0)" fill="#4a4a4a"/>
+          <rect id="Rectangle_8" data-name="Rectangle 8" width="2.537" height="2.537" rx="1" transform="translate(20.009 0)" fill="#4a4a4a"/>
+          <rect id="Rectangle_9" data-name="Rectangle 9" width="2.537" height="2.537" rx="1" transform="translate(23.015 0)" fill="#4a4a4a"/>
+          <rect id="Rectangle_10" data-name="Rectangle 10" width="2.537" height="2.537" rx="1" transform="translate(26.021 0)" fill="#4a4a4a"/>
+          <rect id="Rectangle_11" data-name="Rectangle 11" width="2.537" height="2.537" rx="1" transform="translate(29.028 0)" fill="#4a4a4a"/>
+          <rect id="Rectangle_12" data-name="Rectangle 12" width="2.537" height="2.537" rx="1" transform="translate(32.034 0)" fill="#4a4a4a"/>
+          <path id="Path_51" data-name="Path 51" d="M.519,0H6.9A.519.519,0,0,1,7.421.52v1.5a.519.519,0,0,1-.519.519H.519A.519.519,0,0,1,0,2.017V.519A.519.519,0,0,1,.519,0ZM35.653,0h6.383a.519.519,0,0,1,.519.519v1.5a.519.519,0,0,1-.519.519H35.652a.519.519,0,0,1-.519-.519V.519A.519.519,0,0,1,35.652,0Z" transform="translate(0 0)" fill="#4a4a4a" fill-rule="evenodd"/>
+        </g>
+        <g id="Group_3" data-name="Group 3" transform="translate(0.728 4.878)">
+          <path id="Path_52" data-name="Path 52" d="M.519,0H2.956a.519.519,0,0,1,.519.519v1.5a.519.519,0,0,1-.519.519H.519A.519.519,0,0,1,0,2.017V.519A.519.519,0,0,1,.519,0Z" transform="translate(0 0)" fill="#4a4a4a" fill-rule="evenodd"/>
+          <rect id="Rectangle_13" data-name="Rectangle 13" width="2.537" height="2.537" rx="1" transform="translate(3.945 0)" fill="#4a4a4a"/>
+          <rect id="Rectangle_14" data-name="Rectangle 14" width="2.537" height="2.537" rx="1" transform="translate(6.951 0)" fill="#4a4a4a"/>
+          <rect id="Rectangle_15" data-name="Rectangle 15" width="2.537" height="2.537" rx="1" transform="translate(9.958 0)" fill="#4a4a4a"/>
+          <rect id="Rectangle_16" data-name="Rectangle 16" width="2.537" height="2.537" rx="1" transform="translate(12.964 0)" fill="#4a4a4a"/>
+          <rect id="Rectangle_17" data-name="Rectangle 17" width="2.537" height="2.537" rx="1" transform="translate(15.97 0)" fill="#4a4a4a"/>
+          <rect id="Rectangle_18" data-name="Rectangle 18" width="2.537" height="2.537" rx="1" transform="translate(18.976 0)" fill="#4a4a4a"/>
+          <rect id="Rectangle_19" data-name="Rectangle 19" width="2.537" height="2.537" rx="1" transform="translate(21.982 0)" fill="#4a4a4a"/>
+          <rect id="Rectangle_20" data-name="Rectangle 20" width="2.537" height="2.537" rx="1" transform="translate(24.988 0)" fill="#4a4a4a"/>
+          <rect id="Rectangle_21" data-name="Rectangle 21" width="2.537" height="2.537" rx="1" transform="translate(27.994 0)" fill="#4a4a4a"/>
+          <rect id="Rectangle_22" data-name="Rectangle 22" width="2.537" height="2.537" rx="1" transform="translate(31 0)" fill="#4a4a4a"/>
+          <rect id="Rectangle_23" data-name="Rectangle 23" width="2.537" height="2.537" rx="1" transform="translate(34.006 0)" fill="#4a4a4a"/>
+          <rect id="Rectangle_24" data-name="Rectangle 24" width="2.537" height="2.537" rx="1" transform="translate(37.012 0)" fill="#4a4a4a"/>
+          <rect id="Rectangle_25" data-name="Rectangle 25" width="2.537" height="2.537" rx="1" transform="translate(40.018 0)" fill="#4a4a4a"/>
+        </g>
+        <g id="Group_4" data-name="Group 4" transform="translate(43.283 4.538) rotate(180)">
+          <path id="Path_53" data-name="Path 53" d="M.519,0H2.956a.519.519,0,0,1,.519.519v1.5a.519.519,0,0,1-.519.519H.519A.519.519,0,0,1,0,2.017V.519A.519.519,0,0,1,.519,0Z" transform="translate(0 0)" fill="#4a4a4a" fill-rule="evenodd"/>
+          <rect id="Rectangle_26" data-name="Rectangle 26" width="2.537" height="2.537" rx="1" transform="translate(3.945 0)" fill="#4a4a4a"/>
+          <rect id="Rectangle_27" data-name="Rectangle 27" width="2.537" height="2.537" rx="1" transform="translate(6.951 0)" fill="#4a4a4a"/>
+          <rect id="Rectangle_28" data-name="Rectangle 28" width="2.537" height="2.537" rx="1" transform="translate(9.958 0)" fill="#4a4a4a"/>
+          <rect id="Rectangle_29" data-name="Rectangle 29" width="2.537" height="2.537" rx="1" transform="translate(12.964 0)" fill="#4a4a4a"/>
+          <rect id="Rectangle_30" data-name="Rectangle 30" width="2.537" height="2.537" rx="1" transform="translate(15.97 0)" fill="#4a4a4a"/>
+          <rect id="Rectangle_31" data-name="Rectangle 31" width="2.537" height="2.537" rx="1" transform="translate(18.976 0)" fill="#4a4a4a"/>
+          <rect id="Rectangle_32" data-name="Rectangle 32" width="2.537" height="2.537" rx="1" transform="translate(21.982 0)" fill="#4a4a4a"/>
+          <rect id="Rectangle_33" data-name="Rectangle 33" width="2.537" height="2.537" rx="1" transform="translate(24.988 0)" fill="#4a4a4a"/>
+          <rect id="Rectangle_34" data-name="Rectangle 34" width="2.537" height="2.537" rx="1" transform="translate(27.994 0)" fill="#4a4a4a"/>
+          <rect id="Rectangle_35" data-name="Rectangle 35" width="2.537" height="2.537" rx="1" transform="translate(31.001 0)" fill="#4a4a4a"/>
+          <rect id="Rectangle_36" data-name="Rectangle 36" width="2.537" height="2.537" rx="1" transform="translate(34.007 0)" fill="#4a4a4a"/>
+          <rect id="Rectangle_37" data-name="Rectangle 37" width="2.537" height="2.537" rx="1" transform="translate(37.013 0)" fill="#4a4a4a"/>
+          <rect id="Rectangle_38" data-name="Rectangle 38" width="2.537" height="2.537" rx="1" transform="translate(40.018 0)" fill="#4a4a4a"/>
+          <rect id="Rectangle_39" data-name="Rectangle 39" width="2.537" height="2.537" rx="1" transform="translate(3.945 0)" fill="#4a4a4a"/>
+          <rect id="Rectangle_40" data-name="Rectangle 40" width="2.537" height="2.537" rx="1" transform="translate(6.951 0)" fill="#4a4a4a"/>
+          <rect id="Rectangle_41" data-name="Rectangle 41" width="2.537" height="2.537" rx="1" transform="translate(9.958 0)" fill="#4a4a4a"/>
+          <rect id="Rectangle_42" data-name="Rectangle 42" width="2.537" height="2.537" rx="1" transform="translate(12.964 0)" fill="#4a4a4a"/>
+          <rect id="Rectangle_43" data-name="Rectangle 43" width="2.537" height="2.537" rx="1" transform="translate(15.97 0)" fill="#4a4a4a"/>
+          <rect id="Rectangle_44" data-name="Rectangle 44" width="2.537" height="2.537" rx="1" transform="translate(18.976 0)" fill="#4a4a4a"/>
+          <rect id="Rectangle_45" data-name="Rectangle 45" width="2.537" height="2.537" rx="1" transform="translate(21.982 0)" fill="#4a4a4a"/>
+          <rect id="Rectangle_46" data-name="Rectangle 46" width="2.537" height="2.537" rx="1" transform="translate(24.988 0)" fill="#4a4a4a"/>
+          <rect id="Rectangle_47" data-name="Rectangle 47" width="2.537" height="2.537" rx="1" transform="translate(27.994 0)" fill="#4a4a4a"/>
+          <rect id="Rectangle_48" data-name="Rectangle 48" width="2.537" height="2.537" rx="1" transform="translate(31.001 0)" fill="#4a4a4a"/>
+          <rect id="Rectangle_49" data-name="Rectangle 49" width="2.537" height="2.537" rx="1" transform="translate(34.007 0)" fill="#4a4a4a"/>
+          <rect id="Rectangle_50" data-name="Rectangle 50" width="2.537" height="2.537" rx="1" transform="translate(37.013 0)" fill="#4a4a4a"/>
+          <rect id="Rectangle_51" data-name="Rectangle 51" width="2.537" height="2.537" rx="1" transform="translate(40.018 0)" fill="#4a4a4a"/>
+        </g>
+        <g id="Group_6" data-name="Group 6" transform="translate(0.728 7.883)">
+          <path id="Path_54" data-name="Path 54" d="M.519,0h3.47a.519.519,0,0,1,.519.519v1.5a.519.519,0,0,1-.519.519H.519A.519.519,0,0,1,0,2.017V.52A.519.519,0,0,1,.519,0Z" transform="translate(0 0)" fill="#4a4a4a" fill-rule="evenodd"/>
+          <g id="Group_5" data-name="Group 5" transform="translate(5.073 0)">
+            <rect id="Rectangle_52" data-name="Rectangle 52" width="2.537" height="2.537" rx="1" transform="translate(0 0)" fill="#4a4a4a"/>
+            <rect id="Rectangle_53" data-name="Rectangle 53" width="2.537" height="2.537" rx="1" transform="translate(3.006 0)" fill="#4a4a4a"/>
+            <rect id="Rectangle_54" data-name="Rectangle 54" width="2.537" height="2.537" rx="1" transform="translate(6.012 0)" fill="#4a4a4a"/>
+            <rect id="Rectangle_55" data-name="Rectangle 55" width="2.537" height="2.537" rx="1" transform="translate(9.018 0)" fill="#4a4a4a"/>
+            <rect id="Rectangle_56" data-name="Rectangle 56" width="2.537" height="2.537" rx="1" transform="translate(12.025 0)" fill="#4a4a4a"/>
+            <rect id="Rectangle_57" data-name="Rectangle 57" width="2.537" height="2.537" rx="1" transform="translate(15.031 0)" fill="#4a4a4a"/>
+            <rect id="Rectangle_58" data-name="Rectangle 58" width="2.537" height="2.537" rx="1" transform="translate(18.037 0)" fill="#4a4a4a"/>
+            <rect id="Rectangle_59" data-name="Rectangle 59" width="2.537" height="2.537" rx="1" transform="translate(21.042 0)" fill="#4a4a4a"/>
+            <rect id="Rectangle_60" data-name="Rectangle 60" width="2.537" height="2.537" rx="1" transform="translate(24.049 0)" fill="#4a4a4a"/>
+            <rect id="Rectangle_61" data-name="Rectangle 61" width="2.537" height="2.537" rx="1" transform="translate(27.055 0)" fill="#4a4a4a"/>
+            <rect id="Rectangle_62" data-name="Rectangle 62" width="2.537" height="2.537" rx="1" transform="translate(30.061 0)" fill="#4a4a4a"/>
+          </g>
+          <path id="Path_55" data-name="Path 55" d="M.52,0H3.8a.519.519,0,0,1,.519.519v1.5a.519.519,0,0,1-.519.519H.519A.519.519,0,0,1,0,2.017V.52A.519.519,0,0,1,.519,0Z" transform="translate(38.234 0)" fill="#4a4a4a" fill-rule="evenodd"/>
+        </g>
+        <g id="Group_7" data-name="Group 7" transform="translate(0.728 14.084)">
+          <rect id="Rectangle_63" data-name="Rectangle 63" width="2.537" height="2.537" rx="1" transform="translate(0 0)" fill="#4a4a4a"/>
+          <rect id="Rectangle_64" data-name="Rectangle 64" width="2.537" height="2.537" rx="1" transform="translate(3.006 0)" fill="#4a4a4a"/>
+          <rect id="Rectangle_65" data-name="Rectangle 65" width="2.537" height="2.537" rx="1" transform="translate(6.012 0)" fill="#4a4a4a"/>
+          <rect id="Rectangle_66" data-name="Rectangle 66" width="2.537" height="2.537" rx="1" transform="translate(9.018 0)" fill="#4a4a4a"/>
+          <path id="Path_56" data-name="Path 56" d="M.519,0H14.981A.519.519,0,0,1,15.5.519v1.5a.519.519,0,0,1-.519.519H.519A.519.519,0,0,1,0,2.018V.519A.519.519,0,0,1,.519,0Zm15.97,0h1.874a.519.519,0,0,1,.519.519v1.5a.519.519,0,0,1-.519.519H16.489a.519.519,0,0,1-.519-.519V.519A.519.519,0,0,1,16.489,0Z" transform="translate(12.024 0)" fill="#4a4a4a" fill-rule="evenodd"/>
+          <rect id="Rectangle_67" data-name="Rectangle 67" width="2.537" height="2.537" rx="1" transform="translate(31.376 0)" fill="#4a4a4a"/>
+          <rect id="Rectangle_68" data-name="Rectangle 68" width="2.537" height="2.537" rx="1" transform="translate(34.382 0)" fill="#4a4a4a"/>
+          <rect id="Rectangle_69" data-name="Rectangle 69" width="2.537" height="2.537" rx="1" transform="translate(40.018 0)" fill="#4a4a4a"/>
+          <path id="Path_57" data-name="Path 57" d="M2.537,0V.561a.519.519,0,0,1-.519.519H.519A.519.519,0,0,1,0,.561V0Z" transform="translate(39.736 1.08) rotate(180)" fill="#4a4a4a"/>
+          <path id="Path_58" data-name="Path 58" d="M2.537,0V.561a.519.519,0,0,1-.519.519H.519A.519.519,0,0,1,0,.561V0Z" transform="translate(37.2 1.456)" fill="#4a4a4a"/>
+        </g>
+        <rect id="Rectangle_70" data-name="Rectangle 70" width="42.273" height="1.127" rx="0.564" transform="translate(0.915 0.556)" fill="#4a4a4a"/>
+        <rect id="Rectangle_71" data-name="Rectangle 71" width="2.37" height="0.752" rx="0.376" transform="translate(1.949 0.744)" fill="#d8d8d8" opacity="0.136"/>
+        <rect id="Rectangle_72" data-name="Rectangle 72" width="2.37" height="0.752" rx="0.376" transform="translate(5.193 0.744)" fill="#d8d8d8" opacity="0.136"/>
+        <rect id="Rectangle_73" data-name="Rectangle 73" width="2.37" height="0.752" rx="0.376" transform="translate(7.688 0.744)" fill="#d8d8d8" opacity="0.136"/>
+        <rect id="Rectangle_74" data-name="Rectangle 74" width="2.37" height="0.752" rx="0.376" transform="translate(10.183 0.744)" fill="#d8d8d8" opacity="0.136"/>
+        <rect id="Rectangle_75" data-name="Rectangle 75" width="2.37" height="0.752" rx="0.376" transform="translate(12.679 0.744)" fill="#d8d8d8" opacity="0.136"/>
+        <rect id="Rectangle_76" data-name="Rectangle 76" width="2.37" height="0.752" rx="0.376" transform="translate(15.797 0.744)" fill="#d8d8d8" opacity="0.136"/>
+        <rect id="Rectangle_77" data-name="Rectangle 77" width="2.37" height="0.752" rx="0.376" transform="translate(18.292 0.744)" fill="#d8d8d8" opacity="0.136"/>
+        <rect id="Rectangle_78" data-name="Rectangle 78" width="2.37" height="0.752" rx="0.376" transform="translate(20.788 0.744)" fill="#d8d8d8" opacity="0.136"/>
+        <rect id="Rectangle_79" data-name="Rectangle 79" width="2.37" height="0.752" rx="0.376" transform="translate(23.283 0.744)" fill="#d8d8d8" opacity="0.136"/>
+        <rect id="Rectangle_80" data-name="Rectangle 80" width="2.37" height="0.752" rx="0.376" transform="translate(26.402 0.744)" fill="#d8d8d8" opacity="0.136"/>
+        <rect id="Rectangle_81" data-name="Rectangle 81" width="2.37" height="0.752" rx="0.376" transform="translate(28.897 0.744)" fill="#d8d8d8" opacity="0.136"/>
+        <rect id="Rectangle_82" data-name="Rectangle 82" width="2.37" height="0.752" rx="0.376" transform="translate(31.393 0.744)" fill="#d8d8d8" opacity="0.136"/>
+        <rect id="Rectangle_83" data-name="Rectangle 83" width="2.37" height="0.752" rx="0.376" transform="translate(34.512 0.744)" fill="#d8d8d8" opacity="0.136"/>
+        <rect id="Rectangle_84" data-name="Rectangle 84" width="2.37" height="0.752" rx="0.376" transform="translate(37.007 0.744)" fill="#d8d8d8" opacity="0.136"/>
+        <rect id="Rectangle_85" data-name="Rectangle 85" width="2.37" height="0.752" rx="0.376" transform="translate(39.502 0.744)" fill="#d8d8d8" opacity="0.136"/>
+      </g>
+      <path id="Path_59" data-name="Path 59" d="M123.779,148.389a2.583,2.583,0,0,0-.332.033c-.02-.078-.038-.156-.06-.234a2.594,2.594,0,1,0-2.567-4.455q-.086-.088-.174-.175a2.593,2.593,0,1,0-4.461-2.569c-.077-.022-.154-.04-.231-.06a2.6,2.6,0,1,0-5.128,0c-.077.02-.154.038-.231.06a2.594,2.594,0,1,0-4.461,2.569,10.384,10.384,0,1,0,17.314,9.992,2.592,2.592,0,1,0,.332-5.161" transform="translate(-51.054 -75.262)" fill="#44d860" fill-rule="evenodd"/>
+      <path id="Path_60" data-name="Path 60" d="M83,113.389h20.779V103H83Z" transform="translate(-41.443 -58.444)" fill="#3ecc5f" fill-rule="evenodd"/>
+      <path id="Path_61" data-name="Path 61" d="M123.389,108.944a1.3,1.3,0,1,0,0-2.6,1.338,1.338,0,0,0-.166.017c-.01-.039-.019-.078-.03-.117a1.3,1.3,0,0,0-.5-2.5,1.285,1.285,0,0,0-.783.269q-.043-.044-.087-.087a1.285,1.285,0,0,0,.263-.776,1.3,1.3,0,0,0-2.493-.509,5.195,5.195,0,1,0,0,10,1.3,1.3,0,0,0,2.493-.509,1.285,1.285,0,0,0-.263-.776q.044-.043.087-.087a1.285,1.285,0,0,0,.783.269,1.3,1.3,0,0,0,.5-2.5c.011-.038.02-.078.03-.117a1.335,1.335,0,0,0,.166.017" transform="translate(-55.859 -57 [...]
+      <path id="Path_62" data-name="Path 62" d="M141.8,38.745a1.41,1.41,0,0,1-.255-.026,1.309,1.309,0,0,1-.244-.073,1.349,1.349,0,0,1-.224-.119,1.967,1.967,0,0,1-.2-.161,1.52,1.52,0,0,1-.161-.2,1.282,1.282,0,0,1-.218-.722,1.41,1.41,0,0,1,.026-.255,1.5,1.5,0,0,1,.072-.244,1.364,1.364,0,0,1,.12-.223,1.252,1.252,0,0,1,.358-.358,1.349,1.349,0,0,1,.224-.119,1.309,1.309,0,0,1,.244-.073,1.2,1.2,0,0,1,.509,0,1.262,1.262,0,0,1,.468.192,1.968,1.968,0,0,1,.2.161,1.908,1.908,0,0,1,.161.2,1.322,1.322 [...]
+    </g>
+    <g id="React-icon" transform="translate(906.3 541.56)">
+      <path id="Path_330" data-name="Path 330" d="M263.668,117.179c0-5.827-7.3-11.35-18.487-14.775,2.582-11.4,1.434-20.477-3.622-23.382a7.861,7.861,0,0,0-4.016-1v4a4.152,4.152,0,0,1,2.044.466c2.439,1.4,3.5,6.724,2.672,13.574-.2,1.685-.52,3.461-.914,5.272a86.9,86.9,0,0,0-11.386-1.954,87.469,87.469,0,0,0-7.459-8.965c5.845-5.433,11.332-8.41,15.062-8.41V78h0c-4.931,0-11.386,3.514-17.913,9.611-6.527-6.061-12.982-9.539-17.913-9.539v4c3.712,0,9.216,2.959,15.062,8.356a84.687,84.687,0,0,0-7.405,8 [...]
+      <path id="Path_331" data-name="Path 331" d="M320.8,78.4Z" transform="translate(-119.082 -0.328)" fill="#61dafb"/>
+      <circle id="Ellipse_112" data-name="Ellipse 112" cx="8.194" cy="8.194" r="8.194" transform="translate(211.472 108.984)" fill="#61dafb"/>
+      <path id="Path_332" data-name="Path 332" d="M520.5,78.1Z" transform="translate(-282.975 -0.082)" fill="#61dafb"/>
+    </g>
+  </g>
+</svg>
diff --git a/img/undraw_docusaurus_tree.svg b/img/undraw_docusaurus_tree.svg
new file mode 100644
index 000000000..d9161d339
--- /dev/null
+++ b/img/undraw_docusaurus_tree.svg
@@ -0,0 +1,40 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="1129" height="663" viewBox="0 0 1129 663">
+  <title>Focus on What Matters</title>
+  <circle cx="321" cy="321" r="321" fill="#f2f2f2" />
+  <ellipse cx="559" cy="635.49998" rx="514" ry="27.50002" fill="#3f3d56" />
+  <ellipse cx="558" cy="627" rx="460" ry="22" opacity="0.2" />
+  <rect x="131" y="152.5" width="840" height="50" fill="#3f3d56" />
+  <path d="M166.5,727.3299A21.67009,21.67009,0,0,0,188.1701,749H984.8299A21.67009,21.67009,0,0,0,1006.5,727.3299V296h-840Z" transform="translate(-35.5 -118.5)" fill="#3f3d56" />
+  <path d="M984.8299,236H188.1701A21.67009,21.67009,0,0,0,166.5,257.6701V296h840V257.6701A21.67009,21.67009,0,0,0,984.8299,236Z" transform="translate(-35.5 -118.5)" fill="#3f3d56" />
+  <path d="M984.8299,236H188.1701A21.67009,21.67009,0,0,0,166.5,257.6701V296h840V257.6701A21.67009,21.67009,0,0,0,984.8299,236Z" transform="translate(-35.5 -118.5)" opacity="0.2" />
+  <circle cx="181" cy="147.5" r="13" fill="#3f3d56" />
+  <circle cx="217" cy="147.5" r="13" fill="#3f3d56" />
+  <circle cx="253" cy="147.5" r="13" fill="#3f3d56" />
+  <rect x="168" y="213.5" width="337" height="386" rx="5.33505" fill="#606060" />
+  <rect x="603" y="272.5" width="284" height="22" rx="5.47638" fill="#2e8555" />
+  <rect x="537" y="352.5" width="416" height="15" rx="5.47638" fill="#2e8555" />
+  <rect x="537" y="396.5" width="416" height="15" rx="5.47638" fill="#2e8555" />
+  <rect x="537" y="440.5" width="416" height="15" rx="5.47638" fill="#2e8555" />
+  <rect x="537" y="484.5" width="416" height="15" rx="5.47638" fill="#2e8555" />
+  <rect x="865" y="552.5" width="88" height="26" rx="7.02756" fill="#3ecc5f" />
+  <path d="M1088.60287,624.61594a30.11371,30.11371,0,0,0,3.98291-15.266c0-13.79652-8.54358-24.98081-19.08256-24.98081s-19.08256,11.18429-19.08256,24.98081a30.11411,30.11411,0,0,0,3.98291,15.266,31.248,31.248,0,0,0,0,30.53213,31.248,31.248,0,0,0,0,30.53208,31.248,31.248,0,0,0,0,30.53208,30.11408,30.11408,0,0,0-3.98291,15.266c0,13.79652,8.54353,24.98081,19.08256,24.98081s19.08256-11.18429,19.08256-24.98081a30.11368,30.11368,0,0,0-3.98291-15.266,31.248,31.248,0,0,0,0-30.53208,31.248,31.248, [...]
+  <ellipse cx="1038.00321" cy="460.31783" rx="19.08256" ry="24.9808" fill="#3f3d56" />
+  <ellipse cx="1038.00321" cy="429.78574" rx="19.08256" ry="24.9808" fill="#3f3d56" />
+  <path d="M1144.93871,339.34489a91.61081,91.61081,0,0,0,7.10658-10.46092l-50.141-8.23491,54.22885.4033a91.566,91.566,0,0,0,1.74556-72.42605l-72.75449,37.74139,67.09658-49.32086a91.41255,91.41255,0,1,0-150.971,102.29805,91.45842,91.45842,0,0,0-10.42451,16.66946l65.0866,33.81447-69.40046-23.292a91.46011,91.46011,0,0,0,14.73837,85.83669,91.40575,91.40575,0,1,0,143.68892,0,91.41808,91.41808,0,0,0,0-113.02862Z" transform="translate(-35.5 -118.5)" fill="#3ecc5f" fill-rule="evenodd" />
+  <path d="M981.6885,395.8592a91.01343,91.01343,0,0,0,19.56129,56.51431,91.40575,91.40575,0,1,0,143.68892,0C1157.18982,436.82067,981.6885,385.60008,981.6885,395.8592Z" transform="translate(-35.5 -118.5)" opacity="0.1" />
+  <path d="M365.62,461.43628H477.094v45.12043H365.62Z" transform="translate(-35.5 -118.5)" fill="#fff" fill-rule="evenodd" />
+  <path d="M264.76252,608.74122a26.50931,26.50931,0,0,1-22.96231-13.27072,26.50976,26.50976,0,0,0,22.96231,39.81215H291.304V608.74122Z" transform="translate(-35.5 -118.5)" fill="#3ecc5f" fill-rule="evenodd" />
+  <path d="M384.17242,468.57061l92.92155-5.80726V449.49263a26.54091,26.54091,0,0,0-26.54143-26.54143H331.1161l-3.31768-5.74622a3.83043,3.83043,0,0,0-6.63536,0l-3.31768,5.74622-3.31767-5.74622a3.83043,3.83043,0,0,0-6.63536,0l-3.31768,5.74622L301.257,417.205a3.83043,3.83043,0,0,0-6.63536,0L291.304,422.9512c-.02919,0-.05573.004-.08625.004l-5.49674-5.49541a3.8293,3.8293,0,0,0-6.4071,1.71723l-1.81676,6.77338L270.607,424.1031a3.82993,3.82993,0,0,0-4.6912,4.69253l1.84463,6.89148-6.77072,1.81411 [...]
+  <path d="M424.01111,635.28265h39.81214V582.19979H424.01111Z" transform="translate(-35.5 -118.5)" fill="#3ecc5f" fill-rule="evenodd" />
+  <path d="M490.36468,602.10586a6.60242,6.60242,0,0,0-.848.08493c-.05042-.19906-.09821-.39945-.15393-.59852A6.62668,6.62668,0,1,0,482.80568,590.21q-.2203-.22491-.44457-.44589a6.62391,6.62391,0,1,0-11.39689-6.56369c-.1964-.05575-.39414-.10218-.59056-.15262a6.63957,6.63957,0,1,0-13.10086,0c-.1964.05042-.39414.09687-.59056.15262a6.62767,6.62767,0,1,0-11.39688,6.56369,26.52754,26.52754,0,1,0,44.23127,25.52756,6.6211,6.6211,0,1,0,.848-13.18579" transform="translate(-35.5 -118.5)" fill="#44d86 [...]
+  <path d="M437.28182,555.65836H477.094V529.11693H437.28182Z" transform="translate(-35.5 -118.5)" fill="#3ecc5f" fill-rule="evenodd" />
+  <path d="M490.36468,545.70532a3.31768,3.31768,0,0,0,0-6.63536,3.41133,3.41133,0,0,0-.42333.04247c-.02655-.09953-.04911-.19907-.077-.29859a3.319,3.319,0,0,0-1.278-6.37923,3.28174,3.28174,0,0,0-2.00122.68742q-.10947-.11346-.22294-.22295a3.282,3.282,0,0,0,.67149-1.98265,3.31768,3.31768,0,0,0-6.37-1.2992,13.27078,13.27078,0,1,0,0,25.54082,3.31768,3.31768,0,0,0,6.37-1.2992,3.282,3.282,0,0,0-.67149-1.98265q.11347-.10947.22294-.22294a3.28174,3.28174,0,0,0,2.00122.68742,3.31768,3.31768,0,0,0,1 [...]
+  <path d="M317.84538,466.081a3.31768,3.31768,0,0,1-3.31767-3.31768,9.953,9.953,0,1,0-19.90608,0,3.31768,3.31768,0,1,1-6.63535,0,16.58839,16.58839,0,1,1,33.17678,0,3.31768,3.31768,0,0,1-3.31768,3.31768" transform="translate(-35.5 -118.5)" fill-rule="evenodd" />
+  <path d="M370.92825,635.28265h79.62429A26.5409,26.5409,0,0,0,477.094,608.74122v-92.895H397.46968a26.54091,26.54091,0,0,0-26.54143,26.54143Z" transform="translate(-35.5 -118.5)" fill="#ffff50" fill-rule="evenodd" />
+  <path d="M457.21444,556.98543H390.80778a1.32707,1.32707,0,0,1,0-2.65414h66.40666a1.32707,1.32707,0,0,1,0,2.65414m0,26.54143H390.80778a1.32707,1.32707,0,1,1,0-2.65414h66.40666a1.32707,1.32707,0,0,1,0,2.65414m0,26.54143H390.80778a1.32707,1.32707,0,1,1,0-2.65414h66.40666a1.32707,1.32707,0,0,1,0,2.65414m0-66.10674H390.80778a1.32707,1.32707,0,0,1,0-2.65414h66.40666a1.32707,1.32707,0,0,1,0,2.65414m0,26.29459H390.80778a1.32707,1.32707,0,0,1,0-2.65414h66.40666a1.32707,1.32707,0,0,1,0,2.65414m0 [...]
+  <path d="M344.38682,635.28265h53.08286V582.19979H344.38682Z" transform="translate(-35.5 -118.5)" fill="#3ecc5f" fill-rule="evenodd" />
+  <path d="M424.01111,602.10586a6.60242,6.60242,0,0,0-.848.08493c-.05042-.19906-.09821-.39945-.15394-.59852A6.62667,6.62667,0,1,0,416.45211,590.21q-.2203-.22491-.44458-.44589a6.62391,6.62391,0,1,0-11.39689-6.56369c-.1964-.05575-.39413-.10218-.59054-.15262a6.63957,6.63957,0,1,0-13.10084,0c-.19641.05042-.39414.09687-.59055.15262a6.62767,6.62767,0,1,0-11.39689,6.56369,26.52755,26.52755,0,1,0,44.2313,25.52756,6.6211,6.6211,0,1,0,.848-13.18579" transform="translate(-35.5 -118.5)" fill="#44d86 [...]
+  <path d="M344.38682,555.65836h53.08286V529.11693H344.38682Z" transform="translate(-35.5 -118.5)" fill="#3ecc5f" fill-rule="evenodd" />
+  <path d="M410.74039,545.70532a3.31768,3.31768,0,1,0,0-6.63536,3.41133,3.41133,0,0,0-.42333.04247c-.02655-.09953-.04911-.19907-.077-.29859a3.319,3.319,0,0,0-1.278-6.37923,3.28174,3.28174,0,0,0-2.00122.68742q-.10947-.11346-.22294-.22295a3.282,3.282,0,0,0,.67149-1.98265,3.31768,3.31768,0,0,0-6.37-1.2992,13.27078,13.27078,0,1,0,0,25.54082,3.31768,3.31768,0,0,0,6.37-1.2992,3.282,3.282,0,0,0-.67149-1.98265q.11347-.10947.22294-.22294a3.28174,3.28174,0,0,0,2.00122.68742,3.31768,3.31768,0,0,0,1 [...]
+  <path d="M424.01111,447.8338a3.60349,3.60349,0,0,1-.65028-.06636,3.34415,3.34415,0,0,1-.62372-.18579,3.44679,3.44679,0,0,1-.572-.30522,5.02708,5.02708,0,0,1-.50429-.4114,3.88726,3.88726,0,0,1-.41007-.50428,3.27532,3.27532,0,0,1-.55737-1.84463,3.60248,3.60248,0,0,1,.06636-.65027,3.82638,3.82638,0,0,1,.18447-.62373,3.48858,3.48858,0,0,1,.30656-.57064,3.197,3.197,0,0,1,.91436-.91568,3.44685,3.44685,0,0,1,.572-.30523,3.344,3.344,0,0,1,.62372-.18578,3.06907,3.06907,0,0,1,1.30053,0,3.22332,3 [...]
+</svg>
diff --git a/index.html b/index.html
new file mode 100644
index 000000000..e539404d2
--- /dev/null
+++ b/index.html
@@ -0,0 +1,18 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="plugin-pages plugin-id-default" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.7.0">
+<title data-rh="true">Hello from Hyper-Efficient Message Streaming at Laser Speed. | 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-i [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed"><link rel="stylesheet" href="/assets/css/styles.db211002.css">
+<script src="/assets/js/runtime~main.b0a22bcd.js" defer="defer"></script>
+<script src="/assets/js/main.f5453fd5.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const n=new URLSearchParams(window.location.search).entries();for(var[t,e]of n)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentEle [...]
+<div>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div>
+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/markdown-page/index.html b/markdown-page/index.html
new file mode 100644
index 000000000..03fa516bb
--- /dev/null
+++ b/markdown-page/index.html
@@ -0,0 +1,19 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="mdx-wrapper mdx-page plugin-pages plugin-id-default" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.7.0">
+<title data-rh="true">Markdown page example | 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="stylesheet" href="/assets/css/styles.db211002.css">
+<script src="/assets/js/runtime~main.b0a22bcd.js" defer="defer"></script>
+<script src="/assets/js/main.f5453fd5.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const n=new URLSearchParams(window.location.search).entries();for(var[t,e]of n)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentEle [...]
+<p>You don&#x27;t need React to write simple standalone pages.</p></article></div></div></main></div><footer class="footer footer--dark"><div class="container container-fluid"><div class="row footer__links"><div class="col footer__col"><div class="footer__title">Docs</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/docs/">Docs</a></li></ul></div><div class="col footer__col"><div class="footer__title">Community</div><ul class="footer__ [...]
+<div>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div>
+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/one-year-of-building-the-message-streaming/iggy_bench.png b/one-year-of-building-the-message-streaming/iggy_bench.png
new file mode 100644
index 000000000..0bc290f94
Binary files /dev/null and b/one-year-of-building-the-message-streaming/iggy_bench.png differ
diff --git a/one-year-of-building-the-message-streaming/iggy_cli.png b/one-year-of-building-the-message-streaming/iggy_cli.png
new file mode 100644
index 000000000..364882633
Binary files /dev/null and b/one-year-of-building-the-message-streaming/iggy_cli.png differ
diff --git a/one-year-of-building-the-message-streaming/iggy_cluster.png b/one-year-of-building-the-message-streaming/iggy_cluster.png
new file mode 100644
index 000000000..dc2462104
Binary files /dev/null and b/one-year-of-building-the-message-streaming/iggy_cluster.png differ
diff --git a/one-year-of-building-the-message-streaming/iggy_perf.png b/one-year-of-building-the-message-streaming/iggy_perf.png
new file mode 100644
index 000000000..1b91cdd38
Binary files /dev/null and b/one-year-of-building-the-message-streaming/iggy_perf.png differ
diff --git a/one-year-of-building-the-message-streaming/iggy_rocket.png b/one-year-of-building-the-message-streaming/iggy_rocket.png
new file mode 100644
index 000000000..ec60dffdd
Binary files /dev/null and b/one-year-of-building-the-message-streaming/iggy_rocket.png differ
diff --git a/one-year-of-building-the-message-streaming/iggy_stars.png b/one-year-of-building-the-message-streaming/iggy_stars.png
new file mode 100644
index 000000000..4af17ca75
Binary files /dev/null and b/one-year-of-building-the-message-streaming/iggy_stars.png differ
diff --git a/one-year-of-building-the-message-streaming/iggy_tpc.png b/one-year-of-building-the-message-streaming/iggy_tpc.png
new file mode 100644
index 000000000..a8ae7b19f
Binary files /dev/null and b/one-year-of-building-the-message-streaming/iggy_tpc.png differ
diff --git a/one-year-of-building-the-message-streaming/iggy_web.png b/one-year-of-building-the-message-streaming/iggy_web.png
new file mode 100644
index 000000000..492ad4b82
Binary files /dev/null and b/one-year-of-building-the-message-streaming/iggy_web.png differ
diff --git a/sitemap.xml b/sitemap.xml
new file mode 100644
index 000000000..acc7444ac
--- /dev/null
+++ b/sitemap.xml
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:news="http://www.google.com/schemas/sitemap-news/0.9" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:image="http://www.google.com/schemas/sitemap-image/1.1" xmlns:video="http://www.google.com/schemas/sitemap-video/1.1"><url><loc>https://iggy.apache.org/blogs</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://iggy.apache.org/blogs/2023/12/29/building-m [...]
\ No newline at end of file
diff --git a/technology-radar-and-currrent-goals/iggy_docker.png b/technology-radar-and-currrent-goals/iggy_docker.png
new file mode 100644
index 000000000..41e3a6070
Binary files /dev/null and b/technology-radar-and-currrent-goals/iggy_docker.png differ
diff --git a/technology-radar-and-currrent-goals/iggy_technology_radar.png b/technology-radar-and-currrent-goals/iggy_technology_radar.png
new file mode 100644
index 000000000..ed08158ae
Binary files /dev/null and b/technology-radar-and-currrent-goals/iggy_technology_radar.png differ
diff --git a/technology-radar-and-currrent-goals/iggy_vsr.png b/technology-radar-and-currrent-goals/iggy_vsr.png
new file mode 100644
index 000000000..1615725e7
Binary files /dev/null and b/technology-radar-and-currrent-goals/iggy_vsr.png differ
diff --git a/transparent-benchmarks/iggy_bench_cli.png b/transparent-benchmarks/iggy_bench_cli.png
new file mode 100644
index 000000000..cfd278069
Binary files /dev/null and b/transparent-benchmarks/iggy_bench_cli.png differ
diff --git a/transparent-benchmarks/iggy_bench_dashboard.png b/transparent-benchmarks/iggy_bench_dashboard.png
new file mode 100644
index 000000000..64cf3bb02
Binary files /dev/null and b/transparent-benchmarks/iggy_bench_dashboard.png differ