From f34e09b91f1afb4a5634781ceb3a4af529d51e0e Mon Sep 17 00:00:00 2001 From: dhananjay6561 Date: Fri, 7 Aug 2026 15:25:19 +0530 Subject: [PATCH 01/11] fix(docs): add image to Article schema (A1) DocItem computed socialImage but never included it in the Article/ TechArticle JSON-LD, so every doc page emitted an Article without the required 'image' field -> ~146 pages flagged invalid structured data. Add image to articleSchema, falling back to the site-wide default social card (the same 1200x630 og:image from docusaurus.config.js) when a doc sets no front-matter image. Signed-off-by: dhananjay6561 --- src/theme/DocItem/index.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/theme/DocItem/index.js b/src/theme/DocItem/index.js index 9d09f48a1..153701a1c 100644 --- a/src/theme/DocItem/index.js +++ b/src/theme/DocItem/index.js @@ -147,6 +147,10 @@ export default function DocItem(props) { const socialImage = image ? toAbsoluteUrl(siteConfig?.url, imageWithBaseUrl) : null; + // Article schema requires an `image`; fall back to the site-wide default + // social card (the same 1200x630 og:image set in docusaurus.config.js) when + // a doc has no front-matter image, so every Article carries a valid image. + const articleImage = socialImage || "https://keploy.io/images/keploy-hero.png"; const normalizedMetaKeywords = Array.isArray(metaKeywords) ? metaKeywords.join(", ") : metaKeywords; @@ -196,6 +200,7 @@ export default function DocItem(props) { "@type": schemaType, headline: title, description, + image: [articleImage], ...(modifiedTime ? {dateModified: modifiedTime} : {}), // datePublished falls back to the last-modified time so every doc // carries a freshness signal even when front matter omits `date`. From 88f8864fff9efd313cd59acf37c507e9a79021c8 Mon Sep 17 00:00:00 2001 From: dhananjay6561 Date: Fri, 7 Aug 2026 15:25:30 +0530 Subject: [PATCH 02/11] fix(docs): differentiate page title from h1 (A2) The swizzled DocItem set {title}, identical to the on-page

(also the doc title) -> SEMrush 'Duplicate content in h1 and title' on 124 pages. Append ' | Keploy Docs' so the title differs from the h1. Signed-off-by: dhananjay6561 --- src/theme/DocItem/index.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/theme/DocItem/index.js b/src/theme/DocItem/index.js index 153701a1c..caa8b00a1 100644 --- a/src/theme/DocItem/index.js +++ b/src/theme/DocItem/index.js @@ -244,7 +244,10 @@ export default function DocItem(props) { return ( <> - {title} + {/* Suffix differentiates the from the on-page <h1> (which is + also `title`), clearing SEMrush "Duplicate content in h1 and title" + across all doc pages. */} + <title>{`${title} | Keploy Docs`} {description && } {normalizedMetaKeywords && ( From 52568dfac4503d41be7a3e818371a0898b4f6fe1 Mon Sep 17 00:00:00 2001 From: dhananjay6561 Date: Fri, 7 Aug 2026 15:32:25 +0530 Subject: [PATCH 03/11] fix(docs): add alt text to images missing it (A8) 13 images across 8 doc pages (glossary GIFs + running-keploy screenshots) had no alt attribute -> SEMrush 'Missing ALT' + weaker AI/accessibility extraction. Add descriptive alt to each. utg-vscode-extension from the audit list no longer exists on main, so it is not included. Signed-off-by: dhananjay6561 --- .../concepts/reference/glossary/code-coverage.md | 2 +- .../concepts/reference/glossary/end-to-end-testing.md | 2 +- .../reference/glossary/microservice-testing.md | 2 +- .../version-4.0.0/concepts/reference/glossary/mocks.md | 2 +- .../version-4.0.0/concepts/reference/glossary/stubs.md | 2 +- .../running-keploy/api-testing-functions.md | 4 ++-- .../running-keploy/api-testing-variables.md | 4 ++-- .../version-4.0.0/running-keploy/utg-pr-agent.md | 10 +++++----- 8 files changed, 14 insertions(+), 14 deletions(-) diff --git a/versioned_docs/version-4.0.0/concepts/reference/glossary/code-coverage.md b/versioned_docs/version-4.0.0/concepts/reference/glossary/code-coverage.md index 63d9e6641..9b2b2a6f0 100644 --- a/versioned_docs/version-4.0.0/concepts/reference/glossary/code-coverage.md +++ b/versioned_docs/version-4.0.0/concepts/reference/glossary/code-coverage.md @@ -41,7 +41,7 @@ It's analysis provides several benefits: Keploy has native integrations with your unit-testing libraries like go-test, jUnit, jest, pyTest. Keploy gives combined test-coverage and can also be integrated in existing CI pipelines easily within go-test, jUnit, jest, pyTest workflows. - +Keploy replaying recorded test cases to measure code coverage By generating additional tests that exercise different parts of your codebase, you can increase the percentage of code that is covered by your tests. For example, in case of NodeJS application you can use Jest. Jest provides a built-in code coverage tool that can help you measure the effectiveness of your tests and identify areas of the code that need additional testing. By adding Keploy SDK with Jest, you can easily generate test cases and increase your code coverage. Let's create a `Keploy.test.js` diff --git a/versioned_docs/version-4.0.0/concepts/reference/glossary/end-to-end-testing.md b/versioned_docs/version-4.0.0/concepts/reference/glossary/end-to-end-testing.md index 9f8d8b26e..83dd711af 100644 --- a/versioned_docs/version-4.0.0/concepts/reference/glossary/end-to-end-testing.md +++ b/versioned_docs/version-4.0.0/concepts/reference/glossary/end-to-end-testing.md @@ -45,7 +45,7 @@ Despite the challenges, E2E testing is an important part of the software develop Keploy generate E2E API tests with built-in-mocks or stubs by recording your application network calls making your testing process not only faster than unit tests but also incredibly efficient. - +Keploy recording end-to-end API test cases from live application traffic ### How Keploy works? diff --git a/versioned_docs/version-4.0.0/concepts/reference/glossary/microservice-testing.md b/versioned_docs/version-4.0.0/concepts/reference/glossary/microservice-testing.md index 96e839c32..d59573888 100644 --- a/versioned_docs/version-4.0.0/concepts/reference/glossary/microservice-testing.md +++ b/versioned_docs/version-4.0.0/concepts/reference/glossary/microservice-testing.md @@ -41,7 +41,7 @@ Microservice testing is the process of validating individual components of a mic ## Overcoming Challenges with Keploy Keploy is an innovative testing tool designed to address many of the challenges associated with microservices testing. Here's how it helps: - +Keploy recording and replaying API calls across microservices
- **Automated Test Case Generation**: Keploy can generate test cases by recording your application's network calls. This automation significantly reduces the time and effort required to create comprehensive test suites. diff --git a/versioned_docs/version-4.0.0/concepts/reference/glossary/mocks.md b/versioned_docs/version-4.0.0/concepts/reference/glossary/mocks.md index ae6136fb3..f9c7dd5d3 100644 --- a/versioned_docs/version-4.0.0/concepts/reference/glossary/mocks.md +++ b/versioned_docs/version-4.0.0/concepts/reference/glossary/mocks.md @@ -36,6 +36,6 @@ Data mocks refer to the synthetic data that mimics real-world datasets, which is Keploy can generate dependency mocks in addition to the testcases by recording your application network calls making your testing process not only faster than unit tests but also incredibly efficient. - +Keploy recording API calls and replaying them using generated mocks Since these data mocks are generated based on the real-time capturing of API calls from your application, they will be from real-world scenarios. This can help to ensure that the data mocks are accurate and that it represents the real data as closely as possible. As well as, it makes the data maintenance process easier by providing a same environment for testing. This can help to identify the source of bugs more easily. diff --git a/versioned_docs/version-4.0.0/concepts/reference/glossary/stubs.md b/versioned_docs/version-4.0.0/concepts/reference/glossary/stubs.md index 29c3b5fda..7a6baf7b2 100644 --- a/versioned_docs/version-4.0.0/concepts/reference/glossary/stubs.md +++ b/versioned_docs/version-4.0.0/concepts/reference/glossary/stubs.md @@ -50,6 +50,6 @@ Overall, stubs are a valuable tool for software development and testing. They ca Keploy can generate dependency stubs in addition to the testcases by recording your application network calls making your testing process not only faster than unit tests but also incredibly efficient. - +Keploy recording API calls and replaying them using generated stubs Since the data stubs are generated based on the real-time capturing of API calls from your application, they will be from real-world scenarios. This can help to ensure that the mock data is accurate and that it represents the real data as closely as possible. As well as, it makes the data maintenance process easier by providing a same environment for testing. This can help to identify the source of bugs more easily. diff --git a/versioned_docs/version-4.0.0/running-keploy/api-testing-functions.md b/versioned_docs/version-4.0.0/running-keploy/api-testing-functions.md index 5c0d4066d..0a795f929 100644 --- a/versioned_docs/version-4.0.0/running-keploy/api-testing-functions.md +++ b/versioned_docs/version-4.0.0/running-keploy/api-testing-functions.md @@ -20,14 +20,14 @@ Assertions define the **"Pass/Fail"** criteria for your tests. While standard ch ### 1. Selecting Fields to Assert Choose specifically which parts of a JSON response Keploy should validate during a replay. - +Schema assertion configuration selecting response fields on a Keploy API test **Example Context:** In this window, we are targeting a `GET` request on the `/visits/-1` endpoint that expects a `400` status code. Under **Response Fields**, specific keys like `className` and `exMessage` are selected. Toggling these ensures Keploy validates that these fields are returned as the correct data type (strings) during every replay. ### 2. Multi-Type Assertions Stack different assertion types, such as verifying a status code while simultaneously checking if a specific field contains a certain value. - +Multiple assertion types applied to a single Keploy API test **Example Context:** This setup enforces two rules simultaneously: 1. **Status Code**: Validates that the server returns a `201` (Created). diff --git a/versioned_docs/version-4.0.0/running-keploy/api-testing-variables.md b/versioned_docs/version-4.0.0/running-keploy/api-testing-variables.md index 2e6dad6ce..6512e55f5 100644 --- a/versioned_docs/version-4.0.0/running-keploy/api-testing-variables.md +++ b/versioned_docs/version-4.0.0/running-keploy/api-testing-variables.md @@ -32,13 +32,13 @@ To reuse data, you define a mapping that tells Keploy exactly where to look in a ### 2. Injection into Requests Injection allows you to replace static values with dynamic variables, ensuring your tests remain flexible across different environments and data states. - +Injecting a dynamic variable into a Keploy API test request **Example Context:** This view shows the **Request Details** for an API call to the `/owners` endpoint. By defining the method (e.g., **POST**), you can then use placeholders like `{{owner_id}}` in the URL path or body. Keploy will automatically swap the placeholder with the actual value captured during test execution. ### 3. Global Variable Management Global variables serve as the centralized source of truth for your testing environment. - +Configuring global variables in Keploy API testing **Example Context:** The **Global Variables** dashboard allows you to manage workspace-wide data. This includes static entries like the **base URL** and dynamic **Global Custom Functions**. For instance, `generateCompanyId()` is a function that returns a unique string starting with `COMP_` followed by a timestamp, ensuring unique identifiers for every test run. \ No newline at end of file diff --git a/versioned_docs/version-4.0.0/running-keploy/utg-pr-agent.md b/versioned_docs/version-4.0.0/running-keploy/utg-pr-agent.md index 0bde9477e..beff70a8e 100644 --- a/versioned_docs/version-4.0.0/running-keploy/utg-pr-agent.md +++ b/versioned_docs/version-4.0.0/running-keploy/utg-pr-agent.md @@ -33,7 +33,7 @@ Follow the steps below to get started with the Keploy PR Agent on your GitHub re - Visit [Github Marketplace](https://github.com/marketplace/keploy) - +Keploy GitHub App listing on the GitHub Marketplace Click on **Add**. @@ -43,7 +43,7 @@ Choose: - **All repositories** if you want the functionality across your GitHub organization. - Authorize the app to complete the installation. - + Choosing repositories while installing the Keploy GitHub App ### Step 2. Make a Code Change and Open a Pull Request @@ -53,7 +53,7 @@ Once the app is installed: - Push your changes and **create a pull request (PR)** as usual. - The **Keploy PR Agent** will automatically detect the changes and leave a comment on the PR. - + Keploy PR Agent leaving an automated comment on a pull request ### Step 3. Trigger Unit Test Generation @@ -63,7 +63,7 @@ In the PR comment left by Keploy: - You will be redirected to the Keploy service, where the unit test generation process begins. - The PR Agent uses code semantics and the power of LLMs to understand your code changes and generate meaningful unit tests. - + Keploy service generating unit tests from the pull request changes ### Step 4. View the Generated Tests and Summary @@ -74,7 +74,7 @@ Once the process is complete: - All the **unit test files** generated for your recent changes. - A **test summary** presented in a **clean tabular format** showing: - File names - Number of test cases - Coverage details - Edge cases handled (if any) - + Pull request comment showing generated unit test files and a test summary table You can review, modify, or directly merge the PR with complete confidence that your changes are well-tested. With Keploy PR Agent, testing is no longer a bottleneck - it’s built right into your workflow. From 23c9c940b2e3181a41e6c32f80a721d52ea6596f Mon Sep 17 00:00:00 2001 From: dhananjay6561 Date: Fri, 7 Aug 2026 15:32:33 +0530 Subject: [PATCH 04/11] style(docs): prettier formatting on api-testing-functions/variables Pre-existing whitespace/list-indent/final-newline issues in these two files (unrelated to the alt fix) would fail the prettier CI check once the files are touched. Apply prettier so the PR is clean. Signed-off-by: dhananjay6561 --- .../running-keploy/api-testing-functions.md | 10 ++++++---- .../running-keploy/api-testing-variables.md | 14 ++++++++------ 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/versioned_docs/version-4.0.0/running-keploy/api-testing-functions.md b/versioned_docs/version-4.0.0/running-keploy/api-testing-functions.md index 0a795f929..5adebce6f 100644 --- a/versioned_docs/version-4.0.0/running-keploy/api-testing-functions.md +++ b/versioned_docs/version-4.0.0/running-keploy/api-testing-functions.md @@ -13,11 +13,10 @@ Assertions define the **"Pass/Fail"** criteria for your tests. While standard ch - **Custom Functions**: Use these for complex logic that simple matching cannot handle, such as verifying if a timestamp falls within a specific range. - **Global Functions**: Repeatable logic can be saved to the Global library for team-wide reuse. - - ## Hands-On: Schema Assertions ### 1. Selecting Fields to Assert + Choose specifically which parts of a JSON response Keploy should validate during a replay. Schema assertion configuration selecting response fields on a Keploy API test @@ -25,17 +24,20 @@ Choose specifically which parts of a JSON response Keploy should validate during **Example Context:** In this window, we are targeting a `GET` request on the `/visits/-1` endpoint that expects a `400` status code. Under **Response Fields**, specific keys like `className` and `exMessage` are selected. Toggling these ensures Keploy validates that these fields are returned as the correct data type (strings) during every replay. ### 2. Multi-Type Assertions + Stack different assertion types, such as verifying a status code while simultaneously checking if a specific field contains a certain value. Multiple assertion types applied to a single Keploy API test **Example Context:** This setup enforces two rules simultaneously: + 1. **Status Code**: Validates that the server returns a `201` (Created). 2. **JSON Contains**: Specifically checks the `city` header/field to ensure it matches the expected value `"sometown"`. ## Custom & Global Functions ### 1. Writing Inline Logic + Access the `request` and `response` objects directly to create complex rules within the assertion panel. Custom Functions @@ -43,9 +45,9 @@ Access the `request` and `response` objects directly to create complex rules wit **Example Context:** The editor shows a function signature: `function customFunction(request, response)`. This gives you direct access to the full objects, allowing you to write JavaScript logic to determine if the test should pass based on dynamic conditions. ### 2. Global Function Library + Save repeatable validation rules to the Global Custom Functions library so they can be reused across your entire development team. Global Functions - -**Example Context:** The library shows reusable logic stored globally. For example, the `customFunction` at the bottom demonstrates an `assert.greater(response.status, 399)` utility, creating a standardized rule to verify error-level status codes across multiple suites. \ No newline at end of file +**Example Context:** The library shows reusable logic stored globally. For example, the `customFunction` at the bottom demonstrates an `assert.greater(response.status, 399)` utility, creating a standardized rule to verify error-level status codes across multiple suites. diff --git a/versioned_docs/version-4.0.0/running-keploy/api-testing-variables.md b/versioned_docs/version-4.0.0/running-keploy/api-testing-variables.md index 6512e55f5..59643bff7 100644 --- a/versioned_docs/version-4.0.0/running-keploy/api-testing-variables.md +++ b/versioned_docs/version-4.0.0/running-keploy/api-testing-variables.md @@ -15,21 +15,22 @@ Variables in Keploy act as placeholders for dynamic data that changes between te - **Extraction**: This involves identifying specific data points within an API response—such as an ID, a token, or a status string—and mapping them to a unique variable name in the **Variables** tab of the **Edit Test Step** panel. - **Injection**: Once a variable is captured, it can be dynamically inserted into subsequent URLs, Headers, or Request Bodies using the double-curly brace syntax: `{{variable_name}}`. -- **Global vs. Suite Scope**: - - **Suite Variables**: These are ephemeral and captured from previous steps within a specific test suite run to maintain state across a single workflow. - - **Global Variables**: These are persistent constants, such as base URLs, environment-specific keys, or static authentication tokens, available across all suites in the workspace. +- **Global vs. Suite Scope**: + - **Suite Variables**: These are ephemeral and captured from previous steps within a specific test suite run to maintain state across a single workflow. + - **Global Variables**: These are persistent constants, such as base URLs, environment-specific keys, or static authentication tokens, available across all suites in the workspace. ## Hands-On: Implementation ### 1. Extraction from Responses -To reuse data, you define a mapping that tells Keploy exactly where to look in a previous response. -Keploy Architecture +To reuse data, you define a mapping that tells Keploy exactly where to look in a previous response. +Keploy Architecture **Example Context:** In the view above, we are extracting the unique ID of a record. The mapping `steps["Create_Owner"].response.body.id` captures the value from the **Create_Owner** step. Note the **Unused** badge; Keploy provides this visual hint when a variable has been defined but hasn't been injected into any subsequent request yet. ### 2. Injection into Requests + Injection allows you to replace static values with dynamic variables, ensuring your tests remain flexible across different environments and data states. Injecting a dynamic variable into a Keploy API test request @@ -37,8 +38,9 @@ Injection allows you to replace static values with dynamic variables, ensuring y **Example Context:** This view shows the **Request Details** for an API call to the `/owners` endpoint. By defining the method (e.g., **POST**), you can then use placeholders like `{{owner_id}}` in the URL path or body. Keploy will automatically swap the placeholder with the actual value captured during test execution. ### 3. Global Variable Management + Global variables serve as the centralized source of truth for your testing environment. Configuring global variables in Keploy API testing -**Example Context:** The **Global Variables** dashboard allows you to manage workspace-wide data. This includes static entries like the **base URL** and dynamic **Global Custom Functions**. For instance, `generateCompanyId()` is a function that returns a unique string starting with `COMP_` followed by a timestamp, ensuring unique identifiers for every test run. \ No newline at end of file +**Example Context:** The **Global Variables** dashboard allows you to manage workspace-wide data. This includes static entries like the **base URL** and dynamic **Global Custom Functions**. For instance, `generateCompanyId()` is a function that returns a unique string starting with `COMP_` followed by a timestamp, ensuring unique identifiers for every test run. From 0301cd3c59390e04f94e6500e8d3c0d2790de5ae Mon Sep 17 00:00:00 2001 From: dhananjay6561 Date: Fri, 7 Aug 2026 15:33:51 +0530 Subject: [PATCH 05/11] style(docs): prettier (2.8.8) on DocItem Wrap the long articleImage fallback line and flatten the pre-existing nested-ternary indentation so the swizzled DocItem is clean under the CI-pinned prettier 2.8.8 (--check runs on changed files). Signed-off-by: dhananjay6561 --- src/theme/DocItem/index.js | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/theme/DocItem/index.js b/src/theme/DocItem/index.js index caa8b00a1..9aa0029d8 100644 --- a/src/theme/DocItem/index.js +++ b/src/theme/DocItem/index.js @@ -127,10 +127,10 @@ export default function DocItem(props) { const schemaType = schemaTypeFromFrontMatter ? schemaTypeFromFrontMatter : isApi - ? "APIReference" - : isBlog - ? "BlogPosting" - : "Article"; + ? "APIReference" + : isBlog + ? "BlogPosting" + : "Article"; const authorList = toPersonList(frontMatter?.author || frontMatter?.authors); const maintainerList = toPersonList(frontMatter?.maintainer); const contributorList = toPersonList(frontMatter?.contributor); @@ -150,7 +150,8 @@ export default function DocItem(props) { // Article schema requires an `image`; fall back to the site-wide default // social card (the same 1200x630 og:image set in docusaurus.config.js) when // a doc has no front-matter image, so every Article carries a valid image. - const articleImage = socialImage || "https://keploy.io/images/keploy-hero.png"; + const articleImage = + socialImage || "https://keploy.io/images/keploy-hero.png"; const normalizedMetaKeywords = Array.isArray(metaKeywords) ? metaKeywords.join(", ") : metaKeywords; From 7f927db48d2c0ac7678c3630713deea38b70fa03 Mon Sep 17 00:00:00 2001 From: dhananjay6561 Date: Fri, 7 Aug 2026 15:49:35 +0530 Subject: [PATCH 06/11] style(docs): format DocItem for CI prettier 3.9.6 The prettify_code workflow pins prettier_version 2.8.8, but creyD/ prettier_action's npx step actually installs and runs prettier 3.9.6. 3.x changed nested-ternary indentation, so the prior 2.8.8-flattened schemaType ternary failed CI. Reformat to 3.9.6 (the version CI runs) so --check passes; all other changed files are already 3.9.6-clean. Signed-off-by: dhananjay6561 --- src/theme/DocItem/index.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/theme/DocItem/index.js b/src/theme/DocItem/index.js index 9aa0029d8..af68b4aed 100644 --- a/src/theme/DocItem/index.js +++ b/src/theme/DocItem/index.js @@ -127,10 +127,10 @@ export default function DocItem(props) { const schemaType = schemaTypeFromFrontMatter ? schemaTypeFromFrontMatter : isApi - ? "APIReference" - : isBlog - ? "BlogPosting" - : "Article"; + ? "APIReference" + : isBlog + ? "BlogPosting" + : "Article"; const authorList = toPersonList(frontMatter?.author || frontMatter?.authors); const maintainerList = toPersonList(frontMatter?.maintainer); const contributorList = toPersonList(frontMatter?.contributor); From b4d42f074b69bea3f29c9a5e795300786f7aa457 Mon Sep 17 00:00:00 2001 From: dhananjay6561 Date: Fri, 7 Aug 2026 16:04:06 +0530 Subject: [PATCH 07/11] feat(docs): specialize doc schema to TechArticle/APIReference (Doc2) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Every /docs page emitted a generic Article. Route API-reference pages (api-testing-*, public-api, cli-commands, sdk-installation — by tag or path) to APIReference, and default all other docs to TechArticle. Both are Article subtypes accepting the same properties as articleSchema, so the schema shape is unchanged — just a precise, AI/Google-friendly type. Built HTML: 35 APIReference, 343 TechArticle, 0 generic Article from docs. Signed-off-by: dhananjay6561 --- src/theme/DocItem/index.js | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/theme/DocItem/index.js b/src/theme/DocItem/index.js index af68b4aed..a9b7bf824 100644 --- a/src/theme/DocItem/index.js +++ b/src/theme/DocItem/index.js @@ -116,21 +116,31 @@ export default function DocItem(props) { ); const schemaTypeFromFrontMatter = frontMatter?.schemaType || frontMatter?.schema_type; + const docTags = frontMatter?.tags || []; const isApi = frontMatter?.apiReference === true || frontMatter?.type === "api" || - (frontMatter?.tags || []).includes?.("api"); + docTags.includes?.("api") || + docTags.includes?.("api-testing") || + // API-reference doc paths (suites, endpoints, CLI, SDK install). + /\/running-keploy\/(api-testing-|public-api|cli-commands)|\/server\/sdk-installation\//.test( + metadata?.permalink || "" + ); const isBlog = frontMatter?.type === "blog" || frontMatter?.blog === true || - (frontMatter?.tags || []).includes?.("blog"); + docTags.includes?.("blog"); + // Every Keploy doc is a technical article, so default to TechArticle rather + // than the generic Article (both are Article subtypes accepting the same + // properties as articleSchema below — no shape change, just a precise type). + // API-reference pages use the more specific APIReference. const schemaType = schemaTypeFromFrontMatter ? schemaTypeFromFrontMatter : isApi ? "APIReference" : isBlog ? "BlogPosting" - : "Article"; + : "TechArticle"; const authorList = toPersonList(frontMatter?.author || frontMatter?.authors); const maintainerList = toPersonList(frontMatter?.maintainer); const contributorList = toPersonList(frontMatter?.contributor); From 563815c42426ef9d29db63b8767491563f4ac1fd Mon Sep 17 00:00:00 2001 From: dhananjay6561 Date: Fri, 7 Aug 2026 16:06:13 +0530 Subject: [PATCH 08/11] fix(docs): unique meta descriptions for 6 pages (A7) general-glossary + 3 glossary terms shared one boilerplate description; share-tests copied the generate-api-tests description; k8s-proxy had a wrong (NextJS/Drizzle) description. Give each a unique, accurate one to clear SEMrush 'Duplicate meta descriptions'. Signed-off-by: dhananjay6561 --- versioned_docs/version-4.0.0/concepts/general-glossary.md | 2 +- .../version-4.0.0/concepts/reference/glossary/beta-testing.md | 2 +- .../concepts/reference/glossary/end-to-end-testing.md | 2 +- .../version-4.0.0/concepts/reference/glossary/error-guessing.md | 2 +- versioned_docs/version-4.0.0/quickstart/k8s-proxy.md | 2 +- versioned_docs/version-4.0.0/running-keploy/share-tests.md | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/versioned_docs/version-4.0.0/concepts/general-glossary.md b/versioned_docs/version-4.0.0/concepts/general-glossary.md index 1ec910f96..dcd581986 100644 --- a/versioned_docs/version-4.0.0/concepts/general-glossary.md +++ b/versioned_docs/version-4.0.0/concepts/general-glossary.md @@ -2,7 +2,7 @@ id: general-glossary title: General Glossary for Users sidebar_label: Glossary -description: This glossary has an explanation of all the terminologies that beginners find difficult to understand at first glance. +description: Plain-language definitions of common software testing terms — unit, integration, end-to-end, regression, mocks, and stubs — for developers getting started with Keploy. tags: - explanation - reference diff --git a/versioned_docs/version-4.0.0/concepts/reference/glossary/beta-testing.md b/versioned_docs/version-4.0.0/concepts/reference/glossary/beta-testing.md index d4a396941..7dfc1faa8 100644 --- a/versioned_docs/version-4.0.0/concepts/reference/glossary/beta-testing.md +++ b/versioned_docs/version-4.0.0/concepts/reference/glossary/beta-testing.md @@ -2,7 +2,7 @@ id: beta-testing title: Beta Testing sidebar_label: Beta Testing -description: This glossary has an explanation of all the terminologies that beginners find difficult to understand at first glance. +description: What is beta testing? Learn its purpose, common types, and where it fits in the software release cycle before a product ships to all users. tags: - explanation - Glossary diff --git a/versioned_docs/version-4.0.0/concepts/reference/glossary/end-to-end-testing.md b/versioned_docs/version-4.0.0/concepts/reference/glossary/end-to-end-testing.md index 83dd711af..f88061f09 100644 --- a/versioned_docs/version-4.0.0/concepts/reference/glossary/end-to-end-testing.md +++ b/versioned_docs/version-4.0.0/concepts/reference/glossary/end-to-end-testing.md @@ -2,7 +2,7 @@ id: end-to-end-testing title: Creating end to end tests with Keploy sidebar_label: End To End Testing -description: This glossary has an explanation of all the terminologies that beginners find difficult to understand at first glance. +description: What is end-to-end testing, and how to create E2E tests with Keploy by recording and replaying real API traffic across your services. tags: - explanation - Glossary diff --git a/versioned_docs/version-4.0.0/concepts/reference/glossary/error-guessing.md b/versioned_docs/version-4.0.0/concepts/reference/glossary/error-guessing.md index db4a8b2c2..88ead4dac 100644 --- a/versioned_docs/version-4.0.0/concepts/reference/glossary/error-guessing.md +++ b/versioned_docs/version-4.0.0/concepts/reference/glossary/error-guessing.md @@ -2,7 +2,7 @@ id: error-guessing title: Error Guessing sidebar_label: Error Guessing -description: This glossary has an explanation of all the terminologies that beginners find difficult to understand at first glance. +description: What is error guessing in software testing? An experience-based technique for uncovering defects that formal test cases miss, with practical examples. tags: - explanation - glossary diff --git a/versioned_docs/version-4.0.0/quickstart/k8s-proxy.md b/versioned_docs/version-4.0.0/quickstart/k8s-proxy.md index e2f35e469..73d0189fe 100644 --- a/versioned_docs/version-4.0.0/quickstart/k8s-proxy.md +++ b/versioned_docs/version-4.0.0/quickstart/k8s-proxy.md @@ -1,7 +1,7 @@ --- id: k8s-proxy title: K8s Record Replay -description: The following sample app to test Keploy integration capabilities using NextJS,Drizzle and Postgres. +description: Record and replay API tests inside a Kubernetes cluster using the Keploy proxy — capture live traffic and rerun it as tests with no code changes. tags: - K8s - Microservices diff --git a/versioned_docs/version-4.0.0/running-keploy/share-tests.md b/versioned_docs/version-4.0.0/running-keploy/share-tests.md index 5a62e2f6a..7c295c527 100644 --- a/versioned_docs/version-4.0.0/running-keploy/share-tests.md +++ b/versioned_docs/version-4.0.0/running-keploy/share-tests.md @@ -2,7 +2,7 @@ id: share-tests title: Share Test Suite With Your Team sidebar_label: Share Test Suite -description: Learn how to use Keploy’s API Test Generator to generate high-quality API test suites using AI from OpenAPI, curl, Postman, or traffic. +description: Learn how to share Keploy API test suites and run reports with teammates via links, so collaborators can review results without any local setup. --- import ProductTier from '@site/src/components/ProductTier'; From 98e2a80d8f6eec3528d9877e2e7d440633acb741 Mon Sep 17 00:00:00 2001 From: dhananjay6561 Date: Fri, 7 Aug 2026 16:06:53 +0530 Subject: [PATCH 09/11] style(docs): prettier 3.9.6 on beta-testing.md Pre-existing leading-space paragraphs (unrelated to the description change) would fail the prettier CI check once the file is touched. Signed-off-by: dhananjay6561 --- .../concepts/reference/glossary/beta-testing.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/versioned_docs/version-4.0.0/concepts/reference/glossary/beta-testing.md b/versioned_docs/version-4.0.0/concepts/reference/glossary/beta-testing.md index 7dfc1faa8..ce1ff618a 100644 --- a/versioned_docs/version-4.0.0/concepts/reference/glossary/beta-testing.md +++ b/versioned_docs/version-4.0.0/concepts/reference/glossary/beta-testing.md @@ -53,35 +53,35 @@ There are many benefits to beta testing, including: Bugs and flaws can be found and fixed early in the development process, which saves time and money. **Example: Dropbox** - During the beta phase for a major feature update, Dropbox discovered that certain file sync issues only occurred under specific conditions, which the internal testing had not captured. This early detection allowed them to resolve these issues, saving time and resources that would have been spent addressing them post-launch. +During the beta phase for a major feature update, Dropbox discovered that certain file sync issues only occurred under specific conditions, which the internal testing had not captured. This early detection allowed them to resolve these issues, saving time and resources that would have been spent addressing them post-launch. ### **Improved user experience:** Beta testers can provide feedback on how to improve the user experience. **Example: Google Chrome** - Google regularly uses beta testing to refine the user interface and functionality of Chrome. During a beta release of a new tab layout, users provided feedback about the accessibility of certain features. Based on this feedback, Google adjusted the layout to enhance usability, ensuring that the final version was more user-friendly. +Google regularly uses beta testing to refine the user interface and functionality of Chrome. During a beta release of a new tab layout, users provided feedback about the accessibility of certain features. Based on this feedback, Google adjusted the layout to enhance usability, ensuring that the final version was more user-friendly. ### **Gathering feedback:** Beta testers can provide feedback on the product's features, functionality, and performance. **Example: Instagram** - When Instagram introduced a new Stories feature, they conducted beta testing with a selected group of users. Feedback regarding the feature's visibility and ease of use led to several adjustments, such as changing the placement of the Stories bar. This feedback was critical in ensuring the feature's success upon full release. +When Instagram introduced a new Stories feature, they conducted beta testing with a selected group of users. Feedback regarding the feature's visibility and ease of use led to several adjustments, such as changing the placement of the Stories bar. This feedback was critical in ensuring the feature's success upon full release. ### **Promoting user acceptance:** Beta testing can help to promote user acceptance of the product by getting the word out about it. **Example: Tesla** - Tesla often invites existing customers to participate in beta testing for new software updates. By allowing loyal customers to be part of the testing process, Tesla promotes user acceptance and loyalty, as these users feel invested in the development of new features. +Tesla often invites existing customers to participate in beta testing for new software updates. By allowing loyal customers to be part of the testing process, Tesla promotes user acceptance and loyalty, as these users feel invested in the development of new features. ### **Boosting software quality:** Beta testing can help to boost the quality of the software by ensuring that it is as stable, safe, and functional as possible. **Example: Spotify** - Spotify uses beta testing to explore new features like collaborative playlists. By inviting a small group of users to test this feature and providing a structured feedback mechanism, Spotify was able to gauge interest and refine the feature before rolling it out to the entire user base. +Spotify uses beta testing to explore new features like collaborative playlists. By inviting a small group of users to test this feature and providing a structured feedback mechanism, Spotify was able to gauge interest and refine the feature before rolling it out to the entire user base. ## How to Beta Test From ae5086840083921e3b72f92537b634ee03ad20a2 Mon Sep 17 00:00:00 2001 From: dhananjay6561 Date: Fri, 7 Aug 2026 16:29:22 +0530 Subject: [PATCH 10/11] feat(docs): add structured data to bespoke pages (Doc2) /leadership, /security and /privacy-policy emitted zero page-level schema. Add JSON-LD: leadership -> CollectionPage + ItemList of Person (name, photo, Twitter, worksFor Keploy); security -> WebPage + security ContactPoint (responsible-disclosure email); privacy-policy -> DigitalDocument with dateModified. Verified in built HTML. Signed-off-by: dhananjay6561 --- src/pages/leadership.js | 41 +++++++++++++++++++++++++++++++++++++ src/pages/privacy-policy.js | 21 +++++++++++++++++++ src/pages/security.js | 27 ++++++++++++++++++++++++ 3 files changed, 89 insertions(+) diff --git a/src/pages/leadership.js b/src/pages/leadership.js index 07fb122a9..e3d000b01 100644 --- a/src/pages/leadership.js +++ b/src/pages/leadership.js @@ -2,6 +2,7 @@ import React from "react"; import clsx from "clsx"; import Layout from "@theme/Layout"; import Link from "@docusaurus/Link"; +import Head from "@docusaurus/Head"; import useDocusaurusContext from "@docusaurus/useDocusaurusContext"; import useBaseUrl from "@docusaurus/useBaseUrl"; import styles from "./styles.module.css"; @@ -9,8 +10,48 @@ import styles from "./styles.module.css"; export default function Security() { const context = useDocusaurusContext(); const {siteConfig = {}} = context; + const team = [ + { + name: "Neha Gupta", + image: "https://avatars.githubusercontent.com/u/15074229?v=4", + sameAs: "https://twitter.com/know_neha", + }, + { + name: "Shubham Jain", + image: "https://avatars.githubusercontent.com/u/12831254?v=4", + sameAs: "https://twitter.com/slayerjain", + }, + ]; + // CollectionPage of Person entities so search engines / AI can resolve the + // Keploy leadership team (name, photo, social profile) as structured people. + const leadershipSchema = { + "@context": "https://schema.org", + "@type": "CollectionPage", + name: "Keploy Leadership", + url: `${siteConfig.url}/docs/Leadership`, + isPartOf: {"@type": "WebSite", url: siteConfig.url}, + mainEntity: { + "@type": "ItemList", + itemListElement: team.map((person, i) => ({ + "@type": "ListItem", + position: i + 1, + item: { + "@type": "Person", + name: person.name, + image: person.image, + worksFor: {"@type": "Organization", name: "Keploy"}, + sameAs: [person.sameAs], + }, + })), + }, + }; return ( + + +
  • diff --git a/src/pages/privacy-policy.js b/src/pages/privacy-policy.js index ca0001a35..06bfa010f 100644 --- a/src/pages/privacy-policy.js +++ b/src/pages/privacy-policy.js @@ -1,16 +1,37 @@ import React from "react"; import Layout from "@theme/Layout"; +import Head from "@docusaurus/Head"; import useDocusaurusContext from "@docusaurus/useDocusaurusContext"; function PrivacyPolicy() { const context = useDocusaurusContext(); const {siteConfig = {}} = context; + // DigitalDocument with a real dateModified so the legal doc's freshness is + // machine-readable rather than emitting nothing. + const privacySchema = { + "@context": "https://schema.org", + "@type": "DigitalDocument", + name: "Keploy, Inc. Privacy Policy", + url: `${siteConfig.url}/docs/privacy-policy`, + dateModified: "2024-04-28", + isPartOf: {"@type": "WebSite", url: siteConfig.url}, + publisher: { + "@type": "Organization", + name: "Keploy", + url: "https://keploy.io", + }, + }; return ( + + +
    Keploy Inc. Privacy Policy diff --git a/src/pages/security.js b/src/pages/security.js index c1ccb251c..07f1a5bf4 100644 --- a/src/pages/security.js +++ b/src/pages/security.js @@ -2,6 +2,7 @@ import React from "react"; import clsx from "clsx"; import Layout from "@theme/Layout"; import Link from "@docusaurus/Link"; +import Head from "@docusaurus/Head"; import useDocusaurusContext from "@docusaurus/useDocusaurusContext"; import useBaseUrl from "@docusaurus/useBaseUrl"; import styles from "./styles.module.css"; @@ -9,12 +10,38 @@ import styles from "./styles.module.css"; export default function Security() { const context = useDocusaurusContext(); const {siteConfig = {}} = context; + // WebPage + security ContactPoint so the responsible-disclosure channel is + // machine-readable (this page is linked from every doc footer). + const securitySchema = { + "@context": "https://schema.org", + "@type": "WebPage", + name: "Keploy Security Practices and Policies", + url: `${siteConfig.url}/docs/security`, + description: + "Learn how Keploy ensures data protection, privacy, and secure testing — Keploy's security measures, policies, and responsible-disclosure process.", + isPartOf: {"@type": "WebSite", url: siteConfig.url}, + publisher: { + "@type": "Organization", + name: "Keploy", + url: "https://keploy.io", + contactPoint: { + "@type": "ContactPoint", + contactType: "security", + email: "hello@keploy.io", + }, + }, + }; return ( + + +

    From 46a9ac3936a9265dad97d4db2665b512f85061bf Mon Sep 17 00:00:00 2001 From: dhananjay6561 Date: Fri, 7 Aug 2026 16:53:18 +0530 Subject: [PATCH 11/11] feat(docs): emit FAQPage schema for FAQ docs (Doc2/AI4) New dependency-free remark plugin extracts each ### question + following answer prose from FAQ docs (keploy-explained/*-faq) and injects FAQPage JSON-LD with Question/acceptedAnswer pairs, so they're eligible for FAQ rich results and AI extraction. Built HTML: FAQPage with 14/11/12 Q&A on the three FAQ pages. Signed-off-by: dhananjay6561 --- docusaurus.config.js | 4 ++ src/remark/remarkFaqSchema.js | 116 ++++++++++++++++++++++++++++++++++ 2 files changed, 120 insertions(+) create mode 100644 src/remark/remarkFaqSchema.js diff --git a/docusaurus.config.js b/docusaurus.config.js index ec3984ad1..a33aac8d1 100644 --- a/docusaurus.config.js +++ b/docusaurus.config.js @@ -2,6 +2,7 @@ import {themes as prismThemes} from "prism-react-renderer"; const path = require("path"); +const remarkFaqSchema = require("./src/remark/remarkFaqSchema"); const fs = require("fs"); import {visit} from "unist-util-visit"; const FontPreloadPlugin = require("webpack-font-preload-plugin"); @@ -484,6 +485,9 @@ fbq('track', 'PageView');`, }, {}, ], + // Emit FAQPage JSON-LD (Question/Answer) for FAQ docs so they are + // eligible for FAQ rich results and AI extraction. + remarkFaqSchema, ], }, // Will be passed to @docusaurus/plugin-content-blog diff --git a/src/remark/remarkFaqSchema.js b/src/remark/remarkFaqSchema.js new file mode 100644 index 000000000..5604b819c --- /dev/null +++ b/src/remark/remarkFaqSchema.js @@ -0,0 +1,116 @@ +// remarkFaqSchema — emit FAQPage JSON-LD for FAQ docs. +// +// FAQ pages (keploy-explained/*-faq.md) are written as a list of +// `### ` headings each followed by answer prose. Google/AI can only +// extract them as an FAQ rich result if the page carries FAQPage structured +// data with Question/Answer pairs — which Docusaurus does not generate. +// +// This build-time plugin detects FAQ docs (by file path), pulls each level-2/3 +// heading as a Question and the prose that follows (until the next heading) as +// the acceptedAnswer, and injects a