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/08/10 16:22:31 UTC
(iggy-website) 01/01: Deploy website from main branch 037b58db64e401c66e0ac274ee803a34788d2a6e
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 c52f54409158fcaf416965d0ab67cc8f30f563e1
Author: github-actions[bot] <gi...@users.noreply.github.com>
AuthorDate: Sun Aug 10 16:22:24 2025 +0000
Deploy website from main branch 037b58db64e401c66e0ac274ee803a34788d2a6e
---
.asf.yaml | 36 +
.nojekyll | 0
404.html | 18 +
apache-incubator/iggy_logo.png | Bin 0 -> 105328 bytes
assets/css/styles.00ae354b.css | 25 +
...chitecture-5d7f7f7ed58a399ea2f5a7c74c074f65.png | Bin 0 -> 760914 bytes
.../bench_cli-02b0d7bd13656d700fbdf1c76ae76fa3.png | Bin 0 -> 380000 bytes
...h_platform-dad3f0256bec6e556b40ea798366b7fe.png | Bin 0 -> 326093 bytes
..._trending-bbecb9e6ddc18e345fbdb7c8bae838d9.jpeg | Bin 0 -> 390292 bytes
...hero-main-e1a5810725936dc0dcd079d7858873b0.webp | Bin 0 -> 150984 bytes
...iggy_0_1_0-c635523620b5dc0af17545d1c3ce3edd.jpg | Bin 0 -> 82650 bytes
...h_schema_1-61b4d896b850e3d0ee08270f7db7c6b5.png | Bin 0 -> 525799 bytes
...h_schema_2-c7a5fc6158b838999c178ef8aea96089.png | Bin 0 -> 546950 bytes
...ggy_bench-9ea0ebbd13ad66abb94ec3d8d8697048.jpeg | Bin 0 -> 615288 bytes
...iggy_bench-eed7510a845dfb053ac67be624599c99.png | Bin 0 -> 111659 bytes
...nch_0_1_0-afcc4cf7770ab3863afbdd2a7871492b.jpeg | Bin 0 -> 1386983 bytes
..._bench_cli-32946d97899e6925f99469dad967ca7e.png | Bin 0 -> 515157 bytes
..._dashboard-20dc5e120f14f0c4618f23227cd08ac9.png | Bin 0 -> 394188 bytes
..._ci_0_1_0-b31e9445de207c06bd2eee74dafac357.jpeg | Bin 0 -> 538032 bytes
...ggy_ci_cd-a03f984dde69dbbc209f61481d7d1c91.jpeg | Bin 0 -> 78169 bytes
.../iggy_cli-b139e02165e2570574ac638f7db8801f.png | Bin 0 -> 231092 bytes
.../iggy_cli-c140d5ecfddf24acd537722137b70c47.png | Bin 0 -> 90242 bytes
.../iggy_cli-efc853d35dfcddfb68957f9f7cbdd745.jpeg | Bin 0 -> 538239 bytes
...cli_0_1_0-aa8dbc85bd46875427ae87e133ec8482.jpeg | Bin 0 -> 1049410 bytes
...gy_cluster-c2c33596763c8b9930c7de7e12dc3586.png | Bin 0 -> 872341 bytes
...ggy_docker-37b72ad9d9a244e1464c94f03c162193.png | Bin 0 -> 721661 bytes
.../iggy_logo-f0e83b91b22303a5545dfb6d49756d18.png | Bin 0 -> 105328 bytes
.../iggy_perf-33fc4db2b6cbd7156b753eee6aeaba60.png | Bin 0 -> 68641 bytes
...ggy_rocket-24a27df28dafae43eb9634a4f6b00c5e.png | Bin 0 -> 225148 bytes
...gy_sample-39395c20221652515f2296734851e042.jpeg | Bin 0 -> 874973 bytes
...gy_server-b28372292592869008ceb03c1edfdc51.jpeg | Bin 0 -> 976463 bytes
...ggy_server-f7851820c876c0a5b3c0159f953ae728.png | Bin 0 -> 1176428 bytes
...ver_0_1_0-7d957a6db68439149d9c805432318296.jpeg | Bin 0 -> 1064181 bytes
...iggy_stars-adb7a001298df7df97de6b0fdd6321ce.png | Bin 0 -> 35419 bytes
...logy_radar-291413e3a6d4cb1a5b7832ab5865423e.png | Bin 0 -> 406596 bytes
.../iggy_tpc-a6b43534112bfc2c863a2ef675c0a547.png | Bin 0 -> 423184 bytes
.../iggy_vsr-3d747255ce17ecda927ccd4d258f7016.png | Bin 0 -> 3958317 bytes
.../iggy_web-76023f316d53cc2e44ae6f7b83193529.png | Bin 0 -> 109581 bytes
...ggy_web_ui-40085aee2ec268a2dbb1e8c946009e38.png | Bin 0 -> 145001 bytes
...gy_web_ui-58fc54e40a2756eba04dec9206de70a5.jpeg | Bin 0 -> 215638 bytes
..._ui_0_1_0-58fc54e40a2756eba04dec9206de70a5.jpeg | Bin 0 -> 215638 bytes
.../iggys-5cd88b6e4af91d0e5b0f1ef688b8efac.jpeg | Bin 0 -> 512046 bytes
...elections-f973c06ac3c6b230945e496faa6f314e.jpeg | Bin 0 -> 1299078 bytes
...y_consumer-ae546079ca662038a43983969c9fa325.png | Bin 0 -> 1490151 bytes
...y_producer-ffed3643f7efa9c5ac43a3ce4cba746c.png | Bin 0 -> 684901 bytes
...y_consumer-b0a3206f473d6d13c8cc4fc8dfca3486.png | Bin 0 -> 485344 bytes
...y_producer-6cd58f250a711fb170bba9091da38606.png | Bin 0 -> 602342 bytes
assets/js/0058b4c6.6ecf67c3.js | 1 +
assets/js/0169d23c.1cc43dc5.js | 1 +
assets/js/01a85c17.165d627c.js | 1 +
assets/js/02f37a76.30e99f5b.js | 1 +
assets/js/03a9e148.af1e4437.js | 1 +
assets/js/05a04b69.10eac053.js | 1 +
assets/js/0755831e.0f6e8acc.js | 1 +
assets/js/097d5e07.8495190f.js | 1 +
assets/js/0aee7f2c.ac0a3bdb.js | 1 +
assets/js/0cedcff6.238108df.js | 1 +
assets/js/12deeac4.0fb26aab.js | 1 +
assets/js/144.d7d62eaf.js | 1 +
assets/js/17896441.183eeb03.js | 1 +
assets/js/17e33b4e.013b5a51.js | 1 +
assets/js/19432d33.3f53ea4d.js | 1 +
assets/js/1b6ff2c5.aaaded18.js | 1 +
assets/js/1ccbcc53.6ca33163.js | 1 +
assets/js/1df93b7f.505624bb.js | 1 +
assets/js/1e5ad4f9.2b940198.js | 1 +
assets/js/1f391b9e.de58e70a.js | 1 +
assets/js/20544421.fcacb2af.js | 1 +
assets/js/218f3d72.d3b47fbb.js | 1 +
assets/js/25cfbc78.938186c0.js | 1 +
assets/js/296d7672.f5cd54fe.js | 1 +
assets/js/2edd2ec4.c4978c5b.js | 1 +
assets/js/2f80e784.6ba7b6f9.js | 1 +
assets/js/3042.6db20ed9.js | 1 +
assets/js/3049ae2a.0bf0f45c.js | 1 +
assets/js/332362b2.784941d3.js | 1 +
assets/js/363979b1.31bb19d0.js | 1 +
assets/js/36994c47.a62ea346.js | 1 +
assets/js/393be207.8efd7034.js | 1 +
assets/js/3d897b37.89c14111.js | 1 +
assets/js/3defdf4b.87098e14.js | 1 +
assets/js/41e60a44.1ce9bdae.js | 1 +
assets/js/46167e1b.c6d754f7.js | 1 +
assets/js/4726e312.15e455ad.js | 1 +
assets/js/544367a9.8636f3f4.js | 1 +
assets/js/54b5fc15.33a62aa3.js | 1 +
assets/js/5a05130f.70b339da.js | 1 +
assets/js/5e95c892.04e1f2fd.js | 1 +
assets/js/5f481cd4.1f708287.js | 1 +
assets/js/62290500.c8b9f95d.js | 1 +
assets/js/64ee4266.21b531a2.js | 1 +
assets/js/666c9b96.510c7926.js | 1 +
assets/js/6875c492.66f692df.js | 1 +
assets/js/6a23e949.a1f58d72.js | 1 +
assets/js/6a2e60e3.f1f26543.js | 1 +
assets/js/6ea6d42b.32a1cc1b.js | 1 +
assets/js/71369862.6cb9d057.js | 1 +
assets/js/71a4f72a.c2aa41ed.js | 1 +
assets/js/76680d72.08874437.js | 1 +
assets/js/782bd44c.a82b3fbd.js | 1 +
assets/js/7d3d0ee4.ac05190d.js | 1 +
assets/js/7e31e0a8.6a486898.js | 1 +
assets/js/7eb7d8a5.35fc5cc6.js | 1 +
assets/js/814f3328.58710dad.js | 1 +
assets/js/83d73c01.d6e9c30b.js | 1 +
assets/js/8a6c01a6.85bf8a3b.js | 1 +
assets/js/8b22b5f5.be549698.js | 1 +
assets/js/8b8cddd6.118b4944.js | 1 +
assets/js/8c2332e9.6de934c7.js | 1 +
assets/js/907ba26f.bf1b09e4.js | 1 +
assets/js/92abec30.df7d3bab.js | 1 +
assets/js/9392.3d0db441.js | 1 +
assets/js/9590c6d3.b3ec0770.js | 1 +
assets/js/98883e6e.61374d1a.js | 1 +
assets/js/9ca9f017.9e03b340.js | 1 +
assets/js/9e4087bc.b4937ced.js | 1 +
assets/js/a2ea038e.71930cd9.js | 1 +
assets/js/a4d21046.9d474182.js | 1 +
assets/js/a6aa9e1f.8c329eef.js | 1 +
assets/js/a7456010.a8a22b85.js | 1 +
assets/js/a7bd4aaa.5082748c.js | 1 +
assets/js/a7c1df9a.3829bb42.js | 1 +
assets/js/a902938a.31fa8d6e.js | 1 +
assets/js/a94703ab.f3018d96.js | 1 +
assets/js/aba21aa0.c17b1acf.js | 1 +
assets/js/acecf23e.ed39bb7e.js | 1 +
assets/js/b041cdfc.ce95290e.js | 1 +
assets/js/b1fb958a.8c6863ad.js | 1 +
assets/js/b8b35ff1.e8d8574c.js | 1 +
assets/js/c065b223.a5057641.js | 1 +
assets/js/c23ee533.b39a19a7.js | 1 +
assets/js/c3a24e9c.aa536bf3.js | 1 +
assets/js/c5f172dd.724e29a7.js | 1 +
assets/js/c70ea44c.a11bfed7.js | 1 +
assets/js/c8d81af2.45a903b0.js | 1 +
assets/js/ca66c66a.3a322fab.js | 1 +
assets/js/cc16a589.7aa15748.js | 1 +
assets/js/ccc49370.3ca38c32.js | 1 +
assets/js/ce80ecba.1b8ce33f.js | 1 +
assets/js/cfc3091e.99b8e270.js | 1 +
assets/js/d1796fc4.3170eb2e.js | 1 +
assets/js/d19ecac4.66ea1d81.js | 1 +
assets/js/d6bb211a.cb8dda6e.js | 1 +
assets/js/d74d5d7a.a1644219.js | 1 +
assets/js/d83bd44c.5695e425.js | 1 +
assets/js/da420000.e3edc2d3.js | 1 +
assets/js/da5fc804.46ae6dba.js | 1 +
assets/js/e05ad208.7fe927f4.js | 1 +
assets/js/e35843f4.76b48ed6.js | 1 +
assets/js/e7c222e2.2226c29b.js | 1 +
assets/js/efbe804b.c4ddfb48.js | 1 +
assets/js/f5480997.87d50f19.js | 1 +
assets/js/ff030c8a.e940df38.js | 1 +
assets/js/ff06d166.7fc8e2f9.js | 1 +
assets/js/main.e9fd05f4.js | 2 +
assets/js/main.e9fd05f4.js.LICENSE.txt | 61 ++
assets/js/runtime~main.abd83413.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 | 61 ++
blogs/2025/02/17/transparent-benchmarks/index.html | 43 ++
.../05/08/zero-copy-deserialization/index.html | 63 ++
blogs/2025/06/06/connectors-runtime/index.html | 39 ++
blogs/archive/index.html | 18 +
blogs/atom.css | 75 ++
blogs/atom.xml | 759 +++++++++++++++++++++
blogs/atom.xsl | 92 +++
blogs/consumer-identifier/index.html | 31 +
blogs/iggy-0-1-0-release/index.html | 33 +
blogs/index.html | 26 +
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.css | 75 ++
blogs/rss.xml | 693 +++++++++++++++++++
blogs/rss.xsl | 86 +++
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/ai/introduction/index.html | 19 +
docs/ai/mcp/index.html | 25 +
docs/cli/iggy-cli/index.html | 39 ++
docs/connectors/introduction/index.html | 67 ++
docs/connectors/runtime/index.html | 42 ++
docs/connectors/sdk/index.html | 68 ++
docs/connectors/sink/index.html | 54 ++
docs/connectors/source/index.html | 58 ++
docs/index.html | 19 +
docs/introduction/about/index.html | 92 +++
docs/introduction/architecture/index.html | 45 ++
docs/introduction/getting-started/index.html | 112 +++
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/introduction/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/high-level-sdk/index.html | 58 ++
docs/sdk/rust/intro/index.html | 19 +
docs/sdk/rust/stream-builder/index.html | 102 +++
docs/server/benchmarking/index.html | 59 ++
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 +
downloads/index.html | 47 ++
fonts/Inter-Medium.ttf | Bin 0 -> 314712 bytes
fonts/Inter-Regular.ttf | Bin 0 -> 309828 bytes
fonts/Inter-SemiBold.ttf | Bin 0 -> 315756 bytes
img/AdvancedFeatures.svg | 30 +
img/Avatar-Placeholder.svg | 9 +
img/ExtremelyEfficient.svg | 9 +
img/FullyOpenSourced.svg | 16 +
img/Image-Placeholder-1.svg | 4 +
img/Image-Placeholder-2.svg | 4 +
img/Image-Placeholder-3.svg | 4 +
img/ManagementInterface.svg | 30 +
img/MultipleTransports.svg | 72 ++
img/Sdk.svg | 44 ++
img/Switch-Handle.svg | 3 +
img/SystemFlow-Logo-White.svg | 11 +
img/SystemFlow-Logo.svg | 11 +
img/Video-Placeholder.svg | 4 +
img/apache-iggy-light-bg0.5x.png | Bin 0 -> 97156 bytes
img/apache-iggy0.5x.png | Bin 0 -> 96018 bytes
img/architecture.png | Bin 0 -> 760914 bytes
img/asf_logo.svg | 210 ++++++
img/bench_cli.png | Bin 0 -> 380000 bytes
img/bench_platform.png | Bin 0 -> 326093 bytes
img/check.svg | 3 +
img/cookies-1.svg | 20 +
img/copy-icon.svg | 3 +
img/dc-icon-p-130x130q80.png | Bin 0 -> 1509 bytes
img/dc-icon.png | Bin 0 -> 10623 bytes
img/docusaurus-social-card.jpg | Bin 0 -> 55746 bytes
img/docusaurus.png | Bin 0 -> 5142 bytes
img/emetlabs-light.svg | 27 +
img/favicon.ico | Bin 0 -> 15406 bytes
img/favicon.png | Bin 0 -> 2612 bytes
img/gh-icon-orange.svg | 14 +
img/github-mark-white.svg | 1 +
img/hero-main copy.webp | Bin 0 -> 150984 bytes
img/hero-main-p-1080 copy.webp | Bin 0 -> 58010 bytes
img/hero-main-p-1080.webp | Bin 0 -> 58010 bytes
img/hero-main-p-1600 copy.webp | Bin 0 -> 103532 bytes
img/hero-main-p-1600.webp | Bin 0 -> 103532 bytes
img/hero-main-p-500 copy.webp | Bin 0 -> 18198 bytes
img/hero-main-p-500.webp | Bin 0 -> 18198 bytes
img/hero-main-p-800 copy.webp | Bin 0 -> 36490 bytes
img/hero-main-p-800.webp | Bin 0 -> 36490 bytes
img/hero-main.webp | Bin 0 -> 150984 bytes
img/hugin-light.svg | 23 +
img/iggy-apache-color-darkbg.svg | 112 +++
img/iggy-logo-1.png | Bin 0 -> 76710 bytes
img/iggy.png | Bin 0 -> 172679 bytes
img/iggy_0_1_0.jpg | Bin 0 -> 82650 bytes
img/iggy_bench_0_1_0.jpeg | Bin 0 -> 1386983 bytes
img/iggy_ci_0_1_0.jpeg | Bin 0 -> 538032 bytes
img/iggy_cli.png | Bin 0 -> 231092 bytes
img/iggy_cli_0_1_0.jpeg | Bin 0 -> 1049410 bytes
img/iggy_server.png | Bin 0 -> 1176428 bytes
img/iggy_server_0_1_0.jpeg | Bin 0 -> 1064181 bytes
img/iggy_web_ui.png | Bin 0 -> 145001 bytes
img/iggy_web_ui_0_1_0.jpeg | Bin 0 -> 215638 bytes
img/logo.png | Bin 0 -> 5663 bytes
img/logo.svg | 1 +
img/neferdata-light.svg | 29 +
img/solidhash.png | Bin 0 -> 6571 bytes
img/undraw_docusaurus_mountain.svg | 171 +++++
img/undraw_docusaurus_react.svg | 170 +++++
img/undraw_docusaurus_tree.svg | 40 ++
img/webclip.png | Bin 0 -> 26495 bytes
index.html | 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 -> 394188 bytes
zero-copy-deserialization/iggy_batch_schema_1.png | Bin 0 -> 525799 bytes
zero-copy-deserialization/iggy_batch_schema_2.png | Bin 0 -> 546950 bytes
.../no_zero_copy_consumer.png | Bin 0 -> 1490151 bytes
.../no_zero_copy_producer.png | Bin 0 -> 684901 bytes
zero-copy-deserialization/zero_copy_consumer.png | Bin 0 -> 485344 bytes
zero-copy-deserialization/zero_copy_producer.png | Bin 0 -> 602342 bytes
330 files changed, 5894 insertions(+)
diff --git a/.asf.yaml b/.asf.yaml
new file mode 100644
index 000000000..cb43a0657
--- /dev/null
+++ b/.asf.yaml
@@ -0,0 +1,36 @@
+github:
+ description: "Apache Iggy (Incubating) Website"
+ homepage: https://iggy.apache.org/
+ features:
+ # Enable wiki for documentation
+ wiki: true
+ # Enable issue management
+ issues: true
+ # Enable discussions
+ discussions: true
+ labels:
+ - rust
+ - message-streaming
+ - iggy
+ - apache
+ enabled_merge_buttons:
+ squash: true
+ merge: false
+ rebase: false
+
+ collaborators:
+ - landingpro
+
+publish:
+ whoami: asf-site
+
+# Staging and publishing profile:
+staging:
+ profile: ~
+ whoami: asf-staging
+
+notifications:
+ commits: commits@iggy.apache.org
+ issues: commits@iggy.apache.org
+ pullrequests: commits@iggy.apache.org
+ discussions: dev@iggy.apache.org
\ No newline at end of file
diff --git a/.nojekyll b/.nojekyll
new file mode 100644
index 000000000..e69de29bb
diff --git a/404.html b/404.html
new file mode 100644
index 000000000..c858d783a
--- /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.00ae354b.css">
+<script src="/assets/js/runtime~main.abd83413.js" defer="defer"></script>
+<script src="/assets/js/main.e9fd05f4.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><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/apache-incubator/iggy_logo.png b/apache-incubator/iggy_logo.png
new file mode 100644
index 000000000..33c3e2c28
Binary files /dev/null and b/apache-incubator/iggy_logo.png differ
diff --git a/assets/css/styles.00ae354b.css b/assets/css/styles.00ae354b.css
new file mode 100644
index 000000000..9d8dd83c9
--- /dev/null
+++ b/assets/css/styles.00ae354b.css
@@ -0,0 +1,25 @@
+@import url(https://fonts.googleapis.com/css2?family=Manrope:wght@300;400;500;600;700&display=swap);@import url(https://fonts.googleapis.com/icon?family=Material+Icons);:root{--ifm-color-scheme:light;--ifm-dark-value:10%;--ifm-darker-value:15%;--ifm-darkest-value:30%;--ifm-light-value:15%;--ifm-lighter-value:30%;--ifm-lightest-value:50%;--ifm-contrast-background-value:90%;--ifm-contrast-foreground-value:70%;--ifm-contrast-background-dark-value:70%;--ifm-contrast-foreground-dark-value:90% [...]
+ --ifm-color-primary-contrast-background
+ );--ifm-alert-background-color-highlight:#3578e526;--ifm-alert-foreground-color:var(
+ --ifm-color-primary-contrast-foreground
+ );--ifm-alert-border-color:var(--ifm-color-primary-dark)}.alert--secondary{--ifm-alert-background-color:var(
+ --ifm-color-secondary-contrast-background
+ );--ifm-alert-background-color-highlight:#ebedf026;--ifm-alert-foreground-color:var(
+ --ifm-color-secondary-contrast-foreground
+ );--ifm-alert-border-color:var(--ifm-color-secondary-dark)}.alert--success{--ifm-alert-background-color:var(
+ --ifm-color-success-contrast-background
+ );--ifm-alert-background-color-highlight:#00a40026;--ifm-alert-foreground-color:var(
+ --ifm-color-success-contrast-foreground
+ );--ifm-alert-border-color:var(--ifm-color-success-dark)}.alert--info{--ifm-alert-background-color:var(
+ --ifm-color-info-contrast-background
+ );--ifm-alert-background-color-highlight:#54c7ec26;--ifm-alert-foreground-color:var(
+ --ifm-color-info-contrast-foreground
+ );--ifm-alert-border-color:var(--ifm-color-info-dark)}.alert--warning{--ifm-alert-background-color:var(
+ --ifm-color-warning-contrast-background
+ );--ifm-alert-background-color-highlight:#ffba0026;--ifm-alert-foreground-color:var(
+ --ifm-color-warning-contrast-foreground
+ );--ifm-alert-border-color:var(--ifm-color-warning-dark)}.alert--danger{--ifm-alert-background-color:var(
+ --ifm-color-danger-contrast-background
+ );--ifm-alert-background-color-highlight:#fa383e26;--ifm-alert-foreground-color:var(
+ --ifm-color-danger-contrast-foreground
+ );--ifm-alert-border-color:var(--ifm-color-danger-dark)}.alert{--ifm-code-background:var(--ifm-alert-background-color-highlight);--ifm-link-color:var(--ifm-alert-foreground-color);--ifm-link-hover-color:var(--ifm-alert-foreground-color);--ifm-link-decoration:underline;--ifm-tabs-color:var(--ifm-alert-foreground-color);--ifm-tabs-color-active:var(--ifm-alert-foreground-color);--ifm-tabs-color-active-border:var(--ifm-alert-border-color);background-color:var(--ifm-alert-background-col [...]
\ No newline at end of file
diff --git a/assets/images/architecture-5d7f7f7ed58a399ea2f5a7c74c074f65.png b/assets/images/architecture-5d7f7f7ed58a399ea2f5a7c74c074f65.png
new file mode 100644
index 000000000..0d1c885f8
Binary files /dev/null and b/assets/images/architecture-5d7f7f7ed58a399ea2f5a7c74c074f65.png differ
diff --git a/assets/images/bench_cli-02b0d7bd13656d700fbdf1c76ae76fa3.png b/assets/images/bench_cli-02b0d7bd13656d700fbdf1c76ae76fa3.png
new file mode 100644
index 000000000..5bf0eacc2
Binary files /dev/null and b/assets/images/bench_cli-02b0d7bd13656d700fbdf1c76ae76fa3.png differ
diff --git a/assets/images/bench_platform-dad3f0256bec6e556b40ea798366b7fe.png b/assets/images/bench_platform-dad3f0256bec6e556b40ea798366b7fe.png
new file mode 100644
index 000000000..8e56cd1dd
Binary files /dev/null and b/assets/images/bench_platform-dad3f0256bec6e556b40ea798366b7fe.png differ
diff --git a/assets/images/gh_trending-bbecb9e6ddc18e345fbdb7c8bae838d9.jpeg b/assets/images/gh_trending-bbecb9e6ddc18e345fbdb7c8bae838d9.jpeg
new file mode 100644
index 000000000..117b7e77f
Binary files /dev/null and b/assets/images/gh_trending-bbecb9e6ddc18e345fbdb7c8bae838d9.jpeg differ
diff --git a/assets/images/hero-main-e1a5810725936dc0dcd079d7858873b0.webp b/assets/images/hero-main-e1a5810725936dc0dcd079d7858873b0.webp
new file mode 100644
index 000000000..12874b7c2
Binary files /dev/null and b/assets/images/hero-main-e1a5810725936dc0dcd079d7858873b0.webp differ
diff --git a/assets/images/iggy_0_1_0-c635523620b5dc0af17545d1c3ce3edd.jpg b/assets/images/iggy_0_1_0-c635523620b5dc0af17545d1c3ce3edd.jpg
new file mode 100644
index 000000000..8b7383373
Binary files /dev/null and b/assets/images/iggy_0_1_0-c635523620b5dc0af17545d1c3ce3edd.jpg differ
diff --git a/assets/images/iggy_batch_schema_1-61b4d896b850e3d0ee08270f7db7c6b5.png b/assets/images/iggy_batch_schema_1-61b4d896b850e3d0ee08270f7db7c6b5.png
new file mode 100644
index 000000000..bdba41657
Binary files /dev/null and b/assets/images/iggy_batch_schema_1-61b4d896b850e3d0ee08270f7db7c6b5.png differ
diff --git a/assets/images/iggy_batch_schema_2-c7a5fc6158b838999c178ef8aea96089.png b/assets/images/iggy_batch_schema_2-c7a5fc6158b838999c178ef8aea96089.png
new file mode 100644
index 000000000..a3ed870e3
Binary files /dev/null and b/assets/images/iggy_batch_schema_2-c7a5fc6158b838999c178ef8aea96089.png differ
diff --git a/assets/images/iggy_bench-9ea0ebbd13ad66abb94ec3d8d8697048.jpeg b/assets/images/iggy_bench-9ea0ebbd13ad66abb94ec3d8d8697048.jpeg
new file mode 100644
index 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-20dc5e120f14f0c4618f23227cd08ac9.png b/assets/images/iggy_bench_dashboard-20dc5e120f14f0c4618f23227cd08ac9.png
new file mode 100644
index 000000000..67847f4c5
Binary files /dev/null and b/assets/images/iggy_bench_dashboard-20dc5e120f14f0c4618f23227cd08ac9.png differ
diff --git a/assets/images/iggy_ci_0_1_0-b31e9445de207c06bd2eee74dafac357.jpeg b/assets/images/iggy_ci_0_1_0-b31e9445de207c06bd2eee74dafac357.jpeg
new file mode 100644
index 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-b139e02165e2570574ac638f7db8801f.png b/assets/images/iggy_cli-b139e02165e2570574ac638f7db8801f.png
new file mode 100644
index 000000000..43acc469d
Binary files /dev/null and b/assets/images/iggy_cli-b139e02165e2570574ac638f7db8801f.png differ
diff --git a/assets/images/iggy_cli-c140d5ecfddf24acd537722137b70c47.png b/assets/images/iggy_cli-c140d5ecfddf24acd537722137b70c47.png
new file mode 100644
index 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-f7851820c876c0a5b3c0159f953ae728.png b/assets/images/iggy_server-f7851820c876c0a5b3c0159f953ae728.png
new file mode 100644
index 000000000..02e27e0e7
Binary files /dev/null and b/assets/images/iggy_server-f7851820c876c0a5b3c0159f953ae728.png differ
diff --git a/assets/images/iggy_server_0_1_0-7d957a6db68439149d9c805432318296.jpeg b/assets/images/iggy_server_0_1_0-7d957a6db68439149d9c805432318296.jpeg
new file mode 100644
index 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-40085aee2ec268a2dbb1e8c946009e38.png b/assets/images/iggy_web_ui-40085aee2ec268a2dbb1e8c946009e38.png
new file mode 100644
index 000000000..1fa0d7db6
Binary files /dev/null and b/assets/images/iggy_web_ui-40085aee2ec268a2dbb1e8c946009e38.png differ
diff --git a/assets/images/iggy_web_ui-58fc54e40a2756eba04dec9206de70a5.jpeg b/assets/images/iggy_web_ui-58fc54e40a2756eba04dec9206de70a5.jpeg
new file mode 100644
index 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/images/no_zero_copy_consumer-ae546079ca662038a43983969c9fa325.png b/assets/images/no_zero_copy_consumer-ae546079ca662038a43983969c9fa325.png
new file mode 100644
index 000000000..7252a706f
Binary files /dev/null and b/assets/images/no_zero_copy_consumer-ae546079ca662038a43983969c9fa325.png differ
diff --git a/assets/images/no_zero_copy_producer-ffed3643f7efa9c5ac43a3ce4cba746c.png b/assets/images/no_zero_copy_producer-ffed3643f7efa9c5ac43a3ce4cba746c.png
new file mode 100644
index 000000000..c352f6903
Binary files /dev/null and b/assets/images/no_zero_copy_producer-ffed3643f7efa9c5ac43a3ce4cba746c.png differ
diff --git a/assets/images/zero_copy_consumer-b0a3206f473d6d13c8cc4fc8dfca3486.png b/assets/images/zero_copy_consumer-b0a3206f473d6d13c8cc4fc8dfca3486.png
new file mode 100644
index 000000000..cb2d31018
Binary files /dev/null and b/assets/images/zero_copy_consumer-b0a3206f473d6d13c8cc4fc8dfca3486.png differ
diff --git a/assets/images/zero_copy_producer-6cd58f250a711fb170bba9091da38606.png b/assets/images/zero_copy_producer-6cd58f250a711fb170bba9091da38606.png
new file mode 100644
index 000000000..0239eee71
Binary files /dev/null and b/assets/images/zero_copy_producer-6cd58f250a711fb170bba9091da38606.png differ
diff --git a/assets/js/0058b4c6.6ecf67c3.js b/assets/js/0058b4c6.6ecf67c3.js
new file mode 100644
index 000000000..d3801ce4d
--- /dev/null
+++ b/assets/js/0058b4c6.6ecf67c3.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.1cc43dc5.js b/assets/js/0169d23c.1cc43dc5.js
new file mode 100644
index 000000000..a8dde2334
--- /dev/null
+++ b/assets/js/0169d23c.1cc43dc5.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[9437],{1262:e=>{e.exports=JSON.parse('{"permalink":"/blogs/welcome-to-the-changelog","source":"@site/blog/2023-08-16-welcome.md","title":"Welcome to the changelog","description":"Welcome to the changelog, in which you will read about all the changes that we make to the project.","date":"2023-08-16T00:00:00.000Z","tags":[{"inline":true,"label":"hello","permalink":"/blogs/tags/hello"}],"readingTime":0.515 [...]
\ No newline at end of file
diff --git a/assets/js/01a85c17.165d627c.js b/assets/js/01a85c17.165d627c.js
new file mode 100644
index 000000000..436edf2a6
--- /dev/null
+++ b/assets/js/01a85c17.165d627c.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[8209],{569:(e,t,a)=>{a.d(t,{A:()=>U});var s=a(6540),n=a(4164),i=a(1410),r=a(6682),l=a(539),o=a(3750),c=a(3115),m=a(9303),d=a(4848);function u({year:e,yearGroupHeadingClassName:t,children:a}){return(0,d.jsxs)("div",{role:"group",children:[(0,d.jsx)(m.A,{as:"h3",className:t,children:e}),a]})}function g({items:e,yearGroupHeadingClassName:t,ListComponent:a}){if((0,c.p)().blog.sidebar.groupByYear){const s=(0 [...]
\ No newline at end of file
diff --git a/assets/js/02f37a76.30e99f5b.js b/assets/js/02f37a76.30e99f5b.js
new file mode 100644
index 000000000..9666520cf
--- /dev/null
+++ b/assets/js/02f37a76.30e99f5b.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[2127],{443:e=>{e.exports=JSON.parse('{"permalink":"/blogs/2025/06/06/connectors-runtime","source":"@site/blog/2025-06-06-connectors-runtime.md","title":"Connectors runtime","description":"Extending Apache Iggy capabilities","date":"2025-06-06T00:00:00.000Z","tags":[],"readingTime":4.95,"hasTruncateMarker":true,"authors":[{"name":"Piotr Gankiewicz","title":"Apache Iggy founder","url":"https://github.com/ [...]
\ No newline at end of file
diff --git a/assets/js/03a9e148.af1e4437.js b/assets/js/03a9e148.af1e4437.js
new file mode 100644
index 000000000..9664d4f47
--- /dev/null
+++ b/assets/js/03a9e148.af1e4437.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[512],{6619:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>a,contentTitle:()=>c,default:()=>h,frontMatter:()=>r,metadata:()=>o,toc:()=>l});const o=JSON.parse('{"id":"connectors/connectors-runtime","title":"Runtime","description":"Runtime is responsible for managing the lifecycle of the connectors and providing the necessary infrastructure for the connectors to run.","source":"@site/docs/connectors/runtime.md","sourc [...]
\ No newline at end of file
diff --git a/assets/js/05a04b69.10eac053.js b/assets/js/05a04b69.10eac053.js
new file mode 100644
index 000000000..ca2f59c17
--- /dev/null
+++ b/assets/js/05a04b69.10eac053.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[172],{1262:e=>{e.exports=JSON.parse('{"permalink":"/blogs/welcome-to-the-changelog","source":"@site/blog/2023-08-16-welcome.md","title":"Welcome to the changelog","description":"Welcome to the changelog, in which you will read about all the changes that we make to the project.","date":"2023-08-16T00:00:00.000Z","tags":[{"inline":true,"label":"hello","permalink":"/blogs/tags/hello"}],"readingTime":0.515, [...]
\ 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.8495190f.js b/assets/js/097d5e07.8495190f.js
new file mode 100644
index 000000000..9952aecc0
--- /dev/null
+++ b/assets/js/097d5e07.8495190f.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[1318],{6047:e=>{e.exports=JSON.parse('{"permalink":"/blogs/updated-schemas","source":"@site/blog/2023-08-31-updated-schemas.md","title":"Updated schemas","description":"The latest update introduces the changes to the PollMessages and GetConsumerOffset commands response schema, as well as the Stream, Topic and Partition structs extended with created_at field.","date":"2023-08-31T00:00:00.000Z","tags":[{" [...]
\ 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/0cedcff6.238108df.js b/assets/js/0cedcff6.238108df.js
new file mode 100644
index 000000000..4c7cf98a5
--- /dev/null
+++ b/assets/js/0cedcff6.238108df.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[3848],{6855:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>a,contentTitle:()=>c,default:()=>u,frontMatter:()=>i,metadata:()=>o,toc:()=>l});const o=JSON.parse('{"id":"connectors/connectors-source","title":"Source","description":"Overview","source":"@site/docs/connectors/source.md","sourceDirName":"connectors","slug":"/connectors/source","permalink":"/docs/connectors/source","draft":false,"unlisted":false,"tags":[]," [...]
\ No newline at end of file
diff --git a/assets/js/12deeac4.0fb26aab.js b/assets/js/12deeac4.0fb26aab.js
new file mode 100644
index 000000000..e68834468
--- /dev/null
+++ b/assets/js/12deeac4.0fb26aab.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[5388],{331:e=>{e.exports=JSON.parse('{"permalink":"/blogs/iggy-0-1-0-release","source":"@site/blog/2023-11-26-release-0.1.0.md","title":"Iggy 0.1.0 release","description":"We are happy to announce that Iggy.rs has reached the 0.1.0 release. This is a major milestone for the project, as it\'s getting closer to the first stable release.","date":"2023-11-26T00:00:00.000Z","tags":[{"inline":true,"label":"re [...]
\ No newline at end of file
diff --git a/assets/js/144.d7d62eaf.js b/assets/js/144.d7d62eaf.js
new file mode 100644
index 000000000..ce49e206d
--- /dev/null
+++ b/assets/js/144.d7d62eaf.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[144],{569:(e,t,a)=>{a.d(t,{A:()=>T});var s=a(6540),n=a(4164),i=a(1410),r=a(6682),l=a(539),o=a(3750),c=a(3115),m=a(9303),d=a(4848);function h({year:e,yearGroupHeadingClassName:t,children:a}){return(0,d.jsxs)("div",{role:"group",children:[(0,d.jsx)(m.A,{as:"h3",className:t,children:e}),a]})}function u({items:e,yearGroupHeadingClassName:t,ListComponent:a}){if((0,c.p)().blog.sidebar.groupByYear){const s=(0, [...]
\ No newline at end of file
diff --git a/assets/js/17896441.183eeb03.js b/assets/js/17896441.183eeb03.js
new file mode 100644
index 000000000..18a9238a1
--- /dev/null
+++ b/assets/js/17896441.183eeb03.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[8401],{665:(e,n,t)=>{t.d(n,{A:()=>c});t(6540);var s=t(4164),a=t(7289),i=t(204),o=t(2362),l=t(4848);function r({className:e}){return(0,l.jsx)(o.A,{type:"caution",title:(0,l.jsx)(a.Rc,{}),className:(0,s.A)(e,i.G.common.unlistedBanner),children:(0,l.jsx)(a.Uh,{})})}function c(e){return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(a.AE,{}),(0,l.jsx)(r,{...e})]})}},1021:(e,n,t)=>{t.d(n,{A:()=>b});var s=t(6540), [...]
\ No newline at end of file
diff --git a/assets/js/17e33b4e.013b5a51.js b/assets/js/17e33b4e.013b5a51.js
new file mode 100644
index 000000000..b15c247af
--- /dev/null
+++ b/assets/js/17e33b4e.013b5a51.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.aaaded18.js b/assets/js/1b6ff2c5.aaaded18.js
new file mode 100644
index 000000000..0e0bffc29
--- /dev/null
+++ b/assets/js/1b6ff2c5.aaaded18.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[5754],{5091:e=>{e.exports=JSON.parse('{"archive":{"blogPosts":[{"id":"/2025/06/06/connectors-runtime","metadata":{"permalink":"/blogs/2025/06/06/connectors-runtime","source":"@site/blog/2025-06-06-connectors-runtime.md","title":"Connectors runtime","description":"Extending Apache Iggy capabilities","date":"2025-06-06T00:00:00.000Z","tags":[],"readingTime":4.95,"hasTruncateMarker":true,"authors":[{"name" [...]
\ No newline at end of file
diff --git a/assets/js/1ccbcc53.6ca33163.js b/assets/js/1ccbcc53.6ca33163.js
new file mode 100644
index 000000000..3d40bbc17
--- /dev/null
+++ b/assets/js/1ccbcc53.6ca33163.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[586],{8453:(t,e,n)=>{n.d(e,{R:()=>r,x:()=>a});var o=n(6540);const s={},i=o.createContext(s);function r(t){const e=o.useContext(i);return o.useMemo((function(){return"function"==typeof t?t(e):{...e,...t}}),[e,t])}function a(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(s):t.components||s:r(t.components),o.createElement(i.Provider,{value:e},t.children)}},9051:(t,e,n [...]
\ No newline at end of file
diff --git a/assets/js/1df93b7f.505624bb.js b/assets/js/1df93b7f.505624bb.js
new file mode 100644
index 000000000..429f25b2d
--- /dev/null
+++ b/assets/js/1df93b7f.505624bb.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[4583],{1830:(e,s,a)=>{a.d(s,{A:()=>i});var t,n,r=a(6540);function l(){return l=Object.assign?Object.assign.bind():function(e){for(var s=1;s<arguments.length;s++){var a=arguments[s];for(var t in a)({}).hasOwnProperty.call(a,t)&&(e[t]=a[t])}return e},l.apply(null,arguments)}const i=({title:e,titleId:s,...a})=>r.createElement("svg",l({xmlns:"http://www.w3.org/2000/svg",width:30,height:30,fill:"none",viewBo [...]
\ No newline at end of file
diff --git a/assets/js/1e5ad4f9.2b940198.js b/assets/js/1e5ad4f9.2b940198.js
new file mode 100644
index 000000000..389f56d52
--- /dev/null
+++ b/assets/js/1e5ad4f9.2b940198.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[7452],{384:(t,e,n)=>{n.r(e),n.d(e,{assets:()=>c,contentTitle:()=>a,default:()=>l,frontMatter:()=>i,metadata:()=>o,toc:()=>d});const o=JSON.parse('{"id":"sdk/sdk-introduction","title":"Introduction","description":"This module contains the SDK-related components of the Apache Iggy message streaming infrastructure. Please note that some programming languages may not support all the lastest features of the [...]
\ No newline at end of file
diff --git a/assets/js/1f391b9e.de58e70a.js b/assets/js/1f391b9e.de58e70a.js
new file mode 100644
index 000000000..8c1934dda
--- /dev/null
+++ b/assets/js/1f391b9e.de58e70a.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),r=t(2362),l=t(4848);function c({className:e}){return(0,l.jsx)(r.A,{type:"caution",title:(0,l.jsx)(a.Rc,{}),className:(0,i.A)(e,s.G.common.unlistedBanner),children:(0,l.jsx)(a.Uh,{})})}function o(e){return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(a.AE,{}),(0,l.jsx)(c,{...e})]})}},1021:(e,n,t)=>{t.d(n,{A:()=>g});var i=t(6540), [...]
\ No newline at end of file
diff --git a/assets/js/20544421.fcacb2af.js b/assets/js/20544421.fcacb2af.js
new file mode 100644
index 000000000..0ca1faf88
--- /dev/null
+++ b/assets/js/20544421.fcacb2af.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[4877],{5999:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>a,contentTitle:()=>c,default:()=>h,frontMatter:()=>o,metadata:()=>s,toc:()=>d});const s=JSON.parse('{"id":"connectors/connectors-introduction","title":"Introduction","description":"The highly performant and modular runtime for statically typed, yet dynamically loaded connectors. Ingest the data from the external sources and push it further to the Iggy strea [...]
\ 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.938186c0.js b/assets/js/25cfbc78.938186c0.js
new file mode 100644
index 000000000..8015ea7f3
--- /dev/null
+++ b/assets/js/25cfbc78.938186c0.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:()=>u,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 apache/iggy.","source":"@site/docs/server/docker.md","sourceDirName":"server","slug":" [...]
\ No newline at end of file
diff --git a/assets/js/296d7672.f5cd54fe.js b/assets/js/296d7672.f5cd54fe.js
new file mode 100644
index 000000000..6f371ddf8
--- /dev/null
+++ b/assets/js/296d7672.f5cd54fe.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[4906],{6057:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>c,contentTitle:()=>u,default:()=>l,frontMatter:()=>o,metadata:()=>s,toc:()=>d});var s=r(9603),t=r(4848),i=r(8453);const o={title:"Consumer identifier",slug:"consumer-identifier",authors:[{name:"Piotr Gankiewicz",title:"Apache Iggy founder",url:"https://github.com/spetz"}],tags:["new-features","consumers","identifier"],hide_table_of_contents:!1},u=void 0,c={ [...]
\ No newline at end of file
diff --git a/assets/js/2edd2ec4.c4978c5b.js b/assets/js/2edd2ec4.c4978c5b.js
new file mode 100644
index 000000000..2761d67e5
--- /dev/null
+++ b/assets/js/2edd2ec4.c4978c5b.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:()=>a,contentTitle:()=>d,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.6db20ed9.js b/assets/js/3042.6db20ed9.js
new file mode 100644
index 000000000..22b07bc2a
--- /dev/null
+++ b/assets/js/3042.6db20ed9.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[3042],{3042:(e,t,i)=>{i.r(t),i.d(t,{default:()=>h});i(6540);var n=i(539),s=i(1082),o=i(1410),r=i(5932),a=i(4848);function h(){const e=(0,n.T)({id:"theme.NotFound.title",message:"Page Not Found"});return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(s.be,{title:e}),(0,a.jsx)(o.A,{children:(0,a.jsx)(r.A,{})})]})}},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({c [...]
\ No newline at end of file
diff --git a/assets/js/3049ae2a.0bf0f45c.js b/assets/js/3049ae2a.0bf0f45c.js
new file mode 100644
index 000000000..77549f88d
--- /dev/null
+++ b/assets/js/3049ae2a.0bf0f45c.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[3922],{725:e=>{e.exports=JSON.parse('{"permalink":"/blogs/personal-access-tokens","source":"@site/blog/2023-10-12-personal-access-tokens.md","title":"Personal access tokens","description":"Since the most recent update, Iggy.rs supports personal access tokens, which can be used to authenticate the clients, instead of the username and password. The tokens can be created and deleted using the available API [...]
\ No newline at end of file
diff --git a/assets/js/332362b2.784941d3.js b/assets/js/332362b2.784941d3.js
new file mode 100644
index 000000000..a0218004c
--- /dev/null
+++ b/assets/js/332362b2.784941d3.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.31bb19d0.js b/assets/js/363979b1.31bb19d0.js
new file mode 100644
index 000000000..b8f6b3f7a
--- /dev/null
+++ b/assets/js/363979b1.31bb19d0.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[1335],{966:(e,n,r)=>{r.d(n,{A:()=>s});const s=r.p+"assets/images/bench_cli-02b0d7bd13656d700fbdf1c76ae76fa3.png"},2415:(e,n,r)=>{r.d(n,{A:()=>s});const s=r.p+"assets/images/bench_platform-dad3f0256bec6e556b40ea798366b7fe.png"},7539:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>o,contentTitle:()=>a,default:()=>l,frontMatter:()=>c,metadata:()=>s,toc:()=>h});const s=JSON.parse('{"id":"server/server-benchmarking","tit [...]
\ 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/3d897b37.89c14111.js b/assets/js/3d897b37.89c14111.js
new file mode 100644
index 000000000..52a631637
--- /dev/null
+++ b/assets/js/3d897b37.89c14111.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[1594],{7269:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>r,default:()=>u,frontMatter:()=>a,metadata:()=>s,toc:()=>l});const s=JSON.parse('{"id":"connectors/connectors-sink","title":"Sink","description":"Overview","source":"@site/docs/connectors/sink.md","sourceDirName":"connectors","slug":"/connectors/sink","permalink":"/docs/connectors/sink","draft":false,"unlisted":false,"tags":[],"version":" [...]
\ No newline at end of file
diff --git a/assets/js/3defdf4b.87098e14.js b/assets/js/3defdf4b.87098e14.js
new file mode 100644
index 000000000..e504ae403
--- /dev/null
+++ b/assets/js/3defdf4b.87098e14.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.1ce9bdae.js b/assets/js/41e60a44.1ce9bdae.js
new file mode 100644
index 000000000..a4d387259
--- /dev/null
+++ b/assets/js/41e60a44.1ce9bdae.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.c6d754f7.js b/assets/js/46167e1b.c6d754f7.js
new file mode 100644
index 000000000..f7bbb2a58
--- /dev/null
+++ b/assets/js/46167e1b.c6d754f7.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[8501],{1607:(t,e,o)=>{o.r(e),o.d(e,{assets:()=>c,contentTitle:()=>a,default:()=>l,frontMatter:()=>r,metadata:()=>n,toc:()=>p});const n=JSON.parse('{"id":"sdk/csharp/sdk-csharp-intro","title":"Intro","description":"The Iggy SDK for C# is a library that allows you to interact with the Iggy API from your C# applications. This SDK provides a convenient way to interact with the Iggy API and allows you to eas [...]
\ No newline at end of file
diff --git a/assets/js/4726e312.15e455ad.js b/assets/js/4726e312.15e455ad.js
new file mode 100644
index 000000000..ab9b2dc38
--- /dev/null
+++ b/assets/js/4726e312.15e455ad.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:()=>a,contentTitle:()=>c,default:()=>l,frontMatter:()=>s,metadata:()=>r,toc:()=>d});const r=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/54b5fc15.33a62aa3.js b/assets/js/54b5fc15.33a62aa3.js
new file mode 100644
index 000000000..18cfba585
--- /dev/null
+++ b/assets/js/54b5fc15.33a62aa3.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[8848],{3093:e=>{e.exports=JSON.parse('{"permalink":"/blogs/2025/05/08/zero-copy-deserialization","source":"@site/blog/2025-05-08-zero-copy-deserialization.md","title":"Zero-copy (de)serialization","description":"Introduction","date":"2025-05-08T00:00:00.000Z","tags":[],"readingTime":5.895,"hasTruncateMarker":true,"authors":[{"name":"Grzegorz Koszyk","title":"Apache Iggy PPMC Member","url":"https://githu [...]
\ No newline at end of file
diff --git a/assets/js/5a05130f.70b339da.js b/assets/js/5a05130f.70b339da.js
new file mode 100644
index 000000000..85ae25a48
--- /dev/null
+++ b/assets/js/5a05130f.70b339da.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":16,"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/5f481cd4.1f708287.js b/assets/js/5f481cd4.1f708287.js
new file mode 100644
index 000000000..48ee7391c
--- /dev/null
+++ b/assets/js/5f481cd4.1f708287.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[6190],{1628:(e,t,s)=>{s.d(t,{A:()=>r});const r=s.p+"assets/images/iggy_batch_schema_2-c7a5fc6158b838999c178ef8aea96089.png"},3093:e=>{e.exports=JSON.parse('{"permalink":"/blogs/2025/05/08/zero-copy-deserialization","source":"@site/blog/2025-05-08-zero-copy-deserialization.md","title":"Zero-copy (de)serialization","description":"Introduction","date":"2025-05-08T00:00:00.000Z","tags":[],"readingTime":5.89 [...]
\ No newline at end of file
diff --git a/assets/js/62290500.c8b9f95d.js b/assets/js/62290500.c8b9f95d.js
new file mode 100644
index 000000000..193538e7f
--- /dev/null
+++ b/assets/js/62290500.c8b9f95d.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[7349],{6363:(e,s,t)=>{t.r(s),t.d(s,{assets:()=>l,contentTitle:()=>a,default:()=>u,frontMatter:()=>o,metadata:()=>n,toc:()=>d});const n=JSON.parse('{"id":"sdk/rust/sdk-rust-examples","title":"Examples","description":"In the core repository, you can find the following examples using the Rust SDK:","source":"@site/docs/sdk/rust/examples.md","sourceDirName":"sdk/rust","slug":"/sdk/rust/examples","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/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.66f692df.js b/assets/js/6875c492.66f692df.js
new file mode 100644
index 000000000..66b6f04b7
--- /dev/null
+++ b/assets/js/6875c492.66f692df.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[4813],{665:(e,t,n)=>{n.d(t,{A:()=>c});n(6540);var i=n(4164),s=n(7289),a=n(204),r=n(2362),l=n(4848);function o({className:e}){return(0,l.jsx)(r.A,{type:"caution",title:(0,l.jsx)(s.Rc,{}),className:(0,i.A)(e,a.G.common.unlistedBanner),children:(0,l.jsx)(s.Uh,{})})}function c(e){return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(s.AE,{}),(0,l.jsx)(o,{...e})]})}},4005:(e,t,n)=>{n.d(t,{A:()=>r});n(6540);var i= [...]
\ 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/6a2e60e3.f1f26543.js b/assets/js/6a2e60e3.f1f26543.js
new file mode 100644
index 000000000..8a625ff49
--- /dev/null
+++ b/assets/js/6a2e60e3.f1f26543.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[6549],{5295:e=>{e.exports=JSON.parse('{"permalink":"/blogs/2025/02/17/transparent-benchmarks","source":"@site/blog/2025-02-17-transparent-benchmarks.md","title":"Transparent Benchmarking with Apache Iggy","description":"Benchmarks should be the first-class citizen","date":"2025-02-17T00:00:00.000Z","tags":[],"readingTime":3.955,"hasTruncateMarker":true,"authors":[{"name":"Piotr Gankiewicz","title":"Apac [...]
\ No newline at end of file
diff --git a/assets/js/6ea6d42b.32a1cc1b.js b/assets/js/6ea6d42b.32a1cc1b.js
new file mode 100644
index 000000000..72084690d
--- /dev/null
+++ b/assets/js/6ea6d42b.32a1cc1b.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[8529],{331:e=>{e.exports=JSON.parse('{"permalink":"/blogs/iggy-0-1-0-release","source":"@site/blog/2023-11-26-release-0.1.0.md","title":"Iggy 0.1.0 release","description":"We are happy to announce that Iggy.rs has reached the 0.1.0 release. This is a major milestone for the project, as it\'s getting closer to the first stable release.","date":"2023-11-26T00:00:00.000Z","tags":[{"inline":true,"label":"re [...]
\ No newline at end of file
diff --git a/assets/js/71369862.6cb9d057.js b/assets/js/71369862.6cb9d057.js
new file mode 100644
index 000000000..8e092ba6c
--- /dev/null
+++ b/assets/js/71369862.6cb9d057.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":16,"previousPage":"/blogs","blogDescription":"Blog","blogTitle":"Blogs"}}')}}]);
\ No newline at end of file
diff --git a/assets/js/71a4f72a.c2aa41ed.js b/assets/js/71a4f72a.c2aa41ed.js
new file mode 100644
index 000000000..53f80bbf2
--- /dev/null
+++ b/assets/js/71a4f72a.c2aa41ed.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[4382],{7:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>a,default:()=>d,frontMatter:()=>o,metadata:()=>r,toc:()=>l});const r=JSON.parse('{"id":"sdk/rust/sdk-rust-stream-builder","title":"Stream Builder","description":"In the previous section, the high level SDK introduced the connection string to simplify the client configuration and","source":"@site/docs/sdk/rust/stream_builder.md","sourceDirNam [...]
\ 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.ac05190d.js b/assets/js/7d3d0ee4.ac05190d.js
new file mode 100644
index 000000000..f7380cbde
--- /dev/null
+++ b/assets/js/7d3d0ee4.ac05190d.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:()=>c,frontMatter:()=>r,metadata:()=>a,toc:()=>h});var a=s(4529),n=s(4848),o=s(8453);const r={title:"Message headers",slug:"message-headers",authors:[{name:"Piotr Gankiewicz",title:"Apache Iggy founder",url:"https://github.com/spetz"}],tags:["new-features","message-headers","breaking-changes"],hide_table_of_contents:!1},i=void 0, [...]
\ 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.58710dad.js b/assets/js/814f3328.58710dad.js
new file mode 100644
index 000000000..ea8c05913
--- /dev/null
+++ b/assets/js/814f3328.58710dad.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":"Connectors runtime","permalink":"/blogs/2025/06/06/connectors-runtime","unlisted":false,"date":"2025-06-06T00:00:00.000Z"},{"title":"Zero-copy (de)serialization","permalink":"/blogs/2025/05/08/zero-copy-deserialization","unlisted":false,"date":"2025-05-08T00:00:00.000Z"},{"title":"Transparent Benchmarking with Apache Iggy", [...]
\ No newline at end of file
diff --git a/assets/js/83d73c01.d6e9c30b.js b/assets/js/83d73c01.d6e9c30b.js
new file mode 100644
index 000000000..14772da7a
--- /dev/null
+++ b/assets/js/83d73c01.d6e9c30b.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[448],{7631:(t,e,n)=>{n.r(e),n.d(e,{assets:()=>a,contentTitle:()=>c,default:()=>l,frontMatter:()=>s,metadata:()=>o,toc:()=>u});const o=JSON.parse('{"id":"ai/ai-introduction","title":"Introduction","description":"This module contains the AI-related components of the Apache Iggy message streaming infrastructure.","source":"@site/docs/ai/introduction.md","sourceDirName":"ai","slug":"/ai/introduction","perma [...]
\ 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.118b4944.js b/assets/js/8b8cddd6.118b4944.js
new file mode 100644
index 000000000..b577d14c8
--- /dev/null
+++ b/assets/js/8b8cddd6.118b4944.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":"Before we start","source":"@site/docs/introduction/getting_started.md","sourceDirName":"introduction","slug":"/introduction/getting-started","permalink":"/docs/introduc [...]
\ No newline at end of file
diff --git a/assets/js/8c2332e9.6de934c7.js b/assets/js/8c2332e9.6de934c7.js
new file mode 100644
index 000000000..40d08e254
--- /dev/null
+++ b/assets/js/8c2332e9.6de934c7.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[7688],{1085:(e,t,n)=>{n.d(t,{A:()=>s});const s=n.p+"assets/images/iggy_bench-9ea0ebbd13ad66abb94ec3d8d8697048.jpeg"},2693:(e,t,n)=>{n.d(t,{A:()=>s});const s=n.p+"assets/images/iggys-5cd88b6e4af91d0e5b0f1ef688b8efac.jpeg"},2698:(e,t,n)=>{n.d(t,{A:()=>s});const s=n.p+"assets/images/iggy_server-b28372292592869008ceb03c1edfdc51.jpeg"},4170:e=>{e.exports=JSON.parse('{"permalink":"/blogs/2023/12/29/building-m [...]
\ No newline at end of file
diff --git a/assets/js/907ba26f.bf1b09e4.js b/assets/js/907ba26f.bf1b09e4.js
new file mode 100644
index 000000000..ed8e9969b
--- /dev/null
+++ b/assets/js/907ba26f.bf1b09e4.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[5214],{352:(e,t,n)=>{n.d(t,{A:()=>r});const r=n.p+"assets/images/iggy_vsr-3d747255ce17ecda927ccd4d258f7016.png"},3150:(e,t,n)=>{n.d(t,{A:()=>r});const r=n.p+"assets/images/iggy_technology_radar-291413e3a6d4cb1a5b7832ab5865423e.png"},3151:e=>{e.exports=JSON.parse('{"permalink":"/blogs/2024/10/28/technology-radar-and-currrent-goals","source":"@site/blog/2024-10-28-technology-radar-and-currrent-goals.md"," [...]
\ No newline at end of file
diff --git a/assets/js/92abec30.df7d3bab.js b/assets/js/92abec30.df7d3bab.js
new file mode 100644
index 000000000..bbbbab6a9
--- /dev/null
+++ b/assets/js/92abec30.df7d3bab.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[8154],{2144:(e,s,n)=>{n.d(s,{A:()=>t});const t=n.p+"assets/images/iggy_cli-b139e02165e2570574ac638f7db8801f.png"},8303:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>c,contentTitle:()=>o,default:()=>d,frontMatter:()=>r,metadata:()=>t,toc:()=>l});const t=JSON.parse('{"id":"cli/cli-iggy-cli","title":"Iggy CLI","description":"The Iggy CLI is a command-line interface that allows you to interact with the Iggy server. Yo [...]
\ No newline at end of file
diff --git a/assets/js/9392.3d0db441.js b/assets/js/9392.3d0db441.js
new file mode 100644
index 000000000..15fe18daf
--- /dev/null
+++ b/assets/js/9392.3d0db441.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.b3ec0770.js b/assets/js/9590c6d3.b3ec0770.js
new file mode 100644
index 000000000..5b2710459
--- /dev/null
+++ b/assets/js/9590c6d3.b3ec0770.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[90],{4170:e=>{e.exports=JSON.parse('{"permalink":"/blogs/2023/12/29/building-message-streaming-in-rust","source":"@site/blog/2023-12-29-building-message-streaming-in-rust.md","title":"Iggy.rs - building message streaming in Rust","description":"Origins","date":"2023-12-29T00:00:00.000Z","tags":[],"readingTime":12.345,"hasTruncateMarker":true,"authors":[{"name":"Piotr Gankiewicz","title":"Apache Iggy fou [...]
\ No newline at end of file
diff --git a/assets/js/98883e6e.61374d1a.js b/assets/js/98883e6e.61374d1a.js
new file mode 100644
index 000000000..4d6d5f6e8
--- /dev/null
+++ b/assets/js/98883e6e.61374d1a.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[7487],{1353:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>g,contentTitle:()=>o,default:()=>u,frontMatter:()=>i,metadata:()=>n,toc:()=>l});var n=s(9896),a=s(4848),r=s(8453);const i={title:"Iggy.rs \u2014 one year of building the message streaming",authors:[{name:"Piotr Gankiewicz",title:"Apache Iggy founder",url:"https://github.com/spetz"}],tags:[],hide_table_of_contents:!1,date:new Date("2024-05-29T00:00:00.000Z") [...]
\ No newline at end of file
diff --git a/assets/js/9ca9f017.9e03b340.js b/assets/js/9ca9f017.9e03b340.js
new file mode 100644
index 000000000..d4e3ab6e6
--- /dev/null
+++ b/assets/js/9ca9f017.9e03b340.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[8895],{2842:(e,t,i)=>{i.d(t,{A:()=>s});const s=i.p+"assets/images/architecture-5d7f7f7ed58a399ea2f5a7c74c074f65.png"},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 [...]
\ No newline at end of file
diff --git a/assets/js/9e4087bc.b4937ced.js b/assets/js/9e4087bc.b4937ced.js
new file mode 100644
index 000000000..0f3cb163a
--- /dev/null
+++ b/assets/js/9e4087bc.b4937ced.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[2711],{4750:(e,r,a)=>{a.r(r),a.d(r,{default:()=>m});a(6540);var t=a(6289),s=a(539),n=a(1082),i=a(8569),c=a(1410),l=a(9303),o=a(4848);function d({year:e,posts:r}){const a=(0,i.i)({day:"numeric",month:"long",timeZone:"UTC"});return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(l.A,{as:"h3",id:e,children:e}),(0,o.jsx)("ul",{children:r.map((e=>{return(0,o.jsx)("li",{children:(0,o.jsxs)(t.A,{to:e.metadata.permal [...]
\ No newline at end of file
diff --git a/assets/js/a2ea038e.71930cd9.js b/assets/js/a2ea038e.71930cd9.js
new file mode 100644
index 000000000..1ceecb007
--- /dev/null
+++ b/assets/js/a2ea038e.71930cd9.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.8c329eef.js b/assets/js/a6aa9e1f.8c329eef.js
new file mode 100644
index 000000000..9b4d5977c
--- /dev/null
+++ b/assets/js/a6aa9e1f.8c329eef.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[7643],{4005:(e,t,i)=>{i.d(t,{A:()=>r});i(6540);var n=i(3750),a=i(2384),s=i(4848);function r({items:e,component:t=a.A}){return(0,s.jsx)(s.Fragment,{children:e.map((({content:e})=>(0,s.jsx)(n.in,{content:e,children:(0,s.jsx)(t,{children:(0,s.jsx)(e,{})})},e.metadata.permalink)))})}},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), [...]
\ 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.3829bb42.js b/assets/js/a7c1df9a.3829bb42.js
new file mode 100644
index 000000000..29924176f
--- /dev/null
+++ b/assets/js/a7c1df9a.3829bb42.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:"Apache Iggy founder",url:"https://github.com/spetz"}],tags:["new-features","users","permissions"],hide_table_of_contents:!1},o=void 0,l= [...]
\ 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.f3018d96.js b/assets/js/a94703ab.f3018d96.js
new file mode 100644
index 000000000..cca4da397
--- /dev/null
+++ b/assets/js/a94703ab.f3018d96.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),r=n(3751),c=n(2306),l=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({threshold:e}){const[t,n]=(0,a.useState)(!1),o=(0,a.useRef)(!1),{startScroll:i,cancelScroll:s}=(0,d. [...]
\ 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.ce95290e.js b/assets/js/b041cdfc.ce95290e.js
new file mode 100644
index 000000000..3ffb68fbc
--- /dev/null
+++ b/assets/js/b041cdfc.ce95290e.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[3632],{741:(e,t,i)=>{i.d(t,{A:()=>s});const s=i.p+"assets/images/iggy_bench-eed7510a845dfb053ac67be624599c99.png"},1401:(e,t,i)=>{i.d(t,{A:()=>s});const s=i.p+"assets/images/iggy_cluster-c2c33596763c8b9930c7de7e12dc3586.png"},1773:(e,t,i)=>{i.d(t,{A:()=>s});const s=i.p+"assets/images/iggy_web-76023f316d53cc2e44ae6f7b83193529.png"},3894:(e,t,i)=>{i.d(t,{A:()=>s});const s=i.p+"assets/images/iggy_cli-c140d [...]
\ No newline at end of file
diff --git a/assets/js/b1fb958a.8c6863ad.js b/assets/js/b1fb958a.8c6863ad.js
new file mode 100644
index 000000000..63e309f07
--- /dev/null
+++ b/assets/js/b1fb958a.8c6863ad.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[8275],{8453:(e,t,s)=>{s.d(t,{R:()=>i,x:()=>a});var n=s(6540);const r={},o=n.createContext(r);function i(e){const t=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),n.createElement(o.Provider,{value:t},e.children)}},9603:e=>{e [...]
\ No newline at end of file
diff --git a/assets/js/b8b35ff1.e8d8574c.js b/assets/js/b8b35ff1.e8d8574c.js
new file mode 100644
index 000000000..71f504094
--- /dev/null
+++ b/assets/js/b8b35ff1.e8d8574c.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[7930],{738:e=>{e.exports=JSON.parse('{"permalink":"/blogs/2025/02/10/apache-incubator","source":"@site/blog/2025-02-10-apache-incubator.md","title":"Iggy joins the Apache Incubator","description":"We are thrilled to announce that Iggy has officially joined the Apache Incubator! This marks a major milestone in our journey to redefine message streaming \u2014 one that is blazingly fast, hyper-efficient, a [...]
\ No newline at end of file
diff --git a/assets/js/c065b223.a5057641.js b/assets/js/c065b223.a5057641.js
new file mode 100644
index 000000000..8153cdca0
--- /dev/null
+++ b/assets/js/c065b223.a5057641.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[5956],{737:e=>{e.exports=JSON.parse('{"permalink":"/blogs/message-state","source":"@site/blog/2023-08-22-message-state.md","title":"Message state","description":"The message state is a simple field which extends the existing message and provides a way to define whether the particular message might be consumed by the client or not, depending on its value. Let\'s briefly discuss the motivation behind this [...]
\ No newline at end of file
diff --git a/assets/js/c23ee533.b39a19a7.js b/assets/js/c23ee533.b39a19a7.js
new file mode 100644
index 000000000..d20a2f488
--- /dev/null
+++ b/assets/js/c23ee533.b39a19a7.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[2608],{4529:e=>{e.exports=JSON.parse('{"permalink":"/blogs/message-headers","source":"@site/blog/2023-08-19-message-headers.md","title":"Message headers","description":"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 o [...]
\ No newline at end of file
diff --git a/assets/js/c3a24e9c.aa536bf3.js b/assets/js/c3a24e9c.aa536bf3.js
new file mode 100644
index 000000000..d463538bc
--- /dev/null
+++ b/assets/js/c3a24e9c.aa536bf3.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.724e29a7.js b/assets/js/c5f172dd.724e29a7.js
new file mode 100644
index 000000000..594369303
--- /dev/null
+++ b/assets/js/c5f172dd.724e29a7.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:"Apache Iggy founder",url:"https://github.com/spetz"}],tags:["new-features","message-expiry"],hide_table_of_contents:!1},l=void 0,o={authorsImageUrls:[ [...]
\ No newline at end of file
diff --git a/assets/js/c70ea44c.a11bfed7.js b/assets/js/c70ea44c.a11bfed7.js
new file mode 100644
index 000000000..414538307
--- /dev/null
+++ b/assets/js/c70ea44c.a11bfed7.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[6056],{725:e=>{e.exports=JSON.parse('{"permalink":"/blogs/personal-access-tokens","source":"@site/blog/2023-10-12-personal-access-tokens.md","title":"Personal access tokens","description":"Since the most recent update, Iggy.rs supports personal access tokens, which can be used to authenticate the clients, instead of the username and password. The tokens can be created and deleted using the available API [...]
\ No newline at end of file
diff --git a/assets/js/c8d81af2.45a903b0.js b/assets/js/c8d81af2.45a903b0.js
new file mode 100644
index 000000000..d9c6a4365
--- /dev/null
+++ b/assets/js/c8d81af2.45a903b0.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[3384],{445:(e,n,s)=>{s.d(n,{A:()=>i});const i=s.p+"assets/images/iggy_server-f7851820c876c0a5b3c0159f953ae728.png"},7560:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>c,contentTitle:()=>l,default:()=>h,frontMatter:()=>o,metadata:()=>i,toc:()=>a});const i=JSON.parse('{"id":"introduction/introduction-about","title":"About","description":"Iggy is the persistent message streaming platform written in Rust, supporting Q [...]
\ No newline at end of file
diff --git a/assets/js/ca66c66a.3a322fab.js b/assets/js/ca66c66a.3a322fab.js
new file mode 100644
index 000000000..edb2ecff4
--- /dev/null
+++ b/assets/js/ca66c66a.3a322fab.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:()=>l,contentTitle:()=>o,default:()=>g,frontMatter:()=>r,metadata:()=>n,toc:()=>p});var n=s(4547),a=s(4848),i=s(8453);const r={title:"Message expiry",slug:"message-expiry",authors:[{name:"Piotr Gankiewicz",title:"Apache Iggy founder",url:"https://github.com/spetz"}],tags:["new-features","message-expiry"],hide_table_of_contents:!1},o=void 0,l={authorsImageUrls:[ [...]
\ 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.3ca38c32.js b/assets/js/ccc49370.3ca38c32.js
new file mode 100644
index 000000000..f3aaf3418
--- /dev/null
+++ b/assets/js/ccc49370.3ca38c32.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[3249],{665:(e,n,t)=>{t.d(n,{A:()=>c});t(6540);var i=t(4164),a=t(7289),s=t(204),r=t(2362),o=t(4848);function l({className:e}){return(0,o.jsx)(r.A,{type:"caution",title:(0,o.jsx)(a.Rc,{}),className:(0,i.A)(e,s.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)(l,{...e})]})}},1021:(e,n,t)=>{t.d(n,{A:()=>g});var i=t(6540), [...]
\ No newline at end of file
diff --git a/assets/js/ce80ecba.1b8ce33f.js b/assets/js/ce80ecba.1b8ce33f.js
new file mode 100644
index 000000000..d474f20d0
--- /dev/null
+++ b/assets/js/ce80ecba.1b8ce33f.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.99b8e270.js b/assets/js/cfc3091e.99b8e270.js
new file mode 100644
index 000000000..4caa63a13
--- /dev/null
+++ b/assets/js/cfc3091e.99b8e270.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[2321],{738:e=>{e.exports=JSON.parse('{"permalink":"/blogs/2025/02/10/apache-incubator","source":"@site/blog/2025-02-10-apache-incubator.md","title":"Iggy joins the Apache Incubator","description":"We are thrilled to announce that Iggy has officially joined the Apache Incubator! This marks a major milestone in our journey to redefine message streaming \u2014 one that is blazingly fast, hyper-efficient, a [...]
\ No newline at end of file
diff --git a/assets/js/d1796fc4.3170eb2e.js b/assets/js/d1796fc4.3170eb2e.js
new file mode 100644
index 000000000..4bb591375
--- /dev/null
+++ b/assets/js/d1796fc4.3170eb2e.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:()=>g,default:()=>l,frontMatter:()=>o,metadata:()=>s,toc:()=>c});const s=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/d19ecac4.66ea1d81.js b/assets/js/d19ecac4.66ea1d81.js
new file mode 100644
index 000000000..beb14e158
--- /dev/null
+++ b/assets/js/d19ecac4.66ea1d81.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[933],{7128:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>c,contentTitle:()=>a,default:()=>h,frontMatter:()=>i,metadata:()=>r,toc:()=>d});const r=JSON.parse('{"id":"connectors/connectors-sdk","title":"SDK","description":"SDK provides the commonly used structs and traits such as Sink and Source, along with the sinkconnector and sourceconnector macros to be used when developing connectors.","source":"@site/docs/conne [...]
\ 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/d74d5d7a.a1644219.js b/assets/js/d74d5d7a.a1644219.js
new file mode 100644
index 000000000..7b0520845
--- /dev/null
+++ b/assets/js/d74d5d7a.a1644219.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[2911],{443:e=>{e.exports=JSON.parse('{"permalink":"/blogs/2025/06/06/connectors-runtime","source":"@site/blog/2025-06-06-connectors-runtime.md","title":"Connectors runtime","description":"Extending Apache Iggy capabilities","date":"2025-06-06T00:00:00.000Z","tags":[],"readingTime":4.95,"hasTruncateMarker":true,"authors":[{"name":"Piotr Gankiewicz","title":"Apache Iggy founder","url":"https://github.com/ [...]
\ No newline at end of file
diff --git a/assets/js/d83bd44c.5695e425.js b/assets/js/d83bd44c.5695e425.js
new file mode 100644
index 000000000..1e1bc3f83
--- /dev/null
+++ b/assets/js/d83bd44c.5695e425.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[5515],{4011:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>a,default:()=>p,frontMatter:()=>i,metadata:()=>o,toc:()=>d});const o=JSON.parse('{"id":"ai/ai-mcp","title":"MCP Server","description":"The Model Context Protocol (MCP) is an open protocol that standardizes how applications provide context to LLMs. The Apache Iggy MCP Server is an implementation of the MCP protocol for the message streamin [...]
\ No newline at end of file
diff --git a/assets/js/da420000.e3edc2d3.js b/assets/js/da420000.e3edc2d3.js
new file mode 100644
index 000000000..baa6c52e7
--- /dev/null
+++ b/assets/js/da420000.e3edc2d3.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[1572],{737:e=>{e.exports=JSON.parse('{"permalink":"/blogs/message-state","source":"@site/blog/2023-08-22-message-state.md","title":"Message state","description":"The message state is a simple field which extends the existing message and provides a way to define whether the particular message might be consumed by the client or not, depending on its value. Let\'s briefly discuss the motivation behind this [...]
\ No newline at end of file
diff --git a/assets/js/da5fc804.46ae6dba.js b/assets/js/da5fc804.46ae6dba.js
new file mode 100644
index 000000000..ac1be039f
--- /dev/null
+++ b/assets/js/da5fc804.46ae6dba.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[4822],{1905:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>d,contentTitle:()=>c,default:()=>l,frontMatter:()=>i,metadata:()=>r,toc:()=>h});const r=JSON.parse('{"type":"mdx","permalink":"/downloads","source":"@site/src/pages/downloads.md","title":"Downloads","description":"Official release artifacts of Apache Iggy (Incubating)","frontMatter":{"title":"Downloads","description":"Official release artifacts of Apache Ig [...]
\ No newline at end of file
diff --git a/assets/js/e05ad208.7fe927f4.js b/assets/js/e05ad208.7fe927f4.js
new file mode 100644
index 000000000..349684ba5
--- /dev/null
+++ b/assets/js/e05ad208.7fe927f4.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[9648],{3151:e=>{e.exports=JSON.parse('{"permalink":"/blogs/2024/10/28/technology-radar-and-currrent-goals","source":"@site/blog/2024-10-28-technology-radar-and-currrent-goals.md","title":"Iggy.rs - Technology Radar & current goals","description":"Technology Radar","date":"2024-10-28T00:00:00.000Z","tags":[],"readingTime":6.58,"hasTruncateMarker":true,"authors":[{"name":"Piotr Gankiewicz","title":"Apache [...]
\ No newline at end of file
diff --git a/assets/js/e35843f4.76b48ed6.js b/assets/js/e35843f4.76b48ed6.js
new file mode 100644
index 000000000..04abcf652
--- /dev/null
+++ b/assets/js/e35843f4.76b48ed6.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[1761],{2669:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>u,frontMatter:()=>o,metadata:()=>s,toc:()=>h});var s=n(5295),r=n(4848),a=n(8453);const o={title:"Transparent Benchmarking with Apache Iggy",authors:[{name:"Piotr Gankiewicz",title:"Apache Iggy founder",url:"https://github.com/spetz"}],tags:[],hide_table_of_contents:!1,date:new Date("2025-02-17T00:00:00.000Z")},i=void 0,c={au [...]
\ No newline at end of file
diff --git a/assets/js/e7c222e2.2226c29b.js b/assets/js/e7c222e2.2226c29b.js
new file mode 100644
index 000000000..76def74c7
--- /dev/null
+++ b/assets/js/e7c222e2.2226c29b.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:()=>i,contentTitle:()=>c,default:()=>u,frontMatter:()=>r,metadata:()=>a,toc:()=>d});var a=s(6047),n=s(4848),o=s(8453);const r={title:"Updated schemas",slug:"updated-schemas",authors:[{name:"Piotr Gankiewicz",title:"Apache Iggy founder",url:"https://github.com/spetz"}],tags:["update","schema"],hide_table_of_contents:!1},c=void 0,i={authorsImageUrls:[void 0]},d=[ [...]
\ No newline at end of file
diff --git a/assets/js/efbe804b.c4ddfb48.js b/assets/js/efbe804b.c4ddfb48.js
new file mode 100644
index 000000000..5594aae7b
--- /dev/null
+++ b/assets/js/efbe804b.c4ddfb48.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[3179],{8453:(e,t,n)=>{n.d(t,{R:()=>r,x:()=>c});var s=n(6540);const i={},o=s.createContext(i);function r(e){const t=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),s.createElement(o.Provider,{value:t},e.children)}},8635:(e,t, [...]
\ No newline at end of file
diff --git a/assets/js/f5480997.87d50f19.js b/assets/js/f5480997.87d50f19.js
new file mode 100644
index 000000000..70612dba5
--- /dev/null
+++ b/assets/js/f5480997.87d50f19.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.7fc8e2f9.js b/assets/js/ff06d166.7fc8e2f9.js
new file mode 100644
index 000000000..ea88ee7c8
--- /dev/null
+++ b/assets/js/ff06d166.7fc8e2f9.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[7128],{5722:(e,s,t)=>{t.r(s),t.d(s,{assets:()=>u,contentTitle:()=>a,default:()=>c,frontMatter:()=>i,metadata:()=>n,toc:()=>l});var n=t(6934),r=t(4848),o=t(8453);const i={title:"Users and permissions",slug:"users-and-permissions",authors:[{name:"Piotr Gankiewicz",title:"Apache Iggy founder",url:"https://github.com/spetz"}],tags:["new-features","users","permissions"],hide_table_of_contents:!1},a=void 0,u= [...]
\ No newline at end of file
diff --git a/assets/js/main.e9fd05f4.js b/assets/js/main.e9fd05f4.js
new file mode 100644
index 000000000..13eb8b34b
--- /dev/null
+++ b/assets/js/main.e9fd05f4.js
@@ -0,0 +1,2 @@
+/*! For license information please see main.e9fd05f4.js.LICENSE.txt */
+(self.webpackChunkiggy_website=self.webpackChunkiggy_website||[]).push([[8792],{99:(e,t,n)=>{"use strict";t.rA=t.Ks=t.LU=void 0;const r=n(1635);t.LU="__blog-post-container";var o=n(2562);Object.defineProperty(t,"Ks",{enumerable:!0,get:function(){return r.__importDefault(o).default}});var a=n(7149);var i=n(2528);Object.defineProperty(t,"rA",{enumerable:!0,get:function(){return i.getErrorCausalChain}})},115:e=>{var t="undefined"!=typeof Element,n="function"==typeof Map,r="function"==typeof [...]
\ No newline at end of file
diff --git a/assets/js/main.e9fd05f4.js.LICENSE.txt b/assets/js/main.e9fd05f4.js.LICENSE.txt
new file mode 100644
index 000000000..4c963e46c
--- /dev/null
+++ b/assets/js/main.e9fd05f4.js.LICENSE.txt
@@ -0,0 +1,61 @@
+/* NProgress, (c) 2013, 2014 Rico Sta. Cruz - http://ricostacruz.com/nprogress
+ * @license MIT */
+
+/**
+ * @license React
+ * react-dom-client.production.js
+ *
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+/**
+ * @license React
+ * react-dom.production.js
+ *
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+/**
+ * @license React
+ * react-jsx-runtime.production.js
+ *
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+/**
+ * @license React
+ * react.production.js
+ *
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+/**
+ * @license React
+ * scheduler.production.js
+ *
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+/** @license React v16.13.1
+ * react-is.production.min.js
+ *
+ * Copyright (c) Facebook, Inc. and its affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
diff --git a/assets/js/runtime~main.abd83413.js b/assets/js/runtime~main.abd83413.js
new file mode 100644
index 000000000..fedccf709
--- /dev/null
+++ b/assets/js/runtime~main.abd83413.js
@@ -0,0 +1 @@
+(()=>{"use strict";var e,a,c,f,d,b={},t={};function r(e){var a=t[e];if(void 0!==a)return a.exports;var c=t[e]={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,f,d)=>{if(!c){var b=1/0;for(i=0;i<e.length;i++){c=e[i][0],f=e[i][1],d=e[i][2];for(var t=!0,o=0;o<c.length;o++)(!1&d||b>=d)&&Object.keys(r.O).every((e=>r.O[e](c[o])))?c.splice(o--,1):(t=!1,d<b&&(b=d));if(t){e.splice(i--,1);var n=f();void 0!==n&&(a=n)}}return a}d=d| [...]
\ 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..e10477b1c
--- /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.00ae354b.css">
+<script src="/assets/js/runtime~main.abd83413.js" defer="defer"></script>
+<script src="/assets/js/main.e9fd05f4.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'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'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 "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 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/apache/iggy/tree/master/core/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 & reads when processing millions of messages</strong>), I eventually decided to give it a long-term shot. Being fully aware that there's still lots to be done (speaking of many months, [...]
+<p><img 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't actually looking for anyone, as I didn't think this could be an interesting project to work on (except for myself). Then how did that happen anyway? There were only 2 things in common - all the people that joined the project were part of the same Discord communities, yet more importantly <strong>they all shared the passion for programming</strong>, and I'm not talking about Rust language [...]
+<p><img decoding="async" loading="lazy" alt="image" src="/assets/images/iggy_server-b28372292592869008ceb03c1edfdc51.jpeg" width="4088" height="1610" class="img_ev3q"></p>
+<p>For example, when I asked one guy what was the reason behind building an SDK in Go, the reply was the need of playing with and learning a new language. Why C# SDK? Well, the other guy wanted to dive more into the low-level concepts and decided to squeeze out great performance from the managed runtime. Why build Web UI in Svelte? At work, I mostly use React, and I wanted to learn a new framework - another member said.</p>
+<p>My point is - as long as you believe in what you're building, and you're consistent about it (it was one of the main reasons why I've been contributing to Iggy every day since its inception, and still doing so), there's a chance that someone out there will notice it and happily join you in your efforts. <strong>Lead by example, or whatever you call it.</strong></p>
+<p>At the same time, we've started receiving the first, <strong>external contributions from all around the world</strong> - whether talking about simpler tasks, or the more sophisticated ones, requiring significant amount of time being spent on both, the implementation and the discussions to eventually deliver the code.</p>
+<p>It gave us even more confidence, that there are other people (outside our internal bubble), who find this project to be interesting and worth spending their time. And without all these amazing contributors, it'd be much harder (or even impossible) to deliver so many features.</p>
+<h2 class="anchor 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'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 str [...]
+<p>But wait, there's even more - what would be a message streaming platform without some additional tooling for managing it? We've also been developing the <strong><a href="https://github.com/apache/iggy/tree/master/cmd" target="_blank" rel="noopener noreferrer">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've got a fully-featured <a href="https://github.com/apache/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'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="#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="/assets/images/gh_trending-bbecb9e6ddc18e345fbdb7c8bae838d9.jpeg" width="2234" height="1830" class="img_ev3q"></p>
+<p>Considering what's already there, being worked on or planned for the future releases, such as interactive CLI, modern Web UI, optional data compression and archivization, plugin support or multiple SDKs, there are at least three additional challenges to overcome:</p>
+<p><strong>Clustering</strong> - the possibility of having a <strong>highly available and fault tolerant</strong> distributed message streaming platform in a production environment, is typically one of the most important aspects when considering the particular tool. While it wouldn't be too difficult to implement the extension (think of a simple proxy/load balancer), allowing to monitor and deliver the data either to the primary or secondary replica (treated as a fallback server) an [...]
+<p><img decoding="async" loading="lazy" alt="image" src="/assets/images/leader_elections-f973c06ac3c6b230945e496faa6f314e.jpeg" width="4058" height="2316" class="img_ev3q"></p>
+<p><strong>Low-level I/O</strong> - although the current results (based on the benchmarking tool measuring the throughput etc.) are satisfying, we strongly believe that there's still (potentially a huge) room for improvement. We're planning to use <strong><a href="https://unixism.net/loti/what_is_io_uring.html" target="_blank" rel="noopener noreferrer">io_uring</a></strong> for all I/O operations (disk or network related). The brand new, completion based API (available in the r [...]
+<p><strong>Thread-per-core</strong> - in order to avoid the rather costly context switches due to the usage of synchronization mechanism when accessing the data from the different threads (e.g. via Tokio's work stealing mechanism), we're planning to explore (or actually, already doing it, in the previously mentioned repository for clustering sandbox) thread-per-core architecture, once again, delivered as part of <strong><a href="https://github.com/bytedance/monoio" 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'd be great to deliver the general-purpose tool, such as Kafka. On the other hand, why not to try and really push hard the OS and hardware to its limits when speaking of the performance, reliability, throughput and latency, something what e.g. [...]
+<p>Only the time will tell, but <strong>we're already excited enough to challenge ourselves</strong>. We'd love to hear your thoughts, ideas and <strong>feedback</strong> - anything that will help us in building the best message streaming platform in Rust that you will enjoy using! Feel free to join our <a href="https://discord.gg/C5Sux5NcRa" 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><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/blogs/2024/05/29/one-year-of-building-the-message-streaming/index.html b/blogs/2024/05/29/one-year-of-building-the-message-streaming/index.html
new file mode 100644
index 000000000..7d048435b
--- /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.00ae354b.css">
+<script src="/assets/js/runtime~main.abd83413.js" defer="defer"></script>
+<script src="/assets/js/main.e9fd05f4.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'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="_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'd say it's quite the opposite — let me quickly summary, what we've achieved so far during the last few months and what we're focusing on now, as the future looks bright :)</p>
+<p><img decoding="async" loading="lazy" alt="image" src="/assets/images/iggy_stars-adb7a001298df7df97de6b0fdd6321ce.png" width="795" height="542" class="img_ev3q"></p>
+<h2 class="anchor 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't for the community, we wouldn't have seen such an enormous growth of the Iggy's ecosystem — we've received the dozens of pull requests and there's ~250 members on our <a href="https://discord.gg/C5Sux5NcRa" 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/apache/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't the only great thing that has happened during last few months. We've also made quite a lot of improvements for the streaming server itself:</p>
+<ul>
+<li>Increased the streaming server throughput by over 30% for both writes and reads</li>
+<li>Added messages compression for client-side & server-side supporting the different algorithms</li>
+<li>Implemented a new way of message batching with an additional tooling for data migration</li>
+<li>Fixed the possible server-side deadlock that could happen for a specific configuration</li>
+<li>Fixed issues with possible memory leaks when storing too many indices in memory</li>
+<li>Rebuilt our custom benchmarking tool</li>
+<li>Improved TCP connection handling</li>
+<li>Constantly upgrading our CI/CD with lots of testing, different runtimes, artifacts, crates and Docker images releases</li>
+<li>Refactored the existing Rust client SDK to follow the new conventions (without the breaking changes to the previous one)</li>
+</ul>
+<p>And at the same time, we've been experimenting a lot with some fancy stuff, which you can read about in the last paragraphs :)</p>
+<p><img 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's not forget about the <strong>management tools</strong>. How to quickly connect to the server, create new topics, validate if the messages are being sent correctly, change the user permissions or check the node statistics?</p>
+<p>This is where our <strong><a href="https://github.com/apache/iggy/tree/master/core/cli" target="_blank" rel="noopener noreferrer">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="/assets/images/iggy_cli-c140d5ecfddf24acd537722137b70c47.png" width="1743" height="766" class="img_ev3q"></p>
+<p>On the other hand, if you prefer a graphical interface accessible via your browser, Web UI has got you covered. What's even more impressive, is that both of these tools have been developed by the single developers.</p>
+<p><img decoding="async" loading="lazy" alt="image" src="/assets/images/iggy_web-76023f316d53cc2e44ae6f7b83193529.png" width="2559" height="1353" class="img_ev3q"></p>
+<p>Last but not least, in order to run the benchmarks, we have our own <a href="https://github.com/apache/iggy/tree/master/core/bench" target="_blank" rel="noopener noreferrer">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's even worth an effort to continue with the further development of the project? Well, I truly wish I had an easy answer how to find users willing to play with your new shiny toy.</p>
+<p>In our case, I do believe, that it was a mix of two things — a limited amount of such tooling in the Rust ecosystem (so that the language enthusiasts could to try out something fresh), as well as a much more lightweight and (hopefully) performant message streaming infrastructure than some of the well-established solutions.</p>
+<p>I'm fully aware that it's a bold claim, and running the synthetic benchmarks is not a viable proof (e.g. on my 7950X, I was able to hit <strong>3GB/s writes and up to 10 GB/s reads</strong> with some additional caching enabled), yet, most of our early adopters were very happy with their results e.g. outnumbering Kafka while utilizing much less memory. For example, <a href="https://github.com/apache/iggy/issues/606" target="_blank" rel="noopener noreferrer">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 & replication<a href="#clustering--replication" class="hash-link" aria-label="Direct link to Clustering & replication" title="Direct link to Clustering & 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 [...]
+<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 & thread-per-core + share-nothing<a href="#io_uring--thread-per-core--share-nothing" class="hash-link" aria-label="Direct link to io_uring & thread-per-core + share-nothing" title="Direct link to io_uring & thread-per-core + share-nothing"></a></h2>
+<p>What is a message streaming server, besides some more-or-less complicated logic regarding topics, partitioning, message ordering, consumer groups and a few more features? In its very core, <strong>it's mostly I/O (disk + networking)</strong> — the more efficient you can make it, the greater it will be. Of course, there's a major difference between throughput and latency, especially when talking about the so-called tail latency (p99 and more). Wouldn't it be great if we [...]
+<p>However, due to the nature of tasks being shared across the different threads, <strong>you can't simply avoid lots of context switches and data being shared & synchronized across these threads</strong> (therefore even more context switches will occur). While it's probably not an issue for like 90% or maybe even 99% use-cases, there might be some (financial systems and similar), where an unpredictable tail latency is a total no-go.</p>
+<p>Certainly, there are already existing solutions dealing with such challenges, such as <a href="https://aeron.io" target="_blank" rel="noopener noreferrer">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 [...]
+<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="/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<></code> and <code>RwLock<></code>?</li>
+<li>Should we load into memory the same server metadata across all the threads (separately from each other) and notify all of them when something changes?</li>
+<li>Should there be single or multiple threads handling the incoming TCP connections?</li>
+<li>When <code>Thread #1</code> receives the request, which has to access the partition from <code>Thread #2</code>, should we use an async two-way channel (remember, no explicit locking and data synchronization between the threads) or maybe just send the descriptor using a one-way channel to the second thread to complete the request?</li>
+<li>What and when could become a bottleneck in such architecture?</li>
+</ul>
+<p>This is just the tip of an iceberg, and we've already started <a href="https://penberg.org/papers/tpc-ancs19.pdf" 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't really introduced any significant breaking changes (except one regarding data compression, which was handled by the provided data migration feature).</p>
+<p>We can't guarantee that it will always be like this, but at least for now, we do not see anything that would dramatically impact the existing solution. One of such things could be the <strong>redesigned storage, I/O, and clustering feature</strong> (as described in the previous paragraph), but even then, we'll do our best to make it as seamless upgrade as possible — and once we achieve that, it means, we're getting very close to the version 1.0.</p>
+<p>For the time being, if you're fine with a <strong>single-node solution that delivers a really good message streaming performance</strong>, give Iggy a try, or at least run the benchmarks to see what are its possibilities and please share your results and thoughts on our <a href="https://discord.gg/C5Sux5NcRa" 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="/assets/images/iggy_rocket-24a27df28dafae43eb9634a4f6b00c5e.png" width="1920" height="1080" class="img_ev3q"></p></div></article><nav class="pagination-nav docusaurus-mt-lg" aria-label="Blog post page navigation"><a class="pagination-nav__link pagination-nav__link--prev" href="/blogs/2024/10/28/technology-radar-and-currrent-goals"><div class="pagination-nav__sublabel">Newer post</div><div class="pagination-nav__label">Iggy.rs - Tec [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/blogs/2024/10/28/technology-radar-and-currrent-goals/index.html b/blogs/2024/10/28/technology-radar-and-currrent-goals/index.html
new file mode 100644
index 000000000..45bbc9af7
--- /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 & 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.00ae354b.css">
+<script src="/assets/js/runtime~main.abd83413.js" defer="defer"></script>
+<script src="/assets/js/main.e9fd05f4.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/apache/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 & 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 & understanding how they might affect your enterprise. Frankly speaking, we weren't expecting this at all, and <strong>from our perspective, it's quite of an accomplishment</strong>.</p>
+<p>Besides gaining an additional amount of trust & recognition, it has led us to another conclusion - someone out there we don't know yet about (maybe even one of their customers) is using/experimenting with Iggy :)</p>
+<p>And if you are (or will be) one of such persons, please hop onto our <a href="https://discord.gg/C5Sux5NcRa" 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 & 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="#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 & 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="/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/apache/iggy/pull/1053" target="_blank" rel="noopener noreferrer">implement</a> an optional archiver for the server state log & streaming data (messages etc.) which supports any S3 compatible storage (just pick up your favorite cloud provider). The configuration is as simple as this example:</p>
+<div class="language-toml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_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 [...]
+<ul>
+<li><strong>L1</strong> - data available directly from the server RAM (super fast writes/reads)</li>
+<li><strong>L2</strong> - data stored on your servers disks (still very, very fast with NVME SSD gen4 or 5)</li>
+<li><strong>L3</strong> - S3 storage, still fast for the typical use-cases which do not require a very stable, microsecond level latencies</li>
+</ul>
+<p><strong>Each of these storage layers could be optionally enabled or disabled</strong>. You can already decide if and how much memory to use for caching the messages. With S3 tiered storage in place, you could e.g. treat your server's SSD as a sort of ring buffer for keeping the most recent data (easily millions or billions of messages, depending on their size) and only fetch the ones from S3, when you need something very old.</p>
+<p>Or, you could just ignore your server's RAM & SSD, and do all the writes and reads directly on S3, and still remain blazingly fast (just like <a href="https://quickwit.io" 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've also <a href="https://github.com/apache/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 & traces for the server. Since our SDK already uses the logging & tracing libraries, we thought that adding such a feature on the server, could help you gain even better, real-time observability into what's hap [...]
+<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://discord.gg/C5Sux5NcRa" 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 & server in order to get full understanding of the distributed systems and its dependencies, which could be further visuali [...]
+<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 & 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'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't happen before we release the first version of the VSR clustering anyway), but if you want to tick all the possible boxes, it's hard to find a generic framework that will meet your demands, especially when mixed altogether with VSR clustering, thread-per-core & shared-nothing design (if will turn out to be suitable), zero-copy deserialization libraries and other things we might even not be aware o [...]
+<p><strong>To innovate, one must experiment</strong>, and although we do all these things in our spare time, it's been an exciting journey so far (and lots of experience gained in the meantime) for all of our team members building something fresh, from the very ground up, and regardless of the final outcome, we already know it was all worth it :)</p></div></article><nav class="pagination-nav docusaurus-mt-lg" aria-label="Blog post page navigation"><a class="pagination-nav__link pagi [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/blogs/2025/02/10/apache-incubator/index.html b/blogs/2025/02/10/apache-incubator/index.html
new file mode 100644
index 000000000..85180f2e2
--- /dev/null
+++ b/blogs/2025/02/10/apache-incubator/index.html
@@ -0,0 +1,61 @@
+<!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.00ae354b.css">
+<script src="/assets/js/runtime~main.abd83413.js" defer="defer"></script>
+<script src="/assets/js/main.e9fd05f4.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="-a-journey-two-years-in-the-making">🚀 A Journey Two Years in the Making<a href="#-a-journey-two-years-in-the-making" class="hash-link" aria-label="Direct link to 🚀 A Journey Two Years in the Making" title="Direct link to 🚀 A Journey Two Years in the Making"></a></h2>
+<p>It’s been almost two years since the very first line of code was written, and we’ve come a long way since the initial release. What started as a bold idea has grown into a high-performance, cost-efficient message streaming solution with a thriving community of contributors, users, and advocates. We’ve received invaluable feedback, contributions, and support, and we’re more excited than ever to take Iggy to the next level.</p>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="-beyond-just-iggy--a-growing-ecosystem">🔥 Beyond Just Iggy – A Growing Ecosystem<a href="#-beyond-just-iggy--a-growing-ecosystem" class="hash-link" aria-label="Direct link to 🔥 Beyond Just Iggy – A Growing Ecosystem" title="Direct link to 🔥 Beyond Just Iggy – A Growing Ecosystem"></a></h2>
+<p>Iggy is no longer just about the core repository. Over time, we’ve built an entire ecosystem around it, including:</p>
+<ul>
+<li>✅ SDKs for seamless developer integrations</li>
+<li>✅ CLIs for powerful command-line control</li>
+<li>✅ Web UIs for intuitive management</li>
+<li>✅ And many more…</li>
+</ul>
+<p>We’re already approaching 20 repositories under the Iggy organization (<a href="https://github.com/iggy-rs/" target="_blank" rel="noopener noreferrer">see them here</a>), and as we enter the Apache Incubator, we are committed to ensuring that all of them follow ASF guidelines while maintaining our core values of speed, efficiency, and simplicity.</p>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="-why-apache">🔗 Why Apache?<a href="#-why-apache" class="hash-link" aria-label="Direct link to 🔗 Why Apache?" title="Direct link to 🔗 Why Apache?"></a></h2>
+<p>The Apache Software Foundation has nurtured some of the <strong>most transformative open-source projects in history</strong> — Hadoop, Spark, Lucene, Solr, Cassandra, Kafka, Flink, and Airflow — technologies that have <strong>shaped big data, search, and real-time processing</strong>. By joining Apache Incubator, we align with this legacy and <strong>gain access to a larger community, better governance, and long-term sustainability</strong>.</p>
+<p>🔗 Dive into the Apache Incubator Details</p>
+<ul>
+<li><a href="https://cwiki.apache.org/confluence/display/INCUBATOR/Iggy+Proposal" target="_blank" rel="noopener noreferrer">Official Proposal</a></li>
+<li><a href="https://lists.apache.org/thread/q9whr3q9qd6wqm89f0vc1f6vkkvzc8xf" target="_blank" rel="noopener noreferrer">Discussion Thread</a></li>
+<li><a href="https://lists.apache.org/thread/6zfgdjwrzs92h4z4x6b25v1r23g3f5yg" target="_blank" rel="noopener noreferrer">Voting Results</a></li>
+</ul>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="-whats-next">📈 What’s Next?<a href="#-whats-next" class="hash-link" aria-label="Direct link to 📈 What’s Next?" title="Direct link to 📈 What’s Next?"></a></h2>
+<p><strong>Our vision is clear: Iggy as a future Apache Top-Level Project (TLP)</strong>. We already have ambitious ideas on how to improve both the project and the community around it:</p>
+<ul>
+<li><strong>Scaling performance benchmarks</strong> to push the limits of ultra-low-latency streaming</li>
+<li><strong>Expanding integrations</strong> with modern data infrastructure</li>
+<li><strong>Building a vibrant developer ecosystem</strong> that makes message streaming frictionless</li>
+</ul>
+<h2 class="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'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>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="-join-the-movement">💡 Join the Movement<a href="#-join-the-movement" class="hash-link" aria-label="Direct link to 💡 Join the Movement" title="Direct link to 💡 Join the Movement"></a></h2>
+<p>If you believe in a future where message streaming is lightning-fast, hyper-efficient, and accessible to all, we invite you to be part of this journey. Whether you're a developer, architect, or enterprise innovator, your contributions, feedback, and ideas will shape what comes next.</p>
+<p>And this is just the beginning. <strong>Welcome to the era of Hyper-Efficient Message Streaming at Laser Speed.</strong></p>
+<p><strong>Last but not least, we've got a new logo</strong>! Our lovely Italian Greyhound is now a part of the Apache family, and we're proud to have it as our mascot. As you can see, it's so fast, that even the light travelling through the optical fiber can't keep up with it :)</p>
+<p><img decoding="async" loading="lazy" alt="image" src="/assets/images/iggy_logo-f0e83b91b22303a5545dfb6d49756d18.png" width="1800" height="1000" class="img_ev3q"></p>
+<p>👉 Follow us, contribute, and help to build the future of the message streaming!</p>
+<ul>
+<li><a href="https://discord.gg/C5Sux5NcRa" target="_blank" rel="noopener noreferrer">Discord</a></li>
+<li><a href="https://x.com/ApacheIggy" target="_blank" rel="noopener noreferrer">X (Twitter)</a></li>
+<li><a href="https://bsky.app/profile/iggy.rs" target="_blank" rel="noopener noreferrer">Bluesky</a></li>
+<li><a href="https://www.linkedin.com/company/apache-iggy/" target="_blank" rel="noopener noreferrer">LinkedIn</a></li>
+</ul></div></article><nav class="pagination-nav docusaurus-mt-lg" aria-label="Blog post page navigation"><a class="pagination-nav__link pagination-nav__link--prev" href="/blogs/2025/02/17/transparent-benchmarks"><div class="pagination-nav__sublabel">Newer post</div><div class="pagination-nav__label">Transparent Benchmarking with Apache Iggy</div></a><a class="pagination-nav__link pagination-nav__link--next" href="/blogs/2024/10/28/technology-radar-and-currrent-goals"><div class="paginati [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/blogs/2025/02/17/transparent-benchmarks/index.html b/blogs/2025/02/17/transparent-benchmarks/index.html
new file mode 100644
index 000000000..d125cf46b
--- /dev/null
+++ b/blogs/2025/02/17/transparent-benchmarks/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">Transparent Benchmarking with Apache Iggy | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.pn [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed"><link rel="stylesheet" href="/assets/css/styles.00ae354b.css">
+<script src="/assets/js/runtime~main.abd83413.js" defer="defer"></script>
+<script src="/assets/js/main.e9fd05f4.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're more of an addition to the codebase, rather than a crucial part of it, which should be the other way around, especially when it comes to the performance-critical systems or infrastructure tools.</p>
+<p>Sometimes, the benchmarking results are nothing more than just a <strong>cherry-picking of the best-case scenarios</strong>, which are not representative of real-world usage. In such a case, they simply serve a sole purpose of either making the project look better than it is or how well it does outperform the competition, under the extremely optimized conditions when comparing with its counterparts.</p>
+<p><strong>Trying to reproduce the benchmarks is often a nightmare</strong>, as the environment setup is not documented, the code is unavailable, or the instructions are not clear enough. This makes it close to impossible to verify the results, which are then taken for granted.</p>
+<p>Or even worse, the <strong>benchmarking tool might be so complex, that it's hard to understand how it works</strong>, and what are the assumptions behind it. ALl of these, does result in hard to extend or modify the existing benchmarks, which are not covering the particular use case you're interested in. It's just here to tell everyone that we do have benchmarks, but how we do it, and what they measure, is a mystery.</p>
+<p><strong>Which is why at <a href="https://github.com/apache/iggy/" target="_blank" rel="noopener noreferrer">Iggy</a>, we've decided to make the benchmarks a first-class citizen</strong>.</p>
+<p>Our <code>iggy-bench</code> tool, which is used to run the benchmarks and is part of the core open source repository (can be found under the <code>bench</code> directory), has come a long way and has been serving us well.</p>
+<p><img decoding="async" loading="lazy" alt="image" src="/assets/images/iggy_bench_cli-32946d97899e6925f99469dad967ca7e.png" width="2742" height="1930" class="img_ev3q"></p>
+<p>We use it to do quick performance checks, regression testing, and to see how the changes we introduce affect the performance. <strong>We run it on our localhost, as well as on the Virtual Machines in the cloud, to see how it behaves under a variety of environments.</strong></p>
+<h2 class="anchor 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're proud to present <a href="https://benchmarks.iggy.apache.org/" target="_blank" rel="noopener noreferrer">benchmarks.iggy.apache.org</a></strong> - a benchmarking dashboard, which is available to everyone. It's a website where you can see how Iggy performs under the different conditions, and how it scales with the number of clients, messages, and topics.</p>
+<p>This is our community-driven effort, where everyone can contribute, and add their own benchmarks. For all the information on how to run the benchmarks, render them on the dashboard, upload your results or contribute to the project, please check the <a href="https://github.com/iggy-rs/iggy-bench-dashboard" target="_blank" rel="noopener noreferrer">iggy-bench-dashboard</a> repository. In general, it's as simple as:</p>
+<ul>
+<li>Building the <a href="https://github.com/apache/iggy" target="_blank" rel="noopener noreferrer">Iggy</a> in the release mode with <code>cargo build --release</code></li>
+<li>Starting your Iggy server with <code>cargo r --bin iggy-server -r</code> (feel free to adjust the configuration in <code>server.toml</code> or via environment variables)</li>
+<li>Running the <code>iggy-bench</code> tool with the desired parameters, e.g. <code>cargo r --bin iggy-bench -r pinned-producer tcp</code></li>
+<li>Extending your benchmark with the output (HTML charts, JSON sampling etc.) <code>cargo r --bin iggy-bench -r pinned-producer tcp output -o performance_results --identifier spetz</code></li>
+<li>Navigating to the specific benchmark directory to browse the charts and/or uploading them to the dashboard.</li>
+<li>And there's always <code>help</code> command e.g. <code>pinned-producer --help</code> to make your life easier :)</li>
+</ul>
+<p><img decoding="async" loading="lazy" alt="image" src="/assets/images/iggy_bench_dashboard-20dc5e120f14f0c4618f23227cd08ac9.png" width="2555" height="1327" class="img_ev3q"></p>
+<p><strong>And this is just the beginning</strong>, as we plan to extend the dashboard, and add more benchmarks, which are covering the different use cases.</p>
+<p>Our main goal is to make the benchmarking process (and its results) <strong>transparent, reproducible, and easy to understand</strong>. We want to make them a first-class citizen, and a crucial part of the Iggy project. We want to make them a tool, which will help us to improve the performance, and to make Iggy the best streaming server out there. We're looking forward to your feedback, and we hope you'll enjoy the benchmarks.</p>
+<h2 class="anchor 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'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 t [...]
+<p>And the best part is that we're just getting started. We're looking forward to pushing the limits even further, and to see how far we can go. There's still tons of optimizations coming, including switching the runtime to the <a href="https://github.com/bytedance/monoio" 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 t [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/blogs/2025/05/08/zero-copy-deserialization/index.html b/blogs/2025/05/08/zero-copy-deserialization/index.html
new file mode 100644
index 000000000..3b3fbb516
--- /dev/null
+++ b/blogs/2025/05/08/zero-copy-deserialization/index.html
@@ -0,0 +1,63 @@
+<!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">Zero-copy (de)serialization | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data- [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed"><link rel="stylesheet" href="/assets/css/styles.00ae354b.css">
+<script src="/assets/js/runtime~main.abd83413.js" defer="defer"></script>
+<script src="/assets/js/main.e9fd05f4.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>Apache Iggy considers <strong>performance as one of its core principles</strong>. We take pride in being blazingly fast, as proof of that, we have made <strong><a href="https://iggy.apache.org/blogs/2025/02/17/transparent-benchmarks" target="_blank" rel="noopener noreferrer">benchmarking first-class citizen</a></strong>.</p>
+<p><strong>Zero-copy schema</strong> was a natural next step in our high-performance journey, it was part of our roadmap for quite a while, until the day we have <strong><a href="https://github.com/apache/iggy/pull/1679" target="_blank" rel="noopener noreferrer">finally merged it</a></strong>. In this blog post, we will share our path to implementing it.</p>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="zero-copy-with-rkyv">Zero copy with rkyv<a href="#zero-copy-with-rkyv" class="hash-link" aria-label="Direct link to Zero copy with rkyv" title="Direct link to Zero copy with rkyv"></a></h2>
+<p>Our initial approach to zero copy was leveraging the existing <strong><a href="https://github.com/rkyv/rkyv" target="_blank" rel="noopener noreferrer">rkyv</a></strong> package which might or might not have been the best choice (more about it later). Using rkyv is pretty straightforward, as it revolves around three traits (<code>Archive</code>, <code>Serialize</code>, <code>Deserialize</code>), all three of which can be derived using derive macros, thus making our job pretty easy.</p>
+<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 attribute attr-name" style="color:#00a4db">#[derive(Archive, Deserialize, Serialize)]</span><span [...]
+<p>Same traits are derived for <code>IggyMessage</code></p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_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 attribute attr-name" style="color:#00a4db">#[derive(Archive, Deserialize, Serialize)]</span><span [...]
+<p>Rkyv internally figures out the memory layout used for serialization, such that it can later on cast it back into its Archived form. (A couple bits of trivia: rkyv, when performing zero copy deserialization, turns the byte representation of your data into its Archived form, so instead of <code>IggyBatch</code> we receive <code>ArchivedIggyBatch</code>, rkyv has to reimplement certain complex types such as <code>Vec</code>, <code>HashMap</code> etc., and that’s why it yields back your [...]
+You can learn more about it by reading the <strong><a href="https://rkyv.org" target="_blank" rel="noopener noreferrer">rkyv book</a></strong>, or from this <strong><a href="https://www.youtube.com/watch?v=ON4z2LbTD-4" target="_blank" rel="noopener noreferrer">presentation</a></strong>.</p>
+<p>After a further evaluation of <code>IggyBatch</code>, we found that while it was good enough, there was still room for improvement.
+Imagine a scenario where the client sends a batch with 100 messages, the server receives it, turns it into Archived form, updates metadata fields, caches/persists it and sends an ack back to the client. The client sends a fetch request for 10 messages, the server receives the request, peeks into the cache, finds our batch of 100 messages and here is the tricky bit -
+We would like to send back <strong>only a slice of the cached data</strong> (10 messages instead of 100), but due to rkyv's memory layout, one cannot simply take a slice of those bytes and perform the transformation into its Archived form.</p>
+<p>So rather than deriving rkyv's traits to <code>IggyBatch</code>, we decided to refine our approach by working at the individual message level.</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_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">struct</span><span class="token plain"> </span><span class="token t [...]
+<p>We redesigned the IggyBatch structure so that the <code>messages</code> field now stores a byte representation of <code>Vec<IggyMessage></code>, with each message prefixed by its 4-byte length. This approach allows us to traverse through the data, cast individual messages to its archived form, and perform some work on it.</p>
+<p><img decoding="async" loading="lazy" alt="image" src="/assets/images/iggy_batch_schema_1-61b4d896b850e3d0ee08270f7db7c6b5.png" width="1600" height="664" class="img_ev3q"></p>
+<p>By creating this frankenstein layout that combines length prefixes with rkyv's memory layout, we've achieved the flexibility that we were aiming for, optimized for the most costly copies (messages), rather than the entire batch including its header.</p>
+<p>One thing worth noting, rkyv requires buffer with your data to be aligned, going after rkyv book - “16-aligned memory should be sufficient.”, thus if you want to prefix your payload with any metadata, make sure that it doesn’t misalign your buffer, or you can opt-in the <code>unaligned</code> feature.</p>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="beyond-rkyv">Beyond rkyv<a href="#beyond-rkyv" class="hash-link" aria-label="Direct link to Beyond rkyv" title="Direct link to Beyond rkyv"></a></h2>
+<p>Rkyv is a pretty “heavy” crate that spreads through your entire application from network schema to disk schema, partially coupling your own versioning with its. <strong>For many applications there is no way around this</strong>, as it is the most complete zero-copy deserialization crate, but we decided to implement a more lightweight solution that gives us control over the memory layout.</p>
+<p>We’ve decided to still process messages individually, but have replaced length prefixes with a separate index vector.</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_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><img decoding="async" loading="lazy" alt="image" src="/assets/images/iggy_batch_schema_2-c7a5fc6158b838999c178ef8aea96089.png" width="1600" height="720" class="img_ev3q"></p>
+<p>This index vector consists of bytes that, when deserialized form <code>u32</code> values that point to specific positions within the message data. Separating messages from indexes serves purpose beyond the scope of this blog post, but shortly, this index structure closely resembles what we use on the server for message lookup in the log. This in turn, later on <strong>allows us to efficiently reuse memory</strong>.</p>
+<p>When iterating through the batch, <strong>we yield views</strong> instead of fully deserialized messages.</p>
+<p>In case if we’d need to have <code>IggyMessage</code> deserialized, we can do it just in time, rather than eagerly, for example when client processes a fetched batch from the server.</p>
+<p>This approach allows us to combine the flexibility of solution with length prefixes using rkyv as well as having the freedom of not depending on a 3rd party crate, in fact this solution looks fairly similar to serde partial zero copy deserialization.</p>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="benchmarks">Benchmarks<a href="#benchmarks" class="hash-link" aria-label="Direct link to Benchmarks" title="Direct link to Benchmarks"></a></h2>
+<p>Now the part that all of you are probably most interested in - le benchmarks.</p>
+<p>Those results come from an <strong>AWS i3en.3xlarge</strong> instance</p>
+<p><strong>Before</strong></p>
+<p><img decoding="async" loading="lazy" alt="image" src="/assets/images/no_zero_copy_producer-ffed3643f7efa9c5ac43a3ce4cba746c.png" width="3188" height="2264" class="img_ev3q">
+<img decoding="async" loading="lazy" alt="image" src="/assets/images/no_zero_copy_consumer-ae546079ca662038a43983969c9fa325.png" width="3186" height="2262" class="img_ev3q"></p>
+<table><thead><tr><th style="text-align:left">No zero-copy</th><th style="text-align:center">tput</th><th style="text-align:center">p95</th><th style="text-align:center">p99</th><th style="text-align:center">avg</th></tr></thead><tbody><tr><td style="text-align:left">Producer</td><td style="text-align:center">1.7GB/s</td><td style="text-align:center">3.48ms</td><td style="text-align:center">4.23ms</td><td style="text-align:center">2.39ms</td></tr><tr><td style="text-align:left">Consumer< [...]
+<p><strong>After</strong></p>
+<p><img decoding="async" loading="lazy" alt="image" src="/assets/images/zero_copy_producer-6cd58f250a711fb170bba9091da38606.png" width="3194" height="2260" class="img_ev3q">
+<img decoding="async" loading="lazy" alt="image" src="/assets/images/zero_copy_consumer-b0a3206f473d6d13c8cc4fc8dfca3486.png" width="3192" height="2266" class="img_ev3q"></p>
+<table><thead><tr><th style="text-align:left">Zero-copy</th><th style="text-align:center">tput</th><th style="text-align:center">p95</th><th style="text-align:center">p99</th><th style="text-align:center">avg</th></tr></thead><tbody><tr><td style="text-align:left">Producer</td><td style="text-align:center">2.4GB/s</td><td style="text-align:center">2.33ms</td><td style="text-align:center">2.59ms</td><td style="text-align:center">1.63ms</td></tr><tr><td style="text-align:left">Consumer</td [...]
+<p><strong>Almost 2 times higher throughput for reads (2,1GBps vs 4GBps), 40% higher throughput for writes (2,4GBps vs 1,7GBps), 2x better p99 latencies for reads (2.93ms vs 1,46 ms) and 63% better p99 latencies for writes (4.23ms vs 2.59ms).</strong></p>
+<p>You can find more detailed comparisons on our <strong><a href="https://benchmarks.iggy.apache.org" target="_blank" rel="noopener noreferrer">benchmarking website</a></strong>.</p>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="concluding">Concluding<a href="#concluding" class="hash-link" aria-label="Direct link to Concluding" title="Direct link to Concluding"></a></h2>
+<p><strong>It was a lot of fun exploring the entire design space for our zero copy schema</strong>. Depending on the constraints one might end up with a completely different solution, in fact zero copy isn't always the optimal approach, for example, if you'd like to read more about challenges that folks in embedded development have to overcome, check out <strong><a href="https://bsky.app/profile/jamesmunns.com/post/3lnqo5ykawc2r" target="_blank" rel="noopener noreferrer">this B [...]
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="whats-next-for-iggy">What’s next for Iggy<a href="#whats-next-for-iggy" class="hash-link" aria-label="Direct link to What’s next for Iggy" title="Direct link to What’s next for Iggy"></a></h2>
+<p>Implementing zero-copy was a major milestone for us, but the train doesn’t slow down. Next in line is <strong>io_uring</strong> and <strong>thread per core shared nothing</strong> architecture. <strong><a href="https://www.reddit.com/r/rust/comments/1d35fsb/comment/l65wgnt/" target="_blank" rel="noopener noreferrer">We’ve already promised</a></strong> that we will publish more details about it once we have the results from our benchmark tests, so expect a highly technical blog post in [...]
+<p>For now <strong><a href="https://github.com/apache/iggy/tree/io_uring_monoio_runtime" target="_blank" rel="noopener noreferrer">we did a proof of concept long time ago</a></strong>, but realised a few things along the way that we would like to do differently. So we will. Iggy moves onward and upward! 🚀</p></div></article><nav class="pagination-nav docusaurus-mt-lg" aria-label="Blog post page navigation"><a class="pagination-nav__link pagination-nav__link--prev" href="/blogs/2025/06/06 [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/blogs/2025/06/06/connectors-runtime/index.html b/blogs/2025/06/06/connectors-runtime/index.html
new file mode 100644
index 000000000..2af328fff
--- /dev/null
+++ b/blogs/2025/06/06/connectors-runtime/index.html
@@ -0,0 +1,39 @@
+<!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">Connectors runtime | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed"><link rel="stylesheet" href="/assets/css/styles.00ae354b.css">
+<script src="/assets/js/runtime~main.abd83413.js" defer="defer"></script>
+<script src="/assets/js/main.e9fd05f4.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 message streaming, connectors quite often play a crucial role in facilitating data exchange between different systems. While Apache Iggy remains the core messaging infrastructure, <strong>focusing on extreme efficiency</strong> (high throughput, low latency, and minimal resource consumption), it could also benefit from a more extensible architecture. This is where connectors come into play.</p>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-are-the-connectors">What are the connectors<a href="#what-are-the-connectors" class="hash-link" aria-label="Direct link to What are the connectors" title="Direct link to What are the connectors"></a></h2>
+<p>If you've ever used e.g. Apache Kafka or one of the Kafka-compatible solutions, such as Redpanda, you might've already encountered the concept of connectors. For example, there's a dedicated <a href="https://kafka.apache.org/documentation/#connectapi" target="_blank" rel="noopener noreferrer">Connect API</a> allowing you to create the custom connectors (plugins) for various data sources.</p>
+<p>Typically, connectors are designed to handle data ingestion and transformation tasks. They can be used to read data from external sources, transform it, and then write it to the message streaming system (<strong>sources</strong>), or the other way around (<strong>sinks</strong>) - fetch data from the message streaming system and write it to external services (e.g. databases, file systems, etc.).</p>
+<p>Let's say that we would like to get the real-time changes from a database (Postgres CDC for example) and send them to Apache Iggy, while performing some optional data transformation, such as filtering or enriching the data. Or, we might want to fetch data from Apache Iggy (e.g. produced by our custom services), transform it, and then push it further to the external indexer such as Elastic or Quickwit.</p>
+<p><strong>Instead of building all these pipelines from scratch as custom applications, we can leverage the power of connectors to simplify the process</strong>. Simply download one of the existing plugins, configure it using the provided configuration files, and start using it - no need to write any code!</p>
+<p>Here's an example of a configuration file for the sink connector named <code>stdout</code>:</p>
+<div class="language-toml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_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"># Required configuration for a sink connector</span><br></span><span class="token-line" sty [...]
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="rust-based-plugins">Rust-based plugins<a href="#rust-based-plugins" class="hash-link" aria-label="Direct link to Rust-based plugins" title="Direct link to Rust-based plugins"></a></h2>
+<p>Since Apache Iggy is implemented in Rust, it was an easy choice to implement the connectors in Rust as well. <strong>This allows us to take advantage of the Rust's powerful type system and memory safety features</strong>, ensuring that the connectors are reliable and efficient. Internally, we use <strong><a href="https://github.com/OpenByteDev/dlopen2" target="_blank" rel="noopener noreferrer">dlopen2</a></strong> library to load the plugins during the runtime initialization - fe [...]
+<p>Thanks to this approach, just like Iggy itself, the connector runtime (which is a separate process), is very lightweight and easy to deploy. <strong>The runtime uses just a few MBs of memory on its own, while consuming minimal CPU resources.</strong> Behind the scenes, we use the shared <strong><a href="https://tokio.rs" target="_blank" rel="noopener noreferrer">Tokio runtime</a></strong> to manage the asynchronous tasks and events across all connectors, as well as the <strong><a href [...]
+<p>When running a simple benchmark based on the custom <strong><a href="https://github.com/apache/iggy/tree/master/core/connectors/sinks/quickwit_sink" target="_blank" rel="noopener noreferrer">Quickwit sink</a></strong> connector, which pulls the data in real time from Iggy stream, does a basic data transformation (using the JSON payload format), and then pushes the data further to the Quickwit HTTP API, we observed that this plugin <strong>can easily handle hundreds of thousands of mes [...]
+<p>Last, but not least, It's quite easy to create your own connectors - simply implement either <code>Sink</code> or <code>Source</code> trait, compile the library and configure it in the runtime. Please check the <strong><a href="https://github.com/apache/iggy/tree/master/core/connectors/" target="_blank" rel="noopener noreferrer">repository</a></strong> or the <strong><a href="/docs/connectors/introduction">documentation</a></strong> for more details.</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_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 attribute attr-name" style="color:#00a4db">#[async_trait]</span><span class="token plain"></span>< [...]
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_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 attribute attr-name" style="color:#00a4db">#[async_trait]</span><span class="token plain"></span>< [...]
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="whats-next">What's next?<a href="#whats-next" class="hash-link" aria-label="Direct link to What's next?" title="Direct link to What's next?"></a></h2>
+<p>Since it's the very early release to showcase what's possible with the connector runtime, we plan to focus on improving the performance and stability of the runtime itself.</p>
+<p>Moreover, we plan to build more connectors, data transformations and schema encoders/decoders, to support the seamless transition between the different data formats and protocols.</p>
+<p>It's also worth mentioning that the runtime uses one of the existing network protocols available via Rust SDK to connect to the Iggy server (so-called distributed mode). And while it might be the case for most of the deployments out there, we might also support e.g. UDS or some sort of IPC to allow the connectors deployment on the same machine, next to the streaming server.</p>
+<p>Finally, we would love to hear your feedback and suggestions on how to improve the runtime and connectors. Please feel free to open an <strong><a href="https://github.com/apache/iggy/issues" target="_blank" rel="noopener noreferrer">issue</a></strong>, <strong><a href="https://github.com/apache/iggy/pulls" target="_blank" rel="noopener noreferrer">pull request</a></strong> or start a <strong><a href="https://github.com/apache/iggy/discussions" target="_blank" rel="noopener noreferrer" [...]
+<p>As always, you are more than welcome to join our <strong><a href="https://discord.gg/C5Sux5NcRa" target="_blank" rel="noopener noreferrer">Discord community</a></strong>!</p></div></article><nav class="pagination-nav docusaurus-mt-lg" aria-label="Blog post page navigation"><a class="pagination-nav__link pagination-nav__link--next" href="/blogs/2025/05/08/zero-copy-deserialization"><div class="pagination-nav__sublabel">Older post</div><div class="pagination-nav__label">Zero-copy (de)se [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/blogs/archive/index.html b/blogs/archive/index.html
new file mode 100644
index 000000000..c1d637b9a
--- /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.00ae354b.css">
+<script src="/assets/js/runtime~main.abd83413.js" defer="defer"></script>
+<script src="/assets/js/main.e9fd05f4.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><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/blogs/atom.css b/blogs/atom.css
new file mode 100644
index 000000000..d2fc20b27
--- /dev/null
+++ b/blogs/atom.css
@@ -0,0 +1,75 @@
+/**
+ * Copyright (c) Facebook, Inc. and its affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+main {
+ flex: 1 0 auto;
+ width: 100%;
+ margin: 2rem auto;
+ max-width: 800px;
+ /* stylelint-disable-next-line font-family-name-quotes */
+ font-family: system-ui, -apple-system, Segoe UI, Roboto, Ubuntu, Cantarell;
+}
+
+.info {
+ display: block;
+ margin: 2rem 0;
+ padding: 1.6rem 2.4rem;
+ border: 1px solid dodgerblue;
+ border-left-width: 0.5rem;
+ border-radius: 0.4rem;
+ background-color: #edf5ff;
+}
+
+a {
+ color: #005aff;
+ text-decoration: none;
+}
+
+h1 {
+ text-wrap: balance;
+ font-size: 3.4rem;
+ font-weight: 800;
+ margin-bottom: 2rem;
+ display: flex;
+ align-items: center;
+}
+
+h1 .rss-icon {
+ height: 3.2rem;
+ width: 3.2rem;
+ margin-right: 1rem;
+}
+
+h2 {
+ font-size: 2.2rem;
+ font-weight: 700;
+ margin-bottom: 0.2rem;
+}
+
+h3 {
+ font-size: 1.8rem;
+ font-weight: 700;
+ margin-bottom: 0.1rem;
+}
+
+.blog-description {
+ font-size: 1.4rem;
+ margin-bottom: 0.6rem;
+}
+
+.blog-post-date {
+ font-size: 1rem;
+ line-height: 1.4rem;
+ font-style: italic;
+ color: #797b7e;
+}
+
+.blog-post-description {
+ font-size: 1rem;
+ line-height: 1.4rem;
+ color: #434349;
+}
diff --git a/blogs/atom.xml b/blogs/atom.xml
new file mode 100644
index 000000000..2ef87bf3e
--- /dev/null
+++ b/blogs/atom.xml
@@ -0,0 +1,759 @@
+<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="atom.xsl"?>
+<feed xmlns="http://www.w3.org/2005/Atom">
+ <id>https://iggy.apache.org/blogs</id>
+ <title>Hyper-Efficient Message Streaming at Laser Speed. Blog</title>
+ <updated>2025-06-06T00:00:00.000Z</updated>
+ <generator>https://github.com/jpmonette/feed</generator>
+ <link rel="alternate" href="https://iggy.apache.org/blogs"/>
+ <subtitle>Hyper-Efficient Message Streaming at Laser Speed. Blog</subtitle>
+ <icon>https://iggy.apache.org/img/favicon.png</icon>
+ <entry>
+ <title type="html"><![CDATA[Connectors runtime]]></title>
+ <id>https://iggy.apache.org/blogs/2025/06/06/connectors-runtime</id>
+ <link href="https://iggy.apache.org/blogs/2025/06/06/connectors-runtime"/>
+ <updated>2025-06-06T00:00:00.000Z</updated>
+ <summary type="html"><![CDATA[Extending Apache Iggy capabilities]]></summary>
+ <content type="html"><![CDATA[<h2 class="anchor anchorWithStickyNavbar_LWe7" id="extending-apache-iggy-capabilities">Extending Apache Iggy capabilities<a href="https://iggy.apache.org/blogs/2025/06/06/connectors-runtime#extending-apache-iggy-capabilities" class="hash-link" aria-label="Direct link to Extending Apache Iggy capabilities" title="Direct link to Extending Apache Iggy capabilities"></a></h2>
+<p>In the world of message streaming, connectors quite often play a crucial role in facilitating data exchange between different systems. While Apache Iggy remains the core messaging infrastructure, <strong>focusing on extreme efficiency</strong> (high throughput, low latency, and minimal resource consumption), it could also benefit from a more extensible architecture. This is where connectors come into play.</p>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-are-the-connectors">What are the connectors<a href="https://iggy.apache.org/blogs/2025/06/06/connectors-runtime#what-are-the-connectors" class="hash-link" aria-label="Direct link to What are the connectors" title="Direct link to What are the connectors"></a></h2>
+<p>If you've ever used e.g. Apache Kafka or one of the Kafka-compatible solutions, such as Redpanda, you might've already encountered the concept of connectors. For example, there's a dedicated <a href="https://kafka.apache.org/documentation/#connectapi" target="_blank" rel="noopener noreferrer">Connect API</a> allowing you to create the custom connectors (plugins) for various data sources.</p>
+<p>Typically, connectors are designed to handle data ingestion and transformation tasks. They can be used to read data from external sources, transform it, and then write it to the message streaming system (<strong>sources</strong>), or the other way around (<strong>sinks</strong>) - fetch data from the message streaming system and write it to external services (e.g. databases, file systems, etc.).</p>
+<p>Let's say that we would like to get the real-time changes from a database (Postgres CDC for example) and send them to Apache Iggy, while performing some optional data transformation, such as filtering or enriching the data. Or, we might want to fetch data from Apache Iggy (e.g. produced by our custom services), transform it, and then push it further to the external indexer such as Elastic or Quickwit.</p>
+<p><strong>Instead of building all these pipelines from scratch as custom applications, we can leverage the power of connectors to simplify the process</strong>. Simply download one of the existing plugins, configure it using the provided configuration files, and start using it - no need to write any code!</p>
+<p>Here's an example of a configuration file for the sink connector named <code>stdout</code>:</p>
+<div class="language-toml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_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"># Required configuration for a sink connector</span><br></span><span class="token-line" sty [...]
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="rust-based-plugins">Rust-based plugins<a href="https://iggy.apache.org/blogs/2025/06/06/connectors-runtime#rust-based-plugins" class="hash-link" aria-label="Direct link to Rust-based plugins" title="Direct link to Rust-based plugins"></a></h2>
+<p>Since Apache Iggy is implemented in Rust, it was an easy choice to implement the connectors in Rust as well. <strong>This allows us to take advantage of the Rust's powerful type system and memory safety features</strong>, ensuring that the connectors are reliable and efficient. Internally, we use <strong><a href="https://github.com/OpenByteDev/dlopen2" target="_blank" rel="noopener noreferrer">dlopen2</a></strong> library to load the plugins during the runtime initialization - feel fr [...]
+<p>Thanks to this approach, just like Iggy itself, the connector runtime (which is a separate process), is very lightweight and easy to deploy. <strong>The runtime uses just a few MBs of memory on its own, while consuming minimal CPU resources.</strong> Behind the scenes, we use the shared <strong><a href="https://tokio.rs/" target="_blank" rel="noopener noreferrer">Tokio runtime</a></strong> to manage the asynchronous tasks and events across all connectors, as well as the <strong><a hre [...]
+<p>When running a simple benchmark based on the custom <strong><a href="https://github.com/apache/iggy/tree/master/core/connectors/sinks/quickwit_sink" target="_blank" rel="noopener noreferrer">Quickwit sink</a></strong> connector, which pulls the data in real time from Iggy stream, does a basic data transformation (using the JSON payload format), and then pushes the data further to the Quickwit HTTP API, we observed that this plugin <strong>can easily handle hundreds of thousands of mes [...]
+<p>Last, but not least, It's quite easy to create your own connectors - simply implement either <code>Sink</code> or <code>Source</code> trait, compile the library and configure it in the runtime. Please check the <strong><a href="https://github.com/apache/iggy/tree/master/core/connectors/" target="_blank" rel="noopener noreferrer">repository</a></strong> or the <strong><a href="https://iggy.apache.org/docs/connectors/introduction">documentation</a></strong> for more details.</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_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 attribute attr-name" style="color:#00a4db">#[async_trait]</span><span class="token plain"></span>< [...]
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_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 attribute attr-name" style="color:#00a4db">#[async_trait]</span><span class="token plain"></span>< [...]
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="whats-next">What's next?<a href="https://iggy.apache.org/blogs/2025/06/06/connectors-runtime#whats-next" class="hash-link" aria-label="Direct link to What's next?" title="Direct link to What's next?"></a></h2>
+<p>Since it's the very early release to showcase what's possible with the connector runtime, we plan to focus on improving the performance and stability of the runtime itself.</p>
+<p>Moreover, we plan to build more connectors, data transformations and schema encoders/decoders, to support the seamless transition between the different data formats and protocols.</p>
+<p>It's also worth mentioning that the runtime uses one of the existing network protocols available via Rust SDK to connect to the Iggy server (so-called distributed mode). And while it might be the case for most of the deployments out there, we might also support e.g. UDS or some sort of IPC to allow the connectors deployment on the same machine, next to the streaming server.</p>
+<p>Finally, we would love to hear your feedback and suggestions on how to improve the runtime and connectors. Please feel free to open an <strong><a href="https://github.com/apache/iggy/issues" target="_blank" rel="noopener noreferrer">issue</a></strong>, <strong><a href="https://github.com/apache/iggy/pulls" target="_blank" rel="noopener noreferrer">pull request</a></strong> or start a <strong><a href="https://github.com/apache/iggy/discussions" target="_blank" rel="noopener noreferrer" [...]
+<p>As always, you are more than welcome to join our <strong><a href="https://discord.gg/C5Sux5NcRa" target="_blank" rel="noopener noreferrer">Discord community</a></strong>!</p>]]></content>
+ <author>
+ <name>Piotr Gankiewicz</name>
+ <uri>https://github.com/spetz</uri>
+ </author>
+ </entry>
+ <entry>
+ <title type="html"><![CDATA[Zero-copy (de)serialization]]></title>
+ <id>https://iggy.apache.org/blogs/2025/05/08/zero-copy-deserialization</id>
+ <link href="https://iggy.apache.org/blogs/2025/05/08/zero-copy-deserialization"/>
+ <updated>2025-05-08T00:00:00.000Z</updated>
+ <summary type="html"><![CDATA[Introduction]]></summary>
+ <content type="html"><![CDATA[<h2 class="anchor anchorWithStickyNavbar_LWe7" id="introduction">Introduction<a href="https://iggy.apache.org/blogs/2025/05/08/zero-copy-deserialization#introduction" class="hash-link" aria-label="Direct link to Introduction" title="Direct link to Introduction"></a></h2>
+<p>Apache Iggy considers <strong>performance as one of its core principles</strong>. We take pride in being blazingly fast, as proof of that, we have made <strong><a href="https://iggy.apache.org/blogs/2025/02/17/transparent-benchmarks" target="_blank" rel="noopener noreferrer">benchmarking first-class citizen</a></strong>.</p>
+<p><strong>Zero-copy schema</strong> was a natural next step in our high-performance journey, it was part of our roadmap for quite a while, until the day we have <strong><a href="https://github.com/apache/iggy/pull/1679" target="_blank" rel="noopener noreferrer">finally merged it</a></strong>. In this blog post, we will share our path to implementing it.</p>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="zero-copy-with-rkyv">Zero copy with rkyv<a href="https://iggy.apache.org/blogs/2025/05/08/zero-copy-deserialization#zero-copy-with-rkyv" class="hash-link" aria-label="Direct link to Zero copy with rkyv" title="Direct link to Zero copy with rkyv"></a></h2>
+<p>Our initial approach to zero copy was leveraging the existing <strong><a href="https://github.com/rkyv/rkyv" target="_blank" rel="noopener noreferrer">rkyv</a></strong> package which might or might not have been the best choice (more about it later). Using rkyv is pretty straightforward, as it revolves around three traits (<code>Archive</code>, <code>Serialize</code>, <code>Deserialize</code>), all three of which can be derived using derive macros, thus making our job pretty easy.</p>
+<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 attribute attr-name" style="color:#00a4db">#[derive(Archive, Deserialize, Serialize)]</span><span [...]
+<p>Same traits are derived for <code>IggyMessage</code></p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_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 attribute attr-name" style="color:#00a4db">#[derive(Archive, Deserialize, Serialize)]</span><span [...]
+<p>Rkyv internally figures out the memory layout used for serialization, such that it can later on cast it back into its Archived form. (A couple bits of trivia: rkyv, when performing zero copy deserialization, turns the byte representation of your data into its Archived form, so instead of <code>IggyBatch</code> we receive <code>ArchivedIggyBatch</code>, rkyv has to reimplement certain complex types such as <code>Vec</code>, <code>HashMap</code> etc., and that’s why it yields back your [...]
+You can learn more about it by reading the <strong><a href="https://rkyv.org/" target="_blank" rel="noopener noreferrer">rkyv book</a></strong>, or from this <strong><a href="https://www.youtube.com/watch?v=ON4z2LbTD-4" target="_blank" rel="noopener noreferrer">presentation</a></strong>.</p>
+<p>After a further evaluation of <code>IggyBatch</code>, we found that while it was good enough, there was still room for improvement.
+Imagine a scenario where the client sends a batch with 100 messages, the server receives it, turns it into Archived form, updates metadata fields, caches/persists it and sends an ack back to the client. The client sends a fetch request for 10 messages, the server receives the request, peeks into the cache, finds our batch of 100 messages and here is the tricky bit -
+We would like to send back <strong>only a slice of the cached data</strong> (10 messages instead of 100), but due to rkyv's memory layout, one cannot simply take a slice of those bytes and perform the transformation into its Archived form.</p>
+<p>So rather than deriving rkyv's traits to <code>IggyBatch</code>, we decided to refine our approach by working at the individual message level.</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_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">struct</span><span class="token plain"> </span><span class="token t [...]
+<p>We redesigned the IggyBatch structure so that the <code>messages</code> field now stores a byte representation of <code>Vec<IggyMessage></code>, with each message prefixed by its 4-byte length. This approach allows us to traverse through the data, cast individual messages to its archived form, and perform some work on it.</p>
+<p><img decoding="async" loading="lazy" alt="image" src="https://iggy.apache.org/assets/images/iggy_batch_schema_1-61b4d896b850e3d0ee08270f7db7c6b5.png" width="1600" height="664" class="img_ev3q"></p>
+<p>By creating this frankenstein layout that combines length prefixes with rkyv's memory layout, we've achieved the flexibility that we were aiming for, optimized for the most costly copies (messages), rather than the entire batch including its header.</p>
+<p>One thing worth noting, rkyv requires buffer with your data to be aligned, going after rkyv book - “16-aligned memory should be sufficient.”, thus if you want to prefix your payload with any metadata, make sure that it doesn’t misalign your buffer, or you can opt-in the <code>unaligned</code> feature.</p>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="beyond-rkyv">Beyond rkyv<a href="https://iggy.apache.org/blogs/2025/05/08/zero-copy-deserialization#beyond-rkyv" class="hash-link" aria-label="Direct link to Beyond rkyv" title="Direct link to Beyond rkyv"></a></h2>
+<p>Rkyv is a pretty “heavy” crate that spreads through your entire application from network schema to disk schema, partially coupling your own versioning with its. <strong>For many applications there is no way around this</strong>, as it is the most complete zero-copy deserialization crate, but we decided to implement a more lightweight solution that gives us control over the memory layout.</p>
+<p>We’ve decided to still process messages individually, but have replaced length prefixes with a separate index vector.</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_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><img decoding="async" loading="lazy" alt="image" src="https://iggy.apache.org/assets/images/iggy_batch_schema_2-c7a5fc6158b838999c178ef8aea96089.png" width="1600" height="720" class="img_ev3q"></p>
+<p>This index vector consists of bytes that, when deserialized form <code>u32</code> values that point to specific positions within the message data. Separating messages from indexes serves purpose beyond the scope of this blog post, but shortly, this index structure closely resembles what we use on the server for message lookup in the log. This in turn, later on <strong>allows us to efficiently reuse memory</strong>.</p>
+<p>When iterating through the batch, <strong>we yield views</strong> instead of fully deserialized messages.</p>
+<p>In case if we’d need to have <code>IggyMessage</code> deserialized, we can do it just in time, rather than eagerly, for example when client processes a fetched batch from the server.</p>
+<p>This approach allows us to combine the flexibility of solution with length prefixes using rkyv as well as having the freedom of not depending on a 3rd party crate, in fact this solution looks fairly similar to serde partial zero copy deserialization.</p>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="benchmarks">Benchmarks<a href="https://iggy.apache.org/blogs/2025/05/08/zero-copy-deserialization#benchmarks" class="hash-link" aria-label="Direct link to Benchmarks" title="Direct link to Benchmarks"></a></h2>
+<p>Now the part that all of you are probably most interested in - le benchmarks.</p>
+<p>Those results come from an <strong>AWS i3en.3xlarge</strong> instance</p>
+<p><strong>Before</strong></p>
+<p><img decoding="async" loading="lazy" alt="image" src="https://iggy.apache.org/assets/images/no_zero_copy_producer-ffed3643f7efa9c5ac43a3ce4cba746c.png" width="3188" height="2264" class="img_ev3q">
+<img decoding="async" loading="lazy" alt="image" src="https://iggy.apache.org/assets/images/no_zero_copy_consumer-ae546079ca662038a43983969c9fa325.png" width="3186" height="2262" class="img_ev3q"></p>
+<table><thead><tr><th style="text-align:left">No zero-copy</th><th style="text-align:center">tput</th><th style="text-align:center">p95</th><th style="text-align:center">p99</th><th style="text-align:center">avg</th></tr></thead><tbody><tr><td style="text-align:left">Producer</td><td style="text-align:center">1.7GB/s</td><td style="text-align:center">3.48ms</td><td style="text-align:center">4.23ms</td><td style="text-align:center">2.39ms</td></tr><tr><td style="text-align:left">Consumer< [...]
+<p><strong>After</strong></p>
+<p><img decoding="async" loading="lazy" alt="image" src="https://iggy.apache.org/assets/images/zero_copy_producer-6cd58f250a711fb170bba9091da38606.png" width="3194" height="2260" class="img_ev3q">
+<img decoding="async" loading="lazy" alt="image" src="https://iggy.apache.org/assets/images/zero_copy_consumer-b0a3206f473d6d13c8cc4fc8dfca3486.png" width="3192" height="2266" class="img_ev3q"></p>
+<table><thead><tr><th style="text-align:left">Zero-copy</th><th style="text-align:center">tput</th><th style="text-align:center">p95</th><th style="text-align:center">p99</th><th style="text-align:center">avg</th></tr></thead><tbody><tr><td style="text-align:left">Producer</td><td style="text-align:center">2.4GB/s</td><td style="text-align:center">2.33ms</td><td style="text-align:center">2.59ms</td><td style="text-align:center">1.63ms</td></tr><tr><td style="text-align:left">Consumer</td [...]
+<p><strong>Almost 2 times higher throughput for reads (2,1GBps vs 4GBps), 40% higher throughput for writes (2,4GBps vs 1,7GBps), 2x better p99 latencies for reads (2.93ms vs 1,46 ms) and 63% better p99 latencies for writes (4.23ms vs 2.59ms).</strong></p>
+<p>You can find more detailed comparisons on our <strong><a href="https://benchmarks.iggy.apache.org/" target="_blank" rel="noopener noreferrer">benchmarking website</a></strong>.</p>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="concluding">Concluding<a href="https://iggy.apache.org/blogs/2025/05/08/zero-copy-deserialization#concluding" class="hash-link" aria-label="Direct link to Concluding" title="Direct link to Concluding"></a></h2>
+<p><strong>It was a lot of fun exploring the entire design space for our zero copy schema</strong>. Depending on the constraints one might end up with a completely different solution, in fact zero copy isn't always the optimal approach, for example, if you'd like to read more about challenges that folks in embedded development have to overcome, check out <strong><a href="https://bsky.app/profile/jamesmunns.com/post/3lnqo5ykawc2r" target="_blank" rel="noopener noreferrer">this Bluesky pos [...]
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="whats-next-for-iggy">What’s next for Iggy<a href="https://iggy.apache.org/blogs/2025/05/08/zero-copy-deserialization#whats-next-for-iggy" class="hash-link" aria-label="Direct link to What’s next for Iggy" title="Direct link to What’s next for Iggy"></a></h2>
+<p>Implementing zero-copy was a major milestone for us, but the train doesn’t slow down. Next in line is <strong>io_uring</strong> and <strong>thread per core shared nothing</strong> architecture. <strong><a href="https://www.reddit.com/r/rust/comments/1d35fsb/comment/l65wgnt/" target="_blank" rel="noopener noreferrer">We’ve already promised</a></strong> that we will publish more details about it once we have the results from our benchmark tests, so expect a highly technical blog post in [...]
+<p>For now <strong><a href="https://github.com/apache/iggy/tree/io_uring_monoio_runtime" target="_blank" rel="noopener noreferrer">we did a proof of concept long time ago</a></strong>, but realised a few things along the way that we would like to do differently. So we will. Iggy moves onward and upward! 🚀</p>]]></content>
+ <author>
+ <name>Grzegorz Koszyk</name>
+ <uri>https://github.com/numinnex</uri>
+ </author>
+ <author>
+ <name>Hubert Gruszecki</name>
+ <uri>https://github.com/hubcio</uri>
+ </author>
+ </entry>
+ <entry>
+ <title type="html"><![CDATA[Transparent Benchmarking with Apache Iggy]]></title>
+ <id>https://iggy.apache.org/blogs/2025/02/17/transparent-benchmarks</id>
+ <link href="https://iggy.apache.org/blogs/2025/02/17/transparent-benchmarks"/>
+ <updated>2025-02-17T00:00:00.000Z</updated>
+ <summary type="html"><![CDATA[Benchmarks should be the first-class citizen]]></summary>
+ <content type="html"><![CDATA[<h2 class="anchor 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/17/transparent-benchmarks#benchmarks-should-be-the-first-class-citizen" class="hash-link" aria-label="Direct link to Benchmarks should be the first-class citizen" title="Direct link to Benchmarks should be the first-class citizen"></a></h2>
+<p>In the world of software development, <strong>benchmarks are often treated as a second-class citizen</strong>. They're more of an addition to the codebase, rather than a crucial part of it, which should be the other way around, especially when it comes to the performance-critical systems or infrastructure tools.</p>
+<p>Sometimes, the benchmarking results are nothing more than just a <strong>cherry-picking of the best-case scenarios</strong>, which are not representative of real-world usage. In such a case, they simply serve a sole purpose of either making the project look better than it is or how well it does outperform the competition, under the extremely optimized conditions when comparing with its counterparts.</p>
+<p><strong>Trying to reproduce the benchmarks is often a nightmare</strong>, as the environment setup is not documented, the code is unavailable, or the instructions are not clear enough. This makes it close to impossible to verify the results, which are then taken for granted.</p>
+<p>Or even worse, the <strong>benchmarking tool might be so complex, that it's hard to understand how it works</strong>, and what are the assumptions behind it. ALl of these, does result in hard to extend or modify the existing benchmarks, which are not covering the particular use case you're interested in. It's just here to tell everyone that we do have benchmarks, but how we do it, and what they measure, is a mystery.</p>
+<p><strong>Which is why at <a href="https://github.com/apache/iggy/" target="_blank" rel="noopener noreferrer">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/17/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.apache.org/" target="_blank" rel="noopener noreferrer">benchmarks.iggy.apache.org</a></strong> - a benchmarking dashboard, which is available to everyone. It's a website where you can see how Iggy performs under the different conditions, and how it scales with the number of clients, messages, and topics.</p>
+<p>This is our community-driven effort, where everyone can contribute, and add their own benchmarks. For all the information on how to run the benchmarks, render them on the dashboard, upload your results or contribute to the project, please check the <a href="https://github.com/iggy-rs/iggy-bench-dashboard" target="_blank" rel="noopener noreferrer">iggy-bench-dashboard</a> repository. In general, it's as simple as:</p>
+<ul>
+<li>Building the <a href="https://github.com/apache/iggy" target="_blank" rel="noopener noreferrer">Iggy</a> in the release mode with <code>cargo build --release</code></li>
+<li>Starting your Iggy server with <code>cargo r --bin iggy-server -r</code> (feel free to adjust the configuration in <code>server.toml</code> or via environment variables)</li>
+<li>Running the <code>iggy-bench</code> tool with the desired parameters, e.g. <code>cargo r --bin iggy-bench -r pinned-producer tcp</code></li>
+<li>Extending your benchmark with the output (HTML charts, JSON sampling etc.) <code>cargo r --bin iggy-bench -r pinned-producer tcp output -o performance_results --identifier spetz</code></li>
+<li>Navigating to the specific benchmark directory to browse the charts and/or uploading them to the dashboard.</li>
+<li>And there's always <code>help</code> command e.g. <code>pinned-producer --help</code> to make your life easier :)</li>
+</ul>
+<p><img decoding="async" loading="lazy" alt="image" src="https://iggy.apache.org/assets/images/iggy_bench_dashboard-20dc5e120f14f0c4618f23227cd08ac9.png" width="2555" height="1327" class="img_ev3q"></p>
+<p><strong>And this is just the beginning</strong>, as we plan to extend the dashboard, and add more benchmarks, which are covering the different use cases.</p>
+<p>Our main goal is to make the benchmarking process (and its results) <strong>transparent, reproducible, and easy to understand</strong>. We want to make them a first-class citizen, and a crucial part of the Iggy project. We want to make them a tool, which will help us to improve the performance, and to make Iggy the best streaming server out there. We're looking forward to your feedback, and we hope you'll enjoy the benchmarks.</p>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="towards-the-microsecond-latency">Towards the microsecond latency<a href="https://iggy.apache.org/blogs/2025/02/17/transparent-benchmarks#towards-the-microsecond-latency" class="hash-link" aria-label="Direct link to Towards the microsecond latency" title="Direct link to Towards the microsecond latency"></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[We are thrilled to announce that Iggy has officially joined the Apache Incubator! This marks a major milestone in our journey to redefine message streaming — one that is blazingly fast, hyper-efficient, and built for the future. Since the very first day, Iggy was always meant to be a truly FOSS project — not just open-source in name, but deeply rooted in the values of transparency, collaboration, and community-driven innovation.]]></summary>
+ <content type="html"><![CDATA[<p>We are thrilled to announce that <strong>Iggy</strong> has officially joined the <strong><a href="https://incubator.apache.org/" target="_blank" rel="noopener noreferrer">Apache Incubator</a></strong>! This marks a major milestone in our journey to redefine message streaming — one that is <strong>blazingly fast, hyper-efficient, and built for the future</strong>. Since the very first day, <strong>Iggy was always meant to be a truly FOSS project</s [...]
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="-a-journey-two-years-in-the-making">🚀 A Journey Two Years in the Making<a href="https://iggy.apache.org/blogs/2025/02/10/apache-incubator#-a-journey-two-years-in-the-making" class="hash-link" aria-label="Direct link to 🚀 A Journey Two Years in the Making" title="Direct link to 🚀 A Journey Two Years in the Making"></a></h2>
+<p>It’s been almost two years since the very first line of code was written, and we’ve come a long way since the initial release. What started as a bold idea has grown into a high-performance, cost-efficient message streaming solution with a thriving community of contributors, users, and advocates. We’ve received invaluable feedback, contributions, and support, and we’re more excited than ever to take Iggy to the next level.</p>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="-beyond-just-iggy--a-growing-ecosystem">🔥 Beyond Just Iggy – A Growing Ecosystem<a href="https://iggy.apache.org/blogs/2025/02/10/apache-incubator#-beyond-just-iggy--a-growing-ecosystem" class="hash-link" aria-label="Direct link to 🔥 Beyond Just Iggy – A Growing Ecosystem" title="Direct link to 🔥 Beyond Just Iggy – A Growing Ecosystem"></a></h2>
+<p>Iggy is no longer just about the core repository. Over time, we’ve built an entire ecosystem around it, including:</p>
+<ul>
+<li>✅ SDKs for seamless developer integrations</li>
+<li>✅ CLIs for powerful command-line control</li>
+<li>✅ Web UIs for intuitive management</li>
+<li>✅ And many more…</li>
+</ul>
+<p>We’re already approaching 20 repositories under the Iggy organization (<a href="https://github.com/iggy-rs/" target="_blank" rel="noopener noreferrer">see them here</a>), and as we enter the Apache Incubator, we are committed to ensuring that all of them follow ASF guidelines while maintaining our core values of speed, efficiency, and simplicity.</p>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="-why-apache">🔗 Why Apache?<a href="https://iggy.apache.org/blogs/2025/02/10/apache-incubator#-why-apache" class="hash-link" aria-label="Direct link to 🔗 Why Apache?" title="Direct link to 🔗 Why Apache?"></a></h2>
+<p>The Apache Software Foundation has nurtured some of the <strong>most transformative open-source projects in history</strong> — Hadoop, Spark, Lucene, Solr, Cassandra, Kafka, Flink, and Airflow — technologies that have <strong>shaped big data, search, and real-time processing</strong>. By joining Apache Incubator, we align with this legacy and <strong>gain access to a larger community, better governance, and long-term sustainability</strong>.</p>
+<p>🔗 Dive into the Apache Incubator Details</p>
+<ul>
+<li><a href="https://cwiki.apache.org/confluence/display/INCUBATOR/Iggy+Proposal" target="_blank" rel="noopener noreferrer">Official Proposal</a></li>
+<li><a href="https://lists.apache.org/thread/q9whr3q9qd6wqm89f0vc1f6vkkvzc8xf" target="_blank" rel="noopener noreferrer">Discussion Thread</a></li>
+<li><a href="https://lists.apache.org/thread/6zfgdjwrzs92h4z4x6b25v1r23g3f5yg" target="_blank" rel="noopener noreferrer">Voting Results</a></li>
+</ul>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="-whats-next">📈 What’s Next?<a href="https://iggy.apache.org/blogs/2025/02/10/apache-incubator#-whats-next" class="hash-link" aria-label="Direct link to 📈 What’s Next?" title="Direct link to 📈 What’s Next?"></a></h2>
+<p><strong>Our vision is clear: Iggy as a future Apache Top-Level Project (TLP)</strong>. We already have ambitious ideas on how to improve both the project and the community around it:</p>
+<ul>
+<li><strong>Scaling performance benchmarks</strong> to push the limits of ultra-low-latency streaming</li>
+<li><strong>Expanding integrations</strong> with modern data infrastructure</li>
+<li><strong>Building a vibrant developer ecosystem</strong> that makes message streaming frictionless</li>
+</ul>
+<h2 class="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>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="-join-the-movement">💡 Join the Movement<a href="https://iggy.apache.org/blogs/2025/02/10/apache-incubator#-join-the-movement" class="hash-link" aria-label="Direct link to 💡 Join the Movement" title="Direct link to 💡 Join the Movement"></a></h2>
+<p>If you believe in a future where message streaming is lightning-fast, hyper-efficient, and accessible to all, we invite you to be part of this journey. Whether you're a developer, architect, or enterprise innovator, your contributions, feedback, and ideas will shape what comes next.</p>
+<p>And this is just the beginning. <strong>Welcome to the era of Hyper-Efficient Message Streaming at Laser Speed.</strong></p>
+<p><strong>Last but not least, we've got a new logo</strong>! Our lovely Italian Greyhound is now a part of the Apache family, and we're proud to have it as our mascot. As you can see, it's so fast, that even the light travelling through the optical fiber can't keep up with it :)</p>
+<p><img decoding="async" loading="lazy" alt="image" src="https://iggy.apache.org/assets/images/iggy_logo-f0e83b91b22303a5545dfb6d49756d18.png" width="1800" height="1000" class="img_ev3q"></p>
+<p>👉 Follow us, contribute, and help to build the future of the message streaming!</p>
+<ul>
+<li><a href="https://discord.gg/C5Sux5NcRa" target="_blank" rel="noopener noreferrer">Discord</a></li>
+<li><a href="https://x.com/ApacheIggy" target="_blank" rel="noopener noreferrer">X (Twitter)</a></li>
+<li><a href="https://bsky.app/profile/iggy.rs" target="_blank" rel="noopener noreferrer">Bluesky</a></li>
+<li><a href="https://www.linkedin.com/company/apache-iggy/" target="_blank" rel="noopener noreferrer">LinkedIn</a></li>
+</ul>]]></content>
+ <author>
+ <name>Piotr Gankiewicz</name>
+ <uri>https://github.com/spetz</uri>
+ </author>
+ </entry>
+ <entry>
+ <title type="html"><![CDATA[Iggy.rs - Technology Radar & current goals]]></title>
+ <id>https://iggy.apache.org/blogs/2024/10/28/technology-radar-and-currrent-goals</id>
+ <link href="https://iggy.apache.org/blogs/2024/10/28/technology-radar-and-currrent-goals"/>
+ <updated>2024-10-28T00:00:00.000Z</updated>
+ <summary type="html"><![CDATA[Technology Radar]]></summary>
+ <content type="html"><![CDATA[<h2 class="anchor 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/apache/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 & 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 & understanding how they might affect your enterprise. Frankly speaking, we weren't expecting this at all, and <strong>from our perspective, it's quite of an accomplishment</strong>.</p>
+<p>Besides gaining an additional amount of trust & recognition, it has led us to another conclusion - someone out there we don't know yet about (maybe even one of their customers) is using/experimenting with Iggy :)</p>
+<p>And if you are (or will be) one of such persons, please hop onto our <a href="https://discord.gg/C5Sux5NcRa" 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 & 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 & 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/apache/iggy/pull/1053" target="_blank" rel="noopener noreferrer">implement</a> an optional archiver for the server state log & streaming data (messages etc.) which supports any S3 compatible storage (just pick up your favorite cloud provider). The configuration is as simple as this example:</p>
+<div class="language-toml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_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 & 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/apache/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 & traces for the server. Since our SDK already uses the logging & tracing libraries, we thought that adding such a feature on the server, could help you gain even better, real-time observability into what's happening und [...]
+<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://discord.gg/C5Sux5NcRa" 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 & server in order to get full understanding of the distributed systems and its dependencies, which could be further visualized b [...]
+<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 & 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 & 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://discord.gg/C5Sux5NcRa" 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/apache/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 & 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 server, create new topics, validate if the messages are being sent correctly, change the user permissions or check the node statistics?</p>
+<p>This is where our <strong><a href="https://github.com/apache/iggy/tree/master/core/cli" target="_blank" rel="noopener noreferrer">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/apache/iggy/tree/master/core/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/apache/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 & replication<a href="https://iggy.apache.org/blogs/2024/05/29/one-year-of-building-the-message-streaming#clustering--replication" class="hash-link" aria-label="Direct link to Clustering & replication" title="Direct link to Clustering & replication"></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 & thread-per-core + share-nothing<a href="https://iggy.apache.org/blogs/2024/05/29/one-year-of-building-the-message-streaming#io_uring--thread-per-core--share-nothing" class="hash-link" aria-label="Direct link to io_uring & thread-per-core + share-nothing" title="Direct link to io_uring & thread-per-core + share-nothing"></a></h2>
+<p>What is a message streaming server, besides some more-or-less complicated logic regarding topics, partitioning, message ordering, consumer groups and a few more features? In its very core, <strong>it's mostly I/O (disk + networking)</strong> — the more efficient you can make it, the greater it will be. Of course, there's a major difference between throughput and latency, especially when talking about the so-called tail latency (p99 and more). Wouldn't it be great if we could have a ve [...]
+<p>However, due to the nature of tasks being shared across the different threads, <strong>you can't simply avoid lots of context switches and data being shared & synchronized across these threads</strong> (therefore even more context switches will occur). While it's probably not an issue for like 90% or maybe even 99% use-cases, there might be some (financial systems and similar), where an unpredictable tail latency is a total no-go.</p>
+<p>Certainly, there are already existing solutions dealing with such challenges, such as <a href="https://aeron.io/" target="_blank" rel="noopener noreferrer">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<></code> and <code>RwLock<></code>?</li>
+<li>Should we load into memory the same server metadata across all the threads (separately from each other) and notify all of them when something changes?</li>
+<li>Should there be single or multiple threads handling the incoming TCP connections?</li>
+<li>When <code>Thread #1</code> receives the request, which has to access the partition from <code>Thread #2</code>, should we use an async two-way channel (remember, no explicit locking and data synchronization between the threads) or maybe just send the descriptor using a one-way channel to the second thread to complete the request?</li>
+<li>What and when could become a bottleneck in such architecture?</li>
+</ul>
+<p>This is just the tip of an iceberg, and we've already started <a href="https://penberg.org/papers/tpc-ancs19.pdf" 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://discord.gg/C5Sux5NcRa" 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/apache/iggy/tree/master/core/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 & 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 ev [...]
+<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/apache/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/apache/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 additional challenges to overcome:</p>
+<p><strong>Clustering</strong> - the possibility of having a <strong>highly available and fault tolerant</strong> distributed message streaming platform in a production environment, is typically one of the most important aspects when considering the particular tool. While it wouldn't be too difficult to implement the extension (think of a simple proxy/load balancer), allowing to monitor and deliver the data either to the primary or secondary replica (treated as a fallback server) and swi [...]
+<p><img decoding="async" loading="lazy" alt="image" src="https://iggy.apache.org/assets/images/leader_elections-f973c06ac3c6b230945e496faa6f314e.jpeg" width="4058" height="2316" class="img_ev3q"></p>
+<p><strong>Low-level I/O</strong> - although the current results (based on the benchmarking tool measuring the throughput etc.) are satisfying, we strongly believe that there's still (potentially a huge) room for improvement. We're planning to use <strong><a href="https://unixism.net/loti/what_is_io_uring.html" target="_blank" rel="noopener noreferrer">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://discord.gg/C5Sux5NcRa" 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://discord.gg/C5Sux5NcRa" 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/apache/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/apache/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 -> N clients).</p>
+<p>This breaking change has been introduced with the commit <a href="https://github.com/apache/iggy/commit/23b330928aa38463ef907c95a9f672fa7b728881" target="_blank" rel="noopener noreferrer">#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/apache/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<Message></code> as a response, which has been changed to <code>PolledMessages</code> struct, that contains the <code>partition_id</code>, <code>current_offset</code> and <code>messages</code> field. The reason for this change was to provide more information about the current offset, and the partition from which the messages have been fetched - this might be especially useful when using the consumer groups feature [...]
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_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/apache/iggy/commit/ea3bf9c16dd5f93e1c80c140e9e1d14cfa70f570" target="_blank" rel="noopener noreferrer">#ea3bf9c</a>. The available <a href="https://crates.io/crates/iggy" target="_bla [...]
+<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/apache/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" re [...]
+<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 available to be consumed by the client.</p>
+<p>However, the state might have a different value, for example <code>marked_for_deletion</code> (to be used by the upcoming retention policy feature), <code>poisoned</code> (to be used by the upcoming dead-letter queue feature) etc. In the future releases, the server will also provide a way to change the state of the message (for example to mark it as <code>poisoned</code> by the client), as well as filtering the messages by the state.</p>
+<h2 class="anchor 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/apache/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/apache/iggy/commit/7c73bd3d9d59fb685cbaaca5901dec6cac43ddaf" target="_blank" rel="noopener noreferrer">#7c73bd3</a> - up until this point, the existing i [...]
+<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/apache/iggy/tree/master/core/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<u8></code> value. The <code>HeaderKind</code> enum defines the type of the value, which can be ei [...]
+<p>The primitive types are defined as the enum variants, so you can easily match on them. The <code>HeaderKind</code> enum is used to validate the value and to serialize/deserialize it. The idea is that the value will always remain a byte array, but you can use the <code>HeaderKind</code> to convert it to the desired type.</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_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/atom.xsl b/blogs/atom.xsl
new file mode 100644
index 000000000..271895cf7
--- /dev/null
+++ b/blogs/atom.xsl
@@ -0,0 +1,92 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<xsl:stylesheet
+ version="3.0"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:atom="http://www.w3.org/2005/Atom">
+ <xsl:output method="html" version="1.0" encoding="UTF-8" indent="yes" />
+
+ <xsl:template match="/">
+ <html xmlns="http://www.w3.org/1999/xhtml" lang="en">
+ <head>
+ <title>Atom Feed | <xsl:value-of
+ select="atom:feed/atom:title"
+ /></title>
+ <link rel="stylesheet" href="atom.css" />
+ </head>
+ <body>
+ <main>
+ <div class="description">
+ <div class="info">
+ <strong>This is an Atom feed</strong>. Subscribe by copying the URL
+ from the address bar into your newsreader. Visit
+ <a href="https://aboutfeeds.com/">About Feeds</a> to learn more
+ and get started. It’s free.
+ </div>
+ <h1>
+ <div class="rss-icon">
+ <svg
+ version="1.1"
+ id="Capa_1"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ viewBox="0 0 455.731 455.731"
+ xml:space="preserve">
+ <g>
+ <rect
+ x="0"
+ y="0"
+ style="fill: #f78422"
+ width="455.731"
+ height="455.731"
+ />
+ <g>
+ <path
+ style="fill: #ffffff"
+ d="M296.208,159.16C234.445,97.397,152.266,63.382,64.81,63.382v64.348
+ c70.268,0,136.288,27.321,185.898,76.931c49.609,49.61,76.931,115.63,76.931,185.898h64.348
+ C391.986,303.103,357.971,220.923,296.208,159.16z"
+ />
+ <path
+ style="fill: #ffffff"
+ d="M64.143,172.273v64.348c84.881,0,153.938,69.056,153.938,153.939h64.348
+ C282.429,270.196,184.507,172.273,64.143,172.273z"
+ />
+ <circle
+ style="fill: #ffffff"
+ cx="109.833"
+ cy="346.26"
+ r="46.088"
+ />
+ </g>
+ </g>
+ </svg>
+ </div>
+ <xsl:value-of select="atom:feed/atom:title" />
+ </h1>
+ <p class="blog-description">
+ <xsl:value-of select="atom:feed/atom:subtitle" />
+ </p>
+ </div>
+ <h2>Recent Posts</h2>
+ <div class="blog-posts">
+ <xsl:for-each select="atom:feed/atom:entry">
+ <div class="blog-post">
+ <h3><a href="{atom:link[@rel='alternate']/@href}"><xsl:value-of
+ select="atom:title"
+ /></a></h3>
+ <div class="blog-post-date">
+ Published on <xsl:value-of
+ select="substring(atom:updated,0,11)"
+ />
+ </div>
+ <div class="blog-post-description">
+ <xsl:value-of select="atom:summary" />
+ </div>
+ </div>
+ </xsl:for-each>
+ </div>
+ </main>
+ </body>
+ </html>
+ </xsl:template>
+</xsl:stylesheet>
diff --git a/blogs/consumer-identifier/index.html b/blogs/consumer-identifier/index.html
new file mode 100644
index 000000000..ec3d77c70
--- /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.00ae354b.css">
+<script src="/assets/js/runtime~main.abd83413.js" defer="defer"></script>
+<script src="/assets/js/main.e9fd05f4.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/apache/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><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/blogs/iggy-0-1-0-release/index.html b/blogs/iggy-0-1-0-release/index.html
new file mode 100644
index 000000000..480094d1f
--- /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.00ae354b.css">
+<script src="/assets/js/runtime~main.abd83413.js" defer="defer"></script>
+<script src="/assets/js/main.e9fd05f4.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've put a lot of offert into making our CI/CD pipeline as robust as possible, and we are happy with the results.</p>
+<p><img decoding="async" loading="lazy" alt="CI" src="/assets/images/iggy_ci_0_1_0-b31e9445de207c06bd2eee74dafac357.jpeg" width="3598" height="1248" class="img_ev3q"></p>
+<p>On top of it, the built-in benchmarking application has been significantly improved and now has its own CLI tool, which makes it easier to use.</p>
+<p><img decoding="async" loading="lazy" alt="Bench" src="/assets/images/iggy_bench_0_1_0-afcc4cf7770ab3863afbdd2a7871492b.jpeg" width="4068" height="2138" class="img_ev3q"></p>
+<p>Additionally, we've also a great <strong>CLI</strong> being actively developed, which purpose is to allow the users to interact with the server using the command line.</p>
+<p><img decoding="async" loading="lazy" alt="CLI" src="/assets/images/iggy_cli_0_1_0-aa8dbc85bd46875427ae87e133ec8482.jpeg" width="2942" height="2164" class="img_ev3q"></p>
+<p>And then there's a modern, responsive, and fast <strong>Web UI</strong>, which provides a way to interact with the server using the browser.</p>
+<p><img decoding="async" loading="lazy" alt="Web UI" src="/assets/images/iggy_web_ui_0_1_0-58fc54e40a2756eba04dec9206de70a5.jpeg" width="4060" height="2408" class="img_ev3q"></p>
+<p>While Rust <strong>SDK</strong> is the most mature one, and the C# is a close second, the remaining ones for Java, Go, Python, and NodeJS are catching up. It's not an easy task to keep all of them in sync, but we are doing our best to make sure that the SDKs are up-to-date with the latest changes in the server.</p>
+<p>Last but not least, we are <strong>extremely grateful to the community</strong>, which is growing every day. We are getting more and more feedback, and we are doing our best to address all the issues and feature requests. We are also getting more and more contributions, which is a great sign that the project is going in the right direction.</p>
+<p>Come and join our <a href="https://discord.gg/C5Sux5NcRa" 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">rele [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/blogs/index.html b/blogs/index.html
new file mode 100644
index 000000000..9a2762a8c
--- /dev/null
+++ b/blogs/index.html
@@ -0,0 +1,26 @@
+<!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.00ae354b.css">
+<script src="/assets/js/runtime~main.abd83413.js" defer="defer"></script>
+<script src="/assets/js/main.e9fd05f4.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 message streaming, connectors quite often play a crucial role in facilitating data exchange between different systems. While Apache Iggy remains the core messaging infrastructure, <strong>focusing on extreme efficiency</strong> (high throughput, low latency, and minimal resource consumption), it could also benefit from a more extensible architecture. This is where connectors come into play.</p></div><footer class="row docusaurus-mt-lg"><div class="col text--right"><a a [...]
+<p>Apache Iggy considers <strong>performance as one of its core principles</strong>. We take pride in being blazingly fast, as proof of that, we have made <strong><a href="https://iggy.apache.org/blogs/2025/02/17/transparent-benchmarks" target="_blank" rel="noopener noreferrer">benchmarking first-class citizen</a></strong>.</p>
+<p><strong>Zero-copy schema</strong> was a natural next step in our high-performance journey, it was part of our roadmap for quite a while, until the day we have <strong><a href="https://github.com/apache/iggy/pull/1679" target="_blank" rel="noopener noreferrer">finally merged it</a></strong>. In this blog post, we will share our path to implementing it.</p></div><footer class="row docusaurus-mt-lg"><div class="col text--right"><a aria-label="Read more about Zero-copy (de)serialization" [...]
+<p>In the world of software development, <strong>benchmarks are often treated as a second-class citizen</strong>. They're more of an addition to the codebase, rather than a crucial part of it, which should be the other way around, especially when it comes to the performance-critical systems or infrastructure tools.</p></div><footer class="row docusaurus-mt-lg"><div class="col text--right"><a aria-label="Read more about Transparent Benchmarking with Apache Iggy" href="/blogs/2025/02/ [...]
+<p>Quite recently (a few days ago), <a href="https://github.com/apache/iggy" target="_blank" rel="noopener noreferrer">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 & explore in your IT projects. Everything is split into the different categories, depending on the maturity or popularity of the particular tool.</p></div><footer class="row docusaurus-mt-lg"><div class="col text--right"><a ari [...]
+<p><strong>It's been a little over a year</strong>, since the <a href="https://iggy.rs" target="_blank" rel="noopener noreferrer">Iggy.rs</a> was born. The initial idea of building a side project (as a way of studying Rust) — an infrastructure for the message streaming (think of Kafka, RedPanda, Aeron etc.) — eventually turned out to be something much bigger that I could've ever imagined. In the <a href="https://blog.iggy.rs/posts/building-message-streaming-in-rust/" target="_b [...]
+<p>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 usi [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/blogs/message-expiry/index.html b/blogs/message-expiry/index.html
new file mode 100644
index 000000000..e33bde260
--- /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.00ae354b.css">
+<script src="/assets/js/runtime~main.abd83413.js" defer="defer"></script>
+<script src="/assets/js/main.e9fd05f4.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/apache/iggy/commit/ea3bf9c16dd5f93e1c80c140e9e1d14cfa70f570" target="_blank" rel="noopener noreferrer">#ea3bf9c</a>. The available <a href="https://crates.io/crates/iggy" target="_bla [...]
+<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'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><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/blogs/message-headers/index.html b/blogs/message-headers/index.html
new file mode 100644
index 000000000..502db40e1
--- /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.00ae354b.css">
+<script src="/assets/js/runtime~main.abd83413.js" defer="defer"></script>
+<script src="/assets/js/main.e9fd05f4.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/apache/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/apache/iggy/commit/7c73bd3d9d59fb685cbaaca5901dec6cac43ddaf" target="_blank" rel="noopener noreferrer">#7c73bd3</a> - up until this point, the existing i [...]
+<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's no limit on the number of headers you can send, but the total size of the headers is currently limited to <strong>100 KB</strong>. The header key is <strong>case-sensitive</strong>, so it's best to send the <strong>lowercase</strong> keys. The maximum length of the key and the value is <strong>255 bytes</strong> (the maximum value of the <code>u8</code> type).</p>
+<p>For now, there are no reserved headers, so you can use any key you want. However, in the future, we might introduce some reserved headers used by the streaming server for the specific purposes such as the message compression, distributed tracing and so no.</p>
+<p>The <strong>sample applications</strong> using the message headers can be found <a href="https://github.com/apache/iggy/tree/master/core/examples/src/message-headers" target="_blank" rel="noopener noreferrer">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<u8></code> value. The <code>HeaderKind</code> enum defines the type of the value, which can be ei [...]
+<p>The primitive types are defined as the enum variants, so you can easily match on them. The <code>HeaderKind</code> enum is used to validate the value and to serialize/deserialize it. The idea is that the value will always remain a byte array, but you can use the <code>HeaderKind</code> to convert it to the desired type.</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_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="#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="#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="#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 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'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="#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><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/blogs/message-state/index.html b/blogs/message-state/index.html
new file mode 100644
index 000000000..6e27985a7
--- /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.00ae354b.css">
+<script src="/assets/js/runtime~main.abd83413.js" defer="defer"></script>
+<script src="/assets/js/main.e9fd05f4.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/apache/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" re [...]
+<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 available to be consumed by the client.</p>
+<p>However, the state might have a different value, for example <code>marked_for_deletion</code> (to be used by the upcoming retention policy feature), <code>poisoned</code> (to be used by the upcoming dead-letter queue feature) etc. In the future releases, the server will also provide a way to change the state of the message (for example to mark it as <code>poisoned</code> by the client), as well as filtering the messages by the state.</p>
+<h2 class="anchor 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's calculated on the server-side when the message is being stored. The client can use the checksum to verify the integrity of the message, and if the checksum doesn't match, the client can req [...]
+<p>The server and the client now <strong>share the same <code>Message</code> struct</strong>, meaning that the same type is being stored on the disk, as well as returned to the client when polling the messages. The motivation behind this approach, was not only to reduce the amount of code, but more importantly to make it easier to implement the extremely important feature being <strong>zero-copy</strong> (copy data from disk directly to the network buffer with bypassing the kernel space) [...]
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_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'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'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></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><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/blogs/page/2/index.html b/blogs/page/2/index.html
new file mode 100644
index 000000000..d2e4eebc0
--- /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.00ae354b.css">
+<script src="/assets/js/runtime~main.abd83413.js" defer="defer"></script>
+<script src="/assets/js/main.e9fd05f4.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><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/blogs/personal-access-tokens/index.html b/blogs/personal-access-tokens/index.html
new file mode 100644
index 000000000..05bd436af
--- /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.00ae354b.css">
+<script src="/assets/js/runtime~main.abd83413.js" defer="defer"></script>
+<script src="/assets/js/main.e9fd05f4.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/apache/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'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="#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><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/blogs/rss.css b/blogs/rss.css
new file mode 100644
index 000000000..d2fc20b27
--- /dev/null
+++ b/blogs/rss.css
@@ -0,0 +1,75 @@
+/**
+ * Copyright (c) Facebook, Inc. and its affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+main {
+ flex: 1 0 auto;
+ width: 100%;
+ margin: 2rem auto;
+ max-width: 800px;
+ /* stylelint-disable-next-line font-family-name-quotes */
+ font-family: system-ui, -apple-system, Segoe UI, Roboto, Ubuntu, Cantarell;
+}
+
+.info {
+ display: block;
+ margin: 2rem 0;
+ padding: 1.6rem 2.4rem;
+ border: 1px solid dodgerblue;
+ border-left-width: 0.5rem;
+ border-radius: 0.4rem;
+ background-color: #edf5ff;
+}
+
+a {
+ color: #005aff;
+ text-decoration: none;
+}
+
+h1 {
+ text-wrap: balance;
+ font-size: 3.4rem;
+ font-weight: 800;
+ margin-bottom: 2rem;
+ display: flex;
+ align-items: center;
+}
+
+h1 .rss-icon {
+ height: 3.2rem;
+ width: 3.2rem;
+ margin-right: 1rem;
+}
+
+h2 {
+ font-size: 2.2rem;
+ font-weight: 700;
+ margin-bottom: 0.2rem;
+}
+
+h3 {
+ font-size: 1.8rem;
+ font-weight: 700;
+ margin-bottom: 0.1rem;
+}
+
+.blog-description {
+ font-size: 1.4rem;
+ margin-bottom: 0.6rem;
+}
+
+.blog-post-date {
+ font-size: 1rem;
+ line-height: 1.4rem;
+ font-style: italic;
+ color: #797b7e;
+}
+
+.blog-post-description {
+ font-size: 1rem;
+ line-height: 1.4rem;
+ color: #434349;
+}
diff --git a/blogs/rss.xml b/blogs/rss.xml
new file mode 100644
index 000000000..a88c56848
--- /dev/null
+++ b/blogs/rss.xml
@@ -0,0 +1,693 @@
+<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="rss.xsl"?>
+<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
+ <channel>
+ <title>Hyper-Efficient Message Streaming at Laser Speed. Blog</title>
+ <link>https://iggy.apache.org/blogs</link>
+ <description>Hyper-Efficient Message Streaming at Laser Speed. Blog</description>
+ <lastBuildDate>Fri, 06 Jun 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[Connectors runtime]]></title>
+ <link>https://iggy.apache.org/blogs/2025/06/06/connectors-runtime</link>
+ <guid>https://iggy.apache.org/blogs/2025/06/06/connectors-runtime</guid>
+ <pubDate>Fri, 06 Jun 2025 00:00:00 GMT</pubDate>
+ <description><![CDATA[Extending Apache Iggy capabilities]]></description>
+ <content:encoded><![CDATA[<h2 class="anchor anchorWithStickyNavbar_LWe7" id="extending-apache-iggy-capabilities">Extending Apache Iggy capabilities<a href="https://iggy.apache.org/blogs/2025/06/06/connectors-runtime#extending-apache-iggy-capabilities" class="hash-link" aria-label="Direct link to Extending Apache Iggy capabilities" title="Direct link to Extending Apache Iggy capabilities"></a></h2>
+<p>In the world of message streaming, connectors quite often play a crucial role in facilitating data exchange between different systems. While Apache Iggy remains the core messaging infrastructure, <strong>focusing on extreme efficiency</strong> (high throughput, low latency, and minimal resource consumption), it could also benefit from a more extensible architecture. This is where connectors come into play.</p>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-are-the-connectors">What are the connectors<a href="https://iggy.apache.org/blogs/2025/06/06/connectors-runtime#what-are-the-connectors" class="hash-link" aria-label="Direct link to What are the connectors" title="Direct link to What are the connectors"></a></h2>
+<p>If you've ever used e.g. Apache Kafka or one of the Kafka-compatible solutions, such as Redpanda, you might've already encountered the concept of connectors. For example, there's a dedicated <a href="https://kafka.apache.org/documentation/#connectapi" target="_blank" rel="noopener noreferrer">Connect API</a> allowing you to create the custom connectors (plugins) for various data sources.</p>
+<p>Typically, connectors are designed to handle data ingestion and transformation tasks. They can be used to read data from external sources, transform it, and then write it to the message streaming system (<strong>sources</strong>), or the other way around (<strong>sinks</strong>) - fetch data from the message streaming system and write it to external services (e.g. databases, file systems, etc.).</p>
+<p>Let's say that we would like to get the real-time changes from a database (Postgres CDC for example) and send them to Apache Iggy, while performing some optional data transformation, such as filtering or enriching the data. Or, we might want to fetch data from Apache Iggy (e.g. produced by our custom services), transform it, and then push it further to the external indexer such as Elastic or Quickwit.</p>
+<p><strong>Instead of building all these pipelines from scratch as custom applications, we can leverage the power of connectors to simplify the process</strong>. Simply download one of the existing plugins, configure it using the provided configuration files, and start using it - no need to write any code!</p>
+<p>Here's an example of a configuration file for the sink connector named <code>stdout</code>:</p>
+<div class="language-toml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_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"># Required configuration for a sink connector</span><br></span><span class="token-line" sty [...]
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="rust-based-plugins">Rust-based plugins<a href="https://iggy.apache.org/blogs/2025/06/06/connectors-runtime#rust-based-plugins" class="hash-link" aria-label="Direct link to Rust-based plugins" title="Direct link to Rust-based plugins"></a></h2>
+<p>Since Apache Iggy is implemented in Rust, it was an easy choice to implement the connectors in Rust as well. <strong>This allows us to take advantage of the Rust's powerful type system and memory safety features</strong>, ensuring that the connectors are reliable and efficient. Internally, we use <strong><a href="https://github.com/OpenByteDev/dlopen2" target="_blank" rel="noopener noreferrer">dlopen2</a></strong> library to load the plugins during the runtime initialization - feel fr [...]
+<p>Thanks to this approach, just like Iggy itself, the connector runtime (which is a separate process), is very lightweight and easy to deploy. <strong>The runtime uses just a few MBs of memory on its own, while consuming minimal CPU resources.</strong> Behind the scenes, we use the shared <strong><a href="https://tokio.rs/" target="_blank" rel="noopener noreferrer">Tokio runtime</a></strong> to manage the asynchronous tasks and events across all connectors, as well as the <strong><a hre [...]
+<p>When running a simple benchmark based on the custom <strong><a href="https://github.com/apache/iggy/tree/master/core/connectors/sinks/quickwit_sink" target="_blank" rel="noopener noreferrer">Quickwit sink</a></strong> connector, which pulls the data in real time from Iggy stream, does a basic data transformation (using the JSON payload format), and then pushes the data further to the Quickwit HTTP API, we observed that this plugin <strong>can easily handle hundreds of thousands of mes [...]
+<p>Last, but not least, It's quite easy to create your own connectors - simply implement either <code>Sink</code> or <code>Source</code> trait, compile the library and configure it in the runtime. Please check the <strong><a href="https://github.com/apache/iggy/tree/master/core/connectors/" target="_blank" rel="noopener noreferrer">repository</a></strong> or the <strong><a href="https://iggy.apache.org/docs/connectors/introduction">documentation</a></strong> for more details.</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_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 attribute attr-name" style="color:#00a4db">#[async_trait]</span><span class="token plain"></span>< [...]
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_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 attribute attr-name" style="color:#00a4db">#[async_trait]</span><span class="token plain"></span>< [...]
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="whats-next">What's next?<a href="https://iggy.apache.org/blogs/2025/06/06/connectors-runtime#whats-next" class="hash-link" aria-label="Direct link to What's next?" title="Direct link to What's next?"></a></h2>
+<p>Since it's the very early release to showcase what's possible with the connector runtime, we plan to focus on improving the performance and stability of the runtime itself.</p>
+<p>Moreover, we plan to build more connectors, data transformations and schema encoders/decoders, to support the seamless transition between the different data formats and protocols.</p>
+<p>It's also worth mentioning that the runtime uses one of the existing network protocols available via Rust SDK to connect to the Iggy server (so-called distributed mode). And while it might be the case for most of the deployments out there, we might also support e.g. UDS or some sort of IPC to allow the connectors deployment on the same machine, next to the streaming server.</p>
+<p>Finally, we would love to hear your feedback and suggestions on how to improve the runtime and connectors. Please feel free to open an <strong><a href="https://github.com/apache/iggy/issues" target="_blank" rel="noopener noreferrer">issue</a></strong>, <strong><a href="https://github.com/apache/iggy/pulls" target="_blank" rel="noopener noreferrer">pull request</a></strong> or start a <strong><a href="https://github.com/apache/iggy/discussions" target="_blank" rel="noopener noreferrer" [...]
+<p>As always, you are more than welcome to join our <strong><a href="https://discord.gg/C5Sux5NcRa" target="_blank" rel="noopener noreferrer">Discord community</a></strong>!</p>]]></content:encoded>
+ </item>
+ <item>
+ <title><![CDATA[Zero-copy (de)serialization]]></title>
+ <link>https://iggy.apache.org/blogs/2025/05/08/zero-copy-deserialization</link>
+ <guid>https://iggy.apache.org/blogs/2025/05/08/zero-copy-deserialization</guid>
+ <pubDate>Thu, 08 May 2025 00:00:00 GMT</pubDate>
+ <description><![CDATA[Introduction]]></description>
+ <content:encoded><![CDATA[<h2 class="anchor anchorWithStickyNavbar_LWe7" id="introduction">Introduction<a href="https://iggy.apache.org/blogs/2025/05/08/zero-copy-deserialization#introduction" class="hash-link" aria-label="Direct link to Introduction" title="Direct link to Introduction"></a></h2>
+<p>Apache Iggy considers <strong>performance as one of its core principles</strong>. We take pride in being blazingly fast, as proof of that, we have made <strong><a href="https://iggy.apache.org/blogs/2025/02/17/transparent-benchmarks" target="_blank" rel="noopener noreferrer">benchmarking first-class citizen</a></strong>.</p>
+<p><strong>Zero-copy schema</strong> was a natural next step in our high-performance journey, it was part of our roadmap for quite a while, until the day we have <strong><a href="https://github.com/apache/iggy/pull/1679" target="_blank" rel="noopener noreferrer">finally merged it</a></strong>. In this blog post, we will share our path to implementing it.</p>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="zero-copy-with-rkyv">Zero copy with rkyv<a href="https://iggy.apache.org/blogs/2025/05/08/zero-copy-deserialization#zero-copy-with-rkyv" class="hash-link" aria-label="Direct link to Zero copy with rkyv" title="Direct link to Zero copy with rkyv"></a></h2>
+<p>Our initial approach to zero copy was leveraging the existing <strong><a href="https://github.com/rkyv/rkyv" target="_blank" rel="noopener noreferrer">rkyv</a></strong> package which might or might not have been the best choice (more about it later). Using rkyv is pretty straightforward, as it revolves around three traits (<code>Archive</code>, <code>Serialize</code>, <code>Deserialize</code>), all three of which can be derived using derive macros, thus making our job pretty easy.</p>
+<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 attribute attr-name" style="color:#00a4db">#[derive(Archive, Deserialize, Serialize)]</span><span [...]
+<p>Same traits are derived for <code>IggyMessage</code></p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_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 attribute attr-name" style="color:#00a4db">#[derive(Archive, Deserialize, Serialize)]</span><span [...]
+<p>Rkyv internally figures out the memory layout used for serialization, such that it can later on cast it back into its Archived form. (A couple bits of trivia: rkyv, when performing zero copy deserialization, turns the byte representation of your data into its Archived form, so instead of <code>IggyBatch</code> we receive <code>ArchivedIggyBatch</code>, rkyv has to reimplement certain complex types such as <code>Vec</code>, <code>HashMap</code> etc., and that’s why it yields back your [...]
+You can learn more about it by reading the <strong><a href="https://rkyv.org/" target="_blank" rel="noopener noreferrer">rkyv book</a></strong>, or from this <strong><a href="https://www.youtube.com/watch?v=ON4z2LbTD-4" target="_blank" rel="noopener noreferrer">presentation</a></strong>.</p>
+<p>After a further evaluation of <code>IggyBatch</code>, we found that while it was good enough, there was still room for improvement.
+Imagine a scenario where the client sends a batch with 100 messages, the server receives it, turns it into Archived form, updates metadata fields, caches/persists it and sends an ack back to the client. The client sends a fetch request for 10 messages, the server receives the request, peeks into the cache, finds our batch of 100 messages and here is the tricky bit -
+We would like to send back <strong>only a slice of the cached data</strong> (10 messages instead of 100), but due to rkyv's memory layout, one cannot simply take a slice of those bytes and perform the transformation into its Archived form.</p>
+<p>So rather than deriving rkyv's traits to <code>IggyBatch</code>, we decided to refine our approach by working at the individual message level.</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_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">struct</span><span class="token plain"> </span><span class="token t [...]
+<p>We redesigned the IggyBatch structure so that the <code>messages</code> field now stores a byte representation of <code>Vec<IggyMessage></code>, with each message prefixed by its 4-byte length. This approach allows us to traverse through the data, cast individual messages to its archived form, and perform some work on it.</p>
+<p><img decoding="async" loading="lazy" alt="image" src="https://iggy.apache.org/assets/images/iggy_batch_schema_1-61b4d896b850e3d0ee08270f7db7c6b5.png" width="1600" height="664" class="img_ev3q"></p>
+<p>By creating this frankenstein layout that combines length prefixes with rkyv's memory layout, we've achieved the flexibility that we were aiming for, optimized for the most costly copies (messages), rather than the entire batch including its header.</p>
+<p>One thing worth noting, rkyv requires buffer with your data to be aligned, going after rkyv book - “16-aligned memory should be sufficient.”, thus if you want to prefix your payload with any metadata, make sure that it doesn’t misalign your buffer, or you can opt-in the <code>unaligned</code> feature.</p>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="beyond-rkyv">Beyond rkyv<a href="https://iggy.apache.org/blogs/2025/05/08/zero-copy-deserialization#beyond-rkyv" class="hash-link" aria-label="Direct link to Beyond rkyv" title="Direct link to Beyond rkyv"></a></h2>
+<p>Rkyv is a pretty “heavy” crate that spreads through your entire application from network schema to disk schema, partially coupling your own versioning with its. <strong>For many applications there is no way around this</strong>, as it is the most complete zero-copy deserialization crate, but we decided to implement a more lightweight solution that gives us control over the memory layout.</p>
+<p>We’ve decided to still process messages individually, but have replaced length prefixes with a separate index vector.</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_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><img decoding="async" loading="lazy" alt="image" src="https://iggy.apache.org/assets/images/iggy_batch_schema_2-c7a5fc6158b838999c178ef8aea96089.png" width="1600" height="720" class="img_ev3q"></p>
+<p>This index vector consists of bytes that, when deserialized form <code>u32</code> values that point to specific positions within the message data. Separating messages from indexes serves purpose beyond the scope of this blog post, but shortly, this index structure closely resembles what we use on the server for message lookup in the log. This in turn, later on <strong>allows us to efficiently reuse memory</strong>.</p>
+<p>When iterating through the batch, <strong>we yield views</strong> instead of fully deserialized messages.</p>
+<p>In case if we’d need to have <code>IggyMessage</code> deserialized, we can do it just in time, rather than eagerly, for example when client processes a fetched batch from the server.</p>
+<p>This approach allows us to combine the flexibility of solution with length prefixes using rkyv as well as having the freedom of not depending on a 3rd party crate, in fact this solution looks fairly similar to serde partial zero copy deserialization.</p>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="benchmarks">Benchmarks<a href="https://iggy.apache.org/blogs/2025/05/08/zero-copy-deserialization#benchmarks" class="hash-link" aria-label="Direct link to Benchmarks" title="Direct link to Benchmarks"></a></h2>
+<p>Now the part that all of you are probably most interested in - le benchmarks.</p>
+<p>Those results come from an <strong>AWS i3en.3xlarge</strong> instance</p>
+<p><strong>Before</strong></p>
+<p><img decoding="async" loading="lazy" alt="image" src="https://iggy.apache.org/assets/images/no_zero_copy_producer-ffed3643f7efa9c5ac43a3ce4cba746c.png" width="3188" height="2264" class="img_ev3q">
+<img decoding="async" loading="lazy" alt="image" src="https://iggy.apache.org/assets/images/no_zero_copy_consumer-ae546079ca662038a43983969c9fa325.png" width="3186" height="2262" class="img_ev3q"></p>
+<table><thead><tr><th style="text-align:left">No zero-copy</th><th style="text-align:center">tput</th><th style="text-align:center">p95</th><th style="text-align:center">p99</th><th style="text-align:center">avg</th></tr></thead><tbody><tr><td style="text-align:left">Producer</td><td style="text-align:center">1.7GB/s</td><td style="text-align:center">3.48ms</td><td style="text-align:center">4.23ms</td><td style="text-align:center">2.39ms</td></tr><tr><td style="text-align:left">Consumer< [...]
+<p><strong>After</strong></p>
+<p><img decoding="async" loading="lazy" alt="image" src="https://iggy.apache.org/assets/images/zero_copy_producer-6cd58f250a711fb170bba9091da38606.png" width="3194" height="2260" class="img_ev3q">
+<img decoding="async" loading="lazy" alt="image" src="https://iggy.apache.org/assets/images/zero_copy_consumer-b0a3206f473d6d13c8cc4fc8dfca3486.png" width="3192" height="2266" class="img_ev3q"></p>
+<table><thead><tr><th style="text-align:left">Zero-copy</th><th style="text-align:center">tput</th><th style="text-align:center">p95</th><th style="text-align:center">p99</th><th style="text-align:center">avg</th></tr></thead><tbody><tr><td style="text-align:left">Producer</td><td style="text-align:center">2.4GB/s</td><td style="text-align:center">2.33ms</td><td style="text-align:center">2.59ms</td><td style="text-align:center">1.63ms</td></tr><tr><td style="text-align:left">Consumer</td [...]
+<p><strong>Almost 2 times higher throughput for reads (2,1GBps vs 4GBps), 40% higher throughput for writes (2,4GBps vs 1,7GBps), 2x better p99 latencies for reads (2.93ms vs 1,46 ms) and 63% better p99 latencies for writes (4.23ms vs 2.59ms).</strong></p>
+<p>You can find more detailed comparisons on our <strong><a href="https://benchmarks.iggy.apache.org/" target="_blank" rel="noopener noreferrer">benchmarking website</a></strong>.</p>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="concluding">Concluding<a href="https://iggy.apache.org/blogs/2025/05/08/zero-copy-deserialization#concluding" class="hash-link" aria-label="Direct link to Concluding" title="Direct link to Concluding"></a></h2>
+<p><strong>It was a lot of fun exploring the entire design space for our zero copy schema</strong>. Depending on the constraints one might end up with a completely different solution, in fact zero copy isn't always the optimal approach, for example, if you'd like to read more about challenges that folks in embedded development have to overcome, check out <strong><a href="https://bsky.app/profile/jamesmunns.com/post/3lnqo5ykawc2r" target="_blank" rel="noopener noreferrer">this Bluesky pos [...]
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="whats-next-for-iggy">What’s next for Iggy<a href="https://iggy.apache.org/blogs/2025/05/08/zero-copy-deserialization#whats-next-for-iggy" class="hash-link" aria-label="Direct link to What’s next for Iggy" title="Direct link to What’s next for Iggy"></a></h2>
+<p>Implementing zero-copy was a major milestone for us, but the train doesn’t slow down. Next in line is <strong>io_uring</strong> and <strong>thread per core shared nothing</strong> architecture. <strong><a href="https://www.reddit.com/r/rust/comments/1d35fsb/comment/l65wgnt/" target="_blank" rel="noopener noreferrer">We’ve already promised</a></strong> that we will publish more details about it once we have the results from our benchmark tests, so expect a highly technical blog post in [...]
+<p>For now <strong><a href="https://github.com/apache/iggy/tree/io_uring_monoio_runtime" target="_blank" rel="noopener noreferrer">we did a proof of concept long time ago</a></strong>, but realised a few things along the way that we would like to do differently. So we will. Iggy moves onward and upward! 🚀</p>]]></content:encoded>
+ </item>
+ <item>
+ <title><![CDATA[Transparent Benchmarking with Apache Iggy]]></title>
+ <link>https://iggy.apache.org/blogs/2025/02/17/transparent-benchmarks</link>
+ <guid>https://iggy.apache.org/blogs/2025/02/17/transparent-benchmarks</guid>
+ <pubDate>Mon, 17 Feb 2025 00:00:00 GMT</pubDate>
+ <description><![CDATA[Benchmarks should be the first-class citizen]]></description>
+ <content:encoded><![CDATA[<h2 class="anchor 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/17/transparent-benchmarks#benchmarks-should-be-the-first-class-citizen" class="hash-link" aria-label="Direct link to Benchmarks should be the first-class citizen" title="Direct link to Benchmarks should be the first-class citizen"></a></h2>
+<p>In the world of software development, <strong>benchmarks are often treated as a second-class citizen</strong>. They're more of an addition to the codebase, rather than a crucial part of it, which should be the other way around, especially when it comes to the performance-critical systems or infrastructure tools.</p>
+<p>Sometimes, the benchmarking results are nothing more than just a <strong>cherry-picking of the best-case scenarios</strong>, which are not representative of real-world usage. In such a case, they simply serve a sole purpose of either making the project look better than it is or how well it does outperform the competition, under the extremely optimized conditions when comparing with its counterparts.</p>
+<p><strong>Trying to reproduce the benchmarks is often a nightmare</strong>, as the environment setup is not documented, the code is unavailable, or the instructions are not clear enough. This makes it close to impossible to verify the results, which are then taken for granted.</p>
+<p>Or even worse, the <strong>benchmarking tool might be so complex, that it's hard to understand how it works</strong>, and what are the assumptions behind it. ALl of these, does result in hard to extend or modify the existing benchmarks, which are not covering the particular use case you're interested in. It's just here to tell everyone that we do have benchmarks, but how we do it, and what they measure, is a mystery.</p>
+<p><strong>Which is why at <a href="https://github.com/apache/iggy/" target="_blank" rel="noopener noreferrer">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/17/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.apache.org/" target="_blank" rel="noopener noreferrer">benchmarks.iggy.apache.org</a></strong> - a benchmarking dashboard, which is available to everyone. It's a website where you can see how Iggy performs under the different conditions, and how it scales with the number of clients, messages, and topics.</p>
+<p>This is our community-driven effort, where everyone can contribute, and add their own benchmarks. For all the information on how to run the benchmarks, render them on the dashboard, upload your results or contribute to the project, please check the <a href="https://github.com/iggy-rs/iggy-bench-dashboard" target="_blank" rel="noopener noreferrer">iggy-bench-dashboard</a> repository. In general, it's as simple as:</p>
+<ul>
+<li>Building the <a href="https://github.com/apache/iggy" target="_blank" rel="noopener noreferrer">Iggy</a> in the release mode with <code>cargo build --release</code></li>
+<li>Starting your Iggy server with <code>cargo r --bin iggy-server -r</code> (feel free to adjust the configuration in <code>server.toml</code> or via environment variables)</li>
+<li>Running the <code>iggy-bench</code> tool with the desired parameters, e.g. <code>cargo r --bin iggy-bench -r pinned-producer tcp</code></li>
+<li>Extending your benchmark with the output (HTML charts, JSON sampling etc.) <code>cargo r --bin iggy-bench -r pinned-producer tcp output -o performance_results --identifier spetz</code></li>
+<li>Navigating to the specific benchmark directory to browse the charts and/or uploading them to the dashboard.</li>
+<li>And there's always <code>help</code> command e.g. <code>pinned-producer --help</code> to make your life easier :)</li>
+</ul>
+<p><img decoding="async" loading="lazy" alt="image" src="https://iggy.apache.org/assets/images/iggy_bench_dashboard-20dc5e120f14f0c4618f23227cd08ac9.png" width="2555" height="1327" class="img_ev3q"></p>
+<p><strong>And this is just the beginning</strong>, as we plan to extend the dashboard, and add more benchmarks, which are covering the different use cases.</p>
+<p>Our main goal is to make the benchmarking process (and its results) <strong>transparent, reproducible, and easy to understand</strong>. We want to make them a first-class citizen, and a crucial part of the Iggy project. We want to make them a tool, which will help us to improve the performance, and to make Iggy the best streaming server out there. We're looking forward to your feedback, and we hope you'll enjoy the benchmarks.</p>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="towards-the-microsecond-latency">Towards the microsecond latency<a href="https://iggy.apache.org/blogs/2025/02/17/transparent-benchmarks#towards-the-microsecond-latency" class="hash-link" aria-label="Direct link to Towards the microsecond latency" title="Direct link to Towards the microsecond latency"></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[We are thrilled to announce that Iggy has officially joined the Apache Incubator! This marks a major milestone in our journey to redefine message streaming — one that is blazingly fast, hyper-efficient, and built for the future. Since the very first day, Iggy was always meant to be a truly FOSS project — not just open-source in name, but deeply rooted in the values of transparency, collaboration, and community-driven innovation.]]></description>
+ <content:encoded><![CDATA[<p>We are thrilled to announce that <strong>Iggy</strong> has officially joined the <strong><a href="https://incubator.apache.org/" target="_blank" rel="noopener noreferrer">Apache Incubator</a></strong>! This marks a major milestone in our journey to redefine message streaming — one that is <strong>blazingly fast, hyper-efficient, and built for the future</strong>. Since the very first day, <strong>Iggy was always meant to be a truly FOSS project</s [...]
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="-a-journey-two-years-in-the-making">🚀 A Journey Two Years in the Making<a href="https://iggy.apache.org/blogs/2025/02/10/apache-incubator#-a-journey-two-years-in-the-making" class="hash-link" aria-label="Direct link to 🚀 A Journey Two Years in the Making" title="Direct link to 🚀 A Journey Two Years in the Making"></a></h2>
+<p>It’s been almost two years since the very first line of code was written, and we’ve come a long way since the initial release. What started as a bold idea has grown into a high-performance, cost-efficient message streaming solution with a thriving community of contributors, users, and advocates. We’ve received invaluable feedback, contributions, and support, and we’re more excited than ever to take Iggy to the next level.</p>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="-beyond-just-iggy--a-growing-ecosystem">🔥 Beyond Just Iggy – A Growing Ecosystem<a href="https://iggy.apache.org/blogs/2025/02/10/apache-incubator#-beyond-just-iggy--a-growing-ecosystem" class="hash-link" aria-label="Direct link to 🔥 Beyond Just Iggy – A Growing Ecosystem" title="Direct link to 🔥 Beyond Just Iggy – A Growing Ecosystem"></a></h2>
+<p>Iggy is no longer just about the core repository. Over time, we’ve built an entire ecosystem around it, including:</p>
+<ul>
+<li>✅ SDKs for seamless developer integrations</li>
+<li>✅ CLIs for powerful command-line control</li>
+<li>✅ Web UIs for intuitive management</li>
+<li>✅ And many more…</li>
+</ul>
+<p>We’re already approaching 20 repositories under the Iggy organization (<a href="https://github.com/iggy-rs/" target="_blank" rel="noopener noreferrer">see them here</a>), and as we enter the Apache Incubator, we are committed to ensuring that all of them follow ASF guidelines while maintaining our core values of speed, efficiency, and simplicity.</p>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="-why-apache">🔗 Why Apache?<a href="https://iggy.apache.org/blogs/2025/02/10/apache-incubator#-why-apache" class="hash-link" aria-label="Direct link to 🔗 Why Apache?" title="Direct link to 🔗 Why Apache?"></a></h2>
+<p>The Apache Software Foundation has nurtured some of the <strong>most transformative open-source projects in history</strong> — Hadoop, Spark, Lucene, Solr, Cassandra, Kafka, Flink, and Airflow — technologies that have <strong>shaped big data, search, and real-time processing</strong>. By joining Apache Incubator, we align with this legacy and <strong>gain access to a larger community, better governance, and long-term sustainability</strong>.</p>
+<p>🔗 Dive into the Apache Incubator Details</p>
+<ul>
+<li><a href="https://cwiki.apache.org/confluence/display/INCUBATOR/Iggy+Proposal" target="_blank" rel="noopener noreferrer">Official Proposal</a></li>
+<li><a href="https://lists.apache.org/thread/q9whr3q9qd6wqm89f0vc1f6vkkvzc8xf" target="_blank" rel="noopener noreferrer">Discussion Thread</a></li>
+<li><a href="https://lists.apache.org/thread/6zfgdjwrzs92h4z4x6b25v1r23g3f5yg" target="_blank" rel="noopener noreferrer">Voting Results</a></li>
+</ul>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="-whats-next">📈 What’s Next?<a href="https://iggy.apache.org/blogs/2025/02/10/apache-incubator#-whats-next" class="hash-link" aria-label="Direct link to 📈 What’s Next?" title="Direct link to 📈 What’s Next?"></a></h2>
+<p><strong>Our vision is clear: Iggy as a future Apache Top-Level Project (TLP)</strong>. We already have ambitious ideas on how to improve both the project and the community around it:</p>
+<ul>
+<li><strong>Scaling performance benchmarks</strong> to push the limits of ultra-low-latency streaming</li>
+<li><strong>Expanding integrations</strong> with modern data infrastructure</li>
+<li><strong>Building a vibrant developer ecosystem</strong> that makes message streaming frictionless</li>
+</ul>
+<h2 class="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>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="-join-the-movement">💡 Join the Movement<a href="https://iggy.apache.org/blogs/2025/02/10/apache-incubator#-join-the-movement" class="hash-link" aria-label="Direct link to 💡 Join the Movement" title="Direct link to 💡 Join the Movement"></a></h2>
+<p>If you believe in a future where message streaming is lightning-fast, hyper-efficient, and accessible to all, we invite you to be part of this journey. Whether you're a developer, architect, or enterprise innovator, your contributions, feedback, and ideas will shape what comes next.</p>
+<p>And this is just the beginning. <strong>Welcome to the era of Hyper-Efficient Message Streaming at Laser Speed.</strong></p>
+<p><strong>Last but not least, we've got a new logo</strong>! Our lovely Italian Greyhound is now a part of the Apache family, and we're proud to have it as our mascot. As you can see, it's so fast, that even the light travelling through the optical fiber can't keep up with it :)</p>
+<p><img decoding="async" loading="lazy" alt="image" src="https://iggy.apache.org/assets/images/iggy_logo-f0e83b91b22303a5545dfb6d49756d18.png" width="1800" height="1000" class="img_ev3q"></p>
+<p>👉 Follow us, contribute, and help to build the future of the message streaming!</p>
+<ul>
+<li><a href="https://discord.gg/C5Sux5NcRa" target="_blank" rel="noopener noreferrer">Discord</a></li>
+<li><a href="https://x.com/ApacheIggy" target="_blank" rel="noopener noreferrer">X (Twitter)</a></li>
+<li><a href="https://bsky.app/profile/iggy.rs" target="_blank" rel="noopener noreferrer">Bluesky</a></li>
+<li><a href="https://www.linkedin.com/company/apache-iggy/" target="_blank" rel="noopener noreferrer">LinkedIn</a></li>
+</ul>]]></content:encoded>
+ </item>
+ <item>
+ <title><![CDATA[Iggy.rs - Technology Radar & current goals]]></title>
+ <link>https://iggy.apache.org/blogs/2024/10/28/technology-radar-and-currrent-goals</link>
+ <guid>https://iggy.apache.org/blogs/2024/10/28/technology-radar-and-currrent-goals</guid>
+ <pubDate>Mon, 28 Oct 2024 00:00:00 GMT</pubDate>
+ <description><![CDATA[Technology Radar]]></description>
+ <content:encoded><![CDATA[<h2 class="anchor 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/apache/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 & 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 & understanding how they might affect your enterprise. Frankly speaking, we weren't expecting this at all, and <strong>from our perspective, it's quite of an accomplishment</strong>.</p>
+<p>Besides gaining an additional amount of trust & recognition, it has led us to another conclusion - someone out there we don't know yet about (maybe even one of their customers) is using/experimenting with Iggy :)</p>
+<p>And if you are (or will be) one of such persons, please hop onto our <a href="https://discord.gg/C5Sux5NcRa" 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 & 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 & 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/apache/iggy/pull/1053" target="_blank" rel="noopener noreferrer">implement</a> an optional archiver for the server state log & streaming data (messages etc.) which supports any S3 compatible storage (just pick up your favorite cloud provider). The configuration is as simple as this example:</p>
+<div class="language-toml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_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 & 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/apache/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 & traces for the server. Since our SDK already uses the logging & tracing libraries, we thought that adding such a feature on the server, could help you gain even better, real-time observability into what's happening und [...]
+<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://discord.gg/C5Sux5NcRa" 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 & server in order to get full understanding of the distributed systems and its dependencies, which could be further visualized b [...]
+<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 & 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 & 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://discord.gg/C5Sux5NcRa" 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/apache/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 & 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 server, create new topics, validate if the messages are being sent correctly, change the user permissions or check the node statistics?</p>
+<p>This is where our <strong><a href="https://github.com/apache/iggy/tree/master/core/cli" target="_blank" rel="noopener noreferrer">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/apache/iggy/tree/master/core/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/apache/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 & replication<a href="https://iggy.apache.org/blogs/2024/05/29/one-year-of-building-the-message-streaming#clustering--replication" class="hash-link" aria-label="Direct link to Clustering & replication" title="Direct link to Clustering & replication"></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 & thread-per-core + share-nothing<a href="https://iggy.apache.org/blogs/2024/05/29/one-year-of-building-the-message-streaming#io_uring--thread-per-core--share-nothing" class="hash-link" aria-label="Direct link to io_uring & thread-per-core + share-nothing" title="Direct link to io_uring & thread-per-core + share-nothing"></a></h2>
+<p>What is a message streaming server, besides some more-or-less complicated logic regarding topics, partitioning, message ordering, consumer groups and a few more features? In its very core, <strong>it's mostly I/O (disk + networking)</strong> — the more efficient you can make it, the greater it will be. Of course, there's a major difference between throughput and latency, especially when talking about the so-called tail latency (p99 and more). Wouldn't it be great if we could have a ve [...]
+<p>However, due to the nature of tasks being shared across the different threads, <strong>you can't simply avoid lots of context switches and data being shared & synchronized across these threads</strong> (therefore even more context switches will occur). While it's probably not an issue for like 90% or maybe even 99% use-cases, there might be some (financial systems and similar), where an unpredictable tail latency is a total no-go.</p>
+<p>Certainly, there are already existing solutions dealing with such challenges, such as <a href="https://aeron.io/" target="_blank" rel="noopener noreferrer">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<></code> and <code>RwLock<></code>?</li>
+<li>Should we load into memory the same server metadata across all the threads (separately from each other) and notify all of them when something changes?</li>
+<li>Should there be single or multiple threads handling the incoming TCP connections?</li>
+<li>When <code>Thread #1</code> receives the request, which has to access the partition from <code>Thread #2</code>, should we use an async two-way channel (remember, no explicit locking and data synchronization between the threads) or maybe just send the descriptor using a one-way channel to the second thread to complete the request?</li>
+<li>What and when could become a bottleneck in such architecture?</li>
+</ul>
+<p>This is just the tip of an iceberg, and we've already started <a href="https://penberg.org/papers/tpc-ancs19.pdf" 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://discord.gg/C5Sux5NcRa" 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/apache/iggy/tree/master/core/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 & 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 ev [...]
+<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/apache/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/apache/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 additional challenges to overcome:</p>
+<p><strong>Clustering</strong> - the possibility of having a <strong>highly available and fault tolerant</strong> distributed message streaming platform in a production environment, is typically one of the most important aspects when considering the particular tool. While it wouldn't be too difficult to implement the extension (think of a simple proxy/load balancer), allowing to monitor and deliver the data either to the primary or secondary replica (treated as a fallback server) and swi [...]
+<p><img decoding="async" loading="lazy" alt="image" src="https://iggy.apache.org/assets/images/leader_elections-f973c06ac3c6b230945e496faa6f314e.jpeg" width="4058" height="2316" class="img_ev3q"></p>
+<p><strong>Low-level I/O</strong> - although the current results (based on the benchmarking tool measuring the throughput etc.) are satisfying, we strongly believe that there's still (potentially a huge) room for improvement. We're planning to use <strong><a href="https://unixism.net/loti/what_is_io_uring.html" target="_blank" rel="noopener noreferrer">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://discord.gg/C5Sux5NcRa" 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://discord.gg/C5Sux5NcRa" 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/apache/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/apache/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 -> N clients).</p>
+<p>This breaking change has been introduced with the commit <a href="https://github.com/apache/iggy/commit/23b330928aa38463ef907c95a9f672fa7b728881" target="_blank" rel="noopener noreferrer">#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/apache/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<Message></code> as a response, which has been changed to <code>PolledMessages</code> struct, that contains the <code>partition_id</code>, <code>current_offset</code> and <code>messages</code> field. The reason for this change was to provide more information about the current offset, and the partition from which the messages have been fetched - this might be especially useful when using the consumer groups feature [...]
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_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/apache/iggy/commit/ea3bf9c16dd5f93e1c80c140e9e1d14cfa70f570" target="_blank" rel="noopener noreferrer">#ea3bf9c</a>. The available <a href="https://crates.io/crates/iggy" target="_bla [...]
+<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/apache/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" re [...]
+<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 available to be consumed by the client.</p>
+<p>However, the state might have a different value, for example <code>marked_for_deletion</code> (to be used by the upcoming retention policy feature), <code>poisoned</code> (to be used by the upcoming dead-letter queue feature) etc. In the future releases, the server will also provide a way to change the state of the message (for example to mark it as <code>poisoned</code> by the client), as well as filtering the messages by the state.</p>
+<h2 class="anchor 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/apache/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/apache/iggy/commit/7c73bd3d9d59fb685cbaaca5901dec6cac43ddaf" target="_blank" rel="noopener noreferrer">#7c73bd3</a> - up until this point, the existing i [...]
+<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/apache/iggy/tree/master/core/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<u8></code> value. The <code>HeaderKind</code> enum defines the type of the value, which can be ei [...]
+<p>The primitive types are defined as the enum variants, so you can easily match on them. The <code>HeaderKind</code> enum is used to validate the value and to serialize/deserialize it. The idea is that the value will always remain a byte array, but you can use the <code>HeaderKind</code> to convert it to the desired type.</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_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/rss.xsl b/blogs/rss.xsl
new file mode 100644
index 000000000..e9695b298
--- /dev/null
+++ b/blogs/rss.xsl
@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<xsl:stylesheet
+ version="3.0"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:atom="http://www.w3.org/2005/Atom">
+ <xsl:output method="html" version="1.0" encoding="UTF-8" indent="yes" />
+
+ <xsl:template match="/">
+ <html xmlns="http://www.w3.org/1999/xhtml" lang="en">
+ <head>
+ <title>RSS Feed | <xsl:value-of select="rss/channel/title" /></title>
+ <link rel="stylesheet" href="rss.css" />
+ </head>
+ <body>
+ <main>
+ <div class="description">
+ <div class="info">
+ <strong>This is an RSS feed</strong>. Subscribe by copying the URL
+ from the address bar into your newsreader. Visit
+ <a href="https://aboutfeeds.com/">About Feeds</a> to learn more
+ and get started. It’s free.
+ </div>
+ <h1>
+ <div class="rss-icon">
+ <svg
+ version="1.1"
+ id="Capa_1"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ viewBox="0 0 455.731 455.731"
+ xml:space="preserve">
+ <g>
+ <rect
+ x="0"
+ y="0"
+ style="fill: #f78422"
+ width="455.731"
+ height="455.731"
+ />
+ <g>
+ <path
+ style="fill: #ffffff"
+ d="M296.208,159.16C234.445,97.397,152.266,63.382,64.81,63.382v64.348
+ c70.268,0,136.288,27.321,185.898,76.931c49.609,49.61,76.931,115.63,76.931,185.898h64.348
+ C391.986,303.103,357.971,220.923,296.208,159.16z"
+ />
+ <path
+ style="fill: #ffffff"
+ d="M64.143,172.273v64.348c84.881,0,153.938,69.056,153.938,153.939h64.348
+ C282.429,270.196,184.507,172.273,64.143,172.273z"
+ />
+ <circle
+ style="fill: #ffffff"
+ cx="109.833"
+ cy="346.26"
+ r="46.088"
+ />
+ </g>
+ </g>
+ </svg>
+ </div>
+ <xsl:value-of select="rss/channel/title" />
+ </h1>
+ <p class="blog-description">
+ <xsl:value-of select="rss/channel/description" />
+ </p>
+ </div>
+ <h2>Recent Posts</h2>
+ <div class="blog-posts">
+ <xsl:for-each select="rss/channel/item">
+ <div class="blog-post">
+ <h3><a href="{link}"><xsl:value-of select="title" /></a></h3>
+ <div class="blog-post-date">
+ Published on <xsl:value-of select="substring(pubDate,0,17)" />
+ </div>
+ <div class="blog-post-description">
+ <xsl:value-of select="description" />
+ </div>
+ </div>
+ </xsl:for-each>
+ </div>
+ </main>
+ </body>
+ </html>
+ </xsl:template>
+</xsl:stylesheet>
diff --git a/blogs/tags/breaking-changes/index.html b/blogs/tags/breaking-changes/index.html
new file mode 100644
index 000000000..95947c5e6
--- /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 "breaking-changes" | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-b [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed"><link rel="stylesheet" href="/assets/css/styles.00ae354b.css">
+<script src="/assets/js/runtime~main.abd83413.js" defer="defer"></script>
+<script src="/assets/js/main.e9fd05f4.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><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/blogs/tags/consumers/index.html b/blogs/tags/consumers/index.html
new file mode 100644
index 000000000..bd6d60b30
--- /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 "consumers" | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.p [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed"><link rel="stylesheet" href="/assets/css/styles.00ae354b.css">
+<script src="/assets/js/runtime~main.abd83413.js" defer="defer"></script>
+<script src="/assets/js/main.e9fd05f4.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><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/blogs/tags/hello/index.html b/blogs/tags/hello/index.html
new file mode 100644
index 000000000..2d6310897
--- /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 "hello" | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"> [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed"><link rel="stylesheet" href="/assets/css/styles.00ae354b.css">
+<script src="/assets/js/runtime~main.abd83413.js" defer="defer"></script>
+<script src="/assets/js/main.e9fd05f4.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><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/blogs/tags/identifier/index.html b/blogs/tags/identifier/index.html
new file mode 100644
index 000000000..3659a8504
--- /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 "identifier" | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x. [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed"><link rel="stylesheet" href="/assets/css/styles.00ae354b.css">
+<script src="/assets/js/runtime~main.abd83413.js" defer="defer"></script>
+<script src="/assets/js/main.e9fd05f4.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><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/blogs/tags/index.html b/blogs/tags/index.html
new file mode 100644
index 000000000..f27f58c5c
--- /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.00ae354b.css">
+<script src="/assets/js/runtime~main.abd83413.js" defer="defer"></script>
+<script src="/assets/js/main.e9fd05f4.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><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/blogs/tags/message-checksum/index.html b/blogs/tags/message-checksum/index.html
new file mode 100644
index 000000000..62e0489a6
--- /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 "message-checksum" | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-b [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed"><link rel="stylesheet" href="/assets/css/styles.00ae354b.css">
+<script src="/assets/js/runtime~main.abd83413.js" defer="defer"></script>
+<script src="/assets/js/main.e9fd05f4.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><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/blogs/tags/message-expiry/index.html b/blogs/tags/message-expiry/index.html
new file mode 100644
index 000000000..8494bf35d
--- /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 "message-expiry" | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0 [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed"><link rel="stylesheet" href="/assets/css/styles.00ae354b.css">
+<script src="/assets/js/runtime~main.abd83413.js" defer="defer"></script>
+<script src="/assets/js/main.e9fd05f4.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><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/blogs/tags/message-headers/index.html b/blogs/tags/message-headers/index.html
new file mode 100644
index 000000000..83d4124a9
--- /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 "message-headers" | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed"><link rel="stylesheet" href="/assets/css/styles.00ae354b.css">
+<script src="/assets/js/runtime~main.abd83413.js" defer="defer"></script>
+<script src="/assets/js/main.e9fd05f4.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><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/blogs/tags/message-state/index.html b/blogs/tags/message-state/index.html
new file mode 100644
index 000000000..ed4afe9d2
--- /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 "message-state" | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0. [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed"><link rel="stylesheet" href="/assets/css/styles.00ae354b.css">
+<script src="/assets/js/runtime~main.abd83413.js" defer="defer"></script>
+<script src="/assets/js/main.e9fd05f4.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><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/blogs/tags/new-features/index.html b/blogs/tags/new-features/index.html
new file mode 100644
index 000000000..d0b9e71de
--- /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 "new-features" | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed"><link rel="stylesheet" href="/assets/css/styles.00ae354b.css">
+<script src="/assets/js/runtime~main.abd83413.js" defer="defer"></script>
+<script src="/assets/js/main.e9fd05f4.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><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/blogs/tags/pat/index.html b/blogs/tags/pat/index.html
new file mode 100644
index 000000000..e9a356c83
--- /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 "pat" | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><m [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed"><link rel="stylesheet" href="/assets/css/styles.00ae354b.css">
+<script src="/assets/js/runtime~main.abd83413.js" defer="defer"></script>
+<script src="/assets/js/main.e9fd05f4.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><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/blogs/tags/permissions/index.html b/blogs/tags/permissions/index.html
new file mode 100644
index 000000000..c1b2858d4
--- /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 "permissions" | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed"><link rel="stylesheet" href="/assets/css/styles.00ae354b.css">
+<script src="/assets/js/runtime~main.abd83413.js" defer="defer"></script>
+<script src="/assets/js/main.e9fd05f4.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><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/blogs/tags/personal-access-tokens/index.html b/blogs/tags/personal-access-tokens/index.html
new file mode 100644
index 000000000..a015a281d
--- /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 "personal-access-tokens" | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-l [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed"><link rel="stylesheet" href="/assets/css/styles.00ae354b.css">
+<script src="/assets/js/runtime~main.abd83413.js" defer="defer"></script>
+<script src="/assets/js/main.e9fd05f4.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><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/blogs/tags/release/index.html b/blogs/tags/release/index.html
new file mode 100644
index 000000000..9028ef464
--- /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 "release" | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed"><link rel="stylesheet" href="/assets/css/styles.00ae354b.css">
+<script src="/assets/js/runtime~main.abd83413.js" defer="defer"></script>
+<script src="/assets/js/main.e9fd05f4.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><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/blogs/tags/schema/index.html b/blogs/tags/schema/index.html
new file mode 100644
index 000000000..ad8a1e5ff
--- /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 "schema" | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png" [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed"><link rel="stylesheet" href="/assets/css/styles.00ae354b.css">
+<script src="/assets/js/runtime~main.abd83413.js" defer="defer"></script>
+<script src="/assets/js/main.e9fd05f4.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><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/blogs/tags/update/index.html b/blogs/tags/update/index.html
new file mode 100644
index 000000000..9f8d97f03
--- /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 "update" | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png" [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed"><link rel="stylesheet" href="/assets/css/styles.00ae354b.css">
+<script src="/assets/js/runtime~main.abd83413.js" defer="defer"></script>
+<script src="/assets/js/main.e9fd05f4.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><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/blogs/tags/users/index.html b/blogs/tags/users/index.html
new file mode 100644
index 000000000..14990ee6a
--- /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 "users" | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"> [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed"><link rel="stylesheet" href="/assets/css/styles.00ae354b.css">
+<script src="/assets/js/runtime~main.abd83413.js" defer="defer"></script>
+<script src="/assets/js/main.e9fd05f4.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><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/blogs/updated-schemas/index.html b/blogs/updated-schemas/index.html
new file mode 100644
index 000000000..7b58ca0eb
--- /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.00ae354b.css">
+<script src="/assets/js/runtime~main.abd83413.js" defer="defer"></script>
+<script src="/assets/js/main.e9fd05f4.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/apache/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<Message></code> as a response, which has been changed to <code>PolledMessages</code> struct, that contains the <code>partition_id</code>, <code>current_offset</code> and <code>messages</code> field. The reason for this change was to provide more information about the current offset, and the partition from which the messages have been fetched - this might be especially useful when using the consumer groups feature [...]
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_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><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/blogs/users-and-permissions/index.html b/blogs/users-and-permissions/index.html
new file mode 100644
index 000000000..33d6d9f6b
--- /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.00ae354b.css">
+<script src="/assets/js/runtime~main.abd83413.js" defer="defer"></script>
+<script src="/assets/js/main.e9fd05f4.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's only returned when the user is authenticated. Otherwise, it's set to <code>None</code> (0 value for binary transport) or <code>null</code> (HTTP transport).</p>
+<p>Keep in mind that the <code>client</code> represents the application connected to the server - since it's possible that multiple applications would share the same user credentials, thus you can think of a <code>client</code> as a single connection from the application to the server (1 user -> N clients).</p>
+<p>This breaking change has been introduced with the commit <a href="https://github.com/apache/iggy/commit/23b330928aa38463ef907c95a9f672fa7b728881" target="_blank" rel="noopener noreferrer">#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 [...]
+<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><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/blogs/welcome-to-the-changelog/index.html b/blogs/welcome-to-the-changelog/index.html
new file mode 100644
index 000000000..d3fde1a55
--- /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.00ae354b.css">
+<script src="/assets/js/runtime~main.abd83413.js" defer="defer"></script>
+<script src="/assets/js/main.e9fd05f4.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't documented all the changes that I've made to the project, but since there's already a few of us working on the different parts of the project, I think it's a good idea to start documenting them, especially when there are some breaking changes or the new features being added to the server, that should be implemented in the client SDK as well :)</p>
+<p>Stay tuned for the updates and the upcoming features, such as optional message headers!</p></div><footer class="docusaurus-mt-lg"><div class="row margin-top--sm theme-blog-footer-edit-meta-row"><div class="col"><b>Tags:</b><ul class="tags_jXut padding--none margin-left--sm"><li class="tag_QGVx"><a 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><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/building-message-streaming/gh_trending.jpeg b/building-message-streaming/gh_trending.jpeg
new file mode 100644
index 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/ai/introduction/index.html b/docs/ai/introduction/index.html
new file mode 100644
index 000000000..da09dd61a
--- /dev/null
+++ b/docs/ai/introduction/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-ai/ai-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.00ae354b.css">
+<script src="/assets/js/runtime~main.abd83413.js" defer="defer"></script>
+<script src="/assets/js/main.e9fd05f4.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>Please check the <strong><a href="/docs/ai/mcp">MCP Server</a></strong> for the details about Iggy MCP (Model Context Protocol) server.</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/connectors/source"><div class="pagination-nav__sublabel">Previous</div><div class="pagination-nav__label">Source</div></a><a class="pagination-nav__link pagination-nav__link--next" href="/docs/a [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/ai/mcp/index.html b/docs/ai/mcp/index.html
new file mode 100644
index 000000000..01b123d69
--- /dev/null
+++ b/docs/ai/mcp/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-ai/ai-mcp" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.7.0">
+<title data-rh="true">MCP Server | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" propert [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed"><link rel="stylesheet" href="/assets/css/styles.00ae354b.css">
+<script src="/assets/js/runtime~main.abd83413.js" defer="defer"></script>
+<script src="/assets/js/main.e9fd05f4.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 the MCP server, simply run <code>cargo run --bin iggy-mcp</code>.</p>
+<p>The minimal viable configuration requires at least the Iggy credentials, to create the connection with the running Iggy server using TCP with which the MCP server will communicate. You can choose between HTTP and STDIO transports (e.g. for the local usage with tools such as <a href="https://claude.ai/download" target="_blank" rel="noopener noreferrer">Claude Desktop</a> choose <code>stdio</code>).</p>
+<div class="language-toml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_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">transport = "stdio" # http or stdio are supported</span><br></span><span class="t [...]
+<p>Keep in mind that either of <code>toml</code>, <code>yaml</code>, or <code>json</code> formats are supported for the configuration file. The path to the configuration can be overriden by <code>IGGY_MCP_CONFIG_PATH</code> environment variable. Each configuration section can be also additionally updated by using the following convention <code>IGGY_MCP_SECTION_NAME.KEY_NAME</code> e.g. <code>IGGY_MCP_IGGY_USERNAME</code> and so on.</p>
+<p>Here's the example configuration to be used with Claude Desktop:</p>
+<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_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><strong>Remember to use the appropriate Iggy account credentials for your environment</strong> (e.g. create the user with read-only permissions to avoid modifying the data). On top of this, you can also configure the <code>permissions</code> for the MCP server to control which operations are allowed (this will be checked first, before forwarding the actual request to the Iggy server).</p></div></article><nav class="pagination-nav docusaurus-mt-lg" aria-label="Docs pages"><a class="pag [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/cli/iggy-cli/index.html b/docs/cli/iggy-cli/index.html
new file mode 100644
index 000000000..6e6fef9b6
--- /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.00ae354b.css">
+<script src="/assets/js/runtime~main.abd83413.js" defer="defer"></script>
+<script src="/assets/js/main.e9fd05f4.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-b139e02165e2570574ac638f7db8801f.png" width="2048" height="893" class="img_ev3q"></p>
+<p>For example, you can use the following commands to list all the available streams given the server is running on the default address:</p>
+<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_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 "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><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/connectors/introduction/index.html b/docs/connectors/introduction/index.html
new file mode 100644
index 000000000..ad4fe6a12
--- /dev/null
+++ b/docs/connectors/introduction/index.html
@@ -0,0 +1,67 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-connectors/connectors-introduction" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.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.00ae354b.css">
+<script src="/assets/js/runtime~main.abd83413.js" defer="defer"></script>
+<script src="/assets/js/main.e9fd05f4.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>This is still WiP, and the runtime can be started only after compilation from the source code (no installable package yet).</strong></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>
+<ul>
+<li><strong>High Performance</strong>: Utilizes Rust's performance characteristics to ensure fast data ingestion and egress.</li>
+<li><strong>Low memory footprint</strong>: Designed with memory efficiency in mind, minimizing the memory footprint of the connectors.</li>
+<li><strong>Modular Design</strong>: Designed with modularity in mind, allowing for easy extension and customization.</li>
+<li><strong>Dynamic Loading</strong>: Supports dynamic loading of plugins, enabling seamless integration with various data sources and sinks.</li>
+<li><strong>Statically Typed</strong>: Ensures type safety and compile-time checks, reducing runtime errors.</li>
+<li><strong>Easy Customization</strong>: Provides a simple interface for implementing custom connectors, making it easy to create new plugins.</li>
+<li><strong>Data transformation</strong>: Supports data transformation with the help of existing functions.</li>
+<li><strong>Powerful configuration</strong>: Define your sinks, sources, and transformations in the configuration file.</li>
+</ul>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="quick-start">Quick Start<a href="#quick-start" class="hash-link" aria-label="Direct link to Quick Start" title="Direct link to Quick Start"></a></h2>
+<ol>
+<li>
+<p>Build the project in release mode, and make sure that the plugins specified in <code>core/connectors/config.toml</code> under <code>path</code> are available. You can use either of <code>toml</code>, <code>json</code> or <code>yaml</code> formats for the configuration file.</p>
+</li>
+<li>
+<p>Run <code>docker compose up -d</code> from <code>/examples/rust/src/sink-data-producer</code> which will start the Quickwit server to be used by an example sink connector. At this point, you can access the Quickwit UI at <a href="http://localhost:7280" target="_blank" rel="noopener noreferrer">http://localhost:7280</a> - check this dashboard again later on, after the <code>events</code> index will be created.</p>
+</li>
+<li>
+<p>Set environment variable <code>IGGY_CONNECTORS_CONFIG_PATH=core/connectors/runtime/config</code> (adjust the path as needed) pointing to the runtime configuration file.</p>
+</li>
+<li>
+<p>Start the Iggy server and invoke the following commands via Iggy CLI to create the example streams and topics used by the sample connectors.</p>
+<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_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 create example_stream</span><br></span><span cl [...]
+</li>
+<li>
+<p>Execute <code>cargo run --example sink-data-producer -r</code> which will start the example data producer application, sending the messages to previously created <code>qw</code> stream and <code>records</code> topic (this will be used by the Quickwit sink connector).</p>
+</li>
+<li>
+<p>Start the connector runtime <code>cargo run --bin iggy-connectors -r</code> - you should be able to browse Quickwit UI with records being constantly added to the <code>events</code> index. At the same time, you should see the new messages being added to the <code>example</code> stream and <code>topic1</code> topic by the test source connector - you can use Iggy Web UI to browse the data. The messages will have applied the basic fields transformations.</p>
+</li>
+</ol>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="runtime">Runtime<a href="#runtime" class="hash-link" aria-label="Direct link to Runtime" title="Direct link to Runtime"></a></h2>
+<p>All the connectors are implemented as Rust libraries and can be used as a part of the connector runtime. The runtime is responsible for managing the lifecycle of the connectors and providing the necessary infrastructure for the connectors to run. For more information, please refer to the <strong><a href="/docs/connectors/runtime">runtime documentation</a></strong>.</p>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="sink">Sink<a href="#sink" class="hash-link" aria-label="Direct link to Sink" title="Direct link to Sink"></a></h2>
+<p>Sinks are responsible for consuming the messages from the configured stream(s) and topic(s) and sending them further to the specified destination. For example, the Quickwit sink connector is responsible for sending the messages to the Quickwit indexer.</p>
+<p>Please refer to the <strong><a href="/docs/connectors/sink">Sink documentation</a></strong> for the details about the configuration and the sample implementation.</p>
+<p>When implementing <code>Sink</code>, make sure to use the <code>sink_connector!</code> macro to expose the FFI interface and allow the connector runtime to register the sink with the runtime.
+Each sink should have its own, custom configuration, which is passed along with the unique plugin ID via expected <code>new()</code> method.</p>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="source">Source<a href="#source" class="hash-link" aria-label="Direct link to Source" title="Direct link to Source"></a></h2>
+<p>Sources are responsible for producing the messages to the configured stream(s) and topic(s). For example, the Test source connector will generate the random messages that will be then sent to the configured stream and topic.</p>
+<p>Please refer to the <strong><a href="/docs/connectors/source">Source documentation</a></strong> for the details about the configuration and the sample implementation.</p>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="building-the-connectors">Building the connectors<a href="#building-the-connectors" class="hash-link" aria-label="Direct link to Building the connectors" title="Direct link to Building the connectors"></a></h2>
+<p>New connector can be built simply by implementing either <code>Sink</code> or <code>Source</code> trait. Please check the <strong><a href="/docs/connectors/sink">sink</a></strong> or <strong><a href="/docs/connectors/source">source</a></strong> documentation, as well as the existing examples under <code>/sinks</code> and <code>/sources</code> directories.</p>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="transformations">Transformations<a href="#transformations" class="hash-link" aria-label="Direct link to Transformations" title="Direct link to Transformations"></a></h2>
+<p>Field transformations (depending on the supported payload formats) can be applied to the messages either before they are sent to the specified topic (e.g. when produced by the source connectors), or before consumed by the sink connectors. To add the new transformation, simply implement the <code>Transform</code> trait and extend the existing <code>load</code> function. Each transform may have its own, custom configuration.</p>
+<p>To find out more about the transforms, stream decoders or encoders, please refer to the <strong><a href="/docs/connectors/sdk">SDK documentation</a></strong>.</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/cli/iggy-cli"><div class="pagination-nav__sublabel">Previous</div><div class="pagination-nav__label">Iggy CLI</div></a><a class="pagination-nav__link pagination-nav__link- [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/connectors/runtime/index.html b/docs/connectors/runtime/index.html
new file mode 100644
index 000000000..b593677d1
--- /dev/null
+++ b/docs/connectors/runtime/index.html
@@ -0,0 +1,42 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-connectors/connectors-runtime" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.7.0">
+<title data-rh="true">Runtime | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" property=" [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed"><link rel="stylesheet" href="/assets/css/styles.00ae354b.css">
+<script src="/assets/js/runtime~main.abd83413.js" defer="defer"></script>
+<script src="/assets/js/main.e9fd05f4.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 runtime uses a shared <a href="https://tokio.rs" target="_blank" rel="noopener noreferrer">Tokio runtime</a> to manage the asynchronous tasks and events across all connectors. Additionally, it has built-in support for logging via <a href="https://docs.rs/tracing/latest/tracing/" target="_blank" rel="noopener noreferrer">tracing</a> crate.</p>
+<p>The connector are implemented as Rust libraries, and these are loaded dynamically during the runtime initialization process.</p>
+<p>Internally, <a href="https://github.com/OpenByteDev/dlopen2" target="_blank" rel="noopener noreferrer">dlopen2</a> provides a safe and efficient way of loading the plugins via C FFI.</p>
+<p>By default, runtime will look for the configuration file, to decide which connectors to load and how to configure them.</p>
+<p>The minimal viable configuration requires at least the Iggy credentials, to create 2 separate instances of producer & consumer connections and the state directory path where source connectors can store their optional state.</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">[iggy]</span><br></span><span class="token-line" style="color:#393A34"><span class="token p [...]
+<p>All the other config sections start either with <code>sources</code> or <code>sinks</code> depending on the connector type.</p>
+<p>Keep in mind that either of <code>toml</code>, <code>yaml</code>, or <code>json</code> formats are supported for the configuration file. The path to the configuration can be overriden by <code>IGGY_CONNECTORS_CONFIG_PATH</code> environment variable. Each configuration section can be also additionally updated by using the following convention <code>IGGY_CONNECTORS_SECTION_NAME.KEY_NAME</code> e.g. <code>IGGY_CONNECTORS_IGGY_USERNAME</code> and so on.</p>
+<h2 class="anchor 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>Connector runtime has an optional HTTP API that can be enabled by setting the <code>enabled</code> flag to <code>true</code> in the <code>[http_api]</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_api] # Optional HTTP API configuration</span><br></span><span class="token-line" styl [...]
+<p>Currently, it does expose the following endpoints:</p>
+<ul>
+<li><code>GET /</code>: welcome message.</li>
+<li><code>GET /health</code>: health status of the runtime.</li>
+<li><code>GET /sinks</code>: list of sinks.</li>
+<li><code>GET /sinks/{key}</code>: sink details.</li>
+<li><code>GET /sinks/{key}/config</code>: sink config, including the optional <code>format</code> query parameter to specify the config format.</li>
+<li><code>GET /sinks/{key}/transforms</code>: sink transforms to be applied to the fields.</li>
+<li><code>GET /sources</code>: list of sources.</li>
+<li><code>GET /sources/{key}</code>: source details.</li>
+<li><code>GET /sources/{key}/config</code>: source config, including the optional <code>format</code> query parameter to specify the config format.</li>
+<li><code>GET /sources/{key}/transforms</code>: source transforms to be applied to the fields.</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/connectors/introduction"><div class="pagination-nav__sublabel">Previous</div><div class="pagination-nav__label">Introduction</div></a><a class="pagination-nav__link pagination-nav__link--next" href="/docs/connectors/sdk"><div class="pagination-nav__sublabel">Next</div><div class="pagination-nav__label">SDK</div></a></nav></div></ [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/connectors/sdk/index.html b/docs/connectors/sdk/index.html
new file mode 100644
index 000000000..ba57ea4f8
--- /dev/null
+++ b/docs/connectors/sdk/index.html
@@ -0,0 +1,68 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-connectors/connectors-sdk" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.7.0">
+<title data-rh="true">SDK | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" property="og:u [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed"><link rel="stylesheet" href="/assets/css/styles.00ae354b.css">
+<script src="/assets/js/runtime~main.abd83413.js" defer="defer"></script>
+<script src="/assets/js/main.e9fd05f4.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>Moreover, it contains both, the <code>decoders</code> and <code>encoders</code> modules, implementing either <code>StreamDecoder</code> or <code>StreamEncoder</code> traits, which are used when consuming or producing data from/to Iggy streams.</p>
+<p>SDK is WiP, and it'd certainly benefit from having the support of multiple format schemas, such as Protobuf, Avro, Flatbuffers etc. including decoding/encoding the data between the different formats (when applicable) and supporting the data transformations whenever possible (easy for JSON, but complex for Bincode for example).</p>
+<p>Last but not least, the different <code>transforms</code> are available, to transform (add, update, delete etc.) the particular fields of the data being processed via external configuration. It's as simple as adding a new transform to the <code>transforms</code> section of the particular connector configuration:</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">[sources.random.transforms.add_fields]</span><br></span><span class="token-line" style="col [...]
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="protocol-buffers-support">Protocol Buffers Support<a href="#protocol-buffers-support" class="hash-link" aria-label="Direct link to Protocol Buffers Support" title="Direct link to Protocol Buffers Support"></a></h2>
+<p>The SDK includes support for Protocol Buffers (protobuf) format with both encoding and decoding capabilities. Protocol Buffers provide efficient serialization and are particularly useful for high-performance data streaming scenarios.</p>
+<h3 class="anchor anchorWithStickyNavbar_LWe7" id="configuration-example">Configuration Example<a href="#configuration-example" class="hash-link" aria-label="Direct link to Configuration Example" title="Direct link to Configuration Example"></a></h3>
+<p>Here's a complete example configuration for using Protocol Buffers with Iggy connectors:</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">[iggy]</span><br></span><span class="token-line" style="color:#393A34"><span class="token p [...]
+<h3 class="anchor anchorWithStickyNavbar_LWe7" id="key-configuration-options">Key Configuration Options<a href="#key-configuration-options" class="hash-link" aria-label="Direct link to Key Configuration Options" title="Direct link to Key Configuration Options"></a></h3>
+<h4 class="anchor anchorWithStickyNavbar_LWe7" id="source-configuration">Source Configuration<a href="#source-configuration" class="hash-link" aria-label="Direct link to Source Configuration" title="Direct link to Source Configuration"></a></h4>
+<ul>
+<li><strong><code>schema_path</code></strong>: Path to the <code>.proto</code> file containing message definitions</li>
+<li><strong><code>message_type</code></strong>: Fully qualified name of the protobuf message type to use</li>
+<li><strong><code>use_any_wrapper</code></strong>: Whether to wrap messages in <code>google.protobuf.Any</code> for type safety</li>
+</ul>
+<h4 class="anchor anchorWithStickyNavbar_LWe7" id="transform-options">Transform Options<a href="#transform-options" class="hash-link" aria-label="Direct link to Transform Options" title="Direct link to Transform Options"></a></h4>
+<ul>
+<li><strong><code>proto_convert</code></strong>: Transform for converting between protobuf and other formats</li>
+<li><strong><code>target_format</code></strong>: Target format for conversion (<code>json</code>, <code>proto</code>, <code>text</code>)</li>
+<li><strong><code>preserve_structure</code></strong>: Whether to preserve the original message structure during conversion</li>
+<li><strong><code>field_mappings</code></strong>: Mapping of field names for transformation (e.g., <code>"old_field" = "new_field"</code>)</li>
+</ul>
+<h3 class="anchor anchorWithStickyNavbar_LWe7" id="supported-features">Supported Features<a href="#supported-features" class="hash-link" aria-label="Direct link to Supported Features" title="Direct link to Supported Features"></a></h3>
+<ul>
+<li><strong>Encoding</strong>: Convert JSON, Text, and Raw data to protobuf format</li>
+<li><strong>Decoding</strong>: Parse protobuf messages into JSON format with type information</li>
+<li><strong>Transforms</strong>: Convert between protobuf and other formats (JSON, Text)</li>
+<li><strong>Field Mapping</strong>: Transform field names during format conversion</li>
+<li><strong>Any Wrapper</strong>: Support for <code>google.protobuf.Any</code> message wrapper</li>
+</ul>
+<h3 class="anchor anchorWithStickyNavbar_LWe7" id="programmatic-usage">Programmatic Usage<a href="#programmatic-usage" class="hash-link" aria-label="Direct link to Programmatic Usage" title="Direct link to Programmatic Usage"></a></h3>
+<h4 class="anchor anchorWithStickyNavbar_LWe7" id="dynamic-schema-loading">Dynamic Schema Loading<a href="#dynamic-schema-loading" class="hash-link" aria-label="Direct link to Dynamic Schema Loading" title="Direct link to Dynamic Schema Loading"></a></h4>
+<p>You can load or reload schemas programmatically:</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_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 [...]
+<h4 class="anchor anchorWithStickyNavbar_LWe7" id="schema-registry-integration">Schema Registry Integration<a href="#schema-registry-integration" class="hash-link" aria-label="Direct link to Schema Registry Integration" title="Direct link to Schema Registry Integration"></a></h4>
+<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 [...]
+<h4 class="anchor anchorWithStickyNavbar_LWe7" id="creating-converters-with-schema">Creating Converters with Schema<a href="#creating-converters-with-schema" class="hash-link" aria-label="Direct link to Creating Converters with Schema" title="Direct link to Creating Converters with Schema"></a></h4>
+<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 [...]
+<h3 class="anchor anchorWithStickyNavbar_LWe7" id="usage-notes">Usage Notes<a href="#usage-notes" class="hash-link" aria-label="Direct link to Usage Notes" title="Direct link to Usage Notes"></a></h3>
+<ul>
+<li><strong>Automatic Loading</strong>: Schemas are loaded automatically when <code>schema_path</code> or <code>descriptor_set</code> is provided in config</li>
+<li><strong>Manual Loading</strong>: Use <code>load_schema()</code> method for dynamic schema loading or reloading</li>
+<li><strong>Error Handling</strong>: Schema loading errors are handled gracefully with fallback to Any wrapper mode</li>
+<li><strong>Immutable Design</strong>: Converters are created with fixed configuration - create new instances for different schemas</li>
+<li>When <code>use_any_wrapper</code> is enabled, messages are wrapped in <code>google.protobuf.Any</code> for better type safety</li>
+<li>The <code>proto_convert</code> transform can be used to convert protobuf messages to JSON for easier processing</li>
+<li>Field mappings allow you to rename fields during format conversion</li>
+<li>Protocol Buffers provide efficient binary serialization compared to JSON</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/connectors/runtime"><div class="pagination-nav__sublabel">Previous</div><div class="pagination-nav__label">Runtime</div></a><a class="pagination-nav__link pagination-nav__link--next" href="/docs/connectors/sink"><div class="pagination-nav__sublabel">Next</div><div class="pagination-nav__label">Sink</div></a></nav></div></div><div [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/connectors/sink/index.html b/docs/connectors/sink/index.html
new file mode 100644
index 000000000..5ceffb8a0
--- /dev/null
+++ b/docs/connectors/sink/index.html
@@ -0,0 +1,54 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-connectors/connectors-sink" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.7.0">
+<title data-rh="true">Sink | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" property="og: [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed"><link rel="stylesheet" href="/assets/css/styles.00ae354b.css">
+<script src="/assets/js/runtime~main.abd83413.js" defer="defer"></script>
+<script src="/assets/js/main.e9fd05f4.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>Sink connectors are responsible for writing data from Iggy streams to external systems or destinations. They provide a way to integrate Apache Iggy with various data sources and destinations, enabling seamless data flow and processing.</p>
+<p>The sink is represented by the single <code>Sink</code> trait, which defines the basic interface for all sink connectors. It provides methods for initializing the sink, writing data to external destination, and closing the sink.</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_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 attribute attr-name" style="color:#00a4db">#[async_trait]</span><span class="token plain"></span>< [...]
+<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>Sink is configured in the default <code>config</code> file used by runtime. Each sink configuration, is part of the map of <code><String, SinkConfig></code>, which can be represented using toml, json, or yaml.</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>Below is the example configuration for a sink connector, using <code>stdout</code> as it's unique identifier:</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"># Required configuration for a sink connector</span><br></span><span class="token-line" sty [...]
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="sample-implementation">Sample implementation<a href="#sample-implementation" class="hash-link" aria-label="Direct link to Sample implementation" title="Direct link to Sample implementation"></a></h2>
+<p>Let's implement the example sink connector, which will simply print the messages to the standard output.</p>
+<p>Additionally, our sink connector will have its own state, which can be used e.g. to track the overall progress or store some relevant information when ingesting the data further to the external sources or tooling.</p>
+<p>Also, when implementing the sink connector, make sure to use the <code>sink_connector!</code> macro to expose the FFI interface and allow the connector runtime to register the sink with the runtime.</p>
+<p>And finally, each sink should have its own, custom configuration, which is passed along with the unique plugin ID via expected <code>new()</code> method.</p>
+<p>Let's start by defining the internal state and the public sink connector along with its own configuration.</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_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 attribute attr-name" style="color:#00a4db">#[derive(Debug)]</span><span class="token plain"></span [...]
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_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 attribute attr-name" style="color:#00a4db">#[derive(Debug)]</span><span class="token plain"></span [...]
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_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 attribute attr-name" style="color:#00a4db">#[derive(Debug, Serialize, Deserialize)]</span><span cl [...]
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_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>We can invoke the expected macro to expose the FFI interface and allow the connector runtime to register the sink within the runtime.</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_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 macro property" style="color:#36acaa">sink_connector!</span><span class="token punctuation" style= [...]
+<p>At a bare minimum, we need to add the following dependencies to the <code>Cargo.toml</code> file to compile the plugin at all:</p>
+<ul>
+<li>dashmap</li>
+<li>once_cell</li>
+<li>tracing</li>
+</ul>
+<p>Now, let's implement the <code>Sink</code> trait for our <code>StdoutSink</code> struct.</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_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 attribute attr-name" style="color:#00a4db">#[async_trait]</span><span class="token plain"></span>< [...]
+<p>It's also important to note, that the supported format(s) might vary depending on the connector implementation. For example, you might expect <code>JSON</code> as the payload format, which can be then easily parsed and processed by upstream components such as data transforms, but at the same time, you could support the other formats and let the user decide which one to use.</p>
+<p>For example, you can match against the <code>payload</code> enum field containing the deserialized value to process (or not) the consumed message(s).</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_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">for</span><span class="token plain"> message </span><span class="to [...]
+<p>While the schema of messages (that will be consumed from the Iggy stream), cannot be controlled by the sink connector itself, the built-in configuration allows to decide what's the expected format of the messages (the particular <code>StreamDecoder</code> will be used).</p>
+<p>Keep in mind, that it might be sometimes difficult/impossible e.g. to transform one format to another e.g. JSON to SBE or so, and in such a case, the consumed messages will be ignored.</p>
+<p>Eventually, compile the source code and update the runtime configuration file using the example config above (<code>config.toml</code> file by default, unless you prefer <code>yaml</code> or <code>json</code> format instead - just make sure that <code>path</code> points to the existing plugin).</p>
+<p>And that's all, enjoy using the sink connector!</p>
+<p>On a side note, if you'd like to produce the messages to the Iggy stream instead, you can implement your own <strong><a href="/docs/connectors/source">Source connector</a></strong> too :)</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/connectors/sdk"><div class="pagination-nav__sublabel">Previous</div><div class="pagination-nav__label">SDK</div></a><a class="pagination- [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/connectors/source/index.html b/docs/connectors/source/index.html
new file mode 100644
index 000000000..fa00e338d
--- /dev/null
+++ b/docs/connectors/source/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-connectors/connectors-source" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.7.0">
+<title data-rh="true">Source | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" property="o [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed"><link rel="stylesheet" href="/assets/css/styles.00ae354b.css">
+<script src="/assets/js/runtime~main.abd83413.js" defer="defer"></script>
+<script src="/assets/js/main.e9fd05f4.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>Source connectors are responsible for ingesting data from external sources into Apache Iggy. They provide a way to integrate Apache Iggy with various data sources, such as databases, message queues, or file systems.</p>
+<p>The source is represented by the single <code>Source</code> trait, which defines the basic interface for all source connectors. It provides methods for initializing the source, reading data from it, and closing the source.</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_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 attribute attr-name" style="color:#00a4db">#[async_trait]</span><span class="token plain"></span>< [...]
+<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>Source is configured in the default <code>config</code> file used by runtime. Each source configuration, is part of the map of <code><String, SourceConfig></code>, which can be represented using toml, json, or yaml.</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>Below is the example configuration for a source connector, using <code>random</code> as it's unique identifier:</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"># Required configuration for a source connector</span><br></span><span class="token-line" s [...]
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="sample-implementation">Sample implementation<a href="#sample-implementation" class="hash-link" aria-label="Direct link to Sample implementation" title="Direct link to Sample implementation"></a></h2>
+<p>Let's implement the example source connector, which will simply generate the N random messages depending on the count specified in the configuration.</p>
+<p>Additionally, our source connector will have its own state, which can be used e.g. to track the overall progress or store some relevant information when producing the data from the actual external sources or tooling.</p>
+<p>Keep in mind, that the produced messages will be sent further to the specified stream, however it's already the responsibility of the runtime to handle the delivery.</p>
+<p>Also, when implementing the source connector, make sure to use the <code>source_connector!</code> macro to expose the FFI interface and allow the connector runtime to register the source with the runtime.</p>
+<p>And finally, each source should have its own, custom configuration, which is passed along with the unique plugin ID and optional state via expected <code>new()</code> method.</p>
+<p>Let's start by defining the internal state and the public source connector along with its own configuration.</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_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 attribute attr-name" style="color:#00a4db">#[derive(Debug)]</span><span class="token plain"></span [...]
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_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 attribute attr-name" style="color:#00a4db">#[derive(Debug)]</span><span class="token plain"></span [...]
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_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 attribute attr-name" style="color:#00a4db">#[derive(Debug, Serialize, Deserialize)]</span><span cl [...]
+<p>At this point, we can expose the required <code>new()</code> method, which will be used by the runtime to create a new instance of the source connector. The <code>id</code> is assigned by the runtime, and represents the unique identifier of the source connector. The <code>state</code> is an optional connector state (e.g. persisted in the local file), which will be provided by the runtime, given that the connector has persisted its own state before the runtime was restarted.</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_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>We can invoke the expected macro to expose the FFI interface and allow the connector runtime to register the source within the runtime.</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_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 macro property" style="color:#36acaa">source_connector!</span><span class="token punctuation" styl [...]
+<p>At a bare minimum, we need to add the following dependencies to the <code>Cargo.toml</code> file to compile the plugin at all:</p>
+<ul>
+<li>dashmap</li>
+<li>once_cell</li>
+<li>tracing</li>
+</ul>
+<p>Before we make use of the <code>Source</code> trait, let's define the internal payload of the message that will be produced (e.g. as if it was pulled from some external database or so).</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_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 attribute attr-name" style="color:#00a4db">#[derive(Debug, Serialize, Deserialize)]</span><span cl [...]
+<p>Now, let's implement the <code>Source</code> trait for our <code>RandomSource</code> struct. We'll assume that the amount of messages (provided in the config), will be generated every 100ms to mimic the behavior of a real-world external source. On top of this, we'll also keep track of the current ID of the last message produced and return the state along with the <code>ProducedMessages</code> - the state in this case, will be just a binary encoded number, but it can be [...]
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_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 attribute attr-name" style="color:#00a4db">#[async_trait]</span><span class="token plain"></span>< [...]
+<p>As you can see, the <code>ProducedMessage</code> can be customized to fit your needs, as all the fields will be directly mapped to the existing Iggy message struct.</p>
+<p>It's also important to note, that the supported format(s) might vary depending on the connector implementation. For example, you might use <code>JSON</code> as the payload format, which can be then easily parsed and processed by downstream components such as data transforms, but at the same time, you could support the other formats and let the user decide which one to use.</p>
+<p>While the final schema of messages (that will be appended to the Iggy stream), can be controlled with the built-in configuration (the particular <code>StreamEncoder</code> will be used), keep in mind, that it might be sometimes difficult/impossible e.g. to transform one format to another e.g. JSON to SBE or so, and in such a case, the produced messages will be ignored.</p>
+<p>Eventually, compile the source code and update the runtime configuration file using the example config above (<code>config.toml</code> file by default, unless you prefer <code>yaml</code> or <code>json</code> format instead - just make sure that <code>path</code> points to the existing plugin).</p>
+<p>And before starting the runtime, do not forget to create the specified stream and topic e.g. via Iggy CLI.</p>
+<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_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 create example_stream</span><br></span><span cl [...]
+<p>And that's all, enjoy using the source connector!</p>
+<p>On a side note, if you'd like to process the messages consumed from the Iggy stream instead, you can implement your own <strong><a href="/docs/connectors/sink">Sink connector</a></strong> too :)</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/connectors/sink"><div class="pagination-nav__sublabel">Previous</div><div class="pagination-nav__label">Sink</div></a><a class="pa [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/index.html b/docs/index.html
new file mode 100644
index 000000000..fdba3bfe7
--- /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.00ae354b.css">
+<script src="/assets/js/runtime~main.abd83413.js" defer="defer"></script>
+<script src="/assets/js/main.e9fd05f4.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="/docs/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="c [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/introduction/about/index.html b/docs/introduction/about/index.html
new file mode 100644
index 000000000..56b206c42
--- /dev/null
+++ b/docs/introduction/about/index.html
@@ -0,0 +1,92 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-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.00ae354b.css">
+<script src="/assets/js/runtime~main.abd83413.js" defer="defer"></script>
+<script src="/assets/js/main.e9fd05f4.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 provides <strong>exceptionally high throughput and performance</strong> while utilizing minimal computing resources.</p>
+<p>This is <strong>not yet another extension</strong> running on top of the existing infrastructure, such as Kafka or SQL database.</p>
+<p>Iggy is the persistent message streaming log <strong>built from the ground up</strong> using the low lvl I/O for speed and efficiency.</p>
+<p>The name is an abbreviation for the Italian Greyhound - small yet extremely fast dogs, the best in their class. See the lovely <a href="https://www.instagram.com/fabio.and.cookie/" target="_blank" rel="noopener noreferrer">Fabio & Cookie</a> ❤️</p>
+<p><img decoding="async" loading="lazy" alt="Iggy Server" src="/assets/images/iggy_server-f7851820c876c0a5b3c0159f953ae728.png" width="2048" height="1182" class="img_ev3q"></p>
+<hr>
+<h3 class="anchor 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 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>User authentication and authorization</strong> with granular permissions and Personal Access Tokens (PAT)</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 binary data</strong>, avoiding enforced schema and serialization/deserialization overhead</li>
+<li>Custom <strong>zero-copy (de)serialization</strong>, which greatly improves the performance and reduces memory usage.</li>
+<li>Configurable server features (e.g. caching, segment size, data flush interval, transport protocols etc.)</li>
+<li>Server-side storage of <strong>consumer offsets</strong></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> which group <strong>topics</strong></li>
+<li><strong>TLS</strong> support for all transport protocols (TCP, QUIC, HTTPS)</li>
+<li><strong><a href="/docs/connectors/introduction">Connectors</a></strong> - sinks, sources and data transformations based on the <strong>custom Rust plugins</strong></li>
+<li><strong><a href="/docs/ai/mcp">Model Context Protocol</a></strong> - provide context to LLM with <strong>MCP server</strong></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 and archiving</strong> to disk or <strong>S3</strong> compatible cloud storage (e.g. AWS S3)</li>
+<li>Support for <strong>OpenTelemetry</strong> logs & 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 (clustering based on Viewstamped Replication will be implemented in the near future)</li>
+</ul>
+<h2 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></h2>
+<ul>
+<li><a href="https://crates.io/crates/iggy" target="_blank" rel="noopener noreferrer">Rust</a></li>
+<li><a href="https://www.nuget.org/packages/Apache.Iggy/" target="_blank" rel="noopener noreferrer">C#</a></li>
+<li>Java</li>
+<li><a href="https://pypi.org/project/apache-iggy/" target="_blank" rel="noopener noreferrer">Python</a></li>
+<li><a href="https://www.npmjs.com/package/apache-iggy" target="_blank" rel="noopener noreferrer">Node.js (TypeScript)</a></li>
+<li><a href="https://pkg.go.dev/github.com/apache/iggy/foreign/go" target="_blank" rel="noopener noreferrer">Go</a></li>
+</ul>
+<p>C++ and Elixir are work in progress.</p>
+<h2 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></h2>
+<p>The brand new, rich, interactive CLI is implemented under the <code>cli</code> project, to provide the best developer experience. This is a great addition to the Web UI, especially for all the developers who prefer using the console tools.</p>
+<p>Iggy CLI can be installed with <code>cargo install iggy-cli</code> and then simply accessed by typing <code>iggy</code> in your terminal.</p>
+<h3 class="anchor 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's a dedicated Web UI for the server, which allows managing the streams, topics, partitions, browsing the messages and so on. This is an ongoing effort to build a comprehensive dashboard for administrative purposes of the Iggy server. Check the Web UI in the <code>/web</code> directory. The <a href="https://hub.docker.com/r/iggyrs/iggy-web-ui" target="_blank" rel="noopener noreferrer">docker image for Web UI</a> is available, and can be fetched via <code>docker pull iggyrs/i [...]
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="connectors">Connectors<a href="#connectors" class="hash-link" aria-label="Direct link to Connectors" title="Direct link to Connectors"></a></h2>
+<p>The highly performant and modular <strong><a href="/docs/connectors/runtime">runtime</a></strong> for statically typed, yet dynamically loaded connectors. Ingest the data from the external sources and push it further to the Iggy streams, or fetch the data from the Iggy streams and push it further to the external sources. <strong>Create your own Rust plugins</strong> by simply implementing either the <code>Source</code> or <code>Sink</code> trait and <strong>build custom pipelines for [...]
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="model-context-protocol">Model Context Protocol<a href="#model-context-protocol" class="hash-link" aria-label="Direct link to Model Context Protocol" title="Direct link to Model Context Protocol"></a></h2>
+<p>The <a href="https://modelcontextprotocol.io" target="_blank" rel="noopener noreferrer">Model Context Protocol</a> (MCP) is an open protocol that standardizes how applications provide context to LLMs. The <strong><a href="/docs/ai/mcp">Iggy MCP Server</a></strong> is an implementation of the MCP protocol for the message streaming infrastructure. It can be used to provide context to LLMs in real-time, allowing for more accurate and relevant responses.</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>The official Apache Iggy images can be found in <a href="https://hub.docker.com/r/apache/iggy" target="_blank" rel="noopener noreferrer">Docker Hub</a>, simply type <code>docker pull apache/iggy</code> to pull the image.</p>
+<p>You can also find the images for all the different tooling such as Connectors, MCP Server etc. <a href="https://hub.docker.com/u/apache?page=1&search=iggy" target="_blank" rel="noopener noreferrer">here</a>.</p>
+<p>Please note that the images tagged as <code>latest</code> are based on the official, stable releases, while the <code>edge</code> ones are updated directly from latest version of the <code>master</code> branch.</p>
+<p>You can find the <code>Dockerfile</code> and <code>docker-compose</code> in the root of the repository. To build and start the server, run: <code>docker compose up</code>.</p>
+<p>Additionally, you can run the <code>CLI</code> which is available in the running container, by executing: <code>docker exec -it iggy-server /iggy</code>.</p>
+<p>Keep in mind that running the container on the OS other than Linux, where the Docker is running in the VM, might result in the performance degradation.</p>
+<h3 class="anchor anchorWithStickyNavbar_LWe7" id="version">Version<a href="#version" class="hash-link" aria-label="Direct link to Version" title="Direct link to Version"></a></h3>
+<p>The official releases follow the regular semver (<code>0.5.0</code>) or have <code>latest</code> tag applied (<code>apache/iggy:latest</code>).</p>
+<p>We do also publish edge/dev/nightly releases (e.g. <code>0.5.0-edge.1</code> or <code>apache/iggy:edge</code>), for both, SDKs and the Docker images, which are typically compatible with the latest changes, but are not guaranteed to be stable, and as the name states, are not recommended for production use.</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/"><div class="paginatio [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/introduction/architecture/index.html b/docs/introduction/architecture/index.html
new file mode 100644
index 000000000..b237a2a5e
--- /dev/null
+++ b/docs/introduction/architecture/index.html
@@ -0,0 +1,45 @@
+<!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.00ae354b.css">
+<script src="/assets/js/runtime~main.abd83413.js" defer="defer"></script>
+<script src="/assets/js/main.e9fd05f4.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's discuss in-depth what these concepts are all about and how they relate to each other.</p>
+<p><img decoding="async" loading="lazy" alt="Architecture" src="/assets/images/architecture-5d7f7f7ed58a399ea2f5a7c74c074f65.png" width="6000" height="3375" class="img_ev3q"></p>
+<h2 class="anchor 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's a high chance that you've already used messaging tools such as RabbitMQ or Kafka, just to name a few. While they might look similar at the first glance, and actually, you can achieve the similar results with all of them (e.g. publishing and consuming the events by the different applications built on top of microservices architecture), they are quite different in their core.</p>
+<p>The main difference is that RabbitMQ (except the recently released Streams plugin) is the message broker, which means that it's responsible for delivering the messages to the consumers. It works in the FIFO (First In, First Out) manner and the messages are being kept in the queues. For example, if you have multiple, distinct consumers, then each one would create its own queue, the message would be replicated between each queue and each consumer would be responsible for reading th [...]
+<p>On the other hand, Kafka is a message streaming platform, meaning that it's not responsible for delivering the messages to the consumers, but rather it's storing them in a form of an append-only log. The consumers are responsible for reading the messages from the log and processing them. You might have multiple distinct consumers, and it doesn't affect the resource usage as there's only one log. The consumers can read the messages from the beginning, or from the sp [...]
+<p>There are advantages and disadvantages of both approaches, but the main difference is that the message broker is responsible for delivering the messages to the consumers, while the message streaming platform is not. The message broker is a more mature concept, but the message streaming platform is gaining more and more popularity, especially in the cloud-native world. And you can achieve much higher performance and throughput with the message streaming platform, since it acts as a sim [...]
+<p>As you might've guessed by now, Iggy is the latter - the message streaming platform.</p>
+<h2 class="anchor 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's a simple data structure, which is optimized for the append-only operations. It's a sequence of records, that are being appended to the end of the log. The records are immutable, so that they can't be changed once they are written to the log. The records are being written in the order they are received, which results in the log being is ordered.</p>
+<p>To navigate the log, you can use the offset, which is the position of the record in the log. The offset is a simple integer, that starts from 0 and is incremented by 1 for each record. When the client is reading the records from the log, it can specify the offset from which it wants to start reading the records. The client can also specify the maximum number of records it wants to read. The client can read the records from the beginning, or from the specific offset, which means that y [...]
+<div class="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'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><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/introduction/getting-started/index.html b/docs/introduction/getting-started/index.html
new file mode 100644
index 000000000..1ffcf7933
--- /dev/null
+++ b/docs/introduction/getting-started/index.html
@@ -0,0 +1,112 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-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.00ae354b.css">
+<script src="/assets/js/runtime~main.abd83413.js" defer="defer"></script>
+<script src="/assets/js/main.e9fd05f4.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>This is a <strong>Rust based implementation</strong>, to look for examples in the other programming languages, please check the <a href="/docs/sdk/introduction">SDK</a></p>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-we-will-build">What we will build<a href="#what-we-will-build" class="hash-link" aria-label="Direct link to What we will build" title="Direct link to What we will build"></a></h2>
+<p>Once you're familiar with the <a href="/docs/introduction/architecture">architecture</a>, it's high time to build the first application, or actually the set of applications - so-called <strong>producer</strong> (the one that will be publishing the messages to the stream) and <strong>consumer</strong> (yes, you got that right - it will handle the incoming messages stream).</p>
+<p>In the typical scenario, e.g. when working with the microservices architecture or any other kind of the distributed system, each application can be both at the same time (producer and consumer), as the particular service might publish its own messages (typically in a form of the events - facts, that have already happened) while at the same time be interested in the notifications coming from the other service(s).</p>
+<p>The completed sample can be found in <a href="https://github.com/apache/iggy/tree/master/core/examples/src/getting-started" target="_blank" rel="noopener noreferrer">repository</a>, however, we will go through the implementation step by step, so that you can get a better understanding of how to build the applications from scratch.</p>
+<p>Also, please do keep in mind that we'll be using the default implementation of <code>IggyClient</code> which provides a wrapper on top of the low-level, transport-specific <code>Client</code> trait (which you can always use, if you want to have more control over the communication with the server).</p>
+<p>On the other hand, if you're looking for a <strong>more developer-friendly client builder API</strong> providing additional features and extensions, please check the next article under <a href="/docs/sdk/rust/high-level-sdk">High-level SDK</a> section (this is typically how you'd use Iggy SDK in the real-world applications).</p>
+<p>Nevertheless, let's start with the basic scenario, and build the producer and consumer applications using the default <code>IggyClient</code> implementation, so you can get a better understanding of how to work with the streaming server.</p>
+<h2 class="anchor 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's no official package to be downloaded yet, the only way to get things up and running is by cloning the <a href="https://github.com/apache/iggy" target="_blank" rel="noopener noreferrer">repository</a> and then starting the server by running the following command: <code>carg [...]
+<p>As long as the Iggy server is running, we're good to go. If you'd like to play with the configuration (e.g. change the addresses, ports, caching or so) you will find the <code>server.toml</code> under <code>configs</code> directory in the root of the repository.</p>
+<h2 class="anchor 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'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's do the same for the <code>producer</code> part. Create a new <code>producer</code> directory, copy & paste the existing <code>main.rs</code>, and update the <code>Cargo.toml</code> with the following code:</p>
+<div class="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'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/apache/iggy/blob/master/core/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/apache/iggy/blob/master/core/sdk/src/clients/client.rs" target="_blank" rel="noopener noreferrer">Client [...]
+<p>If you're eager to find out how to build more advanced (and configurable) applications, check the Rust <a href="/docs/sdk/rust/examples">examples</a>. Nevertheless, let's focus on implementing our producer side :)</p>
+<p>Next, we need to authenticate the user, as all the available actions (except the <code>ping</code> and <code>login</code>) require the user to be authenticated and have the appropriate permissions e.g. you might be able to send or poll the messages, but you won't be able to create the stream or topic. For the sake of simplicity, we will use the default credentials for the root user (username: <code>iggy</code>, password: <code>iggy</code>), that can do anything and cannot be dele [...]
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_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've just established our very first communication with the streaming server.</p>
+<p>Before we will move on with the code, let's include some logging in our apps as well (Iggy client already has some logging in place on different levels). Let's make use of the <a href="https://tracing.rs" target="_blank" rel="noopener noreferrer">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're unfamiliar with these concepts, please refer to <a href="/docs/introduction/architecture">architecture</a> where all these concepts are described in-depth.</p>
+<p>Since our <code>IggyClient</code> implements the common <a href="https://github.com/apache/iggy/blob/master/core/sdk/src/clients/client.rs" target="_blank" rel="noopener noreferrer">Client</a> trait, you can find lots of the different methods to interact with the server, also from the administrative point of view, e.g. creating the streams, topics etc.</p>
+<p>One thing worth mentioning is that, these methods are not idempotent - for example, if you were to try creating the stream with the same ID which already exists on the server, you would receive the specific error. In such a case, you can simply check for an error and move on. Let's do this then :)</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_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's send some messages into our stream. We will implement the basic loop with an interval between each iteration to simulate publishing the batch of messages. Since the streaming server works directly with the binary data, and couldn't care less about the (de)serialization format for the message payload, it's really up to you, how to efficiently stream the messages for your use case.</p>
+<p>In our example, we will simply use the string payload, and pass it via <code>from_str</code> trait to construct the <a href="https://github.com/apache/iggy/blob/master/core/common/src/commands/messages/send_messages.rs#L423" target="_blank" rel="noopener noreferrer">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've already noticed, there are quite a few fields to be assigned. While some of them should be rather self-descriptive, let's discuss the <code>identifier</code> (created implicitly by using <code>TryFrom</code> on top of <code>STREAM_ID</code> and <code>TOPIC_ID</code>) and the <code>partitioning</code> which might be a little bit confusing at first, starting with the former.</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_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'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->2->3->1->2->3 etc.) or <code>PartitioningKind::MessagesKey</code> instead (e.g. by invoking one of [...]
+<p>For example, given that you process the set of messages related to the specific order ID (e.g. created, confirmed, paid, delivered etc.), you could use that as a key value to ensure that all the messages which are part of the specific workflow, will always be put onto the same partition. The value of the key can be anything (e.g. string, number) with the maximum length of 255 bytes.</p>
+<p>Anyway, let's get back to our scenario, and consider the following code responsible for publishing the messages:</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_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>&mut</code> we can avoid copying the command each time.</p>
+<p>Finally, let's complete the implementation of the producer - once you start the application after the latest changes, you shall see the messages being sent to the newly created stream.</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_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'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'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'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'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'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'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've just achieved is merely the tip of an iceberg, however, it should give you a good understanding of what Iggy is all about, and hopefully, it wasn't too difficult to follow and get things up and running for the first time. Feel free to take a look at the more advanced <a href="https://github.com/apache/iggy/tree/master/core/examples" target="_blank" rel="noopener noreferrer">examples</a>, how to make use of <code>IggyClient</code> wrapper on top of the existing imp [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/sdk/csharp/examples/index.html b/docs/sdk/csharp/examples/index.html
new file mode 100644
index 000000000..585c07f65
--- /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.00ae354b.css">
+<script src="/assets/js/runtime~main.abd83413.js" defer="defer"></script>
+<script src="/assets/js/main.e9fd05f4.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><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/sdk/csharp/intro/index.html b/docs/sdk/csharp/intro/index.html
new file mode 100644
index 000000000..79f050a8d
--- /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.00ae354b.css">
+<script src="/assets/js/runtime~main.abd83413.js" defer="defer"></script>
+<script src="/assets/js/main.e9fd05f4.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><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/sdk/go/examples/index.html b/docs/sdk/go/examples/index.html
new file mode 100644
index 000000000..12034ec53
--- /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.00ae354b.css">
+<script src="/assets/js/runtime~main.abd83413.js" defer="defer"></script>
+<script src="/assets/js/main.e9fd05f4.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><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/sdk/go/intro/index.html b/docs/sdk/go/intro/index.html
new file mode 100644
index 000000000..dac64ceea
--- /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.00ae354b.css">
+<script src="/assets/js/runtime~main.abd83413.js" defer="defer"></script>
+<script src="/assets/js/main.e9fd05f4.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><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/sdk/introduction/index.html b/docs/sdk/introduction/index.html
new file mode 100644
index 000000000..2efcab7dc
--- /dev/null
+++ b/docs/sdk/introduction/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/sdk-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.00ae354b.css">
+<script src="/assets/js/runtime~main.abd83413.js" defer="defer"></script>
+<script src="/assets/js/main.e9fd05f4.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><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/sdk/java/examples/index.html b/docs/sdk/java/examples/index.html
new file mode 100644
index 000000000..86b641884
--- /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.00ae354b.css">
+<script src="/assets/js/runtime~main.abd83413.js" defer="defer"></script>
+<script src="/assets/js/main.e9fd05f4.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><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/sdk/java/intro/index.html b/docs/sdk/java/intro/index.html
new file mode 100644
index 000000000..a7c651cde
--- /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.00ae354b.css">
+<script src="/assets/js/runtime~main.abd83413.js" defer="defer"></script>
+<script src="/assets/js/main.e9fd05f4.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/node/examples"><div class="pagination-nav__sublabel">Previous</div><div class="pagination-nav__label">Examples</div></a><a class="pagination-nav__link pagination-nav__link--next" href="/docs/sdk/java [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/sdk/node/examples/index.html b/docs/sdk/node/examples/index.html
new file mode 100644
index 000000000..660b859e4
--- /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.00ae354b.css">
+<script src="/assets/js/runtime~main.abd83413.js" defer="defer"></script>
+<script src="/assets/js/main.e9fd05f4.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><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/sdk/node/intro/index.html b/docs/sdk/node/intro/index.html
new file mode 100644
index 000000000..c3f0a4faf
--- /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.00ae354b.css">
+<script src="/assets/js/runtime~main.abd83413.js" defer="defer"></script>
+<script src="/assets/js/main.e9fd05f4.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><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/sdk/python/examples/index.html b/docs/sdk/python/examples/index.html
new file mode 100644
index 000000000..333f86433
--- /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.00ae354b.css">
+<script src="/assets/js/runtime~main.abd83413.js" defer="defer"></script>
+<script src="/assets/js/main.e9fd05f4.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><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/sdk/python/intro/index.html b/docs/sdk/python/intro/index.html
new file mode 100644
index 000000000..b935dcbfa
--- /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.00ae354b.css">
+<script src="/assets/js/runtime~main.abd83413.js" defer="defer"></script>
+<script src="/assets/js/main.e9fd05f4.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><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/sdk/rust/examples/index.html b/docs/sdk/rust/examples/index.html
new file mode 100644
index 000000000..6e7e333b9
--- /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.00ae354b.css">
+<script src="/assets/js/runtime~main.abd83413.js" defer="defer"></script>
+<script src="/assets/js/main.e9fd05f4.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="/docs/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="/docs/sdk/rust/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/sdk/rust/high-level-sdk"><div class="pagination-nav__sublabel">Next</div><div class="pagination-nav__label">High-level SDK</div></a></nav></di [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/sdk/rust/high-level-sdk/index.html b/docs/sdk/rust/high-level-sdk/index.html
new file mode 100644
index 000000000..59a10d88d
--- /dev/null
+++ b/docs/sdk/rust/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-sdk/rust/sdk-rust-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.00ae354b.css">
+<script src="/assets/js/runtime~main.abd83413.js" defer="defer"></script>
+<script src="/assets/js/main.e9fd05f4.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 & joining the consumer groups</li>
+<li>Committing 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'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's a string that contains all the necessary information to connect to the Iggy API with only a single caveat, as it does support TCP protocol only for now. Here's the basic example:</p>
+<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_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'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&tls_domain=test.com&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'd notice that it does use <code>IggySharedMut<></code> which means that you can use a single instance of the client across multiple threads. Typically, it's a good idea to create a separate connection for producing and consuming, but it's not a requirement.</p>
+<h2 class="anchor 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's quite simple to use and doesn't require you to handle the offsets, partitions or any other low-level details. To begin with, you can simply invoke <code>client.producer()</code> to get the <code>IggyProducerBuilder</code> allowing you to configure the producer. Let's take a look at the basic example:</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_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. You can choose between the <code>direct</code> (an instant producer) or the <code>background</code> (which will send the messages in the background by buffering them). The partitioning is set to <code>balanced</code> which means that the producer will try to distribute the messages evenly across all the partitions. The <code>init()</code> method is used to en [...]
+<p>Finally, you can use the <code>send()</code> method to send the messages to the topic. The producer doesn't need to be a mutable reference, as it's only required during the initialization phase. Here's how you can send the messages:</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_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'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's quite simple to use and doesn't require you to handle the offsets, partitions or any other low-level details. To begin with, you can simply invoke <code>client.consumer()</code> to get the <code>IggyConsumerBuilder</code> allowing you to configure the consumer. Let's take a look at the basic example:</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_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't need to be a mutable reference, as it's only required during the initialization phase. Here's how you can consume the messages:</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_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/sdk/rust/examples"><div class="pagination-nav__sublabel">Previous</div><div class="pagination-nav__label">Examples</div></a><a class="pagination-nav__link pagina [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/sdk/rust/intro/index.html b/docs/sdk/rust/intro/index.html
new file mode 100644
index 000000000..5c4a56c2c
--- /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.00ae354b.css">
+<script src="/assets/js/runtime~main.abd83413.js" defer="defer"></script>
+<script src="/assets/js/main.e9fd05f4.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><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/sdk/rust/stream-builder/index.html b/docs/sdk/rust/stream-builder/index.html
new file mode 100644
index 000000000..7ac0c6f9a
--- /dev/null
+++ b/docs/sdk/rust/stream-builder/index.html
@@ -0,0 +1,102 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-sdk/rust/sdk-rust-stream-builder" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.7.0">
+<title data-rh="true">Stream Builder | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" pro [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed"><link rel="stylesheet" href="/assets/css/styles.00ae354b.css">
+<script src="/assets/js/runtime~main.abd83413.js" defer="defer"></script>
+<script src="/assets/js/main.e9fd05f4.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 [...]
+indeed, it does provide a simple way to connect to the server. However, when you write an event based application,
+you typically encounter one or more of the following scenarios:</p>
+<ol>
+<li>The consumer and producer operate on the same stream and topic.</li>
+<li>The consumer operates on different streams and topics.</li>
+<li>The producers operate on different streams and topics.</li>
+<li>Add consumers dynamically at runtime.</li>
+<li>Add producers dynamically at runtime.</li>
+</ol>
+<p>The stream builder provides a convenient way to create the iggy client, producer and consumer for these use cases.
+All source code examples are located in the <a href="https://github.com/apache/iggy/tree/master/core/examples/src/stream-builder" target="_blank" rel="noopener noreferrer"><strong>examples folder</strong></a> of the iggy repository. Also,
+if you encounter a problem with any of the examples below, please ask in the <a href="https://discord.gg/C5Sux5NcRa" target="_blank" rel="noopener noreferrer"><strong>community discord</strong></a>.</p>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="iggystream-builder">IggyStream Builder<a href="#iggystream-builder" class="hash-link" aria-label="Direct link to IggyStream Builder" title="Direct link to IggyStream Builder"></a></h2>
+<p>In the first case, the IggyStream Builder offers a fast and efficient way to get you started:</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_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>As you can see, the <code>IggyStream</code> builder is used to create the iggy client, producer and consumer.
+Here, we use the default configuration to get started quickly, but you can always customize the configuration to fit
+your requirements.</p>
+<p>The <code>consume_messages</code> method is not part of the IggyConsumer; instead, you import the IggyConsumerMessageExt
+trait which provides the <code>consume_messages</code> method. The PrintEventConsumer implements the MessageConsumer trait
+and is invoked to process each incoming message. A simple implementation is show below:</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_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="iggystreamproducer-builder">IggyStreamProducer Builder<a href="#iggystreamproducer-builder" class="hash-link" aria-label="Direct link to IggyStreamProducer Builder" title="Direct link to IggyStreamProducer Builder"></a></h2>
+<p>When you implement the producer side, you can use the <code>IggyStreamProducer</code> to get started:</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_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>If you already have a custom iggy client, you can use that one by replacing the <code>with_client_from_url</code>
+constructor with the following:</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_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"> </span><span class="token keyword" style="color:#00009f">let</span><span class="token p [...]
+<p>You find sample utils to build a customized iggy client in
+the <a href="https://github.com/apache/iggy/blob/master/core/examples/src/shared/client.rs" target="_blank" rel="noopener noreferrer"><strong>examples folder</strong></a> of the iggy
+repository.</p>
+<h3 class="anchor anchorWithStickyNavbar_LWe7" id="producer-configuration">Producer configuration<a href="#producer-configuration" class="hash-link" aria-label="Direct link to Producer configuration" title="Direct link to Producer configuration"></a></h3>
+<p>The IggyProducerConfig gives you a way to configure the producer in sufficient detail. Please note, if you have
+questions about any of those settings, please ask in the community discord. For basic customization, the <code>from_stream_topic</code> constructor
+lets you set a custom stream and topic name as well as the maximum batch size and message send interval.</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_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>The remaining configuration fields are set to default values applicable to the most common use case. This should be sufficient for a simple application, or proof of concept without getting lost in details.
+However, for more complex applications, you might want to configure more
+details and for that, see below a commented example of the full producer configuration:</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_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>Note, when your requirements exceed this configuration, you can still
+use the <a href="https://github.com/apache/iggy/blob/master/core/examples/src/basic/producer/main.rs" target="_blank" rel="noopener noreferrer"><strong>underlying low level SDK</strong></a> for fine grained control over every detail of the producer.</p>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="iggystreamconsumer-builder">IggyStreamConsumer Builder<a href="#iggystreamconsumer-builder" class="hash-link" aria-label="Direct link to IggyStreamConsumer Builder" title="Direct link to IggyStreamConsumer Builder"></a></h2>
+<p>When you have an existing server with multiple producers, you may have to implement a consumer for a specific stream or
+topic. In some cases you may already have a configured iggy client, in others you may need to create
+one. In either case, you can use the <code>IggyStreamConsumer</code> to create the consumer.</p>
+<h3 class="anchor anchorWithStickyNavbar_LWe7" id="build-consumer-and-client">Build consumer and client<a href="#build-consumer-and-client" class="hash-link" aria-label="Direct link to Build consumer and client" title="Direct link to Build consumer and client"></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">use</span><span class="token plain"> </span><span class="token name [...]
+<p>Similar to the previous StreamBuilder, the IggyConsumerMessageExt is used to process messages using
+the PrintEventConsumer implementation of the MessageConsumer trait.</p>
+<h3 class="anchor anchorWithStickyNavbar_LWe7" id="build-consumer-from-an-existing-client">Build consumer from an existing client<a href="#build-consumer-from-an-existing-client" class="hash-link" aria-label="Direct link to Build consumer from an existing client" title="Direct link to Build consumer from an existing client"></a></h3>
+<p>In the event that you have an existing iggy client, you can use the <code>IggyStreamConsumer::build</code> method to create the
+consumer. To do so, just replace the <code>with_client_from_url</code> with the following:</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_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"> </span><span class="token keyword" style="color:#00009f">let</span><span class="token plai [...]
+<p>Notice, you find some utils to build a customized iggy client in
+the <a href="https://github.com/apache/iggy/blob/master/core/examples/src/shared/client.rs" target="_blank" rel="noopener noreferrer"><strong>examples folder</strong></a> of the iggy
+repository.</p>
+<h3 class="anchor anchorWithStickyNavbar_LWe7" id="consumer-configuration">Consumer configuration<a href="#consumer-configuration" class="hash-link" aria-label="Direct link to Consumer configuration" title="Direct link to Consumer configuration"></a></h3>
+<p>The default configuration only exists to get you started quickly i.e. to test out an idea, draft an proof of concept or
+similar. In practice, you often want fine grained control over the configuration. The IggyConsumerConfig gives you a way
+to configure the consumer in sufficient detail without distracting with low level details.
+Please note, if you have questions about any of those settings, please ask in
+the <a href="https://discord.gg/C5Sux5NcRa" target="_blank" rel="noopener noreferrer">community discord</a>. See below a commented configuration example:</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_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="add-consumers-dynamically-at-runtime">Add consumers dynamically at runtime.<a href="#add-consumers-dynamically-at-runtime" class="hash-link" aria-label="Direct link to Add consumers dynamically at runtime." title="Direct link to Add consumers dynamically at runtime."></a></h2>
+<p>When you create consumers on demand at application runtime, you have to
+ensure that the stream and topic exist before creating the consumer and
+you have to set the <code>init_retries</code> and <code>init_interval</code> in the stream builder
+to ensure the consumer retries a few more times in case the topic and stream are not immediately available.</p>
+<p>However, when you cannot guarantee that the stream or topic exist before the consumer starts,
+you have to set <code>create_stream_if_not_exists</code> and <code>create_topic_if_not_exists</code> to <code>true</code> in the IggyConsumerConfig
+to ensure the consumer creates them and starts correctly. Other than that, you just call the
+<code>IggyStreamConsumer::build</code> method as before i.e.:</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_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"> </span><span class="token keyword" style="color:#00009f">let</span><span class="token p [...]
+<p>Where <code>get_my_custom_iggy_consumer_config</code> refers to a function that returns an <code>IggyConsumerConfig</code>
+that specifies the stream and topic to consume as well the init retry or whether to create the stream and topic.</p>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="add-producers-dynamically-at-runtime">Add producers dynamically at runtime.<a href="#add-producers-dynamically-at-runtime" class="hash-link" aria-label="Direct link to Add producers dynamically at runtime." title="Direct link to Add producers dynamically at runtime."></a></h2>
+<p>Adding new producers to the iggy server at runtime is as simple as creating a new config and
+calling the <code>IggyStreamProducer::build</code> method. Unlike the consumer, the producer always crates
+missing streams or topics by default. The <code>IggyConsumerConfig</code> has a convenient builder to create
+a new configuration from just the stream, topic, batch size and send interval. See the example below.</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_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"> </span><span class="token keyword" style="color:#00009f">let</span><span class="token p [...]
+<p>If you encounter a problem with any of the examples show on this page,
+please ask in the <a href="https://discord.gg/C5Sux5NcRa" target="_blank" rel="noopener noreferrer"><strong>community discord</strong></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/rust/high-level-sdk"><div class="pagination-nav__sublabel">Previous</div><div class="pagination-nav__label">High-level SDK</div></a><a class="pagination-nav__link pagination-nav__link--next [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/server/benchmarking/index.html b/docs/server/benchmarking/index.html
new file mode 100644
index 000000000..9446f7a52
--- /dev/null
+++ b/docs/server/benchmarking/index.html
@@ -0,0 +1,59 @@
+<!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.00ae354b.css">
+<script src="/assets/js/runtime~main.abd83413.js" defer="defer"></script>
+<script src="/assets/js/main.e9fd05f4.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've also built the <strong><a href="https://benchmarks.iggy.apache.org" target="_blank" rel="noopener noreferrer">benchmarking platform</a></strong> where anyone can upload the benchmarks and compare the results with others. This is the another open-source project available <a href="https://github.com/iggy-rs/iggy-bench-dashboard" target="_blank" rel="noopener noreferrer">here</a>.</p>
+<p><img decoding="async" loading="lazy" alt="Benchmarking Platform" src="/assets/images/bench_platform-dad3f0256bec6e556b40ea798366b7fe.png" width="2048" height="1255" class="img_ev3q"></p>
+<p>Iggy comes with a built-in benchmarking tool <code>iggy-bench</code> that allows you to measure the performance of the server. It is written in Rust and uses the <code>tokio</code> runtime for asynchronous I/O operations mimicking the example client applications. The tool is designed to be as close to real-world scenarios as possible, so you can use it to estimate the performance of the server in your environment. It is part of the <a href="https://github.com/apache/iggy/tree/master/ [...]
+<p><img decoding="async" loading="lazy" alt="Bench CLI" src="/assets/images/bench_cli-02b0d7bd13656d700fbdf1c76ae76fa3.png" width="2048" height="1079" class="img_ev3q"></p>
+<p>To benchmark the project, first build the project in release mode:</p>
+<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_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>Then, run the benchmarking app with the desired options:</p>
+<ol>
+<li>
+<p>Sending (writing) benchmark</p>
+<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_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 -- -v pinned-producer tcp</span><br></span></code></pre><div cl [...]
+</li>
+<li>
+<p>Polling (reading) benchmark</p>
+<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_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 -- -v pinned-consumer tcp</span><br></span></code></pre><div cl [...]
+</li>
+<li>
+<p>Parallel sending and polling benchmark</p>
+<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_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 -- -v pinned-producer-and-consumer tcp</span><br></span></code> [...]
+</li>
+<li>
+<p>Balanced sending to multiple partitions benchmark</p>
+<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_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 -- -v balanced-producer tcp</span><br></span></code></pre><div [...]
+</li>
+<li>
+<p>Consumer group polling benchmark:</p>
+<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_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 -- -v balanced-consumer-group tcp</span><br></span></code></pre [...]
+</li>
+<li>
+<p>Parallel balanced sending and polling from consumer group benchmark:</p>
+<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_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 -- -v balanced-producer-and-consumer-group tcp</span><br></span [...]
+</li>
+<li>
+<p>End to end producing and consuming benchmark (single task produces and consumes messages in sequence):</p>
+<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_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 -- -v end-to-end-producing-consumer tcp</span><br></span></code [...]
+</li>
+</ol>
+<p>These benchmarks would start the server with the default configuration, create a stream, topic and partition, and then send or poll the messages. The default configuration is optimized for the best performance, so you might want to tweak it for your needs. If you need more options, please refer to <code>iggy-bench</code> subcommands <code>help</code> and <code>examples</code>.</p>
+<p>For example, to run the benchmark for the already started server, provide the additional argument <code>--server-address 0.0.0.0:8090</code>.</p>
+<p>Depending on the hardware, transport protocol (<code>quic</code>, <code>tcp</code> or <code>http</code>) and payload size (<code>messages-per-batch * message-size</code>) you might expect <strong>over 5000 MB/s (e.g. 5M of 1 KB msg/sec) throughput for writes and reads</strong>.</p>
+<p><strong>Iggy is already capable of processing millions of messages per second at the microseconds range for p99+ latency</strong>, and with the upcoming optimizations related to the io_uring support along with the shared-nothing design, it will only get better.</p></div></article><nav class="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-nav__sublabel">Previous</div>< [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/server/configuration/index.html b/docs/server/configuration/index.html
new file mode 100644
index 000000000..ecb3a87ef
--- /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.00ae354b.css">
+<script src="/assets/js/runtime~main.abd83413.js" defer="defer"></script>
+<script src="/assets/js/main.e9fd05f4.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'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/apache/iggy/blob/master/core/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 [...]
+<p>To consume the HTTP API from Iggy SDK, you need to make use of the available <code>HttpClient</code> component.</p>
+<p>HTTP API is highly performant, however, it's not as performant as TCP, and, since it's a stateless protocol, there's no such thing as the ongoing connection between client and server, thus some of the features such as consumer groups are not available.</p>
+<h3 class="anchor 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's a stateful protocol, however, it's not as performant as TCP. QUIC support is built on top of <a href="https://github.com/quinn-rs/quinn" target="_blank" rel="noopener noreferrer">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><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/server/docker/index.html b/docs/server/docker/index.html
new file mode 100644
index 000000000..30bb34cb3
--- /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.00ae354b.css">
+<script src="/assets/js/runtime~main.abd83413.js" defer="defer"></script>
+<script src="/assets/js/main.e9fd05f4.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><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/server/introduction/index.html b/docs/server/introduction/index.html
new file mode 100644
index 000000000..c92ec31bd
--- /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.00ae354b.css">
+<script src="/assets/js/runtime~main.abd83413.js" defer="defer"></script>
+<script src="/assets/js/main.e9fd05f4.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's responsible for handling all the incoming connections, managing the data and providing the API for the clients. The server is written in Rust and can be run on any platform that supports it.</p>
+<p>The releases are published to GitHub and can be found <a href="https://github.com/apache/iggy/tags" target="_blank" rel="noopener noreferrer">here</a>. The official Docker images can be found <a href="https://hub.docker.com/r/apache/iggy" target="_blank" rel="noopener noreferrer">here</a>, simply type <code>docker pull apache/iggy</code>.</p>
+<p>Keep in mind, that if you were to compile the source code in release mode, the longer compilation time is due to <a href="https://doc.rust-lang.org/rustc/linker-plugin-lto.html" target="_blank" rel="noopener noreferrer">LTO</a> enabled in <a href="https://github.com/apache/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/apache/iggy/blob/master/core/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's credentials or personal access token and is valid for the duration of the session or until the user logs out or the connection is lost. In case of HTTP API, the authentication is done by providing the <code>Authorization</code> header with the <code>Bearer</code> token.</p></div></article><nav clas [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/server/schema/index.html b/docs/server/schema/index.html
new file mode 100644
index 000000000..c036d3af0
--- /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.00ae354b.css">
+<script src="/assets/js/runtime~main.abd83413.js" defer="defer"></script>
+<script src="/assets/js/main.e9fd05f4.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's being used by TCP and QUIC transports. The JSON format is used by HTTP transport - all the existing endpoints are available in the <a href="https://github.com/apache/iggy/blob/master/core/server/server.http" target="_blank" rel="noopener noreferrer">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'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. "my-stream") 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><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/web-ui/iggy-web-ui/index.html b/docs/web-ui/iggy-web-ui/index.html
new file mode 100644
index 000000000..7e1342df4
--- /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.00ae354b.css">
+<script src="/assets/js/runtime~main.abd83413.js" defer="defer"></script>
+<script src="/assets/js/main.e9fd05f4.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-40085aee2ec268a2dbb1e8c946009e38.png" width="2048" height="1198" class="img_ev3q"></p>
+<p>Here's the full example of the <code>docker-compose.yml</code> file that starts the Iggy server, initializes it with the <code>my-stream</code> stream and <code>my-topic</code> topic with the help of <a 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><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/downloads/index.html b/downloads/index.html
new file mode 100644
index 000000000..381cb4ff1
--- /dev/null
+++ b/downloads/index.html
@@ -0,0 +1,47 @@
+<!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">Downloads | Hyper-Efficient Message Streaming at Laser Speed.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" name="twitter:image" content="https://iggy.apache.org/img//apache-iggy-light-bg0.5x.png"><meta data-rh="true" property [...]
+<link rel="alternate" type="application/atom+xml" href="/blogs/atom.xml" title="Hyper-Efficient Message Streaming at Laser Speed. Atom Feed"><link rel="stylesheet" href="/assets/css/styles.00ae354b.css">
+<script src="/assets/js/runtime~main.abd83413.js" defer="defer"></script>
+<script src="/assets/js/main.e9fd05f4.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 Apache Iggy project publishes source‑code releases as compressed archives (<code>.tar.gz</code>). Binary convenience builds may appear in the future, but <strong>the only official artifacts today are the source packages signed by Iggy committers and mirrored by the Apache Software Foundation.</strong></p>
+<hr>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="releases">Releases<a href="#releases" class="hash-link" aria-label="Direct link to Releases" title="Direct link to Releases"></a></h2>
+<table><thead><tr><th>Version</th><th>Date (UTC)</th><th>Source archive</th><th>Signatures & checksums</th></tr></thead><tbody><tr><td><strong>0.5.0-incubating</strong> <em>(latest)</em></td><td>2025-08-10</td><td><a href="https://downloads.apache.org/incubator/iggy/0.5.0/iggy-0.5.0-incubating-src.tar.gz" target="_blank" rel="noopener noreferrer"><code>iggy-0.5.0-incubating-src.tar.gz</code></a></td><td><a href="https://downloads.apache.org/incubator/iggy/0.5.0/iggy-0.5.0-incubating- [...]
+<p>Older incubating releases will appear in the same <a href="https://downloads.apache.org/incubator/iggy/" target="_blank" rel="noopener noreferrer">downloads directory</a> after they are approved by the Apache Incubator PMC. Permanent archives are kept at <a href="https://archive.apache.org/" target="_blank" rel="noopener noreferrer">archive.apache.org</a>; none exist yet because there are no older releases.</p>
+<hr>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="notes">Notes<a href="#notes" class="hash-link" aria-label="Direct link to Notes" title="Direct link to Notes"></a></h2>
+<ul>
+<li><strong>Verify before use.</strong> Always check the OpenPGP <strong>signature</strong> (<code>.asc</code>) or, if that is not possible, at least the <strong>SHA‑512 checksum</strong>.</li>
+<li>The <a href="https://downloads.apache.org/incubator/iggy/KEYS" target="_blank" rel="noopener noreferrer"><code>KEYS</code></a> file contains all public keys used to sign Iggy releases. Import it once; only new keys need to be added in future releases.</li>
+<li>Because Iggy is still in the Apache Incubator, releases are <strong>incubating releases</strong> and are not yet official ASF products. They are distributed under the Incubator’s rules and may evolve rapidly.</li>
+</ul>
+<hr>
+<h3 class="anchor anchorWithStickyNavbar_LWe7" id="verify-the-signature">Verify the signature<a href="#verify-the-signature" class="hash-link" aria-label="Direct link to Verify the signature" title="Direct link to Verify the signature"></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"># Download artifact, matching .asc file and KEYS</span><br></span><span class="token-line" [...]
+<p>A successful verification prints <strong>"Good signature from …"</strong> and the fingerprint of an Iggy committer’s key.</p>
+<hr>
+<h3 class="anchor anchorWithStickyNavbar_LWe7" id="verify-the-checksum">Verify the checksum<a href="#verify-the-checksum" class="hash-link" aria-label="Direct link to Verify the checksum" title="Direct link to Verify the checksum"></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">curl -O https://downloads.apache.org/incubator/iggy/0.5.0/iggy-0.5.0-incubating-src.tar.gz. [...]
+<p>The command should output:</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">iggy-0.5.0-incubating-src.tar.gz: OK</span><br></span></code></pre><div class="buttonGroup__atx"><button [...]
+<hr>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="need-bleeding-edge-code">Need bleeding-edge code?<a href="#need-bleeding-edge-code" class="hash-link" aria-label="Direct link to Need bleeding-edge code?" title="Direct link to Need bleeding-edge code?"></a></h2>
+<p>The latest development code is available from the <code>master</code> branch on GitHub:</p>
+<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_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">git clone https://github.com/apache/iggy.git</span><br></span></code></pre><div class="butt [...]
+<p>Be aware that trunk builds <strong>may be unstable and are not ASF‑endorsed releases</strong>.</p>
+<hr>
+<p>© 2025 The Apache Software Foundation.
+Apache, Apache Iggy, the Apache feather logo, and related marks are trademarks of the ASF.</p></article></div><div class="col col--2"><div class="tableOfContents_bqdL thin-scrollbar"><ul class="table-of-contents table-of-contents__left-border"><li><a href="#releases" class="table-of-contents__link toc-highlight">Releases</a></li><li><a href="#notes" class="table-of-contents__link toc-highlight">Notes</a><ul><li><a href="#verify-the-signature" class="table-of-contents__link toc-highlight" [...]
+<div><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/fonts/Inter-Medium.ttf b/fonts/Inter-Medium.ttf
new file mode 100644
index 000000000..06ae9e9c4
Binary files /dev/null and b/fonts/Inter-Medium.ttf differ
diff --git a/fonts/Inter-Regular.ttf b/fonts/Inter-Regular.ttf
new file mode 100644
index 000000000..cc73944ac
Binary files /dev/null and b/fonts/Inter-Regular.ttf differ
diff --git a/fonts/Inter-SemiBold.ttf b/fonts/Inter-SemiBold.ttf
new file mode 100644
index 000000000..278ceaa36
Binary files /dev/null and b/fonts/Inter-SemiBold.ttf differ
diff --git a/img/AdvancedFeatures.svg b/img/AdvancedFeatures.svg
new file mode 100644
index 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/Avatar-Placeholder.svg b/img/Avatar-Placeholder.svg
new file mode 100644
index 000000000..9a71aadd5
--- /dev/null
+++ b/img/Avatar-Placeholder.svg
@@ -0,0 +1,9 @@
+<svg width="320" height="320" viewBox="0 0 320 320" fill="none" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+<rect width="320" height="320" fill="url(#pattern0)"/>
+<defs>
+<pattern id="pattern0" patternContentUnits="objectBoundingBox" width="1" height="1">
+<use xlink:href="#image0_2258_22954" transform="scale(0.00225225)"/>
+</pattern>
+<image id="image0_2258_22954" width="444" height="444" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAbwAAAG8CAYAAAClsBDfAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAABJ/SURBVHgB7d17b1TXucDhlUAIjuwDAYFikoJElEQ6qXQqnX7/T5BKjZRUDVGQzDWyi7nYYkgAUb+MdwwEsD37Mnuv93kkaxzaqH8w3b9Z1/ng0ezFiwIAlfuwAEACggdACoIHQAqCB0AKggdACoIHQAqCB0AKggdACoIHQAqCB0AKggdACoIHQAqCB0AKggdACoIHQAqCB0AKggdACoIHQAqCB0AKggdACoIHQAqCB0AKggdACoIHQAqCB0AKggdACoIHQAqCB0AKggdACoIHQAqCB0AKggd [...]
+</defs>
+</svg>
diff --git a/img/ExtremelyEfficient.svg b/img/ExtremelyEfficient.svg
new file mode 100644
index 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/Image-Placeholder-1.svg b/img/Image-Placeholder-1.svg
new file mode 100644
index 000000000..0f37ffcdf
--- /dev/null
+++ b/img/Image-Placeholder-1.svg
@@ -0,0 +1,4 @@
+<svg width="800" height="600" viewBox="0 0 800 600" fill="none" xmlns="http://www.w3.org/2000/svg">
+<rect width="800" height="600" fill="#F2F7FF"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M421.524 283.579H416.421V278.476C416.421 277.112 415.309 276 413.945 276H413.869C412.48 276 411.368 277.112 411.368 278.476V283.579H406.291C404.926 283.579 403.815 284.691 403.789 286.055V286.131C403.789 287.52 404.901 288.632 406.291 288.632H411.368V293.709C411.368 295.074 412.48 296.211 413.869 296.185H413.945C415.309 296.185 416.421 295.074 416.421 293.709V288.632H421.524C422.888 288.632 424 287.52 424 286.156V286.055C424 284.691 422.88 [...]
+</svg>
diff --git a/img/Image-Placeholder-2.svg b/img/Image-Placeholder-2.svg
new file mode 100644
index 000000000..3f2b8c1df
--- /dev/null
+++ b/img/Image-Placeholder-2.svg
@@ -0,0 +1,4 @@
+<svg width="800" height="600" viewBox="0 0 800 600" fill="none" xmlns="http://www.w3.org/2000/svg">
+<rect width="800" height="600" fill="#EDF0F3"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M421.524 283.579H416.421V278.476C416.421 277.112 415.309 276 413.945 276H413.869C412.48 276 411.368 277.112 411.368 278.476V283.579H406.291C404.926 283.579 403.815 284.691 403.789 286.055V286.131C403.789 287.52 404.901 288.632 406.291 288.632H411.368V293.709C411.368 295.074 412.48 296.211 413.869 296.185H413.945C415.309 296.185 416.421 295.074 416.421 293.709V288.632H421.524C422.888 288.632 424 287.52 424 286.156V286.055C424 284.691 422.88 [...]
+</svg>
diff --git a/img/Image-Placeholder-3.svg b/img/Image-Placeholder-3.svg
new file mode 100644
index 000000000..16fbd283b
--- /dev/null
+++ b/img/Image-Placeholder-3.svg
@@ -0,0 +1,4 @@
+<svg width="800" height="600" viewBox="0 0 800 600" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M0 20C0 8.95432 8.95431 0 20 0H780C791.046 0 800 8.95431 800 20V580C800 591.046 791.046 600 780 600H20C8.95429 600 0 591.046 0 580V20Z" fill="#E6EEFF"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M421.524 283.579H416.421V278.476C416.421 277.112 415.309 276 413.945 276H413.869C412.48 276 411.368 277.112 411.368 278.476V283.579H406.291C404.926 283.579 403.815 284.691 403.789 286.055V286.131C403.789 287.52 404.901 288.632 406.291 288.632H411.368V293.709C411.368 295.074 412.48 296.211 413.869 296.185H413.945C415.309 296.185 416.421 295.074 416.421 293.709V288.632H421.524C422.888 288.632 424 287.52 424 286.156V286.055C424 284.691 422.88 [...]
+</svg>
diff --git a/img/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/Switch-Handle.svg b/img/Switch-Handle.svg
new file mode 100644
index 000000000..798bf7182
--- /dev/null
+++ b/img/Switch-Handle.svg
@@ -0,0 +1,3 @@
+<svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg">
+<rect width="12" height="12" rx="6" fill="white"/>
+</svg>
diff --git a/img/SystemFlow-Logo-White.svg b/img/SystemFlow-Logo-White.svg
new file mode 100644
index 000000000..aba7b4def
--- /dev/null
+++ b/img/SystemFlow-Logo-White.svg
@@ -0,0 +1,11 @@
+<svg width="253" height="40" viewBox="0 0 253 40" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M11.0737 31.4947C7.70525 31.4947 5.05262 30.807 3.11578 29.4316C1.17895 28.0281 0.140351 26.0632 0 23.5369H6.73683C6.84911 24.2386 7.2842 24.8421 8.04209 25.3474C8.79998 25.8526 9.86665 26.1053 11.2421 26.1053C12.2245 26.1053 13.0666 25.9649 13.7684 25.6842C14.4982 25.3755 14.8631 24.8842 14.8631 24.2105C14.8631 23.6211 14.5824 23.1439 14.021 22.779C13.4596 22.386 12.4351 22.1193 10.9473 21.979L9.34735 21.8106C6.37192 21.5018 4.18245 20.6877 2.77894 19.3685C1.37544 18.0492 0.673 [...]
+<path d="M25.4174 40V33.6H30.7647C31.4104 33.6 31.9577 33.5158 32.4068 33.3474C32.856 33.179 33.2209 32.8982 33.5016 32.5053C33.7823 32.1404 33.9928 31.6211 34.1332 30.9474L39.3542 7.49479H46.5963L40.491 32.4211C40.0419 34.3298 39.4103 35.8316 38.5963 36.9263C37.8103 38.0491 36.7156 38.8351 35.3121 39.2842C33.9367 39.7614 32.1402 40 29.9226 40H25.4174ZM32.7858 30.2316V24.3369H37.67V30.2316H32.7858ZM29.249 30.2316L22.47 7.49479H30.1332L36.4911 30.2316H29.249Z" fill="white"/>
+<path d="M58.5242 31.4947C55.1558 31.4947 52.5032 30.807 50.5664 29.4316C48.6295 28.0281 47.5909 26.0632 47.4506 23.5369H54.1874C54.2997 24.2386 54.7348 24.8421 55.4927 25.3474C56.2506 25.8526 57.3172 26.1053 58.6927 26.1053C59.6751 26.1053 60.5172 25.9649 61.219 25.6842C61.9488 25.3755 62.3137 24.8842 62.3137 24.2105C62.3137 23.6211 62.033 23.1439 61.4716 22.779C60.9102 22.386 59.8856 22.1193 58.3979 21.979L56.7979 21.8106C53.8225 21.5018 51.633 20.6877 50.2295 19.3685C48.826 18.0492 48 [...]
+<path d="M84.0199 31.0737C81.4936 31.0737 79.4726 30.7649 77.9568 30.1474C76.4691 29.5298 75.3884 28.5053 74.7147 27.0737C74.041 25.6421 73.7041 23.7053 73.7041 21.2632L73.7463 1.43164H80.8199L80.7778 21.4737C80.7778 22.5123 81.0445 23.3123 81.5778 23.8737C82.1392 24.407 82.9392 24.6737 83.9778 24.6737H87.1778V31.0737H84.0199ZM70.3357 13.0527V7.49479H87.1778V13.0527H70.3357Z" fill="white"/>
+<path d="M102.108 31.579C100.143 31.579 98.4028 31.2421 96.887 30.5684C95.3712 29.8947 94.094 28.9825 93.0554 27.8316C92.0168 26.6807 91.2168 25.3895 90.6554 23.9579C90.1221 22.5263 89.8554 21.0527 89.8554 19.5369V18.6948C89.8554 17.1228 90.1221 15.6211 90.6554 14.1895C91.2168 12.7299 92.0028 11.4386 93.0133 10.3158C94.0519 9.19303 95.3151 8.30882 96.8028 7.66321C98.2905 6.98953 99.9747 6.65268 101.855 6.65268C104.354 6.65268 106.473 7.21409 108.213 8.33689C109.954 9.4597 111.287 10.9474 [...]
+<path d="M117.642 30.7369V7.49479H123.705V17.5158H123.368C123.368 15.1018 123.663 13.1088 124.252 11.5369C124.87 9.93689 125.768 8.74391 126.947 7.95795C128.126 7.14391 129.572 6.73689 131.284 6.73689H131.621C133.361 6.73689 134.807 7.14391 135.958 7.95795C137.137 8.74391 138.021 9.93689 138.61 11.5369C139.228 13.1088 139.537 15.1018 139.537 17.5158H137.768C137.768 15.1018 138.063 13.1088 138.652 11.5369C139.27 9.93689 140.168 8.74391 141.347 7.95795C142.526 7.14391 143.972 6.73689 145.6 [...]
+<path d="M159.675 30.7368V8.08419C159.675 5.36139 160.461 3.34034 162.033 2.02105C163.605 0.673683 165.934 0 169.022 0H171.085V5.55788H168.854C168.18 5.55788 167.661 5.74034 167.296 6.10525C166.931 6.47016 166.748 6.98946 166.748 7.66314V30.7368H159.675ZM157.148 13.8105V8.25262H171.254V13.8105H157.148ZM175.085 30.7368V0H182.748V30.7368H175.085ZM172.769 5.55788V0H182.748V5.55788H172.769Z" fill="white" fill-opacity="0.6"/>
+<path d="M199.986 31.5789C197.936 31.5789 196.112 31.2701 194.512 30.6526C192.912 30.035 191.55 29.1789 190.428 28.0842C189.333 26.9894 188.491 25.7263 187.901 24.2947C187.34 22.8631 187.059 21.3333 187.059 19.7052V18.6947C187.059 17.0105 187.354 15.4386 187.943 13.9789C188.561 12.5193 189.431 11.2421 190.554 10.1473C191.677 9.05262 193.038 8.19648 194.638 7.57893C196.238 6.96139 198.021 6.65262 199.986 6.65262C201.979 6.65262 203.761 6.96139 205.333 7.57893C206.933 8.19648 208.294 9.052 [...]
+<path d="M225.626 30.7368L229.753 8.25262H237.753L242.468 30.7368H236.658L231.774 8.42104H235.31L230.847 30.7368H225.626ZM224.195 30.7368L224.153 24.3368H228.784L228.826 30.7368H224.195ZM220.447 30.7368L214.342 7.49472H221.837L227.479 30.7368H220.447ZM238.721 30.7368L238.763 24.3368H243.395L243.353 30.7368H238.721ZM240.574 30.7368L245.668 7.49472H252.658L247.1 30.7368H240.574Z" fill="white" fill-opacity="0.6"/>
+</svg>
diff --git a/img/SystemFlow-Logo.svg b/img/SystemFlow-Logo.svg
new file mode 100644
index 000000000..5e3c2e6f1
--- /dev/null
+++ b/img/SystemFlow-Logo.svg
@@ -0,0 +1,11 @@
+<svg width="253" height="40" viewBox="0 0 253 40" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M11.0737 31.4947C7.70525 31.4947 5.05262 30.807 3.11578 29.4316C1.17895 28.0281 0.140351 26.0632 0 23.5369H6.73683C6.84911 24.2386 7.2842 24.8421 8.04209 25.3474C8.79998 25.8526 9.86665 26.1053 11.2421 26.1053C12.2245 26.1053 13.0666 25.9649 13.7684 25.6842C14.4982 25.3755 14.8631 24.8842 14.8631 24.2105C14.8631 23.6211 14.5824 23.1439 14.021 22.779C13.4596 22.386 12.4351 22.1193 10.9473 21.979L9.34735 21.8106C6.37192 21.5018 4.18245 20.6877 2.77894 19.3685C1.37544 18.0492 0.673 [...]
+<path d="M25.4174 40V33.6H30.7647C31.4104 33.6 31.9577 33.5158 32.4068 33.3474C32.856 33.179 33.2209 32.8982 33.5016 32.5053C33.7823 32.1404 33.9928 31.6211 34.1332 30.9474L39.3542 7.49479H46.5963L40.491 32.4211C40.0419 34.3298 39.4103 35.8316 38.5963 36.9263C37.8103 38.0491 36.7156 38.8351 35.3121 39.2842C33.9367 39.7614 32.1402 40 29.9226 40H25.4174ZM32.7858 30.2316V24.3369H37.67V30.2316H32.7858ZM29.249 30.2316L22.47 7.49479H30.1332L36.4911 30.2316H29.249Z" fill="#2F54EB"/>
+<path d="M58.5242 31.4947C55.1558 31.4947 52.5032 30.807 50.5664 29.4316C48.6295 28.0281 47.5909 26.0632 47.4506 23.5369H54.1874C54.2997 24.2386 54.7348 24.8421 55.4927 25.3474C56.2506 25.8526 57.3172 26.1053 58.6927 26.1053C59.6751 26.1053 60.5172 25.9649 61.219 25.6842C61.9488 25.3755 62.3137 24.8842 62.3137 24.2105C62.3137 23.6211 62.033 23.1439 61.4716 22.779C60.9102 22.386 59.8856 22.1193 58.3979 21.979L56.7979 21.8106C53.8225 21.5018 51.633 20.6877 50.2295 19.3685C48.826 18.0492 48 [...]
+<path d="M84.0199 31.0737C81.4936 31.0737 79.4726 30.7649 77.9568 30.1474C76.4691 29.5298 75.3884 28.5053 74.7147 27.0737C74.041 25.6421 73.7041 23.7053 73.7041 21.2632L73.7463 1.43164H80.8199L80.7778 21.4737C80.7778 22.5123 81.0445 23.3123 81.5778 23.8737C82.1392 24.407 82.9392 24.6737 83.9778 24.6737H87.1778V31.0737H84.0199ZM70.3357 13.0527V7.49479H87.1778V13.0527H70.3357Z" fill="#2F54EB"/>
+<path d="M102.108 31.579C100.143 31.579 98.4028 31.2421 96.887 30.5684C95.3712 29.8947 94.094 28.9825 93.0554 27.8316C92.0168 26.6807 91.2168 25.3895 90.6554 23.9579C90.1221 22.5263 89.8554 21.0527 89.8554 19.5369V18.6948C89.8554 17.1228 90.1221 15.6211 90.6554 14.1895C91.2168 12.7299 92.0028 11.4386 93.0133 10.3158C94.0519 9.19303 95.3151 8.30882 96.8028 7.66321C98.2905 6.98953 99.9747 6.65268 101.855 6.65268C104.354 6.65268 106.473 7.21409 108.213 8.33689C109.954 9.4597 111.287 10.9474 [...]
+<path d="M117.642 30.7369V7.49479H123.705V17.5158H123.368C123.368 15.1018 123.663 13.1088 124.252 11.5369C124.87 9.93689 125.768 8.74391 126.947 7.95795C128.126 7.14391 129.572 6.73689 131.284 6.73689H131.621C133.361 6.73689 134.807 7.14391 135.958 7.95795C137.137 8.74391 138.021 9.93689 138.61 11.5369C139.228 13.1088 139.537 15.1018 139.537 17.5158H137.768C137.768 15.1018 138.063 13.1088 138.652 11.5369C139.27 9.93689 140.168 8.74391 141.347 7.95795C142.526 7.14391 143.972 6.73689 145.6 [...]
+<path d="M159.675 30.7368V8.08419C159.675 5.36139 160.461 3.34034 162.033 2.02105C163.605 0.673683 165.934 0 169.022 0H171.085V5.55788H168.854C168.18 5.55788 167.661 5.74034 167.296 6.10525C166.931 6.47016 166.748 6.98946 166.748 7.66314V30.7368H159.675ZM157.148 13.8105V8.25262H171.254V13.8105H157.148ZM175.085 30.7368V0H182.748V30.7368H175.085ZM172.769 5.55788V0H182.748V5.55788H172.769Z" fill="#00156A"/>
+<path d="M199.986 31.5789C197.936 31.5789 196.112 31.2701 194.512 30.6526C192.912 30.035 191.55 29.1789 190.428 28.0842C189.333 26.9894 188.491 25.7263 187.901 24.2947C187.34 22.8631 187.059 21.3333 187.059 19.7052V18.6947C187.059 17.0105 187.354 15.4386 187.943 13.9789C188.561 12.5193 189.431 11.2421 190.554 10.1473C191.677 9.05262 193.038 8.19648 194.638 7.57893C196.238 6.96139 198.021 6.65262 199.986 6.65262C201.979 6.65262 203.761 6.96139 205.333 7.57893C206.933 8.19648 208.294 9.052 [...]
+<path d="M225.626 30.7368L229.753 8.25262H237.753L242.468 30.7368H236.658L231.774 8.42104H235.31L230.847 30.7368H225.626ZM224.195 30.7368L224.153 24.3368H228.784L228.826 30.7368H224.195ZM220.447 30.7368L214.342 7.49472H221.837L227.479 30.7368H220.447ZM238.721 30.7368L238.763 24.3368H243.395L243.353 30.7368H238.721ZM240.574 30.7368L245.668 7.49472H252.658L247.1 30.7368H240.574Z" fill="#00156A"/>
+</svg>
diff --git a/img/Video-Placeholder.svg b/img/Video-Placeholder.svg
new file mode 100644
index 000000000..1ec586c37
--- /dev/null
+++ b/img/Video-Placeholder.svg
@@ -0,0 +1,4 @@
+<svg width="720" height="460" viewBox="0 0 720 460" fill="none" xmlns="http://www.w3.org/2000/svg">
+<rect width="720" height="460" fill="#F2F7FF"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M336 230C336 216.752 346.752 206 360 206C373.248 206 384 216.752 384 230C384 243.248 373.248 254 360 254C346.752 254 336 243.248 336 230ZM357.12 220.64C356.328 220.04 355.2 220.616 355.2 221.6V238.4C355.2 239.384 356.328 239.96 357.12 239.36L368.328 230.96C368.976 230.48 368.976 229.52 368.328 229.04L357.12 220.64Z" fill="#ADC6FF"/>
+</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/architecture.png b/img/architecture.png
new file mode 100644
index 000000000..0d1c885f8
Binary files /dev/null and b/img/architecture.png differ
diff --git a/img/asf_logo.svg b/img/asf_logo.svg
new file mode 100644
index 000000000..620694c52
--- /dev/null
+++ b/img/asf_logo.svg
@@ -0,0 +1,210 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_2" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 7127.6 2890" enable-background="new 0 0 7127.6 2890" xml:space="preserve">
+<path fill="#6D6E71" d="M7104.7,847.8c15.3,15.3,22.9,33.7,22.9,55.2c0,21.5-7.6,39.9-22.9,55.4c-15.3,15.4-33.8,23.1-55.6,23.1
+ c-21.8,0-40.2-7.6-55.4-22.9c-15.1-15.3-22.7-33.7-22.7-55.2c0-21.5,7.6-39.9,22.9-55.4c15.3-15.4,33.7-23.1,55.4-23.1
+ C7070.9,824.9,7089.4,832.5,7104.7,847.8z M7098.1,951.9c13.3-13.6,20-29.8,20-48.7s-6.6-35-19.8-48.5
+ c-13.2-13.4-29.4-20.1-48.6-20.1c-19.2,0-35.4,6.7-48.7,20.2c-13.3,13.5-19.9,29.7-19.9,48.7c0,19,6.6,35.2,19.7,48.6
+ c13.1,13.4,29.3,20.1,48.5,20.1S7084.7,965.4,7098.1,951.9z M7087.1,888.1c0,14-6.1,22.8-18.4,26.4l22.5,30.5h-18.2l-20.3-28.3
+ h-18.6v28.3h-14.7v-84.6h31.8c12.8,0,22,2.2,27.6,6.6C7084.4,871.4,7087.1,878.4,7087.1,888.1z M7068.2,900c3-2.4,4.4-6.5,4.4-12
+ c0-5.5-1.5-9.4-4.5-11.6c-3-2.2-8.4-3.2-16-3.2h-18v30.5h17.5C7059.7,903.6,7065.3,902.4,7068.2,900z"/>
+<path fill="#6D6E71" d="M1803.6,499.8v155.4h-20V499.8h-56.8v-19.2h133.9v19.2H1803.6z"/>
+<path fill="#6D6E71" d="M2082.2,655.2v-76.9h-105.2v76.9h-20V480.5h20v78.9h105.2v-78.9h20v174.7H2082.2z"/>
+<path fill="#6D6E71" d="M2241.4,499.8v57.4h88.1v19.2h-88.1v59.8h101.8v19h-121.8V480.5H2340v19.2H2241.4z"/>
+<path fill="#D22128" d="M1574.5,1852.4l417.3-997.6h80.1l417.3,997.6h-105.4l-129.3-311.9h-448.2l-127.9,311.9H1574.5z M2032.6,970
+ l-205.1,493.2h404.7L2032.6,970z"/>
+<path fill="#D22128" d="M2596.9,1852.4V854.8H3010c171.4,0,295.1,158.8,295.1,313.3c0,163-115.2,316.1-286.6,316.1h-324.6v368.1
+ H2596.9z M2693.9,1397.1h318.9c118,0,193.9-108.2,193.9-229c0-125.1-92.7-226.2-202.3-226.2h-310.5V1397.1z"/>
+<path fill="#D22128" d="M3250.5,1852.4l417.3-997.6h80.1l417.3,997.6h-105.4l-129.3-311.9h-448.2l-127.9,311.9H3250.5z M3708.6,970
+ l-205.1,493.2h404.7L3708.6,970z"/>
+<path fill="#D22128" d="M4637.3,849.1c177,0,306.3,89.9,368.1,217.8l-78.7,47.8c-63.2-132.1-186.9-177-295.1-177
+ c-238.9,0-369.5,213.6-369.5,414.5c0,220.6,161.6,420.1,373.7,420.1c112.4,0,244.5-56.2,307.7-185.5l81.5,42.1
+ c-64.6,148.9-241.7,231.8-394.8,231.8c-274,0-466.5-261.3-466.5-514.2C4163.8,1106.3,4336.6,849.1,4637.3,849.1z"/>
+<path fill="#D22128" d="M5949.1,854.8v997.6h-98.4v-466.5h-591.5v466.5h-96.9V854.8h96.9v444h591.5v-444H5949.1z"/>
+<path fill="#D22128" d="M6844.6,1765.2v87.1h-670.2V854.8H6832v87.1h-560.6v359.7h489v82.9h-489v380.8H6844.6z"/>
+<path fill="#6D6E71" d="M1667.6,2063.6c11.8,3.5,22.2,8.3,31,14.2l-10.3,22.6c-9-6-18.6-10.4-28.9-13.4c-10.2-2.9-20-4.4-29.2-4.4
+ c-13.6,0-24.5,2.4-32.6,7.3c-8.1,4.9-12.2,11.8-12.2,20.7c0,7.6,2.3,14,6.8,19c4.5,5,10.2,8.9,17,11.7c6.8,2.8,16.1,6,28,9.6
+ c14.4,4.6,26,8.9,34.7,12.9c8.8,4,16.3,9.9,22.5,17.8c6.2,7.8,9.3,18.2,9.3,31c0,11.7-3.2,21.8-9.5,30.6
+ c-6.3,8.7-15.3,15.5-26.8,20.3c-11.6,4.8-24.9,7.2-40,7.2c-15.1,0-29.7-2.9-43.9-8.7c-14.2-5.8-26.4-13.6-36.6-23.4l10.7-21.6
+ c9.6,9.4,20.7,16.7,33.3,21.9c12.6,5.2,24.8,7.8,36.8,7.8c15.3,0,27.3-3,36.1-8.9c8.8-5.9,13.2-13.9,13.2-23.9
+ c0-7.8-2.3-14.3-6.9-19.4c-4.6-5.1-10.3-9-17.1-11.9c-6.8-2.8-16.1-6-28-9.6c-14.2-4.2-25.7-8.3-34.6-12.2
+ c-8.9-3.9-16.4-9.7-22.5-17.5c-6.1-7.7-9.2-17.9-9.2-30.6c0-10.9,3-20.4,9-28.6c6-8.2,14.6-14.6,25.6-19.1
+ c11.1-4.5,23.8-6.8,38.2-6.8C1643.8,2058.3,1655.7,2060.1,1667.6,2063.6z"/>
+<path fill="#6D6E71" d="M1980.1,2072.8c16.8,9.4,30.2,22.3,40,38.4c9.8,16.2,14.8,33.9,14.8,53.3c0,19.5-4.9,37.4-14.8,53.6
+ c-9.8,16.3-23.2,29.1-40,38.6c-16.8,9.5-35.3,14.3-55.2,14.3c-20.3,0-38.8-4.7-55.7-14.3c-16.8-9.5-30.2-22.4-40-38.6
+ c-9.8-16.3-14.8-34.1-14.8-53.6c0-19.5,4.9-37.3,14.8-53.5c9.8-16.2,23.2-29,40-38.3c16.8-9.4,35.4-14,55.7-14
+ C1944.8,2058.6,1963.2,2063.3,1980.1,2072.8z M1881.9,2092.7c-13.1,7.4-23.6,17.5-31.4,30.1c-7.8,12.6-11.8,26.5-11.8,41.7
+ c0,15.3,3.9,29.3,11.8,42c7.8,12.7,18.3,22.8,31.4,30.2c13.1,7.4,27.4,11.1,42.9,11.1c15.5,0,29.7-3.7,42.7-11.1
+ c13-7.4,23.3-17.4,31.1-30.2c7.7-12.7,11.6-26.7,11.6-42s-3.9-29.2-11.6-41.8c-7.7-12.6-18.1-22.6-31.1-30
+ c-13-7.4-27.2-11.2-42.6-11.2C1909.4,2081.5,1895.1,2085.2,1881.9,2092.7z"/>
+<path fill="#6D6E71" d="M2186.5,2082.4v74h98.4v23.2h-98.4v90.2h-24.1v-210.6h133.8v23.2H2186.5z"/>
+<path fill="#6D6E71" d="M2491.6,2082.4v187.4h-24.1v-187.4h-68.4v-23.2h161.4v23.2H2491.6z"/>
+<path fill="#6D6E71" d="M2871.8,2269.8l-56.8-177.4l-57.6,177.4h-24.5l-70.5-210.6h25.9l57.9,182.7l57.1-182.4l24.1-0.3l57.7,182.7
+ l57.1-182.7h25l-70.6,210.6H2871.8z"/>
+<path fill="#6D6E71" d="M3087.3,2216.6l-23.5,53.2h-25.6l94.4-210.6h25l94.1,210.6h-26.1l-23.5-53.2H3087.3z M3144.5,2086.6
+ l-46.9,106.8h94.4L3144.5,2086.6z"/>
+<path fill="#6D6E71" d="M3461.1,2202.7c-6,0.4-10.7,0.6-14.1,0.6h-56v66.5H3367v-210.6h80c26.2,0,46.6,6.2,61.2,18.5
+ c14.5,12.3,21.8,29.8,21.8,52.3c0,17.2-4.1,31.7-12.2,43.3c-8.1,11.6-19.8,20-35,25l49.2,71.5h-27.3L3461.1,2202.7z M3491.3,2167.6
+ c10.3-8.4,15.5-20.8,15.5-37c0-15.9-5.2-27.9-15.5-36c-10.3-8.1-25.1-12.2-44.3-12.2h-56v97.8h56
+ C3466.2,2180.2,3481,2176,3491.3,2167.6z"/>
+<path fill="#6D6E71" d="M3688.3,2082.4v69.2h106.2v23.2h-106.2v72.1h122.8v22.9h-146.9v-210.6h142.9v23.2H3688.3z"/>
+<path fill="#6D6E71" d="M4147,2082.4v74h98.4v23.2H4147v90.2h-24.1v-210.6h133.8v23.2H4147z"/>
+<path fill="#6D6E71" d="M4523.3,2072.8c16.8,9.4,30.2,22.3,40,38.4c9.8,16.2,14.8,33.9,14.8,53.3c0,19.5-4.9,37.4-14.8,53.6
+ c-9.8,16.3-23.2,29.1-40,38.6c-16.8,9.5-35.3,14.3-55.2,14.3c-20.3,0-38.8-4.7-55.7-14.3c-16.8-9.5-30.2-22.4-40-38.6
+ c-9.8-16.3-14.8-34.1-14.8-53.6c0-19.5,4.9-37.3,14.8-53.5c9.8-16.2,23.2-29,40-38.3c16.8-9.4,35.4-14,55.7-14
+ C4488.1,2058.6,4506.5,2063.3,4523.3,2072.8z M4425.2,2092.7c-13.1,7.4-23.6,17.5-31.4,30.1c-7.8,12.6-11.8,26.5-11.8,41.7
+ c0,15.3,3.9,29.3,11.8,42c7.8,12.7,18.3,22.8,31.4,30.2c13.1,7.4,27.4,11.1,42.9,11.1c15.5,0,29.7-3.7,42.7-11.1
+ c13-7.4,23.3-17.4,31.1-30.2c7.7-12.7,11.6-26.7,11.6-42s-3.9-29.2-11.6-41.8c-7.7-12.6-18.1-22.6-31.1-30
+ c-13-7.4-27.2-11.2-42.6-11.2C4452.6,2081.5,4438.3,2085.2,4425.2,2092.7z"/>
+<path fill="#6D6E71" d="M4854.7,2247.7c-15.7,15.5-37.3,23.3-64.8,23.3c-27.7,0-49.4-7.8-65.1-23.3c-15.7-15.5-23.6-37-23.6-64.6
+ v-124h24.1v124c0,20.3,5.8,36.1,17.3,47.5c11.6,11.4,27.3,17.1,47.3,17.1c20.1,0,35.8-5.7,47.1-17c11.4-11.3,17-27.2,17-47.7v-124
+ h24.1v124C4878.2,2210.7,4870.4,2232.2,4854.7,2247.7z"/>
+<path fill="#6D6E71" d="M5169.5,2269.8l-126.3-169.1v169.1h-24.1v-210.6h25l126.3,169.3v-169.3h23.8v210.6H5169.5z"/>
+<path fill="#6D6E71" d="M5478.4,2073.1c16.4,9.3,29.4,21.9,38.9,37.9c9.6,16,14.3,33.9,14.3,53.5s-4.8,37.6-14.3,53.6
+ c-9.5,16.1-22.6,28.7-39.3,37.9c-16.6,9.2-35.2,13.8-55.5,13.8h-84.3v-210.6h85.2C5443.7,2059.2,5462,2063.8,5478.4,2073.1z
+ M5362.3,2246.9h61.4c15.5,0,29.6-3.5,42.3-10.6c12.7-7.1,22.8-16.9,30.2-29.5c7.4-12.5,11.1-26.5,11.1-42
+ c0-15.5-3.8-29.4-11.3-41.9c-7.5-12.5-17.7-22.3-30.6-29.6c-12.8-7.2-27-10.9-42.6-10.9h-60.5V2246.9z"/>
+<path fill="#6D6E71" d="M5668.6,2216.6l-23.5,53.2h-25.6l94.4-210.6h25l94.1,210.6H5807l-23.5-53.2H5668.6z M5725.8,2086.6
+ l-46.9,106.8h94.4L5725.8,2086.6z"/>
+<path fill="#6D6E71" d="M5991,2082.4v187.4H5967v-187.4h-68.4v-23.2h161.4v23.2H5991z"/>
+<path fill="#6D6E71" d="M6175.9,2269.8v-210.6h24.1v210.6H6175.9z"/>
+<path fill="#6D6E71" d="M6493.7,2072.8c16.8,9.4,30.2,22.3,40,38.4c9.8,16.2,14.8,33.9,14.8,53.3c0,19.5-4.9,37.4-14.8,53.6
+ c-9.8,16.3-23.2,29.1-40,38.6c-16.8,9.5-35.3,14.3-55.2,14.3c-20.3,0-38.8-4.7-55.7-14.3c-16.8-9.5-30.2-22.4-40-38.6
+ c-9.8-16.3-14.8-34.1-14.8-53.6c0-19.5,4.9-37.3,14.8-53.5c9.8-16.2,23.2-29,40-38.3c16.8-9.4,35.4-14,55.7-14
+ C6458.5,2058.6,6476.9,2063.3,6493.7,2072.8z M6395.6,2092.7c-13.1,7.4-23.6,17.5-31.4,30.1c-7.8,12.6-11.8,26.5-11.8,41.7
+ c0,15.3,3.9,29.3,11.8,42c7.8,12.7,18.3,22.8,31.4,30.2c13.1,7.4,27.4,11.1,42.9,11.1c15.5,0,29.7-3.7,42.7-11.1
+ c13-7.4,23.3-17.4,31.1-30.2c7.7-12.7,11.6-26.7,11.6-42s-3.9-29.2-11.6-41.8c-7.7-12.6-18.1-22.6-31.1-30
+ c-13-7.4-27.2-11.2-42.6-11.2C6423,2081.5,6408.8,2085.2,6395.6,2092.7z"/>
+<path fill="#6D6E71" d="M6826.5,2269.8l-126.3-169.1v169.1h-24.1v-210.6h25l126.3,169.3v-169.3h23.8v210.6H6826.5z"/>
+<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="-4516.6152" y1="-2338.7222" x2="-4108.4111" y2="-1861.3982" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 5117.8774 -2859.9343)">
+ <stop offset="0" style="stop-color:#F69923"/>
+ <stop offset="0.3123" style="stop-color:#F79A23"/>
+ <stop offset="0.8383" style="stop-color:#E97826"/>
+</linearGradient>
+<path fill="url(#SVGID_1_)" d="M1230.1,13.7c-45.3,26.8-120.6,102.5-210.5,212.3l82.6,155.9c58-82.9,116.9-157.5,176.3-221.2
+ c4.6-5.1,7-7.5,7-7.5c-2.3,2.5-4.6,5-7,7.5c-19.2,21.2-77.5,89.2-165.5,224.4c84.7-4.2,214.9-21.6,321.1-39.7
+ c31.6-177-31-258-31-258S1323.4-41.4,1230.1,13.7z"/>
+<path fill="none" d="M1090.2,903.1c0.6-0.1,1.2-0.2,1.8-0.3l-11.9,1.3c-0.7,0.3-1.4,0.7-2.1,1
+ C1082.1,904.4,1086.2,903.7,1090.2,903.1z"/>
+<path fill="none" d="M1005.9,1182.3c-6.7,1.5-13.7,2.7-20.7,3.7C992.3,1185,999.2,1183.8,1005.9,1182.3z"/>
+<path fill="none" d="M432.9,1808.8c0.9-2.3,1.8-4.7,2.6-7c18.2-48,36.2-94.7,54-140.1c20-51,39.8-100.4,59.3-148.3
+ c20.6-50.4,40.9-99.2,60.9-146.3c21-49.4,41.7-97,62-142.8c16.5-37.3,32.8-73.4,48.9-108.3c5.4-11.7,10.7-23.2,16-34.6
+ c10.5-22.7,21-44.8,31.3-66.5c9.5-20,19-39.6,28.3-58.8c3.1-6.4,6.2-12.8,9.3-19.1c0.5-1,1-2,1.5-3.1l-10.2,1.1l-8-15.9
+ c-0.8,1.6-1.6,3.1-2.4,4.6c-14.5,28.8-28.9,57.9-43.1,87.2c-8.2,16.9-16.4,34-24.6,51c-22.6,47.4-44.8,95.2-66.6,143.3
+ c-22.1,48.6-43.7,97.5-64.9,146.5c-20.8,48.1-41.3,96.2-61.2,144.2c-20,48-39.5,95.7-58.5,143.2c-19.9,49.5-39.2,98.7-58,147.2
+ c-4.2,10.9-8.5,21.9-12.7,32.8c-15,39.2-29.7,77.8-44,116l12.7,25.1l11.4-1.2c0.4-1.1,0.8-2.3,1.3-3.4
+ C396.7,1905.4,414.9,1856.4,432.9,1808.8z"/>
+<path fill="none" d="M980,1186.8L980,1186.8c0.1,0,0.1,0,0.1-0.1C980.1,1186.8,980.1,1186.8,980,1186.8z"/>
+<path fill="#BE202E" d="M952.6,1323c-10.6,1.9-21.4,3.8-32.5,5.7c-0.1,0-0.1,0.1-0.2,0.1c5.6-0.8,11.2-1.7,16.6-2.6
+ C942,1325.2,947.3,1324.1,952.6,1323z"/>
+<path opacity="0.35" fill="#BE202E" d="M952.6,1323c-10.6,1.9-21.4,3.8-32.5,5.7c-0.1,0-0.1,0.1-0.2,0.1c5.6-0.8,11.2-1.7,16.6-2.6
+ C942,1325.2,947.3,1324.1,952.6,1323z"/>
+<path fill="#BE202E" d="M980.3,1186.7C980.2,1186.7,980.2,1186.7,980.3,1186.7c-0.1,0.1-0.2,0.1-0.2,0.1c1.8-0.2,3.5-0.5,5.2-0.8
+ c7-1,13.9-2.2,20.7-3.7C997.5,1183.8,989,1185.2,980.3,1186.7L980.3,1186.7L980.3,1186.7z"/>
+<path opacity="0.35" fill="#BE202E" d="M980.3,1186.7C980.2,1186.7,980.2,1186.7,980.3,1186.7c-0.1,0.1-0.2,0.1-0.2,0.1
+ c1.8-0.2,3.5-0.5,5.2-0.8c7-1,13.9-2.2,20.7-3.7C997.5,1183.8,989,1185.2,980.3,1186.7L980.3,1186.7L980.3,1186.7z"/>
+<linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="-7537.7339" y1="-2391.4075" x2="-4625.4141" y2="-2391.4075" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 5117.8774 -2859.9343)">
+ <stop offset="0.3233" style="stop-color:#9E2064"/>
+ <stop offset="0.6302" style="stop-color:#C92037"/>
+ <stop offset="0.7514" style="stop-color:#CD2335"/>
+ <stop offset="1" style="stop-color:#E97826"/>
+</linearGradient>
+<path fill="url(#SVGID_2_)" d="M858.6,784.7c25.1-46.9,50.5-92.8,76.2-137.4c26.7-46.4,53.7-91.3,80.9-134.7
+ c1.6-2.6,3.2-5.2,4.8-7.7c27-42.7,54.2-83.7,81.6-122.9L1019.5,226c-6.2,7.6-12.5,15.3-18.8,23.2c-23.8,29.7-48.6,61.6-73.9,95.5
+ c-28.6,38.2-58,78.9-87.8,121.7c-27.6,39.5-55.5,80.9-83.5,123.7c-23.8,36.5-47.7,74-71.4,112.5c-0.9,1.4-1.8,2.9-2.6,4.3
+ l107.5,212.3C811.8,873.6,835.1,828.7,858.6,784.7z"/>
+<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="-7186.1777" y1="-2099.3059" x2="-5450.7183" y2="-2099.3059" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 5117.8774 -2859.9343)">
+ <stop offset="0" style="stop-color:#282662"/>
+ <stop offset="9.548390e-02" style="stop-color:#662E8D"/>
+ <stop offset="0.7882" style="stop-color:#9F2064"/>
+ <stop offset="0.9487" style="stop-color:#CD2032"/>
+</linearGradient>
+<path fill="url(#SVGID_3_)" d="M369,1981c-14.2,39.1-28.5,78.9-42.9,119.6c-0.2,0.6-0.4,1.2-0.6,1.8c-2,5.7-4.1,11.5-6.1,17.2
+ c-9.7,27.4-18,52.1-37.3,108.2c31.7,14.5,57.1,52.5,81.1,95.6c-2.6-44.7-21-86.6-56.2-119.1c156.1,7,290.6-32.4,360.1-146.6
+ c6.2-10.2,11.9-20.9,17-32.2c-31.6,40.1-70.8,57.1-144.5,53c-0.2,0.1-0.3,0.1-0.5,0.2c0.2-0.1,0.3-0.1,0.5-0.2
+ c108.6-48.6,163.1-95.3,211.2-172.6c11.4-18.3,22.5-38.4,33.8-60.6c-94.9,97.5-205,125.3-320.9,104.2l-86.9,9.5
+ C374.4,1966.3,371.7,1973.6,369,1981z"/>
+<linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="-7374.1626" y1="-2418.5454" x2="-4461.8428" y2="-2418.5454" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 5117.8774 -2859.9343)">
+ <stop offset="0.3233" style="stop-color:#9E2064"/>
+ <stop offset="0.6302" style="stop-color:#C92037"/>
+ <stop offset="0.7514" style="stop-color:#CD2335"/>
+ <stop offset="1" style="stop-color:#E97826"/>
+</linearGradient>
+<path fill="url(#SVGID_4_)" d="M409.6,1786.3c18.8-48.5,38.1-97.7,58-147.2c19-47.4,38.5-95.2,58.5-143.2
+ c20-48,40.4-96.1,61.2-144.2c21.2-49,42.9-97.8,64.9-146.5c21.8-48.1,44-95.9,66.6-143.3c8.1-17.1,16.3-34.1,24.6-51
+ c14.2-29.3,28.6-58.4,43.1-87.2c0.8-1.6,1.6-3.1,2.4-4.6L681.4,706.8c-1.8,2.9-3.5,5.8-5.3,8.6c-25.1,40.9-50,82.7-74.4,125.4
+ c-24.7,43.1-49,87.1-72.7,131.7c-20,37.6-39.6,75.6-58.6,113.9c-3.8,7.8-7.6,15.5-11.3,23.2c-23.4,48.2-44.6,94.8-63.7,139.5
+ c-21.7,50.7-40.7,99.2-57.5,145.1c-11,30.2-21,59.4-30.1,87.4c-7.5,24-14.7,47.9-21.5,71.8c-16,56.3-29.9,112.4-41.2,168.3
+ L353,1935.1c14.3-38.1,28.9-76.8,44-116C401.1,1808.2,405.4,1797.3,409.6,1786.3z"/>
+<linearGradient id="SVGID_5_" gradientUnits="userSpaceOnUse" x1="-7161.7642" y1="-2379.1431" x2="-5631.2524" y2="-2379.1431" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 5117.8774 -2859.9343)">
+ <stop offset="0" style="stop-color:#282662"/>
+ <stop offset="9.548390e-02" style="stop-color:#662E8D"/>
+ <stop offset="0.7882" style="stop-color:#9F2064"/>
+ <stop offset="0.9487" style="stop-color:#CD2032"/>
+</linearGradient>
+<path fill="url(#SVGID_5_)" d="M243.5,1729.4c-13.6,68.2-23.2,136.2-28,203.8c-0.2,2.4-0.4,4.7-0.5,7.1
+ c-33.7-54-124-106.8-123.8-106.2c64.6,93.7,113.7,186.7,120.9,278c-34.6,7.1-82-3.2-136.8-23.3c57.1,52.5,100,67,116.7,70.9
+ c-52.5,3.3-107.1,39.3-162.1,80.8c80.5-32.8,145.5-45.8,192.1-35.3C148.1,2414.2,74.1,2645,0,2890c22.7-6.7,36.2-21.9,43.9-42.6
+ c13.2-44.4,100.8-335.6,238-718.2c3.9-10.9,7.8-21.8,11.8-32.9c1.1-3,2.2-6.1,3.3-9.2c14.5-40.1,29.5-81.1,45.1-122.9
+ c3.5-9.5,7.1-19,10.7-28.6c0.1-0.2,0.1-0.4,0.2-0.6l-107.9-213.2C244.6,1724.4,244,1726.9,243.5,1729.4z"/>
+<linearGradient id="SVGID_6_" gradientUnits="userSpaceOnUse" x1="-7374.1626" y1="-2117.1309" x2="-4461.8428" y2="-2117.1309" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 5117.8774 -2859.9343)">
+ <stop offset="0.3233" style="stop-color:#9E2064"/>
+ <stop offset="0.6302" style="stop-color:#C92037"/>
+ <stop offset="0.7514" style="stop-color:#CD2335"/>
+ <stop offset="1" style="stop-color:#E97826"/>
+</linearGradient>
+<path fill="url(#SVGID_6_)" d="M805.6,937c-3.1,6.3-6.2,12.7-9.3,19.1c-9.3,19.2-18.8,38.8-28.3,58.8
+ c-10.3,21.7-20.7,43.9-31.3,66.5c-5.3,11.4-10.6,22.9-16,34.6c-16.1,35-32.4,71.1-48.9,108.3c-20.3,45.8-41,93.4-62,142.8
+ c-20,47.1-40.3,95.9-60.9,146.3c-19.5,47.9-39.3,97.3-59.3,148.3c-17.8,45.4-35.9,92.1-54,140.1c-0.9,2.3-1.8,4.7-2.6,7
+ c-18,47.6-36.2,96.6-54.6,146.8c-0.4,1.1-0.8,2.3-1.3,3.4l86.9-9.5c-1.7-0.3-3.5-0.5-5.2-0.9c103.9-13,242.1-90.6,331.4-186.5
+ c41.1-44.2,78.5-96.3,113-157.3c25.7-45.4,49.8-95.8,72.8-151.5c20.1-48.7,39.4-101.4,58-158.6c-23.9,12.6-51.2,21.8-81.4,28.2
+ c-5.3,1.1-10.7,2.2-16.1,3.1c-5.5,1-11,1.8-16.6,2.6l0,0l0,0c0.1,0,0.1-0.1,0.2-0.1c96.9-37.3,158-109.2,202.4-197.4
+ c-25.5,17.4-66.9,40.1-116.6,51.1c-6.7,1.5-13.7,2.7-20.7,3.7c-1.7,0.3-3.5,0.6-5.2,0.8l0,0l0,0c0.1,0,0.1,0,0.1-0.1
+ c0,0,0.1,0,0.1,0l0,0c33.6-14.1,62-29.8,86.6-48.4c5.3-4,10.4-8.1,15.3-12.3c7.5-6.5,14.7-13.3,21.5-20.5c4.4-4.6,8.6-9.3,12.7-14.2
+ c9.6-11.5,18.7-23.9,27.1-37.3c2.6-4.1,5.1-8.3,7.6-12.6c3.2-6.2,6.3-12.3,9.3-18.3c13.5-27.2,24.4-51.5,33-72.8
+ c4.3-10.6,8.1-20.5,11.3-29.7c1.3-3.7,2.5-7.2,3.7-10.6c3.4-10.2,6.2-19.3,8.4-27.3c3.3-12,5.3-21.5,6.4-28.4l0,0l0,0
+ c-3.3,2.6-7.1,5.2-11.3,7.7c-29.3,17.5-79.5,33.4-119.9,40.8l79.8-8.8l-79.8,8.8c-0.6,0.1-1.2,0.2-1.8,0.3c-4,0.7-8.1,1.3-12.2,2
+ c0.7-0.3,1.4-0.7,2.1-1l-273,29.9C806.6,935,806.1,936,805.6,937z"/>
+<linearGradient id="SVGID_7_" gradientUnits="userSpaceOnUse" x1="-7554.8232" y1="-2132.0981" x2="-4642.5034" y2="-2132.0981" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 5117.8774 -2859.9343)">
+ <stop offset="0.3233" style="stop-color:#9E2064"/>
+ <stop offset="0.6302" style="stop-color:#C92037"/>
+ <stop offset="0.7514" style="stop-color:#CD2335"/>
+ <stop offset="1" style="stop-color:#E97826"/>
+</linearGradient>
+<path fill="url(#SVGID_7_)" d="M1112.9,385.1c-24.3,37.3-50.8,79.6-79.4,127.5c-1.5,2.5-3,5.1-4.5,7.6
+ c-24.6,41.5-50.8,87.1-78.3,137c-23.8,43.1-48.5,89.3-74.3,139c-22.4,43.3-45.6,89.2-69.4,137.8l273-29.9
+ c79.5-36.6,115.1-69.7,149.6-117.6c9.2-13.2,18.4-27,27.5-41.3c28-43.8,55.6-92,80.1-139.9c23.7-46.3,44.7-92.2,60.7-133.5
+ c10.2-26.3,18.4-50.8,24.1-72.3c5-19,8.9-36.9,11.9-54.1C1327.9,363.5,1197.6,380.9,1112.9,385.1z"/>
+<path fill="#BE202E" d="M936.5,1326.1c-5.5,1-11,1.8-16.6,2.6l0,0C925.5,1328,931,1327.1,936.5,1326.1z"/>
+<path opacity="0.35" fill="#BE202E" d="M936.5,1326.1c-5.5,1-11,1.8-16.6,2.6l0,0C925.5,1328,931,1327.1,936.5,1326.1z"/>
+<linearGradient id="SVGID_8_" gradientUnits="userSpaceOnUse" x1="-7374.1626" y1="-2027.484" x2="-4461.8433" y2="-2027.484" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 5117.8774 -2859.9343)">
+ <stop offset="0.3233" style="stop-color:#9E2064"/>
+ <stop offset="0.6302" style="stop-color:#C92037"/>
+ <stop offset="0.7514" style="stop-color:#CD2335"/>
+ <stop offset="1" style="stop-color:#E97826"/>
+</linearGradient>
+<path fill="url(#SVGID_8_)" d="M936.5,1326.1c-5.5,1-11,1.8-16.6,2.6l0,0C925.5,1328,931,1327.1,936.5,1326.1z"/>
+<path fill="#BE202E" d="M980,1186.8c1.8-0.2,3.5-0.5,5.2-0.8C983.5,1186.3,981.8,1186.6,980,1186.8L980,1186.8z"/>
+<path opacity="0.35" fill="#BE202E" d="M980,1186.8c1.8-0.2,3.5-0.5,5.2-0.8C983.5,1186.3,981.8,1186.6,980,1186.8L980,1186.8z"/>
+<linearGradient id="SVGID_9_" gradientUnits="userSpaceOnUse" x1="-7374.1626" y1="-2037.7417" x2="-4461.8433" y2="-2037.7417" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 5117.8774 -2859.9343)">
+ <stop offset="0.3233" style="stop-color:#9E2064"/>
+ <stop offset="0.6302" style="stop-color:#C92037"/>
+ <stop offset="0.7514" style="stop-color:#CD2335"/>
+ <stop offset="1" style="stop-color:#E97826"/>
+</linearGradient>
+<path fill="url(#SVGID_9_)" d="M980,1186.8c1.8-0.2,3.5-0.5,5.2-0.8C983.5,1186.3,981.8,1186.6,980,1186.8L980,1186.8z"/>
+<path fill="#BE202E" d="M980.2,1186.7C980.2,1186.7,980.2,1186.7,980.2,1186.7L980.2,1186.7L980.2,1186.7L980.2,1186.7
+ C980.2,1186.7,980.2,1186.7,980.2,1186.7z"/>
+<path opacity="0.35" fill="#BE202E" d="M980.2,1186.7C980.2,1186.7,980.2,1186.7,980.2,1186.7L980.2,1186.7L980.2,1186.7
+ L980.2,1186.7C980.2,1186.7,980.2,1186.7,980.2,1186.7z"/>
+<linearGradient id="SVGID_10_" gradientUnits="userSpaceOnUse" x1="-5738.0635" y1="-2039.799" x2="-5094.3457" y2="-2039.799" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 5117.8774 -2859.9343)">
+ <stop offset="0.3233" style="stop-color:#9E2064"/>
+ <stop offset="0.6302" style="stop-color:#C92037"/>
+ <stop offset="0.7514" style="stop-color:#CD2335"/>
+ <stop offset="1" style="stop-color:#E97826"/>
+</linearGradient>
+<path fill="url(#SVGID_10_)" d="M980.2,1186.7C980.2,1186.7,980.2,1186.7,980.2,1186.7L980.2,1186.7L980.2,1186.7L980.2,1186.7
+ C980.2,1186.7,980.2,1186.7,980.2,1186.7z"/>
+</svg>
diff --git a/img/bench_cli.png b/img/bench_cli.png
new file mode 100644
index 000000000..5bf0eacc2
Binary files /dev/null and b/img/bench_cli.png differ
diff --git a/img/bench_platform.png b/img/bench_platform.png
new file mode 100644
index 000000000..8e56cd1dd
Binary files /dev/null and b/img/bench_platform.png differ
diff --git a/img/check.svg b/img/check.svg
new file mode 100644
index 000000000..695cae082
--- /dev/null
+++ b/img/check.svg
@@ -0,0 +1,3 @@
+<svg width="11" height="9" viewBox="0 0 11 9" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M1.91308 4.03516H1.91326C1.99256 4.03525 2.07081 4.05331 2.14213 4.08798C2.21341 4.12262 2.27591 4.17295 2.32497 4.2352L1.91308 4.03516ZM1.91308 4.03516H1.09394C0.890308 4.03516 0.776602 4.26975 0.902321 4.4292L0.902371 4.42927L4.11214 8.49567L4.11218 8.49573C4.32247 8.76188 4.72568 8.76114 4.93667 8.49617L4.93708 8.49566L10.6597 1.24398C10.6598 1.24377 10.66 1.24357 10.6602 1.24336C10.7884 1.08293 10.6699 0.85 10.4689 0.85H9.6498C9.48941 0.85 9.33668 0.923501 9.2376 1.05044C9.2 [...]
+</svg>
diff --git a/img/cookies-1.svg b/img/cookies-1.svg
new file mode 100644
index 000000000..d83d5f8d4
--- /dev/null
+++ b/img/cookies-1.svg
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg id="Warstwa_2" data-name="Warstwa 2" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 250.88 253.1">
+ <defs>
+ <style>
+ .cls-1 {
+ fill: url(#Gradient_bez_nazwy_9);
+ }
+ </style>
+ <linearGradient id="Gradient_bez_nazwy_9" data-name="Gradient bez nazwy 9" x1="69.56" y1="19.1" x2="211.04" y2="217.32" gradientUnits="userSpaceOnUse">
+ <stop offset="0" stop-color="#fcd521"/>
+ <stop offset=".23" stop-color="#fdbc15"/>
+ <stop offset=".52" stop-color="#fea30a"/>
+ <stop offset=".78" stop-color="#fe9504"/>
+ <stop offset="1" stop-color="#ff9002"/>
+ </linearGradient>
+ </defs>
+ <g id="Warstwa_1-2" data-name="Warstwa 1">
+ <path class="cls-1" d="M220.65,101.84c-6.88-5.12-6.88-10.43-11.06-15.94-6.3-8.29-12.81-2.02-20.05-1.17-16.32,1.91-32.22-10.57-32.47-27.39-.05-3.43,1.35-6.34,1.11-9.96-.62-9.32-9.57-9.63-15.02-15.04-7.32-7.27-5.82-19.7-16.96-22.04-10.08-2.12-30.65,2.26-40.82,5.29C8.44,38.51-24.92,133.14,20.74,199.75c42.97,62.69,133.06,72.09,187.06,17.74,13.6-13.69,25.8-33.91,30.86-52.64,3.35-12.41,6.93-37.06,3.01-49.03-3.25-9.92-13.55-8.43-21.02-13.98ZM152.36,238.56c-51.81,14.83-107.81-10.09-130.93-58 [...]
+ </g>
+</svg>
\ No newline at end of file
diff --git a/img/copy-icon.svg b/img/copy-icon.svg
new file mode 100644
index 000000000..f37d6802b
--- /dev/null
+++ b/img/copy-icon.svg
@@ -0,0 +1,3 @@
+<svg width="13" height="16" viewBox="0 0 13 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M9.57895 0H1.36842C0.615789 0 0 0.654545 0 1.45455V11.6364H1.36842V1.45455H9.57895V0ZM11.6316 2.90909H4.10526C3.35263 2.90909 2.73684 3.56364 2.73684 4.36364V14.5455C2.73684 15.3455 3.35263 16 4.10526 16H11.6316C12.3842 16 13 15.3455 13 14.5455V4.36364C13 3.56364 12.3842 2.90909 11.6316 2.90909ZM4.10526 14.5455H11.6316V4.36364H4.10526V14.5455Z" fill="#4A4E58"/>
+</svg>
diff --git a/img/dc-icon-p-130x130q80.png b/img/dc-icon-p-130x130q80.png
new file mode 100644
index 000000000..da4af0e6f
Binary files /dev/null and b/img/dc-icon-p-130x130q80.png differ
diff --git a/img/dc-icon.png b/img/dc-icon.png
new file mode 100644
index 000000000..17da18d52
Binary files /dev/null and b/img/dc-icon.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/emetlabs-light.svg b/img/emetlabs-light.svg
new file mode 100644
index 000000000..6cc65389d
--- /dev/null
+++ b/img/emetlabs-light.svg
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg id="Warstwa_2" data-name="Warstwa 2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 562.58 369.54">
+ <defs>
+ <style>
+ .cls-1 {
+ stroke: rgba(0, 0, 0, 0);
+ stroke-miterlimit: 7.06;
+ stroke-width: 1.77px;
+ }
+
+ .cls-1, .cls-2 {
+ fill: #fff;
+ }
+ </style>
+ </defs>
+ <g id="textblock">
+ <g id="tight-bounds">
+ <g>
+ <g id="textblocktransform">
+ <path id="text-0" class="cls-2" d="M156.88,178.41l16.7-.63.84,1.16-.95,10.61h-42.44l.74-20.17-.74-47.48h42.86l.84,1.16-1.05,10.61-16.18-.53-12.19.11-.32,16.28,11.66.21,11.03-.32.84,1.05-.95,10.61-11.98-.32-10.82.11-.11,7.25.32,10.19,11.87.11ZM238.62,136.49l4.94,53.05h-11.87l-.74-16.07-1.79-17.33h-.84l-11.66,28.15h-10.19l-10.4-28.15h-.84l-1.89,16.07-1.16,17.33h-11.24l5.67-53.05h15.55l2.1,7.77,7.67,22.48h.84l8.3-22.38,2.31-7.88h15.23ZM278.22,179.25l14.29-.42.84.84-.95,9.88h-36.35 [...]
+ <path id="text-1" class="cls-2" d="M131.03,247.17v-36.06h20.72v3.49h-16.71v14.16h14.5v3.47h-14.5v14.94h-4.01ZM161.59,212.41h0c-1.05,0-1.72-.15-2.03-.44h0c-.47-.49-.7-1.16-.7-2.02s.05-1.47.15-1.84c.1-.37.26-.65.46-.86h0c.37-.37.95-.56,1.73-.56s1.34.04,1.67.12c.34.08.62.23.84.44h0c.38.38.57,1,.57,1.85s-.05,1.47-.14,1.83c-.08.37-.23.67-.43.89h0c-.39.39-1.1.59-2.12.59ZM159.74,247.17l-.05-28.05h3.86v28.05h-3.81ZM188.16,222.33h0c-3.06,0-6.19.9-9.36,2.71h0v22.13h-3.91v-28.05h3.45l.38, [...]
+ </g>
+ <path class="cls-1" d="M368.65,111.3V.88H.88v367.77h367.77v-110.41h-6.19v104.23H7.07V7.07h355.4v104.23h6.19Z"/>
+ </g>
+ </g>
+ </g>
+</svg>
\ No newline at end of file
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/favicon.png b/img/favicon.png
new file mode 100644
index 000000000..31e3f659d
Binary files /dev/null and b/img/favicon.png differ
diff --git a/img/gh-icon-orange.svg b/img/gh-icon-orange.svg
new file mode 100644
index 000000000..14d77e0ec
--- /dev/null
+++ b/img/gh-icon-orange.svg
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg id="Warstwa_2" data-name="Warstwa 2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 97.63 96">
+ <defs>
+ <style>
+ .cls-1 {
+ fill: #ff9103;
+ fill-rule: evenodd;
+ }
+ </style>
+ </defs>
+ <g id="Warstwa_1-2" data-name="Warstwa 1">
+ <path class="cls-1" d="M48.85,0C21.84,0,0,22,0,49.22c0,21.76,13.99,40.17,33.4,46.69,2.43.49,3.32-1.06,3.32-2.36,0-1.14-.08-5.05-.08-9.13-13.59,2.93-16.42-5.87-16.42-5.87-2.18-5.7-5.42-7.17-5.42-7.17-4.45-3.01.32-3.01.32-3.01,4.93.33,7.52,5.05,7.52,5.05,4.37,7.5,11.4,5.38,14.24,4.07.4-3.18,1.7-5.38,3.07-6.6-10.84-1.14-22.24-5.38-22.24-24.28,0-5.38,1.94-9.78,5.01-13.2-.49-1.22-2.18-6.27.49-13.04,0,0,4.12-1.3,13.43,5.05,3.98-1.08,8.09-1.63,12.21-1.63,4.12,0,8.33.57,12.21,1.63,9.3-6.36,1 [...]
+ </g>
+</svg>
\ No newline at end of file
diff --git a/img/github-mark-white.svg b/img/github-mark-white.svg
new file mode 100644
index 000000000..d5e649185
--- /dev/null
+++ b/img/github-mark-white.svg
@@ -0,0 +1 @@
+<svg width="98" height="96" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M48.854 0C21.839 0 0 22 0 49.217c0 21.756 13.993 40.172 33.405 46.69 2.427.49 3.316-1.059 3.316-2.362 0-1.141-.08-5.052-.08-9.127-13.59 2.934-16.42-5.867-16.42-5.867-2.184-5.704-5.42-7.17-5.42-7.17-4.448-3.015.324-3.015.324-3.015 4.934.326 7.523 5.052 7.523 5.052 4.367 7.496 11.404 5.378 14.235 4.074.404-3.178 1.699-5.378 3.074-6.6-10.839-1.141-22.243-5.378-22.243-24.283 0-5.37 [...]
\ No newline at end of file
diff --git a/img/hero-main copy.webp b/img/hero-main copy.webp
new file mode 100644
index 000000000..12874b7c2
Binary files /dev/null and b/img/hero-main copy.webp differ
diff --git a/img/hero-main-p-1080 copy.webp b/img/hero-main-p-1080 copy.webp
new file mode 100644
index 000000000..ee298c3be
Binary files /dev/null and b/img/hero-main-p-1080 copy.webp differ
diff --git a/img/hero-main-p-1080.webp b/img/hero-main-p-1080.webp
new file mode 100644
index 000000000..ee298c3be
Binary files /dev/null and b/img/hero-main-p-1080.webp differ
diff --git a/img/hero-main-p-1600 copy.webp b/img/hero-main-p-1600 copy.webp
new file mode 100644
index 000000000..6b88c3983
Binary files /dev/null and b/img/hero-main-p-1600 copy.webp differ
diff --git a/img/hero-main-p-1600.webp b/img/hero-main-p-1600.webp
new file mode 100644
index 000000000..6b88c3983
Binary files /dev/null and b/img/hero-main-p-1600.webp differ
diff --git a/img/hero-main-p-500 copy.webp b/img/hero-main-p-500 copy.webp
new file mode 100644
index 000000000..c7eaadaf0
Binary files /dev/null and b/img/hero-main-p-500 copy.webp differ
diff --git a/img/hero-main-p-500.webp b/img/hero-main-p-500.webp
new file mode 100644
index 000000000..c7eaadaf0
Binary files /dev/null and b/img/hero-main-p-500.webp differ
diff --git a/img/hero-main-p-800 copy.webp b/img/hero-main-p-800 copy.webp
new file mode 100644
index 000000000..d218bbbda
Binary files /dev/null and b/img/hero-main-p-800 copy.webp differ
diff --git a/img/hero-main-p-800.webp b/img/hero-main-p-800.webp
new file mode 100644
index 000000000..d218bbbda
Binary files /dev/null and b/img/hero-main-p-800.webp differ
diff --git a/img/hero-main.webp b/img/hero-main.webp
new file mode 100644
index 000000000..12874b7c2
Binary files /dev/null and b/img/hero-main.webp differ
diff --git a/img/hugin-light.svg b/img/hugin-light.svg
new file mode 100644
index 000000000..0f13ef9da
--- /dev/null
+++ b/img/hugin-light.svg
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg id="Warstwa_2" data-name="Warstwa 2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 957.59 273.97">
+ <defs>
+ <style>
+ .cls-1 {
+ fill: #fff;
+ }
+ </style>
+ </defs>
+ <g id="Warstwa_1-2" data-name="Warstwa 1">
+ <g id="kXjd7y.tif">
+ <g>
+ <path class="cls-1" d="M246.18,14.69c34.44,34.39-1.14,72.7-3.22,110.1-2.42,43.47,42.35,90.94-1.75,124.96-35.53,27.41-77.86-10.58-120.87-7.15-36.9,2.94-76.08,38.98-108.32-.64-30.21-37.13,9.61-77.64,5.94-121.88-2.97-35.79-34.81-67.06-5.99-101.65,33.4-40.11,74.32-2.54,113.08-.51,42.5,2.22,86.22-38.07,121.12-3.22Z"/>
+ <polygon class="cls-1" points="367.5 41.76 367.5 112.89 369.29 114.68 440.51 114.68 440.51 41.76 478.81 41.76 478.81 228.24 442.31 228.24 440.51 226.45 440.51 145.76 367.5 145.76 367.5 228.24 330.99 228.24 329.2 226.45 329.2 41.76 367.5 41.76"/>
+ <path class="cls-1" d="M726.58,205.53c-15.05,13.72-31.29,17.59-51.2,12.29-53.89-14.34-57.99-103.41-6.56-123.17,20.56-7.9,45-5.3,58.95,12.86v-13.15h34.72v134.48c0,7.95-9.14,23.7-14.97,29.28-27.48,26.27-107.87,21.5-111.9-26.29h35.91c4.2,17.34,34.6,18.04,46.07,9.55,2.87-2.12,8.99-10.53,8.99-13.74v-22.11ZM690.36,119.74c-31.61,5.34-33.35,76.25,11.56,71.31,39.41-4.34,36.47-79.42-11.56-71.31Z"/>
+ <path class="cls-1" d="M957.59,228.24h-35.91v-89.06c0-.53-3.1-7.13-3.78-8.17-8.52-12.99-29.85-11.93-39.27-.16-2.58,3.22-7.22,12.87-7.22,16.7v80.69h-35.91V94.36h35.91v16.74c18.45-27.49,62.66-28.17,79.24,1.55,1.85,3.32,6.94,17.34,6.94,20.56v95.03Z"/>
+ <path class="cls-1" d="M535.07,94.36c1.41,26.35-1.87,54.6-.05,80.74,1.34,19.29,9.19,29.66,30.3,25.38,7.72-1.56,18.82-14.2,18.82-21.84v-84.27h35.91v133.88h-34.71v-15.54c-3.31,1.25-4.28,5.04-6.59,7.16-21.05,19.28-61.89,15.11-73.83-12.31-.84-1.93-4.56-13.39-4.56-14.57v-98.62h34.71Z"/>
+ <rect class="cls-1" x="781.64" y="94.36" width="35.91" height="133.88"/>
+ <rect class="cls-1" x="781.64" y="41.76" width="35.91" height="31.08"/>
+ </g>
+ </g>
+ </g>
+</svg>
\ No newline at end of file
diff --git a/img/iggy-apache-color-darkbg.svg b/img/iggy-apache-color-darkbg.svg
new file mode 100644
index 000000000..34286b86e
--- /dev/null
+++ b/img/iggy-apache-color-darkbg.svg
@@ -0,0 +1,112 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg id="Warstwa_2" data-name="Warstwa 2" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 3902.16 1302.71">
+ <defs>
+ <style>
+ .cls-1 {
+ fill: #8e8e8e;
+ }
+
+ .cls-2 {
+ fill: #efefef;
+ }
+
+ .cls-3 {
+ stroke-width: 25px;
+ }
+
+ .cls-3, .cls-4 {
+ stroke: #000;
+ stroke-miterlimit: 10;
+ }
+
+ .cls-3, .cls-4, .cls-5 {
+ fill: #fff;
+ }
+
+ .cls-4 {
+ stroke-width: 20px;
+ }
+
+ .cls-6 {
+ fill: #a57449;
+ }
+
+ .cls-7 {
+ fill: #e5bf7f;
+ }
+
+ .cls-8 {
+ fill: #afafaf;
+ }
+
+ .cls-9 {
+ fill: url(#Gradient_bez_nazwy_206);
+ }
+
+ .cls-10 {
+ fill: #7b7b7b;
+ }
+ </style>
+ <linearGradient id="Gradient_bez_nazwy_206" data-name="Gradient bez nazwy 206" x1="1207.62" y1="562.3" x2="1123.01" y2="856.09" gradientUnits="userSpaceOnUse">
+ <stop offset=".17" stop-color="#a72b00"/>
+ <stop offset=".26" stop-color="#b63800"/>
+ <stop offset=".52" stop-color="#dd5c00"/>
+ <stop offset=".73" stop-color="#f67100"/>
+ <stop offset=".86" stop-color="#ff7a01"/>
+ </linearGradient>
+ </defs>
+ <g id="Warstwa_1-2" data-name="Warstwa 1">
+ <path d="M1015.91,255.31c-.18-.21-.36-.43-.54-.64.2.44.41.86.59,1.3-.02-.23-.04-.44-.06-.66Z"/>
+ <path d="M847.1,360.04h-.02c-.01.08-.03.16-.04.24.02-.08.04-.16.06-.24Z"/>
+ <path d="M843.88,386.78c.31-8.84,1.69-17.67,3.16-26.51-2.27,8.37-4.21,17.85-3.16,26.51Z"/>
+ <path d="M1305.08,297.4c.79.53,1.58.81,2.37.23-.58-.08-1.14-.13-1.72-.23-.25,0-.46,0-.65,0Z"/>
+ <path d="M1303.81,296.79c.12.49.43.59,1.27.61-.27-.18-.54-.39-.82-.61h-.45Z"/>
+ <path d="M1508.93,293.63c-.15-.72-.31-1.47-.48-2.23h-.76c.46.73.85,1.48,1.24,2.23Z"/>
+ <path class="cls-6" d="M772.27,134.7c-56.11,22.38-64.01,35.68-70.67,56.86-20.41,64.84.57,80.27-47.5,117.52-33.02,19.99-57.54,23.46-96.86,13.04,13.17-11.62,28.81-26.03,39.65-39.65,18.9-23.75,23.21-44.66,35.25-61.68,23.7-33.51,96.01-89.86,140.13-86.09Z"/>
+ <path class="cls-7" d="M1238.92,101.54c1.27.53,3.24-.57,4.41,0,.49.24-.47,6.42.06,8.84l4.35-4.43c.9.72,3.54-.72,4.41,0l13.22,35.25c-5.56.31-14.96-5.02-24.09-4.55-34.5,1.78-30.85,40.81-24.37,66.23-21.39-4.35-27.74-35.51-35.25-52.87-1.4-3.24-3.85-7.27-4.41-8.81-.52-1.43-3.91-2.92-4.41-4.41l-4.41-4.41c-.67-3.3-.71-14.41,0-17.62,7.49-34.07,44.89-24,70.49-13.22Z"/>
+ <path class="cls-6" d="M1397.53,387.92c3.98,4.51,6.39,7.5,8.81,13.22-10.67-23.84-43.32,7.61-50.96,8.88-14.81,2.46-29.9-8.53-47.18-3.55-14.06,4.05-42.36,60.56-29.63,7.89,35.8-23.84,75.07-40.46,118.96-26.43Z"/>
+ <path class="cls-4" d="M1375.89,443.74c-7.7-4.84-51.43-32.02-57.21-33.16-4.05-.79-15.41-1.17-19.73-.51-29.63,4.48-43.76,34.09-30.94,57.07,5.51,9.88,78.14,48.11,94.42,59.46,99.72,69.53,240.67,233.74,258.23,344.27,18.51,116.56-57.31,194.65-179.93,220.87,8.44,30.21,16.74,60.89,23.34,93.28,22.89-6.42,44.95-13.91,65.97-22.63,86.77-36.01,160.85-104.84,180.25-188.96,47.07-204.06-158.13-418.83-334.4-529.69Z"/>
+ <polygon class="cls-1" points="986.09 501.4 1022.09 564.72 1049.41 592.71 1089.4 626.03 1116.06 643.36 1136.73 650.7 1126.06 620.04 1082.07 568.71 1041.42 526.06 1028.75 495.4 1012.41 450.74 986.09 448.55 973.86 480.25 986.09 501.4"/>
+ <polygon class="cls-2" points="1421.43 398.09 1407.33 381.72 1379.34 358.1 1354.25 334.1 1307.93 291.99 1288.13 264.97 1338.47 264.78 1400.67 256.4 1376.67 233.98 1346.01 184.66 1322.02 116.82 1290.69 56.83 1261.88 24.9 1227.37 12.84 1168.72 12.84 1121.72 35.5 1086.07 35.5 979.43 46.17 890.12 88.82 835.46 72.83 790.35 60.83 676.22 77.53 630.17 151.48 586.18 256.4 532.86 320.77 551.53 336.77 608.85 339.43 666.21 311.44 702.16 271.83 719.49 291.99 750.15 291.99 790.35 307.44 804.86 362 [...]
+ <polygon class="cls-9" points="1047.41 530.33 1099.4 587.38 1140.73 652.7 1167.39 712.68 1198.62 772.72 1233.38 810.48 1261.88 822.96 1288.13 822.76 1314.58 810.48 1329.89 795.2 1338.47 772.72 1338.47 750.01 1329.89 720.28 1314.58 686.02 1296.69 643.36 1245.18 581.53 1180.14 550.08 1067.35 514.06 1032.75 504.73 1047.41 530.33"/>
+ <path d="M1054.29,238.68l3.43,36.38c30.83-54.23-20.81-122.7-79.88-91.06-61.64,33-17.9,136.23,51.19,100.62l-15.91-1.54c25.3-13.61,30.85-44.23,17.28-68.35-4.85-8.63-16.16-10.85-18.86-19.43,22.19,4.01,38.27,21.65,42.76,43.38ZM1002.66,232.77c-12.94,14.18-40.02-.59-27.52-19.51,13.77-20.84,41.67,4,27.52,19.51ZM818.63,1018.99s-.36-.05-.92-.11c.54.31.88.38.92.11ZM1313,286.24c41.18,3.97,91.09,4.04,118.02-31.85-39.42-22.42-64.17-55.19-82.93-95.77-18.11-39.16-21.82-77.7-50.99-111.72-36.29-42.34 [...]
+ <path class="cls-8" d="M821.7,373.99s2.81,3.33,4.04,5.27c13.77,21.72,11.03,23.02,17.84,32.61.5.71,1.11,1.39,1.73,2.15,28.08,34.53,46.53,31.77,46.53,31.77h0c-30.47,4.49-31.85,23.65-32.32,31.8-8.97,154.66,17.52,372.58-33.09,522.64-10.69-53.6-59.62-61.97-59.62-61.97,0,0,20.73-103.9,24.51-136.77,18.35-159.4,23.48-296.76,30.38-427.5Z"/>
+ <path class="cls-8" d="M930.17,589.29c59.76,65.17,98.85,100.18,141.32,239.21l56.37,249.67c-20.51-.07-30.61-6.88-51.13-6.91-42-154.54-21.45-218.92-80.08-350.99l-66.49-130.98Z"/>
+ <path class="cls-10" d="M1127.87,1078.18c12.12,30.1-2.63,1.84-5.54-24.54.57-72.51-36.72-227.99-19.94-299.98,5.93,44.02,18.9,87.28,32.06,130.25,10.75,35.11,77.67,176.36,78.52,186.38.85,9.89-40.35,13.02-48.47,13.28-16.16.52-29.03-5.36-36.64-5.39h0Z"/>
+ <path class="cls-3" d="M1464.07,1185.02c-6.6-32.39-14.91-63.06-23.34-93.28-5.06,1.08-10.2,2.09-15.42,2.99-255.7,44.33-598.21-70.36-852.46-167.05-15.39,58.87-36.54,111.87-48.56,170.44,267.13,74.89,662.6,164.62,939.78,86.9Z"/>
+ <polygon class="cls-5" points="380.12 936.86 428 852.65 456.81 862.43 597.11 936.86 551.53 1100.59 363.31 1027.81 346.24 1014.39 380.12 936.86"/>
+ <g>
+ <path class="cls-5" d="M548.9,939.03l-9,28.13-16.3,76.29,3.45,11.3c8.95-41.2,18.63-82.43,29.4-123.82l-7.56,8.11Z"/>
+ <path class="cls-5" d="M850.98,982.35l-24.11-52.28-30.06-33.6-32.23-4.92-34.02-18.93-21.45-8.72-37.44-11.55-38.16,36.84-36.49,17.63-25.08,7.51-15.47,16.6c-10.77,41.39-23.9,54.15-32.85,95.35l21.51,87.6,24.4,14.05,22.66,47.32,26.66,18,14.43,8.17,39.16,4.31,31.06,17.51,30.93-16.42,25.33-51.65,31.22-3.19,45.29-33.93,17.75-67.05-3.03-68.64Z"/>
+ <path d="M515.34,964.58c-7.81,29.43-9.26,35.54-12.17,57.77l-.25,30.71c1.33,25.66-.46,29.14,12.32,57.81,14.83-72.8,31.32-145.52,51.63-218.87,2-4,10-8,12-12,.48-.96.72-1.91.82-2.87-26.97,11.92-53.23,59.94-64.35,87.44"/>
+ <path d="M877.06,1025.74c-.5-.09-.97-.19-1.47-.27-4.22-.7-2.83-9.14-2.13-13.37-.7,4.22-2.09,12.67,2.13,13.37.5.08.97.19,1.47.27-.02-.27-.03-.54-.04-.81-.96-.38-1.93-.8-2.92-1.29,2.82-42.6-9.95-114.17-55.11-131.49-11.9-4.56-44.97-5.81-49.39-9.85-2.03-1.86-.15-11.99-3.66-17.01-20.37-29.05-81.82-37.3-111.66-19.02-12.18,7.46-25.22,29.93-27.12,30.7-5.2,2.11-22.31-4.12-32.11-3.61-5.33.27-10.46,1.61-15.36,3.78-.1.96-.34,1.91-.82,2.87-2,4-10,8-12,12-20.31,73.36-36.8,146.07-51.63,218.87.74, [...]
+ </g>
+ <g>
+ <polygon class="cls-5" points="1499.89 977.59 1445.81 950.99 1406.74 917.87 1356.01 905.53 1328.19 921.89 1302.83 947.96 1271.02 939.24 1214.8 962.14 1197.8 1034.42 1196.5 1100.27 1199.51 1159.13 1224.08 1195.91 1263.7 1213.5 1286.69 1219.41 1301.6 1250.01 1325.76 1278.81 1363.4 1270.88 1376.31 1260.21 1411.05 1263.1 1447.84 1251.6 1456.87 1219.38 1487.08 1209.82 1514.19 1191.75 1538.53 1149.94 1533 1041.96 1499.89 977.59"/>
+ <path d="M1177.26,1075.35l-1.15.06c.04.17.07.33.11.5,2.35,18.16,5.7,39.18,9.64,56.33.73,8.44,1.04,16.89.63,25.39.41-8.5.1-16.95-.63-25.39-.14,2.03-.37,4.04-.67,6.03h.12c-1.84,31.84,11.63,70.26,41.86,84.77,12.46,5.98,43.02,8.13,49.14,12.32,7.64,5.22,13.7,49.94,42.18,62.93,35.13,16.02,47.9-16.4,62.43-20,6.51-1.61,30.16,13.06,56.32,3.45,23.92-8.79,30.82-46.46,34.19-48.74,4.1-2.78,18.22-.94,26.48-4.09,25.39-9.69,37.47-22.79,46.42-48.51,4.38-12.6,6.25-44.67,11.88-53.76l.99-1.37c.16-.17. [...]
+ </g>
+ <g>
+ <path class="cls-5" d="M1925.84,1049.64V430.42h116.96v619.22h-116.96Z"/>
+ <path class="cls-5" d="M2429.8,1062.54c-38.99,0-76.11-6.95-111.37-20.86-35.26-13.9-66.44-34.47-93.53-61.71-27.09-27.23-48.45-60.91-64.07-101.05-15.63-40.13-23.44-86.43-23.44-138.89,0-68.51,13.12-126.78,39.35-174.8,26.23-48.01,61.49-84.64,105.78-109.87,44.29-25.22,93.38-37.84,147.28-37.84,79.69,0,142.33,18.49,187.91,55.47,45.58,36.98,76.11,89.3,91.59,156.95l-119.54,17.2c-11.18-36.12-29.46-65-54.83-86.65-25.37-21.64-57.84-32.61-97.4-32.9-39.28-.57-71.96,7.89-98.04,25.37-26.09,17.49-4 [...]
+ <path class="cls-5" d="M3067.08,1062.54c-38.99,0-76.11-6.95-111.37-20.86-35.26-13.9-66.44-34.47-93.53-61.71-27.09-27.23-48.45-60.91-64.07-101.05-15.63-40.13-23.44-86.43-23.44-138.89,0-68.51,13.12-126.78,39.35-174.8,26.23-48.01,61.49-84.64,105.78-109.87,44.29-25.22,93.38-37.84,147.28-37.84,79.69,0,142.33,18.49,187.91,55.47,45.58,36.98,76.11,89.3,91.59,156.95l-119.54,17.2c-11.18-36.12-29.46-65-54.83-86.65-25.37-21.64-57.84-32.61-97.4-32.9-39.28-.57-71.96,7.89-98.04,25.37-26.09,17.49- [...]
+ <path class="cls-5" d="M3571.91,1049.64v-251.99l-211.57-367.23h136.74l134.16,233.07,134.16-233.07h136.74l-211.57,367.23v251.99h-118.68Z"/>
+ </g>
+ <path d="M432.28,867.25l-73.35,150.05,187.26,74.87c6.64,3.25-16.24,23.7-37.16,16.42-53.57-24.99-108.28-36.8-159.74-69.93-6.97-4.49-15.98-13.87-14.57-22.86l77.96-162.06c6.45-11.53,19.65-11.08,30.53-7.25,18.97,6.67,117.06,55.86,131.42,66.67,12.45,9.38-4.68,21.38-12.03,17.78l-130.32-63.7Z"/>
+ <path class="cls-5" d="M75.65,769.84l279.31,138.59c2.02,6.5,1.11,11.48-6.27,12.76l-279.98-135.16c-43.29,47.19-101.06-31.64-46.48-58.56,28.42-14.02,60.69,12.27,53.42,42.37ZM19.17,758.55c-5.67,21.92,28.59,33.66,38.04,11.78,10.87-25.15-30.17-42.2-38.04-11.78Z"/>
+ <path class="cls-5" d="M90.03,923.17c-2.48,1.87,2.52,33.61-27.75,42.7-56.65,17.02-67.74-73.62-12.57-74.66,22.76-.43,23.66,12.65,32.84,15.55,4.01,1.27,69.48-6.74,83.95-6.41,37.02.86,80.65,6.75,115.92,18.04,8.88,2.84,75.96,23.16,52.02,37.28-8.32,4.91-28.04-9.74-37.16-13.02-52.23-18.79-108.22-26.2-163.44-23.25-5.52.29-42.07,2.44-43.82,3.76ZM57.15,949.03c24.19-7.24,14.72-44.98-11.46-39.08-25.19,5.67-14.72,46.92,11.46,39.08Z"/>
+ <path class="cls-5" d="M373.45,875.3c1.84,4.87-4.32,11.73-9.08,11.61-12.2-.32-57.7-32.33-69.56-41.42-34.07-26.11-62.86-59.39-87.98-93.89-5.81-7.98-21.82-38.61-26.04-42.1-11.34-9.36-30.37-1.98-39.1-29.59-15.11-47.78,60.18-71.03,73.79-21.42,7.14,26.01-17.38,41.94-17.34,45.05.03,2.56,22.32,35.95,25.82,40.87,26.44,37.15,61.37,73.15,98.89,99.29,7.62,5.31,49.17,27.79,50.61,31.6ZM158.94,663.48c-7.18,24.96,33.19,37,39.67,8.64,4.94-21.63-32.17-34.71-39.67-8.64Z"/>
+ <path class="cls-5" d="M169.23,974.85c1.83-.01,26.38-12.13,33.67-14.12,30.88-8.43,76.67-7.99,106.31,5.29,7,3.13,22.99,11.57,10.68,19.45-6.25,4-37.09-8.47-48.07-10.44-17.8-3.19-41.81-2.25-59.39,2.03-4.35,1.06-28.06,8.52-28.03,11.47.01,1.1,7.27,10.87,6.93,20.5-1.67,47.44-66.49,50.76-75.46,8.93-5.71-26.65,13.58-47.15,39.59-47.01,5.53.03,10.52,3.93,13.77,3.91ZM133.09,1006.83c-3.61,16.45,20.94,30.4,32.89,17.57,25.23-27.1-25.08-53.18-32.89-17.57Z"/>
+ <path class="cls-5" d="M289.52,725.1c-1.62-1.9-18.59-.36-29.14-16.72-30.8-47.8,57.3-88.71,65.78-30.42,4.25,29.22-18.21,35.37-19.93,43.43-.59,2.76,6.35,26.83,8.03,31.2,10.27,26.73,28.21,48.28,50.21,66.36,7.54,6.2,28.26,14.09,26.64,23.62-2.59,15.28-21.04,2.11-28.02-2.25-26.47-16.53-49.33-44.59-61.84-72.82-3.75-8.46-10.3-40.73-11.73-42.41ZM294.89,705.51c18.88-7.37,18.24-39.89-4.7-38.43-23.87,1.52-21.72,48.74,4.7,38.43Z"/>
+ <path d="M464.94,1031.37c2.21,5.31-2.06,10.93-8.75,9.53-22.84-4.78-53.95-25.99-77.81-32.32-4.57-3.36-2.56-10.3,2.51-11.8,4.39-1.3,82.28,30.38,84.04,34.6Z"/>
+ <path d="M472.62,1044.71c2.76-12.14,28.9-.8,25.85,8.36-3.22,9.68-27.75.01-25.85-8.36Z"/>
+ <path class="cls-8" d="M1050.65,54.76c13.05.31,14.11,17.66,14.28,26.92.22,1.19.22,3.22,0,4.41-1.63,8.98-2.26,13.12-13.22,13.22-45.44-15.13-106.28,17.82-123.34,61.66,41.36-31.48,97.83-76.57,145.37-26.41,40.15,42.36,38.03,223.48-26.32,240.22-24.34,6.33-37.93-2.63-57.39-2.3-45.85.76-64.4,31.24-61.68,74.9-6.52-7.17-21.69-13-32.66-26.82-22.57-28.45-37.68-71.86-55.46-94.3-5.14-6.48-8.85,11-11.71,12.04-8.61-17.62-14.71-48.43-35.1-57.8-19.72-9.06-32.97-1.97-50.11-4.96,1.94-12.7-13.34-9.63-16 [...]
+ <g>
+ <path class="cls-5" d="M2016.11,298.37h-65.61l-14.89,40.6h-12.8l54.69-144.52h11.61l54.69,144.52h-12.71l-14.99-40.6ZM1954.27,288.05h57.97l-28.98-78.71-28.98,78.71Z"/>
+ <path class="cls-5" d="M2077.25,280.11v58.86h-12.21v-144.52h49.23c15.02,0,26.88,3.84,35.58,11.51,8.7,7.68,13.05,18.23,13.05,31.66s-4.19,24.04-12.56,31.42c-8.37,7.38-20.5,11.07-36.38,11.07h-36.73ZM2077.25,269.79h37.02c11.84,0,20.88-2.82,27.1-8.45,6.22-5.63,9.33-13.49,9.33-23.56s-3.09-17.98-9.28-23.91c-6.19-5.93-14.97-8.96-26.35-9.1h-37.82v65.01Z"/>
+ <path class="cls-5" d="M2254.53,298.37h-65.61l-14.89,40.6h-12.8l54.69-144.52h11.61l54.69,144.52h-12.71l-14.99-40.6ZM2192.69,288.05h57.97l-28.98-78.71-28.98,78.71Z"/>
+ <path class="cls-5" d="M2405.8,293.91c-1.65,15.22-7.1,26.87-16.33,34.94-9.23,8.07-21.52,12.11-36.87,12.11-10.72,0-20.2-2.68-28.44-8.04s-14.61-12.95-19.11-22.78c-4.5-9.83-6.78-21.06-6.85-33.7v-18.76c0-12.84,2.25-24.22,6.75-34.15,4.5-9.93,10.97-17.58,19.41-22.98,8.44-5.39,18.15-8.09,29.13-8.09,15.48,0,27.71,4.17,36.68,12.51,8.97,8.34,14.18,19.89,15.63,34.64h-12.31c-3.04-24.55-16.38-36.83-40-36.83-13.1,0-23.54,4.9-31.32,14.7-7.78,9.8-11.66,23.34-11.66,40.63v17.68c0,16.69,3.79,30,11.37 [...]
+ <path class="cls-5" d="M2542.58,338.97h-12.31v-69.28h-82.58v69.28h-12.21v-144.52h12.21v64.92h82.58v-64.92h12.31v144.52Z"/>
+ <path class="cls-5" d="M2659.11,269.69h-67.6v58.96h77.72v10.32h-89.93v-144.52h89.43v10.32h-77.22v54.59h67.6v10.32Z"/>
+ </g>
+ </g>
+</svg>
\ No newline at end of file
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..43acc469d
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.png b/img/iggy_server.png
new file mode 100644
index 000000000..02e27e0e7
Binary files /dev/null and b/img/iggy_server.png 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.png b/img/iggy_web_ui.png
new file mode 100644
index 000000000..1fa0d7db6
Binary files /dev/null and b/img/iggy_web_ui.png 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/neferdata-light.svg b/img/neferdata-light.svg
new file mode 100644
index 000000000..b29f7d35d
--- /dev/null
+++ b/img/neferdata-light.svg
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg id="Warstwa_2" data-name="Warstwa 2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 174.29 49.63">
+ <defs>
+ <style>
+ .cls-1 {
+ fill: #fff;
+ }
+ </style>
+ </defs>
+ <g id="Warstwa_1-2" data-name="Warstwa 1">
+ <g>
+ <path class="cls-1" d="M57.96,14.88h4.3l7.17,12.34h.08v-12.34h3.38v18.57h-3.79l-7.69-13.32h-.08v13.32h-3.38V14.88Z"/>
+ <path class="cls-1" d="M75.64,26.6v-.35c0-4.63,2.79-7.06,6.58-7.06,4.25,0,6.04,2.41,6.04,6.9v1.3h-8.99c.24,2.71,1.71,3.6,4.25,3.6,1.73,0,3.06-.41,4.25-.92v2.33c-.97.65-2.63,1.3-5.06,1.3-4.71,0-7.06-2.6-7.06-7.09ZM79.26,25.09h5.5c0-2.46-.89-3.38-2.63-3.38-1.27,0-2.68.73-2.87,3.38Z"/>
+ <path class="cls-1" d="M91.55,22.08h-1.89v-2.65h1.89v-1.65c0-3,1.98-4.33,4.66-4.33,1.33,0,2.27.22,2.79.43v2.33c-.38-.08-.97-.19-1.73-.19-1.43,0-2.19.65-2.19,2.14v1.27h3.03v2.65h-3.03v11.37h-3.52v-11.37Z"/>
+ <path class="cls-1" d="M99.49,26.6v-.35c0-4.63,2.79-7.06,6.58-7.06,4.25,0,6.04,2.41,6.04,6.9v1.3h-8.99c.24,2.71,1.71,3.6,4.25,3.6,1.73,0,3.06-.41,4.25-.92v2.33c-.97.65-2.62,1.3-5.06,1.3-4.71,0-7.07-2.6-7.07-7.09ZM103.11,25.09h5.49c0-2.46-.89-3.38-2.62-3.38-1.27,0-2.68.73-2.87,3.38Z"/>
+ <path class="cls-1" d="M114.54,19.43h3.41v1.65h.14c.73-1.06,2.14-1.79,3.63-1.79.38,0,.7.03.81.11v3.14c-.3-.05-.76-.11-1.11-.11-1.25,0-2.46.35-3.33.87v10.15h-3.55v-14.02Z"/>
+ <path class="cls-1" d="M123.99,26.85v-.35c0-5.2,2.65-7.34,6.28-7.34,1.6,0,2.6.41,3.22.76v-6.25h3.55v19.79h-3.03l-.3-1.11h-.13c-.89.84-2.19,1.35-3.95,1.35-2.82,0-5.63-1.81-5.63-6.85ZM133.49,30.1v-7.66c-.46-.35-1.43-.6-2.57-.6-2.06,0-3.28,1.03-3.28,4.36v.49c0,3.38,1.3,4.3,3.28,4.3,1.22,0,2.08-.49,2.57-.89Z"/>
+ <path class="cls-1" d="M139.36,29.72c0-2.65,1.84-3.84,4.68-4.25l3.09-.38v-.95c0-1.73-.76-2.14-3.06-2.14-1.38,0-2.63.16-3.55.43v-2.49c1.38-.49,2.95-.76,4.9-.76,3.3,0,5.22,1.19,5.22,4.22v10.04h-2.9l-.27-1.14h-.16c-.62.81-1.81,1.38-3.57,1.38-2.57,0-4.38-1.27-4.38-3.98ZM147.13,30.53v-3.25l-2.3.24c-1.33.14-1.98.62-1.98,1.92s.84,1.84,2,1.84c.89,0,1.84-.33,2.27-.76Z"/>
+ <path class="cls-1" d="M154.58,29.88v-7.82h-1.87v-2.63h1.87v-3.3h3.49v3.3h3.22v2.63h-3.22v7.25c0,1.19.51,1.6,1.84,1.6.51,0,1.11-.08,1.52-.22v2.36c-.51.27-1.35.57-2.73.57-2.54,0-4.11-.95-4.11-3.74Z"/>
+ <path class="cls-1" d="M163,29.72c0-2.65,1.84-3.84,4.68-4.25l3.09-.38v-.95c0-1.73-.76-2.14-3.06-2.14-1.38,0-2.63.16-3.55.43v-2.49c1.38-.49,2.95-.76,4.9-.76,3.3,0,5.22,1.19,5.22,4.22v10.04h-2.9l-.27-1.14h-.16c-.62.81-1.81,1.38-3.57,1.38-2.57,0-4.38-1.27-4.38-3.98ZM170.77,30.53v-3.25l-2.3.24c-1.33.14-1.98.62-1.98,1.92s.84,1.84,2,1.84c.89,0,1.84-.33,2.27-.76Z"/>
+ </g>
+ <g>
+ <path class="cls-1" d="M13.27,4.49c0,.44-.11.85-.29,1.22l2.95,4.23c.3-.09.62-.16.96-.16,1.81,0,3.28,1.47,3.28,3.28,0,.75-.26,1.43-.68,1.98l12.32,17.69v-16.68c-1.15-.51-1.95-1.66-1.95-2.99,0-1.81,1.47-3.28,3.28-3.28.38,0,.73.08,1.07.19l2.67-3.67c-.41-.49-.67-1.12-.67-1.82,0-.55.16-1.07.44-1.5-3.51-1.91-7.54-2.99-11.82-2.99s-8.4,1.11-11.94,3.06c.25.42.4.91.4,1.43Z"/>
+ <path class="cls-1" d="M10.43,42.75c.43,0,.83.1,1.2.27l2.57-3.21c-.37-.53-.59-1.17-.59-1.87,0-1.34.8-2.48,1.95-2.99v-18.89c-1.15-.51-1.95-1.66-1.95-2.99,0-.44.09-.86.25-1.24l-3.16-4.52c-.09,0-.17.03-.27.03-.87,0-1.64-.4-2.16-1.01C3.2,10.86,0,17.46,0,24.81s3.3,14.15,8.51,18.69c.51-.47,1.18-.76,1.92-.76Z"/>
+ <path class="cls-1" d="M36.19,45.33c0-.43.1-.83.27-1.19l-2.2-3.14c-.36.13-.74.22-1.14.22-1.81,0-3.28-1.47-3.28-3.28,0-.81.31-1.54.79-2.12l-12.43-17.77v16.89c1.15.51,1.95,1.66,1.95,2.99,0,1.81-1.47,3.28-3.28,3.28-.62,0-1.19-.18-1.69-.48l-2.48,3.19c.34.47.54,1.04.54,1.66,0,.38-.08.75-.22,1.08,3.5,1.89,7.5,2.96,11.76,2.96s8.24-1.07,11.73-2.95c-.22-.4-.36-.86-.36-1.35Z"/>
+ <path class="cls-1" d="M41.26,6.24c-.52.66-1.32,1.09-2.22,1.09-.38,0-.74-.08-1.08-.21l-2.54,3.61c.6.59.98,1.42.98,2.33,0,1.34-.8,2.48-1.95,2.99v18.89c1.15.51,1.95,1.66,1.95,2.99,0,.39-.08.76-.21,1.11l2.43,3.48c.14-.02.27-.04.41-.04.85,0,1.61.38,2.13.98,5.18-4.55,8.46-11.22,8.46-18.66s-3.24-14.03-8.37-18.57Z"/>
+ </g>
+ </g>
+</svg>
\ No newline at end of file
diff --git a/img/solidhash.png b/img/solidhash.png
new file mode 100644
index 000000000..41622e7ca
Binary files /dev/null and b/img/solidhash.png differ
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/img/webclip.png b/img/webclip.png
new file mode 100644
index 000000000..7db4527f8
Binary files /dev/null and b/img/webclip.png differ
diff --git a/index.html b/index.html
new file mode 100644
index 000000000..6745cb459
--- /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">Apache Iggy (Incubating) | 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.00ae354b.css">
+<script src="/assets/js/runtime~main.abd83413.js" defer="defer"></script>
+<script src="/assets/js/main.e9fd05f4.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><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/markdown-page/index.html b/markdown-page/index.html
new file mode 100644
index 000000000..a955150f6
--- /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.00ae354b.css">
+<script src="/assets/js/runtime~main.abd83413.js" defer="defer"></script>
+<script src="/assets/js/main.e9fd05f4.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'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><br>
+Copyright © 2025 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</div>
+<div><br>
+Apache®, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.</div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/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..0853a5b82
--- /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..67847f4c5
Binary files /dev/null and b/transparent-benchmarks/iggy_bench_dashboard.png differ
diff --git a/zero-copy-deserialization/iggy_batch_schema_1.png b/zero-copy-deserialization/iggy_batch_schema_1.png
new file mode 100644
index 000000000..bdba41657
Binary files /dev/null and b/zero-copy-deserialization/iggy_batch_schema_1.png differ
diff --git a/zero-copy-deserialization/iggy_batch_schema_2.png b/zero-copy-deserialization/iggy_batch_schema_2.png
new file mode 100644
index 000000000..a3ed870e3
Binary files /dev/null and b/zero-copy-deserialization/iggy_batch_schema_2.png differ
diff --git a/zero-copy-deserialization/no_zero_copy_consumer.png b/zero-copy-deserialization/no_zero_copy_consumer.png
new file mode 100644
index 000000000..7252a706f
Binary files /dev/null and b/zero-copy-deserialization/no_zero_copy_consumer.png differ
diff --git a/zero-copy-deserialization/no_zero_copy_producer.png b/zero-copy-deserialization/no_zero_copy_producer.png
new file mode 100644
index 000000000..c352f6903
Binary files /dev/null and b/zero-copy-deserialization/no_zero_copy_producer.png differ
diff --git a/zero-copy-deserialization/zero_copy_consumer.png b/zero-copy-deserialization/zero_copy_consumer.png
new file mode 100644
index 000000000..cb2d31018
Binary files /dev/null and b/zero-copy-deserialization/zero_copy_consumer.png differ
diff --git a/zero-copy-deserialization/zero_copy_producer.png b/zero-copy-deserialization/zero_copy_producer.png
new file mode 100644
index 000000000..0239eee71
Binary files /dev/null and b/zero-copy-deserialization/zero_copy_producer.png differ