Skip to content

feat: add AI Libraries page to website - #602

Open
jbrinkman wants to merge 1 commit into
valkey-io:mainfrom
jbrinkman:fix/ai-libraries-595
Open

feat: add AI Libraries page to website#602
jbrinkman wants to merge 1 commit into
valkey-io:mainfrom
jbrinkman:fix/ai-libraries-595

Conversation

@jbrinkman

Copy link
Copy Markdown

Add AI Libraries page to website

Description

This PR implements a comprehensive AI Libraries page on valkey.io to showcase AI/ML frameworks and libraries that support Valkey for caching, vector storage, and memory management. The page mirrors the existing Client Libraries page structure and displays 14 AI libraries organized by programming language.

Related Issue

Fixes #595

Dependencies

⚠️ This PR depends on: valkey-io/valkey-doc#459

The valkey-doc PR must be merged first as it adds the new valkey_uses field and improved descriptions to the AI library JSON files that this website template consumes.

Changes

Build System

  • build/init-topics-and-clients.sh: Added third parameter for AI libraries path, creates build-ai symlink
  • config.toml: Added ai_json_path = "../build-ai/" configuration
  • .github/workflows/zola-deploy.yml: Updated workflow to include ../valkey-doc/ai parameter
  • .gitignore: Added build-ai to ignore generated symlinks

Content & Templates

  • content/ai/_index.md: Created AI Libraries page content with 14 libraries listed in recommended_ai_paths
  • templates/ai-list.html: Created display template (simplified version of client-list.html) with proper whitespace control
  • templates/macros/docs.html: Added ai_json_path() helper macro
  • templates/default.html: Added "AI Libraries" link to Documentation submenu

Documentation

  • LOCAL_TESTING.md: Created comprehensive guide for local development and testing

New Page Structure

The AI Libraries page displays for each library:

  1. Name - Library heading with anchor link
  2. Repo - Link to GitHub repository
  3. Description - What the library does and why to use it (NEW)
  4. Valkey Uses - How Valkey is integrated (vector store, caching, memory, etc.) (NEW)
  5. Installation - Installation command
  6. Version - Current version number
  7. Version Released - Release date
  8. License - Software license

Libraries are organized by language:

  • Python (10): Cognee, Haystack, LangChain AWS, OpenMemory, PraisonAI, Open-WebUI, vLLM, CocoIndex, DB-GPT, KServe
  • JavaScript (2): Recall, OpenMemory
  • Java (1): Langchain4j
  • Lua (1): Kong Gateway

Example Output

<h3>LangChain AWS</h3>
<ul>
  <li><strong>Repo:</strong> <a href="...">LangChain AWS</a></li>
  <li><strong>Description:</strong> Build LLM applications on AWS infrastructure...</li>
  <li><strong>Valkey Uses:</strong> Cache store for LLM responses and vector store...</li>
  <li><strong>Installation:</strong> <code>pip install langchain-aws</code></li>
  <li><strong>Version:</strong> 1.4.1</li>
  <li><strong>Version Released:</strong> 2025-10-15</li>
  <li><strong>License:</strong> MIT</li>
</ul>

Testing

  • Local build successful (257 pages generated)
  • Template whitespace control verified (no excessive blank lines)
  • All 14 libraries display correctly with new fields
  • Navigation menu link works
  • Language sections properly organized
  • Repo links functional
  • HTML output is clean and properly formatted

Local Testing Results

$ zola build
Building site...
-> Creating 257 pages (0 orphan) and 12 sections
Done in 3.5s.

$ grep -A 10 "Cognee" public/ai/index.html
<h3 id="cognee-valkey-adapter">Cognee Valkey Adapter</h3>
<ul>
    <li><strong>Repo:</strong> <a href="...">Cognee Valkey Adapter</a></li>
    <li><strong>Description:</strong> Build AI agent memory...</li>
    <li><strong>Valkey Uses:</strong> Vector database adapter...</li>
    ...
</ul>

Screenshots

(Add screenshots of the rendered AI Libraries page after pushing)

Checklist

  • All commit messages follow conventional commits format
  • Commit is signed-off (DCO)
  • Template follows existing patterns (client-list.html)
  • Whitespace control implemented to prevent blank lines
  • Navigation menu updated
  • Build configuration updated
  • CI/CD workflow updated
  • Local testing documentation provided
  • No breaking changes to existing pages

Analytics Support

The page includes the standard Google Tag Manager (GTM) integration (GTM-MFFCB7SR) that allows the Valkey team to:

  • Track page views on the AI Libraries page
  • Monitor which libraries get the most clicks
  • Analyze user engagement with AI-focused content

GTM administrators can configure link tracking to see click-through rates to individual library repositories.

Notes for Reviewers

  1. Template Design: The ai-list.html template is intentionally simplified compared to client-list.html - it doesn't include a feature comparison table since AI libraries have different integration patterns (vector store vs caching vs memory management)

  2. Field Ordering: The Description and Valkey Uses fields appear between Repo and Installation to provide immediate context about what the library does and how it uses Valkey before showing installation instructions

  3. Whitespace Control: Template uses {%- and -%} for whitespace control to prevent excessive blank lines in the generated HTML

  4. Build Process: The init script creates a symlink (build-ai -> ../valkey-doc/ai) so the website can access the JSON files from the valkey-doc repository

Future Enhancements

Potential improvements for future PRs:

  • Add filtering by Valkey use case (vector store, caching, memory management)
  • Add sorting options (by language, name, newest first)
  • Add library logos/icons if available
  • Add "Recommended" badges similar to client libraries

Page URL after merge: https://valkey.io/ai/

Implement comprehensive AI Libraries page showing AI/ML libraries that
support Valkey for caching, vector storage, and memory management.

Changes:
- Update build/init-topics-and-clients.sh to accept AI path as 3rd parameter
- Add ai_json_path configuration to config.toml
- Create content/ai/_index.md with 14 AI libraries listed
- Create templates/ai-list.html for AI libraries display with proper
  whitespace control to prevent excessive blank lines in output
- Update ai-list.html to display Description and Valkey Uses fields
  between Repo and Installation for better context
- Add ai_json_path() macro to templates/macros/docs.html
- Update templates/default.html to add AI Libraries to navigation menu
- Update .github/workflows/zola-deploy.yml to include AI libraries in build
- Add LOCAL_TESTING.md documentation for local development
- Add build-ai to .gitignore

The page displays AI libraries organized by language (Python, JavaScript,
Java, Lua) with details including:
- Repository link
- Description (what the library does and why to use it)
- Valkey Uses (how Valkey is used: vector store, caching, memory, etc.)
- Installation instructions
- Version and release date
- License

Successfully tested locally with Zola build - 257 pages generated including
the new AI libraries page at /ai/ with clean HTML output and all new fields
displaying correctly.

Signed-off-by: Joseph Brinkman <joe.brinkman@improving.com>
@coderabbitai

coderabbitai Bot commented Jul 17, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

📝 Walkthrough

Walkthrough

Changes

Adds an AI Libraries documentation page that loads library metadata from valkey-doc, renders entries by language, exposes the page in navigation, and extends initialization, deployment, configuration, and local testing instructions.

AI Libraries documentation

Layer / File(s) Summary
AI page data and rendering
config.toml, templates/macros/docs.html, content/ai/_index.md, templates/ai-list.html
Configures external AI JSON paths, defines recommended library entries, and renders metadata grouped by language.
AI asset initialization and site navigation
build/init-topics-and-clients.sh, .github/workflows/zola-deploy.yml, .gitignore, templates/default.html
Validates the AI directory, creates the build-ai symlink, passes the directory during deployment, ignores the generated link, and adds an AI Libraries navigation entry.
Local development and production guidance
LOCAL_TESTING.md
Documents setup, AI asset troubleshooting, JSON validation, production builds, cleanup, and related resources.

Assessment against linked issues

Objective Addressed Explanation
Add a centralized integrations page covering client libraries, frameworks, observability, provisioning, data migration, and AI/ML tools [#595] The change adds only an AI Libraries page; the other requested integration categories are not included.
Make the page filterable/searchable and show name, description, compatibility status, and project or documentation links [#595] The template renders language-grouped entries but does not implement filtering/search or a compatibility-status field.

Warning

There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure.

🔧 Checkov (3.3.8)
.github/workflows/zola-deploy.yml

Traceback (most recent call last):
File "/usr/local/bin/checkov", line 2, in
from checkov.main import Checkov
ModuleNotFoundError: No module named 'checkov'


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@jbrinkman

Copy link
Copy Markdown
Author

Depends on valkey-io/valkey-doc#459

@edlng edlng left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Small comments

Comment thread LOCAL_TESTING.md
Comment thread build/init-topics-and-clients.sh
Comment thread content/ai/_index.md
@jbrinkman
jbrinkman marked this pull request as ready for review July 22, 2026 20:34

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.github/workflows/zola-deploy.yml:
- Around line 60-62: Pin the valkey-doc checkout used by the CI workflow and the
clone command in LOCAL_TESTING.md to the same explicit branch, tag, or commit.
Update .github/workflows/zola-deploy.yml around build/init-topics-and-clients.sh
and LOCAL_TESTING.md at the valkey-doc clone so both environments consume the
intended revision consistently.

In `@build/init-topics-and-clients.sh`:
- Around line 86-90: Update the build-ai symlink creation block to replace stale
links rather than invoking ln against an existing destination. Preserve the
existing conditional, quote the $3 target path, and use the same forced
symbolic-link handling as the build-clients path: -ln -sfn "$3" ./build-ai.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 32359ff3-0bda-4be2-ad04-34383ce63be0

📥 Commits

Reviewing files that changed from the base of the PR and between 2e08e11 and 15c10f0.

📒 Files selected for processing (9)
  • .github/workflows/zola-deploy.yml
  • .gitignore
  • LOCAL_TESTING.md
  • build/init-topics-and-clients.sh
  • config.toml
  • content/ai/_index.md
  • templates/ai-list.html
  • templates/default.html
  • templates/macros/docs.html

Comment on lines 60 to +62
./build/init-topics-and-clients.sh ../valkey-doc/topics \
../valkey-doc/clients
../valkey-doc/clients \
../valkey-doc/ai

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🗄️ Data Integrity & Integration | 🟠 Major | 🏗️ Heavy lift

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "Files:"
git ls-files .github/workflows/zola-deploy.yml LOCAL_TESTING.md || true

echo
echo ".github/workflows/zola-deploy.yml:"
if [ -f .github/workflows/zola-deploy.yml ]; then
  nl -ba .github/workflows/zola-deploy.yml | sed -n '1,120p'
fi

echo
echo "LOCAL_TESTING.md relevant lines:"
if [ -f LOCAL_TESTING.md ]; then
  nl -ba LOCAL_TESTING.md | sed -n '1,80p'
fi

echo
echo "Search valkey-doc references in workflow and docs:"
rg -n --hidden --glob '!node_modules' --glob '!dist' --glob '!build' 'valkey-doc|Checkout valkey-doc|init-topics-and-clients|459' .github workflows LOCAL_TESTING.md . 2>/dev/null | head -200

Repository: valkey-io/valkey-io.github.io

Length of output: 302


🌐 Web query:

valkey-io valkey-doc issue 459 or PR 459 AI metadata schema

💡 Result:

There is no record of an issue or pull request #459 specifically related to "AI metadata schema" within the official valkey-io/valkey-doc repository [1][2]. In the context of the Valkey ecosystem: - The valkey-io/valkey-doc repository tracks documentation issues, such as fulltext search documentation (#403) and benchmark updates (#414), but issue #459 is not associated with an AI metadata schema initiative [1][3][4]. - PR #459 in the main valkey-io/valkey repository is unrelated to AI metadata; it concerns unit test migration [5]. - Valkey Search supports metadata filtering for AI-driven workloads (e.g., vector search) through Numeric and Tag fields, which are indexed alongside vectors in Hash or JSON data types [6][7]. These are documented as standard search field types rather than a specialized "AI metadata schema" [7][8]. If you are looking for documentation regarding metadata schemas for AI applications, you may be referring to generic vector search patterns, where metadata is stored as attributes (fields) within a Valkey Hash or JSON document and then explicitly declared in a Valkey Search index schema [6][9][7].

Citations:


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo ".github/workflows/zola-deploy.yml:"
sed -n '1,140p' .github/workflows/zola-deploy.yml

echo
echo "LOCAL_TESTING.md relevant lines:"
sed -n '1,90p' LOCAL_TESTING.md

echo
echo "Valkey-doc references in tracked docs/workflow:"
rg -n 'valkey-doc|Checkout valkey-doc|clone https://github.com/valkey-io/valkey-doc.git|../valkey-doc/ai|init-topics-and-clients|459' .github/workflows/zola-deploy.yml LOCAL_TESTING.md built 2>/dev/null || true

Repository: valkey-io/valkey-io.github.io

Length of output: 7173


🌐 Web query:

valkey-io valkey-doc#459 or github.com/valkey-io/valkey-doc/pull/459

💡 Result:

There is no record of a pull request #459 in the valkey-io/valkey-doc repository [1][2]. While pull requests exist surrounding that number in the valkey-io/valkey-doc repository (such as #423, #426, #427, #429, #432, #436, and #441), the specific number #459 is not associated with that repository [3][4][5][6][7][8][9]. In the context of the core valkey-io/valkey repository, pull request #459 refers to "Migrate zmalloc.c unit tests to new test framework," which was closed in favor of a replacement pull request (#493) due to conflicts [10][11]. Any reference to #459 in documentation or other contexts is likely unrelated to the valkey-doc repository [2].

Citations:


Pin valkey-doc to the same revision in CI and local setup.

.github/workflows/zola-deploy.yml checks out valkey-io/valkey-doc at the default branch, and LOCAL_TESTING.md clones the same default branch, while the build depends on ../valkey-doc/ai. Either pin both paths to the intended dependency branch/tag/commit or make the merged dependency branch explicit to avoid AI content/build metadata being out of sync.

📍 Affects 2 files
  • .github/workflows/zola-deploy.yml#L60-L62 (this comment)
  • LOCAL_TESTING.md#L32-L33
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/zola-deploy.yml around lines 60 - 62, Pin the valkey-doc
checkout used by the CI workflow and the clone command in LOCAL_TESTING.md to
the same explicit branch, tag, or commit. Update
.github/workflows/zola-deploy.yml around build/init-topics-and-clients.sh and
LOCAL_TESTING.md at the valkey-doc clone so both environments consume the
intended revision consistently.

Comment on lines +86 to +90
#create symlink to AI libraries, except if it already exists
if [ ! -L build-ai -o "$(readlink build-ai)" != "$3" ]; then
ln -s $3 ./build-ai
fi
echo "Symlink to AI libraries has been created at ./build-ai "

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🩺 Stability & Availability | 🟡 Minor | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== repo files matching script =="
fd -a 'init-topics-and-clients\.sh$' . || true

echo "== script excerpt =="
if [ -f build/init-topics-and-clients.sh ]; then
  nl -ba build/init-topics-and-clients.sh | sed -n '70,100p'
fi

echo "== readlink behavior in repo shell if available =="
command -v readlink || true
python3 - <<'PY'
import os, sys, tempfile, subprocess
td=tempfile.mkdtemp()
os.chdir(td)
os.symlink('/old', 'build-ai')
# mimic: if [ ! -L build-ai -o "$(readlink build-ai)" != "$3" ]; then ln -s $3 ./build-ai
old='/new/path'
# /new/path splits in unquoted shell; if no /new file exists, ln fails
result=subprocess.run(['ln','-s','/new/path','./build-ai'], text=True, capture_output=True)
print('returncode=', result.returncode)
print('stderr=', repr(result.stderr))
print('links=', os.readlink('build-ai'))
PY

Repository: valkey-io/valkey-io.github.io

Length of output: 313


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== script excerpt =="
if [ -f build/init-topics-and-clients.sh ]; then
  sed -n '70,100p' build/init-topics-and-clients.sh
  printf '\n---\n'
fi

echo "== readlink/ln semantics probe =="
tmp="$(mktemp -d)"
cd "$tmp"
python3 - <<'PY'
import os, tempfile, subprocess
td=tempfile.mkdtemp()
os.chdir(td)
os.symlink('/old', 'build-ai')
cmd=['ln','-s','/new/path','./build-ai']
result=subprocess.run(cmd, text=True, capture_output=True, check=False)
print('cmd=', ' '.join(cmd))
print('returncode=', result.returncode)
print('stderr=', repr(result.stderr))
print('symlink_target=', os.readlink('build-ai'))
PY

Repository: valkey-io/valkey-io.github.io

Length of output: 1077


Replace stale build-ai links instead of leaving them in place.

When build-ai is a symlink pointing elsewhere, this branch runs ln -s $3 ./build-ai, which fails because the destination already exists and the stale symlink is not updated. Quote $3 to avoid splitting paths with spaces, and use -ln -sfn "$3" ./build-ai; the existing path handling is already present for build-clients.

🧰 Tools
🪛 Shellcheck (0.11.0)

[warning] 87-87: Prefer [ p ] || [ q ] as [ p -o q ] is not well defined.

(SC2166)


[info] 88-88: Double quote to prevent globbing and word splitting.

(SC2086)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@build/init-topics-and-clients.sh` around lines 86 - 90, Update the build-ai
symlink creation block to replace stale links rather than invoking ln against an
existing destination. Preserve the existing conditional, quote the $3 target
path, and use the same forced symbolic-link handling as the build-clients path:
-ln -sfn "$3" ./build-ai.

Source: Linters/SAST tools

@greptile-apps

greptile-apps Bot commented Jul 22, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR adds an AI Libraries page backed by metadata from valkey-doc. The main changes are:

  • New Zola content, template, and JSON-path macro for AI libraries.
  • Build and deployment wiring for the AI metadata directory.
  • An AI Libraries link in the documentation menu.
  • Local setup and troubleshooting documentation.

Confidence Score: 4/5

The local setup contract and partial-catalog handling need fixes before merging.

The main README command now exits because it supplies only two arguments. One missing first entry suppresses every valid AI library. A missing later entry can stop the full site build and deployment. The deployment workflow otherwise supplies the expected AI directory.

build/init-topics-and-clients.sh and templates/ai-list.html

T-Rex T-Rex Logs

What T-Rex did

    • Verified that the two-argument bootstrap invocation fails with missing AI-libraries argument and exits with status 1; filesystem assertions show that build-topics, build-clients, and the expected topic stub were not created.
    • Validated that the first-entry page build is blocked because Zola is not available; the harness reached the real zola build but no Zola executable existed, so the repository template could not render.
    • Confirmed that the runtime probe found no Zola executable on PATH or in common local locations, so the required real template render could not be executed; no alternative execution path was available.
    • Compared the pre- and post-change states of the docs, noting that the Documentation → AI Libraries entry and content/ai/_index.md were missing in the parent revision, and that after bootstrap and Zola-failure evidence, some UI rendering checks remain unexecuted due to prerequisites.

View all artifacts

T-Rex Ran code and verified through T-Rex

Important Files Changed

Filename Overview
build/init-topics-and-clients.sh Adds a required AI directory argument and symlink, but breaks the existing two-argument setup command and mishandles paths containing spaces.
templates/ai-list.html Renders the AI catalog, but one missing first entry hides the page while a missing later entry can fail the full build.
content/ai/_index.md Defines the AI page and its curated list of 14 external metadata files.
.github/workflows/zola-deploy.yml Supplies the new AI metadata directory to the deployment setup script.
templates/macros/docs.html Adds an AI JSON path macro consistent with the existing client metadata macro.

Reviews (1): Last reviewed commit: "feat: add AI Libraries page to website" | Re-trigger Greptile

Comment on lines +16 to +19
if [ -z "$3" ]; then
echo "You must supply a path to the AI libraries directory as the third argument"
exit 1
fi

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Two-Argument Setup Now Fails

The existing README.md setup command passes only the topics and clients paths. This new check exits before creating any links or topic files, so contributors following the main build instructions cannot start the local site. Either keep the third argument optional or update every existing caller in the same change.

Artifacts

Repro: isolated executable harness for the documented two-argument bootstrap invocation

  • Evidence file captured while the check ran.

Repro: command transcript showing the argument error, script exit status, filesystem listings, and passing assertions

  • The full command output behind this check.

View artifacts

T-Rex Ran code and verified through T-Rex

Comment on lines +87 to +89
if [ ! -L build-ai -o "$(readlink build-ai)" != "$3" ]; then
ln -s $3 ./build-ai
fi

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 AI Path Splits At Whitespace

The directory check accepts a quoted path containing spaces, but the same value is expanded without quotes in ln. A valid local path such as /Users/me/My Projects/valkey-doc/ai is split into multiple arguments, so setup fails or creates the wrong links.

Suggested change
if [ ! -L build-ai -o "$(readlink build-ai)" != "$3" ]; then
ln -s $3 ./build-ai
fi
if [ ! -L build-ai -o "$(readlink build-ai)" != "$3" ]; then
ln -s "$3" ./build-ai
fi

Comment thread templates/ai-list.html
Comment on lines +5 to +7
{%- set ai_path = section.extra.recommended_ai_paths | first -%}
{%- set first_ai = load_data(path = docs::ai_json_path(ai_path=ai_path), format="json", required = false) -%}
{%- if not first_ai %}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 First Entry Gates Entire Page

If only /python/cognee.json is renamed, removed, or temporarily absent, this optional probe evaluates false and hides all 13 remaining valid libraries behind the page-not-found message. Page availability should not depend on one arbitrary catalog entry.

Comment thread templates/ai-list.html
<div class="language-clients">
<h2 id="{{ language | slugify }}">{{ docs::format_language(language=language) }}</h2>
{%- for path in section.extra.recommended_ai_paths -%}
{%- set ai_lib = load_data(path = docs::ai_json_path(ai_path= path), format="json") -%}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Missing Entry Aborts Site Build

Unlike the initial optional probe, each later catalog entry is loaded as required. If any listed upstream JSON file is renamed or absent from the checked-out valkey-doc revision, Zola stops the full site build instead of omitting that library, blocking deployment of unrelated pages.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Add a Libraries and Frameworks integration page

2 participants