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": [