diff --git a/docs/pages/sdk/v5_3_x/VersionWarning.tsx b/docs/components/VersionWarning.tsx
similarity index 100%
rename from docs/pages/sdk/v5_3_x/VersionWarning.tsx
rename to docs/components/VersionWarning.tsx
diff --git a/docs/pages/shared/mutation-result.mdx b/docs/components/shared/mutation-result.mdx
similarity index 100%
rename from docs/pages/shared/mutation-result.mdx
rename to docs/components/shared/mutation-result.mdx
diff --git a/docs/pages/shared/query-result.mdx b/docs/components/shared/query-result.mdx
similarity index 100%
rename from docs/pages/shared/query-result.mdx
rename to docs/components/shared/query-result.mdx
diff --git a/docs/pages/shared/social-login-setup.mdx b/docs/components/shared/social-login-setup.mdx
similarity index 100%
rename from docs/pages/shared/social-login-setup.mdx
rename to docs/components/shared/social-login-setup.mdx
diff --git a/docs/pages/advanced/react-hooks/use-balance.mdx b/docs/pages/advanced/react-hooks/use-balance.mdx
index 447018c3..4370ea8e 100644
--- a/docs/pages/advanced/react-hooks/use-balance.mdx
+++ b/docs/pages/advanced/react-hooks/use-balance.mdx
@@ -1,4 +1,4 @@
-import QueryResult from "../../shared/query-result.mdx"
+import QueryResult from "@components/shared/query-result.mdx"
# useBalance [Hook for getting balance of kernel account]
diff --git a/docs/pages/advanced/react-hooks/use-create-basic-session.mdx b/docs/pages/advanced/react-hooks/use-create-basic-session.mdx
index 4e629ceb..60c818d5 100644
--- a/docs/pages/advanced/react-hooks/use-create-basic-session.mdx
+++ b/docs/pages/advanced/react-hooks/use-create-basic-session.mdx
@@ -1,4 +1,4 @@
-import MutationResult from '../../shared/mutation-result.mdx'
+import MutationResult from "@components/shared/mutation-result.mdx"
# useCreateBasicSession [Hook for creating session for kernel v2 account]
diff --git a/docs/pages/advanced/react-hooks/use-create-kernelclient-eoa.mdx b/docs/pages/advanced/react-hooks/use-create-kernelclient-eoa.mdx
index 4729e6a7..910f9a69 100644
--- a/docs/pages/advanced/react-hooks/use-create-kernelclient-eoa.mdx
+++ b/docs/pages/advanced/react-hooks/use-create-kernelclient-eoa.mdx
@@ -1,4 +1,4 @@
-import MutationResult from '../../shared/mutation-result.mdx'
+import MutationResult from "@components/shared/mutation-result.mdx"
# useCreateKernelClientEOA [Hook for creating kernel client with EOA]
diff --git a/docs/pages/advanced/react-hooks/use-create-kernelclient-passkey.mdx b/docs/pages/advanced/react-hooks/use-create-kernelclient-passkey.mdx
index cb4a6658..3c6f1043 100644
--- a/docs/pages/advanced/react-hooks/use-create-kernelclient-passkey.mdx
+++ b/docs/pages/advanced/react-hooks/use-create-kernelclient-passkey.mdx
@@ -1,4 +1,4 @@
-import MutationResult from '../../shared/mutation-result.mdx'
+import MutationResult from "@components/shared/mutation-result.mdx"
# useCreateKernelClientPasskey [Hook for creating kernel client with Passkey]
diff --git a/docs/pages/advanced/react-hooks/use-create-kernelclient-social.mdx b/docs/pages/advanced/react-hooks/use-create-kernelclient-social.mdx
index b00f7322..8336d311 100644
--- a/docs/pages/advanced/react-hooks/use-create-kernelclient-social.mdx
+++ b/docs/pages/advanced/react-hooks/use-create-kernelclient-social.mdx
@@ -1,4 +1,4 @@
-import MutationResult from '../../shared/mutation-result.mdx'
+import MutationResult from "@components/shared/mutation-result.mdx"
# useCreateKernelClientSocial [Hook for creating a kernel client with social login integration]
diff --git a/docs/pages/advanced/react-hooks/use-create-session.mdx b/docs/pages/advanced/react-hooks/use-create-session.mdx
index 05caf43c..4cf9f3f0 100644
--- a/docs/pages/advanced/react-hooks/use-create-session.mdx
+++ b/docs/pages/advanced/react-hooks/use-create-session.mdx
@@ -1,4 +1,4 @@
-import MutationResult from '../../shared/mutation-result.mdx'
+import MutationResult from "@components/shared/mutation-result.mdx"
# useCreateSession [Hook for creating session for kernel v3 account]
diff --git a/docs/pages/advanced/react-hooks/use-disconnect-kernelclient.mdx b/docs/pages/advanced/react-hooks/use-disconnect-kernelclient.mdx
index 08640084..eac758bb 100644
--- a/docs/pages/advanced/react-hooks/use-disconnect-kernelclient.mdx
+++ b/docs/pages/advanced/react-hooks/use-disconnect-kernelclient.mdx
@@ -1,4 +1,4 @@
-import MutationResult from '../../shared/mutation-result.mdx'
+import MutationResult from "@components/shared/mutation-result.mdx"
# useDisconnectKernelClient [Hook for disconnecting kernel account client]
diff --git a/docs/pages/advanced/react-hooks/use-kernelclient.mdx b/docs/pages/advanced/react-hooks/use-kernelclient.mdx
index 6dc91bf8..ec45a709 100644
--- a/docs/pages/advanced/react-hooks/use-kernelclient.mdx
+++ b/docs/pages/advanced/react-hooks/use-kernelclient.mdx
@@ -1,4 +1,4 @@
-import QueryResult from "../../shared/query-result.mdx"
+import QueryResult from "@components/shared/query-result.mdx"
# useKernelClient [Hook for getting kernel account client]
diff --git a/docs/pages/advanced/react-hooks/use-send-transaction-with-session.mdx b/docs/pages/advanced/react-hooks/use-send-transaction-with-session.mdx
index 98d864a2..63be83f2 100644
--- a/docs/pages/advanced/react-hooks/use-send-transaction-with-session.mdx
+++ b/docs/pages/advanced/react-hooks/use-send-transaction-with-session.mdx
@@ -1,4 +1,4 @@
-import MutationResult from '../../shared/mutation-result.mdx'
+import MutationResult from "@components/shared/mutation-result.mdx"
# useSendTransactionWithSession [Hooks for sending transactions with session keys]
diff --git a/docs/pages/advanced/react-hooks/use-send-transaction.mdx b/docs/pages/advanced/react-hooks/use-send-transaction.mdx
index 00d06d8f..c4f93a41 100644
--- a/docs/pages/advanced/react-hooks/use-send-transaction.mdx
+++ b/docs/pages/advanced/react-hooks/use-send-transaction.mdx
@@ -1,4 +1,4 @@
-import MutationResult from '../../shared/mutation-result.mdx'
+import MutationResult from "@components/shared/mutation-result.mdx"
# useSendTransaction [Hook for sending transaction]
diff --git a/docs/pages/advanced/react-hooks/use-send-useroperation-with-session.mdx b/docs/pages/advanced/react-hooks/use-send-useroperation-with-session.mdx
index 0be5d956..741b0a52 100644
--- a/docs/pages/advanced/react-hooks/use-send-useroperation-with-session.mdx
+++ b/docs/pages/advanced/react-hooks/use-send-useroperation-with-session.mdx
@@ -1,4 +1,4 @@
-import MutationResult from '../../shared/mutation-result.mdx'
+import MutationResult from "@components/shared/mutation-result.mdx"
# useSendUserOperationWithSession [Hooks for sending user operation with session keys]
diff --git a/docs/pages/advanced/react-hooks/use-send-useroperation.mdx b/docs/pages/advanced/react-hooks/use-send-useroperation.mdx
index 8bfa859b..105af9ed 100644
--- a/docs/pages/advanced/react-hooks/use-send-useroperation.mdx
+++ b/docs/pages/advanced/react-hooks/use-send-useroperation.mdx
@@ -1,4 +1,4 @@
-import MutationResult from '../../shared/mutation-result.mdx'
+import MutationResult from "@components/shared/mutation-result.mdx"
# useSendUserOperation [Hook for sending user operation]
diff --git a/docs/pages/advanced/react-hooks/use-session-kernelclient.mdx b/docs/pages/advanced/react-hooks/use-session-kernelclient.mdx
index 85164f89..55c62588 100644
--- a/docs/pages/advanced/react-hooks/use-session-kernelclient.mdx
+++ b/docs/pages/advanced/react-hooks/use-session-kernelclient.mdx
@@ -1,4 +1,4 @@
-import QueryResult from "../../shared/query-result.mdx"
+import QueryResult from "@components/shared/query-result.mdx"
# useSessionKernelClient [Hook for getting kernel account client with session plugin]
diff --git a/docs/pages/advanced/react-hooks/use-set-kernelclient.mdx b/docs/pages/advanced/react-hooks/use-set-kernelclient.mdx
index 738b3b3e..c97fedcd 100644
--- a/docs/pages/advanced/react-hooks/use-set-kernelclient.mdx
+++ b/docs/pages/advanced/react-hooks/use-set-kernelclient.mdx
@@ -1,4 +1,4 @@
-import MutationResult from '../../shared/mutation-result.mdx'
+import MutationResult from "@components/shared/mutation-result.mdx"
# useSetKernelClient [Hook for setting kernel account client]
diff --git a/docs/pages/advanced/react-hooks/use-switch-chain.mdx b/docs/pages/advanced/react-hooks/use-switch-chain.mdx
index 032c61c0..2a8aef82 100644
--- a/docs/pages/advanced/react-hooks/use-switch-chain.mdx
+++ b/docs/pages/advanced/react-hooks/use-switch-chain.mdx
@@ -1,4 +1,4 @@
-import MutationResult from '../../shared/mutation-result.mdx'
+import MutationResult from "@components/shared/mutation-result.mdx"
# useSwitchChain [Hook for switching chain]
diff --git a/docs/pages/onboarding/social-login.mdx b/docs/pages/onboarding/social-login.mdx
index fbe9b1a6..e77f3d6b 100644
--- a/docs/pages/onboarding/social-login.mdx
+++ b/docs/pages/onboarding/social-login.mdx
@@ -1,4 +1,4 @@
-import SocialLoginSetup from '../shared/social-login-setup.mdx'
+import SocialLoginSetup from "@components/shared/social-login-setup.mdx"
# Social Login [Social login allows users to authenticate using their existing social media accounts such as Google or Facebook.]
diff --git a/docs/pages/sdk/v5_3_x/advanced/chain-abstraction.mdx b/docs/pages/sdk/v5_3_x/advanced/chain-abstraction.mdx
index ff705247..80878481 100644
--- a/docs/pages/sdk/v5_3_x/advanced/chain-abstraction.mdx
+++ b/docs/pages/sdk/v5_3_x/advanced/chain-abstraction.mdx
@@ -1,4 +1,4 @@
-import VersionWarning from "../VersionWarning"
+import VersionWarning from "@components/VersionWarning"
diff --git a/docs/pages/sdk/v5_3_x/advanced/defi.mdx b/docs/pages/sdk/v5_3_x/advanced/defi.mdx
index 70438893..1e4d97ec 100644
--- a/docs/pages/sdk/v5_3_x/advanced/defi.mdx
+++ b/docs/pages/sdk/v5_3_x/advanced/defi.mdx
@@ -1,4 +1,4 @@
-import VersionWarning from "../VersionWarning"
+import VersionWarning from "@components/VersionWarning"
diff --git a/docs/pages/sdk/v5_3_x/advanced/fallback-providers.mdx b/docs/pages/sdk/v5_3_x/advanced/fallback-providers.mdx
index 9f0b486e..73b623c7 100644
--- a/docs/pages/sdk/v5_3_x/advanced/fallback-providers.mdx
+++ b/docs/pages/sdk/v5_3_x/advanced/fallback-providers.mdx
@@ -1,4 +1,4 @@
-import VersionWarning from "../VersionWarning"
+import VersionWarning from "@components/VersionWarning"
diff --git a/docs/pages/sdk/v5_3_x/advanced/key-storage.mdx b/docs/pages/sdk/v5_3_x/advanced/key-storage.mdx
index bbb5bb0e..56e57c16 100644
--- a/docs/pages/sdk/v5_3_x/advanced/key-storage.mdx
+++ b/docs/pages/sdk/v5_3_x/advanced/key-storage.mdx
@@ -1,4 +1,4 @@
-import VersionWarning from "../VersionWarning"
+import VersionWarning from "@components/VersionWarning"
diff --git a/docs/pages/sdk/v5_3_x/advanced/multi-chain-signing.mdx b/docs/pages/sdk/v5_3_x/advanced/multi-chain-signing.mdx
index 410790cf..9b316e19 100644
--- a/docs/pages/sdk/v5_3_x/advanced/multi-chain-signing.mdx
+++ b/docs/pages/sdk/v5_3_x/advanced/multi-chain-signing.mdx
@@ -1,4 +1,4 @@
-import VersionWarning from "../VersionWarning"
+import VersionWarning from "@components/VersionWarning"
diff --git a/docs/pages/sdk/v5_3_x/advanced/multisig.mdx b/docs/pages/sdk/v5_3_x/advanced/multisig.mdx
index 194576c4..50e8e648 100644
--- a/docs/pages/sdk/v5_3_x/advanced/multisig.mdx
+++ b/docs/pages/sdk/v5_3_x/advanced/multisig.mdx
@@ -1,4 +1,4 @@
-import VersionWarning from "../VersionWarning"
+import VersionWarning from "@components/VersionWarning"
diff --git a/docs/pages/sdk/v5_3_x/advanced/parallel-orders.mdx b/docs/pages/sdk/v5_3_x/advanced/parallel-orders.mdx
index 7f9a0abf..106a11af 100644
--- a/docs/pages/sdk/v5_3_x/advanced/parallel-orders.mdx
+++ b/docs/pages/sdk/v5_3_x/advanced/parallel-orders.mdx
@@ -1,4 +1,4 @@
-import VersionWarning from "../VersionWarning"
+import VersionWarning from "@components/VersionWarning"
diff --git a/docs/pages/sdk/v5_3_x/advanced/passkeys.mdx b/docs/pages/sdk/v5_3_x/advanced/passkeys.mdx
index c6bf245d..0e18495d 100644
--- a/docs/pages/sdk/v5_3_x/advanced/passkeys.mdx
+++ b/docs/pages/sdk/v5_3_x/advanced/passkeys.mdx
@@ -1,4 +1,4 @@
-import VersionWarning from "../VersionWarning"
+import VersionWarning from "@components/VersionWarning"
diff --git a/docs/pages/sdk/v5_3_x/advanced/recovery.mdx b/docs/pages/sdk/v5_3_x/advanced/recovery.mdx
index 8f21a554..2d6c34a7 100644
--- a/docs/pages/sdk/v5_3_x/advanced/recovery.mdx
+++ b/docs/pages/sdk/v5_3_x/advanced/recovery.mdx
@@ -1,4 +1,4 @@
-import VersionWarning from "../VersionWarning"
+import VersionWarning from "@components/VersionWarning"
diff --git a/docs/pages/sdk/v5_3_x/advanced/session-keys.mdx b/docs/pages/sdk/v5_3_x/advanced/session-keys.mdx
index 6ec4b4fd..01f8b5be 100644
--- a/docs/pages/sdk/v5_3_x/advanced/session-keys.mdx
+++ b/docs/pages/sdk/v5_3_x/advanced/session-keys.mdx
@@ -1,4 +1,4 @@
-import VersionWarning from "../VersionWarning"
+import VersionWarning from "@components/VersionWarning"
diff --git a/docs/pages/sdk/v5_3_x/advanced/social-login.mdx b/docs/pages/sdk/v5_3_x/advanced/social-login.mdx
index 98690470..da13da48 100644
--- a/docs/pages/sdk/v5_3_x/advanced/social-login.mdx
+++ b/docs/pages/sdk/v5_3_x/advanced/social-login.mdx
@@ -1,6 +1,6 @@
-import SocialLoginSetup from '../../../shared/social-login-setup.mdx'
+import SocialLoginSetup from "@components/shared/social-login-setup.mdx"
-import VersionWarning from "../VersionWarning"
+import VersionWarning from "@components/VersionWarning"
diff --git a/docs/pages/sdk/v5_3_x/advanced/supported-base-tokens.mdx b/docs/pages/sdk/v5_3_x/advanced/supported-base-tokens.mdx
index f1d4c8a3..0c2ab9a8 100644
--- a/docs/pages/sdk/v5_3_x/advanced/supported-base-tokens.mdx
+++ b/docs/pages/sdk/v5_3_x/advanced/supported-base-tokens.mdx
@@ -1,4 +1,4 @@
-import VersionWarning from "../VersionWarning"
+import VersionWarning from "@components/VersionWarning"
diff --git a/docs/pages/sdk/v5_3_x/advanced/supported-defi-tokens.mdx b/docs/pages/sdk/v5_3_x/advanced/supported-defi-tokens.mdx
index f4b8cd95..88c0008e 100644
--- a/docs/pages/sdk/v5_3_x/advanced/supported-defi-tokens.mdx
+++ b/docs/pages/sdk/v5_3_x/advanced/supported-defi-tokens.mdx
@@ -1,4 +1,4 @@
-import VersionWarning from "../VersionWarning"
+import VersionWarning from "@components/VersionWarning"
diff --git a/docs/pages/sdk/v5_3_x/advanced/wallet-connect.mdx b/docs/pages/sdk/v5_3_x/advanced/wallet-connect.mdx
index ec1fb784..3a7fd5a2 100644
--- a/docs/pages/sdk/v5_3_x/advanced/wallet-connect.mdx
+++ b/docs/pages/sdk/v5_3_x/advanced/wallet-connect.mdx
@@ -1,4 +1,4 @@
-import VersionWarning from "../VersionWarning"
+import VersionWarning from "@components/VersionWarning"
diff --git a/docs/pages/sdk/v5_3_x/core-api/batch-transactions.mdx b/docs/pages/sdk/v5_3_x/core-api/batch-transactions.mdx
index 6f9e03ab..96b22987 100644
--- a/docs/pages/sdk/v5_3_x/core-api/batch-transactions.mdx
+++ b/docs/pages/sdk/v5_3_x/core-api/batch-transactions.mdx
@@ -1,4 +1,4 @@
-import VersionWarning from "../VersionWarning"
+import VersionWarning from "@components/VersionWarning"
diff --git a/docs/pages/sdk/v5_3_x/core-api/create-account.mdx b/docs/pages/sdk/v5_3_x/core-api/create-account.mdx
index 8199f214..1aecf3b5 100644
--- a/docs/pages/sdk/v5_3_x/core-api/create-account.mdx
+++ b/docs/pages/sdk/v5_3_x/core-api/create-account.mdx
@@ -1,4 +1,4 @@
-import VersionWarning from "../VersionWarning"
+import VersionWarning from "@components/VersionWarning"
diff --git a/docs/pages/sdk/v5_3_x/core-api/delegatecall.mdx b/docs/pages/sdk/v5_3_x/core-api/delegatecall.mdx
index 8f69b35c..1d84cbae 100644
--- a/docs/pages/sdk/v5_3_x/core-api/delegatecall.mdx
+++ b/docs/pages/sdk/v5_3_x/core-api/delegatecall.mdx
@@ -1,4 +1,4 @@
-import VersionWarning from "../VersionWarning"
+import VersionWarning from "@components/VersionWarning"
diff --git a/docs/pages/sdk/v5_3_x/core-api/deploy-contract.mdx b/docs/pages/sdk/v5_3_x/core-api/deploy-contract.mdx
index 724a0a49..3588cf09 100644
--- a/docs/pages/sdk/v5_3_x/core-api/deploy-contract.mdx
+++ b/docs/pages/sdk/v5_3_x/core-api/deploy-contract.mdx
@@ -1,4 +1,4 @@
-import VersionWarning from "../VersionWarning"
+import VersionWarning from "@components/VersionWarning"
diff --git a/docs/pages/sdk/v5_3_x/core-api/pay-gas-with-erc20s.mdx b/docs/pages/sdk/v5_3_x/core-api/pay-gas-with-erc20s.mdx
index 1c196c77..2d6b88a8 100644
--- a/docs/pages/sdk/v5_3_x/core-api/pay-gas-with-erc20s.mdx
+++ b/docs/pages/sdk/v5_3_x/core-api/pay-gas-with-erc20s.mdx
@@ -1,4 +1,4 @@
-import VersionWarning from "../VersionWarning"
+import VersionWarning from "@components/VersionWarning"
diff --git a/docs/pages/sdk/v5_3_x/core-api/send-transactions.mdx b/docs/pages/sdk/v5_3_x/core-api/send-transactions.mdx
index 147b25f0..6acd6aca 100644
--- a/docs/pages/sdk/v5_3_x/core-api/send-transactions.mdx
+++ b/docs/pages/sdk/v5_3_x/core-api/send-transactions.mdx
@@ -1,4 +1,4 @@
-import VersionWarning from "../VersionWarning"
+import VersionWarning from "@components/VersionWarning"
diff --git a/docs/pages/sdk/v5_3_x/core-api/sign-and-verify.mdx b/docs/pages/sdk/v5_3_x/core-api/sign-and-verify.mdx
index a6b839cf..a6cd0344 100644
--- a/docs/pages/sdk/v5_3_x/core-api/sign-and-verify.mdx
+++ b/docs/pages/sdk/v5_3_x/core-api/sign-and-verify.mdx
@@ -1,4 +1,4 @@
-import VersionWarning from "../VersionWarning"
+import VersionWarning from "@components/VersionWarning"
diff --git a/docs/pages/sdk/v5_3_x/core-api/sponsor-gas.mdx b/docs/pages/sdk/v5_3_x/core-api/sponsor-gas.mdx
index 8510cb4c..0a8ce89d 100644
--- a/docs/pages/sdk/v5_3_x/core-api/sponsor-gas.mdx
+++ b/docs/pages/sdk/v5_3_x/core-api/sponsor-gas.mdx
@@ -1,4 +1,4 @@
-import VersionWarning from "../VersionWarning"
+import VersionWarning from "@components/VersionWarning"
diff --git a/docs/pages/sdk/v5_3_x/core-api/using-plugins.mdx b/docs/pages/sdk/v5_3_x/core-api/using-plugins.mdx
index 0f70d6ad..07bc50bb 100644
--- a/docs/pages/sdk/v5_3_x/core-api/using-plugins.mdx
+++ b/docs/pages/sdk/v5_3_x/core-api/using-plugins.mdx
@@ -1,4 +1,4 @@
-import VersionWarning from "../VersionWarning"
+import VersionWarning from "@components/VersionWarning"
diff --git a/docs/pages/sdk/v5_3_x/faqs/audits.mdx b/docs/pages/sdk/v5_3_x/faqs/audits.mdx
index 30107382..27d8c54b 100644
--- a/docs/pages/sdk/v5_3_x/faqs/audits.mdx
+++ b/docs/pages/sdk/v5_3_x/faqs/audits.mdx
@@ -1,4 +1,4 @@
-import VersionWarning from "../VersionWarning"
+import VersionWarning from "@components/VersionWarning"
diff --git a/docs/pages/sdk/v5_3_x/faqs/chains.mdx b/docs/pages/sdk/v5_3_x/faqs/chains.mdx
index 61ba6e7b..9e64857e 100644
--- a/docs/pages/sdk/v5_3_x/faqs/chains.mdx
+++ b/docs/pages/sdk/v5_3_x/faqs/chains.mdx
@@ -1,4 +1,4 @@
-import VersionWarning from "../VersionWarning"
+import VersionWarning from "@components/VersionWarning"
diff --git a/docs/pages/sdk/v5_3_x/faqs/debug-userop.mdx b/docs/pages/sdk/v5_3_x/faqs/debug-userop.mdx
index c016fdcb..4cacb064 100644
--- a/docs/pages/sdk/v5_3_x/faqs/debug-userop.mdx
+++ b/docs/pages/sdk/v5_3_x/faqs/debug-userop.mdx
@@ -1,4 +1,4 @@
-import VersionWarning from "../VersionWarning"
+import VersionWarning from "@components/VersionWarning"
diff --git a/docs/pages/sdk/v5_3_x/faqs/use-with-ethers.mdx b/docs/pages/sdk/v5_3_x/faqs/use-with-ethers.mdx
index 34207bce..3276d42d 100644
--- a/docs/pages/sdk/v5_3_x/faqs/use-with-ethers.mdx
+++ b/docs/pages/sdk/v5_3_x/faqs/use-with-ethers.mdx
@@ -1,4 +1,4 @@
-import VersionWarning from "../VersionWarning"
+import VersionWarning from "@components/VersionWarning"
diff --git a/docs/pages/sdk/v5_3_x/faqs/use-with-gelato.mdx b/docs/pages/sdk/v5_3_x/faqs/use-with-gelato.mdx
index 4a2ba319..5ad3034d 100644
--- a/docs/pages/sdk/v5_3_x/faqs/use-with-gelato.mdx
+++ b/docs/pages/sdk/v5_3_x/faqs/use-with-gelato.mdx
@@ -1,4 +1,4 @@
-import VersionWarning from "../VersionWarning"
+import VersionWarning from "@components/VersionWarning"
diff --git a/docs/pages/sdk/v5_3_x/faqs/use-with-react-native.mdx b/docs/pages/sdk/v5_3_x/faqs/use-with-react-native.mdx
index 275eea26..2444fb7f 100644
--- a/docs/pages/sdk/v5_3_x/faqs/use-with-react-native.mdx
+++ b/docs/pages/sdk/v5_3_x/faqs/use-with-react-native.mdx
@@ -1,4 +1,4 @@
-import VersionWarning from "../VersionWarning"
+import VersionWarning from "@components/VersionWarning"
diff --git a/docs/pages/sdk/v5_3_x/getting-started/migration.mdx b/docs/pages/sdk/v5_3_x/getting-started/migration.mdx
index d7edd563..8e009648 100644
--- a/docs/pages/sdk/v5_3_x/getting-started/migration.mdx
+++ b/docs/pages/sdk/v5_3_x/getting-started/migration.mdx
@@ -1,4 +1,4 @@
-import VersionWarning from "../VersionWarning"
+import VersionWarning from "@components/VersionWarning"
diff --git a/docs/pages/sdk/v5_3_x/getting-started/quickstart.mdx b/docs/pages/sdk/v5_3_x/getting-started/quickstart.mdx
index be4963f3..727ed1f5 100644
--- a/docs/pages/sdk/v5_3_x/getting-started/quickstart.mdx
+++ b/docs/pages/sdk/v5_3_x/getting-started/quickstart.mdx
@@ -1,4 +1,4 @@
-import VersionWarning from "../VersionWarning"
+import VersionWarning from "@components/VersionWarning"
diff --git a/docs/pages/sdk/v5_3_x/getting-started/tutorial-passkeys.mdx b/docs/pages/sdk/v5_3_x/getting-started/tutorial-passkeys.mdx
index 8ea47dc3..6c326cce 100644
--- a/docs/pages/sdk/v5_3_x/getting-started/tutorial-passkeys.mdx
+++ b/docs/pages/sdk/v5_3_x/getting-started/tutorial-passkeys.mdx
@@ -1,4 +1,4 @@
-import VersionWarning from "../VersionWarning"
+import VersionWarning from "@components/VersionWarning"
diff --git a/docs/pages/sdk/v5_3_x/getting-started/tutorial.mdx b/docs/pages/sdk/v5_3_x/getting-started/tutorial.mdx
index 3601bb74..7151c1bb 100644
--- a/docs/pages/sdk/v5_3_x/getting-started/tutorial.mdx
+++ b/docs/pages/sdk/v5_3_x/getting-started/tutorial.mdx
@@ -1,4 +1,4 @@
-import VersionWarning from "../VersionWarning"
+import VersionWarning from "@components/VersionWarning"
diff --git a/docs/pages/sdk/v5_3_x/index.mdx b/docs/pages/sdk/v5_3_x/index.mdx
index 735742b1..f29a8d0f 100644
--- a/docs/pages/sdk/v5_3_x/index.mdx
+++ b/docs/pages/sdk/v5_3_x/index.mdx
@@ -1,4 +1,4 @@
-import VersionWarning from "./VersionWarning"
+import VersionWarning from "@components/VersionWarning"
diff --git a/docs/pages/sdk/v5_3_x/infra/coinbase.mdx b/docs/pages/sdk/v5_3_x/infra/coinbase.mdx
index f5da7939..e390617f 100644
--- a/docs/pages/sdk/v5_3_x/infra/coinbase.mdx
+++ b/docs/pages/sdk/v5_3_x/infra/coinbase.mdx
@@ -1,4 +1,4 @@
-import VersionWarning from "../VersionWarning"
+import VersionWarning from "@components/VersionWarning"
diff --git a/docs/pages/sdk/v5_3_x/infra/intro.mdx b/docs/pages/sdk/v5_3_x/infra/intro.mdx
index da23c12d..c9476f69 100644
--- a/docs/pages/sdk/v5_3_x/infra/intro.mdx
+++ b/docs/pages/sdk/v5_3_x/infra/intro.mdx
@@ -1,4 +1,4 @@
-import VersionWarning from "../VersionWarning"
+import VersionWarning from "@components/VersionWarning"
diff --git a/docs/pages/sdk/v5_3_x/infra/pimlico.mdx b/docs/pages/sdk/v5_3_x/infra/pimlico.mdx
index 7e89a5d9..5b2deed4 100644
--- a/docs/pages/sdk/v5_3_x/infra/pimlico.mdx
+++ b/docs/pages/sdk/v5_3_x/infra/pimlico.mdx
@@ -1,4 +1,4 @@
-import VersionWarning from "../VersionWarning"
+import VersionWarning from "@components/VersionWarning"
diff --git a/docs/pages/sdk/v5_3_x/infra/zerodev.mdx b/docs/pages/sdk/v5_3_x/infra/zerodev.mdx
index cbaa42d7..36bba83c 100644
--- a/docs/pages/sdk/v5_3_x/infra/zerodev.mdx
+++ b/docs/pages/sdk/v5_3_x/infra/zerodev.mdx
@@ -1,4 +1,4 @@
-import VersionWarning from "../VersionWarning"
+import VersionWarning from "@components/VersionWarning"
diff --git a/docs/pages/sdk/v5_3_x/permissions/1-click-trading.mdx b/docs/pages/sdk/v5_3_x/permissions/1-click-trading.mdx
index 0a1ebb6f..75b10789 100644
--- a/docs/pages/sdk/v5_3_x/permissions/1-click-trading.mdx
+++ b/docs/pages/sdk/v5_3_x/permissions/1-click-trading.mdx
@@ -1,4 +1,4 @@
-import VersionWarning from "../VersionWarning"
+import VersionWarning from "@components/VersionWarning"
diff --git a/docs/pages/sdk/v5_3_x/permissions/actions/build-your-own.mdx b/docs/pages/sdk/v5_3_x/permissions/actions/build-your-own.mdx
index 5ee3d440..f6aeaca6 100644
--- a/docs/pages/sdk/v5_3_x/permissions/actions/build-your-own.mdx
+++ b/docs/pages/sdk/v5_3_x/permissions/actions/build-your-own.mdx
@@ -1,4 +1,4 @@
-import VersionWarning from "../../VersionWarning"
+import VersionWarning from "@components/VersionWarning"
diff --git a/docs/pages/sdk/v5_3_x/permissions/intro.mdx b/docs/pages/sdk/v5_3_x/permissions/intro.mdx
index 219e03eb..816e491c 100644
--- a/docs/pages/sdk/v5_3_x/permissions/intro.mdx
+++ b/docs/pages/sdk/v5_3_x/permissions/intro.mdx
@@ -1,4 +1,4 @@
-import VersionWarning from "../VersionWarning"
+import VersionWarning from "@components/VersionWarning"
diff --git a/docs/pages/sdk/v5_3_x/permissions/policies/build-your-own.mdx b/docs/pages/sdk/v5_3_x/permissions/policies/build-your-own.mdx
index 5b7b0aa3..d659dea0 100644
--- a/docs/pages/sdk/v5_3_x/permissions/policies/build-your-own.mdx
+++ b/docs/pages/sdk/v5_3_x/permissions/policies/build-your-own.mdx
@@ -1,4 +1,4 @@
-import VersionWarning from "../../VersionWarning"
+import VersionWarning from "@components/VersionWarning"
diff --git a/docs/pages/sdk/v5_3_x/permissions/policies/call.mdx b/docs/pages/sdk/v5_3_x/permissions/policies/call.mdx
index 7fe8c6fa..656033f5 100644
--- a/docs/pages/sdk/v5_3_x/permissions/policies/call.mdx
+++ b/docs/pages/sdk/v5_3_x/permissions/policies/call.mdx
@@ -1,4 +1,4 @@
-import VersionWarning from "../../VersionWarning"
+import VersionWarning from "@components/VersionWarning"
diff --git a/docs/pages/sdk/v5_3_x/permissions/policies/gas.mdx b/docs/pages/sdk/v5_3_x/permissions/policies/gas.mdx
index ca160f83..ebd375e4 100644
--- a/docs/pages/sdk/v5_3_x/permissions/policies/gas.mdx
+++ b/docs/pages/sdk/v5_3_x/permissions/policies/gas.mdx
@@ -1,4 +1,4 @@
-import VersionWarning from "../../VersionWarning"
+import VersionWarning from "@components/VersionWarning"
diff --git a/docs/pages/sdk/v5_3_x/permissions/policies/rate-limit.mdx b/docs/pages/sdk/v5_3_x/permissions/policies/rate-limit.mdx
index 6688266e..713d5eb1 100644
--- a/docs/pages/sdk/v5_3_x/permissions/policies/rate-limit.mdx
+++ b/docs/pages/sdk/v5_3_x/permissions/policies/rate-limit.mdx
@@ -1,4 +1,4 @@
-import VersionWarning from "../../VersionWarning"
+import VersionWarning from "@components/VersionWarning"
diff --git a/docs/pages/sdk/v5_3_x/permissions/policies/signature.mdx b/docs/pages/sdk/v5_3_x/permissions/policies/signature.mdx
index 3c612067..5aabaafd 100644
--- a/docs/pages/sdk/v5_3_x/permissions/policies/signature.mdx
+++ b/docs/pages/sdk/v5_3_x/permissions/policies/signature.mdx
@@ -1,4 +1,4 @@
-import VersionWarning from "../../VersionWarning"
+import VersionWarning from "@components/VersionWarning"
diff --git a/docs/pages/sdk/v5_3_x/permissions/policies/sudo.mdx b/docs/pages/sdk/v5_3_x/permissions/policies/sudo.mdx
index f979e098..b840b5df 100644
--- a/docs/pages/sdk/v5_3_x/permissions/policies/sudo.mdx
+++ b/docs/pages/sdk/v5_3_x/permissions/policies/sudo.mdx
@@ -1,4 +1,4 @@
-import VersionWarning from "../../VersionWarning"
+import VersionWarning from "@components/VersionWarning"
diff --git a/docs/pages/sdk/v5_3_x/permissions/policies/timestamp.mdx b/docs/pages/sdk/v5_3_x/permissions/policies/timestamp.mdx
index f3c6ab0d..26d5f4f4 100644
--- a/docs/pages/sdk/v5_3_x/permissions/policies/timestamp.mdx
+++ b/docs/pages/sdk/v5_3_x/permissions/policies/timestamp.mdx
@@ -1,4 +1,4 @@
-import VersionWarning from "../../VersionWarning"
+import VersionWarning from "@components/VersionWarning"
diff --git a/docs/pages/sdk/v5_3_x/permissions/signers/build-your-own.mdx b/docs/pages/sdk/v5_3_x/permissions/signers/build-your-own.mdx
index b5fbe3f3..3c6f23ef 100644
--- a/docs/pages/sdk/v5_3_x/permissions/signers/build-your-own.mdx
+++ b/docs/pages/sdk/v5_3_x/permissions/signers/build-your-own.mdx
@@ -1,4 +1,4 @@
-import VersionWarning from "../../VersionWarning"
+import VersionWarning from "@components/VersionWarning"
diff --git a/docs/pages/sdk/v5_3_x/permissions/signers/ecdsa.mdx b/docs/pages/sdk/v5_3_x/permissions/signers/ecdsa.mdx
index e595122c..06ff1d10 100644
--- a/docs/pages/sdk/v5_3_x/permissions/signers/ecdsa.mdx
+++ b/docs/pages/sdk/v5_3_x/permissions/signers/ecdsa.mdx
@@ -1,4 +1,4 @@
-import VersionWarning from "../../VersionWarning"
+import VersionWarning from "@components/VersionWarning"
diff --git a/docs/pages/sdk/v5_3_x/permissions/signers/multisig.mdx b/docs/pages/sdk/v5_3_x/permissions/signers/multisig.mdx
index e8e87ab2..c0ae677e 100644
--- a/docs/pages/sdk/v5_3_x/permissions/signers/multisig.mdx
+++ b/docs/pages/sdk/v5_3_x/permissions/signers/multisig.mdx
@@ -1,4 +1,4 @@
-import VersionWarning from "../../VersionWarning"
+import VersionWarning from "@components/VersionWarning"
diff --git a/docs/pages/sdk/v5_3_x/permissions/signers/passkeys.mdx b/docs/pages/sdk/v5_3_x/permissions/signers/passkeys.mdx
index ea404d2d..dec0da5e 100644
--- a/docs/pages/sdk/v5_3_x/permissions/signers/passkeys.mdx
+++ b/docs/pages/sdk/v5_3_x/permissions/signers/passkeys.mdx
@@ -1,4 +1,4 @@
-import VersionWarning from "../../VersionWarning"
+import VersionWarning from "@components/VersionWarning"
diff --git a/docs/pages/sdk/v5_3_x/permissions/transaction-automation.mdx b/docs/pages/sdk/v5_3_x/permissions/transaction-automation.mdx
index b8dacae7..5570562a 100644
--- a/docs/pages/sdk/v5_3_x/permissions/transaction-automation.mdx
+++ b/docs/pages/sdk/v5_3_x/permissions/transaction-automation.mdx
@@ -1,4 +1,4 @@
-import VersionWarning from "../VersionWarning"
+import VersionWarning from "@components/VersionWarning"
diff --git a/docs/pages/sdk/v5_3_x/presets/intro.mdx b/docs/pages/sdk/v5_3_x/presets/intro.mdx
index dd1e5bad..5cab881d 100644
--- a/docs/pages/sdk/v5_3_x/presets/intro.mdx
+++ b/docs/pages/sdk/v5_3_x/presets/intro.mdx
@@ -1,4 +1,4 @@
-import VersionWarning from "../VersionWarning"
+import VersionWarning from "@components/VersionWarning"
diff --git a/docs/pages/sdk/v5_3_x/presets/zerodev.mdx b/docs/pages/sdk/v5_3_x/presets/zerodev.mdx
index 3b069a6b..d234f1a5 100644
--- a/docs/pages/sdk/v5_3_x/presets/zerodev.mdx
+++ b/docs/pages/sdk/v5_3_x/presets/zerodev.mdx
@@ -1,4 +1,4 @@
-import VersionWarning from "../VersionWarning"
+import VersionWarning from "@components/VersionWarning"
diff --git a/docs/pages/sdk/v5_3_x/signers/arcana.mdx b/docs/pages/sdk/v5_3_x/signers/arcana.mdx
index a6ed7439..285fed71 100644
--- a/docs/pages/sdk/v5_3_x/signers/arcana.mdx
+++ b/docs/pages/sdk/v5_3_x/signers/arcana.mdx
@@ -1,4 +1,4 @@
-import VersionWarning from "../VersionWarning"
+import VersionWarning from "@components/VersionWarning"
diff --git a/docs/pages/sdk/v5_3_x/signers/capsule.mdx b/docs/pages/sdk/v5_3_x/signers/capsule.mdx
index 3f05cae4..2d4a93db 100644
--- a/docs/pages/sdk/v5_3_x/signers/capsule.mdx
+++ b/docs/pages/sdk/v5_3_x/signers/capsule.mdx
@@ -1,4 +1,4 @@
-import VersionWarning from "../VersionWarning"
+import VersionWarning from "@components/VersionWarning"
diff --git a/docs/pages/sdk/v5_3_x/signers/custom-signer.mdx b/docs/pages/sdk/v5_3_x/signers/custom-signer.mdx
index 975b376f..f0c05ee3 100644
--- a/docs/pages/sdk/v5_3_x/signers/custom-signer.mdx
+++ b/docs/pages/sdk/v5_3_x/signers/custom-signer.mdx
@@ -1,4 +1,4 @@
-import VersionWarning from "../VersionWarning"
+import VersionWarning from "@components/VersionWarning"
diff --git a/docs/pages/sdk/v5_3_x/signers/dfns.mdx b/docs/pages/sdk/v5_3_x/signers/dfns.mdx
index a3234fe2..289ef3fe 100644
--- a/docs/pages/sdk/v5_3_x/signers/dfns.mdx
+++ b/docs/pages/sdk/v5_3_x/signers/dfns.mdx
@@ -1,4 +1,4 @@
-import VersionWarning from "../VersionWarning"
+import VersionWarning from "@components/VersionWarning"
diff --git a/docs/pages/sdk/v5_3_x/signers/dynamic.mdx b/docs/pages/sdk/v5_3_x/signers/dynamic.mdx
index 620c61cf..ec9f48c8 100644
--- a/docs/pages/sdk/v5_3_x/signers/dynamic.mdx
+++ b/docs/pages/sdk/v5_3_x/signers/dynamic.mdx
@@ -1,4 +1,4 @@
-import VersionWarning from "../VersionWarning"
+import VersionWarning from "@components/VersionWarning"
diff --git a/docs/pages/sdk/v5_3_x/signers/eoa.mdx b/docs/pages/sdk/v5_3_x/signers/eoa.mdx
index ab74ec1c..884aee00 100644
--- a/docs/pages/sdk/v5_3_x/signers/eoa.mdx
+++ b/docs/pages/sdk/v5_3_x/signers/eoa.mdx
@@ -1,4 +1,4 @@
-import VersionWarning from "../VersionWarning"
+import VersionWarning from "@components/VersionWarning"
diff --git a/docs/pages/sdk/v5_3_x/signers/fireblocks.mdx b/docs/pages/sdk/v5_3_x/signers/fireblocks.mdx
index 1435381d..684c5676 100644
--- a/docs/pages/sdk/v5_3_x/signers/fireblocks.mdx
+++ b/docs/pages/sdk/v5_3_x/signers/fireblocks.mdx
@@ -1,4 +1,4 @@
-import VersionWarning from "../VersionWarning"
+import VersionWarning from "@components/VersionWarning"
diff --git a/docs/pages/sdk/v5_3_x/signers/intro.mdx b/docs/pages/sdk/v5_3_x/signers/intro.mdx
index be6cd6b7..4f432439 100644
--- a/docs/pages/sdk/v5_3_x/signers/intro.mdx
+++ b/docs/pages/sdk/v5_3_x/signers/intro.mdx
@@ -1,4 +1,4 @@
-import VersionWarning from "../VersionWarning"
+import VersionWarning from "@components/VersionWarning"
diff --git a/docs/pages/sdk/v5_3_x/signers/lit-protocol.mdx b/docs/pages/sdk/v5_3_x/signers/lit-protocol.mdx
index ae330d46..b4bcbcbc 100644
--- a/docs/pages/sdk/v5_3_x/signers/lit-protocol.mdx
+++ b/docs/pages/sdk/v5_3_x/signers/lit-protocol.mdx
@@ -1,4 +1,4 @@
-import VersionWarning from "../VersionWarning"
+import VersionWarning from "@components/VersionWarning"
diff --git a/docs/pages/sdk/v5_3_x/signers/magic.mdx b/docs/pages/sdk/v5_3_x/signers/magic.mdx
index 27edf8a2..8d6dcc9f 100644
--- a/docs/pages/sdk/v5_3_x/signers/magic.mdx
+++ b/docs/pages/sdk/v5_3_x/signers/magic.mdx
@@ -1,4 +1,4 @@
-import VersionWarning from "../VersionWarning"
+import VersionWarning from "@components/VersionWarning"
diff --git a/docs/pages/sdk/v5_3_x/signers/particle.mdx b/docs/pages/sdk/v5_3_x/signers/particle.mdx
index a14e085c..a82b3b74 100644
--- a/docs/pages/sdk/v5_3_x/signers/particle.mdx
+++ b/docs/pages/sdk/v5_3_x/signers/particle.mdx
@@ -1,4 +1,4 @@
-import VersionWarning from "../VersionWarning"
+import VersionWarning from "@components/VersionWarning"
diff --git a/docs/pages/sdk/v5_3_x/signers/portal.mdx b/docs/pages/sdk/v5_3_x/signers/portal.mdx
index df6e382e..cf97dbca 100644
--- a/docs/pages/sdk/v5_3_x/signers/portal.mdx
+++ b/docs/pages/sdk/v5_3_x/signers/portal.mdx
@@ -1,4 +1,4 @@
-import VersionWarning from "../VersionWarning"
+import VersionWarning from "@components/VersionWarning"
diff --git a/docs/pages/sdk/v5_3_x/signers/privy.mdx b/docs/pages/sdk/v5_3_x/signers/privy.mdx
index ac16d666..4f198069 100644
--- a/docs/pages/sdk/v5_3_x/signers/privy.mdx
+++ b/docs/pages/sdk/v5_3_x/signers/privy.mdx
@@ -1,4 +1,4 @@
-import VersionWarning from "../VersionWarning"
+import VersionWarning from "@components/VersionWarning"
diff --git a/docs/pages/sdk/v5_3_x/signers/turnkey.mdx b/docs/pages/sdk/v5_3_x/signers/turnkey.mdx
index 50d1b33c..b71c95fe 100644
--- a/docs/pages/sdk/v5_3_x/signers/turnkey.mdx
+++ b/docs/pages/sdk/v5_3_x/signers/turnkey.mdx
@@ -1,4 +1,4 @@
-import VersionWarning from "../VersionWarning"
+import VersionWarning from "@components/VersionWarning"
diff --git a/docs/pages/sdk/v5_3_x/signers/web3auth.mdx b/docs/pages/sdk/v5_3_x/signers/web3auth.mdx
index 09f6842b..25ecdc35 100644
--- a/docs/pages/sdk/v5_3_x/signers/web3auth.mdx
+++ b/docs/pages/sdk/v5_3_x/signers/web3auth.mdx
@@ -1,4 +1,4 @@
-import VersionWarning from "../VersionWarning"
+import VersionWarning from "@components/VersionWarning"
diff --git a/docs/public/404.html b/docs/public/404.html
new file mode 100644
index 00000000..777ebdec
--- /dev/null
+++ b/docs/public/404.html
@@ -0,0 +1,110 @@
+
+
+
+
+
+
+ Page not found – ZeroDev
+
+
+
+
+
+ 404
+ That page has moved or no longer exists.
+
+ The documentation was reorganised. Most old links redirect
+ automatically, so this one points at a page that was retired without a
+ replacement.
+
+
+
+
+
diff --git a/docs/public/robots.txt b/docs/public/robots.txt
new file mode 100644
index 00000000..5147ec8c
--- /dev/null
+++ b/docs/public/robots.txt
@@ -0,0 +1,19 @@
+User-agent: *
+Allow: /
+
+User-agent: GPTBot
+Allow: /
+
+User-agent: Claude-Web
+Allow: /
+
+User-agent: Anthropic-AI
+Allow: /
+
+User-agent: ChatGPT-User
+Allow: /
+
+User-agent: Google-Extended
+Allow: /
+
+Sitemap: https://docs.zerodev.app/sitemap.xml
diff --git a/package.json b/package.json
index c29f06e0..53a53230 100644
--- a/package.json
+++ b/package.json
@@ -3,7 +3,7 @@
"type": "module",
"scripts": {
"dev": "vocs dev",
- "build": "vocs build",
+ "build": "vocs build && node scripts/sitemap.mjs",
"start": "node server.mjs",
"preview": "vocs preview",
"check:redirects": "node scripts/check-redirects.mjs",
diff --git a/redirects.config.js b/redirects.config.js
index 09e2c486..8f03f642 100644
--- a/redirects.config.js
+++ b/redirects.config.js
@@ -125,6 +125,10 @@ export const redirects = [
{ from: "/recovery-flow/portal", to: "/advanced/account-recovery/portal" },
// Smart Routing Address (and global-address duplicate)
+ //
+ // /global-address never reaches this server: a Cloudflare rule 301s it to
+ // /smart-routing-address first, so a reader takes two hops. The rule below is
+ // the target we want and takes effect once that Cloudflare rule is gone.
{ from: "/smart-routing-address", to: "/onramp/smart-routing-address/quickstart" },
{ from: "/global-address", to: "/onramp/smart-routing-address/quickstart" },
diff --git a/scripts/check-redirects.mjs b/scripts/check-redirects.mjs
index 0334ceb9..9be09563 100644
--- a/scripts/check-redirects.mjs
+++ b/scripts/check-redirects.mjs
@@ -48,10 +48,8 @@ function sidebarLinks() {
.map((m) => stripTrailingSlash(m[1])));
}
-// Orphaned on purpose. The React hooks tree documents @zerodev/waas, which is
-// unmaintained: DES-21 settled on keeping the pages for old links but hiding
-// them from crawlers, so they stay out of the sidebar. New orphan targets
-// outside these must not be added.
+// Orphaned on purpose: the react-hooks tree is unmaintained and stays hidden,
+// the rest is a known gap. Do not add new orphan targets outside these.
const ORPHAN_OK = ["/advanced/react-hooks/", "/api-and-toolings/", "/smart-accounts/permissions/1-click-trading"];
const SIDEBAR = sidebarLinks();
@@ -84,6 +82,17 @@ for (const { from, to } of redirects) {
}
}
+// The v5.3.x canonical tags are derived from this table (see vocs.config.tsx).
+// A page that stops mapping falls back to crediting itself and quietly competes
+// again. The set's index has no equivalent and is excluded.
+for (const route of ROUTES) {
+ if (!route.startsWith("/sdk/v5_3_x/")) continue;
+ const current = resolveRedirect(route.replace("/sdk/v5_3_x", "/sdk"));
+ if (!current?.startsWith("/")) {
+ errors.push(`${route} has no current page to credit, so its canonical falls back to itself`);
+ }
+}
+
for (const [prefix, target] of PREFIX) {
if (!ROUTES.has(stripTrailingSlash(target))) {
errors.push(`prefix ${prefix} -> ${target} (no such page)`);
diff --git a/scripts/sitemap.mjs b/scripts/sitemap.mjs
new file mode 100644
index 00000000..7ee9469d
--- /dev/null
+++ b/scripts/sitemap.mjs
@@ -0,0 +1,121 @@
+// Writes docs/dist/sitemap.xml after `vocs build`.
+//
+// Read from the built HTML, not the page sources, so the sitemap cannot
+// contradict what a page declares. Listed only if the page asks to be indexed:
+// no noindex, and a canonical pointing at itself.
+
+import { readdirSync, readFileSync, statSync, writeFileSync } from "node:fs";
+import { join } from "node:path";
+import { fileURLToPath } from "node:url";
+
+import { resolveRedirect, stripTrailingSlash } from "../resolve-redirect.js";
+
+export const ORIGIN = "https://docs.zerodev.app";
+
+const ROOT = fileURLToPath(new URL("..", import.meta.url));
+const DIST = join(ROOT, "docs", "dist");
+
+// Under this many characters of visible text a page has nothing to rank for.
+const MIN_TEXT = 50;
+
+function pages(dir, prefix = "") {
+ const out = [];
+ for (const entry of readdirSync(dir)) {
+ const full = join(dir, entry);
+ if (statSync(full).isDirectory())
+ out.push(...pages(full, `${prefix}/${entry}`));
+ else if (entry === "index.html") out.push([prefix || "/", full]);
+ }
+ return out;
+}
+
+const textOf = (html) =>
+ html
+ .replace(/<(script|style)\b[^>]*>[\s\S]*?<\/\1>/gi, "")
+ .replace(/<[^>]+>/g, " ")
+ .replace(/\s+/g, " ")
+ .trim();
+
+const tag = (html, re) => html.match(re)?.[1] ?? null;
+
+export function sitemapEntries() {
+ const skipped = { redirected: 0, noindex: 0, duplicate: 0, empty: 0 };
+ const urls = [];
+ const uncanonical = [];
+
+ for (const [route, file] of pages(DIST)) {
+ // .vocs holds the search index, not pages.
+ if (route.startsWith("/.")) continue;
+
+ if (resolveRedirect(route)) {
+ skipped.redirected++;
+ continue;
+ }
+
+ const html = readFileSync(file, "utf8");
+
+ if (/ ]+name=["']robots["'][^>]+noindex/i.test(html)) {
+ skipped.noindex++;
+ continue;
+ }
+
+ // No canonical means the head config stopped rendering, which vocs does
+ // silently. Collect and fail rather than listing the page: a sitemap that
+ // keeps working while the tags vanish hides the regression.
+ const canonical = tag(
+ html,
+ / ]+rel=["']canonical["'][^>]+href=["']([^"']+)["']/i,
+ );
+ if (!canonical) {
+ uncanonical.push(route);
+ continue;
+ }
+ if (stripTrailingSlash(canonical) !== stripTrailingSlash(ORIGIN + route)) {
+ skipped.duplicate++;
+ continue;
+ }
+
+ if (textOf(html).length < MIN_TEXT) {
+ skipped.empty++;
+ continue;
+ }
+
+ urls.push(route === "/" ? `${ORIGIN}/` : ORIGIN + route);
+ }
+
+ return { urls: urls.sort(), skipped, uncanonical };
+}
+
+function main() {
+ const { urls, skipped, uncanonical } = sitemapEntries();
+
+ if (uncanonical.length) {
+ console.error(`${uncanonical.length} built page(s) have no canonical tag:`);
+ for (const r of uncanonical.slice(0, 10)) console.error(` ${r}`);
+ if (uncanonical.length > 10) {
+ console.error(` ...${uncanonical.length - 10} more`);
+ }
+ console.error("check the head() function in vocs.config.tsx");
+ process.exit(1);
+ }
+
+ const xml = [
+ '',
+ '',
+ ...urls.map((u) => ` ${u} `),
+ " ",
+ "",
+ ].join("\n");
+
+ writeFileSync(join(DIST, "sitemap.xml"), xml);
+
+ const dropped = Object.entries(skipped)
+ .filter(([, n]) => n)
+ .map(([k, n]) => `${n} ${k}`)
+ .join(", ");
+ console.log(
+ `sitemap.xml: ${urls.length} urls${dropped ? ` (skipped ${dropped})` : ""}`,
+ );
+}
+
+if (process.argv[1] === fileURLToPath(import.meta.url)) main();
diff --git a/vocs.config.tsx b/vocs.config.tsx
index 7c0bc7e5..36341d77 100644
--- a/vocs.config.tsx
+++ b/vocs.config.tsx
@@ -1,4 +1,5 @@
-import { resolve } from "node:path";
+import { readFileSync, readdirSync } from "node:fs";
+import { join, resolve } from "node:path";
import { defineConfig } from "vocs";
import dotenv from "dotenv";
import { resolveRedirect } from "./resolve-redirect.js";
@@ -12,6 +13,65 @@ const componentsDir = resolve(process.cwd(), "docs/components");
dotenv.config();
+// Absolute, so the copy served on new-docs.zerodev.app credits this host
+// instead of competing with it. A path-only canonical would resolve against
+// whichever host served the page.
+const ORIGIN = "https://docs.zerodev.app";
+
+// /sdk/v5_3_x/x is the old version of /sdk/x, which already has a vetted
+// redirect target, so the old set credits the current pages without a
+// hand-written map. check:redirects fails if a page stops mapping.
+function canonicalPath(path: string) {
+ if (!path.startsWith("/sdk/v5_3_x")) return path;
+ const current = resolveRedirect(path.replace("/sdk/v5_3_x", "/sdk"));
+ // Off-site targets and the set's index have no equivalent: credit itself.
+ return current?.startsWith("/") ? current : path;
+}
+
+// @zerodev/waas, no release in about two years. Kept so old links resolve,
+// hidden so it stops competing with the current docs.
+const isUnmaintained = (path: string) =>
+ path.startsWith("/advanced/react-hooks/");
+
+const SITE_DESCRIPTION =
+ "Build a Web3 experience that feels like Web2, using account abstraction through ZeroDev. Say goodbye to gas, seed phrases, transaction prompts, and more.";
+
+// Stopgap. Vocs emits a description only where the page supplies one, and most
+// do not, so they ship bare. Collect the ones that already have their own so
+// the fallback never doubles up.
+const PAGES_DIR = resolve(process.cwd(), "docs/pages");
+
+// Either frontmatter `description:` or a bracketed suffix on the H1, as in
+// `# Social Login [Social login lets users...]`. The trailing-bracket test
+// excludes a markdown link, which is `[text](url)`.
+function hasDescription(src: string) {
+ const close = src.startsWith("---") ? src.indexOf("\n---", 3) : -1;
+ if (close > 0 && /^description:\s*\S/m.test(src.slice(3, close))) return true;
+ const h1 = src.match(/^#[^#\n].*$/m)?.[0];
+ return Boolean(h1 && /\[[^\]]+\]\s*$/.test(h1));
+}
+
+function routesWithDescription(dir = PAGES_DIR, prefix = "") {
+ const out = new Set();
+ for (const entry of readdirSync(dir, { withFileTypes: true })) {
+ const full = join(dir, entry.name);
+ if (entry.isDirectory()) {
+ for (const r of routesWithDescription(full, `${prefix}/${entry.name}`)) {
+ out.add(r);
+ }
+ continue;
+ }
+ if (!/\.mdx?$/.test(entry.name)) continue;
+ const src = readFileSync(full, "utf8");
+ if (!hasDescription(src)) continue;
+ const name = entry.name.replace(/\.mdx?$/, "");
+ out.add(name === "index" ? prefix || "/" : `${prefix}/${name}`);
+ }
+ return out;
+}
+
+const HAS_DESCRIPTION = routesWithDescription();
+
export default defineConfig({
iconUrl: "/favicon.ico",
logoUrl: {
@@ -85,20 +145,28 @@ export default defineConfig({
title: "ZeroDev",
titleTemplate: "%s – ZeroDev",
description: "The most powerful smart account.",
- head: (
- <>
-
-
-
-
- >
- ),
+ // Must stay a function: vocs tests `typeof head === "object"` before it tests
+ // for an element, so a JSX element here takes the path-prefix-map branch,
+ // matches nothing and renders nothing. Only tags vocs does not already emit
+ // belong here, or pages get two of each.
+ head({ path }) {
+ const canonical = ORIGIN + canonicalPath(path);
+ return (
+ <>
+
+
+ {!HAS_DESCRIPTION.has(path) && (
+ <>
+
+
+ >
+ )}
+ {isUnmaintained(path) && (
+
+ )}
+ >
+ );
+ },
// Pillars (Getting Started, Onboarding, Onramp, Smart Account, Advanced,
// API & Tooling) are rendered by the `inject-pillar-bar` Vite plugin
// below as a separate horizontal bar BELOW this top nav. Only utility links