diff --git a/docs/.vitepress/config.js b/docs/.vitepress/config.js
index f535db2..a601d10 100644
--- a/docs/.vitepress/config.js
+++ b/docs/.vitepress/config.js
@@ -70,7 +70,7 @@ export default defineConfig({
collapsed: false,
items: [
{
- text: 'mule-chunking-connector',
+ text: 'Chunking Connector',
collapsed: false,
items: [
{ text: 'Overview', link: '/connectors/mule-chunking-connector/' },
@@ -86,7 +86,7 @@ export default defineConfig({
]
},
{
- text: 'mule-idp-connector',
+ text: 'IDP Connector',
collapsed: false,
items: [
{ text: 'Overview', link: '/connectors/mule-idp-connector/' },
@@ -111,6 +111,33 @@ export default defineConfig({
{ text: 'Universal REST Smart Connector', link: '/connectors/mule-idp-connector/mulesoft-idp-universal-rest-smart-connector' },
{ text: 'Dataweave', link: '/connectors/mule-idp-connector/dataweave' }
]
+ },
+ {
+ text: 'Lettuce Redis Connector',
+ collapsed: false,
+ items: [
+ { text: 'Overview', link: '/connectors/mule-lettuce-redis-connector/' },
+ { text: 'Set Up', link: '/connectors/mule-lettuce-redis-connector/set-up' },
+ {
+ text: 'Operations',
+ collapsed: true,
+ items: [
+ { text: 'Operations Overview', link: '/connectors/mule-lettuce-redis-connector/operations/' },
+ { text: 'Server', link: '/connectors/mule-lettuce-redis-connector/operations/server' },
+ { text: 'Key / Value', link: '/connectors/mule-lettuce-redis-connector/operations/key-value' },
+ { text: 'Hash', link: '/connectors/mule-lettuce-redis-connector/operations/hash' },
+ { text: 'List', link: '/connectors/mule-lettuce-redis-connector/operations/list' },
+ { text: 'Set', link: '/connectors/mule-lettuce-redis-connector/operations/set' },
+ { text: 'Sorted Set', link: '/connectors/mule-lettuce-redis-connector/operations/sorted-set' },
+ { text: 'Geospatial', link: '/connectors/mule-lettuce-redis-connector/operations/geospatial' },
+ { text: 'Stream', link: '/connectors/mule-lettuce-redis-connector/operations/stream' },
+ { text: 'Channel', link: '/connectors/mule-lettuce-redis-connector/operations/channel' },
+ { text: 'Send Command', link: '/connectors/mule-lettuce-redis-connector/operations/send-command' },
+ { text: 'Search Operations', link: '/connectors/mule-lettuce-redis-connector/operations/search-operations' }
+ ]
+ },
+ { text: 'Sources (Listeners)', link: '/connectors/mule-lettuce-redis-connector/sources' }
+ ]
}
]
},
@@ -121,7 +148,7 @@ export default defineConfig({
collapsed: false,
items: [
{
- text: 'mule-pdfbox-module',
+ text: 'PDFBox Module',
collapsed: false,
items: [
{ text: 'Overview', link: '/modules/mule-pdfbox-module/' },
diff --git a/docs/connectors/mule-lettuce-redis-connector/index.md b/docs/connectors/mule-lettuce-redis-connector/index.md
new file mode 100644
index 0000000..be1d381
--- /dev/null
+++ b/docs/connectors/mule-lettuce-redis-connector/index.md
@@ -0,0 +1,70 @@
+---
+title: Mule Lettuce Redis Connector
+description: Direct access to Redis commands from Mule applications, built on the Lettuce reactive Redis client.
+---
+
+# Lettuce Redis Connector
+
+A low-level connector providing Mule applications with direct access to Redis commands, built on the [Lettuce](https://lettuce.io/) reactive Redis client library. Published on Maven Central under `cloud.anypoint`.
+
+The connector's goal is to provide full coverage of all documented Redis commands, organized by Redis data structure. For commands not yet implemented as dedicated operations, the [Send Command](./operations/send-command) operation lets you execute any arbitrary Redis command.
+
+## Features
+
+- **Broad command coverage**: Dedicated operations for strings, hashes, lists, sets, sorted sets, geospatial indexes, and streams
+- **Pub/Sub event sources**: Trigger Mule flows in real time from Redis channels using SUBSCRIBE and PSUBSCRIBE
+- **Dynamic command execution**: [Send Command](./operations/send-command) executes any Redis command not yet available as a dedicated operation
+- **Automated SCAN iteration**: [Search Operations](./operations/search-operations) handle Redis cursor management internally, streaming full result sets without manual loop logic
+- **Maven Central**: Install with a single Maven dependency — no local builds required
+
+## Quick Example
+
+```xml
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+## Supported Command Categories
+
+| Category | Operations | Page |
+|----------|-----------|------|
+| Server | PING | [Server](./operations/server) |
+| Key / Value | APPEND, COPY, DECR, DEL, EXPIRE, GET, GETDEL, GETEX, GETRANGE, GETSET, INCR, MGET, MSET, PERSIST, PEXPIRE, PTTL, SCAN, SET, TOUCH, TTL | [Key / Value](./operations/key-value) |
+| Hash | HEXISTS, HGET, HGETALL, HINCRBY, HLEN, HMGET, HSCAN, HSET | [Hash](./operations/hash) |
+| List | BLMOVE, BLPOP, BRPOP, LMOVE, LPOP, LPUSH, LSET, RPOP, RPUSH | [List](./operations/list) |
+| Set | SADD, SCARD, SDIFF, SISMEMBER, SMEMBERS, SMISMEMBER, SPOP, SRANDMEMBER, SREM, SSCAN | [Set](./operations/set) |
+| Sorted Set | ZADD, ZINCRBY, ZRANK, ZSCAN, ZSCORE | [Sorted Set](./operations/sorted-set) |
+| Geospatial | GEOADD, GEODIST, GEOPOS, GEOSEARCH | [Geospatial](./operations/geospatial) |
+| Stream | XACK, XADD, XDEL, XGROUP CREATE, XGROUP DESTROY, XINFO GROUPS, XRANGE, XREAD, XREADGROUP, XTRIM | [Stream](./operations/stream) |
+| Channel | PUBLISH | [Channel](./operations/channel) |
+| Send Command | Any Redis command (dynamic) | [Send Command](./operations/send-command) |
+| Search Operations | Automated SCAN, HSCAN, SSCAN, ZSCAN iteration | [Search Operations](./operations/search-operations) |
+| Sources (Listeners) | SUBSCRIBE, PSUBSCRIBE | [Sources](./sources) |
+
+## Requirements
+
+- **Mule Runtime**: 4.6.0 or later
+- **Java**: 8, 11, or 17
+- **Redis**: Any version supporting the commands you use
+
+## Learn More
+
+- [Set Up Guide](./set-up) — Installation and connection configuration
+- [Operations Reference](./operations/) — All operations by category
+- [Sources (Listeners)](./sources) — Pub/Sub event-driven flows
+- [GitHub Repository](https://github.com/anypointcloud/mule-lettuce-redis-connector) — Source code and issues
diff --git a/docs/connectors/mule-lettuce-redis-connector/operations/channel.md b/docs/connectors/mule-lettuce-redis-connector/operations/channel.md
new file mode 100644
index 0000000..17b617c
--- /dev/null
+++ b/docs/connectors/mule-lettuce-redis-connector/operations/channel.md
@@ -0,0 +1,110 @@
+---
+title: Channel Commands — Lettuce Redis Connector
+description: Reference for channel (Pub/Sub) Redis commands in the Mule Lettuce Redis Connector
+---
+
+# Channel Commands
+
+Channel commands are used to send messages to Redis Pub/Sub channels. To receive messages, see [Sources (Listeners)](../sources).
+
+This page covers: **PUBLISH**
+
+---
+
+## PUBLISH
+
+Publish a message to a Redis Pub/Sub channel.
+
+> 📘 **Redis Reference**: [PUBLISH](https://redis.io/docs/latest/commands/publish/)
+
+### XML Example
+
+```xml
+
+```
+
+### Parameters
+
+| Parameter | Type | Required | Default | Description |
+|-----------|------|----------|---------|-------------|
+| `channel` | String | Yes | — | The name of the channel to publish to |
+| `message` | String | Yes | — | The message content to publish |
+
+### Output
+
+**Type**: `Long`
+
+The number of subscribers that received the message. A return value of `0` means no clients were subscribed to the channel when the message was published.
+
+::: warning Message Delivery
+Redis Pub/Sub is fire-and-forget. If no subscriber is listening when PUBLISH is called, the message is lost. For durable messaging, consider using [Redis Streams](./stream) instead.
+:::
+
+### Errors
+
+| Error Type | Condition |
+|------------|-----------|
+| `REDIS:COMMAND` | Connection failure or server error |
+
+### Usage
+
+::: info Configuration
+PUBLISH uses the **standard configuration** (`lettuce-redis:config`), not the pub/sub configuration. Only the SUBSCRIBE and PSUBSCRIBE sources require the pub/sub configuration.
+:::
+
+**Common pattern: Publish and subscribe in the same application**
+
+```xml
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+### See Also
+
+- [Sources (Listeners)](../sources) — SUBSCRIBE and PSUBSCRIBE for receiving messages
+- [Redis Streams](./stream) — Durable, persistent messaging with consumer groups
diff --git a/docs/connectors/mule-lettuce-redis-connector/operations/geospatial.md b/docs/connectors/mule-lettuce-redis-connector/operations/geospatial.md
new file mode 100644
index 0000000..dbbd296
--- /dev/null
+++ b/docs/connectors/mule-lettuce-redis-connector/operations/geospatial.md
@@ -0,0 +1,347 @@
+---
+title: Geospatial Commands — Lettuce Redis Connector
+description: Reference for geospatial Redis commands in the Mule Lettuce Redis Connector
+---
+
+# Geospatial Commands
+
+Geospatial commands operate on Redis geospatial indexes — sorted sets where each member represents a location with longitude and latitude coordinates. Useful for location-based queries like "find nearby points" or "calculate distance between locations".
+
+This page covers: **GEOADD**, **GEODIST**, **GEOPOS**, **GEOSEARCH**
+
+---
+
+## GEOADD
+
+Add one or more geospatial items (longitude, latitude, name) to a geospatial index.
+
+> 📘 **Redis Reference**: [GEOADD](https://redis.io/docs/latest/commands/geoadd/)
+
+### XML Example
+
+```xml
+
+```
+
+### Parameters
+
+| Parameter | Type | Required | Default | Description |
+|-----------|------|----------|---------|-------------|
+| `key` | String | Yes | — | The geospatial index key |
+| `items` | List\ | Yes | — | Locations to add. At least one required. Each item has: `name` (String), `longitude` (double), `latitude` (double). |
+| `nx` | boolean | No | `false` | Only add new members (do not update existing) |
+| `xx` | boolean | No | `false` | Only update existing members (do not add new) |
+| `ch` | boolean | No | `false` | Change the return value to count **changed** members instead of **added** members |
+
+**GeospatialItem structure**:
+```dataweave
+{
+ name: "location-name", // String
+ longitude: -122.4194, // double
+ latitude: 37.7749 // double
+}
+```
+
+### Output
+
+**Type**: `Long`
+
+The number of elements added to the index. When `ch=true`, returns the number of elements added or updated.
+
+### Errors
+
+| Error Type | Condition |
+|------------|-----------|
+| `REDIS:ARGUMENT` | No items provided, or invalid coordinates |
+| `REDIS:COMMAND` | General command execution error |
+| `REDIS:WRONG_TYPE` | Key exists but is not a sorted set (geospatial index) |
+
+---
+
+## GEOPOS
+
+Get the longitude and latitude coordinates of one or more members in a geospatial index.
+
+> 📘 **Redis Reference**: [GEOPOS](https://redis.io/docs/latest/commands/geopos/)
+
+### XML Example
+
+```xml
+
+
+
+
+
+
+```
+
+### Parameters
+
+| Parameter | Type | Required | Default | Description |
+|-----------|------|----------|---------|-------------|
+| `key` | String | Yes | — | The geospatial index key |
+| `members` | List\ | Yes | — | Member names to look up. At least one required. Payload by default via `@Content`. |
+
+### Output
+
+**Type**: `List`
+
+A list of locations, one for each input member. If a member does not exist, its entry in the list is `null`.
+
+**GeoLocation structure**:
+```dataweave
+{
+ longitude: -122.4194, // double
+ latitude: 37.7749 // double
+}
+```
+
+### Errors
+
+| Error Type | Condition |
+|------------|-----------|
+| `REDIS:ARGUMENT` | No members provided |
+| `REDIS:COMMAND` | General command execution error |
+| `REDIS:WRONG_TYPE` | Key exists but is not a geospatial index |
+
+---
+
+## GEODIST
+
+Calculate the distance between two members in a geospatial index.
+
+> 📘 **Redis Reference**: [GEODIST](https://redis.io/docs/latest/commands/geodist/)
+
+### XML Example
+
+```xml
+
+
+
+
+```
+
+### Parameters
+
+| Parameter | Type | Required | Default | Description |
+|-----------|------|----------|---------|-------------|
+| `key` | String | Yes | — | The geospatial index key |
+| `member1` | String | Yes | — | First member |
+| `member2` | String | Yes | — | Second member |
+| `unit` | DistanceUnit | No | `M` | Unit for the returned distance: `M` (meters), `KM` (kilometers), `FT` (feet), `MI` (miles) |
+
+**DistanceUnit values**: `M`, `KM`, `FT`, `MI`
+
+### Output
+
+**Type**: `Double`
+
+The distance between the two members in the specified unit.
+
+### Errors
+
+| Error Type | Condition |
+|------------|-----------|
+| `REDIS:COMMAND` | General command execution error |
+| `REDIS:WRONG_TYPE` | Key exists but is not a geospatial index |
+
+---
+
+## GEOSEARCH
+
+Search for members in a geospatial index within a specified area.
+
+> 📘 **Redis Reference**: [GEOSEARCH](https://redis.io/docs/latest/commands/geosearch/)
+
+GEOSEARCH is the most complex operation in the connector due to its many configuration options. It supports searching by radius or by box, from a member location or from explicit coordinates, with optional result options (coordinates, distance, geohash).
+
+::: warning Static Configuration Required
+The `searchCenter` and `searchBy` parameters are `@Expression(NOT_SUPPORTED)` — they **must** be configured statically in XML. DataWeave expressions cannot be used for these parameters.
+:::
+
+### XML Examples
+
+**Search by radius from a member:**
+
+```xml
+
+
+
+
+
+```
+
+**Search by radius from coordinates:**
+
+```xml
+
+
+
+
+
+
+
+
+```
+
+**Search by box:**
+
+```xml
+
+
+
+```
+
+### Parameters
+
+| Parameter | Type | Required | Default | Description |
+|-----------|------|----------|---------|-------------|
+| `key` | String | Yes | — | The geospatial index key |
+| `searchCenter` | GeoSearchCenter | Yes | — | Origin of the search. See structures below. |
+| `searchBy` | GeoSearchBy | Yes | — | Search shape (radius or box). See structures below. |
+| `sortOrder` | SortOrder | Yes | — | Sort results by distance: `NONE`, `ASC`, or `DESC` |
+| `count` | Integer | No | — | Maximum number of results to return |
+| `countAny` | boolean | No | `false` | If true, return any `count` results (not necessarily the closest) |
+| `searchResultOptions` | GeoSearchResultOption | Yes | — | What to include in results: `withCoord`, `withDist`, `withHash` |
+
+**GeoSearchCenter** (choose one):
+
+| Type | Structure |
+|------|-----------|
+| `fromMember` | `{fromMember: "member-name"}` |
+| `fromLatLong` | `{fromLatLong: {latitude: 37.7749, longitude: -122.4194}}` |
+
+**GeoSearchBy** (choose one):
+
+| Type | Structure |
+|------|-----------|
+| `byRadius` | `{byRadius: {radius: 10.0, unit: 'KM'}}` |
+| `byBox` | `{byBox: {width: 20.0, height: 15.0, unit: 'KM'}}` |
+
+**GeoSearchResultOption** (parameter group):
+
+| Field | Type | Default | Description |
+|-------|------|---------|-------------|
+| `withCoord` | boolean | `false` | Include coordinates in results |
+| `withDist` | boolean | `false` | Include distance from search center in results |
+| `withHash` | boolean | `false` | Include geohash integer in results |
+
+**SortOrder values**: `NONE`, `ASC`, `DESC`
+
+**DistanceUnit values** (for radius and box): `M`, `KM`, `FT`, `MI`
+
+### Output
+
+**Type**: `List` (dynamic, resolved by metadata based on `searchResultOptions`)
+
+**When no result options are enabled** (`withCoord=false`, `withDist=false`, `withHash=false`):
+- **Type**: `List` — Member names only
+
+**When one or more result options are enabled**:
+- **Type**: `List