diff --git a/.github/workflows/deploy-pages.yml b/.github/workflows/deploy-pages.yml
index 6756867..1bc4b10 100644
--- a/.github/workflows/deploy-pages.yml
+++ b/.github/workflows/deploy-pages.yml
@@ -47,3 +47,40 @@ jobs:
steps:
- id: deployment
uses: actions/deploy-pages@v4
+
+ # Notify IndexNow (Bing, Yandex, Seznam, Naver, ...) of every URL in the
+ # live sitemap after a successful production deploy. Best-effort: a failure
+ # here never fails the deploy.
+ indexnow:
+ runs-on: ubuntu-24.04
+ needs: deploy
+ if: github.ref == 'refs/heads/main'
+ continue-on-error: true
+ permissions:
+ contents: read
+
+ steps:
+ - name: Submit sitemap URLs to IndexNow
+ env:
+ INDEXNOW_HOST: mockforge.dev
+ INDEXNOW_KEY: b7e4c2a9f1d84630a5c7e2b9d0f3a614
+ run: |
+ set -euo pipefail
+ curl -fsSL --retry 3 --retry-delay 10 "https://${INDEXNOW_HOST}/sitemap.xml" -o sitemap.xml
+ grep -o '[^<]*' sitemap.xml | sed -e 's###' -e 's###' > urls.txt
+ echo "Found $(wc -l < urls.txt) URLs in sitemap"
+ test -s urls.txt
+ jq -n \
+ --arg host "$INDEXNOW_HOST" \
+ --arg key "$INDEXNOW_KEY" \
+ --arg keyLocation "https://${INDEXNOW_HOST}/${INDEXNOW_KEY}.txt" \
+ --rawfile urls urls.txt \
+ '{host: $host, key: $key, keyLocation: $keyLocation, urlList: ($urls | split("\n") | map(select(length > 0)))}' \
+ > payload.json
+ status=$(curl -sS -o response.txt -w '%{http_code}' \
+ -X POST "https://api.indexnow.org/indexnow" \
+ -H 'Content-Type: application/json; charset=utf-8' \
+ --data @payload.json)
+ echo "IndexNow responded HTTP ${status}"
+ cat response.txt || true
+ case "$status" in 200|202) ;; *) exit 1 ;; esac
diff --git a/404.html b/404.html
index 971e8e3..0522a06 100644
--- a/404.html
+++ b/404.html
@@ -71,8 +71,15 @@
{
"@context": "https://schema.org",
"@type": "Organization",
+ "@id": "https://mockforge.dev/#organization",
"name": "MockForge",
"url": "https://mockforge.dev/",
+ "parentOrganization": {
+ "@type": "Organization",
+ "@id": "https://saasierinc.com/#organization",
+ "name": "SaaSier Inc",
+ "url": "https://saasierinc.com"
+ },
"logo": "https://mockforge.dev/public/logo-transparent.png",
"description": "Open-source API mocking framework for REST, gRPC, GraphQL, WebSockets, and SMTP.",
"sameAs": [
diff --git a/compare-mockserver.html b/compare-mockserver.html
index 77a81a2..8b6de15 100644
--- a/compare-mockserver.html
+++ b/compare-mockserver.html
@@ -89,8 +89,15 @@
{
"@context": "https://schema.org",
"@type": "Organization",
+ "@id": "https://mockforge.dev/#organization",
"name": "MockForge",
"url": "https://mockforge.dev/",
+ "parentOrganization": {
+ "@type": "Organization",
+ "@id": "https://saasierinc.com/#organization",
+ "name": "SaaSier Inc",
+ "url": "https://saasierinc.com"
+ },
"logo": "https://mockforge.dev/public/logo-transparent.png",
"description": "Open-source API mocking framework for REST, gRPC, GraphQL, WebSockets, and SMTP.",
"sameAs": [
diff --git a/comparisons.html b/comparisons.html
index 17c4f9a..d2c685a 100644
--- a/comparisons.html
+++ b/comparisons.html
@@ -64,8 +64,15 @@
{
"@context": "https://schema.org",
"@type": "Organization",
+ "@id": "https://mockforge.dev/#organization",
"name": "MockForge",
"url": "https://mockforge.dev/",
+ "parentOrganization": {
+ "@type": "Organization",
+ "@id": "https://saasierinc.com/#organization",
+ "name": "SaaSier Inc",
+ "url": "https://saasierinc.com"
+ },
"logo": "https://mockforge.dev/public/logo-transparent.png",
"description": "Open-source API mocking framework for REST, gRPC, GraphQL, WebSockets, and SMTP.",
"sameAs": [
diff --git a/contact.html b/contact.html
index d800359..ccd560a 100644
--- a/contact.html
+++ b/contact.html
@@ -77,8 +77,15 @@
{
"@context": "https://schema.org",
"@type": "Organization",
+ "@id": "https://mockforge.dev/#organization",
"name": "MockForge",
"url": "https://mockforge.dev/",
+ "parentOrganization": {
+ "@type": "Organization",
+ "@id": "https://saasierinc.com/#organization",
+ "name": "SaaSier Inc",
+ "url": "https://saasierinc.com"
+ },
"logo": "https://mockforge.dev/public/logo-transparent.png",
"description": "Open-source API mocking framework for REST, gRPC, GraphQL, WebSockets, and SMTP.",
"sameAs": [
diff --git a/engineering-notes.html b/engineering-notes.html
index b6c7779..b45d423 100644
--- a/engineering-notes.html
+++ b/engineering-notes.html
@@ -70,8 +70,15 @@
{
"@context": "https://schema.org",
"@type": "Organization",
+ "@id": "https://mockforge.dev/#organization",
"name": "MockForge",
"url": "https://mockforge.dev/",
+ "parentOrganization": {
+ "@type": "Organization",
+ "@id": "https://saasierinc.com/#organization",
+ "name": "SaaSier Inc",
+ "url": "https://saasierinc.com"
+ },
"logo": "https://mockforge.dev/public/logo-transparent.png",
"description": "Open-source API mocking framework for REST, gRPC, GraphQL, WebSockets, and SMTP.",
"sameAs": [
diff --git a/faq.html b/faq.html
index 3315a39..d7d27d7 100644
--- a/faq.html
+++ b/faq.html
@@ -112,8 +112,15 @@
{
"@context": "https://schema.org",
"@type": "Organization",
+ "@id": "https://mockforge.dev/#organization",
"name": "MockForge",
"url": "https://mockforge.dev/",
+ "parentOrganization": {
+ "@type": "Organization",
+ "@id": "https://saasierinc.com/#organization",
+ "name": "SaaSier Inc",
+ "url": "https://saasierinc.com"
+ },
"logo": "https://mockforge.dev/public/logo-transparent.png",
"description": "Open-source API mocking framework for REST, gRPC, GraphQL, WebSockets, and SMTP.",
"sameAs": [
diff --git a/index.html b/index.html
index 57e85b2..1be4b91 100644
--- a/index.html
+++ b/index.html
@@ -34,9 +34,10 @@
"@graph": [
{
"@type": "Organization",
- "@id": "https://mockforge.dev/#org",
+ "@id": "https://mockforge.dev/#organization",
"name": "MockForge",
"url": "https://mockforge.dev/",
+ "parentOrganization": { "@type": "Organization", "@id": "https://saasierinc.com/#organization", "name": "SaaSier Inc", "url": "https://saasierinc.com" },
"logo": "https://mockforge.dev/public/logo-transparent.png",
"sameAs": ["https://github.com/SaaSy-Solutions/mockforge", "https://www.linkedin.com/company/mockforge"],
"contactPoint": [
@@ -55,13 +56,13 @@
},
{
"@type": "SoftwareApplication",
- "@id": "https://mockforge.dev/#app",
+ "@id": "https://mockforge.dev/#software",
"name": "MockForge",
"description": "A comprehensive mocking framework for REST, gRPC, GraphQL, WebSocket, Kafka, MQTT and more. Generate realistic data, inject latency and failures, and deploy hosted mocks with a single command.",
"url": "https://mockforge.dev/",
"applicationCategory": "DeveloperApplication",
"operatingSystem": "Linux, macOS, Windows",
- "publisher": { "@id": "https://mockforge.dev/#org" },
+ "publisher": { "@id": "https://mockforge.dev/#organization" },
"offers": [
{ "@type": "Offer", "name": "Free", "price": "0", "priceCurrency": "USD", "url": "https://mockforge.dev/pricing.html" },
{ "@type": "Offer", "name": "Pro", "price": "29", "priceCurrency": "USD", "url": "https://mockforge.dev/pricing.html" },
diff --git a/note-announcing-v1.html b/note-announcing-v1.html
index 3ff5a35..586b963 100644
--- a/note-announcing-v1.html
+++ b/note-announcing-v1.html
@@ -78,11 +78,13 @@
},
"author": {
"@type": "Organization",
+ "@id": "https://mockforge.dev/#organization",
"name": "MockForge",
"url": "https://mockforge.dev/"
},
"publisher": {
"@type": "Organization",
+ "@id": "https://mockforge.dev/#organization",
"name": "MockForge",
"logo": {
"@type": "ImageObject",
diff --git a/note-api-drift-detection-and-contract-alerting.html b/note-api-drift-detection-and-contract-alerting.html
index d8a7e92..f6ccafa 100644
--- a/note-api-drift-detection-and-contract-alerting.html
+++ b/note-api-drift-detection-and-contract-alerting.html
@@ -78,11 +78,13 @@
},
"author": {
"@type": "Organization",
+ "@id": "https://mockforge.dev/#organization",
"name": "MockForge",
"url": "https://mockforge.dev/"
},
"publisher": {
"@type": "Organization",
+ "@id": "https://mockforge.dev/#organization",
"name": "MockForge",
"logo": {
"@type": "ImageObject",
diff --git a/note-client-generation-tradeoffs.html b/note-client-generation-tradeoffs.html
index 17827f9..4c51421 100644
--- a/note-client-generation-tradeoffs.html
+++ b/note-client-generation-tradeoffs.html
@@ -78,11 +78,13 @@
},
"author": {
"@type": "Organization",
+ "@id": "https://mockforge.dev/#organization",
"name": "MockForge",
"url": "https://mockforge.dev/"
},
"publisher": {
"@type": "Organization",
+ "@id": "https://mockforge.dev/#organization",
"name": "MockForge",
"logo": {
"@type": "ImageObject",
diff --git a/note-cloud-launch.html b/note-cloud-launch.html
index 36dfc89..a600924 100644
--- a/note-cloud-launch.html
+++ b/note-cloud-launch.html
@@ -78,11 +78,13 @@
},
"author": {
"@type": "Organization",
+ "@id": "https://mockforge.dev/#organization",
"name": "MockForge",
"url": "https://mockforge.dev/"
},
"publisher": {
"@type": "Organization",
+ "@id": "https://mockforge.dev/#organization",
"name": "MockForge",
"logo": {
"@type": "ImageObject",
diff --git a/note-conformance-maturity.html b/note-conformance-maturity.html
index 7b5b91c..7529e12 100644
--- a/note-conformance-maturity.html
+++ b/note-conformance-maturity.html
@@ -78,11 +78,13 @@
},
"author": {
"@type": "Organization",
+ "@id": "https://mockforge.dev/#organization",
"name": "MockForge",
"url": "https://mockforge.dev/"
},
"publisher": {
"@type": "Organization",
+ "@id": "https://mockforge.dev/#organization",
"name": "MockForge",
"logo": {
"@type": "ImageObject",
diff --git a/note-conformance-testing.html b/note-conformance-testing.html
index 7818141..cc3f721 100644
--- a/note-conformance-testing.html
+++ b/note-conformance-testing.html
@@ -78,11 +78,13 @@
},
"author": {
"@type": "Organization",
+ "@id": "https://mockforge.dev/#organization",
"name": "MockForge",
"url": "https://mockforge.dev/"
},
"publisher": {
"@type": "Organization",
+ "@id": "https://mockforge.dev/#organization",
"name": "MockForge",
"logo": {
"@type": "ImageObject",
diff --git a/note-cost-cap-design.html b/note-cost-cap-design.html
index 803c8a9..66ed57b 100644
--- a/note-cost-cap-design.html
+++ b/note-cost-cap-design.html
@@ -78,11 +78,13 @@
},
"author": {
"@type": "Organization",
+ "@id": "https://mockforge.dev/#organization",
"name": "MockForge",
"url": "https://mockforge.dev/"
},
"publisher": {
"@type": "Organization",
+ "@id": "https://mockforge.dev/#organization",
"name": "MockForge",
"logo": {
"@type": "ImageObject",
diff --git a/note-fault-injection-patterns.html b/note-fault-injection-patterns.html
index 4d1b680..5825d9d 100644
--- a/note-fault-injection-patterns.html
+++ b/note-fault-injection-patterns.html
@@ -78,11 +78,13 @@
},
"author": {
"@type": "Organization",
+ "@id": "https://mockforge.dev/#organization",
"name": "MockForge",
"url": "https://mockforge.dev/"
},
"publisher": {
"@type": "Organization",
+ "@id": "https://mockforge.dev/#organization",
"name": "MockForge",
"logo": {
"@type": "ImageObject",
diff --git a/note-grpc-dynamic-routing-release.html b/note-grpc-dynamic-routing-release.html
index 1731dce..be4d919 100644
--- a/note-grpc-dynamic-routing-release.html
+++ b/note-grpc-dynamic-routing-release.html
@@ -78,11 +78,13 @@
},
"author": {
"@type": "Organization",
+ "@id": "https://mockforge.dev/#organization",
"name": "MockForge",
"url": "https://mockforge.dev/"
},
"publisher": {
"@type": "Organization",
+ "@id": "https://mockforge.dev/#organization",
"name": "MockForge",
"logo": {
"@type": "ImageObject",
diff --git a/note-grpc-mocking-in-ci.html b/note-grpc-mocking-in-ci.html
index 0dbe9dd..82a403c 100644
--- a/note-grpc-mocking-in-ci.html
+++ b/note-grpc-mocking-in-ci.html
@@ -78,11 +78,13 @@
},
"author": {
"@type": "Organization",
+ "@id": "https://mockforge.dev/#organization",
"name": "MockForge",
"url": "https://mockforge.dev/"
},
"publisher": {
"@type": "Organization",
+ "@id": "https://mockforge.dev/#organization",
"name": "MockForge",
"logo": {
"@type": "ImageObject",
diff --git a/note-migration-from-static-fixtures.html b/note-migration-from-static-fixtures.html
index 1d4cb20..b6fd515 100644
--- a/note-migration-from-static-fixtures.html
+++ b/note-migration-from-static-fixtures.html
@@ -78,11 +78,13 @@
},
"author": {
"@type": "Organization",
+ "@id": "https://mockforge.dev/#organization",
"name": "MockForge",
"url": "https://mockforge.dev/"
},
"publisher": {
"@type": "Organization",
+ "@id": "https://mockforge.dev/#organization",
"name": "MockForge",
"logo": {
"@type": "ImageObject",
diff --git a/note-mocking-kafka-without-broker.html b/note-mocking-kafka-without-broker.html
index 9990535..fb7440c 100644
--- a/note-mocking-kafka-without-broker.html
+++ b/note-mocking-kafka-without-broker.html
@@ -78,11 +78,13 @@
},
"author": {
"@type": "Organization",
+ "@id": "https://mockforge.dev/#organization",
"name": "MockForge",
"url": "https://mockforge.dev/"
},
"publisher": {
"@type": "Organization",
+ "@id": "https://mockforge.dev/#organization",
"name": "MockForge",
"logo": {
"@type": "ImageObject",
diff --git a/note-multi-target-conformance-and-real-world-specs.html b/note-multi-target-conformance-and-real-world-specs.html
index c9f03a3..7923ec5 100644
--- a/note-multi-target-conformance-and-real-world-specs.html
+++ b/note-multi-target-conformance-and-real-world-specs.html
@@ -78,11 +78,13 @@
},
"author": {
"@type": "Organization",
+ "@id": "https://mockforge.dev/#organization",
"name": "MockForge",
"url": "https://mockforge.dev/"
},
"publisher": {
"@type": "Organization",
+ "@id": "https://mockforge.dev/#organization",
"name": "MockForge",
"logo": {
"@type": "ImageObject",
diff --git a/note-our-saas-infrastructure.html b/note-our-saas-infrastructure.html
index a3e3870..31dadee 100644
--- a/note-our-saas-infrastructure.html
+++ b/note-our-saas-infrastructure.html
@@ -78,11 +78,13 @@
},
"author": {
"@type": "Organization",
+ "@id": "https://mockforge.dev/#organization",
"name": "MockForge",
"url": "https://mockforge.dev/"
},
"publisher": {
"@type": "Organization",
+ "@id": "https://mockforge.dev/#organization",
"name": "MockForge",
"logo": {
"@type": "ImageObject",
diff --git a/note-release-cadence-and-risk.html b/note-release-cadence-and-risk.html
index 80c8150..722c047 100644
--- a/note-release-cadence-and-risk.html
+++ b/note-release-cadence-and-risk.html
@@ -78,11 +78,13 @@
},
"author": {
"@type": "Organization",
+ "@id": "https://mockforge.dev/#organization",
"name": "MockForge",
"url": "https://mockforge.dev/"
},
"publisher": {
"@type": "Organization",
+ "@id": "https://mockforge.dev/#organization",
"name": "MockForge",
"logo": {
"@type": "ImageObject",
diff --git a/note-reliability-update-march-2026.html b/note-reliability-update-march-2026.html
index 75db1a5..8829806 100644
--- a/note-reliability-update-march-2026.html
+++ b/note-reliability-update-march-2026.html
@@ -78,11 +78,13 @@
},
"author": {
"@type": "Organization",
+ "@id": "https://mockforge.dev/#organization",
"name": "MockForge",
"url": "https://mockforge.dev/"
},
"publisher": {
"@type": "Organization",
+ "@id": "https://mockforge.dev/#organization",
"name": "MockForge",
"logo": {
"@type": "ImageObject",
diff --git a/note-reliability-updates-conformance-and-admin.html b/note-reliability-updates-conformance-and-admin.html
index 04dfe2d..4d2b17a 100644
--- a/note-reliability-updates-conformance-and-admin.html
+++ b/note-reliability-updates-conformance-and-admin.html
@@ -78,11 +78,13 @@
},
"author": {
"@type": "Organization",
+ "@id": "https://mockforge.dev/#organization",
"name": "MockForge",
"url": "https://mockforge.dev/"
},
"publisher": {
"@type": "Organization",
+ "@id": "https://mockforge.dev/#organization",
"name": "MockForge",
"logo": {
"@type": "ImageObject",
diff --git a/note-scenario-switching.html b/note-scenario-switching.html
index c57d091..22aa3bd 100644
--- a/note-scenario-switching.html
+++ b/note-scenario-switching.html
@@ -78,11 +78,13 @@
},
"author": {
"@type": "Organization",
+ "@id": "https://mockforge.dev/#organization",
"name": "MockForge",
"url": "https://mockforge.dev/"
},
"publisher": {
"@type": "Organization",
+ "@id": "https://mockforge.dev/#organization",
"name": "MockForge",
"logo": {
"@type": "ImageObject",
diff --git a/note-security-guardrails-v0-2x.html b/note-security-guardrails-v0-2x.html
index 6e0fa93..65b0f89 100644
--- a/note-security-guardrails-v0-2x.html
+++ b/note-security-guardrails-v0-2x.html
@@ -78,11 +78,13 @@
},
"author": {
"@type": "Organization",
+ "@id": "https://mockforge.dev/#organization",
"name": "MockForge",
"url": "https://mockforge.dev/"
},
"publisher": {
"@type": "Organization",
+ "@id": "https://mockforge.dev/#organization",
"name": "MockForge",
"logo": {
"@type": "ImageObject",
diff --git a/note-spec-driven-openapi-conformance.html b/note-spec-driven-openapi-conformance.html
index dcd94e2..d9d5e8c 100644
--- a/note-spec-driven-openapi-conformance.html
+++ b/note-spec-driven-openapi-conformance.html
@@ -78,11 +78,13 @@
},
"author": {
"@type": "Organization",
+ "@id": "https://mockforge.dev/#organization",
"name": "MockForge",
"url": "https://mockforge.dev/"
},
"publisher": {
"@type": "Organization",
+ "@id": "https://mockforge.dev/#organization",
"name": "MockForge",
"logo": {
"@type": "ImageObject",
diff --git a/note-testing-failure-paths.html b/note-testing-failure-paths.html
index e9d49c6..1372021 100644
--- a/note-testing-failure-paths.html
+++ b/note-testing-failure-paths.html
@@ -78,11 +78,13 @@
},
"author": {
"@type": "Organization",
+ "@id": "https://mockforge.dev/#organization",
"name": "MockForge",
"url": "https://mockforge.dev/"
},
"publisher": {
"@type": "Organization",
+ "@id": "https://mockforge.dev/#organization",
"name": "MockForge",
"logo": {
"@type": "ImageObject",
diff --git a/note-v0-1-3-protocol-expansion.html b/note-v0-1-3-protocol-expansion.html
index f860a45..29ce7a5 100644
--- a/note-v0-1-3-protocol-expansion.html
+++ b/note-v0-1-3-protocol-expansion.html
@@ -78,11 +78,13 @@
},
"author": {
"@type": "Organization",
+ "@id": "https://mockforge.dev/#organization",
"name": "MockForge",
"url": "https://mockforge.dev/"
},
"publisher": {
"@type": "Organization",
+ "@id": "https://mockforge.dev/#organization",
"name": "MockForge",
"logo": {
"@type": "ImageObject",
diff --git a/note-v0-2-0-client-generation.html b/note-v0-2-0-client-generation.html
index bb5f4cc..6d2984c 100644
--- a/note-v0-2-0-client-generation.html
+++ b/note-v0-2-0-client-generation.html
@@ -78,11 +78,13 @@
},
"author": {
"@type": "Organization",
+ "@id": "https://mockforge.dev/#organization",
"name": "MockForge",
"url": "https://mockforge.dev/"
},
"publisher": {
"@type": "Organization",
+ "@id": "https://mockforge.dev/#organization",
"name": "MockForge",
"logo": {
"@type": "ImageObject",
diff --git a/note-v0-2-3-bug-fixes.html b/note-v0-2-3-bug-fixes.html
index 5c8b1fb..66e1a76 100644
--- a/note-v0-2-3-bug-fixes.html
+++ b/note-v0-2-3-bug-fixes.html
@@ -78,11 +78,13 @@
},
"author": {
"@type": "Organization",
+ "@id": "https://mockforge.dev/#organization",
"name": "MockForge",
"url": "https://mockforge.dev/"
},
"publisher": {
"@type": "Organization",
+ "@id": "https://mockforge.dev/#organization",
"name": "MockForge",
"logo": {
"@type": "ImageObject",
diff --git a/note-v0-2-4-client-fixes.html b/note-v0-2-4-client-fixes.html
index 94bf6c4..983edbd 100644
--- a/note-v0-2-4-client-fixes.html
+++ b/note-v0-2-4-client-fixes.html
@@ -78,11 +78,13 @@
},
"author": {
"@type": "Organization",
+ "@id": "https://mockforge.dev/#organization",
"name": "MockForge",
"url": "https://mockforge.dev/"
},
"publisher": {
"@type": "Organization",
+ "@id": "https://mockforge.dev/#organization",
"name": "MockForge",
"logo": {
"@type": "ImageObject",
diff --git a/note-v0-2-5-enterprise-security.html b/note-v0-2-5-enterprise-security.html
index 1ae9344..530d190 100644
--- a/note-v0-2-5-enterprise-security.html
+++ b/note-v0-2-5-enterprise-security.html
@@ -78,11 +78,13 @@
},
"author": {
"@type": "Organization",
+ "@id": "https://mockforge.dev/#organization",
"name": "MockForge",
"url": "https://mockforge.dev/"
},
"publisher": {
"@type": "Organization",
+ "@id": "https://mockforge.dev/#organization",
"name": "MockForge",
"logo": {
"@type": "ImageObject",
diff --git a/note-v0-2-6-security-infrastructure.html b/note-v0-2-6-security-infrastructure.html
index c22be52..0c9cf4e 100644
--- a/note-v0-2-6-security-infrastructure.html
+++ b/note-v0-2-6-security-infrastructure.html
@@ -78,11 +78,13 @@
},
"author": {
"@type": "Organization",
+ "@id": "https://mockforge.dev/#organization",
"name": "MockForge",
"url": "https://mockforge.dev/"
},
"publisher": {
"@type": "Organization",
+ "@id": "https://mockforge.dev/#organization",
"name": "MockForge",
"logo": {
"@type": "ImageObject",
diff --git a/note-v0-2-7-api-sync-tcp.html b/note-v0-2-7-api-sync-tcp.html
index 86c1fc9..cbd00f4 100644
--- a/note-v0-2-7-api-sync-tcp.html
+++ b/note-v0-2-7-api-sync-tcp.html
@@ -78,11 +78,13 @@
},
"author": {
"@type": "Organization",
+ "@id": "https://mockforge.dev/#organization",
"name": "MockForge",
"url": "https://mockforge.dev/"
},
"publisher": {
"@type": "Organization",
+ "@id": "https://mockforge.dev/#organization",
"name": "MockForge",
"logo": {
"@type": "ImageObject",
diff --git a/note-v0-3-227-release.html b/note-v0-3-227-release.html
index 3b1c4ed..5adc326 100644
--- a/note-v0-3-227-release.html
+++ b/note-v0-3-227-release.html
@@ -78,11 +78,13 @@
},
"author": {
"@type": "Organization",
+ "@id": "https://mockforge.dev/#organization",
"name": "MockForge",
"url": "https://mockforge.dev/"
},
"publisher": {
"@type": "Organization",
+ "@id": "https://mockforge.dev/#organization",
"name": "MockForge",
"logo": {
"@type": "ImageObject",
diff --git a/note-v0-3-migration-playbook.html b/note-v0-3-migration-playbook.html
index 355ec76..b15acc4 100644
--- a/note-v0-3-migration-playbook.html
+++ b/note-v0-3-migration-playbook.html
@@ -78,11 +78,13 @@
},
"author": {
"@type": "Organization",
+ "@id": "https://mockforge.dev/#organization",
"name": "MockForge",
"url": "https://mockforge.dev/"
},
"publisher": {
"@type": "Organization",
+ "@id": "https://mockforge.dev/#organization",
"name": "MockForge",
"logo": {
"@type": "ImageObject",
diff --git a/note-vs-postman-mock.html b/note-vs-postman-mock.html
index 04d48f2..9550389 100644
--- a/note-vs-postman-mock.html
+++ b/note-vs-postman-mock.html
@@ -78,11 +78,13 @@
},
"author": {
"@type": "Organization",
+ "@id": "https://mockforge.dev/#organization",
"name": "MockForge",
"url": "https://mockforge.dev/"
},
"publisher": {
"@type": "Organization",
+ "@id": "https://mockforge.dev/#organization",
"name": "MockForge",
"logo": {
"@type": "ImageObject",
diff --git a/note-wafbench-security-hardening.html b/note-wafbench-security-hardening.html
index 6f63edd..94c2425 100644
--- a/note-wafbench-security-hardening.html
+++ b/note-wafbench-security-hardening.html
@@ -78,11 +78,13 @@
},
"author": {
"@type": "Organization",
+ "@id": "https://mockforge.dev/#organization",
"name": "MockForge",
"url": "https://mockforge.dev/"
},
"publisher": {
"@type": "Organization",
+ "@id": "https://mockforge.dev/#organization",
"name": "MockForge",
"logo": {
"@type": "ImageObject",
diff --git a/note-wafbench-sqli-detection.html b/note-wafbench-sqli-detection.html
index 5b206f6..30973b1 100644
--- a/note-wafbench-sqli-detection.html
+++ b/note-wafbench-sqli-detection.html
@@ -78,11 +78,13 @@
},
"author": {
"@type": "Organization",
+ "@id": "https://mockforge.dev/#organization",
"name": "MockForge",
"url": "https://mockforge.dev/"
},
"publisher": {
"@type": "Organization",
+ "@id": "https://mockforge.dev/#organization",
"name": "MockForge",
"logo": {
"@type": "ImageObject",
diff --git a/note-wasm-plugins.html b/note-wasm-plugins.html
index b2056a9..c7932f6 100644
--- a/note-wasm-plugins.html
+++ b/note-wasm-plugins.html
@@ -78,11 +78,13 @@
},
"author": {
"@type": "Organization",
+ "@id": "https://mockforge.dev/#organization",
"name": "MockForge",
"url": "https://mockforge.dev/"
},
"publisher": {
"@type": "Organization",
+ "@id": "https://mockforge.dev/#organization",
"name": "MockForge",
"logo": {
"@type": "ImageObject",
diff --git a/note-when-wiremock-isnt-enough.html b/note-when-wiremock-isnt-enough.html
index f262c94..8f84a45 100644
--- a/note-when-wiremock-isnt-enough.html
+++ b/note-when-wiremock-isnt-enough.html
@@ -78,11 +78,13 @@
},
"author": {
"@type": "Organization",
+ "@id": "https://mockforge.dev/#organization",
"name": "MockForge",
"url": "https://mockforge.dev/"
},
"publisher": {
"@type": "Organization",
+ "@id": "https://mockforge.dev/#organization",
"name": "MockForge",
"logo": {
"@type": "ImageObject",
diff --git a/note-why-multi-protocol.html b/note-why-multi-protocol.html
index 1354ff6..1b1e945 100644
--- a/note-why-multi-protocol.html
+++ b/note-why-multi-protocol.html
@@ -78,11 +78,13 @@
},
"author": {
"@type": "Organization",
+ "@id": "https://mockforge.dev/#organization",
"name": "MockForge",
"url": "https://mockforge.dev/"
},
"publisher": {
"@type": "Organization",
+ "@id": "https://mockforge.dev/#organization",
"name": "MockForge",
"logo": {
"@type": "ImageObject",
diff --git a/pricing.html b/pricing.html
index 1f943a6..0b9ef15 100644
--- a/pricing.html
+++ b/pricing.html
@@ -88,8 +88,15 @@
{
"@context": "https://schema.org",
"@type": "Organization",
+ "@id": "https://mockforge.dev/#organization",
"name": "MockForge",
"url": "https://mockforge.dev/",
+ "parentOrganization": {
+ "@type": "Organization",
+ "@id": "https://saasierinc.com/#organization",
+ "name": "SaaSier Inc",
+ "url": "https://saasierinc.com"
+ },
"logo": "https://mockforge.dev/public/logo-transparent.png",
"description": "Open-source API mocking framework for REST, gRPC, GraphQL, WebSockets, and SMTP.",
"sameAs": [
diff --git a/privacy.html b/privacy.html
index 97e0c49..0b07c02 100644
--- a/privacy.html
+++ b/privacy.html
@@ -77,8 +77,15 @@
{
"@context": "https://schema.org",
"@type": "Organization",
+ "@id": "https://mockforge.dev/#organization",
"name": "MockForge",
"url": "https://mockforge.dev/",
+ "parentOrganization": {
+ "@type": "Organization",
+ "@id": "https://saasierinc.com/#organization",
+ "name": "SaaSier Inc",
+ "url": "https://saasierinc.com"
+ },
"logo": "https://mockforge.dev/public/logo-transparent.png",
"description": "Open-source API mocking framework for REST, gRPC, GraphQL, WebSockets, and SMTP.",
"sameAs": [
diff --git a/public/b7e4c2a9f1d84630a5c7e2b9d0f3a614.txt b/public/b7e4c2a9f1d84630a5c7e2b9d0f3a614.txt
new file mode 100644
index 0000000..b8d9d58
--- /dev/null
+++ b/public/b7e4c2a9f1d84630a5c7e2b9d0f3a614.txt
@@ -0,0 +1 @@
+b7e4c2a9f1d84630a5c7e2b9d0f3a614
\ No newline at end of file
diff --git a/scripts/build-pages.js b/scripts/build-pages.js
index 192b2e3..a69b2dd 100644
--- a/scripts/build-pages.js
+++ b/scripts/build-pages.js
@@ -85,8 +85,15 @@ function renderSharedHeadBlock(includeOrgLd = true) {
{
"@context": "https://schema.org",
"@type": "Organization",
+ "@id": "https://mockforge.dev/#organization",
"name": "MockForge",
"url": "https://mockforge.dev/",
+ "parentOrganization": {
+ "@type": "Organization",
+ "@id": "https://saasierinc.com/#organization",
+ "name": "SaaSier Inc",
+ "url": "https://saasierinc.com"
+ },
"logo": "https://mockforge.dev/public/logo-transparent.png",
"description": "Open-source API mocking framework for REST, gRPC, GraphQL, WebSockets, and SMTP.",
"sameAs": [
@@ -324,11 +331,13 @@ function renderJsonLd(meta) {
mainEntityOfPage: { '@type': 'WebPage', '@id': meta.url },
author: {
'@type': 'Organization',
+ '@id': 'https://mockforge.dev/#organization',
name: 'MockForge',
url: 'https://mockforge.dev/',
},
publisher: {
'@type': 'Organization',
+ '@id': 'https://mockforge.dev/#organization',
name: 'MockForge',
logo: {
'@type': 'ImageObject',
@@ -673,7 +682,15 @@ if (outputRoot !== projectRoot && !flagCheck) {
// Serve agent/SEO discovery files from the dist root, not only under
// /public/. Scanners and agents expect /robots.txt, /sitemap.xml,
// /llms.txt, /openapi.json, and /openapi.registry.json at the domain root.
- for (const rootAsset of ['robots.txt', 'llms.txt', 'openapi.json', 'openapi.registry.json']) {
+ // The IndexNow key file must live at the domain root (it is the keyLocation
+ // the deploy workflow submits to api.indexnow.org).
+ for (const rootAsset of [
+ 'robots.txt',
+ 'llms.txt',
+ 'openapi.json',
+ 'openapi.registry.json',
+ 'b7e4c2a9f1d84630a5c7e2b9d0f3a614.txt',
+ ]) {
const assetPath = path.join(projectRoot, 'public', rootAsset);
if (fs.existsSync(assetPath)) {
fs.copyFileSync(assetPath, path.join(outputRoot, rootAsset));
diff --git a/src/pages/index.html b/src/pages/index.html
index 8561f43..e09c3f7 100644
--- a/src/pages/index.html
+++ b/src/pages/index.html
@@ -34,9 +34,10 @@
"@graph": [
{
"@type": "Organization",
- "@id": "https://mockforge.dev/#org",
+ "@id": "https://mockforge.dev/#organization",
"name": "MockForge",
"url": "https://mockforge.dev/",
+ "parentOrganization": { "@type": "Organization", "@id": "https://saasierinc.com/#organization", "name": "SaaSier Inc", "url": "https://saasierinc.com" },
"logo": "https://mockforge.dev/public/logo-transparent.png",
"sameAs": ["https://github.com/SaaSy-Solutions/mockforge", "https://www.linkedin.com/company/mockforge"],
"contactPoint": [
@@ -55,13 +56,13 @@
},
{
"@type": "SoftwareApplication",
- "@id": "https://mockforge.dev/#app",
+ "@id": "https://mockforge.dev/#software",
"name": "MockForge",
"description": "A comprehensive mocking framework for REST, gRPC, GraphQL, WebSocket, Kafka, MQTT and more. Generate realistic data, inject latency and failures, and deploy hosted mocks with a single command.",
"url": "https://mockforge.dev/",
"applicationCategory": "DeveloperApplication",
"operatingSystem": "Linux, macOS, Windows",
- "publisher": { "@id": "https://mockforge.dev/#org" },
+ "publisher": { "@id": "https://mockforge.dev/#organization" },
"offers": [
{ "@type": "Offer", "name": "Free", "price": "0", "priceCurrency": "USD", "url": "https://mockforge.dev/pricing.html" },
{ "@type": "Offer", "name": "Pro", "price": "29", "priceCurrency": "USD", "url": "https://mockforge.dev/pricing.html" },
diff --git a/support.html b/support.html
index 1c5fcfb..8d54d0f 100644
--- a/support.html
+++ b/support.html
@@ -64,8 +64,15 @@
{
"@context": "https://schema.org",
"@type": "Organization",
+ "@id": "https://mockforge.dev/#organization",
"name": "MockForge",
"url": "https://mockforge.dev/",
+ "parentOrganization": {
+ "@type": "Organization",
+ "@id": "https://saasierinc.com/#organization",
+ "name": "SaaSier Inc",
+ "url": "https://saasierinc.com"
+ },
"logo": "https://mockforge.dev/public/logo-transparent.png",
"description": "Open-source API mocking framework for REST, gRPC, GraphQL, WebSockets, and SMTP.",
"sameAs": [
diff --git a/trust.html b/trust.html
index dc78a60..d0132b7 100644
--- a/trust.html
+++ b/trust.html
@@ -87,8 +87,15 @@
{
"@context": "https://schema.org",
"@type": "Organization",
+ "@id": "https://mockforge.dev/#organization",
"name": "MockForge",
"url": "https://mockforge.dev/",
+ "parentOrganization": {
+ "@type": "Organization",
+ "@id": "https://saasierinc.com/#organization",
+ "name": "SaaSier Inc",
+ "url": "https://saasierinc.com"
+ },
"logo": "https://mockforge.dev/public/logo-transparent.png",
"description": "Open-source API mocking framework for REST, gRPC, GraphQL, WebSockets, and SMTP.",
"sameAs": [
diff --git a/vs/beeceptor.html b/vs/beeceptor.html
index 9d04dae..6e549d8 100644
--- a/vs/beeceptor.html
+++ b/vs/beeceptor.html
@@ -64,8 +64,15 @@
{
"@context": "https://schema.org",
"@type": "Organization",
+ "@id": "https://mockforge.dev/#organization",
"name": "MockForge",
"url": "https://mockforge.dev/",
+ "parentOrganization": {
+ "@type": "Organization",
+ "@id": "https://saasierinc.com/#organization",
+ "name": "SaaSier Inc",
+ "url": "https://saasierinc.com"
+ },
"logo": "https://mockforge.dev/public/logo-transparent.png",
"description": "Open-source API mocking framework for REST, gRPC, GraphQL, WebSockets, and SMTP.",
"sameAs": [
diff --git a/vs/bruno.html b/vs/bruno.html
index a927e6a..a18a7a2 100644
--- a/vs/bruno.html
+++ b/vs/bruno.html
@@ -64,8 +64,15 @@
{
"@context": "https://schema.org",
"@type": "Organization",
+ "@id": "https://mockforge.dev/#organization",
"name": "MockForge",
"url": "https://mockforge.dev/",
+ "parentOrganization": {
+ "@type": "Organization",
+ "@id": "https://saasierinc.com/#organization",
+ "name": "SaaSier Inc",
+ "url": "https://saasierinc.com"
+ },
"logo": "https://mockforge.dev/public/logo-transparent.png",
"description": "Open-source API mocking framework for REST, gRPC, GraphQL, WebSockets, and SMTP.",
"sameAs": [
diff --git a/vs/microcks.html b/vs/microcks.html
index 1bce0c9..89bdb92 100644
--- a/vs/microcks.html
+++ b/vs/microcks.html
@@ -64,8 +64,15 @@
{
"@context": "https://schema.org",
"@type": "Organization",
+ "@id": "https://mockforge.dev/#organization",
"name": "MockForge",
"url": "https://mockforge.dev/",
+ "parentOrganization": {
+ "@type": "Organization",
+ "@id": "https://saasierinc.com/#organization",
+ "name": "SaaSier Inc",
+ "url": "https://saasierinc.com"
+ },
"logo": "https://mockforge.dev/public/logo-transparent.png",
"description": "Open-source API mocking framework for REST, gRPC, GraphQL, WebSockets, and SMTP.",
"sameAs": [
diff --git a/vs/mockoon.html b/vs/mockoon.html
index 7529087..4715f3c 100644
--- a/vs/mockoon.html
+++ b/vs/mockoon.html
@@ -64,8 +64,15 @@
{
"@context": "https://schema.org",
"@type": "Organization",
+ "@id": "https://mockforge.dev/#organization",
"name": "MockForge",
"url": "https://mockforge.dev/",
+ "parentOrganization": {
+ "@type": "Organization",
+ "@id": "https://saasierinc.com/#organization",
+ "name": "SaaSier Inc",
+ "url": "https://saasierinc.com"
+ },
"logo": "https://mockforge.dev/public/logo-transparent.png",
"description": "Open-source API mocking framework for REST, gRPC, GraphQL, WebSockets, and SMTP.",
"sameAs": [
diff --git a/vs/postman-mock.html b/vs/postman-mock.html
index 769cf0e..bb8b34b 100644
--- a/vs/postman-mock.html
+++ b/vs/postman-mock.html
@@ -64,8 +64,15 @@
{
"@context": "https://schema.org",
"@type": "Organization",
+ "@id": "https://mockforge.dev/#organization",
"name": "MockForge",
"url": "https://mockforge.dev/",
+ "parentOrganization": {
+ "@type": "Organization",
+ "@id": "https://saasierinc.com/#organization",
+ "name": "SaaSier Inc",
+ "url": "https://saasierinc.com"
+ },
"logo": "https://mockforge.dev/public/logo-transparent.png",
"description": "Open-source API mocking framework for REST, gRPC, GraphQL, WebSockets, and SMTP.",
"sameAs": [
diff --git a/vs/wiremock.html b/vs/wiremock.html
index 763c339..3823e1a 100644
--- a/vs/wiremock.html
+++ b/vs/wiremock.html
@@ -64,8 +64,15 @@
{
"@context": "https://schema.org",
"@type": "Organization",
+ "@id": "https://mockforge.dev/#organization",
"name": "MockForge",
"url": "https://mockforge.dev/",
+ "parentOrganization": {
+ "@type": "Organization",
+ "@id": "https://saasierinc.com/#organization",
+ "name": "SaaSier Inc",
+ "url": "https://saasierinc.com"
+ },
"logo": "https://mockforge.dev/public/logo-transparent.png",
"description": "Open-source API mocking framework for REST, gRPC, GraphQL, WebSockets, and SMTP.",
"sameAs": [