Landing: Implement using Hugo
Change-Id: I1204d0a75e73000685d3f12a52d66897fa69bbae
diff --git a/apps/landing/.gitignore b/apps/landing/.gitignore
new file mode 100644
index 0000000..6448965
--- /dev/null
+++ b/apps/landing/.gitignore
@@ -0,0 +1,2 @@
+/public
+.hugo_build.lock
diff --git a/apps/landing/archetypes/apps.md b/apps/landing/archetypes/apps.md
new file mode 100644
index 0000000..493f420
--- /dev/null
+++ b/apps/landing/archetypes/apps.md
@@ -0,0 +1,8 @@
+---
+title: "{{ replace .Name "-" " " | title }}"
+description: "This is a description of {{ replace .Name "-" " " | title }}."
+date: {{ .Date }}
+draft: false
+---
+
+Detailed information about App {{ replace .Name "-" " " | title }} goes here.
diff --git a/apps/landing/archetypes/default.md b/apps/landing/archetypes/default.md
new file mode 100644
index 0000000..c6f3fce
--- /dev/null
+++ b/apps/landing/archetypes/default.md
@@ -0,0 +1,5 @@
++++
+title = '{{ replace .File.ContentBaseName "-" " " | title }}'
+date = {{ .Date }}
+draft = true
++++
diff --git a/apps/landing/archetypes/facts.md b/apps/landing/archetypes/facts.md
new file mode 100644
index 0000000..5107735
--- /dev/null
+++ b/apps/landing/archetypes/facts.md
@@ -0,0 +1,7 @@
+---
+title: "{{ replace .Name "-" " " | title }}"
+description: "This is a description of {{ replace .Name "-" " " | title }}."
+date: "{{ .Date }}"
+draft: false
+image: ""
+---
diff --git a/apps/landing/content/about/_index.md b/apps/landing/content/about/_index.md
new file mode 100644
index 0000000..0964656
--- /dev/null
+++ b/apps/landing/content/about/_index.md
@@ -0,0 +1,6 @@
+---
+title: "About"
+layout: "single"
+---
+This is the about page content. TEST
+Random TEXT
diff --git a/apps/landing/content/apps/_index.md b/apps/landing/content/apps/_index.md
new file mode 100644
index 0000000..c47908a
--- /dev/null
+++ b/apps/landing/content/apps/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Apps"
+layout: "apps"
+---
+This is the apps page content.
diff --git a/apps/landing/content/apps/app-1.md b/apps/landing/content/apps/app-1.md
new file mode 100644
index 0000000..f56ab17
--- /dev/null
+++ b/apps/landing/content/apps/app-1.md
@@ -0,0 +1,9 @@
+---
+title: "Dodo App"
+description: "Deploy app by pushing to Git repository."
+date: 2024-06-26T14:42:20+04:00
+draft: false
+icon: "<svg xmlns='http://www.w3.org/2000/svg' width='50' height='50' viewBox='0 0 48 48'><path fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' d='M2.837 27.257c3.363 2.45 11.566 3.523 12.546 1.4s.424-10.94.424-10.94s-1.763 1.192-2.302.147s.44-2.433 2.319-2.858c-1.96.05-2.221-.571-2.205-.93s.67-1.878 3.527-1.241c-1.6-.751-1.943-2.956 2.352-1.568c-1.421-.735-.36-2.825 1.649-.62c-.261-1.323 1.584-1.46 2.694.907M10.648 34.633a19 19 0 0 0-4.246.719'/><path fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' d='M15.144 43.402c3.625-2.482 7.685-6.32 7.293-13.406s-1.6-6.368-.523-7.577s6.924-.99 10.712 3.353c.032-2.874-2.504-5.508-2.504-5.508a33 33 0 0 1 5.53.163c2.852.49 2.394 2.514 3.58 2.035s.971-3.472-.39-5.377c-1.666-2.33-3.223-2.83-6.358-2.188s-4.474.458-5.54-.587s-2.026-3.538-4.605-2.515c-2.935 1.164-4.398 2.438-3.767 5.04s2.34 4.558 2.972 6.844'/><path fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' d='M22.001 16.552c-.925-.043-1.894.055-1.709 1.328'/><path fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' d='M20.662 16.763c1.72 2.695 3.405 3.643 9.46 3.501'/><path fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' d='M32.14 14.966c-1.223.879-2.18 3.781-2.496 5.307M23.1 14.908c.48 1.209 1.23.728 1.315.283a1.552 1.552 0 0 0-1.543-1.883m-.408 17.472c5.328 2.71 11.631.229 16.269-2.123c-1.176 4.572-5.911 5.585-8.916 6.107'/><path fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' d='M29.099 37.115c4.376-.294 8.024-1.578 7.833-5.296'/><path fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' d='M20.27 38.702c6.771 3.834 12.505.798 13.786-2.615'/><circle cx='24' cy='24' r='21.5' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round'/></svg>"
+---
+
+Manual for Dodo.
diff --git a/apps/landing/content/apps/app-10.md b/apps/landing/content/apps/app-10.md
new file mode 100644
index 0000000..5d2154b
--- /dev/null
+++ b/apps/landing/content/apps/app-10.md
@@ -0,0 +1,9 @@
+---
+title: "rPuppy"
+description: "Delights users with randomly generate puppy pictures. Can be configured to be reachable only from private network or publicly."
+date: 2024-07-05T16:00:56+04:00
+draft: false
+icon: "<svg xmlns='http://www.w3.org/2000/svg' width='50' height='50' viewBox='0 0 256 256'><path fill='currentColor' d='M100 140a8 8 0 1 1-8-8a8 8 0 0 1 8 8Zm64 8a8 8 0 1 0-8-8a8 8 0 0 0 8 8Zm64.94-9.11a12.12 12.12 0 0 1-5 1.11a11.83 11.83 0 0 1-9.35-4.62l-2.59-3.29V184a36 36 0 0 1-36 36H80a36 36 0 0 1-36-36v-51.91l-2.53 3.27A11.88 11.88 0 0 1 32.1 140a12.08 12.08 0 0 1-5-1.11a11.82 11.82 0 0 1-6.84-13.14l16.42-88a12 12 0 0 1 14.7-9.43h.16L104.58 44h46.84l53.08-15.6h.16a12 12 0 0 1 14.7 9.43l16.42 88a11.81 11.81 0 0 1-6.84 13.06ZM97.25 50.18L49.34 36.1a4.18 4.18 0 0 0-.92-.1a4 4 0 0 0-3.92 3.26l-16.42 88a4 4 0 0 0 7.08 3.22ZM204 121.75L150 52h-44l-54 69.75V184a28 28 0 0 0 28 28h44v-18.34l-14.83-14.83a4 4 0 0 1 5.66-5.66L128 186.34l13.17-13.17a4 4 0 0 1 5.66 5.66L132 193.66V212h44a28 28 0 0 0 28-28Zm23.92 5.48l-16.42-88a4 4 0 0 0-4.84-3.16l-47.91 14.11l62.11 80.28a4 4 0 0 0 7.06-3.23Z'/></svg>"
+---
+
+Who's a good boy? Woof Woof.
diff --git a/apps/landing/content/apps/app-2.md b/apps/landing/content/apps/app-2.md
new file mode 100644
index 0000000..ef8bd71
--- /dev/null
+++ b/apps/landing/content/apps/app-2.md
@@ -0,0 +1,9 @@
+---
+title: "URL Shortener"
+description: "Provides URL shortening service. Can be configured to be reachable only from private network or publicly."
+date: 2024-07-05T16:00:36+04:00
+draft: false
+icon: "<svg xmlns='http://www.w3.org/2000/svg' width='40.63' height='50' viewBox='0 0 13 16'><circle cx='2' cy='10' r='1' fill='currentColor'/><circle cx='2' cy='6' r='1' fill='currentColor'/><path fill='currentColor' d='M4.5 14c-.06 0-.11 0-.17-.03a.501.501 0 0 1-.3-.64l4-11a.501.501 0 0 1 .94.34l-4 11c-.07.2-.27.33-.47.33m3 0c-.06 0-.11 0-.17-.03a.501.501 0 0 1-.3-.64l4-11a.501.501 0 0 1 .94.34l-4 11c-.07.2-.27.33-.47.33'/></svg>"
+---
+
+Manual for URL Shortener.
diff --git a/apps/landing/content/apps/app-3.md b/apps/landing/content/apps/app-3.md
new file mode 100644
index 0000000..727b76e
--- /dev/null
+++ b/apps/landing/content/apps/app-3.md
@@ -0,0 +1,9 @@
+---
+title: "Matrix"
+description: "An open network for secure, decentralised communication."
+date: 2024-07-05T16:00:39+04:00
+draft: false
+icon: "<svg xmlns='http://www.w3.org/2000/svg' width='50' height='50' viewBox='0 0 24 24'><path fill='currentColor' d='M.632.55v22.9H2.28V24H0V0h2.28v.55zm7.043 7.26v1.157h.033a3.312 3.312 0 0 1 1.117-1.024c.433-.245.936-.365 1.5-.365c.54 0 1.033.107 1.481.314c.448.208.785.582 1.02 1.108c.254-.374.6-.706 1.034-.992c.434-.287.95-.43 1.546-.43c.453 0 .872.056 1.26.167c.388.11.716.286.993.53c.276.245.489.559.646.951c.152.392.23.863.23 1.417v5.728h-2.349V11.52c0-.286-.01-.559-.032-.812a1.755 1.755 0 0 0-.18-.66a1.106 1.106 0 0 0-.438-.448c-.194-.11-.457-.166-.785-.166c-.332 0-.6.064-.803.189a1.38 1.38 0 0 0-.48.499a1.946 1.946 0 0 0-.231.696a5.56 5.56 0 0 0-.06.785v4.768h-2.35v-4.8c0-.254-.004-.503-.018-.752a2.074 2.074 0 0 0-.143-.688a1.052 1.052 0 0 0-.415-.503c-.194-.125-.476-.19-.854-.19c-.111 0-.259.024-.439.074c-.18.051-.36.143-.53.282a1.637 1.637 0 0 0-.439.595c-.12.259-.18.6-.18 1.02v4.966H5.46V7.81zm15.693 15.64V.55H21.72V0H24v24h-2.28v-.55z'/></svg>"
+---
+
+Manual for Matrix.
diff --git a/apps/landing/content/apps/app-4.md b/apps/landing/content/apps/app-4.md
new file mode 100644
index 0000000..af78343
--- /dev/null
+++ b/apps/landing/content/apps/app-4.md
@@ -0,0 +1,9 @@
+---
+title: "Vaultwarden"
+description: "Alternative implementation of the Bitwarden server API written in Rust and compatible with upstream Bitwarden clients, perfect for self-hosted deployment where running the official resource-heavy service might not be ideal."
+date: 2024-07-05T16:00:41+04:00
+draft: false
+icon: "<svg xmlns='http://www.w3.org/2000/svg' width='50' height='50' viewBox='0 0 48 48'><path fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' d='M35.38 25.63V9.37H24v28.87a34.93 34.93 0 0 0 5.41-3.48q6-4.66 6-9.14Zm4.87-19.5v19.5A11.58 11.58 0 0 1 39.4 30a16.22 16.22 0 0 1-2.11 3.81a23.52 23.52 0 0 1-3 3.24a34.87 34.87 0 0 1-3.22 2.62c-1 .69-2 1.35-3.07 2s-1.82 1-2.27 1.26l-1.08.51a1.53 1.53 0 0 1-1.32 0l-1.08-.51c-.45-.22-1.21-.64-2.27-1.26s-2.09-1.27-3.07-2A34.87 34.87 0 0 1 13.7 37a23.52 23.52 0 0 1-3-3.24A16.22 16.22 0 0 1 8.6 30a11.58 11.58 0 0 1-.85-4.32V6.13A1.64 1.64 0 0 1 9.38 4.5h29.24a1.64 1.64 0 0 1 1.63 1.63Z'/></svg>"
+---
+
+Manual for Vaultwarden.
diff --git a/apps/landing/content/apps/app-5.md b/apps/landing/content/apps/app-5.md
new file mode 100644
index 0000000..b8c814d
--- /dev/null
+++ b/apps/landing/content/apps/app-5.md
@@ -0,0 +1,9 @@
+---
+title: "Gerrit"
+description: "Gerrit Code Review is a web-based code review tool built on Git version control. Gerrit provides a framework you and your teams can use to review code before it becomes part of the code base. Gerrit works equally well in open source projects that limit the number of users who can approve changes (typical in open source software development) and in projects in which all contributors are trusted."
+date: 2024-07-05T16:00:44+04:00
+draft: false
+icon: "<svg xmlns='http://www.w3.org/2000/svg' width='50' height='50' viewBox='0 0 32 32'><path fill='currentColor' d='m16.865 3.573l-.328-.359c.005-.005.385-.354.552-.542c.161-.198.453-.646.458-.651l.406.26c-.021.021-.313.479-.5.698s-.573.573-.589.594zm2.104 14.125c-.016-.005-.323-.203-.49-.292a11.695 11.695 0 0 0-.563-.255l.286-.818l-1.198-.589l-.38 1.161c-.234.005-.953.068-2.016.516c-1.281.536-2.25 1.37-2.26 1.375l-.193.167l.859.031l.026-.021c.005-.01.958-.714 1.49-.943c.12-.047.276-.099.443-.135c-.281.135-.589.302-.802.422c-.266.161-.76.51-.781.526l-.25.172l.911.021l.026-.01c.016-.01 1.552-.833 2.385-1.016l.26-.063c.193-.047.328-.083.563-.083c.208 0 .49.026.917.094c.531.078.88.208.885.214l.318.125l-.427-.583l-.016-.01zM6.995 7.969h-.042L5.614 9.193v.036c-.021.354.104.693.344.958c.24.26.557.411.911.422h.057c.708 0 1.286-.547 1.323-1.25a1.338 1.338 0 0 0-1.255-1.391zm-.063 2.442H6.88a.999.999 0 0 1-.443-.115a.692.692 0 0 0 .797-.766a.689.689 0 0 0-.771-.589a.69.69 0 0 0-.594.708a1.113 1.113 0 0 1-.057-.37l1.214-1.115a1.141 1.141 0 0 1 1.026 1.177a1.12 1.12 0 0 1-1.125 1.068zM19.37 5.443l-.391-.26l-.547.354l-.526-.38l-.401.24l.542.391l-.557.359l.396.24l.536-.339l.516.375l.411-.229l-.542-.391zM32 26.031c-.286-.276-.557-.552-.839-.833a76.772 76.772 0 0 1-1.891-1.984a42.827 42.827 0 0 1-2.109-2.458a17.1 17.1 0 0 1-.859-1.172a13.625 13.625 0 0 1-.891-1.62a30.908 30.908 0 0 1-.771-1.807c.323.276.62.589.885.922c.026-.286.057-.573.078-.865l.031-.427c0-.047.016-.089-.01-.13a.46.46 0 0 0-.073-.099c-.156-.198-.349-.375-.536-.552a32.19 32.19 0 0 0-.781-.708l-.24-.208c-.036-.036-.078-.068-.115-.099c-.042-.042-.057-.13-.073-.182l-.208-.641c.813.38 1.479.99 2.104 1.62c.005-.292.005-.578 0-.87c0-.151 0-.302-.01-.458c0-.042.01-.135-.021-.172c-.016-.026-.042-.047-.057-.073c-.146-.156-.313-.286-.474-.417c-.229-.193-.469-.37-.703-.547c-.208-.156-.422-.307-.635-.458c-.026-.021-.104-.052-.089-.078l.052-.109c.031-.047.021-.057.073-.036l.229.078c.536.208 1.036.49 1.521.813a8.413 8.413 0 0 0-.698-1.729a13.423 13.423 0 0 0-1.953-2.807a16.75 16.75 0 0 0-1.625-1.594c-.297-.25-.609-.49-.932-.708c-.151-.099-.297-.198-.458-.292c-.068-.036-.141-.073-.203-.125c-.24-.188-.484-.375-.729-.568c.318.13.625.276.917.448c-.167-.26-.453-.443-.724-.578a7.706 7.706 0 0 0-1.292-.505c.151-.161.313-.307.464-.464c.151-.161.297-.328.438-.5c.172-.198.339-.396.5-.604l-2.182-1.37c-.161.323-.37.63-.609.906c-.24.271-.521.49-.802.719c-.25.208-.505.417-.75.625c-.068.057-.125.115-.198.161c-.031.031-.125.005-.167.005h-.318c-.396.01-.792.042-1.188.094c-.078.005-.151.016-.234.01l-.234-.016c-.182-.01-.365-.021-.547-.021c-.385-.005-.771 0-1.161.031a6.8 6.8 0 0 0-.969.151a2.52 2.52 0 0 0-.88.417c-.26.188-.516.427-.672.708c-.156.276-.229.604-.286.917c-.177.016-.354.016-.531.021a6.527 6.527 0 0 0-1.614.292a4.907 4.907 0 0 0-1.781 1a5.58 5.58 0 0 0-.719.797c-.026.031-.052.068-.083.089c-.016.01-.036.021-.047.036a.693.693 0 0 1-.068.099l-.177.286c-.224.38-.37.792-.51 1.208l-.063.161l.047-.026a3.772 3.772 0 0 0-.036.271l-.01.135v.073l-.089.016a5.981 5.981 0 0 0-.531.135a1.86 1.86 0 0 0-.448.203c-.141.083-.26.203-.38.318a3.42 3.42 0 0 0-.917 1.5c-.135.469-.182.984-.078 1.458c.026.12.063.25.141.349c.099.12.266.167.417.125c.177-.047.333-.161.495-.245l.422-.214c.604-.297 1.24-.594 1.917-.698c.047-.005.13.089.172.12c.068.052.135.099.198.141c.146.094.297.172.448.24c.349.151.719.234 1.089.307c.672.141 1.354.229 2.042.24c.276.005.552 0 .833-.021c.297-.026.599-.068.901-.068c.333-.005.661.031.99.073c.339.042.677.089 1.016.141c.693.104 1.375.224 2.057.37c-.151.24-.302.484-.448.729c-.01.016-.099 0-.12 0a.932.932 0 0 0-.167 0c-.099 0-.203.01-.302.026a3.886 3.886 0 0 0-.818.203c-.656.245-1.255.646-1.771 1.115c-.297.26-.573.542-.813.854a6.7 6.7 0 0 0-.182.255c.135-.031.281-.057.422-.094c.083-.021.156-.036.234-.052c.026-.01.036-.021.068-.036a9.04 9.04 0 0 1 .922-.75c.151-.104.302-.203.469-.286c.219-.109.469-.172.708-.229c-.438.24-.906.464-1.302.776c-.229.188-.438.391-.656.589l.875-.141c.01 0 .016-.005.031-.016l.224-.125c.151-.083.307-.167.464-.245c.318-.167.641-.323.974-.453c.318-.125.641-.24.979-.302c.292-.063.568-.068.865 0c.453.099.891.307 1.292.552c.026.021.047.047.073.021c.021-.021.13-.099.12-.125l-.24-.443c-.021-.042-.031-.068-.068-.089l-.177-.104a7.51 7.51 0 0 1-.677-.443c-.052-.031-.104-.052-.109-.12c-.01-.057.016-.12.036-.177c.042-.12.104-.229.172-.333c.047-.078.099-.146.146-.219c.021-.026.016-.031.042-.021l.161.047c.313.104.625.214.948.292c.359.094.724.167 1.094.234l.063.016c-.073-.042-.12-.12-.177-.182c-.031-.042-.047-.068-.099-.078l-.141-.031c-.099-.021-.193-.036-.297-.063a8.596 8.596 0 0 1-1.036-.281a15.4 15.4 0 0 0-1.526-.427a37.19 37.19 0 0 0-1.953-.365c-.333-.057-.667-.099-1-.146a15.528 15.528 0 0 0-.995-.12c-.719-.042-1.432.12-2.156.109c-.484-.005-.979-.073-1.458-.141l-.094-.01c.339-.125.667-.25 1-.38c.318-.125.63-.255.943-.385c.167-.068.333-.141.495-.208c.151-.068.302-.135.438-.229c.547-.37.901-.969 1.302-1.479c.365-.479.781-.932 1.318-1.208c.172-.089.349-.156.536-.208c-.38-.583-.734-1.24-.833-1.938l.125.047c.047.016.089.021.099.063l.036.177c.036.12.073.234.115.349c.099.255.214.5.349.734a10.87 10.87 0 0 0 1.021 1.495c.719.917 1.526 1.74 2.313 2.589c.193.208.37.432.547.656c.203.25.406.5.609.745c.161.188.313.38.474.568l.125.151c.021.026.052.036.083.047c.807.401 1.62.802 2.427 1.193c.583.281 1.161.563 1.75.833c.313.146.625.292.948.427c.036.016.083.036.13.052c.021.01.036.021.063.031l.021.063c.036.099.068.193.099.292c.068.188.13.37.198.552c.443 1.219.927 2.422 1.526 3.568a71.35 71.35 0 0 0 1.453 2.589c.536.906 1.083 1.802 1.635 2.698c.443.714.885 1.432 1.344 2.141c.193.302.385.615.583.917l.083.125l1.292-1.896c.01-.01.109-.135.099-.146l-.208-.323c-.385-.599-.776-1.198-1.161-1.797l-1.245-1.932l.875 1.063l1.49 1.802c.161.193.313.385.469.583c.292-.536.589-1.068.885-1.599c.115-.219.234-.443.354-.656zM16.172 2.552c.411-.328.75-.75 1.01-1.208l1.573.995l.24.146c-.328.401-.661.807-1.036 1.167a2.002 2.002 0 0 0-.141.135c-.026.036-.063.068-.094.099l-.042.052c-.031-.01-.063-.021-.094-.026c-.193-.052-.385-.104-.578-.146a11.358 11.358 0 0 0-1.182-.203c-.255-.031-.516-.052-.771-.078c.365-.313.74-.625 1.115-.932zM13.833 4.38c.313-.13.646-.198.974-.255a7.25 7.25 0 0 1 1.984-.052c.474.052.938.141 1.391.281l-.188.151l-.302-.083c-.188-.036-.375-.078-.563-.109a7.856 7.856 0 0 0-1-.083a6.98 6.98 0 0 0-1.828.208a5.861 5.861 0 0 0-1.172.443c-.38.208-.74.464-1.036.776a3.391 3.391 0 0 0-.479.609c-.078.12-.141.24-.203.365a1.56 1.56 0 0 0-.078.193l-.042.099a.406.406 0 0 1-.016.052l-.089-.016l-.109-.01c.313-.964 1.016-1.719 1.891-2.203c.276-.151.568-.286.865-.37zm-5.239.495c.354-.51.917-.865 1.521-.995c.667-.13 1.354-.156 2.031-.141c-.698.177-1.401.438-1.984.87a3.041 3.041 0 0 0-1.245.609a3.08 3.08 0 0 0-.328.318a1.25 1.25 0 0 0-.13.156c-.016.016-.036.036-.047.063h-.115c.031-.177.073-.359.13-.531c.042-.12.089-.24.161-.349zm1.172.078a4.718 4.718 0 0 0-.521.625c-.063.089-.13.203-.24.25c-.115.052-.26-.005-.375-.036a2.76 2.76 0 0 1 1.135-.839zM3.078 8.781c.104-.214.24-.422.365-.62c.021-.036.073-.063.099-.083c.068-.047.13-.094.193-.146c.411-.297.828-.594 1.25-.87c.224-.146.443-.286.672-.411c.24-.135.49-.24.75-.328A9.45 9.45 0 0 1 7.834 6c.229-.031.479-.078.708-.021c-.443.25-.88.5-1.323.745c-.453.255-.917.49-1.38.734c-.443.24-.88.5-1.307.771c-.448.276-.891.557-1.333.839c-.109.068-.214.141-.323.208c.063-.167.12-.339.203-.495zm1.344 4.073c-.036.073-.177.057-.25.057c-.125 0-.245 0-.37.005a4.13 4.13 0 0 0-1.01.188c-.635.193-1.229.5-1.823.802c-.13.073-.271.182-.422.219a.203.203 0 0 1-.219-.083a.704.704 0 0 1-.083-.266a2.255 2.255 0 0 1-.047-.49c0-.443.104-.88.286-1.281c.13-.281.297-.536.495-.766c.203-.234.438-.469.719-.599c.474-.219 1.036-.286 1.552-.313c.099-.01.193-.01.292-.01c.13 0 .286-.021.411.026c.099.036.161.141.203.229c.057.141.099.302.13.448c.083.349.167.698.193 1.057c.016.156.026.318.005.474c-.01.099-.016.208-.063.302zm3.771-2.635a4.38 4.38 0 0 1-.823.401a5.11 5.11 0 0 1-.88.24c-.13.016-.26.036-.391.026c-.135 0-.255-.047-.391-.089a4.004 4.004 0 0 1-.76-.307a.666.666 0 0 1-.229-.203a.34.34 0 0 1-.031-.229c.016-.307.125-.609.271-.88c.25-.458.641-.818 1.12-1.036c1.172-.526 2.484-.036 3.479.656l.109.078c-.208.224-.417.432-.63.641c-.266.25-.542.505-.849.703zm2.885-2.568a11.921 11.921 0 0 1-1.807-.984c.599.25 1.245.401 1.885.495c.344.047.698.094 1.042.104c.375.016.755-.026 1.12-.099c.729-.135 1.427-.406 2.089-.734s1.286-.714 1.885-1.146c.286-.203.573-.417.844-.646c.026-.021.229-.219.245-.208l.052.042l.719.557c.438.339.875.677 1.318 1.016a68.458 68.458 0 0 1-3.672 1.203c-.693.208-1.38.401-2.083.563c-.552.13-1.115.25-1.677.276c-.677.031-1.339-.177-1.958-.438zm11.797 5.255c.104.026.198.063.286.089l.13.047c.021.005.036.021.057.026l.026.078c.063.198.12.385.188.578c-.198-.172-.401-.339-.599-.505l-.12-.099c-.031-.021-.063-.031-.042-.063l.078-.151zm-.891 1.922l.047-.083l.036-.057c.016-.026.01-.031.042-.016c.172.068.344.146.51.224c.323.146.635.307.938.484c.146.089.292.182.432.276l.198.141l.099.073c.042.036.057.083.078.135c.135.375.292.755.448 1.125c.104.255.219.505.333.755a14.762 14.762 0 0 0-1.276-1.391a20.964 20.964 0 0 0-1.438-1.307l-.432-.354zm5.011 8.568l-.161.12l.01.021l.083.125l.365.557l1.203 1.87c.417.641.828 1.286 1.245 1.927l.411.641l.109.177a.256.256 0 0 1 .042.063c-.349.51-.698 1.026-1.047 1.536c-.036.047-.068.099-.099.146c-.318-.495-.635-.99-.953-1.49c-.531-.844-1.057-1.703-1.578-2.552a106.797 106.797 0 0 1-1.688-2.854c-.51-.901-1-1.818-1.411-2.771a39.425 39.425 0 0 1-1.078-2.828c.646.26 1.307.49 1.974.698c.193.057.385.12.578.167l.083.026c.01 0 .021-.052.026-.068c.026-.083.042-.172.063-.26c.036-.167.068-.339.094-.505c.276.568.583 1.125.938 1.646c.286.422.594.828.917 1.229a43.68 43.68 0 0 0 2.188 2.531c.62.656 1.245 1.313 1.88 1.953l.516.516c.01.01.052.042.052.057l-.042.068l-.198.37l-.786 1.422c-.24-.292-.479-.578-.719-.875l-1.5-1.818c-.422-.516-.849-1.031-1.271-1.547l-.25-.297z'/></svg>"
+---
+
+Manual for Gerrit.
diff --git a/apps/landing/content/apps/app-6.md b/apps/landing/content/apps/app-6.md
new file mode 100644
index 0000000..cbe66bd
--- /dev/null
+++ b/apps/landing/content/apps/app-6.md
@@ -0,0 +1,9 @@
+---
+title: "Jenkins"
+description: "Build great things at any scale. The leading open source automation server, Jenkins provides hundreds of plugins to support building, deploying and automating any project."
+date: 2024-07-05T16:00:45+04:00
+draft: false
+icon: "<svg xmlns='http://www.w3.org/2000/svg' width='50' height='50' viewBox='0 0 24 24'><path fill='currentColor' d='M2.872 24h-.975a3.866 3.866 0 0 1-.07-.197c-.215-.666-.594-1.49-.692-2.154c-.146-.984.78-1.039 1.374-1.465c.915-.66 1.635-1.025 2.627-1.62c.295-.179 1.182-.624 1.281-.829c.201-.408-.345-.982-.49-1.3c-.225-.507-.345-.937-.376-1.435c-.824-.13-1.455-.627-1.844-1.185c-.63-.925-1.066-2.635-.525-3.936c.045-.103.254-.305.285-.463c.06-.308-.105-.72-.12-1.048c-.06-1.692.284-3.15 1.425-3.66c.463-1.84 2.113-2.453 3.673-3.367c.58-.342 1.224-.562 1.89-.807c2.372-.877 6.027-.712 7.994.783c.836.633 2.176 1.97 2.656 2.939c1.262 2.555 1.17 6.825.287 9.934c-.12.421-.29 1.032-.533 1.533c-.168.35-.689 1.05-.625 1.36c.064.314 1.19 1.17 1.432 1.395c.434.422 1.26.975 1.324 1.5c.07.557-.248 1.336-.41 1.875c-.217.721-.436 1.441-.654 2.131H2.87zm11.104-3.54a7.723 7.723 0 0 0-2.065-.757c-.87-.164-.78 1.188-.75 1.994c.03.643.36 1.316.51 1.744c.076.197.09.41.256.449c.3.068 1.29-.326 1.575-.479c.6-.328 1.064-.844 1.574-1.189c.016-.17.016-.34.03-.508a2.648 2.648 0 0 0-1.095-.277c.314-.15.75-.15 1.035-.332l.016-.193c-.496-.03-.69-.254-1.021-.436zm7.454 2.935a17.78 17.78 0 0 0 .465-1.752c.06-.287.215-.918.178-1.176c-.059-.459-.684-.799-1.004-1.086c-.584-.525-.95-.975-1.56-1.469c-.249.375-.78.615-.983.914c1.447-.689 1.71 2.625 1.141 3.69c.09.329.391.45.514.735l-.086.166h1.29c.013 0 .03 0 .044.014zm-6.634-.012c-.05-.074-.1-.135-.15-.209l-.301.195h.45zm2.77 0c.008-.209.018-.404.03-.598c-.53.029-.825-.48-1.196-.527c-.324-.045-.6.361-1.02.195c-.095.105-.183.227-.284.316c.154.18.295.375.424.584h.815a.298.298 0 0 1 .3-.285c.165 0 .284.121.284.27h.66zm2.116 0c-.314-.479-.947-.898-1.68-.555l-.03.541h1.71zm-8.51 0l-.104-.344c-.225-.72-.36-1.26-.405-1.68c-.914-.436-1.875-.87-2.654-1.426c-.15-.105-1.109-1.35-1.23-1.305c-1.739.676-3.359 1.86-4.814 2.984c.256.557.48 1.141.69 1.74h8.505zm8.265-2.113c-.029-.512-.164-1.56-.48-1.74c-.66-.39-1.846.78-2.34.943c.045.15.135.271.15.48c.285-.074.645-.029.898.092c-.299.03-.629.03-.824.164c-.074.195.016.48-.029.764c.69.197 1.5.303 2.385.332c.164-.227.225-.645.211-1.082zm-4.08-.36c-.044.375.046.51.12.943c1.26.391 1.034-1.74-.135-.959zM8.76 19.5c-.45.457 1.27 1.082 1.814 1.115c0-.29.165-.564.135-.77c-.65-.118-1.502-.042-1.945-.347zm5.565.215c0 .043-.061.03-.068.064c.58.451 1.014.545 1.802.51c.354-.262.67-.563 1.043-.807c-.855.074-1.931.607-2.774.23zm3.42-17.726c-1.606-.906-4.35-1.591-6.076-.731c-1.38.692-3.27 1.84-3.899 3.292c.6 1.402-.166 2.686-.226 4.109c-.018.757.36 1.42.391 2.242c-.2.338-.825.38-1.26.356c-.146-.729-.4-1.549-1.155-1.63c-1.064-.116-1.845.764-1.89 1.683c-.06 1.08.833 2.864 2.085 2.745c.488-.046.608-.54 1.139-.54c.285.57-.445.75-.523 1.154c-.016.105.06.511.104.705c.233.944.744 2.16 1.245 2.88c.635.9 1.884 1.051 3.229 1.141c.24-.525 1.125-.48 1.706-.346c-.691-.27-1.336-.945-1.875-1.529c-.615-.676-1.23-1.41-1.261-2.28c1.155 1.604 2.1 3 4.2 3.704c1.59.525 3.45-.254 4.664-1.109c.51-.359.811-.93 1.17-1.439c1.35-1.936 1.98-4.71 1.846-7.394c-.06-1.111-.06-2.221-.436-2.955c-.389-.781-1.695-1.471-2.475-.781c-.15-.764.63-1.23 1.545-.96c-.66-.854-1.336-1.858-2.266-2.384zM13.58 14.896c.615 1.544 2.724 1.363 4.505 1.323c-.084.194-.256.435-.465.515c-.57.232-2.145.408-2.937-.012c-.506-.27-.824-.873-1.102-1.227c-.137-.172-.795-.608-.012-.609zm.164-.87c.893.464 2.52.517 3.731.48c.066.267.066.593.068.913c-1.55.08-3.386-.304-3.794-1.395h-.005zm6.675-.586c-.473.9-1.145 1.897-2.539 1.928c-.023-.284-.045-.735 0-.904c1.064-.103 1.727-.646 2.543-1.017zm-.649-.667c-1.02.66-2.154 1.375-3.824 1.21c-.351-.31-.485-1-.14-1.458c.181.313.06.885.57.97c.944.165 2.038-.579 2.73-.84c.42-.713-.046-.976-.42-1.433c-.782-.93-1.83-2.1-1.802-3.51c.314-.224.346.346.391.45c.404.96 1.424 2.175 2.174 3c.18.21.48.39.51.524c.092.39-.254.854-.209 1.11zm-13.439-.675c-.314-.184-.393-.99-.768-1.01c-.535-.03-.438 1.05-.436 1.68c-.37-.33-.435-1.365-.164-1.89c-.308-.15-.445.164-.618.284c.22-1.59 2.34-.734 1.99.96zM4.713 5.995c-.685.756-.54 2.174-.459 3.188c1.244-.785 2.898.06 2.883 1.394c.595-.016.223-.744.115-1.215c-.353-1.528.592-3.187.041-4.59c-1.064.084-1.939.52-2.578 1.215zm9.12 1.113c.307.562.404 1.148.84 1.57c.195.19.574.424.387.95c-.045.121-.365.391-.551.45c-.674.195-2.254.03-1.721-.81c.563.015 1.314.36 1.732-.045c-.314-.524-.885-1.53-.674-2.13zm6.198-.013h.068c.33.668.6 1.375 1.004 1.965c-.27.628-2.053 1.19-2.023.057c.39-.17 1.05-.035 1.395-.25c-.193-.556-.48-1.006-.434-1.771zm-6.927-1.617c-1.422-.33-2.131.592-2.56 1.553c-.384-.094-.231-.615-.135-.883c.255-.701 1.28-1.633 2.119-1.506c.359.057.848.386.576.834zM9.642 1.593c-1.56.44-3.56 1.574-4.2 2.974c.495-.07.84-.321 1.33-.351c.186-.016.428.074.641.015c.424-.104.78-1.065 1.102-1.41c.31-.345.685-.496.94-.81c.167-.09.409-.074.42-.33c-.073-.075-.15-.135-.232-.105z'/></svg>"
+---
+
+Manual for Jenkins.
diff --git a/apps/landing/content/apps/app-7.md b/apps/landing/content/apps/app-7.md
new file mode 100644
index 0000000..90c3707
--- /dev/null
+++ b/apps/landing/content/apps/app-7.md
@@ -0,0 +1,9 @@
+---
+title: "Zot"
+description: "OCI-native container image registry, simplified."
+date: 2024-07-05T16:00:47+04:00
+draft: false
+icon: "<svg xmlns='http://www.w3.org/2000/svg' width='50' height='50' viewBox='0 0 24 24'><path fill='currentColor' d='M21.231 2.462L7.18 20.923h14.564V24H2.256v-2.462L16.308 3.076H2.975V0h18.256z'/></svg>"
+---
+
+Manual for Zot.
diff --git a/apps/landing/content/apps/app-8.md b/apps/landing/content/apps/app-8.md
new file mode 100644
index 0000000..2da3def
--- /dev/null
+++ b/apps/landing/content/apps/app-8.md
@@ -0,0 +1,9 @@
+---
+title: "Soft-Serve"
+description: "A tasty, self-hostable Git server for the command line. 🍦."
+date: 2024-07-05T16:00:50+04:00
+draft: false
+icon: "<svg xmlns='http://www.w3.org/2000/svg' width='50' height='50' viewBox='0 0 48 48'><g fill='none' stroke='currentColor' stroke-linecap='round' stroke-width='4'><path stroke-linejoin='round' d='M15.34 22.5L21 37l3 6l3-6l5.66-14.5'/><path d='M19 32h10'/><path stroke-linejoin='round' d='M24 3c-6 0-8 6-8 6s-6 2-6 7s5 7 5 7s3.5-2 9-2s9 2 9 2s5-2 5-7s-6-7-6-7s-2-6-8-6Z'/></g></svg>"
+---
+
+Manual for Soft-Serve.
diff --git a/apps/landing/content/apps/app-9.md b/apps/landing/content/apps/app-9.md
new file mode 100644
index 0000000..1f15383
--- /dev/null
+++ b/apps/landing/content/apps/app-9.md
@@ -0,0 +1,9 @@
+---
+title: "Pi-hole"
+description: "Pi-hole is a Linux network-level advertisement and Internet tracker blocking application which acts as a DNS sinkhole and optionally a DHCP server, intended for use on a private network."
+date: 2024-07-05T16:00:53+04:00
+draft: false
+icon: "<svg xmlns='http://www.w3.org/2000/svg' width='50' height='50' viewBox='0 0 24 24'><path fill='currentColor' d='M4.344 0c.238 4.792 3.256 7.056 6.252 7.376c.165-1.692-4.319-5.6-4.319-5.6c-.008-.011.009-.025.019-.014c0 0 4.648 4.01 5.423 5.645c2.762-.15 5.196-1.947 5-4.912c0 0-4.12-.613-5 4.618C11.48 2.753 8.993 0 4.344 0zM12 7.682v.002a3.68 3.68 0 0 0-2.591 1.077L4.94 13.227a3.683 3.683 0 0 0-.86 1.356a3.31 3.31 0 0 0-.237 1.255A3.681 3.681 0 0 0 4.92 18.45l4.464 4.466a3.69 3.69 0 0 0 2.251 1.06l.002.001c.093.01.187.015.28.017l-.1-.008c.06.003.117.009.177.009l-.077-.001L12 24l-.004-.005a3.68 3.68 0 0 0 2.61-1.077l4.469-4.465a3.683 3.683 0 0 0 1.006-1.888l.012-.063a3.682 3.682 0 0 0 .057-.541l.003-.061c0-.017.003-.05.004-.06h-.002a3.683 3.683 0 0 0-1.077-2.607l-4.466-4.468a3.694 3.694 0 0 0-1.564-.927l-.07-.02a3.43 3.43 0 0 0-.946-.133L12 7.682zm3.165 3.357c.023 1.748-1.33 3.078-1.33 4.806c.164 2.227 1.733 3.207 3.266 3.146c-.035.003-.068.007-.104.009c-1.847.135-3.209-1.326-5.002-1.326c-2.23.164-3.21 1.736-3.147 3.27l-.008-.104c-.133-1.847 1.328-3.21 1.328-5.002c-.173-2.32-1.867-3.284-3.46-3.132c.1-.011.203-.021.31-.027c1.847-.133 3.209 1.328 5.002 1.328c2.082-.155 3.074-1.536 3.145-2.968zM4.344 0c.238 4.792 3.256 7.056 6.252 7.376c.165-1.692-4.319-5.6-4.319-5.6c-.008-.011.009-.025.019-.014c0 0 4.648 4.01 5.423 5.645c2.762-.15 5.196-1.947 5-4.912c0 0-4.12-.613-5 4.618C11.48 2.753 8.993 0 4.344 0zM12 7.682v.002a3.68 3.68 0 0 0-2.591 1.077L4.94 13.227a3.683 3.683 0 0 0-.86 1.356a3.31 3.31 0 0 0-.237 1.255A3.681 3.681 0 0 0 4.92 18.45l4.464 4.466a3.69 3.69 0 0 0 2.251 1.06l.002.001c.093.01.187.015.28.017l-.1-.008c.06.003.117.009.177.009l-.077-.001L12 24l-.004-.005a3.68 3.68 0 0 0 2.61-1.077l4.469-4.465a3.683 3.683 0 0 0 1.006-1.888l.012-.063a3.682 3.682 0 0 0 .057-.541l.003-.061c0-.017.003-.05.004-.06h-.002a3.683 3.683 0 0 0-1.077-2.607l-4.466-4.468a3.694 3.694 0 0 0-1.564-.927l-.07-.02a3.43 3.43 0 0 0-.946-.133L12 7.682zm3.165 3.357c.023 1.748-1.33 3.078-1.33 4.806c.164 2.227 1.733 3.207 3.266 3.146c-.035.003-.068.007-.104.009c-1.847.135-3.209-1.326-5.002-1.326c-2.23.164-3.21 1.736-3.147 3.27l-.008-.104c-.133-1.847 1.328-3.21 1.328-5.002c-.173-2.32-1.867-3.284-3.46-3.132c.1-.011.203-.021.31-.027c1.847-.133 3.209 1.328 5.002 1.328c2.082-.155 3.074-1.536 3.145-2.968z'/></svg>"
+---
+
+Manual for Pi-hole.
diff --git a/apps/landing/content/facts/_index.md b/apps/landing/content/facts/_index.md
new file mode 100644
index 0000000..94fba26
--- /dev/null
+++ b/apps/landing/content/facts/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Facts"
+layout: "facts"
+---
+This is the facts page content.
diff --git a/apps/landing/content/facts/facts-1.md b/apps/landing/content/facts/facts-1.md
new file mode 100644
index 0000000..e83ddb6
--- /dev/null
+++ b/apps/landing/content/facts/facts-1.md
@@ -0,0 +1,8 @@
+---
+title: "Publish in seconds"
+description: "This is a description of New Article 1."
+date: "2024-06-25T21:54:26+04:00"
+draft: false
+image: "/images/fact-1.png"
+---
+Deploy by pushing to **Git** repository
diff --git a/apps/landing/content/facts/facts-2.md b/apps/landing/content/facts/facts-2.md
new file mode 100644
index 0000000..2e1e4a3
--- /dev/null
+++ b/apps/landing/content/facts/facts-2.md
@@ -0,0 +1,8 @@
+---
+title: "No extra tools required"
+description: "This is a description of New Article 2."
+date: "2024-06-25T21:54:33+04:00"
+draft: false
+image: "/images/fact-2.png"
+---
+Use any of your **favorite** languages or frameworks
diff --git a/apps/landing/content/facts/facts-3.md b/apps/landing/content/facts/facts-3.md
new file mode 100644
index 0000000..f53758a
--- /dev/null
+++ b/apps/landing/content/facts/facts-3.md
@@ -0,0 +1,8 @@
+---
+title: "Get a headstart"
+description: "This is a description of New Article 3."
+date: "2024-06-25T21:54:40+04:00"
+draft: false
+image: "/images/fact-3.png"
+---
+Reuse **free** and **curated** templates
diff --git a/apps/landing/content/facts/facts-4.md b/apps/landing/content/facts/facts-4.md
new file mode 100644
index 0000000..6c09d75
--- /dev/null
+++ b/apps/landing/content/facts/facts-4.md
@@ -0,0 +1,8 @@
+---
+title: "Secure by default"
+description: "This is a description of New Article 5."
+date: "2024-06-25T21:54:43+04:00"
+draft: false
+image: "/images/fact-4.png"
+---
+Comes with granular ACLs with **reasonable defaults**
diff --git a/apps/landing/content/facts/facts-5.md b/apps/landing/content/facts/facts-5.md
new file mode 100644
index 0000000..e0dff96
--- /dev/null
+++ b/apps/landing/content/facts/facts-5.md
@@ -0,0 +1,8 @@
+---
+title: "Improve productivity"
+description: "This is a description of New Article 6."
+date: "2024-06-25T21:54:44+04:00"
+draft: false
+image: "/images/fact-5.png"
+---
+Use additional services from **Application Marketplace**
diff --git a/apps/landing/content/facts/facts-6.md b/apps/landing/content/facts/facts-6.md
new file mode 100644
index 0000000..2a50e2f
--- /dev/null
+++ b/apps/landing/content/facts/facts-6.md
@@ -0,0 +1,8 @@
+---
+title: "Foo"
+description: "This is a description of New Article 7."
+date: "2024-06-25T21:54:46+04:00"
+draft: false
+image: "/images/fact-6.png"
+---
+Bar
diff --git a/apps/landing/content/facts/facts-7.md b/apps/landing/content/facts/facts-7.md
new file mode 100644
index 0000000..f8b11ff
--- /dev/null
+++ b/apps/landing/content/facts/facts-7.md
@@ -0,0 +1,8 @@
+---
+title: "Dev"
+description: "This is a description of New Article 8."
+date: "2024-06-25T21:55:00+04:00"
+draft: false
+image: "/images/fact-7.png"
+---
+Null
diff --git a/apps/landing/content/register/_index.md b/apps/landing/content/register/_index.md
new file mode 100644
index 0000000..7476bc1
--- /dev/null
+++ b/apps/landing/content/register/_index.md
@@ -0,0 +1,6 @@
+---
+title: "Register"
+layout: "single"
+---
+
+Welcome to the registration page. Please fill out the form below to create your Dodo instance.
diff --git a/apps/landing/hugo.toml b/apps/landing/hugo.toml
new file mode 100644
index 0000000..62892eb
--- /dev/null
+++ b/apps/landing/hugo.toml
@@ -0,0 +1,3 @@
+baseURL = 'https://example.org/'
+languageCode = 'en-us'
+title = 'Dodo'
diff --git a/apps/landing/layouts/404.html b/apps/landing/layouts/404.html
new file mode 100644
index 0000000..0b8c249
--- /dev/null
+++ b/apps/landing/layouts/404.html
@@ -0,0 +1,12 @@
+<!DOCTYPE html>
+<html lang="en">
+ <head>
+ <meta charset="UTF-8">
+ <meta name="viewport", content="width=device-width, intitial-scale=1.0" >
+ <title>Not Found</title>
+ </head>
+ <body>
+ Not Found
+ <a href="/">Go to Homepage</a>
+ </body>
+</html>
diff --git a/apps/landing/layouts/_default/baseof.html b/apps/landing/layouts/_default/baseof.html
new file mode 100644
index 0000000..f448548
--- /dev/null
+++ b/apps/landing/layouts/_default/baseof.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="UTF-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <link rel="stylesheet" href="/styles/style.css?v=0.0.1">
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/hack-font/3.3.0/web/hack.min.css">
+ <title>dodo</title>
+</head>
+<body>
+ <div class="container">
+ {{ partial "navbar" . }}
+ {{ block "main" . }}{{ end }}
+ {{/* {{ partial "footer" . }} */}}
+ </div>
+</body>
+</html>
diff --git a/apps/landing/layouts/_default/list.html b/apps/landing/layouts/_default/list.html
new file mode 100644
index 0000000..57d7633
--- /dev/null
+++ b/apps/landing/layouts/_default/list.html
@@ -0,0 +1,34 @@
+{{ define "main" }}
+<div class="facts-content">
+ {{ $facts := where .Site.Pages "Section" "facts" }}
+ {{ $individualFacts := where $facts "Kind" "page" }}
+ {{ $sortedFacts := sort $individualFacts "File.BaseFileName" "asc" }}
+ <!-- 4x4 GRID -->
+ <div class="grid-container" data-facts='[
+ {{ range $i, $fact := $sortedFacts }}
+ {{ if $i }},{{ end }}{
+ "params": {{ jsonify $fact.Params }}
+ }
+ {{ end }}
+ ]'>
+ {{ range $i, $fact := $sortedFacts }}
+ {{ $className := printf "fact-%d" (add $i 1) }}
+ <div id="fact-{{ $i }}" class="facts {{ $className }} {{ if eq $i 0 }}active-fact{{ end }}"
+ onclick="handleImageChange('{{ $fact.Params.image }}', {{ $i }}, '{{ $fact.Title }}')"
+ onmouseover="handleMouseover('{{ $fact.Params.image }}', {{ $i }}, '{{ $fact.Title }}')">
+ <h3 class="fact-title">{{ $fact.Title }}</h3>
+ {{ $fact.Content }}
+ </div>
+ {{ end }}
+ <!-- 1 Large Box 3x3 -->
+ {{ $firstFact := index $sortedFacts 0 }}
+ <div id="factImageBox" class="fact-image-box">
+ <img id="factImage" src="/images/fact-1.png" alt="{{ $firstFact.Title }}" class="fact-image">
+ </div>
+ </div>
+</div>
+<div class="footer-form">
+ {{ partial "register-form.html" . }}
+</div>
+<script src="/js/main.js"></script>
+{{ end }}
diff --git a/apps/landing/layouts/about/single.html b/apps/landing/layouts/about/single.html
new file mode 100644
index 0000000..8708853
--- /dev/null
+++ b/apps/landing/layouts/about/single.html
@@ -0,0 +1,8 @@
+{{ define "main" }}
+<div class="about">
+ <h1>{{ .Title }}</h1>
+ <div class="content">
+ {{ .Content }}
+ </div>
+</div>
+{{ end }}
diff --git a/apps/landing/layouts/apps/list.html b/apps/landing/layouts/apps/list.html
new file mode 100644
index 0000000..f49bfb1
--- /dev/null
+++ b/apps/landing/layouts/apps/list.html
@@ -0,0 +1,17 @@
+{{ define "main" }}
+<div class="apps-grid">
+ {{ $pages := .Pages }}
+ {{ $sortedPages := sort $pages "Date" }}
+ {{ range $sortedPages }}
+ <div class="app-card">
+ <a href="{{ .RelPermalink }}" class="app-card-link"></a>
+ <div class="app-header">
+ <h2>{{ .Title }}</h2>
+ <span class="app-icon">{{ .Params.icon | safeHTML }}</span>
+ </div>
+ <p>{{ .Params.description }}</p>
+ <a class="read-more" href="{{ .RelPermalink }}">Read more</a>
+ </div>
+ {{ end }}
+</div>
+{{ end }}
diff --git a/apps/landing/layouts/apps/single.html b/apps/landing/layouts/apps/single.html
new file mode 100644
index 0000000..d2ab63f
--- /dev/null
+++ b/apps/landing/layouts/apps/single.html
@@ -0,0 +1,7 @@
+{{ define "main" }}
+<article class="app-detail">
+ <h1>{{ .Title }}</h1>
+ <p>{{ .Params.description }}</p>
+ <div>{{ .Content }}</div>
+</article>
+{{ end }}
diff --git a/apps/landing/layouts/partials/footer.html b/apps/landing/layouts/partials/footer.html
new file mode 100644
index 0000000..380f74a
--- /dev/null
+++ b/apps/landing/layouts/partials/footer.html
@@ -0,0 +1 @@
+<div class="footer">footer</div>
diff --git a/apps/landing/layouts/partials/navbar.html b/apps/landing/layouts/partials/navbar.html
new file mode 100644
index 0000000..0621106
--- /dev/null
+++ b/apps/landing/layouts/partials/navbar.html
@@ -0,0 +1,12 @@
+<nav class="navbar">
+ <div class="logo">
+ <a href="/">
+ <span class="logo-part1">do</span><span class="logo-part2">do:</span>
+ </a>
+ </div>
+ <div class="links">
+ <a href="/register">register</a>
+ <a href="/apps">apps</a>
+ <a href="/about">about</a>
+ </div>
+</nav>
diff --git a/apps/landing/layouts/partials/register-form.html b/apps/landing/layouts/partials/register-form.html
new file mode 100644
index 0000000..9c3bc83
--- /dev/null
+++ b/apps/landing/layouts/partials/register-form.html
@@ -0,0 +1,11 @@
+<div class="form-container-footer">
+ <form method="POST" action="/register">
+ <div class="form-group-footer input-area">
+ <label for="public-key">SSH Public Key</label>
+ <textarea id="public-key" name="public-key" rows="4" required></textarea>
+ </div>
+ <div class="form-group-footer">
+ <button type="submit">register</button>
+ </div>
+ </form>
+</div>
diff --git a/apps/landing/layouts/register/single.html b/apps/landing/layouts/register/single.html
new file mode 100644
index 0000000..f576e41
--- /dev/null
+++ b/apps/landing/layouts/register/single.html
@@ -0,0 +1,7 @@
+{{ define "main" }}
+<div class="form-page">
+ <div class="form-container">
+ {{ partial "register-form.html" . }}
+ </div>
+</div>
+{{ end }}
diff --git a/apps/landing/static/images/fact-1.png b/apps/landing/static/images/fact-1.png
new file mode 100644
index 0000000..d2f8bc8
--- /dev/null
+++ b/apps/landing/static/images/fact-1.png
Binary files differ
diff --git a/apps/landing/static/images/fact-2.png b/apps/landing/static/images/fact-2.png
new file mode 100644
index 0000000..3d24ceb
--- /dev/null
+++ b/apps/landing/static/images/fact-2.png
Binary files differ
diff --git a/apps/landing/static/images/fact-3.png b/apps/landing/static/images/fact-3.png
new file mode 100644
index 0000000..1f2b7e5
--- /dev/null
+++ b/apps/landing/static/images/fact-3.png
Binary files differ
diff --git a/apps/landing/static/images/fact-4.png b/apps/landing/static/images/fact-4.png
new file mode 100644
index 0000000..6254c72
--- /dev/null
+++ b/apps/landing/static/images/fact-4.png
Binary files differ
diff --git a/apps/landing/static/images/fact-5.png b/apps/landing/static/images/fact-5.png
new file mode 100644
index 0000000..30301cd
--- /dev/null
+++ b/apps/landing/static/images/fact-5.png
Binary files differ
diff --git a/apps/landing/static/images/fact-6.png b/apps/landing/static/images/fact-6.png
new file mode 100644
index 0000000..ee79e69
--- /dev/null
+++ b/apps/landing/static/images/fact-6.png
Binary files differ
diff --git a/apps/landing/static/images/fact-7.png b/apps/landing/static/images/fact-7.png
new file mode 100644
index 0000000..8e940d7
--- /dev/null
+++ b/apps/landing/static/images/fact-7.png
Binary files differ
diff --git a/apps/landing/static/js/main.js b/apps/landing/static/js/main.js
new file mode 100644
index 0000000..2e6a436
--- /dev/null
+++ b/apps/landing/static/js/main.js
@@ -0,0 +1,109 @@
+let mouseOverEnabled = true;
+
+function handleImageChange(imageURL, index, factTitle) {
+ const factImage = document.getElementById("factImage");
+ if (factImage.src.endsWith(imageURL)) {
+ return;
+ };
+ highlightFact(index);
+ factImage.classList.add("fade-out");
+ setTimeout(() => {
+ factImage.src = imageURL;
+ factImage.alt = factTitle;
+ factImage.classList.remove("fade-out");
+ }, 300);
+};
+
+function highlightFact(index) {
+ const facts = document.querySelectorAll(".facts");
+ facts.forEach((fact, i) => {
+ if (i === index) {
+ fact.classList.add("active-fact");
+ } else {
+ fact.classList.remove("active-fact");
+ };
+ });
+};
+
+function handleMouseover(imageURL, index, factTitle) {
+ if (!mouseOverEnabled) {
+ return;
+ };
+ handleImageChange(imageURL, index, factTitle);
+};
+
+let scrollTimeout;
+let mouseoverTimeout;
+
+function delayScroll(func, delay) {
+ return function (...args) {
+ clearTimeout(scrollTimeout);
+ scrollTimeout = setTimeout(() => {
+ func.apply(this, args);
+ }, delay);
+ };
+}
+
+function delayMouseoverEnable(delay) {
+ clearTimeout(mouseoverTimeout);
+ mouseoverTimeout = setTimeout(() => {
+ mouseOverEnabled = true;
+ }, delay);
+}
+
+let lastScrollTop = 0;
+
+function getFirstVisibleFact() {
+ const facts = document.querySelectorAll(".facts");
+ const factImage = document.getElementById("factImageBox");
+ const imageBottom = factImage.getBoundingClientRect().bottom;
+
+ const scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
+ const isScrollingDown = scrollTop > lastScrollTop;
+ lastScrollTop = scrollTop;
+
+ if (isScrollingDown) {
+ for (let i = 0; i < facts.length; i++) {
+ const rect = facts[i].getBoundingClientRect();
+ if (rect.top < window.innerHeight && rect.top >= imageBottom) {
+ return i;
+ };
+ };
+ return 7;
+ } else {
+ for (let i = 0; i < facts.length; i++) {
+ const rect = facts[i].getBoundingClientRect();
+ if (rect.top >= 0 && rect.top >= imageBottom) {
+ return i;
+ };
+ };
+ };
+ return 0;
+};
+
+document.addEventListener("DOMContentLoaded", function () {
+ const gridContainer = document.querySelector(".grid-container");
+ const facts = JSON.parse(gridContainer.dataset.facts);
+
+ const handleScroll = () => {
+ clearTimeout(scrollTimeout);
+ mouseOverEnabled = false;
+ scrollTimeout = setTimeout(() => {
+ const currentSection = getFirstVisibleFact();
+ handleImageChange(facts[currentSection].params.image, currentSection, facts[currentSection].params.title);
+ delayMouseoverEnable(800);
+ }, 300);
+ };
+
+ const checkAddRemoveScrollListener = () => {
+ if (window.innerWidth <= 768) {
+ window.addEventListener("scroll", handleScroll);
+ } else {
+ window.removeEventListener("scroll", handleScroll);
+ }
+ };
+
+ checkAddRemoveScrollListener();
+
+ window.addEventListener("resize", checkAddRemoveScrollListener);
+});
diff --git a/apps/landing/static/styles/style.css b/apps/landing/static/styles/style.css
new file mode 100644
index 0000000..dbe4305
--- /dev/null
+++ b/apps/landing/static/styles/style.css
@@ -0,0 +1,454 @@
+:root {
+ --bg: #d6d6d6;
+ --formBg: #3a3a3a;
+ --text: #3a3a3a;
+ --formText: #d6d6d6;
+ --button: #7f9f7f;
+ --logo: #d4888d;
+ --fontSize: 14px;
+}
+
+body {
+ background: var(--bg);
+ color: var(--text);
+ margin: 0;
+ display: flex;
+ min-height: 100vh;
+ font-family: Hack, monospace;
+ font-size: var(--fontSize);
+}
+
+a {
+ color: inherit;
+ text-decoration: none;
+}
+
+.container {
+ display: flex;
+ flex-direction: column;
+ flex: 1;
+ position: relative;
+ width: 100%;
+}
+
+.navbar {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ position: sticky;
+ top: 0;
+ background-color: var(--bg);
+ border-bottom: 1px dashed var(--formBg);
+ padding: 0 20px;
+ z-index: 100;
+}
+
+.logo {
+ font-weight: bold;
+ font-size: 1.6rem;
+ align-content: center;
+ height: 100%;
+ background-color: var(--formBg);
+}
+
+.logo a {
+ padding-left: 15px;
+ padding-right: 15px;
+}
+
+.links {
+ display: flex;
+ align-items: center;
+ height: 100%;
+}
+
+.links a {
+ border-right: 1px dashed var(--formBg);
+ padding: 0 20px;
+ height: 100%;
+ align-content: center;
+}
+
+.links a:hover {
+ transform: scaleX(1);
+ text-decoration-line: underline;
+ text-decoration-color: var(--logo);
+}
+
+.logo-part1 {
+ color: var(--bg);
+}
+
+.logo-part2 {
+ color: var(--logo);
+}
+
+/* FACTS Grid Container */
+
+.facts-content {
+ display: flex;
+ flex-grow: 1;
+}
+
+.grid-container {
+ display: grid;
+ grid-template-columns: repeat(4, 1fr);
+ grid-template-rows: repeat(4, 1fr);
+ grid-template-areas:
+ "fact-1 large-box large-box large-box"
+ "fact-2 large-box large-box large-box"
+ "fact-3 large-box large-box large-box"
+ "fact-4 fact-5 fact-6 fact-7";
+ padding: 0 20px;
+}
+
+.facts {
+ border: 1px dashed var(--formBg);
+ display: flex;
+ justify-content: center;
+ border-top: none !important;
+ flex-direction: column;
+ transition: background-color 0.5s ease, color 0.5s ease;
+}
+
+.fact-image-box {
+ grid-area: large-box;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ border-right: 1px dashed var(--formBg);
+ border-bottom: 1px dashed var(--formBg);
+ padding: 5px;
+}
+
+.fact-image {
+ max-width: 80%;
+ max-height: 80%;
+ object-fit: cover;
+ transition: opacity 0.3s ease-in-out;
+ opacity: 1;
+}
+
+.fade-out {
+ opacity: 0;
+}
+
+.fact-1 {
+ grid-area: fact-1;
+}
+.fact-2 {
+ grid-area: fact-2;
+}
+.fact-3 {
+ grid-area: fact-3;
+}
+.fact-4 {
+ grid-area: fact-4;
+}
+.fact-5 {
+ grid-area: fact-5;
+ border-left: none !important;
+}
+.fact-6 {
+ grid-area: fact-6;
+ border-left: none !important;
+}
+.fact-7 {
+ grid-area: fact-7;
+ border-left: none !important;
+}
+
+.no-bottom-border {
+ border-bottom: none !important;
+}
+
+.fact-title {
+ display: block;
+ margin: 4px;
+ font-weight: bold;
+ padding-left: 1rem;
+}
+
+.facts p {
+ margin: 4px;
+ padding-left: 1rem;
+}
+
+.active-fact {
+ background-color: var(--button);
+ cursor: pointer;
+}
+
+/* Responsive adjustments */
+@media (max-width: 768px) {
+ .grid-container {
+ grid-template-columns: 1fr;
+ grid-template-rows: auto;
+ grid-template-areas:
+ "large-box"
+ "fact-1"
+ "fact-2"
+ "fact-3"
+ "fact-4"
+ "fact-5"
+ "fact-6"
+ "fact-7";
+ }
+
+ .fact-image-box {
+ position: sticky;
+ top: 30px;
+ z-index: 10;
+ background: var(--bg);
+ border-left: 1px dashed var(--formBg) !important;
+ }
+
+ .fact-5 {
+ grid-area: fact-5;
+ border-left: 1px dashed var(--formBg) !important;
+ }
+ .fact-6 {
+ grid-area: fact-6;
+ border-left: 1px dashed var(--formBg) !important;
+ }
+ .fact-7 {
+ grid-area: fact-7;
+ border-left: 1px dashed var(--formBg) !important;
+ }
+
+ .fact-title {
+ margin: 4px;
+ padding-top: 8px;
+ padding-bottom: 8px;
+ padding-left: 0.5rem;
+ }
+ .facts p {
+ margin: 4px;
+ padding-bottom: 8px;
+ padding-left: 0.5rem;
+ }
+}
+
+@media (max-width: 1200px) {
+ .fact-image {
+ max-width: 85%;
+ max-height: 85%;
+ }
+
+ .fact-image {
+ max-width: 80%;
+ max-height: 80%;
+ object-fit: cover;
+ transition: opacity 0.3s ease-in-out;
+ opacity: 1;
+ }
+
+ .fade-out {
+ opacity: 0;
+ }
+}
+
+@media (max-width: 992px) {
+ .fact-image {
+ max-width: 90%;
+ max-height: 90%;
+ }
+}
+
+@media (max-width: 768px) {
+ .fact-image {
+ max-width: 100%;
+ max-height: 100%;
+ }
+}
+
+/* FOOTER FORM START */
+
+.form-page {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ flex: 1;
+}
+
+.form-container {
+ max-width: 800px;
+ width: 100%;
+ padding: 20px;
+ background-color: var(--formBg);
+ color: var(--formText);
+ margin-left: 20px;
+ margin-right: 20px;
+}
+
+.footer-form {
+ background-color: var(--formBg);
+ padding: 20px;
+ display: flex;
+ justify-content: center;
+}
+
+.form-container-footer {
+ width: 100%;
+ max-width: 800px;
+ background-color: var(--formBg);
+ color: var(--formText);
+}
+
+.form-container-footer h2 {
+ margin-bottom: 20px;
+ font-size: 24px;
+ color: var(--formText);
+}
+
+.form-group-footer {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ flex-direction: column;
+}
+
+.form-group-footer label {
+ display: block;
+ margin-bottom: 5px;
+ color: var(--formText);
+ margin-right: auto;
+}
+.input-area {
+ margin-bottom: 15px;
+}
+
+.form-group-footer input,
+.form-group-footer textarea {
+ width: 100%;
+ padding: 10px;
+ border: 1px solid var(--formText);
+ box-sizing: border-box;
+ color: var(--formText);
+ background-color: var(--formBg);
+ resize: vertical;
+}
+
+.form-group-footer input,
+.form-group-footer textarea:focus {
+ outline: none !important;
+ border: 1px solid var(--button);
+}
+
+.form-group-footer button {
+ width: auto;
+ padding: 10px 20px;
+ border: none;
+ background-color: var(--button);
+ color: var(--text);
+ font-size: 16px;
+ cursor: pointer;
+ margin-left: auto;
+}
+
+.form-group-footer button:hover {
+ background-color: #d4888d;
+}
+
+/* FOOTER FORM END */
+
+/* APPS START */
+.apps-grid {
+ display: grid;
+ grid-template-columns: repeat(3, 1fr);
+ border: 1px dashed var(--formBg);
+ border-top: none !important;
+ margin-left: 20px;
+ margin-right: 20px;
+ overflow-y: auto;
+ overflow-x: hidden;
+ padding-top: 20px;
+ gap: 20px;
+}
+
+@media (max-width: 1200px) {
+ .apps-grid {
+ grid-template-columns: repeat(2, 1fr);
+ }
+}
+
+@media (max-width: 768px) {
+ .apps-grid {
+ grid-template-columns: repeat(1, 1fr);
+ }
+}
+
+.app-card {
+ background-color: var(--formBg);
+ color: var(--formText);
+ padding: 20px;
+ box-shadow: 0 2px 4px var(--formBg);
+ display: flex;
+ flex-direction: column;
+ justify-content: space-between;
+ height: 100%;
+ box-sizing: border-box;
+ position: relative;
+}
+
+.app-header {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 10px;
+}
+
+.app-header h2 {
+ margin: 0;
+ font-size: 1.5em;
+}
+
+.app-icon {
+ width: 45px;
+ height: 45px;
+ display: flex;
+ align-items: center;
+ color: var(--logo);
+}
+
+.app-card p {
+ margin: 10px 0;
+ flex-grow: 1;
+}
+
+.app-card a {
+ display: inline-block;
+ color: var(--button);
+ text-decoration: underline;
+ margin-top: auto;
+}
+
+/* SINGLE APP START */
+.app-detail {
+ padding: 20px;
+}
+
+.app-detail h1 {
+ margin-top: 0;
+}
+
+.app-card-link {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ z-index: 1;
+}
+
+/* SINGLE APP END */
+
+/* APPS END */
+
+/* ABOUT START */
+
+.about {
+ padding: 0 20px;
+}
+
+/* ABOUT END */