<p align="center">
<a href="https://github.com/sauljabin/kaskade"><img alt="kaskade" width="400" src="https://raw.githubusercontent.com/sauljabin/kaskade/main/screenshots/banner.png"></a>
</p>
<p align="center">
<a href="https://github.com/sauljabin/kaskade"><img alt="GitHub" src="https://img.shields.io/badge/github-blueviolet?logo=github&logoColor=white"></a>
<a href="https://github.com/sponsors/sauljabin"><img alt="donate" src="https://img.shields.io/badge/donate-EA4AAA?logo=github-sponsors&logoColor=white"></a>
<a href="https://libraries.io/pypi/kaskade"><img alt="Libraries.io dependency status for latest release" src="https://img.shields.io/librariesio/release/pypi/kaskade?logo=python&logoColor=white&label="></a>
<a href="https://github.com/sauljabin/kaskade/blob/main/LICENSE"><img alt="MIT License" src="https://img.shields.io/github/license/sauljabin/kaskade"></a>
<a href="https://pypi.org/project/kaskade"><img alt="Pypi Version" src="https://img.shields.io/pypi/v/kaskade"></a>
<a href="https://formulae.brew.sh/formula/kaskade"><img alt="Homebrew Version" src="https://img.shields.io/homebrew/v/kaskade"></a>
<a href="https://hub.docker.com/r/sauljabin/kaskade/tags"><img alt="Docker Version" src="https://img.shields.io/docker/v/sauljabin/kaskade?label=dockerhub"></a>
<a href="https://pypi.org/project/kaskade"><img alt="Platform" src="https://img.shields.io/badge/os-linux%20%7C%20macos-blue"></a>
<a href="https://pypi.org/project/kaskade"><img alt="Python Versions" src="https://img.shields.io/pypi/pyversions/kaskade?label=python"></a>
</p>
## Kaskade
Kaskade is a text user interface (TUI) for Apache Kafka, built with [Textual](https://github.com/Textualize/textual)
by [Textualize](https://www.textualize.io/).
It includes features like:
### Admin
- List topics, partitions, groups and group members.
- Topic information like lag, replicas and records count.
- Create, edit and delete topics.
- Filter topics by name.
### Consumer
- Json, string, integer, long, float, boolean and double deserialization.
- Filter by key, value, header and/or partition.
- Schema Registry support for avro and json.
- Protobuf deserialization support without Schema Registry.
- Avro deserialization without Schema Registry.
## Limitations
Kaskade does not include:
- Schema Registry for protobuf.
## Screenshots
<table>
<tr>
<td>
<img alt="kaskade" src="https://raw.githubusercontent.com/sauljabin/kaskade/main/screenshots/admin.png">
</td>
<td>
<img alt="kaskade" src="https://raw.githubusercontent.com/sauljabin/kaskade/main/screenshots/create-topic.png">
</td>
</tr>
<tr>
<td>
<img alt="kaskade" src="https://raw.githubusercontent.com/sauljabin/kaskade/main/screenshots/consumer.png">
</td>
<td>
<img alt="kaskade" src="https://raw.githubusercontent.com/sauljabin/kaskade/main/screenshots/record.png">
</td>
</tr>
</table>
## Installation
#### Install it with `brew`:
```bash
brew install kaskade
```
[brew installation](https://brew.sh/).
#### Install it with `pipx`:
```bash
pipx install kaskade
```
[pipx installation](https://pipx.pypa.io/stable/installation/).
## Running kaskade
#### Admin view:
```bash
kaskade admin -b my-kafka:9092
```
#### Consumer view:
```bash
kaskade consumer -b my-kafka:9092 -t my-topic
```
## Configuration examples
#### Multiple bootstrap servers:
```bash
kaskade admin -b my-kafka:9092,my-kafka:9093
```
#### Consume and deserialize:
```bash
kaskade consumer -b my-kafka:9092 -t my-json-topic -k json -v json
```
> Supported deserializers `[bytes, boolean, string, long, integer, double, float, json, avro, protobuf, registry]`
#### Consuming from the beginning:
```bash
kaskade consumer -b my-kafka:9092 -t my-topic --from-beginning
```
#### Schema registry simple connection deserializer:
```bash
kaskade consumer -b my-kafka:9092 -t my-avro-topic \
-k registry -v registry \
--registry url=http://my-schema-registry:8081
```
> For more information about Schema Registry configurations go
> to: [Confluent Schema Registry client](https://docs.confluent.io/platform/current/clients/confluent-kafka-python/html/index.html#schemaregistry-client).
#### Apicurio registry:
```bash
kaskade consumer -b my-kafka:9092 -t my-avro-topic \
-k registry -v registry \
--registry url=http://my-apicurio-registry:8081/apis/ccompat/v7
```
> For more about apicurio go to: https://github.com/apicurio/apicurio-registry
#### SSL encryption example:
```bash
kaskade admin -b my-kafka:9092 -c security.protocol=SSL
```
> For more information about SSL encryption and SSL authentication go
> to: [SSL support in librdkafka](https://github.com/edenhill/librdkafka/wiki/Using-SSL-with-librdkafka#configure-librdkafka-client).
#### Confluent cloud admin and consumer:
```bash
kaskade admin -b ${BOOTSTRAP_SERVERS} \
-c security.protocol=SASL_SSL \
-c sasl.mechanism=PLAIN \
-c sasl.username=${CLUSTER_API_KEY} \
-c sasl.password=${CLUSTER_API_SECRET}
```
```bash
kaskade consumer -b ${BOOTSTRAP_SERVERS} -t my-avro-topic \
-k string -v registry \
-c security.protocol=SASL_SSL \
-c sasl.mechanism=PLAIN \
-c sasl.username=${CLUSTER_API_KEY} \
-c sasl.password=${CLUSTER_API_SECRET} \
--registry url=${SCHEMA_REGISTRY_URL} \
--registry basic.auth.user.info=${SR_API_KEY}:${SR_API_SECRET}
```
> More about confluent cloud configuration
> at: [Kafka Client Quick Start for Confluent Cloud](https://docs.confluent.io/cloud/current/client-apps/config-client.html).
#### Running with docker:
```bash
docker run --rm -it --network my-networtk sauljabin/kaskade:latest \
admin -b my-kafka:9092
```
```bash
docker run --rm -it --network my-networtk sauljabin/kaskade:latest \
consumer -b my-kafka:9092 -t my-topic
```
#### Avro consumer:
Consume using `my-schema.avsc` file:
```bash
kaskade consumer -b my-kafka:9092 --from-beginning \
-k string -v avro \
-t my-avro-topic \
--avro value=my-schema.avsc
```
#### Protobuf consumer:
Install `protoc` command:
```bash
brew install protobuf
```
Generate a _Descriptor Set_ file from your `.proto` file:
```bash
protoc --include_imports \
--descriptor_set_out=my-descriptor.desc \
--proto_path=${PROTO_PATH} \
${PROTO_PATH}/my-proto.proto
```
Consume using `my-descriptor.desc` file:
```bash
kaskade consumer -b my-kafka:9092 --from-beginning \
-k string -v protobuf \
-t my-protobuf-topic \
--protobuf descriptor=my-descriptor.desc \
--protobuf value=mypackage.MyMessage
```
> More about protobuf and `FileDescriptorSet` at: [Protocol Buffers Documentation](https://protobuf.dev/programming-guides/techniques/#self-description).
## Development
For development instructions see [DEVELOPMENT.md](https://github.com/sauljabin/kaskade/blob/main/DEVELOPMENT.md).
Raw data
{
"_id": null,
"home_page": "https://github.com/sauljabin/kaskade",
"name": "kaskade",
"maintainer": null,
"docs_url": null,
"requires_python": "<3.14,>=3.10",
"maintainer_email": null,
"keywords": "kafka, kaskade",
"author": "Sa\u00fal Pi\u00f1a",
"author_email": "sauljabin@gmail.com",
"download_url": "https://files.pythonhosted.org/packages/70/7a/f8e5902528fee31a88e85045606c5bfd941cd139c673a369697dbfc63f1d/kaskade-4.0.2.tar.gz",
"platform": null,
"description": "<p align=\"center\">\n<a href=\"https://github.com/sauljabin/kaskade\"><img alt=\"kaskade\" width=\"400\" src=\"https://raw.githubusercontent.com/sauljabin/kaskade/main/screenshots/banner.png\"></a>\n</p>\n\n<p align=\"center\">\n<a href=\"https://github.com/sauljabin/kaskade\"><img alt=\"GitHub\" src=\"https://img.shields.io/badge/github-blueviolet?logo=github&logoColor=white\"></a>\n<a href=\"https://github.com/sponsors/sauljabin\"><img alt=\"donate\" src=\"https://img.shields.io/badge/donate-EA4AAA?logo=github-sponsors&logoColor=white\"></a>\n<a href=\"https://libraries.io/pypi/kaskade\"><img alt=\"Libraries.io dependency status for latest release\" src=\"https://img.shields.io/librariesio/release/pypi/kaskade?logo=python&logoColor=white&label=\"></a>\n<a href=\"https://github.com/sauljabin/kaskade/blob/main/LICENSE\"><img alt=\"MIT License\" src=\"https://img.shields.io/github/license/sauljabin/kaskade\"></a>\n<a href=\"https://pypi.org/project/kaskade\"><img alt=\"Pypi Version\" src=\"https://img.shields.io/pypi/v/kaskade\"></a>\n<a href=\"https://formulae.brew.sh/formula/kaskade\"><img alt=\"Homebrew Version\" src=\"https://img.shields.io/homebrew/v/kaskade\"></a>\n<a href=\"https://hub.docker.com/r/sauljabin/kaskade/tags\"><img alt=\"Docker Version\" src=\"https://img.shields.io/docker/v/sauljabin/kaskade?label=dockerhub\"></a>\n<a href=\"https://pypi.org/project/kaskade\"><img alt=\"Platform\" src=\"https://img.shields.io/badge/os-linux%20%7C%20macos-blue\"></a>\n<a href=\"https://pypi.org/project/kaskade\"><img alt=\"Python Versions\" src=\"https://img.shields.io/pypi/pyversions/kaskade?label=python\"></a>\n</p>\n\n## Kaskade\n\nKaskade is a text user interface (TUI) for Apache Kafka, built with [Textual](https://github.com/Textualize/textual)\nby [Textualize](https://www.textualize.io/).\n\nIt includes features like:\n\n### Admin\n\n- List topics, partitions, groups and group members.\n- Topic information like lag, replicas and records count.\n- Create, edit and delete topics.\n- Filter topics by name.\n\n### Consumer\n\n- Json, string, integer, long, float, boolean and double deserialization.\n- Filter by key, value, header and/or partition.\n- Schema Registry support for avro and json.\n- Protobuf deserialization support without Schema Registry.\n- Avro deserialization without Schema Registry.\n\n## Limitations\n\nKaskade does not include:\n\n- Schema Registry for protobuf.\n\n## Screenshots\n\n<table>\n <tr>\n <td>\n <img alt=\"kaskade\" src=\"https://raw.githubusercontent.com/sauljabin/kaskade/main/screenshots/admin.png\">\n </td>\n <td>\n <img alt=\"kaskade\" src=\"https://raw.githubusercontent.com/sauljabin/kaskade/main/screenshots/create-topic.png\">\n </td>\n </tr>\n <tr>\n <td>\n <img alt=\"kaskade\" src=\"https://raw.githubusercontent.com/sauljabin/kaskade/main/screenshots/consumer.png\">\n </td>\n <td>\n <img alt=\"kaskade\" src=\"https://raw.githubusercontent.com/sauljabin/kaskade/main/screenshots/record.png\">\n </td>\n </tr>\n</table>\n\n## Installation\n\n#### Install it with `brew`:\n\n```bash\nbrew install kaskade\n```\n\n[brew installation](https://brew.sh/).\n\n#### Install it with `pipx`:\n\n```bash\npipx install kaskade\n```\n\n[pipx installation](https://pipx.pypa.io/stable/installation/).\n\n## Running kaskade\n\n#### Admin view:\n\n```bash\nkaskade admin -b my-kafka:9092\n```\n\n#### Consumer view:\n\n```bash\nkaskade consumer -b my-kafka:9092 -t my-topic\n```\n\n## Configuration examples\n\n#### Multiple bootstrap servers:\n\n```bash\nkaskade admin -b my-kafka:9092,my-kafka:9093\n```\n\n#### Consume and deserialize:\n\n```bash\nkaskade consumer -b my-kafka:9092 -t my-json-topic -k json -v json\n```\n\n> Supported deserializers `[bytes, boolean, string, long, integer, double, float, json, avro, protobuf, registry]`\n\n#### Consuming from the beginning:\n\n```bash\nkaskade consumer -b my-kafka:9092 -t my-topic --from-beginning\n```\n\n#### Schema registry simple connection deserializer:\n\n```bash\nkaskade consumer -b my-kafka:9092 -t my-avro-topic \\\n -k registry -v registry \\\n --registry url=http://my-schema-registry:8081\n```\n\n> For more information about Schema Registry configurations go\n> to: [Confluent Schema Registry client](https://docs.confluent.io/platform/current/clients/confluent-kafka-python/html/index.html#schemaregistry-client).\n\n#### Apicurio registry:\n\n```bash\nkaskade consumer -b my-kafka:9092 -t my-avro-topic \\\n -k registry -v registry \\\n --registry url=http://my-apicurio-registry:8081/apis/ccompat/v7\n```\n\n> For more about apicurio go to: https://github.com/apicurio/apicurio-registry\n\n#### SSL encryption example:\n\n```bash\nkaskade admin -b my-kafka:9092 -c security.protocol=SSL\n```\n\n> For more information about SSL encryption and SSL authentication go\n> to: [SSL support in librdkafka](https://github.com/edenhill/librdkafka/wiki/Using-SSL-with-librdkafka#configure-librdkafka-client).\n\n#### Confluent cloud admin and consumer:\n\n```bash\nkaskade admin -b ${BOOTSTRAP_SERVERS} \\\n -c security.protocol=SASL_SSL \\\n -c sasl.mechanism=PLAIN \\\n -c sasl.username=${CLUSTER_API_KEY} \\\n -c sasl.password=${CLUSTER_API_SECRET}\n```\n\n```bash\nkaskade consumer -b ${BOOTSTRAP_SERVERS} -t my-avro-topic \\\n -k string -v registry \\\n -c security.protocol=SASL_SSL \\\n -c sasl.mechanism=PLAIN \\\n -c sasl.username=${CLUSTER_API_KEY} \\\n -c sasl.password=${CLUSTER_API_SECRET} \\\n --registry url=${SCHEMA_REGISTRY_URL} \\\n --registry basic.auth.user.info=${SR_API_KEY}:${SR_API_SECRET}\n```\n\n> More about confluent cloud configuration\n> at: [Kafka Client Quick Start for Confluent Cloud](https://docs.confluent.io/cloud/current/client-apps/config-client.html).\n\n#### Running with docker:\n\n```bash\ndocker run --rm -it --network my-networtk sauljabin/kaskade:latest \\\n admin -b my-kafka:9092\n```\n\n```bash\ndocker run --rm -it --network my-networtk sauljabin/kaskade:latest \\\n consumer -b my-kafka:9092 -t my-topic\n```\n\n#### Avro consumer:\n\nConsume using `my-schema.avsc` file:\n\n```bash\nkaskade consumer -b my-kafka:9092 --from-beginning \\\n -k string -v avro \\\n -t my-avro-topic \\\n --avro value=my-schema.avsc\n```\n\n#### Protobuf consumer:\n\nInstall `protoc` command:\n\n```bash\nbrew install protobuf\n```\n\nGenerate a _Descriptor Set_ file from your `.proto` file:\n\n```bash\nprotoc --include_imports \\\n --descriptor_set_out=my-descriptor.desc \\\n --proto_path=${PROTO_PATH} \\\n ${PROTO_PATH}/my-proto.proto\n```\n\nConsume using `my-descriptor.desc` file:\n\n```bash\nkaskade consumer -b my-kafka:9092 --from-beginning \\\n -k string -v protobuf \\\n -t my-protobuf-topic \\\n --protobuf descriptor=my-descriptor.desc \\\n --protobuf value=mypackage.MyMessage\n```\n\n> More about protobuf and `FileDescriptorSet` at: [Protocol Buffers Documentation](https://protobuf.dev/programming-guides/techniques/#self-description).\n\n## Development\n\nFor development instructions see [DEVELOPMENT.md](https://github.com/sauljabin/kaskade/blob/main/DEVELOPMENT.md).\n\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "kaskade is a text user interface for kafka",
"version": "4.0.2",
"project_urls": {
"Documentation": "https://github.com/sauljabin/kaskade",
"Homepage": "https://github.com/sauljabin/kaskade",
"Repository": "https://github.com/sauljabin/kaskade",
"changelog": "https://github.com/sauljabin/kaskade/blob/main/CHANGELOG.md",
"funding": "https://github.com/sponsors/sauljabin",
"issues": "https://github.com/sauljabin/kaskade/issues"
},
"split_keywords": [
"kafka",
" kaskade"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "71ee0d06a3d0b67e2f69f969aa4f17401f0f16396cdbb30d4bfb945f5d8dd568",
"md5": "0ed553d47d39a22c7fe4d1fb141678ef",
"sha256": "8a751348d77c02c2525867f241e152091a9271438866011acf1fae29fff89c63"
},
"downloads": -1,
"filename": "kaskade-4.0.2-py3-none-any.whl",
"has_sig": false,
"md5_digest": "0ed553d47d39a22c7fe4d1fb141678ef",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": "<3.14,>=3.10",
"size": 25084,
"upload_time": "2025-01-08T22:53:02",
"upload_time_iso_8601": "2025-01-08T22:53:02.646489Z",
"url": "https://files.pythonhosted.org/packages/71/ee/0d06a3d0b67e2f69f969aa4f17401f0f16396cdbb30d4bfb945f5d8dd568/kaskade-4.0.2-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "707af8e5902528fee31a88e85045606c5bfd941cd139c673a369697dbfc63f1d",
"md5": "dca4f8ed83f8ec1d716d73ec4f1b3283",
"sha256": "aeff83257d9a4cc3b47da6aa9456c337800523d7ada22f20c4750a84d902e0f8"
},
"downloads": -1,
"filename": "kaskade-4.0.2.tar.gz",
"has_sig": false,
"md5_digest": "dca4f8ed83f8ec1d716d73ec4f1b3283",
"packagetype": "sdist",
"python_version": "source",
"requires_python": "<3.14,>=3.10",
"size": 22092,
"upload_time": "2025-01-08T22:53:05",
"upload_time_iso_8601": "2025-01-08T22:53:05.230898Z",
"url": "https://files.pythonhosted.org/packages/70/7a/f8e5902528fee31a88e85045606c5bfd941cd139c673a369697dbfc63f1d/kaskade-4.0.2.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-01-08 22:53:05",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "sauljabin",
"github_project": "kaskade",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"lcname": "kaskade"
}