{{ page.title | liquify }}
{% if layout.tier_inline == true and page.tier %}
{% include tier.html products=page.products tier=page.tier %}
{% endif %}
+ {% if layout.tier_inline == true and page.tiers %}
+ {% include tier.html products=page.products tiers=page.tiers %}
+ {% endif %}
{% if layout.uses == false %}
{%- if page.beta == true or page.tech_preview == true -%}
@@ -43,7 +47,7 @@ {{ page.title | liquify }}
{% endif %}
{% if layout.uses != false %}
- {% include_cached uses.html products=page.products tools=page.tools tier=page.tier beta=page.beta tech_preview=page.tech_preview %}
+ {% include_cached uses.html products=page.products tools=page.tools tier=page.tier tiers=page.tiers beta=page.beta tech_preview=page.tech_preview %}
{% endif %}
{% ifhascontent nav_header %}
diff --git a/app/_includes/tier.html b/app/_includes/tier.html
index 7f27acb36f..8f8f754bdd 100644
--- a/app/_includes/tier.html
+++ b/app/_includes/tier.html
@@ -1,20 +1,48 @@
{% unless page.plugin? %}
-{% if include.products and include.products.size > 1 %}
-{% raise "tier.html include called with a tier and more than one product." %}
+{% if include.tier and include.tiers %}
+{% raise "tier.html: page `{{page.url}}` sets both `tier` and `tiers`. Use one or the other." %}
+{% endif %}
+{% if include.tier and include.products and include.products.size > 1 %}
+{% raise "tier.html: page `{{page.url}}` sets `tier` with more than one product. Use `tiers:` to map each product to its tier." %}
{% endif %}
{% endunless %}
-{% assign product = include.products.first %}
-{% assign tier = site.data.products[product].tiers[include.tier] %}
-{% unless tier %}
- {%- capture available_tiers -%}
- {%- for tier in site.data.products[product].tiers -%}{{tier[0]}}{% unless forloop.last %}, {% endunless %}{%- endfor -%}
- {%- endcapture -%}
- {% raise "tier.html: invalid tier `{{include.tier}}` for product: `{{product}}`. Available tiers: {{available_tiers}}" %}
-{% endunless %}
+{% if include.tier %}
+ {% assign product = include.products.first %}
+ {% assign tier_data = site.data.products[product].tiers[include.tier] %}
+ {% unless tier_data %}
+ {%- capture available_tiers -%}
+ {%- for t in site.data.products[product].tiers -%}{{t[0]}}{% unless forloop.last %}, {% endunless %}{%- endfor -%}
+ {%- endcapture -%}
+ {% raise "tier.html: invalid tier `{{include.tier}}` for product: `{{product}}`. Available tiers: {{available_tiers}}" %}
+ {% endunless %}
+
+ {% if include.url %}
+ {% include badge.html url=tier_data.url text=tier_data.text css_class=include.tier %}
+ {% else %}
+ {% include badge.html text=tier_data.text css_class=include.tier %}
+ {% endif %}
+{% elsif include.tiers %}
+ {% for pair in include.tiers %}
+ {% assign tier_product = pair[0] %}
+ {% assign tier_name = pair[1] %}
-{% if include.url %}
-{% include badge.html url=tier.url text=tier.text css_class=include.tier %}
-{% else %}
-{% include badge.html text=tier.text css_class=include.tier %}
-{% endif %}
\ No newline at end of file
+ {% unless include.products contains tier_product %}
+ {% raise "tier.html: product `{{tier_product}}` listed in `tiers` is not present in `products` for page `{{page.url}}`." %}
+ {% endunless %}
+
+ {% assign tier_data = site.data.products[tier_product].tiers[tier_name] %}
+ {% unless tier_data %}
+ {%- capture available_tiers -%}
+ {%- for t in site.data.products[tier_product].tiers -%}{{t[0]}}{% unless forloop.last %}, {% endunless %}{%- endfor -%}
+ {%- endcapture -%}
+ {% raise "tier.html: invalid tier `{{tier_name}}` for product: `{{tier_product}}`. Available tiers: {{available_tiers}}" %}
+ {% endunless %}
+
+ {% if include.url %}
+ {% include badge.html url=tier_data.url text=tier_data.text css_class=tier_name %}
+ {% else %}
+ {% include badge.html text=tier_data.text css_class=tier_name %}
+ {% endif %}
+ {% endfor %}
+{% endif %}
diff --git a/app/_includes/uses.html b/app/_includes/uses.html
index 3cf1bcb4a5..6bd7f6a0af 100644
--- a/app/_includes/uses.html
+++ b/app/_includes/uses.html
@@ -1,4 +1,4 @@
-{% if include.products or include.tools or include.tier or include.beta == true or include.tech_preview == true %}
+{% if include.products or include.tools or include.tier or include.tiers or include.beta == true or include.tech_preview == true %}
{%- if include.beta == true or include.tech_preview == true -%}
{%- include_cached badges/stage.html beta=include.beta tech_preview=include.tech_preview -%}
@@ -7,8 +7,11 @@
{% if include.tier %}
{% include tier.html products=include.products tier=include.tier %}
{% endif %}
+ {% if include.tiers %}
+ {% include tier.html products=include.products tiers=include.tiers %}
+ {% endif %}
- {% if include.tier or include.beta == true or include.tech_preview == true %}
+ {% if include.tier or include.tiers or include.beta == true or include.tech_preview == true %}
{% if include.products or include.tools %}
and uses:
{% endif %}
diff --git a/app/_plugins/drops/prereqs.rb b/app/_plugins/drops/prereqs.rb
index 6fd499eb98..cb7d3aec0c 100644
--- a/app/_plugins/drops/prereqs.rb
+++ b/app/_plugins/drops/prereqs.rb
@@ -68,11 +68,16 @@ def inline
@inline ||= prereqs.fetch('inline', [])
end
- def data
- product = @page.data.fetch('products', [])[0]
+ def entities_product
+ @entities_product ||= begin
+ product = prereqs['entities_product'] || @page.data.fetch('products', [])[0]
+ product = 'kic' if product == 'operator'
+ product
+ end
+ end
- # Use KIC rendering for Operator for now
- product = 'kic' if product == 'operator'
+ def data
+ product = entities_product
yaml = {}
yaml = { '_format_version' => '3.0' } if product == 'gateway'
diff --git a/app/_plugins/generators/data/llm_metadata.rb b/app/_plugins/generators/data/llm_metadata.rb
index bb96633c20..599cf1b672 100644
--- a/app/_plugins/generators/data/llm_metadata.rb
+++ b/app/_plugins/generators/data/llm_metadata.rb
@@ -37,6 +37,7 @@ def frontmatter
'ai_gateway_enterprise' => @page.data['ai_gateway_enterprise'],
'min_version' => @page.data['min_version'],
'tier' => @page.data['tier'],
+ 'tiers' => resolve_tiers(@page.data['tiers']),
'products' => resolve_names(@page.data['products'], 'products'),
'tools' => resolve_names(@page.data['tools'], 'tools'),
'beta' => @page.data['beta']
@@ -56,6 +57,15 @@ def resolve_names(slugs, data_key)
Array(slugs).map { |slug| @site.data.dig(data_key, slug, 'name') || slug }
end
+ def resolve_tiers(tiers)
+ return if tiers.nil? || tiers.empty?
+
+ tiers.each_with_object({}) do |(product, tier_name), out|
+ name = @site.data.dig('products', product, 'name') || product
+ out[name] = @site.data.dig('products', product, 'tiers', tier_name, 'text') || tier_name
+ end
+ end
+
def plugin_metadata
if @page.data['plugin?'] && @page.data['overview?']
{
From 3415d9db56892263834e9b95afb4b075bb181118 Mon Sep 17 00:00:00 2001
From: Julia <101819212+juliamrch@users.noreply.github.com>
Date: Fri, 12 Jun 2026 13:08:18 +0200
Subject: [PATCH 3/4] feat(Insomnia): custom linting rules for cloud and local
(#5287)
* feat(insomnia): draft structure for custom linting rules for cloud projects
* fix: header
* feat(insomnia): update custom linting rules
* feat(insomnia): upload custom linting summary
* Apply suggestions from code review
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
* Apply suggestions from code review
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Julia <101819212+juliamrch@users.noreply.github.com>
* feat(insomnia): specify Spectral ruleset
* feat(insomnia): include -r flag and specify the custom ruleset
* feat(insomnia): add min version
* fix(insomnia): syntax
* feat(insomnia): include spectral core functions note
* feat(insomnia): include viewing but not editing feature for custom rulesets
* feat(insomnia): remove screenshot
* feat(insomnia): use variables for Insomnia name
* feat(release): update version
* feat(insomnia): extends remote file reference + version warning
* styles(vale): fix repeated word
* Apply suggestion from @cloudjumpercat
Co-authored-by: Diana <75819066+cloudjumpercat@users.noreply.github.com>
* Apply suggestion from @cloudjumpercat
Co-authored-by: Diana <75819066+cloudjumpercat@users.noreply.github.com>
* Apply suggestion from @cloudjumpercat
Co-authored-by: Diana <75819066+cloudjumpercat@users.noreply.github.com>
* Apply suggestion from @cloudjumpercat
Co-authored-by: Diana <75819066+cloudjumpercat@users.noreply.github.com>
* Apply suggestion from @juliamrch
* apply suggestions from Diana
Co-authored-by: Diana <75819066+cloudjumpercat@users.noreply.github.com>
* Apply suggestion from @cloudjumpercat
Co-authored-by: Diana <75819066+cloudjumpercat@users.noreply.github.com>
---------
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Diana <75819066+cloudjumpercat@users.noreply.github.com>
---
.../insomnia/add-custom-linting-rules.md | 95 +++++++++++++-----
.../insomnia/custom-linting-warning.png | Bin 26336 -> 0 bytes
app/insomnia/api-specs.md | 4 +-
3 files changed, 72 insertions(+), 27 deletions(-)
delete mode 100644 app/assets/images/insomnia/custom-linting-warning.png
diff --git a/app/_how-tos/insomnia/add-custom-linting-rules.md b/app/_how-tos/insomnia/add-custom-linting-rules.md
index ee8fbfad2d..6976a945bc 100644
--- a/app/_how-tos/insomnia/add-custom-linting-rules.md
+++ b/app/_how-tos/insomnia/add-custom-linting-rules.md
@@ -1,51 +1,51 @@
---
-title: Add custom linting rules in Insomnia
+title: "Add custom linting rules in {{ site.data.products.insomnia.name }}"
permalink: /how-to/add-custom-linting-rules/
content_type: how_to
-description: Learn how to add custom linting rules to your APIs in Insomnia.
+description: Learn how to add custom linting rules to your APIs in Insomnia .
+no_wrap: true
products:
-- insomnia
+ - insomnia
+min_version:
+ insomnia: "13.0"
tags:
- insomnia-documents
- linting
related_resources:
- - text: Design APIs with Insomnia
+ - text: "Design APIs with {{ site.data.products.insomnia.name }}"
url: /insomnia/design/
-
-tldr:
- q: How do I customize linting in Insomnia?
- a: In your Git repository, add a `.spectral.yaml` file containing your custom ruleset at the same directory as the OAS file to lint.
+tldr:
+ q: How do I customize linting in {{ site.data.products.insomnia.name }} ?
+ a: In your {{ site.data.products.insomnia.name }} document, click the upload icon for the **Default OAS Ruleset** and add a Spectral ruleset YAML file with your custom ruleset.
prereqs:
inline:
- title: Create a design document
include_content: prereqs/design-document
icon_url: /assets/icons/file.svg
- - title: Synchronize with Git
- include_content: prereqs/git-sync
- icon_url: /assets/icons/git.svg
faqs:
- q: How can I use custom linting with Inso CLI?
a: |
- Create your `.spectral.yaml` file in the same directory as the OAS file to lint, then run the [`inso lint spec`](/inso-cli/reference/lint_spec/) command.
+ Create a [Spectral ruleset](https://docs.stoplight.io/docs/spectral/e5b9616d6d50c-rulesets) in YAML format, and upload it to an OAS file document in Insomnia by clicking the upload icon for the **Default OAS Ruleset**.
---
-## Create add the file ruleset
-
-In the Git repository connected to your document, create a `.spectral.yaml` at the same directory as the OAS file to lint.
+{{ site.data.products.insomnia.name }} provides a default linting ruleset. Override it to add your custom linting rules by following these steps:
## Define the rules
-The custom ruleset overrides the default one. If you want to create a completely new ruleset, you can simply add your rules in the file using the [Spectral](https://docs.stoplight.io/docs/spectral/e5b9616d6d50c-rulesets) syntax. If you want to extend an existing ruleset, specify the ruleset with the `extend` property in `.spectral.yaml`.
+The custom ruleset overrides the default one. To create a new ruleset, add your rules in the file using the [Spectral](https://docs.stoplight.io/docs/spectral/e5b9616d6d50c-rulesets) syntax. If you want to extend an existing ruleset, specify the ruleset with the `extends` property.
+
+{:.info}
+> Available Spectral top level properties in {{ site.data.products.insomnia.name }} are `rules` and `extends`. Custom functions are not permitted. However, {{ site.data.products.insomnia.name }} provides support for [Spectral built-in core functions](https://docs.stoplight.io/docs/spectral/cb95cf0d26b83-core-functions).
-For example, if you want to extend the default [Spectral OpenAPI](https://docs.stoplight.io/docs/spectral/4dec24461f3af-open-api-rules) ruleset to add a warning when tags don't have a description, you can add the following content to `.spectral.yaml`:
+For example, to extend the default [Spectral OpenAPI](https://docs.stoplight.io/docs/spectral/4dec24461f3af-open-api-rules) ruleset to add a warning when tags don't have a description, add the following content to your ruleset file:
```yaml
extends: spectral:oas
@@ -59,20 +59,65 @@ rules:
function: truthy
```
-## Synchronize the changes
+## Upload the ruleset file
-Commit and push the file on the repository, then pull the changes in Insomnia.
+1. In the {{ site.data.products.insomnia.name }} app, navigate to a document with the OAS file you want to lint.
+2. Click the upload icon for **Default OAS Ruleset** at the bottom of the pane.
-{:.info}
-> This will place the `.spectral.yaml` file in the local working directory. You will not see the file in the Insomnia UI but the linting rules will be applied to the associated OAS file.
+This places the ruleset file in the local working directory. {{ site.data.products.insomnia.name }} renames this custom ruleset as `.spectral.yaml`.
+
+You can view the content of the file by clicking `Custom Ruleset` in {{ site.data.products.insomnia.name }}. If you want to make changes to the file, edit it locally.
## Validate
-Close and reopen the document to apply the changes. In this example, you can validate by creating a new tag without a description:
+In this example, you can confirm the rule triggers by removing the description for the `GET /flights` endpoint. This will be flagged since the ruleset doesn't allow tags without a description:
+
```yaml
-tags:
- - name: flight-data
+"/flights":
+ get:
+ summary: Get KongAir planned flights
+ tags:
+ - flight-data
```
This causes a new warning to appear:
-
+
+```
+tag-description Tags must have a description.
+```
+
+## Override the rules {% new_in 13 %}
+
+Override the linting rules and use another ruleset, by using either Inso CLI or `.spectral.yaml`:
+
+{% navtabs "custom linting" %}
+{% navtab "Inso CLI" %}
+
+Use the [Inso CLI(/inso-cli/reference/lint_spec/) with the `--ruleset` or `-r` flag and the path to your custom ruleset. Run `inso lint spec --ruleset `. This overrides the default OpenAPI specifications (OAS) ruleset in {{ site.data.products.insomnia.name }} , and any ruleset in the API Spec folder.
+
+If the `--ruleset` flag isn't specified, {{ site.data.products.insomnia.name }} uses one of the following, in order:
+
+- The ruleset defined in `.spectral.yaml`, if it exists.
+- The default OAS ruleset.
+
+{% endnavtab %}
+{% navtab "Use `extends` in `.spectral.yaml`" %}
+
+Make {{ site.data.products.insomnia.name }} point at another ruleset in `.spectral.yaml` by using the `extends` property. For example:
+
+```yaml
+extends:
+ - spectral:oas
+ - ./rules/my-rules.yaml
+```
+
+If you reference a remote file (one hosted outside of your project in {{ site.data.products.insomnia.name }}), {{ site.data.products.insomnia.name }} fetches its content only when you upload the custom ruleset. If the remote file later changes, {{ site.data.products.insomnia.name }}:
+
+- Doesn't track those changes in commits, because the file lives outside the project.
+- Doesn't fetch them automatically for security reasons. Instead, you can refresh manually using the button next to the ruleset option.
+
+{% endnavtab %}
+{% endnavtabs %}
+
+{:.warning}
+> Make sure users in your team are running at least {{ site.data.products.insomnia.name }} `13.0` to avoid compatibility issues with this feature.
\ No newline at end of file
diff --git a/app/assets/images/insomnia/custom-linting-warning.png b/app/assets/images/insomnia/custom-linting-warning.png
deleted file mode 100644
index d4e9380771e6a7f011271a8dfbf9e95d95b48fbf..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 26336
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
diff --git a/app/insomnia/api-specs.md b/app/insomnia/api-specs.md
index c113b44bd4..1991efe1e9 100644
--- a/app/insomnia/api-specs.md
+++ b/app/insomnia/api-specs.md
@@ -123,8 +123,8 @@ rows:
For more information, see the [`inso lint spec` reference](/inso-cli/reference/lint_spec/).
- usecase: Use custom linting to ensure your spec adheres to your team or company's standards
instructions: |
- To lint locally, create a `.spectral.yaml` file with the custom rules in the same directory as the `oas.yaml` file you want to lint. Then run `inso lint spec ./oas.yaml` from that directory.
- To [apply custom lint rules in the Insomnia UI](/how-to/add-custom-linting-rules/), add the `.spectral.yaml` file to the root of the collection git repository at the same level as the `.insomnia` folder.
+ To lint locally, create a YAML file in the project with the custom rules in the same directory as the `oas.yaml` file you want to lint. The Inso CLI picks the rules regardless of the file name. Then run `inso lint spec ./oas.yaml` from that directory.
+ To [apply custom lint rules in the Insomnia UI](/how-to/add-custom-linting-rules/), upload a ruleset YAML file to the project that contains the design document you want to lint.
{% endtable %}
### Work with requests
From 65d0960eb45f375ca7810195bfe657ae4e724483 Mon Sep 17 00:00:00 2001
From: Julia <101819212+juliamrch@users.noreply.github.com>
Date: Fri, 12 Jun 2026 13:57:58 +0200
Subject: [PATCH 4/4] feat(insomnia): specify backward compatibility risks
---
app/insomnia/release-policy.md | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/app/insomnia/release-policy.md b/app/insomnia/release-policy.md
index f65489829e..5ed5485027 100644
--- a/app/insomnia/release-policy.md
+++ b/app/insomnia/release-policy.md
@@ -35,11 +35,13 @@ Public documentation updates support the latest versions of Insomnia.
## Release types
- **Generally Available (GA)**: Released to all users.
-- **Beta**: A 7-day period before GA when users can opt in to test the release and provide early feedback. Opt in via **Settings > Release Channel** in the Insomnia app.
+- **Beta**: A 7-day period before GA when users can opt in to test the release and provide early feedback.
- **Preview** or **Tech Preview**: Features that are ready to use but still in active development. Preview features are clearly marked in the product.
Learn more about stages of software availability [on the dedicated page](/stages-of-software-availability/).
+To try the **Beta** release, opt in via **Settings > Release Channel** in the Insomnia app. This setting lets you switch between **Beta** and **GA** versions. Beta versions can include breaking changes that aren't backward compatible.
+
{:.info}
> Insomnia strongly recommends using the newest version, and that all users collaborating on the same project remain on the same major version.
e%{Z2D=QfX1CQOjm>Zo0$bi^yUuCuK!j=1Z4~Fn
zIPF?4eJgR<``&F^c9C8VF3qMWkZx&y4!v2Z=%HP2we!5@zUFfQINpKM_beu1bxd(W
zypG|0BVnefsywMgTCHF);f0*bJ9`AvI;tQZ>99IwTS$F{mHe*NG%l^{X@^qE`kjl^X@!X&?
zthVU3vl3{^-QW5CX?x5zJ>QgY!{NFPN$a@q0Tzq34_F?^aXr|ysE%Rc;NZaGhWq7H
zI0%<5abd$so2Y%en7Obp;vwTN00G5vV)KiO^*t%CU;l{JXIk239X&bTXr>tiy3478
zOW
For more information, see the [`inso lint spec` reference](/inso-cli/reference/lint_spec/).
- usecase: Use custom linting to ensure your spec adheres to your team or company's standards
instructions: |
- To lint locally, create a `.spectral.yaml` file with the custom rules in the same directory as the `oas.yaml` file you want to lint. Then run `inso lint spec ./oas.yaml` from that directory.
- To [apply custom lint rules in the Insomnia UI](/how-to/add-custom-linting-rules/), add the `.spectral.yaml` file to the root of the collection git repository at the same level as the `.insomnia` folder.
+ To lint locally, create a YAML file in the project with the custom rules in the same directory as the `oas.yaml` file you want to lint. The Inso CLI picks the rules regardless of the file name. Then run `inso lint spec ./oas.yaml` from that directory.
+ To [apply custom lint rules in the Insomnia UI](/how-to/add-custom-linting-rules/), upload a ruleset YAML file to the project that contains the design document you want to lint.
{% endtable %}
### Work with requests
From 65d0960eb45f375ca7810195bfe657ae4e724483 Mon Sep 17 00:00:00 2001
From: Julia <101819212+juliamrch@users.noreply.github.com>
Date: Fri, 12 Jun 2026 13:57:58 +0200
Subject: [PATCH 4/4] feat(insomnia): specify backward compatibility risks
---
app/insomnia/release-policy.md | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/app/insomnia/release-policy.md b/app/insomnia/release-policy.md
index f65489829e..5ed5485027 100644
--- a/app/insomnia/release-policy.md
+++ b/app/insomnia/release-policy.md
@@ -35,11 +35,13 @@ Public documentation updates support the latest versions of Insomnia.
## Release types
- **Generally Available (GA)**: Released to all users.
-- **Beta**: A 7-day period before GA when users can opt in to test the release and provide early feedback. Opt in via **Settings > Release Channel** in the Insomnia app.
+- **Beta**: A 7-day period before GA when users can opt in to test the release and provide early feedback.
- **Preview** or **Tech Preview**: Features that are ready to use but still in active development. Preview features are clearly marked in the product.
Learn more about stages of software availability [on the dedicated page](/stages-of-software-availability/).
+To try the **Beta** release, opt in via **Settings > Release Channel** in the Insomnia app. This setting lets you switch between **Beta** and **GA** versions. Beta versions can include breaking changes that aren't backward compatible.
+
{:.info}
> Insomnia strongly recommends using the newest version, and that all users collaborating on the same project remain on the same major version.