Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
65 commits
Select commit Hold shift + click to select a range
64c93e8
feat: add AI Libraries page to website
jbrinkman Jul 17, 2026
740f330
fix: use forced symlinks and proper quoting in init script
jbrinkman Aug 10, 2026
5d30c03
feat: Add integrations and clients page to replace ai page
rileydes-improving Sep 11, 2026
f0e6b44
Remove 21 catalog entries that don't meet the inclusion bar
Jonathan-Improving Sep 12, 2026
4ce89fa
Reword the licence rule so it stops contradicting itself
Jonathan-Improving Sep 14, 2026
a0e3c84
Content audit: apply field corrections and add 7 verified entries
Jonathan-Improving Sep 15, 2026
1a761e2
Content audit: final field edits, plus restore a field I dropped
Jonathan-Improving Sep 15, 2026
f25d92a
Drop LocalAI: its install requirement can't be expressed in the schema
Jonathan-Improving Sep 15, 2026
bd0acb3
Document docsNote properly so submitters know when and how to use it
Jonathan-Improving Sep 15, 2026
f146b49
Add vLLM Semantic Router
Jonathan-Improving Sep 15, 2026
6e631e3
Adjusting design based of feedback
rileydes-improving Sep 16, 2026
4efc95c
Temp Pipeline for Feedback
rileydes-improving Sep 16, 2026
a30b7bc
Cleaning up comment verboseness to match repository patterns
rileydes-improving Sep 16, 2026
ab9d26e
Enhance Libraries catalog with search term highlighting and improved …
rileydes-improving Sep 16, 2026
0fd47c0
Add pull request template link for adding libraries
rileydes-improving Sep 18, 2026
72778c4
Adding valkey glide php client
rileydes-improving Sep 18, 2026
b11242d
Refactor card layout in libraries catalog for consistent height throu…
rileydes-improving Sep 18, 2026
c0141f0
Merging Reviewer Feedback from Test Branch
rileydes-improving Sep 18, 2026
1989d78
Fix spring-data-valkey's installCommand so one line reaches Valkey
Jonathan-Improving Sep 21, 2026
1057868
Address Code Rabbit Suggestions and cleaning up development pipeline
rileydes-improving Sep 21, 2026
5fbe28b
Addressing remaining greptile/code rabbit comments
rileydes-improving Sep 21, 2026
ca8faac
Merge branch 'main' into fix/ai-libraries-595
jbrinkman Oct 5, 2026
778794b
Spell Node.js correctly
danielfrankcom Oct 2, 2026
daa1470
Remove the submission guide page
danielfrankcom Oct 2, 2026
d8e4537
Show only client features that tell clients apart
danielfrankcom Oct 2, 2026
690f6df
Use practitioner intro text on the catalog pages
danielfrankcom Oct 2, 2026
811c3d6
Render clients and integrations as separate pages
danielfrankcom Oct 2, 2026
f9b18de
Link each entry to a page that shows how to use it with Valkey
danielfrankcom Oct 2, 2026
c780bca
Require a documentation link for every entry
danielfrankcom Oct 2, 2026
b939f98
Update out-of-date install commands
danielfrankcom Oct 5, 2026
a107e9b
Add Valkey GLIDE Ruby
danielfrankcom Oct 5, 2026
29dbd01
Align card parts across each row and cap descriptions at 200 characters
danielfrankcom Oct 5, 2026
1d22e5e
Remove the unused client list templates
danielfrankcom Oct 5, 2026
ecd1f54
Omit vLLM Semantic Router's empty install command
danielfrankcom Oct 5, 2026
482c6b7
Document which client features the catalog hides
danielfrankcom Oct 5, 2026
9873624
Use the site's colour variables in the catalog where they match
danielfrankcom Oct 5, 2026
d2b4ca7
Remove unused catalog styles and outdated comments
danielfrankcom Oct 5, 2026
bc61cf7
Scope the catalog styles under .catalog
danielfrankcom Oct 5, 2026
e1a51f9
Remove LOCAL_TESTING.md, which duplicates the README
danielfrankcom Oct 5, 2026
4129e6f
Update the README for the in-repo catalog data
danielfrankcom Oct 5, 2026
c98f180
Drop the unused isGlide field
danielfrankcom Oct 5, 2026
fd75efd
Correct the manifest ordering note in the PR template
danielfrankcom Oct 5, 2026
54dcc5e
Use true/false flags for client features
danielfrankcom Oct 16, 2026
e59ecf8
Link valkey.io pages by root-relative path
danielfrankcom Oct 16, 2026
f640e82
Merge main into fix/ai-libraries-595
danielfrankcom Oct 16, 2026
a9fa273
Name the sort button from its visible text
danielfrankcom Oct 16, 2026
03dfed6
Merge main into fix/ai-libraries-595
danielfrankcom Oct 22, 2026
d0de233
Migrate the catalog templates to Zola 0.23
danielfrankcom Oct 22, 2026
777fbf9
Use LGPL-3.0-only for Sidekiq
danielfrankcom Oct 22, 2026
d7070ba
Derive isFirstParty from the repository URL
danielfrankcom Oct 22, 2026
24d6409
Remove the unused data-slug attribute
danielfrankcom Oct 22, 2026
702aade
Remove the unused tags from client entries
danielfrankcom Oct 22, 2026
8a5178c
Validate catalog entries with a JSON Schema
danielfrankcom Oct 22, 2026
0d7e46c
Validate the catalog on pull requests and before deploys
danielfrankcom Oct 22, 2026
4e527bd
Drop the template's entry checks now that CI validates entries
danielfrankcom Oct 22, 2026
bf249d2
Validate the commit the deploy builds
danielfrankcom Oct 23, 2026
ad3ad3c
Restore the phpredis client entry
danielfrankcom Oct 26, 2026
fe52886
Drop the unused clients argument from the topics init script
danielfrankcom Oct 26, 2026
db1765a
Rename the topics init script to init-topics.sh
danielfrankcom Oct 26, 2026
6c79802
Hide the whole toolbar without JS
danielfrankcom Oct 26, 2026
a3ba64e
Link the submission button to the add-library template
danielfrankcom Oct 26, 2026
3328828
Announce the result count to screen readers
danielfrankcom Oct 26, 2026
6c8834b
Make card names h2 headings under the page title
danielfrankcom Oct 26, 2026
c601cfa
Name the Valkey toggle from its visible text
danielfrankcom Oct 26, 2026
5ae7566
Drop the unused type field
danielfrankcom Oct 26, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
133 changes: 133 additions & 0 deletions .github/PULL_REQUEST_TEMPLATE/add_library.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,133 @@
<!-- Thanks for contributing to valkey.io! Everything you need is in this template. -->

### What are you adding?

<!-- Name of the client, tool, or integration, and a one-line summary. -->

- [ ] Client library → `_data/libraries/clients/`
- [ ] Integration (tool, framework, or AI/agent library) → `_data/libraries/integrations/`

### Entry details

- **Name:**
- **Repository:**
- **License (SPDX):**

---

## How entries work

Each entry is a single flat JSON file under `_data/libraries/`, in one of two
group directories, and registered by path in `_data/libraries/manifest.json`:

- Client libraries → `_data/libraries/clients/` (appear on the **Clients** page)
- Integrations → `_data/libraries/integrations/` (appear on the **Integrations** page)

The directory decides which page shows the entry and which fields it needs.
Integrations are the tools, frameworks, and AI libraries that work with Valkey:

- Tools and frameworks: CLI and GUI apps, deployment and operations tooling,
proxies and gateways, frameworks and ORMs, queues and background jobs,
data-movement connectors, and observability or testing tools.
- AI and agent libraries: AI memory platforms, agent frameworks, vector stores,
RAG and retrieval, and inference or serving engines.

Name the file after your entry, lowercase and hyphenated (e.g.
`valkey-glide-python.json`).
CI checks every entry with `build/validate-libraries.py`, against
`_data/libraries/schema.json`, the manifest, and the SPDX license list. To run
the check locally, use `./build/validate-libraries.py` with
[uv](https://docs.astral.sh/uv/) installed. The README's "Checking catalog
entries" section shows how to run it without uv. No other repositories are
needed.

## Fields

Entries are flat JSON objects, apart from a client's `features`. Use only the
fields below.

**Required for all entries:**

- `name` (string) — official name.
- `description` (string) — one or two factual, vendor-neutral sentences. The maximum length is set in `_data/libraries/schema.json`.
- `license` (string) — SPDX identifier, e.g. `"Apache-2.0"`, `"MIT"`, `"BSD-3-Clause"`. Must be an OSI-approved open-source license.
- `repository` (string) — public source-code repository URL. Entries whose repository is under `https://github.com/valkey-io/` are shown as maintained by Valkey.
- `documentation` (string) — a link to a page that shows how to use the project with Valkey. For a page on valkey.io, use a root-relative path such as `/topics/cli/`; for any other site, an `https://` URL. Link the first of these that exists: a Valkey page in the project's docs, a Valkey example, a getting-started guide, or the README section that shows basic usage. For a library that speaks the Redis protocol, a page that shows the connection setup is enough. A homepage, a docs index, or a directory listing isn't. Link GitHub files at a tag or commit (`/blob/v1.2.3/…`), not a branch.

**Required for clients:**

- `language` (string) — primary language. Integrations that are imported into code, such as ORM adapters, SDK wrappers and agent frameworks, set it too. Standalone tools leave it out. If a library has a separate package for each language, add one entry per language. The allowed languages are in `_data/libraries/schema.json`. If yours isn't there, add it to the schema in your PR.
- `features` (object of true/false flags) — one flag for each feature key listed under `features` in `_data/libraries/schema.json`. Set a flag to `true` if the client supports the feature, otherwise `false`. Include them all.

The client example below shows the format.
The label and definition of each feature, as shown on the site, are in `featureDescriptions` in `_data/libraries/metadata.json`.
A feature that every listed client supports, or that none does, isn't shown on cards or in the legend, because it doesn't tell clients apart.
So a feature you set can appear or disappear as other clients are added or removed.

**Optional fields:**

- `tags` (array of strings) — category tags that integrations use for filtering and discovery. Client entries have no tags. The allowed tags are in `_data/libraries/schema.json`. Use one of those where it fits. If none does, propose a new tag by adding it to the schema in your PR.
- `installCommand` (string) — primary install command, e.g. `"pip install valkey-glide"`.

## Example entries

Client (`_data/libraries/clients/valkey-glide-python.json`):

```json
{
"name": "Valkey GLIDE Python",
"language": "Python",
"license": "Apache-2.0",
"description": "Designed for reliability, optimized performance, and high-availability. GLIDE is a multi-language client with one shared Rust core and per-language bindings.",
"repository": "https://github.com/valkey-io/valkey-glide/tree/main/python",
"documentation": "https://glide.valkey.io/getting-started/quickstart/?lang=python",
"installCommand": "pip install valkey-glide",
"features": {
"replica": true,
"backoff": true,
"pubsub": true,
"scan": true,
"latency": false,
"az": true,
"csc": false,
"capa": false,
"pool": false
}
}
```

Integration (`_data/libraries/integrations/valkey-cli.json`):

```json
{
"name": "valkey-cli",
"language": "C",
"license": "BSD-3-Clause",
"description": "The interactive terminal client shipped with valkey-server, with cluster-aware routing, --scan, --bigkeys and latency diagnostics built in.",
"repository": "https://github.com/valkey-io/valkey",
"documentation": "/topics/cli/",
"tags": ["CLI & GUI"]
}
```

## Register in the manifest

Add the file's path (relative to `_data/libraries/`) to the matching array in
`_data/libraries/manifest.json` — `clients` or `integrations`. List it exactly
once; the page sorts cards by name, so the position doesn't matter. A file not
in the manifest will not appear on the site.

---

### Submission checklist

- [ ] Valid JSON, placed in `clients/` or `integrations/`, and registered once in `_data/libraries/manifest.json`.
- [ ] All required fields present: `name`, `description`, `license`, `repository`, `documentation` — plus `language` and `features` for clients, with every flag.
- [ ] Tested compatible with Valkey 7.2 or above.
- [ ] OSI-approved open-source license.
- [ ] Repository is publicly accessible, active within the last 6 months, and has a README with basic usage.
- [ ] `documentation` opens on a page that shows how to use the project with Valkey, not a homepage or an index.
- [ ] Description is factual, vendor-neutral and within the length limit in `_data/libraries/schema.json`. Every `features` flag and compatibility claim is accurate.
- [ ] Commits are signed per the DCO using `--signoff`.

By submitting this pull request, I confirm that my contribution is made under the terms of the BSD-3-Clause License.
37 changes: 37 additions & 0 deletions .github/workflows/validate-libraries.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
name: Validate library catalog

on:
pull_request:
branches: ["main"]
paths:
- '_data/libraries/**'
- 'build/validate-libraries.py'
- '.github/workflows/validate-libraries.yml'
workflow_call:
inputs:
ref:
description: The Git ref to validate. Leave it empty to validate the commit that triggered the run.
type: string
required: false
default: ''

permissions:
contents: read

jobs:
validate:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4
with:
ref: ${{ inputs.ref }}

- name: Install uv
uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0
with:
# The script's header pins its dependencies, so it is the cache key.
cache-dependency-glob: build/validate-libraries.py

- name: Validate catalog entries
run: ./build/validate-libraries.py
19 changes: 15 additions & 4 deletions .github/workflows/zola-deploy.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,11 @@ permissions:
jobs:
build:
runs-on: ubuntu-latest
outputs:
commit: ${{ steps.checkout.outputs.commit }}
steps:
- name: Checkout
id: checkout
uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4
with:
ref: ${{ github.event_name != 'pull_request' && 'main' || '' }}
Expand Down Expand Up @@ -54,11 +57,10 @@ jobs:
repository: valkey-io/valkey-json
path: valkey-json

- name: Init commands, topics and clients
- name: Init commands and topics
run: |
cd website
./build/init-topics-and-clients.sh ../valkey-doc/topics \
../valkey-doc/clients
./build/init-topics.sh ../valkey-doc/topics
./build/init-commands.sh ../valkey-doc/commands \
../valkey/src/commands ../valkey-bloom/src/commands \
../valkey-json/src/commands ../valkey-search/src/commands
Expand All @@ -76,13 +78,22 @@ jobs:
with:
path: ./website/public

validate:
needs: build
if: github.event_name != 'pull_request'
uses: ./.github/workflows/validate-libraries.yml
with:
ref: ${{ needs.build.outputs.commit }}
permissions:
contents: read

deploy:
if: github.event_name != 'pull_request'
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
runs-on: ubuntu-latest
needs: build
needs: [build, validate]
steps:
- name: Deploy to GitHub Pages
id: deployment
Expand Down
1 change: 0 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ build-command-json
build-json-command-json
build-search-command-json
build-topics
build-clients
content/commands/*
!content/commands/_index.md
content/topics/*
Expand Down
31 changes: 23 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,19 +26,34 @@ Open your browser to `http://127.0.0.1:1111/`
Zola will automatically rebuild on changes to the template or any content stored in this repo.
Changes to external content (command reference, documentation topics) require a restart of the Zola server process (`ctrl-c` then `zola serve` again, a browser refresh may also be needed).

### Checking catalog entries

The clients and integrations entries in `_data/libraries/` are checked by `build/validate-libraries.py`, against the rules in `_data/libraries/schema.json` and the SPDX license list.
CI runs it on pull requests that change the catalog and before every deploy.
To run it locally with [uv](https://docs.astral.sh/uv/), which installs the dependencies pinned in the script's `# /// script` header:

```shell
./build/validate-libraries.py
```

Without uv, install the dependencies listed in that header yourself, then run `python3 build/validate-libraries.py` with the Python version the header requires.

The script downloads the SPDX license list, so it needs network access.

## Building additional content

**By default, the site will build without documentation topics, command reference, or the clients page.**
The content for documentation topics and the clients page are stored within the `valkey-io/valkey-doc` repo.
**By default, the site will build without documentation topics or the command reference.**
The content for documentation topics is stored within the `valkey-io/valkey-doc` repo.
The content for the command reference page is in the `valkey-io/valkey` repo.
The clients and integrations pages (`/clients/`, `/integrations/`) are built from `_data/libraries/` in this repo, so they need no other repo.

If you want to build the site with this content, you'll need to have a local copy of `valkey-io/valkey-doc` and `valkey-io/valkey` _outside_ of this repo.
Then follow the instructions to [build the documentation topics and clients](#building-the-documentation-topics-and-clients-page) and/or [build the command reference](#building-the-command-reference).
Then follow the instructions to [build the documentation topics](#building-the-documentation-topics) and/or [build the command reference](#building-the-command-reference).
The instructions show how to use scripts that create symbolic links to the `valkey-io/valkey-doc` and `valkey-io/valkey` repos as well as create a series of empty stub files that tell Zola to create pages.

### Building the documentation topics and clients page
### Building the documentation topics

Documentation 'topics' (i.e. `/topics/keyspace/`, `/topics/encryption/`, `/topics/transactions/`) and the client libraries' data (i.e. `/client-page-clients/nodejs/valkey-glide`, `/client-page-clients/python/valkey-py`) sources content from `valkey-io/valkey-doc`.
Documentation 'topics' (i.e. `/topics/keyspace/`, `/topics/encryption/`, `/topics/transactions/`) source content from `valkey-io/valkey-doc`.

```mermaid
flowchart TD
Expand All @@ -52,12 +67,12 @@ First, stop the `zola serve` process if you're running it.
From the root directory of this repo run:

```shell
# You should only need to run this once or when you add a new topic/client.
./build/init-topics-and-clients.sh ../valkey-doc/topics ../valkey-doc/clients
# You should only need to run this once or when you add a new topic.
./build/init-topics.sh ../valkey-doc/topics
```

Then, restart Zola.
Point your browser at `http://127.0.0.1:1111/topics/` and you should see the fully populated list of topics and clients.
Point your browser at `http://127.0.0.1:1111/topics/` and you should see the fully populated list of topics.
All files created in this process are ignored by git.
Commit your changes to your local copy of `valkey-io/valkey-doc`.

Expand Down
60 changes: 60 additions & 0 deletions _data/lang_colors.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
# Language chip colors for the client/integration catalog (see templates/libraries.html).
#
# Colors are the per-language "color" values from GitHub Linguist's
# lib/linguist/languages.yml, which is MIT-licensed data (colors, not logos), so
# there is no trademark exposure — unlike bundling brand logos. See:
# https://github.com/github-linguist/linguist/blob/main/lib/linguist/languages.yml
# https://github.com/github-linguist/linguist/blob/main/LICENSE (MIT)
#
# Each entry is keyed by the language slug the template computes from the
# `language` field (lowercased; `#` -> `-sharp`, `.` and spaces -> `-`), e.g.
# "C#" -> "c-sharp", "Node.js" -> "node-js".
#
# Fields:
# color — chip background (Linguist hex).
# fg — chip text/monogram color; use "#000" on light chips, "#fff" on dark.
# mono — 1-2 char monogram shown in the badge.
#
# Note: Node.js is a runtime, not a Linguist language, so it has no Linguist
# color of its own; we reuse the JavaScript color (#f1e05a) for the "node-js"
# slug since Node.js clients are JavaScript/TypeScript.

[python]
color = "#3572A5"
fg = "#fff"
mono = "Py"

[node-js]
color = "#f1e05a"
fg = "#000"
mono = "Js"

[java]
color = "#b07219"
fg = "#fff"
mono = "Jv"

[c-sharp]
color = "#178600"
fg = "#fff"
mono = "C#"

[go]
color = "#00ADD8"
fg = "#fff"
mono = "Go"

[php]
color = "#4F5D95"
fg = "#fff"
mono = "PHP"

[swift]
color = "#F05138"
fg = "#fff"
mono = "Sw"

[ruby]
color = "#701516"
fg = "#fff"
mono = "Rb"
20 changes: 20 additions & 0 deletions _data/libraries/clients/iovalkey.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
{
"name": "iovalkey",
"language": "Node.js",
"license": "MIT",
"description": "A friendly fork of a widely used Node.js client, tracking Valkey. Promise-based API, Lua scripting and cluster support.",
"repository": "https://github.com/valkey-io/iovalkey",
"documentation": "https://github.com/valkey-io/iovalkey/blob/v0.4.0/README.md#quick-start",
"installCommand": "npm install iovalkey",
"features": {
"replica": true,
"backoff": true,
"pubsub": true,
"scan": false,
"latency": false,
"az": false,
"csc": false,
"capa": false,
"pool": true
}
}
20 changes: 20 additions & 0 deletions _data/libraries/clients/phpredis.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
{
"name": "phpredis",
"language": "PHP",
"license": "PHP-3.01",
"description": "A client implemented as a PHP extension in C. Supports clustering, Sentinel, client-side sharding and storing PHP sessions.",
"repository": "https://github.com/phpredis/phpredis",
"documentation": "https://github.com/phpredis/phpredis/blob/6.3.0/README.md#connect-open",
"installCommand": "pie install phpredis/phpredis",
"features": {
"replica": true,
"backoff": true,
"pubsub": false,
"scan": false,
"latency": false,
"az": false,
"csc": false,
"capa": false,
"pool": true
}
}
Loading
Loading