diff --git a/.github/workflows/scheduled-generated.yml b/.github/workflows/scheduled-generated.yml
new file mode 100644
index 00000000..e1eae2d4
--- /dev/null
+++ b/.github/workflows/scheduled-generated.yml
@@ -0,0 +1,41 @@
+name: Update generated content
+on:
+ schedule:
+ - cron: "0 10 * * 1-5"
+ workflow_dispatch:
+jobs:
+ update:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
+ - name: Setup Node.js
+ uses: actions/setup-node@v4
+ with:
+ node-version: 22.x
+ cache: "npm"
+ - name: Install dependencies
+ run: yarn install
+ - name: Prepare to fetch external content
+ run: |
+ git remote add -f -t main --no-tags examples https://github.com/score-spec/examples.git
+ git remote add -f -t main --no-tags community-provisioners https://github.com/score-spec/community-provisioners.git
+
+ # Set github actions bot as the committer, see https://github.com/actions/checkout/pull/1184
+ git config --global user.email "41898282+github-actions[bot]@users.noreply.github.com"
+ git config --global user.name "github-actions[bot]"
+ - name: Re-generate generated content
+ run: npm run gen-all
+ env:
+ GITHUB_TOKEN: ${{ secrets.GH_PAT }}
+ - name: Create Pull Request
+ uses: peter-evans/create-pull-request@v7
+ with:
+ token: ${{ secrets.GH_PAT }}
+ commit-message: "chore: update generated content"
+ title: Update generated content
+ body: |
+ Update generated content.
+ branch: update-generated
+ team-reviewers: "common-reviewers"
diff --git a/.gitignore b/.gitignore
index 735364d5..dac6d3a7 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,5 +1,5 @@
/public
-resources/
+/resources
node_modules/
package-lock.json
.hugo_build.lock
@@ -9,4 +9,4 @@ package-lock.json
.score-compose/
compose.yaml
.score-k8s/
-manifests.yaml
+manifests.yaml
\ No newline at end of file
diff --git a/.prettierignore b/.prettierignore
new file mode 100644
index 00000000..0b84df0f
--- /dev/null
+++ b/.prettierignore
@@ -0,0 +1 @@
+*.html
\ No newline at end of file
diff --git a/LICENSE b/LICENSE
index d1867fe9..c29c3e0f 100644
--- a/LICENSE
+++ b/LICENSE
@@ -199,4 +199,4 @@
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
- limitations under the License.
+ limitations under the License.
\ No newline at end of file
diff --git a/README.md b/README.md
index 3aeb44ee..e18794b3 100644
--- a/README.md
+++ b/README.md
@@ -93,6 +93,42 @@ Example output.
To lint all documents, run `yarn lint`.
+## Autogenerated content
+
+### Score example hub
+
+This site uses content from external Git repositories to create and continuously update the "Score example hub" pages. The external repos are pulled in to the `/gen/external-content` folder.
+
+The commands for the initial integration of the repos are:
+
+```bash
+git remote add -f -t main --no-tags examples https://github.com/score-spec/examples.git
+git remote add -f -t main --no-tags community-provisioners https://github.com/score-spec/community-provisioners.git
+git read-tree --prefix=gen/external-content/score/specification -u examples/main:specification
+git read-tree --prefix=gen/external-content/score/resources/default-provisioners -u examples/main:resources
+git read-tree --prefix=gen/external-content/score/resources/community-provisioners -u community-provisioners/main
+git add gen/external-content
+git commit -s -S -m "Integrating external content"
+```
+
+These commands will not have to be repeated unless re-creating the repo integration, or moving the source location. In that case, remove the `remote`, delete the local contents, repeat these commands targeting the new location, and update the generation scripts.
+
+To generate the example hub pages based on the external content, execute this command:
+
+```bash
+yarn gen-example-pages
+```
+
+### Pulling new content
+
+To pull the current content from the remote example library repo, execute this command:
+
+```bash
+yarn gen-get-external-content
+```
+
+Refer to the [package.json`](./package.json) to see the actual implementation of this command.
+
## Troubleshooting documentation site builds
This section covers common build issues with Hugo.
diff --git a/assets/images/logo.svg b/assets/images/logo.svg
new file mode 100644
index 00000000..205fa9ea
--- /dev/null
+++ b/assets/images/logo.svg
@@ -0,0 +1,19 @@
+
diff --git a/assets/js/clipboard.js b/assets/js/clipboard.js
new file mode 100644
index 00000000..d8b04794
--- /dev/null
+++ b/assets/js/clipboard.js
@@ -0,0 +1,54 @@
+/* eslint-disable quotes */
+import Clipboard from "clipboard";
+
+// Only run on /examples pages
+if (window.location.pathname.startsWith("/examples")) {
+ var pre = document.getElementsByTagName("pre");
+
+ for (var i = 0; i < pre.length; ++i) {
+ var element = pre[i];
+ var mermaid = element.getElementsByClassName("language-mermaid")[0];
+
+ if (mermaid == null) {
+ element.insertAdjacentHTML(
+ "afterbegin",
+ ``
+ );
+ }
+ }
+
+ var clipboard = new Clipboard(".copy-btn", {
+ target: function (trigger) {
+ return trigger.nextElementSibling;
+ },
+ });
+
+ clipboard.on("success", function (e) {
+ /*
+ console.info('Action:', e.action);
+ console.info('Text:', e.text);
+ console.info('Trigger:', e.trigger);
+ */
+
+ e.clearSelection();
+
+ // Show success feedback
+ const button = e.trigger;
+ button.classList.add("copy-success");
+
+ // Remove success state after 2 seconds
+ setTimeout(() => {
+ button.classList.remove("copy-success");
+ }, 2000);
+ });
+
+ clipboard.on("error", function (e) {
+ console.error("Action:", e.action);
+ console.error("Trigger:", e.trigger);
+ });
+}
diff --git a/assets/js/multifilter.js b/assets/js/multifilter.js
new file mode 100644
index 00000000..f1e1cc8e
--- /dev/null
+++ b/assets/js/multifilter.js
@@ -0,0 +1,131 @@
+const examplesContainer = document.getElementById("examples-container");
+const filters = document.querySelectorAll(".form-check-input");
+const listItems = document.querySelectorAll(".examples-list-item");
+const pageCount = document.getElementById("pagecount");
+const urlParams = new URLSearchParams(window.location.search);
+
+// Check inputs based on query parameters
+filters.forEach((filter) => {
+ const type = filter.dataset.directory;
+ const value = filter.value;
+ if (urlParams.has(type)) {
+ const values = urlParams.get(type).split("+");
+ if (values.includes(value)) {
+ filter.checked = true;
+ }
+ }
+});
+
+filterCheckedItems();
+
+filters.forEach((filter) => {
+ filter.addEventListener("change", () => {
+ let queryParams = filterCheckedItems();
+
+ let path = window.location.pathname;
+ if (window.location.pathname.endsWith("/")) {
+ path = window.location.pathname.slice(0, -1);
+ }
+ if (path !== "/" + examplesContainer.dataset.folder) {
+ path = "/" + examplesContainer.dataset.folder;
+ window.location.href = path + queryParams;
+ }
+ window.history.pushState(null, null, path + queryParams);
+ });
+});
+
+function filterCheckedItems() {
+ const checkedFilters = getCheckedFilters();
+ let queryParams = getQueryParams(checkedFilters);
+
+ filterItems(checkedFilters);
+ updatePageCount();
+ return queryParams;
+}
+
+function getCheckedFilters() {
+ return Array.from(filters)
+ .filter((filter) => filter.checked)
+ .map((filter) => ({
+ type: filter.dataset.directory,
+ value: filter.value,
+ }));
+}
+
+function updatePageCount() {
+ if (pageCount) {
+ const visibleItems = Array.from(listItems).filter(
+ (item) => item.style.display === "block"
+ );
+ pageCount.textContent = visibleItems.length;
+ }
+}
+
+function filterItems(checkedFilters) {
+ // Step 1: Separate filters by type
+ const filtersByType = checkedFilters.reduce((acc, filter) => {
+ if (!acc[filter.type]) {
+ acc[filter.type] = [];
+ }
+ acc[filter.type].push(filter.value);
+ return acc;
+ }, {});
+
+ // Step 2: Apply UNION logic
+ let unionResults = Array.from(listItems);
+ Object.entries(filtersByType).forEach(([type, values]) => {
+ unionResults = unionResults.filter((item) => {
+ if (item.dataset[type] && item.dataset[type].startsWith("[")) {
+ const array = item.dataset[type].slice(1, -1).split(" ");
+ return values.some((value) => array.includes(value));
+ }
+ return values.some((value) => item.dataset[type] === value);
+ });
+ });
+
+ // Step 3: Apply INTERSECTION logic
+ // For each item, check if it matches all filters of different types
+ const intersectionResults = unionResults.filter((item) => {
+ return Object.entries(filtersByType).every(([type, values]) => {
+ // If the item has a data attribute for this type, check if it matches any value
+ if (item.dataset[type]) {
+ if (item.dataset[type].startsWith("[")) {
+ const array = item.dataset[type].slice(1, -1).split(" ");
+ return values.some((value) => array.includes(value));
+ }
+ return values.includes(item.dataset[type]);
+ }
+ // If the item doesn't have a data attribute for this type, it doesn't match
+ return false;
+ });
+ });
+
+ // Update the display of list items based on the intersection results
+ listItems.forEach((item) => {
+ item.style.display = intersectionResults.includes(item) ? "block" : "none";
+ });
+}
+
+function getQueryParams(checkedFilters) {
+ // Group objects by type
+ const groupedData = checkedFilters.reduce((acc, obj) => {
+ if (!acc[obj.type]) {
+ acc[obj.type] = [];
+ }
+ acc[obj.type].push(obj.value);
+ return acc;
+ }, {});
+
+ // Construct query parameters
+ let queryParams = "";
+ Object.keys(groupedData).forEach((key) => {
+ const values = groupedData[key].join("%2B");
+ queryParams += `&${key}=${values}`;
+ });
+
+ // Append '?' to the beginning if there are query parameters
+ if (queryParams.length > 0) {
+ queryParams = "?" + queryParams.substring(1);
+ }
+ return queryParams;
+}
diff --git a/assets/js/tabs.js b/assets/js/tabs.js
new file mode 100644
index 00000000..ee67b5f9
--- /dev/null
+++ b/assets/js/tabs.js
@@ -0,0 +1,93 @@
+const tabs = document.querySelectorAll('button[data-bs-toggle="tab"]');
+const tabPanes = document.querySelectorAll('.tab-pane');
+
+const activateTab = (tab) => {
+ tab.classList.add('active');
+ tab.setAttribute('aria-selected', 'true');
+ tab.setAttribute('tabindex', '0');
+
+ const tabId = tab.getAttribute('id');
+ tabPanes.forEach((tabPane) => {
+ if (tabPane.getAttribute('aria-labelledby') === tabId) {
+ tabPane.classList.add('active');
+ tabPane.classList.add('show');
+ }
+ });
+};
+
+const deactivateTab = (tab) => {
+ tab.classList.remove('active');
+ tab.setAttribute('aria-selected', 'false');
+ tab.setAttribute('tabindex', '-1');
+
+ const tabId = tab.getAttribute('id');
+ tabPanes.forEach((tabPane) => {
+ if (tabPane.getAttribute('aria-labelledby') === tabId) {
+ tabPane.classList.remove('active');
+ tabPane.classList.remove('show');
+ }
+ });
+};
+
+const activateFirstTab = () => {
+ const activeTabs = document.querySelectorAll('.nav-tabs');
+ activeTabs.forEach((activeTab) => {
+ const hasActiveTab = activeTab.querySelector(
+ "button[aria-selected='true']"
+ );
+ if (!hasActiveTab) {
+ const firstTab = activeTab.querySelector('button');
+ activateTab(firstTab);
+ }
+ });
+};
+
+const activeTab = localStorage.getItem('activeTab');
+if (activeTab) {
+ tabs.forEach((tab) => {
+ if (tab.innerHTML === activeTab) {
+ activateTab(tab);
+ } else {
+ deactivateTab(tab);
+ }
+ });
+ activateFirstTab();
+}
+
+const reinitMermaidInTab = (tabPane) => {
+ const mermaidDiagrams = tabPane.querySelectorAll('.language-mermaid');
+ if (mermaidDiagrams.length === 0) return;
+
+ mermaidDiagrams.forEach((ele) => {
+ ele.innerHTML = ele.getAttribute('data-src') || '';
+ ele.removeAttribute('data-processed');
+ });
+
+ if (localStorage.getItem('theme') === 'dark') {
+ window.mermaid.init(window.darkModeConfig || {}, mermaidDiagrams);
+ } else {
+ window.mermaid.init(window.lightModeConfig || {}, mermaidDiagrams);
+ }
+};
+
+tabs.forEach((tab) => {
+ tab.addEventListener('click', () => {
+ const innerHTML = tab.innerHTML;
+ localStorage.setItem('activeTab', innerHTML);
+ tabs.forEach((tab) => {
+ if (tab.innerHTML === innerHTML) {
+ activateTab(tab);
+
+ const tabId = tab.getAttribute('id');
+ tabPanes.forEach((tabPane) => {
+ if (tabPane.getAttribute('aria-labelledby') === tabId) {
+ setTimeout(() => reinitMermaidInTab(tabPane), 10);
+ }
+ });
+ } else {
+ deactivateTab(tab);
+ }
+ });
+ activateFirstTab();
+ });
+});
diff --git a/assets/scss/_examples.scss b/assets/scss/_examples.scss
new file mode 100644
index 00000000..b6c3368b
--- /dev/null
+++ b/assets/scss/_examples.scss
@@ -0,0 +1,189 @@
+.examples-page {
+ margin-top: 1rem;
+ border: none;
+
+ [data-dark-mode] & {
+ border: none;
+ }
+
+ .lead {
+ font-size: 1rem;
+ color: $electric-blue;
+ font-weight: $font-medium;
+ }
+}
+
+@media (min-width: 768px) {
+ .td-404 main,
+ .td-main main .examples-index-page {
+ padding-top: 0;
+ }
+}
+
+.examples-index-page {
+ padding-top: 6rem;
+}
+
+.examples-pagecount {
+ background-color: $gray-200;
+ color: $gray-900;
+ border-radius: 10px;
+ font-size: 16px;
+ padding: 0.25rem 1.5rem;
+
+ [data-dark-mode] & {
+ background-color: $gray-800;
+ color: $white;
+ }
+}
+
+.examples-sidebar {
+ margin-top: 1rem;
+ margin-bottom: 2rem;
+ width: 25%;
+
+ & .form-check,
+ & .form-check-label {
+ cursor: pointer;
+ }
+
+ & .form-check-input {
+ background-color: $gray-200;
+ color: $gray-900;
+ border-radius: 0px;
+ font-size: 16px;
+
+ [data-dark-mode] & {
+ background-color: $gray-800;
+ color: $white;
+ }
+
+ &:checked {
+ background-color: $electric-blue;
+ color: $white;
+ }
+
+ &:focus {
+ box-shadow: none;
+ }
+ }
+}
+
+.examples-content {
+ width: 75%;
+ margin-bottom: 2rem;
+
+ &.docs-content {
+ padding: 0;
+
+ & h2 {
+ margin-bottom: 0rem;
+ }
+ }
+}
+
+@-webkit-keyframes fadeEffect {
+ from {
+ opacity: 0;
+ }
+ to {
+ opacity: 1;
+ }
+}
+@keyframes fadeEffect {
+ from {
+ opacity: 0;
+ }
+ to {
+ opacity: 1;
+ }
+}
+
+.examples-list-item {
+ margin-top: 2rem;
+ transition: all 0.3s ease-in-out;
+ -webkit-animation: fadeEffect 0.3s;
+ animation: fadeEffect 0.3s; /* Fading effect takes 1 second */
+}
+
+.examples-list-title {
+ display: flex;
+ align-items: flex-end;
+ margin-bottom: 0.5rem;
+
+ a {
+ color: $electric-blue;
+ font-size: 1.625rem;
+ font-weight: $font-medium;
+ text-decoration: none;
+ }
+}
+
+.examples-parent-badge {
+ background-color: $gray-200;
+ color: $gray-900;
+ border-radius: 10px;
+ font-size: 16px;
+ padding: 0.25rem 1rem;
+ margin-left: 0.75rem;
+
+ [data-dark-mode] & {
+ background-color: $gray-800;
+ color: $white;
+ }
+}
+
+.gradient-image-card {
+ position: relative;
+ border-radius: 12px;
+ border: 1px solid #d5d9e5;
+ padding: 20px;
+ margin-bottom: 1rem;
+
+ [data-dark-mode] & {
+ border: 1px solid rgba(33, 86, 246, 0.5);
+ }
+}
+
+.gradient-image-card-content {
+ position: relative;
+ z-index: 10;
+ max-width: 50%;
+ font-size: $font-size-base;
+}
+
+.gradient-image-card-background {
+ position: absolute;
+ border-radius: 12px;
+ top: 0;
+ right: 0;
+ width: 35%;
+ height: 100%;
+ background-size: cover;
+ background-position: right;
+ background-repeat: no-repeat;
+}
+
+.gradient-image-card-gradient {
+ position: absolute;
+ border-radius: 12px;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background: linear-gradient(
+ to right,
+ rgba(255, 255, 255, 0),
+ rgba(131, 177, 255, 0.5) 30%,
+ rgba(9, 44, 148, 0.9)
+ );
+
+ [data-dark-mode] & {
+ background: linear-gradient(
+ to right,
+ rgba(255, 255, 255, 0),
+ rgba(0, 24, 65, 0.5) 50%,
+ rgba(0, 0, 0, 0.75)
+ );
+ }
+}
diff --git a/assets/scss/_global.scss b/assets/scss/_global.scss
new file mode 100644
index 00000000..7f245a89
--- /dev/null
+++ b/assets/scss/_global.scss
@@ -0,0 +1,9 @@
+.grid {
+ display: grid;
+ gap: 1.5rem;
+
+ @media (max-width: 991px) {
+ display: flex;
+ flex-direction: column;
+ }
+}
diff --git a/assets/scss/_navbar_project.scss b/assets/scss/_navbar_project.scss
new file mode 100644
index 00000000..fecf5d14
--- /dev/null
+++ b/assets/scss/_navbar_project.scss
@@ -0,0 +1,7 @@
+.navbar-dark .navbar-nav .nav-link {
+ font-weight: 500;
+}
+
+.navbar-dark .navbar-nav .nav-link.active {
+ color: #fff;
+}
diff --git a/assets/scss/_variables_project.scss b/assets/scss/_variables_project.scss
index f4ecb7c9..15b1f19b 100644
--- a/assets/scss/_variables_project.scss
+++ b/assets/scss/_variables_project.scss
@@ -27,5 +27,20 @@ $third: #e5574f;
$dark-2: #23232f;
$grey-3: #6c6c78;
$grey-4: #afafaf;
+$electric-blue: #2156f6;
+
+$white: #fff;
+$gray-100: #f8f9fa;
+$gray-200: #e9ecef;
+$gray-300: #dee2e6;
+$gray-400: #ced4da;
+$gray-500: #96979d;
+$gray-600: #787c89;
+$gray-700: #495057;
+$gray-800: #343a40;
+$gray-900: #222222;
+$black: #000;
+
+$bg-light: #fafafa;
$td-enable-google-fonts: false;
diff --git a/assets/scss/components/_cards.scss b/assets/scss/components/_cards.scss
new file mode 100644
index 00000000..2db8b717
--- /dev/null
+++ b/assets/scss/components/_cards.scss
@@ -0,0 +1,184 @@
+.gradient-image-card {
+ position: relative;
+ border-radius: 12px;
+ border: 1px solid #d5d9e5;
+ padding: 20px;
+ margin-bottom: 1rem;
+
+ [data-dark-mode] & {
+ border: 1px solid rgba(33, 86, 246, 0.5);
+ }
+}
+
+.gradient-image-card-content {
+ position: relative;
+ z-index: 10;
+ max-width: 50%;
+ font-size: $font-size-base;
+}
+
+.gradient-image-card-background {
+ position: absolute;
+ border-radius: 12px;
+ top: 0;
+ right: 0;
+ width: 35%;
+ height: 100%;
+ background-size: cover;
+ background-position: right;
+ background-repeat: no-repeat;
+}
+
+.gradient-image-card-gradient {
+ position: absolute;
+ border-radius: 12px;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background: linear-gradient(
+ to right,
+ rgba(255, 255, 255, 0),
+ rgba(131, 177, 255, 0.5) 30%,
+ rgba(9, 44, 148, 0.9)
+ );
+
+ [data-dark-mode] & {
+ background: linear-gradient(
+ to right,
+ rgba(255, 255, 255, 0),
+ rgba(0, 24, 65, 0.5) 50%,
+ rgba(0, 0, 0, 0.75)
+ );
+ }
+}
+
+.page-card {
+ border-radius: 12px;
+ border: 1px solid #d5d9e5;
+ padding: 24px;
+ background-color: rgba(195, 208, 248, 0.5);
+
+ [data-dark-mode] & {
+ background-color: rgba(33, 86, 246, 0.1);
+ border: 1px solid rgba(33, 86, 246, 0.5);
+ }
+
+ & h3 {
+ font-size: 22px !important;
+ margin-bottom: 1rem;
+ }
+
+ & p {
+ font-size: 16px !important;
+ line-height: 160% !important;
+ color: rgba(0, 3, 17, 0.65) !important;
+ margin-bottom: 1rem;
+
+ [data-dark-mode] & {
+ color: $white !important;
+ }
+ }
+}
+
+.page-card-item {
+ margin-bottom: 1.5rem;
+
+ &:last-child {
+ margin-bottom: 0;
+ }
+
+ & p {
+ font-size: 16px !important;
+ line-height: 160% !important;
+ color: rgba(0, 3, 17, 0.65) !important;
+ margin-bottom: 1rem;
+
+ [data-dark-mode] & {
+ color: $white !important;
+ }
+ }
+}
+
+.page-card-link {
+ display: flex;
+ width: fit-content;
+ border-radius: 6px;
+ padding: 12px 24px 6px;
+ background-color: $white;
+ font-weight: 600;
+ font-size: 16px;
+ color: $dark;
+ border: 1px solid #d5d9e5;
+
+ [data-dark-mode] & {
+ background-color: $dark;
+ color: $white;
+ border: 1px solid rgba(255, 255, 255, 0.4);
+ }
+
+ &:hover {
+ text-decoration: none;
+ color: $electric-blue;
+ }
+
+ &::after {
+ font-family: monospace;
+ content: "→";
+ margin-left: 10px;
+ font-size: 32px;
+ line-height: 32px;
+ color: $electric-blue;
+ transform: translateY(-7px);
+
+ [data-dark-mode] & {
+ color: $electric-blue;
+ }
+ }
+}
+
+.badge-card {
+ border: 1px solid #d5d9e5;
+ padding: 24px;
+ border-radius: 12px;
+ margin-bottom: 1rem;
+ background-color: $bg-light;
+
+ [data-dark-mode] & {
+ background-color: rgba($color: $gray-500, $alpha: 0.1);
+ border: 1px solid rgba($color: $gray-500, $alpha: 0.5);
+ }
+
+ & button {
+ font-size: $font-size-base;
+ font-weight: 600;
+ text-transform: uppercase;
+ padding: 5px 10px;
+ margin-bottom: 16px;
+ background-color: #d2dfff !important;
+ border: none;
+ color: $electric-blue !important;
+ border-radius: 6px;
+
+ [data-dark-mode] & {
+ background-color: rgba(99, 138, 255, 0.2) !important;
+ border: 1px solid rgba(99, 138, 255, 0.5) !important;
+ }
+ }
+
+ & h3 {
+ font-size: 22px !important;
+ margin-bottom: 1rem;
+ }
+
+ & p {
+ font-size: 16px !important;
+ line-height: 160% !important;
+ color: rgba(0, 3, 17, 0.65) !important;
+ margin-bottom: 1rem;
+
+ [data-dark-mode] & {
+ color: $white !important;
+ }
+ }
+}
diff --git a/assets/scss/components/_code.scss b/assets/scss/components/_code.scss
new file mode 100644
index 00000000..1b850102
--- /dev/null
+++ b/assets/scss/components/_code.scss
@@ -0,0 +1,187 @@
+pre,
+code,
+kbd,
+samp {
+ font-family: $font-family-monospace;
+ font-size: $font-size-sm;
+ border-radius: $border-radius;
+}
+
+code {
+ background: $bg-light;
+ color: $black;
+ padding: 0.25rem 0.5rem;
+}
+
+pre {
+ margin: 2rem 0;
+ border-radius: 14px;
+ border: 1px solid $gray-300;
+ position: relative;
+ [data-dark-mode] & {
+ border: none;
+ }
+}
+
+pre code {
+ display: block;
+ overflow-x: auto;
+ line-height: $line-height-base;
+ padding: 1.25rem 1.5rem;
+ tab-size: 4;
+ scrollbar-width: thin;
+ scrollbar-color: transparent transparent;
+}
+
+.hljs {
+ padding: 2rem !important;
+}
+
+@include media-breakpoint-down(sm) {
+ pre,
+ code,
+ kbd,
+ samp {
+ border-radius: 0;
+ }
+
+ pre {
+ margin: 2rem -1.5rem;
+ }
+
+ .copy-btn {
+ top: 0.5rem;
+ right: 0.5rem;
+ }
+}
+
+pre code::-webkit-scrollbar {
+ height: 5px;
+}
+
+pre code::-webkit-scrollbar-thumb {
+ background: $gray-400;
+}
+
+pre code:hover {
+ scrollbar-width: thin;
+ scrollbar-color: $gray-500 transparent;
+}
+
+pre code::-webkit-scrollbar-thumb:hover {
+ background: $gray-500;
+}
+
+code.language-mermaid {
+ background: none;
+}
+
+.copy-btn {
+ position: absolute;
+ top: 1rem;
+ right: 1rem;
+ padding: 0.5rem;
+ background: rgba(255, 255, 255, 0.9);
+ border: 1px solid $gray-300;
+ border-radius: 6px;
+ cursor: pointer;
+ transition: all 0.2s ease;
+ z-index: 10;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ width: 2rem;
+ height: 2rem;
+
+ &:hover {
+ background: rgba(255, 255, 255, 1);
+ border-color: $gray-400;
+ transform: translateY(-1px);
+ }
+
+ &:active {
+ transform: translateY(0);
+ }
+
+ // Light mode - show regular icon, hide dark icon and success elements
+ .copy-icon {
+ display: block;
+ }
+
+ .copy-icon-dark {
+ display: none;
+ }
+
+ .copy-success-icon {
+ display: none;
+ }
+
+ .copy-text {
+ display: none;
+ font-size: 0.75rem;
+ font-weight: 500;
+ margin-left: 0.25rem;
+ color: $electric-blue;
+ white-space: nowrap;
+ }
+
+ // Success state
+ &.copy-success {
+ background: rgba(34, 197, 94, 0.1);
+ border-color: $electric-blue;
+ width: auto;
+ padding: 0.5rem 0.75rem;
+
+ .copy-icon,
+ .copy-icon-dark {
+ display: none;
+ }
+
+ .copy-success-icon {
+ display: block;
+ }
+
+ .copy-text {
+ display: block;
+ }
+
+ &:hover {
+ background: rgba(34, 197, 94, 0.15);
+ transform: none;
+ }
+ }
+
+ // Dark mode styles
+ [data-dark-mode] & {
+ background: rgba(0, 0, 0, 0.8);
+ border-color: $gray-600;
+
+ &:hover {
+ background: rgba(0, 0, 0, 0.9);
+ border-color: $gray-500;
+ }
+
+ // Dark mode - hide regular icon, show dark icon
+ .copy-icon {
+ display: none;
+ }
+
+ .copy-icon-dark {
+ display: block;
+ }
+
+ .copy-text {
+ color: $electric-blue;
+ }
+
+ // Dark mode success state
+ &.copy-success {
+ background: rgba(34, 197, 94, 0.2);
+ border-color: $electric-blue;
+
+ &:hover {
+ background: rgba(34, 197, 94, 0.25);
+ }
+ }
+ }
+}
diff --git a/assets/scss/components/_tabs.scss b/assets/scss/components/_tabs.scss
new file mode 100644
index 00000000..2e567f82
--- /dev/null
+++ b/assets/scss/components/_tabs.scss
@@ -0,0 +1,59 @@
+.nav-tabs {
+ margin-bottom: 0;
+ border-bottom: none;
+ border-bottom-color: $primary;
+}
+
+.docs-content .doks-nav-item {
+ margin-bottom: 0;
+
+ &:first-child {
+ margin-left: 0;
+ }
+}
+
+.nav .nav-link {
+ color: $gray-900;
+ border-radius: 14px 14px 0 0;
+ font-weight: 500;
+
+ &:hover {
+ background-color: $gray-100;
+ border-color: transparent;
+ border-bottom: 1px solid $gray-300;
+ text-decoration: none;
+ }
+
+ &.active {
+ color: $gray-900;
+ background-color: $gray-100;
+ border-color: $gray-300;
+ border-bottom: 1px solid $white;
+ transform: translateY(1px);
+ }
+
+ &:not(.active) {
+ color: $grey-3 !important;
+ border: none;
+ }
+}
+
+.nav-tabs .nav-link.active {
+ border-color: $primary;
+ border-bottom-color: white;
+ color: $dark;
+}
+
+.tab-content {
+ border: 1px solid $primary;
+ border-radius: 12px;
+ border-top-left-radius: 0;
+ padding: 20px;
+ margin-bottom: 1.5rem;
+}
+
+.tab-content.examples-tab-content {
+ border-top: 1px solid $gray-300;
+ padding-top: 20px;
+ margin-bottom: 1.5rem;
+}
diff --git a/assets/scss/main.scss b/assets/scss/main.scss
index 115514cf..851929db 100644
--- a/assets/scss/main.scss
+++ b/assets/scss/main.scss
@@ -10,6 +10,7 @@
@import "../vendor/Font-Awesome/scss/regular.scss";
@import "../vendor/Font-Awesome/scss/brands.scss";
+@import "global";
@import "support/utilities";
@import "colors";
@import "boxes";
@@ -30,6 +31,11 @@
@import "taxonomy";
@import "drawio";
@import "fonts";
+@import "examples";
+
+@import "components/cards";
+@import "components/code";
+@import "components/tabs";
@if $td-enable-google-fonts {
@import url($web-font-path);
@@ -66,6 +72,7 @@ footer {
@import "rtl/main";
@import "styles_project";
+@import "navbar_project";
.breadcrumb {
padding: 0;
diff --git a/config.toml b/config.toml
index 961f22a6..bd62a53e 100644
--- a/config.toml
+++ b/config.toml
@@ -17,12 +17,23 @@ enableGitInfo = true
# Comment out to enable taxonomies in Docsy
disableKinds = []
+[menus]
+[[menus.main]]
+ name = "Documentation"
+ url = "/docs"
+ weight = 1
+
+[[menus.main]]
+ name = "Examples"
+ url = "/examples"
+ weight = 2
+
# You can add your own taxonomies
[taxonomies]
tag = "tags"
category = "categories"
-[params.taxonomy]
+[Params.taxonomy]
# set taxonomyCloud = [] to hide taxonomy clouds
taxonomyCloud = []
@@ -54,7 +65,7 @@ anchor = "smart"
[services]
[services.googleAnalytics]
-# Comment out the next line to disable GA tracking. Also disables the feature described in [params.ui.feedback].
+# Comment out the next line to disable GA tracking. Also disables the feature described in [Params.ui.feedback].
id = "UA-00000000-0"
# Language configuration
@@ -65,7 +76,7 @@ title = "Score"
languageName = "English"
# Weight used for sorting.
weight = 1
-[languages.en.params]
+[languages.en.Params]
description = "Score is platform-agnostic specification for defining environment configuration for cloud based workloads"
[markup]
@@ -84,7 +95,13 @@ style = "tango"
[outputs]
section = ["HTML", "RSS"]
-[params]
+[Params]
+GitHubBaseUrl = "https://github.com"
+GitHubRawBaseUrl = "https://raw.githubusercontent.com"
+exampleLibraryBlacklistedFolders = [".github","tools"]
+exampleLibraryGitHubBaseUrl = "https://github.com/score-spec/examples/blob/main"
+exampleLibrarySourcePath = "/gen/external-content"
+
# copyright = "Score"
# privacy_policy = "https://policies.google.com/privacy"
@@ -92,7 +109,7 @@ section = ["HTML", "RSS"]
# images = ["images/project-illustration.png"]
# Menu title if your navbar has a versions selector to access old versions of your site.
-# This menu appears only if you have at least one [params.versions] set.
+# This menu appears only if you have at least one [Params.versions] set.
version_menu = "Releases"
# Flag used in the "version-banner" partial to decide whether to display a
@@ -133,8 +150,23 @@ offlineSearch = true
# Enable syntax highlighting and copy buttons on code blocks with Prism
prism_syntax_highlighting = false
+
+# Example library configuration
+[[Params.exampleLibraryGitHubUrls]]
+name = "score/specification"
+url = "https://github.com/score-spec/examples/blob/main"
+[[Params.exampleLibraryGitHubUrls]]
+name = "score/resources/default-provisioners"
+url = "https://github.com/score-spec/examples/blob/main"
+[[Params.exampleLibraryGitHubUrls]]
+name = "score/resources/community-provisioners"
+url = "https://github.com/score-spec/community-provisioners/blob/main"
+[[Params.exampleTypeLabels]]
+name = "score"
+labels = ["Specification", "Resources", "Provisioner"]
+
# User interface configuration
-[params.ui]
+[Params.ui]
# Set to true to disable breadcrumb navigation.
breadcrumb_disable = false
# Set to true to disable the About link in the site footer
@@ -153,7 +185,7 @@ sidebar_search_disable = true
# This feature depends on [services.googleAnalytics] and will be disabled if "services.googleAnalytics.id" is not set.
# If you want this feature, but occasionally need to remove the "Feedback" section from a single page,
# add "hide_feedback: true" to the page's front matter.
-[params.ui.feedback]
+[Params.ui.feedback]
enable = false
# The responses that the user sees after clicking "yes" (the page was helpful) or "no" (the page was not helpful).
yes = 'Glad to hear it! Please tell us how we can improve.'
@@ -162,39 +194,39 @@ no = 'Sorry to hear that. Please }}
+Explore a curated set of example files covering a range of entities for working with Score. Select the type of artefact you’re interested in, then refine your search to find exactly what you need.
+{{< /gradient-image-card >}}
+
+ {{ .Params.topTitle | safeHTML }}
+
+## Examples
+
+
+
+{{< grid columns="3">}}
+
+{{< multi-link-card title="Score specification and resources" >}}
+{{< link-card-item text="Find some Score files examples illustrating how to use the Score specification as well as how to use the resources provisioners with both `score-compose` and `score-k8s`." url="/examples/score" linkLabel="Get examples" >}}
+{{< /multi-link-card >}}
+
+{{< multi-link-card title="More examples" >}}
+{{< link-card-item text="Find more advanced examples illustrating how to deploy a NodeJS application talking to a PostgreSQL database, how to deploy Backstage and Nginx, how to use Dapr with your workloads, etc." url="/docs/examples" linkLabel="Get examples" >}}
+{{< /multi-link-card >}}
+
+{{< /grid >}}
+
+
+
+
diff --git a/content/en/examples/score/_index.md b/content/en/examples/score/_index.md
new file mode 100644
index 00000000..fe4dcec4
--- /dev/null
+++ b/content/en/examples/score/_index.md
@@ -0,0 +1,9 @@
+---
+title: "Score"
+draft: false
+type: examples
+---
+
+The examples below illustrate how to use [Score]({{< relref "/docs" >}}) files for your workload specification.
+
+---
diff --git a/content/en/examples/score/resources/community-provisioners/dapr-pubsub.md b/content/en/examples/score/resources/community-provisioners/dapr-pubsub.md
new file mode 100644
index 00000000..4355f66f
--- /dev/null
+++ b/content/en/examples/score/resources/community-provisioners/dapr-pubsub.md
@@ -0,0 +1,117 @@
+---
+title: "Dapr Pubsub"
+draft: false
+mermaid: true
+type: examples
+excerpt: ''
+hasMore: false
+parent: "Community Provisioners"
+flavor: "Resources"
+
+---
+
+{{% example-file filename="score.yaml" dir="score/resources/community-provisioners/dapr-pubsub" githubUrl="https://github.com/score-spec/community-provisioners/blob/main" %}}
+
+{{< tabs >}}
+{{% tab name="score-compose" %}}
+{{% example-file filename="10-redis-dapr-pubsub.provisioners.yaml" dir="score/resources/community-provisioners/dapr-pubsub/score-compose" githubUrl="https://github.com/score-spec/community-provisioners/blob/main" %}}
+
+---
+
+Initialize your local workspace, by importing a specific community provisioner:
+
+```bash
+score-commpose init --provisioners REPLACE-ME-WITH-ACTUAL-PROVISIONER-FILE-URL.yaml
+```
+
+_Note: you need to replace `REPLACE-ME-WITH-ACTUAL-PROVISIONER-FILE-URL.yaml` by the actual provisioner file you want to use and import. More information [here](https://docs.score.dev/docs/score-implementation/score-compose/resources-provisioners/#install-provisioner-files)._
+
+Get the provisioners definition:
+
+```bash
+score-compose provisioners list
+```
+
+Generate the platform specific manifests:
+
+```bash
+score-commpose generate score.yaml
+```
+
+See the resource outputs:
+
+```bash
+score-commpose resources list
+```
+
+You can run the following command on each resource listed with the previous command to get their `outputs`:
+
+```bash
+score-commpose resources get-outputs
+```
+
+Deploy the generated manifests:
+
+```bash
+docker compose up -d
+```
+
+See the running containers:
+
+```bash
+docker ps
+```
+
+{{%/ tab %}}
+{{% tab name="score-k8s" %}}
+{{% example-file filename="10-rabbitmq-dapr-pubsub.provisioners.yaml" dir="score/resources/community-provisioners/dapr-pubsub/score-k8s" githubUrl="https://github.com/score-spec/community-provisioners/blob/main" %}}
+{{% example-file filename="10-redis-dapr-pubsub.provisioners.yaml" dir="score/resources/community-provisioners/dapr-pubsub/score-k8s" githubUrl="https://github.com/score-spec/community-provisioners/blob/main" %}}
+
+---
+
+Initialize your local workspace, by importing a specific community provisioner:
+
+```bash
+score-k8s init --provisioners REPLACE-ME-WITH-ACTUAL-PROVISIONER-FILE-URL.yaml
+```
+
+_Note: you need to replace `REPLACE-ME-WITH-ACTUAL-PROVISIONER-FILE-URL.yaml` by the actual provisioner file you want to use and import. More information [here](https://docs.score.dev/docs/score-implementation/score-k8s/resources-provisioners/#install-provisioner-files)._
+
+Get the provisioners definition:
+
+```bash
+score-k8s provisioners list
+```
+
+Generate the platform specific manifests:
+
+```bash
+score-k8s generate score.yaml
+```
+
+See the resource outputs:
+
+```bash
+score-k8s resources list
+```
+
+You can run the following command on each resource listed with the previous command to get their `outputs`:
+
+```bash
+score-k8s resources get-outputs
+```
+
+Deploy the generated manifests:
+
+```bash
+kubectl apply -f manifests.yaml
+```
+
+See the running containers:
+
+```bash
+kubectl get all
+```
+
+{{%/ tab %}}
+{{< /tabs >}}
diff --git a/content/en/examples/score/resources/community-provisioners/dapr-state-store.md b/content/en/examples/score/resources/community-provisioners/dapr-state-store.md
new file mode 100644
index 00000000..0347c24b
--- /dev/null
+++ b/content/en/examples/score/resources/community-provisioners/dapr-state-store.md
@@ -0,0 +1,116 @@
+---
+title: "Dapr State Store"
+draft: false
+mermaid: true
+type: examples
+excerpt: ''
+hasMore: false
+parent: "Community Provisioners"
+flavor: "Resources"
+
+---
+
+{{% example-file filename="score.yaml" dir="score/resources/community-provisioners/dapr-state-store" githubUrl="https://github.com/score-spec/community-provisioners/blob/main" %}}
+
+{{< tabs >}}
+{{% tab name="score-compose" %}}
+{{% example-file filename="10-redis-dapr-state-store.provisioners.yaml" dir="score/resources/community-provisioners/dapr-state-store/score-compose" githubUrl="https://github.com/score-spec/community-provisioners/blob/main" %}}
+
+---
+
+Initialize your local workspace, by importing a specific community provisioner:
+
+```bash
+score-commpose init --provisioners REPLACE-ME-WITH-ACTUAL-PROVISIONER-FILE-URL.yaml
+```
+
+_Note: you need to replace `REPLACE-ME-WITH-ACTUAL-PROVISIONER-FILE-URL.yaml` by the actual provisioner file you want to use and import. More information [here](https://docs.score.dev/docs/score-implementation/score-compose/resources-provisioners/#install-provisioner-files)._
+
+Get the provisioners definition:
+
+```bash
+score-compose provisioners list
+```
+
+Generate the platform specific manifests:
+
+```bash
+score-commpose generate score.yaml
+```
+
+See the resource outputs:
+
+```bash
+score-commpose resources list
+```
+
+You can run the following command on each resource listed with the previous command to get their `outputs`:
+
+```bash
+score-commpose resources get-outputs
+```
+
+Deploy the generated manifests:
+
+```bash
+docker compose up -d
+```
+
+See the running containers:
+
+```bash
+docker ps
+```
+
+{{%/ tab %}}
+{{% tab name="score-k8s" %}}
+{{% example-file filename="10-redis-dapr-state-store.provisioners.yaml" dir="score/resources/community-provisioners/dapr-state-store/score-k8s" githubUrl="https://github.com/score-spec/community-provisioners/blob/main" %}}
+
+---
+
+Initialize your local workspace, by importing a specific community provisioner:
+
+```bash
+score-k8s init --provisioners REPLACE-ME-WITH-ACTUAL-PROVISIONER-FILE-URL.yaml
+```
+
+_Note: you need to replace `REPLACE-ME-WITH-ACTUAL-PROVISIONER-FILE-URL.yaml` by the actual provisioner file you want to use and import. More information [here](https://docs.score.dev/docs/score-implementation/score-k8s/resources-provisioners/#install-provisioner-files)._
+
+Get the provisioners definition:
+
+```bash
+score-k8s provisioners list
+```
+
+Generate the platform specific manifests:
+
+```bash
+score-k8s generate score.yaml
+```
+
+See the resource outputs:
+
+```bash
+score-k8s resources list
+```
+
+You can run the following command on each resource listed with the previous command to get their `outputs`:
+
+```bash
+score-k8s resources get-outputs
+```
+
+Deploy the generated manifests:
+
+```bash
+kubectl apply -f manifests.yaml
+```
+
+See the running containers:
+
+```bash
+kubectl get all
+```
+
+{{%/ tab %}}
+{{< /tabs >}}
diff --git a/content/en/examples/score/resources/community-provisioners/dapr-subscription.md b/content/en/examples/score/resources/community-provisioners/dapr-subscription.md
new file mode 100644
index 00000000..99032639
--- /dev/null
+++ b/content/en/examples/score/resources/community-provisioners/dapr-subscription.md
@@ -0,0 +1,116 @@
+---
+title: "Dapr Subscription"
+draft: false
+mermaid: true
+type: examples
+excerpt: ''
+hasMore: false
+parent: "Community Provisioners"
+flavor: "Resources"
+
+---
+
+{{% example-file filename="score.yaml" dir="score/resources/community-provisioners/dapr-subscription" githubUrl="https://github.com/score-spec/community-provisioners/blob/main" %}}
+
+{{< tabs >}}
+{{% tab name="score-compose" %}}
+{{% example-file filename="10-dapr-subscription.provisioners.yaml" dir="score/resources/community-provisioners/dapr-subscription/score-compose" githubUrl="https://github.com/score-spec/community-provisioners/blob/main" %}}
+
+---
+
+Initialize your local workspace, by importing a specific community provisioner:
+
+```bash
+score-commpose init --provisioners REPLACE-ME-WITH-ACTUAL-PROVISIONER-FILE-URL.yaml
+```
+
+_Note: you need to replace `REPLACE-ME-WITH-ACTUAL-PROVISIONER-FILE-URL.yaml` by the actual provisioner file you want to use and import. More information [here](https://docs.score.dev/docs/score-implementation/score-compose/resources-provisioners/#install-provisioner-files)._
+
+Get the provisioners definition:
+
+```bash
+score-compose provisioners list
+```
+
+Generate the platform specific manifests:
+
+```bash
+score-commpose generate score.yaml
+```
+
+See the resource outputs:
+
+```bash
+score-commpose resources list
+```
+
+You can run the following command on each resource listed with the previous command to get their `outputs`:
+
+```bash
+score-commpose resources get-outputs
+```
+
+Deploy the generated manifests:
+
+```bash
+docker compose up -d
+```
+
+See the running containers:
+
+```bash
+docker ps
+```
+
+{{%/ tab %}}
+{{% tab name="score-k8s" %}}
+{{% example-file filename="10-dapr-subscription.provisioners.yaml" dir="score/resources/community-provisioners/dapr-subscription/score-k8s" githubUrl="https://github.com/score-spec/community-provisioners/blob/main" %}}
+
+---
+
+Initialize your local workspace, by importing a specific community provisioner:
+
+```bash
+score-k8s init --provisioners REPLACE-ME-WITH-ACTUAL-PROVISIONER-FILE-URL.yaml
+```
+
+_Note: you need to replace `REPLACE-ME-WITH-ACTUAL-PROVISIONER-FILE-URL.yaml` by the actual provisioner file you want to use and import. More information [here](https://docs.score.dev/docs/score-implementation/score-k8s/resources-provisioners/#install-provisioner-files)._
+
+Get the provisioners definition:
+
+```bash
+score-k8s provisioners list
+```
+
+Generate the platform specific manifests:
+
+```bash
+score-k8s generate score.yaml
+```
+
+See the resource outputs:
+
+```bash
+score-k8s resources list
+```
+
+You can run the following command on each resource listed with the previous command to get their `outputs`:
+
+```bash
+score-k8s resources get-outputs
+```
+
+Deploy the generated manifests:
+
+```bash
+kubectl apply -f manifests.yaml
+```
+
+See the running containers:
+
+```bash
+kubectl get all
+```
+
+{{%/ tab %}}
+{{< /tabs >}}
diff --git a/content/en/examples/score/resources/community-provisioners/dns.md b/content/en/examples/score/resources/community-provisioners/dns.md
new file mode 100644
index 00000000..14236c76
--- /dev/null
+++ b/content/en/examples/score/resources/community-provisioners/dns.md
@@ -0,0 +1,120 @@
+---
+title: "Dns"
+draft: false
+mermaid: true
+type: examples
+excerpt: ''
+hasMore: false
+parent: "Community Provisioners"
+flavor: "Resources"
+
+---
+
+{{% example-file filename="score.yaml" dir="score/resources/community-provisioners/dns" githubUrl="https://github.com/score-spec/community-provisioners/blob/main" %}}
+
+{{< tabs >}}
+{{% tab name="score-compose" %}}
+{{% example-file filename="10-dns-in-codespace.provisioners.yaml" dir="score/resources/community-provisioners/dns/score-compose" githubUrl="https://github.com/score-spec/community-provisioners/blob/main" %}}
+{{% example-file filename="10-dns-with-url.provisioners.yaml" dir="score/resources/community-provisioners/dns/score-compose" githubUrl="https://github.com/score-spec/community-provisioners/blob/main" %}}
+{{% example-file filename="README.md" dir="score/resources/community-provisioners/dns/score-compose" githubUrl="https://github.com/score-spec/community-provisioners/blob/main" %}}
+
+---
+
+Initialize your local workspace, by importing a specific community provisioner:
+
+```bash
+score-commpose init --provisioners REPLACE-ME-WITH-ACTUAL-PROVISIONER-FILE-URL.yaml
+```
+
+_Note: you need to replace `REPLACE-ME-WITH-ACTUAL-PROVISIONER-FILE-URL.yaml` by the actual provisioner file you want to use and import. More information [here](https://docs.score.dev/docs/score-implementation/score-compose/resources-provisioners/#install-provisioner-files)._
+
+Get the provisioners definition:
+
+```bash
+score-compose provisioners list
+```
+
+Generate the platform specific manifests:
+
+```bash
+score-commpose generate score.yaml
+```
+
+See the resource outputs:
+
+```bash
+score-commpose resources list
+```
+
+You can run the following command on each resource listed with the previous command to get their `outputs`:
+
+```bash
+score-commpose resources get-outputs
+```
+
+Deploy the generated manifests:
+
+```bash
+docker compose up -d
+```
+
+See the running containers:
+
+```bash
+docker ps
+```
+
+{{%/ tab %}}
+{{% tab name="score-k8s" %}}
+{{% example-file filename="10-dns-in-codespace.provisioners.yaml" dir="score/resources/community-provisioners/dns/score-k8s" githubUrl="https://github.com/score-spec/community-provisioners/blob/main" %}}
+{{% example-file filename="10-dns-with-url.provisioners.yaml" dir="score/resources/community-provisioners/dns/score-k8s" githubUrl="https://github.com/score-spec/community-provisioners/blob/main" %}}
+{{% example-file filename="README.md" dir="score/resources/community-provisioners/dns/score-k8s" githubUrl="https://github.com/score-spec/community-provisioners/blob/main" %}}
+
+---
+
+Initialize your local workspace, by importing a specific community provisioner:
+
+```bash
+score-k8s init --provisioners REPLACE-ME-WITH-ACTUAL-PROVISIONER-FILE-URL.yaml
+```
+
+_Note: you need to replace `REPLACE-ME-WITH-ACTUAL-PROVISIONER-FILE-URL.yaml` by the actual provisioner file you want to use and import. More information [here](https://docs.score.dev/docs/score-implementation/score-k8s/resources-provisioners/#install-provisioner-files)._
+
+Get the provisioners definition:
+
+```bash
+score-k8s provisioners list
+```
+
+Generate the platform specific manifests:
+
+```bash
+score-k8s generate score.yaml
+```
+
+See the resource outputs:
+
+```bash
+score-k8s resources list
+```
+
+You can run the following command on each resource listed with the previous command to get their `outputs`:
+
+```bash
+score-k8s resources get-outputs
+```
+
+Deploy the generated manifests:
+
+```bash
+kubectl apply -f manifests.yaml
+```
+
+See the running containers:
+
+```bash
+kubectl get all
+```
+
+{{%/ tab %}}
+{{< /tabs >}}
diff --git a/content/en/examples/score/resources/community-provisioners/environment.md b/content/en/examples/score/resources/community-provisioners/environment.md
new file mode 100644
index 00000000..33bb89cd
--- /dev/null
+++ b/content/en/examples/score/resources/community-provisioners/environment.md
@@ -0,0 +1,119 @@
+---
+title: "Environment"
+draft: false
+mermaid: true
+type: examples
+excerpt: ''
+hasMore: false
+parent: "Community Provisioners"
+flavor: "Resources"
+
+---
+
+{{% example-file filename=".env" dir="score/resources/community-provisioners/environment" githubUrl="https://github.com/score-spec/community-provisioners/blob/main" %}}
+{{% example-file filename="score.yaml" dir="score/resources/community-provisioners/environment" githubUrl="https://github.com/score-spec/community-provisioners/blob/main" %}}
+
+{{< tabs >}}
+{{% tab name="score-compose" %}}
+{{% example-file filename="10-env.provisioners.yaml" dir="score/resources/community-provisioners/environment/score-compose" githubUrl="https://github.com/score-spec/community-provisioners/blob/main" %}}
+{{% example-file filename="README.md" dir="score/resources/community-provisioners/environment/score-compose" githubUrl="https://github.com/score-spec/community-provisioners/blob/main" %}}
+
+---
+
+Initialize your local workspace, by importing a specific community provisioner:
+
+```bash
+score-commpose init --provisioners REPLACE-ME-WITH-ACTUAL-PROVISIONER-FILE-URL.yaml
+```
+
+_Note: you need to replace `REPLACE-ME-WITH-ACTUAL-PROVISIONER-FILE-URL.yaml` by the actual provisioner file you want to use and import. More information [here](https://docs.score.dev/docs/score-implementation/score-compose/resources-provisioners/#install-provisioner-files)._
+
+Get the provisioners definition:
+
+```bash
+score-compose provisioners list
+```
+
+Generate the platform specific manifests:
+
+```bash
+score-commpose generate score.yaml
+```
+
+See the resource outputs:
+
+```bash
+score-commpose resources list
+```
+
+You can run the following command on each resource listed with the previous command to get their `outputs`:
+
+```bash
+score-commpose resources get-outputs
+```
+
+Deploy the generated manifests:
+
+```bash
+docker compose up -d
+```
+
+See the running containers:
+
+```bash
+docker ps
+```
+
+{{%/ tab %}}
+{{% tab name="score-k8s" %}}
+{{% example-file filename="10-env.provisioners.yaml" dir="score/resources/community-provisioners/environment/score-k8s" githubUrl="https://github.com/score-spec/community-provisioners/blob/main" %}}
+{{% example-file filename="README.md" dir="score/resources/community-provisioners/environment/score-k8s" githubUrl="https://github.com/score-spec/community-provisioners/blob/main" %}}
+
+---
+
+Initialize your local workspace, by importing a specific community provisioner:
+
+```bash
+score-k8s init --provisioners REPLACE-ME-WITH-ACTUAL-PROVISIONER-FILE-URL.yaml
+```
+
+_Note: you need to replace `REPLACE-ME-WITH-ACTUAL-PROVISIONER-FILE-URL.yaml` by the actual provisioner file you want to use and import. More information [here](https://docs.score.dev/docs/score-implementation/score-k8s/resources-provisioners/#install-provisioner-files)._
+
+Get the provisioners definition:
+
+```bash
+score-k8s provisioners list
+```
+
+Generate the platform specific manifests:
+
+```bash
+score-k8s generate score.yaml
+```
+
+See the resource outputs:
+
+```bash
+score-k8s resources list
+```
+
+You can run the following command on each resource listed with the previous command to get their `outputs`:
+
+```bash
+score-k8s resources get-outputs
+```
+
+Deploy the generated manifests:
+
+```bash
+kubectl apply -f manifests.yaml
+```
+
+See the running containers:
+
+```bash
+kubectl get all
+```
+
+{{%/ tab %}}
+{{< /tabs >}}
diff --git a/content/en/examples/score/resources/community-provisioners/horizontal-pod-autoscaler.md b/content/en/examples/score/resources/community-provisioners/horizontal-pod-autoscaler.md
new file mode 100644
index 00000000..5725c982
--- /dev/null
+++ b/content/en/examples/score/resources/community-provisioners/horizontal-pod-autoscaler.md
@@ -0,0 +1,116 @@
+---
+title: "Horizontal Pod Autoscaler"
+draft: false
+mermaid: true
+type: examples
+excerpt: ''
+hasMore: false
+parent: "Community Provisioners"
+flavor: "Resources"
+
+---
+
+{{% example-file filename="score.yaml" dir="score/resources/community-provisioners/horizontal-pod-autoscaler" githubUrl="https://github.com/score-spec/community-provisioners/blob/main" %}}
+
+{{< tabs >}}
+{{% tab name="score-compose" %}}
+{{% example-file filename="10-hpa.provisioners.yaml" dir="score/resources/community-provisioners/horizontal-pod-autoscaler/score-compose" githubUrl="https://github.com/score-spec/community-provisioners/blob/main" %}}
+
+---
+
+Initialize your local workspace, by importing a specific community provisioner:
+
+```bash
+score-commpose init --provisioners REPLACE-ME-WITH-ACTUAL-PROVISIONER-FILE-URL.yaml
+```
+
+_Note: you need to replace `REPLACE-ME-WITH-ACTUAL-PROVISIONER-FILE-URL.yaml` by the actual provisioner file you want to use and import. More information [here](https://docs.score.dev/docs/score-implementation/score-compose/resources-provisioners/#install-provisioner-files)._
+
+Get the provisioners definition:
+
+```bash
+score-compose provisioners list
+```
+
+Generate the platform specific manifests:
+
+```bash
+score-commpose generate score.yaml
+```
+
+See the resource outputs:
+
+```bash
+score-commpose resources list
+```
+
+You can run the following command on each resource listed with the previous command to get their `outputs`:
+
+```bash
+score-commpose resources get-outputs
+```
+
+Deploy the generated manifests:
+
+```bash
+docker compose up -d
+```
+
+See the running containers:
+
+```bash
+docker ps
+```
+
+{{%/ tab %}}
+{{% tab name="score-k8s" %}}
+{{% example-file filename="10-hpa.provisioners.yaml" dir="score/resources/community-provisioners/horizontal-pod-autoscaler/score-k8s" githubUrl="https://github.com/score-spec/community-provisioners/blob/main" %}}
+
+---
+
+Initialize your local workspace, by importing a specific community provisioner:
+
+```bash
+score-k8s init --provisioners REPLACE-ME-WITH-ACTUAL-PROVISIONER-FILE-URL.yaml
+```
+
+_Note: you need to replace `REPLACE-ME-WITH-ACTUAL-PROVISIONER-FILE-URL.yaml` by the actual provisioner file you want to use and import. More information [here](https://docs.score.dev/docs/score-implementation/score-k8s/resources-provisioners/#install-provisioner-files)._
+
+Get the provisioners definition:
+
+```bash
+score-k8s provisioners list
+```
+
+Generate the platform specific manifests:
+
+```bash
+score-k8s generate score.yaml
+```
+
+See the resource outputs:
+
+```bash
+score-k8s resources list
+```
+
+You can run the following command on each resource listed with the previous command to get their `outputs`:
+
+```bash
+score-k8s resources get-outputs
+```
+
+Deploy the generated manifests:
+
+```bash
+kubectl apply -f manifests.yaml
+```
+
+See the running containers:
+
+```bash
+kubectl get all
+```
+
+{{%/ tab %}}
+{{< /tabs >}}
diff --git a/content/en/examples/score/resources/community-provisioners/redis.md b/content/en/examples/score/resources/community-provisioners/redis.md
new file mode 100644
index 00000000..8dfc4577
--- /dev/null
+++ b/content/en/examples/score/resources/community-provisioners/redis.md
@@ -0,0 +1,114 @@
+---
+title: "Redis"
+draft: false
+mermaid: true
+type: examples
+excerpt: ''
+hasMore: false
+parent: "Community Provisioners"
+flavor: "Resources"
+
+---
+
+{{% example-file filename="score.yaml" dir="score/resources/community-provisioners/redis" githubUrl="https://github.com/score-spec/community-provisioners/blob/main" %}}
+
+{{< tabs >}}
+{{% tab name="score-compose" %}}
+Initialize your local workspace, by importing a specific community provisioner:
+
+```bash
+score-commpose init --provisioners REPLACE-ME-WITH-ACTUAL-PROVISIONER-FILE-URL.yaml
+```
+
+_Note: you need to replace `REPLACE-ME-WITH-ACTUAL-PROVISIONER-FILE-URL.yaml` by the actual provisioner file you want to use and import. More information [here](https://docs.score.dev/docs/score-implementation/score-compose/resources-provisioners/#install-provisioner-files)._
+
+Get the provisioners definition:
+
+```bash
+score-compose provisioners list
+```
+
+Generate the platform specific manifests:
+
+```bash
+score-commpose generate score.yaml
+```
+
+See the resource outputs:
+
+```bash
+score-commpose resources list
+```
+
+You can run the following command on each resource listed with the previous command to get their `outputs`:
+
+```bash
+score-commpose resources get-outputs
+```
+
+Deploy the generated manifests:
+
+```bash
+docker compose up -d
+```
+
+See the running containers:
+
+```bash
+docker ps
+```
+
+{{%/ tab %}}
+{{% tab name="score-k8s" %}}
+{{% example-file filename="10-redis-helm-template.provisioners.yaml" dir="score/resources/community-provisioners/redis/score-k8s" githubUrl="https://github.com/score-spec/community-provisioners/blob/main" %}}
+{{% example-file filename="10-redis-helm-upgrade.provisioners.yaml" dir="score/resources/community-provisioners/redis/score-k8s" githubUrl="https://github.com/score-spec/community-provisioners/blob/main" %}}
+{{% example-file filename="README.md" dir="score/resources/community-provisioners/redis/score-k8s" githubUrl="https://github.com/score-spec/community-provisioners/blob/main" %}}
+
+---
+
+Initialize your local workspace, by importing a specific community provisioner:
+
+```bash
+score-k8s init --provisioners REPLACE-ME-WITH-ACTUAL-PROVISIONER-FILE-URL.yaml
+```
+
+_Note: you need to replace `REPLACE-ME-WITH-ACTUAL-PROVISIONER-FILE-URL.yaml` by the actual provisioner file you want to use and import. More information [here](https://docs.score.dev/docs/score-implementation/score-k8s/resources-provisioners/#install-provisioner-files)._
+
+Get the provisioners definition:
+
+```bash
+score-k8s provisioners list
+```
+
+Generate the platform specific manifests:
+
+```bash
+score-k8s generate score.yaml
+```
+
+See the resource outputs:
+
+```bash
+score-k8s resources list
+```
+
+You can run the following command on each resource listed with the previous command to get their `outputs`:
+
+```bash
+score-k8s resources get-outputs
+```
+
+Deploy the generated manifests:
+
+```bash
+kubectl apply -f manifests.yaml
+```
+
+See the running containers:
+
+```bash
+kubectl get all
+```
+
+{{%/ tab %}}
+{{< /tabs >}}
diff --git a/content/en/examples/score/resources/community-provisioners/route.md b/content/en/examples/score/resources/community-provisioners/route.md
new file mode 100644
index 00000000..62276d5f
--- /dev/null
+++ b/content/en/examples/score/resources/community-provisioners/route.md
@@ -0,0 +1,115 @@
+---
+title: "Route"
+draft: false
+mermaid: true
+type: examples
+excerpt: ''
+hasMore: false
+parent: "Community Provisioners"
+flavor: "Resources"
+
+---
+
+{{% example-file filename="score.yaml" dir="score/resources/community-provisioners/route" githubUrl="https://github.com/score-spec/community-provisioners/blob/main" %}}
+
+{{< tabs >}}
+{{% tab name="score-compose" %}}
+Initialize your local workspace, by importing a specific community provisioner:
+
+```bash
+score-commpose init --provisioners REPLACE-ME-WITH-ACTUAL-PROVISIONER-FILE-URL.yaml
+```
+
+_Note: you need to replace `REPLACE-ME-WITH-ACTUAL-PROVISIONER-FILE-URL.yaml` by the actual provisioner file you want to use and import. More information [here](https://docs.score.dev/docs/score-implementation/score-compose/resources-provisioners/#install-provisioner-files)._
+
+Get the provisioners definition:
+
+```bash
+score-compose provisioners list
+```
+
+Generate the platform specific manifests:
+
+```bash
+score-commpose generate score.yaml
+```
+
+See the resource outputs:
+
+```bash
+score-commpose resources list
+```
+
+You can run the following command on each resource listed with the previous command to get their `outputs`:
+
+```bash
+score-commpose resources get-outputs
+```
+
+Deploy the generated manifests:
+
+```bash
+docker compose up -d
+```
+
+See the running containers:
+
+```bash
+docker ps
+```
+
+{{%/ tab %}}
+{{% tab name="score-k8s" %}}
+{{% example-file filename="10-ingress-route.provisioners.yaml" dir="score/resources/community-provisioners/route/score-k8s" githubUrl="https://github.com/score-spec/community-provisioners/blob/main" %}}
+{{% example-file filename="10-ingress-with-netpol-route.provisioners.yaml" dir="score/resources/community-provisioners/route/score-k8s" githubUrl="https://github.com/score-spec/community-provisioners/blob/main" %}}
+{{% example-file filename="10-shared-gateway-httproute-with-netpol.provisioners.yaml" dir="score/resources/community-provisioners/route/score-k8s" githubUrl="https://github.com/score-spec/community-provisioners/blob/main" %}}
+{{% example-file filename="10-shared-gateway-httproute.provisioners.yaml" dir="score/resources/community-provisioners/route/score-k8s" githubUrl="https://github.com/score-spec/community-provisioners/blob/main" %}}
+
+---
+
+Initialize your local workspace, by importing a specific community provisioner:
+
+```bash
+score-k8s init --provisioners REPLACE-ME-WITH-ACTUAL-PROVISIONER-FILE-URL.yaml
+```
+
+_Note: you need to replace `REPLACE-ME-WITH-ACTUAL-PROVISIONER-FILE-URL.yaml` by the actual provisioner file you want to use and import. More information [here](https://docs.score.dev/docs/score-implementation/score-k8s/resources-provisioners/#install-provisioner-files)._
+
+Get the provisioners definition:
+
+```bash
+score-k8s provisioners list
+```
+
+Generate the platform specific manifests:
+
+```bash
+score-k8s generate score.yaml
+```
+
+See the resource outputs:
+
+```bash
+score-k8s resources list
+```
+
+You can run the following command on each resource listed with the previous command to get their `outputs`:
+
+```bash
+score-k8s resources get-outputs
+```
+
+Deploy the generated manifests:
+
+```bash
+kubectl apply -f manifests.yaml
+```
+
+See the running containers:
+
+```bash
+kubectl get all
+```
+
+{{%/ tab %}}
+{{< /tabs >}}
diff --git a/content/en/examples/score/resources/community-provisioners/service.md b/content/en/examples/score/resources/community-provisioners/service.md
new file mode 100644
index 00000000..d21102b1
--- /dev/null
+++ b/content/en/examples/score/resources/community-provisioners/service.md
@@ -0,0 +1,118 @@
+---
+title: "Service"
+draft: false
+mermaid: true
+type: examples
+excerpt: ''
+hasMore: false
+parent: "Community Provisioners"
+flavor: "Resources"
+
+---
+
+{{% example-file filename="score-backend.yaml" dir="score/resources/community-provisioners/service" githubUrl="https://github.com/score-spec/community-provisioners/blob/main" %}}
+{{% example-file filename="score-frontend.yaml" dir="score/resources/community-provisioners/service" githubUrl="https://github.com/score-spec/community-provisioners/blob/main" %}}
+
+{{< tabs >}}
+{{% tab name="score-compose" %}}
+{{% example-file filename="10-service.provisioners.yaml" dir="score/resources/community-provisioners/service/score-compose" githubUrl="https://github.com/score-spec/community-provisioners/blob/main" %}}
+
+---
+
+Initialize your local workspace, by importing a specific community provisioner:
+
+```bash
+score-commpose init --provisioners REPLACE-ME-WITH-ACTUAL-PROVISIONER-FILE-URL.yaml
+```
+
+_Note: you need to replace `REPLACE-ME-WITH-ACTUAL-PROVISIONER-FILE-URL.yaml` by the actual provisioner file you want to use and import. More information [here](https://docs.score.dev/docs/score-implementation/score-compose/resources-provisioners/#install-provisioner-files)._
+
+Get the provisioners definition:
+
+```bash
+score-compose provisioners list
+```
+
+Generate the platform specific manifests:
+
+```bash
+score-commpose generate score.yaml
+```
+
+See the resource outputs:
+
+```bash
+score-commpose resources list
+```
+
+You can run the following command on each resource listed with the previous command to get their `outputs`:
+
+```bash
+score-commpose resources get-outputs
+```
+
+Deploy the generated manifests:
+
+```bash
+docker compose up -d
+```
+
+See the running containers:
+
+```bash
+docker ps
+```
+
+{{%/ tab %}}
+{{% tab name="score-k8s" %}}
+{{% example-file filename="10-service-with-netpol.provisioners.yaml" dir="score/resources/community-provisioners/service/score-k8s" githubUrl="https://github.com/score-spec/community-provisioners/blob/main" %}}
+{{% example-file filename="10-service.provisioners.yaml" dir="score/resources/community-provisioners/service/score-k8s" githubUrl="https://github.com/score-spec/community-provisioners/blob/main" %}}
+
+---
+
+Initialize your local workspace, by importing a specific community provisioner:
+
+```bash
+score-k8s init --provisioners REPLACE-ME-WITH-ACTUAL-PROVISIONER-FILE-URL.yaml
+```
+
+_Note: you need to replace `REPLACE-ME-WITH-ACTUAL-PROVISIONER-FILE-URL.yaml` by the actual provisioner file you want to use and import. More information [here](https://docs.score.dev/docs/score-implementation/score-k8s/resources-provisioners/#install-provisioner-files)._
+
+Get the provisioners definition:
+
+```bash
+score-k8s provisioners list
+```
+
+Generate the platform specific manifests:
+
+```bash
+score-k8s generate score.yaml
+```
+
+See the resource outputs:
+
+```bash
+score-k8s resources list
+```
+
+You can run the following command on each resource listed with the previous command to get their `outputs`:
+
+```bash
+score-k8s resources get-outputs
+```
+
+Deploy the generated manifests:
+
+```bash
+kubectl apply -f manifests.yaml
+```
+
+See the running containers:
+
+```bash
+kubectl get all
+```
+
+{{%/ tab %}}
+{{< /tabs >}}
diff --git a/content/en/examples/score/resources/default-provisioners/amqp.md b/content/en/examples/score/resources/default-provisioners/amqp.md
new file mode 100644
index 00000000..bcc768f1
--- /dev/null
+++ b/content/en/examples/score/resources/default-provisioners/amqp.md
@@ -0,0 +1,104 @@
+---
+title: "Amqp"
+draft: false
+mermaid: true
+type: examples
+excerpt: ''
+hasMore: false
+parent: "Default Provisioners"
+flavor: "Resources"
+
+---
+
+{{% example-file filename="score.yaml" dir="score/resources/default-provisioners/amqp" githubUrl="https://github.com/score-spec/examples/blob/main" %}}
+
+{{< tabs >}}
+{{% tab name="score-compose" %}}
+Initialize your local workspace, by using the [default provisioners](https://docs.score.dev/docs/score-implementation/score-compose/resources-provisioners/#default-provisioners):
+
+```bash
+score-commpose init
+```
+
+Get the provisioners definition:
+
+```bash
+score-compose provisioners list
+```
+
+Generate the platform specific manifests:
+
+```bash
+score-commpose generate score.yaml
+```
+
+See the resource outputs:
+
+```bash
+score-commpose resources list
+```
+
+You can run the following command on each resource listed with the previous command to get their `outputs`:
+
+```bash
+score-commpose resources get-outputs
+```
+
+Deploy the generated manifests:
+
+```bash
+docker compose up -d
+```
+
+See the running containers:
+
+```bash
+docker ps
+```
+
+{{%/ tab %}}
+{{% tab name="score-k8s" %}}
+Initialize your local workspace, by using the [default provisioners](https://docs.score.dev/docs/score-implementation/score-k8s/resources-provisioners/#default-provisioners):
+
+```bash
+score-k8s init
+```
+
+Get the provisioners definition:
+
+```bash
+score-k8s provisioners list
+```
+
+Generate the platform specific manifests:
+
+```bash
+score-k8s generate score.yaml
+```
+
+See the resource outputs:
+
+```bash
+score-k8s resources list
+```
+
+You can run the following command on each resource listed with the previous command to get their `outputs`:
+
+```bash
+score-k8s resources get-outputs
+```
+
+Deploy the generated manifests:
+
+```bash
+kubectl apply -f manifests.yaml
+```
+
+See the running containers:
+
+```bash
+kubectl get all
+```
+
+{{%/ tab %}}
+{{< /tabs >}}
diff --git a/content/en/examples/score/resources/default-provisioners/dns.md b/content/en/examples/score/resources/default-provisioners/dns.md
new file mode 100644
index 00000000..5acdb6ab
--- /dev/null
+++ b/content/en/examples/score/resources/default-provisioners/dns.md
@@ -0,0 +1,104 @@
+---
+title: "Dns"
+draft: false
+mermaid: true
+type: examples
+excerpt: ''
+hasMore: false
+parent: "Default Provisioners"
+flavor: "Resources"
+
+---
+
+{{% example-file filename="score.yaml" dir="score/resources/default-provisioners/dns" githubUrl="https://github.com/score-spec/examples/blob/main" %}}
+
+{{< tabs >}}
+{{% tab name="score-compose" %}}
+Initialize your local workspace, by using the [default provisioners](https://docs.score.dev/docs/score-implementation/score-compose/resources-provisioners/#default-provisioners):
+
+```bash
+score-commpose init
+```
+
+Get the provisioners definition:
+
+```bash
+score-compose provisioners list
+```
+
+Generate the platform specific manifests:
+
+```bash
+score-commpose generate score.yaml
+```
+
+See the resource outputs:
+
+```bash
+score-commpose resources list
+```
+
+You can run the following command on each resource listed with the previous command to get their `outputs`:
+
+```bash
+score-commpose resources get-outputs
+```
+
+Deploy the generated manifests:
+
+```bash
+docker compose up -d
+```
+
+See the running containers:
+
+```bash
+docker ps
+```
+
+{{%/ tab %}}
+{{% tab name="score-k8s" %}}
+Initialize your local workspace, by using the [default provisioners](https://docs.score.dev/docs/score-implementation/score-k8s/resources-provisioners/#default-provisioners):
+
+```bash
+score-k8s init
+```
+
+Get the provisioners definition:
+
+```bash
+score-k8s provisioners list
+```
+
+Generate the platform specific manifests:
+
+```bash
+score-k8s generate score.yaml
+```
+
+See the resource outputs:
+
+```bash
+score-k8s resources list
+```
+
+You can run the following command on each resource listed with the previous command to get their `outputs`:
+
+```bash
+score-k8s resources get-outputs
+```
+
+Deploy the generated manifests:
+
+```bash
+kubectl apply -f manifests.yaml
+```
+
+See the running containers:
+
+```bash
+kubectl get all
+```
+
+{{%/ tab %}}
+{{< /tabs >}}
diff --git a/content/en/examples/score/resources/default-provisioners/mysql.md b/content/en/examples/score/resources/default-provisioners/mysql.md
new file mode 100644
index 00000000..8216b044
--- /dev/null
+++ b/content/en/examples/score/resources/default-provisioners/mysql.md
@@ -0,0 +1,104 @@
+---
+title: "Mysql"
+draft: false
+mermaid: true
+type: examples
+excerpt: ''
+hasMore: false
+parent: "Default Provisioners"
+flavor: "Resources"
+
+---
+
+{{% example-file filename="score.yaml" dir="score/resources/default-provisioners/mysql" githubUrl="https://github.com/score-spec/examples/blob/main" %}}
+
+{{< tabs >}}
+{{% tab name="score-compose" %}}
+Initialize your local workspace, by using the [default provisioners](https://docs.score.dev/docs/score-implementation/score-compose/resources-provisioners/#default-provisioners):
+
+```bash
+score-commpose init
+```
+
+Get the provisioners definition:
+
+```bash
+score-compose provisioners list
+```
+
+Generate the platform specific manifests:
+
+```bash
+score-commpose generate score.yaml
+```
+
+See the resource outputs:
+
+```bash
+score-commpose resources list
+```
+
+You can run the following command on each resource listed with the previous command to get their `outputs`:
+
+```bash
+score-commpose resources get-outputs
+```
+
+Deploy the generated manifests:
+
+```bash
+docker compose up -d
+```
+
+See the running containers:
+
+```bash
+docker ps
+```
+
+{{%/ tab %}}
+{{% tab name="score-k8s" %}}
+Initialize your local workspace, by using the [default provisioners](https://docs.score.dev/docs/score-implementation/score-k8s/resources-provisioners/#default-provisioners):
+
+```bash
+score-k8s init
+```
+
+Get the provisioners definition:
+
+```bash
+score-k8s provisioners list
+```
+
+Generate the platform specific manifests:
+
+```bash
+score-k8s generate score.yaml
+```
+
+See the resource outputs:
+
+```bash
+score-k8s resources list
+```
+
+You can run the following command on each resource listed with the previous command to get their `outputs`:
+
+```bash
+score-k8s resources get-outputs
+```
+
+Deploy the generated manifests:
+
+```bash
+kubectl apply -f manifests.yaml
+```
+
+See the running containers:
+
+```bash
+kubectl get all
+```
+
+{{%/ tab %}}
+{{< /tabs >}}
diff --git a/content/en/examples/score/resources/default-provisioners/postgres.md b/content/en/examples/score/resources/default-provisioners/postgres.md
new file mode 100644
index 00000000..4838c435
--- /dev/null
+++ b/content/en/examples/score/resources/default-provisioners/postgres.md
@@ -0,0 +1,104 @@
+---
+title: "Postgres"
+draft: false
+mermaid: true
+type: examples
+excerpt: ''
+hasMore: false
+parent: "Default Provisioners"
+flavor: "Resources"
+
+---
+
+{{% example-file filename="score.yaml" dir="score/resources/default-provisioners/postgres" githubUrl="https://github.com/score-spec/examples/blob/main" %}}
+
+{{< tabs >}}
+{{% tab name="score-compose" %}}
+Initialize your local workspace, by using the [default provisioners](https://docs.score.dev/docs/score-implementation/score-compose/resources-provisioners/#default-provisioners):
+
+```bash
+score-commpose init
+```
+
+Get the provisioners definition:
+
+```bash
+score-compose provisioners list
+```
+
+Generate the platform specific manifests:
+
+```bash
+score-commpose generate score.yaml
+```
+
+See the resource outputs:
+
+```bash
+score-commpose resources list
+```
+
+You can run the following command on each resource listed with the previous command to get their `outputs`:
+
+```bash
+score-commpose resources get-outputs
+```
+
+Deploy the generated manifests:
+
+```bash
+docker compose up -d
+```
+
+See the running containers:
+
+```bash
+docker ps
+```
+
+{{%/ tab %}}
+{{% tab name="score-k8s" %}}
+Initialize your local workspace, by using the [default provisioners](https://docs.score.dev/docs/score-implementation/score-k8s/resources-provisioners/#default-provisioners):
+
+```bash
+score-k8s init
+```
+
+Get the provisioners definition:
+
+```bash
+score-k8s provisioners list
+```
+
+Generate the platform specific manifests:
+
+```bash
+score-k8s generate score.yaml
+```
+
+See the resource outputs:
+
+```bash
+score-k8s resources list
+```
+
+You can run the following command on each resource listed with the previous command to get their `outputs`:
+
+```bash
+score-k8s resources get-outputs
+```
+
+Deploy the generated manifests:
+
+```bash
+kubectl apply -f manifests.yaml
+```
+
+See the running containers:
+
+```bash
+kubectl get all
+```
+
+{{%/ tab %}}
+{{< /tabs >}}
diff --git a/content/en/examples/score/resources/default-provisioners/redis.md b/content/en/examples/score/resources/default-provisioners/redis.md
new file mode 100644
index 00000000..b1f93f5d
--- /dev/null
+++ b/content/en/examples/score/resources/default-provisioners/redis.md
@@ -0,0 +1,104 @@
+---
+title: "Redis"
+draft: false
+mermaid: true
+type: examples
+excerpt: ''
+hasMore: false
+parent: "Default Provisioners"
+flavor: "Resources"
+
+---
+
+{{% example-file filename="score.yaml" dir="score/resources/default-provisioners/redis" githubUrl="https://github.com/score-spec/examples/blob/main" %}}
+
+{{< tabs >}}
+{{% tab name="score-compose" %}}
+Initialize your local workspace, by using the [default provisioners](https://docs.score.dev/docs/score-implementation/score-compose/resources-provisioners/#default-provisioners):
+
+```bash
+score-commpose init
+```
+
+Get the provisioners definition:
+
+```bash
+score-compose provisioners list
+```
+
+Generate the platform specific manifests:
+
+```bash
+score-commpose generate score.yaml
+```
+
+See the resource outputs:
+
+```bash
+score-commpose resources list
+```
+
+You can run the following command on each resource listed with the previous command to get their `outputs`:
+
+```bash
+score-commpose resources get-outputs
+```
+
+Deploy the generated manifests:
+
+```bash
+docker compose up -d
+```
+
+See the running containers:
+
+```bash
+docker ps
+```
+
+{{%/ tab %}}
+{{% tab name="score-k8s" %}}
+Initialize your local workspace, by using the [default provisioners](https://docs.score.dev/docs/score-implementation/score-k8s/resources-provisioners/#default-provisioners):
+
+```bash
+score-k8s init
+```
+
+Get the provisioners definition:
+
+```bash
+score-k8s provisioners list
+```
+
+Generate the platform specific manifests:
+
+```bash
+score-k8s generate score.yaml
+```
+
+See the resource outputs:
+
+```bash
+score-k8s resources list
+```
+
+You can run the following command on each resource listed with the previous command to get their `outputs`:
+
+```bash
+score-k8s resources get-outputs
+```
+
+Deploy the generated manifests:
+
+```bash
+kubectl apply -f manifests.yaml
+```
+
+See the running containers:
+
+```bash
+kubectl get all
+```
+
+{{%/ tab %}}
+{{< /tabs >}}
diff --git a/content/en/examples/score/specification/annotations.md b/content/en/examples/score/specification/annotations.md
new file mode 100644
index 00000000..b749300f
--- /dev/null
+++ b/content/en/examples/score/specification/annotations.md
@@ -0,0 +1,67 @@
+---
+title: "Annotations"
+draft: false
+mermaid: true
+type: examples
+excerpt: ''
+hasMore: false
+parent: "Specification"
+
+---
+
+{{% example-file filename="score.yaml" dir="score/specification/annotations" githubUrl="https://github.com/score-spec/examples/blob/main" %}}
+
+{{< tabs >}}
+{{% tab name="score-compose" %}}
+Initialize your local workspace
+
+```bash
+score-compose init
+```
+
+Generate the platform specific manifests
+
+```bash
+score-compose generate score.yaml --image busybox
+```
+
+Deploy the generated manifests
+
+```bash
+docker compose up -d
+```
+
+See the running containers
+
+```bash
+docker ps
+```
+
+{{%/ tab %}}
+{{% tab name="score-k8s" %}}
+Initialize your local workspace
+
+```bash
+score-k8s init
+```
+
+Generate the platform specific manifests
+
+```bash
+score-k8s generate score.yaml --image busybox
+```
+
+Deploy the generated manifests
+
+```bash
+kubectl apply -f manifests.yaml
+```
+
+See the running containers
+
+```bash
+kubectl get all
+```
+
+{{%/ tab %}}
+{{< /tabs >}}
diff --git a/content/en/examples/score/specification/command.md b/content/en/examples/score/specification/command.md
new file mode 100644
index 00000000..2b8edd1e
--- /dev/null
+++ b/content/en/examples/score/specification/command.md
@@ -0,0 +1,67 @@
+---
+title: "Command"
+draft: false
+mermaid: true
+type: examples
+excerpt: ''
+hasMore: false
+parent: "Specification"
+
+---
+
+{{% example-file filename="score.yaml" dir="score/specification/command" githubUrl="https://github.com/score-spec/examples/blob/main" %}}
+
+{{< tabs >}}
+{{% tab name="score-compose" %}}
+Initialize your local workspace
+
+```bash
+score-compose init
+```
+
+Generate the platform specific manifests
+
+```bash
+score-compose generate score.yaml --image busybox
+```
+
+Deploy the generated manifests
+
+```bash
+docker compose up -d
+```
+
+See the running containers
+
+```bash
+docker ps
+```
+
+{{%/ tab %}}
+{{% tab name="score-k8s" %}}
+Initialize your local workspace
+
+```bash
+score-k8s init
+```
+
+Generate the platform specific manifests
+
+```bash
+score-k8s generate score.yaml --image busybox
+```
+
+Deploy the generated manifests
+
+```bash
+kubectl apply -f manifests.yaml
+```
+
+See the running containers
+
+```bash
+kubectl get all
+```
+
+{{%/ tab %}}
+{{< /tabs >}}
diff --git a/content/en/examples/score/specification/files.md b/content/en/examples/score/specification/files.md
new file mode 100644
index 00000000..dcf73f89
--- /dev/null
+++ b/content/en/examples/score/specification/files.md
@@ -0,0 +1,68 @@
+---
+title: "Files"
+draft: false
+mermaid: true
+type: examples
+excerpt: ''
+hasMore: false
+parent: "Specification"
+
+---
+
+{{% example-file filename="fileA.txt" dir="score/specification/files" githubUrl="https://github.com/score-spec/examples/blob/main" %}}
+{{% example-file filename="score.yaml" dir="score/specification/files" githubUrl="https://github.com/score-spec/examples/blob/main" %}}
+
+{{< tabs >}}
+{{% tab name="score-compose" %}}
+Initialize your local workspace
+
+```bash
+score-compose init
+```
+
+Generate the platform specific manifests
+
+```bash
+score-compose generate score.yaml --image busybox
+```
+
+Deploy the generated manifests
+
+```bash
+docker compose up -d
+```
+
+See the running containers
+
+```bash
+docker ps
+```
+
+{{%/ tab %}}
+{{% tab name="score-k8s" %}}
+Initialize your local workspace
+
+```bash
+score-k8s init
+```
+
+Generate the platform specific manifests
+
+```bash
+score-k8s generate score.yaml --image busybox
+```
+
+Deploy the generated manifests
+
+```bash
+kubectl apply -f manifests.yaml
+```
+
+See the running containers
+
+```bash
+kubectl get all
+```
+
+{{%/ tab %}}
+{{< /tabs >}}
diff --git a/content/en/examples/score/specification/limits-and-requests.md b/content/en/examples/score/specification/limits-and-requests.md
new file mode 100644
index 00000000..d84890de
--- /dev/null
+++ b/content/en/examples/score/specification/limits-and-requests.md
@@ -0,0 +1,67 @@
+---
+title: "Limits And Requests"
+draft: false
+mermaid: true
+type: examples
+excerpt: ''
+hasMore: false
+parent: "Specification"
+
+---
+
+{{% example-file filename="score.yaml" dir="score/specification/limits-and-requests" githubUrl="https://github.com/score-spec/examples/blob/main" %}}
+
+{{< tabs >}}
+{{% tab name="score-compose" %}}
+Initialize your local workspace
+
+```bash
+score-compose init
+```
+
+Generate the platform specific manifests
+
+```bash
+score-compose generate score.yaml --image busybox
+```
+
+Deploy the generated manifests
+
+```bash
+docker compose up -d
+```
+
+See the running containers
+
+```bash
+docker ps
+```
+
+{{%/ tab %}}
+{{% tab name="score-k8s" %}}
+Initialize your local workspace
+
+```bash
+score-k8s init
+```
+
+Generate the platform specific manifests
+
+```bash
+score-k8s generate score.yaml --image busybox
+```
+
+Deploy the generated manifests
+
+```bash
+kubectl apply -f manifests.yaml
+```
+
+See the running containers
+
+```bash
+kubectl get all
+```
+
+{{%/ tab %}}
+{{< /tabs >}}
diff --git a/content/en/examples/score/specification/probes.md b/content/en/examples/score/specification/probes.md
new file mode 100644
index 00000000..e4ea9632
--- /dev/null
+++ b/content/en/examples/score/specification/probes.md
@@ -0,0 +1,67 @@
+---
+title: "Probes"
+draft: false
+mermaid: true
+type: examples
+excerpt: ''
+hasMore: false
+parent: "Specification"
+
+---
+
+{{% example-file filename="score.yaml" dir="score/specification/probes" githubUrl="https://github.com/score-spec/examples/blob/main" %}}
+
+{{< tabs >}}
+{{% tab name="score-compose" %}}
+Initialize your local workspace
+
+```bash
+score-compose init
+```
+
+Generate the platform specific manifests
+
+```bash
+score-compose generate score.yaml --image busybox
+```
+
+Deploy the generated manifests
+
+```bash
+docker compose up -d
+```
+
+See the running containers
+
+```bash
+docker ps
+```
+
+{{%/ tab %}}
+{{% tab name="score-k8s" %}}
+Initialize your local workspace
+
+```bash
+score-k8s init
+```
+
+Generate the platform specific manifests
+
+```bash
+score-k8s generate score.yaml --image busybox
+```
+
+Deploy the generated manifests
+
+```bash
+kubectl apply -f manifests.yaml
+```
+
+See the running containers
+
+```bash
+kubectl get all
+```
+
+{{%/ tab %}}
+{{< /tabs >}}
diff --git a/content/en/examples/score/specification/service.md b/content/en/examples/score/specification/service.md
new file mode 100644
index 00000000..4b924a28
--- /dev/null
+++ b/content/en/examples/score/specification/service.md
@@ -0,0 +1,67 @@
+---
+title: "Service"
+draft: false
+mermaid: true
+type: examples
+excerpt: ''
+hasMore: false
+parent: "Specification"
+
+---
+
+{{% example-file filename="score.yaml" dir="score/specification/service" githubUrl="https://github.com/score-spec/examples/blob/main" %}}
+
+{{< tabs >}}
+{{% tab name="score-compose" %}}
+Initialize your local workspace
+
+```bash
+score-compose init
+```
+
+Generate the platform specific manifests
+
+```bash
+score-compose generate score.yaml --image busybox
+```
+
+Deploy the generated manifests
+
+```bash
+docker compose up -d
+```
+
+See the running containers
+
+```bash
+docker ps
+```
+
+{{%/ tab %}}
+{{% tab name="score-k8s" %}}
+Initialize your local workspace
+
+```bash
+score-k8s init
+```
+
+Generate the platform specific manifests
+
+```bash
+score-k8s generate score.yaml --image busybox
+```
+
+Deploy the generated manifests
+
+```bash
+kubectl apply -f manifests.yaml
+```
+
+See the running containers
+
+```bash
+kubectl get all
+```
+
+{{%/ tab %}}
+{{< /tabs >}}
diff --git a/content/en/examples/score/specification/variables.md b/content/en/examples/score/specification/variables.md
new file mode 100644
index 00000000..96ca7c88
--- /dev/null
+++ b/content/en/examples/score/specification/variables.md
@@ -0,0 +1,67 @@
+---
+title: "Variables"
+draft: false
+mermaid: true
+type: examples
+excerpt: ''
+hasMore: false
+parent: "Specification"
+
+---
+
+{{% example-file filename="score.yaml" dir="score/specification/variables" githubUrl="https://github.com/score-spec/examples/blob/main" %}}
+
+{{< tabs >}}
+{{% tab name="score-compose" %}}
+Initialize your local workspace
+
+```bash
+score-compose init
+```
+
+Generate the platform specific manifests
+
+```bash
+score-compose generate score.yaml --image busybox
+```
+
+Deploy the generated manifests
+
+```bash
+docker compose up -d
+```
+
+See the running containers
+
+```bash
+docker ps
+```
+
+{{%/ tab %}}
+{{% tab name="score-k8s" %}}
+Initialize your local workspace
+
+```bash
+score-k8s init
+```
+
+Generate the platform specific manifests
+
+```bash
+score-k8s generate score.yaml --image busybox
+```
+
+Deploy the generated manifests
+
+```bash
+kubectl apply -f manifests.yaml
+```
+
+See the running containers
+
+```bash
+kubectl get all
+```
+
+{{%/ tab %}}
+{{< /tabs >}}
diff --git a/content/en/examples/score/specification/volumes.md b/content/en/examples/score/specification/volumes.md
new file mode 100644
index 00000000..fa5f0e3d
--- /dev/null
+++ b/content/en/examples/score/specification/volumes.md
@@ -0,0 +1,67 @@
+---
+title: "Volumes"
+draft: false
+mermaid: true
+type: examples
+excerpt: ''
+hasMore: false
+parent: "Specification"
+
+---
+
+{{% example-file filename="score.yaml" dir="score/specification/volumes" githubUrl="https://github.com/score-spec/examples/blob/main" %}}
+
+{{< tabs >}}
+{{% tab name="score-compose" %}}
+Initialize your local workspace
+
+```bash
+score-compose init
+```
+
+Generate the platform specific manifests
+
+```bash
+score-compose generate score.yaml --image busybox
+```
+
+Deploy the generated manifests
+
+```bash
+docker compose up -d
+```
+
+See the running containers
+
+```bash
+docker ps
+```
+
+{{%/ tab %}}
+{{% tab name="score-k8s" %}}
+Initialize your local workspace
+
+```bash
+score-k8s init
+```
+
+Generate the platform specific manifests
+
+```bash
+score-k8s generate score.yaml --image busybox
+```
+
+Deploy the generated manifests
+
+```bash
+kubectl apply -f manifests.yaml
+```
+
+See the running containers
+
+```bash
+kubectl get all
+```
+
+{{%/ tab %}}
+{{< /tabs >}}
diff --git a/data/examplesAliases.yaml b/data/examplesAliases.yaml
new file mode 100644
index 00000000..9e26dfee
--- /dev/null
+++ b/data/examplesAliases.yaml
@@ -0,0 +1 @@
+{}
\ No newline at end of file
diff --git a/data/examplesMeta.yml b/data/examplesMeta.yml
new file mode 100644
index 00000000..9e26dfee
--- /dev/null
+++ b/data/examplesMeta.yml
@@ -0,0 +1 @@
+{}
\ No newline at end of file
diff --git a/dprint.json b/dprint.json
index 1d25cdee..075de92f 100644
--- a/dprint.json
+++ b/dprint.json
@@ -22,7 +22,8 @@
],
"excludes": [
"**/node_modules",
- "**/*-lock.json"
+ "**/*-lock.json",
+ "**/gen"
],
"plugins": [
"https://plugins.dprint.dev/typescript-0.71.2.wasm",
diff --git a/gen/examples-site/config-parser.js b/gen/examples-site/config-parser.js
new file mode 100644
index 00000000..79196a3c
--- /dev/null
+++ b/gen/examples-site/config-parser.js
@@ -0,0 +1,30 @@
+const fs = require("fs");
+const matter = require("gray-matter");
+const toml = require("toml");
+
+function parseConfig(configPath) {
+ try {
+ const configContent = fs.readFileSync(configPath, "utf8");
+ const parsedConfig = matter(`---toml\n${configContent}\n---`, {
+ engines: {
+ toml: toml.parse.bind(toml),
+ },
+ });
+ return {
+ exampleLibraryGitHubUrls:
+ parsedConfig.data.Params.exampleLibraryGitHubUrls || [],
+ // exampleLibraryEnabledTabGroupTypes:
+ // parsedConfig.data.params.exampleLibraryEnabledTabGroupTypes || [],
+ // exampleFileTypes: parsedConfig.data.params.exampleFileTypes || [],
+ exampleLibraryBlacklistedFolders:
+ parsedConfig.data.Params.exampleLibraryBlacklistedFolders || [],
+ exampleLibraryGitHubBaseUrl:
+ parsedConfig.data.Params.exampleLibraryGitHubBaseUrl || "",
+ };
+ } catch (error) {
+ console.error("Error parsing config file:", error);
+ throw error;
+ }
+}
+
+module.exports = { parseConfig };
diff --git a/gen/examples-site/content-utils.js b/gen/examples-site/content-utils.js
new file mode 100644
index 00000000..a5f7cafe
--- /dev/null
+++ b/gen/examples-site/content-utils.js
@@ -0,0 +1,50 @@
+const fs = require('fs');
+const matter = require('gray-matter');
+const hcl = require('hcl2-parser');
+
+function parseYamlContent(content) {
+ return matter(`---yaml\n${content}\n---`).data;
+}
+
+function parseTerraformContent(content) {
+ return hcl.parseToObject(content);
+}
+
+function isResourceDefinition(filePath, extension) {
+ const content = fs.readFileSync(filePath, 'utf8');
+ if (extension === 'yaml') {
+ return content.includes('kind: Definition');
+ }
+ if (extension === 'tf') {
+ const parsedTf = parseTerraformContent(content);
+ if (parsedTf[0].resource) {
+ return parsedTf[0].resource.humanitec_resource_definition;
+ }
+ }
+ return false;
+}
+
+function getResourceDefinitionType(filePath, extension) {
+ const content = fs.readFileSync(filePath, 'utf8');
+ if (extension === 'yaml') {
+ const parsedYaml = parseYamlContent(content);
+ return parsedYaml.entity.type;
+ }
+ if (extension === 'tf') {
+ const parsedTf = parseTerraformContent(content);
+ return Object.values(
+ parsedTf[0].resource.humanitec_resource_definition
+ )[0][0].type;
+ }
+ throw new Error(`Unsupported file extension: ${extension}`);
+}
+
+function beautify(str) {
+ return str.replace(/-/g, ' ').replace(/\b\w/g, (l) => l.toUpperCase());
+}
+
+module.exports = {
+ isResourceDefinition,
+ getResourceDefinitionType,
+ beautify,
+};
diff --git a/gen/examples-site/examples-category-content/score.md b/gen/examples-site/examples-category-content/score.md
new file mode 100644
index 00000000..7fa96be2
--- /dev/null
+++ b/gen/examples-site/examples-category-content/score.md
@@ -0,0 +1 @@
+The examples below illustrate how to use [Score]({{< relref "/docs" >}}) files for your workload specification.
diff --git a/gen/examples-site/file-utils.js b/gen/examples-site/file-utils.js
new file mode 100644
index 00000000..c6ab0f39
--- /dev/null
+++ b/gen/examples-site/file-utils.js
@@ -0,0 +1,44 @@
+const fs = require("fs");
+const path = require("path");
+
+const isDirectory = (path) => fs.statSync(path).isDirectory();
+
+const mkdirIfNotExistsSync = (path) => {
+ if (!fs.existsSync(path)) {
+ fs.mkdirSync(path, { recursive: true });
+ }
+};
+
+/**
+ * Check if a folder should be ignored (starts with a dot)
+ * @param {string} folderName - Name of the folder
+ * @returns {boolean} - True if folder should be ignored
+ */
+const shouldIgnoreFolder = (folderName) => {
+ return folderName.startsWith(".");
+};
+
+/**
+ * Recursively traverse a directory and apply a callback to each file
+ * @param {string} dir - Directory to traverse
+ * @param {Function} callback - Function to call for each file
+ */
+function traverseDirectory(dir, callback) {
+ const files = fs.readdirSync(dir);
+
+ files.forEach((file) => {
+ const filePath = path.join(dir, file);
+ if (isDirectory(filePath)) {
+ traverseDirectory(filePath, callback);
+ } else {
+ callback(filePath);
+ }
+ });
+}
+
+module.exports = {
+ isDirectory,
+ mkdirIfNotExistsSync,
+ traverseDirectory,
+ shouldIgnoreFolder,
+};
diff --git a/gen/examples-site/frontmatter.js b/gen/examples-site/frontmatter.js
new file mode 100644
index 00000000..dbf78f56
--- /dev/null
+++ b/gen/examples-site/frontmatter.js
@@ -0,0 +1,224 @@
+const fs = require("fs");
+const { getGitHubUrl } = require("./github-utils");
+const {
+ getMetadataFromReadme,
+ removeNonExternalLinks,
+ getExcerpt,
+ addAliasesToMetadata,
+} = require("./metadata-utils");
+const { isDirectory } = require("./file-utils");
+const { beautify } = require("./content-utils");
+
+const sourceFolder = process.argv[2];
+
+/**
+ * Generates frontmatter content for a markdown file.
+ * @param {string} title - The title of the page.
+ * @param {string} excerpt - The excerpt of the content.
+ * @param {string} content - The main content of the page.
+ * @param {string} metadata - Additional metadata for the frontmatter.
+ * @param {string} [parent] - The parent page, if applicable.
+ * @param {string} [flavor] - The flavor of the example, if applicable.
+ * @returns {string} The generated frontmatter content.
+ */
+const generateFrontmatterContent = (
+ title,
+ excerpt,
+ content,
+ metadata,
+ parent,
+ flavor
+) => {
+ return `---
+title: "${beautify(title)}"
+draft: false
+mermaid: true
+type: examples
+excerpt: '${excerpt}'
+hasMore: ${excerpt !== content.trim() ? "true" : "false"}
+${parent ? `parent: "${beautify(parent)}"\n` : ""}${
+ flavor ? `flavor: "${beautify(flavor)}"\n` : ""
+ }${metadata}
+---
+
+${content}`;
+};
+
+/**
+ * Generates content for an example file using the example-file shortcode.
+ * @param {string} file - The filename of the example file.
+ * @param {string} dir - The directory containing the file.
+ * @param {string} githubUrl - The GitHub URL for the file.
+ * @returns {string} The generated example file content.
+ */
+const generateExampleFileContent = (file, dir, githubUrl) => {
+ return `{{% example-file filename="${file}" dir="${dir}" githubUrl="${githubUrl}" %}}`;
+};
+
+/**
+ * Processes the README.md file in the given path and extracts metadata, content, and excerpt.
+ * @param {string} path - The path to the directory containing the README.md file.
+ * @returns {Object} An object containing excerpt, content, and metadata.
+ */
+const processReadme = (path) => {
+ let excerpt = "";
+ let content = "";
+ let metadata = "";
+ if (fs.existsSync(`${sourceFolder}/${path}/README.md`)) {
+ const readme = fs.readFileSync(`${sourceFolder}/${path}/README.md`, "utf8");
+ const { metadata: readmeMetadata, parsedFrontmatter } =
+ getMetadataFromReadme(readme, path.split("/")[0]);
+ metadata = readmeMetadata;
+ content = removeNonExternalLinks(parsedFrontmatter.content);
+ excerpt = getExcerpt(content);
+ }
+ return { excerpt, content, metadata };
+};
+
+/**
+ * Writes content to a file in the examples directory.
+ * @param {string} path - The path where the file should be written.
+ * @param {string} content - The content to write to the file.
+ */
+const writeContentToFile = (path, content) => {
+ fs.writeFileSync(`./content/en/examples/${path}.md`, content);
+};
+
+const generateTabs = (
+ mainScoreFiles,
+ scoreFileDirectories,
+ parentDir,
+ githubUrl,
+ path
+) => {
+ const hasMainScoreFiles = mainScoreFiles && mainScoreFiles.length > 0;
+ const hasScoreFileDirectories =
+ scoreFileDirectories && scoreFileDirectories.length > 0;
+
+ if (!hasMainScoreFiles && !hasScoreFileDirectories) {
+ return "";
+ }
+
+ // Create a map to combine content for tabs with the same name
+ const tabsMap = new Map();
+
+ // Process mainScoreFiles (README content)
+ if (hasMainScoreFiles) {
+ mainScoreFiles.forEach((file) => {
+ const tabName = file.replace(".md", "");
+ const filePath = `${sourceFolder}/${parentDir}/${file}`;
+ const readmeContent = fs.existsSync(filePath)
+ ? fs.readFileSync(filePath, "utf8").trim()
+ : "";
+
+ if (!tabsMap.has(tabName)) {
+ tabsMap.set(tabName, { readmeContent: "", directoryContent: "" });
+ }
+ tabsMap.get(tabName).readmeContent = readmeContent;
+ });
+ }
+
+ // Process scoreFileDirectories (directory files)
+ if (hasScoreFileDirectories) {
+ scoreFileDirectories.forEach((dirName) => {
+ const directoryPath = `${sourceFolder}/${path}/${dirName}`;
+ if (fs.existsSync(directoryPath) && isDirectory(directoryPath)) {
+ const filesInDir = fs
+ .readdirSync(directoryPath)
+ .filter((file) => !isDirectory(`${directoryPath}/${file}`));
+ const directoryContent = filesInDir
+ .map((file) => {
+ const shortcodeDir = `${path}/${dirName}`;
+ return generateExampleFileContent(file, shortcodeDir, githubUrl);
+ })
+ .join("\n");
+
+ if (!tabsMap.has(dirName)) {
+ tabsMap.set(dirName, { readmeContent: "", directoryContent: "" });
+ }
+ tabsMap.get(dirName).directoryContent = directoryContent + "\n\n---\n";
+ }
+ });
+ }
+
+ // Generate tabs content by combining directory content and README
+ const tabsContent = Array.from(tabsMap.entries())
+ .map(([tabName, { directoryContent, readmeContent }]) => {
+ const combinedContent = [directoryContent, readmeContent]
+ .filter((content) => content.trim() !== "")
+ .join("\n\n");
+
+ return `{{% tab name="${tabName}" %}}
+${combinedContent}
+{{%/ tab %}}`;
+ })
+ .join("\n");
+
+ return `{{< tabs >}}
+${tabsContent}
+{{< /tabs >}}
+ `;
+};
+
+/**
+ * Builds frontmatter and content for an example page.
+ * @param {string} title - The title of the page.
+ * @param {string} path - The path to the example directory.
+ * @param {string} [parent] - The parent page, if applicable.
+ * @param {string} [flavor] - The flavor of the example, if applicable.
+ */
+const buildFrontmatter = (title, path, parent, flavor) => {
+ const dir = path.replace(/\.md$/, "");
+ let { excerpt, content, metadata } = processReadme(path);
+ const githubUrl = getGitHubUrl(path);
+
+ const otherFiles = fs
+ .readdirSync(`${sourceFolder}/${path}`)
+ .filter(
+ (file) =>
+ file !== "README.md" && !isDirectory(`${sourceFolder}/${path}/${file}`)
+ );
+
+ const parentDir = path.split("/").slice(0, -1).join("/");
+ const mainScoreFiles = fs
+ .readdirSync(`${sourceFolder}/${parentDir}`)
+ .filter((file) => file.endsWith(".md") && file !== "README.md");
+
+ //TODO: community provisioners have directories with files that go on tabs
+ const scoreFileDirectories = fs
+ .readdirSync(`${sourceFolder}/${path}`)
+ .filter((file) => isDirectory(`${sourceFolder}/${path}/${file}`));
+
+ metadata = addAliasesToMetadata(path, metadata);
+
+ const frontmatterContent = generateFrontmatterContent(
+ title,
+ excerpt,
+ content,
+ metadata,
+ parent,
+ flavor
+ );
+
+ const otherFilesContent = otherFiles
+ .map((file) => generateExampleFileContent(file, dir, githubUrl))
+ .join("\n");
+
+ writeContentToFile(
+ path,
+ `${frontmatterContent}
+
+${otherFilesContent}
+
+${generateTabs(
+ mainScoreFiles,
+ scoreFileDirectories,
+ parentDir,
+ githubUrl,
+ path
+)}
+`
+ );
+};
+
+module.exports = { buildFrontmatter };
diff --git a/gen/examples-site/gen-example-pages.js b/gen/examples-site/gen-example-pages.js
new file mode 100644
index 00000000..fd55a374
--- /dev/null
+++ b/gen/examples-site/gen-example-pages.js
@@ -0,0 +1,130 @@
+const fs = require("fs");
+const { buildFrontmatter } = require("./frontmatter");
+const { parseConfig } = require("./config-parser");
+const {
+ isDirectory,
+ mkdirIfNotExistsSync,
+ shouldIgnoreFolder,
+} = require("./file-utils");
+const { beautify } = require("./content-utils");
+
+const sourceFolder = process.argv[2];
+
+//Get the folders inside sourceFolder:
+const allfiles = fs.readdirSync(sourceFolder);
+const categoryFolders = allfiles.filter((file) =>
+ fs.statSync(`${sourceFolder}/${file}`).isDirectory()
+);
+
+// Access the ./config/_default/config.toml file to get the blacklisted folders:
+const config = parseConfig("./config.toml");
+const blacklist = config.exampleLibraryBlacklistedFolders;
+
+// Remove blacklisted folders from the categoryFolders array:
+categoryFolders.forEach((folder, index) => {
+ if (blacklist.includes(folder)) {
+ categoryFolders.splice(index, 1);
+ }
+});
+
+//For each folder, make a folder in ./content/examples:
+for (const categoryFolder of categoryFolders) {
+ mkdirIfNotExistsSync(`./content/en/examples/${categoryFolder}`);
+
+ //Write an _index.md file in each folder.
+ //Get content from examples-site category content files
+ const categoryIndexContent = fs.readFileSync(
+ `./gen/examples-site/examples-category-content/${categoryFolder}.md`,
+ "utf8"
+ );
+ fs.writeFileSync(
+ `./content/en/examples/${categoryFolder}/_index.md`,
+ `---
+title: "${beautify(categoryFolder)}"
+draft: false
+type: examples
+---
+${categoryIndexContent}
+
+---`
+ );
+
+ //Get the folders inside each category:
+ const folders = fs.readdirSync(`${sourceFolder}/${categoryFolder}`);
+
+ //For each folder, check if this is the last nesting level:
+ for (const folder of folders) {
+ //Discard readme and other files:
+ if (!isDirectory(`${sourceFolder}/${categoryFolder}/${folder}`)) {
+ continue;
+ }
+ const isLastNestingLevel = !fs
+ .readdirSync(`${sourceFolder}/${categoryFolder}/${folder}`)
+ .some((file) =>
+ isDirectory(`${sourceFolder}/${categoryFolder}/${folder}/${file}`)
+ );
+
+ if (!isLastNestingLevel) {
+ const subfolders = fs.readdirSync(
+ `${sourceFolder}/${categoryFolder}/${folder}`
+ );
+ const folderPath = `./content/en/examples/${categoryFolder}/${folder}`;
+ for (const subfolder of subfolders) {
+ mkdirIfNotExistsSync(folderPath);
+ //Discard readme and other files, and dot folders:
+ if (
+ !isDirectory(
+ `${sourceFolder}/${categoryFolder}/${folder}/${subfolder}`
+ ) ||
+ shouldIgnoreFolder(subfolder)
+ ) {
+ continue;
+ }
+
+ const isLastNestingLevel = !fs
+ .readdirSync(
+ `${sourceFolder}/${categoryFolder}/${folder}/${subfolder}`
+ )
+ .some((file) =>
+ isDirectory(
+ `${sourceFolder}/${categoryFolder}/${folder}/${subfolder}/${file}`
+ )
+ );
+
+ if (!isLastNestingLevel) {
+ const subsubfolders = fs.readdirSync(
+ `${sourceFolder}/${categoryFolder}/${folder}/${subfolder}`
+ );
+ const subfolderPath = `${folderPath}/${subfolder}`;
+ for (const subsubfolder of subsubfolders) {
+ mkdirIfNotExistsSync(subfolderPath);
+ //Discard readme and other files, and dot folders:
+ if (
+ !isDirectory(
+ `${sourceFolder}/${categoryFolder}/${folder}/${subfolder}/${subsubfolder}`
+ ) ||
+ shouldIgnoreFolder(subsubfolder)
+ ) {
+ continue;
+ }
+
+ buildFrontmatter(
+ subsubfolder,
+ `${categoryFolder}/${folder}/${subfolder}/${subsubfolder}`,
+ subfolder,
+ folder
+ );
+ }
+ } else {
+ buildFrontmatter(
+ subfolder,
+ `${categoryFolder}/${folder}/${subfolder}`,
+ folder
+ );
+ }
+ }
+ } else {
+ buildFrontmatter(folder, `${categoryFolder}/${folder}`);
+ }
+ }
+}
diff --git a/gen/examples-site/github-utils.js b/gen/examples-site/github-utils.js
new file mode 100644
index 00000000..5c79191f
--- /dev/null
+++ b/gen/examples-site/github-utils.js
@@ -0,0 +1,19 @@
+const { parseConfig } = require("./config-parser");
+
+const config = parseConfig("./config.toml");
+const { exampleLibraryGitHubUrls: githubUrls, exampleLibraryGitHubBaseUrl } =
+ config;
+
+/**
+ * Get the base GitHub URL for a given example path
+ * @param {string} path - The path of the example
+ * @returns {string} The base GitHub URL for the example
+ */
+function getGitHubUrl(path) {
+ const res = githubUrls.find((gh) => path.startsWith(gh.name));
+ return res ? res.url : exampleLibraryGitHubBaseUrl;
+}
+
+module.exports = {
+ getGitHubUrl,
+};
diff --git a/gen/examples-site/metadata-utils.js b/gen/examples-site/metadata-utils.js
new file mode 100644
index 00000000..202327aa
--- /dev/null
+++ b/gen/examples-site/metadata-utils.js
@@ -0,0 +1,97 @@
+const fs = require('fs');
+const matter = require('gray-matter');
+
+const savedMetadataPath = './data/examplesMeta.yml';
+const aliasesPath = './data/examplesAliases.yaml';
+const aliasesFile = fs.readFileSync(aliasesPath, 'utf8');
+const aliases = matter(`---\n${aliasesFile}\n---`).data;
+
+function saveMetadata(parsedFrontmatter, exampleType) {
+ const savedMetadataFile = fs.readFileSync(savedMetadataPath, 'utf8');
+ const savedMetadata = matter(savedMetadataFile).data;
+
+ // If the example type is not in the saved metadata, add it to the saved metadata:
+ if (!savedMetadata[exampleType]) {
+ savedMetadata[exampleType] = {};
+ }
+
+ for (const key in parsedFrontmatter.data) {
+ // If the key is not in the saved metadata, add it to the saved metadata:
+ if (!savedMetadata[exampleType][key]) {
+ savedMetadata[exampleType][key] = parsedFrontmatter.data[key];
+ if (Array.isArray(savedMetadata[key])) {
+ savedMetadata[exampleType][key] = savedMetadata[key].sort();
+ }
+ } else {
+ // If the key is in the saved metadata and is an array, merge the arrays:
+ if (Array.isArray(savedMetadata[exampleType][key])) {
+ savedMetadata[exampleType][key] = Array.from(
+ new Set([
+ ...savedMetadata[exampleType][key],
+ ...parsedFrontmatter.data[key],
+ ])
+ ).sort();
+ }
+ }
+ }
+ fs.writeFileSync(savedMetadataPath, matter.stringify('', savedMetadata));
+}
+
+function saveRDTypeToMetadata(type, title) {
+ saveMetadata({ data: { types: [type] } }, title);
+}
+
+function getMetadataFromReadme(readmeContent, exampleType) {
+ const parsedFrontmatter = matter(readmeContent);
+ let metadata = '';
+
+ if (Object.keys(parsedFrontmatter.data).length > 0) {
+ saveMetadata(parsedFrontmatter, exampleType);
+ const yamlMetadata = matter.stringify('', parsedFrontmatter.data);
+ metadata = yamlMetadata.replace(/---/g, '').trim();
+ }
+
+ return { metadata, parsedFrontmatter };
+}
+
+function addAliasesToMetadata(path, existingMetadata) {
+ if (aliases[`/examples/${path}`]) {
+ const aliasString = matter
+ .stringify('', {
+ aliases: aliases[`/examples/${path}`],
+ })
+ .replace(/---/g, '')
+ .trim();
+ return existingMetadata
+ ? `${existingMetadata}\n${aliasString}`
+ : aliasString;
+ }
+ return existingMetadata;
+}
+
+function removeNonExternalLinks(content) {
+ const regex = /\[([^\]]+)\]\(([^)]+)\)/g;
+ return content.replace(regex, (match, p1, p2) => {
+ if (p2.startsWith('http://') || p2.startsWith('https://')) {
+ return match;
+ }
+ return `\`${p1}\``;
+ });
+}
+
+function getExcerpt(content) {
+ const textWithoutHeadings = content
+ .replace(/^\s*#+.*$/gm, '')
+ .replace(/---/g, '');
+ return textWithoutHeadings.trim().split('\n\n')[0].split('\r\n\r\n')[0].
+ replace(/'/g, ''');
+}
+
+module.exports = {
+ saveMetadata,
+ saveRDTypeToMetadata,
+ getMetadataFromReadme,
+ addAliasesToMetadata,
+ removeNonExternalLinks,
+ getExcerpt,
+};
diff --git a/gen/external-content/score/resources/community-provisioners/.devcontainer/devcontainer.json b/gen/external-content/score/resources/community-provisioners/.devcontainer/devcontainer.json
new file mode 100644
index 00000000..9ae3be89
--- /dev/null
+++ b/gen/external-content/score/resources/community-provisioners/.devcontainer/devcontainer.json
@@ -0,0 +1,29 @@
+{
+ "name": "Score Dev Container",
+ "image": "mcr.microsoft.com/devcontainers/base:noble",
+ "features": {
+ "ghcr.io/devcontainers/features/docker-in-docker:2": {
+ "moby": true,
+ "version": "latest"
+ },
+ "ghcr.io/devcontainers/features/kubectl-helm-minikube:1": {
+ "version": "latest",
+ "helm": "latest",
+ "minikube": "latest"
+ },
+ "ghcr.io/devcontainers/features/github-cli:1": {}
+ },
+ "postCreateCommand": "bash .devcontainer/installMoreTools.sh",
+ "customizations": {
+ "vscode": {
+ "extensions": [
+ "redhat.vscode-yaml"
+ ],
+ "settings": {
+ "yaml.schemas": {
+ "https://raw.githubusercontent.com/score-spec/spec/main/score-v1b1.json": "score.yaml"
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/gen/external-content/score/resources/community-provisioners/.devcontainer/installMoreTools.sh b/gen/external-content/score/resources/community-provisioners/.devcontainer/installMoreTools.sh
new file mode 100755
index 00000000..0c0d25e7
--- /dev/null
+++ b/gen/external-content/score/resources/community-provisioners/.devcontainer/installMoreTools.sh
@@ -0,0 +1,27 @@
+#!/bin/bash
+
+mkdir install-more-tools
+cd install-more-tools
+
+SCORE_COMPOSE_VERSION=$(curl -sL https://api.github.com/repos/score-spec/score-compose/releases/latest | jq -r .tag_name)
+wget https://github.com/score-spec/score-compose/releases/download/${SCORE_COMPOSE_VERSION}/score-compose_${SCORE_COMPOSE_VERSION}_linux_amd64.tar.gz
+tar -xvf score-compose_${SCORE_COMPOSE_VERSION}_linux_amd64.tar.gz
+chmod +x score-compose
+sudo mv score-compose /usr/local/bin
+
+SCORE_K8S_VERSION=$(curl -sL https://api.github.com/repos/score-spec/score-k8s/releases/latest | jq -r .tag_name)
+wget https://github.com/score-spec/score-k8s/releases/download/${SCORE_K8S_VERSION}/score-k8s_${SCORE_K8S_VERSION}_linux_amd64.tar.gz
+tar -xvf score-k8s_${SCORE_K8S_VERSION}_linux_amd64.tar.gz
+chmod +x score-k8s
+sudo mv score-k8s /usr/local/bin
+
+KIND_VERSION=$(curl -sL https://api.github.com/repos/kubernetes-sigs/kind/releases/latest | jq -r .tag_name)
+curl -Lo ./kind https://kind.sigs.k8s.io/dl/${KIND_VERSION}/kind-linux-amd64
+chmod +x ./kind
+sudo mv ./kind /usr/local/bin/kind
+
+sudo wget https://github.com/mikefarah/yq/releases/latest/download/yq_linux_amd64 -O /usr/bin/yq
+sudo chmod +x /usr/bin/yq
+
+cd ..
+rm -rf install-more-tools
\ No newline at end of file
diff --git a/gen/external-content/score/resources/community-provisioners/.github/workflows/ci.yaml b/gen/external-content/score/resources/community-provisioners/.github/workflows/ci.yaml
new file mode 100644
index 00000000..b8975828
--- /dev/null
+++ b/gen/external-content/score/resources/community-provisioners/.github/workflows/ci.yaml
@@ -0,0 +1,30 @@
+name: ci
+permissions:
+ contents: read
+on:
+ pull_request:
+ push:
+ branches:
+ - main
+jobs:
+ test-provisioners:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v4
+ - name: setup-kind-cluster
+ run: |
+ .scripts/setup-kind-cluster.sh
+ - uses: score-spec/setup-score@v2
+ with:
+ file: score-compose
+ version: latest
+ token: ${{ secrets.GITHUB_TOKEN }}
+ - uses: score-spec/setup-score@v2
+ with:
+ file: score-k8s
+ version: latest
+ token: ${{ secrets.GITHUB_TOKEN }}
+ - name: test-provisioners
+ run: |
+ .scripts/test-provisioners.sh
\ No newline at end of file
diff --git a/gen/external-content/score/resources/community-provisioners/.github/workflows/release.yaml b/gen/external-content/score/resources/community-provisioners/.github/workflows/release.yaml
new file mode 100644
index 00000000..b36052e9
--- /dev/null
+++ b/gen/external-content/score/resources/community-provisioners/.github/workflows/release.yaml
@@ -0,0 +1,35 @@
+name: release
+permissions: write-all
+on:
+ push:
+ tags:
+ - 'v*'
+jobs:
+ release:
+ runs-on: ubuntu-24.04
+ steps:
+ - uses: actions/checkout@v4
+ - uses: oras-project/setup-oras@v1
+ - name: oras login
+ run: |
+ echo ${{ secrets.GITHUB_TOKEN }} | oras login ghcr.io -u ${{ github.actor }} --password-stdin
+ - name: oras push score-compose
+ run: |
+ mkdir compose
+ provisioners=$(find -name *.provisioners.yaml | grep /score-compose)
+ for provisioner in $provisioners;
+ do
+ cp $provisioner compose/
+ done
+ cd compose/
+ oras push ghcr.io/${{ github.repository_owner }}/score-compose-community-provisioners:${{ github.ref_name }},latest $(ls .)
+ - name: oras push score-k8s
+ run: |
+ mkdir k8s
+ provisioners=$(find -name *.provisioners.yaml | grep /score-k8s)
+ for provisioner in $provisioners;
+ do
+ cp $provisioner k8s/
+ done
+ cd k8s/
+ oras push ghcr.io/${{ github.repository_owner }}/score-k8s-community-provisioners:${{ github.ref_name }},latest $(ls .)
diff --git a/gen/external-content/score/resources/community-provisioners/.gitignore b/gen/external-content/score/resources/community-provisioners/.gitignore
new file mode 100644
index 00000000..a53b9f57
--- /dev/null
+++ b/gen/external-content/score/resources/community-provisioners/.gitignore
@@ -0,0 +1,5 @@
+compose.yaml
+manifests.yaml
+.score-compose/
+.score-k8s/
+score.yaml
diff --git a/gen/external-content/score/resources/community-provisioners/.scripts/setup-kind-cluster.sh b/gen/external-content/score/resources/community-provisioners/.scripts/setup-kind-cluster.sh
new file mode 100755
index 00000000..5df5af9d
--- /dev/null
+++ b/gen/external-content/score/resources/community-provisioners/.scripts/setup-kind-cluster.sh
@@ -0,0 +1,39 @@
+#!/bin/bash
+set -o errexit
+
+cat <
+
+ {{ .Title }}
+
+
+ {{ if .Params.flavor }}
+ {{ .Params.flavor }}
+ {{ end }}
+ {{ if .Params.parent }}
+ {{ $words := split .Params.parent " " }}
+ {{ $parentText := cond (gt (len $words) 1) (delimit (first (sub (len $words) 1) $words) " ") .Params.parent }}
+ {{ $parentText }}
+ {{ end }}
+ {{ .Title }}
+ {{ .Content }}
+ {{ .Title }}
+ {{ .Content }}
+