diff --git a/apps/docs/package.json b/apps/docs/package.json
index 925c0097..2ea2feb1 100644
--- a/apps/docs/package.json
+++ b/apps/docs/package.json
@@ -7,9 +7,11 @@
"dev": "next dev -p 3001",
"build": "next build",
"start": "next start -p 3001",
- "lint": "eslint",
+ "lint": "eslint && pnpm check-links",
"build:docker": "docker build -f apps/docs/Dockerfile -t docs .",
- "format": "prettier --check . --ignore-path ../../.gitignore"
+ "format": "prettier --check . --ignore-path ../../.gitignore",
+ "typecheck": "tsc --noEmit --emitDeclarationOnly false",
+ "check-links": "linkinator http://localhost:3001 --silent --timeout 5000"
},
"dependencies": {
"@ctrlplane/ui": "workspace:*",
@@ -30,6 +32,7 @@
"@types/react": "catalog:react18",
"@types/react-dom": "catalog:react18",
"eslint": "catalog:",
+ "linkinator": "^6.1.2",
"postcss-load-config": "^6.0.1",
"prettier": "catalog:",
"tailwindcss": "catalog:",
diff --git a/apps/docs/pages/index.mdx b/apps/docs/pages/index.mdx
index d3f18482..53ccf791 100644
--- a/apps/docs/pages/index.mdx
+++ b/apps/docs/pages/index.mdx
@@ -39,7 +39,7 @@ setup more efficient, secure, and easy to manage
}
title="Core Concepts"
- href="/core-concepts"
+ href="/core-concepts/systems"
/>
}
diff --git a/apps/docs/pages/integrations.mdx b/apps/docs/pages/integrations.mdx
new file mode 100644
index 00000000..4172ef41
--- /dev/null
+++ b/apps/docs/pages/integrations.mdx
@@ -0,0 +1,41 @@
+---
+title: Integrations Overview
+---
+
+# Integrations Overview
+
+Integrations allow you to connect Ctrlplane with various services, enhancing
+your deployment capabilities and workflows. Below are the available integrations
+you can set up.
+
+## Available Integrations
+
+import { Cards } from "nextra/components";
+import { SiGithub, SiGooglecloud, SiKubernetes } from "react-icons/si";
+
+
+ }
+ title="GitHub"
+ href="/integrations/github"
+ />
+ }
+ title="Google Cloud"
+ href="/integrations/google"
+ />
+ }
+ title="Kubernetes"
+ href="/integrations/kubernetes"
+ />
+
+
+## How to Set Up Integrations
+
+To set up an integration, follow the specific instructions provided in the
+respective integration documentation. Ensure you have the necessary permissions
+and configurations in place to connect Ctrlplane with the external service.
+
+For more detailed information on each integration, please refer to the links
+provided in the cards above.
diff --git a/apps/docs/pages/self-hosted/overview.mdx b/apps/docs/pages/self-hosted.mdx
similarity index 97%
rename from apps/docs/pages/self-hosted/overview.mdx
rename to apps/docs/pages/self-hosted.mdx
index 96a98bdf..f2243436 100644
--- a/apps/docs/pages/self-hosted/overview.mdx
+++ b/apps/docs/pages/self-hosted.mdx
@@ -1,3 +1,7 @@
+---
+title: Self-hosted
+---
+
# Overview
Ctrlplane is still in its early days, not everything is perfect yet, and hiccups
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index d2287986..2b1ed420 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -144,6 +144,9 @@ importers:
eslint:
specifier: 'catalog:'
version: 9.11.1(jiti@2.1.0)
+ linkinator:
+ specifier: ^6.1.2
+ version: 6.1.2
postcss-load-config:
specifier: ^6.0.1
version: 6.0.1(jiti@2.1.0)(postcss@8.4.47)(tsx@4.19.1)(yaml@2.5.1)
@@ -1382,7 +1385,7 @@ importers:
version: 1.13.4(eslint@9.11.1(jiti@2.1.0))
eslint-plugin-import:
specifier: ^2.29.1
- version: 2.30.0(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@2.1.0))(typescript@5.6.2))(eslint@9.11.1(jiti@2.1.0))
+ version: 2.30.0(eslint@9.11.1(jiti@2.1.0))
eslint-plugin-jsx-a11y:
specifier: ^6.9.0
version: 6.10.0(eslint@9.11.1(jiti@2.1.0))
@@ -5714,6 +5717,10 @@ packages:
resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
engines: {node: '>=10'}
+ chalk@5.3.0:
+ resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==}
+ engines: {node: ^12.17.0 || ^14.13 || >=16.0.0}
+
change-case@3.1.0:
resolution: {integrity: sha512-2AZp7uJZbYEzRPsFoa+ijKdvp9zsrnnt6+yFokfwEpeJm0xuJDVoxiRCAaTzyJND8GJkofo2IcKWaUZ/OECVzw==}
@@ -6323,9 +6330,22 @@ packages:
dom-helpers@5.2.1:
resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==}
+ dom-serializer@2.0.0:
+ resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==}
+
+ domelementtype@2.3.0:
+ resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==}
+
+ domhandler@5.0.3:
+ resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==}
+ engines: {node: '>= 4'}
+
dompurify@3.1.7:
resolution: {integrity: sha512-VaTstWtsneJY8xzy7DekmYWEOZcmzIe3Qb3zPd4STve1OBTa+e+WmS1ITQec1fZYXI3HCsOZZiSMpG6oxoWMWQ==}
+ domutils@3.1.0:
+ resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==}
+
dot-case@2.1.1:
resolution: {integrity: sha512-HnM6ZlFqcajLsyudHq7LeeLDr2rFAVYtDv/hV5qchQEidSck8j9OPUsXY9KwJv/lHMtYlX4DjRQqwFYa+0r8Ug==}
@@ -7215,6 +7235,9 @@ packages:
html-void-elements@3.0.0:
resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==}
+ htmlparser2@9.1.0:
+ resolution: {integrity: sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==}
+
http-errors@2.0.0:
resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==}
engines: {node: '>= 0.8'}
@@ -7741,6 +7764,11 @@ packages:
lines-and-columns@1.2.4:
resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
+ linkinator@6.1.2:
+ resolution: {integrity: sha512-PndSrQe21Hf4sn2vZldEzJmD0EUJbIsEy4jcZLcHd6IZfQ6rC6iv+Fwo666TWM9DcXjbCrHpxnVX6xaGrcJ/eA==}
+ engines: {node: '>=18'}
+ hasBin: true
+
load-script@1.0.0:
resolution: {integrity: sha512-kPEjMFtZvwL9TaZo0uZ2ml+Ye9HUMmPwbYRJ324qF9tqMejwykJ5ggTyvzmrbBeapCAbk98BSbTeovHEEP1uCA==}
@@ -7947,6 +7975,10 @@ packages:
resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==}
engines: {node: '>= 0.6'}
+ meow@13.2.0:
+ resolution: {integrity: sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==}
+ engines: {node: '>=18'}
+
merge-descriptors@1.0.3:
resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==}
@@ -8095,6 +8127,11 @@ packages:
engines: {node: '>=4'}
hasBin: true
+ mime@4.0.4:
+ resolution: {integrity: sha512-v8yqInVjhXyqP6+Kw4fV3ZzeMRqEW6FotRsKXjRS5VMTNIuXsdRoAvklpoRgSqXm6o9VNH4/C0mgedko9DdLsQ==}
+ engines: {node: '>=16'}
+ hasBin: true
+
mimic-fn@2.1.0:
resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==}
engines: {node: '>=6'}
@@ -9269,6 +9306,9 @@ packages:
resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==}
engines: {node: '>= 0.8.0'}
+ server-destroy@1.0.1:
+ resolution: {integrity: sha512-rb+9B5YBIEzYcD6x2VKidaa+cqYBJQKnU4oe4E3ANwRRN56yk/ua1YCJT1n21NTS8w6CcOclAKNP3PhdCXKYtQ==}
+
set-function-length@1.2.2:
resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==}
engines: {node: '>= 0.4'}
@@ -9410,6 +9450,10 @@ packages:
sprintf-js@1.1.3:
resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==}
+ srcset@5.0.1:
+ resolution: {integrity: sha512-/P1UYbGfJVlxZag7aABNRrulEXAwCSDo7fklafOQrantuPTDmYgijJMks2zusPCVzgW9+4P69mq7w6pYuZpgxw==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
sshpk@1.18.0:
resolution: {integrity: sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==}
engines: {node: '>=0.10.0'}
@@ -15304,6 +15348,8 @@ snapshots:
ansi-styles: 4.3.0
supports-color: 7.2.0
+ chalk@5.3.0: {}
+
change-case@3.1.0:
dependencies:
camel-case: 3.0.0
@@ -15947,8 +15993,26 @@ snapshots:
'@babel/runtime': 7.25.6
csstype: 3.1.3
+ dom-serializer@2.0.0:
+ dependencies:
+ domelementtype: 2.3.0
+ domhandler: 5.0.3
+ entities: 4.5.0
+
+ domelementtype@2.3.0: {}
+
+ domhandler@5.0.3:
+ dependencies:
+ domelementtype: 2.3.0
+
dompurify@3.1.7: {}
+ domutils@3.1.0:
+ dependencies:
+ dom-serializer: 2.0.0
+ domelementtype: 2.3.0
+ domhandler: 5.0.3
+
dot-case@2.1.1:
dependencies:
no-case: 2.3.2
@@ -16289,17 +16353,16 @@ snapshots:
transitivePeerDependencies:
- supports-color
- eslint-module-utils@2.12.0(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@2.1.0))(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint@9.11.1(jiti@2.1.0)):
+ eslint-module-utils@2.12.0(eslint-import-resolver-node@0.3.9)(eslint@9.11.1(jiti@2.1.0)):
dependencies:
debug: 3.2.7
optionalDependencies:
- '@typescript-eslint/parser': 8.7.0(eslint@9.11.1(jiti@2.1.0))(typescript@5.6.2)
eslint: 9.11.1(jiti@2.1.0)
eslint-import-resolver-node: 0.3.9
transitivePeerDependencies:
- supports-color
- eslint-plugin-import@2.30.0(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@2.1.0))(typescript@5.6.2))(eslint@9.11.1(jiti@2.1.0)):
+ eslint-plugin-import@2.30.0(eslint@9.11.1(jiti@2.1.0)):
dependencies:
'@rtsao/scc': 1.1.0
array-includes: 3.1.8
@@ -16310,7 +16373,7 @@ snapshots:
doctrine: 2.1.0
eslint: 9.11.1(jiti@2.1.0)
eslint-import-resolver-node: 0.3.9
- eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@2.1.0))(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint@9.11.1(jiti@2.1.0))
+ eslint-module-utils: 2.12.0(eslint-import-resolver-node@0.3.9)(eslint@9.11.1(jiti@2.1.0))
hasown: 2.0.2
is-core-module: 2.15.1
is-glob: 4.0.3
@@ -16320,8 +16383,6 @@ snapshots:
object.values: 1.2.0
semver: 6.3.1
tsconfig-paths: 3.15.0
- optionalDependencies:
- '@typescript-eslint/parser': 8.7.0(eslint@9.11.1(jiti@2.1.0))(typescript@5.6.2)
transitivePeerDependencies:
- eslint-import-resolver-typescript
- eslint-import-resolver-webpack
@@ -17208,6 +17269,13 @@ snapshots:
html-void-elements@3.0.0: {}
+ htmlparser2@9.1.0:
+ dependencies:
+ domelementtype: 2.3.0
+ domhandler: 5.0.3
+ domutils: 3.1.0
+ entities: 4.5.0
+
http-errors@2.0.0:
dependencies:
depd: 2.0.0
@@ -17767,6 +17835,22 @@ snapshots:
lines-and-columns@1.2.4: {}
+ linkinator@6.1.2:
+ dependencies:
+ chalk: 5.3.0
+ escape-html: 1.0.3
+ gaxios: 6.7.1
+ glob: 10.4.5
+ htmlparser2: 9.1.0
+ marked: 13.0.3
+ meow: 13.2.0
+ mime: 4.0.4
+ server-destroy: 1.0.1
+ srcset: 5.0.1
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+
load-script@1.0.0: {}
load-tsconfig@0.2.5: {}
@@ -18089,6 +18173,8 @@ snapshots:
media-typer@0.3.0: {}
+ meow@13.2.0: {}
+
merge-descriptors@1.0.3: {}
merge-stream@2.0.0: {}
@@ -18419,6 +18505,8 @@ snapshots:
mime@1.6.0: {}
+ mime@4.0.4: {}
+
mimic-fn@2.1.0: {}
minimatch@3.1.2:
@@ -19871,6 +19959,8 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ server-destroy@1.0.1: {}
+
set-function-length@1.2.2:
dependencies:
define-data-property: 1.1.4
@@ -20028,6 +20118,8 @@ snapshots:
sprintf-js@1.1.3: {}
+ srcset@5.0.1: {}
+
sshpk@1.18.0:
dependencies:
asn1: 0.2.6